diff --git a/.gitignore b/.gitignore index 0c609ce036f23..b0fdeff953b00 100644 --- a/.gitignore +++ b/.gitignore @@ -361,6 +361,8 @@ vs-chromium-project.txt /third_party/libjpeg_turbo /third_party/liblouis/src /third_party/libphonenumber/dist +/third_party/libpxc +/third_party/libpxc /third_party/libsrtp /third_party/libupnp /third_party/libvpx/source/libvpx @@ -476,3 +478,4 @@ vs-chromium-project.txt /win8/metro_driver/metro_driver_version_resources.xml /x86-generic_out/ /xcodebuild +/xwalk diff --git a/AUTHORS b/AUTHORS index 6827f2b443a89..3f329dffaa90f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -397,6 +397,7 @@ Martijn Croonen Martin Bednorz Martina Kollarova Masahiro Yado +Masaru Nishida Matheus Bratfisch Mathias Bynens Mathieu Meisser diff --git a/DEPS b/DEPS index 1c03ec647b556..7c98d029d0a24 100644 --- a/DEPS +++ b/DEPS @@ -35,7 +35,7 @@ vars = { # Three lines of non-changing comments so that # the commit queue can handle CLs rolling sfntly # and whatever else without interference from each other. - 'sfntly_revision': '130f832eddf98467e6578b548cb74ce17d04a26d', + 'sfntly_revision': '468cad540fa1b0027cad60456f53feabecdce2bc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. @@ -114,7 +114,7 @@ allowed_hosts = [ deps = { 'src/breakpad/src': - Var('chromium_git') + '/breakpad/breakpad/src.git' + '@' + '33a43757f6dadf49cb2240d22f1d0d827bfeae8f', + Var('chromium_git') + '/breakpad/breakpad/src.git' + '@' + '5aac5eabb0fd7cbd3bf7805fb922fe2f90e80155', 'src/buildtools': Var('chromium_git') + '/chromium/buildtools.git' + '@' + Var('buildtools_revision'), diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java index 78d1bdcabeb8e..99381b28ff88e 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java @@ -118,10 +118,11 @@ private void initialize(WebViewDelegate webViewDelegate) { // WebView needs to make sure to always use the wrapped application context. ContextUtils.initApplicationContext( - ResourcesContextWrapperFactory.get(mWebViewDelegate.getApplication())); + ResourcesContextWrapperFactory.get( + mWebViewDelegate.getApplication().getApplicationContext())); if (isBuildDebuggable()) { - // Suppress the StrictMode violation as this codepath is only hit on debugglable builds. + // Suppress the StrictMode violation as this codepath is only hit on debuggable builds. StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); CommandLine.initFromFile(COMMAND_LINE_FILE); StrictMode.setThreadPolicy(oldPolicy); @@ -131,7 +132,7 @@ private void initialize(WebViewDelegate webViewDelegate) { ThreadUtils.setWillOverrideUiThread(); // Load chromium library. - AwBrowserProcess.loadLibrary(ContextUtils.getApplicationContext()); + AwBrowserProcess.loadLibrary(); final PackageInfo packageInfo = WebViewFactory.getLoadedPackageInfo(); @@ -139,14 +140,14 @@ private void initialize(WebViewDelegate webViewDelegate) { System.loadLibrary("webviewchromium_plat_support"); // Use shared preference to check for package downgrade. - mWebViewPrefs = mWebViewDelegate.getApplication().getSharedPreferences( + mWebViewPrefs = ContextUtils.getApplicationContext().getSharedPreferences( CHROMIUM_PREFS_NAME, Context.MODE_PRIVATE); int lastVersion = mWebViewPrefs.getInt(VERSION_CODE_PREF, 0); int currentVersion = packageInfo.versionCode; if (!versionCodeGE(currentVersion, lastVersion)) { // The WebView package has been downgraded since we last ran in this application. // Delete the WebView data directory's contents. - String dataDir = PathUtils.getDataDirectory(mWebViewDelegate.getApplication()); + String dataDir = PathUtils.getDataDirectory(ContextUtils.getApplicationContext()); Log.i(TAG, "WebView package downgraded from " + lastVersion + " to " + currentVersion + "; deleting contents of " + dataDir); deleteContents(new File(dataDir)); @@ -286,7 +287,7 @@ private void startChromiumLocked() { initNetworkChangeNotifier(context); final int extraBindFlags = 0; AwBrowserProcess.configureChildProcessLauncher(webViewPackageName, extraBindFlags); - AwBrowserProcess.start(context); + AwBrowserProcess.start(); if (isBuildDebuggable()) { setWebContentsDebuggingEnabled(true); @@ -313,7 +314,7 @@ public void onTraceEnabledChange(boolean enabled) { // Start listening for data reduction proxy setting changes. mProxyManager = new AwDataReductionProxyManager(); - mProxyManager.start(mWebViewDelegate.getApplication()); + mProxyManager.start(ContextUtils.getApplicationContext()); } boolean hasStarted() { diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java index 8d4a1d94fe7ae..f7025f2d3c26f 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java +++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java @@ -17,7 +17,7 @@ import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.library_loader.ProcessInitException; import org.chromium.content.browser.BrowserStartupController; -import org.chromium.content.browser.ChildProcessLauncher; +import org.chromium.content.browser.ChildProcessCreationParams; import org.chromium.policy.CombinedPolicyProvider; import java.io.File; @@ -40,12 +40,12 @@ public abstract class AwBrowserProcess { * to run webview in this process. Does not create threads; safe to call from zygote. * Note: it is up to the caller to ensure this is only called once. */ - public static void loadLibrary(Context context) { - PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, context); - ContextUtils.initApplicationContext(context.getApplicationContext()); + public static void loadLibrary() { + Context appContext = ContextUtils.getApplicationContext(); + PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX, appContext); try { LibraryLoader libraryLoader = LibraryLoader.get(LibraryProcessType.PROCESS_WEBVIEW); - libraryLoader.loadNow(context); + libraryLoader.loadNow(appContext); // Switch the command line implementation from Java to native. // It's okay for the WebView to do this before initialization because we have // setup the JNI bindings by this point. @@ -60,8 +60,8 @@ public static void loadLibrary(Context context) { * WebView. */ public static void configureChildProcessLauncher(String packageName, int extraBindFlags) { - ChildProcessLauncher.setChildProcessCreationParams( - new ChildProcessLauncher.ChildProcessCreationParams(packageName, extraBindFlags, + ChildProcessCreationParams.set( + new ChildProcessCreationParams(packageName, extraBindFlags, LibraryProcessType.PROCESS_WEBVIEW_CHILD)); } @@ -69,23 +69,23 @@ public static void configureChildProcessLauncher(String packageName, int extraBi * Starts the chromium browser process running within this process. Creates threads * and performs other per-app resource allocations; must not be called from zygote. * Note: it is up to the caller to ensure this is only called once. - * @param context The Android application context */ - public static void start(final Context context) { - tryObtainingDataDirLockOrDie(context); + public static void start() { + tryObtainingDataDirLockOrDie(); // We must post to the UI thread to cover the case that the user // has invoked Chromium startup by using the (thread-safe) // CookieManager rather than creating a WebView. ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { + Context appContext = ContextUtils.getApplicationContext(); // The policies are used by browser startup, so we need to register the policy // providers before starting the browser process. This only registers java objects // and doesn't need the native library. - CombinedPolicyProvider.get().registerProvider(new AwPolicyProvider(context)); + CombinedPolicyProvider.get().registerProvider(new AwPolicyProvider(appContext)); try { - BrowserStartupController.get(context, LibraryProcessType.PROCESS_WEBVIEW) + BrowserStartupController.get(appContext, LibraryProcessType.PROCESS_WEBVIEW) .startBrowserProcessesSync(!CommandLine.getInstance().hasSwitch( AwSwitches.WEBVIEW_SANDBOXED_RENDERER)); } catch (ProcessInitException e) { @@ -95,11 +95,11 @@ public void run() { }); } - private static void tryObtainingDataDirLockOrDie(Context context) { + private static void tryObtainingDataDirLockOrDie() { StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); StrictMode.allowThreadDiskWrites(); try { - String dataPath = PathUtils.getDataDirectory(context); + String dataPath = PathUtils.getDataDirectory(ContextUtils.getApplicationContext()); File lockFile = new File(dataPath, EXCLUSIVE_LOCK_FILE); boolean success = false; try { diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 714b24a57dd83..e11aff037a386 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -1158,6 +1158,7 @@ public void destroy() { // hardware resources. if (mIsAttachedToWindow) { Log.w(TAG, "WebView.destroy() called while WebView is still attached to window."); + mCurrentFunctor.onDetachedFromWindow(); nativeOnDetachedFromWindow(mNativeAwContents); } mIsDestroyed = true; @@ -1488,6 +1489,7 @@ private static boolean isBase64Encoded(String encoding) { */ public void loadData(String data, String mimeType, String encoding) { if (TRACE) Log.d(TAG, "loadData"); + if (isDestroyed(WARN)) return; loadUrl(LoadUrlParams.createLoadDataParams( fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding))); } @@ -1577,6 +1579,10 @@ public void loadUrl(LoadUrlParams params) { } } + // Temporary to generate a Java stack for crbug.com/618807. + if (mNativeAwContents == 0) { + throw new RuntimeException("Calling load on destroyed webview " + mIsDestroyed); + } nativeSetExtraHeadersForUrl( mNativeAwContents, params.getUrl(), params.getExtraHttpRequestHeadersString()); params.setExtraHeaders(new HashMap()); diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index 07eaaeab23f10..ea93c487e7361 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java @@ -87,7 +87,7 @@ public class AwSettings { private boolean mSpatialNavigationEnabled; // Default depends on device features. private boolean mEnableSupportedHardwareAcceleratedFeatures = false; private int mMixedContentMode = WebSettings.MIXED_CONTENT_NEVER_ALLOW; - private boolean mVideoOverlayForEmbeddedVideoEnabled = false; + private boolean mForceVideoOverlayForTests = false; private boolean mOffscreenPreRaster = false; private int mDisabledMenuItems = MENU_ITEM_NONE; @@ -1701,19 +1701,7 @@ public void setDisabledActionModeMenuItems(int menuItems) { * @param flag whether to enable the video overlay for the embedded video. */ public void setVideoOverlayForEmbeddedVideoEnabled(final boolean enabled) { - synchronized (mAwSettingsLock) { - if (mVideoOverlayForEmbeddedVideoEnabled != enabled) { - mVideoOverlayForEmbeddedVideoEnabled = enabled; - mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() { - @Override - public void run() { - if (mNativeAwSettings != 0) { - nativeUpdateRendererPreferencesLocked(mNativeAwSettings); - } - } - }); - } - } + // No-op, see http://crbug.com/616583 } /** @@ -1721,15 +1709,14 @@ public void run() { * @return true if the WebView enables the video overlay for the embedded video. */ public boolean getVideoOverlayForEmbeddedVideoEnabled() { - synchronized (mAwSettingsLock) { - return getVideoOverlayForEmbeddedVideoEnabledLocked(); - } + // Always false, see http://crbug.com/616583 + return false; } @CalledByNative private boolean getVideoOverlayForEmbeddedVideoEnabledLocked() { - assert Thread.holdsLock(mAwSettingsLock); - return mVideoOverlayForEmbeddedVideoEnabled; + // Always false, see http://crbug.com/616583 + return false; } @VisibleForTesting diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java index b12f60290923e..55d412545ba3a 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSecondBrowserProcessTest.java @@ -117,14 +117,15 @@ public Boolean call() throws Exception { } private boolean tryStartingBrowserProcess() { - final Context context = getActivity(); final Boolean success[] = new Boolean[1]; + // The activity must be launched in order for proper webview statics to be setup. + getActivity(); // runOnMainSync does not catch RuntimeExceptions, they just terminate the test. getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { try { - AwBrowserProcess.start(context); + AwBrowserProcess.start(); success[0] = true; } catch (RuntimeException e) { success[0] = false; diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java index d45839269ee63..f14ba481ec0a6 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwTestBase.java @@ -90,11 +90,12 @@ protected void setUp() throws Exception { } protected void startBrowserProcess() throws Exception { - final Context context = getActivity(); + // The activity must be launched in order for proper webview statics to be setup. + getActivity(); getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { - AwBrowserProcess.start(context); + AwBrowserProcess.start(); } }); } diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java index 9cb017f9123ed..0fe073ad6a15f 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/CookieManagerStartupTest.java @@ -14,6 +14,7 @@ import org.chromium.android_webview.AwWebResourceResponse; import org.chromium.android_webview.test.util.CommonResources; import org.chromium.android_webview.test.util.CookieUtils; +import org.chromium.base.ContextUtils; import org.chromium.base.test.util.Feature; import org.chromium.net.test.util.TestWebServer; @@ -29,10 +30,11 @@ public class CookieManagerStartupTest extends AwTestBase { @Override protected void setUp() throws Exception { super.setUp(); - // CookeManager assumes that native is loaded, but webview browser should not be loaded for + // CookieManager assumes that native is loaded, but webview browser should not be loaded for // these tests as webview is not necessarily loaded when CookieManager is called. - AwBrowserProcess.loadLibrary( - getInstrumentation().getTargetContext().getApplicationContext()); + Context appContext = getInstrumentation().getTargetContext().getApplicationContext(); + ContextUtils.initApplicationContext(appContext); + AwBrowserProcess.loadLibrary(); } @Override @@ -45,11 +47,12 @@ private void startChromium() throws Exception { } private void startChromiumWithClient(TestAwContentsClient contentsClient) throws Exception { - final Context context = getActivity(); + // The activity must be launched in order for proper webview statics to be setup. + getActivity(); getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { - AwBrowserProcess.start(context); + AwBrowserProcess.start(); } }); diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java index 55083d067d630..3c9e234ebee31 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/HttpCacheTest.java @@ -70,11 +70,10 @@ private void deleteDirectory(File dir) throws Exception { @SmallTest @Feature({"AndroidWebView"}) public void testLegacyHttpCacheDirIsRemovedOnStartup() throws Exception { - Context targetContext = getInstrumentation().getTargetContext(); + Context appContext = getInstrumentation().getTargetContext().getApplicationContext(); PathUtils.setPrivateDataDirectorySuffix( - AwBrowserProcess.PRIVATE_DATA_DIRECTORY_SUFFIX, targetContext); - File webViewLegacyCacheDir = new File( - PathUtils.getDataDirectory(targetContext), "Cache"); + AwBrowserProcess.PRIVATE_DATA_DIRECTORY_SUFFIX, appContext); + File webViewLegacyCacheDir = new File(PathUtils.getDataDirectory(appContext), "Cache"); if (!webViewLegacyCacheDir.isDirectory()) { assertTrue(webViewLegacyCacheDir.mkdir()); assertTrue(webViewLegacyCacheDir.isDirectory()); @@ -83,8 +82,8 @@ public void testLegacyHttpCacheDirIsRemovedOnStartup() throws Exception { assertTrue(dummyCacheFile.exists()); // Set up JNI bindings. - ContextUtils.initApplicationContext(targetContext.getApplicationContext()); - AwBrowserProcess.loadLibrary(targetContext); + ContextUtils.initApplicationContext(appContext); + AwBrowserProcess.loadLibrary(); // No delay before removing the legacy cache files. AwContentsStatics.setLegacyCacheRemovalDelayForTest(0); diff --git a/android_webview/test/shell/src/org/chromium/android_webview/shell/AwShellActivity.java b/android_webview/test/shell/src/org/chromium/android_webview/shell/AwShellActivity.java index 9d04cf035e5af..94df928e272c3 100644 --- a/android_webview/test/shell/src/org/chromium/android_webview/shell/AwShellActivity.java +++ b/android_webview/test/shell/src/org/chromium/android_webview/shell/AwShellActivity.java @@ -40,6 +40,7 @@ import org.chromium.android_webview.test.NullContentsClient; import org.chromium.base.BaseSwitches; import org.chromium.base.CommandLine; +import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.TraceEvent; import org.chromium.content.app.ContentApplication; @@ -79,7 +80,8 @@ public void onCreate(Bundle savedInstanceState) { ContentApplication.initCommandLine(this); waitForDebuggerIfNeeded(); - AwBrowserProcess.loadLibrary(this); + ContextUtils.initApplicationContext(getApplicationContext()); + AwBrowserProcess.loadLibrary(); if (CommandLine.getInstance().hasSwitch(AwShellSwitches.ENABLE_ATRACE)) { Log.e(TAG, "Enabling Android trace."); @@ -129,7 +131,7 @@ public void onDestroy() { } private AwTestContainerView createAwTestContainerView() { - AwBrowserProcess.start(this); + AwBrowserProcess.start(); AwTestContainerView testContainerView = new AwTestContainerView(this, true); AwContentsClient awContentsClient = new NullContentsClient() { private View mCustomView; diff --git a/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java b/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java index c3d4ccb7de5ba..c3af5de0dfcdc 100644 --- a/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java +++ b/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestRunnerActivity.java @@ -30,7 +30,7 @@ public void onCreate(Bundle savedInstanceState) { AwShellResourceProvider.registerResources(this); ContextUtils.initApplicationContext(getApplicationContext()); - AwBrowserProcess.loadLibrary(this); + AwBrowserProcess.loadLibrary(); mLinearLayout = new LinearLayout(this); mLinearLayout.setOrientation(LinearLayout.VERTICAL); diff --git a/android_webview/test/shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java b/android_webview/test/shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java index 14c19e521c3e2..eaf350f0e27be 100644 --- a/android_webview/test/shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java +++ b/android_webview/test/shell/src/org/chromium/android_webview/test/SecondBrowserProcess.java @@ -15,6 +15,7 @@ import org.chromium.android_webview.AwResource; import org.chromium.android_webview.shell.R; import org.chromium.base.CommandLine; +import org.chromium.base.ContextUtils; import org.chromium.base.annotations.SuppressFBWarnings; /** @@ -56,7 +57,8 @@ private void startBrowserProcess() throws Exception { CommandLine.initFromFile("/data/local/tmp/android-webview-command-line"); AwResource.setResources(this.getResources()); AwResource.setConfigKeySystemUuidMapping(R.array.config_key_system_uuid_mapping); - AwBrowserProcess.loadLibrary(this); - AwBrowserProcess.start(this); + ContextUtils.initApplicationContext(getApplicationContext()); + AwBrowserProcess.loadLibrary(); + AwBrowserProcess.start(); } } diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index 4c772aec307ba..0fc0901e4ea81 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc @@ -262,7 +262,10 @@ const AcceleratorData kDebugAcceleratorData[] = { MAGNIFY_SCREEN_ZOOM_OUT}, {true, ui::VKEY_BRIGHTNESS_UP, ui::EF_CONTROL_DOWN, MAGNIFY_SCREEN_ZOOM_IN}, // Extra shortcuts to lock the screen on linux desktop. - {true, ui::VKEY_L, ui::EF_ALT_DOWN, LOCK_SCREEN}, + {true, ui::VKEY_L, ui::EF_ALT_DOWN, LOCK_PRESSED}, + {false, ui::VKEY_L, ui::EF_ALT_DOWN, LOCK_RELEASED}, + {true, ui::VKEY_P, ui::EF_ALT_DOWN, POWER_PRESSED}, + {false, ui::VKEY_P, ui::EF_ALT_DOWN, POWER_RELEASED}, {true, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, LOCK_PRESSED}, {false, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, LOCK_RELEASED}, {true, ui::VKEY_D, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, diff --git a/ash/desktop_background/desktop_background_view.cc b/ash/desktop_background/desktop_background_view.cc index 04311087b32f6..83cd5b998dbac 100644 --- a/ash/desktop_background/desktop_background_view.cc +++ b/ash/desktop_background/desktop_background_view.cc @@ -138,10 +138,13 @@ void DesktopBackgroundView::OnPaint(gfx::Canvas* canvas) { gfx::ImageSkia wallpaper = controller->GetWallpaper(); WallpaperLayout wallpaper_layout = controller->GetWallpaperLayout(); - if (wallpaper.isNull()) { - canvas->FillRect(GetLocalBounds(), SK_ColorBLACK); + // Wallpapers with png format could be partially transparent. + // Fill the canvas with black background to make it opaque + // before painting wallpaper + canvas->FillRect(GetLocalBounds(), SK_ColorBLACK); + + if (wallpaper.isNull()) return; - } if (wallpaper_layout == WALLPAPER_LAYOUT_CENTER_CROPPED) { // The dimension with the smallest ratio must be cropped, the other one @@ -177,8 +180,6 @@ void DesktopBackgroundView::OnPaint(gfx::Canvas* canvas) { canvas->DrawImageInt(wallpaper, 0, 0, wallpaper.width(), wallpaper.height(), 0, 0, width(), height(), true); } else { - // Fill with black to make sure that the entire area is opaque. - canvas->FillRect(GetLocalBounds(), SK_ColorBLACK); float image_scale = canvas->image_scale(); gfx::Rect wallpaper_rect(0, 0, wallpaper.width() / image_scale, wallpaper.height() / image_scale); diff --git a/ash/rotator/screen_rotation_animator.cc b/ash/rotator/screen_rotation_animator.cc index 9f6f4afed13d8..7171e9a5dc727 100644 --- a/ash/rotator/screen_rotation_animator.cc +++ b/ash/rotator/screen_rotation_animator.cc @@ -169,7 +169,7 @@ void RotateScreen(int64_t display_id, const gfx::Tween::Type tween_type = gfx::Tween::FAST_OUT_LINEAR_IN; std::unique_ptr old_layer_tree = - ::wm::RecreateLayers(root_window); + ::wm::RecreateLayers(root_window, nullptr); // Add the cloned layer tree in to the root, so it will be rendered. root_window->layer()->Add(old_layer_tree->root()); diff --git a/ash/shelf/shelf_locking_manager.cc b/ash/shelf/shelf_locking_manager.cc index 93c8832b9e09b..d82177ec89e11 100644 --- a/ash/shelf/shelf_locking_manager.cc +++ b/ash/shelf/shelf_locking_manager.cc @@ -41,10 +41,8 @@ void ShelfLockingManager::SessionStateChanged( } void ShelfLockingManager::OnLockStateEvent(EventType event) { - // This is only called when locking the screen; there is no unlock event here. - // It's also called when the screen lock animation begins and should help the - // shelf appear locked much earlier than ShellObserver::OnLockStateChanged. - screen_locked_ = true; + // Lock when the animation starts, ignoring pre-lock. There's no unlock event. + screen_locked_ |= event == EVENT_LOCK_ANIMATION_STARTED; UpdateLockedState(); } diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 1ac358d9e190f..c1bec176e6c13 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb @@ -26,6 +26,7 @@ የተንቀሳቃሽ ስልክ ውሂብን ያንቁ ባትሪ ባዶ እስኪሆን ድረስ የቀረው ጊዜ፣ የChrome መሣሪያ + ቀርቷል ከክፍለ ጊዜ በመውጣት ላይ በማያ ገጽ ላይ የቁልፍ ሰሌዳ ነቅቷል የግብዓት ስልትዎ ወደ ተቀይሯል*(3ኛ ወገን)። @@ -92,7 +93,6 @@ የድምጽ ቅንብሮች ቅጽበታዊ-ገጽ እይታዎች ተሰናክለዋል ብሩህነት -% ይቀራል ጥራት ወደ ተለውጧል Wi-Fi ያንቁ @@ -111,13 +111,13 @@ በማስላት ላይ... የUSB-C መሣሪያ (የቀኝ ጎን የኋላ ወደብ) የማያ ገጽ ላይ ቁልፍ ሰሌዳን አሰናክል -ሙሉ እስኪሆን ድረስ አይ በማንጸባረቅ ላይ ctrl የማያ ገጽዎን ቁጥጥር በርቀት እርዳታ በኩል ለ በማጋራት ላይ። ድምፅ የብሉቱዝ መሣሪያ «» ለመጣመር ፍቃድ ይፈልጋል። + ሙሉ እስከሚሆን ድረስ የመቆለፊያ ገጹ የሚቆለፍበት አቋራጭ ተቀይሯል። እባክዎ ከ ይልቅ ን ይጠቀሙ። ፈልግ ግንኙነት አቋርጥ @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space የGoogle Drive ቅንብሮች... -: ቀርቷል የCast መሣሪያዎች ይገኛሉ ዘግተህ ውጣ @@ -166,7 +165,6 @@ የማያ ገጽ ላይ ቁልፍ ሰሌዳ አሳይ ተጨማሪ ለመረዳት ምናባዊ ማሳያ -% ለመተው Control Shift Qን ሁለት ጊዜ ይጫኑ። ወደ ዞሯል ኤስ ኤም ኤስ ከ @@ -226,9 +224,9 @@ ቀዳሚ ምናሌ ን ዝጋ ቅንብሮች -: ሙሉ እስኪሆን ድረስ የእርሰዎ እንደበራ ኃይል መሙላት አይችሉ ይሆናል። ተንቀሳቃሽ ስልክ ... + ይቀራል 270° አነስተኛ ኃይል ያለው ባትሪ መሙያ ተገናኝቷል Wi-Fi diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index fc4cd1fc791d3..cca647592c53c 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb @@ -26,6 +26,7 @@ تمكين بيانات الجوال الوقت المتبقي حتى تصبح البطارية فارغة ‏جهاز Chrome +الوقت المتبقي جارٍ الخروج من الجلسة تم تمكين لوحة المفاتيح على الشاشة ‏تم تغيير أسلوب الإدخال إلى *(جهة خارجية). @@ -91,7 +92,6 @@ إعدادات الصوت تم تعطيل لقطات الشاشة السطوع -باقٍ % : تم تغيير درجة دقة إلى ‏تمكين Wi-Fi @@ -110,13 +110,13 @@ جارٍ الحساب... ‏جهاز USB-C (المنفذ الخلفي الأيمن) تعطيل لوحة المفاتيح على الشاشة -س د حتى الاكتمال لا النسخ المطابق ctrl مشاركة التحكم في شاشتك مع عن طريق المساعدة عن بُعد. مستوى الصوت يريد جهاز بلوتوث "" الحصول على إذن للإقران. +يتبقى حتى الاكتمال لقد تغير اختصار قفل الشاشة. يُرجى استخدام بدلاً من . بحث قطع الاتصال @@ -128,7 +128,6 @@ Chromebook Ctrl+Shift+Space ‏إعدادات Google Drive... -الوقت المتبقي: : ، أجهزة البث متاحة الخروج @@ -165,7 +164,6 @@ إظهار لوحة مفاتيح على الشاشة مزيد من المعلومات العرض الظاهري -% ‏للإنهاء، اضغط على Control Shift Q مرتين. تم تدوير إلى ‏رسالة قصيرة SMS من الهاتف رقم @@ -223,9 +221,9 @@ القائمة السابقة إغلاق إعدادات -حتى الاكتمال: : قد يتعذر شحن أثناء التشغيل. الجوال ... +يتبقى 270 درجة تمّ توصيل شاحن منخفض الطاقة ‏لاسلكي، Wi-Fi diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index e937f1c04aa36..f4ba5bf00b57b 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb @@ -26,6 +26,7 @@ Активиране на мобилните данни Оставащо време до изразходването на батерията: Устройство с Chrome +Оставащо време: Излизане от сесията Екранната клавиатура е активирана Методът ви на въвеждане се промени на *(трета страна). @@ -92,7 +93,6 @@ Настройки за звука Екранните снимки са деактивирани Яркост -Остава/т % : Променихте разделителната способност на „“ на Активиране на Wi-Fi @@ -111,13 +111,13 @@ Изчислява се... устройство с USB-C (задният десен порт) Деактивиране на екранната клавиатура - ч м до пълно зареждане Не Дублиране ctrl Споделяте с/ъс контрола върху екрана си чрез отдалечено съдействие. Звук Устройството с Bluetooth „“ иска разрешение за сдвояване. + до пълно зареждане Комбинацията за заключване на екрана е променена. Моля, използвайте „“ вместо „“. search Изключване @@ -129,7 +129,6 @@ Chromebook Ctrl + Shift + Space Настройки за Google Диск... -Остава/т : , Налице са устройства Cast Изход @@ -166,7 +165,6 @@ Показване на екранната клавиатура Научете повече Виртуален дисплей -% За изход натиснете два пъти Ctrl+Shift+Q. Завъртяхте „“ на SMS от @@ -226,9 +224,9 @@ Предишно меню Затваряне на Настройки -: до пълно зареждане Възможно е вашият да не се зарежда, докато е включен. Мобилни мрежи... +Батерия: 270° Свързано е зарядно устройство с малка мощност Wi-Fi diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 3fc3fc29c7e6d..c8b7b3e398d75 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb @@ -4,7 +4,7 @@ USB-C ডিভাইস (সামনের পোর্ট) ব্লুটুথ ডিভাইস "" যুক্ত করার অনুমতি চাইছে। দয়া করে ডিভাইসটিতে এই পিন কোড প্রবেশ করুন: পরবর্তী ইনপুট পদ্ধতিতে পরিবর্তন করার শর্টকাটটি পরিবর্তিত হয়েছে। এর পরিবর্তে দয়া করে ব্যবহার করুন। -শেল্ফ স্বয়ংক্রিয়ভাবে লুকান +তাককে স্বয়ংক্রিয়ভাবে লুকান ওভারস্ক্যান থেকে চার্জ হচ্ছে অন-স্ক্রীন কীবোর্ড অক্ষম করা রয়েছে @@ -13,11 +13,11 @@ USB-C ডিভাইস (বাম পোর্ট) অন-স্ক্রিন কীবোর্ড সক্ষম করুন মাইক জ্যাক -ডান +ডানে আবর্তন লক অক্ষম করুন অনুসন্ধান হ্যাঁ -বাম +বামে (HDMI/DP) লঞ্চার খারিজ করুন @@ -26,6 +26,7 @@ মোবাইল ডেটা সক্রিয় করুন ব্যাটারি শেষ হতে সময় বাকি আছে Chrome ডিভাইস + বাকি আছে সেশন থেকে প্রস্থান করা হচ্ছে অন-স্ক্রীন কীবোর্ড সক্ষম করা রয়েছে আপনার ইনপুট পদ্ধতি *(৩য় পক্ষ) এ পরিবর্তিত হয়েছে৷ @@ -42,7 +43,7 @@ একীভূত ডেস্কটপ মোড ডিভাইসগুলির জন্য স্ক্যান করা হচ্ছে... ব্লুটুথ অক্ষমিত -সবগুলি সাইন আউট করুন +সবগুলি প্রস্থান করুন করুন স্থিতি ট্রে উইন্ডোর ওভারভিউ টগল করুন অ্যাপ্লিকেশনগুলি সিঙ্ক হচ্ছে... @@ -55,16 +56,16 @@ ব্যক্তিগত নেটওয়ার্ক সমর্থিত রেসুলিউশানগুলি খুঁজে না পাওয়ায় প্রদর্শনগুলি মিরর মানে প্রতিবিম্বিত করতে পারেনি। এর পরিবর্তে প্রসারিত ডেস্কটপে প্রবেশ করেছে। একটি প্রতিক্রিয়া প্রতিবেদন পাঠাতে ক্লিক করুন। : সংযুক্ত হচ্ছে... - এর মধ্যে সেশন শেষ হয়ে যাবে৷ আপনাকে সাইন আউট করা হবে৷ + এর মধ্যে সেশন শেষ হয়ে যাবে৷ আপনাকে প্রস্থান করুন করা হবে৷ একটি নিম্ন শক্তির চার্জার প্লাগইন করা হয়েছে৷ বিশ্বস্ত ব্যাটারি চার্জ নাও হতে পারে৷ স্থিতি ট্রে, সময় , Alt+Search অ্যাপ্স -আপনি এখনই সাইন আউট হবেন৷ -শেল্ফ +আপনি এখনই প্রস্থান করুন হবেন৷ +তাক USB-C ডিভাইস (বাম দিকের সামনের পোর্ট) বন্ধ করুন -শেল্ফ অবস্থান +তাকের অবস্থান ব্লুটুথ সক্ষম করুন mod3 ওয়াই-ফাই অক্ষম করুন @@ -92,7 +93,6 @@ Search অথবা বাতিল করতে Shift টিপুন৷অডিও সেটিংস স্ক্রীনশট অক্ষম হয়েছে উজ্জ্বলতা -% বাকি আছে : এর রেসুলিউশান বদল করে করা হয়েছে Wi-fi সক্ষম করুন @@ -104,20 +104,20 @@ Search অথবা বাতিল করতে Shift টিপুন৷লক করুন আপনার কাছে একটি খারাপ চার্জার থাকতে পারে৷ যদি আপনি মার্কিন যুক্তরাষ্ট্রে বাস করেন তবে সহায়তা পেতে এবং একটি প্রতিস্থাপনের জন্য দয়া করে ৮৬৬-৬২৮-১৩৭১ এ কল করুন৷ যদি আপনি যুক্তরাজ্য বাস করেন তবে দয়া করে ০৮০০-০২৬-০৬১৩ এ কল করুন৷ যদি আপনি আয়ারল্যান্ডে বাস করেন তবে দয়া করে ১-৮০০-৮৩২-৬৬৪ এ কল করুন৷ যদি আপনি কানাডায় বাস করেন তবে দয়া করে ৮৬৬-৬২৮-১৩৭২ এ কল করুন৷ যদি আপনি অস্ট্রেলিয়ায় বাস করেন তবে দয়া করে ১-৮০০-০৬৭-৪৬০ এ কল করুন৷ IPv6 ঠিকানা -সাইন আউট করার জন্য দুবার Ctrl+Shift+Q টিপুন৷ +প্রস্থান করুন করার জন্য দুবার Ctrl+Shift+Q টিপুন৷ অভ্যন্তরীণ প্রদর্শন স্পিকার (অভ্যন্তরীণ) স্ক্রীনশট নেওয়ার ক্ষমতা আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে৷ গণনা করা হচ্ছে... USB-C ডিভাইস (ডান দিকের পিছনের পোর্ট) অন-স্ক্রীন কীবোর্ড অক্ষম করুন -ঘণ্টা মিনিট পর্যন্ত পূর্ণ না অনুকরণ করা হচ্ছে ctrl রিমোট সহায়কের মাধ্যমে -এর সাথে আপনার স্ক্রীন নিয়ন্ত্রন ভাগ করুন৷ ভলিউম ব্লুটুথ ডিভাইস "" যুক্ত করার অনুমতি চাইছে। +সম্পূর্ণ হতে বাকি স্ক্রীন লক করার শর্টকাটটি পরিবর্তিত হয়েছে। এর পরিবর্তে দয়া করে ব্যবহার করুন। search সংযোগ বিচ্ছিন্ন @@ -129,11 +129,10 @@ Search অথবা বাতিল করতে Shift টিপুন৷Chromebook Ctrl+Shift+Space Google ড্রাইভ সেটিংস ... -: বাকি , কাস্ট ডিভাইসগুলি উপলব্ধ -সাইন আউট -অন্য অ্যাকাউন্টে সাইন ইন করা যাবে না। +প্রস্থান করুন +অন্য অ্যাকাউন্টে প্রবেশ করুন করা যাবে না। এই নেটওয়ার্ক সেটিং প্রশাসকের দ্বারা অক্ষম করা হয়েছে। USB-C ডিভাইস (বাম দিকের পিছনের পোর্ট) সমস্ত উপলব্ধ ব্যবহারকারীকে ইতিমধ্যেই এই সেশনে যোগ করা হয়েছে৷ @@ -158,15 +157,14 @@ Search অথবা বাতিল করতে Shift টিপুন৷হেডফোন রিমোট সহায়কের মাধ্যমে আপনার স্ক্রীন নিয়ন্ত্রণ ভাগ করুন৷ অতিথি থেকে প্রস্থান -এখনই সাইন আউট করুন +এখনই প্রস্থান করুন করুন যখন আপনি অন্য ব্যবহারকারীতে পাল্টাবেন তখন স্ক্রীন শেয়ার করা বন্ধ হবে৷ আপনি কি চালিয়ে যেতে চান? -আপনি এর মধ্যে স্বয়ংক্রিয়ভাবে সাইন আউট হবেন৷ +আপনি এর মধ্যে স্বয়ংক্রিয়ভাবে প্রস্থান করুন হবেন৷ আপনার কম্পিউটার কাছাকাছি ব্লুটুথ ডিভাইসে খুঁজে পাওয়া সম্ভব এবং ঠিকানা সমেত "" হিসাবে প্রদর্শিত হবে চার্জ হচ্ছে অন-স্ক্রীন কীবোর্ড প্রদর্শন করুন আরো জানুন ভার্চুয়াল প্রদর্শন -% প্রস্থান করার জন্য দুবার Control Shift Q টিপুন৷ আবর্তিত হয়েছে -এর থেকে SMS... @@ -215,7 +213,7 @@ Alt+Search অথবা বাতিল করতে Shift টিপুন৷মোবাইল অ্যাকাউন্ট দেখুন ব্লুটুথ অক্ষম করুন ওয়াই-ফাই চালু করুন -এই অ্যাকাউন্টের প্রশাসক একাধিক সাইন ইন অননুমোদিত করেছেন৷ +এই অ্যাকাউন্টের প্রশাসক একাধিক প্রবেশ করুন অননুমোদিত করেছেন৷ আপনার চালু থাকা অবস্থায় চার্জ নাও হতে পারে। এটির মূল চার্জার ব্যবহারের কথা ভাবুন। নেটওয়ার্ক ব্যাটারি সময় গণনা করা হচ্ছে। @@ -225,9 +223,9 @@ Alt+Search অথবা বাতিল করতে Shift টিপুন৷পূর্ববর্তী মেনু বন্ধ করুন সেটিংস -: বাকি পুরো চার্জ হতে আপনার চালু থাকা অবস্থায় চার্জ নাও হতে পারে। মোবাইল ... + বাকি আছে ২৭০° নিম্ন শক্তির চার্জার সংযুক্ত করা হয়েছে ওয়াই-ফাই @@ -243,9 +241,9 @@ Alt+Search অথবা বাতিল করতে Shift টিপুন৷মাইক্রোফোন ব্যবহার করা হচ্ছে। ইনপুট পদ্ধতিসমূহ আপডেট করার জন্য আবার শুরু করুন এবং পাওয়ারওয়াশ করুন -অন্য ব্যবহারকারীকে সাইন ইন করান... +অন্য ব্যবহারকারীকে প্রবেশ করুন করান... ব্যাটারি % পূর্ণ৷ -সাইন আউট করার জন্য দুবার Control Shift Q টিপুন৷ +প্রস্থান করুন করার জন্য দুবার Control Shift Q টিপুন৷ কীবোর্ড ওভারলে স্ক্রীনশট সংরক্ষণ করতে ব্যর্থ হয়েছে \ No newline at end of file diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 1ad12bb1f42c8..d56775add16e7 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb @@ -26,6 +26,7 @@ Activa les dades mòbils Temps que queda fins que no s'esgoti la bateria: Dispositiu Chrome +Temps restant: S'està tancant la sessió Teclat en pantalla activat El mètode d'entrada ha canviat a * (tercers). @@ -92,7 +93,6 @@ Premeu Cerca o Maj per cancel·lar. Configuració d'àudio Captures de pantalla desactivades Brillantor -Queda un % : La resolució de ha canviat a Activa la Wi-Fi @@ -111,13 +111,13 @@ Premeu Cerca o Maj per cancel·lar. S’està calculant... Dispositiu USB-C (port posterior dret) Desactiva el teclat en pantalla -Falten h min fins que estigui carregada completament No S'està creant una rèplica ctrl Es comparteix el control de la pantalla amb mitjançant l'Assistència remota. Volum El dispositiu Bluetooth "" sol·licita permís per emparellar-se. + per completar la càrrega La drecera per bloquejar la pantalla ha canviat. Utilitzeu en lloc de la drecera . cerca Desconnecta @@ -129,7 +129,6 @@ Premeu Cerca o Maj per cancel·lar. Chromebook Ctrl + Maj + Espai Configuració de Google Drive... -Temps d'autonomia: : , Dispositius d'emissió disponibles Tanca la sessió @@ -166,7 +165,6 @@ Premeu Maj+Alt per canviar-lo. Mostra el teclat en pantalla Més informació Pantalla virtual -% Premeu Control+Maj+Q dues vegades per sortir. s'ha canviat a SMS de @@ -226,9 +224,9 @@ Premeu Alt+Cerca o Maj per cancel·lar. Menú anterior Tanca Configuració -Temps per a càrrega completa: : És possible que el dispositiu no es carregui mentre està encès. Xarxes mòbils... +Queda un 270° S'ha connectat un carregador de baix consum Wi-Fi diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index a4433de5f419b..f9dd5ebb2930e 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb @@ -26,6 +26,7 @@ Povolit mobilní datové připojení Čas zbývající do vybití baterie: Zařízení Chrome +Zbývající čas: Ukončení relace Softwarová klávesnice je aktivována Metoda zadávání se změnila na metodu * třetí strany. Přepnout ji můžete stisknutím klávesové zkratky Shift + Alt. @@ -90,7 +91,6 @@ Nastavení zvuku Snímky obrazovky zakázány Jas -Zbývá  % : Rozlišení displeje bylo změněno na Povolit Wi-Fi @@ -109,13 +109,13 @@ Probíhá výpočet… Zařízení USB Type-C (pravý zadní port) Zakázat softwarovou klávesnici - h min do nabití Ne Zrcadlení ctrl Ovládání obrazovky je prostřednictvím Vzdálené pomoci sdíleno s uživatelem . Hlasitost Zařízení Bluetooth „“ žádá o povolení ke spárování. + do úplného nabití Zkratka k odemknutí obrazovky se změnila. Namísto zkratky používejte zkratku . search Odpojit @@ -127,7 +127,6 @@ Chromebook Ctrl+Shift+Mezerník Nastavení Disku Google... -Zbývá: : , Dostupná zařízení Cast Odhlásit se @@ -163,7 +162,6 @@ Zobrazit softwarovou klávesnici Další informace Virtuální displej - % Práci ukončíte dvojitým stisknutím kombinace kláves Ctrl+Shift+Q. Displej byl otočen o SMS z čísla @@ -223,9 +221,9 @@ Vypnete jej stisknutím kombinace kláves Alt + Vyhledávání nebo Shift.Předchozí nabídka Zavřít okno Nastavení -: do úplného nabití Je možné, že když bude zařízení zapnuté, nebude se nabíjet. Mobilní sítě... +Zbývá  % 270° Byla připojena nabíječka s nízkým napětím Wi-Fi diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index e57e936685e0a..8f8b55f764570 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb @@ -26,6 +26,7 @@ Aktivér mobildata Tid tilbage, indtil batteriet er tomt, Chrome-enhed + tilbage Afslutter session Skærmtastaturet er aktiveret Din inputmetode er ændret til *(tredjepart). @@ -92,7 +93,6 @@ Tryk på Søg eller Shift for at annullere. Lydindstillinger Skærmbilleder er deaktiveret Lysstyrke - % tilbage : Opløsningen for er ændret til Aktivér Wi-Fi @@ -111,13 +111,13 @@ Tryk på Søg eller Shift for at annullere. Beregner... USB-C-enhed (porten bagpå i højre side) Deaktiver skærmtastatur - t m, indtil det er fuldt opladet Nej Spejling ctrl Skærmdeling med via Fjernsupport. Lydstyrke Bluetooth-enheden "" vil gerne have parringstilladelse. +Fuldt opladet om Genvejen til at låse skærmen er ændret. Brug i stedet for . søg Afbryd @@ -129,7 +129,6 @@ Tryk på Søg eller Shift for at annullere. Chromebook Ctrl+Shift+mellemrum Google Drev-indstillinger... -: tilbage , Tilgængelige Cast-enheder Log ud @@ -166,7 +165,6 @@ Tryk på Shift+Alt for at ændre den. Vis skærmtastatur Flere oplysninger Virtuel skærm - % Tryk på Ctrl+Shift+Q to gange for at afslutte. er roteret til Sms fra @@ -226,9 +224,9 @@ Tryk på Alt+Søg eller Shift for at annullere. Forrige menu Luk Indstillinger -: indtil fuldt opladet Din kan muligvis ikke oplades, mens den er tændt. Mobil... + tilbage 270° Oplader med lav kraft er tilsluttet Wi-Fi diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index ae82074614b68..70ee4135e3ff3 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb @@ -26,6 +26,7 @@ Mobilfunk aktivieren Verbleibende Akku-Laufzeit: Chrome-Gerät +Verbleibende Zeit: h Sitzung wird beendet Bildschirmtastatur aktiviert Ihre Eingabemethode hat sich in *(Drittanbieter) geändert. @@ -92,7 +93,6 @@ Drücken Sie die Such-Taste oder Shift, um die Aktivierung aufzuheben.Audioeinstellungen Screenshot-Funktion deaktiviert Helligkeit - % verbleibend : Auflösung von wurde zu geändert. WLAN aktivieren @@ -111,13 +111,13 @@ Drücken Sie die Such-Taste oder Shift, um die Aktivierung aufzuheben.Wird berechnet... USB-C-Gerät (Port hinten rechts) Bildschirmtastatur deaktivieren -In Std. Min. vollständig aufgeladen Nein Spiegelung Strg Sie teilen sich die Bildschirmsteuerung mit per Remote-Unterstützung. Lautstärke Das Bluetooth-Gerät "" bittet um Erlaubnis für das Pairing. +Vollständig geladen in h Die Tastenkombination zum Sperren des Bildschirms hat sich geändert. Bitte drücken Sie statt . Suchen Verbindung trennen @@ -129,7 +129,6 @@ Drücken Sie die Such-Taste oder Shift, um die Aktivierung aufzuheben.Chromebook Strg + Shift + Leer Google Drive-Einstellungen... -: verbleiben , Übertragungsgeräte verfügbar Abmelden @@ -166,7 +165,6 @@ Drücken Sie zum Wechseln Shift+Alt. Bildschirmtastatur anzeigen Weitere Informationen Virtueller Bildschirm - % Drücken Sie zum Beenden zweimal Steuerung-Shift-Q. wurde zu gedreht. SMS von @@ -226,9 +224,9 @@ Drücken Sie Alt+Suchen oder Shift, um die Aktivierung aufzuheben. Vorheriges Menü schließen Einstellungen -: bis voll aufgeladen Ihr wird möglicherweise nicht aufgeladen, wenn es eingeschaltet ist. Mobil... + % verbleibend 270° Schwachstrom-Ladegerät angeschlossen WLAN diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 0bebca4c790ed..8a3053427fe69 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb @@ -26,6 +26,7 @@ Ενεργοποίηση δεδομένων κινητής τηλεφωνίας Χρόνος που απομένει μέχρι να αδειάσει η μπαταρία, Συσκευή Chrome +Απομένουν Έξοδος από περίοδο σύνδεσης Το πληκτρολόγιο οθόνης είναι ενεργοποιημένο Η μέθοδος εισαγωγής σας έχει αλλάξει σε *(τρίτου μέρους). @@ -92,7 +93,6 @@ Ρυθμίσεις ήχου Τα στιγμιότυπα οθόνης απενεργοποιήθηκαν Φωτεινότητα -Υπολείπεται % : Η ανάλυση άλλαξε σε Ενεργοποίηση Wi-Fi @@ -111,13 +111,13 @@ Υπολογισμός… Συσκευή USB-C (πίσω δεξιά θύρα) Απενεργοποίηση πληκτρολογίου οθόνης -ω λ μέχρι να ολοκληρωθεί η φόρτιση Όχι Κατοπτρισμός ctrl Κοινόχρηστος έλεγχος της οθόνης σας με το χρήστη μέσω της απομακρυσμένης βοήθειας. Ένταση Η συσκευή Bluetooth "" ζητά δικαιώματα σύζευξης. + για να ολοκληρωθεί η φόρτιση Η συντόμευση για το κλείδωμα της οθόνης άλλαξε. Χρησιμοποιήστε το αντί για το . search Αποσύνδεση @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Ρυθμίσεις Google Drive... -Απομένουν : , Διαθέσιμες συσκευές μετάδοσης Έξοδος @@ -166,7 +165,6 @@ Εμφάνιση πληκτρολογίου οθόνης Μάθετε περισσότερα Εικονική οθόνη -% Πατήστε Control Shift Q δύο φορές για έξοδο. περιστράφηκε σε SMS από @@ -226,9 +224,9 @@ Προηγούμενο μενού Κλείσιμο Ρυθμίσεις -: μέχρι να γεμίσει Δεν είναι δυνατή η φόρτιση της συσκευής ενώ είναι ενεργοποιημένη. Κινητή τηλεφωνία... +Απομένει 270° Ο συνδεδεμένος φορτιστής παρέχει χαμηλή ισχύ Wi-Fi diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 1402cb0388460..cfe4a940a75c9 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb @@ -26,6 +26,7 @@ Enable mobile data Time left until battery is empty, Chrome device + left Exiting Session On-screen keyboard enabled Your input method has changed to *(3rd party). @@ -92,7 +93,6 @@ Press Search or Shift to cancel. Audio Settings Screenshots disabled Brightness -% remaining : resolution was changed to Enable Wi-Fi @@ -111,13 +111,13 @@ Press Search or Shift to cancel. Calculating... USB-C device (right-hand-side back port) Disable on-screen keyboard -h m until full No Mirroring ctrl Sharing control of your screen with via Remote Assistance. volume Bluetooth device "" would like permission to pair. + until full The shortcut to lock the screen has changed. Please use instead of . search Disconnect @@ -129,7 +129,6 @@ Press Search or Shift to cancel. Chromebook Ctrl+Shift+Space Google Drive settings -: left , Cast devices available Sign out @@ -166,7 +165,6 @@ Press Shift + Alt to switch. Show on-screen keyboard Learn more Virtual display -% Press Control Shift Q twice to exit. was rotated to SMS from @@ -226,9 +224,9 @@ Press Alt+Search or Shift to cancel. Previous menu Close Settings -: until full Your may not charge while it is turned on. Mobile ... + remaining 270° Low-power charger connected Wi-Fi diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index ad9130f58a90b..ddee8a89dd158 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb @@ -26,6 +26,7 @@ Habilitar datos de dispositivos móviles Tiempo restante hasta que se agote la batería: Dispositivo Chrome +Tiempo restante: Saliendo de la sesión Teclado en pantalla habilitado Tu método de introducción cambió a *(tercero). @@ -92,7 +93,6 @@ Presiona Mayús o la tecla de búsqueda para cancelar la operación.Configuración de audio Capturas de pantalla inhabilitadas Brillo -% restante : La resolución de se cambió por . Habilitar Wi-Fi @@ -111,13 +111,13 @@ Presiona Mayús o la tecla de búsqueda para cancelar la operación.Calculando... Dispositivo USB-C (puerto lateral derecho trasero) Inhabilitar el teclado en pantalla -h min para completar la carga No Duplicando ctrl Se está compartiendo el control de la pantalla con mediante la Asistencia remota. Volumen El dispositivo Bluetooth "" solicita permiso para sincronizarse. +Tiempo restante hasta completarse la carga: Se modificó el acceso directo para bloquear la pantalla. Utiliza en vez de . search Desconectar @@ -129,7 +129,6 @@ Presiona Mayús o la tecla de búsqueda para cancelar la operación.Chromebook Ctrl + mayúscula + espacio Configuración de Google Drive... -: restante , Dispositivos de transmisión disponibles Salir @@ -166,7 +165,6 @@ Para cambiarlo, presiona Shift + Alt. Mostrar el teclado en pantalla Más información Virtual Display -% Presiona Control+Mayús+Q dos veces para salir. se giró a . SMS de @@ -225,9 +223,9 @@ Presiona Alt y la tecla de búsqueda o Mayús para cancelar la operación.Menú anterior Cerrar Configuración -: hasta completar Tu podría no cargarse si el dispositivo está encendido. Dispositivos móviles... + restante 270° Cargador de baja potencia conectado Wi-Fi diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index d807cd9cad83b..0cf9becef5f93 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb @@ -26,6 +26,7 @@ Habilitar datos móviles Tiempo restante hasta que se agote la batería: Dispositivo Chrome +Tiempo restante: Saliendo de la sesión Teclado en pantalla habilitado Tu método de entrada ha cambiado a *(externo). @@ -92,7 +93,6 @@ Pulsa Mayús o la tecla de búsqueda para cancelar la operación. Configuración de audio Capturas de pantalla inhabilitadas Brillo -% restante : Se ha modificado la resolución de a Habilitar Wi-Fi @@ -111,13 +111,13 @@ Pulsa Mayús o la tecla de búsqueda para cancelar la operación. Calculando... Dispositivo USB tipo C (puerto trasero derecho) Inhabilitar teclado en pantalla - h y min para completar la carga No Duplicando ctrl Compartiendo control de la pantalla con a través de Asistencia remota. Volumen El dispositivo Bluetooth "" solicita permiso para vincularse. + para completar la carga La combinación de teclas para bloquear la pantalla ha cambiado. Utiliza en lugar de . buscar Desvincular @@ -129,7 +129,6 @@ Pulsa Mayús o la tecla de búsqueda para cancelar la operación. Chromebook Ctrl+Mayús+Espacio Configuración de Google Drive... -Queda para : , Dispositivos de transmisión disponibles Cerrar sesión @@ -166,7 +165,6 @@ Para cambiarlo, pulsa Mayús + Alt. Mostrar teclado en pantalla Más información Pantalla virtual -% Pulsa Ctrl+Mayús+Q dos veces para salir. Se ha modificado la rotación de a SMS de @@ -225,10 +223,10 @@ Pulsa Alt y la tecla de búsqueda o Mayús para cancelar la operación.Móvil Menú anterior Cerrar -Configuración -: hasta cargarse +Ajustes Es posible que tu no se cargue mientras esté encendido. Redes móviles... + restante 270° Cargador de baja potencia conectado Wi-Fi diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index fc7b629fd3ce8..99e51cf4cb2e3 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb @@ -26,6 +26,7 @@ Luba mobiilne andmeside Aku tühjenemiseni on aega Chrome'i seade + tühjenemiseni Seansist väljumine Ekraanil kuvatav klaviatuur on lubatud Teie sisestusmeetod on nüüd *(kolmas osapool). @@ -92,7 +93,6 @@ Tühistamiseks vajutage otsinguklahvi või tõstuklahvi Heliseaded Ekraanipildid on keelatud Eredus -% on jäänud : Ekraani eraldusvõimeks määrati Luba WiFi @@ -111,13 +111,13 @@ Tühistamiseks vajutage otsinguklahvi või tõstuklahvi Arvutamine ... C-tüüpi USB-seade (tagumine parempoolne port) Keela ekraanil kuvatav klaviatuur - h min aku täitumiseni Ei Peegeldamine ctrl Ekraani juhtimise jagamine isikuga kaugabi kaudu. Helitugevus Bluetoothi seade „” küsib luba sidumiseks. + täislaadimiseni Ekraani lukustamise otseteed on muudetud. Kasutage vana otsetee asemel uut otseteed . otsing Katkesta ühendus @@ -129,7 +129,6 @@ Tühistamiseks vajutage otsinguklahvi või tõstuklahvi Chromebook Ctrl + Tõstuklahv + Tühik Google Drive'i seaded ... -: alles , Ülekandeseadmed on saadaval Logi välja @@ -166,7 +165,6 @@ Selle muutmiseks vajutage klahve Tõstuklahv + Alt. Ekraanil kuvatava klaviatuuri kuvamine Lisateave Virtuaalne ekraan -% Väljumiseks vajutage kaks korda klahvikombinatsiooni Ctrl + tõstuklahv + Q. vahetati valikule SMS numbrilt @@ -226,9 +224,9 @@ Tühistamiseks vajutage klahvikombinatsiooni Alt + otsinguklahv või tõstuklahv Eelmine menüü Sule Seaded -: täislaadimiseni Kui seade on sisse lülitatud, ei pruugita seda laadida. Mobiil ... + on jäänud 270° Väikese energiakuluga laadija on ühendatud WiFi diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 5c949864375cd..e6716976cb687 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb @@ -26,6 +26,7 @@ فعال کردن داده‌های تلفن همراه زمان باقیمانده تا خالی‌شدن شارژ باتری، ‏دستگاه Chrome + باقی‌مانده خروج از جلسه صفحه‌کلید روی صفحه فعال شد ‏روش ورودی شما به *(شخص ثالث) تغییر یافت. Shift + Alt را برای تعویض فشار دهید. @@ -91,7 +92,6 @@ تنظیمات صوتی عکس از صفحه‌نمایش غیرفعال است روشنایی -٪ باقیمانده : وضوح به تغییر یافت ‏فعال کردن Wi-Fi @@ -110,13 +110,13 @@ در حال محاسبه… ‏دستگاه USB-C (درگاه عقب سمت راست) غیرفعال کردن صفحه‌کلید روی نمایشگر -ساعت دقیقه مانده تا باتری شارژ شود نه بازتاب می‌شود مهار به اشتراک گذاشتن کنترل صفحه‌تان با از طریق راهنمایی از راه دور. میزان صدا دستگاه بلوتوث «» برای مرتبط‌سازی به مجوز نیاز دارد. + مانده تا کامل شود کلیدهای میان‌بر قفل کردن صفحه تغییر کرده است. لطفاً از به جای استفاده کنید. جستجو قطع اتصال @@ -128,7 +128,6 @@ Chromebook Ctrl+Shift+Space ‏تنظیمات Google Drive... -: باقیمانده است ، دستگاه‌های فرستادن موجود هستند خروج از سیستم @@ -164,7 +163,6 @@ نمایش صفحه‌کلید روی صفحه بیشتر بدانید نمایشگر مجازی -% ‏برای خروج Control‏، Shift و Q را دو بار فشار دهید. به چرخانده شد پیامک از @@ -224,9 +222,9 @@ Alt+جستجو یا Shift را برای لغو فشار دهید. منوی قبلی بستن تنظیمات -: تا پر شود ممکن است وقتی شما خاموش است، شارژ نشود. تلفن همراه... + باقی‌مانده ‎۲۷۰°‎ شارژر برق متصل شده ضعیف است Wi-Fi diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index a49fd0103060a..fe8ab8c75bf20 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb @@ -26,6 +26,7 @@ Ota mobiilitiedonsiirto käyttöön Akku on tyhjä kuluttua Chrome-laite + jäljellä Käyttökerran lopettaminen Ruutunäppäimistö otettiin käyttöön Syöttötapa on vaihtunut. Uusi syöttötapa on *(kolmas osapuoli). @@ -91,7 +92,6 @@ Vaihda syöttötapaa painamalla Shift + Alt. Ääniasetukset Kuvakaappaukset poissa käytöstä Kirkkaus - % jäljellä : Ruudun tarkkuudeksi vaihdettiin Ota Wi-Fi käyttöön @@ -110,13 +110,13 @@ Vaihda syöttötapaa painamalla Shift + Alt. Lasketaan... C-tyypin USB-laite (oikean sivun taaimmainen portti) Poista ruutunäppäimistö käytöstä -Akku täynnä t min kuluttua Ei Peilaus päällä ctrl Näyttösi hallinta jaetaan käyttäjän kanssa Etätuen kautta. Äänenvoimakkuus Bluetooth-laite pyytää lupaa laiteparin muodostamiseen. + jäljellä, kunnes akku on täynnä Näytön lukituksen pikanäppäin on muuttunut. Käytä uutta pikanäppäintä vanhan () sijaan. haku Katkaise yhteys @@ -128,7 +128,6 @@ Vaihda syöttötapaa painamalla Shift + Alt. Chromebook Ctrl+Shift+välilyönti Google Driven asetukset... -. jäljellä , Cast-laitteita käytettävissä Kirjaudu ulos @@ -165,7 +164,6 @@ Vaihda syöttötapaa painamalla Shift + Alt. Näytä ruutunäppäimistö Lisätietoja Virtuaalinäyttö - % Lopeta painamalla kahdesti Control Shift Q. käännettiin asentoon Tekstiviesti lähettäjältä @@ -223,9 +221,9 @@ Vaihda syöttötapaa painamalla Shift + Alt. Edellinen valikko Sulje Asetukset -: kunnes akku on ladattu ei välttämättä lataudu, kun se on käynnissä. Mobiiliverkot... + jäljellä 270° Pienitehoinen laturi kytketty Wi-Fi diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index ea7d181ae98c9..37433586bb6eb 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb @@ -26,6 +26,7 @@ Paganahin ang mobile data Natitirang oras bago maubos ang baterya, Chrome device + na lang ang natitira Lumalabas sa Session Naka-enable ang on-screen na keyboard Naging *(3rd party) ang iyong pamamaraan ng pag-input. @@ -92,7 +93,6 @@ Pindutin ang Search o Shift upang kanselahin. Mga Setting ng Audio Naka-disable ang mga screenshot Tingkad -% ang natitira : Ginawang ang resolution ng Paganahin ang Wi-Fi @@ -111,13 +111,13 @@ Pindutin ang Search o Shift upang kanselahin. Kinakalkula... USB-C device (port sa kanang bahagi sa likod) I-disable ang on-screen na keyboard -o m hanggang mapuno Hindi Nagmi-mirror ctrl Pagbabahagi ng kontrol sa iyong screen gamit ang sa pamamagitan ng Remote Assistance. Volume Gusto ng bluetooth device na "" na magpares. + na lang bago mapuno Napalitan na ang shortcut para sa pagla-lock sa screen. Mangyaring gamitin ang sa halip na gamitin ang . search I-disconnect @@ -129,7 +129,6 @@ Pindutin ang Search o Shift upang kanselahin. Chromebook Ctrl+Shift+Space Mga setting ng Google Drive ... -: ang natitira , I-cast ang mga available na device Mag-sign out @@ -166,7 +165,6 @@ Pindutin ang Shift + Alt upang magpalit. Ipakita ang on-screen na keyboard Matuto nang higit pa Virtual na Display -% Pindutin ang Control Shift Q nang dalawang beses upang lumabas. Na-rotate ang sa SMS mula kay @@ -226,9 +224,9 @@ Pindutin ang Alt+Search o Shift upang kanselahin. Nakaraang menu Isara ang Mga Setting -: hanggang mapuno Maaaring hindi mag-charge ang iyong habang naka-on ito. Mobile ... + na lang ang natitira 270° Nakakabit ang low-power charger Wi-Fi diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index eea592c24af08..5c3184b378cef 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb @@ -26,6 +26,7 @@ Activer les données mobiles Temps restant avant que la batterie ne soit vide : . Appareil Google Chrome +Temps restant : Fermeture de la session Clavier à l'écran activé Votre mode de saisie a été remplacé par * (tiers). @@ -92,7 +93,6 @@ Appuyez sur Search ou Maj pour le désactiver. Paramètres audio Captures d'écran désactivées Luminosité - % restant(s)  : La résolution de l'écran "" est désormais définie sur . Activer le Wi-Fi @@ -111,13 +111,13 @@ Appuyez sur Search ou Maj pour le désactiver. Calcul en cours… Appareil USB de type C (port situé sur la droite de l'appareil, à l'arrière) Désactiver le clavier à l'écran -Encore  h  min de chargement Non Mise en miroir ctrl Partager le contrôle de votre écran avec  via l'assistance à distance Volume L'appareil Bluetooth "" demande l'autorisation de s'associer. + avant charge complète Le raccourci permettant de verrouiller l'écran a été modifié. Utilisez "" au lieu de "". rechercher Se déconnecter @@ -129,7 +129,6 @@ Appuyez sur Search ou Maj pour le désactiver. Chromebook Ctrl+Maj+Espace Paramètres Google Drive… -: d'autonomie , Appareils Cast disponibles Déconnexion @@ -166,7 +165,6 @@ Appuyez sur Maj + Alt pour en utiliser un autre. Afficher le clavier à l'écran En savoir plus Affichage virtuel - % Pour quitter, appuyez deux fois sur Ctrl+Maj+Q. L'écran "" a effectué une rotation de . SMS de @@ -226,9 +224,9 @@ Appuyez sur Alt + Recherche ou Maj pour le désactiver. Menu précédent Fermer  Paramètres -: de chargement Il est possible que votre appareil ne se recharge pas lorsqu'il est allumé. Mobile… + restant(s) 270° Chargeur de faible puissance connecté Wi-Fi diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 59a040e0703d1..c93a45cfb85db 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb @@ -26,6 +26,7 @@ મોબાઇલ ડેટા સક્ષમ કરો બેટરી ખાલી થવામાં બાકી સમય, Chrome ઉપકરણ + બાકી સત્રથી બહાર નીકળી રહ્યાં છે ઓન-સ્ક્રીન કીબોર્ડ સક્ષમ કર્યું તમારી ઇનપુટ પદ્ધતિ *(3જા પક્ષ)માં બદલાઇ ગયેલ છે. @@ -92,7 +93,6 @@ ઑડિઓ સેટિંગ્સ સ્ક્રીનશોટ્સ અક્ષમ કર્યા તેજ -% બાકી : ને પર બદલવામાં આવ્યું હતું Wi-Fi સક્ષમ કરો @@ -111,13 +111,13 @@ ગણના કરી રહ્યું છે... USB-C ઉપકરણ (જમણી બાજુનું પાછળનું પોર્ટ) ઓન-સ્ક્રીન કીબોર્ડ અક્ષમ કરો -મિ સુધીમાં પૂર્ણ નહીં પ્રતિબિંબત થઈ રહ્યું છે ctrl દૂરસ્થ સહાય વડે સાથે તમારી સ્ક્રીનનું નિયંત્રણ શેર કરવું. વૉલ્યૂમ Bluetooth ઉપકરણ "" ને જોડી બનાવવા માટે પરવાનગી જોઈએ છે. +પૂર્ણપણે ચાર્જ થવામાં સ્ક્રીનને લૉક કરવાનો શોર્ટકટ બદલાયો છે. કૃપા કરીને ને બદલે નો ઉપયોગ કરો. search ડિસ્કનેક્ટ કરો @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google ડ્રાઇવ સેટિંગ્સ... -: બાકી , Cast ઉપકરણો ઉપલબ્ધ સાઇન આઉટ @@ -166,7 +165,6 @@ ઑન-સ્ક્રીન કીબોર્ડ બતાવો વધુ જાણો વર્ચ્યુઅલ ડિસ્પ્લે -% છોડવા માટે બે વાર Control Shift Q દબાવો. ને પર ફેરવવામાં આવ્યું હતું તરફથી SMS @@ -225,9 +223,9 @@ પહેલાનું મેનૂ બંધ કરો સેટિંગ્સ -પૂર્ણ થવામાં : બાકી તમારું ચાલુ હોય ત્યારે તે ચાર્જ ન થાય તેવું બની શકે. મોબાઇલ ... + બાકી 270° નિમ્ન-પાવર ચાર્જર કનેક્ટ કર્યું છે Wi-Fi diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index ddc155d4743e5..d16f5d511bb3d 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb @@ -26,20 +26,21 @@ मोबाइल डेटा सक्षम करें बैटरी के खाली होने में शेष समय, Chrome डिवाइस + शेष सत्र से निकल रहा है ऑन-स्‍क्रीन कीबोर्ड सक्षम है आपकी इनपुट विधि *(तृतीय पक्ष) में बदल गई है. स्विच करने के लिए Shift + Alt दबाएं. USB-C डिवाइस (पिछला पोर्ट) पर मिरर कर रहा है -कार्य प्रबंधक को खोलने का शॉर्टकट बदल गया है. कृपया के बजाय का उपयोग करें. +काम के प्रबंधक को खोलने का शॉर्टकट बदल गया है. कृपया के बजाय का उपयोग करें. स्वत: क्‍लिक Shift+Alt (USB) कम-शक्ति वाला चार्जर नेटवर्क जानकारी -एकीकृत डेस्कटॉप मोड +संयुक्त डेस्कटॉप मोड डिवाइस स्कैन किए जा रहे हैं... ब्लूटूथ अक्षम किया गया सभी प्रस्थान करें @@ -92,7 +93,6 @@ ऑडियो सेटिंग स्क्रीनशॉट अक्षम हैं स्क्रीन की रोशनी -% शेष है : रिज़ॉल्यूशन को में बदल दिया गया वाई-फ़ाई सक्षम करें @@ -111,13 +111,13 @@ गणना की जा रही है... USB-C डिवाइस (दायां पिछला पोर्ट) ऑन-स्‍क्रीन कीबोर्ड अक्षम करें -पूरी तरह से चार्ज होने में घं मि शेष नहीं मिरर करना ctrl आपकी स्‍क्रीन का नियंत्रण दूरस्‍थ सहायक के द्वारा से साझा किया जा रहा है. मात्रा ब्लूटूथ डिवाइस "" युग्मित करने की अनुमति चाहता है. +पूरी तरह चार्ज होने में स्‍क्रीन को लॉक करने का शॉर्टकट बदल गया है. कृपया के बजाय का उपयोग करें. search डिस्कनेक्ट करें @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google डिस्क सेटिंग... -: शेष , कास्ट डिवाइस उपलब्ध हैं प्रस्थान करें @@ -154,7 +153,7 @@ Chromebit वापस लाएं निष्पादन ट्रेसिंग सक्षम है -पर्यवेक्षित उपयोगकर्ता +निगरानी में रखा गया उपयोगकर्ता हेडफ़ोन आपकी स्‍क्रीन का नियंत्रण दूरस्‍थ सहायका के द्वारा साझा किया जा रहा है. अतिथि सत्र से बाहर निकलें @@ -166,7 +165,6 @@ ऑन-स्क्रीन कीबोर्ड दिखाएं अधिक जानें वर्चुअल डिस्प्ले -% छोड़ने के लिए Control Shift Q दो बार दबाएं. को पर घुमाया गया से SMS @@ -225,9 +223,9 @@ पिछला मेनू बंद करें सेटिंग्स -पूरा होने में : शेष हो सकता है आपका चालू होने पर चार्ज नहीं होता हो. मोबाइल ... + शेष 270° कम-शक्ति वाला चार्जर वाई-फ़ाई diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 6ca0b5692c160..f4071e5b6eaa3 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb @@ -26,6 +26,7 @@ Omogući mobilne podatke Baterija će se isprazniti za Chrome uređaj +Još Napuštanje sesije Tipkovnica na zaslonu omogućena je Vaš je način unosa promijenjen u *(treća strana). @@ -92,7 +93,6 @@ Pritisnite tipke Pretraživanje ili Shift da biste ju isključili. Postavke zvuka Snimke zaslona onemogućene su Svjetlina -Preostalo % : Razlučivost zaslona promijenjena je na Omogući Wi-Fi @@ -111,13 +111,13 @@ Pritisnite tipke Pretraživanje ili Shift da biste ju isključili. Izračun u tijeku… USB-C uređaj (stražnji desni priključak) Onemogući tipkovnicu na zaslonu - h min do završetka punjenja Ne Zrcaljenje ctrl i vi dijelite kontrolu nad zaslonom putem Daljinske pomoći. Glasnoća Bluetooth uređaj "" traži dopuštenje za uparivanje. + do potpune napunjenosti Promijenio se prečac za zaključavanje zaslona. Upotrijebite umjesto . search Prekini vezu @@ -129,7 +129,6 @@ Pritisnite tipke Pretraživanje ili Shift da biste ju isključili. Chromebook Ctrl + Shift + razmak Postavke Google diska... -Preostalo : , Dostupni su uređaji za emitiranje Odjava @@ -166,7 +165,6 @@ Pritisnite Shift + Alt za promjenu. Prikaži tipkovnicu na zaslonu Saznajte više Virtualni prikaz -% Pritisnite tipke Control, Shift i Q dvaput da biste odustali. Zaslon rotiran je za SMS šalje @@ -226,9 +224,9 @@ Pritisnite tipke Alt + Pretraživanje ili Shift da biste ju isključili.Prethodni izbornik Zatvori Postavke -: do potpune napunjenosti Uređaj možda se neće puniti dok je uključen. Mobilne mreže... +Preostalo 270° Priključen je punjač male snage Wi-Fi diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 8540ff900698f..e680577fcc434 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb @@ -26,6 +26,7 @@ Mobiladatok engedélyezése Akkumulátor lemerüléséig hátralévő idő: Chrome-eszköz + van hátra Kilépés a munkamenetből Képernyő-billentyűzet bekapcsolva A beviteli mód a következőre változott: *(harmadik fél). @@ -92,7 +93,6 @@ Kikapcsolásához nyomja meg a Keresés vagy a Shift billentyűt. Hangbeállítások Képernyőképek letiltva Fényerő -% maradt : felbontása erre módosult: Wi-Fi engedélyezése @@ -111,13 +111,13 @@ Kikapcsolásához nyomja meg a Keresés vagy a Shift billentyűt. Számítás… C típusú USB-vel kompatibilis eszköz (jobb hátsó port) Képernyő-billentyűzet letiltása - ó p a teljes feltöltésig Nem Tükrözés ctrl A képernyő irányításának megosztása segítővel a Távsegítség szolgáltatás keretein belül. Hangerő A(z) „” Bluetooth-eszköz engedélyt kér a párosításra. + a teljes feltöltésig Megváltozott a képernyőzárolás billentyűkódja. A helyett használja a következőt: . search Kapcsolat bontása @@ -129,7 +129,6 @@ Kikapcsolásához nyomja meg a Keresés vagy a Shift billentyűt. Chromebook Ctrl+Shift+Space A Google Drive beállításai... -: van hátra , Cast-eszközök állnak rendelkezésre Kijelentkezés @@ -166,7 +165,6 @@ A váltáshoz nyomja meg a Shift + Alt billentyűkódot. A képernyő-billentyűzet megjelenítése További információ Virtuális kijelző -% A kilépéshez nyomja meg kétszer a Ctrl Shift Q billentyűkódot. elfordult erre: SMS innen: @@ -226,9 +224,9 @@ Kikapcsolásához nyomja meg az Alt + Keresés vagy a Shift billentyűt.Előző menü bezárása Beállítások -: a teljes feltöltésig Előfordulhat, hogy a(z) nem töltődik, amíg be van kapcsolva. Mobil... + maradt 270° Kis teljesítményű töltő csatlakoztatva Wi-Fi diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 9b52807801954..47e2b71fa0211 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb @@ -26,6 +26,7 @@ Aktifkan data seluler Waktu yang tersisa hingga baterai kosong, Perangkat Chrome +Sisa waktu Keluar dari Sesi Keyboard di layar diaktifkan Metode masukan Anda telah berubah menjadi *(pihak ketiga). @@ -92,7 +93,6 @@ Tekan Telusuri atau Shift untuk membatalkan. Setelan Audio Tangkapan layar dinonaktifkan Kecerahan -Sisa % : resolusi diubah menjadi Aktifkan Wi-Fi @@ -111,13 +111,13 @@ Tekan Telusuri atau Shift untuk membatalkan. Menghitung... Perangkat USB-C (port belakang sebelah kanan) Nonaktifkan keyboard di layar -j m sampai penuh Tidak Mencerminkan ctrl Berbagi kontrol layar dengan via Remote Assistance. Volume Perangkat Bluetooth "" meminta izin untuk bersanding. + hingga penuh Pintasan untuk mengunci layar telah berubah. Gunakan sebagai gantinya . search Putuskan @@ -129,7 +129,6 @@ Tekan Telusuri atau Shift untuk membatalkan. Chromebook Ctrl+Shift+Spasi Setelan Google Drive... -Sisa : , Perangkat transmisi tersedia Keluar @@ -166,7 +165,6 @@ Tekan Shift + Alt untuk beralih. Tampilkan keyboard di layar Pelajari lebih lanjut Tampilan Virtual -% Tekan Control Shift Q dua kali untuk keluar. diputar ke SMS dari @@ -226,9 +224,9 @@ Tekan Alt+Telusuri atau Shift untuk membatalkan. Menu sebelumnya Tutup Setelan -. sampai penuh Anda mungkin tidak diisi daya saat dinyalakan. Seluler ... +Sisa 270° Pengisi daya rendah terpasang Wi-Fi diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 253bea1a481f5..00aade16276f2 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb @@ -26,6 +26,7 @@ Attiva dati mobili Tempo rimanente all'esaurimento della batteria: Dispositivo Chrome + rimanenti Uscita dalla sessione Tastiera sullo schermo attiva Il metodo di immissione è stato cambiato in *(3a parte). @@ -92,7 +93,6 @@ Premi il tasto per la ricerca o Maiusc per annullare. Impostazioni audio Screenshot disabilitati Luminosità -% rimanente : La risoluzione di è stata modificata in: Attiva Wi-Fi @@ -111,13 +111,13 @@ Premi il tasto per la ricerca o Maiusc per annullare. Calcolo in corso... Dispositivo USB-C (porta posteriore destra) Disattiva tastiera sullo schermo - h e m per completare la ricarica No Mirroring ctrl Condividi il controllo dello schermo con tramite Assistenza remota. Volume Il dispositivo Bluetooth "" chiede l'autorizzazione per essere accoppiato. + alla ricarica completa La scorciatoia per bloccare lo schermo è cambiata. Utilizza invece di . ricerca Disconnetti @@ -129,7 +129,6 @@ Premi il tasto per la ricerca o Maiusc per annullare. Chromebook CTRL+MAIUSC+Barra spaziatrice Impostazioni Google Drive... -: rimanenti , Dispositivi di trasmissione disponibili Esci @@ -166,7 +165,6 @@ Premi Maiusc+Alt per cambiare metodo. Mostra tastiera sullo schermo Ulteriori informazioni Display virtuale -% Per uscire premi due volte Ctrl+Maiusc+Q. è stato ruotato a SMS da @@ -226,9 +224,9 @@ Premi Alt+tasto per la ricerca o Maiusc per annullare. Menu precedente Chiudi Impostazioni -: al completamento Il tuo dispositivo potrebbe non caricarsi mentre è acceso. Reti mobili... + rimanente 270° Caricabatterie a basso consumo collegato Wi-Fi diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index b67fd0957a52f..f83667805994d 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb @@ -26,6 +26,7 @@ הפעל נתונים לנייד הזמן שנותר עד להתרוקנות הסוללה, ‏מכשיר Chrome +זמן נותר - יוצא מההפעלה המקלדת שמופיעה במסך מופעלת ‏שיטת הקלט שלך השתנתה ל-‏*(צד שלישי)‎. @@ -92,7 +93,6 @@ הגדרות אודיו צילומי מסך מושבתים בהירות -%‎ נותרו ‏: הרזולוציה של שונתה ל- ‏הפעל Wi-Fi @@ -111,13 +111,13 @@ מחשב... ‏מכשיר עם יציאת USB-C (יציאה ימנית-אחורית) השבת את המקלדת שמופיעה במסך - שעות ו- דקות עד לטעינה מלאה לא שיקוף ctrl שיתוף השליטה במסך עם דרך סיוע מרחוק. עוצמת קול ‏מכשיר ה-Bluetooth ‏"" מבקש הרשאה לבצע התאמה. + עד למילוי מקש הקיצור לנעילת המסך השתנה. השתמש ב- במקום ב-. Search נתק @@ -129,7 +129,6 @@ Chromebook ‏Ctrl‏+Shift+רווח ‏הגדרות Google Drive... -נותרו ‏, מכשירי העברה זמינים יציאה @@ -166,7 +165,6 @@ הצג מקלדת במסך למידע נוסף תצוגה וירטואלית -% ‏לחץ פעמיים על Control Shift Q כדי לצאת. בוצע סיבוב של אל ‏SMS מאת @@ -225,9 +223,9 @@ התפריט הקודם סגור הגדרות -: עד שמתמלא ייתכן שה- לא ייטען כשהוא פועל. נייד ... +שיעור טעינה נותר - 270° חובר מטען בעל מתח נמוך Wi-Fi diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 7279dcb98d04e..13b2fc5970049 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb @@ -26,6 +26,7 @@ モバイル データを有効にする バッテリーが空になるまであと: Chrome 搭載デバイス +あと セッションを終了 画面キーボードが有効です 入力方法を *(サードパーティ)に変更しました。 @@ -92,7 +93,6 @@ オーディオ設定 スクリーンショットが無効 輝度 -残り % : の解像度を に変更しました Wi-Fi を有効にする @@ -111,13 +111,13 @@ 計算しています... USB-C デバイス(右奥のポート) 画面キーボードを無効にする -フル充電まで 時間 いいえ ミラーリングしています ctrl リモート サポート経由で と画面の制御を共有しています。 音量 Bluetooth デバイス「」がペア設定の権限をリクエストしています。 +あと で充電完了 画面をロックするショートカットが変わりました。 ではなく をご使用ください。 検索 切断 @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google ドライブの設定... -残り時間: : キャスト デバイスを利用できます ログアウト @@ -166,7 +165,6 @@ 画面キーボードを表示する 詳しく見る 仮想ディスプレイ -% 終了するには Ctrl+Shift+Q を 2 回押してください。 に回転しました の SMS @@ -226,9 +224,9 @@ Alt+ 検索/Shift キーを押すと解除されます。 前のメニュー を閉じる 設定 -フル充電まで: : は電源がオンでも充電できない可能性があります。 モバイル... +バッテリー残量: 270° 低電力の充電器に接続されています Wi-Fi diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 9d47af55accc1..74c1df189f27b 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb @@ -26,6 +26,7 @@ ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ ಬ್ಯಾಟರಿ ಖಾಲಿ ಆಗುವವರೆಗೆ ಉಳಿದಿರುವ ಸಮಯ, Chrome ಸಾಧನ + ಬಾಕಿ ಉಳಿದಿದೆ ಸೆಷನ್ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ ಆನ್ ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ನಿಮ್ಮ ಇನ್‌ಪುಟ್ ವಿಧಾನವನ್ನು * ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ (3ನೇ ವ್ಯಕ್ತಿ). @@ -67,7 +68,7 @@ ಶೆಲ್ಫ್ ಸ್ಥಾನ bluetooth ಸಕ್ರಿಯಗೊಳಿಸಿ mod3 -Wi-Fi ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ +ವೈ-ಫೈ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು... ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಸಾರ್ವಜನಿಕ ಸೆಶನ್ ಆಗಿದೆ ಔಟ್‌ಪುಟ್ @@ -92,10 +93,9 @@ ಆಡಿಯೊ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಪ್ರಕಾಶಮಾನ -% ಉಳಿದಿದೆ : ರೆಸಲ್ಯೂಷನ್ ಅನ್ನು ಗೆ ಬದಲಿಸಲಾಗಿದೆ -Wi-Fi ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ +ವೈ-ಫೈ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ 9+ ತೊರೆಯಲು Ctrl+Shift+Q ಅನ್ನು ಎರಡು ಬಾರಿ ಒತ್ತಿರಿ. ಸ್ಕ್ರಿನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ @@ -111,13 +111,13 @@ ಎಣಿಸಲಾಗುತ್ತಿದೆ... USB-C ಸಾಧನ (ಬಲ ಭಾಗದ ಹಿಂದಿನ ಪೋರ್ಟ್‌) ಆನ್‌-ಸ್ಕ್ರೀನ್‌ ಕೀಬೋರ್ಡ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸು -ಪೂರ್ಣವಾಗುವವರಗೆ ಗಂ ನಿ ಇಲ್ಲ ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ ctrl ರಿಮೋಟ್ ಸಹಾಯದ ಮೂಲಕ ಜೊತೆಗೆ ನಿಮ್ಮ ಪರದೆಯ ನಿಯಂತ್ರಣವನ್ನು ಹಂಚಲಾಗುತ್ತಿದೆ. ವಾಲ್ಯೂಮ್ ಬ್ಲೂಟೂತ್‌‌ ಸಾಧನವು "" ಜೋಡಣೆಗಾಗಿ ಅನುಮತಿಯನ್ನು ಬಯಸುತ್ತದೆ. + ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಲಾಕ್ ಮಾಡುವ ಶಾರ್ಟ್‌ಕಟ್ ಬದಲಾಗಿದೆ. ಬದಲಿಗೆ ಬಳಸಿ. search ಡಿಸ್‌ಕನೆಕ್ಟ್ @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google ಡ್ರೈವ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು... -: ಉಳಿದಿದೆ , ಬಿತ್ತರಿಸುವಿಕೆಯ ಸಾಧನಗಳು ಲಭ್ಯವಿದೆ ಸೈನ್ ಔಟ್ @@ -166,7 +165,6 @@ ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ ವರ್ಚುವಲ್ ಪ್ರದರ್ಶನ -% ತೊರೆಯಲು Control Shift Q ಅನ್ನು ಎರಡು ಬಾರಿ ಒತ್ತಿರಿ. ಅನ್ನು ಗೆ ತಿರುಗಿಸಲಾಗಿದೆ ನಿಂದ SMS @@ -225,12 +223,12 @@ ಹಿಂದಿನ ಮೆನು ಮುಚ್ಚಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು -: ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ ನಿಮ್ಮ ಅನ್ನು ಆನ್ ಮಾಡಿರುವಾಗ ಅದನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಮೊಬೈಲ್... + ಉಳಿದಿದೆ 270° ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ -Wi-Fi +ವೈ-ಫೈ ವೀಕ್ಷಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ ಎರಡಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಪ್ರದರ್ಶನಗಳ ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. 90° diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index c8b9984279ac5..6a9542c59930f 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb @@ -26,6 +26,7 @@ 모바일 데이터 사용 남은 배터리 사용 시간은 입니다. Chrome 기기 + 남음 세션 종료 터치 키보드 사용 설정됨 입력 방법이 *(타사)(으)로 변경되었습니다. @@ -92,7 +93,6 @@ 오디오 설정 스크린샷 캡쳐 사용 중지됨 밝기 -% 남음 : 해상도가 (으)로 변경되었습니다. Wi-Fi 사용 @@ -111,13 +111,13 @@ 계산 중... USB-C 기기(우측 후면 포트) 터치 키보드 사용 중지 -충전 완료까지 시간 분 남음 아니요 미러링 ctrl 원격 지원을 통해 와(과) 화면 제어 공유 볼륨 블루투스 기기 ''에서 페어링 허가를 요청합니다. +충전 완료까지 남음 화면 잠금 단축키가 변경되었습니다. 대신 을(를) 사용하세요. 검색 연결 해제 @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+스페이스바 Google 문서함 설정... -: 남음 , 전송 기기를 사용할 수 있음 로그아웃 @@ -166,7 +165,6 @@ 터치 키보드 표시 자세히 알아보기 가상 디스플레이 -% 종료하려면 Ctrl+Shift+Q를 두 번 누릅니다. (이)가 (으)로 회전되었습니다. 에서 전송된 SMS @@ -226,9 +224,9 @@ 이전 메뉴 닫기 설정 -충전 완료까지 : 남음 이(가) 켜져 있는 동안에는 충전되지 않을 수 있습니다. 모바일 ... + 남음 270° 저출력 충전기 연결됨 Wi-Fi diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 614c152afcfaa..27d1510e5a2f2 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb @@ -26,6 +26,7 @@ Įgalinti duomenis mobiliesiems Laikas, likęs iki akumuliatoriaus išsikrovimo: „Chrome“ įrenginys +Liko Išeinama iš sesijos Ekrano klaviatūra įgalinta Įvesties metodas pakeistas į * (trečioji šalis). @@ -92,7 +93,6 @@ Jei norite atšaukti, paspauskite paieškos arba antrojo lygio klavišą.Garso nustatymai Ekrano kopijos išjungtos Šviesumas -Liko proc. : skyra pakeista į Įgalinti „Wi-Fi“ @@ -111,13 +111,13 @@ Jei norite atšaukti, paspauskite paieškos arba antrojo lygio klavišą.Skaičiuojama... USB-C įrenginys (prievadas dešinėje, užpakalinėje dalyje) Išjungti ekrano klaviatūrą - val. min. iki visiško įkrovimo Ne Dubliuojama ctrl gali valdyti jūsų ekraną naudodamas (-a) Nuotolinę pagalbą. Apimtis „Bluetooth“ įrenginys „“ prašo leidimo susieti. +Liko , kol bus visiškai įkrautas Pakeistas ekrano užrakinimo spartusis klavišas. Naudokite vietoje . ieškoti Atsijungti @@ -129,7 +129,6 @@ Jei norite atšaukti, paspauskite paieškos arba antrojo lygio klavišą.Chromebook „Ctrl“ + „Shift“ + tarpo klavišas „Google“ disko nustatymai... -Liko . , Pasiekiami perdavimo įrenginiai Atsijungti @@ -166,7 +165,6 @@ Jei norite atšaukti, paspauskite paieškos arba antrojo lygio klavišą.Rodyti ekrano klaviatūrą Sužinokite daugiau Virtualusis ekranas - % Jei norite išeiti, du kartus paspauskite „Control“ + „Shift“ + Q. pakeista į SMS iš @@ -226,9 +224,9 @@ Jei norite atšaukti, paspauskite „Alt“ + paieškos klavišas arba „Alt“ Ankstesnis meniu Uždaryti „ Nustatymai -. iki visiško įkrovimo “ gali nebūti kraunamas, kai yra įjungtas. Mobilusis... +Liko 270° Prijungtas mažos galios įkroviklis WI-Fi diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 63cf1d60b1faa..b66e9c5c32bd7 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb @@ -26,6 +26,7 @@ Iespējot mobilo datu pārraidi Atlikušais akumulatora darbības laiks: . Chrome ierīce +Atlikušais laiks: Iziešana no sesijas Ekrāna tastatūra iespējota Ievades metode ir mainīta uz *(trešā puse). @@ -92,7 +93,6 @@ Lai atceltu tā funkcionalitāti, nospiediet Meklēt vai Shift. Audio iestatījumi Ekrānuzņēmumi atspējoti Spilgtums -Atlikums: % : izšķirtspēja tika mainīta uz Iespējot Wi-Fi @@ -111,13 +111,13 @@ Lai atceltu tā funkcionalitāti, nospiediet Meklēt vai Shift. Aprēķina... USB-C ierīce (pieslēgvieta labajā pusē aizmugurē) Atspējot ekrāna tastatūru -Līdz pilnīgai uzlādei atlikušais laiks:  h  min Spoguļošana ctrl Ekrāna pārvaldības koplietošana ar , izmantojot attālo palīdzību. Skaļums Bluetooth ierīce “” vēlas saņemt atļauju, lai izveidotu savienojumu pārī. +Līdz pilnai uzlādei: Tika mainīti īsinājumtaustiņi, ar kuriem var bloķēt ekrānu. Lūdzu, turpmāk izmantojiet , nevis . meklēt Atvienot @@ -129,7 +129,6 @@ Lai atceltu tā funkcionalitāti, nospiediet Meklēt vai Shift. Chromebook Ctrl+Shift+Space Google diska iestatījumi... -Atlicis: : , Pieejamas apraides ierīces Izrakstīties @@ -166,7 +165,6 @@ Lai to pārslēgtu, nospiediet taustiņu kombināciju Shift+Alt. Rādīt ekrāna tastatūru Uzziniet vairāk Virtuālais displejs -% Lai izietu, divas reizes nospiediet taustiņu kombināciju Ctrl+Shift+Q. tika pagriezts šādi: SMS no @@ -226,13 +224,14 @@ Lai atceltu tā funkcionalitāti, nospiediet Alt+Meklēt vai Shift.Iepriekšējā izvēlne Aizvērt Iestatījumi -: jālādē ierīce, iespējams, netiks uzlādēta, kamēr tā būs ieslēgta. Mobilās ierīces... +Atlicis: % 270° Pievienots lādētājs ar mazu strāvas padevi Wi-Fi Noklikšķiniet, lai skatītu. +Spoguļošana ar vairāk nekā diviem ekrāniem netiek atbalstīta. 90° Search+Esc Notiek ekrāna izvēršana diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 680a93e005c42..a61e6f37e5f3e 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb @@ -4,7 +4,7 @@ USB-C ഉപകരണം (മുൻവശത്തെ പോർട്ട്) "" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കുന്നതിനുള്ള അനുമതി ആവശ്യപ്പെടുന്നു. ആ ഉപകരണത്തിൽ ഈ പിൻ കോഡ് നൽകുക: അടുത്ത ഇൻപുട്ട് രീതിയിലേക്ക് മാറാനുള്ള കുറുക്കുവഴി മാറ്റി. എന്നതിന് പകരം ഉപയോഗിക്കുക. -ഷെൽഫ് യാന്ത്രികമായി മറയ്‌ക്കുക +ഷെൽഫ് സ്വയമേവ മറയ്‌ക്കുക ഓവർസ്‌കാൻ എന്നതിൽ നിന്നും ചാർജ്ജുചെയ്യുന്നു ഓൺ-സ്‌ക്രീൻ കീബോർഡ് പ്രവർത്തനരഹിതമാക്കി @@ -26,6 +26,7 @@ മൊബൈൽ ഡാറ്റ പ്രാപ്‌തമാക്കുക ബാറ്ററി ശൂന്യമാകുന്നതിന് ശേഷിക്കുന്ന സമയം, Chrome ഉപകരണം + ശേഷിക്കുന്നു സെഷനിൽ നിന്ന് പുറത്തുകടക്കുന്നു ഓൺ‌ സ്‌ക്രീൻ കീ‌ബോർഡ് പ്രവർത്തനക്ഷമമാക്കി നിങ്ങളുടെ ഇൻപുട്ട് രീതി *(മൂന്നാം കക്ഷി) എന്നതിലേയ്‌ക്ക് മാറ്റി. @@ -92,7 +93,6 @@ ഓഡിയോ ക്രമീകരണങ്ങൾ സ്‌ക്രീൻഷോട്ടുകൾ പ്രവർത്തനരഹിതമാക്കി മിഴിവ് -% ശേഷിക്കുന്നു : മിഴിവ് എന്നതിലേയ്‌ക്ക് മാറ്റി Wi-fi പ്രാപ്‌തമാക്കുക @@ -111,13 +111,13 @@ കണക്കാക്കുന്നു... USB-C ഉപകരണം (വലതുവശത്ത് പിന്നിലെ പോർട്ട്) ഓൺ‌ സ്‌ക്രീൻ കീബോർഡ് പ്രവർത്തനരഹിതമാക്കുക -പൂർണ്ണമായും ചാർജാകുന്നതിന് മി ഇല്ല മിററിംഗ് ctrl ഉപയോഗിച്ച് നിങ്ങളുടെ വിദൂര സഹായി മുഖേന സ്‌ക്രീനിന്റെ നിയന്ത്രണം പങ്കിടുക. അളവ് "" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കുന്നതിനുള്ള അനുമതി ആവശ്യപ്പെടുന്നു. +പൂർത്തിയാകാൻ ശേഷിക്കുന്ന സമയം സ്‌ക്രീൻ ലോക്കുചെയ്യുന്നതിനുള്ള കുറുക്കുവഴി മാറ്റി. എന്നതിന് പകരം ഉപയോഗിക്കുക. search വിച്ഛേദിക്കുക @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google ഡ്രൈവ് ക്രമീകരണങ്ങൾ... -: ശേഷിക്കുന്നു , Cast ഉപകരണങ്ങൾ ലഭ്യമാണ്. പുറത്തുകടക്കുക @@ -159,13 +158,12 @@ അതിഥി സെഷനിൽ നിന്നും പുറത്തുകടക്കുക ഇപ്പോൾ സൈൻ ഔട്ട് ചെയ്യുക മറ്റൊരു ഉപയോക്താവിലേക്ക് മാറുമ്പോൾ സ്ക്രീൻ പങ്കിടൽ നിർത്തും. നിങ്ങൾക്ക് തുടരണോ? -നിങ്ങൾ -നുള്ളിൽ യാന്ത്രികമായി സൈൻ ഔട്ട് ചെയ്യും. +നിങ്ങൾ -നുള്ളിൽ സ്വയമേവ സൈൻ ഔട്ട് ചെയ്യും. നിങ്ങളുടെ കമ്പ്യൂട്ടർ സമീപത്തുള്ള Bluetooth ഉപകരണങ്ങൾക്ക് കണ്ടെത്താനാകുന്നതാണ് ഒപ്പം അത് എന്ന വിലാസത്തിൽ "" എന്നതായി ദൃശ്യമാകും. ചാർജ്ജുചെയ്യുന്നു ഓൺ-സ്‌ക്രീൻ കീബോർഡ് ദൃശ്യമാക്കുക കൂടുതൽ‍ മനസിലാക്കുക വെർച്വൽ ഡിസ്‌പ്ലേ -% പുറത്തുപോകുന്നതിന് രണ്ടുതവണ Control Shift Q അമർത്തുക. എന്നതിനെ എന്നതിലേയ്‌ക്ക് തിരിച്ചു എന്നതില്‍ നിന്നുള്ള SMS @@ -224,9 +222,9 @@ മുൻ മെനു അടയ്‌ക്കുക ക്രമീകരണങ്ങള്‍ -: നിറയാൻ നിങ്ങളുടെ ഓണായിരിക്കുമ്പോൾ അത് ചാർജ്ജാകാതിരിക്കാം. മൊബൈൽ ... + ശേഷിക്കുന്നു 270° കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ കണക്റ്റുചെയ്‌തു Wi-Fi diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 7cfe62f08e058..5f3e49510945d 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb @@ -26,6 +26,7 @@ मोबाइल डेटा सक्षम करा बॅटरी रिक्त होईपर्यंत शिल्लक वेळ, Chrome डिव्हाइस + शिल्लक सत्रातून निर्गमन करत आहे ऑन-स्क्रीन कीबोर्ड सक्षम आपली इनपुट पद्धत *(तृतीय पक्षावर)बदलली. @@ -92,7 +93,6 @@ ऑडिओ सेटिंग्ज स्क्रीनशॉट अक्षम केले ब्राइटनेस -% उर्वरित : रिजोल्यूशन वर बदलले होते Wi-fi सक्षम करा @@ -111,13 +111,13 @@ गणना करत आहे... USB-C डिव्‍हाइस (उजव्या बाजूचे मागील पोर्ट) ऑन-स्क्रीन कीबोर्ड अक्षम करा -पूर्ण होईपर्यंत ता मि नाही मिररिंग ctrl दूरस्त सहाय्याद्वारे सह आपल्या स्क्रीनचे नियंत्रण सामायिक करत आहे. व्हॉल्यूम "" Bluetooth डिव्हाइस जोडण्यासाठी परवानगी घेऊ इच्छिते. +पूर्ण होण्यात स्क्रीन लॉक करण्‍याचा शॉर्टकट बदलला आहे. कृपया ऐवजी वापरा. search ‍डिस्कनेक्ट @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google ड्राइव्ह सेटिंग्ज... -: शिल्‍लक , कास्‍ट डिव्‍हाइसेस उपलब्‍ध साइन आउट करा @@ -166,7 +165,6 @@ ऑन-स्‍क्रीन कीबोर्ड दर्शवा अधिक जाणून घ्या व्हर्च्युअल प्रदर्शन -% बाहेर पडण्यासाठी Control Shift Q दोनदा दाबा. वर फिरविले होते कडून SMS @@ -225,14 +223,14 @@ मागील मेनू बंद करा सेटिंग्ज -: बाकी पूर्ण होण्यात आपले चालू केले असताना कदाचित चार्ज होणार नाही. मोबाइल ... + शिल्लक 270° निम्न-उर्जेचे चार्जर कनेक्ट केले Wi-Fi पाहण्यासाठी क्लिक करा -दोन पेक्षा जास्त प्रदर्शनापेक्षा जास्त मि‍ररिंग समर्थित नाही. +दोन पेक्षा जास्त प्रदर्शनासाठी मि‍ररिंग समर्थित नाही. 90° Search+Esc स्क्रीन विस्तृत करत आहे diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 5a81194f1507e..8dcc4bddae1a5 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb @@ -26,6 +26,7 @@ Dayakan data mudah alih Masa yang tinggal sehingga bateri kosong, Peranti Chrome +Berbaki Keluar Dari Sesi Papan kekunci pada skrin didayakan Kaedah masukan anda telah ditukar kepada *(pihak ke-3). @@ -91,7 +92,6 @@ Tekan Shift + Alt untuk menukar. Tetapan Audio Tangkapan skrin dilumpuhkan Kecerahan -Tinggal % : Peleraian telah diubah kepada Dayakan Wi-Fi @@ -110,13 +110,13 @@ Tekan Shift + Alt untuk menukar. Mengira... Peranti USB-C (port belakang sebelah kanan) Lumpuhkan papan kekunci pada skrin -j m sehingga penuh Tidak Pencerminan ctrl Berkongsi kawalan skrin anda dengan melalui Bantuan Jauh. Kelantangan Peranti Bluetooth "" ingin kebenaran untuk berpasangan. + sehingga penuh Pintasan untuk mengunci skrin telah berubah. Sila gunakan dan bukannya . search Putuskan sambungan @@ -128,7 +128,6 @@ Tekan Shift + Alt untuk menukar. Chromebook Ctrl+Shift+Space Tetapan Google Drive -: tinggal , Peranti Cast tersedia Log keluar @@ -165,7 +164,6 @@ Tekan Shift + Alt untuk menukar. Paparkan papan kekunci pada skrin Ketahui lebih lanjut Paparan Maya -% Tekan Control Shift Q dua kali untuk keluar. telah diputarkan ke SMS daripada @@ -225,9 +223,9 @@ Tekan Alt+Search atau Shift untuk membatalkan. Menu sebelumnya Tutup Tetapan -: sehingga penuh anda mungkin tidak akan dicas semasa dihidupkan. Mudah alih ... +Berbaki 270° Pengecas berkuasa rendah disambungkan Wi-Fi diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index e22ef2540bab6..ac2686ffe37df 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb @@ -26,6 +26,7 @@ Mobiele gegevens inschakelen Resterende tijd totdat de accu leeg is: Chrome-apparaat + resterend Sessie sluiten Schermtoetsenbord ingeschakeld Je invoermethode is gewijzigd in *(derden). @@ -92,7 +93,6 @@ Druk op Zoeken of Shift om te annuleren. Audio-instellingen Screenshots uitgeschakeld Helderheid -% resterend : De resolutie van is gewijzigd in Wifi inschakelen @@ -111,13 +111,13 @@ Druk op Zoeken of Shift om te annuleren. Berekenen... USB-C-apparaat (poort rechts aan de achterkant) Schermtoetsenbord uitschakelen -u m tot volledig opgeladen Nee Mirroring ctrl De controle over je scherm wordt gedeeld met via externe ondersteuning. Volume Bluetooth-apparaat '' wil toestemming om te koppelen. + tot volledig opgeladen De sneltoets om het scherm te vergrendelen is gewijzigd. Gebruik in plaats van . zoeken Verbinding verbreken @@ -129,7 +129,6 @@ Druk op Zoeken of Shift om te annuleren. Chromebook Ctrl+Shift+spatie Instellingen voor Google Drive... -: resterend , Cast-apparaten beschikbaar Uitloggen @@ -166,7 +165,6 @@ Druk op Shift + Alt om te schakelen. Schermtoetsenbord weergeven Meer informatie Virtueel display -% Druk twee keer op Control+Shift+Q om te stoppen. is gedraaid naar Sms van @@ -226,9 +224,9 @@ Druk op Alt+Zoeken of Shift om te annuleren. Vorig menu sluiten Instellingen -: tot vol Je wordt mogelijk niet opgeladen terwijl deze is ingeschakeld. Mobiel... + resterend 270° Laag-vermogen-lader aangesloten Wifi diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 4f35efadab390..5e00d14bbf34f 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb @@ -26,6 +26,7 @@ Aktiver mobildata Gjenværende tid til batteriet er tomt – Chrome-enhet + igjen Avslutter økten Skjermtastaturet er aktivert Inndatametoden din er endret til *(tredjepart). @@ -92,7 +93,6 @@ Trykk på Søk eller Shift for å avbryte. Lydinnstillinger Skjermdumper er deaktivert Lysstyrke -% igjen : Oppløsningen for ble endret til Aktiver Wi-Fi @@ -112,13 +112,13 @@ Trykk på Søk eller Shift for å avbryte. Beregner … USB-C-enhet (porten bak på høyre side) Slå av skjermtastaturet - t og m til batteriet er ferdigladet Nei Speiling ctrl Deler kontroll av skjermen med via fjernhjelp. Volum Bluetooth-enheten «» ber om tillatelse til å koble til. + til batteriet er fulladet Snarveien for å låse skjermen er endret. Bruk i stedet for . søk Koble fra @@ -130,7 +130,6 @@ Trykk på Søk eller Shift for å avbryte. Chromebook Ctrl+Shift+Mellomrom Innstillinger for Google Disk -. gjenstår , Cast-enheter er tilgjengelige Logg av @@ -167,7 +166,6 @@ Trykk på Shift + Alt for å bytte. Vis skjermtastaturet Les mer Virtuell skjerm - % Trykk Control+Shift+Q to ganger for å avslutte. ble rotert til Tekstmelding fra @@ -226,9 +224,9 @@ Trykk på Alt + Søk eller Shift for å avbryte. Forrige meny Lukk Innstillinger -. til fulladet Det kan hende at din ikke lader når den er slått på. Mobil + igjen 270° Laveffektslader er tilkoblet Wi-Fi diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 7f37a2b3ba004..81248d2e7a8ca 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb @@ -26,6 +26,7 @@ Włącz komórkową transmisję danych Czas pozostały do wyczerpania baterii: Urządzenie z Chrome +Pozostało Zamykanie sesji Klawiatura ekranowa włączona Metoda wprowadzania została zmieniona na *(innej firmy). @@ -92,7 +93,6 @@ Naciśnij Szukaj lub Shift, by anulować. Ustawienia audio Zrzuty ekranu wyłączone Jasność -Pozostało % : Rozdzielczość wyświetlacza została zmieniona na Włącz Wi-Fi @@ -111,13 +111,13 @@ Naciśnij Szukaj lub Shift, by anulować. Obliczanie... Urządzenie USB-C (tylny port na prawym boku) Wyłącz klawiaturę ekranową - godz. min do pełnego naładowania Nie Odbicie lustrzane ctrl Udostępnianie sterowania ekranem użytkownikowi przy użyciu pomocy zdalnej. Głośność Urządzenie Bluetooth „” chce się sparować. + do pełnego naładowania Zmieniliśmy skrót, który blokuje ekran. Zamiast używaj teraz . search Rozłącz @@ -129,7 +129,6 @@ Naciśnij Szukaj lub Shift, by anulować. Chromebook Ctrl+Shift+Space Ustawienia Dysku Google... -Pozostało : , Dostępne są urządzenia przesyłające Wyloguj się @@ -166,7 +165,6 @@ Naciśnij Shift + Alt, by ją przełączyć. Pokaż klawiaturę ekranową Więcej informacji Wirtualny wyświetlacz -% Naciśnij dwukrotnie Control Shift Q, by zakończyć. Wyświetlacz został obrócony na Wiadomość SMS z numeru @@ -226,9 +224,9 @@ Naciśnij Alt+Szukaj lub Shift, by anulować. Poprzednie menu Zamknij Ustawienia -Do naładowania: : nie może się ładować, gdy jest włączony. Komórkowe... +Pozostało 270° Podłączono ładowarkę o małej mocy Wi-Fi diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 7d71a1d06bdc7..5afa1cb49ac2b 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb @@ -26,6 +26,7 @@ Ativar dados móveis O tempo restante até que a bateria se esgote é de Dispositivo Chrome + restante(s) Saindo da sessão Teclado na tela ativado Seu método de entrada mudou para *(terceiros). @@ -91,7 +92,6 @@ Pressione Shift + Alt para alternar. Configurações de áudio Capturas de tela desativadas Brilho -% restante : A resolução de foi alterada para Ativar Wi-Fi @@ -110,13 +110,13 @@ Pressione Shift + Alt para alternar. Calculando... Dispositivo USB-C (porta traseira da direita) Desativar o teclado na tela -hm até a carga total Não Espelhamento ctrl Compartilhando o controle da sua tela com via Assistência remota. Volume O dispositivo Bluetooth "" deseja permissão para realizar o pareamento. + até o carregamento completo O atalho para bloquear a tela foi alterado. Use em vez de . pesquisar Desconectar @@ -128,7 +128,6 @@ Pressione Shift + Alt para alternar. Chromebook Ctrl+Shift+Barra de espaço Configurações do Google Drive... -: restantes , Dispositivos de transmissão disponíveis Sair @@ -165,7 +164,6 @@ Pressione Shift + Alt para alternar. Mostrar teclado na tela Saiba mais Tela virtual -% Pressione Control+Shift+Q duas vezes para sair. foi substituída por SMS de @@ -225,14 +223,14 @@ Pressione Ctrl+Alt+Z para desativar. Menu anterior Fechar Configurações -: para carga completa Seu pode não ser carregado enquanto estiver ligado. Celular... + restante(s) 270° Carregador de baixa potência conectado Wi-Fi Clique para visualizar -Não há compatibilidade com o espelhamento com mais de duas telas. +Não há suporte para o espelhamento com mais de duas telas. 90° Pesquisa+Esc Tela ampla diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 13cfa90e9c3ba..0991a268d8ce4 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb @@ -26,6 +26,7 @@ Ativar dados móveis Tempo restante até a bateria terminar, Dispositivo Chrome + restante(s) A sair da sessão Teclado no ecrã ativado O seu método de introdução foi alterado para *(terceiros). @@ -92,7 +93,6 @@ Prima Pesquisar ou Shift para cancelar. Definições de Áudio Capturas de ecrã desativadas Brilho - % restante : A resolução de foi alterada para Ativar Wi-Fi @@ -111,13 +111,13 @@ Prima Pesquisar ou Shift para cancelar. A calcular... Dispositivo USB-C (porta traseira do lado direito) Desativar o teclado no ecrã -h m até ficar completa Não Espelhamento ctrl A partilhar o controlo do seu ecrã com através da Assistência remota. Volume O dispositivo Bluetooth "" necessita de autorização para sincronizar. + até estar totalmente carregada O atalho para bloquear o ecrã foi alterado. Utilize em vez de . search Desligar @@ -129,7 +129,6 @@ Prima Pesquisar ou Shift para cancelar. Chromebook Ctrl+Shift+Espaço Definições do Google Drive... -Restam : , Dispositivos de transmissão disponíveis Terminar sessão @@ -166,7 +165,6 @@ Prima Shift + Alt para mudar. Mostrar teclado no ecrã Saiba mais Ecrã virtual -% Prima Ctrl+Shift+Q duas vezes para sair. foi rodado para SMS de @@ -226,9 +224,9 @@ Prima Alt + Pesquisar ou Shift para cancelar. Menu anterior Fechar Definições -: até estar carregada O pode não carregar enquanto estiver ligado. Telemóvel... + restante 270° Carregador de baixo consumo ligado Wi-Fi diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 1f9e6ba60dc9f..9cb44a83f6471 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb @@ -26,6 +26,7 @@ Activați datele mobile Timp rămas până la descărcarea bateriei: Dispozitiv Chrome +Timp rămas: Se iese din sesiune Tastatură pe ecran activată Metoda de introducere s-a schimbat la *(terță parte). @@ -92,7 +93,6 @@ Apăsați Căutare sau Shift pentru a anula. Setări audio Capturile de ecran sunt dezactivate Luminozitate -Nivel disponibil: % : Rezoluția a fost modificată la Activați Wi-Fi @@ -111,13 +111,13 @@ Apăsați Căutare sau Shift pentru a anula. Se calculează... Dispozitiv USB-C (portul din dreapta spate) Dezactivează tastatura de pe ecran - h. min. până la încărcare completă Nu Oglindire ctrl În prezent, îți poate controla ecranul prin Asistență la distanță. Volum Dispozitivul Bluetooth „” solicită permisiunea de a se conecta. + până la încărcare completă Comanda rapidă pentru a bloca ecranul a fost modificată. Folosește în loc de . căutați Deconectează-te @@ -129,7 +129,6 @@ Apăsați Căutare sau Shift pentru a anula. Chromebook Ctrl + Shift + bara de spațiu Setări Disc Google... -Timp rămas: : , Dispozitive de proiecție disponibile Deconectează-te @@ -166,7 +165,6 @@ Apăsați Căutare sau Shift pentru a anula. Afișați tastatura pe ecran Află mai multe Afișare virtuală - % Apăsați de două ori Control Shift Q pentru a ieși. a fost rotit la SMS de la @@ -226,9 +224,9 @@ Apăsați Alt+Căutare sau Shift pentru a anula. Meniul anterior Închide Setări -: până ce bateria va fi plină Este posibil ca să nu se încarce cât timp este pornit. Rețele mobile... +Nivelul bateriei: 270° A fost conectat un încărcător de putere joasă Wi-Fi diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 4c8c44ab1d0b1..7b030e0172de1 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb @@ -26,6 +26,7 @@ Включить мобильную передачу данных Оставшееся время работы от батареи: . Устройство Chrome +Ещё Завершение сеанса Экранная клавиатура включена Способ ввода изменен на *(независимый разработчик). @@ -92,7 +93,6 @@ Настройки звука Скриншоты отключены Яркость -Осталось % : : установлено разрешение Включить Wi-Fi @@ -111,13 +111,13 @@ Вычисление… Устройство USB-C (дальний порт справа) Отключить экранную клавиатуру -До полной зарядки: ч мин Нет Отражение ctrl Доступ к экрану для с помощью удаленного помощника Объем Устройству требуется разрешение на подключение через Bluetooth. +До полной зарядки Изменились быстрые клавиши для блокировки экрана. Используйте вместо . поиск Отключиться @@ -129,7 +129,6 @@ Chromebook Ctrl + Shift + пробел Настройки Диска Google… -Осталось : , Доступны устройства для трансляции Выйти @@ -166,7 +165,6 @@ Показывать экранную клавиатуру Подробнее... Виртуальный дисплей -% Чтобы выйти, дважды нажмите Control + Shift + Q. : положение изменено на SMS от @@ -225,9 +223,9 @@ Предыдущее меню Закрыть окно "" Настройки -до полной зарядки: : Не удается зарядить устройство , пока оно включено. Мобильные сети… +Батарея заряжена на 270° Подключено маломощное зарядное устройство Wi-Fi diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 6ead9b6d295d0..a854ab2698def 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb @@ -26,6 +26,7 @@ Povoliť mobilné dátové pripojenie Čas zostávajúci do vybitia batérie: Zariadenie Chrome +Zostávajúci čas: Ukončenie relácie Klávesnica na obrazovke je povolená Metóda vstupu sa zmenila na *(tretia strana). @@ -92,7 +93,6 @@ Ak ho chcete zrušiť, stlačte klávesy Hľadať alebo Shift. Nastavenia zvuku Snímky obrazovky sú zakázané Jas -Zostáva % : Rozlíšenie obrazovky bolo zmenené na Povoliť Wi-Fi @@ -111,13 +111,13 @@ Ak ho chcete zrušiť, stlačte klávesy Hľadať alebo Shift. Prebieha výpočet... zariadenia USB-C (port vpravo vzadu) Vypnúť klávesnicu na obrazovke -h min do nabitia Nie Zrkadlenie ctrl Ovládanie obrazovky sa prostredníctvom Vzdialenej pomoci zdieľa s používateľom . Hlasitosť Zariadenie Bluetooth s názvom žiada o povolenie párovania. +Zostávajúci čas do úplného nabitia: Skratka uzamknutia obrazovky bola zmenená. Namiesto skratky používajte kombináciu klávesov . search Odpojiť @@ -129,7 +129,6 @@ Ak ho chcete zrušiť, stlačte klávesy Hľadať alebo Shift. Chromebook Ctrl+Shift+Space Nastavenia služby Disk Google... -zostáva : , Dostupné zariadenia na prenos Odhlásiť sa @@ -166,7 +165,6 @@ Ak ho chcete zrušiť, stlačte klávesy Hľadať alebo Shift. Zobraziť klávesnicu na obrazovke Viac informácií Virtuálna obrazovka - % Ak chcete skončiť, stlačte dvakrát kombináciu kláves Ctrl+Shift+Q. Obrazovka bola otočená o SMS z č. @@ -226,9 +224,9 @@ Ak ho chcete zrušiť, stlačte klávesy Alt + Hľadať alebo Shift.Predchádzajúca ponuka Zavrieť okno Nastavenia -čas do úplného nabitia: : Vaše zariadenie sa nemusí nabíjať, keď je zapnuté. Mobilné siete... +Zostávajúca kapacita: 270 ° Pripojila sa nabíjačka s nízkym výkonom Wi-Fi diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 0ef69423f5414..1793b43cca57f 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb @@ -26,6 +26,7 @@ Omogoči mobilno podatkovno povezavo Preostali čas do izpraznitve akumulatorja, Naprava Chrome +Še Odjava iz seje Zaslonska tipkovnica omogočena Način vnosa se je spremenil v *(drug ponudnik). @@ -92,7 +93,6 @@ Pritisnite tipko za iskanje ali Shift, da jo prekličete. Nastavitve zvoka Posnetki zaslona so onemogočeni Svetlost -Preostane še % : – ločljivost je bila spremenjena na: Omogoči Wi-Fi @@ -111,13 +111,13 @@ Pritisnite tipko za iskanje ali Shift, da jo prekličete. Izračunavanje … Naprava USB-C (vrata desno zadaj) Onemogoči zaslonsko tipkovnico - h min do napolnjenosti Ne Zrcaljenje ctrl Deljenje nadzora nad zaslonom z osebo prek pomoči na daljavo. Glasnost Naprava Bluetooth »« želi dovoljenje za seznanjanje. + do napolnjenosti Bližnjica za zaklepanje zaslona je spremenjena. Uporabite namesto . search Prekini povezavo @@ -129,7 +129,6 @@ Pritisnite tipko za iskanje ali Shift, da jo prekličete. Chromebook Ctrl + Shift + preslednica Nastavitve za Google Drive ... -Še . , Naprave za predvajanje so na voljo Odjava @@ -166,7 +165,6 @@ Pritisnite Shift + Alt, da ga preklopite. Pokaži zaslonsko tipkovnico Več o tem Navidezni zaslon - % Dvakrat pritisnite Ctrl + Shift + Q, če želite končati. – zasuk na SMS od @@ -226,9 +224,9 @@ Pritisnite Alt in tipko za iskanje ali Shift, da jo prekličete. Prejšnji meni Zapri Nastavitve -Čas polnjenja: še : Akumulator naprave se morda ne bo polnil, medtem ko je naprava vklopljena. Mobilna ... +Še % 270° Priključen je nizkoenergijski polnilnik Wi-Fi diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 717d214feba08..6db41ef64d1ee 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb @@ -26,6 +26,7 @@ Омогући податке за мобилне уређаје Време које је преостало док се батерија не испразни, Chrome уређај + је преостало Напуштање сесије Тастатура на екрану је омогућена Метод уноса је промењен у *(трећа страна). @@ -92,7 +93,6 @@ Подешавања звука Снимци екрана су онемогућени Осветљеност -Преостало је % : Резолуција је промењена у Омогући Wi-Fi @@ -111,13 +111,13 @@ Израчунавање... Уређај са USB прикључком типа C (десни задњи порт) Онемогући тастатуру на екрану - с м до краја пуњења Не Пресликавање ctrl Делите контролу над екраном са особом преко Даљинске помоћи. Јачина звука Bluetooth уређај „“ жели дозволу за упаривање. + док се не напуни Пречица за закључавање екрана је промењена. Користите уместо . search Прекини везу @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Подешавања Google диска... -Преостало је : , Доступни су уређаји за пребацивање Одјави ме @@ -166,7 +165,6 @@ Прикажи тастатуру на екрану Сазнајте више Виртуелни екран -% Притисните Control Shift Q двапут да бисте изашли. Екран је промењен у SMS са броја @@ -225,9 +223,9 @@ Претходни мени Затвори Подешавања -Још : док се не напуни се можда неће пунити док је укључен. Мобилни ... +Преостало је 270° Повезан је пуњач мале снаге Wi-Fi diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index 383c91d231dc8..66280eaa0693c 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb @@ -26,6 +26,7 @@ Aktivera mobildata Tid som återstår tills batteriet är tomt: Chrome-enhet + kvar Sessionen avslutas Skärmen på tangentbordet har aktiverats Inmatningsmetoden har ändrats till *(tredje part). @@ -91,7 +92,6 @@ Ljudinställningar Skärmdumpar har inaktiverats Ljusstyrka - % återstår : Upplösningen för ändrades till Aktivera Wi-Fi @@ -110,13 +110,13 @@ Beräknar ... USB-C-enhet (bakre porten på högra sidan) Inaktivera skärmtangentbord - h m till fulladdat Nej Spegling ctrl Dela kontroll över skärmen med via Fjärrhjälp. Volym Bluetooth-enheten har begärt tillstånd för koppling. + tills batteriet är fullt Kortkommandot för att låsa skärmen har ändrats. Använd i stället för . sök Koppla från @@ -128,7 +128,6 @@ Chromebook Ctrl+Skift+blanksteg Inställningar för Google Drive ... -: kvar , Överföringsenheter finns tillgängliga Logga ut @@ -165,7 +164,6 @@ Visa skärmtangentbordet Läs mer Virtuell skärm - % Avsluta genom att trycka på Ctrl + Skift + Q två gånger. byttes till SMS från @@ -224,9 +222,9 @@ Inaktivera funktionen genom att trycka på Ctrl+Alt+Z. Föregående meny Stäng Inställningar -: till fulladdat batteri Din laddas eventuellt inte så länge den är på. Mobil ... + återstår 270° Laddare med låg effekt ansluten Wi-Fi diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index a54b239421b26..1f098a6711f9c 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb @@ -26,6 +26,7 @@ Wezesha data ya simu Muda unaosalia mpaka betri inapoisha, Kifaa cha Chrome +Zimesalia Inaondoka kwenye Kipindi Kibodi ya skrini imewashwa Mbinu yako ingizo imebadilika hadi *(mhusika mwingine). @@ -92,7 +93,6 @@ Bonyeza Alt + Utafutaji au Hama ili kughairi. Mipangilio ya Sauti Picha za skrini zimezimwa Ung'aavu -% inayobaki : Ubora wa ulibadilishwa hadi Wezesha Wi-Fi @@ -111,13 +111,13 @@ Bonyeza Alt + Utafutaji au Hama ili kughairi. Inakokotoa... Kifaa cha USB-C (mlango wa upande wa kulia nyuma) Zima kibodi ya skrini -Saa dakika ili ijae La Kuakisi ctrl Kushiriki udhibiti wa skrini yako na kupitia Usaidizi wa Mbali. Kiwango Kifaa cha Bluetooth cha "" kinaomba idhini ya kuoanisha. +Zimesalia ili ijae Njia ya mkato ya kufunga skrini imebadilika. Tafadhali tumia badala ya . tafuta Tenganisha @@ -129,7 +129,6 @@ Bonyeza Alt + Utafutaji au Hama ili kughairi. Chromebook Ctrl+Shift+Space Mipangilio ya Hifadhi ya Google... -Imesalia : , Vifaa vinavyorusha midia vinapatikana Ondoka @@ -166,7 +165,6 @@ Bonyeza Shift + Alt ili kubadili. Onyesha kibodi ya skrini Pata maelezo zaidi Onyesho Pepe -% Bofya "Control" na "Shift" na Q kwa pamoja mara mbili ili kuacha. ilizungushwa hadi SMS kutoka @@ -225,14 +223,14 @@ Bonyeza Alt + Utafutaji au Hama ili kughairi. Menyu ya awali Funga Mipangilio -: mpaka ijae Huenda kifaa chako cha kisichaji kikiwa kimewashwa. Simu ya mkononi ... +Imebaki % 270° Chaja ya nguvu ya chini imeunganishwa Wi-Fi Bofya ili kutazama -Kuakisi kwa maonyesho zaidi ya mawili hakutumiki. +Kuakisi ukitumia zaidi ya skrini mbili hakuruhusiwi. 90° Search+Esc Kuongeza skrini diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 1f52876fd4828..2672a0af09bec 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb @@ -26,6 +26,7 @@ மொபைல் தரவை இயக்கு இன்னும் இல் பேட்டரி காலியாகிவிடும் Chrome சாதனம் + வரை மட்டுமே பேட்டரி இருக்கும் அமர்விலிருந்து வெளியேறுகிறது ஆன்ஸ்க்ரீன் விசைப்பலகை இயக்கப்பட்டது உங்கள் உள்ளீட்டு முறையானது *(மூன்றாம் தரப்பு) க்கு மாற்றப்பட்டது. @@ -92,7 +93,6 @@ ஆடியோ அமைப்புகள் ஸ்கிரீன்ஷாட்கள் முடக்கப்பட்டன ஒளிர்வு -% மீதமுள்ளது : தெளிவுத்திறன் க்கு மாற்றப்பட்டது Wi-fi ஐ இயக்கு @@ -111,13 +111,13 @@ கணக்கிடுகிறது... USB-C சாதனம் (வலது பக்கம் பின்னே இருக்கும் போர்ட்) ஆன்ஸ்க்ரீன் விசைப்பலகையை முடக்கு -முழுவதும் சார்ஜ் ஆகும் நேரம் - நி இல்லை பிரதிபலிக்கிறது ctrl தொலைநிலை உதவி மூலம் உடன் உங்கள் திரையின் கட்டுப்பாட்டைப் பகிர்கிறது. அளவு புளூடூத் சாதனம் "", இணைப்பதற்கான அனுமதியை விரும்புகிறது. +முழு சார்ஜ் ஆக வரை உள்ளது திரையைப் பூட்டுவதற்கான குறுக்குவழி மாற்றப்பட்டது. க்குப் பதிலாக ஐப் பயன்படுத்தவும். Search தொடர்பைத் துண்டி @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google இயக்கக அமைப்புகள்... -: உள்ளது , அனுப்பும் சாதனங்கள் உள்ளன வெளியேறு @@ -166,7 +165,6 @@ ஆன்-ஸ்கிரீன் விசைப்பலகையைக் காட்டு மேலும் அறிக விர்ச்சுவல் காட்சி -% வெளியேற Control Shift Q ஐ இருமுறை அழுத்தவும். ஆகச் சுழற்றப்பட்டது என்ற எண்ணிலிருந்து வந்த SMS @@ -226,9 +224,9 @@ முந்தைய மெனு ஐ மூடு அமைப்புகள் -நிரம்ப : உள்ளது இயக்கப்பட்டிருக்கும் போது உங்கள் இல் சார்ஜ் ஏறாது. மொபைல் ... + மீதமுள்ளது 270° குறைந்த சக்தியிலான சார்ஜர் இணைக்கப்பட்டுள்ளது வைஃபை diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index b1dd9792fa92c..e8562ddcc1f69 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb @@ -26,6 +26,7 @@ మొబైల్ డేటాను ప్రారంభించు బ్యాటరీ ఖాళీ కావడానికి మిగిలి ఉన్న సమయం, Chrome పరికరం + మిగిలి ఉంది సెషన్ నుండి నిష్క్రమిస్తోంది స్క్రీన్‌పై కనిపించే కీబోర్డ్ ప్రారంభించబడింది మీ ఇన్‌పుట్ పద్ధతి *(3వ పక్షం)కు మార్చబడింది. @@ -92,7 +93,6 @@ ఆడియో సెట్టింగ్‌‍లు స్క్రీన్‌షాట్‌లు నిలిపివేయబడ్డాయి ప్రకాశం -% మిగిలి ఉంది : రిజల్యూషన్ కి మార్చబడింది Wi-fiని ప్రారంభించు @@ -111,13 +111,13 @@ గణిస్తోంది... USB-C పరికరం (కుడివైపు వెనుక పోర్ట్) స్క్రీన్‌పై కీబోర్డ్‌ను నిలిపివేయి -నిండే వరకు h m అవుతుంది కాదు ప్రతిబింబిస్తుంది ctrl రిమోట్ సహాయం విధానంలో మీ స్క్రీన్ నియంత్రణ కి భాగస్వామ్యం చేయబడుతోంది. వాల్యూమ్ బ్లూటూత్ పరికరం "" జత కావడానికి అనుమతి కోరుతోంది. +పూర్తి కావడానికి పడుతుంది స్క్రీన్‌ని లాక్ చేసే సత్వరమార్గం మార్చబడింది. దయచేసి కి బదులుగా ని ఉపయోగించండి. search డిస్‌కనెక్ట్ చెయ్యి @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google డిస్క్ సెట్టింగ్‌లు... -: మిగిలి ఉంది , Cast పరికరాలు అందుబాటులో ఉన్నాయి సైన్ ఔట్ @@ -166,7 +165,6 @@ స్క్రీన్‌పై కీబోర్డ్‌ను చూపు మరింత తెలుసుకోండి వర్చువల్ డిస్‌ప్లే -% నిష్క్రమించడానికి రెండుసార్లు Control Shift Q నొక్కండి. కి తిప్పబడింది నుండి SMS @@ -226,9 +224,9 @@ మునుపటి మెను ని మూసివేయి సెట్టింగ్‌లు -:లో పూర్తవుతుంది మీ ఆన్‌లో ఉన్నప్పుడు ఛార్జ్ కాకపోవచ్చు. మొబైల్ ... + మిగిలి ఉంది 270° తక్కువ-పవర్ గల ఛార్జర్ కనెక్ట్ చేయబడింది Wi-Fi diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index d90f8d74bc64f..3d9988c5e3b08 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb @@ -26,6 +26,7 @@ เปิดใช้งานข้อมูลมือถือ เวลาที่เหลือกว่าแบตเตอรี่จะหมด, อุปกรณ์ Chrome +ใช้ได้อีก กำลังออกจากเซสชัน เปิดใช้แป้นพิมพ์บนหน้าจออยู่ วิธีการป้อนข้อมูลของคุณเปลี่ยนแปลงเป็น * (บุคคลที่สาม) @@ -92,7 +93,6 @@ การตั้งค่าเสียง ปิดใช้การจับภาพหน้าจอ ความสว่าง -เหลืออีก % : ความละเอียดของ เปลี่ยนเป็น เปิดใช้งาน Wi-Fi @@ -111,13 +111,13 @@ กำลังคำนวณ... อุปกรณ์ USB-C (พอร์ตด้านหลังขวา) ปิดใช้แป้นพิมพ์บนหน้าจอ -อีก ชม. นาทีจึงจะเต็ม ไม่มี กำลังแสดงผล ctrl กำลังแชร์การควบคุมหน้าจอกับ ผ่านความช่วยเหลือระยะไกล ระดับเสียง อุปกรณ์บลูทูธ "" ต้องการสิทธิ์ในการจับคู่ +อีก จะเต็ม มีการเปลี่ยนแปลงทางลัดที่ใช้ล็อกหน้าจอ โปรดใช้ แทน ค้นหา ตัดการเชื่อมต่อ @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space การตั้งค่า Google ไดรฟ์... -เหลืออีก : , เครื่องส่งพร้อมใช้งาน ออกจากระบบ @@ -166,7 +165,6 @@ แสดงแป้นพิมพ์บนหน้าจอ เรียนรู้เพิ่มเติม หน้าจอเสมือน -% กด Control Shift Q สองครั้งเพื่อออก หมุนเวียนเป็น SMS จาก @@ -226,9 +224,9 @@ เมนูก่อนหน้า ปิด การตั้งค่า -อีก : จึงจะเต็ม ของคุณอาจไม่ชาร์จเมื่อเครื่องเปิดอยู่ มือถือ ... +เหลือ % 270° เชื่อมต่อกับที่ชาร์จพลังงานต่ำ Wi-Fi diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 9a40c7f817890..76922eb80f248 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb @@ -26,6 +26,7 @@ Mobil verileri etkinleştir Pilin boşalması için kalan süre, Chrome cihaz +Kalan süre: Oturumdan Çıkış Yapılıyor Dokunmatik klavye etkin Giriş yönteminiz *(3. taraf) olarak değiştirildi. @@ -92,7 +93,6 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın. Ses Ayarları Ekran görüntüleri devre dışı Parlaklık -% kaldı : çözünürlüğü olarak değiştirildi Kablosuzu Etkinleştir @@ -111,13 +111,13 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın. Hesaplanııyor... USB-C cihaz (sağ arka bağlantı noktası) Ekran klavyesini devre dışı bırak -Tam dolana kadar sa dk var Hayır Yansıtılıyor ctrl Ekranınızın kontrolü, Uzaktan Yardım kullanılarak ile paylaşılıyor. Ses "" adlı Bluetooth cihaz eşleme izni istiyor. +Dolması için gereken süre: Ekranı kilitleme kısayolu değişti. Lütfen yerine kısayolunu kullanın. ara Bağlantıyı kes @@ -129,7 +129,6 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın. Chromebook Ctrl+Üst Karakter+Boşluk Google Drive ayarları... -: kaldı , Yayın cihazları kullanılabilir Çıkış @@ -167,7 +166,6 @@ Geçiş yapmak için ÜstKrktr + Alt tuşlarına basın. Dokunmatik klavyeyi göster Daha fazla bilgi edinin Sanal Görüntü -% Çıkmak için Ctrl+ÜstKrktr+Q tuşlarına iki kez basın. dönme ayarı olarak değiştirildi numaradan SMS alındı @@ -227,9 +225,9 @@ Devre dışı bırakmak için Ctrl+Alt+Z tuşlarına basın. Önceki menü penceresini kapat Ayarlar -Dolması için gereken süre: : cihazınız açıkken şarj olmayabilir. Mobile... + kaldı 270° Düşük güçlü şarj cihazı bağlandı Kablosuz diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 5db560a355c2e..46578aa3355f1 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb @@ -26,6 +26,7 @@ Увімкнути передавання мобільних даних До розрядження акумулятора залишилося Пристрій Chrome +Залишилося Завершення сеансу Екранну клавіатуру ввімкнено Метод введення змінено на * (третя сторона). @@ -92,7 +93,6 @@ Налаштування звуку Знімки екрана вимкнено Яскравість -Залишилося % : : установлено роздільну здатність Увімкнути Wi-Fi @@ -111,13 +111,13 @@ Обчислення... пристрій, під’єднаний до порту USB-C (праворуч на задній панелі) Вимкнути екранну клавіатуру - год. хв. до повного зарядження ні Дзеркальне відображення ctrl Спільний доступ до екрана для користувача через віддалену допомогу. Гучність Пристрою Bluetooth "" потрібен дозвіл на підключення. + до повного заряду Комбінація клавіш для блокування екрана змінилася. Тепер це , а не . пошук Від'єднатися @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+пробіл Налаштування Google Диска... -Залишилося : , Доступні пристрої для трансляції Вийти @@ -166,7 +165,6 @@ Показувати екранну клавіатуру Докладніше Віртуальний дисплей -% Двічі натисніть комбінацію клавіш Control Shift Q, щоб вийти. обернено на SMS-повідомлення від @@ -226,9 +224,9 @@ Попереднє меню Закрити вікно Налаштування -: до повного зарядження Пристрій може не заряджатися, коли він увімкнений. Мобільні ... +Залишилося 270° Зарядний пристрій низької потужності підключено Wi-Fi diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 5c7ce24c1cfc5..9c96aeb33a110 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb @@ -26,6 +26,7 @@ Bật dữ liệu di động Thời gian còn lại cho đến khi pin hết, Thiết bị Chrome +Còn Thoát phiên Đã bật bàn phím ảo Phương thức nhập của bạn đã thay đổi thành *(bên thứ ba). @@ -92,7 +93,6 @@ Nhấn Search hoặc Shift để hủy. Cài đặt âm thanh Đã tắt chụp ảnh màn hình Độ sáng -Còn lại % : Độ phân giải đã được chuyển thành Bật Wi-Fi @@ -111,13 +111,13 @@ Nhấn Search hoặc Shift để hủy. Đang tính... Thiết bị USB-C (cổng phía sau, bên phải) Tắt bàn phím ảo -g p cho đến khi đầy Không Đang phản chiếu ctrl Chia sẻ quyền kiểm soát màn hình của bạn với qua Trợ giúp từ xa. Âm lượng Thiết bị Bluetooth ""muốn được phép ghép nối. + cho đến khi đầy Phím tắt để khóa màn hình đã thay đổi. Vui lòng sử dụng thay vì . search Ngắt kết nối @@ -129,7 +129,6 @@ Nhấn Search hoặc Shift để hủy. Chromebook Ctrl+Shift+Space Cài đặt Google Drive... -Còn lại : , Có thiết bị truyền Đăng xuất @@ -166,7 +165,6 @@ Nhấn Shift + Alt để chuyển đổi. Hiển thị bàn phím ảo Tìm hiểu thêm Màn hình ảo -% Nhấn Control Shift Q hai lần để thoát. đã được xoay vòng sang SMS từ @@ -226,9 +224,9 @@ Nhấn Alt+Search hoặc Shift để hủy. Menu trước Đóng Cài đặt -: cho đến khi sạc đầy của bạn có thể không sạc khi được bật. Di động ... +Còn 270° Đã kết nối bộ sạc công suất thấp Wi-Fi diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 3d0113e3270d2..7b1515741a7d0 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb @@ -26,6 +26,7 @@ 启用移动数据 电池电量将在 后耗尽 Chrome设备 +电量尚余 退出会话 屏幕键盘已启用 您的输入法已更改为“”*(第三方)。 @@ -63,13 +64,13 @@ 您将立即退出。 任务栏 USB-C 设备(左侧前端端口) -关闭 +关机 任务栏位置 启用蓝牙 mod3 停用 Wi-Fi 设置... -”是由 管理的公开会话 +”是由 管理的公用自助终端 输出 溢出按钮 电池电量将在 后充满 @@ -92,7 +93,6 @@ 音频设置 已停用屏幕截图 亮度 -剩余电量:% 的分辨率已改为 启用 Wi-Fi @@ -105,19 +105,19 @@ 您的充电器可能有问题。如果您居住在美国,请拨打866-628-1371寻求帮助并申请更换充电器。如果您居住在英国,请拨打0800-026-0613。如果您居住在爱尔兰,请拨打1-800-832-664。如果您居住在加拿大,请拨打866-628-1372。如果您居住在澳大利亚,请拨打1-800-067-460。 IPv6 地址 连按两次Ctrl+Shift+Q即可退出。 -内部显示 +内部显示屏 扬声器(内部) 您的管理员已停用屏幕截图功能。 正在计算... USB-C 设备(右侧后端端口) 停用屏幕键盘 -还需要 小时 分钟才能充满电 正在镜像 ctrl 正在通过远程协助与共享您屏幕的控制权限。 音量 蓝牙设备“”需要配对许可。 + 后充满 用于锁定屏幕的快捷键已更改。请使用 ,而不是 搜索 断开连接 @@ -129,7 +129,6 @@ Chromebook Ctrl+Shift+Space Google 云端硬盘设置... -可用时长:: 有可用的投射设备 退出 @@ -166,7 +165,6 @@ 显示屏幕键盘 了解详情 虚拟显示器 -% 连按两次 Control+Shift+Q 即可退出。 已旋转为 发来的短信 @@ -226,9 +224,9 @@ 上一菜单 关闭“ 设置 -电池充满还需 : 您的 在开启时可能无法充电。 移动... +剩余电量: 270° 已连接低功率充电器 Wi-Fi diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 65f1639497384..1ed8f7b3470ef 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb @@ -26,6 +26,7 @@ 啟用行動數據 電池剩餘使用時間: Chrome 裝置 + 後用盡 結束工作階段 螢幕小鍵盤已啟用 您的輸入法已變更為 *(第三方)。 @@ -92,7 +93,6 @@ 音訊設定 已停用螢幕擷取畫面 亮度 -剩餘電量:% 的解析度已變更為 啟用 Wi-Fi @@ -105,19 +105,19 @@ 您的充電器可能有問題。如需相關協助或索取新的充電器,請致電 866-628-1371 (美國)、0800-026-0613 (英國)、1-800-832-664 (愛爾蘭)、866-628-1372 (加拿大) 或 1-800-067-460 (澳洲)。 IPv6 位址 按兩下 Ctrl+Shift+Q 鍵即可登出。 -內部畫面 +内建顯示器 喇叭 (內部) 您的管理員已停用拍攝螢幕擷取畫面功能。 計算中… USB-C 裝置 (右後方連接埠) 停用螢幕小鍵盤 -尚需 小時 分鐘才能充滿電 鏡像 Ctrl 透過遠端協助與分享螢幕控制功能。 音量 藍牙裝置「」要求配對權限。 + 後充飽 螢幕鎖定快速鍵已變更,請改用 (停用 )。 search 中斷連線 @@ -129,7 +129,6 @@ Chromebook Ctrl + Shift + 空格鍵 Google 雲端硬碟設定... -電量剩餘時間:: 可用的投放裝置 登出 @@ -166,7 +165,6 @@ 顯示螢幕小鍵盤 瞭解詳情 虛擬顯示 -% 按兩下 Control、Shift 和 Q 鍵即可結束。 已旋轉到 來自 的簡訊 @@ -226,9 +224,9 @@ 前一個選單 關閉「 設定 -完成充電尚需 小時 分鐘 在開啟時可能無法充電。 行動服務 ... +剩餘電量: 270 度 已連接低功率充電器 Wi-Fi diff --git a/ash/system/tray/system_tray.cc b/ash/system/tray/system_tray.cc index a5f848dd2d5ba..28b3392d221dc 100644 --- a/ash/system/tray/system_tray.cc +++ b/ash/system/tray/system_tray.cc @@ -26,6 +26,7 @@ #include "ash/system/web_notification/web_notification_tray.h" #include "ash/wm/common/shelf/wm_shelf_util.h" #include "base/logging.h" +#include "base/metrics/histogram.h" #include "base/strings/utf_string_conversions.h" #include "base/timer/timer.h" #include "grit/ash_strings.h" @@ -513,6 +514,10 @@ void SystemTray::ShowItems(const std::vector& items, system_bubble_.reset(new SystemBubbleWrapper(bubble)); system_bubble_->InitView(this, tray_container(), &init_params, persistent); + + // Record metrics for the system menu when the default view is invoked. + if (!detailed) + RecordSystemMenuMetrics(); } // Save height of default view for creating detailed views directly. if (!detailed) @@ -619,6 +624,9 @@ void SystemTray::SetShelfAlignment(wm::ShelfAlignment alignment) { if (notification_bubble_) { notification_bubble_.reset(); UpdateNotificationBubble(); + // UpdateWebNotifications() should be called in UpdateNotificationBubble(). + } else if (!hide_notifications_) { + UpdateWebNotifications(); } } @@ -729,4 +737,29 @@ void SystemTray::CloseSystemBubbleAndDeactivateSystemTray() { } } +void SystemTray::RecordSystemMenuMetrics() { + DCHECK(system_bubble_); + + TrayBubbleView* bubble_view = system_bubble_->bubble_view(); + int num_rows = 0; + for (int i = 0; i < bubble_view->child_count(); i++) { + // Certain menu rows are attached by default but can set themselves as + // invisible (IME is one such example). Count only user-visible rows. + if (bubble_view->child_at(i)->visible()) + num_rows++; + } + UMA_HISTOGRAM_COUNTS_100("Ash.SystemMenu.Rows", num_rows); + + int work_area_height = + display::Screen::GetScreen() + ->GetDisplayNearestWindow(bubble_view->GetWidget()->GetNativeView()) + .work_area() + .height(); + if (work_area_height > 0) { + UMA_HISTOGRAM_CUSTOM_COUNTS( + "Ash.SystemMenu.PercentageOfWorkAreaHeightCoveredByMenu", + 100 * bubble_view->height() / work_area_height, 1, 300, 100); + } +} + } // namespace ash diff --git a/ash/system/tray/system_tray.h b/ash/system/tray/system_tray.h index 4334e2b908906..1e5502a6e7789 100644 --- a/ash/system/tray/system_tray.h +++ b/ash/system/tray/system_tray.h @@ -201,6 +201,10 @@ class ASH_EXPORT SystemTray : public TrayBackgroundView, // Deactivate the system tray in the shelf if it was active before. void CloseSystemBubbleAndDeactivateSystemTray(); + // Records UMA metrics for the number of user-visible rows in the system menu + // and the percentage of the work area height covered by the system menu. + void RecordSystemMenuMetrics(); + const ScopedVector& items() const { return items_; } // Overridden from ActionableView. diff --git a/ash/utility/screenshot_controller.cc b/ash/utility/screenshot_controller.cc index 6cfad385a3ac8..19a569cd4d90b 100644 --- a/ash/utility/screenshot_controller.cc +++ b/ash/utility/screenshot_controller.cc @@ -27,10 +27,7 @@ namespace ash { namespace { -// The size to increase the invalidated area in the layer to repaint. The area -// should be slightly bigger than the actual region because the region indicator -// rectangles are drawn outside of the selected region. -const int kInvalidateRegionAdditionalSize = 3; +const int kCursorSize = 12; // This will prevent the user from taking a screenshot across multiple // monitors. it will stop the mouse at the any edge of the screen. must @@ -105,31 +102,33 @@ class ScreenshotController::ScreenshotLayer : public ui::LayerOwner, // Invalidates the region which covers the current and new region. gfx::Rect union_rect(region_); union_rect.Union(region); - union_rect.Inset(-kInvalidateRegionAdditionalSize, - -kInvalidateRegionAdditionalSize); union_rect.Intersects(layer()->bounds()); + union_rect.Inset(-kCursorSize, -kCursorSize, -kCursorSize, -kCursorSize); region_ = region; layer()->SchedulePaint(union_rect); } + void set_cursor_location_in_root(const gfx::Point& point) { + cursor_location_in_root_ = point; + } + private: // ui::LayerDelegate: void OnPaintLayer(const ui::PaintContext& context) override { - const SkColor kSelectedAreaOverlayColor = 0x40000000; - if (region_.IsEmpty()) - return; - // Screenshot area representation: black rectangle with white - // rectangle inside. To avoid capturing these rectangles when mouse - // release, they should be outside of the actual capturing area. + const SkColor kSelectedAreaOverlayColor = 0x60000000; + // Screenshot area representation: transparent hole with half opaque gray + // overlay. gfx::Rect rect(region_); ui::PaintRecorder recorder(context, layer()->size()); - recorder.canvas()->FillRect(region_, kSelectedAreaOverlayColor); + recorder.canvas()->FillRect(gfx::Rect(layer()->size()), + kSelectedAreaOverlayColor); - rect.Inset(-1, -1); - recorder.canvas()->DrawRect(rect, SK_ColorWHITE); - rect.Inset(-1, -1); - recorder.canvas()->DrawRect(rect, SK_ColorBLACK); + DrawPseudoCursor(recorder.canvas()); + + if (!region_.IsEmpty()) + recorder.canvas()->FillRect(region_, SK_ColorBLACK, + SkXfermode::kClear_Mode); } void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} @@ -140,8 +139,52 @@ class ScreenshotController::ScreenshotLayer : public ui::LayerOwner, return base::Closure(); } + // Mouse cursor may move sub DIP, so paint pseudo cursor instead of + // using platform cursor so that it's aliend with the region. + void DrawPseudoCursor(gfx::Canvas* canvas) { + // Don't draw if window selection mode. + if (cursor_location_in_root_.IsOrigin()) + return; + + gfx::Point pseudo_cursor_point = cursor_location_in_root_; + + // The cursor is above/before region. + if (pseudo_cursor_point.x() == region_.x()) + pseudo_cursor_point.Offset(-1, 0); + + if (pseudo_cursor_point.y() == region_.y()) + pseudo_cursor_point.Offset(0, -1); + + SkPaint paint; + paint.setAntiAlias(false); + paint.setStrokeWidth(1); + paint.setColor(SK_ColorWHITE); + paint.setXfermodeMode(SkXfermode::kSrc_Mode); + gfx::Vector2d width(kCursorSize / 2, 0); + gfx::Vector2d height(0, kCursorSize / 2); + gfx::Vector2d white_x_offset(1, -1); + gfx::Vector2d white_y_offset(1, -1); + // Horizontal + canvas->DrawLine(pseudo_cursor_point - width + white_x_offset, + pseudo_cursor_point + width + white_x_offset, paint); + paint.setStrokeWidth(1); + // Vertical + canvas->DrawLine(pseudo_cursor_point - height + white_y_offset, + pseudo_cursor_point + height + white_y_offset, paint); + + paint.setColor(SK_ColorBLACK); + // Horizontal + canvas->DrawLine(pseudo_cursor_point - width, pseudo_cursor_point + width, + paint); + // Vertical + canvas->DrawLine(pseudo_cursor_point - height, pseudo_cursor_point + height, + paint); + } + gfx::Rect region_; + gfx::Point cursor_location_in_root_; + DISALLOW_COPY_AND_ASSIGN(ScreenshotLayer); }; @@ -154,13 +197,17 @@ class ScreenshotController::ScopedCursorSetter { return; gfx::NativeCursor original_cursor = cursor_manager->GetCursor(); cursor_manager_ = cursor_manager; - cursor_manager_->SetCursor(cursor); - if (!cursor_manager_->IsCursorVisible()) + if (cursor == ui::kCursorNone) { + cursor_manager_->HideCursor(); + } else { + cursor_manager_->SetCursor(cursor); cursor_manager_->ShowCursor(); + } cursor_manager_->LockCursor(); - // SetCursor does not make any effects at this point but it sets back to - // the original cursor when unlocked. + // Set/ShowCursor does not make any effects at this point but it sets + // back to the original cursor when unlocked. cursor_manager_->SetCursor(original_cursor); + cursor_manager_->ShowCursor(); } ~ScopedCursorSetter() { @@ -248,6 +295,12 @@ void ScreenshotController::MaybeStart(const ui::LocatedEvent& event) { } else { root_window_ = current_root; start_position_ = event.root_location(); + // ScopedCursorSetter must be reset first to make sure that its dtor is + // called before ctor is called. + cursor_setter_.reset(); + cursor_setter_.reset(new ScopedCursorSetter( + Shell::GetInstance()->cursor_manager(), ui::kCursorNone)); + Update(event); } } @@ -294,14 +347,15 @@ void ScreenshotController::Update(const ui::LocatedEvent& event) { // starts when dragging. if (!root_window_) MaybeStart(event); - DCHECK(layers_.find(root_window_) != layers_.end()); - layers_.at(root_window_) - ->SetRegion( - gfx::Rect(std::min(start_position_.x(), event.root_location().x()), - std::min(start_position_.y(), event.root_location().y()), - ::abs(start_position_.x() - event.root_location().x()), - ::abs(start_position_.y() - event.root_location().y()))); + + ScreenshotLayer* layer = layers_.at(root_window_); + layer->set_cursor_location_in_root(event.root_location()); + layer->SetRegion( + gfx::Rect(std::min(start_position_.x(), event.root_location().x()), + std::min(start_position_.y(), event.root_location().y()), + ::abs(start_position_.x() - event.root_location().x()), + ::abs(start_position_.y() - event.root_location().y()))); } void ScreenshotController::UpdateSelectedWindow(ui::LocatedEvent* event) { diff --git a/ash/utility/screenshot_controller_unittest.cc b/ash/utility/screenshot_controller_unittest.cc index 153cf1e161586..faab2a08a11bd 100644 --- a/ash/utility/screenshot_controller_unittest.cc +++ b/ash/utility/screenshot_controller_unittest.cc @@ -221,6 +221,11 @@ TEST_F(PartialScreenshotControllerTest, VisibilityTest) { EXPECT_TRUE(IsActive()); EXPECT_TRUE(client->IsCursorVisible()); + // Platform's Cursor should be hidden while dragging. + GetEventGenerator().PressLeftButton(); + EXPECT_TRUE(IsActive()); + EXPECT_FALSE(client->IsCursorVisible()); + Cancel(); EXPECT_TRUE(client->IsCursorVisible()); } diff --git a/ash/wm/aura/wm_window_aura.cc b/ash/wm/aura/wm_window_aura.cc index 6d64daef02f9e..79cb8026b4a69 100644 --- a/ash/wm/aura/wm_window_aura.cc +++ b/ash/wm/aura/wm_window_aura.cc @@ -314,7 +314,7 @@ void WmWindowAura::SetBoundsDirectCrossFade(const gfx::Rect& bounds) { // Specify |set_bounds| to true here to keep the old bounds in the child // windows of |window|. std::unique_ptr old_layer_owner = - ::wm::RecreateLayers(window_); + ::wm::RecreateLayers(window_, nullptr); ui::Layer* old_layer = old_layer_owner->root(); DCHECK(old_layer); ui::Layer* new_layer = window_->layer(); diff --git a/ash/wm/drag_window_controller.cc b/ash/wm/drag_window_controller.cc index 6d85f4eceb5f3..e10b978778767 100644 --- a/ash/wm/drag_window_controller.cc +++ b/ash/wm/drag_window_controller.cc @@ -20,6 +20,7 @@ #include "ui/base/hit_test.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_tree_owner.h" +#include "ui/compositor/paint_context.h" #include "ui/compositor/scoped_layer_animation_settings.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -27,10 +28,64 @@ #include "ui/wm/core/window_util.h" namespace ash { +namespace { + +// A layer delegate to paint the content of the recreaetd layers +// by delegating the paint request to the original delegate. +// It checks if the orignal delegate is still valid by traversing +// the original layers. +class DragWindowLayerDelegate : public ui::LayerDelegate { + public: + DragWindowLayerDelegate(aura::Window* original_window, + ui::LayerDelegate* delegate) + : original_window_(original_window), original_delegate_(delegate) {} + ~DragWindowLayerDelegate() override {} + + private: + // ui:LayerDelegate: + void OnPaintLayer(const ui::PaintContext& context) override { + if (!original_delegate_) + return; + // |original_delegate_| may have already been deleted or + // disconnected by this time. Check if |original_delegate_| is still + // used by the original_window tree, or skip otherwise. + if (IsDelegateValid(original_window_->layer())) + original_delegate_->OnPaintLayer(context); + else + original_delegate_ = nullptr; + } + void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} + void OnDeviceScaleFactorChanged(float device_scale_factor) override { + // Don't tell the original delegate about device scale factor change + // on cloned layer because the original layer is still on the same display. + } + base::Closure PrepareForLayerBoundsChange() override { + return base::Closure(); + } + + bool IsDelegateValid(ui::Layer* layer) { + if (layer->delegate() == original_delegate_) + return true; + for (auto* child : layer->children()) { + if (IsDelegateValid(child)) + return true; + } + return false; + } + + aura::Window* original_window_; + ui::LayerDelegate* original_delegate_; + + DISALLOW_COPY_AND_ASSIGN(DragWindowLayerDelegate); +}; + +} // namespace // This keeps tack of the drag window's state. It creates/destory/updates bounds // and opacity based on the current bounds. -class DragWindowController::DragWindowDetails : public aura::WindowDelegate { +class DragWindowController::DragWindowDetails + : public aura::WindowDelegate, + public ::wm::LayerDelegateFactory { public: DragWindowDetails(const display::Display& display, aura::Window* original_window) @@ -78,6 +133,7 @@ class DragWindowController::DragWindowDetails : public aura::WindowDelegate { void CreateDragWindow(aura::Window* original_window, const gfx::Rect& bounds_in_screen) { DCHECK(!drag_window_); + original_window_ = original_window; drag_window_ = new aura::Window(this); int parent_id = original_window->parent()->id(); aura::Window* container = root_window_->GetChildById(parent_id); @@ -109,11 +165,7 @@ class DragWindowController::DragWindowDetails : public aura::WindowDelegate { void RecreateWindowLayers(aura::Window* original_window) { DCHECK(!layer_owner_.get()); - layer_owner_ = ::wm::RecreateLayers(original_window); - // TODO(oshima): Recreated child layers may not have been painted - // yet, and may not be able to paint to because it does not have - // its original delegate. - layer_owner_->root()->set_delegate(original_window->layer()->delegate()); + layer_owner_ = ::wm::RecreateLayers(original_window, this); // Place the layer at (0, 0) of the DragWindowController's window. gfx::Rect layer_bounds = layer_owner_->root()->bounds(); layer_bounds.set_origin(gfx::Point(0, 0)); @@ -130,6 +182,16 @@ class DragWindowController::DragWindowDetails : public aura::WindowDelegate { layer_owner_->root()->SetOpacity(1.0f); } + // aura::WindowDelegate: + ui::LayerDelegate* CreateDelegate(ui::LayerDelegate* delegate) override { + if (!delegate) + return nullptr; + DragWindowLayerDelegate* new_delegate = + new DragWindowLayerDelegate(original_window_, delegate); + delegates_.push_back(base::WrapUnique(new_delegate)); + return new_delegate; + } + // aura::WindowDelegate: gfx::Size GetMinimumSize() const override { return gfx::Size(); } gfx::Size GetMaximumSize() const override { return gfx::Size(); } @@ -163,6 +225,10 @@ class DragWindowController::DragWindowDetails : public aura::WindowDelegate { aura::Window* drag_window_ = nullptr; // Owned by the container. + aura::Window* original_window_ = nullptr; + + std::vector> delegates_; + // The copy of window_->layer() and its descendants. std::unique_ptr layer_owner_; @@ -235,4 +301,20 @@ const ui::LayerTreeOwner* DragWindowController::GetDragLayerOwnerForTest( return nullptr; } +void DragWindowController::RequestLayerPaintForTest() { + ui::PaintContext context(nullptr, 1.0f, gfx::Rect()); + for (auto& details : drag_windows_) { + std::vector layers; + layers.push_back(details->drag_window_->layer()); + while (layers.size()) { + ui::Layer* layer = layers.back(); + layers.pop_back(); + if (layer->delegate()) + layer->delegate()->OnPaintLayer(context); + for (auto* child : layer->children()) + layers.push_back(child); + } + } +} + } // namespace ash diff --git a/ash/wm/drag_window_controller.h b/ash/wm/drag_window_controller.h index 27225f01f348d..373cb0c901ebf 100644 --- a/ash/wm/drag_window_controller.h +++ b/ash/wm/drag_window_controller.h @@ -41,6 +41,12 @@ class ASH_EXPORT DragWindowController { void Update(const gfx::Rect& bounds_in_screen, const gfx::Point& drag_location_in_screen); + private: + class DragWindowDetails; + FRIEND_TEST_ALL_PREFIXES(DragWindowResizerTest, DragWindowController); + FRIEND_TEST_ALL_PREFIXES(DragWindowResizerTest, + DragWindowControllerAcrossThreeDisplays); + // Returns the currently active drag windows. int GetDragWindowsCountForTest() const; @@ -49,8 +55,8 @@ class ASH_EXPORT DragWindowController { const aura::Window* GetDragWindowForTest(size_t index) const; const ui::LayerTreeOwner* GetDragLayerOwnerForTest(size_t index) const; - private: - class DragWindowDetails; + // Call Layer::OnPaintLayer on all layers under the drag_windows_. + void RequestLayerPaintForTest(); // Window the drag window is placed beneath. aura::Window* window_; diff --git a/ash/wm/drag_window_resizer_unittest.cc b/ash/wm/drag_window_resizer_unittest.cc index c3e689a2d2e8e..9c2adccd11b4c 100644 --- a/ash/wm/drag_window_resizer_unittest.cc +++ b/ash/wm/drag_window_resizer_unittest.cc @@ -24,6 +24,7 @@ #include "ui/aura/test/test_window_delegate.h" #include "ui/base/hit_test.h" #include "ui/base/ui_base_types.h" +#include "ui/compositor/layer_delegate.h" #include "ui/compositor/layer_tree_owner.h" #include "ui/display/manager/display_layout.h" #include "ui/display/manager/display_layout_builder.h" @@ -36,6 +37,30 @@ namespace { const int kRootHeight = 600; +// Used to test if the OnPaintLayer is called by DragWindowLayerDelegate. +class TestLayerDelegate : public ui::LayerDelegate { + public: + TestLayerDelegate() = default; + ~TestLayerDelegate() override = default; + + int paint_count() const { return paint_count_; } + + private: + // Paint content for the layer to the specified context. + void OnPaintLayer(const ui::PaintContext& context) override { + paint_count_++; + } + void OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) override {} + void OnDeviceScaleFactorChanged(float device_scale_factor) override {} + base::Closure PrepareForLayerBoundsChange() override { + return base::Closure(); + } + + int paint_count_ = 0; + + DISALLOW_COPY_AND_ASSIGN(TestLayerDelegate); +}; + } // namespace class DragWindowResizerTest : public test::AshTestBase { @@ -345,6 +370,8 @@ TEST_F(DragWindowResizerTest, DragWindowController) { aura::Window::Windows root_windows = Shell::GetAllRootWindows(); ASSERT_EQ(2U, root_windows.size()); + TestLayerDelegate delegate; + window_->layer()->set_delegate(&delegate); window_->SetBoundsInScreen(gfx::Rect(0, 0, 50, 60), display::Screen::GetScreen()->GetPrimaryDisplay()); EXPECT_EQ(root_windows[0], window_->GetRootWindow()); @@ -379,6 +406,16 @@ TEST_F(DragWindowResizerTest, DragWindowController) { EXPECT_FALSE(layers.empty()); EXPECT_EQ(controller->GetDragLayerOwnerForTest(0)->root(), layers.back()); + // The paint request on a drag window should reach the original delegate. + controller->RequestLayerPaintForTest(); + EXPECT_EQ(1, delegate.paint_count()); + + // Invalidating the delegate on the original layer should prevent + // calling the OnPaintLayer on the original delegate from new delegate. + window_->layer()->set_delegate(nullptr); + controller->RequestLayerPaintForTest(); + EXPECT_EQ(1, delegate.paint_count()); + // |window_| should be opaque since the pointer is still on the primary // root window. The drag window should be semi-transparent. EXPECT_FLOAT_EQ(1.0f, window_->layer()->opacity()); diff --git a/ash/wm/maximize_mode/maximize_mode_window_manager.cc b/ash/wm/maximize_mode/maximize_mode_window_manager.cc index ccb15427c468a..eede8b9c1b2c9 100644 --- a/ash/wm/maximize_mode/maximize_mode_window_manager.cc +++ b/ash/wm/maximize_mode/maximize_mode_window_manager.cc @@ -6,6 +6,7 @@ #include "ash/ash_switches.h" #include "ash/root_window_controller.h" +#include "ash/session/session_state_delegate.h" #include "ash/shell.h" #include "ash/shell_window_ids.h" #include "ash/wm/common/window_state.h" @@ -164,6 +165,21 @@ void MaximizeModeWindowManager::OnDisplayMetricsChanged(const display::Display&, } void MaximizeModeWindowManager::OnTouchEvent(ui::TouchEvent* event) { + const SessionStateDelegate* delegate = + Shell::GetInstance()->session_state_delegate(); + + if (delegate->IsScreenLocked()) + return; + + switch (delegate->GetSessionState()) { + case SessionStateDelegate::SESSION_STATE_LOGIN_PRIMARY: + return; + case SessionStateDelegate::SESSION_STATE_ACTIVE: + break; + case SessionStateDelegate::SESSION_STATE_LOGIN_SECONDARY: + return; + } + if (event->type() != ui::ET_TOUCH_PRESSED) return; diff --git a/base/android/java/src/org/chromium/base/ApplicationStatus.java b/base/android/java/src/org/chromium/base/ApplicationStatus.java index 37af12d5d779a..9ff44c39dcd97 100644 --- a/base/android/java/src/org/chromium/base/ApplicationStatus.java +++ b/base/android/java/src/org/chromium/base/ApplicationStatus.java @@ -111,9 +111,9 @@ private ApplicationStatus() {} * * @param application The application whose status you wish to monitor. */ - public static void initialize(BaseChromiumApplication application) { - application.registerWindowFocusChangedListener( - new BaseChromiumApplication.WindowFocusChangedListener() { + public static void initialize(Application application) { + ApplicationStatusManager.registerWindowFocusChangedListener( + new ApplicationStatusManager.WindowFocusChangedListener() { @Override public void onWindowFocusChanged(Activity activity, boolean hasFocus) { if (!hasFocus || activity == sActivity) return; @@ -193,6 +193,9 @@ private static void onStateChange(Activity activity, int newState) { } ActivityInfo info = sActivityInfo.get(activity); + // Ignore status from none tracked activitys. + if (info == null) return; + info.setStatus(newState); // Notify all state observers that are specifically listening to this activity. @@ -381,6 +384,17 @@ public static void unregisterApplicationStateListener(ApplicationStateListener l sApplicationStateListeners.removeObserver(listener); } + /** + * When ApplicationStatus initialized after application started, the onActivityCreated(), + * onActivityStarted() and onActivityResumed() callbacks will be missed. + * This function will give the chance to simulate these three callbacks. + */ + public static void informActivityStarted(Activity activity) { + onStateChange(activity, ActivityState.CREATED); + onStateChange(activity, ActivityState.STARTED); + onStateChange(activity, ActivityState.RESUMED); + } + /** * Robolectric JUnit tests create a new application between each test, while all the context * in static classes isn't reset. This function allows to reset the application status to avoid diff --git a/base/android/java/src/org/chromium/base/ApplicationStatusManager.java b/base/android/java/src/org/chromium/base/ApplicationStatusManager.java new file mode 100644 index 0000000000000..dc46acb933268 --- /dev/null +++ b/base/android/java/src/org/chromium/base/ApplicationStatusManager.java @@ -0,0 +1,189 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base; + +import android.app.Activity; +import android.app.Application; +import android.os.Bundle; +import android.view.Window; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * Basic application functionality that should be shared among all browser applications. + */ +public class ApplicationStatusManager { + private static final String TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS = + "android.support.v7.internal.app.ToolbarActionBar$ToolbarCallbackWrapper"; + // In builds using the --use_unpublished_apis flag, the ToolbarActionBar class name does not + // include the "internal" package. + private static final String TOOLBAR_CALLBACK_WRAPPER_CLASS = + "android.support.v7.app.ToolbarActionBar$ToolbarCallbackWrapper"; + + /** + * Interface to be implemented by listeners for window focus events. + */ + public interface WindowFocusChangedListener { + /** + * Called when the window focus changes for {@code activity}. + * @param activity The {@link Activity} that has a window focus changed event. + * @param hasFocus Whether or not {@code activity} gained or lost focus. + */ + public void onWindowFocusChanged(Activity activity, boolean hasFocus); + } + + private static ObserverList sWindowFocusListeners = + new ObserverList(); + + /** + * Intercepts calls to an existing Window.Callback. Most invocations are passed on directly + * to the composed Window.Callback but enables intercepting/manipulating others. + * + * This is used to relay window focus changes throughout the app and remedy a bug in the + * appcompat library. + */ + private static class WindowCallbackProxy implements InvocationHandler { + private final Window.Callback mCallback; + private final Activity mActivity; + + public WindowCallbackProxy(Activity activity, Window.Callback callback) { + mCallback = callback; + mActivity = activity; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (method.getName().equals("onWindowFocusChanged") && args.length == 1 + && args[0] instanceof Boolean) { + onWindowFocusChanged((boolean) args[0]); + return null; + } else { + try { + return method.invoke(mCallback, args); + } catch (InvocationTargetException e) { + // Special-case for when a method is not defined on the underlying + // Window.Callback object. Because we're using a Proxy to forward all method + // calls, this breaks the Android framework's handling for apps built against + // an older SDK. The framework expects an AbstractMethodError but due to + // reflection it becomes wrapped inside an InvocationTargetException. Undo the + // wrapping to signal the framework accordingly. + if (e.getCause() instanceof AbstractMethodError) { + throw e.getCause(); + } + throw e; + } + } + } + + public void onWindowFocusChanged(boolean hasFocus) { + mCallback.onWindowFocusChanged(hasFocus); + + for (WindowFocusChangedListener listener : sWindowFocusListeners) { + listener.onWindowFocusChanged(mActivity, hasFocus); + } + } + } + + public static void init(Application app) { + ApplicationStatus.initialize(app); + + app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(final Activity activity, Bundle savedInstanceState) { + setWindowFocusChangedCallback(activity); + } + + @Override + public void onActivityDestroyed(Activity activity) { + assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_WRAPPER_CLASS) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); + } + + @Override + public void onActivityPaused(Activity activity) { + assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_WRAPPER_CLASS) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); + } + + @Override + public void onActivityResumed(Activity activity) { + assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_WRAPPER_CLASS) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_WRAPPER_CLASS) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); + } + + @Override + public void onActivityStarted(Activity activity) { + assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_WRAPPER_CLASS) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); + } + + @Override + public void onActivityStopped(Activity activity) { + assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_WRAPPER_CLASS) + || activity.getWindow().getCallback().getClass().getName().equals( + TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); + } + }); + } + + /** + * Registers a listener to receive window focus updates on activities in this application. + * @param listener Listener to receive window focus events. + */ + public static void registerWindowFocusChangedListener(WindowFocusChangedListener listener) { + sWindowFocusListeners.addObserver(listener); + } + + /** + * Unregisters a listener from receiving window focus updates on activities in this application. + * @param listener Listener that doesn't want to receive window focus events. + */ + public static void unregisterWindowFocusChangedListener(WindowFocusChangedListener listener) { + sWindowFocusListeners.removeObserver(listener); + } + + /** + * When ApplicationStatus initialized after application started, the onActivityCreated(), + * onActivityStarted() and onActivityResumed() callbacks will be missed. + * This function will give the chance to simulate these three callbacks. + */ + public static void informActivityStarted(final Activity activity) { + setWindowFocusChangedCallback(activity); + ApplicationStatus.informActivityStarted(activity); + } + + private static void setWindowFocusChangedCallback(final Activity activity) { + Window.Callback callback = activity.getWindow().getCallback(); + activity.getWindow().setCallback((Window.Callback) Proxy.newProxyInstance( + Window.Callback.class.getClassLoader(), new Class[] {Window.Callback.class}, + new WindowCallbackProxy(activity, callback))); + } +} diff --git a/base/android/java/src/org/chromium/base/BaseChromiumApplication.java b/base/android/java/src/org/chromium/base/BaseChromiumApplication.java index 77c63adff04fd..a460f2eea98d6 100644 --- a/base/android/java/src/org/chromium/base/BaseChromiumApplication.java +++ b/base/android/java/src/org/chromium/base/BaseChromiumApplication.java @@ -4,31 +4,16 @@ package org.chromium.base; -import android.app.Activity; import android.app.Application; import android.content.Context; -import android.os.Bundle; -import android.view.Window; import org.chromium.base.multidex.ChromiumMultiDexInstaller; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - /** * Basic application functionality that should be shared among all browser applications. */ public class BaseChromiumApplication extends Application { - private static final String TAG = "cr.base"; - private static final String TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS = - "android.support.v7.internal.app.ToolbarActionBar$ToolbarCallbackWrapper"; - // In builds using the --use_unpublished_apis flag, the ToolbarActionBar class name does not - // include the "internal" package. - private static final String TOOLBAR_CALLBACK_WRAPPER_CLASS = - "android.support.v7.app.ToolbarActionBar$ToolbarCallbackWrapper"; private final boolean mShouldInitializeApplicationStatusTracking; public BaseChromiumApplication() { @@ -45,91 +30,9 @@ protected void attachBaseContext(Context base) { ChromiumMultiDexInstaller.install(this); } - /** - * Interface to be implemented by listeners for window focus events. - */ - public interface WindowFocusChangedListener { - /** - * Called when the window focus changes for {@code activity}. - * @param activity The {@link Activity} that has a window focus changed event. - * @param hasFocus Whether or not {@code activity} gained or lost focus. - */ - public void onWindowFocusChanged(Activity activity, boolean hasFocus); - } - - private ObserverList mWindowFocusListeners = - new ObserverList(); - - /** - * Intercepts calls to an existing Window.Callback. Most invocations are passed on directly - * to the composed Window.Callback but enables intercepting/manipulating others. - * - * This is used to relay window focus changes throughout the app and remedy a bug in the - * appcompat library. - */ - private class WindowCallbackProxy implements InvocationHandler { - private final Window.Callback mCallback; - private final Activity mActivity; - - public WindowCallbackProxy(Activity activity, Window.Callback callback) { - mCallback = callback; - mActivity = activity; - } - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if (method.getName().equals("onWindowFocusChanged") && args.length == 1 - && args[0] instanceof Boolean) { - onWindowFocusChanged((boolean) args[0]); - return null; - } else { - try { - return method.invoke(mCallback, args); - } catch (InvocationTargetException e) { - // Special-case for when a method is not defined on the underlying - // Window.Callback object. Because we're using a Proxy to forward all method - // calls, this breaks the Android framework's handling for apps built against - // an older SDK. The framework expects an AbstractMethodError but due to - // reflection it becomes wrapped inside an InvocationTargetException. Undo the - // wrapping to signal the framework accordingly. - if (e.getCause() instanceof AbstractMethodError) { - throw e.getCause(); - } - throw e; - } - } - } - - public void onWindowFocusChanged(boolean hasFocus) { - mCallback.onWindowFocusChanged(hasFocus); - - for (WindowFocusChangedListener listener : mWindowFocusListeners) { - listener.onWindowFocusChanged(mActivity, hasFocus); - } - } - } - - @Override public void onCreate() { super.onCreate(); - - if (mShouldInitializeApplicationStatusTracking) startTrackingApplicationStatus(); - } - - /** - * Registers a listener to receive window focus updates on activities in this application. - * @param listener Listener to receive window focus events. - */ - public void registerWindowFocusChangedListener(WindowFocusChangedListener listener) { - mWindowFocusListeners.addObserver(listener); - } - - /** - * Unregisters a listener from receiving window focus updates on activities in this application. - * @param listener Listener that doesn't want to receive window focus events. - */ - public void unregisterWindowFocusChangedListener(WindowFocusChangedListener listener) { - mWindowFocusListeners.removeObserver(listener); + ApplicationStatusManager.init(this); } /** Initializes the {@link CommandLine}. */ @@ -143,72 +46,4 @@ public void initCommandLine() {} public static void initCommandLine(Context context) { ((BaseChromiumApplication) context.getApplicationContext()).initCommandLine(); } - - /** Register hooks and listeners to start tracking the application status. */ - private void startTrackingApplicationStatus() { - ApplicationStatus.initialize(this); - registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { - @Override - public void onActivityCreated(final Activity activity, Bundle savedInstanceState) { - Window.Callback callback = activity.getWindow().getCallback(); - activity.getWindow().setCallback((Window.Callback) Proxy.newProxyInstance( - Window.Callback.class.getClassLoader(), new Class[] {Window.Callback.class}, - new WindowCallbackProxy(activity, callback))); - } - - @Override - public void onActivityDestroyed(Activity activity) { - assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_WRAPPER_CLASS) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); - } - - @Override - public void onActivityPaused(Activity activity) { - assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_WRAPPER_CLASS) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); - } - - @Override - public void onActivityResumed(Activity activity) { - assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_WRAPPER_CLASS) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_WRAPPER_CLASS) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); - } - - @Override - public void onActivityStarted(Activity activity) { - assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_WRAPPER_CLASS) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); - } - - @Override - public void onActivityStopped(Activity activity) { - assert (Proxy.isProxyClass(activity.getWindow().getCallback().getClass()) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_WRAPPER_CLASS) - || activity.getWindow().getCallback().getClass().getName().equals( - TOOLBAR_CALLBACK_INTERNAL_WRAPPER_CLASS)); - } - }); - } } diff --git a/base/android/java/src/org/chromium/base/ResourceExtractor.java b/base/android/java/src/org/chromium/base/ResourceExtractor.java index 2854b02dd41d5..5870de6143d78 100644 --- a/base/android/java/src/org/chromium/base/ResourceExtractor.java +++ b/base/android/java/src/org/chromium/base/ResourceExtractor.java @@ -41,6 +41,19 @@ public class ResourceExtractor { private static ResourceEntry[] sResourcesToExtract = new ResourceEntry[0]; + private static ResourceInterceptor sInterceptor = null; + + public interface ResourceInterceptor { + public boolean shouldInterceptLoadRequest(String resource); + public InputStream openRawResource(String resource); + } + + private static boolean isAppDataFile(String file) { + return ICU_DATA_FILENAME.equals(file) + || V8_NATIVES_DATA_FILENAME.equals(file) + || V8_SNAPSHOT_DATA_FILENAME.equals(file); + } + /** * Holds information about a res/raw file (e.g. locale .pak files). */ @@ -87,6 +100,7 @@ private void extractResourceHelper(InputStream is, File outFile, byte[] buffer) private void doInBackgroundImpl() { final File outputDir = getOutputDir(); + final File appDataDir = getAppDataDir(); if (!outputDir.exists() && !outputDir.mkdirs()) { Log.e(TAG, "Unable to create pak resources directory!"); return; @@ -111,15 +125,26 @@ private void doInBackgroundImpl() { byte[] buffer = new byte[BUFFER_SIZE]; try { for (ResourceEntry entry : sResourcesToExtract) { - File output = new File(outputDir, entry.extractedFileName); + // Loading "icudtl.dat" from "assets/"" currently does not work with either + // embedded mode (the file is in raw/res) or shared mode (the app's context is + // used to retrieve the AssetManager, not Crosswalk's). We thus need to put + // those special files in a different directory so that we leverage the fallback + // code in Chromium to load these files from disk. + File dir = isAppDataFile(entry.extractedFileName) ? appDataDir : outputDir; + File output = new File(dir, entry.extractedFileName); // TODO(agrieve): It would be better to check that .length == expectedLength. // http://crbug.com/606413 if (output.length() != 0) { continue; } beginTraceSection("ExtractResource"); - InputStream inputStream = mContext.getResources().openRawResource( - entry.resourceId); + InputStream inputStream; + if (sInterceptor != null + && sInterceptor.shouldInterceptLoadRequest(entry.extractedFileName)) { + inputStream = sInterceptor.openRawResource(entry.extractedFileName); + } else { + inputStream = mContext.getResources().openRawResource(entry.resourceId); + } try { extractResourceHelper(inputStream, output, buffer); } finally { @@ -208,6 +233,19 @@ public static ResourceExtractor get(Context context) { return sInstance; } + /** + * Allow embedders to intercept the resource loading process. Embedders may + * want to load paks from res/raw instead of assets, since assets are not + * supported in Android library project. + * @param intercepter The instance of intercepter which provides the files list + * to intercept and the inputstream for the files it wants to intercept with. + */ + public static void setResourceInterceptor(ResourceInterceptor interceptor) { + assert (sInstance == null || sInstance.mExtractTask == null) + : "Must be called before startExtractingResources is called"; + sInterceptor = interceptor; + } + /** * Specifies the files that should be extracted from the APK. * and moved to {@link #getOutputDir()}. @@ -239,6 +277,10 @@ public void waitForCompletion() { try { mExtractTask.get(); + // ResourceExtractor is not needed any more. + // Release static objects to avoid leak of Context. + sInterceptor = null; + sInstance = null; } catch (CancellationException e) { // Don't leave the files in an inconsistent state. deleteFiles(); diff --git a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java index a9a3141a3deb0..f6bf867cf8dc4 100644 --- a/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java +++ b/base/android/java/src/org/chromium/base/library_loader/LibraryLoader.java @@ -86,6 +86,11 @@ public class LibraryLoader { // will be reported via UMA. Set once when the libraries are done loading. private long mLibraryLoadTimeMs; + // The return value of NativeLibraryPreloader.loadLibrary(), which will be reported + // via UMA, it is initialized to the invalid value which shouldn't showup in UMA + // report. + private int mLibraryPreloaderStatus = -1; + /** * Set native library preloader, if set, the NativeLibraryPreloader.loadLibrary will be invoked * before calling System.loadLibrary, this only applies when not using the chromium linker. @@ -282,7 +287,7 @@ private void loadAlreadyLocked(Context context) throws ProcessInitException { linker.finishLibraryLoad(); } else { if (sLibraryPreloader != null) { - sLibraryPreloader.loadLibrary(context); + mLibraryPreloaderStatus = sLibraryPreloader.loadLibrary(context); } // Load libraries using the system linker. for (String library : NativeLibraries.LIBRARIES) { @@ -383,6 +388,9 @@ private void recordBrowserProcessHistogram(Context context) { getLibraryLoadFromApkStatus(context), mLibraryLoadTimeMs); } + if (sLibraryPreloader != null) { + nativeRecordLibraryPreloaderBrowserHistogram(mLibraryPreloaderStatus); + } } // Returns the device's status for loading a library directly from the APK file. @@ -409,6 +417,9 @@ public void registerRendererProcessHistogram(boolean requestedSharedRelro, loadAtFixedAddressFailed, mLibraryLoadTimeMs); } + if (sLibraryPreloader != null) { + nativeRegisterLibraryPreloaderRendererHistogram(mLibraryPreloaderStatus); + } } /** @@ -442,6 +453,10 @@ private native void nativeRecordChromiumAndroidLinkerBrowserHistogram( int libraryLoadFromApkStatus, long libraryLoadTime); + // Method called to record the return value of NativeLibraryPreloader.loadLibrary for the main + // browser process. + private native void nativeRecordLibraryPreloaderBrowserHistogram(int status); + // Method called to register (for later recording) statistics about the Chromium linker // operation for a renderer process. Indicates whether the linker attempted relro sharing, // and if it did, whether the library failed to load at a fixed address. Also records the @@ -451,6 +466,10 @@ private native void nativeRegisterChromiumAndroidLinkerRendererHistogram( boolean loadAtFixedAddressFailed, long libraryLoadTime); + // Method called to register (for later recording) the return value of + // NativeLibraryPreloader.loadLibrary for a renderer process. + private native void nativeRegisterLibraryPreloaderRendererHistogram(int status); + // Get the version of the native library. This is needed so that we can check we // have the right version before initializing the (rest of the) JNI. private native String nativeGetVersionNumber(); diff --git a/base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java b/base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java index a3c4dd66d239c..f14667f0424cb 100644 --- a/base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java +++ b/base/android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java @@ -10,5 +10,5 @@ * This is interface to preload the native library before calling System.loadLibrary. */ public abstract class NativeLibraryPreloader { - public abstract void loadLibrary(Context context); + public abstract int loadLibrary(Context context); } diff --git a/base/android/library_loader/library_loader_hooks.cc b/base/android/library_loader/library_loader_hooks.cc index bbc99352f6d82..025075e4992ea 100644 --- a/base/android/library_loader/library_loader_hooks.cc +++ b/base/android/library_loader/library_loader_hooks.cc @@ -10,6 +10,7 @@ #include "base/android/library_loader/library_prefetcher.h" #include "base/at_exit.h" #include "base/metrics/histogram.h" +#include "base/metrics/sparse_histogram.h" #include "jni/LibraryLoader_jni.h" namespace base { @@ -48,11 +49,40 @@ enum BrowserHistogramCode { RendererHistogramCode g_renderer_histogram_code = NO_PENDING_HISTOGRAM_CODE; +// Indicate whether g_library_preloader_renderer_histogram_code is valid +bool g_library_preloader_renderer_histogram_code_registered = false; + +// The return value of NativeLibraryPreloader.loadLibrary() in child processes, +// it is initialized to the invalid value which shouldn't showup in UMA report. +int g_library_preloader_renderer_histogram_code = -1; + // The amount of time, in milliseconds, that it took to load the shared // libraries in the renderer. Set in // RegisterChromiumAndroidLinkerRendererHistogram. long g_renderer_library_load_time_ms = 0; +void RecordChromiumAndroidLinkerRendererHistogram() { + if (g_renderer_histogram_code == NO_PENDING_HISTOGRAM_CODE) + return; + // Record and release the pending histogram value. + UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.RendererStates", + g_renderer_histogram_code, + MAX_RENDERER_HISTOGRAM_CODE); + g_renderer_histogram_code = NO_PENDING_HISTOGRAM_CODE; + + // Record how long it took to load the shared libraries. + UMA_HISTOGRAM_TIMES("ChromiumAndroidLinker.RendererLoadTime", + base::TimeDelta::FromMilliseconds(g_renderer_library_load_time_ms)); +} + +void RecordLibraryPreloaderRendereHistogram() { + if (g_library_preloader_renderer_histogram_code_registered) { + UMA_HISTOGRAM_SPARSE_SLOWLY( + "Android.NativeLibraryPreloader.Result.Renderer", + g_library_preloader_renderer_histogram_code); + } +} + } // namespace static void RegisterChromiumAndroidLinkerRendererHistogram( @@ -72,20 +102,6 @@ static void RegisterChromiumAndroidLinkerRendererHistogram( g_renderer_library_load_time_ms = library_load_time_ms; } -void RecordChromiumAndroidLinkerRendererHistogram() { - if (g_renderer_histogram_code == NO_PENDING_HISTOGRAM_CODE) - return; - // Record and release the pending histogram value. - UMA_HISTOGRAM_ENUMERATION("ChromiumAndroidLinker.RendererStates", - g_renderer_histogram_code, - MAX_RENDERER_HISTOGRAM_CODE); - g_renderer_histogram_code = NO_PENDING_HISTOGRAM_CODE; - - // Record how long it took to load the shared libraries. - UMA_HISTOGRAM_TIMES("ChromiumAndroidLinker.RendererLoadTime", - base::TimeDelta::FromMilliseconds(g_renderer_library_load_time_ms)); -} - static void RecordChromiumAndroidLinkerBrowserHistogram( JNIEnv* env, const JavaParamRef& jcaller, @@ -116,6 +132,28 @@ static void RecordChromiumAndroidLinkerBrowserHistogram( base::TimeDelta::FromMilliseconds(library_load_time_ms)); } +static void RecordLibraryPreloaderBrowserHistogram( + JNIEnv* env, + const JavaParamRef& jcaller, + jint status) { + UMA_HISTOGRAM_SPARSE_SLOWLY( + "Android.NativeLibraryPreloader.Result.Browser", + status); +} + +static void RegisterLibraryPreloaderRendererHistogram( + JNIEnv* env, + const JavaParamRef& jcaller, + jint status) { + g_library_preloader_renderer_histogram_code = status; + g_library_preloader_renderer_histogram_code_registered = true; +} + +void RecordLibraryLoaderRendererHistograms() { + RecordChromiumAndroidLinkerRendererHistogram(); + RecordLibraryPreloaderRendereHistogram(); +} + void SetLibraryLoadedHook(LibraryLoadedHook* func) { g_registration_callback = func; } diff --git a/base/android/library_loader/library_loader_hooks.h b/base/android/library_loader/library_loader_hooks.h index 1ed09bd54f000..3e8969bc59a2c 100644 --- a/base/android/library_loader/library_loader_hooks.h +++ b/base/android/library_loader/library_loader_hooks.h @@ -27,9 +27,10 @@ enum LibraryProcessType { PROCESS_WEBVIEW_CHILD = 4, }; -// Record any pending renderer histogram value as a histogram. Pending values -// are set by RegisterChromiumAndroidLinkerRendererHistogram. -BASE_EXPORT void RecordChromiumAndroidLinkerRendererHistogram(); +// Record any pending renderer histogram value as histograms. Pending values +// are set by RegisterChromiumAndroidLinkerRendererHistogram and +// RegisterLibraryPreloaderRendererHistogram. +BASE_EXPORT void RecordLibraryLoaderRendererHistograms(); // Registers the callbacks that allows the entry point of the library to be // exposed to the calling java code. This handles only registering the diff --git a/base/base.gyp b/base/base.gyp index 7c9417d013c77..b04bf35f2f35a 100644 --- a/base/base.gyp +++ b/base/base.gyp @@ -695,11 +695,6 @@ 'message_loop/message_pump_glib_unittest.cc', ] }], - ['use_ozone == 1', { - 'sources!': [ - 'message_loop/message_pump_glib_unittest.cc', - ] - }], ['OS == "linux"', { 'dependencies': [ 'malloc_wrapper', @@ -1494,7 +1489,9 @@ ], 'all_dependent_settings': { 'variables': { - 'generate_build_config': 1, + # Crosswalk needs to set this to 0, otherwise building the test + # APKs fails. See XWALK-6547 and XWALK-6625. + 'generate_build_config': 0, }, }, 'includes': [ '../build/java.gypi' ], diff --git a/base/base.gypi b/base/base.gypi index 368348d736ed4..52895b5175fdc 100644 --- a/base/base.gypi +++ b/base/base.gypi @@ -1006,11 +1006,6 @@ 'strings/string16.cc', ], },], - ['<(use_ozone) == 1', { - 'sources!': [ - 'message_loop/message_pump_glib.cc', - ] - }], ['OS == "linux" and >(nacl_untrusted_build)==0', { 'sources!': [ 'files/file_path_watcher_fsevents.cc', diff --git a/base/logging.h b/base/logging.h index 0476a4450fb09..36c9c6f311d16 100644 --- a/base/logging.h +++ b/base/logging.h @@ -453,17 +453,11 @@ class CheckOpResult { // Make all CHECK functions discard their log strings to reduce code // bloat, and improve performance, for official release builds. -#if defined(COMPILER_GCC) || __clang__ -#define LOGGING_CRASH() __builtin_trap() -#else -#define LOGGING_CRASH() ((void)(*(volatile char*)0 = 0)) -#endif - -// This is not calling BreakDebugger since this is called frequently, and -// calling an out-of-line function instead of a noreturn inline macro prevents -// compiler optimizations. +// TODO(akalin): This would be more valuable if there were some way to +// remove BreakDebugger() from the backtrace, perhaps by turning it +// into a macro (like __debugbreak() on Windows). #define CHECK(condition) \ - !(condition) ? LOGGING_CRASH() : EAT_STREAM_PARAMETERS + !(condition) ? ::base::debug::BreakDebugger() : EAT_STREAM_PARAMETERS #define PCHECK(condition) CHECK(condition) diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc index 2a090366a8b4d..20f64336016ae 100644 --- a/base/metrics/persistent_histogram_allocator.cc +++ b/base/metrics/persistent_histogram_allocator.cc @@ -47,7 +47,6 @@ enum : uint32_t { // anything essential at exit anyway due to the fact that they depend on data // managed elsewhere and which could be destructed first. GlobalHistogramAllocator* g_allocator = nullptr; -bool g_allocator_enabled = false; // Take an array of range boundaries and create a proper BucketRanges object // which is returned to the caller. A return of nullptr indicates that the @@ -656,18 +655,6 @@ void GlobalHistogramAllocator::CreateWithSharedMemoryHandle( std::move(shm), 0, StringPiece(), /*readonly=*/false))))); } -// static -void GlobalHistogramAllocator::Enable() { - DCHECK(g_allocator); - g_allocator_enabled = true; -} - -// static -void GlobalHistogramAllocator::Disable() { - DCHECK(g_allocator); - g_allocator_enabled = false; -} - // static void GlobalHistogramAllocator::Set( std::unique_ptr allocator) { @@ -676,7 +663,6 @@ void GlobalHistogramAllocator::Set( // also released, future accesses to those histograms will seg-fault. CHECK(!g_allocator); g_allocator = allocator.release(); - g_allocator_enabled = true; size_t existing = StatisticsRecorder::GetHistogramCount(); DVLOG_IF(1, existing) @@ -685,11 +671,6 @@ void GlobalHistogramAllocator::Set( // static GlobalHistogramAllocator* GlobalHistogramAllocator::Get() { - return g_allocator_enabled ? g_allocator : nullptr; -} - -// static -GlobalHistogramAllocator* GlobalHistogramAllocator::GetEvenIfDisabled() { return g_allocator; } @@ -733,8 +714,6 @@ void GlobalHistogramAllocator::SetPersistentLocation(const FilePath& location) { } bool GlobalHistogramAllocator::WriteToPersistentLocation() { - DCHECK(g_allocator_enabled); - #if defined(OS_NACL) // NACL doesn't support file operations, including ImportantFileWriter. NOTREACHED(); diff --git a/base/metrics/persistent_histogram_allocator.h b/base/metrics/persistent_histogram_allocator.h index c73f7f4b74451..8df45f2813ae6 100644 --- a/base/metrics/persistent_histogram_allocator.h +++ b/base/metrics/persistent_histogram_allocator.h @@ -394,26 +394,14 @@ class BASE_EXPORT GlobalHistogramAllocator // while operating single-threaded so there are no race-conditions. static void Set(std::unique_ptr allocator); - // Enables the global persistent allocator. Existing histograms will not be - // affected; only newly created ones will go into the allocator. - static void Enable(); - - // Disables the global persistent allocator. Existing histograms will not be - // affected; newly created histograms will be allocated from the heap. - static void Disable(); - - // Gets a pointer to an enabled global histogram allocator. If a global - // allocator exists but is disabled, this will return null. + // Gets a pointer to the global histogram allocator. Returns null if none + // exists. static GlobalHistogramAllocator* Get(); - // Gets a pointer to a global histogram allocator if one exists, even if - // that allocator is disabled. - static GlobalHistogramAllocator* GetEvenIfDisabled(); - // This access to the persistent allocator is only for testing; it extracts - // the current allocator completely regardless whether it is enabled or not. - // This allows easy creation of histograms within persistent memory segments - // which can then be extracted and used in other ways. + // the current allocator completely. This allows easy creation of histograms + // within persistent memory segments which can then be extracted and used in + // other ways. static std::unique_ptr ReleaseForTesting(); // Stores a pathname to which the contents of this allocator should be saved @@ -429,7 +417,7 @@ class BASE_EXPORT GlobalHistogramAllocator private: friend class StatisticsRecorder; - // Creates a new global histogram allocator. It will be enabled by default. + // Creates a new global histogram allocator. explicit GlobalHistogramAllocator( std::unique_ptr memory); diff --git a/base/threading/thread_local.h b/base/threading/thread_local.h index f40420cd2f8b8..24ee5f14467d5 100644 --- a/base/threading/thread_local.h +++ b/base/threading/thread_local.h @@ -81,6 +81,7 @@ struct BASE_EXPORT ThreadLocalPlatform { } // namespace internal +#if !defined(OS_ANDROID) template class ThreadLocalPointer { public: @@ -109,6 +110,28 @@ class ThreadLocalPointer { DISALLOW_COPY_AND_ASSIGN(ThreadLocalPointer); }; +#else +template + class ThreadLocalPointer { + public: + ThreadLocalPointer() {} + + ~ThreadLocalPointer() { slot_.Free(); } + + Type* Get() { + return static_cast(slot_.Get()); + } + + void Set(Type* ptr) { + slot_.Set(const_cast(static_cast(ptr))); + } + + private: + ThreadLocalStorage::Slot slot_; + + DISALLOW_COPY_AND_ASSIGN(ThreadLocalPointer); +}; +#endif // !OS_ANDROID class ThreadLocalBoolean { public: diff --git a/blimp/engine/app/blimp_engine_crash_keys.cc b/blimp/engine/app/blimp_engine_crash_keys.cc index bb2fcfdbc956a..c51140f9c6deb 100644 --- a/blimp/engine/app/blimp_engine_crash_keys.cc +++ b/blimp/engine/app/blimp_engine_crash_keys.cc @@ -25,6 +25,7 @@ size_t RegisterEngineCrashKeys() { { crash_keys::kVariations, crash_keys::kLargeSize }, // //content crash keys + { "bad_message_reason", crash_keys::kSmallSize }, { "channel_error_bt", crash_keys::kMediumSize }, { "discardable-memory-allocated", crash_keys::kSmallSize }, { "discardable-memory-free", crash_keys::kSmallSize }, @@ -65,6 +66,9 @@ size_t RegisterEngineCrashKeys() { crash_keys::kSmallSize}, { "initrf_root_process_is_live", crash_keys::kSmallSize}, { "initrf_root_proxy_is_live", crash_keys::kSmallSize}, + + // Temporary for https://crbug.com/616149. + { "existing_extension_pref_value_type", crash_keys::kSmallSize }, }; return base::debug::InitCrashKeys(engine_keys, arraysize(engine_keys), diff --git a/blimp/engine/feature/engine_render_widget_feature_unittest.cc b/blimp/engine/feature/engine_render_widget_feature_unittest.cc index a16b57d117a77..03f67aaf766fd 100644 --- a/blimp/engine/feature/engine_render_widget_feature_unittest.cc +++ b/blimp/engine/feature/engine_render_widget_feature_unittest.cc @@ -95,6 +95,8 @@ class MockRenderWidgetHost const KeyPressEventCallback& callback) override {} void AddMouseEventCallback(const MouseEventCallback& callback) override {} void RemoveMouseEventCallback(const MouseEventCallback& callback) override {} + void AddInputEventObserver(InputEventObserver* observer) override {} + void RemoveInputEventObserver(InputEventObserver* observer) override {} void GetWebScreenInfo(blink::WebScreenInfo* result) override {} bool GetScreenColorProfile(std::vector* color_profile) override { return false; } diff --git a/blimp/net/input_message_converter.cc b/blimp/net/input_message_converter.cc index 7badd7132ff4b..19366af2d4928 100644 --- a/blimp/net/input_message_converter.cc +++ b/blimp/net/input_message_converter.cc @@ -60,7 +60,9 @@ std::unique_ptr ProtoToGestureScrollUpdate( event->data.scrollUpdate.previousUpdateInSequencePrevented = details.previous_update_in_sequence_prevented(); event->data.scrollUpdate.preventPropagation = details.prevent_propagation(); - event->data.scrollUpdate.inertial = details.inertial(); + event->data.scrollUpdate.inertialPhase = + details.inertial() ? blink::WebGestureEvent::MomentumPhase + : blink::WebGestureEvent::UnknownMomentumPhase; return event; } diff --git a/blimp/net/input_message_generator.cc b/blimp/net/input_message_generator.cc index e7ca4f4842323..2c62b6ba96894 100644 --- a/blimp/net/input_message_generator.cc +++ b/blimp/net/input_message_generator.cc @@ -56,7 +56,8 @@ void GestureScrollUpdateToProto(const blink::WebGestureEvent& event, event.data.scrollUpdate.previousUpdateInSequencePrevented); details->set_prevent_propagation( event.data.scrollUpdate.preventPropagation); - details->set_inertial(event.data.scrollUpdate.inertial); + details->set_inertial(event.data.scrollUpdate.inertialPhase == + blink::WebGestureEvent::MomentumPhase); } void GestureFlingStartToProto(const blink::WebGestureEvent& event, diff --git a/blimp/net/input_message_unittest.cc b/blimp/net/input_message_unittest.cc index 8d8d0e5098d7e..3d66738c7fb13 100644 --- a/blimp/net/input_message_unittest.cc +++ b/blimp/net/input_message_unittest.cc @@ -72,7 +72,7 @@ TEST(InputMessageTest, TestGestureScrollUpdateRoundTrip) { event.data.scrollUpdate.velocityY = 5.67f; event.data.scrollUpdate.previousUpdateInSequencePrevented = true; event.data.scrollUpdate.preventPropagation = true; - event.data.scrollUpdate.inertial = true; + event.data.scrollUpdate.inertialPhase = blink::WebGestureEvent::MomentumPhase; ValidateWebGestureEventRoundTripping(event); } diff --git a/build/android/pylib/gtest/filter/content_browsertests_disabled b/build/android/pylib/gtest/filter/content_browsertests_disabled index 71b81360b4660..4b28a2bf80899 100644 --- a/build/android/pylib/gtest/filter/content_browsertests_disabled +++ b/build/android/pylib/gtest/filter/content_browsertests_disabled @@ -35,7 +35,7 @@ RenderViewImplTest.InsertCharacters RenderViewImplTest.OnHandleKeyboardEvent RenderViewImplTest.OnNavStateChanged # ZoomLevel is not used on Android -RenderFrameImplTest.ZoomLimit +RenderViewImplTest.ZoomLimit RendererAccessibilityTest.SendFullAccessibilityTreeOnReload RendererAccessibilityTest.HideAccessibilityObject RendererAccessibilityTest.ShowAccessibilityObject diff --git a/build/common.gypi b/build/common.gypi index 3724f2f624acd..03c4cb0e2894f 100644 --- a/build/common.gypi +++ b/build/common.gypi @@ -596,6 +596,9 @@ # Enable FTP support by default. 'disable_ftp_support%': 0, + # Enable web audio hrtf by default. + 'disable_webaudio_hrtf%': 0, + # Do not use the platform ICU alternatives by default. 'use_platform_icu_alternatives%': 0, @@ -748,7 +751,7 @@ }], # Flags to use glib. - ['OS=="win" or OS=="mac" or OS=="ios" or OS=="android" or use_ozone==1', { + ['OS=="win" or OS=="mac" or OS=="ios" or OS=="android"', { 'use_glib%': 0, }, { 'use_glib%': 1, @@ -890,7 +893,7 @@ ['OS=="android" or OS=="ios" or (embedded==1 and chromecast==0)', { 'pdf_enable_xfa%': 0, }, { - 'pdf_enable_xfa%': 1, + 'pdf_enable_xfa%': 0, }], ['chromeos==1 or OS=="android" or OS=="ios" or desktop_linux==1', { @@ -1249,6 +1252,7 @@ 'enable_captive_portal_detection%': '<(enable_captive_portal_detection)', 'disable_file_support%': '<(disable_file_support)', 'disable_ftp_support%': '<(disable_ftp_support)', + 'disable_webaudio_hrtf%': '<(disable_webaudio_hrtf)', 'use_platform_icu_alternatives%': '<(use_platform_icu_alternatives)', 'disable_brotli_filter%': '<(disable_brotli_filter)', 'enable_task_manager%': '<(enable_task_manager)', @@ -1552,13 +1556,12 @@ # Be sure to synchronize with build/module_args/v8.gni 'v8_extra_library_files': [ - '../third_party/WebKit/Source/core/streams/ReadableStreamTempStub.js', - ], - 'v8_experimental_extra_library_files': [ '../third_party/WebKit/Source/core/streams/ByteLengthQueuingStrategy.js', '../third_party/WebKit/Source/core/streams/CountQueuingStrategy.js', '../third_party/WebKit/Source/core/streams/ReadableStream.js', ], + 'v8_experimental_extra_library_files': [ + ], # Use brlapi from brltty for braille display support. 'use_brlapi%': 0, @@ -2180,6 +2183,9 @@ ['use_concatenated_impulse_responses==1', { 'grit_defines': ['-D', 'use_concatenated_impulse_responses'], }], + ['disable_webaudio_hrtf==1', { + 'grit_defines': ['-D', 'disable_webaudio_hrtf'], + }], ['enable_media_router==1', { 'grit_defines': ['-D', 'enable_media_router'], }], diff --git a/build_overrides/pdfium.gni b/build_overrides/pdfium.gni index b37d13f707817..b05a8dd7fb506 100644 --- a/build_overrides/pdfium.gni +++ b/build_overrides/pdfium.gni @@ -6,7 +6,7 @@ pdf_enable_v8_override = true # Disable XFA forms in Chromium builds. -pdf_enable_xfa_override = !is_android && !is_ios +pdf_enable_xfa_override = false # Disable use of Skia backend. pdf_use_skia_override = false diff --git a/build_overrides/v8.gni b/build_overrides/v8.gni index c39f47e3b00f0..5920636deb441 100644 --- a/build_overrides/v8.gni +++ b/build_overrides/v8.gni @@ -18,13 +18,12 @@ v8_optimized_debug = true # Adding V8 extras files requires API owners review # Be sure to synchronize with build/common.gypi -v8_extra_library_files = - [ "../third_party/WebKit/Source/core/streams/ReadableStreamTempStub.js" ] -v8_experimental_extra_library_files = [ +v8_extra_library_files = [ "../third_party/WebKit/Source/core/streams/ByteLengthQueuingStrategy.js", "../third_party/WebKit/Source/core/streams/CountQueuingStrategy.js", "../third_party/WebKit/Source/core/streams/ReadableStream.js", ] +v8_experimental_extra_library_files = [] if (is_android) { v8_external_startup_data_renaming_sources = [ diff --git a/cc/base/synced_property.h b/cc/base/synced_property.h index 7d1e563343ab8..dfb33aa5ab2df 100644 --- a/cc/base/synced_property.h +++ b/cc/base/synced_property.h @@ -57,45 +57,45 @@ class SyncedProperty : public base::RefCounted> { // Returns the latest active tree delta and also makes a note that this value // was sent to the main thread. typename T::ValueType PullDeltaForMainThread() { - sent_delta_ = active_delta_; - return active_delta_.get(); + reflected_delta_in_main_tree_ = PendingDelta(); + return reflected_delta_in_main_tree_.get(); } // Push the latest value from the main thread onto pending tree-associated // state. Returns true if this had any effect. bool PushFromMainThread(typename T::ValueType main_thread_value) { - if (pending_base_.get() == main_thread_value) - return false; + bool changed = pending_base_.get() != main_thread_value; + reflected_delta_in_pending_tree_ = reflected_delta_in_main_tree_; + reflected_delta_in_main_tree_ = T::Identity(); pending_base_ = T(main_thread_value); - return true; + return changed; } // Push the value associated with the pending tree to be the active base - // value. As part of this, subtract the last sent value from the active tree - // delta (which will make the delta zero at steady state, or make it contain - // only the difference since the last send). + // value. As part of this, subtract the delta reflected in the pending tree + // from the active tree delta (which will make the delta zero at steady state, + // or make it contain only the difference since the last send). bool PushPendingToActive() { - if (active_base_.get() == pending_base_.get() && - sent_delta_.get() == T::Identity().get()) - return false; + bool changed = active_base_.get() != pending_base_.get() || + active_delta_.get() != PendingDelta().get(); active_base_ = pending_base_; active_delta_ = PendingDelta(); - sent_delta_ = T::Identity(); + reflected_delta_in_pending_tree_ = T::Identity(); clobber_active_value_ = false; - return true; + return changed; } // This simulates the consequences of the sent value getting committed and - // activated. The value sent to the main thread ends up combined with the - // active value, and the sent_delta is subtracted from the delta. + // activated. void AbortCommit() { - active_base_ = active_base_.Combine(sent_delta_); - active_delta_ = PendingDelta(); - sent_delta_ = T::Identity(); + pending_base_ = pending_base_.Combine(reflected_delta_in_main_tree_); + active_base_ = active_base_.Combine(reflected_delta_in_main_tree_); + active_delta_ = active_delta_.InverseCombine(reflected_delta_in_main_tree_); + reflected_delta_in_main_tree_ = T::Identity(); } // Values as last pushed to the pending or active tree respectively, with no @@ -104,12 +104,11 @@ class SyncedProperty : public base::RefCounted> { typename T::ValueType ActiveBase() const { return active_base_.get(); } // The new delta we would use if we decide to activate now. This delta - // excludes the amount that we expect the main thread to reflect back at the - // impl thread during the commit. + // excludes the amount that we know is reflected in the pending tree. T PendingDelta() const { if (clobber_active_value_) return T::Identity(); - return active_delta_.InverseCombine(sent_delta_); + return active_delta_.InverseCombine(reflected_delta_in_pending_tree_); } void set_clobber_active_value() { clobber_active_value_ = true; } @@ -118,13 +117,17 @@ class SyncedProperty : public base::RefCounted> { private: // Value last committed to the pending tree. T pending_base_; - // Value last committed to the active tree (on the last activation). + // Value last committed to the active tree on the last activation. T active_base_; - // The difference between the active_base_ and the user-perceived value. + // The difference between |active_base_| and the user-perceived value. T active_delta_; - // The value sent to the main thread (on the last BeginFrame); this is always - // identity outside of the BeginFrame-to-activation interval. - T sent_delta_; + // The value sent to the main thread on the last BeginMainFrame. This is + // always identity outside of the BeginMainFrame to (aborted)commit interval. + T reflected_delta_in_main_tree_; + // The value that was sent to the main thread for BeginMainFrame for the + // current pending tree. This is always identity outside of the + // BeginMainFrame to activation interval. + T reflected_delta_in_pending_tree_; // When true the pending delta is always identity so that it does not change // and will clobber the active value on push. bool clobber_active_value_; diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index 0cf42f07a13c9..b126e42e88e2e 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc @@ -556,7 +556,7 @@ void PictureLayerImpl::UpdateRasterSource( // Only set the image decode controller when we're committing. if (!pending_set) { - raster_source_->SetImageDecodeController( + raster_source_->set_image_decode_controller( layer_tree_impl()->image_decode_controller()); } @@ -652,7 +652,7 @@ void PictureLayerImpl::ReleaseResources() { void PictureLayerImpl::RecreateResources() { tilings_ = CreatePictureLayerTilingSet(); if (raster_source_) { - raster_source_->SetImageDecodeController( + raster_source_->set_image_decode_controller( layer_tree_impl()->image_decode_controller()); } diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc index eab540ecb9743..b5b31732ac88d 100644 --- a/cc/layers/texture_layer.cc +++ b/cc/layers/texture_layer.cc @@ -154,6 +154,26 @@ void TextureLayer::SetTextureMailbox( requires_commit, allow_mailbox_reuse); } +static void IgnoreReleaseCallback(const gpu::SyncToken& sync_token, bool lost) { +} + +void TextureLayer::SetTextureMailboxWithoutReleaseCallback( + const TextureMailbox& mailbox) { + // We allow reuse of the mailbox if there is a new sync point signalling new + // content, and the release callback goes nowhere since we'll be calling it + // multiple times for the same mailbox. + DCHECK(!mailbox.IsValid() || !holder_ref_ || + !mailbox.Equals(holder_ref_->holder()->mailbox()) || + mailbox.sync_token() != holder_ref_->holder()->mailbox().sync_token()); + std::unique_ptr release; + bool requires_commit = true; + bool allow_mailbox_reuse = true; + if (mailbox.IsValid()) + release = SingleReleaseCallback::Create(base::Bind(&IgnoreReleaseCallback)); + SetTextureMailboxInternal(mailbox, std::move(release), requires_commit, + allow_mailbox_reuse); +} + void TextureLayer::SetNeedsDisplayRect(const gfx::Rect& dirty_rect) { Layer::SetNeedsDisplayRect(dirty_rect); } diff --git a/cc/layers/texture_layer.h b/cc/layers/texture_layer.h index 2d5b6bbb4af18..4fa239f83afc4 100644 --- a/cc/layers/texture_layer.h +++ b/cc/layers/texture_layer.h @@ -133,6 +133,12 @@ class CC_EXPORT TextureLayer : public Layer { const TextureMailbox& mailbox, std::unique_ptr release_callback); + // Use this for special cases where the same texture is used to back the + // TextureLayer across all frames. + // WARNING: DON'T ACTUALLY USE THIS WHAT YOU ARE DOING IS WRONG. + // TODO(danakj): Remove this when pepper doesn't need it. crbug.com/350204 + void SetTextureMailboxWithoutReleaseCallback(const TextureMailbox& mailbox); + void SetNeedsDisplayRect(const gfx::Rect& dirty_rect) override; void SetLayerTreeHost(LayerTreeHost* layer_tree_host) override; diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc index 2bf6a3328657a..d8df840c0f2c9 100644 --- a/cc/layers/texture_layer_unittest.cc +++ b/cc/layers/texture_layer_unittest.cc @@ -332,6 +332,33 @@ TEST_F(TextureLayerWithMailboxTest, ReplaceMailboxOnMainThreadBeforeCommit) { SingleReleaseCallback::Create(test_data_.release_mailbox1_)); } +TEST_F(TextureLayerTest, SetTextureMailboxWithoutReleaseCallback) { + scoped_refptr test_layer = + TextureLayer::CreateForMailbox(nullptr); + ASSERT_TRUE(test_layer.get()); + + // These use the same gpu::Mailbox, but different sync points. + TextureMailbox mailbox1(MailboxFromChar('a'), SyncTokenFromUInt(1), + GL_TEXTURE_2D); + TextureMailbox mailbox2(MailboxFromChar('a'), SyncTokenFromUInt(2), + GL_TEXTURE_2D); + + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AnyNumber()); + layer_tree_host_->SetRootLayer(test_layer); + Mock::VerifyAndClearExpectations(layer_tree_host_.get()); + + // Set the mailbox the first time. It should cause a commit. + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); + test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox1); + Mock::VerifyAndClearExpectations(layer_tree_host_.get()); + + // Set the mailbox again with a new sync point, as the backing texture has + // been updated. It should cause a new commit. + EXPECT_CALL(*layer_tree_host_, SetNeedsCommit()).Times(AtLeast(1)); + test_layer->SetTextureMailboxWithoutReleaseCallback(mailbox2); + Mock::VerifyAndClearExpectations(layer_tree_host_.get()); +} + class TextureLayerMailboxHolderTest : public TextureLayerTest { public: TextureLayerMailboxHolderTest() diff --git a/cc/layers/video_frame_provider.h b/cc/layers/video_frame_provider.h index e7619a3fb7a84..a6789c11166f9 100644 --- a/cc/layers/video_frame_provider.h +++ b/cc/layers/video_frame_provider.h @@ -43,8 +43,6 @@ class CC_EXPORT VideoFrameProvider { virtual void StopRendering() = 0; // Notifies the client that GetCurrentFrame() will return new data. - // TODO(dalecurtis): Nuke this once VideoFrameProviderClientImpl is using a - // BeginFrameObserver based approach. http://crbug.com/336733 virtual void DidReceiveFrame() = 0; protected: @@ -75,9 +73,6 @@ class CC_EXPORT VideoFrameProvider { // // Clients should call this in response to UpdateCurrentFrame() returning true // or in response to a DidReceiveFrame() call. - // - // TODO(dalecurtis): Remove text about DidReceiveFrame() once the old path - // has been removed. http://crbug.com/439548 virtual scoped_refptr GetCurrentFrame() = 0; // Called in response to DidReceiveFrame() or a return value of true from diff --git a/cc/layers/video_frame_provider_client_impl.cc b/cc/layers/video_frame_provider_client_impl.cc index 5e9fd332b3917..6f9cb8f00c46c 100644 --- a/cc/layers/video_frame_provider_client_impl.cc +++ b/cc/layers/video_frame_provider_client_impl.cc @@ -27,11 +27,14 @@ VideoFrameProviderClientImpl::VideoFrameProviderClientImpl( stopped_(false), rendering_(false), needs_put_current_frame_(false) { - // This only happens during a commit on the compositor thread while the main - // thread is blocked. That makes this a thread-safe call to set the video - // frame provider client that does not require a lock. The same is true of - // the call to Stop(). - provider_->SetVideoFrameProviderClient(this); + // |provider_| may be null if destructed before the layer. + if (provider_) { + // This only happens during a commit on the compositor thread while the main + // thread is blocked. That makes this a thread-safe call to set the video + // frame provider client that does not require a lock. The same is true of + // the call to Stop(). + provider_->SetVideoFrameProviderClient(this); + } // This matrix is the default transformation for stream textures, and flips // on the Y axis. diff --git a/cc/layers/video_layer.cc b/cc/layers/video_layer.cc index fcb549b82bbe0..fe4f2eda268d5 100644 --- a/cc/layers/video_layer.cc +++ b/cc/layers/video_layer.cc @@ -40,4 +40,8 @@ bool VideoLayer::Update() { return updated; } +void VideoLayer::StopUsingProvider() { + provider_ = nullptr; +} + } // namespace cc diff --git a/cc/layers/video_layer.h b/cc/layers/video_layer.h index 5a74dcc4443d6..9bd75655cb8ee 100644 --- a/cc/layers/video_layer.h +++ b/cc/layers/video_layer.h @@ -28,6 +28,9 @@ class CC_EXPORT VideoLayer : public Layer { bool Update() override; + // Clears |provider_| to ensure it is not used after destruction. + void StopUsingProvider(); + private: VideoLayer(VideoFrameProvider* provider, media::VideoRotation video_rotation); ~VideoLayer() override; diff --git a/cc/output/bsp_tree.cc b/cc/output/bsp_tree.cc index 080866f58f9a9..300ba2aebb98a 100644 --- a/cc/output/bsp_tree.cc +++ b/cc/output/bsp_tree.cc @@ -44,46 +44,24 @@ void BspTree::BuildTree( // find a splitting plane, then classify polygons as either in front of // or behind that splitting plane. while (!polygon_list->empty()) { - // Is this particular polygon in front of or behind our splitting polygon. - BspCompareResult comparer_result = - GetNodePositionRelative(*polygon_list->front(), *(node->node_data)); - - // If it's clearly behind or in front of the splitting plane, we use the - // heuristic to decide whether or not we should put it at the back - // or front of the list. - switch (comparer_result) { - case BSP_FRONT: - front_list.push_back(PopFront(polygon_list)); - break; - case BSP_BACK: - back_list.push_back(PopFront(polygon_list)); - break; - case BSP_SPLIT: - { - std::unique_ptr polygon; - std::unique_ptr new_front; - std::unique_ptr new_back; - // Time to split this geometry, *it needs to be split by node_data. - polygon = PopFront(polygon_list); - bool split_result = - polygon->Split(*(node->node_data), &new_front, &new_back); - DCHECK(split_result); - if (!split_result) { - break; - } + std::unique_ptr polygon; + std::unique_ptr new_front; + std::unique_ptr new_back; + // Time to split this geometry, *it needs to be split by node_data. + polygon = PopFront(polygon_list); + bool is_coplanar; + node->node_data->SplitPolygon(std::move(polygon), &new_front, &new_back, + &is_coplanar); + if (is_coplanar) { + if (new_front) + node->coplanars_front.push_back(std::move(new_front)); + if (new_back) + node->coplanars_back.push_back(std::move(new_back)); + } else { + if (new_front) front_list.push_back(std::move(new_front)); + if (new_back) back_list.push_back(std::move(new_back)); - break; - } - case BSP_COPLANAR_FRONT: - node->coplanars_front.push_back(PopFront(polygon_list)); - break; - case BSP_COPLANAR_BACK: - node->coplanars_back.push_back(PopFront(polygon_list)); - break; - default: - NOTREACHED(); - break; } } @@ -100,11 +78,6 @@ void BspTree::BuildTree( } } -BspCompareResult BspTree::GetNodePositionRelative(const DrawPolygon& node_a, - const DrawPolygon& node_b) { - return DrawPolygon::SideCompare(node_a, node_b); -} - // The base comparer with 0,0,0 as camera position facing forward BspCompareResult BspTree::GetCameraPositionRelative(const DrawPolygon& node) { if (node.normal().z() > 0.0f) { diff --git a/cc/output/bsp_tree.h b/cc/output/bsp_tree.h index 3c703d21a267e..65c601b4a94b2 100644 --- a/cc/output/bsp_tree.h +++ b/cc/output/bsp_tree.h @@ -101,10 +101,6 @@ class CC_EXPORT BspTree { } } - // Returns whether or not nodeA is on one or the other side of nodeB, - // coplanar, or whether it crosses nodeB's plane and needs to be split - static BspCompareResult GetNodePositionRelative(const DrawPolygon& node_a, - const DrawPolygon& node_b); // Returns whether or not our viewer is in front of or behind the plane // defined by this polygon/node static BspCompareResult GetCameraPositionRelative(const DrawPolygon& node); diff --git a/cc/output/bsp_tree_unittest.cc b/cc/output/bsp_tree_unittest.cc index acf2defe533b6..c787d3e7c492a 100644 --- a/cc/output/bsp_tree_unittest.cc +++ b/cc/output/bsp_tree_unittest.cc @@ -45,6 +45,32 @@ class BspTreeTest { EXPECT_TRUE(VerifySidedness(bsp_tree.root())); } + static BspCompareResult SideCompare(const DrawPolygon& a, + const DrawPolygon& b) { + const float split_threshold = 0.05f; + bool pos = false; + bool neg = false; + for (const auto& pt : a.points()) { + float dist = b.SignedPointDistance(pt); + neg |= dist < -split_threshold; + pos |= dist > split_threshold; + } + if (pos && neg) + return BSP_SPLIT; + if (neg) + return BSP_BACK; + if (pos) + return BSP_FRONT; + double dot = gfx::DotProduct(a.normal(), b.normal()); + if ((dot >= 0.0f && a.order_index() >= b.order_index()) || + (dot <= 0.0f && a.order_index() <= b.order_index())) { + // The sign of the dot product of the normals along with document order + // determine which side it goes on, the vertices are ambiguous. + return BSP_COPLANAR_BACK; + } + return BSP_COPLANAR_FRONT; + } + static bool VerifySidedness(const std::unique_ptr& node) { // We check if both the front and back child nodes have geometry that is // completely on the expected side of the current node. @@ -52,8 +78,8 @@ class BspTreeTest { bool back_ok = true; if (node->back_child) { // Make sure the back child lies entirely behind this node. - BspCompareResult result = DrawPolygon::SideCompare( - *(node->back_child->node_data), *(node->node_data)); + BspCompareResult result = + SideCompare(*(node->back_child->node_data), *(node->node_data)); if (result != BSP_BACK) { return false; } @@ -61,8 +87,8 @@ class BspTreeTest { } // Make sure the front child lies entirely in front of this node. if (node->front_child) { - BspCompareResult result = DrawPolygon::SideCompare( - *(node->front_child->node_data), *(node->node_data)); + BspCompareResult result = + SideCompare(*(node->front_child->node_data), *(node->node_data)); if (result != BSP_FRONT) { return false; } @@ -74,15 +100,15 @@ class BspTreeTest { // Now we need to make sure our coplanar geometry is all actually coplanar. for (size_t i = 0; i < node->coplanars_front.size(); i++) { - BspCompareResult result = DrawPolygon::SideCompare( - *(node->coplanars_front[i]), *(node->node_data)); + BspCompareResult result = + SideCompare(*(node->coplanars_front[i]), *(node->node_data)); if (result != BSP_COPLANAR_FRONT) { return false; } } for (size_t i = 0; i < node->coplanars_back.size(); i++) { - BspCompareResult result = DrawPolygon::SideCompare( - *(node->coplanars_back[i]), *(node->node_data)); + BspCompareResult result = + SideCompare(*(node->coplanars_back[i]), *(node->node_data)); if (result != BSP_COPLANAR_BACK) { return false; } diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 6d780c72bcc5f..13d13418b2001 100644 --- a/cc/output/software_renderer.cc +++ b/cc/output/software_renderer.cc @@ -56,20 +56,24 @@ std::unique_ptr SoftwareRenderer::Create( RendererClient* client, const RendererSettings* settings, OutputSurface* output_surface, - ResourceProvider* resource_provider) { + ResourceProvider* resource_provider, + bool use_image_hijack_canvas) { return base::WrapUnique(new SoftwareRenderer(client, settings, output_surface, - resource_provider)); + resource_provider, + use_image_hijack_canvas)); } SoftwareRenderer::SoftwareRenderer(RendererClient* client, const RendererSettings* settings, OutputSurface* output_surface, - ResourceProvider* resource_provider) + ResourceProvider* resource_provider, + bool use_image_hijack_canvas) : DirectRenderer(client, settings, output_surface, resource_provider), is_scissor_enabled_(false), is_backbuffer_discarded_(false), output_device_(output_surface->software_device()), - current_canvas_(NULL) { + current_canvas_(nullptr), + use_image_hijack_canvas_(use_image_hijack_canvas) { if (resource_provider_) { capabilities_.max_texture_size = resource_provider_->max_texture_size(); capabilities_.best_texture_format = @@ -368,6 +372,7 @@ void SoftwareRenderer::DrawPictureQuad(const DrawingFrame* frame, RasterSource::PlaybackSettings playback_settings; playback_settings.playback_to_shared_canvas = true; + playback_settings.use_image_hijack_canvas = use_image_hijack_canvas_; if (needs_transparency || disable_image_filtering) { // TODO(aelias): This isn't correct in all cases. We should detect these // cases and fall back to a persistent bitmap backing diff --git a/cc/output/software_renderer.h b/cc/output/software_renderer.h index f4733c5730c0f..9323358d8cefb 100644 --- a/cc/output/software_renderer.h +++ b/cc/output/software_renderer.h @@ -30,7 +30,8 @@ class CC_EXPORT SoftwareRenderer : public DirectRenderer { RendererClient* client, const RendererSettings* settings, OutputSurface* output_surface, - ResourceProvider* resource_provider); + ResourceProvider* resource_provider, + bool use_image_hijack_canvas); ~SoftwareRenderer() override; const RendererCapabilitiesImpl& Capabilities() const override; @@ -63,7 +64,8 @@ class CC_EXPORT SoftwareRenderer : public DirectRenderer { SoftwareRenderer(RendererClient* client, const RendererSettings* settings, OutputSurface* output_surface, - ResourceProvider* resource_provider); + ResourceProvider* resource_provider, + bool use_image_hijack_canvas); void DidChangeVisibility() override; @@ -115,6 +117,13 @@ class CC_EXPORT SoftwareRenderer : public DirectRenderer { current_framebuffer_lock_; sk_sp current_framebuffer_canvas_; + // Indicates whether content rasterization should happen through an + // ImageHijackCanvas, which causes image decodes to be managed by an + // ImageDecodeController. We set this to false during resourceless software + // draw when a GPU ImageDecodeController is in use, as software rasterization + // cannot use the GPU IDC. + const bool use_image_hijack_canvas_; + DISALLOW_COPY_AND_ASSIGN(SoftwareRenderer); }; diff --git a/cc/output/software_renderer_unittest.cc b/cc/output/software_renderer_unittest.cc index 13601c9557b1e..b5fe93783fb5d 100644 --- a/cc/output/software_renderer_unittest.cc +++ b/cc/output/software_renderer_unittest.cc @@ -42,7 +42,8 @@ class SoftwareRendererTest : public testing::Test, public RendererClient { resource_provider_ = FakeResourceProvider::Create( output_surface_.get(), shared_bitmap_manager_.get()); renderer_ = SoftwareRenderer::Create( - this, &settings_, output_surface_.get(), resource_provider()); + this, &settings_, output_surface_.get(), resource_provider(), + true /* use_image_hijack_canvas */); } ResourceProvider* resource_provider() const { diff --git a/cc/playback/raster_source.cc b/cc/playback/raster_source.cc index 292d92512f134..c37f78ded6366 100644 --- a/cc/playback/raster_source.cc +++ b/cc/playback/raster_source.cc @@ -307,12 +307,6 @@ scoped_refptr RasterSource::CreateCloneWithoutLCDText() const { return scoped_refptr(new RasterSource(this, can_use_lcd_text)); } -void RasterSource::SetImageDecodeController( - ImageDecodeController* image_decode_controller) { - DCHECK(image_decode_controller); - image_decode_controller_ = image_decode_controller; -} - RasterSource::PlaybackSettings::PlaybackSettings() : playback_to_shared_canvas(false), skip_images(false), diff --git a/cc/playback/raster_source.h b/cc/playback/raster_source.h index 3a2139d3d2a8a..a251f7432d356 100644 --- a/cc/playback/raster_source.h +++ b/cc/playback/raster_source.h @@ -114,7 +114,22 @@ class CC_EXPORT RasterSource : public base::RefCountedThreadSafe { // Image decode controller should be set once. Its lifetime has to exceed that // of the raster source, since the raster source will access it during raster. - void SetImageDecodeController(ImageDecodeController* image_decode_controller); + void set_image_decode_controller( + ImageDecodeController* image_decode_controller) { + DCHECK(image_decode_controller); + image_decode_controller_ = image_decode_controller; + } + + // Returns the ImageDecodeController, currently only used by + // GpuRasterBufferProvider in order to create its own ImageHijackCanvas. + // Because of the MultiPictureDraw approach used by GPU raster, it does not + // integrate well with the use of the ImageHijackCanvas internal to this + // class. See gpu_raster_buffer_provider.cc for more information. + // TODO(crbug.com/628394): Redesign this to avoid exposing + // ImageDecodeController from the raster source. + ImageDecodeController* image_decode_controller() const { + return image_decode_controller_; + } protected: friend class base::RefCountedThreadSafe; diff --git a/cc/playback/raster_source_unittest.cc b/cc/playback/raster_source_unittest.cc index 21340a250dc97..9dda281e7bebb 100644 --- a/cc/playback/raster_source_unittest.cc +++ b/cc/playback/raster_source_unittest.cc @@ -573,7 +573,7 @@ TEST(RasterSourceTest, ImageHijackCanvasRespectsSharedCanvasTransform) { scoped_refptr raster_source = recording_source->CreateRasterSource(can_use_lcd); SoftwareImageDecodeController controller; - raster_source->SetImageDecodeController(&controller); + raster_source->set_image_decode_controller(&controller); SkBitmap bitmap; bitmap.allocN32Pixels(size.width() * 0.5f, size.height() * 0.25f); diff --git a/cc/quads/draw_polygon.cc b/cc/quads/draw_polygon.cc index 770d241570bb0..86cb87319426d 100644 --- a/cc/quads/draw_polygon.cc +++ b/cc/quads/draw_polygon.cc @@ -8,27 +8,26 @@ #include +#include "base/memory/ptr_util.h" #include "cc/output/bsp_compare_result.h" #include "cc/quads/draw_quad.h" namespace { // This threshold controls how "thick" a plane is. If a point's distance is -// <= |compare_threshold|, then it is considered on the plane. Only when this -// boundary is crossed do we consider doing splitting. -static const float compare_threshold = 0.1f; -// |split_threshold| is lower in this case because we want the points created -// during splitting to be well within the range of |compare_threshold| for -// comparison purposes. The splitting operation will produce intersection points -// that fit within a tighter distance to the splitting plane as a result of this -// value. By using a value >= |compare_threshold| we run the risk of creating -// points that SHOULD be intersecting the "thick plane", but actually fail to -// test positively for it because |split_threshold| allowed them to be outside -// this range. -// This is really supposd to be compare_threshold / 2.0f, but that would -// create another static initializer. +// <= |split_threshold|, then it is considered on the plane for the purpose of +// polygon splitting. static const float split_threshold = 0.05f; static const float normalized_threshold = 0.001f; + +void PointInterpolate(const gfx::Point3F& from, + const gfx::Point3F& to, + double delta, + gfx::Point3F* out) { + out->SetPoint(from.x() + (to.x() - from.x()) * delta, + from.y() + (to.y() - from.y()) * delta, + from.z() + (to.z() - from.z()) * delta); +} } // namespace namespace cc { @@ -132,100 +131,6 @@ float DrawPolygon::SignedPointDistance(const gfx::Point3F& point) const { return gfx::DotProduct(point - points_[0], normal_); } -// Checks whether or not shape a lies on the front or back side of b, or -// whether they should be considered coplanar. If on the back side, we -// say A_BEFORE_B because it should be drawn in that order. -// Assumes that layers are split and there are no intersecting planes. -BspCompareResult DrawPolygon::SideCompare(const DrawPolygon& a, - const DrawPolygon& b) { - // Let's make sure that this is normalized. Without this SignedPointDistance - // will not be right, but putting the check in there will validate it - // redundantly for each point. - DCHECK_GE(normalized_threshold, std::abs(b.normal_.LengthSquared() - 1.0f)); - - int pos_count = 0; - int neg_count = 0; - for (size_t i = 0; i < a.points_.size(); i++) { - float sign = b.SignedPointDistance(a.points_[i]); - - if (sign < -compare_threshold) { - ++neg_count; - } else if (sign > compare_threshold) { - ++pos_count; - } - - if (pos_count && neg_count) { - return BSP_SPLIT; - } - } - - if (pos_count) { - return BSP_FRONT; - } - if (neg_count) { - return BSP_BACK; - } - - double dot = gfx::DotProduct(a.normal_, b.normal_); - if ((dot >= 0.0f && a.order_index_ >= b.order_index_) || - (dot <= 0.0f && a.order_index_ <= b.order_index_)) { - // The sign of the dot product of the normals along with document order - // determine which side it goes on, the vertices are ambiguous. - return BSP_COPLANAR_BACK; - } - - return BSP_COPLANAR_FRONT; -} - -static bool LineIntersectPlane(const gfx::Point3F& line_start, - const gfx::Point3F& line_end, - const gfx::Point3F& plane_origin, - const gfx::Vector3dF& plane_normal, - gfx::Point3F* intersection, - float distance_threshold) { - const gfx::Vector3dF line_start_vec(line_start.x(), line_start.y(), - line_start.z()); - const gfx::Vector3dF line_end_vec(line_end.x(), line_end.y(), line_end.z()); - const gfx::Vector3dF plane_origin_vec(plane_origin.x(), plane_origin.y(), - plane_origin.z()); - - double plane_d = -gfx::DotProduct(plane_origin_vec, plane_normal); - - double end_distance = gfx::DotProduct(line_end_vec, plane_normal) + plane_d; - if (std::abs(end_distance) <= distance_threshold) { - // No intersection if |line_end| is within |distance_threshold| of plane. - return false; - } - - double start_distance = - gfx::DotProduct(line_start_vec, plane_normal) + plane_d; - if (std::abs(start_distance) <= distance_threshold) { - // Intersection at |line_start| if |line_start| is within - // |distance_threshold| of plane. - intersection->SetPoint(line_start.x(), line_start.y(), line_start.z()); - return true; - } - - // If signs differ, we cross the plane. - if (start_distance * end_distance < 0.0) { - // Plane: P . N + d = 0 [ d = -(plane_normal . plane_origin) ] - // Ray: P = P0 + Pd * t [ P0 = line_start, Pd = line_end - line_start ] - // Substituting: - // (P0 + Pd * t) . N + d = 0 - // P0 . N + t * Pd . N + d = 0 - // t = -(P0 . N + d) / Pd . N - - gfx::Vector3dF line_delta = line_end - line_start; - double t = -start_distance / gfx::DotProduct(plane_normal, line_delta); - intersection->SetPoint(line_start.x() + line_delta.x() * t, - line_start.y() + line_delta.y() * t, - line_start.z() + line_delta.z() * t); - - return true; - } - return false; -} - // This function is separate from ApplyTransform because it is often unnecessary // to transform the normal with the rest of the polygon. // When drawing these polygons, it is necessary to move them back into layer @@ -275,84 +180,138 @@ void DrawPolygon::TransformToLayerSpace( normal_ = gfx::Vector3dF(0.0f, 0.0f, -1.0f); } -bool DrawPolygon::Split(const DrawPolygon& splitter, - std::unique_ptr* front, - std::unique_ptr* back) { - gfx::Point3F intersections[2]; - std::vector out_points[2]; - // vertex_before stores the index of the vertex before its matching - // intersection. - // i.e. vertex_before[0] stores the vertex we saw before we crossed the plane - // which resulted in the line/plane intersection giving us intersections[0]. - size_t vertex_before[2]; - size_t points_size = points_.size(); - size_t current_intersection = 0; - - size_t current_vertex = 0; - // We will only have two intersection points because we assume all polygons - // are convex. - while (current_intersection < 2) { - if (LineIntersectPlane(points_[(current_vertex % points_size)], - points_[(current_vertex + 1) % points_size], - splitter.points_[0], - splitter.normal_, - &intersections[current_intersection], - split_threshold)) { - vertex_before[current_intersection] = current_vertex % points_size; - current_intersection++; - // We found both intersection points so we're done already. - if (current_intersection == 2) { - break; - } - } - if (current_vertex++ > (points_size)) { - break; +// Split |polygon| based upon |this|, leaving the results in |front| and |back|. +// If |polygon| is not split by |this|, then move it to either |front| or |back| +// depending on its orientation relative to |this|. Sets |is_coplanar| to true +// if |polygon| is actually coplanar with |this| (in which case whether it is +// front facing or back facing is determined by the dot products of normals, and +// document order). +void DrawPolygon::SplitPolygon(std::unique_ptr polygon, + std::unique_ptr* front, + std::unique_ptr* back, + bool* is_coplanar) const { + DCHECK_GE(normalized_threshold, std::abs(normal_.LengthSquared() - 1.0f)); + + const size_t num_points = polygon->points_.size(); + const auto next = [num_points](size_t i) { return (i + 1) % num_points; }; + const auto prev = [num_points](size_t i) { + return (i + num_points - 1) % num_points; + }; + + std::vector vertex_distance; + size_t pos_count = 0; + size_t neg_count = 0; + + // Compute plane distances for each vertex of polygon. + vertex_distance.resize(num_points); + for (size_t i = 0; i < num_points; i++) { + vertex_distance[i] = SignedPointDistance(polygon->points_[i]); + if (vertex_distance[i] < -split_threshold) { + ++neg_count; + } else if (vertex_distance[i] > split_threshold) { + ++pos_count; + } else { + vertex_distance[i] = 0.0; } } - DCHECK_EQ(current_intersection, static_cast(2)); - - // Since we found both the intersection points, we can begin building the - // vertex set for both our new polygons. - size_t start1 = (vertex_before[0] + 1) % points_size; - size_t start2 = (vertex_before[1] + 1) % points_size; - size_t points_remaining = points_size; - - // First polygon. - out_points[0].push_back(intersections[0]); - DCHECK_GE(vertex_before[1], start1); - for (size_t i = start1; i <= vertex_before[1]; i++) { - out_points[0].push_back(points_[i]); - --points_remaining; - } - out_points[0].push_back(intersections[1]); - - // Second polygon. - out_points[1].push_back(intersections[1]); - size_t index = start2; - for (size_t i = 0; i < points_remaining; i++) { - out_points[1].push_back(points_[index % points_size]); - ++index; + + // Handle non-splitting cases. + if (!pos_count && !neg_count) { + double dot = gfx::DotProduct(normal_, polygon->normal_); + if ((dot >= 0.0f && polygon->order_index_ >= order_index_) || + (dot <= 0.0f && polygon->order_index_ <= order_index_)) { + *back = std::move(polygon); + } else { + *front = std::move(polygon); + } + *is_coplanar = true; + return; } - out_points[1].push_back(intersections[0]); - - // Give both polygons the original splitting polygon's ID, so that they'll - // still be sorted properly in co-planar instances. - std::unique_ptr poly1( - new DrawPolygon(original_ref_, out_points[0], normal_, order_index_)); - std::unique_ptr poly2( - new DrawPolygon(original_ref_, out_points[1], normal_, order_index_)); - - DCHECK_GE(poly1->points().size(), 3u); - DCHECK_GE(poly2->points().size(), 3u); - - if (SideCompare(*poly1, splitter) == BSP_FRONT) { - *front = std::move(poly1); - *back = std::move(poly2); - } else { - *front = std::move(poly2); - *back = std::move(poly1); + + *is_coplanar = false; + if (!neg_count) { + *front = std::move(polygon); + return; + } else if (!pos_count) { + *back = std::move(polygon); + return; } - return true; + + // There should be at most two points that are considered to be on the thick + // plane. If this is not the case, then the polygon is not convex. + DCHECK_LE(num_points - pos_count - neg_count, 2u); + + // Handle splitting case. + size_t front_begin; + size_t back_begin; + size_t pre_front_begin; + size_t pre_back_begin; + + // Find the first vertex that is part of the front split polygon. + front_begin = std::find_if(vertex_distance.begin(), vertex_distance.end(), + [](float val) { return val > 0.0; }) - + vertex_distance.begin(); + while (vertex_distance[pre_front_begin = prev(front_begin)] > 0.0) + front_begin = pre_front_begin; + + // Find the first vertex that is part of the back split polygon. + back_begin = std::find_if(vertex_distance.begin(), vertex_distance.end(), + [](float val) { return val < 0.0; }) - + vertex_distance.begin(); + while (vertex_distance[pre_back_begin = prev(back_begin)] < 0.0) + back_begin = pre_back_begin; + + DCHECK(vertex_distance[front_begin] > 0.0); + DCHECK(vertex_distance[pre_front_begin] <= 0.0); + DCHECK(vertex_distance[back_begin] < 0.0); + DCHECK(vertex_distance[pre_back_begin] >= 0.0); + + gfx::Point3F pre_pos_intersection; + gfx::Point3F pre_neg_intersection; + + // Compute the intersection points. N.B.: If the "pre" vertex is on + // the thick plane, then the intersection will be at the same point, because + // we set vertex_distance to 0 in this case. + PointInterpolate( + polygon->points_[pre_front_begin], polygon->points_[front_begin], + -vertex_distance[pre_front_begin] / + gfx::DotProduct(normal_, polygon->points_[front_begin] - + polygon->points_[pre_front_begin]), + &pre_pos_intersection); + PointInterpolate( + polygon->points_[pre_back_begin], polygon->points_[back_begin], + -vertex_distance[pre_back_begin] / + gfx::DotProduct(normal_, polygon->points_[back_begin] - + polygon->points_[pre_back_begin]), + &pre_neg_intersection); + + // Build the front and back polygons. + std::vector out_points; + + out_points.push_back(pre_pos_intersection); + do { + out_points.push_back(polygon->points_[front_begin]); + front_begin = next(front_begin); + } while (vertex_distance[front_begin] > 0.0); + out_points.push_back(pre_neg_intersection); + *front = + base::MakeUnique(polygon->original_ref_, out_points, + polygon->normal_, polygon->order_index_); + + out_points.clear(); + + out_points.push_back(pre_neg_intersection); + do { + out_points.push_back(polygon->points_[back_begin]); + back_begin = next(back_begin); + } while (vertex_distance[back_begin] < 0.0); + out_points.push_back(pre_pos_intersection); + *back = + base::MakeUnique(polygon->original_ref_, out_points, + polygon->normal_, polygon->order_index_); + + DCHECK_GE((*front)->points().size(), 3u); + DCHECK_GE((*back)->points().size(), 3u); } // This algorithm takes the first vertex in the polygon and uses that as a diff --git a/cc/quads/draw_polygon.h b/cc/quads/draw_polygon.h index b3bde398c5556..2dc642cde3195 100644 --- a/cc/quads/draw_polygon.h +++ b/cc/quads/draw_polygon.h @@ -40,14 +40,11 @@ class CC_EXPORT DrawPolygon { // Split will only return true if it determines that we got back 2 // intersection points. Only when it returns true will front and back both be // valid new polygons that are on opposite sides of the splitting plane. - bool Split(const DrawPolygon& splitter, - std::unique_ptr* front, - std::unique_ptr* back); + void SplitPolygon(std::unique_ptr polygon, + std::unique_ptr* front, + std::unique_ptr* back, + bool* is_coplanar) const; float SignedPointDistance(const gfx::Point3F& point) const; - // Checks polygon a against polygon b and returns which side it lies on, or - // whether it crosses (necessitating a split in the BSP tree). - static BspCompareResult SideCompare(const DrawPolygon& a, - const DrawPolygon& b); void ToQuads2D(std::vector* quads) const; void TransformToScreenSpace(const gfx::Transform& transform); void TransformToLayerSpace(const gfx::Transform& inverse_transform); diff --git a/cc/quads/draw_polygon_unittest.cc b/cc/quads/draw_polygon_unittest.cc index 884777fc2244e..40090ec765910 100644 --- a/cc/quads/draw_polygon_unittest.cc +++ b/cc/quads/draw_polygon_unittest.cc @@ -12,6 +12,7 @@ #include #include +#include "base/memory/ptr_util.h" #include "cc/output/bsp_compare_result.h" #include "cc/quads/draw_polygon.h" #include "testing/gtest/include/gtest/gtest.h" @@ -30,6 +31,10 @@ namespace { #define CREATE_NEW_DRAW_POLYGON(name, points_vector, normal, polygon_id) \ DrawPolygon name(NULL, points_vector, normal, polygon_id) +#define CREATE_NEW_DRAW_POLYGON_PTR(name, points_vector, normal, polygon_id) \ + std::unique_ptr name(base::MakeUnique( \ + nullptr, points_vector, normal, polygon_id)) + #define CREATE_TEST_DRAW_FORWARD_POLYGON(name, points_vector, id) \ DrawPolygon name(NULL, points_vector, gfx::Vector3dF(0, 0, 1.0f), id); \ name.RecomputeNormalForTesting() @@ -38,7 +43,8 @@ namespace { DrawPolygon name(NULL, points_vector, gfx::Vector3dF(0, 0, -1.0f), id); \ name.RecomputeNormalForTesting() -#define EXPECT_FLOAT_WITHIN_EPSILON_OF(a, b) \ +#define EXPECT_FLOAT_WITHIN_EPSILON_OF(a, b) \ + LOG(WARNING) << "a=" << a << " b= " << b << " diff=" << std::abs(a - b); \ EXPECT_TRUE(std::abs(a - b) < std::numeric_limits::epsilon()); #define EXPECT_POINT_EQ(point_a, point_b) \ @@ -59,6 +65,36 @@ static void ValidatePoints(const DrawPolygon& polygon, } } +static void ValidatePointsWithinDeltaOf(const DrawPolygon& polygon, + const std::vector& points, + float delta) { + EXPECT_EQ(polygon.points().size(), points.size()); + for (size_t i = 0; i < points.size(); i++) { + EXPECT_LE((polygon.points()[i] - points[i]).Length(), delta); + } +} + +std::unique_ptr ClonePolygon(const DrawPolygon& polygon) { + return base::MakeUnique(polygon.original_ref(), polygon.points(), + polygon.normal(), polygon.order_index()); +} + +// Classifies polygon a with respect to b +BspCompareResult SideCompare(const DrawPolygon& a, const DrawPolygon& b) { + std::unique_ptr front; + std::unique_ptr back; + bool is_coplanar; + b.SplitPolygon(ClonePolygon(a), &front, &back, &is_coplanar); + if (is_coplanar) { + return (front != nullptr) ? BSP_COPLANAR_FRONT : BSP_COPLANAR_BACK; + } + if (front == nullptr) + return BSP_BACK; + if (back == nullptr) + return BSP_FRONT; + return BSP_SPLIT; +} + // A simple square in a plane. TEST(DrawPolygonConstructionTest, NormalNormal) { gfx::Transform Identity; @@ -208,7 +244,7 @@ TEST(DrawPolygonSplitTest, NearlyTouchingOrder) { CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a, normal, 0); CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b, normal, 1); - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(polygon_b, polygon_a)); + EXPECT_EQ(BSP_BACK, SideCompare(polygon_b, polygon_a)); } // Two quads are definitely not touching and so no split should occur. @@ -234,7 +270,7 @@ TEST(DrawPolygonSplitTest, NotClearlyInFront) { CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a, normal_a, 0); CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b, normal_b, 1); - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(polygon_b, polygon_a)); + EXPECT_EQ(BSP_FRONT, SideCompare(polygon_b, polygon_a)); } // Two quads are definitely not touching and so no split should occur. @@ -250,15 +286,16 @@ TEST(DrawPolygonSplitTest, NotTouchingNoSplit) { vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 15.0f)); vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 5.0f)); - CREATE_NEW_DRAW_POLYGON( - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0); - CREATE_NEW_DRAW_POLYGON( - polygon_b, vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1); + CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a, + gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0); + CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b, + gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1); - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(polygon_b, polygon_a)); + EXPECT_EQ(BSP_FRONT, SideCompare(polygon_b, polygon_a)); } -// One quad is resting against another, but doesn't cross its plane so no split +// One quad is resting against another, but doesn't cross its plane so no +// split // should occur. TEST(DrawPolygonSplitTest, BarelyTouchingNoSplit) { std::vector vertices_a; @@ -272,12 +309,12 @@ TEST(DrawPolygonSplitTest, BarelyTouchingNoSplit) { vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, -10.0f)); vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 0.0f)); - CREATE_NEW_DRAW_POLYGON( - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0); - CREATE_NEW_DRAW_POLYGON( - polygon_b, vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1); + CREATE_NEW_DRAW_POLYGON(polygon_a, vertices_a, + gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0); + CREATE_NEW_DRAW_POLYGON(polygon_b, vertices_b, + gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1); - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(polygon_b, polygon_a)); + EXPECT_EQ(BSP_BACK, SideCompare(polygon_b, polygon_a)); } // One quad intersects another and becomes two pieces. @@ -293,18 +330,20 @@ TEST(DrawPolygonSplitTest, BasicSplit) { vertices_b.push_back(gfx::Point3F(5.0f, 0.0f, 5.0f)); vertices_b.push_back(gfx::Point3F(5.0f, 10.0f, 5.0f)); - CREATE_NEW_DRAW_POLYGON( - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0); - CREATE_NEW_DRAW_POLYGON( - polygon_b, vertices_b, gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1); - - EXPECT_EQ(BSP_SPLIT, DrawPolygon::SideCompare(polygon_b, polygon_a)); + CREATE_NEW_DRAW_POLYGON_PTR(polygon_a, vertices_a, + gfx::Vector3dF(0.0f, 0.0f, 1.0f), 0); + CREATE_NEW_DRAW_POLYGON_PTR(polygon_b, vertices_b, + gfx::Vector3dF(-1.0f, 0.0f, 0.0f), 1); std::unique_ptr front_polygon; std::unique_ptr back_polygon; - polygon_b.Split(polygon_a, &front_polygon, &back_polygon); - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(*front_polygon, polygon_a)); - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(*back_polygon, polygon_a)); + bool is_coplanar; + + polygon_a->SplitPolygon(std::move(polygon_b), &front_polygon, &back_polygon, + &is_coplanar); + EXPECT_FALSE(is_coplanar); + EXPECT_TRUE(front_polygon != nullptr); + EXPECT_TRUE(back_polygon != nullptr); std::vector test_points_a; test_points_a.push_back(gfx::Point3F(5.0f, 0.0f, 0.0f)); @@ -337,21 +376,20 @@ TEST(DrawPolygonSplitTest, AngledSplit) { vertices_b.push_back(gfx::Point3F(-1.0f, -5.0f, -2.0f)); vertices_b.push_back(gfx::Point3F(-1.0f, 5.0f, -2.0f)); - CREATE_NEW_DRAW_POLYGON( - polygon_a, vertices_a, gfx::Vector3dF(0.0f, 1.0f, 0.0f), 0); - CREATE_NEW_DRAW_POLYGON( - polygon_b, vertices_b, gfx::Vector3dF(0.707107f, 0.0f, -0.707107f), 1); - - EXPECT_EQ(BSP_SPLIT, DrawPolygon::SideCompare(polygon_a, polygon_b)); + CREATE_NEW_DRAW_POLYGON_PTR(polygon_a, vertices_a, + gfx::Vector3dF(0.0f, 1.0f, 0.0f), 0); + CREATE_NEW_DRAW_POLYGON_PTR(polygon_b, vertices_b, + gfx::Vector3dF(0.707107f, 0.0f, -0.707107f), 1); std::unique_ptr front_polygon; std::unique_ptr back_polygon; - polygon_a.Split(polygon_b, &front_polygon, &back_polygon); - EXPECT_EQ(BSP_FRONT, DrawPolygon::SideCompare(*front_polygon, polygon_b)); - EXPECT_EQ(BSP_BACK, DrawPolygon::SideCompare(*back_polygon, polygon_b)); + bool is_coplanar; - EXPECT_EQ(3u, front_polygon->points().size()); - EXPECT_EQ(5u, back_polygon->points().size()); + polygon_b->SplitPolygon(std::move(polygon_a), &front_polygon, &back_polygon, + &is_coplanar); + EXPECT_FALSE(is_coplanar); + EXPECT_TRUE(front_polygon != nullptr); + EXPECT_TRUE(back_polygon != nullptr); std::vector test_points_a; test_points_a.push_back(gfx::Point3F(10.0f, 0.0f, 9.0f)); @@ -364,8 +402,8 @@ TEST(DrawPolygonSplitTest, AngledSplit) { test_points_b.push_back(gfx::Point3F(10.0f, 0.0f, 10.0f)); test_points_b.push_back(gfx::Point3F(10.0f, 0.0f, 9.0f)); - ValidatePoints(*(front_polygon.get()), test_points_a); - ValidatePoints(*(back_polygon.get()), test_points_b); + ValidatePointsWithinDeltaOf(*(front_polygon.get()), test_points_a, 1e-6f); + ValidatePointsWithinDeltaOf(*(back_polygon.get()), test_points_b, 1e-6f); } TEST(DrawPolygonTransformTest, TransformNormal) { diff --git a/cc/raster/gpu_rasterizer.cc b/cc/raster/gpu_rasterizer.cc index f8f8b43d35ee0..b17be3b1d9b6b 100644 --- a/cc/raster/gpu_rasterizer.cc +++ b/cc/raster/gpu_rasterizer.cc @@ -12,6 +12,7 @@ #include "cc/debug/devtools_instrumentation.h" #include "cc/debug/frame_viewer_instrumentation.h" #include "cc/output/context_provider.h" +#include "cc/playback/image_hijack_canvas.h" #include "cc/playback/raster_source.h" #include "cc/raster/raster_buffer.h" #include "cc/raster/scoped_gpu_raster.h" @@ -52,8 +53,17 @@ void GpuRasterizer::RasterizeSource( sk_sp canvas = sk_ref_sp( recorder.beginRecording(size.width(), size.height(), NULL, flags)); canvas->save(); + // The GPU image decode controller assumes that Skia is done with an image + // when playback is complete. However, in this case, where we play back to a + // picture, we don't actually finish with the images until the picture is + // rasterized later. This can cause lifetime issues in the GPU image decode + // controller. To avoid this, we disable the image hijack canvas (and image + // decode controller) for this playback step, instead enabling it for the + // later picture rasterization. + RasterSource::PlaybackSettings settings = playback_settings; + settings.use_image_hijack_canvas = false; raster_source->PlaybackToCanvas(canvas.get(), raster_full_rect, playback_rect, - scale, playback_settings); + scale, settings); canvas->restore(); sk_sp picture = recorder.finishRecordingAsPicture(); @@ -77,8 +87,27 @@ void GpuRasterizer::RasterizeSource( if (!sk_surface) return; + // As we did not use the image hijack canvas during the initial playback to + // |picture| (see PlaybackToPicture), we must enable it here if requested. + SkCanvas* canvas = sk_surface->getCanvas(); + std::unique_ptr hijack_canvas; + if (playback_settings.use_image_hijack_canvas) { + const SkImageInfo& info = canvas->imageInfo(); + hijack_canvas.reset( + new ImageHijackCanvas(info.width(), info.height(), + raster_source->image_decode_controller())); + SkIRect raster_bounds; + canvas->getClipDeviceBounds(&raster_bounds); + hijack_canvas->clipRect(SkRect::MakeFromIRect(raster_bounds)); + hijack_canvas->setMatrix(canvas->getTotalMatrix()); + hijack_canvas->addCanvas(canvas); + + // Replace canvas with our ImageHijackCanvas which is wrapping it. + canvas = hijack_canvas.get(); + } + SkMultiPictureDraw multi_picture_draw; - multi_picture_draw.add(sk_surface->getCanvas(), picture.get()); + multi_picture_draw.add(canvas, picture.get()); multi_picture_draw.draw(false); write_lock->ReleaseSkSurface(); } diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc index ffdb710b0e43d..e07018f220e72 100644 --- a/cc/raster/raster_buffer_provider_unittest.cc +++ b/cc/raster/raster_buffer_provider_unittest.cc @@ -65,10 +65,14 @@ class TestRasterTaskImpl : public TileTask { // Overridden from Task: void RunOnWorkerThread() override { + // Don't use the image hijack canvas for these tests, as they have no image + // decode controller. + RasterSource::PlaybackSettings settings; + settings.use_image_hijack_canvas = false; + uint64_t new_content_id = 0; raster_buffer_->Playback(raster_source_.get(), gfx::Rect(1, 1), - gfx::Rect(1, 1), new_content_id, 1.f, - RasterSource::PlaybackSettings()); + gfx::Rect(1, 1), new_content_id, 1.f, settings); } // Overridden from TileTask: diff --git a/cc/resources/ui_resource_request.cc b/cc/resources/ui_resource_request.cc index 28fd7f3602f79..009ccf3634f47 100644 --- a/cc/resources/ui_resource_request.cc +++ b/cc/resources/ui_resource_request.cc @@ -10,7 +10,9 @@ namespace cc { UIResourceRequest::UIResourceRequest(UIResourceRequestType type, UIResourceId id) - : type_(type), id_(id) {} + : type_(type), id_(id) { + DCHECK(type == UI_RESOURCE_DELETE); +} UIResourceRequest::UIResourceRequest(UIResourceRequestType type, UIResourceId id, diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc index f0fe524df2bb2..50416eff7b5b2 100644 --- a/cc/resources/video_resource_updater.cc +++ b/cc/resources/video_resource_updater.cc @@ -24,11 +24,6 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "ui/gfx/geometry/size_conversions.h" -#if DCHECK_IS_ON() -#include "base/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" -#endif - namespace cc { namespace { @@ -124,14 +119,6 @@ class SyncTokenClientImpl : public media::VideoFrame::SyncTokenClient { gpu::SyncToken sync_token_; }; -#if DCHECK_IS_ON() -void OnVideoFrameDestruct( - const scoped_refptr& task_runner, - const base::Closure& task) { - task_runner->PostTask(FROM_HERE, task); -} -#endif - } // namespace VideoResourceUpdater::PlaneResource::PlaneResource( @@ -139,48 +126,26 @@ VideoResourceUpdater::PlaneResource::PlaneResource( const gfx::Size& resource_size, ResourceFormat resource_format, gpu::Mailbox mailbox) - : resource_id(resource_id), - resource_size(resource_size), - resource_format(resource_format), - mailbox(mailbox), - ref_count(0), - frame_ptr(nullptr), -#if DCHECK_IS_ON() - destructed(false), -#endif - plane_index(0u) { -} + : resource_id_(resource_id), + resource_size_(resource_size), + resource_format_(resource_format), + mailbox_(mailbox) {} VideoResourceUpdater::PlaneResource::PlaneResource(const PlaneResource& other) = default; -bool VideoResourceUpdater::PlaneResourceMatchesUniqueID( - const PlaneResource& plane_resource, - const media::VideoFrame* video_frame, - size_t plane_index) { - bool matched = plane_resource.frame_ptr == video_frame && - plane_resource.plane_index == plane_index && - plane_resource.timestamp == video_frame->timestamp(); -#if DCHECK_IS_ON() - if ((plane_index == 0) && matched) { - DCHECK(!plane_resource.destructed) - << "ERROR: reused the destructed resource." - << " timestamp = " << plane_resource.timestamp; - } -#endif - return matched; +bool VideoResourceUpdater::PlaneResource::Matches(int unique_frame_id, + size_t plane_index) { + return has_unique_frame_id_and_plane_index_ && + unique_frame_id_ == unique_frame_id && plane_index_ == plane_index; } -void VideoResourceUpdater::SetPlaneResourceUniqueId( - const media::VideoFrame* video_frame, - size_t plane_index, - PlaneResource* plane_resource) { - plane_resource->frame_ptr = video_frame; - plane_resource->plane_index = plane_index; - plane_resource->timestamp = video_frame->timestamp(); -#if DCHECK_IS_ON() - plane_resource->destructed = false; -#endif +void VideoResourceUpdater::PlaneResource::SetUniqueId(int unique_frame_id, + size_t plane_index) { + DCHECK_EQ(ref_count_, 1); + plane_index_ = plane_index; + unique_frame_id_ = unique_frame_id; + has_unique_frame_id_and_plane_index_ = true; } VideoFrameExternalResources::VideoFrameExternalResources() @@ -202,7 +167,7 @@ VideoResourceUpdater::VideoResourceUpdater(ContextProvider* context_provider, VideoResourceUpdater::~VideoResourceUpdater() { for (const PlaneResource& plane_resource : all_resources_) - resource_provider_->DeleteResource(plane_resource.resource_id); + resource_provider_->DeleteResource(plane_resource.resource_id()); } VideoResourceUpdater::ResourceList::iterator @@ -238,8 +203,8 @@ VideoResourceUpdater::AllocateResource(const gfx::Size& plane_size, } void VideoResourceUpdater::DeleteResource(ResourceList::iterator resource_it) { - DCHECK_EQ(resource_it->ref_count, 0); - resource_provider_->DeleteResource(resource_it->resource_id); + DCHECK(!resource_it->has_refs()); + resource_provider_->DeleteResource(resource_it->resource_id()); all_resources_.erase(resource_it); } @@ -342,7 +307,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( // Drop recycled resources that are the wrong format. for (auto it = all_resources_.begin(); it != all_resources_.end();) { - if (it->ref_count == 0 && it->resource_format != output_resource_format) + if (!it->has_refs() && it->resource_format() != output_resource_format) DeleteResource(it++); else ++it; @@ -362,9 +327,9 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( // Try recycle a previously-allocated resource. ResourceList::iterator resource_it = all_resources_.end(); for (auto it = all_resources_.begin(); it != all_resources_.end(); ++it) { - if (it->resource_size == output_plane_resource_size && - it->resource_format == output_resource_format) { - if (PlaneResourceMatchesUniqueID(*it, video_frame.get(), i)) { + if (it->resource_size() == output_plane_resource_size && + it->resource_format() == output_resource_format) { + if (it->Matches(video_frame->unique_id(), i)) { // Bingo, we found a resource that already contains the data we are // planning to put in it. It's safe to reuse it even if // resource_provider_ holds some references to it, because those @@ -378,8 +343,8 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( // codereview.chromium.org/145273021. const bool in_use = software_compositor && - resource_provider_->InUseByConsumer(it->resource_id); - if (it->ref_count == 0 && !in_use) { + resource_provider_->InUseByConsumer(it->resource_id()); + if (!it->has_refs() && !in_use) { // We found a resource with the correct size that we can overwrite. resource_it = it; } @@ -396,14 +361,14 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( if (resource_it == all_resources_.end()) break; - ++resource_it->ref_count; + resource_it->add_ref(); plane_resources.push_back(resource_it); } if (plane_resources.size() != output_plane_count) { // Allocation failed, nothing will be returned so restore reference counts. for (ResourceList::iterator resource_it : plane_resources) - --resource_it->ref_count; + resource_it->remove_ref(); return VideoFrameExternalResources(); } @@ -412,34 +377,27 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( if (software_compositor) { DCHECK_EQ(plane_resources.size(), 1u); PlaneResource& plane_resource = *plane_resources[0]; - DCHECK_EQ(plane_resource.resource_format, kRGBResourceFormat); - DCHECK(plane_resource.mailbox.IsZero()); + DCHECK_EQ(plane_resource.resource_format(), kRGBResourceFormat); + DCHECK(plane_resource.mailbox().IsZero()); - if (!PlaneResourceMatchesUniqueID(plane_resource, video_frame.get(), 0)) { + if (!plane_resource.Matches(video_frame->unique_id(), 0)) { // We need to transfer data from |video_frame| to the plane resource. if (!video_renderer_) video_renderer_.reset(new media::SkCanvasVideoRenderer); ResourceProvider::ScopedWriteLockSoftware lock( - resource_provider_, plane_resource.resource_id); + resource_provider_, plane_resource.resource_id()); SkCanvas canvas(lock.sk_bitmap()); // This is software path, so canvas and video_frame are always backed // by software. video_renderer_->Copy(video_frame, &canvas, media::Context3D()); - SetPlaneResourceUniqueId(video_frame.get(), 0, &plane_resource); -#if DCHECK_IS_ON() - // Add VideoFrame destructor callback. - video_frame->AddDestructionObserver(base::Bind( - &OnVideoFrameDestruct, base::ThreadTaskRunnerHandle::Get(), - base::Bind(&VideoResourceUpdater::MarkOldResource, AsWeakPtr(), - base::Unretained(video_frame.get()), - video_frame->timestamp()))); -#endif + plane_resource.SetUniqueId(video_frame->unique_id(), 0); } - external_resources.software_resources.push_back(plane_resource.resource_id); + external_resources.software_resources.push_back( + plane_resource.resource_id()); external_resources.software_release_callback = - base::Bind(&RecycleResource, AsWeakPtr(), plane_resource.resource_id); + base::Bind(&RecycleResource, AsWeakPtr(), plane_resource.resource_id()); external_resources.type = VideoFrameExternalResources::SOFTWARE_RESOURCE; return external_resources; } @@ -447,22 +405,22 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( for (size_t i = 0; i < plane_resources.size(); ++i) { PlaneResource& plane_resource = *plane_resources[i]; // Update each plane's resource id with its content. - DCHECK_EQ(plane_resource.resource_format, + DCHECK_EQ(plane_resource.resource_format(), resource_provider_->YuvResourceFormat(bits_per_channel)); - if (!PlaneResourceMatchesUniqueID(plane_resource, video_frame.get(), i)) { + if (!plane_resource.Matches(video_frame->unique_id(), i)) { // We need to transfer data from |video_frame| to the plane resource. // TODO(reveman): Can use GpuMemoryBuffers here to improve performance. // The |resource_size_pixels| is the size of the resource we want to // upload to. - gfx::Size resource_size_pixels = plane_resource.resource_size; + gfx::Size resource_size_pixels = plane_resource.resource_size(); // The |video_stride_bytes| is the width of the video frame we are // uploading (including non-frame data to fill in the stride). int video_stride_bytes = video_frame->stride(i); size_t bytes_per_row = ResourceUtil::UncheckedWidthInBytes( - resource_size_pixels.width(), plane_resource.resource_format); + resource_size_pixels.width(), plane_resource.resource_format()); // Use 4-byte row alignment (OpenGL default) for upload performance. // Assuming that GL_UNPACK_ALIGNMENT has not changed from default. size_t upload_image_stride = @@ -472,7 +430,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( int shift = 0; // LUMINANCE_F16 uses half-floats, so we always need a conversion step. - if (plane_resource.resource_format == LUMINANCE_F16) { + if (plane_resource.resource_format() == LUMINANCE_F16) { needs_conversion = true; // Note that the current method of converting integers to half-floats // stops working if you have more than 10 bits of data. @@ -495,7 +453,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( upload_pixels_.resize(needed_size); for (int row = 0; row < resource_size_pixels.height(); ++row) { - if (plane_resource.resource_format == LUMINANCE_F16) { + if (plane_resource.resource_format() == LUMINANCE_F16) { uint16_t* dst = reinterpret_cast( &upload_pixels_[upload_image_stride * row]); const uint16_t* src = reinterpret_cast( @@ -527,22 +485,12 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( pixels = &upload_pixels_[0]; } - resource_provider_->CopyToResource(plane_resource.resource_id, pixels, + resource_provider_->CopyToResource(plane_resource.resource_id(), pixels, resource_size_pixels); - SetPlaneResourceUniqueId(video_frame.get(), i, &plane_resource); -#if DCHECK_IS_ON() - // Add VideoFrame destructor callback. - if (i == 0) { - video_frame->AddDestructionObserver(base::Bind( - &OnVideoFrameDestruct, base::ThreadTaskRunnerHandle::Get(), - base::Bind(&VideoResourceUpdater::MarkOldResource, AsWeakPtr(), - base::Unretained(video_frame.get()), - video_frame->timestamp()))); - } -#endif + plane_resource.SetUniqueId(video_frame->unique_id(), i); } - if (plane_resource.resource_format == LUMINANCE_F16) { + if (plane_resource.resource_format() == LUMINANCE_F16) { // By OR-ing with 0x3800, 10-bit numbers become half-floats in the // range [0.5..1) and 9-bit numbers get the range [0.5..0.75). // @@ -566,11 +514,11 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( } external_resources.mailboxes.push_back( - TextureMailbox(plane_resource.mailbox, gpu::SyncToken(), + TextureMailbox(plane_resource.mailbox(), gpu::SyncToken(), resource_provider_->GetResourceTextureTarget( - plane_resource.resource_id))); - external_resources.release_callbacks.push_back( - base::Bind(&RecycleResource, AsWeakPtr(), plane_resource.resource_id)); + plane_resource.resource_id()))); + external_resources.release_callbacks.push_back(base::Bind( + &RecycleResource, AsWeakPtr(), plane_resource.resource_id())); } external_resources.type = VideoFrameExternalResources::YUV_RESOURCE; @@ -616,10 +564,10 @@ void VideoResourceUpdater::CopyPlaneTexture( for (auto it = all_resources_.begin(); it != all_resources_.end(); ++it) { // Reuse resource if attributes match and the resource is a currently // unreferenced texture. - if (it->resource_size == output_plane_resource_size && - it->resource_format == copy_target_format && !it->mailbox.IsZero() && - it->ref_count == 0 && - resource_provider_->GetTextureHint(it->resource_id) != + if (it->resource_size() == output_plane_resource_size && + it->resource_format() == copy_target_format && + !it->mailbox().IsZero() && !it->has_refs() && + resource_provider_->GetTextureHint(it->resource_id()) != ResourceProvider::TEXTURE_HINT_IMMUTABLE) { resource = it; break; @@ -633,14 +581,15 @@ void VideoResourceUpdater::CopyPlaneTexture( true, is_immutable); } - ++resource->ref_count; + resource->add_ref(); ResourceProvider::ScopedWriteLockGL lock(resource_provider_, - resource->resource_id); + resource->resource_id()); uint32_t texture_id = lock.texture_id(); - DCHECK_EQ(resource_provider_->GetResourceTextureTarget(resource->resource_id), - (GLenum)GL_TEXTURE_2D); + DCHECK_EQ( + resource_provider_->GetResourceTextureTarget(resource->resource_id()), + (GLenum)GL_TEXTURE_2D); gl->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData()); uint32_t src_texture_id = gl->CreateAndConsumeTextureCHROMIUM( @@ -661,11 +610,11 @@ void VideoResourceUpdater::CopyPlaneTexture( video_frame->UpdateReleaseSyncToken(&client); external_resources->mailboxes.push_back(TextureMailbox( - resource->mailbox, sync_token, GL_TEXTURE_2D, video_frame->coded_size(), + resource->mailbox(), sync_token, GL_TEXTURE_2D, video_frame->coded_size(), gfx::GpuMemoryBufferId(), false, false)); external_resources->release_callbacks.push_back( - base::Bind(&RecycleResource, AsWeakPtr(), resource->resource_id)); + base::Bind(&RecycleResource, AsWeakPtr(), resource->resource_id())); } VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( @@ -728,7 +677,7 @@ void VideoResourceUpdater::RecycleResource( const ResourceList::iterator resource_it = std::find_if( updater->all_resources_.begin(), updater->all_resources_.end(), [resource_id](const PlaneResource& plane_resource) { - return plane_resource.resource_id == resource_id; + return plane_resource.resource_id() == resource_id; }); if (resource_it == updater->all_resources_.end()) return; @@ -740,35 +689,12 @@ void VideoResourceUpdater::RecycleResource( } if (lost_resource) { - resource_it->ref_count = 0; + resource_it->clear_refs(); updater->DeleteResource(resource_it); return; } - --resource_it->ref_count; - DCHECK_GE(resource_it->ref_count, 0); -} - -#if DCHECK_IS_ON() -// static -void VideoResourceUpdater::MarkOldResource( - base::WeakPtr updater, - const media::VideoFrame* video_frame_ptr, - base::TimeDelta timestamp) { - if (!updater) - return; - const ResourceList::iterator resource_it = std::find_if( - updater->all_resources_.begin(), updater->all_resources_.end(), - [video_frame_ptr, timestamp](const PlaneResource& plane_resource) { - return plane_resource.frame_ptr == video_frame_ptr && - plane_resource.timestamp == timestamp && - plane_resource.plane_index == 0; - }); - if (resource_it == updater->all_resources_.end()) - return; - - resource_it->destructed = true; + resource_it->remove_ref(); } -#endif } // namespace cc diff --git a/cc/resources/video_resource_updater.h b/cc/resources/video_resource_updater.h index b56597d2b1cbe..96ba482376878 100644 --- a/cc/resources/video_resource_updater.h +++ b/cc/resources/video_resource_updater.h @@ -86,44 +86,51 @@ class CC_EXPORT VideoResourceUpdater scoped_refptr video_frame); private: - struct PlaneResource { - unsigned resource_id; - gfx::Size resource_size; - ResourceFormat resource_format; - gpu::Mailbox mailbox; - // The balance between the number of times this resource has been returned - // from CreateForSoftwarePlanes vs released in RecycleResource. - int ref_count; - // These last three members will be used for identifying the data stored in - // this resource, and uniquely identifies a media::VideoFrame plane. The - // frame pointer will only be used for pointer comparison, i.e. the - // underlying data will not be accessed. - const void* frame_ptr; -#if DCHECK_IS_ON() - // This is marked true when the orginal VideoFrame is destructed. It is - // used to detect clients that are not setting the VideoFrame's timestamp - // field correctly, as required. The memory allocator can and will re-use - // the same pointer for new VideoFrame instances, so a destruction observer - // is used to detect that. - bool destructed; -#endif - size_t plane_index; - base::TimeDelta timestamp; - + class PlaneResource { + public: PlaneResource(unsigned resource_id, const gfx::Size& resource_size, ResourceFormat resource_format, gpu::Mailbox mailbox); PlaneResource(const PlaneResource& other); - }; - static bool PlaneResourceMatchesUniqueID(const PlaneResource& plane_resource, - const media::VideoFrame* video_frame, - size_t plane_index); + // Returns true if this resource matches the unique identifiers of another + // VideoFrame resource. + bool Matches(int unique_frame_id, size_t plane_index); + + // Sets the unique identifiers for this resource, may only be called when + // there is a single reference to the resource (i.e. |ref_count_| == 1). + void SetUniqueId(int unique_frame_id, size_t plane_index); - static void SetPlaneResourceUniqueId(const media::VideoFrame* video_frame, - size_t plane_index, - PlaneResource* plane_resource); + // Accessors for resource identifiers provided at construction time. + unsigned resource_id() const { return resource_id_; } + const gfx::Size& resource_size() const { return resource_size_; } + ResourceFormat resource_format() const { return resource_format_; } + const gpu::Mailbox& mailbox() const { return mailbox_; } + + // Various methods for managing references. See |ref_count_| for details. + void add_ref() { ++ref_count_; } + void remove_ref() { --ref_count_; } + void clear_refs() { ref_count_ = 0; } + bool has_refs() const { return ref_count_ != 0; } + + private: + // The balance between the number of times this resource has been returned + // from CreateForSoftwarePlanes vs released in RecycleResource. + int ref_count_ = 0; + + // These two members are used for identifying the data stored in this + // resource; they uniquely identify a media::VideoFrame plane. + int unique_frame_id_ = 0; + size_t plane_index_ = 0u; + // Indicates if the above two members have been set or not. + bool has_unique_frame_id_and_plane_index_ = false; + + const unsigned resource_id_; + const gfx::Size resource_size_; + const ResourceFormat resource_format_; + const gpu::Mailbox mailbox_; + }; // This needs to be a container where iterators can be erased without // invalidating other iterators. @@ -151,12 +158,6 @@ class CC_EXPORT VideoResourceUpdater const gpu::SyncToken& sync_token, bool lost_resource, BlockingTaskRunner* main_thread_task_runner); -#if DCHECK_IS_ON() - // Mark the |destructed| as true when the orginal VideoFrame is destructed. - static void MarkOldResource(base::WeakPtr updater, - const media::VideoFrame* video_frame_ptr, - base::TimeDelta timestamp); -#endif ContextProvider* context_provider_; ResourceProvider* resource_provider_; diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc index b8a331abd25a0..4776df1bf14f8 100644 --- a/cc/surfaces/display.cc +++ b/cc/surfaces/display.cc @@ -197,7 +197,8 @@ void Display::InitializeRenderer() { #endif } else { std::unique_ptr renderer = SoftwareRenderer::Create( - this, &settings_, output_surface_.get(), resource_provider.get()); + this, &settings_, output_surface_.get(), resource_provider.get(), + true /* use_image_hijack_canvas */); if (!renderer) return; renderer_ = std::move(renderer); diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc index 8faa02f529b23..778f76dde8484 100644 --- a/cc/test/pixel_test.cc +++ b/cc/test/pixel_test.cc @@ -183,9 +183,9 @@ void PixelTest::SetUpSoftwareRenderer() { gpu_memory_buffer_manager_.get(), main_thread_task_runner_.get(), 0, 1, settings_.renderer_settings.use_gpu_memory_buffer_resources, settings_.use_image_texture_targets); - renderer_ = - SoftwareRenderer::Create(this, &settings_.renderer_settings, - output_surface_.get(), resource_provider_.get()); + renderer_ = SoftwareRenderer::Create( + this, &settings_.renderer_settings, output_surface_.get(), + resource_provider_.get(), true /* use_image_hijack_canvas */); } } // namespace cc diff --git a/cc/test/pixel_test.h b/cc/test/pixel_test.h index 5a8afcd74cd19..db96dd9935037 100644 --- a/cc/test/pixel_test.h +++ b/cc/test/pixel_test.h @@ -118,7 +118,11 @@ class SoftwareRendererWithExpandedViewport : public SoftwareRenderer { const RendererSettings* settings, OutputSurface* output_surface, ResourceProvider* resource_provider) - : SoftwareRenderer(client, settings, output_surface, resource_provider) {} + : SoftwareRenderer(client, + settings, + output_surface, + resource_provider, + true /* use_image_hijack_canvas */) {} }; class GLRendererWithFlippedSurface : public GLRenderer { diff --git a/cc/test/proxy_impl_for_test.cc b/cc/test/proxy_impl_for_test.cc index c6fa586237927..8329523d41666 100644 --- a/cc/test/proxy_impl_for_test.cc +++ b/cc/test/proxy_impl_for_test.cc @@ -18,14 +18,6 @@ std::unique_ptr ProxyImplForTest::Create( std::move(external_begin_frame_source))); } -bool ProxyImplForTest::HasCommitCompletionEvent() const { - return commit_completion_event_ != nullptr; -} - -bool ProxyImplForTest::GetNextCommitWaitsForActivation() const { - return next_commit_waits_for_activation_; -} - ProxyImplForTest::ProxyImplForTest( TestHooks* test_hooks, ChannelImpl* channel_impl, diff --git a/cc/test/proxy_impl_for_test.h b/cc/test/proxy_impl_for_test.h index 97d5f89b19196..dd80df898c467 100644 --- a/cc/test/proxy_impl_for_test.h +++ b/cc/test/proxy_impl_for_test.h @@ -26,8 +26,6 @@ class ProxyImplForTest : public ProxyImpl { using ProxyImpl::DidCompletePageScaleAnimationOnImplThread; using ProxyImpl::SendBeginMainFrameNotExpectedSoon; - bool HasCommitCompletionEvent() const; - bool GetNextCommitWaitsForActivation() const; const DelayedUniqueNotifier& smoothness_priority_expiration_notifier() const { return smoothness_priority_expiration_notifier_; } diff --git a/cc/test/skia_common.cc b/cc/test/skia_common.cc index 13fdd6f0c69c4..75bee2ace6727 100644 --- a/cc/test/skia_common.cc +++ b/cc/test/skia_common.cc @@ -9,6 +9,7 @@ #include "cc/playback/display_item_list.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkImageGenerator.h" +#include "third_party/skia/include/core/SkPixmap.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/skia_util.h" @@ -19,7 +20,22 @@ namespace { class TestImageGenerator : public SkImageGenerator { public: explicit TestImageGenerator(const SkImageInfo& info) - : SkImageGenerator(info) {} + : SkImageGenerator(info), + image_backing_memory_(info.getSafeSize(info.minRowBytes()), 0), + image_pixmap_(info, image_backing_memory_.data(), info.minRowBytes()) {} + + protected: + bool onGetPixels(const SkImageInfo& info, + void* pixels, + size_t rowBytes, + SkPMColor ctable[], + int* ctableCount) override { + return image_pixmap_.readPixels(info, pixels, rowBytes, 0, 0); + } + + private: + std::vector image_backing_memory_; + SkPixmap image_pixmap_; }; } // anonymous namespace diff --git a/cc/tiles/picture_layer_tiling_set.cc b/cc/tiles/picture_layer_tiling_set.cc index b4e942a23af8b..469080f8d85ce 100644 --- a/cc/tiles/picture_layer_tiling_set.cc +++ b/cc/tiles/picture_layer_tiling_set.cc @@ -474,8 +474,9 @@ void PictureLayerTilingSet::UpdatePriorityRects( // We keep things as floats in here. if (!visible_rect_in_layer_space.IsEmpty()) { gfx::RectF eventually_rectf(visible_rect_in_layer_space); - eventually_rectf.Inset(-tiling_interest_area_padding_, - -tiling_interest_area_padding_); + eventually_rectf.Inset( + -tiling_interest_area_padding_ / ideal_contents_scale, + -tiling_interest_area_padding_ / ideal_contents_scale); if (eventually_rectf.Intersects( gfx::RectF(gfx::SizeF(raster_source_->GetSize())))) { visible_rect_in_layer_space_ = visible_rect_in_layer_space; diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index bad835b90f8ae..df445f61f59da 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc @@ -2423,6 +2423,54 @@ TEST_F(LayerTreeHostCommonTest, ClipRectWhenCannotRenderToSeparateSurface) { EXPECT_EQ(gfx::Rect(2, 2, 400, 400), leaf_node2->clip_rect()); } +TEST_F(LayerTreeHostCommonTest, HitTestingWhenSurfacesDisabled) { + LayerImpl* root = root_layer(); + LayerImpl* parent = AddChild(root); + LayerImpl* child = AddChild(parent); + LayerImpl* grand_child = AddChild(child); + LayerImpl* leaf_node = AddChild(grand_child); + + root->SetDrawsContent(true); + parent->SetDrawsContent(true); + child->SetDrawsContent(true); + grand_child->SetDrawsContent(true); + leaf_node->SetDrawsContent(true); + + const gfx::Transform identity_matrix; + + // child and grand_child will get render surfaces if surfaces are enabled. + SetLayerPropertiesForTesting(root, identity_matrix, gfx::Point3F(), + gfx::PointF(), gfx::Size(100, 100), true, false, + true); + SetLayerPropertiesForTesting(parent, identity_matrix, gfx::Point3F(), + gfx::PointF(2.f, 2.f), gfx::Size(400, 400), true, + false, false); + SetLayerPropertiesForTesting(child, identity_matrix, gfx::Point3F(), + gfx::PointF(4.f, 4.f), gfx::Size(800, 800), true, + false, true); + SetLayerPropertiesForTesting(grand_child, identity_matrix, gfx::Point3F(), + gfx::PointF(8.f, 8.f), gfx::Size(1500, 1500), + true, false, true); + SetLayerPropertiesForTesting(leaf_node, identity_matrix, gfx::Point3F(), + gfx::PointF(16.f, 16.f), gfx::Size(2000, 2000), + true, false, false); + + parent->SetMasksToBounds(true); + child->SetMasksToBounds(true); + + root->SetHasRenderSurface(true); + child->SetHasRenderSurface(true); + grand_child->SetHasRenderSurface(true); + + host_impl()->set_resourceless_software_draw_for_testing(); + ExecuteCalculateDrawPropertiesWithoutSeparateSurfaces(root); + gfx::PointF test_point(90.f, 90.f); + LayerImpl* result_layer = + root->layer_tree_impl()->FindLayerThatIsHitByPoint(test_point); + ASSERT_TRUE(result_layer); + EXPECT_EQ(leaf_node, result_layer); +} + TEST_F(LayerTreeHostCommonTest, SurfacesDisabledAndReEnabled) { // Tests that draw properties are computed correctly when we disable and then // re-enable separate surfaces. diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 91ae9ab9340c0..faa4639450ed2 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -1670,9 +1670,15 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame) { bool disable_picture_quad_image_filtering = IsActivelyScrolling() || animation_host_->NeedsAnimateLayers(); + // We must disable the image hijack canvas when using GPU rasterization but + // performing a resourceless software draw. Otherwise, we will attempt to + // use the GPU ImageDecodeController during software raster. + bool use_image_hijack_canvas = !use_gpu_rasterization_; + std::unique_ptr temp_software_renderer = SoftwareRenderer::Create(this, &settings_.renderer_settings, - output_surface_, NULL); + output_surface_, nullptr, + use_image_hijack_canvas); temp_software_renderer->DrawFrame( &frame->render_passes, active_tree_->device_scale_factor(), DeviceViewport(), DeviceClip(), disable_picture_quad_image_filtering); @@ -2130,9 +2136,9 @@ void LayerTreeHostImpl::CreateAndSetRenderer() { resource_provider_.get(), texture_mailbox_deleter_.get(), settings_.renderer_settings.highp_threshold_min); } else if (output_surface_->software_device()) { - renderer_ = - SoftwareRenderer::Create(this, &settings_.renderer_settings, - output_surface_, resource_provider_.get()); + renderer_ = SoftwareRenderer::Create( + this, &settings_.renderer_settings, output_surface_, + resource_provider_.get(), true /* use_image_hijack_canvas */); } DCHECK(renderer_); diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 1c29b6f6c1aed..c5e132c1ab0ef 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h @@ -210,6 +210,10 @@ class CC_EXPORT LayerTreeHostImpl void UpdateViewportContainerSizes(); + void set_resourceless_software_draw_for_testing() { + resourceless_software_draw_ = true; + } + struct CC_EXPORT FrameData : public RenderPassSink { FrameData(); ~FrameData() override; diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc index 7f6e735de531b..0f84bd17961ad 100644 --- a/cc/trees/layer_tree_host_unittest.cc +++ b/cc/trees/layer_tree_host_unittest.cc @@ -46,6 +46,7 @@ #include "cc/test/fake_video_frame_provider.h" #include "cc/test/geometry_test_utils.h" #include "cc/test/layer_tree_test.h" +#include "cc/test/skia_common.h" #include "cc/test/test_shared_bitmap_manager.h" #include "cc/test/test_web_graphics_context_3d.h" #include "cc/trees/layer_tree_host_impl.h" @@ -56,6 +57,7 @@ #include "third_party/khronos/GLES2/gl2.h" #include "third_party/khronos/GLES2/gl2ext.h" #include "third_party/skia/include/core/SkPicture.h" +#include "third_party/skia/include/gpu/GrContext.h" #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/geometry/vector2d_conversions.h" diff --git a/cc/trees/layer_tree_host_unittest_proxy.cc b/cc/trees/layer_tree_host_unittest_proxy.cc index 46a2d36e7d7ff..8c3779bffecde 100644 --- a/cc/trees/layer_tree_host_unittest_proxy.cc +++ b/cc/trees/layer_tree_host_unittest_proxy.cc @@ -280,64 +280,136 @@ PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedSetNeedsCommitWhileAnimating); class ProxyMainThreadedCommitWaitsForActivation : public ProxyMainThreaded { protected: - ProxyMainThreadedCommitWaitsForActivation() : commits_completed_(0) {} + ProxyMainThreadedCommitWaitsForActivation() : num_commits_(0) {} ~ProxyMainThreadedCommitWaitsForActivation() override {} void BeginTest() override { proxy()->SetNeedsCommit(); } void ScheduledActionCommit() override { - switch (commits_completed_) { + switch (num_commits_) { case 0: - // The first commit does not wait for activation. Verify that the - // completion event is cleared. - EXPECT_FALSE(GetProxyImplForTest()->HasCommitCompletionEvent()); - EXPECT_FALSE(GetProxyImplForTest()->GetNextCommitWaitsForActivation()); - // Set next commit waits for activation and start another commit. - commits_completed_++; PostNextCommitWaitsForActivationToMainThread(); PostSetNeedsCommitToMainThread(); break; case 1: - // The second commit should be held until activation. - EXPECT_TRUE(GetProxyImplForTest()->HasCommitCompletionEvent()); - EXPECT_TRUE(GetProxyImplForTest()->GetNextCommitWaitsForActivation()); - - // Start another commit to verify that this is not held until - // activation. - commits_completed_++; PostSetNeedsCommitToMainThread(); break; - case 2: - // The third commit should not wait for activation. - EXPECT_FALSE(GetProxyImplForTest()->HasCommitCompletionEvent()); - EXPECT_FALSE(GetProxyImplForTest()->GetNextCommitWaitsForActivation()); - - commits_completed_++; } + num_commits_++; } - void DidActivateSyncTree() override { - // The next_commit_waits_for_activation should have been cleared after the - // sync tree is activated. - EXPECT_FALSE(GetProxyImplForTest()->GetNextCommitWaitsForActivation()); - if (commits_completed_ == 3) - EndTest(); + void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { + CompletionEvent* activation_completion_event = + GetProxyImplForTest()->ActivationCompletionEventForTesting(); + switch (num_commits_) { + case 1: + EXPECT_FALSE(activation_completion_event); + break; + case 2: + EXPECT_TRUE(activation_completion_event); + EXPECT_FALSE(activation_completion_event->IsSignaled()); + break; + case 3: + EXPECT_FALSE(activation_completion_event); + EndTest(); + break; + } } void AfterTest() override { - // It is safe to read commits_completed_ on the main thread now since - // AfterTest() runs after the LayerTreeHost is destroyed and the impl thread - // tear down is finished. - EXPECT_EQ(3, commits_completed_); + // It is safe to read num_commits_ on the main thread now since AfterTest() + // runs after the LayerTreeHost is destroyed and the impl thread tear down + // is finished. + EXPECT_EQ(3, num_commits_); } private: - int commits_completed_; + int num_commits_; DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivation); }; PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivation); +// Test for a corner case of main frame before activation (MFBA) and commit +// waits for activation. If a commit (with wait for activation flag set) +// is ready before the activation for a previous commit then the activation +// should not signal the completion event of the second commit. +class ProxyMainThreadedCommitWaitsForActivationMFBA : public ProxyMainThreaded { + protected: + ProxyMainThreadedCommitWaitsForActivationMFBA() : num_commits_(0) {} + ~ProxyMainThreadedCommitWaitsForActivationMFBA() override {} + + void InitializeSettings(LayerTreeSettings* settings) override { + settings->main_frame_before_activation_enabled = true; + ProxyMainThreaded::InitializeSettings(settings); + } + + void BeginTest() override { proxy()->SetNeedsCommit(); } + + // This is called right before NotifyReadyToCommit. + void StartCommitOnImpl() override { + switch (num_commits_) { + case 0: + // Block activation until next commit is ready. + GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(true); + break; + case 1: + // Unblock activation of first commit after second commit is ready. + ImplThreadTaskRunner()->PostTask( + FROM_HERE, + base::Bind(&ProxyImplForTest::BlockNotifyReadyToActivateForTesting, + base::Unretained(GetProxyImplForTest()), false)); + break; + } + } + + void ScheduledActionCommit() override { + switch (num_commits_) { + case 0: + // Set next commit waits for activation and start another commit. + PostNextCommitWaitsForActivationToMainThread(); + PostSetNeedsCommitToMainThread(); + break; + case 1: + PostSetNeedsCommitToMainThread(); + break; + } + num_commits_++; + } + + void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { + CompletionEvent* activation_completion_event = + GetProxyImplForTest()->ActivationCompletionEventForTesting(); + switch (num_commits_) { + case 1: + EXPECT_FALSE(activation_completion_event); + break; + case 2: + EXPECT_TRUE(activation_completion_event); + EXPECT_FALSE(activation_completion_event->IsSignaled()); + break; + case 3: + EXPECT_FALSE(activation_completion_event); + EndTest(); + break; + } + } + + void AfterTest() override { + // It is safe to read num_commits_ on the main thread now since AfterTest() + // runs after the LayerTreeHost is destroyed and the impl thread tear down + // is finished. + EXPECT_EQ(3, num_commits_); + } + + private: + int num_commits_; + + DISALLOW_COPY_AND_ASSIGN(ProxyMainThreadedCommitWaitsForActivationMFBA); +}; + +PROXY_MAIN_THREADED_TEST_F(ProxyMainThreadedCommitWaitsForActivationMFBA); + } // namespace cc diff --git a/cc/trees/layer_tree_host_unittest_scroll.cc b/cc/trees/layer_tree_host_unittest_scroll.cc index ab4fab8c95bd6..8e15150b16e1f 100644 --- a/cc/trees/layer_tree_host_unittest_scroll.cc +++ b/cc/trees/layer_tree_host_unittest_scroll.cc @@ -1513,5 +1513,360 @@ TEST_F(LayerTreeHostScrollTestLayerStructureChange, ScrollDestroyWholeTree) { RunTest(CompositorMode::THREADED, false); } +class LayerTreeHostScrollTestScrollMFBA : public LayerTreeHostScrollTest { + public: + LayerTreeHostScrollTestScrollMFBA() + : initial_scroll_(10, 20), + second_scroll_(40, 5), + third_scroll_(20, 10), + scroll_amount_(2, -1), + num_commits_(0), + num_scrolls_(0) {} + + void InitializeSettings(LayerTreeSettings* settings) override { + settings->main_frame_before_activation_enabled = true; + } + + void BeginTest() override { + outer_viewport_container_layer_id_ = layer_tree_host() + ->outer_viewport_scroll_layer() + ->scroll_clip_layer() + ->id(); + layer_tree_host()->outer_viewport_scroll_layer()->SetScrollOffset( + initial_scroll_); + PostSetNeedsCommitToMainThread(); + } + + void StartCommitOnImpl() override { + switch (num_commits_) { + case 1: + // Ask for commit here because activation (and draw) will be blocked. + GetProxyImplForTest()->SetNeedsCommitOnImpl(); + // Block activation after second commit until third commit is ready. + GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(true); + break; + case 2: + // Unblock activation after third commit is ready. + GetProxyImplForTest()->BlockNotifyReadyToActivateForTesting(false); + break; + } + num_commits_++; + } + + void UpdateLayerTreeHost() override { + Layer* scroll_layer = layer_tree_host()->outer_viewport_scroll_layer(); + switch (layer_tree_host()->source_frame_number()) { + case 0: + EXPECT_VECTOR_EQ(initial_scroll_, scroll_layer->scroll_offset()); + break; + case 1: + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(initial_scroll_, scroll_amount_), + scroll_layer->scroll_offset()); + // Pretend like Javascript updated the scroll position itself. + scroll_layer->SetScrollOffset(second_scroll_); + break; + case 2: + // Third frame does not see a scroll delta because we only did one + // scroll for the second and third frames. + EXPECT_VECTOR_EQ(second_scroll_, scroll_layer->scroll_offset()); + // Pretend like Javascript updated the scroll position itself. + scroll_layer->SetScrollOffset(third_scroll_); + break; + } + } + + void DrawLayersOnThread(LayerTreeHostImpl* impl) override { + LayerImpl* scroll_layer = impl->OuterViewportScrollLayer(); + switch (impl->active_tree()->source_frame_number()) { + case 0: + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); + EXPECT_VECTOR_EQ(initial_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + Scroll(impl); + EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); + // Ask for commit after we've scrolled. + impl->SetNeedsCommit(); + break; + case 1: + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(scroll_layer)); + EXPECT_VECTOR_EQ(second_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + Scroll(impl); + EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); + break; + case 2: + // The scroll hasn't been consumed by the main thread. + EXPECT_VECTOR_EQ(scroll_amount_, ScrollDelta(scroll_layer)); + EXPECT_VECTOR_EQ(third_scroll_, ScrollTreeForLayer(scroll_layer) + ->GetScrollOffsetBaseForTesting( + scroll_layer->id())); + EndTest(); + break; + } + } + + void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, + const gfx::Vector2dF& outer_delta, + const gfx::Vector2dF& elastic_overscroll_delta, + float scale, + float top_controls_delta) override { + num_scrolls_++; + } + + void AfterTest() override { + EXPECT_EQ(3, num_commits_); + EXPECT_EQ(1, num_scrolls_); + } + + private: + void Scroll(LayerTreeHostImpl* impl) { + LayerImpl* root = impl->active_tree()->root_layer(); + LayerImpl* scroll_layer = impl->OuterViewportScrollLayer(); + + scroll_layer->SetScrollClipLayer(outer_viewport_container_layer_id_); + scroll_layer->SetBounds( + gfx::Size(root->bounds().width() + 100, root->bounds().height() + 100)); + scroll_layer->ScrollBy(scroll_amount_); + } + + gfx::ScrollOffset initial_scroll_; + gfx::ScrollOffset second_scroll_; + gfx::ScrollOffset third_scroll_; + gfx::Vector2dF scroll_amount_; + int num_commits_; + int num_scrolls_; + int outer_viewport_container_layer_id_; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollMFBA); + +class LayerTreeHostScrollTestScrollAbortedCommitMFBA + : public LayerTreeHostScrollTest { + public: + LayerTreeHostScrollTestScrollAbortedCommitMFBA() + : initial_scroll_(50, 60), + impl_scroll_(-3, 2), + second_main_scroll_(14, -3), + num_will_begin_main_frames_(0), + num_did_begin_main_frames_(0), + num_will_commits_(0), + num_did_commits_(0), + num_impl_commits_(0), + num_aborted_commits_(0), + num_impl_scrolls_(0), + num_draws_(0) {} + + void InitializeSettings(LayerTreeSettings* settings) override { + settings->main_frame_before_activation_enabled = true; + } + + void BeginTest() override { + layer_tree_host()->outer_viewport_scroll_layer()->SetScrollOffset( + initial_scroll_); + PostSetNeedsCommitToMainThread(); + } + + void SetupTree() override { + LayerTreeHostScrollTest::SetupTree(); + + gfx::Size scroll_layer_bounds(200, 200); + layer_tree_host()->outer_viewport_scroll_layer()->SetBounds( + scroll_layer_bounds); + layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f); + } + + void WillBeginMainFrame() override { + num_will_begin_main_frames_++; + Layer* root_scroll_layer = layer_tree_host()->outer_viewport_scroll_layer(); + switch (num_will_begin_main_frames_) { + case 1: + // This will not be aborted because of the initial prop changes. + EXPECT_EQ(0, num_impl_scrolls_); + EXPECT_EQ(0, layer_tree_host()->source_frame_number()); + EXPECT_VECTOR_EQ(initial_scroll_, root_scroll_layer->scroll_offset()); + break; + case 2: + // This commit will not be aborted because of the scroll change. + EXPECT_EQ(1, num_impl_scrolls_); + EXPECT_EQ(1, layer_tree_host()->source_frame_number()); + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(initial_scroll_, impl_scroll_), + root_scroll_layer->scroll_offset()); + root_scroll_layer->SetScrollOffset(gfx::ScrollOffsetWithDelta( + root_scroll_layer->scroll_offset(), second_main_scroll_)); + break; + case 3: { + // This commit will be aborted. + EXPECT_EQ(2, num_impl_scrolls_); + // The source frame number still increases even with the abort. + EXPECT_EQ(2, layer_tree_host()->source_frame_number()); + gfx::Vector2dF delta = + impl_scroll_ + impl_scroll_ + second_main_scroll_; + EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, delta), + root_scroll_layer->scroll_offset()); + break; + } + case 4: { + // This commit will also be aborted. + EXPECT_EQ(3, num_impl_scrolls_); + EXPECT_EQ(3, layer_tree_host()->source_frame_number()); + gfx::Vector2dF delta = + impl_scroll_ + impl_scroll_ + impl_scroll_ + second_main_scroll_; + EXPECT_VECTOR_EQ(gfx::ScrollOffsetWithDelta(initial_scroll_, delta), + root_scroll_layer->scroll_offset()); + break; + } + } + } + + void DidBeginMainFrame() override { num_did_begin_main_frames_++; } + + void WillCommit() override { num_will_commits_++; } + + void DidCommit() override { num_did_commits_++; } + + void BeginCommitOnThread(LayerTreeHostImpl* impl) override { + switch (num_impl_commits_) { + case 1: + // Redraw so that we keep scrolling. + impl->SetNeedsRedraw(); + // Block activation until third commit is aborted. + impl->BlockNotifyReadyToActivateForTesting(true); + break; + } + num_impl_commits_++; + } + + void BeginMainFrameAbortedOnThread(LayerTreeHostImpl* impl, + CommitEarlyOutReason reason) override { + switch (num_aborted_commits_) { + case 0: + EXPECT_EQ(2, num_impl_commits_); + // Unblock activation when third commit is aborted. + impl->BlockNotifyReadyToActivateForTesting(false); + break; + case 1: + EXPECT_EQ(2, num_impl_commits_); + // Redraw to end the test. + impl->SetNeedsRedraw(); + break; + } + num_aborted_commits_++; + } + + void DrawLayersOnThread(LayerTreeHostImpl* impl) override { + LayerImpl* root_scroll_layer = impl->OuterViewportScrollLayer(); + switch (impl->active_tree()->source_frame_number()) { + case 0: { + switch (num_impl_commits_) { + case 1: { + // First draw + EXPECT_VECTOR_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); + root_scroll_layer->ScrollBy(impl_scroll_); + EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); + EXPECT_VECTOR_EQ( + initial_scroll_, + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); + impl->SetNeedsCommit(); + break; + } + case 2: { + // Second draw but no new active tree because activation is blocked. + EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); + root_scroll_layer->ScrollBy(impl_scroll_); + EXPECT_VECTOR_EQ(impl_scroll_ + impl_scroll_, + ScrollDelta(root_scroll_layer)); + EXPECT_VECTOR_EQ( + initial_scroll_, + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); + // Ask for another commit (which will abort). + impl->SetNeedsCommit(); + break; + } + default: + NOTREACHED(); + } + break; + } + case 1: { + EXPECT_EQ(2, num_impl_commits_); + // All scroll deltas so far should be consumed. + EXPECT_EQ(gfx::Vector2d(), ScrollDelta(root_scroll_layer)); + switch (num_aborted_commits_) { + case 1: { + root_scroll_layer->ScrollBy(impl_scroll_); + EXPECT_VECTOR_EQ(impl_scroll_, ScrollDelta(root_scroll_layer)); + gfx::Vector2dF prev_delta = + impl_scroll_ + impl_scroll_ + second_main_scroll_; + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(initial_scroll_, prev_delta), + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); + // Ask for another commit (which will abort). + impl->SetNeedsCommit(); + break; + } + case 2: { + gfx::Vector2dF delta = impl_scroll_ + impl_scroll_ + impl_scroll_ + + second_main_scroll_; + EXPECT_VECTOR_EQ( + gfx::ScrollOffsetWithDelta(initial_scroll_, delta), + ScrollTreeForLayer(root_scroll_layer) + ->GetScrollOffsetBaseForTesting(root_scroll_layer->id())); + // End test after second aborted commit (fourth commit request). + EndTest(); + break; + } + } + break; + } + } + num_draws_++; + } + + void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, + const gfx::Vector2dF& outer_delta, + const gfx::Vector2dF& elastic_overscroll_delta, + float scale, + float top_controls_delta) override { + num_impl_scrolls_++; + } + + void AfterTest() override { + EXPECT_EQ(3, num_impl_scrolls_); + // Verify that the embedder sees aborted commits as real commits. + EXPECT_EQ(4, num_will_begin_main_frames_); + EXPECT_EQ(4, num_did_begin_main_frames_); + EXPECT_EQ(4, num_will_commits_); + EXPECT_EQ(4, num_did_commits_); + // ...but the compositor thread only sees two real ones. + EXPECT_EQ(2, num_impl_commits_); + // ...and two aborted ones. + EXPECT_EQ(2, num_aborted_commits_); + // ...and four draws. + EXPECT_EQ(4, num_draws_); + } + + private: + gfx::ScrollOffset initial_scroll_; + gfx::Vector2dF impl_scroll_; + gfx::Vector2dF second_main_scroll_; + int num_will_begin_main_frames_; + int num_did_begin_main_frames_; + int num_will_commits_; + int num_did_commits_; + int num_impl_commits_; + int num_aborted_commits_; + int num_impl_scrolls_; + int num_draws_; +}; + +MULTI_THREAD_TEST_F(LayerTreeHostScrollTestScrollAbortedCommitMFBA); + } // namespace } // namespace cc diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index e81647bc0a745..4248cccc9a741 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc @@ -830,8 +830,7 @@ bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { "cc", "LayerTreeImpl::UpdateDrawProperties::CalculateDrawProperties", "IsActive", IsActiveTree(), "SourceFrameNumber", source_frame_number_); bool can_render_to_separate_surface = - (layer_tree_host_impl_->GetDrawMode() != - DRAW_MODE_RESOURCELESS_SOFTWARE); + (!is_in_resourceless_software_draw_mode()); LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( root_layer(), DrawViewportSize(), @@ -944,7 +943,7 @@ bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { // Resourceless draw do not need tiles and should not affect existing tile // priorities. - if (layer_tree_host_impl_->GetDrawMode() != DRAW_MODE_RESOURCELESS_SOFTWARE) { + if (!is_in_resourceless_software_draw_mode()) { TRACE_EVENT_BEGIN2("cc", "LayerTreeImpl::UpdateDrawProperties::UpdateTiles", "IsActive", IsActiveTree(), "SourceFrameNumber", source_frame_number_); @@ -1656,9 +1655,12 @@ static bool PointIsClippedByAncestorClipNode( const LayerImpl* target_layer = layer->layer_tree_impl()->LayerById(transform_node->owner_id); - DCHECK(transform_node->id == 0 || target_layer->render_surface()); + DCHECK(transform_node->id == 0 || target_layer->render_surface() || + layer->layer_tree_impl()->is_in_resourceless_software_draw_mode()); gfx::Transform surface_screen_space_transform = - transform_node->id == 0 + transform_node->id == 0 || + (layer->layer_tree_impl() + ->is_in_resourceless_software_draw_mode()) ? gfx::Transform() : SurfaceScreenSpaceTransform(target_layer, transform_tree); if (!PointHitsRect(screen_space_point, surface_screen_space_transform, diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index c7b177fd28655..f67d934ef9e79 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h @@ -286,6 +286,11 @@ class CC_EXPORT LayerTreeImpl { return needs_update_draw_properties_; } + bool is_in_resourceless_software_draw_mode() { + return (layer_tree_host_impl_->GetDrawMode() == + DRAW_MODE_RESOURCELESS_SOFTWARE); + } + void set_needs_full_tree_sync(bool needs) { needs_full_tree_sync_ = needs; } bool needs_full_tree_sync() const { return needs_full_tree_sync_; } diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc index 03786a8494d95..44a934a2d8d89 100644 --- a/cc/trees/layer_tree_settings.cc +++ b/cc/trees/layer_tree_settings.cc @@ -85,6 +85,9 @@ LayerTreeSettings::LayerTreeSettings() max_untiled_layer_size(gfx::Size(512, 512)), minimum_occlusion_tracking_size(gfx::Size(160, 160)), // 3000 pixels should give sufficient area for prepainting. + // Note this value is specified with an ideal contents scale in mind. That + // is, the ideal tiling would use this value as the padding. + // TODO(vmpstr): Figure out a better number that doesn't depend on scale. tiling_interest_area_padding(3000), skewport_target_time_in_seconds(1.0f), skewport_extrapolation_limit_in_screen_pixels(2000), diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index ba8b1b89face8..bd824ed126629 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc @@ -1187,6 +1187,8 @@ void BuildPropertyTreesTopLevelInternal( data_for_recursion.property_trees->effect_id_to_index_map.clear(); data_for_recursion.property_trees->clip_id_to_index_map.clear(); data_for_recursion.property_trees->scroll_id_to_index_map.clear(); + data_for_recursion.property_trees->always_use_active_tree_opacity_effect_ids + .clear(); ClipNode root_clip; root_clip.data.resets_clip = true; diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc index 86ae77fbc115e..a2427061546e8 100644 --- a/cc/trees/proxy_impl.cc +++ b/cc/trees/proxy_impl.cc @@ -51,8 +51,9 @@ ProxyImpl::ProxyImpl( TaskRunnerProvider* task_runner_provider, std::unique_ptr external_begin_frame_source) : layer_tree_host_id_(layer_tree_host->id()), - next_commit_waits_for_activation_(false), + commit_completion_waits_for_activation_(false), commit_completion_event_(nullptr), + activation_completion_event_(nullptr), next_frame_is_newly_committed_frame_(false), inside_draw_(false), input_throttled_until_commit_(false), @@ -241,6 +242,16 @@ void ProxyImpl::MainFrameWillHappenOnImplForTesting( completion->Signal(); } +void ProxyImpl::BlockNotifyReadyToActivateForTesting(bool block) { + DCHECK(IsImplThread()); + layer_tree_host_impl_->BlockNotifyReadyToActivateForTesting(block); +} + +CompletionEvent* ProxyImpl::ActivationCompletionEventForTesting() { + DCHECK(IsImplThread()); + return activation_completion_event_; +} + void ProxyImpl::StartCommitOnImpl(CompletionEvent* completion, LayerTreeHost* layer_tree_host, base::TimeTicks main_thread_start_time, @@ -251,13 +262,6 @@ void ProxyImpl::StartCommitOnImpl(CompletionEvent* completion, DCHECK(scheduler_); DCHECK(scheduler_->CommitPending()); - if (hold_commit_for_activation) { - // This commit may be aborted. Store the value for - // hold_commit_for_activation so that whenever the next commit is started, - // the main thread will be unblocked only after pending tree activation. - next_commit_waits_for_activation_ = hold_commit_for_activation; - } - if (!layer_tree_host_impl_) { TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoLayerTree", TRACE_EVENT_SCOPE_THREAD); @@ -268,7 +272,10 @@ void ProxyImpl::StartCommitOnImpl(CompletionEvent* completion, // Ideally, we should inform to impl thread when BeginMainFrame is started. // But, we can avoid a PostTask in here. scheduler_->NotifyBeginMainFrameStarted(main_thread_start_time); + commit_completion_event_ = completion; + commit_completion_waits_for_activation_ = hold_commit_for_activation; + DCHECK(!blocked_main_commit().layer_tree_host); blocked_main_commit().layer_tree_host = layer_tree_host; scheduler_->NotifyReadyToCommit(); @@ -446,13 +453,11 @@ void ProxyImpl::DidActivateSyncTree() { TRACE_EVENT0("cc", "ProxyImpl::DidActivateSyncTreeOnImplThread"); DCHECK(IsImplThread()); - if (next_commit_waits_for_activation_) { + if (activation_completion_event_) { TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation", TRACE_EVENT_SCOPE_THREAD); - DCHECK(commit_completion_event_); - commit_completion_event_->Signal(); - commit_completion_event_ = nullptr; - next_commit_waits_for_activation_ = false; + activation_completion_event_->Signal(); + activation_completion_event_ = nullptr; } } @@ -549,15 +554,17 @@ void ProxyImpl::ScheduledActionCommit() { // blocked for a commit. blocked_main_commit().layer_tree_host = nullptr; - if (next_commit_waits_for_activation_) { - // For some layer types in impl-side painting, the commit is held until - // the sync tree is activated. It's also possible that the - // sync tree has already activated if there was no work to be done. + if (commit_completion_waits_for_activation_) { + // For some layer types in impl-side painting, the commit is held until the + // sync tree is activated. It's also possible that the sync tree has + // already activated if there was no work to be done. TRACE_EVENT_INSTANT0("cc", "HoldCommit", TRACE_EVENT_SCOPE_THREAD); + commit_completion_waits_for_activation_ = false; + activation_completion_event_ = commit_completion_event_; } else { commit_completion_event_->Signal(); - commit_completion_event_ = nullptr; } + commit_completion_event_ = nullptr; scheduler_->DidCommit(); diff --git a/cc/trees/proxy_impl.h b/cc/trees/proxy_impl.h index 06930a12274d8..d6583cde4d140 100644 --- a/cc/trees/proxy_impl.h +++ b/cc/trees/proxy_impl.h @@ -48,14 +48,16 @@ class CC_EXPORT ProxyImpl : public NON_EXPORTED_BASE(LayerTreeHostImplClient), virtual void SetVisibleOnImpl(bool visible); virtual void ReleaseOutputSurfaceOnImpl(CompletionEvent* completion); virtual void FinishGLOnImpl(CompletionEvent* completion); - virtual void MainFrameWillHappenOnImplForTesting( - CompletionEvent* completion, - bool* main_frame_will_happen); virtual void StartCommitOnImpl(CompletionEvent* completion, LayerTreeHost* layer_tree_host, base::TimeTicks main_thread_start_time, bool hold_commit_for_activation); + void MainFrameWillHappenOnImplForTesting(CompletionEvent* completion, + bool* main_frame_will_happen); + void BlockNotifyReadyToActivateForTesting(bool block); + CompletionEvent* ActivationCompletionEventForTesting(); + protected: // protected for testing. ProxyImpl(ChannelImpl* channel_impl, @@ -130,12 +132,14 @@ class CC_EXPORT ProxyImpl : public NON_EXPORTED_BASE(LayerTreeHostImplClient), std::unique_ptr scheduler_; // Set when the main thread is waiting on a pending tree activation. - bool next_commit_waits_for_activation_; + bool commit_completion_waits_for_activation_; - // Set when the main thread is waiting on a commit to complete or on a - // pending tree activation. + // Set when the main thread is waiting on a commit to complete. CompletionEvent* commit_completion_event_; + // Set when the main thread is waiting for activation to complete. + CompletionEvent* activation_completion_event_; + // Set when the next draw should post DidCommitAndDrawFrame to the main // thread. bool next_frame_is_newly_committed_frame_; diff --git a/chrome/VERSION b/chrome/VERSION index ecd56cc8cf83c..5815c9651793e 100644 --- a/chrome/VERSION +++ b/chrome/VERSION @@ -1,4 +1,4 @@ MAJOR=52 MINOR=0 BUILD=2743 -PATCH=0 +PATCH=116 diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml index 858b3f3da8dc2..1c74b6ed5e8c6 100644 --- a/chrome/android/java/AndroidManifest.xml +++ b/chrome/android/java/AndroidManifest.xml @@ -102,9 +102,15 @@ by a child template that "extends" this file. android:label="@string/app_name" android:largeHeap="false" android:allowBackup="true" - android:backupAgent="org.chromium.chrome.browser.ChromeBackupAgent" android:fullBackupContent="@xml/chromebackupscheme" + android:restoreAnyVersion="true" + {% block android_backup_agent %} + android:backupAgent="org.chromium.chrome.browser.ChromeBackupAgent" + {% endblock %} android:supportsRtl="true" + {% if target_sdk_version|int >= 24 %} + android:networkSecurityConfig="@xml/network_security_config" + {% endif %} {% block extra_application_attributes %}{% endblock %}> @@ -130,7 +136,8 @@ by a child template that "extends" this file. (shown in Android's Settings/Apps list) share the same label, we do not specify one here to allow it to inherit from the app. --> + android:theme="@android:style/Theme.Translucent.NoTitleBar" + android:relinquishTaskIdentity="true"> - - {% if channel in ['default', 'canary', 'dev', 'beta'] %} - - - - - - {% endif %} - diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml index 8e44ab3df47dc..e321e518b007f 100644 --- a/chrome/android/java/res/values/colors.xml +++ b/chrome/android/java/res/values/colors.xml @@ -145,8 +145,9 @@ #7f7f7f #db4437 - + #FFFFFF + #000000 #fafafa diff --git a/chrome/android/java/res/xml/network_security_config.xml b/chrome/android/java/res/xml/network_security_config.xml new file mode 100644 index 0000000000000..1d8c47060cfbf --- /dev/null +++ b/chrome/android/java/res/xml/network_security_config.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/chrome/android/java/res_template/xml/chromebackupscheme.xml b/chrome/android/java/res_template/xml/chromebackupscheme.xml index effae192e737b..32774788b3b93 100644 --- a/chrome/android/java/res_template/xml/chromebackupscheme.xml +++ b/chrome/android/java/res_template/xml/chromebackupscheme.xml @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index 748b7db050288..43fbdc8b1bc55 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java @@ -943,6 +943,21 @@ protected Drawable getBackgroundDrawable() { ApiCompatibilityUtils.getColor(getResources(), R.color.light_background_color)); } + @Override + public void finishNativeInitialization() { + // The window background color is used as the resizing background color in Android N+ + // multi-window mode. See crbug.com/602366. + if (Build.VERSION.CODENAME.equals("N") || Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { + getWindow().setBackgroundDrawable(new ColorDrawable( + ApiCompatibilityUtils.getColor(getResources(), + R.color.resizing_background_color))); + } else { + removeWindowBackground(); + } + + super.finishNativeInitialization(); + } + /** * Called when the accessibility status of this device changes. This might be triggered by * touch exploration or general accessibility status updates. It is an aggregate of two other @@ -1520,7 +1535,8 @@ public boolean onMenuOrKeyboardAction(int id, boolean fromMenu) { RecordUserAction.record("MobileToolbarReload"); } } else if (id == R.id.info_menu_id) { - WebsiteSettingsPopup.show(this, currentTab, null); + WebsiteSettingsPopup.show( + this, currentTab, null, WebsiteSettingsPopup.OPENED_FROM_MENU); } else if (id == R.id.open_history_menu_id) { currentTab.loadUrl( new LoadUrlParams(UrlConstants.HISTORY_URL, PageTransition.AUTO_TOPLEVEL)); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java index 8291ae8bc2560..0253c602d3d39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeApplication.java @@ -90,6 +90,7 @@ import org.chromium.chrome.browser.tabmodel.document.TabDelegate; import org.chromium.chrome.browser.util.FeatureUtilities; import org.chromium.content.app.ContentApplication; +import org.chromium.content.browser.ChildProcessCreationParams; import org.chromium.content.browser.ChildProcessLauncher; import org.chromium.content.browser.ContentViewStatics; import org.chromium.content.browser.DownloadController; @@ -192,7 +193,7 @@ private void startTimers() { * This is called during early initialization in order to set up ChildProcessLauncher * for certain Chrome packaging configurations */ - public ChildProcessLauncher.ChildProcessCreationParams getChildProcessCreationParams() { + public ChildProcessCreationParams getChildProcessCreationParams() { return null; } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java index a95ec53a1afed..ece5922e491f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java @@ -4,29 +4,47 @@ package org.chromium.chrome.browser; +import android.accounts.Account; +import android.accounts.AccountManager; import android.annotation.TargetApi; import android.app.backup.BackupAgent; import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; +import android.content.Context; import android.content.SharedPreferences; import android.os.Build; import android.os.ParcelFileDescriptor; import android.preference.PreferenceManager; +import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.base.StreamUtil; +import org.chromium.base.VisibleForTesting; +import org.chromium.base.annotations.SuppressFBWarnings; import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; import org.chromium.chrome.browser.firstrun.FirstRunStatus; +import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferences; import org.chromium.sync.signin.ChromeSigninController; +import org.json.JSONException; +import org.json.JSONObject; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Backup agent for Chrome, filters the restored backup to remove preferences that should not have - * been restored. + * been restored. Note: Nothing in this class can depend on the ChromeApplication instance having + * been created. During restore Android creates a special instance of the Chrome application with + * its own Android defined application class, which is not derived from ChromeApplication. */ @TargetApi(Build.VERSION_CODES.LOLLIPOP) public class ChromeBackupAgent extends BackupAgent { @@ -35,17 +53,71 @@ public class ChromeBackupAgent extends BackupAgent { // Lists of preferences that should be restored unchanged. - // TODO(aberent): At present this only restores the signed in user, and the FRE settings - // (whether is has been completed, and whether the user disabled crash dump reporting). It - // should restore all non-device specific aspects of the user's state. This will involve both - // restoring many more Android preferences and many Chrome preferences (in Chrome's JSON - // preference file). private static final String[] RESTORED_ANDROID_PREFS = { PrivacyPreferences.PREF_CRASH_DUMP_UPLOAD, FirstRunStatus.FIRST_RUN_FLOW_COMPLETE, FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_SETUP, }; + // Sync preferences, all in C++ sync_driver::prefs namespace. + // + // TODO(aberent): These should ideally use the constants that are used to access the preferences + // elsewhere, but those are currently only exist in C++, so doing so would require some + // reorganization. + private static final String[][] RESTORED_CHROME_PREFS = { + // kSyncFirstSetupComplete + {"sync", "has_setup_completed"}, + // kSyncKeepEverythingSynced + {"sync", "keep_everything_synced"}, + // kSyncAutofillProfile + {"sync", "autofill_profile"}, + // kSyncAutofillWallet + {"sync", "autofill_wallet"}, + // kSyncAutofillWalletMetadata + {"sync", "autofill_wallet_metadata"}, + // kSyncAutofill + {"sync", "autofill"}, + // kSyncBookmarks + {"sync", "bookmarks"}, + // kSyncDeviceInfo + {"sync", "device_info"}, + // kSyncFaviconImages + {"sync", "favicon_images"}, + // kSyncFaviconTracking + {"sync", "favicon_tracking"}, + // kSyncHistoryDeleteDirectives + {"sync", "history_delete_directives"}, + // kSyncPasswords + {"sync", "passwords"}, + // kSyncPreferences + {"sync", "preferences"}, + // kSyncPriorityPreferences + {"sync", "priority_preferences"}, + // kSyncSessions + {"sync", "sessions"}, + // kSyncSupervisedUserSettings + {"sync", "managed_user_settings"}, + // kSyncSupervisedUserSharedSettings + {"sync", "managed_user_shared_settings"}, + // kSyncSupervisedUserWhitelists + {"sync", "managed_user_whitelists"}, + // kSyncTabs + {"sync", "tabs"}, + // kSyncTypedUrls + {"sync", "typed_urls"}, + // kSyncSuppressStart + {"sync", "suppress_start"}, + }; + + private static final String[] DEFAULT_JSON_PREFS_FILE = { + // chrome::kInitialProfile + "Default", + // chrome::kPreferencesFilename + "Preferences", + }; + + private static boolean sAllowChromeApplication = false; + @Override public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) throws IOException { @@ -60,28 +132,156 @@ public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescri // Android Backup } + // May be overriden by downstream products that access account information in a different way. + protected Account[] getAccounts() { + Log.d(TAG, "Getting accounts from AccountManager"); + AccountManager manager = (AccountManager) getSystemService(ACCOUNT_SERVICE); + return manager.getAccounts(); + } + + private boolean accountExistsOnDevice(String userName) { + // This cannot use AccountManagerHelper, since that depends on ChromeApplication. + for (Account account : getAccounts()) { + if (account.name.equals(userName)) return true; + } + return false; + } + @Override public void onRestoreFinished() { + if (getApplicationContext() instanceof ChromeApplication && !sAllowChromeApplication) { + // This should never happen in real use, but will happen during testing if Chrome is + // already running (even in background, started to provide a service, for example). + Log.w(TAG, "Running with wrong type of Application class"); + return; + } + // This is running without a ChromeApplication instance, so this has to be done here. + ContextUtils.initApplicationContext(getApplicationContext()); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(ChromeBackupAgent.this); - Set prefNames = sharedPrefs.getAll().keySet(); // Save the user name for later restoration. String userName = sharedPrefs.getString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, null); + Log.d(TAG, "Previous signed in user name = " + userName); + + File prefsFile = this.getDir(ChromeBrowserInitializer.PRIVATE_DATA_DIRECTORY_SUFFIX, + Context.MODE_PRIVATE); + for (String name : DEFAULT_JSON_PREFS_FILE) { + prefsFile = new File(prefsFile, name); + } + + // If the user hasn't signed in, or can't sign in, then don't restore anything. + if (userName == null || !accountExistsOnDevice(userName)) { + clearAllPrefs(sharedPrefs, prefsFile); + Log.d(TAG, "onRestoreFinished complete, nothing restored"); + return; + } + + // Check that the file has been restored. + if (!filterChromePrefs(prefsFile)) { + // The preferences are corrupt, for safety delete all of them + clearAllPrefs(sharedPrefs, prefsFile); + Log.d(TAG, "onRestoreFinished failed"); + return; + } + restoreAndroidPrefs(sharedPrefs, userName); + + Log.d(TAG, "onRestoreFinished complete"); + } + + private void clearAllPrefs(SharedPreferences sharedPrefs, File prefsFile) { + deleteFileIfPossible(prefsFile); + sharedPrefs.edit().clear().commit(); + } + + private boolean restoreAndroidPrefs(SharedPreferences sharedPrefs, String userName) { + Set prefNames = sharedPrefs.getAll().keySet(); SharedPreferences.Editor editor = sharedPrefs.edit(); // Throw away prefs we don't want to restore. Set restoredPrefs = new HashSet<>(Arrays.asList(RESTORED_ANDROID_PREFS)); for (String pref : prefNames) { - Log.d(TAG, "Checking pref " + pref); if (!restoredPrefs.contains(pref)) editor.remove(pref); } // Because FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_COMPLETE is not restored Chrome // will sign in the user on first run to the account in FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME // if any. If the rest of FRE has been completed this will happen silently. - if (userName != null) { - editor.putString(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME, userName); - } + editor.putString(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_ACCOUNT_NAME, userName); boolean commitResult = editor.commit(); + return commitResult; + } + + private boolean filterChromePrefs(File prefsFile) { + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = openInputStream(prefsFile); + int fileLength = (int) getFileLength(prefsFile); + byte[] buffer = new byte[fileLength]; + if (inputStream.read(buffer) != fileLength) return false; + JSONObject jsonInput = new JSONObject(new String(buffer, "UTF-8")); + JSONObject jsonOutput = new JSONObject(); + for (String[] pref : RESTORED_CHROME_PREFS) { + Object prefValue = readChromePref(jsonInput, pref); + if (prefValue != null) writeChromePref(jsonOutput, pref, prefValue); + } + byte[] outputBytes = jsonOutput.toString().getBytes("UTF-8"); + outputStream = openOutputStream(prefsFile); + outputStream.write(outputBytes); + return true; + } catch (IOException | JSONException e) { + Log.d(TAG, "Filtering preferences failed with %s", e.getMessage()); + return false; + } finally { + StreamUtil.closeQuietly(inputStream); + StreamUtil.closeQuietly(outputStream); + } + } + + @VisibleForTesting + protected long getFileLength(File prefsFile) { + return prefsFile.length(); + } + + @VisibleForTesting + protected InputStream openInputStream(File prefsFile) throws FileNotFoundException { + return new FileInputStream(prefsFile); + } + + @VisibleForTesting + protected OutputStream openOutputStream(File prefsFile) throws FileNotFoundException { + return new FileOutputStream(prefsFile); + } + + private Object readChromePref(JSONObject json, String pref[]) { + JSONObject finalParent = json; + for (int i = 0; i < pref.length - 1; i++) { + finalParent = finalParent.optJSONObject(pref[i]); + if (finalParent == null) return null; + } + return finalParent.opt(pref[pref.length - 1]); + } + + private void writeChromePref(JSONObject json, String[] prefPath, Object value) + throws JSONException { + JSONObject finalParent = json; + for (int i = 0; i < prefPath.length - 1; i++) { + JSONObject prevParent = finalParent; + finalParent = prevParent.optJSONObject(prefPath[i]); + if (finalParent == null) { + finalParent = new JSONObject(); + prevParent.put(prefPath[i], finalParent); + } + } + finalParent.put(prefPath[prefPath.length - 1], value); + } + + @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE") + private void deleteFileIfPossible(File file) { + // Ignore result. There is nothing else we can do if the delete fails. + file.delete(); + } - Log.d(TAG, "onRestoreFinished complete; commit result = " + commitResult); + @VisibleForTesting + static void allowChromeApplicationForTesting() { + sAllowChromeApplication = true; } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java index 35d77ec8344a3..31828cbacbe99 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeServiceTabLauncher.java @@ -83,6 +83,9 @@ protected final Intent doInBackground(Void... nothing) { @Override protected final void onPostExecute(Intent intent) { + // Replace the web app URL with the URL from the notification. This is + // within the webapp's scope, so it is valid. + intent.putExtra(ShortcutHelper.EXTRA_URL, url); intent.putExtra(ShortcutHelper.EXTRA_SOURCE, ShortcutSource.NOTIFICATION); tabDelegate.createNewStandaloneFrame(intent); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index e7b5d02ce67be..d330606d19306 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java @@ -521,8 +521,6 @@ public void onClick(View v) { } }); - removeWindowBackground(); - if (isTablet()) { EmptyBackgroundViewWrapper bgViewWrapper = new EmptyBackgroundViewWrapper( getTabModelSelector(), getTabCreator(false), ChromeTabbedActivity.this, @@ -558,7 +556,8 @@ public void initializeState() { Intent intent = getIntent(); - CipherFactory.getInstance().restoreFromBundle(getSavedInstanceState()); + boolean hadCipherData = + CipherFactory.getInstance().restoreFromBundle(getSavedInstanceState()); boolean noRestoreState = CommandLine.getInstance().hasSwitch(ChromeSwitches.NO_RESTORE_STATE); @@ -569,7 +568,10 @@ public void initializeState() { // State should be clear when we start first run and hence we do not need to load // a previous state. This may change the current Model, watch out for initialization // based on the model. - mTabModelSelectorImpl.loadState(); + // Never attempt to restore incognito tabs when this activity was previously swiped + // away in Recents. http://crbug.com/626629 + boolean ignoreIncognitoFiles = !hadCipherData; + mTabModelSelectorImpl.loadState(ignoreIncognitoFiles); } mIntentWithEffect = false; @@ -1098,8 +1100,7 @@ private void moveTabToOtherWindow(Tab tab) { if (targetActivity == null) return; Intent intent = new Intent(this, targetActivity); - intent.setClass(this, targetActivity); - intent.setFlags(MultiWindowUtils.FLAG_ACTIVITY_LAUNCH_ADJACENT); + MultiWindowUtils.setOpenInOtherWindowIntentExtras(intent, this, targetActivity); tab.detachAndStartReparenting(intent, null, null); } @@ -1237,10 +1238,12 @@ private Tab launchIntent(String url, String referer, String headers, getToolbarManager().finishAnimations(); } if (TextUtils.equals(externalAppId, getPackageName())) { - // If the intent was launched by chrome, open the new tab in the current model. + // If the intent was launched by chrome, open the new tab in the appropriate model. // Using FROM_LINK ensures the tab is parented to the current tab, which allows // the back button to close these tabs and restore selection to the previous tab. - return getCurrentTabCreator().launchUrl(url, TabLaunchType.FROM_LINK, intent, + boolean isIncognito = IntentUtils.safeGetBooleanExtra(intent, + IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, false); + return getTabCreator(isIncognito).launchUrl(url, TabLaunchType.FROM_LINK, intent, mIntentHandlingTimeMs); } else { return getTabCreator(false).launchUrlFromExternalApp(url, referer, headers, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java index 3eab85dd88600..f3184e3674cb5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/DeferredStartupHandler.java @@ -7,7 +7,6 @@ import android.content.Context; import android.os.AsyncTask; import android.os.SystemClock; -import android.text.TextUtils; import org.chromium.base.FieldTrialList; import org.chromium.base.PowerMonitor; @@ -20,8 +19,12 @@ import org.chromium.chrome.browser.crash.CrashFileManager; import org.chromium.chrome.browser.crash.MinidumpUploadService; import org.chromium.chrome.browser.media.MediaCaptureNotificationService; +import org.chromium.chrome.browser.metrics.LaunchMetrics; import org.chromium.chrome.browser.metrics.UmaUtils; +import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; +import org.chromium.chrome.browser.partnercustomizations.HomepageManager; +import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations; import org.chromium.chrome.browser.physicalweb.PhysicalWeb; import org.chromium.chrome.browser.precache.PrecacheLauncher; import org.chromium.chrome.browser.preferences.ChromePreferenceManager; @@ -106,6 +109,16 @@ protected Void doInBackground(Void... params) { AfterStartupTaskUtils.setStartupComplete(); + PartnerBrowserCustomizations.setOnInitializeAsyncFinished(new Runnable() { + @Override + public void run() { + String homepageUrl = HomepageManager.getHomepageUri(application); + LaunchMetrics.recordHomePageLaunchMetrics( + HomepageManager.isHomepageEnabled(application), + NewTabPage.isNTPUrl(homepageUrl), homepageUrl); + } + }); + // TODO(aruslan): http://b/6397072 This will be moved elsewhere PartnerBookmarksShim.kickOffReading(application); @@ -137,14 +150,6 @@ protected Void doInBackground(Void... params) { mDeferredStartupComplete = true; } - private static float parseFloat(String value, float defaultValue) { - try { - return TextUtils.isEmpty(value) ? defaultValue : Float.parseFloat(value); - } catch (NumberFormatException e) { - return defaultValue; - } - } - private static void startModerateBindingManagementIfNeeded(Context context) { // Moderate binding doesn't apply to low end devices. if (SysUtils.isLowEndDevice()) return; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java index 3d4c3acbe0547..305b302e69d02 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java @@ -529,9 +529,17 @@ public CreditCard getCreditCard(String guid) { public String setCreditCard(CreditCard card) { ThreadUtils.assertOnUiThread(); + assert card.getIsLocal(); return nativeSetCreditCard(mPersonalDataManagerAndroid, card); } + @VisibleForTesting + public void addServerCreditCardForTest(CreditCard card) { + ThreadUtils.assertOnUiThread(); + assert !card.getIsLocal(); + nativeAddServerCreditCardForTest(mPersonalDataManagerAndroid, card); + } + public void deleteCreditCard(String guid) { ThreadUtils.assertOnUiThread(); nativeRemoveByGUID(mPersonalDataManagerAndroid, guid); @@ -601,6 +609,8 @@ private native CreditCard nativeGetCreditCardByGUID(long nativePersonalDataManag String guid); private native String nativeSetCreditCard(long nativePersonalDataManagerAndroid, CreditCard card); + private native void nativeAddServerCreditCardForTest(long nativePersonalDataManagerAndroid, + CreditCard card); private native void nativeRemoveByGUID(long nativePersonalDataManagerAndroid, String guid); private native void nativeClearUnmaskedCache( long nativePersonalDataManagerAndroid, String guid); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java index b00d830ab891c..e671ecac595ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUtils.java @@ -14,15 +14,15 @@ import android.text.TextUtils; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.CommandLine; import org.chromium.base.ContextUtils; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeSwitches; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.UrlConstants; +import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.ntp.NewTabPageUma; import org.chromium.chrome.browser.snackbar.Snackbar; import org.chromium.chrome.browser.snackbar.SnackbarManager; @@ -257,7 +257,15 @@ private static void openUrl(Activity activity, String url, ComponentName compone intent.putExtra(Browser.EXTRA_APPLICATION_ID, activity.getApplicationContext().getPackageName()); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setComponent(componentName); + + if (componentName != null) { + intent.setComponent(componentName); + } else { + // If the bookmark manager is shown in a tab on a phone (rather than in a separate + // activity) the component name may be null. Send the intent through + // ChromeLauncherActivity instead to avoid crashing. See crbug.com/615012. + intent.setClass(activity, ChromeLauncherActivity.class); + } IntentHandler.startActivityForTrustedIntent(intent, activity); } @@ -285,8 +293,6 @@ public static void finishActivityOnPhone(Context context) { * @return Whether "all bookmarks" section is enabled. */ static boolean isAllBookmarksViewEnabled() { - String flag = CommandLine.getInstance() - .getSwitchValue(ChromeSwitches.ENABLE_ALL_BOOKMARKS_VIEW, "false"); - return flag.equals("true"); + return ChromeFeatureList.isEnabled("AllBookmarks"); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java index 7f97254ba4618..476d503a5ef87 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java @@ -35,11 +35,9 @@ import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.partnerbookmarks.PartnerBookmarksShim; import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.util.IntentUtils; import org.chromium.chrome.browser.widget.RoundedIconGenerator; import org.chromium.components.bookmarks.BookmarkId; -import org.chromium.components.bookmarks.BookmarkType; import java.util.ArrayList; import java.util.Collections; @@ -64,7 +62,7 @@ public class BookmarkWidgetService extends RemoteViewsService { private static final String TAG = "BookmarkWidget"; private static final String ACTION_CHANGE_FOLDER_SUFFIX = ".CHANGE_FOLDER"; - private static final String PREF_CURRENT_FOLDER = "current_folder"; + private static final String PREF_CURRENT_FOLDER = "bookmarkswidget.current_folder"; private static final String EXTRA_FOLDER_ID = "folderId"; @UiThread @@ -101,10 +99,10 @@ static void deleteWidgetState(Context context, int widgetId) { static void changeFolder(Context context, Intent intent) { int widgetId = IntentUtils.safeGetIntExtra(intent, AppWidgetManager.EXTRA_APPWIDGET_ID, -1); - long folderId = IntentUtils.safeGetLongExtra(intent, EXTRA_FOLDER_ID, -1); - if (widgetId >= 0 && folderId >= 0) { + String serializedFolder = IntentUtils.safeGetStringExtra(intent, EXTRA_FOLDER_ID); + if (widgetId >= 0 && serializedFolder != null) { SharedPreferences prefs = getWidgetState(context, widgetId); - prefs.edit().putLong(PREF_CURRENT_FOLDER, folderId).apply(); + prefs.edit().putString(PREF_CURRENT_FOLDER, serializedFolder).apply(); AppWidgetManager.getInstance(context) .notifyAppWidgetViewDataChanged(widgetId, R.id.bookmarks_list); } @@ -124,11 +122,6 @@ private static class Bookmark { public static Bookmark fromBookmarkItem(BookmarkItem item) { if (item == null) return null; - // The bookmarks widget doesn't support showing partner bookmarks. The main hurdle is - // that the current folder ID is stored in shared prefs as a long, not a BookmarkId. - // This support could be added if there's a strong desire. - if (item.getId().getType() == BookmarkType.PARTNER) return null; - Bookmark bookmark = new Bookmark(); bookmark.title = item.getTitle(); bookmark.url = item.getUrl(); @@ -333,8 +326,8 @@ public void bookmarkModelChanged() { private boolean isWidgetNewlyCreated() { // This method relies on the fact that PREF_CURRENT_FOLDER is not yet // set when onCreate is called for a newly created widget. - long currentFolder = mPreferences.getLong(PREF_CURRENT_FOLDER, Tab.INVALID_BOOKMARK_ID); - return currentFolder == Tab.INVALID_BOOKMARK_ID; + String serializedFolder = mPreferences.getString(PREF_CURRENT_FOLDER, null); + return serializedFolder == null; } @UiThread @@ -374,18 +367,11 @@ public void onDataSetChanged() { @BinderThread private void updateBookmarkList() { - long folderIdLong = mPreferences.getLong(PREF_CURRENT_FOLDER, Tab.INVALID_BOOKMARK_ID); - BookmarkId folderId = folderIdLong != Tab.INVALID_BOOKMARK_ID - ? new BookmarkId(folderIdLong, BookmarkType.NORMAL) - : null; - + BookmarkId folderId = BookmarkId + .getBookmarkIdFromString(mPreferences.getString(PREF_CURRENT_FOLDER, null)); mCurrentFolder = loadBookmarks(folderId); - - mPreferences.edit() - .putLong(PREF_CURRENT_FOLDER, mCurrentFolder != null - ? mCurrentFolder.folder.id.getId() - : Tab.INVALID_BOOKMARK_ID) - .apply(); + mPreferences.edit().putString(PREF_CURRENT_FOLDER, mCurrentFolder.folder.id.toString()) + .apply(); } @BinderThread @@ -469,9 +455,9 @@ public RemoteViews getViewAt(int position) { String title = bookmark.title; String url = bookmark.url; - long id = (bookmark == mCurrentFolder.folder) - ? mCurrentFolder.parent.id.getId() - : bookmark.id.getId(); + BookmarkId id = (bookmark == mCurrentFolder.folder) + ? mCurrentFolder.parent.id + : bookmark.id; RemoteViews views = new RemoteViews(mContext.getPackageName(), R.layout.bookmark_widget_item); @@ -491,7 +477,7 @@ public RemoteViews getViewAt(int position) { if (bookmark.isFolder) { fillIn = new Intent(getChangeFolderAction(mContext)) .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId) - .putExtra(EXTRA_FOLDER_ID, id); + .putExtra(EXTRA_FOLDER_ID, id.toString()); } else { fillIn = new Intent(Intent.ACTION_VIEW); if (!TextUtils.isEmpty(url)) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/OWNERS new file mode 100644 index 0000000000000..fc6a6efc1f0a2 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/OWNERS @@ -0,0 +1 @@ +ianwen@chromium.org \ No newline at end of file diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index f7ec706ecbad6..4790dc6ac55ee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java @@ -449,9 +449,10 @@ public void onContentOffsetChanged(float offset) { } @Override - public void onVisibleContentOffsetChanged(float offset) { + public void onVisibleContentOffsetChanged(float offset, boolean needsAnimate) { mLastVisibleContentOffset = offset; propagateViewportToLayouts(getWidth(), getHeight()); + if (needsAnimate) requestRender(); } @Override diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java index c78ef3f34080b..5dd539b41b8c7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanel.java @@ -121,6 +121,9 @@ public enum StateChangeReason { /** If the panel should be ignoring swipe events (for compatibility mode). */ private boolean mIgnoreSwipeEvents; + /** This is used to make sure there is one show request to one close request. */ + private boolean mPanelShown; + // ============================================================================================ // Constructor // ============================================================================================ @@ -159,6 +162,7 @@ protected void destroyComponents() { @Override protected void onClosed(StateChangeReason reason) { + mPanelShown = false; setBasePageTextControlsVisibility(true); destroyComponents(); mPanelManager.notifyPanelClosed(this, reason); @@ -184,7 +188,8 @@ public boolean isExpanded() { @Override public void closePanel(StateChangeReason reason, boolean animate) { - if (!isShowing()) return; + // If the panel hasn't peeked, then it shouldn't need to close. + if (!mPanelShown) return; super.closePanel(reason, animate); } @@ -194,7 +199,7 @@ public void closePanel(StateChangeReason reason, boolean animate) { * @param reason The reason the panel is being shown. */ public void requestPanelShow(StateChangeReason reason) { - if (isShowing()) return; + if (mPanelShown) return; if (mPanelManager != null) { mPanelManager.requestPanelShow(this, reason); @@ -205,6 +210,10 @@ public void requestPanelShow(StateChangeReason reason) { public void peekPanel(StateChangeReason reason) { // TODO(mdjones): This is making a protected API public and should be removed. Animation // should only be controlled by the OverlayPanelManager. + + // Since the OverlayPanelManager can show panels without requestPanelShow being called, the + // flag for the panel being shown should be set to true here. + mPanelShown = true; super.peekPanel(reason); } @@ -288,8 +297,9 @@ protected float getTopControlsOffsetDp() { } /** - * Set the visibility of the base page text selection controls. - * TODO(mdjones): This should be replaced be focusing the panel's ContentViewCore. + * Set the visibility of the base page text selection controls. This will also attempt to + * remove focus from the base page to clear any open controls. + * TODO(mdjones): This should be replaced with focusing the panel's ContentViewCore. * @param visible If the text controls are visible. */ protected void setBasePageTextControlsVisibility(boolean visible) { @@ -299,10 +309,16 @@ protected void setBasePageTextControlsVisibility(boolean visible) { if (baseContentView == null) return; // If the panel does not have focus or isn't open, return. - if (isPanelOpened() && mDidClearTextControls && visible) return; - if (!isPanelOpened() && !mDidClearTextControls && !visible) return; + if (isPanelOpened() && mDidClearTextControls && !visible) return; + if (!isPanelOpened() && !mDidClearTextControls && visible) return; mDidClearTextControls = !visible; + + if (!visible) { + baseContentView.preserveSelectionOnNextLossOfFocus(); + baseContentView.getContainerView().clearFocus(); + } + baseContentView.updateTextSelectionUI(visible); } @@ -681,7 +697,7 @@ public float getContentY() { * @param y The y coordinate in dp. * @return Whether the given coordinate is inside the Overlay Panel area. */ - private boolean isCoordinateInsideOverlayPanel(float x, float y) { + public boolean isCoordinateInsideOverlayPanel(float x, float y) { return y >= getOffsetY() && y <= (getOffsetY() + getHeight()) && x >= getOffsetX() && x <= (getOffsetX() + getWidth()); } @@ -797,9 +813,32 @@ public EventFilter getEventFilter() { @Override public void onSizeChanged(float width, float height, float visibleViewportOffsetY, int orientation) { + resizePanelContentViewCore(width, height); onSizeChanged(width, height); } + /** + * Resize the panel's ContentViewCore manually since it is not attached to the view hierarchy. + * TODO(mdjones): Remove the need for this method by supporting multiple ContentViewCores + * existing simultaneously in the view hierarchy. + * @param width The new width in dp. + * @param height The new height in dp. + */ + private void resizePanelContentViewCore(float width, float height) { + if (!isShowing()) return; + ContentViewCore panelContent = getContentViewCore(); + if (panelContent != null) { + // Take the height of the toolbar into consideration. + int toolbarHeightPx = getTopControlsOffsetDp() > 0 + ? 0 : (int) (getToolbarHeight() / mPxToDp); + panelContent.onSizeChanged((int) (width / mPxToDp), + (int) (height / mPxToDp) + toolbarHeightPx, panelContent.getViewportWidthPix(), + panelContent.getViewportHeightPix()); + panelContent.onPhysicalBackingSizeChanged( + (int) (width / mPxToDp), (int) (height / mPxToDp)); + } + } + @Override public void getVirtualViews(List views) { // TODO(mdjones): Add views for accessibility. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java index 7e964257255f5..132d85eb51dc0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelAnimation.java @@ -36,39 +36,25 @@ protected enum Property { */ public static final long BASE_ANIMATION_DURATION_MS = 218; - /** - * The maximum animation duration in milliseconds. - */ + /** The maximum animation duration in milliseconds. */ public static final long MAXIMUM_ANIMATION_DURATION_MS = 350; - /** - * The minimum animation duration in milliseconds. - */ + /** The minimum animation duration in milliseconds. */ private static final long MINIMUM_ANIMATION_DURATION_MS = Math.round(7 * 1000 / 60); - /** - * Average animation velocity in dps per second. - */ + /** Average animation velocity in dps per second. */ private static final float INITIAL_ANIMATION_VELOCITY_DP_PER_SECOND = 1750f; - /** - * The PanelState to which the Panel is being animated. - */ + /** The PanelState to which the Panel is being animated. */ private PanelState mAnimatingState; - /** - * The StateChangeReason for which the Panel is being animated. - */ + /** The StateChangeReason for which the Panel is being animated. */ private StateChangeReason mAnimatingStateReason; - /** - * The animation set. - */ + /** The animation set. */ private ChromeAnimation> mLayoutAnimations; - /** - * The {@link LayoutUpdateHost} used to request a new frame to be updated and rendered. - */ + /** The {@link LayoutUpdateHost} used to request a new frame to be updated and rendered. */ private final LayoutUpdateHost mUpdateHost; // ============================================================================================ @@ -141,7 +127,11 @@ protected void handleSizeChanged(float width, float height, float previousWidth) if (!isShowing()) return; boolean wasFullWidthSizePanel = doesMatchFullWidthCriteria(previousWidth); - boolean isPanelResizeSupported = isFullWidthSizePanel() && wasFullWidthSizePanel; + boolean isFullWidthSizePanel = isFullWidthSizePanel(); + // We support resize from any full width to full width, or from narrow width to narrow width + // when the width does not change (as when the keyboard is shown/hidden). + boolean isPanelResizeSupported = isFullWidthSizePanel && wasFullWidthSizePanel + || !isFullWidthSizePanel && !wasFullWidthSizePanel && width == previousWidth; // TODO(pedrosimonetti): See crbug.com/568351. // We can't keep the panel opened after a viewport size change when the panel's @@ -422,7 +412,9 @@ protected void onAnimationFinished() { // is cancelled (which can happen by a subsequent gesture while // an animation is happening). That's why the actual height should // be checked. - if (mAnimatingState != PanelState.UNDEFINED + // TODO(mdjones): Move animations not directly related to the panel's state into their + // own animation handler (i.e. peek promo, G sprite, etc.). See https://crbug.com/617307. + if (mAnimatingState != null && mAnimatingState != PanelState.UNDEFINED && getHeight() == getPanelHeightFromState(mAnimatingState)) { setPanelState(mAnimatingState, mAnimatingStateReason); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java index b87827a708744..396cba5343ec6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java @@ -277,7 +277,7 @@ public boolean isShowing() { * than the peeking height. */ public boolean isPanelOpened() { - return mHeight > mBarHeightPeeking; + return mHeight > getBarContainerHeight(); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java index 1e2e9bf80a6b5..aea26113e0816 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java @@ -130,7 +130,7 @@ public void setSearchTerm(String searchTerm) { } /** - * Sets the caption to display in the control and shows the caption. + * Sets the caption to display in the control and sets the caption visible. * @param caption The caption to display. */ public void setCaption(String caption) { @@ -138,10 +138,20 @@ public void setCaption(String caption) { } /** - * @return The current opacity of the Caption control. + * Gets the current animation percentage for the Caption control, which guides the vertical + * position and opacity of the caption. + * @return The animation percentage ranging from 0.0 to 1.0. + * + */ + public float getCaptionAnimationPercentage() { + return mCaptionControl.getAnimationPercentage(); + } + + /** + * @return Whether the caption control is visible. */ - public float getCaptionOpacity() { - return mCaptionControl.getOpacity(); + public boolean getCaptionVisible() { + return mCaptionControl.getIsVisible(); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java index 6e1ea763fbd05..311be68c0b02c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java @@ -20,8 +20,8 @@ * as a dynamic resource. */ public class ContextualSearchCaptionControl extends OverlayPanelInflater { - private static final float CAPTION_OPACITY_OPAQUE = 1.f; - private static final float CAPTION_OPACITY_TRANSPARENT = 0.f; + private static final float ANIMATION_PERCENTAGE_ZERO = 0.f; + private static final float ANIMATION_PERCENTAGE_COMPLETE = 1.f; /** * The caption View. @@ -34,9 +34,14 @@ public class ContextualSearchCaptionControl extends OverlayPanelInflater { private boolean mIsVisible; /** - * The caption opacity. + * The caption animation percentage, which controls how and where to draw. */ - private float mOpacity; + private float mAnimationPercentage; + + /** + * Whether a new snapshot has been captured by the system yet. + */ + private boolean mDidCapture; /** * @param panel The panel. @@ -56,6 +61,8 @@ public ContextualSearchCaptionControl(OverlayPanel panel, Context context, ViewG * e.g. a Quick Answer. */ public void setCaption(String caption) { + mDidCapture = false; + inflate(); mCaption.setText(sanitizeText(caption)); @@ -69,10 +76,7 @@ public void setCaption(String caption) { */ public void hide() { mIsVisible = false; - mOpacity = CAPTION_OPACITY_TRANSPARENT; - - // Snapshot the transparent caption. - invalidate(); + mAnimationPercentage = ANIMATION_PERCENTAGE_ZERO; } /** @@ -80,18 +84,34 @@ public void hide() { */ private void show() { mIsVisible = true; - // When the Panel is in transition it will get the right opacity during the - // state transition update. + // When the Panel is in transition it will get the right animation percentage during the + // state-transition update. if (mOverlayPanel.isPeeking()) { - mOpacity = CAPTION_OPACITY_OPAQUE; + mAnimationPercentage = ANIMATION_PERCENTAGE_COMPLETE; } } /** - * @return The current opacity of the Caption. + * Controls whether the caption is visible and can be rendered. + * The caption must be visible in order to draw it and take a snapshot. + * Even though the caption is visible the user might not be able to see it due to a + * completely transparent opacity associated with an animation percentage of zero. + * @return Whether the caption is visible or not. + */ + public boolean getIsVisible() { + return mIsVisible; + } + + /** + * Gets the animation percentage which controls the drawing of the caption and how high to + * position it in the Bar. + * @return The current percentage ranging from 0.0 to 1.0. */ - public float getOpacity() { - return mOpacity; + public float getAnimationPercentage() { + // If we don't yet have a snapshot captured, stay at zero. See crbug.com/608914. + if (!mDidCapture) return ANIMATION_PERCENTAGE_ZERO; + + return mAnimationPercentage; } /** @@ -101,7 +121,7 @@ public float getOpacity() { public void onUpdateFromCloseToPeek(float percentage) { if (!mIsVisible) return; - mOpacity = CAPTION_OPACITY_OPAQUE; + mAnimationPercentage = ANIMATION_PERCENTAGE_COMPLETE; } /** @@ -112,10 +132,8 @@ public void onUpdateFromPeekToExpand(float percentage) { if (!mIsVisible) return; float fadingOutPercentage = Math.max(0f, (percentage - 0.5f) * 2); - mOpacity = MathUtils.interpolate( - CAPTION_OPACITY_OPAQUE, - CAPTION_OPACITY_TRANSPARENT, - fadingOutPercentage); + mAnimationPercentage = MathUtils.interpolate( + ANIMATION_PERCENTAGE_COMPLETE, ANIMATION_PERCENTAGE_ZERO, fadingOutPercentage); } /** @@ -125,7 +143,7 @@ public void onUpdateFromPeekToExpand(float percentage) { public void onUpdateFromExpandToMaximize(float percentage) { if (!mIsVisible) return; - mOpacity = CAPTION_OPACITY_TRANSPARENT; + mAnimationPercentage = ANIMATION_PERCENTAGE_ZERO; } @Override @@ -135,4 +153,10 @@ protected void onFinishInflate() { View view = getView(); mCaption = (TextView) view.findViewById(R.id.contextual_search_caption); } + + @Override + protected void onCaptureEnd() { + super.onCaptureEnd(); + mDidCapture = true; + } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java index 9637134139721..f2ae6fbdb59fd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/readermode/ReaderModePanel.java @@ -312,11 +312,6 @@ public void onSizeChanged(float width, float height) { if (mManagerDelegate != null) { mManagerDelegate.onSizeChanged(); } - // If the panel is not closed, make sure it is in the appropriate place when the viewport - // size changes. - if (getPanelState() != PanelState.UNDEFINED && getPanelState() != PanelState.CLOSED) { - resizePanelToState(getPanelState(), StateChangeReason.UNKNOWN); - } } @Override diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java index 8d67ebe264376..f44df724948ea 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/Layout.java @@ -1131,6 +1131,7 @@ public EventFilter findInterceptingEventFilter( // filter added should have the first chance to intercept any touch events. for (int i = mSceneOverlays.size() - 1; i >= 0; i--) { EventFilter eventFilter = mSceneOverlays.get(i).getEventFilter(); + if (eventFilter == null) continue; if (offsets != null) eventFilter.setCurrentMotionEventOffsets(offsets.x, offsets.y); if (eventFilter.onInterceptTouchEvent(e, isKeyboardShowing)) return eventFilter; } @@ -1145,7 +1146,8 @@ public EventFilter findInterceptingEventFilter( /** * Build a {@link SceneLayer} if it hasn't already been built, and update it and return it. * - * @param contentViewport A viewport in which to display content. + * @param viewport A viewport in which to display content. + * @param contentViewport The visible section of the viewport. * @param layerTitleCache A layer title cache. * @param tabContentManager A tab content manager. * @param resourceManager A resource manager. @@ -1153,10 +1155,9 @@ public EventFilter findInterceptingEventFilter( * @return A {@link SceneLayer} that represents the content for this * {@link Layout}. */ - public final SceneLayer getUpdatedSceneLayer(Rect viewport, - Rect contentViewport, LayerTitleCache layerTitleCache, - TabContentManager tabContentManager, ResourceManager resourceManager, - ChromeFullscreenManager fullscreenManager) { + public final SceneLayer getUpdatedSceneLayer(Rect viewport, Rect contentViewport, + LayerTitleCache layerTitleCache, TabContentManager tabContentManager, + ResourceManager resourceManager, ChromeFullscreenManager fullscreenManager) { updateSceneLayer(viewport, contentViewport, layerTitleCache, tabContentManager, resourceManager, fullscreenManager); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java index 72d3c3f2df0a1..f10e88f854145 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerDocument.java @@ -27,6 +27,7 @@ import org.chromium.chrome.browser.compositor.layouts.eventfilter.EmptyEdgeSwipeHandler; import org.chromium.chrome.browser.compositor.layouts.eventfilter.GestureHandler; import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; +import org.chromium.chrome.browser.compositor.scene_layer.ToolbarSceneLayer; import org.chromium.chrome.browser.contextualsearch.ContextualSearchManagementDelegate; import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.dom_distiller.ReaderModeManagerDelegate; @@ -68,6 +69,7 @@ public class LayoutManagerDocument extends LayoutManager private final ContextualSearchPanel mContextualSearchPanel; private final ReaderModePanel mReaderModePanel; private final OverlayPanelManager mOverlayPanelManager; + private final ToolbarSceneLayer mToolbarOverlay; /** A delegate for interacting with the Contextual Search manager. */ protected ContextualSearchManagementDelegate mContextualSearchDelegate; @@ -84,6 +86,8 @@ public LayoutManagerDocument(LayoutManagerHost host) { mContext = host.getContext(); LayoutRenderHost renderHost = host.getLayoutRenderHost(); + mToolbarOverlay = new ToolbarSceneLayer(mContext, this, renderHost); + // Build Event Filter Handlers mGestureHandler = new GestureHandlerLayoutDelegate(this); mToolbarSwipeHandler = new ToolbarSwipeHandler(this); @@ -219,8 +223,12 @@ protected void addGlobalSceneOverlay(SceneOverlay helper) { /** * Add any {@link SceneOverlay}s to the layout. This can be used to add the overlays in a * particular order. + * Classes that override this method should be careful about the order that + * overlays are added and when super is called (i.e. cases where one overlay needs to be + * on top of another positioned. */ protected void addAllSceneOverlays() { + addGlobalSceneOverlay(mToolbarOverlay); mStaticLayout.addSceneOverlay(mContextualSearchPanel); mStaticLayout.addSceneOverlay(mReaderModePanel); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutProvider.java index d48383e0ae0c3..7805363f24f68 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutProvider.java @@ -48,7 +48,8 @@ public interface LayoutProvider { * Build a {@link SceneLayer} for the active layout if it hasn't already been built, and update * it and return it. * - * @param contentViewport A viewport in which to display content. + * @param viewport A viewport in which to display content. + * @param contentViewport The visible section of the viewport. * @param layerTitleCache A layer title cache. * @param tabContentManager A tab content manager. * @param resourceManager A resource manager. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java index d2bb422689dfd..45d3e8ad9059e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java @@ -71,7 +71,7 @@ public StaticLayout(Context context, LayoutUpdateHost updateHost, LayoutRenderHo mHandler = new Handler(); mUnstallRunnable = new UnstallRunnable(); mUnstalling = false; - mSceneLayer = new StaticTabSceneLayer(context, R.id.control_container); + mSceneLayer = new StaticTabSceneLayer(R.id.control_container); } /** @@ -235,9 +235,6 @@ protected void updateSceneLayer(Rect viewport, Rect contentViewport, mSceneLayer.update(dpToPx, contentViewport, layerTitleCache, tabContentManager, fullscreenManager, layoutTab); - mSceneLayer.updateToolbarLayer(dpToPx, mRenderHost.getTopControlsBackgroundColor(), - mRenderHost.getTopControlsUrlBarAlpha(), fullscreenManager, resourceManager, - forceHideTopControlsAndroidView(), getSizingFlags()); // TODO(dtrainor): Find the best way to properly track this metric for cold starts. // We should probably erase the thumbnail when we select a tab that we need to restore. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter.java index b7f91518c32c9..00d3434e34c01 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/OverlayPanelEventFilter.java @@ -50,11 +50,20 @@ private enum GestureOrientation { private static final float VERTICAL_DETERMINATION_BOOST = 1.25f; /** The OverlayPanel that this filter is for. */ - private OverlayPanel mPanel; + private final OverlayPanel mPanel; /** The {@link GestureDetector} used to distinguish tap and scroll gestures. */ private final GestureDetector mGestureDetector; + /** The @{link SwipeRecognizer} that recognizes directional swipe gestures. */ + private final SwipeRecognizer mSwipeRecognizer; + + /** + * The square of ViewConfiguration.getScaledTouchSlop() in pixels used to calculate whether + * the finger has moved beyond the established threshold. + */ + private final float mTouchSlopSquarePx; + /** The target to propagate events to. */ private EventTarget mEventTarget; @@ -101,15 +110,6 @@ private enum GestureOrientation { /** The initial Y position of the current gesture. */ private float mInitialEventY; - /** - * The square of ViewConfiguration.getScaledTouchSlop() in pixels used to calculate whether - * the finger has moved beyond the established threshold. - */ - private final float mTouchSlopSquarePx; - - /** The @{link SwipeRecognizer} that recognizes directional swipe gestures. */ - private final SwipeRecognizer mSwipeRecognizer; - private class SwipeRecognizerImpl extends SwipeRecognizer { public SwipeRecognizerImpl(Context context) { super(context); @@ -158,17 +158,19 @@ protected float getContentViewVerticalScroll() { @Override public boolean onInterceptTouchEventInternal(MotionEvent e, boolean isKeyboardShowing) { - boolean touchIsOnPanel = - mPanel.isCoordinateInsideBar(e.getX() * mPxToDp, e.getY() * mPxToDp) - || mPanel.isCoordinateInsideContent(e.getX() * mPxToDp, e.getY() * mPxToDp); - boolean panelIsShowing = mPanel.getPanelState() != PanelState.CLOSED - && mPanel.getPanelState() != PanelState.UNDEFINED; - - // If the panel is showing and being touched or is opened past the peek state, intercept - // the touch. - if ((panelIsShowing && touchIsOnPanel) || mPanel.isPanelOpened()) { + if (!mPanel.isShowing()) return false; + + boolean isTouchInsidePanel = + mPanel.isCoordinateInsideOverlayPanel(e.getX() * mPxToDp, e.getY() * mPxToDp); + + if (isTouchInsidePanel + // When the Panel is opened, all events should be forwarded to the Panel, + // even those who are not inside the Panel. This is to prevent any events + // being forward to the base page when the Panel is expanded. + || mPanel.isPanelOpened()) { return super.onInterceptTouchEventInternal(e, isKeyboardShowing); } + return false; } @@ -432,6 +434,11 @@ protected boolean handleSingleTapUp(MotionEvent e) { * @return Whether the event has been consumed. */ protected boolean handleScroll(MotionEvent e1, MotionEvent e2, float distanceY) { + // TODO(mdjones): It seems impossible that either of the two MotionEvents passed into this + // function would be null provided the InternalGestureDetector checks them. However, it + // still seems to be possible... + if (e1 == null || e2 == null) return false; + // Only determines the gesture orientation if it hasn't been determined yet, // affectively "locking" the orientation once the gesture has started. if (!mHasDeterminedGestureOrientation && isDistanceGreaterThanTouchSlop(e1, e2)) { @@ -540,11 +547,15 @@ private boolean isDistanceGreaterThanTouchSlop(float deltaX, float deltaY) { private class InternalGestureDetector extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { + // TODO(mdjones): Investigate how this is ever the case. The API docs do not say this + // can happen (https://crbug.com/613069). + if (e == null) return false; return handleSingleTapUp(e); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + if (e1 == null || e2 == null) return false; return handleScroll(e1, e2, distanceY); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java index e7755d5245c27..74367d9293607 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java @@ -85,7 +85,9 @@ public void update(ResourceManager resourceManager, float searchContextOpacity = searchBarControl.getSearchBarContextOpacity(); float searchTermOpacity = searchBarControl.getSearchBarTermOpacity(); - float searchCaptionOpacity = searchBarControl.getCaptionOpacity(); + + float searchCaptionAnimationPercentage = searchBarControl.getCaptionAnimationPercentage(); + boolean searchCaptionVisible = searchBarControl.getCaptionVisible(); boolean searchBarBorderVisible = panel.isBarBorderVisible(); float searchBarBorderHeight = panel.getBarBorderHeight(); @@ -140,7 +142,8 @@ public void update(ResourceManager resourceManager, searchBarHeight * mDpToPx, searchContextOpacity, searchTermOpacity, - searchCaptionOpacity, + searchCaptionAnimationPercentage, + searchCaptionVisible, searchBarBorderVisible, searchBarBorderHeight * mDpToPx, searchBarShadowVisible, @@ -233,7 +236,8 @@ private native void nativeUpdateContextualSearchLayer( float searchBarHeight, float searchContextOpacity, float searchTermOpacity, - float searchCaptionOpacity, + float searchCaptionAnimationPercentage, + boolean searchCaptionVisible, boolean searchBarBorderVisible, float searchBarBorderHeight, boolean searchBarShadowVisible, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java index f15510b45db24..43fc632c96378 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java @@ -4,21 +4,13 @@ package org.chromium.chrome.browser.compositor.scene_layer; -import android.content.Context; import android.graphics.Rect; import org.chromium.base.annotations.JNINamespace; -import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.LayerTitleCache; -import org.chromium.chrome.browser.compositor.layouts.Layout.SizingFlags; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; -import org.chromium.chrome.browser.device.DeviceClassManager; import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; -import org.chromium.chrome.browser.widget.ClipDrawableProgressBar.DrawingInfo; -import org.chromium.chrome.browser.widget.ControlContainer; -import org.chromium.ui.base.DeviceFormFactor; -import org.chromium.ui.resources.ResourceManager; /** * A SceneLayer to render a static tab. @@ -29,17 +21,10 @@ public class StaticTabSceneLayer extends SceneLayer { // downcast using reinterpret_cast<>. We keep a separate pointer to avoid it. private long mNativePtr; - private final Context mContext; - private final int mResToolbarControlContainer; - private DrawingInfo mProgressBarDrawingInfo; - private final boolean mIsTablet; - - public StaticTabSceneLayer(Context context, int resToolbarControlContainer) { - mContext = context; + public StaticTabSceneLayer(int resToolbarControlContainer) { mResToolbarControlContainer = resToolbarControlContainer; - mIsTablet = DeviceFormFactor.isTablet(mContext); } /** @@ -73,62 +58,6 @@ public void update(float dpToPx, Rect contentViewport, LayerTitleCache layerTitl layoutTab.getBrightness()); } - /** - * Update the toolbar and progress bar layers. - * - * @param dpToPx The conversion factor of dp to px. - * @param topControlsBackgroundColor The background color of the top controls. - * @param topControlsUrlBarAlpha The alpha of the URL bar. - * @param fullscreenManager A ChromeFullscreenManager instance. - * @param resourceManager A ResourceManager for loading static resources. - * @param forceHideAndroidTopControls True if the Android top controls are being hidden. - * @param sizingFlags The sizing flags for the toolbar. - */ - public void updateToolbarLayer(float dpToPx, int topControlsBackgroundColor, - float topControlsUrlBarAlpha, ChromeFullscreenManager fullscreenManager, - ResourceManager resourceManager, boolean forceHideAndroidTopControls, - int sizingFlags) { - if (!DeviceClassManager.enableFullscreen()) return; - - if (fullscreenManager == null) return; - ControlContainer toolbarContainer = fullscreenManager.getControlContainer(); - if (!mIsTablet && toolbarContainer != null) { - if (mProgressBarDrawingInfo == null) mProgressBarDrawingInfo = new DrawingInfo(); - toolbarContainer.getProgressBarDrawingInfo(mProgressBarDrawingInfo); - } else { - assert mProgressBarDrawingInfo == null; - } - - float offset = fullscreenManager.getControlOffset(); - boolean useTexture = fullscreenManager.drawControlsAsTexture() || offset == 0 - || forceHideAndroidTopControls; - - fullscreenManager.setHideTopControlsAndroidView(forceHideAndroidTopControls); - - if ((sizingFlags & SizingFlags.REQUIRE_FULLSCREEN_SIZE) != 0 - && (sizingFlags & SizingFlags.ALLOW_TOOLBAR_HIDE) == 0 - && (sizingFlags & SizingFlags.ALLOW_TOOLBAR_ANIMATE) == 0) { - useTexture = false; - } - - nativeUpdateToolbarLayer(mNativePtr, resourceManager, R.id.control_container, - topControlsBackgroundColor, R.drawable.textbox, topControlsUrlBarAlpha, offset, - useTexture, forceHideAndroidTopControls); - - if (mProgressBarDrawingInfo == null) return; - nativeUpdateProgressBar(mNativePtr, - mProgressBarDrawingInfo.progressBarRect.left, - mProgressBarDrawingInfo.progressBarRect.top, - mProgressBarDrawingInfo.progressBarRect.width(), - mProgressBarDrawingInfo.progressBarRect.height(), - mProgressBarDrawingInfo.progressBarColor, - mProgressBarDrawingInfo.progressBarBackgroundRect.left, - mProgressBarDrawingInfo.progressBarBackgroundRect.top, - mProgressBarDrawingInfo.progressBarBackgroundRect.width(), - mProgressBarDrawingInfo.progressBarBackgroundRect.height(), - mProgressBarDrawingInfo.progressBarBackgroundColor); - } - @Override protected void initializeNative() { if (mNativePtr == 0) { @@ -150,13 +79,4 @@ private native void nativeUpdateTabLayer(long nativeStaticTabSceneLayer, float c boolean canUseLiveLayer, int backgroundColor, float x, float y, float width, float height, float contentOffsetY, float staticToViewBlend, float saturation, float brightness); - private native void nativeUpdateToolbarLayer(long nativeStaticTabSceneLayer, - ResourceManager resourceManager, int resourceId, int toolbarBackgroundColor, - int urlBarResourceId, float urlBarAlpha, float topOffset, boolean visible, - boolean showShadow); - private native void nativeUpdateProgressBar( - long nativeStaticTabSceneLayer, int progressBarX, int progressBarY, - int progressBarWidth, int progressBarHeight, int progressBarColor, - int progressBarBackgroundX, int progressBarBackgroundY, int progressBarBackgroundWidth, - int progressBarBackgroundHeight, int progressBarBackgroundColor); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java new file mode 100644 index 0000000000000..148c8b68598da --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java @@ -0,0 +1,255 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.compositor.scene_layer; + +import android.content.Context; + +import org.chromium.base.annotations.JNINamespace; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.compositor.LayerTitleCache; +import org.chromium.chrome.browser.compositor.layouts.Layout.SizingFlags; +import org.chromium.chrome.browser.compositor.layouts.LayoutProvider; +import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; +import org.chromium.chrome.browser.compositor.layouts.components.VirtualView; +import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter; +import org.chromium.chrome.browser.compositor.overlays.SceneOverlay; +import org.chromium.chrome.browser.device.DeviceClassManager; +import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager; +import org.chromium.chrome.browser.widget.ClipDrawableProgressBar.DrawingInfo; +import org.chromium.chrome.browser.widget.ControlContainer; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.resources.ResourceManager; + +import java.util.List; + +/** + * A SceneLayer to render layers for the toolbar. + */ +@JNINamespace("chrome::android") +public class ToolbarSceneLayer extends SceneOverlayLayer implements SceneOverlay { + + /** Pointer to native ToolbarSceneLayer. */ + private long mNativePtr; + + /** Information used to draw the progress bar. */ + private DrawingInfo mProgressBarDrawingInfo; + + /** An Android Context. */ + private Context mContext; + + /** A LayoutProvider for accessing the current layout. */ + private LayoutProvider mLayoutProvider; + + /** A LayoutRenderHost for accessing drawing information about the toolbar. */ + private LayoutRenderHost mRenderHost; + + /** + * @param context An Android context to use. + * @param provider A LayoutProvider for accessing the current layout. + * @param renderHost A LayoutRenderHost for accessing drawing information about the toolbar. + */ + public ToolbarSceneLayer(Context context, LayoutProvider provider, + LayoutRenderHost renderHost) { + mContext = context; + mLayoutProvider = provider; + mRenderHost = renderHost; + } + + /** + * Update the toolbar and progress bar layers. + * + * @param topControlsBackgroundColor The background color of the top controls. + * @param topControlsUrlBarAlpha The alpha of the URL bar. + * @param fullscreenManager A ChromeFullscreenManager instance. + * @param resourceManager A ResourceManager for loading static resources. + * @param forceHideAndroidTopControls True if the Android top controls are being hidden. + * @param sizingFlags The sizing flags for the toolbar. + * @param isTablet If the device is a tablet. + */ + private void update(int topControlsBackgroundColor, float topControlsUrlBarAlpha, + ChromeFullscreenManager fullscreenManager, ResourceManager resourceManager, + boolean forceHideAndroidTopControls, int sizingFlags, boolean isTablet) { + if (!DeviceClassManager.enableFullscreen()) return; + + if (fullscreenManager == null) return; + ControlContainer toolbarContainer = fullscreenManager.getControlContainer(); + if (!isTablet && toolbarContainer != null) { + if (mProgressBarDrawingInfo == null) mProgressBarDrawingInfo = new DrawingInfo(); + toolbarContainer.getProgressBarDrawingInfo(mProgressBarDrawingInfo); + } else { + assert mProgressBarDrawingInfo == null; + } + + float offset = fullscreenManager.getControlOffset(); + boolean useTexture = fullscreenManager.drawControlsAsTexture() || offset == 0 + || forceHideAndroidTopControls; + + fullscreenManager.setHideTopControlsAndroidView(forceHideAndroidTopControls); + + if ((sizingFlags & SizingFlags.REQUIRE_FULLSCREEN_SIZE) != 0 + && (sizingFlags & SizingFlags.ALLOW_TOOLBAR_HIDE) == 0 + && (sizingFlags & SizingFlags.ALLOW_TOOLBAR_ANIMATE) == 0) { + useTexture = false; + } + + nativeUpdateToolbarLayer(mNativePtr, resourceManager, R.id.control_container, + topControlsBackgroundColor, R.drawable.textbox, topControlsUrlBarAlpha, offset, + useTexture, forceHideAndroidTopControls); + + if (mProgressBarDrawingInfo == null) return; + nativeUpdateProgressBar(mNativePtr, + mProgressBarDrawingInfo.progressBarRect.left, + mProgressBarDrawingInfo.progressBarRect.top, + mProgressBarDrawingInfo.progressBarRect.width(), + mProgressBarDrawingInfo.progressBarRect.height(), + mProgressBarDrawingInfo.progressBarColor, + mProgressBarDrawingInfo.progressBarBackgroundRect.left, + mProgressBarDrawingInfo.progressBarBackgroundRect.top, + mProgressBarDrawingInfo.progressBarBackgroundRect.width(), + mProgressBarDrawingInfo.progressBarBackgroundRect.height(), + mProgressBarDrawingInfo.progressBarBackgroundColor); + } + + @Override + public void setContentTree(SceneLayer contentTree) { + nativeSetContentTree(mNativePtr, contentTree); + } + + @Override + protected void initializeNative() { + if (mNativePtr == 0) { + mNativePtr = nativeInit(); + } + assert mNativePtr != 0; + } + + /** + * Destroys this object and the corresponding native component. + */ + @Override + public void destroy() { + super.destroy(); + mNativePtr = 0; + } + + // SceneOverlay implementation. + + @Override + public SceneOverlayLayer getUpdatedSceneOverlayTree(LayerTitleCache layerTitleCache, + ResourceManager resourceManager, float yOffset) { + boolean forceHideTopControlsAndroidView = + mLayoutProvider.getActiveLayout().forceHideTopControlsAndroidView(); + int flags = mLayoutProvider.getActiveLayout().getSizingFlags(); + + update(mRenderHost.getTopControlsBackgroundColor(), mRenderHost.getTopControlsUrlBarAlpha(), + mLayoutProvider.getFullscreenManager(), resourceManager, + forceHideTopControlsAndroidView, flags, DeviceFormFactor.isTablet(mContext)); + + return this; + } + + @Override + public boolean isSceneOverlayTreeShowing() { + return true; + } + + @Override + public EventFilter getEventFilter() { + return null; + } + + @Override + public void onSizeChanged(float width, float height, float visibleViewportOffsetY, + int orientation) {} + + @Override + public void getVirtualViews(List views) {} + + @Override + public boolean shouldHideAndroidTopControls() { + return false; + } + + @Override + public boolean updateOverlay(long time, long dt) { + return false; + } + + @Override + public boolean onBackPressed() { + return false; + } + + @Override + public void onHideLayout() {} + + @Override + public boolean handlesTabCreating() { + return false; + } + + @Override + public void tabTitleChanged(int tabId, String title) {} + + @Override + public void tabStateInitialized() {} + + @Override + public void tabModelSwitched(boolean incognito) {} + + @Override + public void tabSelected(long time, boolean incognito, int id, int prevId) {} + + @Override + public void tabMoved(long time, boolean incognito, int id, int oldIndex, int newIndex) {} + + @Override + public void tabClosed(long time, boolean incognito, int id) {} + + @Override + public void tabClosureCancelled(long time, boolean incognito, int id) {} + + @Override + public void tabCreated(long time, boolean incognito, int id, int prevId, boolean selected) {} + + @Override + public void tabPageLoadStarted(int id, boolean incognito) {} + + @Override + public void tabPageLoadFinished(int id, boolean incognito) {} + + @Override + public void tabLoadStarted(int id, boolean incognito) {} + + @Override + public void tabLoadFinished(int id, boolean incognito) {} + + private native long nativeInit(); + private native void nativeSetContentTree( + long nativeToolbarSceneLayer, + SceneLayer contentTree); + private native void nativeUpdateToolbarLayer( + long nativeToolbarSceneLayer, + ResourceManager resourceManager, + int resourceId, + int toolbarBackgroundColor, + int urlBarResourceId, + float urlBarAlpha, + float topOffset, + boolean visible, + boolean showShadow); + private native void nativeUpdateProgressBar( + long nativeToolbarSceneLayer, + int progressBarX, + int progressBarY, + int progressBarWidth, + int progressBarHeight, + int progressBarColor, + int progressBarBackgroundX, + int progressBarBackgroundY, + int progressBarBackgroundWidth, + int progressBarBackgroundHeight, + int progressBarBackgroundColor); +} diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 12196b0f1ac98..392ad0fd287ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java @@ -307,6 +307,13 @@ public void onBasePageLoadStarted() { mSelectionController.onBasePageLoadStarted(); } + /** + * Notifies that a Context Menu has been shown. + */ + void onContextMenuShown() { + mSelectionController.onContextMenuShown(); + } + /** * Hides the Contextual Search UX. * @param reason The {@link StateChangeReason} for hiding Contextual Search. @@ -744,12 +751,17 @@ private boolean isTapSupported() { */ @CalledByNative private void onSetCaption(String caption, boolean doesAnswer) { + if (TextUtils.isEmpty(caption)) return; + // Notify the UI of the caption. mSearchPanel.setCaption(caption); if (mQuickAnswersHeuristic != null) { mQuickAnswersHeuristic.setConditionSatisfied(true); mQuickAnswersHeuristic.setDoesAnswer(doesAnswer); } + + // Update Tap counters to account for a possible answer. + mPolicy.updateCountersForQuickAnswer(mWasActivatedByTap, doesAnswer); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java index c767ef34f3da6..3848c9dcfe3a3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java @@ -259,6 +259,7 @@ void updateCountersForOpen() { // Always completely reset the tap counter, since it just counts taps // since the last open. mPreferenceManager.setContextualSearchTapCount(0); + mPreferenceManager.setContextualSearchTapQuickAnswerCount(0); // Disable the "promo tap" counter, but only if we're using the Opt-out onboarding. // For Opt-in, we never disable the promo tap counter. @@ -272,6 +273,20 @@ void updateCountersForOpen() { } } + /** + * Updates Tap counters to account for a quick-answer caption shown on the panel. + * @param wasActivatedByTap Whether the triggering gesture was a Tap or not. + * @param doesAnswer Whether the caption is considered an answer rather than just + * informative. + */ + void updateCountersForQuickAnswer(boolean wasActivatedByTap, boolean doesAnswer) { + if (wasActivatedByTap && doesAnswer) { + int tapsWithAnswerSinceOpen = + mPreferenceManager.getContextualSearchTapQuickAnswerCount(); + mPreferenceManager.setContextualSearchTapQuickAnswerCount(++tapsWithAnswerSinceOpen); + } + } + /** * @return Whether a verbatim request should be made for the given base page, assuming there * is no exiting request. @@ -527,7 +542,9 @@ private boolean isBasePageHTTP(@Nullable URL url) { * @return Whether the tap resolve/prefetch limit has been exceeded. */ private boolean isTapBeyondTheLimit() { - return getTapCount() > getTapLimit(); + // Discount taps that caused a Quick Answer since the tap may not have been totally ignored. + return getTapCount() - mPreferenceManager.getContextualSearchTapQuickAnswerCount() + > getTapLimit(); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java index 9bb6567fd5443..ff4e32fac1396 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java @@ -79,6 +79,10 @@ public enum SelectionType { // The time of the most last scroll activity, or 0 if none. private long mLastScrollTimeNs; + // Tracks whether a Context Menu has just been shown and the UX has been dismissed. + // The selection may be unreliable until the next reset. See crbug.com/628436. + private boolean mIsContextMenuShown; + private class ContextualSearchGestureStateListener extends GestureStateListener { @Override public void onScrollStarted(int scrollOffsetY, int scrollExtentY) { @@ -143,6 +147,16 @@ void onBasePageLoadStarted() { resetAllStates(); } + /** + * Notifies that a Context Menu has been shown. + * Future controller events may be unreliable until the next reset. + */ + void onContextMenuShown() { + // Hide the UX. + mHandler.handleSelectionDismissal(); + mIsContextMenuShown = true; + } + /** * Notifies that the Contextual Search has ended. * @param reason The reason for ending the Contextual Search. @@ -286,11 +300,14 @@ void handleSelectionEvent(int eventType, float posXPix, float posYPix) { boolean shouldHandleSelection = false; switch (eventType) { case SelectionEventType.SELECTION_HANDLES_SHOWN: - mWasTapGestureDetected = false; - mSelectionType = SelectionType.LONG_PRESS; - shouldHandleSelection = true; - // Since we're showing pins, we don't care if the previous tap was invalid anymore. - unscheduleInvalidTapNotification(); + if (!mIsContextMenuShown) { + mWasTapGestureDetected = false; + mSelectionType = SelectionType.LONG_PRESS; + shouldHandleSelection = true; + // Since we're showing pins, we don't care if the previous tap was invalid + // anymore. + unscheduleInvalidTapNotification(); + } break; case SelectionEventType.SELECTION_HANDLES_CLEARED: mHandler.handleSelectionDismissal(); @@ -341,6 +358,7 @@ private void resetAllStates() { resetSelectionStates(); mWasLastTapValid = false; mLastScrollTimeNs = 0; + mIsContextMenuShown = false; } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java index 905cf917fb14f..68dbe6f136a06 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java @@ -5,6 +5,7 @@ package org.chromium.chrome.browser.contextualsearch; import android.app.Activity; +import android.view.ContextMenu; import org.chromium.base.annotations.CalledByNative; import org.chromium.chrome.browser.ChromeActivity; @@ -123,6 +124,14 @@ public void onReparentingFinished(Tab tab) { updateHooksForNewContentViewCore(tab); } + @Override + public void onContextMenuShown(Tab tab, ContextMenu menu) { + ContextualSearchManager manager = getContextualSearchManager(); + if (manager != null) { + manager.onContextMenuShown(); + } + } + /** * Should be called whenever the Tab's ContentViewCore changes. Removes hooks from the * existing ContentViewCore, if necessary and then adds hooks for the new ContentViewCore. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateController.java index df0f0f7503b8c..307d1bebc16e6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateController.java @@ -20,6 +20,7 @@ * Controls how Translation One-box triggering is handled for the {@link ContextualSearchManager}. */ public class ContextualSearchTranslateController { + private static final int LOCALE_MIN_LENGTH = 2; private final ChromeActivity mActivity; private final ContextualSearchPolicy mPolicy; @@ -108,8 +109,8 @@ private List getReadableLanguages() { // Add the accept languages to the end, since they are a weaker hint than // the proficient languages. List acceptLanguages = getAcceptLanguages(); - for (int i = 0; i < acceptLanguages.size(); i++) { - uniqueLanguages.add(trimLocaleToLanguage(acceptLanguages.get(i))); + for (String accept : acceptLanguages) { + if (isValidLocale(accept)) uniqueLanguages.add(trimLocaleToLanguage(accept)); } return new ArrayList(uniqueLanguages); } @@ -138,7 +139,7 @@ private LinkedHashSet getProficientLanguages() { Context context = mActivity.getApplicationContext(); if (context != null) { for (String locale : UiUtils.getIMELocales(context)) { - uniqueLanguages.add(trimLocaleToLanguage(locale)); + if (isValidLocale(locale)) uniqueLanguages.add(trimLocaleToLanguage(locale)); } } } @@ -153,21 +154,32 @@ private List getAcceptLanguages() { List result = new ArrayList(); if (!ContextualSearchFieldTrial.isAcceptLanguagesForTranslationDisabled()) { String acceptLanguages = getNativeAcceptLanguages(); - for (String language : acceptLanguages.split(",")) { - result.add(language); + if (!TextUtils.isEmpty(acceptLanguages)) { + for (String language : acceptLanguages.split(",")) { + result.add(language); + } } } return result; } /** + * @return Whether the given locale appears to be valid. + */ + private boolean isValidLocale(String locale) { + return !TextUtils.isEmpty(locale) && locale.length() >= LOCALE_MIN_LENGTH; + } + + /** + * Converts a given locale to a language code. + * @param locale The locale string, which must have a length of at least 2. * @return The given locale as a language code. */ private String trimLocaleToLanguage(String locale) { // TODO(donnd): use getScript or getLanguageTag (both API 21), or some other standard way to // strip the country, instead of hard-coding the two character language code. // TODO(donnd): Shouldn't getLanguage() do this? - String trimmedLocale = locale.substring(0, 2); + String trimmedLocale = locale.substring(0, LOCALE_MIN_LENGTH); return new Locale(trimmedLocale).getLanguage(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateInterface.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateInterface.java index ae96b5fffbb1d..43126352d318e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateInterface.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTranslateInterface.java @@ -15,7 +15,7 @@ interface ContextualSearchTranslateInterface { public String getAcceptLanguages(); /** - * @return The Translate Service's target language string. + * @return The Translate Service's target language string, non-empty. */ public String getTranslateServiceTargetLanguage(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java index 013269db8321f..1fe9718b8626b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/ClientManager.java @@ -357,6 +357,11 @@ public synchronized void resetThrottling(int uid) { RequestThrottler.getForUid(mContext, uid).reset(); } + /** See {@link RequestThrottler#ban()} */ + public synchronized void ban(int uid) { + RequestThrottler.getForUid(mContext, uid).ban(); + } + /** * Cleans up all data associated with all sessions. */ diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index eeec472729759..ccddcdb92fbcf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java @@ -90,9 +90,9 @@ public class CustomTabActivity extends ChromeActivity { // change the package name. private boolean mShouldOverridePackage; - private boolean mRecordedStartupUma; private boolean mShouldReplaceCurrentEntry; private boolean mHasCreatedTabEarly; + private boolean mIsInitialStart = true; private CustomTabObserver mTabObserver; private String mPrerenderedUrl; @@ -417,13 +417,17 @@ public void onStartWithNative() { super.onStartWithNative(); setActiveContentHandler(mCustomTabContentHandler); - if (!mRecordedStartupUma) { - mRecordedStartupUma = true; + if (getSavedInstanceState() != null || !mIsInitialStart) { + RecordUserAction.record("CustomTabs.StartedReopened"); + } else { ExternalAppId externalId = IntentHandler.determineExternalIntentSource(getPackageName(), getIntent()); RecordHistogram.recordEnumeratedHistogram("CustomTabs.ClientAppId", externalId.ordinal(), ExternalAppId.INDEX_BOUNDARY.ordinal()); + + RecordUserAction.record("CustomTabs.StartedInitially"); } + mIsInitialStart = false; } @Override @@ -668,8 +672,10 @@ public boolean onMenuOrKeyboardAction(int id, boolean fromMenu) { } return true; } else if (id == R.id.info_menu_id) { - WebsiteSettingsPopup.show(this, getTabModelSelector().getCurrentTab(), - getToolbarManager().getContentPublisher()); + WebsiteSettingsPopup.show( + this, getTabModelSelector().getCurrentTab(), + getToolbarManager().getContentPublisher(), + WebsiteSettingsPopup.OPENED_FROM_MENU); return true; } return super.onMenuOrKeyboardAction(id, fromMenu); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java index 25787c3db14f6..3767d5694cec2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java @@ -534,6 +534,11 @@ boolean getIgnoreUrlFragmentsForSession(IBinder session) { return mClientManager.getIgnoreFragmentsForSession(session); } + @VisibleForTesting + void setShouldPrerenderOnCellularForSession(IBinder session, boolean value) { + mClientManager.setPrerenderCellularForSession(session, value); + } + /** * Extracts the creator package name from the intent. * @param intent The intent to get the package name from. @@ -717,7 +722,8 @@ private boolean prerenderUrl(IBinder session, String url, Bundle extras, int uid // Last one wins and cancels the previous prerender. cancelPrerender(null); if (TextUtils.isEmpty(url)) return false; - if (!mClientManager.isPrerenderingAllowed(uid)) return false; + boolean throttle = !shouldPrerenderOnCellularForSession(session); + if (throttle && !mClientManager.isPrerenderingAllowed(uid)) return false; // A prerender will be requested. Time to destroy the spare WebContents. destroySpareWebContents(); @@ -739,7 +745,7 @@ private boolean prerenderUrl(IBinder session, String url, Bundle extras, int uid Profile.getLastUsedProfile(), url, referrer, contentSize.x, contentSize.y, shouldPrerenderOnCellularForSession(session)); if (webContents == null) return false; - mClientManager.registerPrerenderRequest(uid, url); + if (throttle) mClientManager.registerPrerenderRequest(uid, url); mPrerender = new PrerenderedUrlParams(session, webContents, url, referrer, extras); return true; } @@ -777,4 +783,9 @@ private Point estimateContentSize() { void resetThrottling(Context context, int uid) { mClientManager.resetThrottling(uid); } + + @VisibleForTesting + void ban(Context context, int uid) { + mClientManager.ban(uid); + } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/RequestThrottler.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/RequestThrottler.java index a855517a82832..7a43b63a2aeb0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/RequestThrottler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/RequestThrottler.java @@ -178,6 +178,14 @@ void reset() { .apply(); } + /** Bans from prerendering. Used for testing. */ + void ban() { + mScore = -1; + SharedPreferences.Editor editor = mSharedPreferences.edit(); + updateBan(editor); + editor.apply(); + } + /** * Loads the SharedPreferences in the background. * diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java index ba4c7184460fa..52eba162a961f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/datausage/DataUseTabUIManager.java @@ -15,6 +15,7 @@ import android.widget.TextView; import org.chromium.base.ContextUtils; +import org.chromium.base.FieldTrialList; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; import org.chromium.chrome.browser.EmbedContentViewActivity; @@ -23,6 +24,7 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.variations.VariationsAssociatedData; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.Referrer; /** @@ -31,7 +33,7 @@ public class DataUseTabUIManager { private static final String SHARED_PREF_DATA_USE_DIALOG_OPT_OUT = "data_use_dialog_opt_out"; - private static final String FIELD_TRIAL_NAME = "ExternalDataUseObserver"; + private static final String DATA_USE_FIELD_TRIAL = "ExternalDataUseObserver"; /** * Data use started UI snackbar will not be shown if {@link DISABLE_DATA_USE_STARTED_UI_PARAM} @@ -105,8 +107,9 @@ public static void userClickedContinueOnDialogBox(Tab tab) { * continue. */ public static boolean wouldDataUseTrackingEnd(Tab tab, String url, int pageTransitionType) { - return nativeWouldDataUseTrackingEnd(SessionTabHelper.sessionIdForTab(tab.getWebContents()), - url, pageTransitionType, tab.getProfile()); + return nativeWouldDataUseTrackingEnd(tab.getWebContents(), + SessionTabHelper.sessionIdForTab(tab.getWebContents()), url, pageTransitionType, + tab.getProfile()); } /** @@ -223,18 +226,26 @@ public void onClick(DialogInterface dialog, int which) { * @return true if the data use tracking started UI (snackbar) should be shown. */ public static boolean shouldShowDataUseStartedUI() { - return !DISABLE_DATA_USE_UI_PARAM_VALUE.equals( - VariationsAssociatedData.getVariationParamValue( - FIELD_TRIAL_NAME, DISABLE_DATA_USE_STARTED_UI_PARAM)); + // UI should be shown only when field trial is active, not disabled in Finch and in + // non-roaming-cellular connection. + return FieldTrialList.trialExists(DATA_USE_FIELD_TRIAL) + && !DISABLE_DATA_USE_UI_PARAM_VALUE.equals( + VariationsAssociatedData.getVariationParamValue( + DATA_USE_FIELD_TRIAL, DISABLE_DATA_USE_STARTED_UI_PARAM)) + && nativeIsNonRoamingCellularConnection(); } /** * @return true if the data use tracking ended UI (snackbar or interstitial) should be shown. */ public static boolean shouldShowDataUseEndedUI() { - return !DISABLE_DATA_USE_UI_PARAM_VALUE.equals( - VariationsAssociatedData.getVariationParamValue( - FIELD_TRIAL_NAME, DISABLE_DATA_USE_ENDED_UI_PARAM)); + // UI should be shown only when field trial is active, not disabled in Finch and in + // non-roaming-cellular connection. + return FieldTrialList.trialExists(DATA_USE_FIELD_TRIAL) + && !DISABLE_DATA_USE_UI_PARAM_VALUE.equals( + VariationsAssociatedData.getVariationParamValue( + DATA_USE_FIELD_TRIAL, DISABLE_DATA_USE_ENDED_UI_PARAM)) + && nativeIsNonRoamingCellularConnection(); } /** @@ -251,7 +262,7 @@ public static boolean shouldShowDataUseEndedSnackbar(Context context) { SHARED_PREF_DATA_USE_DIALOG_OPT_OUT, false) || DISABLE_DATA_USE_UI_PARAM_VALUE.equals( VariationsAssociatedData.getVariationParamValue( - FIELD_TRIAL_NAME, DISABLE_DATA_USE_ENDED_DIALOG_PARAM)); + DATA_USE_FIELD_TRIAL, DISABLE_DATA_USE_ENDED_DIALOG_PARAM)); } /** @@ -293,9 +304,10 @@ private static native boolean nativeCheckAndResetDataUseTrackingStarted( private static native boolean nativeCheckAndResetDataUseTrackingEnded( int tabId, Profile profile); private static native void nativeUserClickedContinueOnDialogBox(int tabId, Profile profile); - private static native boolean nativeWouldDataUseTrackingEnd( - int tabId, String url, int pageTransitionType, Profile jprofile); + private static native boolean nativeWouldDataUseTrackingEnd(WebContents webContents, int tabId, + String url, int pageTransitionType, Profile jprofile); private static native void nativeOnCustomTabInitialNavigation(int tabID, String packageName, String url, Profile profile); private static native String nativeGetDataUseUIString(int messageID); + private static native boolean nativeIsNonRoamingCellularConnection(); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java index 5fcd130907df5..7921771a81372 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ChromeDownloadDelegate.java @@ -19,6 +19,7 @@ import android.util.Pair; import android.view.View; import android.webkit.MimeTypeMap; +import android.webkit.URLUtil; import android.widget.TextView; import org.chromium.base.Log; @@ -595,8 +596,11 @@ public boolean shouldInterceptContextMenuDownload(String url) { // OMA downloads have extension "dm" or "dd". For the latter, it // can be handled when native download completes. if (path != null && (path.endsWith(".dm"))) { - final DownloadInfo downloadInfo = new DownloadInfo.Builder().setUrl(url).build(); if (mTab == null) return true; + String fileName = URLUtil.guessFileName( + url, null, OMADownloadHandler.OMA_DRM_MESSAGE_MIME); + final DownloadInfo downloadInfo = + new DownloadInfo.Builder().setUrl(url).setFileName(fileName).build(); WindowAndroid window = mTab.getWindowAndroid(); if (window.hasPermission(permission.WRITE_EXTERNAL_STORAGE)) { onDownloadStartNoStream(downloadInfo); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java index a64324b2dc9c2..f12405b1d867b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java @@ -1129,12 +1129,14 @@ protected void resumeDownload(DownloadItem item, boolean hasUserGesture) { /** * Called to cancel a download. * @param downloadGuid GUID of the download. + * @param isNotificationDismissed Whether cancel is caused by dismissing the notification. */ - void cancelDownload(String downloadGuid) { + void cancelDownload(String downloadGuid, boolean isNotificationDismissed) { DownloadProgress progress = mDownloadProgressMap.get(downloadGuid); boolean isOffTheRecord = progress == null ? false : progress.mDownloadItem.getDownloadInfo().isOffTheRecord(); - nativeCancelDownload(getNativeDownloadManagerService(), downloadGuid, isOffTheRecord); + nativeCancelDownload(getNativeDownloadManagerService(), downloadGuid, isOffTheRecord, + isNotificationDismissed); recordDownloadFinishedUMA(DOWNLOAD_STATUS_CANCELLED, downloadGuid, 0); } @@ -1468,6 +1470,7 @@ public void updateActiveNetworkList(int[] activeNetIds) {} private native void nativeResumeDownload( long nativeDownloadManagerService, String downloadGuid); private native void nativeCancelDownload( - long nativeDownloadManagerService, String downloadGuid, boolean isOffTheRecord); + long nativeDownloadManagerService, String downloadGuid, boolean isOffTheRecord, + boolean isNotificationDismissed); private native void nativePauseDownload(long nativeDownloadManagerService, String downloadGuid); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index 6650be754492f..f3decafe70f4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java @@ -13,8 +13,10 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Binder; +import android.os.Build; import android.os.IBinder; import android.support.v4.app.NotificationCompat; +import android.text.TextUtils; import org.chromium.base.ContextUtils; import org.chromium.base.Log; @@ -44,6 +46,7 @@ public class DownloadNotificationService extends Service { static final String EXTRA_DOWNLOAD_NOTIFICATION_ID = "DownloadNotificationId"; static final String EXTRA_DOWNLOAD_GUID = "DownloadGuid"; static final String EXTRA_DOWNLOAD_FILE_NAME = "DownloadFileName"; + static final String EXTRA_NOTIFICATION_DISMISSED = "NotificationDismissed"; static final String ACTION_DOWNLOAD_CANCEL = "org.chromium.chrome.browser.download.DOWNLOAD_CANCEL"; static final String ACTION_DOWNLOAD_PAUSE = @@ -140,19 +143,26 @@ public void notifyDownloadProgress(int notificationId, String downloadGuid, Stri NumberFormat formatter = NumberFormat.getPercentInstance(Locale.getDefault()); String percentText = formatter.format(percentage / 100.0); String duration = getDurationString(timeRemainingInMillis); - builder.setContentText(duration).setContentInfo(percentText); + builder.setContentText(duration); + if (Build.VERSION.CODENAME.equals("N") + || Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { + builder.setSubText(percentText); + } else { + builder.setContentInfo(percentText); + } } addOrReplaceSharedPreferenceEntry(new DownloadSharedPreferenceEntry( notificationId, isResumable, canDownloadWhileMetered, downloadGuid, fileName)); if (startTime > 0) builder.setWhen(startTime); builder.addAction(R.drawable.bookmark_cancel_active, mContext.getResources().getString(R.string.download_notification_cancel_button), - buildPendingIntent(ACTION_DOWNLOAD_CANCEL, notificationId, downloadGuid, fileName)); + buildPendingIntent(ACTION_DOWNLOAD_CANCEL, notificationId, downloadGuid, fileName, + false)); if (isResumable) { builder.addAction(R.drawable.ic_vidcontrol_pause, mContext.getResources().getString(R.string.download_notification_pause_button), buildPendingIntent(ACTION_DOWNLOAD_PAUSE, notificationId, downloadGuid, - fileName)); + fileName, false)); } updateNotification(notificationId, builder.build()); } @@ -189,8 +199,10 @@ public void notifyDownloadPaused(String downloadGuid, boolean isAutoResumable) { android.R.drawable.ic_media_pause, entry.fileName, mContext.getResources().getString(R.string.download_notification_paused)); PendingIntent cancelIntent = buildPendingIntent(ACTION_DOWNLOAD_CANCEL, - entry.notificationId, entry.downloadGuid, entry.fileName); - builder.setDeleteIntent(cancelIntent); + entry.notificationId, entry.downloadGuid, entry.fileName, false); + PendingIntent dismissIntent = buildPendingIntent(ACTION_DOWNLOAD_CANCEL, + entry.notificationId, entry.downloadGuid, entry.fileName, true); + builder.setDeleteIntent(dismissIntent); builder.addAction(R.drawable.bookmark_cancel_active, mContext.getResources().getString(R.string.download_notification_cancel_button), cancelIntent); @@ -199,7 +211,7 @@ public void notifyDownloadPaused(String downloadGuid, boolean isAutoResumable) { mContext.getResources().getString( R.string.download_notification_resume_button), buildPendingIntent(ACTION_DOWNLOAD_RESUME, entry.notificationId, - entry.downloadGuid, entry.fileName)); + entry.downloadGuid, entry.fileName, false)); } updateNotification(entry.notificationId, builder.build()); // If download is not auto resumable, there is no need to keep it in SharedPreferences. @@ -235,6 +247,14 @@ public void notifyDownloadSuccessful(int notificationId, String downloadGuid, St * @param fileName GUID of the download. */ public void notifyDownloadFailed(int notificationId, String downloadGuid, String fileName) { + // If the download is not in history db, fileName could be empty. Get it from + // SharedPreferences. + if (TextUtils.isEmpty(fileName)) { + DownloadSharedPreferenceEntry entry = getDownloadSharedPreferenceEntry(downloadGuid); + if (entry == null) return; + fileName = entry.fileName; + } + NotificationCompat.Builder builder = buildNotification( android.R.drawable.stat_sys_download_done, fileName, mContext.getResources().getString(R.string.download_notification_failed)); @@ -253,8 +273,17 @@ void pauseAllDownloads() { } } + /** + * Helper method to build a PendingIntent from the provided information. + * @param action Download action to perform. + * @param notificationId ID of the notification. + * @param downloadGuid GUID of the download. + * @param fileName Name of the download file. + * @param isNotificationDismissed Whether the intent is from dismissing the notification. + */ private PendingIntent buildPendingIntent( - String action, int notificationId, String downloadGuid, String fileName) { + String action, int notificationId, String downloadGuid, String fileName, + boolean isNotificationDismissed) { ComponentName component = new ComponentName( mContext.getPackageName(), DownloadBroadcastReceiver.class.getName()); Intent intent = new Intent(action); @@ -262,6 +291,7 @@ private PendingIntent buildPendingIntent( intent.putExtra(EXTRA_DOWNLOAD_NOTIFICATION_ID, notificationId); intent.putExtra(EXTRA_DOWNLOAD_GUID, downloadGuid); intent.putExtra(EXTRA_DOWNLOAD_FILE_NAME, fileName); + intent.putExtra(EXTRA_NOTIFICATION_DISMISSED, isNotificationDismissed); return PendingIntent.getBroadcast( mContext, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT); } @@ -335,7 +365,8 @@ public void finishNativeInitialization() { // SD card, and remove the download ID from the SharedPreferences so we // don't need to restart the browser process. http://crbug.com/579643. cancelNotification(notificationId, guid); - service.cancelDownload(guid); + service.cancelDownload(guid, IntentUtils.safeGetBooleanExtra( + intent, EXTRA_NOTIFICATION_DISMISSED, false)); break; case ACTION_DOWNLOAD_PAUSE: service.pauseDownload(guid); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java index 007e11a861347..190e90ab6825b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivity.java @@ -324,7 +324,7 @@ public void completeFirstRunExperience() { @Override public void onSigninDialogShown() { RecordUserAction.record("MobileFre.SignInShown"); - RecordUserAction.record("Signin_Impression_FromStartPage"); + RecordUserAction.record("Signin_Signin_FromStartPage"); SigninManager.logSigninStartAccessPoint(SigninAccessPoint.START_PAGE); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java index 64c0ac3f60a7e..9ad9364e163c8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java @@ -14,7 +14,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.VisibleForTesting; -import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.preferences.PreferencesLauncher; import org.chromium.chrome.browser.signin.AccountManagementFragment; @@ -82,7 +81,6 @@ public static void start(final Activity activity) { } final boolean setUp = getFirstRunFlowSignInSetup(activity); - RecordUserAction.record("Signin_Signin_FromStartPage"); signinManager.signIn(accountName, activity, new SignInCallback() { @Override public void onSignInComplete() { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java index 3a35fb416a540..2cb5801850d51 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/ChromeFullscreenManager.java @@ -105,8 +105,9 @@ public interface FullscreenListener { /** * Called whenever the content's visible offset changes. * @param offset The new offset of the visible content from the top of the screen. + * @param needsAnimate Whether the caller is driving an animation with further updates. */ - public void onVisibleContentOffsetChanged(float offset); + public void onVisibleContentOffsetChanged(float offset, boolean needsAnimate); /** * Called when a ContentVideoView is created/destroyed. @@ -502,8 +503,12 @@ private void updateVisuals() { mControlContainer.getView().setTranslationY(getControlOffset()); } + // Whether we need the compositor to draw again to update our animation. + // Should be |false| when the top controls are only moved through the page scrolling. + boolean needsAnimate = mControlAnimation != null || shouldShowAndroidControls(); for (int i = 0; i < mListeners.size(); i++) { - mListeners.get(i).onVisibleContentOffsetChanged(getVisibleContentOffset()); + mListeners.get(i).onVisibleContentOffsetChanged( + getVisibleContentOffset(), needsAnimate); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java index 61fcc435424b8..0eb09992741f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java @@ -103,7 +103,12 @@ public void run() { if (incognitoCount == 0) { IncognitoNotificationManager.dismissIncognitoNotification(); } + } + }); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { // Now ensure that the snapshots in recents are all cleared for Tabbed activities // to remove any trace of incognito mode. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { @@ -209,7 +214,8 @@ public List call() { ChromeTabbedActivity tabbedActivity = (ChromeTabbedActivity) activity; if (tabbedActivity.isActivityDestroyed()) continue; - tabbedActivity.getTabModelSelector().getModel(true).closeAllTabs(); + tabbedActivity.getTabModelSelector().getModel(true).closeAllTabs( + false, false); selectorIndexes.add(TabWindowManager.getInstance().getIndexForWindow( tabbedActivity)); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java index 66b4dddca12ca..1a01f34194caf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java @@ -45,7 +45,7 @@ import org.chromium.components.variations.VariationsAssociatedData; import org.chromium.content.app.ContentApplication; import org.chromium.content.browser.BrowserStartupController; -import org.chromium.content.browser.ChildProcessLauncher; +import org.chromium.content.browser.ChildProcessCreationParams; import org.chromium.content.browser.DeviceUtils; import org.chromium.content.browser.SpeechRecognition; import org.chromium.net.NetworkChangeNotifier; @@ -312,8 +312,7 @@ public void initFunction() { }); // See crbug.com/593250. This can be removed after N SDK is released, crbug.com/592722. - ChildProcessLauncher.setChildProcessCreationParams( - mApplication.getChildProcessCreationParams()); + ChildProcessCreationParams.set(mApplication.getChildProcessCreationParams()); if (isAsync) { // We want to start this queue once the C++ startup tasks have run; allow the // C++ startup to run asynchonously, and set it up to start the Java queue once diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java index 1c3eec18d51ed..1f6786c9c4397 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteChooserDialogFactory.java @@ -8,6 +8,7 @@ import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; +import android.os.Handler; import android.support.v7.app.MediaRouteChooserDialog; import android.support.v7.app.MediaRouteChooserDialogFragment; import android.support.v7.app.MediaRouteDialogFactory; @@ -61,44 +62,77 @@ void restoreSystemVisibility(Activity activity) { } } - @Override - public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() { - return new MediaRouteChooserDialogFragment() { - final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); - boolean mCancelled = false; - - @Override - public MediaRouteChooserDialog onCreateChooserDialog( - Context context, Bundle savedInstanceState) { - mVisibilitySaver.saveSystemVisibility(getActivity()); - return new MediaRouteChooserDialog(context); - } + /** + * A dialog fragment for choosing a media route that saves system visibility for handling + * fullscreen state of Chrome correctly. Needs to be a named public static class, see + * https://crbug.com/618993. + */ + public static final class Fragment extends MediaRouteChooserDialogFragment { + final Handler mHandler = new Handler(); + final MediaRouteController mController; + final MediaStateListener mPlayer; + final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); + boolean mCancelled = false; + Context mContext = null; + + // The class has to be a public static class with a zero-argument constructor. + // Since we can't pass any callbacks to the fragment easily, just close the dialog. + // See https://crbug.com/618993. + public Fragment() { + mHandler.post(new Runnable() { + @Override + public void run() { + Fragment.this.dismiss(); + } + }); + mController = null; + mPlayer = null; + } - @Override - public void onStop() { - super.onStop(); - mVisibilitySaver.restoreSystemVisibility(getActivity()); - } + Fragment(MediaRouteController controller, MediaStateListener player) { + mController = controller; + mPlayer = player; + } - @Override - public void onCancel(DialogInterface dialog) { - mCancelled = true; + @Override + public MediaRouteChooserDialog onCreateChooserDialog( + Context context, Bundle savedInstanceState) { + mVisibilitySaver.saveSystemVisibility(getActivity()); + mContext = context; + return new MediaRouteChooserDialog(context); + } - super.onCancel(dialog); - } + @Override + public void onStop() { + super.onStop(); + mVisibilitySaver.restoreSystemVisibility(getActivity()); + } - @Override - public void onDismiss(DialogInterface dialog) { - super.onDismiss(dialog); + @Override + public void onCancel(DialogInterface dialog) { + mCancelled = true; - if (mCancelled) { - mPlayer.onRouteDialogCancelled(); - return; - } + super.onCancel(dialog); + } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + + if (mCancelled) { + if (mPlayer != null) mPlayer.onRouteDialogCancelled(); + return; + } + if (mController != null) { MediaRouter router = MediaRouter.getInstance(mContext); mController.onRouteSelected(mPlayer, router, router.getSelectedRoute()); } - }; + } + } + + @Override + public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() { + return new Fragment(mController, mPlayer); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java index 7caf35da2f9e1..0f48bfa587f76 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/MediaRouteControllerDialogFactory.java @@ -46,22 +46,31 @@ void restoreSystemVisibility(Activity activity) { } } - @Override - public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() { - return new MediaRouteControllerDialogFragment() { - final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); + /** + * A dialog fragment for controlling a media route that saves system visibility for + * handling fullscreen state of Chrome correctly. Needs to be a named public static class, + * see https://crbug.com/618993. + */ + public static final class Fragment extends MediaRouteControllerDialogFragment { + final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); - @Override - public Dialog onCreateDialog(Bundle saved) { - mVisibilitySaver.saveSystemVisibility(getActivity()); - return new MediaRouteControllerDialog(getActivity()); - } + public Fragment() {} - @Override - public void onStop() { - super.onStop(); - mVisibilitySaver.restoreSystemVisibility(getActivity()); - } - }; + @Override + public Dialog onCreateDialog(Bundle saved) { + mVisibilitySaver.saveSystemVisibility(getActivity()); + return new MediaRouteControllerDialog(getActivity()); + } + + @Override + public void onStop() { + super.onStop(); + mVisibilitySaver.restoreSystemVisibility(getActivity()); + } + } + + @Override + public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() { + return new MediaRouteControllerDialogFragment(); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java index 4526b71d4eb55..3b6349be3d7d9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java @@ -749,11 +749,6 @@ private String getArtistAndAlbumText(MediaMetadata metadata) { private boolean isRunningN() { // TODO(zqzhang): update this when N is released. - if (TextUtils.equals(Build.VERSION.CODENAME, "N")) return true; - if (TextUtils.equals(Build.VERSION.CODENAME, "REL") - && Build.VERSION.SDK_INT > Build.VERSION_CODES.M) { - return true; - } - return false; + return Build.VERSION.CODENAME.equals("N") || Build.VERSION.SDK_INT > Build.VERSION_CODES.M; } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java index cc9ef557bfb5c..7bc17e812598c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java @@ -190,7 +190,6 @@ public static void recordWebappHistogramTimes(long time) { * This intermediate step is necessary because Activity.onCreate() may be called when * the native library has not yet been loaded. * @param webContents WebContents for the current Tab. - * @param application The ChromeApplication object. */ public static void commitLaunchMetrics(WebContents webContents) { for (Pair item : sActivityUrls) { @@ -207,6 +206,23 @@ public static void commitLaunchMetrics(WebContents webContents) { for (CachedHistogram event : CachedHistogram.sEvents) event.commitAndClear(); } + /** + * Records metrics about the state of the homepage on launch. + * @param showHomeButton Whether the home button is shown. + * @param homepageIsNtp Whether the homepage is set to the NTP. + * @param homepageUrl The value of the homepage URL. + */ + public static void recordHomePageLaunchMetrics( + boolean showHomeButton, boolean homepageIsNtp, String homepageUrl) { + if (homepageUrl == null) { + homepageUrl = ""; + assert !showHomeButton : "Homepage should be disabled for a null URL"; + } + nativeRecordHomePageLaunchMetrics(showHomeButton, homepageIsNtp, homepageUrl); + } + private static native void nativeRecordLaunch( boolean standalone, String url, int source, WebContents webContents); + private static native void nativeRecordHomePageLaunchMetrics( + boolean showHomeButton, boolean homepageIsNtp, String homepageUrl); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java index e7b76d3db12a9..f91899d2f1e6e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java @@ -8,6 +8,7 @@ import android.app.Activity; import android.content.Intent; import android.os.Build; +import android.provider.Browser; import android.text.TextUtils; import org.chromium.base.ContextUtils; @@ -95,6 +96,25 @@ public Class getOpenInOtherWindowActivity(Activity current) } } + /** + * Sets extras on the intent used when handling "open in other window" or + * "move to other window". Specifically, sets the class, adds the launch adjacent flag, and + * adds extras so that Chrome behaves correctly when the back button is pressed. + * @param intent The intent to set details on. + * @param activity The activity firing the intent. + * @param targetActivity The class of the activity receiving the intent. + */ + public static void setOpenInOtherWindowIntentExtras( + Intent intent, Activity activity, Class targetActivity) { + intent.setClass(activity, targetActivity); + intent.addFlags(MultiWindowUtils.FLAG_ACTIVITY_LAUNCH_ADJACENT); + + // Let Chrome know that this intent is from Chrome, so that it does not close the app when + // the user presses 'back' button. + intent.putExtra(Browser.EXTRA_APPLICATION_ID, activity.getPackageName()); + intent.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true); + } + /** * @param activity The {@link Activity} to check. * @return Whether or not {@code activity} is currently in pre-N Samsung multi-window mode. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java index d3a0a44ff0369..22831b0c262da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java @@ -24,6 +24,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; import org.chromium.base.CommandLine; +import org.chromium.base.ThreadUtils; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; @@ -488,7 +489,22 @@ public void getUrlsAvailableOffline( final long offlineQueryStartTime = SystemClock.elapsedRealtime(); - OfflinePageBridge.getForProfile(mProfile).checkPagesExistOffline( + OfflinePageBridge offlinePageBridge = OfflinePageBridge.getForProfile(mProfile); + + // TODO(dewittj): Remove this code by making the NTP badging available after the NTP is + // fully loaded. + if (offlinePageBridge == null || !offlinePageBridge.isOfflinePageModelLoaded()) { + // Posting a task to avoid potential re-entrancy issues. + ThreadUtils.postOnUiThread(new Runnable() { + @Override + public void run() { + callback.onResult(urlsAvailableOffline); + } + }); + return; + } + + offlinePageBridge.checkPagesExistOffline( urlsToCheckForOfflinePage, new Callback>() { @Override public void onResult(Set urlsWithOfflinePages) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java index 0ed3e7cfc4aaf..f989d978e79f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java @@ -453,10 +453,10 @@ private ViewGroup getWrapperView() { } private View getFirstViewMatchingViewType(int newTabPageListItemViewType) { - int adapterSize = mNewTabPageAdapter.getItemCount(); - for (int i = 0; i < adapterSize; i++) { - if (mNewTabPageAdapter.getItemViewType(i) == newTabPageListItemViewType) { - return mRecyclerView.getLayoutManager().findViewByPosition(i); + for (int i = 0; i < mRecyclerView.getLayoutManager().getChildCount(); i++) { + RecyclerView.ViewHolder viewHolder = mRecyclerView.findViewHolderForLayoutPosition(i); + if (viewHolder != null && viewHolder.getItemViewType() == newTabPageListItemViewType) { + return viewHolder.itemView; } } return null; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java index 75b3b99a75954..8f942993ed5a2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java @@ -195,6 +195,11 @@ public void onViewAttachedToWindow(View view) { // another tab. mIsAttachedToWindow = true; updateForegroundState(); + + // Work around a bug on Samsung devices where the recent tabs page does not appear after + // toggling the Sync quick setting. For some reason, the layout is being dropped on the + // flow and we need to force a root level layout to get the UI to appear. + view.getRootView().requestLayout(); } @Override diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java index 1a0f7417f81bf..f5bf893c09855 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapter.java @@ -138,7 +138,8 @@ public void onSnippetsReceived(List listSnippets) { } @Override - public void onSnippetsCleared() { + public void onSnippetsDisabled() { + // Clear the snippets, wait for new updates in case the service is reenabled later. loadSnippets(new ArrayList()); mWantsSnippets = true; } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java index e5b2d9d16d54d..cdf2b1229ee9f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java @@ -15,6 +15,7 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; +import org.chromium.base.Log; import org.chromium.chrome.R; /** @@ -22,6 +23,8 @@ * New Tab page receives focus when clicked. */ public class NewTabPageRecyclerView extends RecyclerView { + private static final String TAG = "NtpCards"; + /** * Minimum height of the bottom spacing item. */ @@ -131,9 +134,18 @@ int calculateBottomSpacing() { // The spacing item is the last item, the last content item is directly above that. int lastContentItemPosition = getAdapter().getItemCount() - 2; - int contentHeight = - findViewHolderForAdapterPosition(lastContentItemPosition).itemView.getBottom() - - findViewHolderForAdapterPosition(SNAP_ITEM_ADAPTER_POSITION).itemView.getTop(); + + ViewHolder lastContentItem = findViewHolderForAdapterPosition(lastContentItemPosition); + ViewHolder snapItem = findViewHolderForAdapterPosition(SNAP_ITEM_ADAPTER_POSITION); + if (lastContentItem == null || snapItem == null) { + // Can happen when the list is refreshed while the NTP is not shown, for example when + // changing settings. + Log.w(TAG, "The RecyclerView items are not attached, can't determine the content " + + "height: snap=%s, last=%s ", snapItem, lastContentItem); + return MIN_BOTTOM_SPACING; + } + + int contentHeight = lastContentItem.itemView.getBottom() - snapItem.itemView.getTop(); int bottomSpacing = getHeight() - mToolbarHeight - contentHeight + mCompensationHeight; return Math.max(MIN_BOTTOM_SPACING, bottomSpacing); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsBridge.java index 4e7445d591f68..92e089fe14376 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetsBridge.java @@ -31,13 +31,13 @@ public interface FetchSnippetImageCallback { } /** - * An observer for notifying when new snippets are loaded. + * An observer for events in the snippets service. */ public interface SnippetsObserver { void onSnippetsReceived(List snippets); - /** Called when the service wants to force clear the displayed snippets. */ - void onSnippetsCleared(); + /** Called when the service has been disabled. */ + void onSnippetsDisabled(); } /** @@ -142,8 +142,8 @@ private void onSnippetsAvailable(String[] ids, String[] titles, String[] urls, S } @CalledByNative - private void onSnippetsCleared() { - if (mObserver != null) mObserver.onSnippetsCleared(); + private void onSnippetsDisabled() { + if (mObserver != null) mObserver.onSnippetsDisabled(); } private native long nativeInit(Profile profile); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java index 4809d938d217d..247190aca8103 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageBridge.java @@ -19,8 +19,6 @@ import java.util.List; import java.util.Set; -import javax.annotation.Nullable; - /** * Access gate to C++ side offline pages functionalities. */ @@ -100,7 +98,7 @@ public interface MultipleOfflinePageItemCallback { */ public interface SingleOfflinePageItemCallback { @CalledByNative("SingleOfflinePageItemCallback") - void onResult(@Nullable OfflinePageItem item); + void onResult(OfflinePageItem item); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java index cde0999bd7c67..b8fab1cf5c8da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java @@ -396,26 +396,25 @@ private void recordInternalStorageSize() { File path = Environment.getDataDirectory(); StatFs statFs = new StatFs(path.getAbsolutePath()); - int size; + long size; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { size = getSize(statFs); } else { size = getSizeUpdatedApi(statFs); } RecordHistogram.recordLinearCountHistogram( - "GoogleUpdate.InfoBar.InternalStorageSizeAvailable", size, 1, 200, 100); + "GoogleUpdate.InfoBar.InternalStorageSizeAvailable", (int) size, 1, 200, 100); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) - private static int getSizeUpdatedApi(StatFs statFs) { - return (int) statFs.getAvailableBytes() / (1024 * 1024); + private static long getSizeUpdatedApi(StatFs statFs) { + return statFs.getAvailableBytes() / (1024 * 1024); } @SuppressWarnings("deprecation") - private static int getSize(StatFs statFs) { + private static long getSize(StatFs statFs) { int blockSize = statFs.getBlockSize(); int availableBlocks = statFs.getAvailableBlocks(); - int size = (blockSize * availableBlocks) / (1024 * 1024); - return size; + return (blockSize * availableBlocks) / (1024 * 1024); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 3d39b2b507e47..4a4d19afb9870 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java @@ -1762,7 +1762,8 @@ public void onClick(View v) { if (currentTab != null && currentTab.getWebContents() != null) { Activity activity = currentTab.getWindowAndroid().getActivity().get(); if (activity != null) { - WebsiteSettingsPopup.show(activity, currentTab, null); + WebsiteSettingsPopup.show( + activity, currentTab, null, WebsiteSettingsPopup.OPENED_FROM_TOOLBAR); } } } else if (v == mMicButton) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java b/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java index 671df70dc8669..e279332983354 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/pageinfo/WebsiteSettingsPopup.java @@ -20,6 +20,7 @@ import android.os.Bundle; import android.os.Process; import android.provider.Settings; +import android.support.annotation.IntDef; import android.support.v7.widget.AppCompatTextView; import android.text.Layout; import android.text.Spannable; @@ -42,6 +43,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; import org.chromium.chrome.browser.ContentSettingsType; import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; @@ -68,6 +70,8 @@ import org.chromium.ui.base.WindowAndroid.PermissionCallback; import org.chromium.ui.interpolators.BakedBezierInterpolator; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.net.URI; import java.net.URISyntaxException; import java.text.DateFormat; @@ -81,6 +85,13 @@ * WebsiteSettings* and website_settings_*. Do this on the C++ side as well. */ public class WebsiteSettingsPopup implements OnClickListener { + @Retention(RetentionPolicy.SOURCE) + @IntDef({OPENED_FROM_MENU, OPENED_FROM_TOOLBAR}) + private @interface OpenedFromSource {} + + public static final int OPENED_FROM_MENU = 1; + public static final int OPENED_FROM_TOOLBAR = 2; + /** * An entry in the settings dropdown for a given permission. There are two options for each * permission: Allow and Block. @@ -901,8 +912,18 @@ private boolean isShowingOfflinePage() { * @param tab The tab hosting the web contents for which to show Website information. This * information is retrieved for the visible entry. * @param contentPublisher The name of the publisher of the content. + * @param source Determines the source that triggered the popup. */ - public static void show(final Activity activity, final Tab tab, final String contentPublisher) { + public static void show(final Activity activity, final Tab tab, final String contentPublisher, + @OpenedFromSource int source) { + if (source == OPENED_FROM_MENU) { + RecordUserAction.record("MobileWebsiteSettingsOpenedFromMenu"); + } else if (source == OPENED_FROM_TOOLBAR) { + RecordUserAction.record("MobileWebsiteSettingsOpenedFromToolbar"); + } else { + assert false : "Invalid source passed"; + } + OfflinePageBridge offlinePageBridge = OfflinePageBridge.getForProfile(tab.getProfile()); if (offlinePageBridge == null) { new WebsiteSettingsPopup( diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java index 7576ab5a88350..61eeb9dc3b7ca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/AutoSigninFirstRunDialog.java @@ -5,11 +5,8 @@ package org.chromium.chrome.browser.password_manager; import android.app.Activity; -import android.app.Dialog; -import android.app.DialogFragment; import android.content.Context; import android.content.DialogInterface; -import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.text.SpannableString; import android.text.Spanned; @@ -28,7 +25,7 @@ * when the user first encounters the auto sign-in feature. */ public class AutoSigninFirstRunDialog - extends DialogFragment implements DialogInterface.OnClickListener { + implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener { private final Context mContext; private final String mTitle; private final String mExplanation; @@ -38,6 +35,7 @@ public class AutoSigninFirstRunDialog private final String mTurnOffButtonText; private long mNativeAutoSigninFirstRunDialog; private AlertDialog mDialog; + private boolean mWasDismissedByNative; private AutoSigninFirstRunDialog(Context context, long nativeAutoSigninFirstRunDialog, String title, String explanation, int explanationLinkStart, int explanationLinkEnd, @@ -53,7 +51,7 @@ private AutoSigninFirstRunDialog(Context context, long nativeAutoSigninFirstRunD } @CalledByNative - private static AutoSigninFirstRunDialog createDialog(WindowAndroid windowAndroid, + private static AutoSigninFirstRunDialog createAndShowDialog(WindowAndroid windowAndroid, long nativeAutoSigninFirstRunDialog, String title, String explanation, int explanationLinkStart, int explanationLinkEnd, String okButtonText, String turnOffButtonText) { @@ -63,12 +61,11 @@ private static AutoSigninFirstRunDialog createDialog(WindowAndroid windowAndroid AutoSigninFirstRunDialog dialog = new AutoSigninFirstRunDialog(activity, nativeAutoSigninFirstRunDialog, title, explanation, explanationLinkStart, explanationLinkEnd, okButtonText, turnOffButtonText); - dialog.show(activity.getFragmentManager(), null); + dialog.show(); return dialog; } - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { + private void show() { final AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialogTheme) .setTitle(mTitle) @@ -97,13 +94,8 @@ public void onClick(View view) { mDialog = builder.create(); mDialog.setCanceledOnTouchOutside(false); - return mDialog; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState != null) dismiss(); + mDialog.setOnDismissListener(this); + mDialog.show(); } @Override @@ -117,15 +109,21 @@ public void onClick(DialogInterface dialog, int whichButton) { @Override public void onDismiss(DialogInterface dialog) { - super.onDismiss(dialog); destroy(); - mDialog = null; } private void destroy() { assert mNativeAutoSigninFirstRunDialog != 0; nativeDestroy(mNativeAutoSigninFirstRunDialog); mNativeAutoSigninFirstRunDialog = 0; + mDialog = null; + } + + @CalledByNative + private void dismissDialog() { + assert !mWasDismissedByNative; + mWasDismissedByNative = true; + mDialog.dismiss(); } private native void nativeOnTurnOffClicked(long nativeAutoSigninFirstRunDialogAndroid); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheBootReceiver.java b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheBootReceiver.java deleted file mode 100644 index fedccba6c5d78..0000000000000 --- a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheBootReceiver.java +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.precache; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; - -import org.chromium.base.Log; - -/** - * Receives a boot signal to reschedule precaching. - */ -public class PrecacheBootReceiver extends BroadcastReceiver { - private static final String TAG = "Precache"; - - @Override - public void onReceive(Context context, Intent intent) { - Log.v(TAG, "received boot signal"); - PrecacheController.schedulePeriodicPrecacheTask(context); - } -} diff --git a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheController.java b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheController.java index 87c0adf7aecb3..fd607bd4ff8d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheController.java @@ -9,15 +9,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; import android.net.ConnectivityManager; import android.os.Handler; import android.os.Looper; import android.os.PowerManager; import android.os.PowerManager.WakeLock; -import com.google.android.gms.common.ConnectionResult; -import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.gcm.GcmNetworkManager; import com.google.android.gms.gcm.OneoffTask; import com.google.android.gms.gcm.PeriodicTask; @@ -29,7 +26,6 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.ChromeBackgroundService; -import org.chromium.chrome.browser.ChromeVersionInfo; import org.chromium.chrome.browser.util.NonThreadSafe; import org.chromium.components.precache.DeviceState; import org.chromium.sync.ModelType; @@ -152,10 +148,12 @@ public static boolean hasInstance() { return sInstance != null; } - /** Schedules a periodic task to precache resources. */ - public static void schedulePeriodicPrecacheTask(Context context) { - if (!canScheduleTasks(context)) return; - + /** + * Schedules a periodic task to precache resources. + * @param context The application context. + * @return false if the task cannot be scheduled. + */ + private static boolean schedulePeriodicPrecacheTask(Context context) { PeriodicTask task = new PeriodicTask.Builder() .setPeriod(WAIT_UNTIL_NEXT_PRECACHE_SECONDS) .setPersisted(true) @@ -164,12 +162,13 @@ public static void schedulePeriodicPrecacheTask(Context context) { .setService(ChromeBackgroundService.class) .setTag(PERIODIC_TASK_TAG) .build(); - sTaskScheduler.scheduleTask(context, task); + return sTaskScheduler.scheduleTask(context, task); } private static void cancelPeriodicPrecacheTask(Context context) { Log.v(TAG, "canceling a periodic precache task"); sTaskScheduler.cancelTask(context, PERIODIC_TASK_TAG); + // TODO(rajenrant): Track any failure via UMA. } /** @@ -180,8 +179,6 @@ private static void cancelPeriodicPrecacheTask(Context context) { */ private static void schedulePrecacheCompletionTask(Context context) { Log.v(TAG, "scheduling a precache completion task"); - if (!canScheduleTasks(context)) return; - OneoffTask task = new OneoffTask.Builder() .setExecutionWindow(COMPLETION_TASK_MIN_DELAY_SECONDS, COMPLETION_TASK_MAX_DELAY_SECONDS) @@ -193,28 +190,23 @@ private static void schedulePrecacheCompletionTask(Context context) { .setUpdateCurrent(true) .build(); sTaskScheduler.scheduleTask(context, task); + // TODO(rajenrant): Track any failure via UMA. } private static void cancelPrecacheCompletionTask(Context context) { Log.v(TAG, "canceling a precache completion task"); sTaskScheduler.cancelTask(context, CONTINUATION_TASK_TAG); + // TODO(rajenrant): Track any failure via UMA. } public static void rescheduleTasksOnUpgrade(Context context) { - schedulePeriodicPrecacheTask(context); - } - - @VisibleForTesting - static boolean canScheduleTasks(Context context) { - // This experimental feature should not run on Chrome Stable. - if (ChromeVersionInfo.isStableBuild()) { - return false; - } - if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) - != ConnectionResult.SUCCESS) { - return false; + // Reschedule the periodic task if precache was enabled previously. + SharedPreferences sharedPreferences = ContextUtils.getAppSharedPreferences(); + if (sharedPreferences.getBoolean(PREF_IS_PRECACHING_ENABLED, false) + && !schedulePeriodicPrecacheTask(context)) { + // Clear the preference, for the task to be scheduled next time. + sharedPreferences.edit().putBoolean(PREF_IS_PRECACHING_ENABLED, false).apply(); } - return true; } @VisibleForTesting @@ -255,13 +247,13 @@ public static void setIsPrecachingEnabled(Context context, boolean enabled) { } Log.v(TAG, "setting precache enabled to %s", enabled); - Editor editor = sharedPreferences.edit(); - editor.putBoolean(PREF_IS_PRECACHING_ENABLED, enabled); - editor.apply(); + sharedPreferences.edit().putBoolean(PREF_IS_PRECACHING_ENABLED, enabled).apply(); if (enabled) { - // Overwrites existing periodic task. - schedulePeriodicPrecacheTask(appContext); + if (!schedulePeriodicPrecacheTask(appContext)) { + // Clear the preference, for the task to be scheduled next time. + sharedPreferences.edit().putBoolean(PREF_IS_PRECACHING_ENABLED, false).apply(); + } } else { // If precaching, stop. cancelPeriodicPrecacheTask(appContext); @@ -353,6 +345,8 @@ public int precache(String tag) { if (PERIODIC_TASK_TAG.equals(tag)) { cancelPrecacheCompletionTask(mAppContext); } + registerDeviceStateReceiver(); + acquirePrecachingWakeLock(); startPrecachingAfterSyncInit(); return GcmNetworkManager.RESULT_SUCCESS; } @@ -381,8 +375,6 @@ public void onFailureOrTimedOut() { @VisibleForTesting void startPrecaching() { Log.v(TAG, "precache session has started"); - registerDeviceStateReceiver(); - acquirePrecachingWakeLock(); mHandler.postDelayed(mTimeoutRunnable, MAX_PRECACHE_DURATION_SECONDS * 1000); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java index 915eb58b7ab06..d9c8f252fb3bb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java @@ -101,7 +101,6 @@ private void onPrecacheCompletedCallback(boolean tryAgainSoon) { * *
    *
  • The predictive network actions preference is enabled.
  • - *
  • The current network type is suitable for predictive network actions.
  • *
  • Sync is enabled for sessions and it is not encrypted with a secondary passphrase.
  • *
  • Either the Precache field trial or the precache commandline flag is enabled.
  • *
@@ -116,15 +115,15 @@ private void updateEnabledSync(Context context) { // thread. ThreadUtils.assertOnUiThread(); - boolean networkPredictionsAllowed = - PrefServiceBridge.getInstance().canPrefetchAndPrerender(); + boolean networkPredictionEnabledPref = + PrefServiceBridge.getInstance().getNetworkPredictionEnabled(); boolean shouldRun = nativeShouldRun(); - mNetworkPredictionsAllowed = networkPredictionsAllowed; + mNetworkPredictionsAllowed = networkPredictionEnabledPref; mShouldRun = shouldRun; PrecacheController.setIsPrecachingEnabled( - context, networkPredictionsAllowed && shouldRun); + context, networkPredictionEnabledPref && shouldRun); Log.v(TAG, "updateEnabledSync complete"); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheTaskScheduler.java b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheTaskScheduler.java index c51678cb9bd74..0922c6b2dbfc8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheTaskScheduler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/precache/PrecacheTaskScheduler.java @@ -6,17 +6,43 @@ import android.content.Context; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.gcm.GcmNetworkManager; import com.google.android.gms.gcm.Task; import org.chromium.chrome.browser.ChromeBackgroundService; class PrecacheTaskScheduler { - void scheduleTask(Context context, Task task) { - GcmNetworkManager.getInstance(context).schedule(task); + boolean canScheduleTasks(Context context) { + if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) + != ConnectionResult.SUCCESS) { + return false; + } + return true; } - void cancelTask(Context context, String tag) { - GcmNetworkManager.getInstance(context).cancelTask(tag, ChromeBackgroundService.class); + boolean scheduleTask(Context context, Task task) { + if (!canScheduleTasks(context)) { + return false; + } + try { + GcmNetworkManager.getInstance(context).schedule(task); + } catch (IllegalArgumentException e) { + return false; + } + return true; + } + + boolean cancelTask(Context context, String tag) { + if (!canScheduleTasks(context)) { + return false; + } + try { + GcmNetworkManager.getInstance(context).cancelTask(tag, ChromeBackgroundService.class); + } catch (IllegalArgumentException e) { + return false; + } + return true; } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java index 30569f4746577..faf47e349201e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java @@ -43,6 +43,8 @@ public class ChromePreferenceManager { private static final String CONTEXTUAL_SEARCH_LAST_ANIMATION_TIME = "contextual_search_last_animation_time"; private static final String ENABLE_CUSTOM_TABS = "enable_custom_tabs"; + private static final String CONTEXTUAL_SEARCH_TAP_QUICK_ANSWER_COUNT = + "contextual_search_tap_quick_answer_count"; private static final String HERB_FLAVOR_KEY = "herb_flavor"; private static final String APP_LINK_KEY = "applink.app_link_enabled"; private static final String CHROME_DEFAULT_BROWSER = "applink.chrome_default_browser"; @@ -309,20 +311,40 @@ public void setContextualSearchTapTriggeredPromoCount(int count) { } /** - * @return Number of tap gestures that have been received when not waiting for the promo. + * @return Number of tap gestures that have been received since the last time the panel was + * opened. */ public int getContextualSearchTapCount() { return mSharedPreferences.getInt(CONTEXTUAL_SEARCH_TAP_COUNT, 0); } /** - * Sets the number of tap gestures that have been received when not waiting for the promo. - * @param count Number of taps that have been received when not waiting for the promo. + * Sets the number of tap gestures that have been received since the last time the panel was + * opened. + * @param count Number of taps that have been received since the last time the panel was opened. */ public void setContextualSearchTapCount(int count) { writeInt(CONTEXTUAL_SEARCH_TAP_COUNT, count); } + /** + * @return Number of Tap triggered Quick Answers (that "do answer") that have been shown since + * the last time the panel was opened. + */ + public int getContextualSearchTapQuickAnswerCount() { + return mSharedPreferences.getInt(CONTEXTUAL_SEARCH_TAP_QUICK_ANSWER_COUNT, 0); + } + + /** + * Sets the number of tap triggered Quick Answers (that "do answer") that have been shown since + * the last time the panel was opened. + * @param count Number of Tap triggered Quick Answers (that "do answer") that have been shown + * since the last time the panel was opened. + */ + public void setContextualSearchTapQuickAnswerCount(int count) { + writeInt(CONTEXTUAL_SEARCH_TAP_QUICK_ANSWER_COUNT, count); + } + /** * @return Which UI prototype the user is testing. This is cached from native via * {@link FeatureUtilities#cacheHerbFlavor}. diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SignInPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SignInPreference.java index 7e0bc7678e6dc..d78411d950927 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SignInPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SignInPreference.java @@ -23,18 +23,19 @@ import org.chromium.chrome.browser.signin.SigninAccessPoint; import org.chromium.chrome.browser.signin.SigninManager; import org.chromium.chrome.browser.signin.SigninManager.SignInAllowedObserver; -import org.chromium.chrome.browser.sync.GoogleServiceAuthError; import org.chromium.chrome.browser.sync.ProfileSyncService; +import org.chromium.chrome.browser.sync.ProfileSyncService.SyncStateChangedListener; import org.chromium.sync.AndroidSyncSettings; import org.chromium.sync.signin.ChromeSigninController; /** * A preference that displays "Sign in to Chrome" when the user is not sign in, and displays - * the user's name, email, and profile image when the user is signed in. + * the user's name, email, profile image and sync error icon if necessary when the user is signed + * in. */ -public class SignInPreference extends Preference implements SignInAllowedObserver, - ProfileDownloader.Observer, AndroidSyncSettings.AndroidSyncSettingsObserver { - +public class SignInPreference extends Preference + implements SignInAllowedObserver, ProfileDownloader.Observer, + AndroidSyncSettings.AndroidSyncSettingsObserver, SyncStateChangedListener { private boolean mViewEnabled; /** @@ -47,7 +48,7 @@ public SignInPreference(Context context, AttributeSet attrs) { } /** - * Starts listening for updates to the sign-in state. + * Starts listening for updates to the sign-in and sync state. */ public void registerForUpdates() { SigninManager manager = SigninManager.get(getContext()); @@ -55,17 +56,25 @@ public void registerForUpdates() { ProfileDownloader.addObserver(this); FirstRunSignInProcessor.updateSigninManagerFirstRunCheckDone(getContext()); AndroidSyncSettings.registerObserver(getContext(), this); + ProfileSyncService syncService = ProfileSyncService.get(); + if (syncService != null) { + syncService.addSyncStateChangedListener(this); + } } /** - * Stops listening for updates to the sign-in state. Every call to registerForUpdates() must - * be matched with a call to this method. + * Stops listening for updates to the sign-in and sync state. Every call to registerForUpdates() + * must be matched with a call to this method. */ public void unregisterForUpdates() { SigninManager manager = SigninManager.get(getContext()); manager.removeSignInAllowedObserver(this); ProfileDownloader.removeObserver(this); AndroidSyncSettings.unregisterObserver(getContext(), this); + ProfileSyncService syncService = ProfileSyncService.get(); + if (syncService != null) { + syncService.removeSyncStateChangedListener(this); + } } /** @@ -95,16 +104,12 @@ private void update() { } title = TextUtils.isEmpty(cachedName) ? account.name : cachedName; } - if (ProfileSyncService.get().getAuthError() != GoogleServiceAuthError.State.NONE) { - setWidgetLayoutResource(R.layout.sync_error_widget); - } else { - setWidgetLayoutResource(0); - } } setTitle(title); setSummary(summary); setFragment(fragment); + updateSyncStatusIcon(); ChromeSigninController signinController = ChromeSigninController.get(getContext()); boolean enabled = signinController.isSignedIn() @@ -143,6 +148,15 @@ public boolean onPreferenceClick(Preference preference) { }); } + private void updateSyncStatusIcon() { + if (SyncPreference.showSyncErrorIcon(getContext()) + && ChromeSigninController.get(getContext()).isSignedIn()) { + setWidgetLayoutResource(R.layout.sync_error_widget); + } else { + setWidgetLayoutResource(0); + } + } + private static String getSyncSummaryString(Context context, String accountName) { boolean syncEnabled = AndroidSyncSettings.isSyncEnabled(context); if (syncEnabled) { @@ -162,6 +176,13 @@ protected void onBindView(View view) { view.findViewById(android.R.id.summary).setEnabled(mViewEnabled); } + // ProfileSyncServiceListener implementation: + + @Override + public void syncStateChanged() { + update(); + } + // SignInAllowedObserver @Override diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreference.java index 22db3f129df1a..69e79288ea65b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreference.java @@ -35,7 +35,10 @@ public SyncPreference(Context context, AttributeSet attrs) { public void updateSyncSummaryAndIcon() { setSummary(getSyncStatusSummary(getContext())); - if (ProfileSyncService.get().getAuthError() == GoogleServiceAuthError.State.NONE) { + if (SyncPreference.showSyncErrorIcon(getContext())) { + setIcon(ApiCompatibilityUtils.getDrawable( + getContext().getResources(), R.drawable.sync_error)); + } else { // Sets preference icon and tints it to blue. Drawable icon = ApiCompatibilityUtils.getDrawable( getContext().getResources(), R.drawable.permission_background_sync); @@ -43,12 +46,37 @@ public void updateSyncSummaryAndIcon() { getContext().getResources(), R.color.light_active_color), PorterDuff.Mode.SRC_IN); setIcon(icon); - } else { - setIcon(ApiCompatibilityUtils.getDrawable( - getContext().getResources(), R.drawable.sync_error)); } } + /** + * Checks if sync error icon should be shown. Show sync error icon if sync is off because + * of error, passphrase required or disabled in Android. + */ + public static boolean showSyncErrorIcon(Context context) { + if (!AndroidSyncSettings.isMasterSyncEnabled(context)) { + return true; + } + + ProfileSyncService profileSyncService = ProfileSyncService.get(); + if (profileSyncService != null) { + if (profileSyncService.hasUnrecoverableError()) { + return true; + } + + if (profileSyncService.getAuthError() != GoogleServiceAuthError.State.NONE) { + return true; + } + + if (profileSyncService.isSyncActive() + && profileSyncService.isPassphraseRequiredForDecryption()) { + return true; + } + } + + return false; + } + private static String getSyncStatusSummary(Context context) { if (!ChromeSigninController.get(context).isSignedIn()) return ""; @@ -77,7 +105,7 @@ private static String getSyncStatusSummary(Context context) { boolean syncEnabled = AndroidSyncSettings.isSyncEnabled(context); if (syncEnabled) { - if (!profileSyncService.isBackendInitialized()) { + if (!profileSyncService.isSyncActive()) { return res.getString(R.string.sync_setup_progress); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java index 7c1f64f9bd778..6f8e791e46e02 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java @@ -8,6 +8,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ContentSettingsType; import java.util.HashMap; @@ -102,11 +103,17 @@ private static Map getResourceInfo() { new ResourceItem(R.drawable.permission_cookie, R.string.cookies_title, R.string.cookies_title, ContentSetting.ALLOW, ContentSetting.BLOCK, R.string.website_settings_category_cookie_allowed, 0)); + // In simplified fullscreen mode, the "on" case should be described as "Always allowed", + // rather than just "Allowed". (It is disabled; this further clarifies that it is + // deliberately disabled.) + int fullscreenEnabledSummary = + ChromeFeatureList.isEnabled("ViewsSimplifiedFullscreenUI") + ? R.string.website_settings_category_always_allowed : 0; localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_FULLSCREEN, new ResourceItem(R.drawable.permission_fullscreen, R.string.website_settings_fullscreen, R.string.fullscreen_permission_title, ContentSetting.ALLOW, - ContentSetting.ASK, 0, + ContentSetting.ASK, fullscreenEnabledSummary, R.string.website_settings_category_fullscreen_ask)); localMap.put(ContentSettingsType.CONTENT_SETTINGS_TYPE_GEOLOCATION, new ResourceItem(R.drawable.permission_location, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java index d5dc057e206e8..b12bb5c92b73e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java @@ -21,6 +21,7 @@ import android.widget.TextView; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.media.cdm.MediaDrmCredentialManager; import org.chromium.chrome.browser.media.cdm.MediaDrmCredentialManager.MediaDrmCredentialManagerCallback; @@ -615,6 +616,10 @@ private void configureGlobalToggles() { } else if (mCategory.showFullscreenSites()) { globalToggle.setChecked( PrefServiceBridge.getInstance().isFullscreenAllowed()); + // With the simplified flag enabled, the fullscreen global toggle cannot be + // disabled. + globalToggle.setEnabled( + !ChromeFeatureList.isEnabled("ViewsSimplifiedFullscreenUI")); } else if (mCategory.showGeolocationSites()) { globalToggle.setChecked( LocationSettings.getInstance().isChromeLocationSettingEnabled()); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java index 14b32f48a9536..7dcf761e3a42a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java @@ -158,7 +158,7 @@ private void updatePreferenceStates() { // When showing the main menu, only one of these two will be visible, at most. if (mProtectedContentMenuAvailable && !mAutoplayMenuAvailable) { websitePrefs.add(PROTECTED_CONTENT_KEY); - } else if (mAutoplayMenuAvailable) { + } else if (mAutoplayMenuAvailable && !mProtectedContentMenuAvailable) { websitePrefs.add(AUTOPLAY_KEY); } websitePrefs.add(BACKGROUND_SYNC_KEY); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java b/chrome/android/java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java index 1e37e779c64b3..6dad228692e9b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java @@ -25,6 +25,7 @@ import org.chromium.chrome.browser.externalauth.ExternalAuthUtils; import org.chromium.chrome.browser.externalauth.VerifiedHandler; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; +import org.chromium.content.browser.ChildProcessCreationParams; import org.chromium.content.browser.ChildProcessLauncher; /** @@ -40,10 +41,9 @@ public class ChromePrerenderService extends Service { private static class LauncherWarmUpTaskParams { final Context mContext; - final ChildProcessLauncher.ChildProcessCreationParams mParams; + final ChildProcessCreationParams mParams; - LauncherWarmUpTaskParams( - Context context, ChildProcessLauncher.ChildProcessCreationParams params) { + LauncherWarmUpTaskParams(Context context, ChildProcessCreationParams params) { mContext = context; mParams = params; } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountAdder.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountAdder.java index b3a08cf99ecc6..52167449d8200 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountAdder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountAdder.java @@ -6,10 +6,13 @@ import android.app.Activity; import android.app.Fragment; +import android.content.DialogInterface; import android.content.Intent; import android.provider.Settings; +import android.support.v7.app.AlertDialog; import org.chromium.base.VisibleForTesting; +import org.chromium.chrome.R; /** * Triggers Android's account adding dialog. @@ -40,7 +43,7 @@ public static void overrideAccountAdderForTests(AccountAdder adder) { sInstance = adder; } - private static Intent createAddAccountIntent() { + private static Intent createAddGoogleAccountIntent() { Intent createAccountIntent = new Intent(Settings.ACTION_ADD_ACCOUNT); // NOTE: the documentation says Settings.EXTRA_AUTHORITIES should be used, // but it doesn't work. @@ -49,13 +52,36 @@ private static Intent createAddAccountIntent() { return createAccountIntent; } + private void onOpenAddGoogleAccountPageFailed(final Activity activity, final int result) { + AlertDialog.Builder builder = new AlertDialog.Builder(activity, R.style.AlertDialogTheme); + builder.setMessage(R.string.signin_open_add_google_account_page_failed); + builder.setPositiveButton( + R.string.signin_open_settings_accounts, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Open Accounts page in device's Settings app. + Intent openSettingsAccounts = new Intent(Settings.ACTION_SYNC_SETTINGS); + if (openSettingsAccounts.resolveActivity(activity.getPackageManager()) + != null) { + activity.startActivityForResult(openSettingsAccounts, result); + } + } + }); + builder.create().show(); + } + /** * Triggers Android's account adding dialog from a fragment. * @param fragment A fragment * @param result An intent result code */ public void addAccount(Fragment fragment, int result) { - fragment.startActivityForResult(createAddAccountIntent(), result); + Intent addGoogleAccount = createAddGoogleAccountIntent(); + if (addGoogleAccount.resolveActivity(fragment.getActivity().getPackageManager()) != null) { + fragment.startActivityForResult(addGoogleAccount, result); + } else { + onOpenAddGoogleAccountPageFailed(fragment.getActivity(), result); + } } /** @@ -64,6 +90,11 @@ public void addAccount(Fragment fragment, int result) { * @param result An intent result code */ public void addAccount(Activity activity, int result) { - activity.startActivityForResult(createAddAccountIntent(), result); + Intent addGoogleAccount = createAddGoogleAccountIntent(); + if (addGoogleAccount.resolveActivity(activity.getPackageManager()) != null) { + activity.startActivityForResult(addGoogleAccount, result); + } else { + onOpenAddGoogleAccountPageFailed(activity, result); + } } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java index 62deb41a6c885..915deb2f536eb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountManagementFragment.java @@ -119,6 +119,13 @@ public class AccountManagementFragment extends PreferenceFragment public void onCreate(Bundle savedState) { super.onCreate(savedState); + // Prevent sync from starting if it hasn't already to give the user a chance to change + // their sync settings. + ProfileSyncService syncService = ProfileSyncService.get(); + if (syncService != null) { + syncService.setSetupInProgress(true); + } + mGaiaServiceType = AccountManagementScreenHelper.GAIA_SERVICE_TYPE_NONE; if (getArguments() != null) { mGaiaServiceType = @@ -156,6 +163,17 @@ public void onPause() { } } + @Override + public void onDestroy() { + super.onDestroy(); + + // Allow sync to begin syncing if it hasn't yet. + ProfileSyncService syncService = ProfileSyncService.get(); + if (syncService != null) { + syncService.setSetupInProgress(false); + } + } + /** * Initiate fetching the user accounts data (images and the full name). * Fetched data will be sent to observers of ProfileDownloader. @@ -489,7 +507,9 @@ public void onSignOutDialogDismissed(boolean signOutClicked) { @Override public void syncStateChanged() { SyncPreference pref = (SyncPreference) findPreference(PREF_SYNC_SETTINGS); - pref.updateSyncSummaryAndIcon(); + if (pref != null) { + pref.updateSyncSummaryAndIcon(); + } // TODO(crbug/557784): Show notification for sync error } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java index 995a0e5e78507..a9a9729a85706 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java @@ -174,11 +174,13 @@ public boolean isInteractive() { } /** - * Returns whether the sign-in flow activity was set but is no longer valid. + * Returns whether the sign-in flow activity was set but is no longer visible to the user. */ - private boolean isActivityDestroyed() { + private boolean isActivityInvisible() { return activity != null - && ApplicationStatus.getStateForActivity(activity) == ActivityState.DESTROYED; + && (ApplicationStatus.getStateForActivity(activity) == ActivityState.STOPPED + || ApplicationStatus.getStateForActivity(activity) + == ActivityState.DESTROYED); } } @@ -388,7 +390,7 @@ private void progressSignInFlowCheckPolicy() { return; } - if (mSignInState.isActivityDestroyed()) { + if (mSignInState.isActivityInvisible()) { abortSignIn(); return; } @@ -415,7 +417,7 @@ private void onPolicyCheckedBeforeSignIn(String managementDomain) { return; } - if (mSignInState.isActivityDestroyed()) { + if (mSignInState.isActivityInvisible()) { abortSignIn(); return; } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java index baf3e918b00db..84703b8faaf1c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/Tab.java @@ -84,6 +84,7 @@ import org.chromium.chrome.browser.tabmodel.TabModelImpl; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabReparentingParams; +import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.security_state.ConnectionSecurityLevel; @@ -104,6 +105,7 @@ import org.chromium.printing.PrintingController; import org.chromium.printing.PrintingControllerImpl; import org.chromium.ui.WindowOpenDisposition; +import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; @@ -371,6 +373,7 @@ public class Tab implements ViewGroup.OnHierarchyChangeListener, private View mSadTabView; private final int mDefaultThemeColor; + private int mThemeColor; private ChromeDownloadDelegate mDownloadDelegate; @@ -560,6 +563,12 @@ public void onSSLStateUpdated(Tab tab) { PolicyAuditor.nativeGetCertificateFailure(getWebContents()), getApplicationContext()); updateFullscreenEnabledState(); + updateThemeColorIfNeeded(); + } + + @Override + public void onUrlUpdated(Tab tab) { + updateThemeColorIfNeeded(); } @Override @@ -630,9 +639,11 @@ public Tab(int id, int parentId, boolean incognito, Context context, mDefaultThemeColor = mIncognito ? ApiCompatibilityUtils.getColor(resources, R.color.incognito_primary_color) : ApiCompatibilityUtils.getColor(resources, R.color.default_primary_color); + mThemeColor = calculateThemeColor(); } else { mIdealFaviconSize = 16; mDefaultThemeColor = 0; + mThemeColor = mDefaultThemeColor; } // Restore data from the TabState, if it existed. @@ -1051,9 +1062,51 @@ public int getBackgroundColor() { * security state. */ public int getThemeColor() { + return mThemeColor; + } + + private int calculateThemeColor() { + // Theme color support is currently disabled for tablets. + if (DeviceFormFactor.isTablet(getApplicationContext())) return getDefaultThemeColor(); + if (isNativePage()) return mNativePage.getThemeColor(); - if (mWebContentsObserver != null) return mWebContentsObserver.getThemeColor(); - return mDefaultThemeColor; + + int themeColor = getDefaultThemeColor(); + if (getWebContents() != null) { + themeColor = getWebContents().getThemeColor(); + if (themeColor != 0 && !ColorUtils.isValidThemeColor(themeColor)) themeColor = 0; + } + + // Do not apply the theme color if there are any security issues on the page. + int securityLevel = getSecurityLevel(); + if (securityLevel == ConnectionSecurityLevel.SECURITY_ERROR + || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING + || securityLevel == ConnectionSecurityLevel.SECURITY_POLICY_WARNING) { + themeColor = getDefaultThemeColor(); + } + + if (isShowingInterstitialPage()) themeColor = getDefaultThemeColor(); + + if (themeColor == Color.TRANSPARENT) themeColor = getDefaultThemeColor(); + if (isIncognito()) themeColor = getDefaultThemeColor(); + + // Ensure there is no alpha component to the theme color as that is not supported in the + // dependent UI. + themeColor |= 0xFF000000; + return themeColor; + } + + /** + * Determines if the theme color has changed and notifies the listeners if it has. + */ + void updateThemeColorIfNeeded() { + int themeColor = calculateThemeColor(); + if (themeColor == mThemeColor) return; + mThemeColor = themeColor; + RewindableIterator observers = getTabObservers(); + while (observers.hasNext()) { + observers.next().onDidChangeThemeColor(this, themeColor); + } } /** @@ -1315,9 +1368,7 @@ private void showNativePage(NativePage nativePage) { // Notifying of theme color change before content change because some of // the observers depend on the theme information being correct in // onContentChanged(). - for (TabObserver observer : mObservers) { - observer.onDidChangeThemeColor(this, mDefaultThemeColor); - } + updateThemeColorIfNeeded(); notifyContentChanged(); destroyNativePageInternal(previousNativePage); } @@ -1801,6 +1852,7 @@ private void setContentViewCore(ContentViewCore cvc) { mSwipeRefreshHandler = new SwipeRefreshHandler(mThemedApplicationContext); mSwipeRefreshHandler.setContentViewCore(mContentViewCore); + updateThemeColorIfNeeded(); notifyContentChanged(); // For browser tabs, we want to set accessibility focus to the page @@ -2458,8 +2510,6 @@ public void swapContentViewCore(ContentViewCore newContentViewCore, } destroyNativePageInternal(previousNativePage); - mWebContentsObserver.didChangeThemeColor( - getWebContents().getThemeColor(mDefaultThemeColor)); for (TabObserver observer : mObservers) { observer.onWebContentsSwapped(this, didStartLoad, didFinishLoad); } @@ -3008,13 +3058,16 @@ public static Tab createFrozenTabFromState( * they're obscured by another view. */ public void updateAccessibilityVisibility() { - int importantForAccessibility = isObscuredByAnotherViewForAccessibility() - ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS - : View.IMPORTANT_FOR_ACCESSIBILITY_YES; - if (getView().getImportantForAccessibility() != importantForAccessibility) { - getView().setImportantForAccessibility(importantForAccessibility); - getView().sendAccessibilityEvent( - AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + View view = getView(); + if (view != null) { + int importantForAccessibility = isObscuredByAnotherViewForAccessibility() + ? View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS + : View.IMPORTANT_FOR_ACCESSIBILITY_YES; + if (view.getImportantForAccessibility() != importantForAccessibility) { + view.setImportantForAccessibility(importantForAccessibility); + view.sendAccessibilityEvent( + AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + } } ContentViewCore cvc = getContentViewCore(); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index f5463a0403b88..cff1092c103f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java @@ -4,8 +4,6 @@ package org.chromium.chrome.browser.tab; -import android.content.Context; -import android.graphics.Color; import android.os.SystemClock; import android.support.annotation.IntDef; import android.view.View; @@ -23,10 +21,8 @@ import org.chromium.chrome.browser.metrics.UmaUtils; import org.chromium.chrome.browser.policy.PolicyAuditor; import org.chromium.chrome.browser.policy.PolicyAuditor.AuditEvent; -import org.chromium.components.security_state.ConnectionSecurityLevel; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; -import org.chromium.ui.base.DeviceFormFactor; import java.util.concurrent.TimeUnit; @@ -65,12 +61,10 @@ public class TabWebContentsObserver extends WebContentsObserver { private static final int TAB_RENDERER_EXIT_STATUS_MAX = 6; private final Tab mTab; - private int mThemeColor; public TabWebContentsObserver(WebContents webContents, Tab tab) { super(webContents); mTab = tab; - mThemeColor = mTab.getDefaultThemeColor(); } @Override @@ -267,32 +261,14 @@ public void didFirstVisuallyNonEmptyPaint() { @Override public void didChangeThemeColor(int color) { - int securityLevel = mTab.getSecurityLevel(); - if (securityLevel == ConnectionSecurityLevel.SECURITY_ERROR - || securityLevel == ConnectionSecurityLevel.SECURITY_WARNING - || securityLevel == ConnectionSecurityLevel.SECURITY_POLICY_WARNING) { - color = mTab.getDefaultThemeColor(); - } - if (mTab.isShowingInterstitialPage()) color = mTab.getDefaultThemeColor(); - if (!isThemeColorEnabled(mTab.getApplicationContext())) { - color = mTab.getDefaultThemeColor(); - } - if (color == Color.TRANSPARENT) color = mTab.getDefaultThemeColor(); - if (mTab.isIncognito()) color = mTab.getDefaultThemeColor(); - color |= 0xFF000000; - if (mTab.getThemeColor() == color) return; - mThemeColor = color; - RewindableIterator observers = mTab.getTabObservers(); - while (observers.hasNext()) { - observers.next().onDidChangeThemeColor(mTab, mTab.getThemeColor()); - } + mTab.updateThemeColorIfNeeded(); } @Override public void didAttachInterstitialPage() { mTab.getInfoBarContainer().setVisibility(View.INVISIBLE); mTab.showRenderedPage(); - didChangeThemeColor(mTab.getDefaultThemeColor()); + mTab.updateThemeColorIfNeeded(); RewindableIterator observers = mTab.getTabObservers(); while (observers.hasNext()) { @@ -312,7 +288,7 @@ public void didAttachInterstitialPage() { @Override public void didDetachInterstitialPage() { mTab.getInfoBarContainer().setVisibility(View.VISIBLE); - didChangeThemeColor(mTab.getWebContents().getThemeColor(mTab.getDefaultThemeColor())); + mTab.updateThemeColorIfNeeded(); RewindableIterator observers = mTab.getTabObservers(); while (observers.hasNext()) { @@ -341,15 +317,4 @@ public void destroy() { mTab.getApplicationContext(), mTab.getId(), false, false, mTab.getUrl()); super.destroy(); } - - /** - * @return The theme-color for this web contents. - */ - int getThemeColor() { - return mThemeColor; - } - - private static boolean isThemeColorEnabled(Context context) { - return !DeviceFormFactor.isTablet(context); - } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java index 5deec59ae6178..7050fe6cc99f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java @@ -274,9 +274,10 @@ public void saveState() { /** * Load the saved tab state. This should be called before any new tabs are created. The saved * tabs shall not be restored until {@link #restoreTabs} is called. + * @param ignoreIncognitoFiles Whether to skip loading incognito tabs. */ - public void loadState() { - mTabSaver.loadState(); + public void loadState(boolean ignoreIncognitoFiles) { + mTabSaver.loadState(ignoreIncognitoFiles); } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java index 000ebc4b0e250..389f455b3f213 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java @@ -352,14 +352,15 @@ public void saveState() { /** * Restore saved state. Must be called before any tabs are added to the list. + * @param ignoreIncognitoFiles Whether to skip loading incognito tabs. */ - public void loadState() { + public void loadState(boolean ignoreIncognitoFiles) { long time = SystemClock.elapsedRealtime(); waitForMigrationToFinish(); logExecutionTime("LoadStateTime", time); mCancelNormalTabLoads = false; - mCancelIncognitoTabLoads = false; + mCancelIncognitoTabLoads = ignoreIncognitoFiles; mNormalTabsRestored = new SparseIntArray(); mIncognitoTabsRestored = new SparseIntArray(); try { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java index bb6851f04678f..33575143b3fb4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java @@ -99,12 +99,10 @@ public void createTabInOtherWindow(LoadUrlParams loadUrlParams, Activity activit int parentId) { Intent intent = createNewTabIntent(new AsyncTabCreationParams(loadUrlParams), parentId); - Class targetActivity = + Class targetActivity = MultiWindowUtils.getInstance().getOpenInOtherWindowActivity(activity); if (targetActivity == null) return; - intent.setClass(activity, targetActivity); - - intent.addFlags(MultiWindowUtils.FLAG_ACTIVITY_LAUNCH_ADJACENT); + MultiWindowUtils.setOpenInOtherWindowIntentExtras(intent, activity, targetActivity); IntentHandler.addTrustedIntentExtras(intent, activity); activity.startActivity(intent); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java index 31b362f7fbca2..547a2d624192f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java @@ -138,8 +138,10 @@ public void onClick(View v) { if (currentTab == null || currentTab.getWebContents() == null) return; Activity activity = currentTab.getWindowAndroid().getActivity().get(); if (activity == null) return; - WebsiteSettingsPopup.show(activity, currentTab, mState == STATE_TITLE_ONLY - ? parsePublisherNameFromUrl(currentTab.getUrl()) : null); + String publisherName = mState == STATE_TITLE_ONLY + ? parsePublisherNameFromUrl(currentTab.getUrl()) : null; + WebsiteSettingsPopup.show(activity, currentTab, publisherName, + WebsiteSettingsPopup.OPENED_FROM_TOOLBAR); } }); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java index 5837795516550..5025ff19494bc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbarAnimationDelegate.java @@ -33,6 +33,7 @@ class CustomTabToolbarAnimationDelegate { private static final int CUSTOM_TAB_TOOLBAR_FADE_DURATION_MS = 150; private final View mSecurityButton; + private final View mTitleUrlContainer; private final AnimatorSet mSecurityButtonShowAnimator; private final AnimatorSet mSecurityButtonHideAnimator; @@ -46,6 +47,7 @@ class CustomTabToolbarAnimationDelegate { */ CustomTabToolbarAnimationDelegate(View securityButton, final View titleUrlContainer) { mSecurityButton = securityButton; + mTitleUrlContainer = titleUrlContainer; mSecurityButtonShowAnimator = new AnimatorSet(); int securityButtonWidth = securityButton.getResources() @@ -155,22 +157,25 @@ public void onAnimationEnd(Animator animation) { } /** - * Starts the animation to show the security button. Will do nothing if the button is already - * visible. + * Starts the animation to show the security button. */ void showSecurityButton() { - if (mSecurityButton.getVisibility() == View.VISIBLE) return; - if (mSecurityButtonShowAnimator.isRunning()) mSecurityButtonShowAnimator.cancel(); + if (mSecurityButtonShowAnimator.isStarted()) return; mSecurityButtonShowAnimator.start(); } /** - * Starts the animation to hide the security button. Will do nothing if the button is not - * visible. + * Starts the animation to hide the security button. */ void hideSecurityButton() { - if (mSecurityButton.getVisibility() == View.GONE) return; - if (mSecurityButtonHideAnimator.isRunning()) return; + // An optimization for the case that show and hide are called almost at the same time. + if (mSecurityButtonShowAnimator.isStarted() + && mSecurityButton.getVisibility() == View.GONE) { + mSecurityButtonShowAnimator.cancel(); + mTitleUrlContainer.setTranslationX(0); + return; + } + if (mSecurityButtonHideAnimator.isStarted()) return; mSecurityButtonHideAnimator.start(); } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java index 14f4b12e69939..95790b452840c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarPhone.java @@ -106,7 +106,6 @@ public class ToolbarPhone extends ToolbarLayout private View mUrlActionsContainer; private ImageView mToolbarShadow; - private final int mProgressBackBackgroundColor; private final int mProgressBackBackgroundColorWhite; private ObjectAnimator mTabSwitcherModeAnimation; @@ -273,8 +272,6 @@ public ToolbarPhone(Context context, AttributeSet attrs) { // Insets used for the PhoneLocatioBar background drawable. mLocationBarInsets = getResources().getDimensionPixelSize(R.dimen.location_bar_margin_top) + getResources().getDimensionPixelSize(R.dimen.location_bar_margin_bottom); - mProgressBackBackgroundColor = - ApiCompatibilityUtils.getColor(getResources(), R.color.progress_bar_background); mProgressBackBackgroundColorWhite = ApiCompatibilityUtils.getColor(getResources(), R.color.progress_bar_background_white); mLightModeDefaultColor = @@ -1993,6 +1990,15 @@ && isVisualStateValidForBrandColorTransition(newVisualState)) { boolean visualStateChanged = mVisualState != newVisualState; int currentPrimaryColor = getToolbarDataProvider().getPrimaryColor(); + int themeColorForProgressBar = currentPrimaryColor; + + // If The page is native force the use of the standard theme for the progress bar. + if (getToolbarDataProvider() != null && getToolbarDataProvider().getTab() != null + && getToolbarDataProvider().getTab().isNativePage()) { + VisualState visualState = isIncognito() ? VisualState.INCOGNITO : VisualState.NORMAL; + themeColorForProgressBar = getToolbarColorForVisualState(visualState); + } + if (mVisualState == VisualState.BRAND_COLOR && !visualStateChanged) { boolean useLightToolbarDrawables = ColorUtils.shoudUseLightForegroundOnBackground(currentPrimaryColor); @@ -2004,7 +2010,7 @@ && isVisualStateValidForBrandColorTransition(newVisualState)) { visualStateChanged = true; } else { updateToolbarBackground(VisualState.BRAND_COLOR); - getProgressBar().setThemeColor(currentPrimaryColor, isIncognito()); + getProgressBar().setThemeColor(themeColorForProgressBar, isIncognito()); } } @@ -2024,6 +2030,8 @@ && isVisualStateValidForBrandColorTransition(newVisualState)) { mUnfocusedLocationBarUsesTransparentBg = false; mUrlBackgroundAlpha = 255; updateToolbarBackground(mVisualState); + getProgressBar().setThemeColor(themeColorForProgressBar, isIncognito()); + if (isInTabSwitcherMode) { mUseLightToolbarDrawables = true; mUrlBackgroundAlpha = LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA; @@ -2033,7 +2041,6 @@ && isVisualStateValidForBrandColorTransition(newVisualState)) { } else if (isIncognito()) { mUseLightToolbarDrawables = true; mUrlBackgroundAlpha = LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA; - getProgressBar().setThemeColor(currentPrimaryColor, true); } else if (mVisualState == VisualState.BRAND_COLOR) { mUseLightToolbarDrawables = ColorUtils.shoudUseLightForegroundOnBackground(currentPrimaryColor); @@ -2041,11 +2048,6 @@ && isVisualStateValidForBrandColorTransition(newVisualState)) { !ColorUtils.shouldUseOpaqueTextboxBackground(currentPrimaryColor); mUrlBackgroundAlpha = mUnfocusedLocationBarUsesTransparentBg ? LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA : 255; - getProgressBar().setThemeColor(currentPrimaryColor, false); - } else { - getProgressBar().setBackgroundColor(mProgressBackBackgroundColor); - getProgressBar().setForegroundColor(ApiCompatibilityUtils.getColor(getResources(), - R.color.progress_bar_foreground)); } if (mToggleTabStackButton != null) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java index 2b7a7110b612b..6dd0c4b6fd310 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/ColorUtils.java @@ -20,6 +20,7 @@ public class ColorUtils { private static final float CONTRAST_LIGHT_ITEM_THRESHOLD = 3f; private static final float LIGHTNESS_OPAQUE_BOX_THRESHOLD = 0.82f; private static final float LOCATION_BAR_TRANSPARENT_BACKGROUND_ALPHA = 0.2f; + private static final float MAX_LUMINANCE_FOR_VALID_THEME_COLOR = 0.94f; /** Percentage to darken a color by when setting the status bar color. */ private static final float DARKEN_COLOR_FRACTION = 0.6f; @@ -155,4 +156,13 @@ public static int getOpaqueColor(int color) { public static boolean isUsingDefaultToolbarColor(Resources resources, int color) { return color == ApiCompatibilityUtils.getColor(resources, R.color.default_primary_color); } + + /** + * Determine if a theme color is valid. A theme color is invalid if its luminance is > 0.94. + * @param color The color to test. + * @return True if the theme color is valid. + */ + public static boolean isValidThemeColor(int color) { + return ColorUtils.getLightnessForColor(color) <= MAX_LUMINANCE_FOR_VALID_THEME_COLOR; + } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java index c25ccaebbc11b..0b7ed276effc4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java @@ -17,6 +17,7 @@ import org.chromium.base.Log; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.ShortcutHelper; +import org.chromium.chrome.browser.ShortcutSource; import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.metrics.LaunchMetrics; import org.chromium.chrome.browser.tab.Tab; @@ -87,6 +88,17 @@ public void onCreate(Bundle savedInstanceState) { // Activity. launchIntent.setAction(Intent.ACTION_VIEW); launchIntent.setData(Uri.parse(WebappActivity.WEBAPP_SCHEME + "://" + webappId)); + + // If this is launching from a notification, we want to ensure that the URL being + // launched is the URL in the intent. If a paused WebappActivity exists for this id, + // then by default it will be focused and we have no way of sending the desired URL + // to it (the intent is swallowed). As a workaround, set the CLEAR_TOP flag to + // ensure that the existing Activity is cleared and relaunched with this intent. + // TODO(dominickn): ideally, we want be able to route an intent to + // WebappActivity.onNewIntent instead of restarting the Activity. + if (webappSource == ShortcutSource.NOTIFICATION) { + launchIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + } } else { Log.e(TAG, "Shortcut (%s) opened in Chrome.", webappUrl); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java index 3a0c9423e5bcd..c00f37c3b7bc6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBar.java @@ -16,9 +16,11 @@ import android.widget.FrameLayout.LayoutParams; import android.widget.ProgressBar; +import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.CommandLine; import org.chromium.base.VisibleForTesting; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.util.ColorUtils; import org.chromium.components.variations.VariationsAssociatedData; @@ -75,6 +77,7 @@ interface AnimationLogic { private int mMarginTop; private ViewGroup mControlContainer; private int mProgressStartCount; + private int mThemeColor; private ToolbarProgressBarAnimatingView mAnimatingView; @@ -199,7 +202,13 @@ public void initializeAnimation() { animationParams.topMargin = mMarginTop; mAnimatingView = new ToolbarProgressBarAnimatingView(getContext(), animationParams); - setForegroundColor(getForegroundColor()); + + // The primary theme color may not have been set. + if (mThemeColor != 0) { + setThemeColor(mThemeColor, false); + } else { + setForegroundColor(getForegroundColor()); + } UiUtils.insertAfter(mControlContainer, mAnimatingView, this); } else if (TextUtils.equals(animation, "fast-start")) { mAnimationLogic = new ProgressAnimationFastStart(); @@ -257,6 +266,7 @@ public void finish(boolean delayed) { if (mAnimatingView != null) { removeCallbacks(mStartIndeterminate); mAnimatingView.cancelAnimation(); + mTargetProgress = 0; } setAlpha(0.0f); } @@ -348,6 +358,19 @@ public void setVisibility(int visibility) { * @param color The Android color the toolbar is using. */ public void setThemeColor(int color, boolean isIncognito) { + mThemeColor = color; + + // The default toolbar has specific colors to use. + if ((ColorUtils.isUsingDefaultToolbarColor(getResources(), color) + || !ColorUtils.isValidThemeColor(color)) && !isIncognito) { + setForegroundColor(ApiCompatibilityUtils.getColor(getResources(), + R.color.progress_bar_foreground)); + setBackgroundColor(ApiCompatibilityUtils.getColor(getResources(), + R.color.progress_bar_background)); + return; + } + + // All other theme colors are computed. if (!ColorUtils.shoudUseLightForegroundOnBackground(color) && !isIncognito) { // Light theme. setForegroundColor(ColorUtils.getColorWithOverlay(Color.BLACK, color, diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java index 71a01accf8fce..a48fc1c1de1d6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/ToolbarProgressBarAnimatingView.java @@ -193,6 +193,7 @@ public void cancelAnimation() { animate().cancel(); setAlpha(0.0f); mLastAnimatedFraction = 0.0f; + mProgressWidth = 0; } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/FocusAnimator.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/FocusAnimator.java index b52fed9a933d5..91243b1a4633b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/FocusAnimator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/animation/FocusAnimator.java @@ -145,6 +145,9 @@ public void onAnimationUpdate(ValueAnimator animation) { @Override public void onAnimationEnd(Animator animator) { finishAnimation(callback); + + // Request a layout to put everything in the right final place. + mLayout.requestLayout(); } }); animator.start(); diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd index f2b0fdaaf31c1..b9e815df2ab72 100644 --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd @@ -218,7 +218,7 @@ CHAR-LIMIT guidelines: Google Activity Controls - Control how Google uses your browsing history to personalize Search and other Google services. + Control how Google uses your browsing history to personalize Search, ads, and other Google services. Sync error occurred, tap to get details. @@ -1752,6 +1752,12 @@ You are signing in with a managed account and giving its administrator control o Add account + + Add a Google Account from the Accounts page in your device's Settings app. + + + Open settings + Make Chrome yours diff --git a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb index c914b44912f28..8b987d02c80e4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb @@ -71,11 +71,10 @@ ይክፈሉ አዲስ ማንነት የማያሳውቅ ትር የአሰሳ መሳቢያ ዝጋ -የመላኪያ አድራሻን ምረጥ +የመላኪያ አድራሻን ይምረጡ Android ቅንብሮች ውስጥ ፍቃዶችን ለChrome ያብሩ። የይለፍ ቃላትን አስቀምጥ ጀምሮ በGoogle ይለፍ ቃል አመስጥር -Google ፍለጋን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ብሎ የአሰሳ ታሪክዎን እንዴት እንደሚጠቀምበት ይቆጣጠሩት። እባክዎ የመግቢያ ዝርዝሮችዎን ያዘምኑ። የላቀ የChrome ገንቢ ዕልባቶች @@ -129,6 +128,7 @@ ተዘርግቷል - ለመሰብሰብ ጠቅ ያድርጉ አዲስ ስሪት ይገኛል ሞኖስፔስ +ጃቫስክሪፕትን ለአንድ የተወሰነ ጣቢያ ፍቀድ። የእርስዎ ወላጆች እነዚህን ቅንብሮች ማቀናበር ላይ ያግዛሉ። አስገባ ለቅቀህ ውጣ @@ -140,7 +140,7 @@ አሁን ከዝርዝር አስወግድ ምንም የብሉቱዝ መሳሪያዎች አልተገኙም። እንደገና ይፈልጉ -መላኪያን ምረጥ +መላኪያ ይምረጡ መሣሪያዎ አይታየዎትም? እገዛ ያግኙ ከሙሉ ማያ ገጽ ለመውጣት የተመለስ አዝራሩን ይንኩ። ወላጅ አቃፊ @@ -152,6 +152,7 @@ አድራሻዎች ጣቢያዎች የኩኪ ውሂብ እንዲያስቀምጡ እና እንዲያነቡ ይፍቀዱ (የሚመከር) ይህ መለያ የሚቀናበረው በ እና ነው። +ትሮችዎን ከሌሎች መሣሪያዎችዎ ለማግኘት በAndroid የመለያ ቅንብሮች ውስጥ «ውሂብን በራስ-አስምር»ን ያብሩ። የቅጂ መብት Google Inc. ሁሉም መብቶች የተጠበቁ ናቸው። የእውቅና ማረጋገጫ መመልከቻ የይለፍ ሐረግ ይፍጠሩ @@ -188,6 +189,7 @@ በሚቀናበር መለያ እየገቡ ነው፣ ይህም የChrome መገለጫዎ ቁጥጥር ለአስተዳዳሪው ይሰጠዋል። የእርስዎ Chrome ውሂብ እስከመጨረሻው ከዚህ መለያ ጋር የተሳሰረ ይሆናል። ከዚህ መለያ ማላቀቅ አካባቢያዊውን የChrome ውሂብ ይሰርዘዋል።
ምስል አጋራ +ጣቢያዎች አካባቢዎን እንዲያውቁ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር) በስርዓተ-ፋይል ስህተቶች ምክንያት ን ማውረድ አልተሳካም። መጠን፦ አንቃ @@ -240,6 +242,7 @@ የትርጉም ቋንቋ፦ የክፍት ምንጭ ፍቃዶች ዳሰሳ ታግዷል፦ +የስምረት ስህተት ተከስቷል፣ ዝርዝሮችን ለማግኘት መታ ያድርጉ። የአገናኝ አድራሻ ቅዳ ን በጭራሽ አትተርጉም ማህደረ መረጃ @@ -254,6 +257,7 @@ ባነሰ ተጨማሪ ያስሱ ላይ ዕልባት ተደርጓል የወደፊት በአቅራቢያ ያሉ አካላዊ ድረ-ገጾች በእርስዎ የማሳወቂያ ዝርዝር ውስጥ ይታያሉ +ጣቢያዎች ካሜራዎን እንዲጠቀሙ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር) ቁልፍ ማመንጨት የእርስዎን የይለፍ ሐረግ ያለው ሰው ብቻ ነው የተመሰጠረ ውሂብዎን ማየት የሚችለው። የይለፍ ሐረጉ ለGoogle አይላክም ወይም አይከማችም። የይለፍ ሐረግዎን ከረሱት ስምረትን ዳግም ማስጀመር ይኖርብዎታል። የበለጠ ለመረዳት {DAYS,plural, =1{ከ# ቀን በፊት}one{ከ# ቀኖች በፊት}other{ከ# ቀኖች በፊት}} @@ -272,6 +276,7 @@ ትሮች በChrome ውስጥ ወደሚገኝ የትር ቀያያሪ ይንቀሳቀሳሉ። Chromeን ለማሄድ የሚያስፈልግ አንድ መሠረታዊ ተግበር ይጎድላል፤ ወይም Chrome ጭነትዎ ያልተሟላ ነው ወይም ከዚህ የAndroid ስሪት ጋር ተኳሃኝ አይደለም። የተሸጎጡ ምስሎች እና ፋይሎች +በእርስዎ የመሣሪያ ቅንብሮች መተግበሪያ ውስጥ ካለው የመለያዎች ገጽ ላይ የGoogle መለያ ያክሉ። ውስጥ ክፈት አዘምን የተመሳሰለበት የመጨረሻው ጊዜ፦ @@ -323,6 +328,7 @@ አስቀምጥ የወላጅ መቆጣጠሪያዎች ስም +ጣቢያዎች ጃቫስክሪፕትን እንዲያሄዱ ፍቀድላቸው (የሚመከር) ተሰርዟል የአካባቢ መዳረሻ እንዲሁም ለዚህ መሣሪያ ጠፍቷል በጭራሽ አትላክ @@ -360,6 +366,7 @@ ማንነት የማያሳውቁ ትሮች መግለጫ ውስጥ ያለውን ነባር መተካት ይፈልጋሉ? +Google ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ ብሎ የአሰሳ ታሪክዎን እንዴት እንደሚጠቀምበት ይቆጣጠሩት። ፍቃዶች {HOURS,plural, =1{ከ# ሰዓት በፊት}one{ከ# ሰዓቶች በፊት}other{ከ# ሰዓቶች በፊት}} አጣምር @@ -368,6 +375,7 @@ ውሂብ ቆጣቢ ነቅቷል አጥፋ የተቀመጡ የይለፍ ቃሎች +ጣቢያዎች ወደ ሙሉ ማያ ገጽ እንዲገቡ ከመፍቀድዎ በፊት መጀመሪያ ይጠይቅ (የሚመከር) አዲስ ፋይል ይፍጠሩ ኩኪዎችንም ጨምሮ በዚህ ድር ጣቢያ የተከማቸ ሁሉም አካባቢያዊ ውሂብ ይሰረዛል። Google ትርጉም @@ -392,6 +400,7 @@ አገር/ክልል የውሂብ ቁጠባዎች ተጨማሪ ለመረዳት +ለየት ያለ ጣቢያን አክል የተለዩ «አትከታተል»ን ማንቃት ማለት አንድ ጥያቄ በአሰሳ ትራፊክዎ ላይ ይካተታል ማለት ነው። ማንኛውም ውጤት አንድ ድር ጣቢያ ለጥያቄው ምላሽ ከሰጠና ጥያቄውን በሚተረጎምበት መንገድ ላይ የሚወሰን ነው። @@ -453,6 +462,7 @@ ተደራሽነት መተግበሪያውን ከGoogle Play መደብር ያግኙ፦ የደህንነት ሊሆኑ የሚችሉ የክስተቶች ዝርዝር በራስ-ሰር ለGoogle ሪፖርት አድርግ +ጣቢያዎች ማይክሮፎንዎን እንዲጠቀሙ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር) የGoogle መለያ ያረጋግጡ ወርዷል በአሳሽ ውስጥ ክፈት @@ -515,6 +525,7 @@ ዕቃን የማጓጓዝ ስራ የመጀመሪያውን ጫን አቅራቢያ ምን እንዳለ ይመልከቱ +ሁልጊዜ የተፈቀደለት አድራሻ አክል ውሰድ የይለፍ ሐረግ ያረጋግጡ @@ -559,6 +570,7 @@ ፍቀድ (ለአድራሻ አሞሌ ፍለጋዎች) ጋር ማሥመር መደበኛ ትሮች +ለአንድ የተወሰነ ጣቢያ የጀርባ ስምረትን ይፍቀዱ። TalkBackን ወደ አዲስ ስሪት ማዘመን አለብዎት። የተፈቀደላቸው ጣቢያዎች ብቻ ሙሉ ታሪክ አሳይ @@ -593,6 +605,7 @@ ይሄ እንዴት እንደሚሠራ በቅንብሮች ውስጥ ይቆጣጠሩ ዕልባቶች ገብቷል። በ መግባት እንደ ዕልባቶች ያለ በመለያዎች መካከል የተመሳሰለ ውሂብ ያዋህዳል። መረጃ አለያይቶ ለማቆየት የአሰሳ ውሂብ በቅንብሮች ውስጥ ያጽዱ። +ጣቢያዎች ብቅ-ባዮችን እንዳያሳዩ ያግዱ (የሚመከር) የመላኪያ አድራሻ ፣ ትር ማከማቻ @@ -622,6 +635,7 @@ የይለፍ ሐረግ ያስፈልጋል የመሣሪያ ምስክርነቶችን ዳግም ያስጀምሩ የመጀመሪያውን አሳይ +ጣቢያዎች ማሳወቂያዎችን እንዲልኩ ከመፍቀድ በፊት ይጠይቅ (የሚመከር) የስምረት መለያዎችን ከ ወደ እየቀየሩ ነው። በነባሮቹ የእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ምን ማድረግ ይችላሉ? በአቅራቢያ ያሉ አካላዊ ድረ-ገጾች ለሞባይል ተስማሚ እይታ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb index 4f24dd9a7dfcd..a66f70b0abcd7 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb @@ -75,7 +75,6 @@ ‏تشغيل الإذن لـ Chrome في إعدادات Android حفظ كلمات المرور ‏ترميز الكل باستخدام كلمة مرور Google بدءًا من -‏يمكنك التحكم في الطريقة التي تتبعها Google عند استخدام سجل التصفح لتخصيص البحث وخدمات Google الأخرى. الرجاء تحديث تفاصيل تسجيل الدخول. إعدادات متقدمة ‏الإشارات المرجعية لإصدار مطوّري البرامج من Chrome @@ -129,6 +128,7 @@ تم التوسيع - انقر للتصغير. يتوفر إصدار أحدث أحادي المسافة +السماح بجافا سكريبت لموقع ويب معين. يساعد أبواك في إدارة هذه الإعدادات. إرسال الخروج @@ -152,6 +152,7 @@ العناوين السماح للمواقع بحفظ بيانات ملفات تعريف الارتباط وقراءتها (موصى به) تتم إدارة هذا الحساب بواسطة و . +‏للحصول على علامات التبويب من أجهزتك الأخرى، شغِّل "المزامنة التلقائية للبيانات" في إعدادات حساب Android. ‏حقوق الطبع والنشر لعام لصالح شركة .Google Inc. جميع الحقوق محفوظة. عارض الشهادات إنشاء عبارة المرور @@ -186,12 +187,13 @@ استيراد البيانات الحالية ‏تتم إدارة هذا الحساب من خلال . لقد سجلت دخولك باستخدام حساب مُدار تمنح المشرف عليه إمكانية التحكم في ملفك الشخصي على Chrome. ستظل بياناتك على Chrome مرتبطة دائمًا بهذا الحساب. ويؤدي إلغاء الربط بهذا الحساب إلى حذف بيانات Chrome المحلية. مشاركة صورة +السؤال قبل السماح للمواقع بمعرفة الموقع (موصى به) أخفق تنزيل الملف بسبب أخطاء في نظام الملف. الحجم: تمكين الإضافات ‏سجّل الدخول إلى حسابك في Google للحصول على الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى على جميع أجهزتك. ‏Smart Lock لكلمات المرور -تابة جديدة للتصفح المتخفي +علامة تبويب جديدة للتصفح المتخفي القبول والمتابعة التحديث متاح. مزيد من الخيارات المجلد @@ -238,6 +240,7 @@ لغة الترجمة: تراخيص البرامج مفتوحة المصدر التنقل محظور: +حدث خطأ في المزامنة، انقر للحصول على التفاصيل. نسخ عنوان الرابط عدم الترجمة مطلقًا من اللغة الوسائط @@ -252,6 +255,7 @@ تصفح المزيد بتكلفة أقل أُضيفَت إشارة مرجعية إلى سيتم عرض صفحات الشبكة المادية المجاورة المستقبلية في قائمة الإشعارات +السؤال أولاً قبل السماح للمواقع باستخدام الكاميرا (موصى به) إنشاء مفتاح ‏لا يمكن لأحد قراءة بياناتك المشفرة سوى من لديه عبارة المرور التي تستخدمها. ولا يتم إرسال عبارة المرور إلى شركة Google أو تخزينها لديها. إذا نسيت عبارة المرور أو رغبت في تغيير هذا الإعداد، ستحتاج إلى إعادة تعيين المزامنة. مزيد من المعلومات @@ -271,6 +275,7 @@ ‏سيتم نقل علامات التبويب إلى مبدّل علامات التبويب في Chrome. ‏هناك وظائف مفقودة تعد ذات أهمية كبيرة لتشغيل Chrome؛ إما أن يكون الإصدار الذي تستخدمه من Chrome غير مكتمل، أو ليس متوافقًا مع هذا الإصدار من Android. الصور والملفات المخزنة مؤقتًا +‏أضف حساب Google من صفحة "الحسابات" في تطبيق إعدادات جهازك. الفتح في تحديث آخر مزامنة: @@ -322,6 +327,7 @@ حفظ الإعدادات الأبوية الاسم +السماح للمواقع بتشغيل جافا سكريبت (موصى به) تم حذف الوصول إلى الموقع أيضًا معطل لهذا الجهاز. عدم الإرسال مطلقًا @@ -359,6 +365,7 @@ علامات تبويب التصفح المتخفي الوصف: هل تريد استبدال الموجود في ؟ +‏التحكم في الطريقة التي تتبعها Google عند استخدام سجل التصفح لتخصيص البحث، والإعلانات، وخدمات Google الأخرى. الأذونات {HOURS,plural, =1{قبل ساعة واحدة (#)}zero{قبل # ساعة}two{قبل ساعتين (#)}few{قبل # ساعات}many{قبل # ساعة}other{قبل # ساعة}} إقران @@ -367,6 +374,7 @@ تمكين توفير البيانات إيقاف كلمات المرور المحفوظة +السؤال أولاً قبل السماح للمواقع بالدخول إلى وضع ملء الشاشة (موصى به) إنشاء ملف جديد سيتم حذف كل البيانات المحلية المخزنة بواسطة موقع الويب هذا بما في ذلك ملفات تعريف الارتباط. ‏الترجمة من Google @@ -391,6 +399,7 @@ الدولة/الإقليم توفير البيانات بنسبة مزيد من المعلومات +إضافة موقع ويب إلى قائمة الاستثناءات الاستثناءات يعني تمكين ميزة "عدم التعقب" تضمين الطلب مع عدد زيارات التصفح. ويعتمد أي تأثير على استجابة موقع الويب للطلب من عدمه، بالإضافة إلى كيفية تفسير الطلب. @@ -452,6 +461,7 @@ إمكانية الدخول ‏الحصول على التطبيق من متجر Google Play: ‏إبلاغ Google تلقائيًا بتفاصيل أي مخاطر أمنية محتملة +السؤال أولاً قبل السماح للمواقع باستخدام الميكروفون (موصى به) ‏تأكيد حساب Google تم تنزيل فتح في المتصفح @@ -514,6 +524,7 @@ الشحن تحميل الموقع الأصلي ‏الاطلاع على عناوين URL المجاورة +السماح بذلك دائمًا إضافة عنوان نقل تأكيد عبارة المرور @@ -558,6 +569,7 @@ السماح (لعمليات بحث شريط العناوين) تتم المزامنة مع علامات التبويب القياسية +السماح بتشغيل "مزامنة الخلفية" لموقع ويب معين. ‏يلزمك تحديث TalkBack إلى إصدار جديد. المواقع المعتمدة فقط عرض السجل بكامله @@ -592,6 +604,7 @@ التحكم في كيفية عمل هذا في الإعدادات إشارات تم تسجيل دخول . سيدمج تسجيل الدخول باستخدام البيانات التي تمت مزامنتها، مثل الإشارات المرجعية بين الحسابات. للحفاظ على المعلومات منفصلة، عليك بمحو بيانات التصفح في الإعدادات. +منع مواقع الويب من عرض النوافذ المنبثقة (موصى به) عنوان الشحن علامة التبويب التخزين @@ -621,6 +634,7 @@ عبارة المرور مطلوبة إعادة تعيين بيانات اعتماد الجهاز إظهار الصفحة الأصلية +السؤال قبل السماح للمواقع بإرسال الإشعارات (موصى به) أنت تجري تبديلاً لحسابات المزامنة من إلى . ما الإجراء الذي تريد اتخاذه حيال الإشارات المرجعية، والسجل، وكلمات المرور، والإعدادات الأخرى الحالية؟ صفحات الشبكة المادية المجاورة عرض مناسب للجوال diff --git a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb index e4fa659e3d14d..bbf1302fb1a9d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb @@ -75,7 +75,6 @@ Включете разрешението за Chrome от настройките на Android. Запазени пароли Шифроване на всичко с паролата за Google от -Контролирайте начина, по който използваме историята ви на сърфиране, за да персонализираме търсенето и други услуги на Google. Моля, актуализирайте данните си за вход. Разширени Отметки от Chrome Dev @@ -129,6 +128,7 @@ Разгънато – кликнете за свиване. Налице е по-нова версия Непропорционален +Разрешаване на JavaScript за конкретен сайт. Родителите ви помагат за управлението на тези настройки. Изпращане Излизане @@ -152,6 +152,7 @@ Адреси Разрешаване на сайтовете да запазват „бисквитки“ и да четат данни от такива (препоръчително) Този профил се управлява от и . +Включете „Авт. синхронизиране на данните“ от „Профили“ в настройките на Android, за да получите разделите си от другите си устройства. Авторски права Google Inc. Всички права запазени. Визуализатор на сертификатите Създаване на пропуск @@ -188,6 +189,7 @@ Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Chrome. Данните ви в браузъра ще бъдат свързани за постоянно с този профил. Прекъсването на връзката с него ще изтрие локалната информация в Chrome. Споделяне на изображението +Извеждане на запитване, преди на сайтовете да се разреши достъп до местоположението ви (препоръчително) Изтеглянето на „“ не бе успешно поради грешки във файловата система. Размер: Активиране @@ -240,6 +242,7 @@ Език за превод: Лицензи за отворен код Навигирането е блокирано: +При синхронизирането възникна грешка. Докоснете, за да видите подробности. Копиране на адреса на връзката Никога да не се превежда от Медия @@ -254,6 +257,7 @@ Сърфирайте повече за по-малко Отметката бе запазена в/ъв „ В бъдеще намиращите се в близост страници във Физическата мрежа ще се показват в списъка с известията ви +Извеждане на запитване, преди да се разреши на сайтовете да използват камерата (препоръчително) Генериране на ключ Само някой с пропуска ви може да прочете шифрованите ви данни – той не се изпраща до Google, нито се съхранява от нас. Ако го забравите или искате да промените тази настройка, ще се наложи да нулирате синхронизирането. Научете повече {DAYS,plural, =1{преди # ден}other{преди # дни}} @@ -272,6 +276,7 @@ Разделите ще се преместят към предназначения за тях превключвател в Chrome. Липсва необходима критична функционалност, за да се изпълнява Chrome. Инсталацията ви на браузъра не е завършена или не е съвместима с тази версия на Android. Кеширани изображения и файлове +Добавете профил в Google от страницата „Профили“ в приложението „Настройки“ на устройството ви. Отваряне в Актуализиране Последно синхронизиране: @@ -323,6 +328,7 @@ Запазване Родителски настройки Име +Разрешаване на сайтовете да изпълняват JavaScript (препоръчително) Изтрихте „ Достъпът до местоположението също е изключен за това устройство. Да не се изпращат никога @@ -360,6 +366,7 @@ Раздели в режим „инкогнито“ Описание: Искате ли да замените съществуващия файл „“ в/ъв „“? +Контролирайте начина, по който използваме историята ви на сърфиране, за да персонализираме търсенето, рекламите и други услуги на Google. Разрешения {HOURS,plural, =1{преди # час}other{преди # часа}} Сдвояване @@ -368,6 +375,7 @@ Активирахте Икономия на данни Изключено Запазени пароли +Извеждане на запитване, преди да се разреши на сайтовете да преминат на цял екран (препоръчително) Създаване на нов файл Ще се изтрият всички локални данни, съхранявани от този уебсайт, включително „бисквитките“. Google Преводач @@ -392,6 +400,7 @@ Държава/регион икономия на данни Научете повече +Добавяне на изключение за сайт Изключения Активирането на „Do Not Track“ означава, че с трафика ви на сърфиране ще се подава заявка. Ефектите зависят от това, дали уебсайтът ще отговори на нея и как ще я изтълкува. @@ -453,6 +462,7 @@ Достъпност Изтегляне на приложението от Google Play Магазин: Автоматично съобщаване на Google на подробности за евентуални инциденти, свързани със сигурността +Извеждане на запитване, преди да се разреши на сайтовете да използват микрофона (препоръчително) Потвърждаване на профила в Google “ се изтегли Отваряне в браузъра @@ -515,6 +525,7 @@ Адрес за доставка Зареждане на оригинала Преглед на нещата в близост +Да е разрешено винаги Добавяне на адрес Преместване Потвърдете пропуска @@ -559,6 +570,7 @@ Разрешено (за търсения от адресната лента) Синхронизира се със: Стандартни раздели +Разрешаване на синхронизирането на заден план за конкретен сайт. Трябва да актуализирате TalkBack до по-нова версия. Само одобрени сайтове Показване на пълната история @@ -593,6 +605,7 @@ Контролирайте това поведение от Настройки Отметки Потребителят с имейл е бил в профила си. Влизането с/ъс ще обедини между профилите синхронизираните данни, като отметки. За да остане информацията разделена, изчистете данните за сърфирането от настройките. +Блокиране на показването на изскачащи прозорци от сайтовете (препоръчително) Адрес за доставка “ – раздел Хранилище @@ -622,6 +635,7 @@ Изисква се пропуск Нулиране на идентификационните данни на устройството Показване на оригинала +Извеждане на запитване, преди да се разреши на сайтовете да изпращат известия (препоръчително) Заменяте настоящия профил за синхронизиране () с друг (). Какво искате да направите със съществуващите си отметки, история, пароли и други настройки? Намиращи се в близост страници във Физическата мрежа Изглед, удобен за мобилни устройства diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb index e0194a222adf5..70df807068d2d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb @@ -26,7 +26,7 @@ Heu de tenir activats el Bluetooth i la ubicació per poder utilitzar el Web fí No tradueixis mai aquest lloc Esborra l'historial, les galetes, les dades del lloc, la memòria cau, etc. Tancades recentment -Inicieu la sessió a Chrome per accedir a les vostres pestanyes des dels altres dispositius. +Inicieu la sessió a Chrome per accedir a les vostres pestanyes des dels altres dispositius que tingueu. Consulteu-les a Chrome El lloc s'ha afegit No hi ha prou memòria per baixar el contingut seleccionat. @@ -75,7 +75,6 @@ Heu de tenir activats el Bluetooth i la ubicació per poder utilitzar el Web fí Activeu el permís per a Chrome a la configuració d'Android. Desa les contrasenyes Encripta totes les dades amb la contrasenya de Google del dia -Especifiqueu com Google utilitza el vostre historial de navegació per personalitzar la Cerca i altres serveis de Google. Actualitzeu les dades d'inici de sessió. Configuració avançada Adreces d'interès de Chrome Dev @@ -129,6 +128,7 @@ Podeu controlar el Web físic a la configuració de Chrome. Vista desplegada (feu clic per replegar-la) Versió nova disponible Monospace +Permet JavaScript en un lloc concret. Els pares ajuden a gestionar aquesta configuració. Envia Surt @@ -152,6 +152,7 @@ Podeu controlar el Web físic a la configuració de Chrome. Adreces Permet que els llocs desin i llegeixin les dades de les galetes (recomanat) i gestionen aquest compte. +Per accedir a les vostres pestanyes des dels altres dispositius que tingueu, activeu Sincronitza dades automàticament a la configuració d'Android per al compte. Copyright Google Inc. Tots els drets reservats. Lector de certificats Creeu una frase de contrasenya @@ -163,7 +164,7 @@ Podeu controlar el Web físic a la configuració de Chrome. Proposa'm de traduir les pàgines amb el Traductor de Google Obre en una pestanya d'incògnit S'està accedint a l'entrada d'àudio i de vídeo -Inicieu la sessió a Chrome per accedir a les adreces d'interès des dels altres dispositius. +Inicieu la sessió a Chrome per accedir a les adreces d'interès des dels altres dispositius que tingueu. Surt del mode d'incògnit Opció d'enviament Seleccioneu l'opció d'enviament @@ -188,6 +189,7 @@ Podeu controlar el Web físic a la configuració de Chrome. Inicieu la sessió amb un compte gestionat, de manera que concediu al seu administrador el control sobre el vostre perfil de Chrome. Les vostres dades de Chrome estaran vinculades a aquest compte de manera permanent. Si desconnecteu aquest compte se suprimiran les dades de Chrome locals. Comparteix la imatge +Pregunta abans de permetre que els llocs sàpiguen la meva ubicació (opció recomanada) No s'ha pogut baixar a causa d'errors amb el sistema de fitxers. Mida: Activa @@ -219,7 +221,7 @@ Per ajustar el terme de la cerca, manteniu-lo premut per seleccionar-lo. Per def Sans Serif de les quatre últimes setmanes La cerca per veu no està disponible -Inici de sessió +Inicia la sessió La ubicació es permet Desa l'enllaç Títol @@ -240,6 +242,7 @@ Per ajustar el terme de la cerca, manteniu-lo premut per seleccionar-lo. Per def Idioma de la traducció: Llicències de programari lliure S'ha bloquejat la navegació: +S'ha produït un error de sincronització. Toqueu per obtenir-ne més detalls. Copia l'adreça de l'enllaç No tradueixis mai de: Multimèdia @@ -254,6 +257,7 @@ Per ajustar el terme de la cerca, manteniu-lo premut per seleccionar-lo. Per def Navegueu més per menys Adreça d'interès afegida a Les pàgines del Web físic que es detectin a prop es mostraran a la llista de notificacions +Pregunta abans de permetre que els llocs utilitzin la meva càmera (opció recomanada) Generació de claus Només els usuaris que sàpiguen la vostra frase de contrasenya poden llegir les dades que encripteu. La frase de contrasenya no s'envia a Google, i Google tampoc no l'emmagatzema. Si l'oblideu o voleu canviar aquesta configuració, heu de restablir la sincronització. Més informació {DAYS,plural, =1{fa # dia}other{fa # dies}} @@ -272,6 +276,7 @@ Per ajustar el terme de la cerca, manteniu-lo premut per seleccionar-lo. Per def Les pestanyes es mouran a un selector de pestanyes a Chrome. Falta una funcionalitat crítica necessària per executar Chrome; la vostra instal·lació de Chrome no està completa o bé no és compatible amb aquesta versió d'Android. Imatges i fitxers emmagatzemats a la memòria cau +Afegiu un compte de Google des de la pàgina Comptes de l'aplicació Configuració del dispositiu. Obre a Actualitza Última sincronització: @@ -323,6 +328,7 @@ Per ajustar el terme de la cerca, manteniu-lo premut per seleccionar-lo. Per def Desa Configuració parental Nom +Permet que els llocs executin JavaScript (opció recomanada) s'ha suprimit L'accés a la ubicació està desactivat també per a aquest dispositiu. No enviïs mai @@ -360,6 +366,7 @@ Tanmateix, no sou invisible. El vostre cap, el vostre proveïdor de serveis d'In Pestanyes d'incògnit Descripció: Voleu substituir el fitxer de ? +Controleu com utilitza Google el vostre historial de navegació per personalitzar la Cerca, els anuncis i altres serveis de Google. Permisos {HOURS,plural, =1{fa # hora}other{fa # hores}} Vincula @@ -368,6 +375,7 @@ Tanmateix, no sou invisible. El vostre cap, el vostre proveïdor de serveis d'In Economitzador de dades està activat Desactivat Contrasenyes desades +Pregunta abans de permetre que els llocs s'obrin en pantalla completa (opció recomanada) Crea un fitxer nou Se suprimiran totes les dades que aquest lloc web hagi emmagatzemat, incloses les galetes. Traductor de Google @@ -382,7 +390,7 @@ Tanmateix, no sou invisible. El vostre cap, el vostre proveïdor de serveis d'In Més No s'ha pogut baixar a causa d'un error desconegut. AA -Permet que els llocs reprodueixin vídeos importants automàticament (opció recomanada) +Permet que els llocs reprodueixin elements multimèdia importants automàticament (opció recomanada) Editar la pàgina d'inici Configuració en curs... S'està actualitzant la pàgina @@ -392,6 +400,7 @@ Tanmateix, no sou invisible. El vostre cap, el vostre proveïdor de serveis d'In País/regió de reducció de dades Més informació +Afegeix una excepció per a un lloc Excepcions Si activeu l'opció No segueixis, s'inclourà una sol·licitud al trànsit de navegació. Que s'apliqui o no dependrà de si algun lloc web respon a la sol·licitud i de com s'interpreta. @@ -453,6 +462,7 @@ Per exemple, és possible que alguns llocs web responguin a aquesta sol·licitud Accessibilitat Baixeu l'aplicació des de Google Play Store: Informa automàticament Google dels detalls sobre possibles incidències de seguretat +Pregunta abans de permetre que els llocs utilitzin el micròfon (opció recomanada) Confirmeu el compte de Google s'ha baixat Obre al navegador @@ -515,6 +525,7 @@ Per exemple, és possible que alguns llocs web responguin a aquesta sol·licitud Enviament Carrega la versió original Vegeu què teniu a prop +Sempre permès Afegeix una adreça Desplaça Confirmeu la frase de contrasenya @@ -523,7 +534,7 @@ Per exemple, és possible que alguns llocs web responguin a aquesta sol·licitud No, gràcies S'està accedint a l'entrada d'àudio S'ha produït un error en processar la comanda. Comproveu el compte i torneu-ho a provar. -Detecta i reprodueix els vídeos importants d'un lloc concret. +Detecta i reprodueix els elements multimèdia importants d'un lloc concret. Cancel·la la selecció Altres dispositius Suprimeix-ho tot @@ -559,6 +570,7 @@ Per exemple, és possible que alguns llocs web responguin a aquesta sol·licitud Permet (per a les cerques a la barra d'adreces) Se sincronitza amb Pestanyes estàndard +Permet la sincronització en segon pla en un lloc concret. Heu de fer l'actualització de TalkBack a una versió més recent Només els llocs aprovats Mostra l'historial complet @@ -580,7 +592,7 @@ Per exemple, és possible que alguns llocs web responguin a aquesta sol·licitud És possible que el contingut (pel·lícules, música, etc.) que hàgiu baixat en altres aplicacions ja no es pugui reproduir fins que aquestes aplicacions no tornin a adquirir llicències basades en les credencials del dispositiu nou. Per obtenir llicències noves, connecteu-vos a Internet i reproduïu el contingut que tingueu baixat. -Activeu la sincronització per accedir a les vostres pestanyes des dels altres dispositius. +Activeu la sincronització per accedir a les vostres pestanyes des dels altres dispositius que tingueu. De Google Payments Esborra l'entrada Data de caducitat @@ -593,6 +605,7 @@ Per obtenir llicències noves, connecteu-vos a Internet i reproduïu el contingu Controleu-ne el funcionament a Configuració Adreces d'interès S'havia iniciat la sessió amb . Si inicieu la sessió amb , es combinaran les dades sincronitzades, com ara les adreces d'interès, entre comptes. Per desar la informació per separat, esborreu les dades de navegació a Configuració. +Bloqueja les finestres emergents als llocs web (opció recomanada) Adreça d’enviament , pestanya Emmagatzematge @@ -622,6 +635,7 @@ Per obtenir llicències noves, connecteu-vos a Internet i reproduïu el contingu S'ha d'introduir una frase de contrasenya Restableix les credencials del dispositiu Mostra l'original +Pregunta abans de permetre que els llocs enviïn notificacions (opció recomanada) Esteu canviant del compte de sincronització a . Què voleu fer amb les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració que ja teniu? Pàgines del Web físic a prop Visualització optimitzada per a mòbils diff --git a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb index 09d834a49ae50..eefe0097751f9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_cs.xtb @@ -75,7 +75,6 @@ Chcete-li fyzický web používat, je třeba aktivovat Bluetooth a určování Oprávnění pro Chrome zapnete v Nastavení pro Android. Ukládání hesel Zašifrovat vše pomocí hesla Google z -Nastavte, jak má Google využívat vaši historii procházení k personalizaci Vyhledávání a dalších služeb Google. Aktualizujte prosím své přihlašovací údaje. Rozšířená nastavení Záložky z Chrome Dev @@ -129,6 +128,7 @@ Fyzický web můžete ovládat v nastavení Chromu. Rozbaleno – kliknutím sbalíte Je dostupná novější verze Neproporcionální +Povolit JavaScript pro konkrétní web. Tato nastavení pomáhají spravovat rodiče. Odeslat Odejít @@ -152,6 +152,7 @@ Fyzický web můžete ovládat v nastavení Chromu. Adresy Povolit webům ukládat a číst data souborů cookie (doporučeno) Tento účet spravují uživatelé . +Chcete-li získat přístup ke kartám ze svých ostatních zařízení, zapněte v nastavení účtu Android možnost Automatická synchronizace dat. Copyright Google Inc. Všechna práva vyhrazena. Prohlížeč certifikátů Vytvoření heslové fráze @@ -188,6 +189,7 @@ Fyzický web můžete ovládat v nastavení Chromu. Přihlašujete se pomocí spravovaného účtu a poskytujete jeho správci kontrolu nad vaším profilem Chrome. Údaje Chrome budou trvale přidruženy k tomuto účtu. Odpojením od tohoto účtu budou místní údaje Chrome trvale smazány. Sdílet obrázek +Pokud web bude chtít znát vaši polohu, zobrazit dotaz (doporučeno) Stažení souboru se nezdařilo z důvodu chyb systému souborů. Velikost: Aktivovat @@ -240,6 +242,7 @@ Chcete-li vyhledávací dotaz upravit, proveďte výběr dlouhým stisknutím. C Jazyk překladu: Licence open source Navigace je blokována: +Došlo k chybě synchronizace. Podrobnosti zobrazíte klepnutím. Zkopírovat adresu odkazu Jazyk nikdy nepřekládat Média @@ -254,6 +257,7 @@ Chcete-li vyhledávací dotaz upravit, proveďte výběr dlouhým stisknutím. C Více webu za méně peněz Záložka přidána do složky Budoucí stránky fyzického webu v okolí se budou zobrazovat v seznamu oznámení +Pokud web bude chtít použít vaši kameru, zobrazit dotaz (doporučeno) Generování klíče Vaše šifrovaná data mohou číst pouze uživatelé, kteří mají vaši heslovou frázi. Heslová fráze se neodesílá do Googlu a není na Googlu uložena. Pokud heslovou frázi zapomenete nebo toto nastavení budete chtít změnit, bude synchronizaci potřeba resetovat. Další informace {DAYS,plural, =1{před # dnem}few{před # dny}many{před # dne}other{před # dny}} @@ -272,6 +276,7 @@ Chcete-li vyhledávací dotaz upravit, proveďte výběr dlouhým stisknutím. C Karty se přesunou do přepínače karet v Chromu. Chybí nezbytná funkce pro spuštění aplikace Chrome. Instalace aplikace Chrome buď nebyla dokončena, nebo aplikace není kompatibilní s touto verzí platformy Android. Obrázky a soubory v mezipaměti +Přidejte účet Google ze stránky Účty v aplikaci Nastavení svého zařízení. Otevřít v aplikaci Aktualizovat Poslední synchronizace: @@ -323,6 +328,7 @@ Chcete-li vyhledávací dotaz upravit, proveďte výběr dlouhým stisknutím. C Uložit Rodičovská nastavení Název +Povolit webům spouštět JavaScript (doporučeno) Záložka byla smazána Přístup k poloze je vypnut také v tomto zařízení. Nikdy neodesílat @@ -360,6 +366,7 @@ Nejste však neviditelní. Anonymní režim neskryje vaši aktivitu před zaměs Anonymní karty Popis: Chcete nahradit existující soubor v adresáři ? +Nastavte, jak má Google využívat vaši historii procházení k personalizaci Vyhledávání, reklam a dalších služeb Google. Oprávnění {HOURS,plural, =1{před # hodinou}few{před # hodinami}many{před # hodiny}other{před # hodinami}} Spárovat @@ -368,6 +375,7 @@ Nejste však neviditelní. Anonymní režim neskryje vaši aktivitu před zaměs Spořič dat je aktivní Vypnuto Uložená hesla +Pokud web bude chtít přejít do režimu celé obrazovky, zobrazit dotaz (doporučeno) Vytvořit nový soubor Všechna místní data uložená tímto webem, včetně souborů cookie, budou smazána. Překladač Google @@ -392,6 +400,7 @@ Nejste však neviditelní. Anonymní režim neskryje vaši aktivitu před zaměs Země/Region Úspora dat: Další informace +Přidat výjimku pro konkrétní web Výjimky Pokud povolíte požadavek Do Not Track, bude připojován k datům provozu prohlížení. Účinek tohoto požadavku závisí na tom, zda na něj budou webové stránky reagovat a jak jej budou interpretovat. @@ -453,6 +462,7 @@ Některé weby mohou například na tento požadavek reagovat tak, že vám zobr Usnadnění Získat aplikaci z Obchodu Google Play: Automaticky Googlu hlásit podrobnosti možných bezpečnostních incidentů +Pokud web bude chtít použít váš mikrofon, zobrazit dotaz (doporučeno) Potvrzení účtu Google Soubor byl stažen Otevřít v prohlížeči @@ -515,6 +525,7 @@ Na stránce history.google.com moh Doprava Načíst originál Zobrazit weby v okolí +Vždy povoleno Přidat adresu Přesunout Potvrďte heslovou frázi @@ -559,6 +570,7 @@ Na stránce history.google.com moh Povolit (pro vyhledávání z adresního řádku) Data se synchronizují do účtu Standardní karty +Povolit synchronizaci na pozadí konkrétnímu webu. Aplikaci TalkBack je potřeba aktualizovat na novější verzi. Pouze schválené weby Zobrazit celou historii @@ -593,6 +605,7 @@ Chcete-li získat nové licence, připojte se k internetu a přehrajte stažen Tuto funkci můžete ovládat v Nastavení. Záložky Byl přihlášen účet . Po přihlášení pomocí účtu dojde mezi účty ke sloučení synchronizovaných dat (například záložek). Chcete-li údaje uchovávat odděleně, vymažte údaje o prohlížení v nastavení. +Bránit webům v zobrazování vyskakovacích oken (doporučeno) Dodací adresa , karta Úložiště @@ -622,6 +635,7 @@ Chcete-li získat nové licence, připojte se k internetu a přehrajte stažen Je vyžadována heslová fráze Resetovat identifikační údaje zařízení Zobrazit originál +Pokud web bude chtít odesílat oznámení, zobrazit dotaz (doporučeno) Přepínáte účet pro synchronizaci z  na . Co chcete provést se svými existujícími záložkami, historií, hesly a dalším nastavením? Stránky fyzického webu v okolí Zobrazení optimalizované pro mobily diff --git a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb index 89d648eacb46c..b0ded7c122aec 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb @@ -75,7 +75,6 @@ Du skal aktivere Bluetooth og Placering for at kunne bruge Fysisk web.Aktivér tilladelse for Chrome i indstillingerne for Android. Gem adgangskoder Kryptér alle med Google-adgangskoden fra -Kontrollér, hvordan Google bruger din browserhistorik til at personliggøre Søgning og andre Google-tjenester. Opdater dine loginoplysninger. Avanceret Bogmærker fra udviklerversionen af Chrome @@ -129,6 +128,7 @@ Du kan kontrollere Fysisk web i Chrome-indstillingerne. Udvidet – klik for at skjule. Der findes en nyere version Enkelt tegnafstand +Tillad JavaScript for et bestemt website. Dine forældre hjælper med at administrere disse indstillinger. Indsend Forlad @@ -152,6 +152,7 @@ Du kan kontrollere Fysisk web i Chrome-indstillingerne. Adresser Tillad, at websites gemmer og læser cookiedata (anbefales) Denne konto administreres af og . +Aktivér "Automatisk synkronisering af data" i kontoindstillingerne for Android for at få adgang til dine faner på dine andre enheder. Copyright Google Inc. Alle rettigheder forbeholdes. Certifikatfremviser Opret adgangssætning @@ -188,6 +189,7 @@ Du kan kontrollere Fysisk web i Chrome-indstillingerne. Du logger ind med en administreret konto, og du giver administratoren kontrol over din Chrome-profil. Dine Chrome-data vil blive knyttet permanent til denne konto. Hvis du logger ud af denne konto, slettes de lokale Chrome-data. Del billede +Spørg om tilladelse, inden websites får oplyst din placering (anbefales) Download af mislykkedes på grund af fejl i filsystemet. Størrelse: Aktiver @@ -240,6 +242,7 @@ Tryk længe på din søgeterm for at vælge den og tilpasse den. Du kan afgræns Sprog, der skal oversættes til: Open source-licenser Navigationen er blokeret: +Der opstod en synkroniseringsfejl. Tryk for at få nærmere oplysninger. Kopiér linkadresse Oversæt aldrig Medier @@ -254,6 +257,7 @@ Tryk længe på din søgeterm for at vælge den og tilpasse den. Du kan afgræns Flere data for færre penge Bogmærket er gemt i Fremtidige Fysisk web-sider i nærheden vises i din underretningsliste. +Spørg om tilladelse, inden websites bruger dit kamera (anbefales) Nøglegenerering Det er kun personer med din adgangssætning, der kan læse dine krypterede data. Adgangssætningen sendes ikke til eller gemmes af Google. Hvis du glemmer din adgangssætning eller vil ændre denne indstilling, skal du nulstille synkroniseringen. Få flere oplysninger {DAYS,plural, =1{For 1 dag siden}one{For # dag siden}other{For # dage siden}} @@ -272,6 +276,7 @@ Tryk længe på din søgeterm for at vælge den og tilpasse den. Du kan afgræns Fanerne flyttes til en faneskifter i Chrome. Vigtig funktionalitet, som kræves for at køre Chrome, mangler. Enten er Chrome-installationen ufuldstændig eller ikke kompatibel med denne version af Android. Cachelagrede billeder og filer +Tilføj en Google-konto fra siden Konti i appen Indstillinger på din enhed. Åbn i Opdater Seneste synkronisering: @@ -323,6 +328,7 @@ Tryk længe på din søgeterm for at vælge den og tilpasse den. Du kan afgræns Gem Indstillinger for forældrekontrol Navn +Tillad, at websites kører JavaScript (anbefales) Slettede Placeringsadgang er også slået fra for denne enhed. Send aldrig @@ -360,6 +366,7 @@ Du er dog ikke usynlig. Inkognitotilstanden skjuler ikke dine søgninger fra din Inkognitofaner Beskrivelse: Vil du erstatte den eksisterende i ? +Kontrollér, hvordan Google bruger din browserhistorik til at personliggøre Søgning, annoncer og andre Google-tjenester. Tilladelser {HOURS,plural, =1{For 1 time siden}one{For # time siden}other{For # timer siden}} Start parring @@ -368,6 +375,7 @@ Du er dog ikke usynlig. Inkognitotilstanden skjuler ikke dine søgninger fra din Datasparefunktionen er aktiveret Fra Gemte adgangskoder +Spørg om tilladelse, inden websites åbner i fuld skærm (anbefales) Opret en ny fil Alle lokale data, der gemmes af websitet, herunder cookies, slettes Google Oversæt @@ -392,6 +400,7 @@ Du er dog ikke usynlig. Inkognitotilstanden skjuler ikke dine søgninger fra din Land/region sparet data Flere oplysninger +Tilføj en undtagelse for et website Undtagelser Aktivering af "Do Not Track" betyder, at en anmodning medtages i din browsertrafik. Effekten afhænger af, om et website reagerer på anmodningen, og hvordan anmodningen fortolkes. @@ -453,6 +462,7 @@ Nogle websites kan f.eks. reagere på denne anmodning ved at vise dig annoncer, Hjælpefunktioner Hent appen i Google Play Butik: Rapportér automatisk oplysninger om mulige sikkerhedshændelser til Google. +Spørg om tilladelse, inden websites bruger din mikrofon (anbefales) Bekræft Google-konto blev downloadet Åbn i browser @@ -515,6 +525,7 @@ Din Google-konto kan have andre former for browserhistorik, f.eks. søgninger og Forsendelse Indlæs originalen Se, hvad der er i nærheden +Tillad altid Tilføj adresse Flyt Bekræft adgangssætning @@ -559,6 +570,7 @@ Din Google-konto kan have andre former for browserhistorik, f.eks. søgninger og Tillad (for søgninger i adresselinjen) Synkroniserer til Standardfaner +Tillad synkronisering i baggrunden for et bestemt website. Du skal opdatere TalkBack til en nyere version. Kun godkendte websites Vis hele historikken @@ -593,6 +605,7 @@ Du kan få nye licenser ved at oprette forbindelse til internettet og afspille d Kontrollér, hvordan dette fungerer i Indstillinger Bogmærker Der blev logget ind på . Hvis der logges ind med , flettes synkroniserede data, som f.eks. bogmærker mellem konti. Hvis du vil holde oplysningerne adskilt, skal du rydde browserdata under Indstillinger. +Bloker visning af pop up-vinduer på websites (anbefales) Leveringsadresse , fane Lagerplads @@ -622,6 +635,7 @@ Du kan få nye licenser ved at oprette forbindelse til internettet og afspille d Adgangssætning kræves Nulstil loginoplysningerne for enheden Vis oprindelig +Spørg om tilladelse, før websites sender underretninger (anbefales) Du er ved at skifte synkroniseringskonto fra til . Hvad vil du gøre med dine eksisterende bogmærker, din historik, dine adgangskoder og andre indstillinger? Fysisk web-sider i nærheden Mobilvenlig visning diff --git a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb index c2813e5cb2e0f..d80558f23b8c9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb @@ -3,7 +3,7 @@ Es wird nach Geräten gesucht… Hilfe aufrufen Warnung -Nie speichern für... +Nie speichern für… Chrome benötigt Zugriff auf das Mikrofon, um es für diese Website freizugeben. Sie melden sich von einem Konto ab, das von verwaltet wird. Dadurch werden die auf diesem Gerät gespeicherten Chrome-Daten gelöscht. Die Daten verbleiben jedoch weiterhin in Ihrem Google-Konto. Fertig @@ -75,7 +75,6 @@ Zur Verwendung von Physical Web müssen Bluetooth und der Standortdienst aktivie Berechtigung für Chrome in den Android-Einstellungen aktivieren Passwörter speichern Ab alle Daten mit Google-Passwort verschlüsseln -Legen Sie fest, wie Google anhand des Browserverlaufs die Suche und andere Google-Dienste für Sie personalisieren soll. Bitte aktualisieren Sie Ihre Anmeldeinformationen. Erweitert Chrome Dev-Lesezeichen @@ -129,6 +128,7 @@ Zur Verwendung von Physical Web müssen Bluetooth und der Standortdienst aktivie Maximiert – zum Minimieren klicken Neuere Version verfügbar Monospace +JavaScript für eine bestimmte Website zulassen. Deine Eltern verwalten diese Einstellungen. Senden Verlassen @@ -152,6 +152,7 @@ Zur Verwendung von Physical Web müssen Bluetooth und der Standortdienst aktivie Adressen Websites dürfen Cookiedaten speichern und lesen (empfohlen). Dieses Konto wird von und verwaltet. +Aktivieren Sie "Daten automatisch synchronisieren" in den Android-Kontoeinstellungen, um Tabs von Ihren anderen Geräten abzurufen. Copyright Google Inc. Alle Rechte vorbehalten. Zertifikats-Viewer Passphrase erstellen @@ -188,6 +189,7 @@ Zur Verwendung von Physical Web müssen Bluetooth und der Standortdienst aktivie Sie melden sich gerade mit einem verwalteten Konto an und geben dem Administrator des Kontos Kontrolle über Ihr Chrome-Profil. Ihre Chrome-Daten werden dauerhaft mit diesem Konto verknüpft. Wenn Sie sich aus diesem Konto abmelden, werden alle lokalen Chrome-Daten gelöscht. Bild teilen +Nachfragen, bevor Websites Ihr Standort angezeigt wird (empfohlen) konnte aufgrund von Dateisystemfehlern nicht heruntergeladen werden. Größe: Aktivieren @@ -240,6 +242,7 @@ Zur Anpassung des Suchbegriffs drücken Sie einige Sekunden lang auf den entspre Zielsprache: Open Source-Lizenzen Die Navigation zu ist blockiert. +Es ist ein Synchronisierungsfehler aufgetreten. Tippen Sie, um Details zu erhalten. URL kopieren nie übersetzen Medien @@ -254,6 +257,7 @@ Zur Anpassung des Suchbegriffs drücken Sie einige Sekunden lang auf den entspre Mehr surfen, weniger verbrauchen Als Lesezeichen in "" gespeichert Zukünftige Physical Web-Seiten zu Objekten in der Nähe werden in Ihrer Benachrichtigungsliste angezeigt. +Nachfragen, bevor Websites Zugriff auf Ihre Kamera erhalten (empfohlen) Schlüsselgenerierung Nur Personen mit Ihrer Passphrase können Ihre verschlüsselten Daten lesen. Die Passphrase wird nicht an Google gesendet oder von Google gespeichert. Falls Sie sie vergessen oder diese Einstellung ändern möchten, müssen Sie die Synchronisierung zurücksetzen. Weitere Informationen {DAYS,plural, =1{Vor # Tag}other{Vor # Tagen}} @@ -272,6 +276,7 @@ Zur Anpassung des Suchbegriffs drücken Sie einige Sekunden lang auf den entspre Tabs werden in einen Tab-Wechsler in Chrome verschoben. Es fehlen wichtige Funktionen zur Ausführung von Chrome. Ihre Chrome-Installation ist entweder unvollständig oder nicht mit dieser Android-Version kompatibel. Bilder und Dateien im Cache +Fügen Sie ein Google-Konto über die Seite "Konten" der App "Einstellungen" Ihres Geräts hinzu. In öffnen Aktualisieren Letzte Synchronisierung: @@ -323,6 +328,7 @@ Zur Anpassung des Suchbegriffs drücken Sie einige Sekunden lang auf den entspre Speichern Jugendschutzeinstellungen Name +Ausführung von JavaScript durch Websites zulassen (empfohlen) gelöscht Der Standortzugriff ist auch für dieses Gerät deaktiviert. Nie senden @@ -360,6 +366,7 @@ Sie sind jedoch nicht unsichtbar. Der Inkognitomodus verhindert nicht, dass Info Inkognito-Tabs Beschreibung: Möchten Sie die vorhandene Datei "" in "" wirklich ersetzen? +Sie können festlegen, wie Google Ihren Browserverlauf nutzt, um die Suche, Werbung und andere Google-Dienste zu personalisieren. Berechtigungen {HOURS,plural, =1{Vor # Stunde}other{Vor # Stunden}} Pairing durchführen @@ -368,6 +375,7 @@ Sie sind jedoch nicht unsichtbar. Der Inkognitomodus verhindert nicht, dass Info Datensparmodus aktiviert Aus Gespeicherte Passwörter +Nachfragen, bevor Websites in den Vollbildmodus wechseln dürfen (empfohlen) Neue Datei erstellen Alle von dieser Website gespeicherten lokalen Daten, einschließlich Cookies, werden gelöscht. Google Übersetzer @@ -392,6 +400,7 @@ Sie sind jedoch nicht unsichtbar. Der Inkognitomodus verhindert nicht, dass Info Land/Region Einsparungen bei der Datennutzung Weitere Informationen +Ausnahme für Website hinzufügen Ausnahmen Wenn Sie das Kästchen "Do Not Track" anklicken, wird mit Ihren Browserzugriffen eine Anforderung gesendet. Wie sich diese Anforderung auswirkt, hängt davon ab, ob eine Website darauf reagiert und wie die Anforderung interpretiert wird. @@ -453,6 +462,7 @@ Einige Websites schalten möglicherweise Werbeanzeigen, deren Auswahl nicht dara Bedienungshilfen App aus dem Play Store abrufen: Details zu möglichen sicherheitsrelevanten Zwischenfällen automatisch an Google senden +Nachfragen, bevor Websites auf Ihr Mikrofon zugreifen dürfen (empfohlen) Google-Konto bestätigen heruntergeladen Im Browser öffnen @@ -476,7 +486,7 @@ Einige Websites schalten möglicherweise Werbeanzeigen, deren Auswahl nicht dara zeigt Ihnen lokale Suchergebnisse basierend auf Ihrem Standort. Hilfe Lesezeichen löschen -Offlineinhalt +Offline-Inhalt "" wird geladen. Übertragung an Typ: @@ -515,6 +525,7 @@ Eventuell finden Sie unter history.google.comVersand Original laden URLs in der Nähe +Immer erlaubt Adresse hinzufügen Verschieben Passphrase bestätigen @@ -522,7 +533,7 @@ Eventuell finden Sie unter history.google.comHinzufügen
Kein Interesse Zugriff auf Audio-Eingang -Bei der Verarbeitung Ihrer Bestellung ist ein Fehler aufgetreten. Überprüfen Sie Ihr Konto und versuchen Sie es erneut. +Bei der Verarbeitung Ihrer Bestellung ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihr Konto und versuchen Sie es erneut. Erkennung und Wiedergabe wichtiger Medien für eine bestimmte Website Auswahl aufheben Andere Geräte @@ -559,6 +570,7 @@ Eventuell finden Sie unter history.google.comZulassen (für Suchanfragen in der Adressleiste) Synchronisierung mit Standard-Tabs +Lässt die Hintergrundsynchronisierung für eine bestimmte Website zu. TalkBack muss auf eine neuere Version aktualisiert werden. Nur genehmigte Websites Gesamtverlauf anzeigen @@ -593,6 +605,7 @@ Um neue Lizenzen zu erwerben, stellen Sie eine Internetverbindung her und spiele Funktionsweise unter Einstellungen verwalten Lesezeichen war zuletzt angemeldet. Wenn Sie sich mit anmelden, werden synchronisierte Daten wie Lesezeichen in den Konten zusammengeführt. Wenn die Daten nicht zusammengeführt werden sollen, löschen Sie in den Einstellungen die Browserdaten. +Anzeige von Pop-ups für Websites blockieren (empfohlen) Versandadresse Speicher @@ -611,7 +624,7 @@ Um neue Lizenzen zu erwerben, stellen Sie eine Internetverbindung her und spiele Chrome personalisieren Von deinen Eltern verwaltet Aktuellen Tab schließen und zur zuvor genutzten App wechseln -Vervollständigungsdienst zum schnelleren Laden von Seiten verwenden +Vorhersagedienst zum schnelleren Laden von Seiten verwenden Passphrase App im Play Store anzeigen. Bewertung: "Desktop-Version anfordern" deaktivieren @@ -622,6 +635,7 @@ Um neue Lizenzen zu erwerben, stellen Sie eine Internetverbindung her und spiele Passphrase erforderlich Anmeldedaten des Geräts zurücksetzen Original anzeigen +Nachfragen, bevor Websites Benachrichtigungen senden dürfen (empfohlen) Sie stellen die Kontosynchronisierung von auf um. Was möchten Sie mit Ihren bestehenden Lesezeichen, Ihrem Verlauf, Ihren Passwörtern und anderen Einstellungen tun? Physical Web-Seiten zu Objekten in der Nähe Für Mobilgeräte optimierte Ansicht diff --git a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb index 42599c6783636..9143951adc96c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb @@ -24,7 +24,7 @@ Google doodle: Διακοπή Να μην γίνεται ποτέ μετάφραση αυτού του ιστότοπου -Εκκαθάριση ιστορικού, cookie, δεδομένων ιστότοπου, κρυφής μνήμης… +Διαγραφή ιστορικού, cookie, δεδομένων ιστότοπου, κρυφής μνήμης… Έκλεισαν πρόσφατα Για να εμφανίζονται οι καρτέλες από τις άλλες συσκευές σας, συνδεθείτε στο Chrome. Προβολή στο Chrome @@ -75,7 +75,6 @@ Ενεργοποίηση των αδειών για το Chrome στις Ρυθμίσεις Android. Αποθήκευση κωδικών πρόσβασης Κρυπτογράφηση όλων με κωδικό πρόσβασης Google στις -Ελέγξτε τον τρόπο με τον οποίο η Google χρησιμοποιεί το ιστορικό περιήγησής σας για να εξατομικεύει την Αναζήτηση και άλλες υπηρεσίες Google. Ενημερώστε τα στοιχεία σύνδεσής σας. Σύνθετες Σελιδοδείκτες του Chrome Dev @@ -129,6 +128,7 @@ Αναπτυγμένη - Κάντε κλικ για σύμπτυξη Διατίθεται νεότερη έκδοση Monospace +Να επιτρέπεται η JavaScript για έναν συγκεκριμένο ιστότοπο. Οι γονείς σας βοηθούν στη διαχείριση αυτών των ρυθμίσεων. Υποβολή Αποχώρηση @@ -152,6 +152,7 @@ Διευθύνσεις Να επιτρέπεται στους ιστότοπους η αποθήκευση και η ανάγνωση δεδομένων cookie (συνιστάται) Αυτός ο λογαριασμός τελεί υπό τη διαχείριση των γονέων και . +Για να εμφανίζονται οι καρτέλες από τις άλλες συσκευές σας, ενεργοποιήστε τον "Αυτόματο συγχρονισμό δεδομένων" στις ρυθμίσεις του λογαριασμού σας Android. Πνευματικά δικαιώματα Google Inc. Με επιφύλαξη παντός δικαιώματος. Πρόγρ. προβολής πιστοποιητικού Δημιουργία φράσης πρόσβασης @@ -188,6 +189,7 @@ Έχετε συνδεθεί με έναν διαχειριζόμενο λογαριασμό και παραχωρείτε τον έλεχγο διαχείρισής του μέσω του προφίλ σας Chrome. Τα δεδομένα σας Chrome θα συσχετιστούν μόνιμα με αυτόν το λογαριασμό. Η αποσύνδεση από αυτόν το λογαριασμό θα διαγράψει τα τοπικά δεδομένα Chrome. Κοινοποίηση εικόνας +Να γίνεται ερώτηση προτού επιτραπεί η κοινοποίηση της τοποθεσίας σας σε ιστότοπους (συνιστάται) Η λήψη του αρχείου απέτυχε λόγω σφαλμάτων του συστήματος αρχείων. Μέγεθος: Ενεργοποίηση @@ -212,7 +214,7 @@ Συγχρονισμός παρασκηνίου Ολοκληρώθηκε "" Αναζήτηση σελιδοδεικτών -Δεν είναι δυνατή η εκκαθάριση του ιστορικού περιήγησης για παιδικούς λογαριασμούς +Δεν είναι δυνατή η διαγραφή του ιστορικού περιήγησης για παιδικούς λογαριασμούς Προσθήκη φακέλου… Αναγκαστική ενεργοποίηση εστίασης Η τοποθεσία είναι αποκλεισμένη @@ -240,6 +242,7 @@ Γλώσσα μετάφρασης: Άδειες λογισμικού ανοικτού κώδικα Αποκλείστηκε η μετάβαση στη διεύθυνση: +Παρουσιάστηκε σφάλμα συγχρονισμού. Πατήστε για να δείτε λεπτομέρειες. Αντιγρ. διεύθυνσης συνδέσμου Να μην γίνεται ποτέ μετάφραση από Μέσα @@ -254,6 +257,7 @@ Περισσότερη περιήγηση με λιγότερα δεδομένα Ο σελιδοδείκτης είναι στο "" Στη λίστα ειδοποιήσεών σας θα εμφανίζονται οι μελλοντικές κοντινές σελίδες Φυσικού δικτύου +Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να χρησιμοποιούν την κάμερά σας (συνιστάται) Δημιουργία κλειδιού Μόνο κάποιος που γνωρίζει τη φράση πρόσβασής σας μπορεί να διαβάσει τα κρυπτογραφημένα δεδομένα σας. Η φράση πρόσβασης δεν αποστέλλεται ούτε αποθηκεύεται στην Google. Εάν ξεχάσετε τη φράση πρόσβασής σας ή θέλετε να αλλάξετε αυτήν τη ρύθμιση, θα χρειαστεί να επαναφέρετε το συγχρονισμό. Μάθετε περισσότερα {DAYS,plural, =1{Πριν από # ημέρα}other{Πριν από # ημέρες}} @@ -272,6 +276,7 @@ Οι καρτέλες θα μετακινηθούν σε ένα στοιχείο ελέγχου για την εναλλαγή καρτελών εντός του Chrome. Λείπει μια κρίσιμης σημασίας λειτουργία που απαιτείται για την εκτέλεση του Chrome. Είτε η εγκατάσταση του Chrome δεν έχει ολοκληρωθεί είτε δεν είναι συμβατή με αυτήν την έκδοση του Android. Εικόνες και αρχεία στην κρυφή μνήμη +Προσθέστε έναν Λογαριασμό Google από τη σελίδα "Λογαριασμοί" της εφαρμογής Ρυθμίσεις της συσκευής σας. Άνοιγμα σε Ενημέρωση Τελευταίος συγχρονισμός: @@ -323,6 +328,7 @@ Αποθήκευση Ρυθμίσεις γονικού ελέγχου Όνομα +Να επιτρέπεται στους ιστότοπους να εκτελούν JavaScript (συνιστάται) Ο σελιδοδείκτης διαγράφηκε Η πρόσβαση τοποθεσίας είναι επίσης απενεργοποιημένη για αυτήν τη συσκευή. Να μη γίνεται ποτέ αποστολή @@ -332,7 +338,7 @@ Επεξεργασία ονόματος/κωδικού πρόσβασης ή εξαίρεσης Αποχώρηση από την κατάσταση ανώνυμης περιήγησης εάν αυτός ο σύνδεσμος έχει ανοίξει σε εξωτερική εφαρμογή. Συνέχεια; -Εκκαθάριση δεδομένων +Διαγραφή δεδομένων Οι ενημερώσεις Chrome δεν υποστηρίζονται πλέον για αυτήν την έκδοση Android. Να γίνεται πάντα αποστολή Αυτός ο λογαριασμός τελεί υπό τη διαχείριση του γονέα . @@ -361,6 +367,7 @@ Καρτέλες ανώνυμης περιήγησης Περιγραφή: Θέλετε να αντικαταστήστε το υπάρχον αρχείο στον κατάλογο ; +Ελέγξτε τον τρόπο με τον οποίο η Google χρησιμοποιεί το ιστορικό περιήγησής σας για την εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google. Άδειες {HOURS,plural, =1{Πριν από # ώρα}other{Πριν από # ώρες}} Σύζευξη @@ -369,6 +376,7 @@ Η Εξοικονόμηση δεδομένων είναι ενεργοποιημένη Απενεργοποιημένη Αποθηκευμένοι κωδικοί πρόσβασης +Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους η είσοδος σε λειτουργία πλήρους οθόνης (συνιστάται) Δημιουργία νέου αρχείου Όλα τα δεδομένα αποθήκευσης στον ιστότοπων, όπως τα cookie, θα διαγραφούν Μετάφραση Google @@ -393,6 +401,7 @@ Χώρα/Περιοχή Εξοικονόμηση δεδομένων κατά Μάθετε περισσότερα +Προσθήκη εξαίρεσης ιστότοπου Εξαιρέσεις Η ενεργοποίηση της επιλογής "Να μην γίνεται εντοπισμός" σημαίνει ότι θα συμπεριληφθεί ένα αίτημα με την επισκεψιμότητα της περιήγησής σας. Τυχόν αποτελέσματα εξαρτώνται από το κατά πόσο ένας ιστότοπος ανταποκρίνεται στο αίτημα, καθώς και από τον τρόπο με τον οποίο ερμηνεύεται το αίτημα. @@ -454,6 +463,7 @@ Προσβασιμότητα Λήψη της εφαρμογής από το Google Play Store: Αυτόματη αναφορά στην Google των λεπτομερειών πιθανών περιστατικών ασφάλειας +Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να χρησιμοποιήσουν το μικρόφωνό σας (συνιστάται) Επιβεβαίωση Λογαριασμού Google Έγινε λήψη του αρχείου Άνοιγμα σε πρόγρ. περιήγησης @@ -499,7 +509,7 @@ Λογαριασμός συγχρονισμού Όλοι οι σελιδοδείκτες JavaScript -Εκκαθάριση δεδομένων περιήγησης +Διαγραφή δεδομένων περιήγησης Τα δεδομένα του Chrome διαγράφηκαν Φυσικό δίκτυο Λειτουργικό σύστημα @@ -516,6 +526,7 @@ Αποστολή Φόρτωση πρωτότυπου Δείτε τι υπάρχει κοντά +Να επιτρέπεται πάντα Προσθήκη διεύθυνσης Μεταφορά Επιβεβαίωση φράσης πρόσβασης @@ -555,11 +566,12 @@ Ο ιστότοπος θέλει να συνδεθεί στο: Επιβεβαίωση σύνδεσης Τώρα μπορείτε να αναζητήσετε με ένα μόνο άγγιγμα -Εκκαθάριση δεδομένων από +Διαγραφή δεδομένων από Διαγραφή Να επιτρέπεται (για τις αναζητήσεις στη γραμμή διευθύνσεων) Συγχρονισμός με Τυπικές καρτέλες +Να επιτρέπεται ο Συγχρονισμός παρασκηνίου για έναν συγκεκριμένο ιστότοπο. Θα πρέπει να ενημερώσετε το TalkBack σε νεότερη έκδοση. Μόνο εγκεκριμένοι ιστότοποι Εμφάνιση πλήρους ιστορικού @@ -583,7 +595,7 @@ Για απόκτηση νέων αδειών, συνδεθείτε στο διαδίκτυο και κάντε αναπαραγωγή των λήψεων περιεχομένου. Για να εμφανίζονται οι καρτέλες από τις άλλες συσκευές σας, ενεργοποιήστε τον συγχρονισμό. Από το Google Payments -Εκκαθάριση καταχώρισης +Διαγραφή καταχώρισης Ημερομηνία λήξης Φίλτρο Google SafeSites Δεν είναι δυνατή η ζεύξη της τρέχουσας καρτέλας @@ -594,6 +606,7 @@ Ελέγξτε τον τρόπο λειτουργίας στις Ρυθμίσεις Σελιδοδείκτες Συνδέθηκε ο λογαριασμός . Με τη σύνδεση στο λογαριασμό θα συγχωνευτούν συγχρονισμένα δεδομένα, όπως σελιδοδείκτες, μεταξύ λογαριασμών. Για να διατηρήσετε ξεχωριστά τις πληροφορίες σας, διαγράψτε τα δεδομένα περιήγησης στην περιοχή ρυθμίσεις. +Αποκλεισμός ιστότοπων από την εμφάνιση αναδυόμενων παραθύρων (συνιστάται) Διεύθυνση αποστολής Καρτέλα Αποθήκευση @@ -623,6 +636,7 @@ Απαιτείται φράση πρόσβασης Επαναφορά διαπιστευτηρίων συσκευής Εμφάνιση πρωτοτύπου +Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να στέλνουν ειδοποιήσεις (συνιστάται) Γίνεται εναλλαγή των λογαριασμών συγχρονισμού από σε . Τι θέλετε να γίνει με τους υπάρχοντες σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και τις άλλες ρυθμίσεις; Υπάρχουν κοντινές σελίδες Φυσικού δικτύου Προβολή για κινητά diff --git a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb index 4b918a4bf4d14..072c714298a1d 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_en-GB.xtb @@ -75,7 +75,6 @@ You must have Bluetooth and Location turned on in order to use the Physical Web. Turn on permission for Chrome in Android Settings. Save passwords Encrypt all with Google password as of -Control how Google uses your browsing history to personalise Search and other Google services. Please update your sign-in details. Advanced Chrome Dev bookmarks @@ -129,6 +128,7 @@ You can control the Physical Web in Chrome Settings. Expanded – click to collapse. Newer version is available Monospace +Allow JavaScript for a specific site. Your parents help manage these settings. Submit Leave @@ -152,6 +152,7 @@ You can control the Physical Web in Chrome Settings. Addresses Allow sites to save and read cookie data (recommended) This account is managed by and . +To get your tabs from your other devices, turn on "Auto-sync data" in Android account settings. Copyright Google Inc. All rights reserved. Certificate viewer Create passphrase @@ -188,6 +189,7 @@ You can control the Physical Web in Chrome Settings. You are signing in with a managed account and giving its administrator control over your Chrome profile. Your Chrome data will become permanently tied to this account. Disconnecting from this account will delete the local Chrome data. Share image +Ask before allowing sites to know your location (recommended) download failed due to file system errors. Size: Enable @@ -228,7 +230,7 @@ To adjust your search term, long press to select. To refine your search, slide t Legal information This feature may interfere with access to premium data services provided by your operator. Help make Chrome better by sending usage statistics and crash reports to Google. -Auto-play +Autoplay Download failed. Managed by your administrator Site settings @@ -240,6 +242,7 @@ To adjust your search term, long press to select. To refine your search, slide t Translation language: Open-source licences Navigation is blocked: +Sync error occurred, tap to get details. Copy link address Never translate Media @@ -254,6 +257,7 @@ To adjust your search term, long press to select. To refine your search, slide t Browse more for less Bookmarked to Future nearby Physical Web pages will show up in your notifications list +Ask first before allowing sites to use your camera (recommended) Key generation Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting you'll need to reset sync. Find out more {DAYS,plural, =1{# day ago}other{# days ago}} @@ -272,6 +276,7 @@ To adjust your search term, long press to select. To refine your search, slide t Tabs will move to a tab switcher inside Chrome. Critical functionality required to run Chrome is missing; either your Chrome installation is incomplete or not compatible with this version of Android. Cached images and files +Add a Google account from the accounts page in your device's Settings app. Open in Update Last synced: @@ -323,6 +328,7 @@ To adjust your search term, long press to select. To refine your search, slide t Save Parental Settings Name +Allow sites to run JavaScript (recommended) Deleted Location access is also turned off for this device. Never send @@ -360,6 +366,7 @@ However, you aren't invisible. Going incognito doesn't hide your browsing from y Incognito tabs Description: Do you want to replace the existing in ? +Control how Google uses your browsing history to personalise Search, ads and other Google services. Permissions {HOURS,plural, =1{# hour ago}other{# hours ago}} Pair @@ -368,6 +375,7 @@ However, you aren't invisible. Going incognito doesn't hide your browsing from y Data Saver enabled Off Saved passwords +Ask first before allowing sites to enter full screen (recommended) Create new file All local data stored by this website, including cookies, will be deleted. Google Translate @@ -392,6 +400,7 @@ However, you aren't invisible. Going incognito doesn't hide your browsing from y Country/Region data savings Learn more +Add site exception Exceptions Enabling “Do Not Track” means that a request will be included with your browsing traffic. Any effect depends on whether a website responds to the request and how the request is interpreted. @@ -453,6 +462,7 @@ For example, some websites may respond to this request by showing you ads that a Accessibility Get the app from the Google Play Store: Automatically report details of possible security incidents to Google +Ask first before allowing sites to use your microphone (recommended) Confirm Google Account downloaded Open in browser @@ -515,6 +525,7 @@ Your Google account may have other forms of browsing history like searches and a Shipping Load original See what's nearby +Always allowed? Add address Move Confirm passphrase @@ -559,6 +570,7 @@ Your Google account may have other forms of browsing history like searches and a Allow (for address bar searches) Syncing to Standard tabs +Allow Background Sync for a specific site. You need to update TalkBack to a newer version. Only approved sites Show full history @@ -591,6 +603,7 @@ Your Google account may have other forms of browsing history like searches and a Control how this works in Settings Bookmarks was signed in. Signing in with will merge synced data like bookmarks between accounts. To keep information separate, clear browsing data in settings. +Block sites from showing pop-ups (recommended) Delivery address , tab Storage @@ -620,6 +633,7 @@ Your Google account may have other forms of browsing history like searches and a Passphrase required Reset device credentials Show original +Ask before allowing sites to send notifications (recommended) You’re switching sync accounts from to . What do you want to do with your existing bookmarks, history, passwords and other settings? Physical Web pages nearby Mobile-friendly view diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb index 83344e3c5f839..ca11c0b027281 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es-419.xtb @@ -75,7 +75,6 @@ Debes activar Bluetooth y la Ubicación para poder utilizar la Web física.Activa el permiso para Chrome en Configuración de Android. Guardar contraseñas Encriptar todo con la contraseña de Google a partir del -Controla la forma en que Google usa tu historial de navegación para personalizar Búsqueda y otros servicios de Google. Actualiza los datos de acceso. Avanzada Marcadores de Chrome Dev @@ -129,6 +128,7 @@ Puedes controlar la Web física desde la configuración de Chrome. Expandido; haz clic para contraer. Nueva versión disponible Monoespaciada +Permitir la ejecución de JavaScript para un sitio específico Tus padres ayudan a administrar esta configuración. Enviar Abandonar @@ -152,6 +152,7 @@ Puedes controlar la Web física desde la configuración de Chrome. Direcciones Permitir que todos los sitios guarden y lean datos de cookies (recomendado) y administran esta cuenta. +Para obtener las pestañas de tus otros dispositivos, activa la opción de sincronización automática de datos en la configuración de la cuenta de Android. Copyright Google Inc. Todos los derechos reservados. Visualizador de certificados Crear frase de contraseña @@ -188,6 +189,7 @@ Puedes controlar la Web física desde la configuración de Chrome. Vas a acceder con una cuenta administrada, lo que significa que proporcionarás control sobre tu perfil de Chrome al administrador. Los datos de Chrome que tengas se vincularán de forma permanente a esta cuenta. Si la desconectas, se eliminarán los datos locales de Chrome. Compartir imagen +Preguntar antes de permitir que los sitios conozcan tu ubicación (recomendado) no se pudo descargar debido a errores del sistema de archivos. Tamaño: Habilitar @@ -240,6 +242,7 @@ Para ajustar el término de búsqueda, mantén presionado el texto y seleccióna Idioma de la traducción: Licencias de código abierto Navegación bloqueada: +Se produjo un error en la sincronización; presiona para conocer los detalles. Copiar dirección del vínculo Nunca traducir Multimedia @@ -254,6 +257,7 @@ Para ajustar el término de búsqueda, mantén presionado el texto y seleccióna Navega más y gasta menos Se agregó a marcadores en Las próximas páginas de la Web física cercanas se mostrarán en la lista de notificaciones +Preguntar primero antes de permitir que los sitios usen tu cámara (recomendado) Generación de claves Solo las personas que tengan tu frase de contraseña pueden leer los datos encriptados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar esta configuración, deberás restablecer la sincronización. Más información {DAYS,plural, =1{Hace # día}other{Hace # días}} @@ -272,6 +276,7 @@ Para ajustar el término de búsqueda, mantén presionado el texto y seleccióna Las pestañas se trasladarán a un alternador de pestañas en Chrome. Faltan funciones esenciales para que Chrome se ejecute. Es posible que no se haya completado la instalación de Chrome o que tu versión de Android no sea compatible. Imágenes y archivos almacenados en caché +Agrega una cuenta de Google desde la página Cuentas en la app de Configuración del dispositivo. Abrir en Actualizar Última sincronización: @@ -323,6 +328,7 @@ Para ajustar el término de búsqueda, mantén presionado el texto y seleccióna Guardar Configuración parental Nombre +Permitir que los sitios ejecuten JavaScript (recomendado) borrado El acceso a la ubicación también se desactivó para este dispositivo. No enviar nunca @@ -361,6 +367,7 @@ Sin embargo, no vas a pasar completamente desapercibido. El modo de navegación Pestañas en modo de incógnito Descripción: ¿Quieres reemplazar el archivo existente en ? +Controla la forma en que Google usa tu historial de navegación para personalizar Búsqueda, Ads y otros servicios de Google. Permisos {HOURS,plural, =1{Hace # hora}other{Hace # horas}} Sincronizar @@ -369,6 +376,7 @@ Sin embargo, no vas a pasar completamente desapercibido. El modo de navegación Extensión Reducir datos habilitada Desactivado Contraseñas almacenadas +Preguntar primero antes de permitir que los sitios activen la pantalla completa (recomendado) Crear un archivo nuevo Se eliminarán todos los datos almacenados en este sitio web, incluidas las cookies. Google Traductor @@ -383,7 +391,7 @@ Sin embargo, no vas a pasar completamente desapercibido. El modo de navegación Más no se pudo descargar debido a un error desconocido. AA -Permitir que los sitios reproduzcan de forma automática medios importantes (opción recomendada) +Permitir que los sitios reproduzcan de forma automática el contenido multimedia importante (opción recomendada) Editar la Página principal Configuración en curso… Actualizando la página @@ -393,6 +401,7 @@ Sin embargo, no vas a pasar completamente desapercibido. El modo de navegación País o región de ahorro de datos Más información +Agregar excepción del sitio Excepciones Si se habilita la opción de "No realizar seguimiento", se incluirá una solicitud con tu tráfico de navegación. Los efectos dependerán de si hay algún sitio web que responda a la solicitud y de cómo se interprete. @@ -454,6 +463,7 @@ Por ejemplo, algunos sitios web pueden responder a la solicitud mediante anuncio Accesibilidad Descargar la aplicación desde Google Play Store: Informar automáticamente detalles de posibles incidentes de seguridad a Google +Preguntar primero antes de permitir que los sitios usen tu micrófono (recomendado) Confirmar la cuenta de Google Se descargó Abrir en el navegador @@ -516,6 +526,7 @@ Es posible que tu cuenta de Google tenga otros formularios del historial de nave Envío Cargar el original Ver qué tengo cerca +Permitir siempre Agregar dirección Mover Confirmar frase de contraseña @@ -524,7 +535,7 @@ Es posible que tu cuenta de Google tenga otros formularios del historial de nave No, gracias Accediendo a la entrada de audio Se produjo un error al procesar tu pedido. Comprueba tu cuenta e inténtalo de nuevo. -Detecta y reproduce medios importantes para un sitio específico. +Detecta y reproduce contenido multimedia importante para un sitio específico. Cancelar la selección Otros dispositivos Eliminar todo @@ -560,6 +571,7 @@ Es posible que tu cuenta de Google tenga otros formularios del historial de nave Permitir (en búsquedas de la barra de direcciones) Sincronizando con Pestañas estándar +Permite la sincronización en segundo plano para un sitio específico. Debes actualizar a una versión más reciente de TalkBack Solo sitios aprobados Mostrar historial completo @@ -594,6 +606,7 @@ Conéctate a Internet y reproduce el contenido descargado para obtener licencias Controlar el funcionamiento en Configuración Marcadores Accediste con . Al acceder con , se combinan los datos sincronizados, como los marcadores, entre las distintas cuentas. Para mantener la información separada, borra los datos de navegación en Configuración. +Bloquear las ventanas emergentes en los sitios (recomendado) Dirección de envío Pestaña Almacenamiento @@ -623,6 +636,7 @@ Conéctate a Internet y reproduce el contenido descargado para obtener licencias Se necesita una frase de contraseña. Restablecer credenciales de dispositivo Mostrar original +Preguntar antes de permitir que los sitios envíen notificaciones (recomendado) Estás cambiando la cuenta de sincronización de a . ¿Qué deseas hacer con los marcadores, el historial, las contraseñas y otras opciones de configuración existentes? Páginas web físicas cercanas Vista optimizada para celulares diff --git a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb index de529da04c68c..c2a2fa5ba17e9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb @@ -59,7 +59,7 @@ Debes activar la ubicación y el Bluetooth para utilizar la Web física.Configurar Chrome No se ha podido descargar porque falta la tarjeta SD. La sincronización está activada -Economizador de datos +Economizador de Datos Se ha traducido al . Sincronizar marcadores Pestañas abiertas @@ -75,7 +75,6 @@ Debes activar la ubicación y el Bluetooth para utilizar la Web física.Activa el permiso para Chrome en los ajustes de Android. Guardar contraseñas Cifrar todo con una contraseña de Google a partir del -Controla cómo utiliza Google tu historial de navegación para personalizar la Búsqueda y otros servicios de Google. Actualiza tus datos de inicio de sesión. Opciones avanzadas Marcadores del canal para desarrolladores de Chrome @@ -101,9 +100,9 @@ Debes activar la ubicación y el Bluetooth para utilizar la Web física.Restringir El sistema operativo no admite la selección de certificados de cliente. Arrastra el control deslizante hasta que puedas leer cómodamente. El texto debe tener al menos este tamaño después de tocar un párrafo dos veces. -Dispositivos cercanos con los que transmites páginas web por Bluetooth. Chrome busca páginas y las muestra cuando activas el dispositivo. Estas páginas se envían a un servicio de Google para mejorar la calidad de los resultados de páginas. +Los dispositivos cercanos están transmitiendo páginas web a través de Bluetooth. Chrome busca páginas y las muestra cuando activas el dispositivo. Estas páginas se envían a un servicio de Google para mejorar la calidad de los resultados de páginas. -Puedes controlar la Web física en la configuración de privacidad de Chrome. +Puedes controlar la Web física en la configuración de Chrome. Más información Instalando… @@ -121,7 +120,7 @@ Puedes controlar la Web física en la configuración de privacidad de Chrome. Historial de navegación Ayuda y sugerencias Volver -Función Autocompletar formularios +Autocompletar formularios El Economizador de datos está activado. Puedes administrarlo en la configuración. Vista web Viendo una copia sin conexión de esta página @@ -129,6 +128,7 @@ Puedes controlar la Web física en la configuración de privacidad de Chrome. Ampliado (hacer clic para contraer) Hay una nueva versión disponible Monoespaciado +Habilita JavaScript en un sitio web específico. Tus padres ayudan a administrar estas opciones. Enviar Salir @@ -152,6 +152,7 @@ Puedes controlar la Web física en la configuración de privacidad de Chrome. Direcciones Permitir que los sitios guarden y lean datos de cookies (recomendado) Esta cuenta está administrada por y . +Para ver las pestañas de tus otros dispositivos, activa la opción Sincronización automática en la configuración de la cuenta de Android. Copyright Google Inc. Todos los derechos reservados. Visor de certificados Crea una frase de contraseña @@ -163,7 +164,7 @@ Puedes controlar la Web física en la configuración de privacidad de Chrome. Ofrece la traducción de páginas con el Traductor de Google Abrir en modo de incógnito Accediendo a la entrada de vídeo y audio -Inicia sesión en Chrome para ver tus marcadores en otros dispositivos. +Inicia sesión en Chrome para ver los marcadores de tus otros dispositivos. Salir del modo incógnito Opción de envío Seleccionar opción de envío @@ -188,6 +189,7 @@ Puedes controlar la Web física en la configuración de privacidad de Chrome. Vas a iniciar sesión con una cuenta administrada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome se vincularán de forma permanente a esta cuenta. Si desconectas esta cuenta, se eliminarán los datos locales de Chrome. Compartir imagen +Preguntar antes de permitir que los sitios web detecten tu ubicación (recomendado) No se ha podido descargar debido a problemas con el sistema de archivos. Tamaño: Habilitar @@ -197,7 +199,7 @@ Vas a iniciar sesión con una cuenta administrada, lo que significa que proporci Aceptar y continuar Actualización disponible. Más opciones Carpeta -Encriptar todos los datos sincronizados con tu propia frase de contraseña de sincronización +Cifrar todos los datos sincronizados con tu propia frase de contraseña de sincronización Obtén información sobre los temas que aparecen en los sitios web sin salir de la página. La función Tocar para buscar permite enviar una palabra y su contexto a la Búsqueda de Google para ver definiciones, imágenes, resultados de búsqueda y otra información. Para ajustar el término de búsqueda, mantén pulsado el texto para seleccionarlo. Para restringir la búsqueda, desliza el panel hacia arriba y toca el cuadro de búsqueda. @@ -240,6 +242,7 @@ Para ajustar el término de búsqueda, mantén pulsado el texto para seleccionar Idioma de traducción: Licencias de código abierto Se ha bloqueado la navegación: +Se ha producido un error de sincronización. Toca para ver los detalles. Copiar dirección de enlace No traducir nunca del Multimedia @@ -254,6 +257,7 @@ Para ajustar el término de búsqueda, mantén pulsado el texto para seleccionar Navega más por menos Marcador añadido a En el futuro, las páginas de la Web física cercanas se mostrarán en tu lista de notificaciones +Preguntar antes de permitir que los sitios web utilicen la cámara (recomendado) Generación de claves Solo alguien que tenga tu frase de contraseña puede leer tus datos cifrados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar esta opción, debes restablecer la sincronización. Más información {DAYS,plural, =1{Hace # día}other{Hace # días}} @@ -272,6 +276,7 @@ Para ajustar el término de búsqueda, mantén pulsado el texto para seleccionar Las pestañas se moverán a un menú de pestañas en Chrome. Falta una función esencial obligatoria para ejecutar Chrome. Es posible que tu instalación de Chrome no esté completa o que no sea compatible con esta versión de Android. Archivos e imágenes almacenados en caché +Añade una cuenta de Google desde la página para administrar cuentas de la aplicación de ajustes de tu dispositivo. Abrir en Actualizar Última sincronización: @@ -323,6 +328,7 @@ Para ajustar el término de búsqueda, mantén pulsado el texto para seleccionar Guardar Configuración parental Nombre +Permitir que los sitios web utilicen JavaScript (recomendado) Se ha eliminado El acceso a la ubicación también está desactivado en este dispositivo. No enviar nunca @@ -360,6 +366,7 @@ No obstante, tus acciones no serán totalmente invisibles. El uso del modo incó Pestañas de incógnito Descripción: ¿Quieres sustituir el archivo de ? +Controla cómo utiliza Google tu historial de navegación para personalizar la Búsqueda, los anuncios y otros servicios de Google. Permisos {HOURS,plural, =1{Hace # hora}other{Hace # horas}} Vincular @@ -368,6 +375,7 @@ No obstante, tus acciones no serán totalmente invisibles. El uso del modo incó Economizador de datos habilitado No Contraseñas guardadas +Preguntar antes de permitir que los sitios web activen el modo de pantalla completa (recomendado) Crear archivo nuevo Se eliminarán todos los datos locales almacenados por este sitio web, incluidas las cookies. Traductor de Google @@ -392,6 +400,7 @@ No obstante, tus acciones no serán totalmente invisibles. El uso del modo incó País/región de ahorro de datos Más información +Añadir excepción de sitio web Excepciones Al habilitar la opción No realizar seguimiento, se incluirá una solicitud con el tráfico de navegación. El efecto dependerá de si algún sitio web responde a la solicitud y de cómo se interpreta. @@ -406,7 +415,7 @@ Por ejemplo, algunos sitios web pueden responder a la solicitud mostrándote anu Borrar y restablecer Editar marcador Sincronización -Pop-ups +Ventanas emergentes Imprimir… Cookies Sugerencias de URL y de búsqueda @@ -453,6 +462,7 @@ Por ejemplo, algunos sitios web pueden responder a la solicitud mostrándote anu Accesibilidad Descarga la aplicación en Google Play Store: Enviar a Google automáticamente información sobre posibles incidentes de seguridad +Preguntar antes de permitir que los sitios web utilicen el micrófono (recomendado) Confirmar cuenta de Google Se ha descargado Abrir en el navegador @@ -515,6 +525,7 @@ Es posible que tu cuenta de Google tenga otras formas del historial de navegaci Dirección de envío Cargar original Consultar las URL cercanas +Permitir siempre Añadir dirección Mover Repite la contraseña @@ -559,10 +570,11 @@ Es posible que tu cuenta de Google tenga otras formas del historial de navegaci Permitir (para búsquedas en la barra de direcciones) Sincronizando con Pestañas estándar +Permite la sincronización en segundo plano de un sitio web específico. Debes instalar una nueva versión de TalkBack. Solo sitios aprobados Mostrar historial completo -Configuración +Ajustes Con esta opción, tu sesión se cerrará en la mayoría de sitios web. Tu conexión a este sitio es privada, pero alguien en la red podría cambiar la apariencia de la página. Aún no tienes contenido @@ -580,7 +592,7 @@ Es posible que tu cuenta de Google tenga otras formas del historial de navegaci Es posible que el contenido (películas, música, etc.) descargado en otras aplicaciones no se pueda reproducir hasta que esas aplicaciones no vuelvan a adquirir licencias basadas en una nueva credencial de dispositivo. Para obtener nuevas licencias, conéctate a Internet y reproduce el contenido descargado. -Activa la sincronización para ver tus pestañas en otros dispositivos. +Activa la sincronización para ver las pestañas de tus otros dispositivos. De Google Payments Borrar entrada Fecha de caducidad @@ -593,6 +605,7 @@ Para obtener nuevas licencias, conéctate a Internet y reproduce el contenido de Controla cómo funciona en Configuración Marcadores Ya se ha iniciado sesión con . Si inicias sesión con , se combinarán los datos sincronizados, como los marcadores, entre las cuentas. Para mantener la información por separado, borra los datos de navegación en la configuración. +Impedir que los sitios web muestren ventanas emergentes (recomendado) Dirección de envío Pestaña Almacenamiento @@ -622,6 +635,7 @@ Para obtener nuevas licencias, conéctate a Internet y reproduce el contenido de Se debe introducir una frase de contraseña Restablecer credenciales del dispositivo Mostrar original +Preguntar antes de permitir que los sitios web envíen notificaciones (recomendado) Estás cambiando las cuentas de sincronización de a . ¿Qué quieres hacer con tus marcadores, tu historial, tus contraseñas y otras opciones? Páginas de la Web física cercanas Vista optimizada para móviles diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb index 64ca7ac4b4829..7becc4d46c280 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb @@ -25,7 +25,7 @@ توقف این سایت هرگز ترجمه نشود پاک کردن سابقه، کوکی‌ها، داده‌های سایت، حافظه پنهان… -اخیراً بسته شده +اخیراً بسته‌شده ‏برای دسترسی به برگه‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید. ‏آنها را در Chrome ببینید سایت اضافه شد @@ -75,7 +75,6 @@ ‏مجوز Chrome را در تنظیمات Android روشن کنید. ذخیره گذرواژه‌ها ‏رمزگذاری همه با گذرواژه Google از تاریخ -‏نحوه استفاده Google از سابقه مرورتان را برای شخصی‌سازی جستجو و سایر سرویس‌های Google کنترل کنید. لطفاً جزئیات ورود به سیستم را به‌روز کنید. پیشرفته ‏نشانک‌های Chrome پیشرفته @@ -129,6 +128,7 @@ بزرگ‌شده - برای کوچک کردن کلیک کنید. نسخه جدیدتری در دسترس است قلم‌های با عرض ثابت +جاوااسکرپیت را برای سایتی خاص مجاز کنید. والدین شما در مدیریت این تنظیمات کمک می‌کنند. ارائه خروج @@ -152,6 +152,7 @@ آدرس‌ها سایت‌ها مجاز به ذخیره و خواندن داده‌های کوکی باشند (توصیه می‌شود) و این حساب را مدیریت می‌کنند. +‏برای دسترسی به برگه‌هایتان در دستگاه‌های دیگر، «همگام‌سازی خودکار داده‌ها» را در تنظیمات حساب Android روشن کنید. ‏حق نسخه‌برداری ‪ Google Inc.‬. کلیه حقوق محفوظ است. بیننده گواهی ایجاد عبارت عبور @@ -160,7 +161,7 @@ عبارت‌های عبور مطابقت ندارند دریافت راهنمایی ذخیره ویدیو -‏پیشنهاد ترجمه صفحه‌ها با استفاده از Google Translate +‏پیشنهاد ترجمه صفحه‌ها با استفاده از ‏‫مترجم Google‬ باز کردن در برگه ناشناس در حال دسترسی به ورودی صوتی و ویدیویی ‏برای دسترسی به نشانک‌هایتان در دستگاه‌های دیگر، به سیستم Chrome وارد شوید. @@ -188,6 +189,7 @@ شما با یک حساب مدیریت شده وارد سیستم می‌شوید و به سرپرست این حساب اجازه کنترل نمایه Chrome خود را می‌دهید. داده‌های Chrome شما به‌طور ثابت با این حساب مرتبط می‌شود. با قطع ارتباط از این حساب، کلیه داده‌های Chrome شما در دستگاه حذف می‌شود. اشتراک‌گذاری تصویر +قبل از اجازه به سایت‌ها برای اطلاع از مکانتان، ابتدا سؤال شود (توصیه می‌شود) به‌دلیل خطاهای سیستم فایل، بارگیری انجام نشد. اندازه: فعال کردن @@ -240,6 +242,7 @@ زبان ترجمه: مجوزهای منبع آزاد پیمایش مسدود است: +خطای همگام‌سازی رخ داد برای دریافت جزئیات ضربه بزنید. کپی آدرس پیوند هرگز ترجمه نشود رسانه @@ -254,13 +257,14 @@ مرور بیشتر با هزینه کمتر در نشانک گذاشته شد صفحه‌های «وب فیزیکی» اطراف در آینده در فهرست اعلان‌ها نشان داده می‌شوند +قبل از اجازه به سایت‌ها برای استفاده از دوربین، ابتدا سؤال شود (توصیه می‌شود) تولید کلید ‏فقط فردی که عبارت عبور شما را دارد می‌تواند اطلاعات رمزگذاری‌شده شما را بخواند. این عبارت عبور به Google ارسال یا در سرورهای آن ذخیره نمی‌شود. اگر عبارت عبورتان را فراموش کنید، باید همگام‌سازی را بازنشانی کنید. بیشتر بدانید {DAYS,plural, =1{۱ روز قبل}one{# روز قبل}other{# روز قبل}} جزئیات ‏مشاهده و مدیریت گذرواژه‌های ذخیره شده در passwords.google.com انتخاب پوشه -کپی آدرس ایمیل +کپی آدرس رایانامه به حالت ناشناس وارد شدید. {MINUTES,plural, =1{# دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}} مدیریت شده توسط والدین شما @@ -272,6 +276,7 @@ ‏برگه‌ها به جابه‌جا‌کننده برگه در Chrome منتقل می‌شوند. ‏یکی از قابلیت‌های مهم برای اجرای Chrome موجود نیست؛ ممکن است نصب Chrome شما به‌ صورت ناقص انجام شده باشد یا اینکه با این نسخه از Android سازگار نباشد. تصاویر و فایل‌های قرار گرفته در حافظه پنهان +‏از صفحه «حساب‌ها» در برنامه «تنظیمات» دستگاه، یک حساب Google اضافه کنید. بازکردن در به‌روزرسانی آخرین همگام‌سازی: @@ -285,7 +290,7 @@ باز کردن ‏این تعداد از نسخه‌های Chrome پشتیبانی نمی‌شود. پرداخت -نتیجه‌ای یافت نشد +نتیجه‌ای پیدا نشد جلو رفتن اشتراک‌گذاری از طریق مسدود (توصیه می‌شود) @@ -323,6 +328,7 @@ ذخیره تنظیمات والدین نام +مجاز کردن همه سایت‌ها برای اجرای جاوااسکریپت (توصیه‌ می‌شود) حذف شد دسترسی به موقعیت مکانی نیز برای این دستگاه خاموش است. هرگز ارسال نشود @@ -346,7 +352,7 @@ نام: ‏افزودن یک حساب Google مکان -ایمیل +رایانامه لغو درخواست وب‌سایت برای جلوگیری از بزرگ‌نمایی ویدیو در پخش نمی‌شود. مسدود است @@ -359,6 +365,7 @@ برگه‌های ناشناس توضیح: آیا می‌خواهید موجود در را جایگرین کنید؟ +‏نحوه استفاده Google را از سابقه مرورتان برای شخصی‌سازی جستجو، آگهی‌ها و سایر سرویس‌های Google کنترل کنید. مجوزها {HOURS,plural, =1{۱ ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}} مرتبط‌سازی @@ -367,9 +374,10 @@ صرفه‌جویی داده فعال است خاموش گذرواژه‌های ذخیره‌شده +قبل از اجازه به سایت‌ها برای ورود به حالت تمام‌صفحه، ابتدا سؤال شود (توصیه می‌شود) ایجاد فایل جدید تمام داده‌های محلی ذخیره شده مرتبط با این وب‌سایت، از جمله کوکی‌ها، حذف می‌شوند. -Google Translate +‏‫مترجم Google‬ روشن بازنشانی در حال پخش «» @@ -391,6 +399,7 @@ کشور/منطقه ذخیره داده‌ها: بیشتر بدانید +افزودن استثنای سایت موارد استثنا فعال کردن «ردیابی نشود» به این معنی است که درخواستی به ترافیک مرور شما اضافه می‌شود. هر گونه اثری به این بستگی دارد که وب‌سایت به درخواست‌ پاسخ می‌دهد یا نه و درخواست چگونه تفسیر می‌شود. @@ -452,6 +461,7 @@ قابلیت دسترسی ‏دریافت برنامه از فروشگاه Google Play: ‏ ‏گزارش خودکار جزئیات حوادث امنیتی احتمالی به Google. +قبل از اجازه به سایت‌ها برای استفاده از میکروفون ابتدا سؤال شود (توصیه می‌شود) ‏تأیید حساب Google بارگیری شد بازکردن در مرورگر @@ -514,6 +524,7 @@ ارسال بارکردن نسخه اصلی مشاهده چیزهایی که در نزدیکی است +همیشه مجاز افزودن آدرس انتقال تأیید عبارت عبور @@ -558,6 +569,7 @@ اجازه دادن (برای جستجوهای نوار آدرس) در حال همگام‌سازی در برگه‌های استاندارد +«همگام‌سازی پس‌زمینه» را برای یک سایت خاص مجاز کنید. ‏باید TalkBack را به نسخه جدیدتری به‌روزرسانی کنید. فقط سایت‌های تأیید شده نمایش کل سابقه @@ -592,6 +604,7 @@ کنترل نحوه عملکرد آن در تنظیمات نشانک‌ها وارد سیستم شد. ورود به سیستم با داده‌های همگا‌م‌سازی شده‌ای مانند نشانک‌ها را بین حساب‌ها ادغام می‌کند. برای جدا نگه‌داشتن اطلاعات، داده‌های مرور را در تنظیمات پاک کنید. +مسدود کردن نمایش پنجره‌های بازشو در سایت‌ها (توصیه می‌شود) اطلاعات ارسال ، برگه فضای ذخیره‌سازی @@ -621,6 +634,7 @@ عبارت عبور لازم است بازنشانی اعتبارنامه‌های دستگاه نمایش مورد اصلی +قبل از اجازه به سایت‌ها برای ارسال اعلان ابتدا سؤال شود (توصیه می‌شود) در حال تغییر دادن حساب‌های همگام‌سازی از به هستید. با نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیمات موجودتان چه می‌کنید؟ صفحات وب فیزیکی همین اطراف نمای مناسب دستگاه همراه diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb index 852eaf1f2ca74..ef622264843e3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb @@ -75,7 +75,6 @@ Bluetooothin ja sijaintipalvelun on oltava päällä, jotta Fyysistä webiä voi Ota käyttöoikeus käyttöön Chromelle Android-asetuksissa. Salasanojen tallentaminen Salaa kaikki tiedot Google-salasanalla, joka on asetettu . -Hallinnoi tapaa, jolla Google käyttää selaushistoriaasi haun ja muiden Googlen palveluiden muokkaamiseen. Päivitä kirjautumistietosi. Lisäasetukset Chromen kehittäjäversion kirjanmerkit @@ -129,6 +128,7 @@ Voit hallinnoida Fyysisen webin ominaisuuksia Chromen asetuksissa. Laajennettu – tiivistä klikkaamalla. Uudempi versio on saatavilla. Monospace +Salli JavaScript tietyllä sivustolla. Vanhempasi auttavat näiden asetusten hallinnassa. Lähetä Poistu @@ -152,6 +152,7 @@ Voit hallinnoida Fyysisen webin ominaisuuksia Chromen asetuksissa. Osoitteet Salli sivustojen tallentaa ja lukea evästetietoja (suositus). Tätä tiliä hallinnoivat ja . +Ota tietojen automaattinen synkronointi käyttöön Androidin tiliasetuksissa, niin voit käyttää välilehtiäsi kaikilla laitteilla. Copyright Google Inc. Kaikki oikeudet pidätetään. Varmennetiedot Luo tunnuslause @@ -188,6 +189,7 @@ Voit hallinnoida Fyysisen webin ominaisuuksia Chromen asetuksissa. Olet kirjautumassa hallinnoituun tiliin, jonka hallinnoijalla on oikeus muokata Chrome-profiiliasi. Chrome-tietosi yhdistetään tähän tiliin pysyvästi. Jos irrotat Chrome-tiedot tilistä, paikalliset Chrome-tiedot poistetaan. Jaa kuva +Pyydä lupaa, kun sivustot yrittävät käyttää sijaintiasi (suositus). Tiedoston lataus epäonnistui tiedostojärjestelmävirheen vuoksi. Koko: Ota käyttöön @@ -240,6 +242,7 @@ Muokkaa hakutermiä valitsemalla se pitkällä painalluksella. Tarkenna hakua li Käännöksen kieli: Avoimen lähdekoodin käyttöluvat Kohde on estetty: +Synkronoinnissa tapahtui virhe – saat lisätietoja napauttamalla. Kopioi linkin osoite Älä koskaan käännä kieltä Media @@ -254,6 +257,7 @@ Muokkaa hakutermiä valitsemalla se pitkällä painalluksella. Tarkenna hakua li Selaa enemmän vähemmällä Lisätty kirjanmerkiksi kansioon Lähistöltä löytyvät Fyysinen web ‑sivut näytetään ilmoitusluettelossasi. +Pyydä lupaa, kun sivustot yrittävät käyttää kameraasi (suositus). Avaimen luominen Salattuja tietojasi voi lukea vain tunnuslauseesi avulla. Tunnuslausetta ei lähetetä Googlelle eikä Google tallenna sitä. Jos unohdat tunnuslauseesi tai haluat muokata tätä asetusta, synkronointi täytyy nollata. Lisätietoja {DAYS,plural, =1{# päivä sitten}other{# päivää sitten}} @@ -272,6 +276,7 @@ Muokkaa hakutermiä valitsemalla se pitkällä painalluksella. Tarkenna hakua li Välilehdet muuttavat Chromen sisäiseen välilehtien vaihtajaan. Chromen suorittamiseen tarvittava kriittinen toiminto puuttuu. Joko Chromea ei ole asennettu loppuun tai selain ei sovi yhteen tämän Android-version kanssa. Välimuistissa olevat kuvat ja tiedostot +Lisää Google-tili sovelluksen Asetukset-sovelluksen Tilit-sivulla. Avaa kohteessa Päivitä Viimeisin synkronointi: @@ -323,6 +328,7 @@ Muokkaa hakutermiä valitsemalla se pitkällä painalluksella. Tarkenna hakua li Tallenna Vanhempien asetukset Nimi +Anna kaikkien sivustojen käyttää JavaScriptiä (suositus). poistettiin. Sijaintitiedot on poistettu käytöstä myös tässä laitteessa. Älä lähetä koskaan @@ -360,6 +366,7 @@ Et ole kuitenkaan näkymätön. Incognito-tila ei piilota selaustietojasi työna Incognito-välilehdet Kuvaus: Haluako korvata olemassa olevan tiedoston hakemistossa ? +Hallinnoi tapaa, jolla Google käyttää selaushistoriaasi haun, mainosten ja muiden Googlen palveluiden muokkaamiseen. Käyttöluvat {HOURS,plural, =1{# tunti sitten}other{# tuntia sitten}} Muodosta laitepari @@ -368,6 +375,7 @@ Et ole kuitenkaan näkymätön. Incognito-tila ei piilota selaustietojasi työna Data Saver käytössä Pois käytöstä Tallennetut salasanat +Pyydä lupaa, kun sivustot yrittävät siirtyä koko näytön tilaan (suositus). Luo uusi tiedosto. Kaikki tämän sivuston tallentamat paikalliset tiedot (myös evästeet) poistetaan. Google Kääntäjä @@ -392,6 +400,7 @@ Et ole kuitenkaan näkymätön. Incognito-tila ei piilota selaustietojasi työna Maa/alue vähemmän tiedonsiirtoa Lisätietoja +Lisää sivustopoikkeus Poikkeukset Do Not Track -toiminnon käyttöönotto tarkoittaa sitä, että selausliikenteeseesi sisällytetään pyyntö. Sen vaikutus riippuu siitä, vastaako verkkosivusto pyyntöön ja miten pyyntöä tulkitaan. @@ -453,6 +462,7 @@ Jotkin verkkosivustot voivat vastata tähän pyyntöön esimerkiksi näyttämäl Esteettömyys Hanki sovellus Google Play Kaupasta: Ilmoita mahdollisista turvallisuusongelmista Googlelle automaattisesti +Pyydä lupaa, kun sivustot yrittävät käyttää mikrofonia (suositus). Vahvista Google-tili ladattiin. Avaa selaimessa @@ -515,6 +525,7 @@ Google-tililläsi voi olla muita selaushistoriatietoja, kuten hakuja ja toiminta Toimitus Lataa alkuperäinen Näytä lähellä olevat sivut +Salli aina Lisää osoite Siirrä Vahvista tunnuslause @@ -559,6 +570,7 @@ Google-tililläsi voi olla muita selaushistoriatietoja, kuten hakuja ja toiminta Salli (osoitepalkissa tehtäville hauille) Synkronoidaan tietoja tilille . Tavalliset välilehdet +Salli taustasynkronointi tietyllä sivustolla. TalkBack täytyy päivittää uudempaan versioon. Vain hyväksytyt sivustot Näytä koko selaushistoria @@ -593,6 +605,7 @@ Hanki uudet käyttöoik. muodostam. verkkoyhteys ja toistamalla ladattu sisält Säädä tämän toimintaa asetuksissa. Kirjanmerkit on laitteeseen viimeksi kirjautunut käyttäjä. Jos kirjaudut sisään tilillä , näiden tilien synkronoidut tiedot, kuten kirjanmerkit, yhdistetään. Jos haluat pitää tiedot toisistaan erillään, tyhjennä selaustiedot asetuksissa. +Estä ponnahdusikkunoiden näyttäminen sivustoilla (suositus). Toimitusosoite , välilehti Tallennus @@ -622,6 +635,7 @@ Hanki uudet käyttöoik. muodostam. verkkoyhteys ja toistamalla ladattu sisält Tunnuslause tarvitaan Nollaa laitteen kirjautumistiedot Näytä alkuperäinen +Pyydä lupaa, kun sivustot yrittävät lähettää ilmoituksia (suositus). Muutoksen jälkeen synkronointi käyttää tilin sijaan tiliä . Mitä nykyisille kirjanmerkeille, historiatiedoille, salasanoille ja muille asetuksille tehdään? Lähistöllä on Fyysisen webin sivuja. Mobiililaitteille sopiva näkymä diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb index 6d8d3db80a6e1..5699418c743b9 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb @@ -75,7 +75,6 @@ Dapat na na-on mo ang Bluetooth at Lokasyon upang magamit ang Pisikal na Web.I-on ang pahintulot para sa Chrome sa Mga Setting ng Android. I-save ang mga password I-encrypt lahat gamit ang password ng Google simula sa -Kontrolin kung paano ginagamit ng Google ang iyong history ng pagba-browse upang i-personalize ang Search at iba pang mga serbisyo ng Google. Paki-update ang iyong mga detalye sa pag-sign in. Advanced Mga bookmark ng Chrome Dev @@ -129,6 +128,7 @@ Makokontrol mo ang Pisikal na Web sa Mga Setting ng Chrome. Pinalawak - i-click upang i-collapse. May available na mas bagong bersyon Monospace +Payagan ang JavaScript para sa isang partikular na site. Tumutulong ang iyong mga magulang na pamahalaan ang mga setting na ito. Isumite Umalis @@ -152,6 +152,7 @@ Makokontrol mo ang Pisikal na Web sa Mga Setting ng Chrome. Mga Address Payagan ang mga site na mag-save at magbasa ng data ng cookie (inirerekomenda) Pinapamahalaan ang account na ito ng at . +Upang makuha ang iyong mga tab mula sa iba mo pang mga device, i-on ang "I-auto sync ang data" sa mga setting ng Android account. Copyright Google Inc. Nakalaan ang lahat ng karapatan. Viewer ng certificate Gumawa ng passphrase @@ -188,6 +189,7 @@ Makokontrol mo ang Pisikal na Web sa Mga Setting ng Chrome. Nagsa-sign in ka sa isang pinamamahalaang account at nagbibigay sa administrator nito ng kontrol sa iyong profile sa Chrome. Permanenteng mauugnay ang iyong data ng Chrome sa account na ito. Ang pagdiskonekta mula sa account na ito ay magtatanggal sa lokal na data ng Chrome. Magbahagi ng larawan +Magtanong bago payagan ang mga site na malaman ang iyong lokasyon (inirerekomenda) Hindi na-download ang dahil sa mga error sa file system. Laki: I-enable @@ -240,6 +242,7 @@ Upang baguhin ang iyong termino para sa paghahanap, pindutin ito nang matagal up Wika ng Pagsasalin: Mga lisensya ng open source Naka-block ang navigation: +Nagkaroon ng error sa pag-sync, i-tap upang kunin ang mga detalye. Kopyahin ang address ng link Huwag isalin kailanman ang Media @@ -254,6 +257,7 @@ Upang baguhin ang iyong termino para sa paghahanap, pindutin ito nang matagal up Mag-browse pa nang mas mura Na-bookmark sa Lalabas sa iyong listahan ng mga notification ang mga kalapit na page ng Pisikal na Web sa hinaharap +Magtanong muna bago payagan ang mga site na gamitin ang iyong camera (inirerekomenda) Pagbuo ng key Ang taong may alam ng iyong passphrase lang ang makakabasa sa iyong naka-encrypt na data. Hindi ipinapadala sa o iniimbak ng Google ang passphrase. Kung makakalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, kakailanganin mong i-reset ang pag-sync. Matuto nang higit pa {DAYS,plural, =1{# araw ang nakalipas}one{# araw ang nakalipas}other{# na araw ang nakalipas}} @@ -272,6 +276,7 @@ Upang baguhin ang iyong termino para sa paghahanap, pindutin ito nang matagal up Malilipat ang mga tab sa isang tagalipat ng tab sa Chrome. Wala ang mahalagang functionality na kinakailangan upang patakbuhin ang Chrome; maaaring hindi natapos ang pag-install sa iyong Chrome o hindi ito tugma sa bersyong ito ng Android. Mga naka-cache na larawan at file +Magdagdag ng Google Account mula sa page na Mga Account sa app na Mga Setting ng iyong device. Buksan sa Mag-update Huling na-sync: @@ -323,6 +328,7 @@ Upang baguhin ang iyong termino para sa paghahanap, pindutin ito nang matagal up I-save Mga Setting para sa Magulang Pangalan +Payagan ang mga site na magpatakbo ng JavaScript (inirerekomenda) Na-delete ang Ang access sa lokasyon ay naka-off din para sa device na ito. Huwag na huwag ipadala @@ -360,6 +366,7 @@ Gayunpaman, hindi ka invisible. Hindi tinatago ng pagiging incognito ang iyong p Mga tab na incognito Paglalarawan: Gusto mo bang palitan ang umiiral nang sa ? +Kontrolin kung paano ginagamit ng Google ang iyong history ng pagba-browse upang i-personalize ang Search, mga ad at iba pang mga serbisyo ng Google. Mga Pahintulot {HOURS,plural, =1{# oras ang nakalipas}one{# oras ang nakalipas}other{# na oras ang nakalipas}} Ipares @@ -368,6 +375,7 @@ Gayunpaman, hindi ka invisible. Hindi tinatago ng pagiging incognito ang iyong p Naka-enable ang Data Saver Naka-off Mga naka-save na password +Magtanong muna bago payagan ang mga site na mag-fullscreen (inirerekomenda) Gumawa ng bagong file Made-delete ang lahat ng lokal na data na inimbak ng website na ito, kasama ang cookies. Google Translate @@ -392,6 +400,7 @@ Gayunpaman, hindi ka invisible. Hindi tinatago ng pagiging incognito ang iyong p Bansa/Rehiyon natipid sa data Matuto nang higit pa +Magdagdag ng pagbubukod ng site Mga Pagbubukod Kapag na-enable mo ang “Huwag Subaybayan,” magsasama ng isang kahilingan sa trapiko ng iyong pagba-browse. Ang anumang magiging epekto ay dedepende sa pagtugon at pagbibigay-kahulugan ng website sa nabanggit na kahilingan. @@ -453,6 +462,7 @@ Halimbawa, maaaring tumugon ang ilang website sa kahilingang ito sa pamamagitan Pagiging Maa-access Kunin ang app mula sa Google Play Store: Awtomatikong iulat sa Google ang mga detalye ng mga posibleng isyu sa seguridad +Magtanong muna bago payagan ang mga site na gamitin ang iyong mikropono (inirerekomenda) Kumpirmahin ang Google Account Na-download na ang Buksan sa browser @@ -515,6 +525,7 @@ Maaaring mayroong ibang mga uri ng history ng pagba-browse ang iyong Google acco Pagpapadala I-load ang orihinal Tingnan kung anong nasa malapit +Palaging pinapayagan Magdagdag ng address Ilipat Kumpirmahin ang passphrase @@ -559,6 +570,7 @@ Maaaring mayroong ibang mga uri ng history ng pagba-browse ang iyong Google acco Payagan (para sa mga paghahanap sa address bar) Sini-sync sa Mga karaniwang tab +Payagan ang Pag-sync sa Background para sa isang partikular na site. Kailangan mong i-update ang TalkBack sa isang mas bagong bersyon. Mga naaprubahang site lang Ipakita ang buong history @@ -593,6 +605,7 @@ Upang makakuha ng mga bagong lisensya, kumonekta sa internet at i-play ang iyong Kontrolin kung paano ito gumagana sa Mga Setting Mga Bookmark Nag-sign in si . Ang pagsa-sign in gamit ang ay magme-merge ng na-sync na data gaya ng mga bookmark sa pagitan ng mga account. Upang mapanatiling hiwalay ang impormasyon, i-clear ang data ng pagba-browse sa mga setting. +I-block ang mga site sa pagpapakita ng mga pop-up (inirerekomenda) Shipping address , tab Storage @@ -622,6 +635,7 @@ Upang makakuha ng mga bagong lisensya, kumonekta sa internet at i-play ang iyong Kinakailangan ang passphrase I-reset ang mga kredensyal ng device Ipakita ang orihinal +Magtanong bago payagan ang mga site na magpadala ng mga notification (inirerekomenda) Lumilipat ka sa naka-sync na account na mula sa . Ano ang gusto mong gawin sa kasalukuyan mong mga bookmark, history, mga password at iba pang mga setting? Kalapit na mga page ng Pisikal na Web View na pang-mobile diff --git a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb index 29240f5658eaf..05977cd1a8e32 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb @@ -75,7 +75,6 @@ Vous devez activer le Bluetooth et les services de localisation pour utiliser le Activer l'autorisation pour Chrome dans les paramètres Android Enregistrer les mots de passe Tout chiffrer avec le mot de passe Google à compter du -Contrôlez la façon dont Google utilise votre historique de navigation pour personnaliser la recherche et d'autres services Google. Veuillez mettre à jour vos informations de connexion. Paramètres avancés Favoris de la version en développement de Chrome @@ -101,9 +100,9 @@ Vous devez activer le Bluetooth et les services de localisation pour utiliser le Affiner La sélection de certificat côté client n'est pas compatible avec le système d'exploitation. Faites glisser le curseur pour lire le texte aisément. Sa taille doit être similaire à celle-ci lorsque vous appuyez deux fois sur un paragraphe. -Des appareils à proximité diffusent des pages Web via le Bluetooth. Chrome recherche les pages à proximité et les affiche lorsque vous réactivez votre l'appareil. Ces pages sont analysées par un service Google pour améliorer la qualité des résultats. +Des appareils à proximité diffusent des pages Web via le Bluetooth. Chrome va rechercher les pages à proximité et les affichera lorsque vous réactiverez votre l'appareil. Ces pages seront analysées par un service Google pour améliorer la qualité des résultats. -Vous pouvez contrôler le Web physique dans les paramètres de Chrome. +Vous pouvez contrôler les paramètres du Web physique dans les paramètres de Chrome. En savoir plus Installation… @@ -129,6 +128,7 @@ Vous pouvez contrôler le Web physique dans les paramètres de Chrome. Développé – Cliquer pour réduire Version plus récente dispo. Monospace +Autorise le langage JavaScript pour un site spécifique. Vos parents vous aident à gérer ces paramètres. Valider Quitter @@ -152,6 +152,7 @@ Vous pouvez contrôler le Web physique dans les paramètres de Chrome. Adresses Autoriser les sites à enregistrer et à lire les données des cookies (recommandé) Ce compte est géré par et . +Activez l'option "Synchro auto des données" dans les paramètres Android de votre compte Google pour accéder à vos onglets sur vos autres appareils. Copyright Google Inc. . Tous droits réservés. Lecteur de certificat Créer une phrase secrète @@ -188,6 +189,7 @@ Vous pouvez contrôler le Web physique dans les paramètres de Chrome. Vous vous connectez avec un compte géré, et vous donnez à l'administrateur le contrôle de votre profil Google Chrome. Vos données Chrome vont être associées à ce compte de manière définitive. Si vous vous en déconnectez, les données Chrome locales sont supprimées. Partager l'image +Demander avant d'autoriser des sites à accéder à ma position (recommandé) Échec du téléchargement du fichier "" en raison d'erreurs liées au système de fichiers. Taille : Activer @@ -240,6 +242,7 @@ Pour modifier le terme de recherche, appuyez sur celui-ci de manière prolongée Langue de traduction : Licences Open Source La navigation sur est bloquée. +Une erreur de synchronisation s'est produite. Appuyez ici pour obtenir des informations. Copier l'adresse du lien Ne jamais traduire les pages rédigées en Médias @@ -254,6 +257,7 @@ Pour modifier le terme de recherche, appuyez sur celui-ci de manière prolongée Consommer moins de données Ajouté aux favoris dans "" À l'avenir, les pages Web physique à proximité s'afficheront dans votre liste de notifications. +Demander avant d'autoriser des sites à utiliser ma caméra (recommandé) Génération de clé Seule une personne connaissant votre phrase secrète peut lire vos données chiffrées. La phrase secrète ne nous est pas envoyée et nous ne la stockons pas. Si vous l'oubliez, vous devrez réinitialiser la synchronisation. En savoir plus {DAYS,plural, =1{Il y a # jour}one{Il y a # jour}other{Il y a # jours}} @@ -272,6 +276,7 @@ Pour modifier le terme de recherche, appuyez sur celui-ci de manière prolongée Les onglets vont être déplacés dans un sélecteur d'onglets au sein de Chrome. Une fonctionnalité essentielle à l'exécution de Google Chrome est manquante. Soit vous n'avez pas terminé d'installer Google Chrome, soit la version installée n'est pas compatible avec cette version d'Android. Images et fichiers en cache +Ajoutez un compte Google depuis la page "Comptes" dans l'application Paramètres de votre appareil. Ouvrir dans Mettre à jour Dernière synchronisation : @@ -323,6 +328,7 @@ Pour modifier le terme de recherche, appuyez sur celui-ci de manière prolongée Enregistrer Paramètres parentaux Nom +Autoriser les sites à exécuter JavaScript (recommandé) Le favori "" a été supprimé. L'accès aux données de localisation est également désactivé pour cet appareil. Ne jamais envoyer @@ -361,6 +367,7 @@ Vous n'êtes cependant pas devenu invisible. L'utilisation du mode navigation pr Onglets de navigation privée Description : Voulez-vous vraiment remplacer le fichier dans le répertoire "" ? +Contrôlez la façon dont Google utilise votre historique de navigation pour personnaliser la recherche, les annonces et d'autres services Google. Autorisations {HOURS,plural, =1{Il y a # heure}one{Il y a # heure}other{Il y a # heures}} Associer @@ -369,6 +376,7 @@ Vous n'êtes cependant pas devenu invisible. L'utilisation du mode navigation pr Économiseur de données activé Désactivé Mots de passe enregistrés +Demander avant d'autoriser des sites à utiliser le mode plein écran (recommandé) Créer un fichier Toutes les données locales stockées par ce site, y compris les cookies, seront supprimées. Google Traduction @@ -393,6 +401,7 @@ Vous n'êtes cependant pas devenu invisible. L'utilisation du mode navigation pr Pays/Région Économies de données de En savoir plus +Ajouter une exception pour un site Exceptions Si vous interdisez le suivi, une demande sera incluse dans le trafic lié à votre navigation. Les résultats obtenus dépendent de la réponse du site (s'il répond ou non) et de la manière dont il interprète la demande. @@ -454,6 +463,7 @@ Par exemple, certains sites Web peuvent répondre à cette demande en diffusant Accessibilité Télécharger l'application sur le Google Play Store : Signaler automatiquement les incidents de sécurité potentiels à Google +Demander avant d'autoriser des sites à utiliser mon micro (recommandé) Confirmer le compte Google Le fichier "" a bien été téléchargé. Ouvrir dans le navigateur @@ -516,6 +526,7 @@ Votre compte Google conserve peut-être d'autres formes d'historique de navigati Adresse de livraison Charger le site d'origine Voir les URL à proximité +Toujours autorisé Ajouter une adresse Déplacer Confirmer la phrase secrète @@ -560,6 +571,7 @@ Votre compte Google conserve peut-être d'autres formes d'historique de navigati Autoriser (pour les recherches dans la barre d'adresse) Synchronisation avec Onglets standards +Autorise la synchronisation en arrière-plan pour un site spécifique. Vous devez mettre à jour TalkBack vers une version plus récente Uniquement les sites approuvés Afficher l'historique complet @@ -594,6 +606,7 @@ Pour obtenir de nouvelles licences, connectez-vous à Internet et lisez le conte Contrôler comment cela fonctionne dans Paramètres Favoris Le compte est déjà connecté. Si vous vous connectez avec l'adresse , les données synchronisées des deux comptes, telles que les favoris, vont être fusionnées. Pour ne pas fusionner ces informations, veuillez effacer vos données de navigation dans les paramètres. +Bloquer l'affichage de fenêtres pop-up par les sites (recommandé) Adresse de livraison "", onglet Stockage @@ -623,6 +636,7 @@ Pour obtenir de nouvelles licences, connectez-vous à Internet et lisez le conte Veuillez saisir la phrase secrète. Réinitialiser les identifiants de l'appareil Afficher l'original +Demander avant d'autoriser des sites à envoyer des notifications (recommandé) Vous changez de compte synchronisé pour passer de à . Que souhaitez-vous faire des favoris, de l'historique, des mots de passe et des autres paramètres actuels ? Pages Web physique à proximité Affichage adapté au mobile diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb index 344dc5c15b75e..e6f1ab3aed44f 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb @@ -75,7 +75,6 @@ Android सेटिंग में Chrome के लिए अनुमति चालू करें. पासवर्ड सहेजें तक का सभी डेटा Google पासवर्ड से एन्‍क्रिप्‍ट करें -नियंत्रित करें कि खोज और अन्य Google सेवाओं को वैयक्तिकृत करने के लिए Google आपके ब्राउज़िंग इतिहास का उपयोग कैसे करता है. कृपया अपने प्रवेश विवरण अपडेट करें. उन्नत Chrome डेवपलर बुकमार्क @@ -129,6 +128,7 @@ विस्‍तारित - संक्षिप्‍त करने के लिए क्‍लिक करें. अधिक नया वर्शन उपलब्ध है मोनोस्पेस +विशिष्ट साइट के लिए JavaScript की अनुमति दें. आपके अभिभावक इन सेटिंग को प्रबंधित करने में आपकी सहायता करते हैं. सबमिट करें छोड़ें @@ -152,6 +152,7 @@ पते साइटों को कुकी डेटा सहेजने और पढ़ने दें (अनुशंसित) यह खाता और के द्वारा प्रबंधित है. +अपने अन्य डिवाइस से अपने टैब प्राप्त करने के लिए, Android खाता सेटिंग में "डेटा स्वत: समन्वयित करें" चालू करें. कॉपीराइट Google Inc. सर्वाधिकार सुरक्षित. प्रमाणपत्र व्यूअर पासफ़्रेज़ बनाएं @@ -188,6 +189,7 @@ आप प्रबंधित खाते से प्रवेश कर रहे हैं और अपनी Chrome प्रोफ़ाइल को इसका व्यवस्थापक नियंत्रण दे रहे हैं. आपका Chrome डेटा इस खाते से स्थायी रूप से जुड़ जाएगा. इस खाते से डिस्कनेक्ट करने से स्थानीय Chrome डेटा हट जाएगा. चित्र साझा करें +साइट को अपना स्थान जानने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित) सिस्‍टम त्रुटियों के कारण डाउनलोड विफल रहा. आकार: सक्षम करें @@ -207,7 +209,7 @@ तृतीय-पक्ष वेबसाइटें कुकी डेटा को सहेज सकती हैं और पढ़ सकती हैं मार्गदर्शक त्रुटि सुझाव वेबपृष्ठ आस-पास उपलब्ध हैं -रुचियां पुनर्प्राप्‍त नहीं की जा सकीं. +रुचि पुनर्प्राप्‍त नहीं की जा सकीं. खोजने के लिए स्पर्श करें पृष्ठभूमि समन्वयन ” समाप्‍त @@ -240,6 +242,7 @@ अनुवाद की भाषा: ओपन सोर्स लाइसेंस मार्गदर्शक अवरोधित है: +समन्वयन त्रुटि हुई, विवरण प्राप्त करने के लिए टैप करें. लिंक पते की प्रतिलिपि बनाएं कभी भी का अनुवाद न करें मीडिया @@ -254,6 +257,7 @@ कम से अधिक ब्राउज़ करें में बुकमार्क किया गया भविष्य के आस-पास स्थित भौतिक वेब पृष्ठ आपकी नोटिफिकेशन सूची में दिखाई देंगे +साइट को अपने कैमरे का उपयोग करने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित) कुंजी जेनरेशन आपके एन्क्रिप्ट किए गए डेटा को केवल वही व्यक्ति पढ़ सकता है जिसके पास आपका पासफ़्रेज़ है. Google द्वारा पासफ़्रेज़ भेजा या संग्रहीत नहीं किया जाता. यदि आप अपना पासफ़्रेज़ भूल जाते हैं या यह सेटिंग बदलना चाहते हैं, तो आपको समन्वयन को रीसेट करना होगा. अधिक जानें {DAYS,plural, =1{# दिन पहले}one{# दिन पहले}other{# दिन पहले}} @@ -272,6 +276,7 @@ टैब, Chrome के अंदर एक टैब स्‍विचर पर चले जाएंगे. Chrome चलाने के लिए आवश्‍यक जटिल कार्यक्षमता अनुबलब्ध है; या तो आपका Chrome इंस्‍टॉलेशन अपूर्ण है, या वह Android के इस वर्शन के साथ संगत नहीं है. संचय चित्र और फ़ाइलें +अपने डिवाइस के सेटिंग ऐप्लिकेशन में खाते पृष्ठ से कोई Google खाता जोड़ें. में खोलें अपडेट करें पिछली बार समन्वयित: @@ -296,7 +301,7 @@ उपयोग संक्षिप्त - विस्तृत करने के लिए क्लिक करें. डाउनलोड रोका गया. -रुचियां +रुचि समन्वयन बंद है यह पृष्‍ठ में है. इसका में अनुवाद करें? टैब और ऐप्स मर्ज करें @@ -323,6 +328,7 @@ सहेजें अभिभावकीय सेटिंग नाम +साइट को JavaScript चलाने की अनुमति दें (अनुशंसित) हटाया गया स्थान ऐक्सेस को भी इस डिवाइस के लिए बंद कर दिया गया है. कभी ना भेजें @@ -360,6 +366,7 @@ गुप्त टैब वर्णन: क्या आप वर्तमान को में बदलना चाहते हैं? +नियंत्रित करें कि खोज, विज्ञापन और अन्य Google सेवाओं को वैयक्तिकृत करने के लिए Google आपके ब्राउज़िंग इतिहास का उपयोग कैसे करता है. अनुमतियां {HOURS,plural, =1{# घंटा पहले}one{# घंटे पहले}other{# घंटे पहले}} युग्‍मित करें @@ -368,6 +375,7 @@ डेटा बचतकर्ता सक्षम किया गया है बंद सहेजे गए पासवर्ड +साइट को पूर्णस्क्रीन में जाने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित) नई फ़ाइल बनाएं कुकी सहित, इस वेबसाइट द्वारा संग्रहीत किया गया सभी डेटा हटा दिया जाएगा. Google अनुवाद @@ -392,6 +400,7 @@ देश/क्षेत्र डेटा बचत अधिक जानें +साइट का अपवाद जोड़ें अपवाद “नज़र न रखें” सक्षम करने का अर्थ है कि आपके ब्राउज़िंग ट्रैफ़िक के साथ एक अनुरोध शामिल किया जाएगा. कोई भी प्रभाव इस बात पर निर्भर करता है कि वेबसाइट अनुरोध का प्रतिसाद देती है या नहीं और अनुरोध को किस तरह समझा जाता है. @@ -453,6 +462,7 @@ पहुंच क्षमता Google Play स्‍टोर से ऐप प्राप्‍त करें: Google को संभावित सुरक्षा घटनाओं के विवरणों की अपने आप रिपोर्ट करें +साइट को अपने माइक्रोफ़ोन का उपयोग करने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित) Google खाते की पुष्‍टि करें को डाउनलोड किया गया ब्राउज़र में खोलें @@ -515,6 +525,7 @@ शिपिंग मूल लोड करें देखें कि आस-पास क्या है +हमेशा अनुमति है पता जोड़ें ले जाएं पासफ़्रेज़ की दुबारा पूछें @@ -559,6 +570,7 @@ अनुमति दें (पता बार खोजों के लिए) से समन्वयित हो रहा है मानक टैब +किसी विशिष्ट साइट के लिए पृष्ठभूमि समन्वयन की अनुमति दें. आपको TalkBack को अधिक नए वर्शन से अपडेट करना होगा. केवल स्‍वीकृत साइटें संपूर्ण इतिहास दिखाएं @@ -593,6 +605,7 @@ नियंत्रित करें कि यह सेटिंग में कैसे काम करता है बुकमार्क में प्रवेश किया गया था. के द्वारा प्रवेश करने से बुकमार्क जैसा समन्‍वयित डेटा खातों के बीच मर्ज किया जाएगा. जानकारी को अलग बनाए रखने के लिए, सेटिंग में ब्राउज़िंग डेटा साफ़ करें. +साइट को पॉप-अप दिखाने से अवरुद्ध करें (अनुशंसित) शिपिंग पता , टैब मेमोरी @@ -622,6 +635,7 @@ पासफ़्रेज़ आवश्यक डिवाइस प्रमाणिकता रीसेट करें मूल दिखाएं +साइट को नोटिफ़िकेशन भेजने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित) आप समन्वयन खातों को से में बदल रहे हैं. आप अपने मौजूदा बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग का क्या करना चाहते हैं? आस-पास के शारीरिक वेब पृष्ठ मोबाइल के अनुकूल दृश्‍य diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb index 8fb71de4da20b..7800405695b89 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb @@ -75,7 +75,6 @@ Da biste upotrebljavali Fizički web, morate uključiti Bluetooth i Lokaciju.Uključite dopuštenje za Chrome u Postavkama Androida. Spremanje zaporki Kriptiraj sve pomoću Googleove zaporke od -Upravljajte načinom na koji Google upotrebljava vašu povijest pregledavanja za prilagodbu Pretraživanja i drugih Googleovih usluga. Ažurirajte pojedinosti prijave. Napredno Oznake iz preglednika Chrome Dev @@ -129,6 +128,7 @@ Fizičkim webom možete upravljati u Chromeovim postavkama. Prošireno – kliknite za sažimanje. Dostupna je novija verzija Ravnomjerno raspoređeno +Dopuštanje JavaScripta za određenu web-lokaciju. Tvoji roditelji pomažu pri upravljanju tim postavkama. Pošalji Napusti @@ -152,6 +152,7 @@ Fizičkim webom možete upravljati u Chromeovim postavkama. Adrese Dopuštanje web-lokacijama da spremaju i čitaju podatke kolačića (preporučeno) Računom upravljaju i . +Da bi se prikazale kartice s vaših ostalih uređaja, uključite "Automatsku sinkronizaciju podataka" u postavkama računa na Androidu. Autorska prava . Google Inc. Sva prava pridržana. Preglednik certifikata Stvaranje zaporke @@ -188,6 +189,7 @@ Fizičkim webom možete upravljati u Chromeovim postavkama. Prijavljujete se svojim upravljanim računom i njenom administratoru dajete nadzor nad svojim Chrome profilom. Vaši podaci na Chromeu bit će trajno povezani s ovim računom. Prekidanje veze s ovim računom dovest će do brisanja lokalnih podataka na Chromeu. Dijeli sliku +Web-lokacije moraju tražiti dopuštenje za pristup lokaciji (preporučeno) Preuzimanje datoteke nije uspjelo zbog nepoznate pogreške sustava datoteka. Veličina: Omogući @@ -240,6 +242,7 @@ Da biste prilagodili pojam za pretraživanje, dugo pritisnite za odabir. Da bist Jezik prijevoda: Licence otvorenog koda Otvaranje je blokirano: +Došlo je do pogreške sinkronizacije, dodirnite da biste vidjeli pojedinosti. Kopiraj adresu veze Nikad ne prevodi Mediji @@ -254,6 +257,7 @@ Da biste prilagodili pojam za pretraživanje, dugo pritisnite za odabir. Da bist Brže pregledavanje Oznaka dodana u mapu Buduće stranice Fizičkog weba u blizini prikazivat će se na popisu obavijesti +Web-lokacije moraju tražiti dopuštenje za pristup kameri (preporučeno) Generiranje ključeva Samo osoba koja ima vašu šifru može čitati vaše kriptirane podatke. Šifra se ne šalje Googleu i ne pohranjuje na njemu. Ako zaboravite šifru ili želite promijeniti tu postavku, morat ćete poništiti sinkronizaciju. Saznajte više {DAYS,plural, =1{prije # dana}one{prije # dana}few{prije # dana}other{prije # dana}} @@ -272,6 +276,7 @@ Da biste prilagodili pojam za pretraživanje, dugo pritisnite za odabir. Da bist Kartice će se premjestiti na izmjenjivač kartica u Chromeu. Nedostaje ključna funkcija potrebna za izvođenje preglednika Chrome; instalacija Chromea nije potpuna ili Chrome nije kompatibilan s tom verzijom Androida. Predmemorirane slike i datoteke +Dodajte Google račun putem stranice Računi u aplikaciji Postavke na uređaju. Otvori u aplikaciji Ažuriraj Posljednja sinkronizacija: @@ -323,6 +328,7 @@ Da biste prilagodili pojam za pretraživanje, dugo pritisnite za odabir. Da bist Spremi Postavke nadređenog računa Naziv +Web-lokacije mogu pokretati JavaScript (preporučeno) Izbrisana je oznaka Pristup lokaciji isključen je i za ovaj uređaj. Nikad ne šalji @@ -360,6 +366,7 @@ Međutim, niste nevidljivi. Anonimni način neće sakriti vaše pregledavanje od Anonimne kartice Opis: Želite li zamijeniti postojeću datoteku u direktoriju ? +Upravljajte načinom na koji Google upotrebljava vašu povijest pregledavanja za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga. Dozvoljeno {HOURS,plural, =1{prije # sata}one{prije # sata}few{prije # sata}other{prije # sati}} Upari @@ -368,6 +375,7 @@ Međutim, niste nevidljivi. Anonimni način neće sakriti vaše pregledavanje od Ušteda podataka omogućena Isključeno Spremljene zaporke +Web-lokacije moraju tražiti dopuštenje za prikaz na cijelom zaslonu (preporučeno) Napravi novu datoteku Izbrisat će se svi lokalni podaci koje pohranjuje ova web-lokacija, uključujući kolačiće. Google prevoditelj @@ -392,6 +400,7 @@ Međutim, niste nevidljivi. Anonimni način neće sakriti vaše pregledavanje od Država/regija manji podatkovni promet Saznajte više +Dodaj iznimku za web-lokaciju Iznimke Omogućivanje opcije "Nemoj pratiti" znači da će se u promet pregledavanja uključiti zahtjev. Učinak ovisi o tome odgovara li web-lokacija na taj zahtjev i kako se zahtjev tumači. @@ -453,6 +462,7 @@ Na primjer, neke web-lokacije na taj zahtjev mogu odgovoriti tako da vam prikaž Pristupačnost Preuzmite aplikaciju iz Trgovine Google Play: Automatski prijavi Googleu pojedinosti o mogućim sigurnosnim incidentima +Web-lokacije moraju tražiti dopuštenje za upotrebu mikrofona (preporučeno) Potvrđivanje Google računa Datoteka je preuzeta Otvori u pregledniku @@ -515,6 +525,7 @@ Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjeric Dostava Učitaj izvornu stranicu Pogledajte što je u blizini +Uvijek dopušteno Dodaj adresu Pomakni Potvrdi zaporku @@ -559,6 +570,7 @@ Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjeric Dopusti (za pretraživanja u adresnoj traci) Sinkronizacija s računom Standardne kartice +Omogućuje sinkronizaciju u pozadini za određenu web-lokaciju. Morate ažurirati TalkBack na najnoviju verziju. Samo odobrene web-lokacije Pokaži cijelu povijest @@ -593,6 +605,7 @@ Da biste dobili nove licence, povežite se s internetom i reproducirajte preuzet Načinom na koji to funkcionira možete upravljati u Postavkama Knjižne oznake Prijavljen je račun . Prijava računom spojit će sinkronizirane podatke s tih dvaju računa, primjerice oznake. Da bi podaci ostali odvojeni, izbrišite podatke o pregledavanju u postavkama. +Web-lokacijama nije dopušteno prikazivanje skočnih prozora (preporučeno) Adresa za dostavu , kartica Prostor za pohranu @@ -622,6 +635,7 @@ Da biste dobili nove licence, povežite se s internetom i reproducirajte preuzet Potrebna je zaporka Poništavanje vjerodajnica uređaja Prikaži original +Web-lokacije moraju tražiti dopuštenje za slanje obavijesti (preporučeno) Prebacujete sinkronizaciju s računa na račun . Što želite učiniti s postojećim oznakama, poviješću, zaporkama i drugim postavkama? Stranice Fizičkog weba u blizini Pregled prilagođen za mobilne uređaje diff --git a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb index 50ed8790f9c39..4f11e8aeea0da 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb @@ -75,7 +75,6 @@ A Fizikai web használatához be kell kapcsolnia a Bluetooth funkciót és a hel A Chrome-ra vonatkozó engedély aktiválása az Android beállításaiban. Jelszavak mentése Az összes titkosítása Google-jelszóval ekkortól: -Annak szabályozása, hogy a Google hogyan használhatja fel a böngészési előzményeket a Keresés és más Google-szolgáltatások személyre szabására. Kérjük, frissítse bejelentkezési adatait. Speciális Chrome Dev-könyvjelzők @@ -129,6 +128,7 @@ A Fizikai webet a Chrome-beállításokban szabályozhatja. Kibontva – kattintson az összecsukáshoz. Rendelkezésre áll új verzió Monospace +A JavaScript engedélyezése egy adott webhelyen. Szüleid segítenek ezen beállítások kezelésében. Elküldés Lap elhagyása @@ -152,6 +152,7 @@ A Fizikai webet a Chrome-beállításokban szabályozhatja. Címek Cookie-adatok mentésének és olvasásának engedélyezése a webhelyeken (ajánlott) A fiók kezelői: és . +Ha a többi eszközén is hozzá szeretne férni a lapjaihoz, kapcsolja be az „Adatok automatikus szinkronizálása” funkciót az Android-fiókbeállítások között. Copyright Google Inc. Minden jog fenntartva. Tanúsítványmegtekintő Összetett jelszó létrehozása @@ -188,6 +189,7 @@ A Fizikai webet a Chrome-beállításokban szabályozhatja. Ön jelenleg kezelt fiókkal jelentkezik be, és engedélyezi a rendszergazdának az Ön Chrome-profiljához való hozzáférést. Chrome-adatai ezután véglegesen ehhez a fiókhoz társulnak. A fiók leválasztásával törölheti a helyi Chrome-adatokat. Kép megosztása +Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a tartózkodási helyhez való hozzáférést (ajánlott) A következő fájl letöltése a fájlrendszer hibái miatt nem sikerült: . Méret: Engedélyezés @@ -240,6 +242,7 @@ A keresési kifejezés módosításához hosszú nyomva tartással hajthat végr A fordítás nyelve Nyílt forráskódú licencek Le van tiltva az ide vezető navigáció: +Szinkronizálási hiba történt, koppintson a részletek megtekintéséhez. Link másolása Soha ne fordítsa le a(z) nyelvű szöveget Média @@ -254,6 +257,7 @@ A keresési kifejezés módosításához hosszú nyomva tartással hajthat végr Több böngészés kedvezőbb áron Könyvjelzők közé téve itt: A jövőben a Fizikai web közelben lévő oldalai megjelennek az értesítési listájában +Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a kamera használatát (ajánlott) Kulcsgenerálás Titkosított adatait csak az olvashatja el, aki rendelkezik összetett jelszavával. Az összetett jelszót a Google nem kapja meg, és nem is tárolja. Ha elfelejtette összetett jelszavát, vagy módosítani szeretné ezt a beállítást, alaphelyzetbe kell állítania a szinkronizálást. További információ {DAYS,plural, =1{# napja}other{# napja}} @@ -272,6 +276,7 @@ A keresési kifejezés módosításához hosszú nyomva tartással hajthat végr A lapok a Chrome-on belüli lapváltóba kerülnek. A Chrome futtatásához szükséges kritikus funkció hiányzik: vagy nem fejezte be a Chrome telepítését, vagy a Chrome nem kompatibilis az Android ezen verziójával. A gyorsítótárban szereplő képek és fájlok +Adjon meg egy Google-fiókot eszköze Beállítások alkalmazásának Fiókok oldalán. Megnyitás itt: Frissítés Utolsó szinkronizálás: @@ -323,6 +328,7 @@ A keresési kifejezés módosításához hosszú nyomva tartással hajthat végr Mentés Szülői beállítások Név +Engedélyezze a webhelyek számára a JavaScript futtatását (ajánlott) törölve A helyadatokhoz való hozzáférés is ki van kapcsolva ezen az eszközön. Soha ne küldjön @@ -360,6 +366,7 @@ Mindazonáltal Ön nem lesz láthatatlan. Az inkognitómód használatával nem Inkognitólapok Leírás: Lecseréli a meglévő fájlt itt: ? +Annak szabályozása, hogy a Google hogyan használhatja fel az Ön böngészési előzményeit a Keresés, a hirdetések és más Google-szolgáltatások személyre szabására. Engedélyek {HOURS,plural, =1{# órája}other{# órája}} Párosítás @@ -368,6 +375,7 @@ Mindazonáltal Ön nem lesz láthatatlan. Az inkognitómód használatával nem Az Adatforgalom-csökkentő aktiválva van Kikapcsolva Mentett jelszavak +Kérdezzen rá, mielőtt engedélyezi a webhelyek számára a teljes képernyőre váltást (ajánlott) Új fájl létrehozása A webhely által tárolt összes adat törlődik (a cookie-kat is beleértve). Google Fordító @@ -392,6 +400,7 @@ Mindazonáltal Ön nem lesz láthatatlan. Az inkognitómód használatával nem Ország/régió -os adatmegtakarítás További információ +Webhelykivétel hozzáadása Kivételek A „Nincs nyomon követés” engedélyezése azt jelenti, hogy a böngészési forgalommal együtt kérelmet is küld a rendszer. Ennek hatása attól függ, hogy a webhely reagál-e a kérelemre, és hogyan értelmezi azt. @@ -453,6 +462,7 @@ Egyes webhelyek például válaszolhatnak rá úgy, hogy olyan hirdetéseket jel Kisegítő lehetőségek Alkalmazás beszerzése a Google Play Áruházból: Az esetleges biztonsági események automatikus jelentése a Google-nak +Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a mikrofon használatát (ajánlott) Google-fiók megerősítése A(z) letöltve Megnyitás böngészőben @@ -515,6 +525,7 @@ Előfordulhat, hogy Google-fiókjában (a history.google Szállítási cím Eredeti betöltése Közeli URL-ek megtekintése +Mindig engedélyezve Cím hozzáadása Áthelyezés Összetett jelszó megerősítése @@ -559,6 +570,7 @@ Előfordulhat, hogy Google-fiókjában (a history.google Engedélyezés (a címsávban történő kereséseknél) Szinkronizálás a következővel: Szabványos lapok +Háttérben történő szinkronizálás engedélyezése adott webhely esetében. Frissítenie kell a TalkBack alkalmazást egy újabb verzióra. Csak jóváhagyott webhelyek Minden előzmény megjelenítése @@ -593,6 +605,7 @@ Az új engedélyek beszerzéséhez kapcsolódjon az internethez, és játssza le A működési mód szabályozása a Beállítások oldalon Könyvjelzők volt bejelentkezve. bejelentkezésével a szinkronizált adatok (pl. könyvjelzők) össze lesznek vonva a két fiókban. Az adatok külön megőrzéséhez törölje a böngészési adatokat a beállításokban. +Előugró ablakok megjelenítésének letiltása a webhelyeken (ajánlott) Szállítási cím lap Tárolás @@ -622,6 +635,7 @@ Az új engedélyek beszerzéséhez kapcsolódjon az internethez, és játssza le Összetett jelszó szükséges Az eszközhitelesítési adatok visszaállítása Eredeti megjelenítése +Kérdezzen rá, mielőtt engedélyezné a webhelyek számára az értesítések küldését (ajánlott) A(z) szinkronizált fiókról a következőre vált át: . Mit kíván tenni a meglévő könyvjelzőkkel, előzményekkel, jelszavakkal és egyéb beállításokkal? Fizikai web közeli oldalai Mobilbarát nézet diff --git a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb index 9984f02b0dfb9..17441d82debe8 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb @@ -66,16 +66,15 @@ Anda harus mengaktifkan Bluetooth dan Lokasi agar dapat menggunakan Web Fisik.Tekan tombol ini untuk akses cepat ke tab Anda. Terang Pengalaman Saat Pertama Kali Dijalankan -Cari pada laman +Cari di halaman Insiden keamanan Bayar Tab penyamaran baru Tutup panel samping navigasi Pilih alamat pengiriman Aktifkan izin untuk Chrome di Setelan Android. -Menyimpan sandi +Simpan sandi Enkripsikan semua dengan sandi Google mulai tanggal -Kontrol cara Google menggunakan riwayat penjelajahan Anda untuk mempersonalisasi Penelusuran dan layanan Google lainnya. Perbarui detail ID masuk Anda. Lanjutan Bookmark Chrome Dev @@ -83,7 +82,7 @@ Anda harus mengaktifkan Bluetooth dan Lokasi agar dapat menggunakan Web Fisik.URL situs Simpan laman tautan untuk nanti Ganti file -Aktifkan Minta situs desktop +Aktifkan Ubah situs desktop Muat gambar Batalkan Hasil dari @@ -100,7 +99,7 @@ Anda harus mengaktifkan Bluetooth dan Lokasi agar dapat menggunakan Web Fisik., aplikasi web. Saring Pilihan sertifikat sisi klien tidak didukung oleh sistem operasi. -Seret penggeser sampai Anda dapat membacanya dengan nyaman. Teks harus terlihat setidaknya sebesar ini setelah paragraf diketuk dua kali. +Geser ukuran teks sampai Anda dapat membacanya dengan nyaman. Teks akan terlihat sebesar ini, setelah mengetuk dua kali di paragraf. Perangkat di sekitar Anda menyiarkan laman web melalui Bluetooth. Chrome akan memindai laman dan menampilkannya saat Anda membangunkan perangkat. Laman ini akan diproses melalui layanan Google untuk meningkatkan kualitas hasil laman. Anda dapat mengontrol Web Fisik di Setelan Chrome. @@ -110,7 +109,7 @@ Anda dapat mengontrol Web Fisik di Setelan Chrome. Setelan terjemah telah disetel ulang. Lanjut minggu lalu -Penskalaan teks +Ukuran teks Terjadi kesalahan saat mengunduh konten. Gelap Tampilan @@ -121,7 +120,7 @@ Anda dapat mengontrol Web Fisik di Setelan Chrome. Riwayat jelajah Bantuan & masukan Kembali -Isi Otomatis formulir +Formulir Isi-Otomatis Penghemat Data aktif. Kelola di Setelan. Tampilan Web Melihat salinan offline laman ini @@ -129,11 +128,12 @@ Anda dapat mengontrol Web Fisik di Setelan Chrome. Diperluas - klik untuk menciutkan Versi baru telah tersedia Monospace +Izinkan JavaScript untuk situs tertentu. Orang tua Anda membantu mengelola setelan ini. Kirim Keluar Segarkan laman -IsiOtomatis +Isi-Otomatis Baru Preferensi yang disimpan di situs mungkin terhapus Anda sedang melihat laman Google Chrome yang aman. @@ -152,6 +152,7 @@ Anda dapat mengontrol Web Fisik di Setelan Chrome. Alamat Izinkan situs untuk menyimpan dan membaca data cookie (disarankan) Akun ini dikelola oleh dan . +Untuk mendapatkan tab dari perangkat lainnya, aktifkan "Sinkronisasi data otomatis" di setelan akun Android. Hak cipta Google Inc. Semua hak dilindungi undang-undang. Penampil sertifikat Buat frasa sandi @@ -188,6 +189,7 @@ Anda dapat mengontrol Web Fisik di Setelan Chrome. Anda masuk dengan akun yang dikelola dan memberikan administratornya kontrol atas profil Chrome Anda. Data Chrome Anda akan terikat dengan akun ini secara permanen. Memutuskan tautan dengan akun ini akan menghapus data Chrome lokal. Bagikan gambar +Minta izin sebelum memungkinkan situs mengetahui lokasi Anda (disarankan) Unduhan gagal karena kesalahan sistem file. Ukuran: Aktifkan @@ -205,7 +207,7 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Otomatis masuk ke situs web menggunakan kredensial yang tersimpan. Saat fitur dinonaktifkan, Anda akan diminta untuk memverifikasi setiap kali hendak masuk ke situs web. Aktifkan lokasi di Setelan Android. Situs web pihak ketiga dapat menyimpan dan membaca data cookie -Saran kesalahan navigasi +Saran ketika kesalahan navigasi Terdapat laman web di sekitar Tidak dapat mengambil minat. Sentuh untuk Menelusuri @@ -214,16 +216,16 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Cari bookmark Riwayat penjelajahan tidak dapat dihapus melalui akun anak Tambah folder -Paksa pengaktifan zoom +Memaksa pengaktifan zoom Lokasi diblokir Sans Serif 4 minggu terakhir Tidak ada penelusuran suara yang aktif Masuk -Lokasi diizinkan +Lokasi diaktifkan Simpan tautan Judul -Tampilkan saran saat alamat web tidak dapat diselesaikan atau sambungan tidak dapat dibuat +Tampilkan saran ketika alamat web tidak muncul atau koneksi yang bermasalah Sepia Informasi hukum Fitur ini dapat mengganggu akses ke layanan data premium yang disediakan oleh operator Anda. @@ -240,6 +242,7 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Bahasa Terjemahan: Lisensi sumber terbuka Navigasi diblokir: +Terjadi kesalahan sinkronisasi, ketuk untuk melihat detailnya. Salin alamat tautan Jangan pernah terjemahkan bahasa Media @@ -254,8 +257,9 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Jelajahi lebih banyak dengan lebih hemat Dibookmark ke Laman Web Fisik di sekitar mendatang akan muncul di daftar notifikasi +Minta izin terlebih dahulu sebelum memungkinkan situs menggunakan kamera Anda (disarankan) Pembuatan kunci -Hanya orang yang memiliki frasa sandi Anda yang dapat membaca data terenkripsi. Frasa sandi tidak akan dikirim ke atau disimpan oleh Google. Jika lupa frasa sandi atau ingin mengubah setelan ini, Anda perlu menyetel ulang sinkronisasi. Pelajari lebih lanjut +Hanya mereka yang memiliki frasa sandi Anda yang dapat membaca data yang telah dienkripsi. Frasa sandi tidak akan dikirim ke atau disimpan oleh Google. Jika lupa frasa sandi atau ingin mengubah setelan ini, Anda perlu menyetel ulang sinkronisasi. Pelajari lebih lanjut {DAYS,plural, =1{# hari yang lalu}other{# hari yang lalu}} Detail Melihat dan mengelola sandi yang tersimpan di passwords.google.com @@ -269,15 +273,16 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Bookmark Work Chrome Sinkronkan semua Ukuran asli -Tab akan dipindahkan ke pengalih tab di dalam Chrome. +Tab akan dipindahkan ke pengganti tab di dalam Chrome. Fungsi penting yang diperlukan untuk menjalankan Chrome tidak ada; bisa jadi karena pemasangan Chrome Anda tidak lengkap, atau tidak kompatibel dengan versi Android ini. File dan gambar yang disimpan dalam cache +Tambahkan Akun Google dari laman Akun di aplikasi Setelan perangkat. Buka di Mutakhirkan Terakhir disinkronkan: Dihentikan Sentuh untuk kembali ke -Nama pada kartu +Nama di kartu Jenis data Tambahkan kartu kredit Koneksi Anda ke situs ini tidak bersifat pribadi. Penyerang mungkin mencoba mencuri informasi Anda (misalnya foto, sandi, pesan, dan kartu kredit) dari . @@ -312,10 +317,10 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Keluar Tab baru Perangkat tidak dapat membuka konten untuk diunduh. -Tab akan ditampilkan bersama aplikasi terkini. +Tab akan ditampilkan dengan aplikasi terkini. Seret dari atas dan ketuk tombol kembali untuk keluar dari mode layar penuh. Perubahan pada bookmark, riwayat, sandi, dan setelan lainnya tidak akan disinkronkan lagi dengan Akun Google Anda. Namun, data yang sudah ada akan tetap disimpan di akun Google Anda. -Oke, mengerti +Oke, paham Bahasa Bidang ini tidak boleh kosong Sambungkan @@ -323,12 +328,13 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Simpan Setelan Orang Tua Nama +Izinkan situs menjalankan JavaScript (disarankan) Menghapus Akses lokasi juga dinonaktifkan untuk perangkat ini. Jangan pernah mengirim Dengan menggunakan aplikasi ini, Anda menyetujui Persyaratan Layanan dan Pemberitahuan Privasi Chrome. Memverifikasi... -Laman yang paling sering dikunjungi akan muncul di sini +Halaman yang paling sering dikunjungi akan muncul di sini Edit pengecualian atau nama/sandi yang tersimpan Mode penyamaran akan ditutup jika tautan ini dibuka di aplikasi eksternal. Lanjutkan? Hapus data @@ -347,7 +353,7 @@ Untuk menyesuaikan istilah penelusuran, tekan lama untuk memilih. Untuk menyarin Tambahkan Akun Google Lokasi Email -Mengganti permintaan situs web untuk mencegah pembesaran +Mengganti permintaan situs web untuk mencegah zoom Tidak dapat memutar video di . Dicekal Ups. Laman ini tidak dapat diterjemahkan. @@ -360,6 +366,7 @@ Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode Tab penyamaran Deskripsi: Ingin mengganti yang sudah ada di ? +Kontrol cara Google menggunakan riwayat penjelajahan Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya. Izin {HOURS,plural, =1{# jam yang lalu}other{# jam yang lalu}} Sandingkan @@ -368,6 +375,7 @@ Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode Penghemat Data diaktifkan Nonaktif Sandi yang disimpan +Tanya terlebih dahulu sebelum mengizinkan situs memasuki mode layar penuh (disarankan) Buat file baru Semua data lokal yang disimpan oleh situs web ini, termasuk cookie, akan dihapus. Google Terjemahan @@ -392,6 +400,7 @@ Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode Negara/Wilayah Penghematan data Pelajari lebih lanjut +Tambahkan pengecualian situs Pengecualian Jika ‘Jangan Lacak’ diaktifkan, permintaan akan disertakan dengan lalu lintas penjelajahan Anda. Dampak apa pun yang muncul bergantung pada apakah situs web menanggapi permintaan, dan bagaimana permintaan diinterpretasikan. @@ -427,7 +436,7 @@ Misalnya, beberapa situs web mungkin menanggapi permintaan ini dengan menayangka Edit folder Ingin memperbarui sandi bagi untuk situs ini? Chrome memerlukan akses lokasi untuk memindai perangkat. Perbarui izin -Gunakan layanan prediksi untuk menunjukkan kueri terkait dan situs web populer saat Anda mengetik di bilah alamat +Gunakan pencarian otomatis untuk menunjukkan situs web populer saat Anda mengetik alamat situs Notifikasi Privasi Chrome Kelola data yang disinkronkan Sebelumnya @@ -443,7 +452,7 @@ Misalnya, beberapa situs web mungkin menanggapi permintaan ini dengan menayangka Memuat… tab ditutup Hanya kirim pada Wi-Fi -Data formulir IsiOtomatis +Data formulir isi-otomatis Masuk untuk mendapatkan bookmark, riwayat, sandi, dan setelan Anda lainnya di semua perangkat Pilih Hapus bookmark @@ -453,6 +462,7 @@ Misalnya, beberapa situs web mungkin menanggapi permintaan ini dengan menayangka Aksesibilitas Dapatkan aplikasi dari Google Play Store: Otomatis melaporkan detail kemungkinan insiden keamanan ke Google +Tanya terlebih dahulu sebelum mengizinkan situs menggunakan mikrofon Anda (disarankan) Konfirmasi Akun Google diunduh Buka di browser @@ -480,10 +490,10 @@ Misalnya, beberapa situs web mungkin menanggapi permintaan ini dengan menayangka Memuat “ Mentransmisikan ke Jenis: -Nggak +Tidak URL Tidak dapat mentransmisi video karena pembatasan situs -Lihat tab dengan aplikasi terbaru lainnya di layar Ringkasan ponsel. +Lihat tab Chrome dan aplikasi lainnya di layar Tampilan perangkat. Tanyakan terlebih dahulu Keluar dari Chrome Tindakan ini akan menghapus data yang disinkronkan dari semua perangkat. Setelan situs yang disimpan tidak akan dihapus dan dapat mencerminkan kebiasaan penjelajahan Anda. Pelajari lebih lanjut @@ -506,7 +516,7 @@ Akun Google Anda mungkin memiliki bentuk riwayat penjelajahan lain seperti penel Dijeda Masuk ke Google sebagai Unduhan gagal karena kesalahan jaringan. -Selamat Datang di Chrome +Selamat Menggunakan Chrome Sambungan Anda ke situs ini tidak bersifat pribadi. Frasa sandi salah Enkripsi sandi dengan kredensial Google @@ -515,6 +525,7 @@ Akun Google Anda mungkin memiliki bentuk riwayat penjelajahan lain seperti penel Pengiriman Muat yang asli Lihat yang ada di sekitar +Selalu izinkan Tambahkan alamat Pindahkan Konfirmasi frasa sandi @@ -559,6 +570,7 @@ Akun Google Anda mungkin memiliki bentuk riwayat penjelajahan lain seperti penel Izinkan (untuk penelusuran bilah alamat) Menyinkronkan dengan Tab standar +Mengizinkan Sinkronisasi Latar Belakang untuk situs tertentu. Anda perlu memperbarui TalkBack ke versi yang lebih baru. Hanya situs yang disetujui Tampilkan riwayat lengkap @@ -571,7 +583,7 @@ Akun Google Anda mungkin memiliki bentuk riwayat penjelajahan lain seperti penel Layar penuh Buka laman ini Sandi yang disimpan akan muncul di sini. -Minta situs desktop +Ubah situs desktop Diizinkan (disarankan) Menghapus data akun Simpan gambar @@ -583,7 +595,7 @@ Untuk mendapatkan lisensi baru, sambungkan ke internet dan putar konten yang diu Untuk mendapatkan tab dari perangkat lainnya, aktifkan sinkronisasi. Dari Google Payments Hapus masukan -Tanggal kedaluwarsa +Masa berlaku Filter Google SitusAman Tidak dapat memancarkan tab ini Coba lagi @@ -593,6 +605,7 @@ Untuk mendapatkan lisensi baru, sambungkan ke internet dan putar konten yang diu Kontrol cara kerjanya di Setelan Bookmark telah masuk. Masuk dengan akan menggabungkan data yang disinkronkan seperti bookmark antarakun. Agar informasi tetap terpisah, hapus data penjelajahan di setelan. +Memblokir situs agar tidak menampilkan munculan (disarankan) Alamat pengiriman , tab Penyimpanan @@ -614,7 +627,7 @@ Untuk mendapatkan lisensi baru, sambungkan ke internet dan putar konten yang diu Gunakan layanan prediksi agar laman dimuat dengan lebih cepat Frasa sandi Lihat aplikasi di Play Store. Rating: . -Nonaktifkan Minta situs desktop +Nonaktifkan Ubah situs desktop Edit Mulai penelusuran suara Tidak dapat mengakses jaringan @@ -622,6 +635,7 @@ Untuk mendapatkan lisensi baru, sambungkan ke internet dan putar konten yang diu Frasa sandi diwajibkan Menyetel ulang kredensial perangkat Perlihatkan laman asli +Tanya terlebih dahulu sebelum mengizinkan situs mengirimkan notifikasi (disarankan) Anda beralih akun sinkronisasi dari ke . Apa yang ingin Anda lakukan dengan bookmark, riwayat, sandi, dan setelan lain yang sudah ada? Laman Web fisik di sekitar Tampilan mobile-friendly diff --git a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb index be00889ee8b6b..87cecbfe924c5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb @@ -75,7 +75,6 @@ Per poter utilizzare il Physical Web, devi attivare il Bluetooth e la geolocaliz Abilita l'autorizzazione per Chrome in Impostazioni Android. Salva password Cripta tutto con la password Google a partire dal -Controlla il modo in cui Google utilizza la cronologia di navigazione per personalizzare la Ricerca e altri servizi Google. Aggiorna i dati di accesso. Avanzate Preferiti di Chrome Dev @@ -129,6 +128,7 @@ Puoi gestire il Physical Web nelle impostazioni di Chrome. Espanso. Fai clic per comprimere. Nuova versione disponibile Monospace +Consenti JavaScript per un sito specifico. I tuoi genitori ti aiutano a gestire queste impostazioni. Invia Esci @@ -152,6 +152,7 @@ Puoi gestire il Physical Web nelle impostazioni di Chrome. Indirizzi Consenti ai siti di salvare e leggere i dati dei cookie (opzione consigliata) Questo account è gestito da e +Attiva la funzione "Sincronizzazione automatica dei dati" nelle impostazioni dell'account Android per trovare le tue schede sugli altri tuoi dispositivi. Copyright Google Inc. Tutti i diritti riservati. Visualizzatore certificati Crea passphrase @@ -188,6 +189,7 @@ Puoi gestire il Physical Web nelle impostazioni di Chrome. Stai per eseguire l'accesso con un account gestito e consentire al relativo amministratore di controllare il tuo profilo Chrome. I tuoi dati di Chrome verranno associati definitivamente a questo account. La disconnessione dall'account comporterà l'eliminazione dei dati di Chrome locali. Condividi immagine +Chiedi conferma prima di consentire ai siti di conoscere la tua posizione (opzione consigliata) Download di non riuscito a causa di errori del file system. Dimensioni: Abilita @@ -240,6 +242,7 @@ Per modificare il termine di ricerca, premi a lungo per selezionarlo. Per perfez Lingua della traduzione: Licenze open source Navigazione bloccata: +Si è verificato un errore di sincronizzazione. Tocca per avere i dettagli. Copia indirizzo link Non tradurre mai: Multimediali @@ -254,6 +257,7 @@ Per modificare il termine di ricerca, premi a lungo per selezionarlo. Per perfez Naviga di più e consuma meno dati Preferito aggiunto in: In futuro le pagine Physical Web vicine verranno visualizzate nel tuo elenco di notifiche +Chiedi conferma prima di consentire ai siti di utilizzare la videocamera (opzione consigliata) Generazione di chiavi Soltanto chi conosce la tua passphrase può leggere i tuoi dati criptati. La passphrase non viene inviata a Google né memorizzata. Se dimentichi la passphrase o vuoi modificare questa impostazione, dovrai reimpostare la sincronizzazione. Ulteriori informazioni {DAYS,plural, =1{# giorno fa}other{# giorni fa}} @@ -272,6 +276,7 @@ Per modificare il termine di ricerca, premi a lungo per selezionarlo. Per perfez Le schede verranno spostate in un selettore di schede all'interno di Chrome. Manca una funzionalità fondamentale per l'esecuzione di Chrome; l'installazione di Chrome è incompleta oppure non è compatibile con la versione di Android installata. Immagini e file memorizzati nella cache +Aggiungi un account Google dalla pagina Account nell'app Impostazioni del dispositivo. Apri in Aggiorna Ultima sincronizzazione: @@ -323,6 +328,7 @@ Per modificare il termine di ricerca, premi a lungo per selezionarlo. Per perfez Salva Impostazioni controllo genitori Nome +Consenti l'esecuzione di JavaScript nei siti (opzione consigliata) eliminato L'accesso alla posizione è stato disattivato anche per il dispositivo. Non inviare mai @@ -360,6 +366,7 @@ Tuttavia, le tue attività non sono invisibili. L'attivazione della modalità di Schede in incognito Descrizione: Vuoi sostituire il file esistente in ? +Controlla il modo in cui Google utilizza la tua cronologia di navigazione per personalizzare la Ricerca, gli annunci e altri servizi Google. Autorizzazioni {HOURS,plural, =1{# ora fa}other{# ore fa}} Accoppia @@ -368,6 +375,7 @@ Tuttavia, le tue attività non sono invisibili. L'attivazione della modalità di Funzione Risparmio dati attivata Off Password salvate +Chiedi conferma prima di consentire ai siti di attivare la modalità a schermo intero (opzione consigliata) Crea nuovo file Tutti i dati locali memorizzati da questo sito web, inclusi i cookie, verranno eliminati. Google Traduttore @@ -392,6 +400,7 @@ Tuttavia, le tue attività non sono invisibili. L'attivazione della modalità di Paese/regione Riduzioni dei dati: Ulteriori informazioni +Aggiungi eccezione per un sito Eccezioni Se attivi l'opzione "Non tenere traccia", verrà inclusa una richiesta nel tuo traffico di navigazione. Gli effetti dipendono dall'eventuale risposta dei siti web alla richiesta e dall'interpretazione di quest'ultima. @@ -453,6 +462,7 @@ Ad esempio, alcuni siti web potrebbero rispondere alla richiesta mostrando annun Accessibilità Scarica l'app dal Google Play Store: Segnala automaticamente a Google dettagli dei possibili incidenti di sicurezza +Chiedi conferma prima di consentire ai siti di utilizzare il microfono (opzione consigliata) Conferma account Google scaricato Apri nel browser @@ -515,6 +525,7 @@ Il tuo account Google potrebbe avere altre forme di cronologia di navigazione, a Spedizione Carica originale Scopri cosa c'è nelle vicinanze +Sempre consentito Aggiungi indirizzo Sposta Conferma passphrase @@ -559,6 +570,7 @@ Il tuo account Google potrebbe avere altre forme di cronologia di navigazione, a Consenti (per ricerche nella barra degli indirizzi) Sincronizzazione con in corso Schede standard +Consenti la sincronizzazione in background per un sito specifico. Aggiorna TalkBack a una versione più recente. Solo siti approvati Mostra cronologia completa @@ -593,6 +605,7 @@ Per ottenere nuove licenze, connettiti a Internet e riproduci i contenuti scaric Controlla come funziona nelle Impostazioni Segnalibri È stato eseguito l'accesso a . Se accedi con , i dati sincronizzati dei due account, come i Preferiti, verranno uniti. Per tenere le informazioni separate, cancella i dati di navigazione nelle impostazioni. +Impedisci ai siti di mostrare popup (opzione consigliata) Indirizzo di spedizione , scheda Memoria @@ -622,6 +635,7 @@ Per ottenere nuove licenze, connettiti a Internet e riproduci i contenuti scaric Passphrase obbligatoria Reimposta credenziali dispositivo Mostra originale +Chiedi conferma prima di consentire ai siti di inviare notifiche (opzione consigliata) Stai per cambiare account di sincronizzazione, passando dall'account all'account . Che cosa intendi fare con i preferiti, la cronologia, le password e le altre impostazioni esistenti? Pagine Physical Web nelle vicinanze Visualizzazione ottimizzata per dispositivi mobili diff --git a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb index 84c8c2d8ac1f4..d54b91de7dfa0 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb @@ -75,7 +75,6 @@ ‏הפעל הרשאה בשביל Chrome בהגדרות Android. שמור סיסמאות ‏הצפן הכל באמצעות סיסמת Google החל מ- -‏קבע כיצד Google משתמשת בהיסטוריית הגלישה שלך כדי להתאים אישית את החיפוש ושירותים אחרים של Google. עדכן את פרטי הכניסה שלך. מתקדם ‏סימניות של Chrome בגירסת הפיתוח @@ -129,6 +128,7 @@ מורחב - לחץ כדי לכווץ. יש גרסה חדשה יותר רוחב אחיד +‏אפשר JavaScript לאתר ספציפי. ההורים שלך עוזרים בניהול ההגדרות האלה. שלח צא @@ -152,6 +152,7 @@ כתובות ‏התר לאתרים לשמור ולקרוא נתונים של קובצי Cookie (מומלץ) החשבון הזה מנוהל על ידי ו-. +‏כדי לקבל את הכרטיסיות מהמכשירים האחרים שלך, הפעל את האפשרות 'סנכרון אוטומטי של נתונים' בהגדרות של חשבון Android. ‏זכויות יוצרים Google Inc. כל הזכויות שמורות. מציג האישורים יצירת ביטוי סיסמה @@ -188,6 +189,7 @@ אתה נכנס לחשבון מנוהל, ונותן למנהל המערכת שליטה על פרופיל Chrome שלך. נתוני Chrome שלך ייקשרו באופן קבוע לחשבון הזה. התנתקות מהחשבון הזה תמחק את נתוני Chrome המקומיים. שתף תמונה +שאל לפני שתאפשר לאתרים לדעת מה המיקום שלך (מומלץ) הורדת נכשלה עקב שגיאות במערכת הקבצים. גודל: הפעל @@ -240,6 +242,7 @@ שפת התרגום: רישיונות קוד פתוח הניווט חסום: +אירעה שגיאת סנכרון, הקש כדי לקבל פרטים. העתק כתובת של קישור אל תתרגם אף פעם מדיה @@ -254,6 +257,7 @@ לגלוש יותר, לשלם פחות התווסף לסימניות ב- מעתה ואילך, דפים בקרבת מקום באינטרנט הווירטופיזי יופיע ברשימת ההתראות +שאל לפני שתאפשר לאתרים להשתמש במצלמה שלך (מומלץ) יצירת מפתחות ‏רק מי שיודע את ביטוי הסיסמה שלך יכול לקרוא את הנתונים המוצפנים. ביטוי הסיסמה לא נשלח אל Google והיא אינה מאחסנת אותו. אם תשכח את ביטוי הסיסמה או אם תרצה לשנות את ההגדרה הזו, יהיה עליך לאפס את הסינכרון. למידע נוסף {DAYS,plural, =1{לפני יום}two{לפני יומיים}many{לפני # ימים}other{לפני # ימים}} @@ -272,6 +276,7 @@ ‏כרטיסיות יועברו למחליף כרטיסיות בתוך Chrome. ‏חסרה פונקציונליות קריטית הנדרשת להפעלת Chrome. התקנת Chrome אינה מלאה, או שאינה תואמת לגרסה הזו של Android. תמונות וקבצים בזכרון השמור +‏הוסף חשבון Google מהדף 'חשבונות' שבאפליקציית ההגדרות של המכשיר שלך. פתח ב- עדכן סונכרן לאחרונה: @@ -323,6 +328,7 @@ שמור הגדרות הורים שם +‏אפשר לאתרים להריץ JavaScript (מומלץ) נמחק הגישה למיקום כבויה גם בשביל המכשיר הזה. לעולם אל תשלח @@ -360,6 +366,7 @@ כרטיסיות גלישה בסתר תיאור: האם ברצונך להחליף את הקיים ב-? +‏שלוט באופן שבו חברת Google משתמשת בהיסטוריית הגלישה לצורך התאמה אישית של חיפוש Google, מודעות Google ושירותי Google אחרים. הרשאות {HOURS,plural, =1{לפני שעה}two{לפני שעתיים}many{לפני # שעות}other{לפני # שעות}} התאם @@ -368,6 +375,7 @@ ‏חוסך הנתונים (Data Saver) מופעל כבוי סיסמאות שמורות +שאל לפני שתאפשר לאתרים לעבור למסך מלא (מומלץ) צור קובץ חדש ‏כל הנתונים המקומיים המאוחסנים על ידי האתר הזה יימחקו, כולל קובצי Cookie. Google Translate @@ -392,6 +400,7 @@ ארץ/אזור חיסכון בצריכת נתונים בשיעור של למידע נוסף +הוסף חריג של אתר יוצאי דופן אם תפעיל את התכונה 'אל תעקוב', בקשה זו תיכלל בתנועת הגלישה שלך. השפעת הבקשה תלויה באופן הפעולה של כל אתר - אם הוא מגיב לבקשה או לא, וכיצד הוא מפרש אותה. @@ -453,6 +462,7 @@ נגישות ‏קבל את האפליקציה מחנות Google Play‏: ‏דווח אוטומטית ל-Google על פרטים של בעיות אבטחה אפשריות +שאל לפני שתאפשר לאתרים להשתמש במיקרופון (מומלץ) ‏אישור חשבון Google הורדת הקובץ בוצעה פתיחה בדפדפן @@ -515,6 +525,7 @@ משלוח טען אתר מקורי ראה מה נמצא בקרבת מקום +מותר תמיד הוסף כתובת העבר אשר משפט-סיסמה @@ -559,6 +570,7 @@ התר (בשביל חיפושים בסרגל הכתובות) מסנכרן עם כרטיסיות רגילות +אפשר סנכרון ברקע לאתר ספציפי. ‏עליך לעדכן את TalkBack לגרסה חדשה יותר. רק אתרים שאושרו הצג את ההיסטוריה המלאה @@ -591,6 +603,7 @@ קבע בהגדרות כיצד זה פועל סימניות בוצעה כניסה לחשבון עם . כניסה עם תמזג נתונים מסונכרנים בין החשבונות, כמו סימניות. כדי לשמור על הפרדת המידע, נקה את נתוני הגלישה בהגדרות. +חסום הצגת מודעות קופצות באתרים (מומלץ) כתובת למשלוח , כרטיסייה אחסון @@ -620,12 +633,13 @@ יש להזין ביטוי סיסמה אפס את פרטי הכניסה של המכשיר הצג מקור +שאל לפני שתאפשר לאתרים לשלוח הודעות (מומלץ) אתה מחליף חשבונות סינכרון מ- ל-. מה ברצונך לעשות עם הסימניות, ההיסטוריה, הסיסמאות ושאר ההגדרות הקיימות? דפים של האינטרנט הווירטופיזי בקרבת מקום תצוגה מותאמת למכשירים ניידים ‏הפעל את Bluetooth בהגדרות המכשיר כדי לאפשר התאמה. החלף את נתוני המכשיר הזה בנתונים של . תוכל לאחזר את הנתונים הקיימים שלך על-ידי חזרה אל . -A +א בית שגיאה: גישה למיקרופון שלך diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb index a1ee84de9dd7c..b8724f78b1c62 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb @@ -75,7 +75,6 @@ Android の設定で Chrome の権限を有効にしてください。 パスワードを保存する 時点の Google パスワードですべてのデータを暗号化する -Google が閲覧履歴をどのような方法で使用し、検索やその他の Google サービスをカスタマイズするかを設定します。 ログイン情報を更新してください。 詳細設定 Chrome Dev のブックマーク @@ -129,6 +128,7 @@ 展開されています - クリックすると折りたたまれます。 新しいバージョンをご利用いただけます 等幅 +特定のサイトに対して JavaScript を許可します。 これらの設定はあなたの保護者が管理します。 送信 このページを離れる @@ -152,6 +152,7 @@ 住所 サイトに Cookie データの保存と読み取りを許可する(推奨) このアカウントは によって管理されています。 +他の端末と同じタブを使用するには、Android のアカウント設定で [データの自動同期] を有効にします。 Copyright Google Inc. All rights reserved. 証明書ビューア パスフレーズの作成 @@ -188,6 +189,7 @@ 管理対象アカウントでログインし、アカウントの管理者に自分の Chrome プロフィールの管理を委ねようとしています。あなたの Chrome データはこのアカウントに永続的に関連付けられます。このアカウントを切り離すと、ローカルの Chrome データが削除されます。 画像を共有 +サイトに現在地の認識を許可する前に確認する(推奨) ファイル システムでエラーが発生したため、 をダウンロードできませんでした。 サイズ: 有効にする @@ -240,6 +242,7 @@ 翻訳言語: オープンソース ライセンス へのアクセスがブロックされました +同期エラーが発生しました。タップして詳細を確認できます。 リンクアドレスをコピー を翻訳しない メディア @@ -252,8 +255,9 @@ 電話番号 サードパーティの Cookie を許可 データ使用量を抑えながら快適にブラウジング -」をブックマークしました +」にブックマークしました 今後、近くのフィジカル ウェブページは通知リストに表示されます +サイトにカメラの使用を許可する前に確認する(推奨) キーの生成 パスフレーズを知っているユーザーだけが暗号化データを読み取ることができます。パスフレーズが Google に送信されたり Google で保存されたりすることはありません。パスフレーズを忘れた場合や、この設定を変更する場合は、同期をリセットする必要があります。詳細 {DAYS,plural, =1{# 日前}other{# 日前}} @@ -272,6 +276,7 @@ タブは Chrome 内のタブ切り替えに表示されます。 Chrome の実行に必須の機能が見つかりません。Chrome のインストールが完了していないか、Chrome がこのバージョンの Android と互換性がないことが原因です。 キャッシュされた画像とファイル +端末の設定アプリのアカウント ページで Google アカウントを追加してください。 で開く アップデート 最終同期: @@ -323,6 +328,7 @@ 保存 保護者設定 名前 +サイトに Javascript の実行を許可する(推奨) を削除しました 現在地情報へのアクセスはこの端末でもオフになっています 送信しない @@ -360,6 +366,7 @@ シークレット タブ 説明: 内に既にある を置き換えてもよろしいですか? +検索、広告、その他の Google サービスをカスタマイズするために Google が閲覧履歴をどのような方法で使用するかを設定します。 権限 {HOURS,plural, =1{# 時間前}other{# 時間前}} ペア設定 @@ -368,6 +375,7 @@ データセーバーが有効です オフ 保存したパスワード +サイトに全画面表示を許可する前に確認する(推奨) 新しいファイルを作成 このウェブサイトで保存したすべてのローカルデータ(Cookie を含む)を削除します。 Google 翻訳 @@ -392,6 +400,7 @@ 国 / 地域 のデータを削減 詳しく見る +サイトの例外を追加 例外 「トラッキング拒否」を有効にすると、リクエストが閲覧トラフィックに含まれるようになります。ウェブサイトがリクエストに応答するかどうか、またリクエストがどのように解釈されるかによって、この影響は異なります。 @@ -453,6 +462,7 @@ ユーザー補助機能 Google Play ストアからアプリを入手: セキュリティに関する事象についての詳細を Google に自動送信する +サイトにマイクの使用を許可する前に確認する(推奨) Google アカウントの確認 をダウンロードしました ブラウザで開く @@ -515,6 +525,7 @@ 発送先 元のサイトを表示 近くの URL を表示 +常に許可する 住所を追加 移動 パスフレーズの確認 @@ -559,6 +570,7 @@ 許可(アドレスバーでの検索) に同期しています 標準のタブ +特定のサイトに対してバックグラウンド同期を許可します。 TalkBack を最新版に更新する必要があります。 承認済みのサイトのみ 全履歴を表示 @@ -593,6 +605,7 @@ [設定] でこの動作を管理 ブックマーク 前回 でログインしました。 でログインすると、アカウント間でブックマークなどの同期データが統合されます。データを個別に保持するには、[設定] で閲覧履歴データを消去してください。 +サイトでのポップアップ表示をブロックする(推奨) 配送先住所 」タブ ストレージ @@ -622,6 +635,7 @@ パスフレーズを入力してください デバイス認証情報のリセット 原文のページを表示 +サイトに通知の送信を許可する前に確認する(推奨) 同期アカウントを から に切り替えます。既存のブックマーク、履歴、パスワード、その他の設定をどのように処理しますか? 近くのフィジカル ウェブページ モバイル向け表示 diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb index 9fabe67c8b335..905a0d8c8e9cb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb @@ -75,7 +75,6 @@ Android 설정에서 Chrome 관련 권한을 설정합니다. 비밀번호 저장 에 Google 비밀번호로 전체 데이터 암호화 -Google이 검색 및 다른 Google 서비스를 맞춤설정하기 위하여 내 인터넷 사용 기록을 사용하는 방법을 제어하세요. 로그인 세부정보를 업데이트하세요. 고급 Chrome 개발자 북마크 @@ -129,6 +128,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 펼쳐짐 - 접으려면 클릭 최신 버전 사용 가능 고정 너비 +특정 사이트에서 자바스크립트를 허용합니다. 계정 설정 관리는 부모님이 도와줍니다. 제출 나가기 @@ -152,6 +152,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 주소 사이트에서 쿠키 데이터를 저장하고 읽도록 허용(권장) 님과 님이 관리하는 계정입니다. +다른 기기에서 탭을 가져오려면 Android 계정 설정에서 '데이터 자동 동기화'를 사용 설정하세요. Copyright Google Inc. All rights reserved. 인증서 뷰어 암호 만들기 @@ -188,6 +189,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 관리 계정으로 로그인하면 사용자의 Chrome 프로필에 대한 제어 권한이 관리자에게 부여됩니다. 사용자의 Chrome 데이터는 이 계정에 영구적으로 연결되며, 이 계정의 연결을 해제하면 로컬 Chrome 데이터가 삭제됩니다. 이미지 공유 +사이트에서 내 위치를 파악하도록 허용하기 전에 확인(권장) 파일 시스템에 오류가 발생하여 을(를) 다운로드할 수 없습니다. 크기: 사용 @@ -240,6 +242,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 번역 언어: 오픈소스 라이선스 탐색이 차단됨: +동기화 오류가 발생했습니다. 자세한 내용을 알아보려면 탭하세요. 링크 주소 복사 번역 안함 미디어 @@ -254,6 +257,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 더 많은 항목을 간편하게 탐색 북마크를 에 추가함 향후 주변의 피지컬 웹페이지가 알림 목록에 표시됩니다. +사이트에서 카메라를 사용하도록 허용하기 전에 확인(권장) 키 생성 암호를 아는 사람만 암호화된 데이터를 읽을 수 있습니다. 암호는 Google로 전송되거나 Google에 저장되지 않습니다. 암호가 기억나지 않거나 이 설정을 변경하려면 동기화를 재설정해야 합니다. 자세히 알아보기 {DAYS,plural, =1{#일 전}other{#일 전}} @@ -272,6 +276,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 탭이 Chrome 내부의 탭 전환으로 이동합니다. Chrome 실행에 필요한 중요한 기능이 없습니다. Chrome 설치가 제대로 완료되지 않았거나 사용 중인 Android 버전과 호환되지 않습니다. 캐시된 이미지 또는 파일 +기기 설정 앱의 계정 페이지에서 Google 계정을 추가하세요. 에서 열기 업데이트 마지막 동기화 시간: @@ -323,6 +328,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 저장 자녀 보호 설정 이름 +사이트에서 자바스크립트 실행 허용(권장) 삭제됨 위치 정보 액세스 또한 이 기기에서 사용 중지되었습니다. 보내지 않기 @@ -360,6 +366,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 시크릿 탭 설명: 에 있는 기존 파일을 바꾸시겠습니까? +Google이 검색, 광고 및 다른 Google 서비스를 맞춤설정하기 위하여 내 인터넷 사용 기록을 사용하는 방법을 제어하세요. 권한 {HOURS,plural, =1{#시간 전}other{#시간 전}} 페어링 @@ -368,6 +375,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 데이터 절약 모드 사용 사용 안함 저장된 비밀번호 +사이트를 전체화면으로 보기 전에 확인(권장) 새 파일 만들기 쿠키를 포함하여 이 웹사이트에 의해 저장된 모든 로컬 데이터가 삭제됩니다. Google 번역 @@ -392,6 +400,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 국가/지역 데이터 절약 자세히 알아보기 +사이트 예외 추가 예외 ‘추적 안함’을 사용하도록 설정하면 요청이 사용자의 인터넷 사용 트래픽에 포함됩니다. 웹사이트가 요청에 응답하는지 여부와 요청이 해석되는 방법에 따라 결과가 결정됩니다. @@ -453,6 +462,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 접근성 Google Play 스토어에서 앱 다운로드: 발생 가능성이 있는 보안 문제의 세부정보를 자동으로 Google에 보고합니다. +사이트에서 마이크를 사용하기 전에 확인(권장) Google 계정 확인 (이)가 다운로드됨 브라우저에서 열기 @@ -515,6 +525,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 배송 원본 로드 주변 URL 보기 +항상 허용 주소 추가 이동 암호 확인 @@ -559,6 +570,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 허용(검색주소창 검색) 에 동기화 중 일반 탭 +특정 사이트에서 백그라운드 동기화를 허용합니다. 음성 안내 지원을 최신 버전으로 업데이트해야 합니다. 승인된 사이트만 허용 방문 기록 전체 보기 @@ -593,6 +605,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 설정에서 작동 방식을 조정하세요. 북마크 이전에 (으)로 로그인했습니다. (으)로 로그인하면 북마크 등 계정 간에 동기화된 데이터가 통합됩니다. 정보를 별도로 보관하려면 설정에서 인터넷 사용 기록을 삭제하세요. +사이트에서 팝업을 표시하지 못하도록 차단(권장) 배송지 주소 , 탭 저장소 @@ -622,6 +635,7 @@ Chrome 설정에서 피지컬 웹을 관리할 수 있습니다. 암호를 입력해야 합니다. 기기 사용자 인증 정보 재설정 원본 보기 +사이트에서 알림을 보내도록 허용하기 전에 확인(권장) 동기화 계정을 에서 (으)로 전환합니다. 기존 북마크, 방문 기록, 비밀번호, 기타 설정은 어떻게 할까요? 근처 피지컬 웹페이지 모바일 보기 diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb index e4ced4fce72fc..73b5d37597c13 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lt.xtb @@ -75,7 +75,6 @@ Kad galėtumėte naudoti Fizinį žiniatinklį, būtina įgalinti „Bluetooth Įjunkite „Chrome“ leidimą „Android“ nustatymuose. Slaptažodžių išsaugojimas Šifruoti viską nuo taikant „Google“ slaptažodį -Galite pasirinkti, kaip „Google“ turėtų naudoti jūsų naršymo istoriją, kad suasmenintų Paiešką ir kitas „Google“ paslaugas. Atnaujinkite išsamią prisijungimo informaciją. Išplėstiniai Kuriamos versijos „Chrome“ žymės @@ -129,6 +128,7 @@ Fizinį žiniatinklį galite valdyti „Chrome“ nustatymuose. Išskleista – spustelėkite, kad sutrauktumėte Pasiekiama naujesnė versija Lygiaplotis +Leisti „JavaScript“ konkrečioje svetainėje. Tėvai padeda tvarkyti šiuos nustatymus. Pateikti Išeiti @@ -152,6 +152,7 @@ Fizinį žiniatinklį galite valdyti „Chrome“ nustatymuose. Adresai Leisti svetainėms išsaugoti ir nuskaityti slapukų duomenis (rekomenduojama) Šią paskyrą tvarko ir . +Jei norite pasiekti skirtukus iš kitų įrenginių, „Android“ paskyros nustatymuose įjunkite parinktį „Automatiškai sinchronizuoti duomenis“. Autorių teisės priklauso „Google Inc.“, m. Visos teisės saugomos. Sertifikato peržiūros priemonė Kurkite slaptafrazę @@ -188,6 +189,7 @@ Fizinį žiniatinklį galite valdyti „Chrome“ nustatymuose. Prisijungiate naudodami valdomą paskyrą ir leidžiate administratoriui valdyti jūsų „Chrome“ profilį. „Chrome“ duomenys bus visam laikui susieti su šia paskyra. Atsijungus nuo šios paskyros bus ištrinti vietiniai „Chrome“ duomenys. Bendrinti vaizdą +Klausti prieš leidžiant svetainėms žinoti vietovę (rekomenduojama) Nepavyko atsisiųsti „“ dėl failų sistemos klaidų. Dydis: Įgalinti @@ -240,6 +242,7 @@ Jei norite koreguoti paieškos terminą, paspauskite ir laikykite, kad jį pasir Vertimo kalba: Atvirojo šaltinio licencijos Naršymas užblokuotas: +Įvyko sinchronizavimo klaida. Palieskite, kad gautumėte išsamios informacijos. Kopijuoti nuorodos adresą Niekada neversti k. Medija @@ -254,6 +257,7 @@ Jei norite koreguoti paieškos terminą, paspauskite ir laikykite, kad jį pasir Naršykite daugiau ir mokėkite mažiau Sukurta „“ žymė Būsimi netoliese esančių įrenginių fizinio žiniatinklio puslapiai bus rodomi pranešimų sąraše +Pirmiausia klausti prieš leidžiant svetainėms naudoti kamerą (rekomenduojama) Rakto generavimas Tik jūsų slaptafrazę žinantis asmuo gali skaityti šifruotus duomenis. Slaptafrazė nesiunčiama į sistemą „Google“ ir joje nesaugoma. Pamiršę slaptafrazę arba norėdami pakeisti šį nustatymą turėsite iš naujo nustatyti sinchronizavimą. Sužinokite daugiau {DAYS,plural, =1{Prieš # dieną}one{Prieš # dieną}few{Prieš # dienas}many{Prieš # dienos}other{Prieš # dienų}} @@ -272,6 +276,7 @@ Jei norite koreguoti paieškos terminą, paspauskite ir laikykite, kad jį pasir Skirtukai bus perkelti į skirtukų jungiklį, esantį „Chrome“. Trūksta svarbios funkcijos, būtinos paleisti „Chrome“: „Chrome“ įdiegimas neužbaigtas arba nesuderinamas su šia „Android“ versija. Talpykloje esantys vaizdai ir failai +Pridėkite „Google“ paskyrą iš įrenginio „Nustatymų“ programos puslapio „Paskyros“. Atidaryti naudojant „ Atnaujinti Paskutinį kartą sinchronizuota: @@ -323,6 +328,7 @@ Jei norite koreguoti paieškos terminą, paspauskite ir laikykite, kad jį pasir Išsaugoti Tėvų nustatymai Pavadinimas +Leisti svetainėms paleisti „JavaScript“ (rekomenduojama) Ištrinta „ Galimybė pasiekti vietovę taip pat išjungta šiame įrenginyje. Niekada nesiųsti @@ -361,6 +367,7 @@ Tačiau nesate nematomi. Kai naudojate inkognito režimą, jūsų darbdavys, int Inkognito skirtukai Aprašas: Ar norite pakeisti „“, esantį „“? +Valdykite, kaip „Google“ turėtų naudoti jūsų naršymo istoriją, kad suasmenintų Paiešką, skelbimus ir kitas „Google“ paslaugas. Leidimai {HOURS,plural, =1{Prieš 1 valandą}one{Prieš # valandą}few{Prieš # valandas}many{Prieš # valandos}other{Prieš # valandų}} Susieti @@ -369,6 +376,7 @@ Tačiau nesate nematomi. Kai naudojate inkognito režimą, jūsų darbdavys, int Duomenų taupymo priemonė įgalinta Išjungta Išsaugoti slaptažodžiai +Pirmiausia klausti prieš leidžiant svetainėms įjungti viso ekrano režimą (rekomenduojama) Sukurti naują failą Visi šioje svetainėje saugomi vietiniai duomenys, įskaitant slapukus, bus ištrinti. „Google“ vertėjas @@ -393,6 +401,7 @@ Tačiau nesate nematomi. Kai naudojate inkognito režimą, jūsų darbdavys, int Šalis / regionas Sutaupyta duomenų: Sužinokite daugiau +Pridėti svetainės išimtį Išimtys Įgalinus funkciją „Nestebėti“, užklausa bus įtraukta į naršymo srautą. Poveikis priklauso nuo to, ar svetainė atsako į užklausą ir kaip užklausa interpretuojama. @@ -454,6 +463,7 @@ Pavyzdžiui, kai kurios svetainės gali atsakyti į šią užklausą rodydamos j Pritaikymas neįgaliesiems Gauti programą iš „Google Play“ parduotuvės: Automatiškai pateikti išsamią informaciją apie galimas saugos problemas „Google“. +Pirmiausia klausti prieš leidžiant svetainėms naudoti mikrofoną (rekomenduojama) Patvirtinti „Google“ paskyrą Failas „“ atsisiųstas Atidaryti naršyklėje @@ -510,12 +520,13 @@ Adresu history.google.com gali bū Sveiki, tai „Chrome“ Jūsų ryšys su šia svetaine nėra privatus. Neteisinga slaptafrazė -Šifruoti slaptažodžius naudojant „Google“ kredencialus +Šifruoti slaptažodžius naudojant „Google“ prisijungimo duomenis Atšaukti Pridėti paskyrą Pristatymas Įkelti originalą Sužinokite, kas yra netoliese +Visada leidžiama Pridėti adresą Perkelti Patvirtinti slaptafrazę @@ -560,6 +571,7 @@ Adresu history.google.com gali bū Leisti (atliekant paieškas adreso juostoje) Sinchronizuojama su Įprasti skirtukai +Leisti fono sinchronizavimą konkrečioje svetainėje. Reikia atnaujinti „TalkBack“ versiją į naujesnę. Tik patvirtintos svetainės Rodyti visą istoriją @@ -594,6 +606,7 @@ Jei norite gauti naujas licencijas, prisijunkite prie interneto ir leiskite atsi Veikimą valdykite „Nustatymuose“ Žymės Buvo prisijungta kaip . Jei prisijungsite kaip , paskyrose bus sujungti sinchronizuoti duomenys, pvz., žymės. Jei norite išlaikyti informaciją atskirai, nustatymuose išvalykite naršymo duomenis. +Blokuoti, kad svetainėse nebūtų rodomi iššokantieji langai (rekomenduojama) Siuntimo adresas “, skirtukas Saugykla @@ -623,6 +636,7 @@ Jei norite gauti naujas licencijas, prisijunkite prie interneto ir leiskite atsi Būtina slaptafrazė Iš naujo nustatyti įrenginio prisijungimo duomenis Rodyti originalą +Klausti prieš leidžiant svetainėms siųsti pranešimus (rekomenduojama) Perjungiate sinchronizavimo paskyras iš į . Ką norite daryti su esamomis žymėmis, istorija, slaptažodžiais ir kitais nustatymais? Fiziniai tinklalapiai netoliese Mobiliesiems pritaikytas rodinys diff --git a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb index 1f1bc0c498e30..4561429a9c923 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb @@ -7,6 +7,7 @@ Pārlūkam Chrome ir nepieciešama piekļuve mikrofonam, lai kopīgotu to ar šo vietni. Jūs izrakstāties no konta, kurš tiek pārvaldīts domēnā . Tādējādi tiks dzēsti šajā ierīcē glabātie Chrome dati, taču tie joprojām būs pieejami jūsu Google kontā. Pabeigts +Šeit būs redzamas grāmatzīmes, kuras esat saglabājis citās ierīcēs. Lietojuma un avāriju pārskati iepriekšējās stundas Pauzēt @@ -25,6 +26,7 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Nekad netulkot šo vietni Dzēst vēsturi, sīkfailus, vietnes datus, kešatmiņu… Nesen aizvērtas +Pierakstieties pārlūkā Chrome, lai būtu pieejamas cilnes no citām jūsu ierīcēm. Skatiet tās pārlūkā Chrome Tika pievienota vietne Nepietiek vietas, lai lejupielādētu atlasīto saturu. @@ -73,7 +75,6 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Android iestatījumos ieslēdziet atļauju pārlūkam Chrome. Paroļu saglabāšana Šifrēt visu ar Google paroli, sākot no: -Kontrolējiet to, kā Google var izmantot jūsu pārlūkošanas vēsturi, lai personalizētu Meklēšanu un citus Google pakalpojumus. Lūdzu, atjauniniet pierakstīšanās informāciju. Papildu Chrome izstrādātāju versijas grāmatzīmes @@ -99,6 +100,11 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Uzlabot Operētājsistēma neatbalsta klienta puses sertifikāta atlasi. Velciet slīdni, kamēr varat ērti lasīt. Pēc dubultskāriena rindkopai tekstam ir jābūt vismaz šādā lielumā. +Jūsu tuvumā esošās ierīces pārraida tīmekļa lapas, izmantojot Bluetooth savienojumu. Chrome meklēs lapas un parādīs tās, kad aktivizēsiet savu ierīci. Šīs lapas tiks pārbaudītas Google pakalpojumā, lai uzlabotu lapu rezultātu kvalitāti. + +Fizisko tīmekli varat kontrolēt Chrome iestatījumos. + +Uzziniet vairāk. Instalēšana... Tulkošanas iestatījumi ir atiestatīti. Turpināt @@ -122,6 +128,7 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Izvērsts — noklikšķiniet, lai sakļautu. Pieejama jaunāka versija Vienplatuma +Atļaut JavaScript konkrētai vietnei Jūsu vecāki palīdz pārvaldīt šos iestatījumus. Iesniegt Iziet @@ -145,6 +152,7 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Adreses Atļaut vietnēm saglabāt un lasīt sīkfailu datus (ieteicams) Šo kontu pārvalda un . +Android konta iestatījumos ieslēdziet automātisku datu sinhronizāciju, lai būtu pieejamas cilnes no citām jūsu ierīcēm. Autortiesības  Google Inc. Visas tiesības paturētas. Sertifikātu skatītājs Ieejas frāzes izveide @@ -156,6 +164,7 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Piedāvāt lapu tulkošanu, izmantojot Google tulkotāju Atvērt inkognito režīma cilnē Notiek piekļūšana audio un video ievadei +Pierakstieties pārlūkā Chrome, lai būtu pieejamas grāmatzīmes no citām jūsu ierīcēm. Iziet no inkognito režīma Piegādes iespēja Atlasīt piegādes iespēju @@ -180,6 +189,7 @@ Lai izmantotu fizisko tīmekli, ir jābūt ieslēgtam Bluetooth savienojumam un Jūs pierakstāties, izmantojot pārvaldītu kontu, un ļaujat šī konta administratoram pārvaldīt jūsu Chrome profilu. Jūsu Chrome dati tiks neatgriezeniski saistīti ar šo kontu. Noņemot saiti no šī konta, tiks dzēsti lokālie Chrome dati. Kopīgot attēlu +Jautāt, pirms atļaut vietnēm uzzināt jūsu atrašanās vietu (ieteicams) Neizdevās lejupielādēt failu , jo radās failu sistēmas kļūdas. Lielums: Iespējot @@ -220,6 +230,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Juridiskā informācija Šī funkcija var ietekmēt piekļuvi paaugstinātas maksas datu pakalpojumiem, kurus nodrošina jūsu mobilo sakaru operators. Uzlabojiet pārlūku Chrome, uzņēmumam Google sūtot lietojuma statistiku un avāriju pārskatus. +Automātiskā atskaņošana Lejupielāde neizdevās. Pārvalda jūsu administrators Vietnes iestatījumi @@ -231,6 +242,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Tulkojuma valoda: Atklātā pirmkoda licences Navigācija ir bloķēta: +Radās sinhronizācijas kļūda. Pieskarieties, lai skatītu detalizētu informāciju. Kopēt saites adresi Nekad netulkot šādā valodā: Multivide @@ -245,6 +257,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Pārlūkojiet vairāk, tērējot mazāk datu! Grāmatzīme saglabāta mapē Turpmāk tuvumā esošās fiziskā tīmekļa lapas tiks rādītas paziņojumu sarakstā +Jautāt, pirms atļaut vietnēm izmantot jūsu kameru (ieteicams) Atslēgu ģenerēšana Jūsu šifrētos datus var lasīt tikai personas, kurām ir zināma jūsu ieejas frāze. Ieejas frāze netiek sūtīta Google serveriem un netiek tajos glabāta. Ja aizmirsīsiet ieejas frāzi vai vēlēsieties mainīt šo iestatījumu, jums būs jāatiestata sinhronizācija. Uzziniet vairāk. {DAYS,plural, =1{pirms # dienas}zero{pirms # dienām}one{pirms # dienas}other{pirms # dienām}} @@ -263,6 +276,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Cilnes tiks pārvietotas uz ciļņu pārslēdzēju pārlūkā Chrome. Trūkst būtiskas funkcionalitātes, kas nepieciešama pārlūka Chrome palaišanai. Vai nu jūsu pārlūka Chrome instalācija ir nepilnīga, vai arī pārlūks nav saderīgs ar Android versiju. Kešatmiņā ievietotie attēli un faili +Pievienojiet Google kontu no lapas Konti savas ierīces lietotnē Iestatījumi. Atvērt, izmantojot Atjaunināt Pēdējoreiz sinhronizēts: @@ -282,7 +296,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Bloķēta (ieteicams) Serif Atļaut -Privātums +Konfidencialitāte Jums piemeklēti raksti Lietojums Sakļauts — noklikšķiniet, lai izvērstu. @@ -314,6 +328,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Saglabāt Vecāku iestatījumi Nosaukums +Atļaut vietnēm izmantot JavaScript (ieteicams) Grāmatzīme tika dzēsta Piekļuve atrašanās vietas datiem ir arī izslēgta šai ierīcei. Nekad nesūtīt @@ -351,6 +366,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Inkognito režīma cilnes Apraksts: Vai vēlaties aizstāt esošo failu direktorijā “”? +Kontrolējiet to, kā Google izmanto jūsu pārlūkošanas vēsturi, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus. Atļaujas {HOURS,plural, =1{pirms # stundas}zero{pirms # stundām}one{pirms # stundas}other{pirms # stundām}} Savienot pārī @@ -359,6 +375,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Datu lietojuma samazinātājs ir iespējots. Izsl. Saglabātās paroles +Jautāt, pirms atļaut vietnēm pāriet pilnekrāna režīmā (ieteicams) Izveidot jaunu failu Visi šīs vietnes saglabātie lokālie dati, tostarp sīkfaili, tiks dzēsti. Google tulkotājs @@ -373,6 +390,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Vairāk Neizdevās lejupielādēt failu , jo radās nezināma kļūda. GG +Atļaut vietnēm automātiski atskaņot svarīgo multividi (ieteicams) Sākumlapas rediģēšana Notiek iestatīšana... Lapas atsvaidzināšana @@ -382,6 +400,7 @@ Lai pielāgotu meklēšanas vienumu, nospiediet un turiet to. Lai veiktu precīz Valsts/reģions Datu lietojuma samazinājums: Uzziniet vairāk +Pievienot vietnes izņēmumu Izņēmumi Iespējojot funkciju “Nesekot”, jūsu pārlūkošanas datplūsmā tiks iekļauts pieprasījums. Rezultāts būs atkarīgs no tā, vai vietne nodrošinās atbildi uz pieprasījumu un kā pieprasījums tiks interpretēts. @@ -409,6 +428,7 @@ Piemēram, dažas vietnes, reaģējot uz šo pieprasījumu, var rādīt jums rek Opcijas Vienmēr tulkot no šādas valodas: Rediģēt kredītkarti +Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chrome citās ierīcēs. Atiestatīšana neizdevās. Nodrošiniet, ka ierīce ir tiešsaistē, un mēģiniet vēlreiz. Nokopēta pārlūkā Chrome. Aizsargāts saturs @@ -442,6 +462,7 @@ Piemēram, dažas vietnes, reaģējot uz šo pieprasījumu, var rādīt jums rek Pieejamība Iegūstiet lietotni Google Play veikalā: Automātiski nosūtīt Google serveriem informāciju par iespējamām drošības problēmām +Jautāt, pirms atļaut vietnēm izmantot jūsu mikrofonu (ieteicams) Google konta apstiprināšana Fails ir lejupielādēts. Atvērt pārlūkā @@ -504,6 +525,7 @@ Jūsu Google kontam vietnē history.google.comPiegāde Ielādēt sākotnējo Skatīt tuvumā esošos objektus +Vienmēr atļauts Pievienot adresi Pārvietot Apstipriniet ieejas frāzi @@ -511,6 +533,8 @@ Jūsu Google kontam vietnē history.google.comPievienot Nē, paldies Notiek piekļūšana audio ievadei +Apstrādājot jūsu pasūtījumu, radās kļūda. Lūdzu, pārbaudiet savu kontu un mēģiniet vēlreiz. +Noteikt konkrētas vietnes svarīgo multividi un to automātiski atskaņot. Atcelt atlasi Citas ierīces Noņemt visu @@ -546,6 +570,7 @@ Jūsu Google kontam vietnē history.google.comAtļaut (meklēšanas vaicājumiem adreses joslā) Sinhronizēšana ar Standarta cilnes +Atļaut sinhronizāciju fonā konkrētai vietnei Jums ir jāatjaunina lietotne TalkBack uz jaunāku versiju. Tikai apstiprinātas vietnes Rādīt pilnu vēsturi @@ -567,6 +592,7 @@ Jūsu Google kontam vietnē history.google.comCitās lietojumprogrammās lejupielādētu saturu (filmas, mūziku), iespējams, nevarēs atskaņot, kamēr šajās lietojumprogrammās netiks iegūtas licences, pamatojoties uz jauniem ierīces akreditācijas datiem. Lai iegūtu jaunas licences, izveidojiet savienojumu ar internetu un atskaņojiet lejupielādēto saturu. +Ieslēdziet sinhronizāciju, lai būtu pieejamas cilnes no citām jūsu ierīcēm. No Google Payments Notīrīt ievadi Derīguma termiņš @@ -579,6 +605,7 @@ Lai iegūtu jaunas licences, izveidojiet savienojumu ar internetu un atskaņojie Kontrolējiet darbību lapā Iestatījumi. Grāmatzīmes Tika pierakstīts lietotājs . Pierakstoties ar lietotājvārdu , no abiem kontiem tiks apvienoti sinhronizētie dati, piemēram, grāmatzīmes. Lai nošķirtu informāciju, iestatījumos notīriet pārlūkošanas datus. +Neļaut vietnēm rādīt uznirstošos elementus (ieteicams) Piegādes adrese Cilne Krātuve @@ -608,6 +635,7 @@ Lai iegūtu jaunas licences, izveidojiet savienojumu ar internetu un atskaņojie Jāievada ieejas frāze. Atiestatīt ierīces akreditācijas datus Rādīt oriģinālo +Jautāt, pirms atļaut vietnēm sūtīt paziņojumus (ieteicams) Jūs pārslēdzat sinhronizējamos kontus no konta uz kontu . Ko vēlaties darīt ar esošajām grāmatzīmēm, vēsturi, parolēm un citiem iestatījumiem? Tuvumā esošās fiziskā tīmekļa lapas Mobilajām ierīcēm piemērots skatījums diff --git a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb index 82c8998288256..abd9f9a7badc5 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb @@ -75,7 +75,6 @@ Je moet Bluetooth en Locatie hebben ingeschakeld om het Fysieke web te gebruiken Schakel het recht in voor Chrome via de Android-instellingen. Wachtwoorden opslaan Alles versleutelen met Google-wachtwoord vanaf -Beheer hoe Google je browsegeschiedenis gebruikt om Google Zoeken en andere Google-services te personaliseren. Update je inloggegevens. Geavanceerd Chrome Dev-bladwijzers @@ -121,7 +120,7 @@ Je kunt het Fysieke web beheren via de instellingen van Chrome. Browsegeschiedenis Help en feedback Terug -Formulieren automatisch aanvullen +Formulieren automatisch invullen Databesparing is ingeschakeld. Beheer dit via Instellingen. Webweergave Een offline exemplaar van deze pagina bekijken @@ -129,6 +128,7 @@ Je kunt het Fysieke web beheren via de instellingen van Chrome. Uitgevouwen; klik om samen te vouwen. Nieuwere versie beschikbaar Monospace +JavaScript toestaan voor een specfieke site. Je ouders helpen je deze instellingen te beheren. Verzenden Verlaten @@ -152,6 +152,7 @@ Je kunt het Fysieke web beheren via de instellingen van Chrome. Adressen Sites toestaan cookiegegevens op te slaan en te lezen (aanbevolen) Dit account wordt beheerd door en . +Schakel in je account bij de instellingen van Android 'Gegevens automatisch synchroniseren' in om de tabbladen op je andere apparaten te bekijken. Copyright Google Inc. Alle rechten voorbehouden. Certificaatviewer Wachtwoordzin maken @@ -188,6 +189,7 @@ Je kunt het Fysieke web beheren via de instellingen van Chrome. Je logt in met een beheerd account en geeft de beheerder controle over je Chrome-profiel. Je Chrome-gegevens worden permanent gekoppeld aan dit account. Als je dit account loskoppelt, worden de lokale Chrome-gegevens verwijderd. Afbeelding delen +Vragen of je sites toegang wilt verlenen tot je locatie (aanbevolen) Downloaden van is mislukt door fouten in het bestandssysteem. Grootte: Inschakelen @@ -240,6 +242,7 @@ Als je de zoekterm wilt aanpassen, houd je deze aangeraakt om de term te selecte Doeltaal: Open-sourcelicenties Navigatie is geblokkeerd: +Er is een synchronisatiefout opgetreden. Tik voor informatie. Linkadres kopiëren nooit vertalen Media @@ -254,6 +257,7 @@ Als je de zoekterm wilt aanpassen, houd je deze aangeraakt om de term te selecte Meer internet voor minder Bladwijzer gemaakt in Toekomstige Fysieke webpagina's in de buurt worden weergegeven in je lijst met meldingen +Eerst vragen voordat sites je camera mogen gebruiken (aanbevolen) Sleutels genereren Alleen iemand met je wachtwoordzin kan je versleutelde gegevens lezen. De wachtwoordzin wordt niet verzonden naar of opgeslagen door Google. Als je je wachtwoordzin vergeet of deze instelling wilt wijzigen, moet je de synchronisatie opnieuw instellen. Meer informatie {DAYS,plural, =1{# dag geleden}other{# dagen geleden}} @@ -272,6 +276,7 @@ Als je de zoekterm wilt aanpassen, houd je deze aangeraakt om de term te selecte Tabbladen worden verplaatst naar een tabbladschakelaar in Chrome. Er ontbreekt essentiële functionaliteit voor het uitvoeren van Chrome. Je Chrome-installatie is onvolledig of niet compatibel met deze versie van Android. Gecachte afbeeldingen en bestanden +Voeg een Google-account toe via de pagina Accounts in de app Instellingen van je apparaat. Openen in Updaten Laatst gesynchroniseerd: @@ -323,6 +328,7 @@ Als je de zoekterm wilt aanpassen, houd je deze aangeraakt om de term te selecte Opslaan Instellingen voor ouders Naam +Sites toestaan JavaScript uit te voeren (aanbevolen) is verwijderd Locatietoegang is ook uitgeschakeld voor dit apparaat. Nooit verzenden @@ -360,6 +366,7 @@ Je bent echter niet onzichtbaar. Als je incognito bent, wordt je browsegeschiede Incognitotabbladen Beschrijving: Wil je de bestaande versie van in vervangen? +Beheer hoe Google je browsegeschiedenis gebruikt om Google Zoeken, advertenties en andere Google-services te personaliseren. Rechten {HOURS,plural, =1{# uur geleden}other{# uur geleden}} Koppelen @@ -368,11 +375,12 @@ Je bent echter niet onzichtbaar. Als je incognito bent, wordt je browsegeschiede Databesparing ingeschakeld Uit Opgeslagen wachtwoorden +Eerst vragen voordat sites op volledig scherm mogen worden weergegeven (aanbevolen) Nieuw bestand maken Alle lokale gegevens die zijn opgeslagen door deze website, inclusief cookies, worden verwijderd. Google Translate Aan -Terugzetten +Resetten '' afspelen Video-invoer openen Chrome heeft locatietoegang nodig om het item te delen met deze site. @@ -392,6 +400,7 @@ Je bent echter niet onzichtbaar. Als je incognito bent, wordt je browsegeschiede Land/regio besparing van data Meer informatie +Site-uitzondering toevoegen Uitzonderingen Als je 'Niet bijhouden' inschakelt, wordt hiervoor een verzoek opgenomen in je browseverkeer. Het resultaat daarvan hangt af van of een website reageert op het verzoek en hoe het verzoek wordt geïnterpreteerd. @@ -453,6 +462,7 @@ Zo kunnen sommige websites op dit verzoek reageren door advertenties weer te gev Toegankelijkheid Download de app uit de Google Play Store: Automatisch informatie over mogelijke beveiligingsincidenten aan Google melden +Eerst vragen voordat sites je microfoon mogen gebruiken (aanbevolen) Google-account bevestigen gedownload Openen in browser @@ -515,6 +525,7 @@ Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekop Verzendadres Origineel laden Bekijken wat er in de buurt is +Altijd toegestaan Adres toevoegen Verplaatsen Bevestig de wachtwoordzin @@ -559,6 +570,7 @@ Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekop Toestaan (voor zoekopdrachten via adresbalk) Synchroniseren met Standaardtabbladen +Synchronisatie op de achtergrond toestaan voor een specifieke site. Je moet TalkBack bijwerken naar een nieuwere versie. Alleen goedgekeurde sites Volledige geschiedenis weergeven @@ -593,6 +605,7 @@ Maak verbinding met internet en speel je gedownloade inhoud af om nieuwe licenti Beheer hoe dit werkt via Instellingen Bladwijzers is ingelogd. Inloggen met voegt gesynchroniseerde gegevens zoals bladwijzers samen tussen accounts. Als je deze informatie gescheiden wilt houden, moet je de browsegegevens wissen in de Instellingen. +Sites niet toestaan pop-ups weer te geven (aanbevolen) Verzendadres , tabblad Opslag @@ -622,6 +635,7 @@ Maak verbinding met internet en speel je gedownloade inhoud af om nieuwe licenti Wachtwoordzin vereist Apparaatinloggegevens opnieuw instellen Origineel weergeven +Vragen voordat sites meldingen mogen verzenden (aanbevolen) Je wijzigt het synchronisatieaccount van in . Wat wil je doen met je bestaande bladwijzers, geschiedenis, wachtwoorden en andere instellingen? Fysieke webpagina's in de buurt Mobielvriendelijke weergave diff --git a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb index 40c27fc79c5dc..914fe26edb369 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb @@ -75,7 +75,6 @@ Du må ha slått på Bluetooth og Posisjon for å bruke det fysiske nettet.Slå på tillatelsen for Chrome i Android-innstillingene. Lagring av passord Kryptér alt med Google-passord fra og med -Kontrollér hvordan Google bruker nettlesingsloggen din for å gi Søk og andre Google-tjenester et personlig preg. Oppdater påloggingsinformasjonen din. Avansert Bokmerker fra Chrome Dev @@ -129,6 +128,7 @@ Du kan kontrollere det fysiske nettet i Chrome-innstillingene. Utvidet – klikk for å minimere. En nyere versjon er tilgjengelig Monospace +Tillat JavaScript for et bestemt nettsted. Foreldrene dine er med på å styre disse innstillingene. Send Gå ut @@ -152,6 +152,7 @@ Du kan kontrollere det fysiske nettet i Chrome-innstillingene. Adresser Tillat at nettsteder lagrer og leser data i informasjonskapsler (anbefales). Denne kontoen er administrert av og . +For å få fanene dine fra de andre enhetene du bruker, slå på «Auto-synkroniser data» i kontoinnstillingene for Android. Copyright Google Inc. Med enerett. Visningsprogram for sertifikater Opprett en passordfrase @@ -188,6 +189,7 @@ Du kan kontrollere det fysiske nettet i Chrome-innstillingene. Du logger på med en administrert konto, og gir administratoren kontroll over Chrome-profilen din. Chrome-dataene dine blir permanent knyttet til denne kontoen. Hvis du kobler fra denne kontoen, slettes de lokale Chrome-dataene. Del bildet +Spør før nettsteder får vite posisjonen min (anbefales) Nedlastingen av ble avbrutt på grunn av filsystemfeil. Størrelse: Slå på @@ -240,6 +242,7 @@ Hvis du vil endre søkeordet, kan du trykke på det og holde for å merke det. H Språket siden skal oversettes til: Lisenser for åpen kildekode Nettadressen er blokkert: +Det har oppstått en synkroniseringsfeil. Trykk for å se detaljene. Kopiér linkadressen Oversett aldri Medier @@ -254,6 +257,7 @@ Hvis du vil endre søkeordet, kan du trykke på det og holde for å merke det. H Mer surfing for mindre penger Satt som bokmerke i Fremtidige sider på det fysiske nettet i nærheten vises i varsellisten din +Spør før nettsteder får bruke kameraet (anbefales) Nøkkelgenerering Bare personer som har passordfrasen din, kan lese de krypterte dataene dine. Passordfrasen blir verken sendt til Google eller lagret. Hvis du glemmer passordfrasen eller vil endre denne innstillingen, må du tilbakestille synkroniseringen. Finn ut mer {DAYS,plural, =1{for # dag siden}other{for # dager siden}} @@ -272,6 +276,7 @@ Hvis du vil endre søkeordet, kan du trykke på det og holde for å merke det. H Fanene flyttes til en fanevelger i Chrome. En avgjørende funksjon som kreves for å kjøre Chrome, mangler. Chrome-installasjonen er enten ufullstendig eller ikke kompatibel med denne versjonen av Android. Bufrede bilder og filer +Legg til en Google-konto på Kontoer-siden i Innstillinger-appen på enheten din. Åpne i Oppdater Sist synkronisert: @@ -323,6 +328,7 @@ Hvis du vil endre søkeordet, kan du trykke på det og holde for å merke det. H Lagre Foreldreinnstillinger Navn +Tillat nettsteder å kjøre JavaScript (anbefales) Slettet Posisjonstilgang er også slått av for denne enheten. Send aldri @@ -360,6 +366,7 @@ Du er imidlertid ikke usynlig. Inkognito-modusen skjuler ikke surfingen din for Inkognitofaner Beskrivelse: Vil du erstatte den eksisterende filen i ? +Kontrollér hvordan Google bruker nettlesingsloggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg. Tillatelser {HOURS,plural, =1{for # time siden}other{for # timer siden}} Koble sammen @@ -368,6 +375,7 @@ Du er imidlertid ikke usynlig. Inkognito-modusen skjuler ikke surfingen din for Datasparing er slått på Av Lagrede passord +Spør før nettsteder får gå i fullskjermmodus (anbefales) Opprett en ny fil Alle data som er lagret lokalt av dette nettstedet, inkludert informasjonskapsler, blir slettet. Google Oversetter @@ -392,6 +400,7 @@ Du er imidlertid ikke usynlig. Inkognito-modusen skjuler ikke surfingen din for Land/område datasparing Les mer +Legg til et nettsted som unntak Unntak Hvis du slår på «Deaktivering av sporing», blir det sendt en forespørsel sammen med nettrafikken din. Hvilke virkninger dette eventuelt får, avhenger av om det aktuelle nettstedet svarer på forespørselen eller ikke, samt hvordan forespørselen tolkes. @@ -453,6 +462,7 @@ Noen nettsteder kan for eksempel svare på denne forespørselen ved å vise deg Tilgjengelighet Last ned appen fra Google Play Butikk: Rapportér detaljer om mulige sikkerhetsbrudd til Google automatisk +Spør før nettsteder får bruke mikrofonen (anbefales) Bekreftelse av Google-konto er lastet ned Åpne i nettleseren @@ -515,6 +525,7 @@ Det kan hende Google-kontoen din har andre typer nettlesingslogger, for eksempel Forsendelse Last inn originalen Se hva som er i nærheten +Alltid tillatt Legg til adresse Flytt Bekreft passord @@ -559,6 +570,7 @@ Det kan hende Google-kontoen din har andre typer nettlesingslogger, for eksempel Tillat (for søk fra adressefeltet) Synkroniserer til Standardfaner +Tillat bakgrunnssynkronisering for et bestemt nettsted. Du må oppdatere til en nyere versjon av Talkback. Bare godkjente nettsteder Vis fullstendig logg @@ -593,6 +605,7 @@ For å få nye lisenser må du koble deg til Internett og spille av innholdet du Kontrollér hvordan dette fungerer, i innstillingene Bokmerker var pålogget. Hvis du logger på , blir synkroniserte data, for eksempel bokmerker, slått sammen for disse kontoene. For å holde informasjonen atskilt må du fjerne nettleserdataene i innstillingene. +Blokkér nettsteder fra å vise forgrunnsvinduer (anbefales) Leveringsadresse – fane Lagring @@ -622,6 +635,7 @@ For å få nye lisenser må du koble deg til Internett og spille av innholdet du Det kreves en passordfrase Nullstill påloggingsinformasjon for enheten Vis original +Spør før nettsteder får sende varsler (anbefales) Du bytter synkroniseringskonto fra til . Hva vil du gjøre med de eksisterende bokmerkene, loggoppføringene, passordene og de andre innstillingene dine? Fysisk nett-sider i nærheten Mobilvennlig visning diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb index 902ecf30262df..42ab4d154075c 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb @@ -75,7 +75,6 @@ Aby korzystać z internetu rzeczy, musisz włączyć Bluetooth i Lokalizację.Przyznaj Chrome uprawnienie w ustawieniach Androida. Zapisuj hasła Zaszyfruj wszystko za pomocą hasła do Google z -Określ, jak Google może korzystać z Twojej historii przeglądania, by dostosowywać wyniki wyszukiwania i działanie innych usług. Zaktualizuj swoje dane logowania. Zaawansowane Zakładki z Chrome Dev @@ -129,6 +128,7 @@ Internet rzeczy możesz skonfigurować w ustawieniach Chrome. Rozwinięty – kliknij, by zwinąć. Dostępna jest nowsza wersja Stała szerokość znaków +Zezwól na użycie JavaScriptu w określonej witrynie. Tymi ustawieniami zarządzają Twoi rodzice. Prześlij Wyjdź @@ -152,6 +152,7 @@ Internet rzeczy możesz skonfigurować w ustawieniach Chrome. Adresy Zezwalaj witrynom na zapisywanie danych w plikach cookie i ich odczytywanie (zalecane) Tym kontem zarządzają i . +Aby korzystać ze swoich kart na wszystkich urządzeniach, włącz opcję „Autosynchronizacja danych” w ustawieniach konta na urządzeniu z Androidem. Copyright Google Inc. Wszelkie prawa zastrzeżone. Przeglądarka certyfikatów Utwórz hasło @@ -188,6 +189,7 @@ Internet rzeczy możesz skonfigurować w ustawieniach Chrome. Logujesz się na zarządzane konto i dajesz jego administratorowi kontrolę nad swoim profilem Chrome. Twoje dane Chrome zostaną na stałe powiązane z tym kontem. Odłączenie od tego konta spowoduje usunięcie lokalnych danych Chrome. Udostępnij zdjęcie +Pytaj, zanim udostępnisz stronom swoją lokalizację (zalecane) Nie udało się pobrać pliku z powodu błędów systemu plików. Rozmiar: Włącz @@ -240,6 +242,7 @@ Aby dostosować wyszukiwane hasło, naciśnij je i przytrzymaj, by je zaznaczyć Język tłumaczenia: Licencje open source Adres zablokowany: +Błąd synchronizacji. Kliknij, by zobaczyć szczegóły. Kopiuj adres linku Nigdy nie tłumacz z języka: Multimedia @@ -254,6 +257,7 @@ Aby dostosować wyszukiwane hasło, naciśnij je i przytrzymaj, by je zaznaczyć Przeglądaj więcej za mniej Utworzono zakładkę w folderze Strony internetu rzeczy w pobliżu będą pojawiać się na liście powiadomień +Pytaj, zanim zezwolisz stronom na korzystanie z kamery (zalecane) Generowanie kluczy Twoje zaszyfrowane dane może odczytać tylko ktoś znający hasło. Google nie otrzyma Twojego hasła ani nie będzie go przechowywać. Jeśli je zapomnisz lub zechcesz zmienić to ustawienie, musisz zresetować synchronizację. Więcej informacji {DAYS,plural, =1{# dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}} @@ -272,6 +276,7 @@ Aby dostosować wyszukiwane hasło, naciśnij je i przytrzymaj, by je zaznaczyć Karty zostaną przeniesione do przełącznika kart w Chrome. Brak ważnych funkcji wymaganych do uruchomienia Chrome. Instalacja Chrome jest niekompletna lub niezgodna z tą wersją Androida. Obrazy i pliki zapisane w pamięci podręcznej +Otwórz aplikację Ustawienia na urządzeniu, przejdź na stronę Konta i dodaj konto Google. Otwórz w: Aktualizuj Ostatnia synchronizacja: @@ -323,6 +328,7 @@ Aby dostosować wyszukiwane hasło, naciśnij je i przytrzymaj, by je zaznaczyć Zapisz Ustawienia rodzicielskie Nazwa +Zezwalaj na wykonywanie kodu JavaScript w witrynach (zalecane) Usunięto: Dostęp do lokalizacji jest też wyłączony na tym urządzeniu. Nigdy nie wysyłaj @@ -360,6 +366,7 @@ To jednak nie oznacza, że Cię nie widać. Nawet gdy przejdziesz w tryb incogni Karty incognito Opis: Chcesz zastąpić istniejący plik w folderze ? +Określ, jak Google może korzystać z Twojej historii przeglądania, by dostosowywać wyniki wyszukiwania, reklamy i działanie innych usług. Uprawnienia {HOURS,plural, =1{# godzinę temu}few{# godziny temu}many{# godzin temu}other{# godziny temu}} Sparuj @@ -368,6 +375,7 @@ To jednak nie oznacza, że Cię nie widać. Nawet gdy przejdziesz w tryb incogni Oszczędzanie danych włączone Wyłączone Zapisane hasła +Pytaj, zanim zezwolisz stronom na korzystanie z pełnego ekranu (zalecane) Utwórz nowy plik Wszystkie dane lokalne zapisane przez tę witrynę (w tym pliki cookie) zostaną usunięte. Tłumacz Google @@ -392,6 +400,7 @@ To jednak nie oznacza, że Cię nie widać. Nawet gdy przejdziesz w tryb incogni Kraj/region Oszczędność danych: Więcej informacji +Dodaj witrynę do wyjątków Wyjątki Włączenie opcji „Bez śledzenia” oznacza, że podczas przeglądania będzie wysyłane żądanie. Jego wynik zależy od tego, czy strona na nie odpowie oraz jak zostanie ono zinterpretowane. @@ -453,6 +462,7 @@ Na przykład niektóre strony mogą na nie zareagować, wyświetlając reklamy b Ułatwienia dostępu Pobierz aplikację ze sklepu Google Play: Automatycznie przesyłaj do Google szczegółowe informacje o możliwych zagrożeniach +Pytaj, zanim zezwolisz stronom na korzystanie z mikrofonu (zalecane) Potwierdź konto Google Plik został pobrany Otwórz w przeglądarce @@ -515,6 +525,7 @@ Inne rodzaje historii przeglądania, takie jak wyszukiwania i aktywność w inny Adres wysyłkowy Załaduj oryginał Zobacz, co jest w pobliżu +Zawsze dozwolone Dodaj adres Przenieś Potwierdź hasło @@ -559,6 +570,7 @@ Inne rodzaje historii przeglądania, takie jak wyszukiwania i aktywność w inny Zezwól (w przypadku wyszukiwań na pasku adresu) Synchronizowanie z kontem Karty standardowe +Zezwalaj na synchronizowanie w tle z określoną stroną. Musisz zainstalować nowszą wersję TalkBack. Tylko zatwierdzone witryny Wyświetl całą historię @@ -593,6 +605,7 @@ Aby otrzymać nowe licencje, połącz się z internetem i odtwórz pobrane treś Określ działanie w Ustawieniach Zakładki Zalogowany był użytkownik . Jeśli zalogujesz się jako , zsynchronizowane dane z obu kont (np. zakładki) zostaną połączone. Aby zachować informacje oddzielnie, wyczyść dane przeglądarki w ustawieniach. +Blokuj próby pokazywania wyskakujących okienek na stronach (zalecane) Adres wysyłki Karta Pamięć @@ -622,6 +635,7 @@ Aby otrzymać nowe licencje, połącz się z internetem i odtwórz pobrane treś Wymagane jest hasło Zresetuj dane logowania na urządzeniu Pokaż tekst oryginalny +Pytaj, zanim zezwolisz stronom na wysyłanie powiadomień (zalecane) Przełączasz synchronizację kont z na . Co chcesz zrobić z istniejącymi zakładkami, historią, hasłami i innymi ustawieniami? Strony internetu rzeczy w pobliżu Wersja na urządzenia mobilne diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb index 95bf3a67c4e01..dcb01a8b6f6c3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-BR.xtb @@ -75,7 +75,6 @@ Ative a permissão para o Chrome nas configurações do Android. Salvar senhas Criptografar tudo com senha do Google a partir de -Controle a maneira como o Google usa seu histórico de navegação para personalizar a Pesquisa e outros serviços do Google. Atualize seus detalhes de login. Avançado Favoritos do Chrome Dev @@ -100,7 +99,7 @@ , aplicativo da Web. Refinar A seleção de certificado do cliente não é compatível com o sistema operacional. -Arraste o controle deslizante até que você possa ler confortavelmente. O texto deve ter pelo menos este tamanho após um toque duplo em um parágrafo. +Arraste o controle deslizante até a leitura ficar confortável. Depois de um toque duplo em um parágrafo, o texto deve ficar pelo menos deste tamanho. Dispositivos próximos a você estão transmitindo páginas da Web por Bluetooth. O Chrome procurará e exibirá páginas quando você ativar seu dispositivo. Elas passarão por um serviço do Google para melhorar a qualidade dos resultados de páginas. É possível controlar a Web física nas configurações do Chrome. @@ -129,6 +128,7 @@ Visualização expandida. Clique para recolher Versão mais recente disponível Espaçamento uniforme +Permitir JavaScript para um site específico. Seus pais ajudam a gerenciar essas configurações. Enviar Sair @@ -152,6 +152,7 @@ Endereços Permitir que os sites salvem e leiam dados de cookies (recomendado) Esta conta é gerenciada por e . +Para ver as guias dos seus outros dispositivos, ative a opção "Sincronizar dados automaticamente" nas configurações de conta do Android. Copyright Google Inc. Todos os direitos reservados. Leitor de certificados Criar senha longa @@ -188,6 +189,7 @@ Você está fazendo login com uma conta gerenciada e fornecendo ao administrador da conta o controle sobre seu perfil do Google Chrome. Seus dados do Chrome serão permanentemente vinculados a esta conta. Se você se desconectar desta conta, os dados locais do Chrome serão excluídos. Compartilhar imagem +Perguntar antes de permitir que sites saibam seu local (recomendado) Falha no download de devido a erros do sistema de arquivos. Tamanho: Ativar @@ -240,6 +242,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para Idioma de tradução: Licenças de código aberto A Navegação GPS está bloqueada: +Ocorreu um erro de sincronização. Toque para ver detalhes. Copiar endereço do link Nunca traduzir Mídia @@ -254,6 +257,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para Navegue mais por menos Adicionado como favorito em As futuras páginas da Web física nas proximidades serão exibidas na sua lista de notificações +Perguntar antes de permitir que sites usem sua câmera (recomendado) Geração de chaves Somente uma pessoa com sua senha longa pode ler seus dados criptografados. A senha longa não é enviada ou armazenada pelo Google. Se você esquecer sua senha longa ou desejar alterar essa configuração, será necessário redefinir a sincronização. Saiba mais {DAYS,plural, =1{# dia atrás}one{# dias atrás}other{# dias atrás}} @@ -272,6 +276,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para As guias serão movidas para um alternador de guias dentro do Google Chrome. Um recurso importante e necessário para a execução do Google Chrome está ausente. Isso acontece porque a instalação do Google Chrome não foi concluída ou porque ele não é compatível com esta versão do Android. Imagens e arquivos armazenados em cache +Adicione uma Conta do Google na página de Contas do app Config. do seu dispositivo. Abrir no Atualizar Última sincronização: @@ -323,6 +328,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para Salvar Configurações parentais Nome +Permitir que sites executem o JavaScript (recomendado) excluído O acesso a locais também está desativado para este dispositivo. Nunca enviar @@ -359,6 +365,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para Guias anônimas Descrição: Deseja substituir o existente em ? +Controle a maneira como o Google usa seu histórico de navegação para personalizar a Pesquisa do Google, anúncios e outros serviços nossos. Permissões {HOURS,plural, =1{# hora atrás}one{# horas atrás}other{# horas atrás}} Parear @@ -367,6 +374,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para Economia de dados ativada Desativado Senhas salvas +Perguntar antes de permitir que sites entrem no modo de tela cheia (recomendado) Criar novo arquivo Os dados locais armazenados por este site serão excluídos, inclusive os cookies. Google Tradutor @@ -391,6 +399,7 @@ Para ajustar seu termo de pesquisa, mantenha-o pressionado para selecionar. Para País/região Economia de dados de Saiba mais +Adicionar site às exceções Exceções A ativação de "Não rastrear" significa que uma solicitação será incluída no tráfego de navegação. Todo efeito depende de um website responder à solicitação e de como a solicitação é interpretada. @@ -452,6 +461,7 @@ Por exemplo, alguns websites podem responder a esta solicitação mostrando anú Acessibilidade Comprar aplicativo na Google Play Store: Informar automaticamente ao Google detalhes de possíveis incidentes de segurança. +Perguntar antes de permitir que sites usem o microfone (recomendado) Confirmar Conta do Google O download de foi concluído Abrir no navegador @@ -482,7 +492,7 @@ Por exemplo, alguns websites podem responder a esta solicitação mostrando anú Não URL Não é possível transmitir vídeo devido a restrições do site -Veja suas guias com outros aplicativos recentes na tela "Visão geral" do seu smartphone. +Veja as abas e telas de outros apps na Visão Geral do aparelho. Acesse as Configurações para controlar como isso funciona. Perguntar primeiro Sair do Google Chrome Isso limpa os dados sincronizados de todos os dispositivos. As configurações salvas em sites não são excluídas e podem refletir seus hábitos de navegação. Saiba mais @@ -514,6 +524,7 @@ Por exemplo, alguns websites podem responder a esta solicitação mostrando anú Entrega Carregar original Ver o que está nas proximidades +Sempre permitido Adicionar endereço Mover Confirmar senha @@ -558,6 +569,7 @@ Por exemplo, alguns websites podem responder a esta solicitação mostrando anú Permitir (para pesquisas na barra de endereço) Sincronizando com Guias padrão +Permite a sincronização em segundo plano para um site específico. Atualize o TalkBack para receber uma versão mais nova. Somente sites aprovados Mostrar histórico completo @@ -591,6 +603,7 @@ Para receber novas licenças, conecte-se à Internet e use seu conteúdo baixado Controlar como esse recurso funciona nas Configurações Favoritos fez o login. Fazer o login com mescla dados sincronizados, por exemplo, os favoritos, entre as contas. Para manter as informações separadas, limpe os dados de navegação em "Configurações". +Impedir que sites exibam pop-ups (recomendado) Endereço de entrega , guia Armazenamento @@ -620,6 +633,7 @@ Para receber novas licenças, conecte-se à Internet e use seu conteúdo baixado Senha necessária Redefinir as credenciais do dispositivo Mostrar original +Perguntar antes de permitir que sites enviem notificações (recomendado) Você está trocando de contas de sincronização de para . O que deseja fazer com os favoritos, histórico, senhas e outras configurações já existentes? Páginas da Web física nas proximidades Visualização otimizada para dispositivos móveis diff --git a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb index a16c9187f6491..97d9a33ed93c3 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_pt-PT.xtb @@ -75,7 +75,6 @@ Tem de ter a Localização e o Bluetooth ativados para poder utilizar a Web fís Ative a autorização para o Chrome nas Definições do Android. Guardar palavras-passe Encriptar tudo com uma palavra-passe do Google a partir de -Controle a forma como a Google utiliza o seu histórico de navegação para personalizar a Pesquisa Google e outros serviços Google. Atualize os detalhes de início de sessão. Avançadas Marcadores do Chrome Dev @@ -129,6 +128,7 @@ Pode controlar a Web física nas Definições do Chrome. Expandido. Clique para reduzir. Versão mais recente dispon. Monoespaço +Permitir JavaScript num site específico. Os teus pais ajudam a gerir estas definições. Submeter Sair @@ -152,6 +152,7 @@ Pode controlar a Web física nas Definições do Chrome. Endereços Permitir que os sites guardem e leiam dados de cookies (recomendado) Esta conta é gerida por e por . +Para obter os separadores dos seus outros dispositivos, ative a opção "Sincronizar automaticamente os dados" nas definições da conta do Android. Copyright Google Inc. Todos os direitos reservados. Visualizador de certificados Criar frase de acesso @@ -188,6 +189,7 @@ Pode controlar a Web física nas Definições do Chrome. Está a iniciar sessão com uma conta gerida e a atribuir ao respetivo administrador controlo sobre o seu perfil do Chrome. Os seus dados do Chrome ficarão associados permanentemente a esta conta. Desassociar esta conta irá eliminar os dados locais do Chrome. Partilhar imagem +Perguntar antes de permitir que os sites conheçam a sua localização (recomendado) A transferência de falhou devido a erros do sistema de ficheiros. Tamanho: Ativar @@ -240,6 +242,7 @@ Para ajustar o termo de pesquisa, prima continuamente para selecionar. Para refi Idioma de tradução: Licenças de código aberto A navegação está bloqueada: +Ocorreu um erro de sincronização. Toque para obter mais detalhes. Copiar endereço do link Nunca traduzir de Multimédia @@ -254,6 +257,7 @@ Para ajustar o termo de pesquisa, prima continuamente para selecionar. Para refi Navegar mais por menos Adicionado aos marcadores em As páginas da Web física próximas encontradas no futuro são apresentadas na lista de notificações +Perguntar antes de permitir que os sites utilizem a câmara (recomendado) Geração de chaves Apenas alguém que conheça a sua frase de acesso pode ler os seus dados encriptados. A frase de acesso não é enviada para a Google nem armazenada pela mesma. Se se esquecer da frase de acesso ou pretender alterar esta definição, tem de repor a sincronização. Saiba mais {DAYS,plural, =1{Há # dia}other{Há # dias}} @@ -272,6 +276,7 @@ Para ajustar o termo de pesquisa, prima continuamente para selecionar. Para refi Os separadores são movidos para um comutador de separadores no Chrome. Uma funcionalidade crítica, necessária para executar o Chrome, está em falta. A instalação do Chrome pode estar incompleta ou não ser compatível com esta versão do Android. Imagens e ficheiros em cache +Adicione uma Conta Google na página Contas na aplicação Definições do dispositivo. Abrir no Actualizar Última sincronização: @@ -323,6 +328,7 @@ Para ajustar o termo de pesquisa, prima continuamente para selecionar. Para refi Guardar Definições parentais Nome +Permitir que os sites executem JavaScript (recomendado) eliminado O acesso à localização também está desativado neste dispositivo. Nunca enviar @@ -360,6 +366,7 @@ No entanto, a navegação não é invisível. Passar para o modo de navegação Separadores de navegação anónima Descrição: Pretende substituir o ficheiro existente no diretório ? +Controle a forma como a Google utiliza o seu histórico de navegação para personalizar a Pesquisa Google, os anúncios e outros serviços Google. Permissões {HOURS,plural, =1{Há # hora}other{Há # horas}} Sincronizar @@ -368,6 +375,7 @@ No entanto, a navegação não é invisível. Passar para o modo de navegação Poupança de dados ativada Desativado Palavras-passe guardadas +Perguntar antes de permitir que os sites entrem no modo de ecrã inteiro (recomendado) Criar novo ficheiro Todos os dados armazenados por este Website, incluindo cookies, são eliminados. Google Tradutor @@ -392,6 +400,7 @@ No entanto, a navegação não é invisível. Passar para o modo de navegação País/região de poupança de dados Saiba mais +Adicionar exceção de site Excepções A ativação da funcionalidade "Não Monitorizar" significa que é incluído um pedido no seu tráfego de navegação. Qualquer efeito depende de um Website responder ou não ao pedido e do modo como o pedido é interpretado. @@ -453,6 +462,7 @@ Por exemplo, alguns Websites podem responder a este pedido ao mostrar-lhe anúnc Acessibilidade Obter a aplicação na Google Play Store: Comunicar automaticamente detalhes de possíveis incidentes de segurança à Google +Perguntar antes de permitir que os sites utilizem o microfone (recomendado) Confirmar Conta Google transferido Abrir no navegador @@ -515,6 +525,7 @@ A sua Conta Google pode ter outras formas do histórico de navegação, como pes Envio Carregar original Ver o que há nas proximidades +Sempre permitido Adicionar endereço Mover Confirmar frase de acesso @@ -559,6 +570,7 @@ A sua Conta Google pode ter outras formas do histórico de navegação, como pes Permitir (para pesquisas na barra de endereço) A sincronizar com Separadores padrão +Permitir Sincronização em segundo plano num site específico. Tem de atualizar o TalkBack para uma versão mais recente. Apenas sites aprovados Mostrar histórico completo @@ -593,6 +605,7 @@ Para obter licenças novas, ligue-se à Internet e reproduza o conteúdo transfe Controle esta funcionalidade nas Definições Marcadores iniciou sessão. Ao iniciar sessão com , irá unir os dados sincronizados, tais como marcadores, entre contas. Para manter as informações separadas, limpe os dados de navegação nas definições. +Impedir a apresentação de pop-ups por parte dos sites (recomendado) Endereço para envio Separador Armazenamento @@ -622,6 +635,7 @@ Para obter licenças novas, ligue-se à Internet e reproduza o conteúdo transfe Frase de acesso obrigatória Repor as credenciais do dispositivo Mostrar original +Perguntar antes de permitir que os sites enviem notificações (recomendado) Está a mudar as contas de sincronização de para . O que pretende fazer com os seus marcadores, histórico, palavras-passe e outras definições existentes? Páginas da Web física próximas Visualização compatível com dispositivos móveis diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb index 7802a78f5e26c..ea8209096c3fb 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb @@ -75,7 +75,6 @@ Pentru a folosi Webul material, trebuie să activezi Bluetooth și Locația.Activează permisiunea pentru Chrome din Setări Android. Parole salvate Criptează toate datele folosind parola Google din data de -Controlează cum poate folosi Google istoricul de navigare pentru a personaliza Căutarea și alte servicii Google. Actualizați detaliile de conectare. Avansate Marcaje Chrome Dev @@ -129,6 +128,7 @@ Poți să controlezi Webul material din Setările Chrome. Afișare extinsă – dă clic pentru a restrânge. Este disponibilă o versiune mai nouă Un singur spațiu +Permite JavaScript pentru un anumit site. Părinții tăi gestionează aceste setări. Trimite Ieși @@ -152,6 +152,7 @@ Poți să controlezi Webul material din Setările Chrome. Adrese Permite site-urilor să salveze și să citească datele asociate cookie-urilor (recomandat) Acest cont este gestionat de și de . +Pentru a accesa filele de pe alte dispozitive, activează opțiunea „Sincronizează automat datele” în setările Android din Contul Google. Copyright Google Inc. Toate drepturile rezervate. Vizualizator de certificate Creează o expresie de acces @@ -188,6 +189,7 @@ Poți să controlezi Webul material din Setările Chrome. Urmează să vă conectați cu un cont gestionat și să acordați administratorului control asupra profilului Chrome. Datele din Chrome vor fi asociate definitiv acestui cont. Dacă vă deconectați de la acest cont, datele locale Chrome se vor șterge. Trimite imaginea +Întreabă înainte de a permite site-urilor să afle locația (recomandat) Descărcarea fișierului nu a reușit din cauza unor erori privind sistemul de fișiere. Dimensiune: Activează @@ -240,6 +242,7 @@ Pentru a ajusta termenii căutării, apasă lung pentru a selecta. Pentru a rafi Limba traducerii: Licențe open source Navigarea este blocată: +A apărut o eroare la sincronizare. Atinge pentru a primi detaliile. Copiați adresa linkului Nu traduce niciodată din Media @@ -254,6 +257,7 @@ Pentru a ajusta termenii căutării, apasă lung pentru a selecta. Pentru a rafi Navighează mai mult plătind mai puțin Marcaj adăugat în Pe viitor, paginile din apropiere care fac parte din Webul material vor fi afișate în lista de notificări +Întreabă înainte de a permite site-urilor să folosească camera foto (recomandat) Generarea cheilor Numai un utilizator care are expresia de acces poate citi datele criptate. Expresia de acces nu este trimisă sau stocată la Google. Dacă uiți expresia de acces sau dorești să modifici această setare, va fi necesar să resetezi sincronizarea. Află mai multe {DAYS,plural, =1{Acum # zi}few{Acum # zile}other{Acum # de zile}} @@ -272,6 +276,7 @@ Pentru a ajusta termenii căutării, apasă lung pentru a selecta. Pentru a rafi Filele vor fi mutate într-un comutator de file din Chrome. Lipsește o funcție esențială pentru a rula Chrome; fie instalarea Chrome este incompletă, fie nu este compatibilă cu această versiune de Android. Imaginile și fișierele memorate în cache +Adaugă un Cont Google din pagina Conturi din aplicația Setări a dispozitivului. Deschide în Actualizează Ultima sincronizare: @@ -323,6 +328,7 @@ Pentru a ajusta termenii căutării, apasă lung pentru a selecta. Pentru a rafi Salvează Setări parentale Nume +Permite site-urilor să ruleze JavaScript (recomandat) a fost șters Accesul la locație este dezactivat și pe acest dispozitiv. Nu trimite niciodată @@ -360,6 +366,7 @@ Totuși, nu ești invizibil(ă). Trecerea în modul incognito nu ascunde activit File incognito Descriere: Dorești să înlocuiești fișierul existent din ? +Stabilește cum poate folosi Google istoricul de navigare pentru a personaliza Căutarea, anunțurile și alte servicii Google. Permisiuni {HOURS,plural, =1{Acum # oră}few{Acum # ore}other{Acum # de ore}} Asociază @@ -368,6 +375,7 @@ Totuși, nu ești invizibil(ă). Trecerea în modul incognito nu ascunde activit Economizorul de date este activat Dezactivat Parole salvate +Întreabă înainte de a permite site-urilor să inițieze modul ecran complet (recomandat) Creează un fișier Toate datele stocate de site, inclusiv cookie-urile vor fi șterse. Google Traducere @@ -392,6 +400,7 @@ Totuși, nu ești invizibil(ă). Trecerea în modul incognito nu ascunde activit Țară/Regiune Economie de date de Află mai multe +Adaugă o excepție privind site-urile Excepții Dacă activezi opțiunea „Nu urmări”, o solicitare va fi inclusă împreună cu traficul de navigare. Efectul variază în funcție de răspunsul site-ului la solicitare și în funcție de modul în care este interpretată solicitarea. @@ -453,6 +462,7 @@ De exemplu, unele site-uri pot răspunde la această solicitare afișând anunț Accesibilitate Descarcă aplicația din Magazinul Google Play: Raportează automat la Google detaliile eventualelor incidente privind securitatea +Întreabă înainte de a permite site-urilor să folosească microfonul (recomandat) Confirmă Contul Google Fișierul a fost descărcat Deschide în browser @@ -515,6 +525,7 @@ Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi Expediere Încarcă versiunea originală Vezi ce este în apropiere +Permis întotdeauna Adaugă o adresă Mută Confirmă expresia de acces @@ -559,6 +570,7 @@ Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi Permite (pentru căutările din bara de adrese) Se sincronizează cu File standard +Permite sincronizarea în fundal pentru un anumit site. Trebuie să actualizați TalkBack la o versiune mai nouă. Numai site-uri aprobate Afișați întregul istoric @@ -593,6 +605,7 @@ Pentru licențe noi, conectează-te la internet și redă conținutul descărcat Controlează cum funcționează din Setări Marcaje era conectat. Dacă te conectezi cu , datele sincronizate din conturi, cum ar fi marcajele, vor fi îmbinate. Pentru ca informațiile să rămână separate, șterge datele de navigare din setări. +Blochează afișarea ferestrelor pop-up de către site-uri (recomandat) Adresa de expediere , filă Stocare @@ -622,6 +635,7 @@ Pentru licențe noi, conectează-te la internet și redă conținutul descărcat Este necesară o expresie de acces Resetează datele de conectare de pe dispozitiv Afișează originalul +Întreabă înainte de a permite site-urilor să trimită notificări (recomandat) Comuți contul pentru sincronizare de la la . Ce dorești să faci cu marcajele, istoricul, parolele și alte setări existente? Există pagini din Webul material în apropiere Vizualizare adecvată pentru dispozitivele mobile diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb index 9ce89674d2da4..c4f5220678659 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb @@ -75,7 +75,6 @@ Разрешение для Chrome можно предоставить в настройках Android. Сохранение паролей Зашифровать все с помощью пароля аккаунта Google с -Укажите, как Google может использовать историю просмотров для персонализации Поиска и других сервисов. Обновите учетные данные Дополнительные Закладки Chrome для разработчиков @@ -103,7 +102,7 @@ Перемещайте ползунок, пока текст не станет удобным для чтения. После двойного нажатия на абзац текст должен быть такого размера. Просматривайте веб-страницы, связанные с объектами вокруг вас. Chrome будет искать их с помощью Bluetooth, когда ваше устройство разблокировано. Чтобы улучшить работу функции, страницы будут отправляться через сервис Google. -Включить или отключить Интернет вокруг нас можно в настройках Chrome. +Включить или отключить "Интернет вокруг нас" можно в настройках Chrome. Подробнее… Установка… @@ -129,6 +128,7 @@ Развернуто. Нажмите, чтобы свернуть. Доступна новая версия Моноширинный +Разрешить JavaScript для конкретного сайта. Этими настройками управляют родители. Отправить Закрыть @@ -152,6 +152,7 @@ Адреса Разрешить сайтам сохранять и читать файлы cookie (рекомендуется) Этим аккаунтом управляют и . +Чтобы получить доступ к вкладкам на всех ваших устройствах, включите автосинхронизацию данных в настройках аккаунта на устройстве Android. © Google Inc., . Все права защищены. Просмотр сертификатов Придумайте кодовую фразу @@ -188,6 +189,7 @@ Если вы войдете в аккаунт, администратор домена сможет управлять вашим профилем Chrome. Ваши данные будут связаны с этим аккаунтом. Если вы из него выйдете, все данные Chrome будут удалены с устройства. Поделиться изображением +Запрашивать разрешение на доступ к данным о местоположении (рекомендуется) Не удалось скачать файл из-за ошибок файловой системы. Размер: Включить @@ -240,6 +242,7 @@ Перевести на: Лицензии на ПО с открытым кодом Навигация заблокирована: +Ошибка синхронизации. Нажмите, чтобы получить подробную информацию. Копировать адрес ссылки Никогда не переводить Камера и микрофон @@ -254,6 +257,7 @@ Разумная экономия Закладка добавлена в папку "" Страницы из Интернета вокруг нас будут показываться в списке оповещений. +Запрашивать разрешение на доступ к камере (рекомендуется) Создание ключей Ваши зашифрованные данные может прочитать только тот, кто знает кодовую фразу. Она не пересылается и не хранится в Google. Если вы забудете фразу или решите изменить эту настройку, вам придется сбросить параметры синхронизации. Подробнее… {DAYS,plural, =1{# день назад}one{# день назад}few{# дня назад}many{# дней назад}other{# дня назад}} @@ -272,6 +276,7 @@ Каждая вкладка будет отображаться внутри Chrome, а не в виде отдельных окон в списке приложений. Отсутствует функция, необходимая для работы Chrome. Возможно, установка не была завершена или вы используете несовместимую версию Android. Изображения и другие файлы, сохраненные в кеше +Добавьте аккаунт Google в соответствующем разделе настроек устройства. Открыть в Обновление Последняя синхронизация: @@ -323,6 +328,7 @@ Сохранить Родительские настройки Название +Разрешить сайтам использовать JavaScript (рекомендуется) Закладка "" удалена На этом устройстве также открыт доступ к местоположению. Не отправлять @@ -360,6 +366,7 @@ Вкладки в режиме инкогнито Описание: Вы хотите заменить существующий файл "" в папке ""? +Укажите, как Google может использовать историю просмотров для персонализации Поиска, Рекламы и других сервисов. Разрешения {HOURS,plural, =1{# час назад}one{# час назад}few{# часа назад}many{# часов назад}other{# часа назад}} Подключить @@ -368,6 +375,7 @@ Расширение "Экономия трафика" включено Выкл. Сайты с сохраненными паролями +Запрашивать разрешение на переход в полноэкранный режим (рекомендуется) Новый файл Все данные этого веб-сайта, включая файлы cookie, будут удалены. Google Переводчик @@ -392,6 +400,7 @@ Страна/регион Сжатие данных: Подробнее... +Добавить исключение Исключения Если вы запретите отслеживание, в запросы браузера будет включена специальная команда. Сайты могут интерпретировать ее и отвечать на нее по-разному. @@ -453,6 +462,7 @@ Специальные возможности Приложение в Google Play Маркете: Автоматически отправлять в Google информацию о возможных проблемах безопасности +Запрашивать разрешение на доступ к микрофону (рекомендуется) Подтверждение аккаунта Google Файл скачан Открыть в браузере @@ -515,6 +525,7 @@ Адрес доставки Полная версия Узнать, что поблизости +Разрешать всегда Добавить адрес Переместить Подтвердите кодовую фразу @@ -559,6 +570,7 @@ Разрешать (для поиска в адресной строке) Синхронизация с аккаунтом Обычные вкладки +Разрешить фоновую синхронизацию для конкретного сайта. Установите последнюю версию TalkBack. Только одобренные сайты Показать всю историю @@ -593,6 +605,7 @@ Изменить эти параметры можно в настройках Закладки Был выполнен вход в аккаунт . Если вы войдете в аккаунт , синхронизируемые данные (например, закладки) будут объединены. Чтобы этого не произошло, удалите данные о работе в браузере. +Блокировать всплывающие окна на сайтах (рекомендуется) Адрес доставки Вкладка "" Хранилище @@ -622,6 +635,7 @@ Необходима кодовая фраза Сбросить учетные данные Показать оригинал +Запрашивать разрешение на отправку уведомлений (рекомендуется) Вы переключаетесь с синхронизируемого аккаунта на . Что нужно сделать с текущими закладками, паролями, историей и другими настройками? Веб-страницы из Интернета вокруг нас Адаптировано для мобильных устройств diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb index ec798375e8155..1394293988498 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb @@ -75,7 +75,6 @@ Ak chcete používať Fyzický web, musíte mať zapnuté rozhranie Bluetooth a Zapnite povolenie pre Chrome v nastaveniach Androidu. Ukladanie hesiel Šifrovať všetko pomocou hesla Google od -Ovládajte, ako Google môže používať vašu históriu prehliadania na prispôsobenie Vyhľadávania a ďalších služieb Google. Aktualizujte svoje prihlasovacie údaje. Rozšírené Záložky Chrome Dev @@ -129,6 +128,7 @@ Predvoľby Fyzického webu môžete ovládať v Nastaveniach Chromu. Rozbalená (zbalíte ju kliknutím) Je dostupná novšia verzia Neproporcionálne +Povoliť JavaScript pre konkrétny web. Vaši rodičia vám pomôžu spravovať tieto nastavenia. Odoslať Opustiť @@ -152,6 +152,7 @@ Predvoľby Fyzického webu môžete ovládať v Nastaveniach Chromu. Adresy Povoliť stránkam ukladať a čítať údaje súborov cookie (odporučané) Tento účet je spravovaný používateľmi a . +Ak chcete získať karty z vašich ďalších zariadení, zapnite v nastaveniach účtu Android možnosť Automaticky synchronizovať dáta. Copyright Google Inc. Všetky práva vyhradené. Zobrazovač certifikátov Vytvorenie prístupovej frázy @@ -188,6 +189,7 @@ Predvoľby Fyzického webu môžete ovládať v Nastaveniach Chromu. Prihlasujete sa pomocou spravovaného účtu a jeho správcovi tak umožňujete úplnú kontrolu nad vaším profilom Chrome. Vaše údaje prehliadača Chrome sa natrvalo prepoja s týmto účtom. Po odpojení tohto účtu sa odstránia miestne údaje prehliadača Chrome. Zdieľať obrázok +Opýtať sa pred povolením webu zistiť vašu polohu (odporúčané) Súbor sa nepodarilo stiahnuť z dôvodu chýb systému súborov. Veľkosť: Aktivovať @@ -240,6 +242,7 @@ Ak chcete upraviť hľadaný výraz, vyberte ho dlhým stlačením. Ak chcete vy Jazyk prekladu: Licencie open source Navigácia je zablokovaná: +Došlo k chybe synchronizácie. Podrobnosti získate klepnutím. Kopírovať adresu odkazu Nikdy neprekladať jazyk Médiá @@ -254,6 +257,7 @@ Ak chcete upraviť hľadaný výraz, vyberte ho dlhým stlačením. Ak chcete vy Prehliadajte viac a za menej peňazí Uložené ako záložka v priečinku Budúce stránky Fyzického webu v okolí sa budú zobrazovať vo vašom zozname upozornení +Opýtať sa pred povolením webu používať vašu kameru (odporúčané) Generovanie kľúčov Šifrované údaje môže čítať iba používateľ s prístupovou frázou. Prístupová fráza sa do Googlu neodosiela a Google ju ani neukladá. Ak zabudnete prístupovú frázu alebo budete chcieť zmeniť toto nastavenie zmeniť, musíte resetovať synchronizáciu. Ďalšie informácie {DAYS,plural, =1{pred # dňom}few{pred # dňami}many{pred # dňom}other{pred # dňami}} @@ -272,6 +276,7 @@ Ak chcete upraviť hľadaný výraz, vyberte ho dlhým stlačením. Ak chcete vy Karty sa presunú na prepínač kariet v prehliadači Chrome. Chýba nevyhnutná funkcia na spustenie aplikácie Chrome. Inštalácia aplikácie Chrome sa nedokončila alebo aplikácia nie je kompatibilná s touto verziou Androidu. Obrázky a súbory vo vyrovnávacej pamäti +Pridajte účet Google zo stránky Účty v aplikácii Nastavenia na vašom zariadení. Otvoriť v aplikácii Aktualizovať Posledná synchronizácia: @@ -323,6 +328,7 @@ Ak chcete upraviť hľadaný výraz, vyberte ho dlhým stlačením. Ak chcete vy Uložiť Rodičovské nastavenia Názov +Povoliť webom spúšťať JavaScript (odporúča sa) Záložka bola odstránená Prístup k polohe je vypnutý aj v tomto zariadení. Nikdy neodosielať @@ -360,6 +366,7 @@ Nie ste však neviditeľný/-á. Používanie režimu inkognito neukryje vaše p Karty inkognito Popis: Chcete nahradiť existujúci súbor v adresári ? +Ovládajte, ako Google môže používať vašu históriu prehliadania na prispôsobenie Vyhľadávania, reklám a ďalších služieb Google. Povolenia {HOURS,plural, =1{pred # hodinou}few{pred # hodinami}many{pred # hodinou}other{pred # hodinami}} Párovať @@ -368,6 +375,7 @@ Nie ste však neviditeľný/-á. Používanie režimu inkognito neukryje vaše p Šetrič dát je zapnutý Vypnuté Uložené heslá +Opýtať sa pred povolením webu prejsť do režimu celej obrazovky (odporúčané) Vytvoriť nový súbor Všetky miestne údaje uložené týmito stránkami (vrátane súborov cookie) budú odstránené. Prekladač Google @@ -392,6 +400,7 @@ Nie ste však neviditeľný/-á. Používanie režimu inkognito neukryje vaše p Krajina alebo oblasť Úspora dát: Viac informácií +Pridať výnimku pre web Výnimky Ak povolíte možnosť Nesledovať, k odosielaným dátam prehliadania sa pridá žiadosť. Akýkoľvek účinok závisí od toho, či bude web na žiadosť reagovať, a tiež od interpretácie žiadosti. @@ -453,6 +462,7 @@ Niektoré weby môžu napríklad na túto žiadosť reagovať tak, že vám zobr Dostupnosť Získať aplikáciu z Obchodu Google Play: Automaticky hlásiť podrobnosti o možných problémoch so zabezpečením spoločnosti Google +Opýtať sa pred povolením webu používať váš mikrofón (odporúčané) Potvrdenie účtu Google Súbor je stiahnutý Otvoriť v prehliadači @@ -515,6 +525,7 @@ Váš účet Google môže mať na adrese history.google Dodacia Načítať originál Zobraziť webové stránky v okolí +Vždy povolené Pridať adresu Presunúť Potvrďte prístupovú frázu @@ -559,6 +570,7 @@ Váš účet Google môže mať na adrese history.google Povoliť (pre vyhľadávania v paneli s adresou) Synchronizácia do účtu Štandardné karty +Povolenie synchronizácie na pozadí na konkrétnom webe. Aplikáciu TalkBack je potrebné aktualizovať na novšiu verziu. Iba schválené stránky Zobraziť celú históriu @@ -591,6 +603,7 @@ Váš účet Google môže mať na adrese history.google Túto funkciu môžete ovládať v Nastaveniach Záložky Prihlásili ste sa pomocou účtu . Po prihlásení pomocou účtu sa v rámci účtov zlúčia synchronizované údaje (napr. záložky). Ak chcete údaje uchovávať oddelene, vymažte údaje prehliadania v Nastaveniach. +Blokovať na weboch zobrazovanie kontextových okien (odporúčané) Dodacia adresa , karta Úložisko @@ -620,6 +633,7 @@ Váš účet Google môže mať na adrese history.google Vyžaduje sa prístupová fráza Obnoviť prihlasovacie poverenia zariadenia Zobraziť originál +Opýtať sa pred povolením webu odosielať upozornenia (odporúčané) Účet na synchronizáciu prepínate na účet . Čo chcete urobiť s vašimi existujúcimi záložkami, históriou, heslami a ďalšími nastaveniami? Stránky Fyzického webu v okolí Zobrazenie pre mobil diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb index fc730ec0fc292..8fb385009f2a4 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb @@ -75,7 +75,6 @@ V nastavitvah za Android vklopite dovoljenje za Chrome. Shranjevanje gesel Šifriranje vsega z geslom za Google Račun z dne -Nadzirajte, kako Google na podlagi vaše zgodovine brskanja prilagaja Iskanje Google in druge Googlove storitve. Posodobite podrobnosti prijave. Dodatno Zaznamki iz Chroma Dev @@ -129,6 +128,7 @@ Fizični splet lahko nadzirate v Chromovih nastavitvah. Razširjeno – kliknite, če želite strniti. Na voljo je nov. različica Stalna širina +Dovoli JavaScript za določeno spletno mesto. Te nastavitve pomagajo upravljati vaši starši. Pošlji Zapusti @@ -152,6 +152,7 @@ Fizični splet lahko nadzirate v Chromovih nastavitvah. Naslovi Dovoli spletnim mestom shranjevanje in branje podatkov piškotkov (priporočljivo) Ta računa upravljata in . +Če želite dostopati do zaznamkov iz drugih naprav, v nastavitvah računa za Android vklopite »Samodejno sinhroniziraj podatke«. Copyright  Google Inc. Vse pravice pridržane. Pregledovalnik potrdil Ustvarjanje gesla @@ -188,6 +189,7 @@ Fizični splet lahko nadzirate v Chromovih nastavitvah. Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nadziranje vašega profila v Google Chromu. Vaši podatki v Google Chromu bodo trajno povezani s tem računom. Če prekinete povezavo s tem računom, se izbrišejo lokalni podatki v Google Chromu. Skupna raba slike +Poziv, preden se spletnim mestom razkrije vaša lokacija (priporočeno) Prenos datoteke ni uspel zaradi napak v datotečnem sistemu. Velikost: Omogoči @@ -240,6 +242,7 @@ Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nad Jezik prevoda: Odprtokodne licence Krmarjenje je blokirano: +Prišlo je do napake pri sinhronizaciji. Če želite podrobnosti, se dotaknite. Kopiraj naslov povezave Nikoli ne prevedi iz jezika Predstavnosti @@ -254,6 +257,7 @@ Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nad Brskajte več za manj Zaznamek ustvarjen v mapi Prihodnje strani za Fizični splet v bližini bodo prikazane na seznamu obvestil. +Poziv, preden se spletnim mestom dovoli uporaba kamere (priporočeno) Ustvarjanje ključa Vaše šifrirane podatke lahko bere samo oseba z vašim geslom. Geslo ni poslano Googlu in ni shranjeno v Googlu. Če ga pozabite ali če želite spremeniti to nastavitev, boste morali sinhronizacijo ponastaviti. Več o tem {DAYS,plural, =1{Pred # dnevom}one{Pred # dnevom}two{Pred # dnevoma}few{Pred # dnevi}other{Pred # dnevi}} @@ -272,6 +276,7 @@ Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nad Zavihki bodo premaknjeni v orodje za preklapljanje med zavihki v Chromu. Ni funkcije, ki je nujno potrebna za izvajanje Chroma. Namestitev Chroma je nepopolna ali ni združljiva s to različico Androida. Predpomnjene slike in datoteke +Na strani za račune v aplikaciji Nastavitve dodajte Google Račun. Odpri v: Posodobi Zadnja sinhronizacija: @@ -323,6 +328,7 @@ Prijavljate se z upravljanim računom in s tem njegovemu skrbniku omogočate nad Shrani Starševske nastavitve Ime +Spletnim mestom dovoli izvajanje JavaScripta (priporočeno) Izbrisano: Dostop do lokacije je prav tako izklopljen za to napravo. Nikoli ne pošlji @@ -360,6 +366,7 @@ Kljub temu niste nevidni. Če uporabljate način brez beleženja zgodovine, ne s Zavihki brez beleženja zgodovine Opis: Ali želite nadomestiti obstoječo datoteko v imeniku ? +Nadzirajte, kako Google na podlagi vaše zgodovine brskanja prilagaja Iskanje Google, oglase in druge Googlove storitve. Dovoljenja {HOURS,plural, =1{Pred # uro}one{Pred # uro}two{Pred # urama}few{Pred # urami}other{Pred # urami}} Seznani @@ -368,6 +375,7 @@ Kljub temu niste nevidni. Če uporabljate način brez beleženja zgodovine, ne s Varčevanje s podatki je omogočeno Izklopljeno Shranjena gesla +Poziv, preden se spletnim mestom dovoli preklop v celozaslonski način (priporočeno) Ustvari novo datoteko Vsi lokalni podatki na tem spletnem mestu, vključno s piškotki, bodo izbrisani. Google Prevajalnik @@ -392,6 +400,7 @@ Kljub temu niste nevidni. Če uporabljate način brez beleženja zgodovine, ne s Država/regija Prihranek pri prenosu podatkov: Več o tem +Dodaj izjemo za spletno mesto Izjeme Če omogočite možnost »Ne sledi«, bo zahteva vključena v vaš promet brskanja. Učinek je odvisen od odziva spletnega mesta na zahtevo in od tega, kako si zahtevo razlaga. @@ -453,6 +462,7 @@ Nekatera spletna mesta se lahko na primer na zahtevo odzovejo tako, da prikažej Pripomočki za osebe s posebnimi potrebami Prenos aplikacije iz Trgovine Google Play: Samodejno poročanje podrobnosti morebitnih varnostnih dogodkov Googlu +Poziv, preden se spletnim mestom dovoli uporaba mikrofona (priporočeno) Potrjevanje Google Računa Datoteka je prenesena Odpiranje v brskalniku @@ -515,6 +525,7 @@ V Google Računu so morda druge vrste zgodovine brskanja, kot so iskanja in deja Pošiljanje Naloži izvirno mesto Ogled strani v bližini +Vedno dovoljeno Dodaj naslov Premakni Potrdi geslo @@ -559,6 +570,7 @@ V Google Računu so morda druge vrste zgodovine brskanja, kot so iskanja in deja Omogočeno (za iskanja v naslovni vrstici) Sinhronizacija z računom Standardni zavihki +Dovoli sinhroniziranje v ozadju za določeno spletno mesto. TalkBack morate posodobiti na novejšo različico. Samo odobrena spletna mesta Prikaži celotno zgodovino @@ -593,6 +605,7 @@ Nove licence dobite tako, da se povežete v internet in predvajate preneseno vse Delovanje tega lahko nadzirate v nastavitvah. Zaznamki je bil prijavljen. Če se prijavite z računom , bodo sinhronizirani podatki, kot so zaznamki, v obeh računih združeni. Če želite, da ostanejo ločeni, v nastavitvah izbrišite podatke o brskanju. +Spletnim mestom prepreči prikazovanje pojavnih oken (priporočeno) Naslov za pošiljanje , zavihek Shramba @@ -622,6 +635,7 @@ Nove licence dobite tako, da se povežete v internet in predvajate preneseno vse Zahtevano je geslo Ponastavitev poverilnic naprave Pokaži izvirno besedilo +Poziv, preden se spletnim mestom dovoli pošiljanje obvestil (priporočeno) Z računa za sinhronizacijo boste preklopili na račun . Kaj želite storiti z obstoječimi zaznamki, zgodovino, gesli in drugimi nastavitvami? Strani za Fizični splet v bližini Pogled, prilagojen za mobilne naprave diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb index e9b8d18fd3168..a711d3cf6a6f1 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb @@ -75,7 +75,6 @@ Укључите дозволу за Chrome у Android подешавањима. Сачувај лозинке Шифруј све помоћу Google лозинке од -Контролишите како Google користи историју прегледања за персонализацију Претраге и других Google услуга Ажурирајте податке за пријављивање. Напредне опције Chrome Dev обележивачи @@ -129,6 +128,7 @@ Проширено је – Кликните да бисте скупили. Доступна је новија верзија Фиксне ширине +Дозволите JavaScript за одређени сајт. Родитељи помажу у управљању овим подешавањима. Пошаљи Напусти @@ -152,6 +152,7 @@ Адресе Дозволи сајтовима да чувају и читају податке колачића (препоручује се) Овим налогом управљају и . +Да би вам картице биле доступне на другим уређајима, укључите опцију „Аутоматски синхронизуј податке“ у Android подешавањима на налогу. Ауторска права . Google Inc. Сва права задржана. Приказивач сертификата Направите приступну фразу @@ -188,6 +189,7 @@ Пријављујете се помоћу управљаног налога и дајете администратору контролу над Chrome профилом. Chrome подаци ће постати трајно повезани са овим налогом. Ако прекинете везу са овим налогом, избрисаћете локалне Chrome податке. Дели слику +Питај пре него што дозволиш сајтовима да знају локацију (препоручено) Преузимање датотеке није успело због грешака система датотека. Величина: Омогући @@ -240,6 +242,7 @@ Језик на који се преводи: Лиценце отвореног кода Навигација је блокирана: +Дошло је до грешке у синхронизацији. Додирните да бисте добили детаље. Копирај адресу линка Никада не преводи Медији @@ -254,6 +257,7 @@ Прегледајте више за мање Обележивач је додат у Будуће странице Интернета око нас у околини ће се приказивати у листи обавештења +Питај пре него што дозволиш сајтовима да користе камеру (препоручено) Генерисање шифара Само неко ко има приступну фразу може да чита шифроване податке. Google не шаље нити чува приступну фразу. Ако заборавите приступну фразу или желите да промените ово подешавање, мораћете да ресетујете синхронизацију. Сазнајте више {DAYS,plural, =1{Пре # дана}one{Пре # дана}few{Пре # дана}other{Пре # дана}} @@ -272,6 +276,7 @@ Картице ће бити премештене у пребацивач картица у оквиру Chrome-а. Недостаје функција од критичне важности потребна за покретање Chrome-а; или инсталација Chrome-а није комплетна или није компатибилна са овом верзијом Android-а. Кеширане слике и датотеке +Додајте Google налог са странице Налози у апликацији Подешавања на уређају. Отвори у Ажурирај Последња синхронизација: @@ -323,6 +328,7 @@ Сачувај Родитељска подешавања Назив +Дозволи сајтовима да покрећу JavaScript (препоручено) Обележивач је избрисан Приступ локацији је искључен и за овај уређај. Никада не шаљи @@ -360,6 +366,7 @@ Картице без архивирања Опис: Желите ли да замените постојећу датотеку у директоријуму ? +Контролишите како Google користи историју прегледања за персонализацију Претраге, огласа и других Google услуга. Дозволе {HOURS,plural, =1{Пре # сата}one{Пре # сата}few{Пре # сата}other{Пре # сати}} Упари @@ -368,6 +375,7 @@ Уштеда података је омогућена Искључено Сачуване лозинке +Питај пре него што дозволиш сајтовима да уђу у режим целог екрана (препоручено) Направи нову датотеку Сви локални подаци које овај веб-сајт чува, укључујући колачиће, биће избрисани. Google преводилац @@ -392,6 +400,7 @@ Земља/регија уштеде података Сазнајте више +Додај изузетак за сајтове Изузеци Ако омогућите функцију „Не прати“, захтев ће бити обухваћен саобраћајем прегледања. Последица те радње зависи од тога да ли веб-сајт одговара на захтев и како се захтев тумачи. @@ -453,6 +462,7 @@ Приступачност Преузмите апликацију из Google Play продавнице: Аутоматски пријави Google-у детаље о могућим безбедносним инцидентима +Питај пре него што дозволиш сајтовима да користе микрофон (препоручено) Потврдите Google налог Преузели сте Отвори у прегледачу @@ -515,6 +525,7 @@ Google налог можда има друге облике историје п Испорука Учитај оригинал Прикажи шта је у околини +Увек дозвољено Додајте адресу Премести Потврди приступну фразу @@ -522,7 +533,7 @@ Google налог можда има друге облике историје п Додај Не, хвала Приступа се аудио улазу -Дошло је до грешке при обради захтева. Проверите налог и покушајте поново. +Дошло је до грешке при обради захтева. Проверите податке и покушајте поново. Открива и репродукује важне медијске датотеке за одређени сајт. Откажи избор Други уређаји @@ -559,6 +570,7 @@ Google налог можда има друге облике историје п Дозволите (за претраге у траци за адресу) Синхронизује се са Стандардне картице +Дозволите Синхронизацију у позадини за одређени сајт. Морате да ажурирате TalkBack на новију верзију. Само одобрени сајтови Прикажи сву историју @@ -593,6 +605,7 @@ Google налог можда има друге облике историје п Контролишите како ово функционише у Подешавањима Обележивачи је био пријављен/а. Ако се пријавите користећи , објединићете синхронизоване податке, попут обележивача, са више налога. Да би информације остале одвојене, обришите податке прегледања у подешавањима. +Блокирај сајтове тако да не приказују искачуће прозоре (препоручено) Адреса за слање , картица Меморијски простор @@ -622,6 +635,7 @@ Google налог можда има друге облике историје п Потребна је приступна фраза Ресетуј акредитиве уређаја Прикажи оригинал +Питај пре него што дозволиш сајтовима да шаљу обавештења (препоручено) Мењате налог за синхронизацију из у . Шта желите да урадите са постојећим обележивачима, историјом, лозинкама и другим подешавањима? Странице Интернета око нас у околини Приказ за мобилне уређаје diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb index 6978410c4f37b..545d7c6367c23 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb @@ -75,7 +75,6 @@ Bluetooth och Plats måste vara aktiverade om du vill använda Physical Web-tjä Aktivera behörighet för Chrome i Android-inställningar. Spara lösenord Kryptera alla med Google-lösenordet från -Styr hur Google anpassar Sök och andra Google-tjänster utifrån webbhistoriken. Uppdatera dina inloggningsuppgifter. Avancerat Bokmärken i Chrome Dev @@ -129,6 +128,7 @@ Du kan styra Physical Web i inställningarna för Chrome Vyn har expanderats. Komprimera den genom att klicka. Det finns en nyare version Monospace +Tillåt Javascript på en specifik webbplats. Dina föräldrar hanterar de här inställningarna åt dig. Skicka Lämna @@ -142,7 +142,7 @@ Du kan styra Physical Web i inställningarna för Chrome Inga Bluetooth-enheter hittades. Gör om sökningen. Välj frakt Visas inte enheten? Få hjälp -Tryck på bakåtknappen om du vill lämna helskärmsläget. +Tryck på bakåtknappen för att lämna helskärmsläget. Överordnad mapp Webbplats Om Chrome @@ -152,6 +152,7 @@ Du kan styra Physical Web i inställningarna för Chrome Adresser Tillåt att webbplatser sparar och läser cookiedata (rekommenderas) Det här kontot hanteras av och . +Aktivera Automatisk synkronisering av data i kontoinställningarna för Android om du vill ha samma flikar tillgängliga på alla enheter. Upphovsrätt Google Inc. Med ensamrätt. Certifikatvisare Skapa lösenfras @@ -188,6 +189,7 @@ Du kan styra Physical Web i inställningarna för Chrome Du loggar in med ett hanterat konto, vilket innebär att administratören kontrollerar din Chrome-profil. Din Chrome-data kommer att knytas permanent till det här kontot. Om du kopplar ifrån det här kontot raderas din lokala Chrome-data. Dela bild +Fråga innan webbplatser tillåts att veta var du befinner dig (rekommenderas) Det gick inte att ladda ned på grund av filsystemfel. Storlek: Aktivera @@ -240,6 +242,7 @@ Om du vill ändra söktermen trycker du länge för att välja. Om du vill förf Översättningsspråk: Licenser för öppen källkod Webbadressen har blockerats: +Ett synkroniseringsfel uppstod. Tryck här om du vill veta mer. Kopiera länkadress Översätt aldrig från Media @@ -254,6 +257,7 @@ Om du vill ändra söktermen trycker du länge för att välja. Om du vill förf Surfa mer för mindre Bokmärkt i Physical Web-sidor i närheten visas i aviseringslistan i fortsättningen +Fråga innan webbplatser tillåts att använda kameran (rekommenderas) Nyckelgenerering Endast personer som har ditt lösenord kan läsa dina krypterade uppgifter. Lösenordet skickas inte till och sparas inte av Google. Om du glömmer lösenordet måste du återställa synkroniseringen. Läs mer {DAYS,plural, =1{för # dag sedan}other{för # dagar sedan}} @@ -272,6 +276,7 @@ Om du vill ändra söktermen trycker du länge för att välja. Om du vill förf Flikar flyttas till en funktion för flikbyte i Chrome. Det saknas viktiga funktioner i din version som krävs för att Chrome ska kunna köras. Antingen har installationen av Chrome inte slutförts eller så är Chrome och den här versionen av Android inte kompatibla. Cachade bilder och filer +Lägg till ett Google-konto från kontosidan i appen Inställningar på enheten. Öppna i Uppdatera Synkroniserades senast: @@ -313,7 +318,7 @@ Om du vill ändra söktermen trycker du länge för att välja. Om du vill förf Ny flik Innehållet som skulle laddas ned gick inte att öppna på enheten. Flikarna visas tillsammans med aktuella appar. -Dra uppifrån och tryck på bakåtknappen om du vill lämna helskärmsläget. +Dra uppifrån och tryck på bakåtknappen för att lämna helskärmsläget. Ändringar i bokmärken, historik, lösenord och andra inställningar synkroniseras inte längre med ditt Google-konto. Befintlig data fortsätter dock att lagras i Google-kontot. OK, jag fattar Språk @@ -323,6 +328,7 @@ Om du vill ändra söktermen trycker du länge för att välja. Om du vill förf Spara Föräldrainställningar Namn +Tillåt att Javascript körs på webbplatser (rekommenderas) raderades Platsåtkomst har också inaktiverats för enheten. Skicka aldrig @@ -360,6 +366,7 @@ Du är dock inte osynlig. Trots inkognitoläget kan din arbetsgivare, din intern Inkognitoflikar Beskrivning: Vill du ersätta den befintliga filen i ? +Styr hur Google anpassar Sök, annonser och andra Google-tjänster utifrån webbhistoriken. Behörigheter {HOURS,plural, =1{för # timme sedan}other{för # timmar sedan}} Koppla @@ -368,6 +375,7 @@ Du är dock inte osynlig. Trots inkognitoläget kan din arbetsgivare, din intern Databesparing har aktiverats Av Sparade lösenord +Fråga innan webbplatser tillåts att använda helskärmsläge (rekommenderas) Skapa ny fil All data som sparats lokalt av webbplatsen tas bort, inklusive cookies. Google Översätt @@ -392,6 +400,7 @@ Du är dock inte osynlig. Trots inkognitoläget kan din arbetsgivare, din intern Land/region Sparat utrymme: Läs mer +Lägg till en webbplats i undantagen Undantag Om du aktiverar Do Not Track inkluderas en begäran i din surftrafik. Eventuella effekter beror på om webbplatsen svarar på begäran och hur begäran tolkas. @@ -453,6 +462,7 @@ Vissa webbplatser kan till exempel svara på begäran genom att visa annonser so Tillgänglighet Hämta appen från Google Play Butik: Rapportera uppgifter om möjliga säkerhetsincidenter till Google automatiskt +Fråga innan webbplatser tillåts att använda mikrofonen (rekommenderas) Bekräfta Google-konto har laddats ned Öppna i webbläsaren @@ -515,6 +525,7 @@ Det kan finnas andra former av webbhistorik i Google-kontot på Frakt Läs in originalet Se vad som finns i närheten +Tillåt alltid Lägg till adress Flytta Bekräfta lösenfras @@ -559,6 +570,7 @@ Det kan finnas andra former av webbhistorik i Google-kontot på Tillåt (för sökningar i adressfältet) Synkroniseras med Standardflikar +Tillåt bakgrundssynkronisering för en specifik webbplats. Du måste uppdatera till en senare version av TalkBack. Endast godkända webbplatser Visa fullständig historik @@ -593,6 +605,7 @@ Du hämtar nya licenser genom att ansluta till internet och spela upp det nedlad Styr hur det fungerar i Inställningar Bokmärken är inloggad. Om du loggar in med slås synkroniserade uppgifter som bokmärken ihop mellan olika konton. Om du inte vill att uppgifterna ska slås ihop tar du bort webbinformationen i inställningarna. +Blockera webbplatser från att visa popup-fönster (rekommenderas) Leveransadress , flik Lagring @@ -622,6 +635,7 @@ Du hämtar nya licenser genom att ansluta till internet och spela upp det nedlad Lösenfras krävs Återställ användaruppgifter för enheten Visa original +Fråga innan webbplatser tillåts att skicka aviseringar (rekommenderas) Du håller på att byta synkroniseringskonto från till . Vad vill du ska hända med bokmärken, historik, lösenord och andra inställningar? Physical Web-sidor i närheten Mobilanpassad vy diff --git a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb index 2abb6647a233c..5e208de59d0ce 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb @@ -26,7 +26,7 @@ Lazima uwashe Bluetooth na kipengele cha Mahali ili uweze kutumia Wavuti Kila Ma Kamwe usitafsiri tovuti hii Futa historia, vidakuzi, data ya tovuti, akiba… Vilivyofungwa hivi karibuni -Ili upate vichupo kutoka vifaa vyako vingine, ingia katika Chrome. +Ili upate vichupo kutoka kwenye vifaa vyako vingine, ingia katika Chrome. Viangalie katika Chrome Tovuti imeongezwa Hakuna hifadhi ya kutosha ya kupakua maudhui yaliyochaguliwa. @@ -75,7 +75,6 @@ Lazima uwashe Bluetooth na kipengele cha Mahali ili uweze kutumia Wavuti Kila Ma Washa ruhusa ya Chrome katika Mipangilio ya Android. Hifadhi manenosiri Simba yote kwa njia fiche ukitumia nenosiri la Google kuanzia -Dhibiti namna Google inavyotumia historia yako ya kuvinjari ili uweke mapendeleo kwenye huduma ya Tafuta na huduma nyingine za Google. Tafadhali sasisha maelezo yako ya kuingia katika akaunti. Mipangilio ya kina Alamisho za Chrome Dev @@ -129,6 +128,7 @@ Unaweza kudhibiti Wavuti Kila Mahali katika Mipangilio ya Chrome. Imepanuliwa - bofya ili ukunje. Toleo jipya linapatikana. Nafasi moja +Ruhusu JavaScript ya tovuti mahususi. Wazazi wako husaidia kudhibiti mipangilio hii. Wasilisha Ondoka @@ -152,6 +152,7 @@ Unaweza kudhibiti Wavuti Kila Mahali katika Mipangilio ya Chrome. Anwani Ruhusu tovuti zihifadhi na kusoma data ya vidakuzi (imependekezwa) Akaunti hii inadhibitiwa na na . +Ili upate vichupo kutoka kwenye vifaa vyako vingine, washa kipengele cha "Sawazisha data kiotomatiki" katika mipangilio ya akaunti ya Android. Hakimiliki Google Inc. Haki zote zimehifadhiwa. Kitazamaji vyeti Unda kauli ya siri @@ -163,7 +164,7 @@ Unaweza kudhibiti Wavuti Kila Mahali katika Mipangilio ya Chrome. Jitolee kutafsiri kurasa kwa kutumia huduma ya Google Tafsiri Fungua kwenye kichupo fiche Inafikia vifaa vya kuingiza sauti na video -Ili upate alamisho kutoka vifaa vyako vingine, ingia katika Chrome. +Ili upate alamisho kutoka kwenye vifaa vyako vingine, ingia katika Chrome. Ondoka kwenye hali fiche Chaguo la usafirishaji Teua chaguo la usafirishaji @@ -188,6 +189,7 @@ Unaweza kudhibiti Wavuti Kila Mahali katika Mipangilio ya Chrome. Unaingia katika akaunti ambayo inasimamiwa na kumpa msimamizi wa akaunti udhibiti wa wasifu wako kwenye Chrome. Data yako ya Chrome itahusishwa na akaunti hii milele. Kujiondoa kwenye akaunti hii kutafuta data yako iliyopo ya Chrome. Shiriki picha +Uliza kabla ya kuruhusu tovuti zijue mahali ulipo (inapendekezwa) Kipakuliwa cha hakijafaulu kwa sababu ya hitilafu za mfumo wa faili. Ukubwa: Washa @@ -240,6 +242,7 @@ Ili kurekebisha hoja yako ya utafutaji, bonyeza kwa muda mrefu ili kuchagua. Ili Lugha ya Tafsiri: Leseni za programu huria Kudurusu kumezuiwa: +Hitilafu ya kusawazisha imetokea, gonga ili upate maelezo. Nakili anwani ya kiungo Kamwe usitafsiri Vyombo vya Habari @@ -254,6 +257,7 @@ Ili kurekebisha hoja yako ya utafutaji, bonyeza kwa muda mrefu ili kuchagua. Ili Vinjari zaidi ukitumia kiasi kidogo cha data Imetia alamishwa kwenye Kurasa za baadaye za Wavuti Kila Mahali zilizo karibu zitaonekana katika orodha yako ya arifa +Uliza kwanza kabla ya kuruhusu tovuti zitumie kamera yako (inapendekezwa) Uundaji ufunguo Ni mtu mwenye kauli yako ya siri pekee ndiye anaweza kusoma data yako iliyosimbwa kwa njia fiche. Kauli ya siri haitumwi au kuhifadhiwa na Google. Ukisahau kauli yako ya siri, utahitaji kufanya usawazishaji upya. Pata maelezo zaidi {DAYS,plural, =1{Siku # iliyopita}other{Siku # zilizopita}} @@ -272,6 +276,7 @@ Ili kurekebisha hoja yako ya utafutaji, bonyeza kwa muda mrefu ili kuchagua. Ili Vichupo vitasonga kwenye kibadilishaji cha kichupo ndani ya Chrome. Utendaji muhimu unahitajika kuendesha Chrome zinakosekana; huenda usakinishaji wako wa Chrome haujakamilika, au hauoani na toleo hili la Android. Picha na faili zilizoakibishwa +Ongeza Akaunti ya Google kutoka kwenye ukurasa wa Akaunti katika programu ya Mipangilio ya kifaa chako. Fungua katika Sasisha Kilisawazishwa mara ya mwisho: @@ -323,6 +328,7 @@ Ili kurekebisha hoja yako ya utafutaji, bonyeza kwa muda mrefu ili kuchagua. Ili Hifadhi Mipangilio ya Wazazi Jina +Ruhusu tovuti zitumie JavaScript (inapendekezwa) Umefuta Ufikiaji wa mahali pia umezimwa kwa kifaa hiki. Usiwahi kutuma @@ -360,6 +366,7 @@ Hata hivyo, huonekani. Kuvinjari katika hali fiche hakufichi kuvinjari kwako kus Vichupo fiche Maelezo: Je, unataka kubadilisha iliyopo katika ? +Dhibiti namna Google inavyotumia historia ya jinsi unavyovinjari ili kuweka mapendeleo kwenye huduma ya Tafuta na Google, matangazo na huduma nyingine za Google. Idhini {HOURS,plural, =1{Saa # iliyopita}other{Saa # zilizopita}} Oanisha @@ -368,6 +375,7 @@ Hata hivyo, huonekani. Kuvinjari katika hali fiche hakufichi kuvinjari kwako kus Kiokoa Data kimewashwa Kimezimwa Manenosiri yaliyohifadhiwa +Uliza kwanza kabla ya kuruhusu tovuti ziweke skrini nzima (inapendekezwa) Unda faili mpya Data zote za ndani zilizohifadhiwa na tovuti hii, ikiwemo vidakuzi, zitafutwa. Google Tafsiri @@ -392,6 +400,7 @@ Hata hivyo, huonekani. Kuvinjari katika hali fiche hakufichi kuvinjari kwako kus Nchi/Eneo ya data imeokolewa Pata maelezo zaidi +Ongeza tovuti mpya kwenye orodha ya vighairi Vighairi Kuwasha ‘Usifuatilie’ kunamaanisha kuwa ombi litajumuishwa pamoja na maelezo yako mengine ya kuvinjari. Athari yoyote itategemea ikiwa tovuti inajibu ombi, na namna ombi litakavyofasiriwa. @@ -453,6 +462,7 @@ Kwa mfano, baadhi ya tovuti zinaweza kujibu ombi hili kwa kukuonyesha matangazo Upatikanaji Pata programu kutoka kwenye Duka la Google Play: Ripoti maelezo ya uwezekano wa matukio yasiyo salama kwa Google kiotomatiki +Uliza kwanza kabla ya kuruhusu tovuti zitumie maikrofoni yako (inapendekezwa) Thibitisha Akaunti ya Google imepakuliwa Fungua katika kivinjari @@ -515,6 +525,7 @@ Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari kama vi Anwani ya Kufikishia Pakia tovuti asili Angalia kilicho karibu +Inaruhusiwa kila wakati Ongeza anwani Sogeza Thibitisha kaulisiri @@ -523,7 +534,7 @@ Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari kama vi Sitaki Inafikia vifaa vya kuingiza sauti Hitilafu ilitokea wakati wa kushughulikia agizo lako. Tafadhali angalia akaunti yako na ujaribu tena. -Gundua na ucheze maudhui muhimu ya tovuti mahsusi. +Gundua na ucheze maudhui muhimu ya tovuti mahususi. Ghairi uchaguzi Vifaa vingine Ondoa yote @@ -545,7 +556,7 @@ Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari kama vi Maudhui haya yanatoka , yamewasilishwa na Google. Nambari ya kadi ya malipo Angalia maelezo ya tovuti -Gusa ili Kutafuta kunatuma neno lililochaguliwa na ukurasa wa sasa kama muktadha kwenye Tafuta na Google. Unaweza kuizima katika Mipangilio. +Kipengele cha Gusa ili Kutafuta hutuma neno lililochaguliwa na ukurasa wa sasa kama muktadha kwa huduma ya Tafuta na Google. Unaweza kuzima kipengele hiki katika Mipangilio. Maudhui kutoka mwanzo Endelea @@ -559,6 +570,7 @@ Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari kama vi Ruhusu (kwa ajili ya utafutaji wa sehemu ya anwani) Inasawazisha kwenye Vichupo muundo-msingi +Ruhusu Usawazishaji wa Chini Chini wa tovuti mahususi. Unahitaji kubadilisha TalkBack kwa kupata toleo jipya. Tovuti zilizoidhinishwa pekee Onyesha historia kamili @@ -580,7 +592,7 @@ Huenda Akaunti yako ya Google ina aina nyingine za historia ya kuvinjari kama vi Maudhui (filamu, muziki, n.k.) yaliyopakuliwa katika programu nyingine huenda yasichezeke tena hadi programu hizo zipate upya leseni kulingana na kitambulisho kipya cha kifaa. Ili kupata leseni mpya, unganisha kwenye intaneti na ucheze maudhui yako yaliyopakuliwa. -Ili upate vichupo kutoka vifaa vyako vingine, washa kipengele cha usawazishaji. +Ili upate vichupo kutoka kwenye vifaa vyako vingine, washa kipengele cha usawazishaji. Kutoka Google Payments Futa uingizaji wa maandishi Muda wake unakwisha tarehe @@ -593,6 +605,7 @@ Ili kupata leseni mpya, unganisha kwenye intaneti na ucheze maudhui yako yaliyop Dhibiti namna inavyofanya kazi katika Mipangilio Alamisho iliingiwa. Kuingia ukitumia kutaunganisha data iliyosawazishwa kama alamisho kati ya akaunti. Ili kutenganisha maelezo, futa data ya kuvinjari iliyo kwenye mipangilio. +Zuia tovuti zisionyeshe madirisha ibukizi (inapendekezwa) Anwani ya kusafirisha , kichupo Hifadhi @@ -622,6 +635,7 @@ Ili kupata leseni mpya, unganisha kwenye intaneti na ucheze maudhui yako yaliyop Kaulisiri inahitajika Weka upya kitambulisho cha kifaa Onyesha asili +Uliza kabla ya kuruhusu tovuti zitumie arifa (inapendekezwa) Unabadilisha akaunti za kusawazisha kutoka hadi . Je, ungependa kufanyia nini alamisho, historia, manenosiri na mipangilio yako mingine iliyopo? Kurasa za Wavuti Kila Mahali zilizo karibu Mwonekano unaosomeka vizuri kwenye kifaa cha mkononi diff --git a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb index 7ac3e4198d23b..a791c7a1f8303 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb @@ -75,7 +75,6 @@ เปิดการใช้สิทธิ์สำหรับ Chrome ในการตั้งค่า Android บันทึกรหัสผ่าน เข้ารหัสทั้งหมดด้วยรหัสผ่าน Google ตั้งแต่วันที่ -ควบคุมวิธีที่ Google ใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหาในแบบของคุณและบริการอื่นๆ ของ Google โปรดอัปเดตรายละเอียดการลงชื่อเข้าใช้ของคุณ ขั้นสูง บุ๊กมาร์กของ Chrome Dev @@ -129,6 +128,7 @@ ขยาย - คลิกเพื่อยุบ มีเวอร์ชันใหม่กว่าให้ใช้งาน Monospace +อนุญาต JavaScript สำหรับเว็บไซต์ใดเว็บไซต์หนึ่ง ผู้ปกครองของคุณช่วยจัดการการตั้งค่าเหล่านี้ ส่ง ออก @@ -152,6 +152,7 @@ ที่อยู่ อนุญาตให้ไซต์บันทึกและอ่านข้อมูลคุกกี้ (แนะนำ) บัญชีนี้ได้รับการจัดการโดย และ +เปิด "ซิงค์ข้อมูลอัตโนมัติ" ในการตั้งค่าบัญชี Android เพื่อรับแท็บจากอุปกรณ์เครื่องอื่นๆ ของคุณ ลิขสิทธิ์ Google Inc. สงวนลิขสิทธิ์ เครื่องมือดูใบรับรอง สร้างรหัสผ่าน @@ -188,6 +189,7 @@ คุณกำลังลงชื่อเข้าใช้ด้วยบัญชีที่มีผู้อื่นเป็นผู้จัดการ และคุณอนุญาตให้ผู้ดูแลระบบควบคุมโปรไฟล์ Chrome ของคุณได้ ข้อมูล Chrome ของคุณจะเชื่อมโยงกับบัญชีนี้อย่างถาวร การยกเลิกการเชื่อมต่อกับบัญชีนี้จะเป็นการนำออกข้อมูล Chrome ในเครื่อง แชร์รูปภาพ +ถามก่อนจะอนุญาตให้เว็บไซต์ทราบตำแหน่งของคุณ (แนะนำ) การดาวน์โหลด ล้มเหลวเพราะเกิดข้อผิดพลาดกับระบบไฟล์ ขนาด: เปิดการใช้งาน @@ -240,6 +242,7 @@ ภาษาที่แปล: ใบอนุญาตโอเพนซอร์ส มีการบล็อกการนำทาง: +เกิดข้อผิดพลาดการซิงค์ แตะเพื่ออ่านรายละเอียด คัดลอกที่อยู่ลิงก์ ไม่ต้องแปลภาษา สื่อ @@ -254,6 +257,7 @@ ท่องเว็บได้มากขึ้นแต่ใช้อินเทอร์เน็ตน้อยลง เพิ่มบุ๊กมาร์กไปยัง แล้ว หน้า Physical Web ที่อยู่ใกล้เคียงหลังจากนี้จะแสดงในรายการการแจ้งเตือน +ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์ใช้กล้องถ่ายรูปของคุณ (แนะนำ) การสร้างคีย์ เฉพาะผู้ที่มีรหัสผ่านของคุณเท่านั้นจึงจะสามารถอ่านข้อมูลที่เข้ารหัสของคุณได้ Google จะไม่ส่งหรือจัดเก็บรหัสผ่านนี้ หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ คุณจะต้องรีเซ็ตการซิงค์ เรียนรู้เพิ่มเติม {DAYS,plural, =1{# วันที่ผ่านมา}other{# วันที่ผ่านมา}} @@ -272,6 +276,7 @@ แท็บจะย้ายไปยังตัวเปิดปิดแท็บใน Chrome ฟังก์ชันที่จำเป็นต่อการเรียกใช้ Chrome ขาดหายไป อาจเป็นเพราะการติดตั้ง Chrome ของคุณไม่สมบูรณ์หรือไม่สามารถทำงานร่วมกับ Android เวอร์ชันนี้ได้ รูปภาพและไฟล์ในแคช +เพิ่มบัญชี Google จากหน้า "บัญชี" ในแอปการตั้งค่าของอุปกรณ์ เปิดใน การอัปเดต ซิงค์ครั้งล่าสุด: @@ -323,6 +328,7 @@ บันทึก การตั้งค่าของผู้ปกครอง ชื่อ +อนุญาตให้เว็บไซต์เรียกใช้ JavaScript (แนะนำ) ลบ แล้ว การเข้าถึงตำแหน่งถูกปิดสำหรับอุปกรณ์นี้ด้วย ไม่ส่ง @@ -360,6 +366,7 @@ แท็บที่ไม่ระบุตัวตน คำอธิบาย: คุณต้องการแทนที่ ที่มีอยู่ใน ไหม +ควบคุมวิธีที่ Google ใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยนการค้นหา โฆษณา และบริการอื่นๆ ของ Google ในแบบของคุณ การอนุญาต {HOURS,plural, =1{# ชั่วโมงที่ผ่านมา}other{# ชั่วโมงที่ผ่านมา}} จับคู่ @@ -368,6 +375,7 @@ เปิดใช้โปรแกรมประหยัดอินเทอร์เน็ต ปิด รหัสผ่านที่บันทึกไว้ +ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์เข้าสู่โหมดเต็มหน้าจอ (แนะนำ) สร้างไฟล์ใหม่ ระบบจะลบข้อมูลในเครื่องทั้งหมดที่เว็บไซต์นี้จัดเก็บ รวมถึงคุกกี้ Google แปลภาษา @@ -392,6 +400,7 @@ ประเทศ/ภูมิภาค ประหยัดอินเทอร์เน็ต เรียนรู้เพิ่มเติม +เพิ่มข้อยกเว้นของเว็บไซต์ ข้อยกเว้น การเปิดใช้ "ไม่ติดตาม" หมายความว่าจะมีการรวมคำขอหนึ่งไว้กับการเข้าชมของคุณ ผลกระทบทั้งหมดขึ้นอยู่กับว่าเว็บไซต์ตอบสนองต่อคำขอนั้นไหม และวิธีตีความคำขอ @@ -453,6 +462,7 @@ การเข้าถึง รับแอปจาก Google Play สโตร์: รายงานรายละเอียดของเหตุการณ์ความปลอดภัยที่เป็นไปได้ต่อ Google โดยอัตโนมัติ +ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์ใช้ไมโครโฟน (แนะนำ) ยืนยันบัญชี Google ดาวน์โหลด แล้ว เปิดในเบราว์เซอร์ @@ -515,6 +525,7 @@ จัดส่ง โหลดต้นฉบับ ดูว่ามีอะไรอยู่ใกล้เคียง +อนุญาตเสมอ เพิ่มที่อยู่ ย้าย ยืนยันข้อความรหัสผ่าน @@ -559,6 +570,7 @@ อนุญาต (สำหรับการค้นหาในแถบที่อยู่เว็บ) กำลังซิงค์กับ แท็บมาตรฐาน +อนุญาตให้ใช้การซิงค์ในแบ็กกราวด์สำหรับเว็บไซต์ที่เจาะจง คุณต้องอัปเดต TalkBack เป็นเวอร์ชันใหม่ เฉพาะไซต์ที่อนุมัติ แสดงประวัติการเข้าชมทั้งหมด @@ -593,6 +605,7 @@ ควบคุมการทำงานในการตั้งค่า บุ๊กมาร์ก เดิมลงชื่อเข้าใช้ด้วย การลงชื่อเข้าใช้ด้วย จะรวมข้อมูลที่ซิงค์ เช่น บุ๊กมาร์ก ในแต่ละบัญชีเข้าด้วยกัน หากไม่ต้องการรวมข้อมูล โปรดล้างข้อมูลการท่องเว็บในการตั้งค่า +บล็อกเว็บไซต์ไม่ให้แสดงป๊อปอัป (แนะนำ) ที่อยู่จัดส่ง เป็นแท็บ พื้นที่เก็บข้อมูล @@ -622,6 +635,7 @@ ต้องระบุรหัสผ่าน รีเซ็ตข้อมูลรับรองของอุปกรณ์ แสดงหน้าเว็บเดิม +ถามก่อน ก่อนที่จะอนุญาตให้เว็บไซต์ส่งการแจ้งเตือน (แนะนำ) คุณกำลังเปลี่ยนบัญชีในการซิงค์จาก เป็น คุณต้องการทำอย่างไรกับบุ๊กมาร์ก ประวัติ รหัสผ่าน และการตั้งค่าอื่นๆ ที่มีอยู่ มีหน้า Physical Web อยู่ใกล้เคียง มุมมองสำหรับอุปกรณ์เคลื่อนที่ diff --git a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb index 0ab8ba5797bb5..5f8b4172e8caf 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb @@ -75,7 +75,6 @@ Fiziksel Web'i kullanabilmeniz için Bluetooth ve Konum özelliklerinin açık o Android Ayarları'nda Chrome için izni açın. Şifreleri kaydetme itibariyle tüm Google şifrelerini şifrele -Google'ın, Arama ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi nasıl kullanacağını kontrol edin. Lütfen oturum açma ayrıntılarınızı güncelleyin. Gelişmiş Chrome Dev yer işaretleri @@ -129,6 +128,7 @@ Chrome Ayarları'ndan Fiziksel Web'i kontrol edebilirsiniz. Genişletildi - Daraltmak için tıklayın. Daha yeni bir sürüm mevcut Eş aralıklı +Belirli bir site için JavaScript'e izin verin. Ebeveyniniz bu ayarları yönetmenize yardımcı olabilir. Gönder Çık @@ -152,6 +152,7 @@ Chrome Ayarları'ndan Fiziksel Web'i kontrol edebilirsiniz. Adresler Sitelerin, çerez verilerini kaydetmelerine ve okumalarına izin ver (önerilir) Bu hesap ve tarafından yönetiliyor. +Diğer cihazlarınızdaki sekmelerinize ulaşmak için Android hesap ayarlarından "Verileri otomatik olarak senkronize et" seçeneğini etkinleştirin. Telif Hakkı Google Inc. Tüm hakları saklıdır. Sertifika görüntüleyici Parola oluşturun @@ -188,6 +189,7 @@ Chrome Ayarları'ndan Fiziksel Web'i kontrol edebilirsiniz. Yönetilen bir hesapla oturum açıyor ve hesabın yöneticisine Chrome profilinizi denetleme olanağı veriyorsunuz. Chrome verileriniz bu hesaba kalıcı olarak bağlanır. Bu hesabın bağlantısı kesildiğinde yerel Chrome verileriniz silinir. Resmi paylaş +Sitelerin, konumunuzu öğrenmesine izin verilmeden önce size sorulsun (önerilir) Dosya sistemi hataları nedeniyle dosyası indirilemedi. Boyut: Etkinleştir @@ -240,6 +242,7 @@ Arama teriminizi düzeltmek için uzun basarak terimi seçin. Aramanızı ayrın Çeviri Dili: Açık kaynak lisansları Gezinme engellendi: +Senkronizasyon hatası oluştu, ayrıntıları görmek için dokunun. Bağlantı adresini kopyala dilini asla çevirme Medya @@ -254,6 +257,7 @@ Arama teriminizi düzeltmek için uzun basarak terimi seçin. Aramanızı ayrın Daha az bant genişliği harcayarak daha çok göz atın Yer işareti klasörüne eklendi Bundan sonra yakınlardaki Fiziksel Web sayfaları bildirimler listenizde gösterilecek +Sitelerin, kameranızı kullanmasına izin verilmeden önce size sorulsun (önerilir) Anahtar oluşturma Yalnızca parolanızı bilen biri, şifrelenmiş verilerinizi okuyabilir. Parola Google'a gönderilmez veya Google tarafından saklanmaz. Parolanızı unutursanız veya bu ayarı değiştirmek isterseniz senkronizasyonu sıfırlamanız gerekir. Daha fazla bilgi edinin {DAYS,plural, =1{# gün önce}other{# gün önce}} @@ -272,6 +276,7 @@ Arama teriminizi düzeltmek için uzun basarak terimi seçin. Aramanızı ayrın Sekmeler Chrome'un içindeki bir sekme değiştiriciye taşınacak. Chrome'un çalışması için gereken çok önemli bir işlev eksik; Chrome yüklemeniz eksik olabilir ya da Android'in bu sürümü ile uyumlu olmayabilir. Önbelleğe alınan resimler ve dosyalar +Cihazınızın Ayarlar uygulamasındaki Hesaplar sayfasından bir Google Hesabı ekleyin. uygulamasında aç Güncelle Son senkronizasyon: @@ -323,6 +328,7 @@ Arama teriminizi düzeltmek için uzun basarak terimi seçin. Aramanızı ayrın Kaydet Ebeveyn Ayarları Ad +Sitelerin JavaScript çalıştırmasına izin ver (önerilir) silindi Konum erişimi de bu cihaz için kapatıldı. Hiçbir zaman gönderme @@ -360,6 +366,7 @@ Yine de, görünmez olmazsınız. Gizli moda geçmeniz web'de yaptıklarınızı Gizli mod sekmeleri Açıklama: dizinindeki varolan adını değiştirmek istiyor musunuz? +Google'ın Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi nasıl kullanacağını kontrol edin. İzinler {HOURS,plural, =1{# saat önce}other{# saat önce}} Eşle @@ -368,6 +375,7 @@ Yine de, görünmez olmazsınız. Gizli moda geçmeniz web'de yaptıklarınızı Veri Tasarrufu etkinleştirildi Kapalı Kayıtlı şifreler +Sitelerin, tam ekrana geçmesine izin verilmeden önce size sorulsun (önerilir) Yeni dosya oluştur Çerezler dahil bu web sitesinin depoladığı tüm yerel veriler silinecek. Google Çeviri @@ -392,6 +400,7 @@ Yine de, görünmez olmazsınız. Gizli moda geçmeniz web'de yaptıklarınızı Ülke/Bölge veri tasarrufu Daha fazla bilgi edinin +Site istisnası ekle İstisnalar "Do Not Track" seçeneği etkinleştirildiğinde, göz atma trafiğinize bir istek eklenir. Her türlü etki, bir web sitesinin isteğe cevap verip vermemesine ve isteğin nasıl yorumlandığına bağlıdır. @@ -453,6 +462,7 @@ Yine de, görünmez olmazsınız. Gizli moda geçmeniz web'de yaptıklarınızı Erişilebilirlik Uygulamayı Google Play Store'dan edinin: Olası güvenlik olaylarının ayrıntılarını Google'a otomatik olarak bildir +Sitelerin, mikrofonunuzu kullanmasına izin verilmeden önce size sorulsun (önerilen) Google Hesabı Onayı dosyası indirildi Tarayıcıda aç @@ -515,6 +525,7 @@ Diğer Google hizmetlerinden yapılan aramalar ve etkinlikler gibi Google hesab Sevkiyat Orijinali yükle Yakınlarda nelerin olduğunu görün +Her zaman izin veriliyor Adres ekle Taşı Parolayı onayla @@ -559,6 +570,7 @@ Diğer Google hizmetlerinden yapılan aramalar ve etkinlikler gibi Google hesab İzin ver (adres çubuğu aramaları için) ile senkronize ediliyor Standart sekmeler +Belirli bir site için Arka Plan Senkronizasyonuna izin verin. TalkBack'i daha yeni bir sürüme güncellemeniz gerekiyor. Sadece onaylı siteler Tüm geçmişi göster @@ -593,6 +605,7 @@ Yeni lisansları edinmek için İnternet'e bağlanın ve indirdiğiniz içeriği Bunun nasıl çalışacağını Ayarlar'dan kontrol edin Favoriler olarak oturum açıldı. olarak oturum açıldığında, hesaplardaki yer işaretleri gibi senkronize edilmiş veriler birleştirilir. Bilgilerin ayrı kalmasını sağlamak için ayarlarda tarama verilerini temizleyin. +Sitelerin pop-up göstermesini engelle (önerilir) Gönderim adresi , sekme Depolama @@ -622,6 +635,7 @@ Yeni lisansları edinmek için İnternet'e bağlanın ve indirdiğiniz içeriği Parola gerekli Cihazın kimlik bilgilerini sıfırla Orijinali göster +Sitelerin bildirim göndermesine izin vermeden önce size sorulsun (önerilir) Senkronizasyon hesapları arasında ( hesabından hesabına) geçiş yapıyorsunuz. Mevcut yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızla ne yapmak istiyorsunuz? Yakınlardaki Fiziksel Web sayfaları Mobil uyumlu görünüm diff --git a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb index 5f064d87c0846..b2745515248b2 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb @@ -75,7 +75,6 @@ Увімкніть дозвіл для Chrome у налаштуваннях Android. Зберігання паролів Зашифрувати всі дані за допомогою пароля Google із . -Укажіть, як Google має використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук та інші служби Google. Оновіть свої дані для входу. Розширені Закладки з Chrome для розробників @@ -129,6 +128,7 @@ Розгорнуто – натисніть, щоб згорнути. Доступна новіша версія Однакової ширини +Увімкнути Javascript на певному сайті. Цими налаштуваннями керують ваші батьки. Надіслати Вийти @@ -152,6 +152,7 @@ Адреси Дозволити сайтам зберігати та розпізнавати дані файлів cookie (рекомендується) Цим обліковим записом керують і . +записі. Авторське право Google Inc. Усі права захищено. Перегляд сертифікатів Створити парольну фразу @@ -188,6 +189,7 @@ Ви входите в керований обліковий запис і дозволяєте його адміністратору керувати вашим профілем Chrome. Ваші дані Chrome буде назавжди пов’язано з цим обліковим записом. Відключення від цього облікового запису видалить усі локальні дані Chrome. Поділитися зображенням +Запитувати, перш ніж дозволити сайтам визначати ваше місцезнаходження (рекомендується) Файл не завантажено через помилки файлової системи. Розмір: Увімкнути @@ -240,12 +242,13 @@ Мова перекладу: Ліцензії ПЗ з відкритим кодом Веб-сторінку заблоковано +Помилка під час синхронізації. Торкніться, щоб дізнатися більше. Копіювати адресу посилання Ніколи не перекладати з такої мови: Медіа-дані Дозволено Розділити вкладки та додатки -Основи +Основні Завантажено. Закрити діалогове вікно Без контролю @@ -254,6 +257,7 @@ Більше Інтернету – менше витрат Закладку збережено в папці "" Сторінки поблизу із сервісу "Інтернет навколо нас" з’являтимуться в списку сповіщень +Запитувати, перш ніж дозволити сайтам використовувати камеру (рекомендується) Генерування ключів Ваші зашифровані дані можуть переглядати лише користувачі, які знають вашу парольну фразу. Парольна фраза не надсилається й не зберігається в Google. Якщо ви забули її або хочете змінити це налаштування, скиньте синхронізацію. Докладніше {DAYS,plural, =1{# день тому}one{# день тому}few{# дні тому}many{# днів тому}other{# дня тому}} @@ -272,6 +276,7 @@ Вкладки буде переміщено в перемикач вкладок у Chrome. Немає важливого компонента, який потрібний для роботи Chrome. Встановлення Chrome не завершено або веб-переглядач не сумісний із цією версією Android. Кешовані зображення та файли +Додайте обліковий запис Google зі сторінки "Облікові записи" в додатку Налаштування на пристрої. Відкрити в Оновити Востаннє синхронізовано: @@ -323,6 +328,7 @@ Зберегти Батьківські налаштування Назва +Дозволити сайтам запускати Javascript (рекомендується) Закладку "" видалено Доступ до геоданих також вимкнено на цьому пристрої. Ніколи не надсилати @@ -360,6 +366,7 @@ Анонімні вкладки Опис: Замінити наявний файл "" у каталозі ""? +Укажіть, як Google має використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук, оголошення й інші служби Google. Дозволи {HOURS,plural, =1{# годину тому}one{# годину тому}few{# години тому}many{# годин тому}other{# години тому}} Підключити @@ -368,6 +375,7 @@ Заощадження трафіку ввімкнено Вимк. Збережені паролі +Запитувати, перш ніж дозволити сайтам переходити в повноекранний режим (рекомендується) Створити файл Буде видалено всі локальні дані, які зберіг цей веб-сайт, зокрема файли cookie. Перекладач Google @@ -392,6 +400,7 @@ Країна або регіон Заощадження даних: Докладніше +Додати сайт у список винятків Винятки Якщо ввімкнути параметр "Не відстежувати", запит додаватиметься в трафік веб-перегляду. Результат залежатиме від того, чи реагує веб-сайт на цей запит і як тлумачиться запит. @@ -453,6 +462,7 @@ Доступність Завантажити додаток із магазину Google Play: Автоматично повідомляти Google деталі щодо можливих порушень безпеки +Запитувати, перш ніж дозволити сайтам використовувати мікрофон (рекомендується) Підтвердити вхід в обліковий запис Файл "" завантажено Відкрити у веб-переглядачі @@ -515,6 +525,7 @@ Адреса для надсилання Завантажити оригінал Веб-сторінки поблизу +Завжди дозволяти Додати адресу Перемістити Підтвердити парольну фразу @@ -559,6 +570,7 @@ Дозволити (для пошуку в адресному рядку) Синхронізація з обліковим записом Стандартні вкладки +сайті. Потрібно оновити додаток TalkBack до новішої версії. Лише схвалені сайти Показати повну історію @@ -593,6 +605,7 @@ Цим параметром можна керувати в налаштуваннях Закладки Ви ввійшли в обліковий запис . Якщо ввійти як , синхронізовані дані (наприклад, закладки) цих облікових записів буде об’єднано. Щоб інформація зберігалась окремо, очистьте дані веб-перегляду в налаштуваннях. +Блокувати спливаючі вікна на сайтах (рекомендується) Адреса доставки Вкладка "" Обсяг пам’яті @@ -622,6 +635,7 @@ Потрібно вказати парольну фразу Скинути облікові дані пристрою Показати оригінал +Запитувати, перш ніж дозволити сайтам надсилати сповіщення (рекомендується) Ви переходите з облікового запису для синхронізації у . Що ви хочете зробити з наявними закладками, історією, паролями й іншими налаштуваннями? Сторінки поблизу в сервісі "Інтернет навколо нас" Режим для мобільних телефонів diff --git a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb index 62ab59b63d436..46d70d89352ed 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb @@ -75,7 +75,6 @@ Bạn phải bật Bluetooth và Vị trí để sử dụng Web trong cuộc s Bật quyền cho Chrome trong Cài đặt Android. Lưu mật khẩu Mã hóa tất cả dữ liệu bằng mật khẩu Google kể từ -Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm và các dịch vụ khác của Google. Vui lòng cập nhật chi tiết đăng nhập của bạn. Nâng cao Dấu trang Chrome Dev @@ -101,7 +100,7 @@ Bạn phải bật Bluetooth và Vị trí để sử dụng Web trong cuộc s Tinh chỉnh Lựa chọn chứng chỉ phía ứng dụng khách không được hệ điều hành hỗ trợ. Kéo thanh trượt cho đến khi bạn có thể đọc nội dung này thoải mái. Chữ tối thiểu phải to như này sau khi bấm đúp vào một đoạn. -Các thiết bị lân cận mà bạn đang truyền trang web qua Bluetooth. Chrome sẽ quét tìm các trang và hiển thị chúng khi bạn khởi động thiết bị của mình. Các trang này sẽ được chuyển tới một dịch vụ của Google để cải thiện chất lượng của kết quả trang. +Các thiết bị lân cận mà bạn đang truyền trang web qua Bluetooth. Chrome sẽ quét tìm các trang và hiển thị chúng khi bạn đánh thức thiết bị của mình. Các trang này sẽ được chuyển tới một dịch vụ của Google để cải thiện chất lượng của kết quả trang. Bạn có thể kiểm soát cài đặt Web trong cuộc sống trên Chrome. @@ -129,6 +128,7 @@ Bạn có thể kiểm soát cài đặt Web trong cuộc sống trên Chrome. Đã mở rộng - nhấp để thu gọn. Đã có phiên bản mới hơn Monospace +Cho phép JavaScript cho trang web cụ thể. Cha mẹ của bạn giúp quản lý những cài đặt này. Gửi Rời khỏi @@ -152,6 +152,7 @@ Bạn có thể kiểm soát cài đặt Web trong cuộc sống trên Chrome. Địa chỉ Cho phép trang web lưu và đọc dữ liệu cookie (được đề xuất) Tài khoản này do quản lý. +Để có các tab từ thiết bị khác của bạn, hãy bật "Tự động đồng bộ hóa dữ liệu" trong cài đặt tài khoản Android. Bản quyền Google Inc. Mọi quyền được bảo lưu. Trình xem chứng chỉ Tạo cụm mật khẩu @@ -188,6 +189,7 @@ Bạn có thể kiểm soát cài đặt Web trong cuộc sống trên Chrome. Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp cho quản trị viên quyền kiểm soát đối với hồ sơ trên Chrome của bạn. Dữ liệu Chrome của bạn sẽ vĩnh viễn gắn với tài khoản này. Ngắt kết nối khỏi tài khoản này sẽ xóa các dữ liệu Chrome trên máy. Chia sẻ hình ảnh +Hỏi trước khi cho phép các trang web biết vị trí của bạn (được đề xuất) Tải xuống không thành công do lỗi hệ thống tệp. Kích thước: Bật @@ -240,6 +242,7 @@ Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp Ngôn ngữ dịch: Giấy phép nguồn mở Điều hướng bị chặn: +Đã xảy ra lỗi đồng bộ hóa, hãy nhấn để biết thông tin chi tiết. Sao chép địa chỉ liên kết Không bao giờ dịch Truyền thông @@ -254,6 +257,7 @@ Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp Duyệt nhiều hơn với ít chi phí hơn Đã đánh dấu trang vào Các trang Web trong cuộc sống lân cận trong tương lai sẽ hiển thị trong danh sách thông báo của bạn +Hỏi trước trước khi cho phép các trang web sử dụng máy ảnh của bạn (được đề xuất) Tạo khóa Chỉ người có cụm mật khẩu mới có thể đọc dữ liệu được mã hóa của bạn. Cụm mật khẩu không được gửi tới hoặc được lưu trữ bởi Google. Nếu bạn quên cụm mật khẩu hoặc muốn thay đổi cài đặt này, bạn cần đặt lại đồng bộ hóa. Tìm hiểu thêm {DAYS,plural, =1{# ngày trước}other{# ngày trước}} @@ -272,6 +276,7 @@ Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp Tab sẽ chuyển sang trình chuyển đổi tab bên trong Chrome. Chức năng quan trọng cần có để chạy Chrome bị thiếu; quá trình cài đặt Chrome của bạn chưa hoàn tất hoặc không tương thích với phiên bản Android này. Tệp và hình ảnh được lưu trong bộ nhớ cache +Thêm Tài khoản Google từ trang Tài khoản trong ứng dụng Cài đặt trên thiết bị của bạn. Mở trong Cập nhật Đồng bộ hóa lần cuối: @@ -323,6 +328,7 @@ Bạn đang đăng nhập bằng tài khoản được quản lý và cung cấp Lưu Cài đặt của phụ huynh Tên +Cho phép các trang web chạy JavaScript (được đề xuất) Đã xóa Truy cập vị trí cũng đã được tắt cho thiết bị này. Không bao giờ gửi @@ -360,6 +366,7 @@ Tuy nhiên, bạn vẫn hiển thị. Truy cập ẩn danh sẽ không ẩn Tab ẩn danh Mô tả: Bạn có muốn thay thế hiện tại trong không? +Kiểm soát cách Google sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm, quảng cáo và các dịch vụ khác của Google. Giấy phép {HOURS,plural, =1{# giờ trước}other{# giờ trước}} Ghép nối @@ -368,6 +375,7 @@ Tuy nhiên, bạn vẫn hiển thị. Truy cập ẩn danh sẽ không ẩn Đã bật Trình tiết kiệm dữ liệu Tắt Mật khẩu đã lưu +Hỏi trước trước khi cho phép các trang web truy cập chế độ toàn màn hình (được đề xuất) Tạo tệp mới Tất cả dữ liệu cục bộ được trang web này lưu, bao gồm cookie, sẽ bị xóa. Google Dịch @@ -392,6 +400,7 @@ Tuy nhiên, bạn vẫn hiển thị. Truy cập ẩn danh sẽ không ẩn Quốc gia/Vùng Tiết kiệm dữ liệu Tìm hiểu thêm +Thêm ngoại lệ cho trang web Ngoại lệ Bật tính năng “Không theo dõi” nghĩa là một yêu cầu sẽ được đi kèm với lưu lượng duyệt web của bạn. Mọi ảnh hưởng đều phụ thuộc vào việc trang web có phản hồi yêu cầu không và cách thức diễn giải yêu cầu. @@ -453,6 +462,7 @@ Ví dụ: một số trang web có thể phản hồi yêu cầu này bằng cá Truy cập Tải ứng dụng từ Cửa hàng Google Play: Tự động báo cáo với Google chi tiết về sự cố bảo mật có thể xảy ra +Hỏi trước trước khi cho phép các trang web sử dụng micrô của bạn (được đề xuất) Xác nhận Tài khoản Google Đã tải xuống Mở trong trình duyệt @@ -515,6 +525,7 @@ Tài khoản Google của bạn có thể có các dạng lịch sử duyệt we Địa chỉ gửi hàng Tải trang web gốc Xem có gì ở gần đây +Luôn cho phép Thêm địa chỉ Di chuyển Xác nhận cụm mật khẩu @@ -559,6 +570,7 @@ Tài khoản Google của bạn có thể có các dạng lịch sử duyệt we Cho phép (dành cho tìm kiếm bằng thanh địa chỉ) Đang đồng bộ hóa với Tab chuẩn +Cho phép Đồng bộ hóa dưới nền cho trang web cụ thể. Bạn cần phải cập nhật TalkBack lên phiên bản mới hơn. Chỉ các trang web đã được phê duyệt Hiển thị toàn bộ lịch sử @@ -593,6 +605,7 @@ Tài khoản Google của bạn có thể có các dạng lịch sử duyệt we Kiểm soát cách hoạt động của ứng dụng này trong Cài đặt Dấu trang đã được đăng nhập. Đăng nhập bằng sẽ hợp nhất dữ liệu đã đồng bộ hóa như dấu trang giữa các tài khoản. Để giữ thông tin riêng biệt, hãy xóa dữ liệu duyệt web trong cài đặt. +Chặn trang web hiển thị cửa sổ bật lên (được đề xuất) Ðịa chỉ giao hàng Tab Dung lượng @@ -622,6 +635,7 @@ Tài khoản Google của bạn có thể có các dạng lịch sử duyệt we Yêu cầu cụm mật khẩu Đặt lại thông tin đăng nhập thiết bị Hiển thị văn bản gốc +Hỏi trước khi cho phép trang web gửi thông báo (được đề xuất) Bạn đang chuyển các tài khoản đồng bộ hóa từ về . Bạn muốn làm gì với dấu trang, lịch sử, mật khẩu hiện có và các cài đặt khác? Trang Web trong cuộc sống lân cận Chế độ xem thân thiện với thiết bị di động diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb index dac83c7adece4..df35285a0fe05 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-CN.xtb @@ -75,7 +75,6 @@ Android 设置中为 Chrome 启用这项权限。 保存密码 起,使用 Google 密码加密所有数据 -控制 Google 如何使用您的浏览记录对 Google 搜索和其他 Google 服务进行个性化设置。 请更新您的登录详细信息。 高级 Chrome Dev 版书签 @@ -101,7 +100,7 @@ 优化 操作系统不支持选择客户端证书。 拖动该滑块,将文字调整到适合您阅读的大小。点按两次某段落后,显示的文字至少应是这么大。 -附近有设备在通过蓝牙播报网页。当您唤醒自己的设备时,Chrome 将会搜索并显示这些网页。这些网页将经由 Google 服务进行处理,以让网页搜索结果的展示效果更理想。 +附近有设备在通过蓝牙播报网页。当您唤醒自己的设备时,Chrome 将会搜索并显示这些网页。这些网页将经由 Google 服务进行处理,以让网页搜索结果的品质更理想。 您可以在 Chrome 设置部分中控制实物网。 @@ -129,6 +128,7 @@ 已展开 - 点击此处即可收起。 新版本已推出 等宽 +允许特定网站运行 JavaScript。 您的家长会协助管理这些设置。 提交 离开 @@ -152,6 +152,7 @@ 地址 允许网站保存和读取 Cookie 数据(推荐) 该帐户由 管理。 +要获取您在其他设备上的标签页,请在 Android 帐号设置部分开启“自动同步数据”。 版权所有 Google Inc. 保留所有权利。 证书查看器 创建密码 @@ -188,12 +189,13 @@ 您目前登录的帐户是一个托管帐户,该帐户的管理员将能够控制您的 Chrome 个人资料。您的 Chrome 数据将永远与此帐户相关联。断开与此帐户的关联将删除本地 Chrome 数据。 分享图片 +在允许网站获悉您的位置信息前先询问(推荐) 未能成功下载 ,因为文件系统出现了错误。 大小: 启用 在任意设备上登录 Google 帐户后,您即可获取自己的书签、历史记录、密码及其他设置。 Smart Lock(密码专用) -新的隐身标签页 +打开新的隐身标签页 接受并继续 有更新。更多选项 文件夹 @@ -240,6 +242,7 @@ 翻译语言: 开放源代码许可 已屏蔽 +同步时出现错误,点按可了解详情。 复制链接地址 一律不翻译 媒体 @@ -254,6 +257,7 @@ 加载更快,流量更省 已将书签添加到“ 日后附近的“实物网”网页将会显示在您的通知列表中 +在允许网站使用您的摄像头前先询问(推荐) 密钥生成 只有知道您密码的人才能读取您的已加密数据。系统不会将该密码发送给 Google,Google 也不会存储该密码。如果您忘记了密码或想更改此设置,则需重置同步设置。了解详情 {DAYS,plural, =1{# 天前}other{# 天前}} @@ -272,6 +276,7 @@ 标签页将移到 Chrome 内的标签页切换器中。 缺少运行 Chrome 所需的关键功能;您可能未完成 Chrome 安装过程,或者 Chrome 与此版本的 Android 不兼容。 缓存的图片和文件 +在您设备的“设置”应用中,通过“帐户”页面添加 Google 帐户。 中打开 更新 上次同步时间: @@ -323,6 +328,7 @@ 保存 家长设置 名称 +允许网站运行 JavaScript(推荐) 已删除“ 此设备的位置信息使用权也已被停用 一律不发送 @@ -360,6 +366,7 @@ 隐身标签页 说明: 要替换“”目录中现有的 吗? +控制 Google 如何利用您的浏览记录为您提供个性化的 Google 搜索、广告和其他 Google 服务。 权限 {HOURS,plural, =1{# 小时前}other{# 小时前}} 配对 @@ -368,6 +375,7 @@ 流量节省程序已启用 关闭 已保存的密码 +在允许网站进入全屏前先询问(推荐) 创建新文件 该网站存储的所有本地数据(包括 Cookie)都将被删除。 Google 翻译 @@ -386,12 +394,13 @@ 修改主页 正在设置… 正在刷新页面 -条目已移除 +该项已移除 没看到您的设备?寻求帮助重新搜索 使网页适合移动设备 国家/地区 节省 的数据流量 了解详情 +添加例外网站 例外 如果您启用了“不跟踪”,您的浏览流量中将会包含一项请求。具体影响取决于网站是否会回应该请求以及如何解读该请求。 @@ -442,7 +451,7 @@ 翻译 正在加载... 已关闭 个标签页 -仅在使用 Wi-Fi 网络时发送 +仅在使用 WLAN 网络时发送 自动填充表单数据 登录后可获取您所有设备上保存的书签、历史记录、密码和其他设置 选择 @@ -453,6 +462,7 @@ 无障碍 从 Google Play 商店下载应用: 自动向Google报告可能出现的安全事件详情 +在允许网站使用您的麦克风前先询问(推荐) 确认 Google 帐户 已下载完毕 在浏览器中打开 @@ -515,6 +525,7 @@ 送货地址 加载原始网站 查看附近的实物网网址 +始终允许 添加地址 移动 确认密码 @@ -559,6 +570,7 @@ 允许(针对地址栏搜索) 正在同步到 标准标签页 +允许特定网站进行后台同步。 您需要将 TalkBack 更新到更高版本。 只能访问经过批准的网站 显示全部历史记录 @@ -593,6 +605,7 @@ 您可以转到设置控制该功能的运行方式 书签 您上次是使用 登录的。如果现在使用 登录,那么已同步到这两个帐户的数据(如书签)将会合并到一起。要分开保存信息,请在设置中清除浏览数据。 +禁止网站显示弹出式窗口(推荐) 送货地址 ,标签页 存储空间 @@ -622,6 +635,7 @@ 必须提供密码 重置设备凭据 显示原始网页 +在允许网站发送通知前先询问(推荐) 您正要将同步帐户从 切换到 。您希望如何处理现有书签、历史记录、密码及其他设置? 附近的“实物网”网页 适合在移动设备上浏览的视图 diff --git a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb index f8dc79a0d3b12..f4d05211f7483 100644 --- a/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/android/java/strings/translations/android_chrome_strings_zh-TW.xtb @@ -3,7 +3,7 @@ 正在搜尋裝置… 取得說明 警告 -永不儲存 +一律不儲存 Chrome 需要存取麥克風,才能與這個網站分享。 您即將登出由 所管理的帳戶。儲存在這個裝置上的 Chrome 資料將因此遭到刪除,但這些資料仍會保留在您的 Google 帳戶中。 已結束 @@ -75,7 +75,6 @@ 請在 Android 設定中為 Chrome 啟用這項權限。 儲存密碼 使用截至 前設定的 Google 密碼為所有資料加密 -控制 Google 如何使用您的瀏覽紀錄,為您提供個人化的搜尋服務和其他各項 Google 服務。 請更新您的登入詳細資料。 進階 Chrome 開發版書籤 @@ -101,7 +100,7 @@ 修正搜尋 作業系統不允許您在用戶端選取憑證。 拖曳滑桿,將文字調整到您可以舒適閱讀的大小。當您輕觸兩下文字段落,文字至少應呈現這樣的大小。 -您附近的裝置正在透過藍牙播送網頁。Chrome 會在您的裝置結束休眠狀態時掃瞄並顯示這些網頁。這些網頁經由 Google 服務處理過後,可讓網頁搜尋結果的品質更臻完善。 +您附近的裝置正在透過藍牙播送網頁。Chrome 會在您的裝置結束休眠狀態時掃描並顯示這些網頁。這些網頁經由 Google 服務處理過後,可讓網頁搜尋結果的品質更臻完善。 您可以在 Chrome 設定中控管「實體化網路」設定。 @@ -129,6 +128,7 @@ 已展開 - 按一下即可收合。 已推出新版本 等寬 +允許特定網站執行 JavaScript。 您的家長會協助管理這些設定。 提交 離開 @@ -152,6 +152,7 @@ 地址 允許網站儲存及讀取 Cookie 資料 (建議) 這個帳戶受 管理。 +如要存取您在其他裝置上開啟的分頁,請前往 Android 帳戶設定開啟 [自動同步處理資料]。 Copyright Google Inc. 版權所有。 憑證檢視器 建立通關密語 @@ -160,7 +161,7 @@ 通關密語不符 取得說明 儲存影片 -可使用「Google 翻譯」翻譯網頁內容 +詢問是否透過 Google 翻譯功能來翻譯網頁內容 在無痕式分頁中開啟 正在存取音訊和視訊輸入 如要存取您在其他裝置上建立的書籤,請登入 Chrome。 @@ -188,6 +189,7 @@ 您即將登入受管理的帳戶,並且讓帳戶管理員控制您的 Chrome 設定檔。您的 Chrome 資料將與這個帳戶建立永久連結。如果與這個帳戶解除連結,本機 Chrome 資料將會遭到刪除。 分享圖片 +允許網站存取您的位置資訊前,必須先詢問您 (建議) 檔案系統發生錯誤,因此無法下載 空間大小: 啟用 @@ -240,6 +242,7 @@ 翻譯語言: 開放原始碼授權 瀏覽的網址已封鎖: +發生同步處理錯誤,輕觸即可取得詳細資料。 複製連結網址 一律不翻譯 媒體 @@ -254,6 +257,7 @@ 在節省數據用量的情況下瀏覽更多網頁 已將書籤加入「 日後附近的實體化網路網頁會顯示在您的通知清單中 +允許網站使用您的攝影機前,必須先詢問您 (建議) 金鑰產生 只有知道您通關密語的使用者,才能讀取加密保護的資料。系統不會將通關密語傳送給 Google,Google 也不會儲存通關密語。如果您忘記自己的通關密語,或是想變更這項設定,則必須重設同步功能。瞭解詳情 {DAYS,plural, =1{# 天前}other{# 天前}} @@ -272,12 +276,13 @@ 分頁將改為顯示在 Chrome 的分頁切換選項中。 找不到執行 Chrome 所需的重要功能;Chrome 安裝程序可能未完成,或是 Chrome 與這個 Android 版本不相容。 快取圖片和檔案 +在裝置的「設定」應用程式中開啟「帳戶」頁面,從中新增 Google 帳戶。 中開啟 更新 上次同步處理時間: 已停止 輕觸即可返回 -信用卡持有人姓名 +持卡人姓名 資料類型 新增信用卡 您與這個網站之間的連線不是私人連線。攻擊者可能會嘗試從 竊取您的資訊 (例如相片、密碼、郵件和信用卡資訊)。 @@ -298,7 +303,7 @@ 已暫停下載。 興趣喜好 同步功能已停用 -這個網頁的內容是,需要翻譯成嗎? +這是網頁,需要翻譯成嗎? 合併分頁與應用程式 清除儲存的資料 這是兒童帳戶 @@ -323,6 +328,7 @@ 儲存 家長設定 名稱 +允許網站執行 JavaScript (建議) 已刪除的「 這個裝置的位置資訊存取功能已一併關閉 一律不傳送 @@ -360,6 +366,7 @@ 無痕式分頁 說明: 您要取代「」目錄中現有的 嗎? +控管 Google 使用您瀏覽紀錄的方式,針對 Google 所提供的個人化搜尋服務、廣告內容和其他各項 Google 服務調整相關設定。 權限 {HOURS,plural, =1{# 小時前}other{# 小時前}} 配對 @@ -368,6 +375,7 @@ 已啟用 Data Saver 關閉 已儲存的密碼 +允許網站進入全螢幕模式前,必須先詢問您 (建議) 建立新檔案 即將刪除這個網站儲存的所有本機資料 (包括 Cookie 在內)。 Google 翻譯 @@ -392,8 +400,9 @@ 國家/地區 節省 的數據流量 瞭解詳情 +新增例外網站 例外 -啟用「不追蹤」功能即表示要求將會包含在您的瀏覽流量中,其效用取決於網站是否回應要求以及如何解讀要求。 +啟用「不追蹤」選項後,您的瀏覽流量會置入一項特定的要求,其作用則視網站是否回應要求,以及網站解讀要求的方式而定。 舉例來說,部分網站可能會以顯示廣告的方式回應這類要求,而這些廣告並非根據您所造訪的其他網站紀錄而產生。許多網站仍會收集您的瀏覽資料,並將這些資料用於下列目的:提高網站安全性、在網站上提供更相關的內容、廣告和推薦項目,以及產生報告統計資料。 列印網頁時發生問題,請再試一次。 @@ -453,6 +462,7 @@ 協助工具 從 Google Play 商店取得應用程式: 自動將疑似安全性事件的詳細資料回報給 Google +允許網站使用您的麥克風前,必須先詢問您 (建議) 確認 Google 帳戶 下載完成 在瀏覽器中開啟 @@ -515,6 +525,7 @@ 寄送地址 載入原始版本 查看附近有無實體化網路網頁 +一律允許 新增地址 移動 確認通關密語 @@ -557,8 +568,9 @@ 資料清除範圍: 刪除 允許 (從網址列搜尋) -正在同步到 +同步的帳戶: 標準分頁 +允許特定網站執行背景同步處理作業。 請更新至新版 TalkBack。 僅限核准的網站 顯示完整記錄 @@ -569,7 +581,7 @@ 進入無痕模式 這個網站使用的安全性設定強度不足 (SHA-1 簽名),因此您的連線可能不是私人連線。 全螢幕 -開啟此頁 +開啟以下網頁 已儲存的密碼會顯示在這裡。 切換為電腦版網站 已允許 (建議) @@ -593,10 +605,11 @@ 您可以在「設定」頁面中管理這項功能的運作方式 書籤 您已登入 。如果現在使用 登入,已同步到兩個帳戶的資料 (例如書籤) 將會合併。如要分開保存資訊,請前往設定清除瀏覽資料。 +禁止網站顯示彈出式視窗 (建議) 運送地址 (分頁) 儲存空間 -找不到書籤 +找不到符合條件的書籤 分享… Google 帳戶 尚未取得家長詳細資料。 @@ -622,6 +635,7 @@ 請提供通關密語 重設裝置憑證 顯示原文 +允許網站傳送通知前,必須先詢問您 (建議) 您設定同步處理的帳戶即將從 改為 。您要如何處理目前帳戶中的書籤、歷史紀錄、密碼和其他設定? 附近的實體化網路網頁 適合透過行動裝置瀏覽的檢視模式 diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni index 92d49b629cfec..2b03708e9e656 100644 --- a/chrome/android/java_sources.gni +++ b/chrome/android/java_sources.gni @@ -208,6 +208,7 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java", + "java/src/org/chromium/chrome/browser/compositor/scene_layer/ToolbarSceneLayer.java", "java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java", "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHelper.java", "java/src/org/chromium/chrome/browser/contextmenu/ContextMenuItemDelegate.java", @@ -599,7 +600,6 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/physicalweb/Utils.java", "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java", "java/src/org/chromium/chrome/browser/precache/FailureReason.java", - "java/src/org/chromium/chrome/browser/precache/PrecacheBootReceiver.java", "java/src/org/chromium/chrome/browser/precache/PrecacheController.java", "java/src/org/chromium/chrome/browser/precache/PrecacheLauncher.java", "java/src/org/chromium/chrome/browser/precache/PrecacheTaskScheduler.java", diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java index 11b8bfdd40d18..af060f6edb9bf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeBackupIntegrationTest.java @@ -12,16 +12,25 @@ import android.preference.PreferenceManager; import android.test.suitebuilder.annotation.SmallTest; +import org.chromium.base.StreamUtil; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor; import org.chromium.chrome.browser.firstrun.FirstRunStatus; +import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.signin.AccountIdProvider; import org.chromium.chrome.test.ChromeTabbedActivityTestBase; import org.chromium.sync.signin.AccountManagerHelper; import org.chromium.sync.signin.ChromeSigninController; import org.chromium.sync.test.util.MockAccountManager; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + /** * Android backup tests. */ @@ -30,6 +39,9 @@ public class ChromeBackupIntegrationTest extends ChromeTabbedActivityTestBase { private static final String GOOGLE_ACCOUNT_TYPE = "com.google"; + private static final String TEST_ACCOUNT_1 = "user1@gmail.com"; + private static final String TEST_ACCOUNT_2 = "user2@gmail.com"; + private Context mTargetContext; @Override public void startMainActivity() throws InterruptedException { @@ -55,66 +67,136 @@ static class ChromeTestBackupAgent extends ChromeBackupAgent { // class. attachBaseContext(context); } + + @Override + protected Account[] getAccounts() { + // ChromeBackupAgent can't use Chrome's account manager, so we override this to mock + // the existence of the account. + return new Account[] {new Account(TEST_ACCOUNT_1, GOOGLE_ACCOUNT_TYPE)}; + } + + } + + @Override + public void setUp() throws Exception { + super.setUp(); + clearAppData(); + + mTargetContext = getInstrumentation().getTargetContext(); + + // Create a mock account manager. Although this isn't used by ChromeBackupAgent it is used + // when we test the result by starting Chrome. + ChromeBackupAgent.allowChromeApplicationForTesting(); + Account account = new Account(TEST_ACCOUNT_1, GOOGLE_ACCOUNT_TYPE); + MockAccountManager accountManager = + new MockAccountManager(mTargetContext, getInstrumentation().getContext(), account); + AccountManagerHelper.overrideAccountManagerHelperForTests(mTargetContext, accountManager); + AccountIdProvider.setInstanceForTest(new MockAccountIdProvider()); } @SmallTest @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) - public void testSimpleRestore() throws InterruptedException { - Context targetContext = getInstrumentation().getTargetContext(); + public void testSimpleRestore() throws InterruptedException, IOException { // Fake having previously gone through FRE and signed in. - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(targetContext); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mTargetContext); SharedPreferences.Editor preferenceEditor = prefs.edit(); preferenceEditor.putBoolean(FirstRunStatus.FIRST_RUN_FLOW_COMPLETE, true); preferenceEditor.putBoolean(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_SETUP, true); - preferenceEditor.putString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, "user1@gmail.com"); - preferenceEditor.commit(); - Account account = new Account("user1@gmail.com", GOOGLE_ACCOUNT_TYPE); - MockAccountManager accountManager = - new MockAccountManager(targetContext, getInstrumentation().getContext(), account); - AccountManagerHelper.overrideAccountManagerHelperForTests(targetContext, accountManager); - AccountIdProvider.setInstanceForTest(new MockAccountIdProvider()); + String chromeInputPrefs = + "{\"junk1\":\"abc\", " + + "\"sync\":{ \"has_setup_completed\":\"true\", " + + " \"keep_everything_synced\":\"false\", " + + " \"passwords\":\"true\", " + + " \"junk2\":\"xxx\"" + + " }}"; + + writeTestChromePrefs(chromeInputPrefs); + + // Set up the mocked account as the signed in account. + preferenceEditor.putString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, TEST_ACCOUNT_1); + preferenceEditor.commit(); // Run Chrome's restore code. - new ChromeTestBackupAgent(targetContext).onRestoreFinished(); + new ChromeTestBackupAgent(mTargetContext).onRestoreFinished(); // Start Chrome and check that it signs in. startMainActivityFromLauncher(); - assertTrue(ChromeSigninController.get(targetContext).isSignedIn()); - assertEquals("user1@gmail.com", - ChromeSigninController.get(targetContext).getSignedInAccountName()); + assertTrue(ChromeSigninController.get(mTargetContext).isSignedIn()); + assertEquals(TEST_ACCOUNT_1, + ChromeSigninController.get(mTargetContext).getSignedInAccountName()); + + String chromeOutputPrefs = readChromePrefs(); + + assertTrue(chromeOutputPrefs.contains("\"keep_everything_synced\":\"false\"")); + assertTrue(chromeOutputPrefs.contains("\"passwords\":\"true\"")); + assertFalse(chromeOutputPrefs.contains("junk")); + } + @SmallTest @MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) - public void testRestoreAccountMissing() throws InterruptedException { - Context targetContext = getInstrumentation().getTargetContext(); - + public void testRestoreAccountMissing() throws InterruptedException, IOException { // Fake having previously gone through FRE and signed in. - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(targetContext); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mTargetContext); SharedPreferences.Editor preferenceEditor = prefs.edit(); preferenceEditor.putBoolean(FirstRunStatus.FIRST_RUN_FLOW_COMPLETE, true); preferenceEditor.putBoolean(FirstRunSignInProcessor.FIRST_RUN_FLOW_SIGNIN_SETUP, true); - preferenceEditor.putString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, "user1@gmail.com"); + + // Use an account that hasn't been created by the mocks as the signed in account. + preferenceEditor.putString(ChromeSigninController.SIGNED_IN_ACCOUNT_KEY, TEST_ACCOUNT_2); preferenceEditor.commit(); - // Create a mock account manager with a different account - Account account = new Account("user2@gmail.com", GOOGLE_ACCOUNT_TYPE); - MockAccountManager accountManager = - new MockAccountManager(targetContext, getInstrumentation().getContext(), account); - AccountManagerHelper.overrideAccountManagerHelperForTests(targetContext, accountManager); - AccountIdProvider.setInstanceForTest(new MockAccountIdProvider()); + String chromeInputPrefs = "{}"; + writeTestChromePrefs(chromeInputPrefs); // Run Chrome's restore code. - new ChromeTestBackupAgent(targetContext).onRestoreFinished(); + new ChromeTestBackupAgent(mTargetContext).onRestoreFinished(); // Start Chrome. startMainActivityFromLauncher(); // Since the account didn't exist, Chrome should not be signed in. - assertFalse(ChromeSigninController.get(targetContext).isSignedIn()); + assertFalse(ChromeSigninController.get(mTargetContext).isSignedIn()); + } + + private void writeTestChromePrefs(String chromeInputPrefs) + throws FileNotFoundException, UnsupportedEncodingException, IOException { + FileOutputStream prefsFileWriter = null; + try { + File prefsDir = + mTargetContext.getDir(ChromeBrowserInitializer.PRIVATE_DATA_DIRECTORY_SUFFIX, + Context.MODE_PRIVATE); + prefsDir = new File(prefsDir, "Default"); + assertTrue(prefsDir.mkdirs()); + File prefsFile = new File(prefsDir, "Preferences"); + prefsFileWriter = new FileOutputStream(prefsFile); + prefsFileWriter.write(chromeInputPrefs.getBytes("UTF-8")); + } finally { + StreamUtil.closeQuietly(prefsFileWriter); + } + } + + private String readChromePrefs() + throws FileNotFoundException, IOException, UnsupportedEncodingException { + FileInputStream prefsFileReader = null; + try { + File prefsDir = + mTargetContext.getDir(ChromeBrowserInitializer.PRIVATE_DATA_DIRECTORY_SUFFIX, + Context.MODE_PRIVATE); + prefsDir = new File(prefsDir, "Default"); + File prefsFile = new File(prefsDir, "Preferences"); + prefsFileReader = new FileInputStream(prefsFile); + int fileLength = (int) prefsFile.length(); + byte[] inputBuffer = new byte[fileLength]; + assertEquals(fileLength, prefsFileReader.read(inputBuffer)); + return new String(inputBuffer, "UTF-8"); + } finally { + StreamUtil.closeQuietly(prefsFileReader); + } } } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/MockResourcesForLayout.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/MockResourcesForLayout.java index bf3b7cf535f9b..b1a14033ddf4a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/MockResourcesForLayout.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/MockResourcesForLayout.java @@ -73,7 +73,9 @@ public MockResourcesForLayout(Resources resources) { mBooleans.put(org.chromium.chrome.R.bool.compositor_tab_title_fake_bold_text, true); mStrings.put(R.string.tab_loading_default_title, "Loading..."); mFloats.put(org.chromium.chrome.R.dimen.overlay_panel_bar_height, 56.f); - mFloats.put(org.chromium.chrome.R.dimen.control_container_height, 56.0f); + mFloats.put(org.chromium.chrome.R.dimen.control_container_height, 56.f); + mFloats.put(org.chromium.chrome.R.dimen.contextual_search_peek_promo_height, 48.f); + mFloats.put(org.chromium.chrome.R.dimen.contextual_search_peek_promo_padding, 12.f); } @Override diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java index b7c9ae1f056bb..abf7f8c339cb8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java @@ -24,10 +24,13 @@ import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryProcessType; import org.chromium.base.test.util.Restriction; +import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.content_public.browser.WebContents; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.FutureTask; /** Tests for CustomTabsConnection. */ public class CustomTabsConnectionTest extends InstrumentationTestCase { @@ -48,6 +51,7 @@ protected void setUp() throws Exception { LibraryLoader.get(LibraryProcessType.PROCESS_BROWSER) .ensureInitialized(mContext); mCustomTabsConnection = CustomTabsTestUtils.setUpConnection((Application) mContext); + mCustomTabsConnection.resetThrottling(mContext, Process.myUid()); } @Override @@ -454,4 +458,84 @@ public void testThrottlingAcrossSessions() { } assertWarmupAndMayLaunchUrl(cb2, URL, false); } + + @SmallTest + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) + public void testBanningWorks() { + mCustomTabsConnection.ban(mContext, Process.myUid()); + final ICustomTabsCallback token = new CustomTabsTestUtils.DummyCallback(); + assertTrue(mCustomTabsConnection.newSession(token)); + + assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + assertSpareWebContentsNotNullAndDestroy(); + String referrer = mCustomTabsConnection.getReferrerForSession( + token.asBinder()).getUrl(); + assertNull( + mCustomTabsConnection.takePrerenderedUrl(token.asBinder(), URL, referrer)); + } + }); + } + + @SmallTest + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) + public void testBanningDisabledForCellular() { + mCustomTabsConnection.ban(mContext, Process.myUid()); + final ICustomTabsCallback token = new CustomTabsTestUtils.DummyCallback(); + assertTrue(mCustomTabsConnection.newSession(token)); + mCustomTabsConnection.setShouldPrerenderOnCellularForSession(token.asBinder(), true); + + assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + assertNull(mCustomTabsConnection.takeSpareWebContents()); + String referrer = mCustomTabsConnection.getReferrerForSession( + token.asBinder()).getUrl(); + WebContents prerender = mCustomTabsConnection.takePrerenderedUrl( + token.asBinder(), URL, referrer); + assertNotNull(prerender); + prerender.destroy(); + } + }); + } + + @SmallTest + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) + public void testCellularPrerenderingDoesntOverrideSettings() throws Exception { + final ICustomTabsCallback token = new CustomTabsTestUtils.DummyCallback(); + assertTrue(mCustomTabsConnection.newSession(token)); + mCustomTabsConnection.setShouldPrerenderOnCellularForSession(token.asBinder(), true); + mCustomTabsConnection.warmup(0); + + // Needs the browser process to be initialized. + FutureTask result = ThreadUtils.runOnUiThread(new Callable() { + @Override + public Boolean call() { + PrefServiceBridge prefs = PrefServiceBridge.getInstance(); + boolean result = prefs.getNetworkPredictionEnabled(); + prefs.setNetworkPredictionEnabled(false); + return result; + }}); + final boolean enabled = result.get(); + + try { + assertTrue(mCustomTabsConnection.mayLaunchUrl(token, Uri.parse(URL), null, null)); + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + assertSpareWebContentsNotNullAndDestroy(); + } + }); + } finally { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + PrefServiceBridge.getInstance().setNetworkPredictionEnabled(enabled); + } + }); + } + } } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java index 4426638f3a116..1b27dd5e3355f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java @@ -421,7 +421,7 @@ private void waitForTopControlsToBeMoveable(final Tab tab) throws InterruptedExc fullscreenManager.addListener(new FullscreenListener() { @Override - public void onVisibleContentOffsetChanged(float offset) { + public void onVisibleContentOffsetChanged(float offset, boolean needsAnimate) { if (offset != initialVisibleContentOffset) { contentMovedCallback.notifyCalled(); fullscreenManager.removeListener(this); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheControllerTest.java index 65a9d46057755..613fcbeebfaa2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheControllerTest.java @@ -71,21 +71,29 @@ static class MockPrecacheTaskScheduler extends PrecacheTaskScheduler { public int cancelContinuationCnt = 0; @Override - void scheduleTask(Context context, Task task) { + boolean canScheduleTasks(Context context) { + return false; + } + + @Override + boolean scheduleTask(Context context, Task task) { + if (!canScheduleTasks(context)) return true; if (PrecacheController.PERIODIC_TASK_TAG.equals(task.getTag())) { schedulePeriodicCnt++; } else if (PrecacheController.CONTINUATION_TASK_TAG.equals(task.getTag())) { scheduleContinuationCnt++; } + return true; } @Override - void cancelTask(Context context, String tag) { + boolean cancelTask(Context context, String tag) { if (PrecacheController.PERIODIC_TASK_TAG.equals(tag)) { cancelPeriodicCnt++; } else if (PrecacheController.CONTINUATION_TASK_TAG.equals(tag)) { cancelContinuationCnt++; } + return true; } } @@ -108,8 +116,7 @@ protected void setUp() throws Exception { protected void verifyScheduledAndCanceledCounts( int expectedPeriodicScheduled, int expectedContinuationScheduled, int expectedPeriodicCanceled, int expectedContinuationCanceled) { - // This experimental feature should not run on Chrome Stable. - if (!PrecacheController.canScheduleTasks(mContext)) { + if (!mPrecacheTaskScheduler.canScheduleTasks(mContext)) { expectedPeriodicScheduled = 0; expectedContinuationScheduled = 0; } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java index 84c8b5e1faa1c..50766b72d24fb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java @@ -7,6 +7,8 @@ import android.content.Context; import android.test.suitebuilder.annotation.SmallTest; +import com.google.android.gms.gcm.Task; + import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.sync.ProfileSyncService; @@ -23,6 +25,7 @@ public class PrecacheLauncherTest extends NativeLibraryTestBase { private StubProfileSyncService mSync; private PrecacheLauncherUnderTest mLauncher; + private MockPrecacheTaskScheduler mPrecacheTaskScheduler; private class PrecacheLauncherUnderTest extends PrecacheLauncher { private boolean mShouldRun = false; @@ -63,6 +66,18 @@ public void setSyncInitialized(boolean syncInitialized) { } } + static class MockPrecacheTaskScheduler extends PrecacheTaskScheduler { + @Override + boolean scheduleTask(Context context, Task task) { + return true; + } + + @Override + boolean cancelTask(Context context, String tag) { + return true; + } + } + @Override protected void setUp() throws Exception { super.setUp(); @@ -70,6 +85,9 @@ protected void setUp() throws Exception { // the fly without needing to set up a sync backend. mLauncher = new PrecacheLauncherUnderTest(); + mPrecacheTaskScheduler = new MockPrecacheTaskScheduler(); + PrecacheController.setTaskScheduler(mPrecacheTaskScheduler); + // The target context persists throughout the entire test run, and so leaks state between // tests. We reset the is_precaching_enabled pref to false to make the test run consistent, // in case another test class has modified this pref. diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/DocumentModeAssassinTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/DocumentModeAssassinTest.java index b606986d6271d..a9a4acbc957fd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/DocumentModeAssassinTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/DocumentModeAssassinTest.java @@ -447,7 +447,7 @@ private void confirmTabModelMetadataFileIsCorrect(@Nullable TabStateInfo failure // Load up the TabModel metadata. int numExpectedTabs = TEST_INFO.numRegularTabs + TEST_INFO.numIncognitoTabs; - store.loadState(); + store.loadState(false /* ignoreIncognitoFiles */); mockObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); mockObserver.detailsReadCallback.waitForCallback(0, TEST_INFO.contents.length); @@ -662,4 +662,4 @@ private void setUpDocumentDirectory() throws Exception { TabState.SAVED_TAB_STATE_FILE_PREFIX + "_unparseable"); } -} \ No newline at end of file +} diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java index 89504bf4bc65f..589338be61c9b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java @@ -232,7 +232,7 @@ public void testFindsMaxIdProperly() throws IOException { int maxId = Math.max(getMaxId(selector0), getMaxId(selector1)); RecordHistogram.disableForTests(); - storeIn.loadState(); + storeIn.loadState(false /* ignoreIncognitoFiles */); assertEquals("Invalid next id", maxId + 1, TabIdManager.getInstance().generateValidId(Tab.INVALID_TAB_ID)); } @@ -261,8 +261,8 @@ public void testOnlyLoadsSingleModel() throws IOException { getInstrumentation().getTargetContext(), null, null); RecordHistogram.disableForTests(); - storeIn0.loadState(); - storeIn1.loadState(); + storeIn0.loadState(false /* ignoreIncognitoFiles */); + storeIn1.loadState(false /* ignoreIncognitoFiles */); assertEquals("Unexpected number of tabs to load", 6, storeIn0.getRestoredTabCount()); assertEquals("Unexpected number of tabst o load", 3, storeIn1.getRestoredTabCount()); diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index 6d53254e54beb..c1d7871d25069 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java @@ -257,7 +257,7 @@ public void testBasic() throws Exception { new TabPersistentStore(mockSelector, 0, context, mockManager, mockObserver); // Make sure the metadata file loads properly and in order. - store.loadState(); + store.loadState(false /* ignoreIncognitoFiles */); mockObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); @@ -301,7 +301,7 @@ public void testInterruptedButStillRestoresAllTabs() throws Exception { MockTabPersistentStoreObserver firstObserver = new MockTabPersistentStoreObserver(); final TabPersistentStore firstStore = new TabPersistentStore( firstSelector, 0, context, firstManager, firstObserver); - firstStore.loadState(); + firstStore.loadState(false /* ignoreIncognitoFiles */); firstObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, firstObserver.mTabCountAtStartup); firstObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); @@ -325,7 +325,7 @@ public void run() { // Make sure that all of the Tabs appear in the new one -- even though the new file was // written before the first TabPersistentStore loaded any TabState files and added them to // the TabModels. - secondStore.loadState(); + secondStore.loadState(false /* ignoreIncognitoFiles */); secondObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, secondObserver.mTabCountAtStartup); @@ -380,7 +380,7 @@ public void testMissingTabStateButStillRestoresTab() throws Exception { new TabPersistentStore(mockSelector, 0, context, mockManager, mockObserver); // Make sure the metadata file loads properly and in order. - store.loadState(); + store.loadState(false /* ignoreIncognitoFiles */); mockObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); @@ -422,7 +422,7 @@ public void testRestoresTabWithMissingTabStateWhileIgnoringIncognitoTab() throws getInstrumentation().getTargetContext(), mockManager, mockObserver); // Load the TabModel metadata. - store.loadState(); + store.loadState(false /* ignoreIncognitoFiles */); mockObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); mockObserver.detailsReadCallback.waitForCallback(0, numExpectedTabs); @@ -514,7 +514,7 @@ private TestTabModelSelector createAndRestoreRealTabModelImpls(TabModelMetaDataI // Load up the TabModel metadata. int numExpectedTabs = info.numRegularTabs + info.numIncognitoTabs; - store.loadState(); + store.loadState(false /* ignoreIncognitoFiles */); mockObserver.initializedCallback.waitForCallback(0, 1); assertEquals(numExpectedTabs, mockObserver.mTabCountAtStartup); mockObserver.detailsReadCallback.waitForCallback(0, info.contents.length); diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java index 20e1cb013f532..1ad63af6587f8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBackupAgentTest.java @@ -5,18 +5,33 @@ package org.chromium.chrome.browser; import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; +import static org.junit.matchers.JUnitMatchers.containsString; +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; +import org.chromium.base.ContextUtils; import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; + /** * Unit tests for {@link org.chromium.chrome.browser.ChromeBackupAgent}. */ @@ -25,15 +40,55 @@ public class ChromeBackupAgentTest { static class ChromeTestBackupAgent extends ChromeBackupAgent { - ChromeTestBackupAgent() { + + private ByteArrayInputStream mInputStream; + private ByteArrayOutputStream mOutputStream; + + ChromeTestBackupAgent(byte[] mChromeInputPrefs) { // This is protected in ContextWrapper, so can only be called within a derived // class. attachBaseContext(Robolectric.application); + mInputStream = new ByteArrayInputStream(mChromeInputPrefs); + mOutputStream = new ByteArrayOutputStream(); + } + + @Override + protected InputStream openInputStream(File prefsFile) throws FileNotFoundException { + return mInputStream; + + } + + @Override + protected OutputStream openOutputStream(File prefsFile) throws FileNotFoundException { + return mOutputStream; + } + + @Override + public File getDir(String name, int mode) { + return null; + } + + @Override + protected long getFileLength(File prefsFile) { + return mInputStream.available(); } + + byte[] getOutputData() { + return mOutputStream.toByteArray(); + } + } + + @Before + public void setUp() throws Exception { + ContextUtils.initApplicationContextForTests(Robolectric.application); + AccountManager manager = + (AccountManager) Robolectric.application.getSystemService(Context.ACCOUNT_SERVICE); + manager.addAccountExplicitly(new Account("user1", "dummy"), null, null); + manager.addAccountExplicitly(new Account("user2", "dummy"), null, null); } @Test - public void testOnRestoreFinished() { + public void testOnRestoreFinished() throws UnsupportedEncodingException { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(Robolectric.application); SharedPreferences.Editor editor = sharedPrefs.edit(); @@ -42,9 +97,25 @@ public void testOnRestoreFinished() { editor.putString("junk", "junk"); editor.commit(); - new ChromeTestBackupAgent().onRestoreFinished(); + String chromeInputPrefs = + "{\"junk1\":\"abc\", " + + "\"sync\":{ \"has_setup_completed\":\"true\", " + + " \"keep_everything_synced\":\"false\", " + + " \"junk2\":\"xxx\"" + + " }}"; + byte[] chromePrefsBuffer = chromeInputPrefs.getBytes("UTF-8"); + ChromeTestBackupAgent chromeTestBackupAgent = new ChromeTestBackupAgent(chromePrefsBuffer); + chromeTestBackupAgent.onRestoreFinished(); + + String chromeOutputPrefs = new String(chromeTestBackupAgent.getOutputData(), "UTF-8"); + + // Check that we have only restored the correct Chrome preferences + assertThat(chromeOutputPrefs, containsString("\"has_setup_completed\":\"true\"")); + assertThat(chromeOutputPrefs, containsString("\"keep_everything_synced\":\"false\"")); + assertThat(chromeOutputPrefs, not(containsString("junk"))); - // Check that we have only restored the correct preferences + + // Check that we have only restored the correct Android preferences assertThat(sharedPrefs.getBoolean("crash_dump_upload", true), equalTo(false)); assertThat(sharedPrefs.getString("google.services.username", null), nullValue()); assertThat(sharedPrefs.getString("junk", null), nullValue()); @@ -53,4 +124,64 @@ public void testOnRestoreFinished() { assertThat(sharedPrefs.getString("first_run_signin_account_name", null), equalTo("user1")); } + @Test + public void testOnRestoreFinishedNoUser() throws UnsupportedEncodingException { + SharedPreferences sharedPrefs = + PreferenceManager.getDefaultSharedPreferences(Robolectric.application); + SharedPreferences.Editor editor = sharedPrefs.edit(); + editor.putBoolean("crash_dump_upload", false); + editor.putString("junk", "junk"); + editor.commit(); + + String chromeInputPrefs = + "{\"junk1\":\"abc\", " + + "\"sync\":{ \"has_setup_completed\":\"true\", " + + " \"keep_everything_synced\":\"false\", " + + " \"junk2\":\"xxx\"" + + " }}"; + byte[] chromePrefsBuffer = chromeInputPrefs.getBytes("UTF-8"); + ChromeTestBackupAgent chromeTestBackupAgent = new ChromeTestBackupAgent(chromePrefsBuffer); + chromeTestBackupAgent.onRestoreFinished(); + + // Check that we haven't restored any Chrome preferences + String chromeOutputPrefs = new String(chromeTestBackupAgent.getOutputData(), "UTF-8"); + assertThat(chromeOutputPrefs, equalTo("")); + + // Check that we haven't restored any Android preferences + assertThat(sharedPrefs.getBoolean("crash_dump_upload", true), equalTo(true)); + assertThat(sharedPrefs.getString("google.services.username", null), nullValue()); + assertThat(sharedPrefs.getString("junk", null), nullValue()); + assertThat(sharedPrefs.getString("first_run_signin_account_name", null), nullValue()); + } + + @Test + public void testOnRestoreFinishedWrongUser() throws UnsupportedEncodingException { + SharedPreferences sharedPrefs = + PreferenceManager.getDefaultSharedPreferences(Robolectric.application); + SharedPreferences.Editor editor = sharedPrefs.edit(); + editor.putBoolean("crash_dump_upload", false); + editor.putString("google.services.username", "wrong_user"); + editor.putString("junk", "junk"); + editor.commit(); + + String chromeInputPrefs = + "{\"junk1\":\"abc\", " + + "\"sync\":{ \"has_setup_completed\":\"true\", " + + " \"keep_everything_synced\":\"false\", " + + " \"junk2\":\"xxx\"" + + " }}"; + byte[] chromePrefsBuffer = chromeInputPrefs.getBytes("UTF-8"); + ChromeTestBackupAgent chromeTestBackupAgent = new ChromeTestBackupAgent(chromePrefsBuffer); + chromeTestBackupAgent.onRestoreFinished(); + + // Check that we haven't restored any Chrome preferences + String chromeOutputPrefs = new String(chromeTestBackupAgent.getOutputData(), "UTF-8"); + assertThat(chromeOutputPrefs, equalTo("")); + + // Check that we haven't restored any Android preferences + assertThat(sharedPrefs.getBoolean("crash_dump_upload", true), equalTo(true)); + assertThat(sharedPrefs.getString("google.services.username", null), nullValue()); + assertThat(sharedPrefs.getString("junk", null), nullValue()); + assertThat(sharedPrefs.getString("first_run_signin_account_name", null), nullValue()); + } } diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java index 327ece2474aff..2685295e48ed1 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/cards/NewTabPageAdapterTest.java @@ -123,7 +123,7 @@ public void testSnippetClearing() { assertEquals(3 + snippets.size(), ntpa.getItemCount()); // When we clear the snippets, we should only have the header and above-the-fold left. - mSnippetsObserver.onSnippetsCleared(); + mSnippetsObserver.onSnippetsDisabled(); assertEquals(3, ntpa.getItemCount()); // The adapter should now be waiting for new snippets. diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java index dc62276a9cee7..02e84be092ed1 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java @@ -43,7 +43,7 @@ public void startMainActivity() throws InterruptedException { @Feature({"Sync"}) public void testFreSignin() throws Exception { Account testAccount = SigninTestUtil.get().addTestAccount(); - SyncTestUtil.verifySyncIsSignedOut(mContext); + SyncTestUtil.verifySyncIsSignedOut(); assertFalse(AndroidSyncSettings.isChromeSyncEnabled(mContext)); processFirstRun(testAccount.name, ShowSyncSettings.NO); assertEquals( @@ -56,11 +56,11 @@ public void testFreSignin() throws Exception { @Feature({"Sync"}) public void testFreNoSignin() throws Exception { SigninTestUtil.get().addTestAccount(); - SyncTestUtil.verifySyncIsSignedOut(mContext); + SyncTestUtil.verifySyncIsSignedOut(); assertFalse(AndroidSyncSettings.isChromeSyncEnabled(mContext)); processFirstRun(null, ShowSyncSettings.NO); assertNull(ChromeSigninController.get(mContext).getSignedInAccountName()); - SyncTestUtil.verifySyncIsSignedOut(mContext); + SyncTestUtil.verifySyncIsSignedOut(); assertFalse(AndroidSyncSettings.isChromeSyncEnabled(mContext)); } diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java index da33002ccb1c3..52a68018ff483 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncCustomizationFragmentTest.java @@ -21,6 +21,7 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.R; import org.chromium.chrome.browser.autofill.PersonalDataManager; +import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard; import org.chromium.chrome.browser.preferences.Preferences; import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment; @@ -37,6 +38,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; @@ -305,6 +307,58 @@ public void testPaymentsIntegrationCheckboxEnablesPaymentsIntegration() throws E assertPaymentsIntegrationEnabled(true); } + @SmallTest + @Feature({"Sync"}) + public void testPaymentsIntegrationCheckboxClearsServerAutofillCreditCards() throws Exception { + setUpTestAccountAndSignInToSync(); + + setPaymentsIntegrationEnabled(true); + + assertFalse("There should be no server cards", hasServerAutofillCreditCards()); + addServerAutofillCreditCard(); + assertTrue("There should be server cards", hasServerAutofillCreditCards()); + + SyncCustomizationFragment fragment = startSyncCustomizationFragment(); + assertDefaultSyncOnState(fragment); + SwitchPreference syncEverything = getSyncEverything(fragment); + togglePreference(syncEverything); + + CheckBoxPreference paymentsIntegration = (CheckBoxPreference) fragment.findPreference( + SyncCustomizationFragment.PREFERENCE_PAYMENTS_INTEGRATION); + togglePreference(paymentsIntegration); + + closeFragment(fragment); + assertPaymentsIntegrationEnabled(false); + + assertFalse("There should be no server cards remaining", hasServerAutofillCreditCards()); + } + + @SmallTest + @Feature({"Sync"}) + public void testSyncSwitchClearsServerAutofillCreditCards() throws Exception { + setUpTestAccountAndSignInToSync(); + + setPaymentsIntegrationEnabled(true); + + assertFalse("There should be no server cards", hasServerAutofillCreditCards()); + addServerAutofillCreditCard(); + assertTrue("There should be server cards", hasServerAutofillCreditCards()); + + assertTrue(AndroidSyncSettings.isChromeSyncEnabled(mContext)); + SyncCustomizationFragment fragment = startSyncCustomizationFragment(); + assertDefaultSyncOnState(fragment); + SwitchPreference syncSwitch = getSyncSwitch(fragment); + assertTrue(syncSwitch.isChecked()); + assertTrue(AndroidSyncSettings.isChromeSyncEnabled(mContext)); + togglePreference(syncSwitch); + assertFalse(syncSwitch.isChecked()); + assertFalse(AndroidSyncSettings.isChromeSyncEnabled(mContext)); + + closeFragment(fragment); + + assertFalse("There should be no server cards remaining", hasServerAutofillCreditCards()); + } + @SmallTest @Feature({"Sync"}) public void testPaymentsIntegrationDisabledByAutofillSyncCheckbox() throws Exception { @@ -636,6 +690,31 @@ public void run() { }); } + private void addServerAutofillCreditCard() throws Exception { + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + boolean isLocal = false; + PersonalDataManager.getInstance().addServerCreditCardForTest(new CreditCard("", + "https://example.com", isLocal, false, "Jon Doe", "4111111111111111", + "1111", "11", "20", "visa", 0)); + } + }); + } + + private boolean hasServerAutofillCreditCards() throws Exception { + return ThreadUtils.runOnUiThreadBlocking(new Callable() { + @Override + public Boolean call() { + List cards = PersonalDataManager.getInstance().getCreditCards(); + for (int i = 0; i < cards.size(); i++) { + if (!cards.get(i).getIsLocal()) return true; + } + return false; + } + }).booleanValue(); + } + private void waitForBackendInitialized() throws InterruptedException { CriteriaHelper.pollUiThread(new Criteria( "Timed out waiting for sync's backend to be initialized.") { diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java index 60316efe96da2..0b235ed834fb7 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java @@ -56,13 +56,41 @@ public void testSignInAndOut() throws InterruptedException { // Signing out should disable sync. signOut(); - SyncTestUtil.verifySyncIsSignedOut(mContext); + SyncTestUtil.verifySyncIsSignedOut(); // Signing back in should re-enable sync. signIn(account); SyncTestUtil.verifySyncIsActiveForAccount(mContext, account); } + @LargeTest + @Feature({"Sync"}) + public void testStopAndClear() throws InterruptedException { + setUpTestAccountAndSignInToSync(); + CriteriaHelper.pollUiThread( + new Criteria("Timed out checking that isSignedInOnNative() == true") { + @Override + public boolean isSatisfied() { + return SigninManager.get(mContext).isSignedInOnNative(); + } + }, + SyncTestUtil.TIMEOUT_MS, SyncTestUtil.INTERVAL_MS); + + clearServerData(); + + // Clearing server data should turn off sync and sign out of chrome. + SyncTestUtil.verifySyncIsSignedOut(); + assertFalse(ChromeSigninController.get(mContext).isSignedIn()); + CriteriaHelper.pollUiThread( + new Criteria("Timed out checking that isSignedInOnNative() == false") { + @Override + public boolean isSatisfied() { + return !SigninManager.get(mContext).isSignedInOnNative(); + } + }, + SyncTestUtil.TIMEOUT_MS, SyncTestUtil.INTERVAL_MS); + } + /* * @FlakyTest * @LargeTest diff --git a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java index daff9fdfd7f6a..ecc3f7ede5607 100644 --- a/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java +++ b/chrome/android/sync_shell/javatests/src/org/chromium/chrome/browser/sync/SyncTestBase.java @@ -138,9 +138,9 @@ private void setUpMockAndroidSyncSettings() { AndroidSyncSettings.overrideForTests(mContext, mSyncContentResolver); } - protected Account setUpTestAccount() throws InterruptedException { + protected Account setUpTestAccount() { Account account = SigninTestUtil.get().addAndSignInTestAccount(); - SyncTestUtil.verifySyncIsSignedOut(getActivity()); + SyncTestUtil.verifySyncIsSignedOut(); return account; } @@ -150,7 +150,7 @@ protected Account setUpTestAccountAndSignInToSync() throws InterruptedException return account; } - protected void startSync() throws InterruptedException { + protected void startSync() { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override public void run() { @@ -198,7 +198,7 @@ public void run() { } }); assertTrue(s.tryAcquire(SyncTestUtil.TIMEOUT_MS, TimeUnit.MILLISECONDS)); - SyncTestUtil.verifySyncIsSignedOut(mContext); + SyncTestUtil.verifySyncIsSignedOut(); } protected void clearServerData() throws InterruptedException { diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h index ad1c9639724fc..3bc88e412221d 100644 --- a/chrome/app/chrome_command_ids.h +++ b/chrome/app/chrome_command_ids.h @@ -33,6 +33,12 @@ #define IDC_RELOAD_BYPASSING_CACHE 33007 #define IDC_LOAD_NEW_TAB_PAGE 33008 #define IDC_RELOAD_CLEARING_CACHE 33009 +// Temporary commands to capture the old Back/Forward shortcuts and tell users +// the new shortcut. May also trigger Back/Forward action if the +// BackspaceGoesBack field trial is enabled. +// TODO(mgiuca): Remove these in M54 (https://crbug.com/610039). +#define IDC_BACKSPACE_BACK 33010 +#define IDC_BACKSPACE_FORWARD 33011 // Window management commands #define IDC_NEW_WINDOW 34000 diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index cdaf2d756f124..0ce847aaf7b06 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -10967,7 +10967,7 @@ I don't think this site should be blocked! Personalize Google services - Google may use your browsing history to personalize Search and other Google services + Google may use your browsing history to personalize Search, ads, and other Google services Control how this works in <a id="settingsLink" href="#">Settings</a>. @@ -11610,7 +11610,7 @@ Some features may be unavailable. Please check that the profile exists and you - Control how Google uses your browsing history to personalize Search and other Google services from <a id="activity-controls" href="$1" target="_blank">Google Activity Controls</a>. + Control how Google uses your browsing history to personalize Search, ads, and other Google services from <a id="activity-controls" href="$1" target="_blank"><a id="activity-controls" href="$1" target="_blank">Google Activity Controls</a></a>. @@ -12663,6 +12663,14 @@ Some features may be unavailable. Please check that the profile exists and you Deny + + + Press |$1Alt|+|$2| to go back + + + Press |$1Alt|+|$2| to go forward + + email diff --git a/chrome/app/nibs/BookmarkBar.xib b/chrome/app/nibs/BookmarkBar.xib index 69fd3d46551ca..66394c434e499 100644 --- a/chrome/app/nibs/BookmarkBar.xib +++ b/chrome/app/nibs/BookmarkBar.xib @@ -22,7 +22,7 @@