diff --git a/DEPS b/DEPS
index 78c96be..72b3a25 100644
--- a/DEPS
+++ b/DEPS
@@ -175,11 +175,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '1171d314efc7e131b039c94126d26575cfb9e70c',
+  'skia_revision': '4b55ff097b9d61ab9d4ebfbac2417996fb4fa5f0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '633234050d9781560f814e4914c31954459aecd4',
+  'v8_revision': '02c1ddad0ac96cd93ef1081c64f08e3d1e3a63e0',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -187,15 +187,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '7daf31d8029b03d71f2e51288756c1f453fa429a',
+  'angle_revision': 'ca45852d0907cd7ced0baa58742d0c7791458564',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': 'fb670f56acbdad6eed0a3faa126e9bbef177a66c',
+  'swiftshader_revision': '1c9f24263e6c39591d821a2ebb09a11e55cd957c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '1d34dc592fc1272db22a1c84dd3f9a7ef72fcebd',
+  'pdfium_revision': '1512c36ab69c469698b433b8555839b0072edf5f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -246,7 +246,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '747295674924c671f86fe791f5ac81044dfeac12',
+  'devtools_frontend_revision': '69fe8eaba0834f0f43461af1930cb9aa65edf08a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -302,11 +302,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '81bcbbc20ee522b3039d981d5d24aa8e82f4b94c',
+  'dawn_revision': '7c24b6b2ff192927720a2cfa0fdd2dae1614ee96',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': 'c400416ee6a281f10a34f9dcef5ddbb261bca08e',
+  'quiche_revision': '1618f0d88fdc69f410e5b2aaf40e5708a89d04e6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -1211,7 +1211,7 @@
     Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf',
 
   'src/third_party/openscreen/src':
-    Var('chromium_git') + '/openscreen' + '@' + 'e43a73b009bdd06a43538c0f417fcf493c5beec1',
+    Var('chromium_git') + '/openscreen' + '@' + '9d6efa3a286004a696aa04958be8b10433ecb29b',
 
   'src/third_party/openxr/src': {
     'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '9e97b73e7dd2bfc07745489d728f6a36665c648f',
@@ -1448,7 +1448,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '84ee597cdeae08bb26e578fc66a35bcf35f633f4',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'dc5522b4bf4d729c2dfe269f84a5148212c57a88',
+    Var('webrtc_git') + '/src.git' + '@' + '005d0fff3b9c56477bb591855fd62639bd8c9eca',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1523,7 +1523,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d0550b3138749715ace7875cf3618c19f5ae7e37',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@c9453ffe96c1950d08cf5379c5cfba7d27575f8e',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index 017bfeb..ecd43eb 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -57,8 +57,8 @@
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
 #include "media/mojo/buildflags.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config_service_android.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "services/preferences/tracked/segregated_pref_store.h"
 
 using base::FilePath;
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn
index dfaedf7..5f795bb 100644
--- a/android_webview/nonembedded/BUILD.gn
+++ b/android_webview/nonembedded/BUILD.gn
@@ -114,34 +114,16 @@
   custom_package = "org.chromium.android_webview.devui"
 }
 
-template("webview_devui_launcher") {
-  forward_variables_from(invoker, "*")
-
-  _manifest_file = "$root_gen_dir/android_webview/DeveloperUiLauncherManifest__${target_name}.xml"
-
-  jinja_template("${target_name}__manifest") {
-    input = "java/DeveloperUiLauncherManifest.xml"
-    output = _manifest_file
-    variables = [ "icon_enabled=$default_enabled_state" ]
-  }
-
-  # Define an android resources target with an AndroidManifest and no actual resources to merge
-  # the activity alias defined in DeveloperUiLauncherManifest.xml to the final APK mainfest of the
-  # target that depends on it.
-  android_resources(target_name) {
-    resource_dirs = []
-    custom_package = "org.chromium.android_webview.devui.icon"
-    android_manifest = _manifest_file
-    android_manifest_dep = ":${target_name}__manifest"
-  }
+android_resources("devui_launcher_icon_resources") {
+  resource_dirs = []
+  custom_package = "org.chromium.android_webview.devui.icon"
+  android_manifest = "java/DeveloperUiLauncherManifest.xml"
 }
 
-webview_devui_launcher("system_webview_devui_launcher_icon_resources") {
-  default_enabled_state = standalone_or_trichrome_icon_default_enabled_state
-}
-
-webview_devui_launcher("monochrome_devui_launcher_icon_resources") {
-  default_enabled_state = monochrome_launcher_icon_default_enabled_state
+android_resources("monochrome_devui_launcher_icon_resources") {
+  resource_dirs = []
+  android_manifest = "java/MonochromeDeveloperUiLauncherManifest.xml"
+  custom_package = "org.chromium.android_webview.devui.icon"
 }
 
 jinja_template("system_webview_manifest") {
diff --git a/android_webview/nonembedded/java/DeveloperUiLauncherManifest.xml b/android_webview/nonembedded/java/DeveloperUiLauncherManifest.xml
index 77533f6..a1457e8 100644
--- a/android_webview/nonembedded/java/DeveloperUiLauncherManifest.xml
+++ b/android_webview/nonembedded/java/DeveloperUiLauncherManifest.xml
@@ -8,7 +8,6 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="org.chromium.android_webview.devui">
 
-    <!-- required so Manifest merger doesn't add unused permissions see https://crbug.com/1046380 -->
     <uses-sdk android:minSdkVersion="21" />
 
     <!--suppress HardcodedText -->
@@ -16,8 +15,7 @@
         <activity-alias android:name="org.chromium.android_webview.devui.LauncherActivity"
                   android:targetActivity="org.chromium.android_webview.devui.MainActivity"
                   android:label="WebView DevTools"
-                  android:exported="true"
-                  android:enabled="{{ icon_enabled }}">
+                  android:exported="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.LAUNCHER"/>
diff --git a/android_webview/nonembedded/java/MonochromeDeveloperUiLauncherManifest.xml b/android_webview/nonembedded/java/MonochromeDeveloperUiLauncherManifest.xml
new file mode 100644
index 0000000..1a156d9d
--- /dev/null
+++ b/android_webview/nonembedded/java/MonochromeDeveloperUiLauncherManifest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 2020 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="org.chromium.android_webview.devui">
+
+    <uses-sdk android:minSdkVersion="24" />
+
+    <!-- This should only be merged to Monochrome manifest -->
+    <!--suppress HardcodedText -->
+    <application>
+        <activity-alias android:name="org.chromium.android_webview.devui.MonochromeLauncherActivity"
+                  android:targetActivity="org.chromium.android_webview.devui.MainActivity"
+                  android:label="WebView DevTools"
+                  android:exported="true"
+                  android:enabled="false">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+    </application>
+</manifest>
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
index 17e89e5b..71e8715f 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -99,18 +99,23 @@
     public static void postDeveloperUiLauncherIconTask() {
         PostTask.postTask(TaskTraits.BEST_EFFORT, () -> {
             Context context = ContextUtils.getApplicationContext();
-            ComponentName devToolsLauncherActivity = new ComponentName(
-                    context, "org.chromium.android_webview.devui.LauncherActivity");
-            if (WebViewPackageHelper.isCurrentSystemWebViewImplementation(context)) {
-                // Enable the component to show the launcher icon.
-                context.getPackageManager().setComponentEnabledSetting(devToolsLauncherActivity,
-                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
-                        PackageManager.DONT_KILL_APP);
-            } else {
-                // Disable the component to hide the launcher icon.
-                context.getPackageManager().setComponentEnabledSetting(devToolsLauncherActivity,
-                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
-                        PackageManager.DONT_KILL_APP);
+            try {
+                ComponentName devToolsLauncherActivity = new ComponentName(
+                        context, "org.chromium.android_webview.devui.MonochromeLauncherActivity");
+                if (WebViewPackageHelper.isCurrentSystemWebViewImplementation(context)) {
+                    // Enable the component to show the launcher icon.
+                    context.getPackageManager().setComponentEnabledSetting(devToolsLauncherActivity,
+                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
+                            PackageManager.DONT_KILL_APP);
+                } else {
+                    // Disable the component to hide the launcher icon.
+                    context.getPackageManager().setComponentEnabledSetting(devToolsLauncherActivity,
+                            PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                            PackageManager.DONT_KILL_APP);
+                }
+            } catch (IllegalArgumentException e) {
+                // If MonochromeLauncherActivity doesn't exist, Dynamically showing/hiding DevTools
+                // launcher icon is not enabled in this package; e.g when it is a stable channel.
             }
         });
     }
diff --git a/android_webview/system_webview_apk_tmpl.gni b/android_webview/system_webview_apk_tmpl.gni
index 6a28c2f..8a13d74 100644
--- a/android_webview/system_webview_apk_tmpl.gni
+++ b/android_webview/system_webview_apk_tmpl.gni
@@ -44,7 +44,6 @@
     deps += [
       "//android_webview:locale_pak_assets",
       "//android_webview:pak_file_assets",
-      "//android_webview/nonembedded:system_webview_devui_launcher_icon_resources",
     ]
 
     if (_exclude_weblayer_java) {
@@ -69,6 +68,10 @@
       alternative_android_sdk_dep = webview_framework_dep
     }
 
+    if (webview_devui_show_icon) {
+      deps += [ "//android_webview/nonembedded:devui_launcher_icon_resources" ]
+    }
+
     _use_trichrome_library =
         defined(use_trichrome_library) && use_trichrome_library
     assert(
diff --git a/android_webview/variables.gni b/android_webview/variables.gni
index 946f84e..aaa4d94 100644
--- a/android_webview/variables.gni
+++ b/android_webview/variables.gni
@@ -6,19 +6,13 @@
 import("//weblayer/variables.gni")
 
 declare_args() {
-  # Always show a launcher icon to open WebView developer UI for all build variants and channels.
-  # When this is off, all prestable build variants will still show launcher icons except for
-  # Monochrome which will only show its launcher icon when it's the selected WebView provider.
-  webview_devui_always_show_icon = false
+  # Show a launcher icon to open WebView developer UI. This is enabled by
+  # default for all prestable builds. The icon for Monochrome is shown
+  # dynamically at runtime if Monochrome is the current selected system WebView
+  # implementation or hidden otherwise.
+  webview_devui_show_icon = android_channel != "stable"
 }
 
-# Used in standalone and trichrome, configures whether the launcher icon is on or off all the time
-standalone_or_trichrome_icon_default_enabled_state =
-    android_channel != "stable" || webview_devui_always_show_icon
-
-# Used only in monochrome, configures whether the launcher icon is on all the time vs. on conditionally
-monochrome_launcher_icon_default_enabled_state = webview_devui_always_show_icon
-
 system_webview_android_manifest =
     "$root_gen_dir/android_webview/system_webview_apk/AndroidManifest.xml"
 trichrome_webview_android_manifest =
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 9fffe8d0..73f8b59 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -333,6 +333,8 @@
     "events/switch_access_event_handler.h",
     "fast_ink/cursor/cursor_view.cc",
     "fast_ink/cursor/cursor_view.h",
+    "fast_ink/fast_ink_host.cc",
+    "fast_ink/fast_ink_host.h",
     "fast_ink/fast_ink_pointer_controller.cc",
     "fast_ink/fast_ink_pointer_controller.h",
     "fast_ink/fast_ink_points.cc",
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 71c51292..0029f894 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -482,8 +482,10 @@
   return presenter_.GetWindow();
 }
 
-bool AppListControllerImpl::IsVisible() {
-  return last_visible_;
+bool AppListControllerImpl::IsVisible(
+    const base::Optional<int64_t>& display_id) {
+  return last_visible_ && (!display_id.has_value() ||
+                           display_id.value() == last_visible_display_id_);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -571,8 +573,11 @@
 ////////////////////////////////////////////////////////////////////////////////
 // Methods used in Ash
 
-bool AppListControllerImpl::GetTargetVisibility() const {
-  return last_target_visible_;
+bool AppListControllerImpl::GetTargetVisibility(
+    const base::Optional<int64_t>& display_id) const {
+  return last_target_visible_ &&
+         (!display_id.has_value() ||
+          display_id.value() == last_visible_display_id_);
 }
 
 void AppListControllerImpl::Show(int64_t display_id,
@@ -627,6 +632,8 @@
     return SHELF_ACTION_APP_LIST_SHOWN;
   }
 
+  base::AutoReset<bool> auto_reset(&should_dismiss_immediately_,
+                                   display_id != last_visible_display_id_);
   ShelfAction action =
       presenter_.ToggleAppList(display_id, show_source, event_time_stamp);
   UpdateExpandArrowVisibility();
@@ -759,7 +766,7 @@
 }
 
 void AppListControllerImpl::OnWallpaperColorsChanged() {
-  if (IsVisible())
+  if (IsVisible(last_visible_display_id_))
     presenter_.GetView()->OnWallpaperColorsChanged();
 }
 
@@ -820,7 +827,7 @@
     base::Optional<AssistantExitPoint> exit_point) {
   switch (new_visibility) {
     case AssistantVisibility::kVisible:
-      if (!IsVisible()) {
+      if (!IsVisible(base::nullopt)) {
         Show(GetDisplayIdToShowAppListOn(), kAssistantEntryPoint,
              base::TimeTicks());
       }
@@ -1731,7 +1738,7 @@
 }
 
 bool AppListControllerImpl::IsHomeScreenVisible() {
-  return IsTabletMode() && IsVisible();
+  return IsTabletMode() && IsVisible(base::nullopt);
 }
 
 gfx::Rect AppListControllerImpl::GetInitialAppListItemScreenBoundsForWindow(
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index 04dc2c72..267dc9a 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -131,7 +131,7 @@
   void GetAppInfoDialogBounds(GetAppInfoDialogBoundsCallback callback) override;
   void ShowAppList() override;
   aura::Window* GetWindow() override;
-  bool IsVisible() override;
+  bool IsVisible(const base::Optional<int64_t>& display_id) override;
 
   // AppListModelObserver:
   void OnAppListItemAdded(AppListItem* item) override;
@@ -145,7 +145,7 @@
   void OnSessionStateChanged(session_manager::SessionState state) override;
 
   // Methods used in ash:
-  bool GetTargetVisibility() const;
+  bool GetTargetVisibility(const base::Optional<int64_t>& display_id) const;
   void Show(int64_t display_id,
             base::Optional<AppListShowSource> show_source,
             base::TimeTicks event_time_stamp);
diff --git a/ash/app_list/app_list_presenter_delegate.h b/ash/app_list/app_list_presenter_delegate.h
index 7c3134f..bb7a31ee 100644
--- a/ash/app_list/app_list_presenter_delegate.h
+++ b/ash/app_list/app_list_presenter_delegate.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "ash/app_list/app_list_export.h"
+#include "base/scoped_observer.h"
 
 namespace aura {
 class Window;
@@ -63,7 +64,7 @@
   virtual void OnVisibilityWillChange(bool visible, int64_t display_id) = 0;
 
   // Whether the AppList is visible.
-  virtual bool IsVisible() = 0;
+  virtual bool IsVisible(const base::Optional<int64_t>& display_id) = 0;
 };
 
 }  // namespace ash
diff --git a/ash/app_list/app_list_presenter_delegate_impl.cc b/ash/app_list/app_list_presenter_delegate_impl.cc
index dc543fc..7dac208 100644
--- a/ash/app_list/app_list_presenter_delegate_impl.cc
+++ b/ash/app_list/app_list_presenter_delegate_impl.cc
@@ -179,8 +179,9 @@
   controller_->OnVisibilityWillChange(visible, display_id);
 }
 
-bool AppListPresenterDelegateImpl::IsVisible() {
-  return controller_->IsVisible();
+bool AppListPresenterDelegateImpl::IsVisible(
+    const base::Optional<int64_t>& display_id) {
+  return controller_->IsVisible(display_id);
 }
 
 void AppListPresenterDelegateImpl::OnDisplayMetricsChanged(
@@ -297,7 +298,7 @@
     return;
 
   // If the home launcher is not shown in tablet mode, ignore events.
-  if (IsTabletMode() && !IsVisible())
+  if (IsTabletMode() && !IsVisible(base::nullopt))
     return;
 
   // Don't absorb the first event for the search box while it is open
diff --git a/ash/app_list/app_list_presenter_delegate_impl.h b/ash/app_list/app_list_presenter_delegate_impl.h
index 3f7104558..a4a93913 100644
--- a/ash/app_list/app_list_presenter_delegate_impl.h
+++ b/ash/app_list/app_list_presenter_delegate_impl.h
@@ -53,7 +53,7 @@
   aura::Window* GetRootWindowForDisplayId(int64_t display_id) override;
   void OnVisibilityChanged(bool visible, int64_t display_id) override;
   void OnVisibilityWillChange(bool visible, int64_t display_id) override;
-  bool IsVisible() override;
+  bool IsVisible(const base::Optional<int64_t>& display_id) override;
   // DisplayObserver overrides:
   void OnDisplayMetricsChanged(const display::Display& display,
                                uint32_t changed_metrics) override;
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc
index 2ff52de..5d9b1f8 100644
--- a/ash/app_list/app_list_presenter_impl.cc
+++ b/ash/app_list/app_list_presenter_impl.cc
@@ -118,10 +118,10 @@
   if (is_target_visibility_show_) {
     // Launcher is always visible on the internal display when home launcher is
     // enabled in tablet mode.
-    if (display_id != GetDisplayId() && !delegate_->IsTabletMode()) {
-      Dismiss(event_time_stamp);
-    }
-    return;
+    if (delegate_->IsTabletMode() || display_id == GetDisplayId())
+      return;
+
+    Dismiss(event_time_stamp);
   }
 
   if (!delegate_->GetRootWindowForDisplayId(display_id)) {
@@ -210,7 +210,7 @@
                             show_source == kShelfButtonFullscreen;
   // Dismiss or show based on the target visibility because the show/hide
   // animation can be reversed.
-  if (is_target_visibility_show_) {
+  if (is_target_visibility_show_ && GetDisplayId() == display_id) {
     if (request_fullscreen) {
       if (view_->app_list_state() == AppListViewState::kPeeking) {
         view_->SetState(AppListViewState::kFullscreenAllApps);
@@ -230,7 +230,7 @@
 }
 
 bool AppListPresenterImpl::IsVisibleDeprecated() const {
-  return delegate_->IsVisible();
+  return delegate_->IsVisible(GetDisplayId());
 }
 
 bool AppListPresenterImpl::IsAtLeastPartiallyVisible() const {
@@ -444,7 +444,7 @@
   view_ = nullptr;
 }
 
-int64_t AppListPresenterImpl::GetDisplayId() {
+int64_t AppListPresenterImpl::GetDisplayId() const {
   views::Widget* widget = view_ ? view_->GetWidget() : nullptr;
   if (!widget)
     return display::kInvalidDisplayId;
@@ -502,7 +502,7 @@
                        (IsAtLeastPartiallyVisible() && !app_list_lost_focus);
 
   if (delegate_->IsTabletMode()) {
-    if (visible != delegate_->IsVisible()) {
+    if (visible != delegate_->IsVisible(GetDisplayId())) {
       if (app_list_gained_focus)
         view_->OnHomeLauncherGainingFocusWithoutAnimation();
 
diff --git a/ash/app_list/app_list_presenter_impl.h b/ash/app_list/app_list_presenter_impl.h
index 13dc8d0f..0b31a4b 100644
--- a/ash/app_list/app_list_presenter_impl.h
+++ b/ash/app_list/app_list_presenter_impl.h
@@ -150,7 +150,7 @@
 
   // Returns the id of the display containing the app list, if visible. If not
   // visible returns kInvalidDisplayId.
-  int64_t GetDisplayId();
+  int64_t GetDisplayId() const;
 
   void OnVisibilityChanged(bool visible, int64_t display_id);
   void OnVisibilityWillChange(bool visible, int64_t display_id);
diff --git a/ash/app_list/app_list_presenter_impl_unittest.cc b/ash/app_list/app_list_presenter_impl_unittest.cc
index 209687c..0416b52 100644
--- a/ash/app_list/app_list_presenter_impl_unittest.cc
+++ b/ash/app_list/app_list_presenter_impl_unittest.cc
@@ -70,7 +70,9 @@
   }
   void OnVisibilityChanged(bool visible, int64_t display_id) override {}
   void OnVisibilityWillChange(bool visible, int64_t display_id) override {}
-  bool IsVisible() override { return false; }
+  bool IsVisible(const base::Optional<int64_t>& display_id) override {
+    return false;
+  }
 
  private:
   aura::Window* container_;
diff --git a/ash/app_list/app_list_unittest.cc b/ash/app_list/app_list_unittest.cc
index 72a61ed..d144c37 100644
--- a/ash/app_list/app_list_unittest.cc
+++ b/ash/app_list/app_list_unittest.cc
@@ -40,7 +40,7 @@
   // Click the home button to show the app list.
   auto* controller = Shell::Get()->app_list_controller();
   auto* presenter = controller->presenter();
-  EXPECT_FALSE(controller->GetTargetVisibility());
+  EXPECT_FALSE(controller->GetTargetVisibility(GetPrimaryDisplay().id()));
   EXPECT_FALSE(presenter->GetTargetVisibility());
   EXPECT_EQ(0u, app_list_container->children().size());
   EXPECT_FALSE(home_button->IsShowingAppList());
@@ -53,7 +53,7 @@
 
   // Click the button again to dismiss the app list; it will animate to close.
   generator->ClickLeftButton();
-  EXPECT_FALSE(controller->GetTargetVisibility());
+  EXPECT_FALSE(controller->GetTargetVisibility(GetPrimaryDisplay().id()));
   EXPECT_EQ(1u, app_list_container->children().size());
   EXPECT_FALSE(home_button->IsShowingAppList());
 }
@@ -79,20 +79,24 @@
   // Click the home button to show the app list.
   auto* controller = Shell::Get()->app_list_controller();
   auto* presenter = controller->presenter();
-  EXPECT_FALSE(controller->GetTargetVisibility());
+  EXPECT_FALSE(controller->GetTargetVisibility(GetPrimaryDisplay().id()));
+  EXPECT_FALSE(controller->GetTargetVisibility(GetSecondaryDisplay().id()));
   EXPECT_FALSE(presenter->GetTargetVisibility());
   EXPECT_EQ(0u, app_list_container->children().size());
   EXPECT_FALSE(home_button->IsShowingAppList());
 
   generator->MoveMouseTo(home_button->GetBoundsInScreen().CenterPoint());
   generator->ClickLeftButton();
+  EXPECT_FALSE(controller->GetTargetVisibility(GetPrimaryDisplay().id()));
+  EXPECT_TRUE(controller->GetTargetVisibility(GetSecondaryDisplay().id()));
   EXPECT_TRUE(presenter->GetTargetVisibility());
   EXPECT_EQ(1u, app_list_container->children().size());
   EXPECT_TRUE(home_button->IsShowingAppList());
 
   // Click the button again to dismiss the app list; it will animate to close.
   generator->ClickLeftButton();
-  EXPECT_FALSE(controller->GetTargetVisibility());
+  EXPECT_FALSE(controller->GetTargetVisibility(GetPrimaryDisplay().id()));
+  EXPECT_FALSE(controller->GetTargetVisibility(GetSecondaryDisplay().id()));
   EXPECT_EQ(1u, app_list_container->children().size());
   EXPECT_FALSE(home_button->IsShowingAppList());
 }
diff --git a/ash/app_list/test/app_list_test_helper.cc b/ash/app_list/test/app_list_test_helper.cc
index 79de789..84e6610 100644
--- a/ash/app_list/test/app_list_test_helper.cc
+++ b/ash/app_list/test/app_list_test_helper.cc
@@ -68,8 +68,8 @@
 }
 
 void AppListTestHelper::CheckVisibility(bool visible) {
-  EXPECT_EQ(visible, app_list_controller_->IsVisible());
-  EXPECT_EQ(visible, app_list_controller_->GetTargetVisibility());
+  EXPECT_EQ(visible, app_list_controller_->IsVisible(base::nullopt));
+  EXPECT_EQ(visible, app_list_controller_->GetTargetVisibility(base::nullopt));
 }
 
 void AppListTestHelper::CheckState(AppListViewState state) {
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc
index cb6aaf5..dfd2923 100644
--- a/ash/display/display_manager_unittest.cc
+++ b/ash/display/display_manager_unittest.cc
@@ -3069,7 +3069,8 @@
   auto* app_list_controller = Shell::Get()->app_list_controller();
   auto* tablet_mode_controller = Shell::Get()->tablet_mode_controller();
   EXPECT_TRUE(tablet_mode_controller->InTabletMode());
-  EXPECT_TRUE(app_list_controller->IsVisible());
+  EXPECT_TRUE(
+      app_list_controller->IsVisible(display_manager()->first_display_id()));
 
   // Exiting tablet mode should exit mirror mode and return back to Unified
   // mode.
@@ -3080,7 +3081,8 @@
 
   // Home Launcher should be dismissed.
   EXPECT_FALSE(tablet_mode_controller->InTabletMode());
-  EXPECT_FALSE(app_list_controller->IsVisible());
+  EXPECT_FALSE(
+      app_list_controller->IsVisible(display_manager()->first_display_id()));
 }
 
 TEST_F(DisplayManagerTest, DisplayPrefsAndForcedMirrorMode) {
diff --git a/ash/fast_ink/cursor/cursor_view.cc b/ash/fast_ink/cursor/cursor_view.cc
index e51bc5c..08cb6b1 100644
--- a/ash/fast_ink/cursor/cursor_view.cc
+++ b/ash/fast_ink/cursor/cursor_view.cc
@@ -86,9 +86,9 @@
 
   // Create transform used to convert cursor controller coordinates to screen
   // coordinates.
-  bool rv =
-      screen_to_buffer_transform_.GetInverse(&buffer_to_screen_transform_);
-  DCHECK(rv);
+  bool inversible = host()->window_to_buffer_transform().GetInverse(
+      &buffer_to_screen_transform_);
+  DCHECK(inversible);
 
   ui::CursorController::GetInstance()->AddCursorObserver(this);
 }
@@ -226,8 +226,7 @@
     TRACE_EVENT1("ui", "CursorView::Paint", "damage_rect",
                  damage_rect.ToString());
 
-    ScopedPaint paint(gpu_memory_buffer_.get(), screen_to_buffer_transform_,
-                      damage_rect);
+    ScopedPaint paint(this, damage_rect);
     cc::PaintCanvas* sk_canvas = paint.canvas().sk_canvas();
     sk_canvas->translate(SkIntToScalar(location_.x() - cursor_hotspot_.x()),
                          SkIntToScalar(location_.y() - cursor_hotspot_.y()));
diff --git a/ash/fast_ink/fast_ink_host.cc b/ash/fast_ink/fast_ink_host.cc
new file mode 100644
index 0000000..9daa78a
--- /dev/null
+++ b/ash/fast_ink/fast_ink_host.cc
@@ -0,0 +1,453 @@
+// Copyright 2017 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.
+
+#include "ash/fast_ink/fast_ink_host.h"
+
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <GLES2/gl2extchromium.h>
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "cc/base/math_util.h"
+#include "cc/trees/layer_tree_frame_sink.h"
+#include "cc/trees/layer_tree_frame_sink_client.h"
+#include "components/viz/common/frame_timing_details.h"
+#include "components/viz/common/gpu/context_provider.h"
+#include "components/viz/common/hit_test/hit_test_region_list.h"
+#include "components/viz/common/quads/compositor_frame.h"
+#include "components/viz/common/quads/texture_draw_quad.h"
+#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
+#include "gpu/command_buffer/client/shared_image_interface.h"
+#include "gpu/command_buffer/common/shared_image_usage.h"
+#include "ui/aura/env.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_observer.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/gfx/geometry/dip_util.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/gpu_memory_buffer.h"
+
+namespace fast_ink {
+
+// static
+gfx::Rect FastInkHost::BufferRectFromWindowRect(
+    const gfx::Transform& window_to_buffer_transform,
+    const gfx::Size& buffer_size,
+    const gfx::Rect& window_rect) {
+  gfx::Rect buffer_rect = cc::MathUtil::MapEnclosingClippedRect(
+      window_to_buffer_transform, window_rect);
+  // Buffer rect is not bigger than actual buffer.
+  buffer_rect.Intersect(gfx::Rect(buffer_size));
+  return buffer_rect;
+}
+
+struct FastInkHost::Resource {
+  Resource() = default;
+  ~Resource() {
+    // context_provider might be null in unit tests when ran with --mash
+    // TODO(kaznacheev) Have MASH provide a context provider for tests
+    // when https://crbug/772562 is fixed
+    if (!context_provider)
+      return;
+    gpu::SharedImageInterface* sii = context_provider->SharedImageInterface();
+    DCHECK(!mailbox.IsZero());
+    sii->DestroySharedImage(sync_token, mailbox);
+  }
+  scoped_refptr<viz::ContextProvider> context_provider;
+  gpu::Mailbox mailbox;
+  gpu::SyncToken sync_token;
+  bool damaged = true;
+};
+
+class FastInkHost::LayerTreeFrameSinkHolder
+    : public cc::LayerTreeFrameSinkClient,
+      public aura::WindowObserver {
+ public:
+  LayerTreeFrameSinkHolder(FastInkHost* host,
+                           std::unique_ptr<cc::LayerTreeFrameSink> frame_sink)
+      : host_(host), frame_sink_(std::move(frame_sink)) {
+    frame_sink_->BindToClient(this);
+  }
+  ~LayerTreeFrameSinkHolder() override {
+    if (frame_sink_)
+      frame_sink_->DetachFromClient();
+    if (root_window_)
+      root_window_->RemoveObserver(this);
+  }
+  LayerTreeFrameSinkHolder(const LayerTreeFrameSinkHolder&) = delete;
+  LayerTreeFrameSinkHolder& operator=(const LayerTreeFrameSinkHolder&) = delete;
+
+  // Delete frame sink after having reclaimed all exported resources.
+  // Returns false if the it should be released instead of reset and it will
+  // self destruct.
+  // TODO(reveman): Find a better way to handle deletion of in-flight resources.
+  // https://crbug.com/765763
+  bool DeleteWhenLastResourceHasBeenReclaimed() {
+    if (last_frame_size_in_pixels_.IsEmpty()) {
+      // Delete sink holder immediately if no frame has been submitted.
+      DCHECK(exported_resources_.empty());
+      return true;
+    }
+
+    // Submit an empty frame to ensure that pending release callbacks will be
+    // processed in a finite amount of time.
+    viz::CompositorFrame frame;
+    frame.metadata.begin_frame_ack.frame_id =
+        viz::BeginFrameId(viz::BeginFrameArgs::kManualSourceId,
+                          viz::BeginFrameArgs::kStartingFrameNumber);
+    frame.metadata.begin_frame_ack.has_damage = true;
+    frame.metadata.device_scale_factor = last_frame_device_scale_factor_;
+    frame.metadata.local_surface_id_allocation_time =
+        last_local_surface_id_allocation_time_;
+    frame.metadata.frame_token = ++next_frame_token_;
+    std::unique_ptr<viz::RenderPass> pass = viz::RenderPass::Create();
+    pass->SetNew(1, gfx::Rect(last_frame_size_in_pixels_),
+                 gfx::Rect(last_frame_size_in_pixels_), gfx::Transform());
+    frame.render_pass_list.push_back(std::move(pass));
+    frame_sink_->SubmitCompositorFrame(std::move(frame),
+                                       /*hit_test_data_changed=*/true,
+                                       /*show_hit_test_borders=*/false);
+
+    // Delete sink holder immediately if not waiting for exported resources to
+    // be reclaimed.
+    if (exported_resources_.empty())
+      return true;
+
+    // If we have exported resources to reclaim then extend the lifetime of
+    // holder by deleting it later.
+    // itself when the root window is removed or when all exported resources
+    // have been reclaimed.
+    root_window_ = host_->host_window()->GetRootWindow();
+
+    // This can be null during shutdown.
+    if (!root_window_)
+      return true;
+
+    root_window_->AddObserver(this);
+    host_ = nullptr;
+    return false;
+  }
+
+  void SubmitCompositorFrame(viz::CompositorFrame frame,
+                             viz::ResourceId resource_id,
+                             std::unique_ptr<Resource> resource) {
+    exported_resources_[resource_id] = std::move(resource);
+    last_frame_size_in_pixels_ = frame.size_in_pixels();
+    last_frame_device_scale_factor_ = frame.metadata.device_scale_factor;
+    last_local_surface_id_allocation_time_ =
+        frame.metadata.local_surface_id_allocation_time;
+    frame.metadata.frame_token = ++next_frame_token_;
+    frame_sink_->SubmitCompositorFrame(std::move(frame),
+                                       /*hit_test_data_changed=*/true,
+                                       /*show_hit_test_borders=*/false);
+  }
+
+  void DamageExportedResources() {
+    for (auto& entry : exported_resources_)
+      entry.second->damaged = true;
+  }
+
+  // Overridden from cc::LayerTreeFrameSinkClient:
+  void SetBeginFrameSource(viz::BeginFrameSource* source) override {}
+  base::Optional<viz::HitTestRegionList> BuildHitTestData() override {
+    return {};
+  }
+  void ReclaimResources(
+      const std::vector<viz::ReturnedResource>& resources) override {
+    if (delete_pending_)
+      return;
+    for (auto& entry : resources) {
+      auto it = exported_resources_.find(entry.id);
+      DCHECK(it != exported_resources_.end());
+      std::unique_ptr<Resource> resource = std::move(it->second);
+      exported_resources_.erase(it);
+      resource->sync_token = entry.sync_token;
+      if (host_ && !entry.lost)
+        host_->ReclaimResource(std::move(resource));
+    }
+
+    if (root_window_ && exported_resources_.empty())
+      ScheduleDelete();
+  }
+  void SetTreeActivationCallback(base::RepeatingClosure callback) override {}
+  void DidReceiveCompositorFrameAck() override {
+    if (host_)
+      host_->DidReceiveCompositorFrameAck();
+  }
+  void DidPresentCompositorFrame(
+      uint32_t frame_token,
+      const viz::FrameTimingDetails& details) override {
+    if (host_)
+      host_->DidPresentCompositorFrame(details.presentation_feedback);
+  }
+  void DidLoseLayerTreeFrameSink() override {
+    exported_resources_.clear();
+    if (root_window_)
+      ScheduleDelete();
+  }
+  void OnDraw(const gfx::Transform& transform,
+              const gfx::Rect& viewport,
+              bool resourceless_software_draw,
+              bool skip_draw) override {}
+  void SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) override {}
+  void SetExternalTilePriorityConstraints(
+      const gfx::Rect& viewport_rect,
+      const gfx::Transform& transform) override {}
+
+  void OnWindowDestroying(aura::Window* window) override {
+    root_window_->RemoveObserver(this);
+    root_window_ = nullptr;
+    frame_sink_->DetachFromClient();
+    frame_sink_.reset();
+    ScheduleDelete();
+  }
+
+ private:
+  void ScheduleDelete() {
+    if (delete_pending_)
+      return;
+    delete_pending_ = true;
+    base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
+  }
+
+  FastInkHost* host_;
+  std::unique_ptr<cc::LayerTreeFrameSink> frame_sink_;
+  base::flat_map<viz::ResourceId, std::unique_ptr<Resource>>
+      exported_resources_;
+  viz::FrameTokenGenerator next_frame_token_;
+  gfx::Size last_frame_size_in_pixels_;
+  float last_frame_device_scale_factor_ = 1.0f;
+  base::TimeTicks last_local_surface_id_allocation_time_;
+  aura::Window* root_window_ = nullptr;
+  bool delete_pending_ = false;
+};
+
+FastInkHost::FastInkHost(aura::Window* host_window,
+                         const PresentationCallback& presentation_callback)
+    : host_window_(host_window), presentation_callback_(presentation_callback) {
+  // Take the root transform and apply this during buffer update instead of
+  // leaving this up to the compositor. The benefit is that HW requirements
+  // for being able to take advantage of overlays and direct scanout are
+  // reduced significantly. Frames are submitted to the compositor with the
+  // inverse transform to cancel out the transformation that would otherwise
+  // be done by the compositor.
+  window_to_buffer_transform_ = host_window_->GetHost()->GetRootTransform();
+  gfx::Rect bounds(host_window_->GetBoundsInScreen().size());
+  buffer_size_ =
+      gfx::ToEnclosedRect(cc::MathUtil::MapClippedRect(
+                              window_to_buffer_transform_,
+                              gfx::RectF(bounds.width(), bounds.height())))
+          .size();
+
+  // Create a single GPU memory buffer. Content will be written into this
+  // buffer without any buffering. The result is that we might be modifying
+  // the buffer while it's being displayed. This provides minimal latency
+  // but with potential tearing. Note that we have to draw into a temporary
+  // surface and copy it into GPU memory buffer to avoid flicker.
+  gpu_memory_buffer_ =
+      aura::Env::GetInstance()
+          ->context_factory()
+          ->GetGpuMemoryBufferManager()
+          ->CreateGpuMemoryBuffer(buffer_size_,
+                                  SK_B32_SHIFT ? gfx::BufferFormat::RGBA_8888
+                                               : gfx::BufferFormat::BGRA_8888,
+                                  gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
+                                  gpu::kNullSurfaceHandle);
+  LOG_IF(ERROR, !gpu_memory_buffer_) << "Failed to create GPU memory buffer";
+
+  frame_sink_holder_ = std::make_unique<LayerTreeFrameSinkHolder>(
+      this, host_window_->CreateLayerTreeFrameSink());
+}
+
+FastInkHost::~FastInkHost() {
+  if (!frame_sink_holder_->DeleteWhenLastResourceHasBeenReclaimed())
+    frame_sink_holder_.release();
+}
+
+void FastInkHost::UpdateSurface(const gfx::Rect& content_rect,
+                                const gfx::Rect& damage_rect,
+                                bool auto_refresh) {
+  content_rect_ = content_rect;
+  damage_rect_.Union(damage_rect);
+  auto_refresh_ = auto_refresh;
+  pending_compositor_frame_ = true;
+
+  if (!damage_rect.IsEmpty()) {
+    frame_sink_holder_->DamageExportedResources();
+    for (auto& resource : returned_resources_)
+      resource->damaged = true;
+  }
+
+  if (!pending_compositor_frame_ack_)
+    SubmitCompositorFrame();
+}
+
+void FastInkHost::SubmitCompositorFrame() {
+  TRACE_EVENT1("ui", "FastInkHost::SubmitCompositorFrame", "damage",
+               damage_rect_.ToString());
+
+  float device_scale_factor = host_window_->layer()->device_scale_factor();
+  gfx::Rect output_rect(gfx::ConvertSizeToPixel(
+      device_scale_factor, host_window_->GetBoundsInScreen().size()));
+
+  gfx::Rect quad_rect;
+  gfx::Rect damage_rect;
+  // Continuously redraw the full output rectangle when in auto-refresh mode.
+  // This is necessary in order to allow single buffered updates without having
+  // buffer changes outside the contents area cause artifacts.
+  if (auto_refresh_) {
+    quad_rect = gfx::Rect(buffer_size_);
+    damage_rect = gfx::Rect(output_rect);
+  } else {
+    // Use minimal quad and damage rectangles when auto-refresh mode is off.
+    quad_rect = BufferRectFromWindowRect(window_to_buffer_transform_,
+                                         buffer_size_, content_rect_);
+    damage_rect = gfx::ConvertRectToPixel(device_scale_factor, damage_rect_);
+    damage_rect.Intersect(output_rect);
+    pending_compositor_frame_ = false;
+  }
+  damage_rect_ = gfx::Rect();
+
+  std::unique_ptr<Resource> resource;
+  // Reuse returned resource if available.
+  if (!returned_resources_.empty()) {
+    resource = std::move(returned_resources_.back());
+    returned_resources_.pop_back();
+  }
+
+  // Create new resource if needed.
+  if (!resource)
+    resource = std::make_unique<Resource>();
+
+  if (resource->damaged) {
+    // Acquire context provider for resource if needed.
+    // Note: We make no attempts to recover if the context provider is later
+    // lost. It is expected that this class is short-lived and requiring a
+    // new instance to be created in lost context situations is acceptable and
+    // keeps the code simple.
+    if (!resource->context_provider) {
+      resource->context_provider = aura::Env::GetInstance()
+                                       ->context_factory()
+                                       ->SharedMainThreadContextProvider();
+      if (!resource->context_provider) {
+        LOG(ERROR) << "Failed to acquire a context provider";
+        return;
+      }
+    }
+
+    gpu::SharedImageInterface* sii =
+        resource->context_provider->SharedImageInterface();
+    if (resource->mailbox.IsZero()) {
+      DCHECK(!resource->sync_token.HasData());
+      const uint32_t usage =
+          gpu::SHARED_IMAGE_USAGE_DISPLAY | gpu::SHARED_IMAGE_USAGE_SCANOUT;
+      gpu::GpuMemoryBufferManager* gmb_manager =
+          aura::Env::GetInstance()
+              ->context_factory()
+              ->GetGpuMemoryBufferManager();
+      resource->mailbox = sii->CreateSharedImage(
+          gpu_memory_buffer_.get(), gmb_manager, gfx::ColorSpace(), usage);
+    } else {
+      sii->UpdateSharedImage(resource->sync_token, resource->mailbox);
+    }
+    resource->sync_token = sii->GenVerifiedSyncToken();
+
+    resource->damaged = false;
+  }
+
+  viz::TransferableResource transferable_resource;
+  transferable_resource.id = next_resource_id_++;
+  transferable_resource.format = viz::RGBA_8888;
+  transferable_resource.filter = GL_LINEAR;
+  transferable_resource.size = buffer_size_;
+  transferable_resource.mailbox_holder = gpu::MailboxHolder(
+      resource->mailbox, resource->sync_token, GL_TEXTURE_2D);
+  // Use HW overlay if continuous updates are expected.
+  transferable_resource.is_overlay_candidate = auto_refresh_;
+
+  gfx::Transform target_to_buffer_transform(window_to_buffer_transform_);
+  target_to_buffer_transform.Scale(1.f / device_scale_factor,
+                                   1.f / device_scale_factor);
+
+  gfx::Transform buffer_to_target_transform;
+  bool rv = target_to_buffer_transform.GetInverse(&buffer_to_target_transform);
+  DCHECK(rv);
+
+  const int kRenderPassId = 1;
+  std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
+  render_pass->SetNew(kRenderPassId, output_rect, damage_rect,
+                      buffer_to_target_transform);
+
+  viz::SharedQuadState* quad_state =
+      render_pass->CreateAndAppendSharedQuadState();
+  quad_state->SetAll(
+      buffer_to_target_transform,
+      /*quad_layer_rect=*/output_rect,
+      /*visible_quad_layer_rect=*/output_rect,
+      /*rounded_corner_bounds=*/gfx::RRectF(),
+      /*clip_rect=*/gfx::Rect(),
+      /*is_clipped=*/false, /*are_contents_opaque=*/false, /*opacity=*/1.f,
+      /*blend_mode=*/SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
+
+  viz::CompositorFrame frame;
+  // TODO(eseckler): FastInkHost should use BeginFrames and set the ack
+  // accordingly.
+  frame.metadata.begin_frame_ack =
+      viz::BeginFrameAck::CreateManualAckWithDamage();
+  frame.metadata.device_scale_factor = device_scale_factor;
+  frame.metadata.local_surface_id_allocation_time =
+      host_window_->GetLocalSurfaceIdAllocation().allocation_time();
+
+  viz::TextureDrawQuad* texture_quad =
+      render_pass->CreateAndAppendDrawQuad<viz::TextureDrawQuad>();
+  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+  gfx::RectF uv_crop(quad_rect);
+  uv_crop.Scale(1.f / buffer_size_.width(), 1.f / buffer_size_.height());
+  texture_quad->SetNew(
+      quad_state, quad_rect, quad_rect,
+      /*needs_blending=*/true, transferable_resource.id,
+      /*premultiplied_alpha=*/true, uv_crop.origin(), uv_crop.bottom_right(),
+      /*background_color=*/SK_ColorTRANSPARENT, vertex_opacity,
+      /*y_flipped=*/false,
+      /*nearest_neighbor=*/false,
+      /*secure_output_only=*/false, gfx::ProtectedVideoType::kClear);
+  texture_quad->set_resource_size_in_pixels(transferable_resource.size);
+  frame.resource_list.push_back(transferable_resource);
+
+  DCHECK(!pending_compositor_frame_ack_);
+  pending_compositor_frame_ack_ = true;
+
+  frame.render_pass_list.push_back(std::move(render_pass));
+  frame_sink_holder_->SubmitCompositorFrame(
+      std::move(frame), transferable_resource.id, std::move(resource));
+}
+
+void FastInkHost::SubmitPendingCompositorFrame() {
+  if (pending_compositor_frame_ && !pending_compositor_frame_ack_)
+    SubmitCompositorFrame();
+}
+
+void FastInkHost::DidReceiveCompositorFrameAck() {
+  pending_compositor_frame_ack_ = false;
+  if (pending_compositor_frame_) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(&FastInkHost::SubmitPendingCompositorFrame,
+                                  weak_ptr_factory_.GetWeakPtr()));
+  }
+}
+
+void FastInkHost::DidPresentCompositorFrame(
+    const gfx::PresentationFeedback& feedback) {
+  if (!presentation_callback_.is_null())
+    presentation_callback_.Run(feedback);
+}
+
+void FastInkHost::ReclaimResource(std::unique_ptr<Resource> resource) {
+  returned_resources_.push_back(std::move(resource));
+}
+
+}  // namespace fast_ink
diff --git a/ash/fast_ink/fast_ink_host.h b/ash/fast_ink/fast_ink_host.h
new file mode 100644
index 0000000..307147bc
--- /dev/null
+++ b/ash/fast_ink/fast_ink_host.h
@@ -0,0 +1,94 @@
+// Copyright 2017 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.
+
+#ifndef ASH_FAST_INK_FAST_INK_HOST_H_
+#define ASH_FAST_INK_FAST_INK_HOST_H_
+
+#include <memory>
+#include <vector>
+
+#include "base/containers/flat_map.h"
+#include "base/memory/weak_ptr.h"
+#include "components/viz/common/quads/compositor_frame_metadata.h"
+#include "components/viz/common/resources/resource_id.h"
+#include "ui/gfx/canvas.h"
+
+namespace gfx {
+class GpuMemoryBuffer;
+struct PresentationFeedback;
+}  // namespace gfx
+
+namespace fast_ink {
+
+// FastInkHost is used to support low-latency rendering. It supports
+// 'auto-refresh' mode which provide minimum latency updates for the
+// associated window. 'auto-refresh' mode will take advantage of HW overlays
+// when possible and trigger continuous updates.
+class FastInkHost {
+ public:
+  // Convert the rect in window's coordinate to the buffer's coordinate.  If the
+  // window is rotated, the damaged_rect will also be rotated, for example. The
+  // size is clamped by |buffer_size| to ensure it does not exceeds the buffer
+  // size.
+  static gfx::Rect BufferRectFromWindowRect(
+      const gfx::Transform& window_to_buffer_transform,
+      const gfx::Size& buffer_size,
+      const gfx::Rect& damage_rect);
+
+  using PresentationCallback =
+      base::RepeatingCallback<void(const gfx::PresentationFeedback&)>;
+
+  // Creates a FastInkView.
+  FastInkHost(aura::Window* host_window,
+              const PresentationCallback& presentation_callback);
+  ~FastInkHost();
+  FastInkHost(const FastInkHost&) = delete;
+  FastInkHost& operator=(const FastInkHost&) = delete;
+
+  // Update content and damage rectangles for surface. |auto_refresh| should
+  // be set to true if continuous updates are expected within content rectangle.
+  void UpdateSurface(const gfx::Rect& content_rect,
+                     const gfx::Rect& damage_rect,
+                     bool auto_refresh);
+
+  aura::Window* host_window() { return host_window_; }
+  const gfx::Transform& window_to_buffer_transform() const {
+    return window_to_buffer_transform_;
+  }
+  gfx::GpuMemoryBuffer* gpu_memory_buffer() { return gpu_memory_buffer_.get(); }
+
+ private:
+  class LayerTreeFrameSinkHolder;
+  struct Resource;
+
+  void SubmitCompositorFrame();
+  void SubmitPendingCompositorFrame();
+  void ReclaimResource(std::unique_ptr<Resource> resource);
+  void DidReceiveCompositorFrameAck();
+  void DidPresentCompositorFrame(const gfx::PresentationFeedback& feedback);
+
+  aura::Window* host_window_;
+  const PresentationCallback presentation_callback_;
+  gfx::Transform window_to_buffer_transform_;
+  std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_;
+  // The size of |gpu_memory_buffer_|.
+  gfx::Size buffer_size_;
+  // The bounds of the content to be pushed in window coordinates.
+  gfx::Rect content_rect_;
+  // The damage rect in window coordinates.
+  gfx::Rect damage_rect_;
+  // When true it keeps pushing entire buffer with hw overlay option.
+  bool auto_refresh_ = false;
+  bool pending_compositor_frame_ = false;
+  bool pending_compositor_frame_ack_ = false;
+  int next_resource_id_ = 1;
+  // Cached resources that can be reused.
+  std::vector<std::unique_ptr<Resource>> returned_resources_;
+  std::unique_ptr<LayerTreeFrameSinkHolder> frame_sink_holder_;
+  base::WeakPtrFactory<FastInkHost> weak_ptr_factory_{this};
+};
+
+}  // namespace fast_ink
+
+#endif  // ASH_FAST_INK_FAST_INK_HOST_H_
diff --git a/ash/fast_ink/fast_ink_view.cc b/ash/fast_ink/fast_ink_view.cc
index 65b7c29..dac6519cd 100644
--- a/ash/fast_ink/fast_ink_view.cc
+++ b/ash/fast_ink/fast_ink_view.cc
@@ -11,58 +11,54 @@
 #include <memory>
 
 #include "base/bind.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "cc/base/math_util.h"
-#include "cc/trees/layer_tree_frame_sink.h"
-#include "cc/trees/layer_tree_frame_sink_client.h"
-#include "components/viz/common/frame_timing_details.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/hit_test/hit_test_region_list.h"
-#include "components/viz/common/quads/compositor_frame.h"
-#include "components/viz/common/quads/texture_draw_quad.h"
-#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
-#include "gpu/command_buffer/client/shared_image_interface.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "ui/aura/env.h"
 #include "ui/aura/window.h"
-#include "ui/aura/window_observer.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/base/layout.h"
-#include "ui/gfx/geometry/dip_util.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/views/widget/widget.h"
 
 namespace fast_ink {
-namespace {
 
-gfx::Rect BufferRectFromScreenRect(
-    const gfx::Transform& screen_to_buffer_transform,
-    const gfx::Size& buffer_size,
-    const gfx::Rect& screen_rect) {
-  gfx::Rect buffer_rect = cc::MathUtil::MapEnclosingClippedRect(
-      screen_to_buffer_transform, screen_rect);
-  buffer_rect.Intersect(gfx::Rect(buffer_size));
-  return buffer_rect;
+FastInkView::FastInkView(
+    aura::Window* container,
+    const FastInkHost::PresentationCallback& presentation_callback) {
+  widget_.reset(new views::Widget);
+  views::Widget::InitParams params;
+  params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+  params.name = "FastInkOverlay";
+  params.accept_events = false;
+  params.activatable = views::Widget::InitParams::ACTIVATABLE_NO;
+  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+  params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
+  params.parent = container;
+  params.layer_type = ui::LAYER_SOLID_COLOR;
+
+  aura::Window* root_window = container->GetRootWindow();
+
+  gfx::Rect screen_bounds = root_window->GetBoundsInScreen();
+  widget_->Init(std::move(params));
+  widget_->Show();
+  widget_->SetContentsView(this);
+  widget_->SetBounds(screen_bounds);
+  set_owned_by_client();
+
+  host_ = std::make_unique<FastInkHost>(widget_->GetNativeWindow(),
+                                        std::move(presentation_callback));
 }
 
-}  // namespace
-
-FastInkView::ScopedPaint::ScopedPaint(
-    gfx::GpuMemoryBuffer* gpu_memory_buffer,
-    const gfx::Transform& screen_to_buffer_transform,
-    const gfx::Rect& screen_rect)
-    : gpu_memory_buffer_(gpu_memory_buffer),
-      buffer_rect_(BufferRectFromScreenRect(screen_to_buffer_transform,
-                                            gpu_memory_buffer->GetSize(),
-                                            screen_rect)),
-      canvas_(buffer_rect_.size(), 1.0f, false) {
-  canvas_.Translate(-buffer_rect_.OffsetFromOrigin());
-  canvas_.Transform(screen_to_buffer_transform);
+FastInkView::ScopedPaint::ScopedPaint(FastInkView* view,
+                                      const gfx::Rect& damage_rect_in_window)
+    : gpu_memory_buffer_(view->host()->gpu_memory_buffer()),
+      damage_rect_(FastInkHost::BufferRectFromWindowRect(
+          view->host()->window_to_buffer_transform(),
+          gpu_memory_buffer_->GetSize(),
+          damage_rect_in_window)),
+      canvas_(damage_rect_.size(), 1.0f, false) {
+  canvas_.Translate(-damage_rect_.OffsetFromOrigin());
+  canvas_.Transform(view->host()->window_to_buffer_transform());
 }
 
 FastInkView::ScopedPaint::~ScopedPaint() {
-  if (buffer_rect_.IsEmpty())
+  if (damage_rect_.IsEmpty())
     return;
 
   {
@@ -78,14 +74,14 @@
   // drawing to the buffer directly this ensures that the buffer is never in a
   // state that would result in flicker.
   {
-    TRACE_EVENT1("ui", "FastInkView::ScopedPaint::Copy", "buffer_rect",
-                 buffer_rect_.ToString());
+    TRACE_EVENT1("ui", "FastInkView::ScopedPaint::Copy", "damage_rect",
+                 damage_rect_.ToString());
 
     uint8_t* data = static_cast<uint8_t*>(gpu_memory_buffer_->memory(0));
     int stride = gpu_memory_buffer_->stride(0);
     canvas_.GetBitmap().readPixels(
-        SkImageInfo::MakeN32Premul(buffer_rect_.width(), buffer_rect_.height()),
-        data + buffer_rect_.y() * stride + buffer_rect_.x() * 4, stride, 0, 0);
+        SkImageInfo::MakeN32Premul(damage_rect_.width(), damage_rect_.height()),
+        data + damage_rect_.y() * stride + damage_rect_.x() * 4, stride, 0, 0);
   }
 
   {
@@ -96,435 +92,12 @@
   }
 }
 
-struct FastInkView::Resource {
-  Resource() = default;
-  ~Resource() {
-    // context_provider might be null in unit tests when ran with --mash
-    // TODO(kaznacheev) Have MASH provide a context provider for tests
-    // when https://crbug/772562 is fixed
-    if (!context_provider)
-      return;
-    gpu::SharedImageInterface* sii = context_provider->SharedImageInterface();
-    DCHECK(!mailbox.IsZero());
-    sii->DestroySharedImage(sync_token, mailbox);
-  }
-  scoped_refptr<viz::ContextProvider> context_provider;
-  gpu::Mailbox mailbox;
-  gpu::SyncToken sync_token;
-  bool damaged = true;
-};
-
-class FastInkView::LayerTreeFrameSinkHolder
-    : public cc::LayerTreeFrameSinkClient,
-      public aura::WindowObserver {
- public:
-  LayerTreeFrameSinkHolder(FastInkView* view,
-                           std::unique_ptr<cc::LayerTreeFrameSink> frame_sink)
-      : view_(view), frame_sink_(std::move(frame_sink)) {
-    frame_sink_->BindToClient(this);
-  }
-  ~LayerTreeFrameSinkHolder() override {
-    if (frame_sink_)
-      frame_sink_->DetachFromClient();
-    if (root_window_)
-      root_window_->RemoveObserver(this);
-  }
-
-  // Delete frame sink after having reclaimed all exported resources.
-  // TODO(reveman): Find a better way to handle deletion of in-flight resources.
-  // https://crbug.com/765763
-  static void DeleteWhenLastResourceHasBeenReclaimed(
-      std::unique_ptr<LayerTreeFrameSinkHolder> holder) {
-    if (holder->last_frame_size_in_pixels_.IsEmpty()) {
-      // Delete sink holder immediately if no frame has been submitted.
-      DCHECK(holder->exported_resources_.empty());
-      return;
-    }
-
-    // Submit an empty frame to ensure that pending release callbacks will be
-    // processed in a finite amount of time.
-    viz::CompositorFrame frame;
-    frame.metadata.begin_frame_ack.frame_id =
-        viz::BeginFrameId(viz::BeginFrameArgs::kManualSourceId,
-                          viz::BeginFrameArgs::kStartingFrameNumber);
-    frame.metadata.begin_frame_ack.has_damage = true;
-    frame.metadata.device_scale_factor =
-        holder->last_frame_device_scale_factor_;
-    frame.metadata.local_surface_id_allocation_time =
-        holder->last_local_surface_id_allocation_time_;
-    frame.metadata.frame_token = ++holder->next_frame_token_;
-    std::unique_ptr<viz::RenderPass> pass = viz::RenderPass::Create();
-    pass->SetNew(1, gfx::Rect(holder->last_frame_size_in_pixels_),
-                 gfx::Rect(holder->last_frame_size_in_pixels_),
-                 gfx::Transform());
-    frame.render_pass_list.push_back(std::move(pass));
-    holder->frame_sink_->SubmitCompositorFrame(std::move(frame),
-                                               /*hit_test_data_changed=*/true,
-                                               /*show_hit_test_borders=*/false);
-
-    // Delete sink holder immediately if not waiting for exported resources to
-    // be reclaimed.
-    if (holder->exported_resources_.empty())
-      return;
-
-    // Delete sink holder immediately if native window is already gone.
-    aura::Window* window = holder->view_->GetWidget()->GetNativeView();
-    if (!window)
-      return;
-
-    aura::Window* root_window = window->GetRootWindow();
-    holder->root_window_ = root_window;
-    holder->view_ = nullptr;
-
-    // If we have exported resources to reclaim then extend the lifetime of
-    // holder by adding it as a root window observer. The holder will delete
-    // itself when the root window is removed or when all exported resources
-    // have been reclaimed.
-    root_window->AddObserver(holder.release());
-  }
-
-  void SubmitCompositorFrame(viz::CompositorFrame frame,
-                             viz::ResourceId resource_id,
-                             std::unique_ptr<Resource> resource) {
-    exported_resources_[resource_id] = std::move(resource);
-    last_frame_size_in_pixels_ = frame.size_in_pixels();
-    last_frame_device_scale_factor_ = frame.metadata.device_scale_factor;
-    last_local_surface_id_allocation_time_ =
-        frame.metadata.local_surface_id_allocation_time;
-    frame.metadata.frame_token = ++next_frame_token_;
-    frame_sink_->SubmitCompositorFrame(std::move(frame),
-                                       /*hit_test_data_changed=*/true,
-                                       /*show_hit_test_borders=*/false);
-  }
-
-  void DamageExportedResources() {
-    for (auto& entry : exported_resources_)
-      entry.second->damaged = true;
-  }
-
-  // Overridden from cc::LayerTreeFrameSinkClient:
-  void SetBeginFrameSource(viz::BeginFrameSource* source) override {}
-  base::Optional<viz::HitTestRegionList> BuildHitTestData() override {
-    return {};
-  }
-  void ReclaimResources(
-      const std::vector<viz::ReturnedResource>& resources) override {
-    if (delete_pending_)
-      return;
-    for (auto& entry : resources) {
-      auto it = exported_resources_.find(entry.id);
-      DCHECK(it != exported_resources_.end());
-      std::unique_ptr<Resource> resource = std::move(it->second);
-      exported_resources_.erase(it);
-      resource->sync_token = entry.sync_token;
-      if (view_ && !entry.lost)
-        view_->ReclaimResource(std::move(resource));
-    }
-
-    if (root_window_ && exported_resources_.empty())
-      ScheduleDelete();
-  }
-  void SetTreeActivationCallback(base::RepeatingClosure callback) override {}
-  void DidReceiveCompositorFrameAck() override {
-    if (view_)
-      view_->DidReceiveCompositorFrameAck();
-  }
-  void DidPresentCompositorFrame(
-      uint32_t frame_token,
-      const viz::FrameTimingDetails& details) override {
-    if (view_)
-      view_->DidPresentCompositorFrame(details.presentation_feedback);
-  }
-  void DidLoseLayerTreeFrameSink() override {
-    exported_resources_.clear();
-    if (root_window_)
-      ScheduleDelete();
-  }
-  void OnDraw(const gfx::Transform& transform,
-              const gfx::Rect& viewport,
-              bool resourceless_software_draw,
-              bool skip_draw) override {}
-  void SetMemoryPolicy(const cc::ManagedMemoryPolicy& policy) override {}
-  void SetExternalTilePriorityConstraints(
-      const gfx::Rect& viewport_rect,
-      const gfx::Transform& transform) override {}
-
-  // Overridden from aura::WindowObserver:
-  void OnWindowDestroying(aura::Window* window) override {
-    root_window_->RemoveObserver(this);
-    root_window_ = nullptr;
-    // Make sure frame sink never outlives aura.
-    frame_sink_->DetachFromClient();
-    frame_sink_.reset();
-    ScheduleDelete();
-  }
-
- private:
-  void ScheduleDelete() {
-    if (delete_pending_)
-      return;
-    delete_pending_ = true;
-    base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
-  }
-
-  FastInkView* view_;
-  std::unique_ptr<cc::LayerTreeFrameSink> frame_sink_;
-  base::flat_map<viz::ResourceId, std::unique_ptr<Resource>>
-      exported_resources_;
-  viz::FrameTokenGenerator next_frame_token_;
-  gfx::Size last_frame_size_in_pixels_;
-  float last_frame_device_scale_factor_ = 1.0f;
-  base::TimeTicks last_local_surface_id_allocation_time_;
-  aura::Window* root_window_ = nullptr;
-  bool delete_pending_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(LayerTreeFrameSinkHolder);
-};
-
-FastInkView::FastInkView(aura::Window* container,
-                         const PresentationCallback& presentation_callback)
-    : presentation_callback_(presentation_callback) {
-  widget_.reset(new views::Widget);
-  views::Widget::InitParams params;
-  params.type = views::Widget::InitParams::TYPE_WINDOW_FRAMELESS;
-  params.name = "FastInkOverlay";
-  params.accept_events = false;
-  params.activatable = views::Widget::InitParams::ACTIVATABLE_NO;
-  params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
-  params.parent = container;
-  params.layer_type = ui::LAYER_SOLID_COLOR;
-
-  gfx::Rect screen_bounds = container->GetRootWindow()->GetBoundsInScreen();
-  widget_->Init(std::move(params));
-  widget_->Show();
-  widget_->SetContentsView(this);
-  widget_->SetBounds(screen_bounds);
-  set_owned_by_client();
-
-  // Take the root transform and apply this during buffer update instead of
-  // leaving this up to the compositor. The benefit is that HW requirements
-  // for being able to take advantage of overlays and direct scanout are
-  // reduced significantly. Frames are submitted to the compositor with the
-  // inverse transform to cancel out the transformation that would otherwise
-  // be done by the compositor.
-  screen_to_buffer_transform_ =
-      widget_->GetNativeWindow()->GetHost()->GetRootTransform();
-
-  buffer_size_ = gfx::ToEnclosedRect(cc::MathUtil::MapClippedRect(
-                                         screen_to_buffer_transform_,
-                                         gfx::RectF(screen_bounds.width(),
-                                                    screen_bounds.height())))
-                     .size();
-
-  // Create a single GPU memory buffer. Content will be written into this
-  // buffer without any buffering. The result is that we might be modifying
-  // the buffer while it's being displayed. This provides minimal latency
-  // but with potential tearing. Note that we have to draw into a temporary
-  // surface and copy it into GPU memory buffer to avoid flicker.
-  gpu_memory_buffer_ =
-      aura::Env::GetInstance()
-          ->context_factory()
-          ->GetGpuMemoryBufferManager()
-          ->CreateGpuMemoryBuffer(buffer_size_,
-                                  SK_B32_SHIFT ? gfx::BufferFormat::RGBA_8888
-                                               : gfx::BufferFormat::BGRA_8888,
-                                  gfx::BufferUsage::SCANOUT_CPU_READ_WRITE,
-                                  gpu::kNullSurfaceHandle);
-  LOG_IF(ERROR, !gpu_memory_buffer_) << "Failed to create GPU memory buffer";
-
-  frame_sink_holder_ = std::make_unique<LayerTreeFrameSinkHolder>(
-      this, widget_->GetNativeView()->CreateLayerTreeFrameSink());
-}
-
-FastInkView::~FastInkView() {
-  LayerTreeFrameSinkHolder::DeleteWhenLastResourceHasBeenReclaimed(
-      std::move(frame_sink_holder_));
-}
+FastInkView::~FastInkView() = default;
 
 void FastInkView::UpdateSurface(const gfx::Rect& content_rect,
                                 const gfx::Rect& damage_rect,
                                 bool auto_refresh) {
-  content_rect_ = content_rect;
-  damage_rect_.Union(damage_rect);
-  auto_refresh_ = auto_refresh;
-  pending_compositor_frame_ = true;
-
-  if (!damage_rect.IsEmpty()) {
-    frame_sink_holder_->DamageExportedResources();
-    for (auto& resource : returned_resources_)
-      resource->damaged = true;
-  }
-
-  if (!pending_compositor_frame_ack_)
-    SubmitCompositorFrame();
-}
-
-void FastInkView::SubmitCompositorFrame() {
-  TRACE_EVENT1("ui", "FastInkView::SubmitCompositorFrame", "damage",
-               damage_rect_.ToString());
-
-  float device_scale_factor = widget_->GetLayer()->device_scale_factor();
-  gfx::Rect output_rect(gfx::ConvertSizeToPixel(
-      device_scale_factor,
-      widget_->GetNativeView()->GetBoundsInScreen().size()));
-
-  gfx::Rect quad_rect;
-  gfx::Rect damage_rect;
-  // Continuously redraw the full output rectangle when in auto-refresh mode.
-  // This is necessary in order to allow single buffered updates without having
-  // buffer changes outside the contents area cause artifacts.
-  if (auto_refresh_) {
-    quad_rect = gfx::Rect(buffer_size_);
-    damage_rect = gfx::Rect(output_rect);
-  } else {
-    // Use minimal quad and damage rectangles when auto-refresh mode is off.
-    quad_rect = BufferRectFromScreenRect(screen_to_buffer_transform_,
-                                         buffer_size_, content_rect_);
-    damage_rect = gfx::ConvertRectToPixel(device_scale_factor, damage_rect_);
-    damage_rect.Intersect(output_rect);
-    pending_compositor_frame_ = false;
-  }
-  damage_rect_ = gfx::Rect();
-
-  std::unique_ptr<Resource> resource;
-  // Reuse returned resource if available.
-  if (!returned_resources_.empty()) {
-    resource = std::move(returned_resources_.back());
-    returned_resources_.pop_back();
-  }
-
-  // Create new resource if needed.
-  if (!resource)
-    resource = std::make_unique<Resource>();
-
-  if (resource->damaged) {
-    // Acquire context provider for resource if needed.
-    // Note: We make no attempts to recover if the context provider is later
-    // lost. It is expected that this class is short-lived and requiring a
-    // new instance to be created in lost context situations is acceptable and
-    // keeps the code simple.
-    if (!resource->context_provider) {
-      resource->context_provider = aura::Env::GetInstance()
-                                       ->context_factory()
-                                       ->SharedMainThreadContextProvider();
-      if (!resource->context_provider) {
-        LOG(ERROR) << "Failed to acquire a context provider";
-        return;
-      }
-    }
-
-    gpu::SharedImageInterface* sii =
-        resource->context_provider->SharedImageInterface();
-    if (resource->mailbox.IsZero()) {
-      DCHECK(!resource->sync_token.HasData());
-      const uint32_t usage =
-          gpu::SHARED_IMAGE_USAGE_DISPLAY | gpu::SHARED_IMAGE_USAGE_SCANOUT;
-      gpu::GpuMemoryBufferManager* gmb_manager =
-          aura::Env::GetInstance()
-              ->context_factory()
-              ->GetGpuMemoryBufferManager();
-      resource->mailbox = sii->CreateSharedImage(
-          gpu_memory_buffer_.get(), gmb_manager, gfx::ColorSpace(), usage);
-    } else {
-      sii->UpdateSharedImage(resource->sync_token, resource->mailbox);
-    }
-    resource->sync_token = sii->GenVerifiedSyncToken();
-
-    resource->damaged = false;
-  }
-
-  viz::TransferableResource transferable_resource;
-  transferable_resource.id = next_resource_id_++;
-  transferable_resource.format = viz::RGBA_8888;
-  transferable_resource.filter = GL_LINEAR;
-  transferable_resource.size = buffer_size_;
-  transferable_resource.mailbox_holder = gpu::MailboxHolder(
-      resource->mailbox, resource->sync_token, GL_TEXTURE_2D);
-  // Use HW overlay if continuous updates are expected.
-  transferable_resource.is_overlay_candidate = auto_refresh_;
-
-  gfx::Transform target_to_buffer_transform(screen_to_buffer_transform_);
-  target_to_buffer_transform.Scale(1.f / device_scale_factor,
-                                   1.f / device_scale_factor);
-
-  gfx::Transform buffer_to_target_transform;
-  bool rv = target_to_buffer_transform.GetInverse(&buffer_to_target_transform);
-  DCHECK(rv);
-
-  const int kRenderPassId = 1;
-  std::unique_ptr<viz::RenderPass> render_pass = viz::RenderPass::Create();
-  render_pass->SetNew(kRenderPassId, output_rect, damage_rect,
-                      buffer_to_target_transform);
-
-  viz::SharedQuadState* quad_state =
-      render_pass->CreateAndAppendSharedQuadState();
-  quad_state->SetAll(
-      buffer_to_target_transform,
-      /*quad_layer_rect=*/output_rect,
-      /*visible_quad_layer_rect=*/output_rect,
-      /*rounded_corner_bounds=*/gfx::RRectF(),
-      /*clip_rect=*/gfx::Rect(),
-      /*is_clipped=*/false, /*are_contents_opaque=*/false, /*opacity=*/1.f,
-      /*blend_mode=*/SkBlendMode::kSrcOver, /*sorting_context_id=*/0);
-
-  viz::CompositorFrame frame;
-  // TODO(eseckler): FastInkView should use BeginFrames and set the ack
-  // accordingly.
-  frame.metadata.begin_frame_ack =
-      viz::BeginFrameAck::CreateManualAckWithDamage();
-  frame.metadata.device_scale_factor = device_scale_factor;
-  frame.metadata.local_surface_id_allocation_time =
-      widget_->GetNativeView()->GetLocalSurfaceIdAllocation().allocation_time();
-
-  frame.metadata.frame_token = ++next_frame_token_;
-
-  viz::TextureDrawQuad* texture_quad =
-      render_pass->CreateAndAppendDrawQuad<viz::TextureDrawQuad>();
-  float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f};
-  gfx::RectF uv_crop(quad_rect);
-  uv_crop.Scale(1.f / buffer_size_.width(), 1.f / buffer_size_.height());
-  texture_quad->SetNew(
-      quad_state, quad_rect, quad_rect,
-      /*needs_blending=*/true, transferable_resource.id,
-      /*premultiplied_alpha=*/true, uv_crop.origin(), uv_crop.bottom_right(),
-      /*background_color=*/SK_ColorTRANSPARENT, vertex_opacity,
-      /*y_flipped=*/false,
-      /*nearest_neighbor=*/false,
-      /*secure_output_only=*/false, gfx::ProtectedVideoType::kClear);
-  texture_quad->set_resource_size_in_pixels(transferable_resource.size);
-  frame.resource_list.push_back(transferable_resource);
-
-  DCHECK(!pending_compositor_frame_ack_);
-  pending_compositor_frame_ack_ = true;
-
-  frame.render_pass_list.push_back(std::move(render_pass));
-  frame_sink_holder_->SubmitCompositorFrame(
-      std::move(frame), transferable_resource.id, std::move(resource));
-}
-
-void FastInkView::SubmitPendingCompositorFrame() {
-  if (pending_compositor_frame_ && !pending_compositor_frame_ack_)
-    SubmitCompositorFrame();
-}
-
-void FastInkView::DidReceiveCompositorFrameAck() {
-  pending_compositor_frame_ack_ = false;
-  if (pending_compositor_frame_) {
-    base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(&FastInkView::SubmitPendingCompositorFrame,
-                                  weak_ptr_factory_.GetWeakPtr()));
-  }
-}
-
-void FastInkView::DidPresentCompositorFrame(
-    const gfx::PresentationFeedback& feedback) {
-  if (!presentation_callback_.is_null())
-    presentation_callback_.Run(feedback);
-}
-
-void FastInkView::ReclaimResource(std::unique_ptr<Resource> resource) {
-  returned_resources_.push_back(std::move(resource));
+  host_->UpdateSurface(content_rect, damage_rect, auto_refresh);
 }
 
 }  // namespace fast_ink
diff --git a/ash/fast_ink/fast_ink_view.h b/ash/fast_ink/fast_ink_view.h
index d35b56f..499ad19 100644
--- a/ash/fast_ink/fast_ink_view.h
+++ b/ash/fast_ink/fast_ink_view.h
@@ -8,10 +8,8 @@
 #include <memory>
 #include <vector>
 
+#include "ash/fast_ink/fast_ink_host.h"
 #include "base/containers/flat_map.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "components/viz/common/resources/resource_id.h"
 #include "ui/gfx/canvas.h"
 #include "ui/views/view.h"
 
@@ -21,7 +19,6 @@
 
 namespace gfx {
 class GpuMemoryBuffer;
-struct PresentationFeedback;
 }  // namespace gfx
 
 namespace views {
@@ -30,76 +27,49 @@
 
 namespace fast_ink {
 
-// FastInkView is a view supporting low-latency rendering. The view can enter
-// 'auto-refresh' mode in order to provide minimum latency updates for the
-// associated widget. 'auto-refresh' mode will take advantage of HW overlays
-// when possible and trigger continious updates.
+// FastInkView is a view supporting low-latency rendering by using FastInkHost.
+// THe view's widget must have the same bounds as a root window (covers the
+// entire display). FastInkHost for more details.
 class FastInkView : public views::View {
  public:
-  using PresentationCallback =
-      base::RepeatingCallback<void(const gfx::PresentationFeedback&)>;
-
   // Creates a FastInkView filling the bounds of |root_window|.
   // If |root_window| is resized (e.g. due to a screen size change),
   // a new instance of FastInkView should be created.
   FastInkView(aura::Window* container,
-              const PresentationCallback& presentation_callback);
+              const FastInkHost::PresentationCallback& presentation_callback);
   ~FastInkView() override;
+  FastInkView(const FastInkView&) = delete;
+  FastInkView& operator=(const FastInkView&) = delete;
+
+  // Update content and damage rectangles for surface. See
+  // FastInkHost::UpdateSurface for more detials.
+  void UpdateSurface(const gfx::Rect& content_rect,
+                     const gfx::Rect& damage_rect,
+                     bool auto_refresh);
 
  protected:
   // Helper class that provides flicker free painting to a GPU memory buffer.
   class ScopedPaint {
    public:
-    ScopedPaint(gfx::GpuMemoryBuffer* gpu_memory_buffer,
-                const gfx::Transform& screen_to_buffer_transform,
-                const gfx::Rect& rect);
+    ScopedPaint(FastInkView* view, const gfx::Rect& damage_rect_in_window);
     ~ScopedPaint();
 
     gfx::Canvas& canvas() { return canvas_; }
 
    private:
     gfx::GpuMemoryBuffer* const gpu_memory_buffer_;
-    const gfx::Rect buffer_rect_;
+    // Damage rect in the buffer coordinates.
+    const gfx::Rect damage_rect_;
     gfx::Canvas canvas_;
 
     DISALLOW_COPY_AND_ASSIGN(ScopedPaint);
   };
 
-  // Update content and damage rectangles for surface. |auto_refresh| should
-  // be set to true if continuous updates are expected within content rectangle.
-  void UpdateSurface(const gfx::Rect& content_rect,
-                     const gfx::Rect& damage_rect,
-                     bool auto_refresh);
-
-  // Constants initialized in constructor.
-  const PresentationCallback presentation_callback_;
-  gfx::Transform screen_to_buffer_transform_;
-  gfx::Size buffer_size_;
-  std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_;
+  FastInkHost* host() { return host_.get(); }
 
  private:
-  class LayerTreeFrameSinkHolder;
-  struct Resource;
-
-  void SubmitCompositorFrame();
-  void SubmitPendingCompositorFrame();
-  void ReclaimResource(std::unique_ptr<Resource> resource);
-  void DidReceiveCompositorFrameAck();
-  void DidPresentCompositorFrame(const gfx::PresentationFeedback& feedback);
-
   std::unique_ptr<views::Widget> widget_;
-  gfx::Rect content_rect_;
-  gfx::Rect damage_rect_;
-  bool auto_refresh_ = false;
-  bool pending_compositor_frame_ = false;
-  bool pending_compositor_frame_ack_ = false;
-  int next_resource_id_ = 1;
-  viz::FrameTokenGenerator next_frame_token_;
-  std::vector<std::unique_ptr<Resource>> returned_resources_;
-  std::unique_ptr<LayerTreeFrameSinkHolder> frame_sink_holder_;
-  base::WeakPtrFactory<FastInkView> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(FastInkView);
+  std::unique_ptr<FastInkHost> host_;
 };
 
 }  // namespace fast_ink
diff --git a/ash/fast_ink/laser/laser_pointer_view.cc b/ash/fast_ink/laser/laser_pointer_view.cc
index c19dbd2..c32613c4 100644
--- a/ash/fast_ink/laser/laser_pointer_view.cc
+++ b/ash/fast_ink/laser/laser_pointer_view.cc
@@ -160,7 +160,7 @@
                                    base::TimeDelta presentation_delay,
                                    base::TimeDelta stationary_point_delay,
                                    aura::Window* container)
-    : FastInkView(container, PresentationCallback()),
+    : FastInkView(container, fast_ink::FastInkHost::PresentationCallback()),
       laser_points_(life_duration),
       predicted_laser_points_(life_duration),
       presentation_delay_(presentation_delay),
@@ -231,8 +231,7 @@
     TRACE_EVENT1("ui", "LaserPointerView::UpdateBuffer::Paint", "damage",
                  damage_rect.ToString());
 
-    ScopedPaint paint(gpu_memory_buffer_.get(), screen_to_buffer_transform_,
-                      damage_rect);
+    ScopedPaint paint(this, damage_rect);
     Draw(paint.canvas());
   }
 
diff --git a/ash/highlighter/highlighter_view.cc b/ash/highlighter/highlighter_view.cc
index 4e1a7fe..d1ec005 100644
--- a/ash/highlighter/highlighter_view.cc
+++ b/ash/highlighter/highlighter_view.cc
@@ -73,7 +73,7 @@
 
 HighlighterView::HighlighterView(base::TimeDelta presentation_delay,
                                  aura::Window* container)
-    : FastInkView(container, PresentationCallback()),
+    : FastInkView(container, fast_ink::FastInkHost::PresentationCallback()),
       points_(base::TimeDelta()),
       predicted_points_(base::TimeDelta()),
       presentation_delay_(presentation_delay) {}
@@ -187,8 +187,7 @@
   pending_update_buffer_ = false;
 
   {
-    ScopedPaint paint(gpu_memory_buffer_.get(), screen_to_buffer_transform_,
-                      highlighter_damage_rect_);
+    ScopedPaint paint(this, highlighter_damage_rect_);
 
     Draw(paint.canvas());
   }
diff --git a/ash/public/cpp/app_list/app_list_controller.h b/ash/public/cpp/app_list/app_list_controller.h
index 00f550c..bece35f 100644
--- a/ash/public/cpp/app_list/app_list_controller.h
+++ b/ash/public/cpp/app_list/app_list_controller.h
@@ -11,6 +11,7 @@
 #include "ash/public/cpp/ash_public_export.h"
 #include "base/callback_forward.h"
 #include "base/containers/flat_map.h"
+#include "base/optional.h"
 #include "base/strings/string16.h"
 #include "ui/aura/window.h"
 
@@ -168,8 +169,10 @@
   // Returns the app list window or nullptr if it is not visible.
   virtual aura::Window* GetWindow() = 0;
 
-  // Returns whether the AppList is visible.
-  virtual bool IsVisible() = 0;
+  // Returns whether the AppList is visible on the provided display.
+  // If |display_id| is null, returns whether an app list is visible on any
+  // display.
+  virtual bool IsVisible(const base::Optional<int64_t>& display_id) = 0;
 
  protected:
   AppListController();
diff --git a/ash/shelf/drag_handle.cc b/ash/shelf/drag_handle.cc
index 7d7537ef..c52bcbe 100644
--- a/ash/shelf/drag_handle.cc
+++ b/ash/shelf/drag_handle.cc
@@ -13,7 +13,6 @@
 #include "ash/style/ash_color_provider.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "base/bind.h"
-#include "base/debug/stack_trace.h"
 #include "base/timer/timer.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
diff --git a/ash/shelf/home_button_controller.cc b/ash/shelf/home_button_controller.cc
index 2dc34c4..2b4ccf9f 100644
--- a/ash/shelf/home_button_controller.cc
+++ b/ash/shelf/home_button_controller.cc
@@ -33,9 +33,9 @@
     base::TimeDelta::FromMilliseconds(200);
 
 // Returns true if the button should appear activatable.
-bool CanActivate() {
+bool CanActivate(int64_t display_id) {
   return Shell::Get()->IsInTabletMode() ||
-         !Shell::Get()->app_list_controller()->IsVisible();
+         !Shell::Get()->app_list_controller()->IsVisible(display_id);
 }
 
 }  // namespace
@@ -78,7 +78,7 @@
         assistant_animation_delay_timer_->Stop();
       }
 
-      if (CanActivate())
+      if (CanActivate(button_->GetDisplayId()))
         button_->AnimateInkDrop(views::InkDropState::ACTION_TRIGGERED, event);
 
       // After animating the ripple, let the button handle the event.
@@ -91,7 +91,7 @@
                            base::Unretained(this)));
       }
 
-      if (CanActivate())
+      if (CanActivate(button_->GetDisplayId()))
         button_->AnimateInkDrop(views::InkDropState::ACTION_PENDING, event);
 
       return false;
diff --git a/ash/shelf/hotseat_widget_unittest.cc b/ash/shelf/hotseat_widget_unittest.cc
index d67df86..6598f66 100644
--- a/ash/shelf/hotseat_widget_unittest.cc
+++ b/ash/shelf/hotseat_widget_unittest.cc
@@ -409,7 +409,8 @@
   std::unique_ptr<aura::Window> window =
       AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
   wm::ActivateWindow(window.get());
-  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible());
+  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible(
+      display::Screen::GetScreen()->GetPrimaryDisplay().id()));
 
   ShelfTestUtil::AddAppShortcut("app_id", TYPE_PINNED_APP);
 
@@ -599,7 +600,8 @@
                                      InAppShelfGestures::kSwipeUpToShow, 0);
 
   // Swipe up on the shelf to show the hotseat.
-  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible());
+  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible(
+      display::Screen::GetScreen()->GetPrimaryDisplay().id()));
 
   SwipeUpOnShelf();
 
@@ -623,7 +625,8 @@
   GetEventGenerator()->GestureScrollSequence(start, end, kTimeDelta,
                                              kNumScrollSteps);
 
-  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible());
+  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible(
+      display::Screen::GetScreen()->GetPrimaryDisplay().id()));
   EXPECT_EQ(HotseatState::kExtended, GetShelfLayoutManager()->hotseat_state());
   if (shelf_auto_hide_behavior() == ShelfAutoHideBehavior::kAlways)
     EXPECT_EQ(SHELF_AUTO_HIDE_SHOWN, GetPrimaryShelf()->GetAutoHideState());
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc
index 2b7ca245..6e9b88f 100644
--- a/ash/shelf/scrollable_shelf_view.cc
+++ b/ash/shelf/scrollable_shelf_view.cc
@@ -112,6 +112,12 @@
   return ShelfConfig::Get()->button_size() / 2;
 }
 
+// Returns the display id for the display that shows the shelf for |view|.
+int64_t GetDisplayIdForView(const views::View* view) {
+  aura::Window* window = view->GetWidget()->GetNativeWindow();
+  return display::Screen::GetScreen()->GetDisplayNearestWindow(window).id();
+}
+
 }  // namespace
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -320,11 +326,13 @@
 
   ~ScrollableShelfAnimationMetricsReporter() override = default;
 
+  void set_display_id(int64_t display_id) { display_id_ = display_id; }
+
   // ui::AnimationMetricsReporter:
   void Report(int value) override {
     base::UmaHistogramPercentage(kAnimationSmoothnessHistogram, value);
     if (Shell::Get()->IsInTabletMode()) {
-      if (Shell::Get()->app_list_controller()->IsVisible()) {
+      if (Shell::Get()->app_list_controller()->IsVisible(display_id_)) {
         base::UmaHistogramPercentage(
             kAnimationSmoothnessTabletLauncherVisibleHistogram, value);
       } else {
@@ -332,7 +340,7 @@
             kAnimationSmoothnessTabletLauncherHiddenHistogram, value);
       }
     } else {
-      if (Shell::Get()->app_list_controller()->IsVisible()) {
+      if (Shell::Get()->app_list_controller()->IsVisible(display_id_)) {
         base::UmaHistogramPercentage(
             kAnimationSmoothnessClamshellLauncherVisibleHistogram, value);
       } else {
@@ -342,6 +350,8 @@
     }
   }
 
+ private:
+  int64_t display_id_ = display::kInvalidDisplayId;
   DISALLOW_COPY_AND_ASSIGN(ScrollableShelfAnimationMetricsReporter);
 };
 
@@ -740,6 +750,7 @@
   animation_settings.SetAnimationMetricsReporter(
       animation_metrics_reporter_.get());
   animation_settings.AddObserver(this);
+  animation_metrics_reporter_->set_display_id(GetDisplayIdForView(this));
   shelf_container_view_->TranslateShelfView(scroll_offset_);
 }
 
@@ -1485,7 +1496,8 @@
   if (event.type() == ui::ET_GESTURE_SCROLL_BEGIN) {
     DCHECK(!presentation_time_recorder_);
     if (Shell::Get()->IsInTabletMode()) {
-      if (Shell::Get()->app_list_controller()->IsVisible()) {
+      if (Shell::Get()->app_list_controller()->IsVisible(
+              GetDisplayIdForView(this))) {
         presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder(
             GetWidget()->GetCompositor(),
             kScrollDraggingTabletLauncherVisibleHistogram,
@@ -1497,7 +1509,8 @@
             kScrollDraggingTabletLauncherHiddenMaxLatencyHistogram);
       }
     } else {
-      if (Shell::Get()->app_list_controller()->IsVisible()) {
+      if (Shell::Get()->app_list_controller()->IsVisible(
+              GetDisplayIdForView(this))) {
         presentation_time_recorder_ = CreatePresentationTimeHistogramRecorder(
             GetWidget()->GetCompositor(),
             kScrollDraggingClamshellLauncherVisibleHistogram,
diff --git a/ash/shelf/scrollable_shelf_view.h b/ash/shelf/scrollable_shelf_view.h
index fac462d..9b2a0f40 100644
--- a/ash/shelf/scrollable_shelf_view.h
+++ b/ash/shelf/scrollable_shelf_view.h
@@ -29,6 +29,7 @@
 
 namespace ash {
 class PresentationTimeRecorder;
+class ScrollableShelfAnimationMetricsReporter;
 
 class ASH_EXPORT ScrollableShelfView : public views::AccessiblePaneView,
                                        public ShellObserver,
@@ -518,7 +519,7 @@
   base::OneShotTimer page_flip_timer_;
 
   // Metric reporter for scrolling animations.
-  const std::unique_ptr<ui::AnimationMetricsReporter>
+  const std::unique_ptr<ScrollableShelfAnimationMetricsReporter>
       animation_metrics_reporter_;
 
   // Records the presentation time for the scrollable shelf dragging.
diff --git a/ash/shelf/shelf.cc b/ash/shelf/shelf.cc
index 729a25c..086094b 100644
--- a/ash/shelf/shelf.cc
+++ b/ash/shelf/shelf.cc
@@ -511,7 +511,7 @@
   DCHECK(app_list_controller);
   // If the App List is not visible, send MouseWheel events to the
   // |shelf_layout_manager_| because these events are used to show the App List.
-  if (app_list_controller->IsVisible()) {
+  if (app_list_controller->IsVisible(shelf_layout_manager_->display_.id())) {
     app_list_controller->ProcessMouseWheelEvent(*event);
   } else {
     shelf_layout_manager_->ProcessMouseWheelEventFromShelf(event,
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 4d19f4d1..c80d4e3a 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -829,7 +829,7 @@
             ->GetActiveWindow());
   const bool app_list_is_visible =
       Shell::Get()->app_list_controller() &&
-      Shell::Get()->app_list_controller()->IsVisible();
+      Shell::Get()->app_list_controller()->IsVisible(display_.id());
   const bool in_overview =
       Shell::Get()->overview_controller() &&
       Shell::Get()->overview_controller()->InOverviewSession();
@@ -845,7 +845,8 @@
       // If the home launcher is shown or mostly shown, show the home launcher
       // background. If it is mostly hidden, show the in-app or overview
       // background.
-      if (!Shell::Get()->app_list_controller()->GetTargetVisibility()) {
+      if (!Shell::Get()->app_list_controller()->GetTargetVisibility(
+              display_.id())) {
         return in_overview ? ShelfBackgroundType::kOverview
                            : ShelfBackgroundType::kInApp;
       }
@@ -1308,7 +1309,7 @@
        overview_mode_will_start_) &&
       !overview_controller->IsCompletingShutdownAnimations();
   const bool app_list_visible =
-      app_list_controller->GetTargetVisibility() ||
+      app_list_controller->GetTargetVisibility(display_.id()) ||
       app_list_controller->ShouldHomeLauncherBeVisible();
 
   // TODO(https://crbug.com/1058205): Test this behavior.
@@ -1969,7 +1970,7 @@
   // If the non-fullscreen app list should be shown, the shelf should not be
   // hidden.
   if (!Shell::Get()->IsInTabletMode() &&
-      Shell::Get()->app_list_controller()->GetTargetVisibility()) {
+      Shell::Get()->app_list_controller()->GetTargetVisibility(display_.id())) {
     return false;
   }
 
@@ -2049,7 +2050,7 @@
     drag_status_ = previous_drag_status;
   }
 
-  if (Shell::Get()->app_list_controller()->IsVisible())
+  if (Shell::Get()->app_list_controller()->IsVisible(display_.id()))
     return true;
   return StartShelfDrag(
       gesture_in_screen,
@@ -2184,7 +2185,7 @@
 
   // If the app list is already open, swiping up on the shelf should keep it
   // open.
-  if (Shell::Get()->app_list_controller()->IsVisible())
+  if (Shell::Get()->app_list_controller()->IsVisible(display_.id()))
     return false;
 
   // Swipes down on shelf should hide the shelf.
@@ -2211,7 +2212,7 @@
 bool ShelfLayoutManager::StartShelfDrag(const ui::LocatedEvent& event_in_screen,
                                         const gfx::Vector2dF& scroll_hint) {
   // Disable the shelf dragging if the fullscreen app list is opened.
-  if (Shell::Get()->app_list_controller()->IsVisible() &&
+  if (Shell::Get()->app_list_controller()->IsVisible(display_.id()) &&
       !Shell::Get()->IsInTabletMode())
     return false;
 
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 41cf0a8..dc43522 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -3610,6 +3610,39 @@
   }
 }
 
+// Tests that the shelf background is opaque in both screens after app list is
+// dismissed in a secondary display. (See https://crbug.com/1060686)
+TEST_P(ShelfLayoutManagerTest, ShelfBackgroundOpaqueAfetrAppListUpdate) {
+  UpdateDisplay("800x600,800x600");
+  AppListControllerImpl* app_list_controller =
+      Shell::Get()->app_list_controller();
+  int64_t primary_display_id = display_manager()->GetDisplayAt(0).id();
+  int64_t secondary_display_id = display_manager()->GetDisplayAt(1).id();
+
+  app_list_controller->ToggleAppList(
+      secondary_display_id, AppListShowSource::kShelfButton, base::TimeTicks());
+  EXPECT_FALSE(app_list_controller->IsVisible(primary_display_id));
+  EXPECT_TRUE(app_list_controller->IsVisible(secondary_display_id));
+
+  app_list_controller->ToggleAppList(
+      secondary_display_id, AppListShowSource::kShelfButton, base::TimeTicks());
+  EXPECT_FALSE(app_list_controller->IsVisible(primary_display_id));
+  EXPECT_FALSE(app_list_controller->IsVisible(secondary_display_id));
+
+  ShelfWidget* primary_shelf_widget =
+      Shell::GetRootWindowControllerWithDisplayId(primary_display_id)
+          ->shelf()
+          ->shelf_widget();
+  ShelfWidget* secondary_shelf_widget =
+      Shell::GetRootWindowControllerWithDisplayId(secondary_display_id)
+          ->shelf()
+          ->shelf_widget();
+  EXPECT_EQ(ShelfBackgroundType::kDefaultBg,
+            primary_shelf_widget->GetBackgroundType());
+  EXPECT_EQ(ShelfBackgroundType::kDefaultBg,
+            secondary_shelf_widget->GetBackgroundType());
+}
+
 // Test base for unit test related to shelf dimming.
 class DimShelfLayoutManagerTestBase : public ShelfLayoutManagerTestBase {
  public:
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 2b758e39..33db34f7 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -656,7 +656,7 @@
   recorded_app_list_view_state_ =
       Shell::Get()->app_list_controller()->GetAppListViewState();
   app_list_visibility_before_app_launch_ =
-      Shell::Get()->app_list_controller()->IsVisible();
+      Shell::Get()->app_list_controller()->IsVisible(GetDisplayIdForView(this));
 
   // Run AfterItemSelected directly if the item has no delegate (ie. in tests).
   const ShelfItem& item = model_->items()[last_pressed_index_];
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index 11cd423..1f5822c 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -553,7 +553,7 @@
 <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ব্যবহার করা হচ্ছে</translation>
 <translation id="8190698733819146287">ভাষা এবং ইনপুট কাস্টমাইজ করুন...</translation>
 <translation id="8192202700944119416">বিজ্ঞপ্তি লুকানো আছে।</translation>
-<translation id="8196787716797768628">একটি অ্যাপ থেকে খুব তাড়াতাড়ি অন্য অ্যাপে যেতে এবং ট্যাবলেট মোডে আপনার Chromebook ব্যবহার করার জন্য নতুন 'জেসচার' ফিচারগুলি ব্যবহার করুন।</translation>
+<translation id="8196787716797768628">একটি অ্যাপ থেকে খুব তাড়াতাড়ি অন্য অ্যাপে যেতে এবং ট্যাবলেট মোডে আপনার Chromebook-এ নেভিগেট করার জন্য জেসচার ফিচার ব্যবহার করুন।</translation>
 <translation id="8203795194971602413">ডানদিকের বোতামে ক্লিক করুন</translation>
 <translation id="8236042855478648955">বিরতির সময় হয়েছে</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, ফোনের ব্যাটারি <ph name="BATTERY_STATUS" /></translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb
index 9bf3e06..0ab9beb 100644
--- a/ash/strings/ash_strings_bs.xtb
+++ b/ash/strings/ash_strings_bs.xtb
@@ -530,7 +530,7 @@
 <translation id="79341161159229895">Računom upravlja <ph name="FIRST_PARENT_EMAIL" /> i <ph name="SECOND_PARENT_EMAIL" /></translation>
 <translation id="7955885781510802139">Način rada visokog kontrasta</translation>
 <translation id="7977927628060636163">Traženje mobilnih mreža...</translation>
-<translation id="7980780401175799550">Isprobajte nove načine navigiranja Chrome OS-om</translation>
+<translation id="7980780401175799550">Isprobajte nove načine navigiranja Chrome OS-om</translation>
 <translation id="7982789257301363584">Mreža</translation>
 <translation id="7984197416080286869">Previše pokušaja otključavanja otiskom prsta</translation>
 <translation id="7994370417837006925">Višestruka prijava</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 09b8e8f..2fd5f1d 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -599,6 +599,7 @@
 <translation id="8735953464173050365">Show keyboard settings. <ph name="KEYBOARD_NAME" /> is selected</translation>
 <translation id="875593634123171288">Show VPN settings</translation>
 <translation id="8785070478575117577">Connect to <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">Swipe from the left to go back</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index c691615..8e10882 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -531,7 +531,7 @@
 <translation id="79341161159229895">Cuenta gestionada por <ph name="FIRST_PARENT_EMAIL" /> y <ph name="SECOND_PARENT_EMAIL" /></translation>
 <translation id="7955885781510802139">Modo de contraste alto</translation>
 <translation id="7977927628060636163">Buscando redes móviles…</translation>
-<translation id="7980780401175799550">Prueba nuevas formas de usar Chrome OS</translation>
+<translation id="7980780401175799550">Prueba nuevas formas de desplazarte por Chrome OS</translation>
 <translation id="7982789257301363584">Red</translation>
 <translation id="7984197416080286869">Demasiados intentos con huella digital</translation>
 <translation id="7994370417837006925">Inicio de sesión múltiple</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 8a5b0d5d..b0200f2 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -530,7 +530,7 @@
 <translation id="79341161159229895">Akun dikelola oleh <ph name="FIRST_PARENT_EMAIL" /> dan <ph name="SECOND_PARENT_EMAIL" /></translation>
 <translation id="7955885781510802139">Mode kontras tinggi</translation>
 <translation id="7977927628060636163">Menelusuri jaringan seluler...</translation>
-<translation id="7980780401175799550">Coba cara baru untuk menjelajahi Chrome OS</translation>
+<translation id="7980780401175799550">Coba cara baru untuk menggunakan Chrome OS</translation>
 <translation id="7982789257301363584">Jaringan</translation>
 <translation id="7984197416080286869">Terlalu banyak percobaan sidik jari</translation>
 <translation id="7994370417837006925">Fitur masuk banyak akun</translation>
@@ -552,7 +552,7 @@
 <translation id="8167567890448493835">Menggunakan <ph name="LOCALE_NAME" /></translation>
 <translation id="8190698733819146287">Sesuaikan bahasa dan masukan...</translation>
 <translation id="8192202700944119416">Notifikasi disembunyikan.</translation>
-<translation id="8196787716797768628">Gunakan gestur untuk beralih di antara aplikasi dengan cepat dan berinteraksi dengan Chromebook dalam mode tablet.</translation>
+<translation id="8196787716797768628">Gunakan gestur untuk berpindah-pindah aplikasi dengan cepat dan berinteraksi dengan Chromebook dalam mode tablet.</translation>
 <translation id="8203795194971602413">Klik kanan</translation>
 <translation id="8236042855478648955">Waktunya beristirahat</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />, Baterai Ponsel <ph name="BATTERY_STATUS" /></translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb
index a4e2f25..c79cf35 100644
--- a/ash/strings/ash_strings_is.xtb
+++ b/ash/strings/ash_strings_is.xtb
@@ -530,7 +530,7 @@
 <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> og <ph name="SECOND_PARENT_EMAIL" /> stjórna þessum reikningi</translation>
 <translation id="7955885781510802139">Mikil birtuskil</translation>
 <translation id="7977927628060636163">Leitar að farsímakerfum...</translation>
-<translation id="7980780401175799550">Prófaðu nýjar leiðir við að nota Chrome OS</translation>
+<translation id="7980780401175799550">Prófaðu nýjar leiðir til að nota Chrome OS</translation>
 <translation id="7982789257301363584">Símkerfi</translation>
 <translation id="7984197416080286869">Of margar tilraunir til að nota fingrafar</translation>
 <translation id="7994370417837006925">Innskráning á marga reikninga</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index b7b52cd3..88288ea 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -600,6 +600,7 @@
 <translation id="8735953464173050365">Mostra impostazioni tastiera. La selezione attiva è <ph name="KEYBOARD_NAME" /></translation>
 <translation id="875593634123171288">Mostra impostazioni VPN</translation>
 <translation id="8785070478575117577">Connetti a <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">Scorri da sinistra per tornare indietro</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index dacbe4f6..a889afa 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -600,6 +600,7 @@
 <translation id="8735953464173050365">Tunjukkan tetapan papan kekunci. <ph name="KEYBOARD_NAME" /> dipilih</translation>
 <translation id="875593634123171288">Tunjukkan tetapan VPN</translation>
 <translation id="8785070478575117577">Sambung kepada <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">Leret dari kiri untuk kembali</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb
index 728c150..dc929fa 100644
--- a/ash/strings/ash_strings_my.xtb
+++ b/ash/strings/ash_strings_my.xtb
@@ -599,6 +599,7 @@
 <translation id="8735953464173050365">ကီးဘုတ်ဆက်တင်များကို ပြရန်။ <ph name="KEYBOARD_NAME" /> ကို ရွေးထားသည်</translation>
 <translation id="875593634123171288">VPN ဆက်တင်များကို ပြရန်</translation>
 <translation id="8785070478575117577"><ph name="NETWORK_NAME" /> သို့ ချိတ်ဆက်ရန်</translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />။ <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">ကြိုးမဲ့</translation>
 <translation id="8825863694328519386">နောက်သို့ပြန်သွားရန် ဘယ်ဘက်မှ ပွတ်ဆွဲပါ</translation>
 <translation id="8828714802988429505">၉၀°</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index 02ca9d9..073f592 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -552,7 +552,7 @@
 <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation>
 <translation id="8190698733819146287">ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁਟ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ...</translation>
 <translation id="8192202700944119416">ਸੂਚਨਾਵਾਂ ਲੁਕੀਆਂ ਹੋਈਆਂ ਹਨ।</translation>
-<translation id="8196787716797768628">ਐਪਾਂ ਵਿਚਾਲੇ ਤੁਰੰਤ ਸਵਿੱਚ ਕਰਨ ਲਈ ਅਤੇ ਟੈਬਲੈੱਟ ਮੋਡ ਵਿੱਚ ਆਪਣੀ Chromebook ਨਾਲ ਅੰਤਰਕਿਰਿਆ ਕਰਨ ਲਈ ਇਸ਼ਾਰਿਆਂ ਦੀ ਵਰਤੋਂ ਕਰੋ।</translation>
+<translation id="8196787716797768628">ਐਪਾਂ ਵਿਚਾਲੇ ਤੁਰੰਤ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਅਤੇ ਟੈਬਲੈੱਟ ਮੋਡ ਵਿੱਚ ਆਪਣੀ Chromebook ਨਾਲ ਅੰਤਰਕਿਰਿਆ ਕਰਨ ਲਈ ਇਸ਼ਾਰਿਆਂ ਦੀ ਵਰਤੋਂ ਕਰੋ।</translation>
 <translation id="8203795194971602413">ਸੱਜਾ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="8236042855478648955">ਆਰਾਮ ਕਰਨ ਦਾ ਸਮਾਂ ਹੋ ਗਿਆ ਹੈ</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />, ਫ਼ੋਨ ਦੀ ਬੈਟਰੀ <ph name="BATTERY_STATUS" /></translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index a3d0ff3..74915cc 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -599,6 +599,7 @@
 <translation id="8735953464173050365">Pokaż ustawienia klawiatury. Wybrana jest: <ph name="KEYBOARD_NAME" />.</translation>
 <translation id="875593634123171288">Pokaż ustawienia VPN</translation>
 <translation id="8785070478575117577">Połącz z <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">Aby wrócić, przesuń palcem od lewej strony</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index accf0fe7..89997840 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -600,6 +600,7 @@
 <translation id="8735953464173050365">Mostrar configurações do teclado. <ph name="KEYBOARD_NAME" /> está selecionado</translation>
 <translation id="875593634123171288">Mostrar configurações de VPN</translation>
 <translation id="8785070478575117577">Conectar-se a <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">Deslize da esquerda para voltar</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb
index 645db67c..efe22f0 100644
--- a/ash/strings/ash_strings_si.xtb
+++ b/ash/strings/ash_strings_si.xtb
@@ -599,6 +599,7 @@
 <translation id="8735953464173050365">යතුරුපුවරු සැකසීම් පෙන්වන්න. <ph name="KEYBOARD_NAME" /> තෝරාගෙන ඇත</translation>
 <translation id="875593634123171288">VPN සැකසීම් පෙන්වන්න</translation>
 <translation id="8785070478575117577"><ph name="NETWORK_NAME" /> වෙත සබඳින්න</translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">ආපසු යාමට වමින් ස්වයිප් කරන්න</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb
index e492ee0..28ca6676 100644
--- a/ash/strings/ash_strings_sk.xtb
+++ b/ash/strings/ash_strings_sk.xtb
@@ -599,6 +599,7 @@
 <translation id="8735953464173050365">Zobraziť nastavenia klávesnice. Vybraná klávesnica: <ph name="KEYBOARD_NAME" /></translation>
 <translation id="875593634123171288">Zobraziť nastavenia VPN</translation>
 <translation id="8785070478575117577">Pripojiť k sieti <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi‑Fi</translation>
 <translation id="8825863694328519386">Vrátite sa potiahnutím zľava</translation>
 <translation id="8828714802988429505">90 °</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index b4e07f7..33b1402 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -531,7 +531,7 @@
 <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> మరియు <ph name="SECOND_PARENT_EMAIL" /> ద్వారా ఖాతా నిర్వహించబడుతోంది</translation>
 <translation id="7955885781510802139">అధిక-కాంట్రాస్ట్ మోడ్</translation>
 <translation id="7977927628060636163">మొబైల్ నెట్‌వర్క్‌ల కోసం వెతుకుతోంది...</translation>
-<translation id="7980780401175799550">Chrome OSకు నావిగేట్ చేయడానికి కొత్త మార్గాలను ట్రై చేయండి</translation>
+<translation id="7980780401175799550">Chrome OSలో నావిగేట్ చేయడానికి కొత్త మార్గాలను ట్రై చేయండి</translation>
 <translation id="7982789257301363584">నెట్‌వర్క్</translation>
 <translation id="7984197416080286869">చాలా ఎక్కువ వేలిముద్ర ప్రయత్నాలు చేసారు</translation>
 <translation id="7994370417837006925">బహుళ సైన్-ఇన్</translation>
@@ -553,7 +553,7 @@
 <translation id="8167567890448493835"><ph name="LOCALE_NAME" />ని ఉపయోగిస్తోంది</translation>
 <translation id="8190698733819146287">భాషలు మరియు ఇన్‌పుట్ పద్ధతిని అనుకూలీకరించండి...</translation>
 <translation id="8192202700944119416">నోటిఫికేషన్‌లు దాచబడ్డాయి.</translation>
-<translation id="8196787716797768628">టాబ్లెట్ మోడ్‌లో, యాప్‌ల మధ్య త్వరగా మారడానికి, అలాగే మీ Chromebookతో పరస్పర చర్య చేయడానికి సంజ్ఞలను ఉపయోగించండి.</translation>
+<translation id="8196787716797768628">టాబ్లెట్ మోడ్‌లో, యాప్‌ల మధ్య త్వరగా మారడానికి, అలాగే మీ Chromebookతో ఇంటరాక్ట్ కావడానికి సంజ్ఞలను ఉపయోగించండి.</translation>
 <translation id="8203795194971602413">కుడి క్లిక్</translation>
 <translation id="8236042855478648955">విరామ సమయం</translation>
 <translation id="8247060538831475781"><ph name="CONNECTION_STATUS" />, సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />, ఫోన్ బ్యాటరీ <ph name="BATTERY_STATUS" /></translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb
index 1bbb1d8..20d8693 100644
--- a/ash/strings/ash_strings_ur.xtb
+++ b/ash/strings/ash_strings_ur.xtb
@@ -530,7 +530,7 @@
 <translation id="79341161159229895"><ph name="FIRST_PARENT_EMAIL" /> اور <ph name="SECOND_PARENT_EMAIL" /> کے زیر نظم اکاؤنٹ</translation>
 <translation id="7955885781510802139">اعلی تناسب امتزاج وضع</translation>
 <translation id="7977927628060636163">موبائل نیٹ ورکس کو تلاش کیا جا رہا ہے…</translation>
-<translation id="7980780401175799550">‏کروم OS پر نیویگیٹ کرنے کیلئے نئے طریقے آزمائیں</translation>
+<translation id="7980780401175799550">‏Chrome OS پر نیویگیٹ کرنے کیلئے نئے طریقے آزمائیں</translation>
 <translation id="7982789257301363584">نیٹ ورک</translation>
 <translation id="7984197416080286869">فنگر پرنٹ سے غیر مقفل کرنے کی کافی زیادہ کوششیں کی گئیں</translation>
 <translation id="7994370417837006925">متعدد سائن ان</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb
index 1dc81e1..ffbddcd8 100644
--- a/ash/strings/ash_strings_uz.xtb
+++ b/ash/strings/ash_strings_uz.xtb
@@ -599,6 +599,7 @@
 <translation id="8735953464173050365">Klaviatura sozlamalarini ochish. <ph name="KEYBOARD_NAME" /> tanlandi</translation>
 <translation id="875593634123171288">VPN sozlamalarini ochish</translation>
 <translation id="8785070478575117577">Bunga ulanish: <ph name="NETWORK_NAME" /></translation>
+<translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825863694328519386">Orqaga qaytish uchun chapdan suring</translation>
 <translation id="8828714802988429505">90°</translation>
diff --git a/ash/system/message_center/unified_message_center_bubble.cc b/ash/system/message_center/unified_message_center_bubble.cc
index 846d6c9..c946873 100644
--- a/ash/system/message_center/unified_message_center_bubble.cc
+++ b/ash/system/message_center/unified_message_center_bubble.cc
@@ -167,7 +167,8 @@
   gfx::Rect anchor_rect = tray_->shelf()->GetSystemTrayAnchorRect();
 
   gfx::Insets tray_bubble_insets = GetTrayBubbleInsets();
-  int left_offset = tray_->shelf()->alignment() == ShelfAlignment::kLeft
+  int left_offset = (tray_->shelf()->alignment() == ShelfAlignment::kLeft ||
+                     base::i18n::IsRTL())
                         ? tray_bubble_insets.left()
                         : -tray_bubble_insets.right();
 
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index 48a3c56..f96ce70 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -914,7 +914,7 @@
   // overview + applist case.
   Shell* shell = Shell::Get();
   if (!shell->tablet_mode_controller()->InTabletMode() &&
-      shell->app_list_controller()->IsVisible()) {
+      shell->app_list_controller()->IsVisible(base::nullopt)) {
     return;
   }
 
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index e282edb..7ee979f7 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -4012,7 +4012,7 @@
   EXPECT_TRUE(window4->IsVisible());
 
   // Home launcher should be shown because none of these windows are activated.
-  EXPECT_TRUE(Shell::Get()->app_list_controller()->IsVisible());
+  EXPECT_TRUE(Shell::Get()->app_list_controller()->IsVisible(base::nullopt));
 
   // 1) Start dragging |window1|. |window2| is the source window.
   std::unique_ptr<WindowResizer> resizer =
@@ -4027,7 +4027,7 @@
   EXPECT_FALSE(window4->IsVisible());
 
   // Test that home launcher is not shown because a window is active.
-  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible());
+  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible(base::nullopt));
 
   // Test that during dragging, we could not show a hidden window.
   window3->Show();
@@ -4041,7 +4041,7 @@
   EXPECT_TRUE(window4->IsVisible());
 
   // Test that home launcher is still not shown, because a window is active.
-  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible());
+  EXPECT_FALSE(Shell::Get()->app_list_controller()->IsVisible(base::nullopt));
 }
 
 // Tests that the dragged window should be the active and top window if overview
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
index bddcb1d..5222d9f 100644
--- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -1389,7 +1389,8 @@
   std::unique_ptr<aura::Window> window = CreateDesktopWindowSnappedLeft();
   tablet_mode_controller()->SetEnabledForTest(true);
   app_list_controller->ShowAppList();
-  EXPECT_FALSE(app_list_controller->IsVisible());
+
+  EXPECT_FALSE(app_list_controller->IsVisible(base::nullopt));
 }
 
 // Test that if both the active window and the previous window are snapped on
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 33e539f..ce45109 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -344,6 +344,8 @@
     "memory/shared_memory_hooks.h",
     "memory/shared_memory_mapping.cc",
     "memory/shared_memory_mapping.h",
+    "memory/shared_memory_security_policy.cc",
+    "memory/shared_memory_security_policy.h",
     "memory/shared_memory_tracker.cc",
     "memory/shared_memory_tracker.h",
     "memory/singleton.h",
diff --git a/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java b/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java
index 949cae42..2015ab4 100644
--- a/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java
+++ b/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java
@@ -16,13 +16,14 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import javax.annotation.concurrent.GuardedBy;
 
 /**
- * Stores samples until given an {@link UmaRecorder} to flush the samples to. After flushing, no
- * longer stores samples, instead immediately delegates to the given {@link UmaRecorder}.
+ * Stores metrics until given an {@link UmaRecorder} to forward the samples to. After flushing, no
+ * longer stores metrics, instead immediately forwards them to the given {@link UmaRecorder}.
  */
 /* package */ final class CachingUmaRecorder implements UmaRecorder {
     private static final String TAG = "CachingUmaRecorder";
@@ -31,12 +32,19 @@
      * Maximum number of histograms cached at the same time. It is better to drop some samples
      * rather than have a bug cause the cache to grow without limit.
      * <p>
-     * Each sample uses 4 bytes, each histogram uses approx. 12 references (4 bytes each).
+     * Each sample uses 4 bytes, each histogram uses approx. 12 references (at least 4 bytes each).
      * With {@code MAX_HISTOGRAM_COUNT = 256} and {@code MAX_SAMPLE_COUNT = 256} this limits cache
      * size to 270KiB. Changing either value by one, adds or removes approx. 1KiB.
      */
     private static final int MAX_HISTOGRAM_COUNT = 256;
 
+    /**
+     * Maximum number of user actions cached at the same time. It is better to drop some samples
+     * rather than have a bug cause the cache to grow without limit.
+     */
+    @VisibleForTesting
+    static final int MAX_USER_ACTION_COUNT = 256;
+
     /** Stores the definition and samples of a single cached histogram. */
     @VisibleForTesting
     static class Histogram {
@@ -143,10 +151,10 @@
         }
 
         /**
-         * Writes all samples to {@code recorder}, clears cached samples.
+         * Writes all histogram samples to {@code recorder}, clears the cache.
          *
          * @param recorder destination {@link UmaRecorder}.
-         * @return number of flushed samples.
+         * @return number of flushed histogram samples.
          */
         synchronized int flushTo(UmaRecorder recorder) {
             switch (mType) {
@@ -183,6 +191,22 @@
         }
     }
 
+    /** Stores a single cached user action. */
+    private static class UserAction {
+        private final String mName;
+        private final long mElapsedRealtimeMillis;
+
+        UserAction(String name, long elapsedRealtimeMillis) {
+            mName = name;
+            mElapsedRealtimeMillis = elapsedRealtimeMillis;
+        }
+
+        /** Writes this user action to a {@link UmaRecorder}. */
+        void flushTo(UmaRecorder recorder) {
+            recorder.recordUserAction(mName, mElapsedRealtimeMillis);
+        }
+    }
+
     /**
      * The lock doesn't need to be fair - in the worst case a writing record*Histogram call will be
      * starved until reading calls reach cache size limits.
@@ -192,11 +216,31 @@
      */
     private final ReentrantReadWriteLock mRwLock = new ReentrantReadWriteLock(/*fair=*/false);
 
+    /** Cached histograms keyed by histogram name. */
     @GuardedBy("mRwLock")
     private Map<String, Histogram> mHistogramByName = new HashMap<>();
 
     /**
-     * If not null, all metrics are forwarded to this {@link UmaRecorder}.
+     * Number of histogram samples that couldn't be cached, because some limit of cache size been
+     * reached.
+     * <p>
+     * Using {@link AtomicInteger} because the value may need to be updated with a read lock held.
+     */
+    private AtomicInteger mDroppedHistogramSampleCount = new AtomicInteger();
+
+    /** Cache of user actions. */
+    @GuardedBy("mRwLock")
+    private List<UserAction> mUserActions = new ArrayList<>();
+
+    /**
+     * Number of user actions that couldn't be cached, because the number of user actions in cache
+     * has reached its limit.
+     */
+    @GuardedBy("mRwLock")
+    private int mDroppedUserActionCount;
+
+    /**
+     * If not {@code null}, all metrics are forwarded to this {@link UmaRecorder}.
      * <p>
      * The read lock must be held while invoking methods on {@code mDelegate}.
      */
@@ -205,53 +249,49 @@
     private UmaRecorder mDelegate;
 
     /**
-     * Number of samples that couldn't be cached, because the number of histograms in cache has
-     * reached its limit.
-     */
-    @GuardedBy("mRwLock")
-    private int mHistogramLimitSampleCount;
-
-    /**
-     * Number of samples that couldn't be cached, because the number of samples for a histogram has
-     * been reached.
-     */
-    @GuardedBy("this")
-    private int mDroppedSampleCount;
-
-    /**
-     * Replaces the current delegate (if any) with {@code recorder}. Writes and clears all cached
-     * samples if {@code recorder} is not null.
+     * Sets the current delegate to {@code recorder}. Forwards and clears all cached metrics if
+     * {@code recorder} is not {@code null}.
      *
      * @param recorder new delegate.
      * @return the previous delegate.
      */
     public UmaRecorder setDelegate(@Nullable final UmaRecorder recorder) {
         UmaRecorder previous;
-        Map<String, Histogram> cache = null;
-        int histogramLimitSampleCount = 0;
-        int droppedSampleCount = 0;
+        Map<String, Histogram> histogramCache = null;
+        int droppedHistogramSampleCount = 0;
+        List<UserAction> userActionCache = null;
+        int droppedUserActionCount = 0;
+
         mRwLock.writeLock().lock();
         try {
             previous = mDelegate;
             mDelegate = recorder;
-            if (recorder != null && !mHistogramByName.isEmpty()) {
-                cache = mHistogramByName;
-                mHistogramByName = new HashMap<>();
-                histogramLimitSampleCount = mHistogramLimitSampleCount;
-                mHistogramLimitSampleCount = 0;
-                synchronized (this) {
-                    droppedSampleCount = mDroppedSampleCount;
-                    mDroppedSampleCount = 0;
-                }
+            if (recorder == null) {
+                return previous;
             }
+            if (!mHistogramByName.isEmpty()) {
+                histogramCache = mHistogramByName;
+                mHistogramByName = new HashMap<>();
+                droppedHistogramSampleCount = mDroppedHistogramSampleCount.getAndSet(0);
+            }
+            if (!mUserActions.isEmpty()) {
+                userActionCache = mUserActions;
+                mUserActions = new ArrayList<>();
+                droppedUserActionCount = mDroppedUserActionCount;
+                mDroppedUserActionCount = 0;
+            }
+            // Downgrade by acquiring read lock before releasing write lock
             mRwLock.readLock().lock();
         } finally {
             mRwLock.writeLock().unlock();
         }
         // Cache is flushed only after downgrading from a write lock to a read lock.
         try {
-            if (cache != null) {
-                flushCacheAlreadyLocked(cache, histogramLimitSampleCount, droppedSampleCount);
+            if (histogramCache != null) {
+                flushHistogramsAlreadyLocked(histogramCache, droppedHistogramSampleCount);
+            }
+            if (userActionCache != null) {
+                flushUserActionsAlreadyLocked(userActionCache, droppedUserActionCount);
             }
         } finally {
             mRwLock.readLock().unlock();
@@ -260,56 +300,58 @@
     }
 
     /**
-     * Writes metrics from {@code cache} to the delegate. Assumes that a read lock is held by the
-     * current thread.
+     * Writes histogram samples from {@code cache} to the delegate. Assumes that a read lock is held
+     * by the current thread.
      *
      * @param cache the cache to be flushed.
-     * @param histogramLimitSampleCount number of samples that were not recorded in {@code cache} to
-     *         stay within {@link MAX_HISTOGRAM_COUNT}.
-     * @param droppedSampleCount number of samples that were not recerded in {@code cache} to stay
-     *         within {@link Histogram.MAX_SAMPLE_COUNT}.
+     * @param droppedHistogramSampleCount number of histogram samples that were not recorded due to
+     *         cache size limits.
      */
     @GuardedBy("mRwLock")
-    private void flushCacheAlreadyLocked(
-            Map<String, Histogram> cache, int histogramLimitSampleCount, int droppedSampleCount) {
+    private void flushHistogramsAlreadyLocked(
+            Map<String, Histogram> cache, int droppedHistogramSampleCount) {
         assert mDelegate != null : "Unexpected: cache is flushed, but delegate is null";
         assert mRwLock.getReadHoldCount() > 0;
-        int flushedSampleCount = 0;
+        int flushedHistogramSampleCount = 0;
         final int flushedHistogramCount = cache.size();
-        int fullHistogramCount = 0;
-        int remainingSampleLimit = Histogram.MAX_SAMPLE_COUNT;
         for (Histogram histogram : cache.values()) {
-            int flushed = histogram.flushTo(mDelegate);
-            flushedSampleCount += flushed;
-            if (flushed >= Histogram.MAX_SAMPLE_COUNT) {
-                fullHistogramCount++;
-            }
-            remainingSampleLimit =
-                    Math.min(remainingSampleLimit, Histogram.MAX_SAMPLE_COUNT - flushed);
+            flushedHistogramSampleCount += histogram.flushTo(mDelegate);
         }
-        Log.i(TAG, "Flushed %d samples from %d histograms.", flushedSampleCount,
+        Log.i(TAG, "Flushed %d samples from %d histograms.", flushedHistogramSampleCount,
                 flushedHistogramCount);
-        // Using RecordHistogram could cause an infinite recursion.
+        // Using RecordHistogram here could cause an infinite recursion.
+        mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.DroppedHistogramSampleCount",
+                droppedHistogramSampleCount, 1, 1_000_000, 50);
         mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.FlushedHistogramCount",
                 flushedHistogramCount, 1, 100_000, 50);
-        mDelegate.recordExponentialHistogram(
-                "UMA.JavaCachingRecorder.FullHistogramCount", fullHistogramCount, 1, 100_000, 50);
-        mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.InputSampleCount",
-                flushedSampleCount + droppedSampleCount, 1, 1_000_000, 50);
-        mDelegate.recordExponentialHistogram(
-                "UMA.JavaCachingRecorder.DroppedSampleCount", droppedSampleCount, 1, 1_000_000, 50);
-        mDelegate.recordExponentialHistogram(
-                "UMA.JavaCachingRecorder.HistogramLimitDroppedSampleCount",
-                histogramLimitSampleCount, 1, 1_000_000, 50);
-        mDelegate.recordExponentialHistogram(
-                "UMA.JavaCachingRecorder.RemainingSampleLimit", remainingSampleLimit, 1, 1_000, 50);
-        mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.RemainingHistogramLimit",
-                MAX_HISTOGRAM_COUNT - flushedHistogramCount, 1, 1_000, 50);
+        mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.InputHistogramSampleCount",
+                flushedHistogramSampleCount + droppedHistogramSampleCount, 1, 1_000_000, 50);
     }
 
     /**
-     * Delegates or stores a sample. Stores samples iff there is no delegate {@link UmaRecorder}
-     * set.
+     * Writes user actions from {@code cache} to the delegate. Assumes that a read lock is held by
+     * the current thread.
+     *
+     * @param cache the cache to be flushed.
+     * @param droppedUserActionCount number of user actions that were not recorded in {@code cache}
+     *         to stay within {@link MAX_USER_ACTION_COUNT}.
+     */
+    private void flushUserActionsAlreadyLocked(List<UserAction> cache, int droppedUserActionCount) {
+        assert mDelegate != null : "Unexpected: cache is flushed, but delegate is null";
+        assert mRwLock.getReadHoldCount() > 0;
+        for (UserAction userAction : cache) {
+            userAction.flushTo(mDelegate);
+        }
+        // Using RecordHistogram here could cause an infinite recursion.
+        mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.DroppedUserActionCount",
+                droppedUserActionCount, 1, 1_000, 50);
+        mDelegate.recordExponentialHistogram("UMA.JavaCachingRecorder.InputUserActionCount",
+                cache.size() + droppedUserActionCount, 1, 10_000, 50);
+    }
+
+    /**
+     * Forwards or stores a histogram sample. Stores samples iff there is no delegate {@link
+     * UmaRecorder} set.
      *
      * @param type histogram type.
      * @param name histogram name.
@@ -318,7 +360,7 @@
      * @param max histogram max value.
      * @param numBuckets number of histogram buckets.
      */
-    private void cacheOrRecordSample(
+    private void cacheOrRecordHistogramSample(
             @Histogram.Type int type, String name, int sample, int min, int max, int numBuckets) {
         // Optimistic attempt without creating a Histogram.
         if (tryAppendOrRecordSample(type, name, sample, min, max, numBuckets)) {
@@ -328,24 +370,27 @@
         mRwLock.writeLock().lock();
         try {
             if (mDelegate == null) {
-                appendSampleMaybeCreateHistogramAlreadyLocked(
-                        type, name, sample, min, max, numBuckets);
+                cacheHistogramSampleAlreadyWriteLocked(type, name, sample, min, max, numBuckets);
                 return; // Skip the lock downgrade.
             }
+            // Downgrade by acquiring read lock before releasing write lock
             mRwLock.readLock().lock();
         } finally {
             mRwLock.writeLock().unlock();
         }
+
         // Downgraded to read lock.
+        // See base/android/java/src/org/chromium/base/metrics/forwarding_synchronization.md
         try {
-            recordSampleAlreadyLocked(type, name, sample, min, max, numBuckets);
+            assert mDelegate != null;
+            recordHistogramSampleAlreadyLocked(type, name, sample, min, max, numBuckets);
         } finally {
             mRwLock.readLock().unlock();
         }
     }
 
     /**
-     * Tries to cache or record a sample without creating a new {@link Histogram}.
+     * Tries to cache or record a histogram sample without creating a new {@link Histogram}.
      *
      * @param type histogram type.
      * @param name histogram name.
@@ -360,7 +405,7 @@
         mRwLock.readLock().lock();
         try {
             if (mDelegate != null) {
-                recordSampleAlreadyLocked(type, name, sample, min, max, numBuckets);
+                recordHistogramSampleAlreadyLocked(type, name, sample, min, max, numBuckets);
                 return true;
             }
             Histogram histogram = mHistogramByName.get(name);
@@ -368,9 +413,7 @@
                 return false;
             }
             if (!histogram.addSample(type, name, sample, min, max, numBuckets)) {
-                synchronized (this) {
-                    mDroppedSampleCount++;
-                }
+                mDroppedHistogramSampleCount.incrementAndGet();
             }
             return true;
         } finally {
@@ -379,8 +422,8 @@
     }
 
     /**
-     * Appends a {@code sample} to a cached {@link Histogram}. Creates the {@code Histogram}
-     * if needed. Assumes that the <b>write lock</b> is held by the current thread.
+     * Appends a histogram {@code sample} to a cached {@link Histogram}. Creates the {@code
+     * Histogram} if needed. Assumes that the <b>write lock</b> is held by the current thread.
      *
      * @param type histogram type.
      * @param name histogram name.
@@ -390,7 +433,7 @@
      * @param numBuckets number of histogram buckets.
      */
     @GuardedBy("mRwLock")
-    private void appendSampleMaybeCreateHistogramAlreadyLocked(
+    private void cacheHistogramSampleAlreadyWriteLocked(
             @Histogram.Type int type, String name, int sample, int min, int max, int numBuckets) {
         assert mRwLock.isWriteLockedByCurrentThread();
         Histogram histogram = mHistogramByName.get(name);
@@ -398,22 +441,20 @@
             if (mHistogramByName.size() >= MAX_HISTOGRAM_COUNT) {
                 // A cache filling up is most likely an indication of a bug.
                 assert false : "Too many histograms in cache";
-                mHistogramLimitSampleCount++;
+                mDroppedHistogramSampleCount.incrementAndGet();
                 return;
             }
             histogram = new Histogram(type, name, min, max, numBuckets);
             mHistogramByName.put(name, histogram);
         }
         if (!histogram.addSample(type, name, sample, min, max, numBuckets)) {
-            synchronized (this) {
-                mDroppedSampleCount++;
-            }
+            mDroppedHistogramSampleCount.incrementAndGet();
         }
     }
 
     /**
-     * Records a sample with delegate. Assumes that a read lock is held by the current thread.
-     * Shouldn't be called with a write lock held.
+     * Forwards a histogram sample to the delegate. Assumes that a read lock is held by the current
+     * thread. Shouldn't be called with a write lock held.
      *
      * @param type histogram type.
      * @param name histogram name.
@@ -423,7 +464,7 @@
      * @param numBuckets number of histogram buckets.
      */
     @GuardedBy("mRwLock")
-    private void recordSampleAlreadyLocked(
+    private void recordHistogramSampleAlreadyLocked(
             @Histogram.Type int type, String name, int sample, int min, int max, int numBuckets) {
         assert mRwLock.getReadHoldCount() > 0;
         assert !mRwLock.isWriteLockedByCurrentThread();
@@ -452,18 +493,19 @@
         final int min = 0;
         final int max = 0;
         final int numBuckets = 0;
-        cacheOrRecordSample(Histogram.Type.BOOLEAN, name, sample, min, max, numBuckets);
+        cacheOrRecordHistogramSample(Histogram.Type.BOOLEAN, name, sample, min, max, numBuckets);
     }
 
     @Override
     public void recordExponentialHistogram(
             String name, int sample, int min, int max, int numBuckets) {
-        cacheOrRecordSample(Histogram.Type.EXPONENTIAL, name, sample, min, max, numBuckets);
+        cacheOrRecordHistogramSample(
+                Histogram.Type.EXPONENTIAL, name, sample, min, max, numBuckets);
     }
 
     @Override
     public void recordLinearHistogram(String name, int sample, int min, int max, int numBuckets) {
-        cacheOrRecordSample(Histogram.Type.LINEAR, name, sample, min, max, numBuckets);
+        cacheOrRecordHistogramSample(Histogram.Type.LINEAR, name, sample, min, max, numBuckets);
     }
 
     @Override
@@ -471,7 +513,7 @@
         final int min = 0;
         final int max = 0;
         final int numBuckets = 0;
-        cacheOrRecordSample(Histogram.Type.SPARSE, name, sample, min, max, numBuckets);
+        cacheOrRecordHistogramSample(Histogram.Type.SPARSE, name, sample, min, max, numBuckets);
     }
 
     @Override
@@ -480,14 +522,36 @@
         try {
             if (mDelegate != null) {
                 mDelegate.recordUserAction(name, elapsedRealtimeMillis);
-            } else {
-                // TODO(crbug.com/1048429): Implement caching. Existing code hitting this branch
-                // would have crashed in the previous implementation.
-                Log.d(TAG, "recordUserAction(%s, %d) called, but cache is not implemented yet",
-                        name, elapsedRealtimeMillis);
+                return;
             }
         } finally {
             mRwLock.readLock().unlock();
         }
+
+        mRwLock.writeLock().lock();
+        try {
+            if (mDelegate == null) {
+                if (mUserActions.size() < MAX_USER_ACTION_COUNT) {
+                    mUserActions.add(new UserAction(name, elapsedRealtimeMillis));
+                } else {
+                    assert false : "Too many user actions in cache";
+                    mDroppedUserActionCount++;
+                }
+                return; // Skip the lock downgrade.
+            }
+            // Downgrade by acquiring read lock before releasing write lock
+            mRwLock.readLock().lock();
+        } finally {
+            mRwLock.writeLock().unlock();
+        }
+
+        // Downgraded to read lock.
+        // See base/android/java/src/org/chromium/base/metrics/forwarding_synchronization.md
+        try {
+            assert mDelegate != null;
+            mDelegate.recordUserAction(name, elapsedRealtimeMillis);
+        } finally {
+            mRwLock.readLock().unlock();
+        }
     }
 }
diff --git a/base/android/java/src/org/chromium/base/metrics/forwarding_synchronization.md b/base/android/java/src/org/chromium/base/metrics/forwarding_synchronization.md
new file mode 100644
index 0000000..636456e3
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/metrics/forwarding_synchronization.md
@@ -0,0 +1,121 @@
+# Forwarding and `ReadWriteLock`
+
+This document explains the approach chosen to implement
+[forwarding](https://en.wikipedia.org/wiki/Forwarding_(object-oriented_programming))
+protected with a `ReadWriteLock`.
+
+A `ReadWriteLock` is used rather than `synchronized` blocks to the limit
+opportunitie for stutter on the UI thread when waiting for this shared resource.
+
+For context see
+`base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java`
+
+### Method A
+
+```java
+private final ReentrantReadWriteLock mRwLock = new ReentrantReadWriteLock();
+
+@Nullable
+private UmaRecorder mDelegate;
+
+@Override
+public void record(Sample sample) {
+    mRwLock.readLock().lock();
+    try {
+        if (mDelegate != null) {
+            mDelegate.record(sample);  // Called with a read lock
+            return;
+        }
+    } finally {
+        mRwLock.readLock().unlock();
+    }
+
+    mRwLock.writeLock().lock();
+    try {
+        if (mDelegate == null) {
+            this.cache(sample);
+            return; // Skip the lock downgrade.
+        }
+        // Downgrade by acquiring read lock before releasing write lock
+        mRwLock.readLock().lock();
+    } finally {
+        mRwLock.writeLock().unlock();
+    }
+
+    // Downgraded to read lock.
+    try {
+        assert mDelegate != null;
+        mDelegate.record(sample);  // Called with a read lock
+    } finally {
+        mRwLock.readLock().unlock();
+    }
+}
+```
+
+### Method B
+
+```java
+private final ReentrantReadWriteLock mRwLock = new ReentrantReadWriteLock();
+
+@Nullable
+private UmaRecorder mDelegate;
+
+@Override
+public void record(Sample sample) {
+    mRwLock.readLock().lock();
+    try {
+        if (mDelegate != null) {
+            mDelegate.record(sample);  // Called with a read lock
+            return;
+        }
+    } finally {
+        mRwLock.readLock().unlock();
+    }
+
+    mRwLock.writeLock().lock();
+    try {
+        if (mDelegate == null) {
+            this.cache(sample);
+        } else {
+            mDelegate.record(sample);  // Called with a *write* lock
+        }
+    } finally {
+        mRwLock.writeLock().unlock();
+    }
+}
+```
+
+## Reasoning
+
+Code of method B is visibly and conceptually simpler, since it doesn't involve
+lock downgrading. However:
+
+ *  Method B invokes `record(Sample)` with one of two available locks. The two
+    locks are difficult to distinguish in a stack trace.
+ *  Method A always uses the read lock which results in a less complex
+    interaction with `mDelegate`.
+
+Even if we ask every implementation of `UmaRecord#record(Sample)` to not block
+and run quickly, bugs happen.
+
+### Hypothetical example
+
+An invocation of `UmaRecord#record(Sample)` under some circumstances interacts
+with the same instance of `CachingUmaRecorder`. We don't want this to ever
+happen, so this is a bug. The current delegate implementation crosses JNI and
+calls into metrics code that should terminate without crossing back to Java.
+
+This bug results in the following scenarios:
+
+| # | `CUR` holds  | `mDelegate` uses | thread    | result   |
+|---|--------------|------------------|-----------|----------|
+| 1 | `readLock`   | `readLock`       | same      | OK       |
+| 2 | `readLock`   | `writeLock`      | same      | deadlock |
+| 3 | `readLock`   | `readLock`       | different | OK       |
+| 4 | `readLock`   | `writeLock`      | different | blocks   |
+| 5 | `writeLock`  | `readLock`       | same      | OK       |
+| 6 | `writeLock`  | `writeLock`      | same      | OK       |
+| 7 | `writeLock`  | `readLock`       | different | blocks   |
+| 8 | `writeLock`  | `writeLock`      | different | blocks   |
+
+Method A eliminates the possibility of scenarios 5-8.
diff --git a/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java b/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
index cb5544b7..5770194 100644
--- a/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
+++ b/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
@@ -106,6 +106,30 @@
     }
 
     @Test
+    public void testRecordUserActionGetsFlushed() {
+        CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+        cachingUmaRecorder.recordUserAction("FlushedActionTested", 72);
+        cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+        verify(mUmaRecorder).recordUserAction("FlushedActionTested", 72);
+    }
+
+    @Test
+    public void testRecordUserActionGetsMultipleFlushed() {
+        CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
+
+        cachingUmaRecorder.recordUserAction("FlushedActionTested.A", 111);
+        cachingUmaRecorder.recordUserAction("FlushedActionTested.B", 222);
+        cachingUmaRecorder.recordUserAction("FlushedActionTested.B", 333);
+        cachingUmaRecorder.setDelegate(mUmaRecorder);
+
+        verify(mUmaRecorder).recordUserAction("FlushedActionTested.A", 111);
+        verify(mUmaRecorder).recordUserAction("FlushedActionTested.B", 222);
+        verify(mUmaRecorder).recordUserAction("FlushedActionTested.B", 333);
+    }
+
+    @Test
     public void testRecordBooleanHistogramDelegated() {
         CachingUmaRecorder cachingUmaRecorder = new CachingUmaRecorder();
         cachingUmaRecorder.setDelegate(mUmaRecorder);
@@ -259,10 +283,10 @@
         }
     }
 
-    private static class TestingUmaRecorder implements UmaRecorder {
+    private static class HistogramTestingUmaRecorder implements UmaRecorder {
         public final AtomicIntegerArray recordedSamples;
 
-        TestingUmaRecorder(int sampleRange) {
+        HistogramTestingUmaRecorder(int sampleRange) {
             recordedSamples = new AtomicIntegerArray(sampleRange);
         }
 
@@ -299,23 +323,24 @@
     @Test
     @MediumTest
     @SuppressWarnings("ThreadPriorityCheck")
-    public void testStressParallel() throws Exception {
+    public void testStressParallelHistograms() throws Exception {
         final int numThreads = 16;
         final int numRecorders = 16;
         final int numSamples = CachingUmaRecorder.Histogram.MAX_SAMPLE_COUNT / numThreads;
         CachingUmaRecorder cachingRecorder = new CachingUmaRecorder();
 
-        TestingUmaRecorder[] testingRecorders = new TestingUmaRecorder[numRecorders];
+        HistogramTestingUmaRecorder[] testingRecorders =
+                new HistogramTestingUmaRecorder[numRecorders];
         for (int i = 0; i < numRecorders; i++) {
-            testingRecorders[i] = new TestingUmaRecorder(numThreads);
+            testingRecorders[i] = new HistogramTestingUmaRecorder(numThreads);
         }
         Thread[] threads = new Thread[numThreads];
         // Each thread records a different sample value.
         for (int i = 0; i < numThreads; i++) {
-            threads[i] = startRecordingThread(i, numSamples, cachingRecorder);
+            threads[i] = startHistogramRecordingThread(i, numSamples, cachingRecorder);
         }
         // Change recorders while threads are recording metrics.
-        for (TestingUmaRecorder recorder : testingRecorders) {
+        for (HistogramTestingUmaRecorder recorder : testingRecorders) {
             cachingRecorder.setDelegate(recorder);
             Thread.yield();
         }
@@ -326,7 +351,7 @@
         verifyZeroInteractions(mUmaRecorder);
         for (int i = 0; i < numThreads; i++) {
             int actualSamples = 0;
-            for (TestingUmaRecorder recorder : testingRecorders) {
+            for (HistogramTestingUmaRecorder recorder : testingRecorders) {
                 actualSamples += recorder.recordedSamples.get(i);
             }
             assertThat(String.format("thread[%d] total samples", i), actualSamples, is(numSamples));
@@ -334,7 +359,8 @@
     }
 
     @SuppressWarnings("ThreadPriorityCheck")
-    private static Thread startRecordingThread(int sample, int count, UmaRecorder recorder) {
+    private static Thread startHistogramRecordingThread(
+            int sample, int count, UmaRecorder recorder) {
         Thread thread = new Thread(() -> {
             for (int i = 0; i < count; i++) {
                 recorder.recordSparseHistogram("StressTest", sample);
@@ -345,4 +371,93 @@
         thread.start();
         return thread;
     }
+
+    private static class UserActionTestingUmaRecorder implements UmaRecorder {
+        public final AtomicIntegerArray recordedSamples;
+
+        UserActionTestingUmaRecorder(int sampleRange) {
+            recordedSamples = new AtomicIntegerArray(sampleRange);
+        }
+
+        @Override
+        public void recordBooleanHistogram(String name, boolean sample) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void recordExponentialHistogram(
+                String name, int sample, int min, int max, int numBuckets) {
+            // Ignore internal cache metrics.
+            if (name.startsWith("UMA.JavaCachingRecorder")) return;
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void recordLinearHistogram(
+                String name, int sample, int min, int max, int numBuckets) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void recordSparseHistogram(String name, int sample) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void recordUserAction(String name, long elapsedRealtimeMillis) {
+            recordedSamples.addAndGet((int) elapsedRealtimeMillis, 1);
+        }
+    }
+
+    @Test
+    @MediumTest
+    @SuppressWarnings("ThreadPriorityCheck")
+    public void testStressParallelUserActions() throws Exception {
+        final int numThreads = 16;
+        final int numRecorders = 16;
+        final int numSamples = CachingUmaRecorder.MAX_USER_ACTION_COUNT / numThreads;
+        CachingUmaRecorder cachingRecorder = new CachingUmaRecorder();
+
+        UserActionTestingUmaRecorder[] testingRecorders =
+                new UserActionTestingUmaRecorder[numRecorders];
+        for (int i = 0; i < numRecorders; i++) {
+            testingRecorders[i] = new UserActionTestingUmaRecorder(numThreads);
+        }
+        Thread[] threads = new Thread[numThreads];
+        // Each thread records a different timestamp value.
+        for (int i = 0; i < numThreads; i++) {
+            threads[i] = startUserActionRecordingThread(i, numSamples, cachingRecorder);
+        }
+        // Change recorders while threads are recording metrics.
+        for (UserActionTestingUmaRecorder recorder : testingRecorders) {
+            cachingRecorder.setDelegate(recorder);
+            Thread.yield();
+        }
+        for (Thread thread : threads) {
+            thread.join();
+        }
+        cachingRecorder.setDelegate(mUmaRecorder);
+        verifyZeroInteractions(mUmaRecorder);
+        for (int i = 0; i < numThreads; i++) {
+            int actualSamples = 0;
+            for (UserActionTestingUmaRecorder recorder : testingRecorders) {
+                actualSamples += recorder.recordedSamples.get(i);
+            }
+            assertThat(String.format("thread[%d] total samples", i), actualSamples, is(numSamples));
+        }
+    }
+
+    @SuppressWarnings("ThreadPriorityCheck")
+    private static Thread startUserActionRecordingThread(
+            int sample, int count, UmaRecorder recorder) {
+        Thread thread = new Thread(() -> {
+            for (int i = 0; i < count; i++) {
+                recorder.recordUserAction("StressTestUserAction." + i, sample);
+                // Make it more likely this thread will be preempted.
+                Thread.yield();
+            }
+        });
+        thread.start();
+        return thread;
+    }
 }
diff --git a/base/memory/platform_shared_memory_region.cc b/base/memory/platform_shared_memory_region.cc
index 45647925..944b12c 100644
--- a/base/memory/platform_shared_memory_region.cc
+++ b/base/memory/platform_shared_memory_region.cc
@@ -5,11 +5,21 @@
 #include "base/memory/platform_shared_memory_region.h"
 
 #include "base/memory/shared_memory_mapping.h"
+#include "base/memory/shared_memory_security_policy.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/numerics/checked_math.h"
 
 namespace base {
 namespace subtle {
 
+namespace {
+
+void RecordMappingWasBlockedHistogram(bool blocked) {
+  base::UmaHistogramBoolean("SharedMemory.MapBlockedForSecurity", blocked);
+}
+
+}  // namespace
+
 // static
 PlatformSharedMemoryRegion PlatformSharedMemoryRegion::CreateWritable(
     size_t size) {
@@ -49,10 +59,19 @@
     return false;
   }
 
+  if (!SharedMemorySecurityPolicy::AcquireReservationForMapping(size)) {
+    RecordMappingWasBlockedHistogram(/*blocked=*/true);
+    return false;
+  } else {
+    RecordMappingWasBlockedHistogram(/*blocked=*/false);
+  }
+
   bool success = MapAtInternal(offset, size, memory, mapped_size);
   if (success) {
     DCHECK_EQ(
         0U, reinterpret_cast<uintptr_t>(*memory) & (kMapMinimumAlignment - 1));
+  } else {
+    SharedMemorySecurityPolicy::ReleaseReservationForMapping(size);
   }
 
   return success;
diff --git a/base/memory/shared_memory_mapping.cc b/base/memory/shared_memory_mapping.cc
index 0c9c0f8a1..c475d00 100644
--- a/base/memory/shared_memory_mapping.cc
+++ b/base/memory/shared_memory_mapping.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/memory/shared_memory_security_policy.h"
 #include "base/memory/shared_memory_tracker.h"
 #include "base/unguessable_token.h"
 #include "build/build_config.h"
@@ -65,6 +66,7 @@
   if (!IsValid())
     return;
 
+  SharedMemorySecurityPolicy::ReleaseReservationForMapping(size_);
   SharedMemoryTracker::GetInstance()->DecrementMemoryUsage(*this);
 #if defined(OS_WIN)
   if (!UnmapViewOfFile(memory_))
diff --git a/base/memory/shared_memory_mapping_unittest.cc b/base/memory/shared_memory_mapping_unittest.cc
index 52cd294..48fba74 100644
--- a/base/memory/shared_memory_mapping_unittest.cc
+++ b/base/memory/shared_memory_mapping_unittest.cc
@@ -11,6 +11,10 @@
 
 #include "base/containers/span.h"
 #include "base/memory/read_only_shared_memory_region.h"
+#include "base/memory/writable_shared_memory_region.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "build/build_config.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
@@ -143,4 +147,34 @@
                   .empty());
 }
 
+// TODO(dcheng): This test is temporarily disabled on iOS. iOS devices allow
+// the creation of a 1GB shared memory region, but don't allow the region to be
+// mapped.
+#if !defined(OS_IOS)
+TEST_F(SharedMemoryMappingTest, TotalMappedSizeLimit) {
+  // Nothing interesting to test if the address space isn't 64 bits, since
+  // there's no real limit enforced on 32 bits other than complete address
+  // space exhaustion.
+  // Also exclude NaCl since pointers are 32 bits on all architectures:
+  // https://bugs.chromium.org/p/nativeclient/issues/detail?id=1162
+#if defined(ARCH_CPU_64_BITS) && !defined(OS_NACL)
+  base::HistogramTester histogram_tester;
+  auto region = WritableSharedMemoryRegion::Create(1024 * 1024 * 1024);
+  ASSERT_TRUE(region.IsValid());
+  // The limit is 32GB of mappings on 64-bit platforms, so the final mapping
+  // should fail.
+  std::vector<WritableSharedMemoryMapping> mappings(32);
+  for (size_t i = 0; i < mappings.size(); ++i) {
+    SCOPED_TRACE(i);
+    auto& mapping = mappings[i];
+    mapping = region.Map();
+    EXPECT_EQ(&mapping != &mappings.back(), mapping.IsValid());
+  }
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("SharedMemory.MapBlockedForSecurity"),
+      ::testing::ElementsAre(Bucket(0, 31), Bucket(1, 1)));
+#endif  // defined(ARCH_CPU_64_BITS)
+}
+#endif  // !defined(OS_IOS)
+
 }  // namespace base
diff --git a/base/memory/shared_memory_security_policy.cc b/base/memory/shared_memory_security_policy.cc
new file mode 100644
index 0000000..df54018
--- /dev/null
+++ b/base/memory/shared_memory_security_policy.cc
@@ -0,0 +1,92 @@
+// Copyright 2020 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.
+
+#include "base/memory/shared_memory_security_policy.h"
+
+#include <algorithm>
+#include <atomic>
+
+#include "base/bits.h"
+#include "base/numerics/checked_math.h"
+#include "base/optional.h"
+#include "base/process/process_metrics.h"
+#include "build/build_config.h"
+
+namespace base {
+
+namespace {
+
+// Note: pointers are 32 bits on all architectures in NaCl. See
+// https://bugs.chromium.org/p/nativeclient/issues/detail?id=1162
+#if defined(ARCH_CPU_32_BITS) || defined(OS_NACL)
+// No effective limit on 32-bit, since there simply isn't enough address space
+// for ASLR to be particularly effective.
+constexpr size_t kTotalMappedSizeLimit = -1;
+#elif defined(ARCH_CPU_64_BITS)
+// 32 GB of mappings ought to be enough for anybody.
+constexpr size_t kTotalMappedSizeLimit = 32ULL * 1024 * 1024 * 1024;
+#endif
+
+static std::atomic_size_t total_mapped_size_;
+
+base::Optional<size_t> AlignWithPageSize(size_t size) {
+#if defined(OS_WIN)
+  // TODO(crbug.com/210609): Matches alignment requirements defined in
+  // platform_shared_memory_region_win.cc:PlatformSharedMemoryRegion::Create.
+  // Remove this when NaCl is gone.
+  static const size_t kSectionSize = 65536;
+  const size_t page_size = std::max(kSectionSize, GetPageSize());
+#else
+  const size_t page_size = GetPageSize();
+#endif  // defined(OS_WIN)
+  size_t rounded_size = bits::Align(size, page_size);
+
+  // Fail on overflow.
+  if (rounded_size < size)
+    return base::nullopt;
+
+  return rounded_size;
+}
+
+}  // namespace
+
+// static
+bool SharedMemorySecurityPolicy::AcquireReservationForMapping(size_t size) {
+  size_t previous_mapped_size =
+      total_mapped_size_.load(std::memory_order_relaxed);
+  size_t total_mapped_size;
+
+  base::Optional<size_t> page_aligned_size = AlignWithPageSize(size);
+
+  if (!page_aligned_size)
+    return false;
+
+  // Relaxed memory ordering is all that's needed since all atomicity is all
+  // that's required. If the value is stale, compare_exchange_weak() will fail
+  // and the loop will retry the operation with an updated total mapped size.
+  do {
+    if (!CheckAdd(previous_mapped_size, *page_aligned_size)
+             .AssignIfValid(&total_mapped_size)) {
+      return false;
+    }
+    if (total_mapped_size >= kTotalMappedSizeLimit)
+      return false;
+  } while (!total_mapped_size_.compare_exchange_weak(
+      previous_mapped_size, total_mapped_size, std::memory_order_relaxed,
+      std::memory_order_relaxed));
+
+  return true;
+}
+
+// static
+void SharedMemorySecurityPolicy::ReleaseReservationForMapping(size_t size) {
+  // Note #1: relaxed memory ordering is sufficient since atomicity is all
+  // that's required.
+  // Note #2: |size| should never overflow when aligned to page size, since
+  // this should only be called if |AcquireReservationForMapping()| returned
+  // true.
+  total_mapped_size_.fetch_sub(size, std::memory_order_relaxed);
+}
+
+}  // namespace base
diff --git a/base/memory/shared_memory_security_policy.h b/base/memory/shared_memory_security_policy.h
new file mode 100644
index 0000000..bf356bb
--- /dev/null
+++ b/base/memory/shared_memory_security_policy.h
@@ -0,0 +1,37 @@
+// Copyright 2020 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.
+
+#ifndef BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
+#define BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
+
+#include <stddef.h>
+
+#include "base/compiler_specific.h"
+
+namespace base {
+
+namespace subtle {
+class PlatformSharedMemoryRegion;
+}  // namespace subtle
+
+// Helper to enforce a limit for the total amount of shared memory that can be
+// mapped. This can help prevent an attacker from spraying the address space of
+// a process with shared memory mappings to bypass ASLR. For more details, see
+// https://googleprojectzero.blogspot.com/2019/04/virtually-unlimited-memory-escaping.html
+class SharedMemorySecurityPolicy {
+ private:
+  friend class subtle::PlatformSharedMemoryRegion;
+  friend class SharedMemoryMapping;
+
+  // Checks that a mapping with |size| can be created. Returns false if there is
+  // an overflow in internal calculations, or the max limit has been reached.
+  static bool AcquireReservationForMapping(size_t size) WARN_UNUSED_RESULT;
+
+  // Releases a reservation that was previously acquired.
+  static void ReleaseReservationForMapping(size_t size);
+};
+
+}  // namespace base
+
+#endif  // BASE_MEMORY_SHARED_MEMORY_SECURITY_POLICY_H_
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py
index d7915c3..f9e8208 100755
--- a/build/android/resource_sizes.py
+++ b/build/android/resource_sizes.py
@@ -8,6 +8,8 @@
 More information at //docs/speed/binary_size/metrics.md.
 """
 
+from __future__ import print_function
+
 import argparse
 import collections
 from contextlib import contextmanager
@@ -577,27 +579,18 @@
   return out_dir, tool_prefix
 
 
-def _Analyze(apk_path, chartjson, args):
-
-  def report_func(*args):
-    # Do not add any new metrics without also documenting them in:
-    # //docs/speed/binary_size/metrics.md.
-    perf_tests_results_helper.ReportPerfResult(chartjson, *args)
-
+def _AnalyzeInternal(apk_path, report_func, args, apks_path=None):
   out_dir, tool_prefix = _ConfigOutDirAndToolsPrefix(args.out_dir)
-  apks_path = args.input if args.input.endswith('.apks') else None
   _DoApkAnalysis(apk_path, apks_path, tool_prefix, out_dir, report_func)
   _DoDexAnalysis(apk_path, report_func)
 
 
-def ResourceSizes(args):
-  chartjson = _BASE_CHART.copy() if args.output_format else None
-
-  if args.input.endswith('.apk'):
-    _Analyze(args.input, chartjson, args)
-  elif args.input.endswith('.apks'):
+def _AnalyzeApkOrApks(report_func, apk_path, args):
+  if apk_path.endswith('.apk'):
+    _AnalyzeInternal(apk_path, report_func, args)
+  elif apk_path.endswith('.apks'):
     with tempfile.NamedTemporaryFile(suffix='.apk') as f:
-      with zipfile.ZipFile(args.input) as z:
+      with zipfile.ZipFile(apk_path) as z:
         # Currently bundletool is creating two apks when .apks is created
         # without specifying an sdkVersion. Always measure the one with an
         # uncompressed shared library.
@@ -607,44 +600,85 @@
           info = z.getinfo('splits/base-master.apk')
         f.write(z.read(info))
         f.flush()
-      _Analyze(f.name, chartjson, args)
+      _AnalyzeInternal(f.name, report_func, args, apks_path=apk_path)
   else:
-    raise Exception('Unknown file type: ' + args.input)
+    raise Exception('Unknown file type: ' + apk_path)
+
+
+class _Reporter(object):
+  def __init__(self, chartjson):
+    self._chartjson = chartjson
+    self.trace_title_prefix = ''
+    self._combined_metrics = collections.defaultdict(int)
+
+  def __call__(self, graph_title, trace_title, value, units):
+    self._combined_metrics[(graph_title, trace_title, units)] += value
+
+    perf_tests_results_helper.ReportPerfResult(
+        self._chartjson, graph_title, self.trace_title_prefix + trace_title,
+        value, units)
+
+  def SynthesizeTotals(self):
+    for tup, value in sorted(self._combined_metrics.iteritems()):
+      graph_title, trace_title, units = tup
+      perf_tests_results_helper.ReportPerfResult(
+          self._chartjson, graph_title, 'Combined_' + trace_title, value, units)
+
+
+def _ResourceSizes(args):
+  chartjson = _BASE_CHART.copy() if args.output_format else None
+  reporter = _Reporter(chartjson)
+
+  specs = [
+      ('Chrome_', args.trichrome_chrome),
+      ('WebView_', args.trichrome_webview),
+      ('Library_', args.trichrome_library),
+  ]
+  for prefix, path in specs:
+    if path:
+      reporter.trace_title_prefix = prefix
+      _AnalyzeApkOrApks(reporter, path, args)
+
+  if any(path for _, path in specs):
+    reporter.SynthesizeTotals()
+  else:
+    _AnalyzeApkOrApks(reporter, args.input, args)
 
   if chartjson:
-    if args.output_file == '-':
-      json_file = sys.stdout
-    elif args.output_file:
-      json_file = open(args.output_file, 'w')
-    else:
-      results_path = os.path.join(args.output_dir, 'results-chart.json')
-      logging.critical('Dumping chartjson to %s', results_path)
-      json_file = open(results_path, 'w')
+    _DumpChartJson(args, chartjson)
 
-    json.dump(chartjson, json_file, indent=2)
 
-    if json_file is not sys.stdout:
-      json_file.close()
+def _DumpChartJson(args, chartjson):
+  if args.output_file == '-':
+    json_file = sys.stdout
+  elif args.output_file:
+    json_file = open(args.output_file, 'w')
+  else:
+    results_path = os.path.join(args.output_dir, 'results-chart.json')
+    logging.critical('Dumping chartjson to %s', results_path)
+    json_file = open(results_path, 'w')
 
-    # We would ideally generate a histogram set directly instead of generating
-    # chartjson then converting. However, perf_tests_results_helper is in
-    # //build, which doesn't seem to have any precedent for depending on
-    # anything in Catapult. This can probably be fixed, but since this doesn't
-    # need to be super fast or anything, converting is a good enough solution
-    # for the time being.
-    if args.output_format == 'histograms':
-      histogram_result = convert_chart_json.ConvertChartJson(results_path)
-      if histogram_result.returncode != 0:
-        logging.error('chartjson conversion failed with error: %s',
-            histogram_result.stdout)
-        return 1
+  json.dump(chartjson, json_file, indent=2)
 
-      histogram_path = os.path.join(args.output_dir, 'perf_results.json')
-      logging.critical('Dumping histograms to %s', histogram_path)
-      with open(histogram_path, 'w') as json_file:
-        json_file.write(histogram_result.stdout)
+  if json_file is not sys.stdout:
+    json_file.close()
 
-  return 0
+  # We would ideally generate a histogram set directly instead of generating
+  # chartjson then converting. However, perf_tests_results_helper is in
+  # //build, which doesn't seem to have any precedent for depending on
+  # anything in Catapult. This can probably be fixed, but since this doesn't
+  # need to be super fast or anything, converting is a good enough solution
+  # for the time being.
+  if args.output_format == 'histograms':
+    histogram_result = convert_chart_json.ConvertChartJson(results_path)
+    if histogram_result.returncode != 0:
+      raise Exception('chartjson conversion failed with error: ' +
+                      histogram_result.stdout)
+
+    histogram_path = os.path.join(args.output_dir, 'perf_results.json')
+    logging.critical('Dumping histograms to %s', histogram_path)
+    with open(histogram_path, 'w') as json_file:
+      json_file.write(histogram_result.stdout)
 
 
 def main():
@@ -694,6 +728,15 @@
       'simplified JSON output format.')
 
   argparser.add_argument('input', help='Path to .apk or .apks file to measure.')
+  trichrome_group = argparser.add_argument_group(
+      'Trichrome inputs',
+      description='When specified, |input| is used only as Test suite name.')
+  trichrome_group.add_argument(
+      '--trichrome-chrome', help='Path to Trichrome Chrome .apks')
+  trichrome_group.add_argument(
+      '--trichrome-webview', help='Path to Trichrome WebView .apk(s)')
+  trichrome_group.add_argument(
+      '--trichrome-library', help='Path to Trichrome Library .apk')
   args = argparser.parse_args()
 
   devil_chromium.Initialize(output_directory=args.out_dir)
@@ -713,10 +756,10 @@
       os.makedirs(args.output_dir)
 
   try:
-    result = ResourceSizes(args)
+    _ResourceSizes(args)
     isolated_script_output = {
         'valid': True,
-        'failures': [test_name] if result else [],
+        'failures': [],
     }
   finally:
     if args.isolated_script_test_output:
@@ -726,8 +769,6 @@
       with open(args.isolated_script_test_output, 'w') as output_file:
         json.dump(isolated_script_output, output_file)
 
-  return result
-
 
 if __name__ == '__main__':
-  sys.exit(main())
+  main()
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index b579299..9756763 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1512,6 +1512,9 @@
 
           # TODO(https://crbug.com/1050281): Clean up, enable.
           "-Wno-non-c-typedef-for-linkage",
+
+          # TODO(https://crbug.com/1059231): Clean up, enable.
+          "-Wno-pointer-to-int-cast",
         ]
 
         if (is_android) {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index c5df5ad..9ac9af6 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200319.1.1
\ No newline at end of file
+0.20200319.3.1
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index c5df5ad..9ac9af6 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200319.1.1
\ No newline at end of file
+0.20200319.3.1
\ No newline at end of file
diff --git a/build/toolchain/win/midl.gni b/build/toolchain/win/midl.gni
index ec4042b4..ee7dc47 100644
--- a/build/toolchain/win/midl.gni
+++ b/build/toolchain/win/midl.gni
@@ -32,6 +32,10 @@
 #       Whether a .tlb file should be added to outputs. Defaults to false.
 #
 #   deps (optional)
+#
+#   defines (optional)
+#       Build time defines to be passed to midl.exe as /D parameter.
+#
 #   visibility (optional)
 
 template("midl") {
@@ -127,6 +131,12 @@
       "/Oicf",
     ]
 
+    if (defined(invoker.defines)) {
+      foreach(define, invoker.defines) {
+        args += [ "/D" + define ]
+      }
+    }
+
     forward_variables_from(invoker, [ "deps" ])
   }
 
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index 957bcef..79d26cb 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -139,6 +139,26 @@
     picture_layer_inputs_.display_list =
         picture_layer_inputs_.client->PaintContentsToDisplayList(
             ContentLayerClient::PAINTING_BEHAVIOR_NORMAL);
+
+    // Clear out previous directly composited image state - if the layer
+    // qualifies we'll set up the state below.
+    picture_layer_inputs_.directly_composited_image_size = base::nullopt;
+    picture_layer_inputs_.nearest_neighbor = false;
+    if (QualifiesForDirectlyCompositedImage()) {
+      base::Optional<DisplayItemList::DirectlyCompositedImageResult> result =
+          picture_layer_inputs_.display_list->GetDirectlyCompositedImageResult(
+              bounds());
+      if (result) {
+        // Directly composited images are not guaranteed to fully cover every
+        // pixel in the layer due to ceiling when calculating the tile content
+        // rect from the layer bounds.
+        recording_source_->SetRequiresClear(true);
+        picture_layer_inputs_.directly_composited_image_size =
+            result->intrinsic_image_size;
+        picture_layer_inputs_.nearest_neighbor = result->nearest_neighbor;
+      }
+    }
+
     picture_layer_inputs_.painter_reported_memory_usage =
         picture_layer_inputs_.client->GetApproximateUnsharedMemoryUsage();
     recording_source_->UpdateDisplayItemList(
@@ -157,6 +177,21 @@
   return updated;
 }
 
+bool PictureLayer::QualifiesForDirectlyCompositedImage() const {
+  // Filters and backdrop-filters disqualify a layer from being a directly
+  // composited image.
+  // TODO(dlibby): crbug.com/875110 - remove this in an upcoming change and
+  // update baselines.
+  const EffectNode* effect_node =
+      layer_tree_host()->property_trees()->effect_tree.Node(
+          effect_tree_index());
+  if (!effect_node)
+    return true;
+
+  return (effect_node->filters.IsEmpty() &&
+          effect_node->backdrop_filters.IsEmpty());
+}
+
 sk_sp<SkPicture> PictureLayer::GetPicture() const {
   // We could either flatten the RecordingSource into a single SkPicture, or
   // paint a fresh one depending on what we intend to do with it.  For now we
diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h
index 8fdfba82..b4595e7 100644
--- a/cc/layers/picture_layer.h
+++ b/cc/layers/picture_layer.h
@@ -93,6 +93,8 @@
 
   bool ShouldUseTransformedRasterization() const;
 
+  bool QualifiesForDirectlyCompositedImage() const;
+
   std::unique_ptr<RecordingSource> recording_source_;
   devtools_instrumentation::
       ScopedLayerObjectTracker instrumentation_object_tracker_;
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index e1e9864..1628900 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -98,6 +98,7 @@
       use_transformed_rasterization_(false),
       can_use_lcd_text_(true),
       directly_composited_image_size_(base::nullopt),
+      directly_composited_image_raster_aspect_ratio_(0.f),
       tile_size_calculator_(this) {
   layer_tree_impl()->RegisterPictureLayerImpl(this);
 }
@@ -241,6 +242,44 @@
       tilings_->num_tilings() ? MaximumTilingContentsScale() : 1.f;
   PopulateScaledSharedQuadState(shared_quad_state, max_contents_scale,
                                 contents_opaque());
+
+  if (directly_composited_image_size_) {
+    // Directly composited images should be clipped to the layer's content rect.
+    // When a PictureLayerTiling is created for a directly composited image, the
+    // layer bounds are multiplied by the raster scale in order to compute the
+    // tile size. If the aspect ratio of the layer doesn't match that of the
+    // image, it's possible that one of the dimensions of the resulting size
+    // (layer bounds * raster scale) is a fractional number, as raster scale
+    // does not scale x and y independently.
+    // When this happens, the ToEnclosingRect() operation in
+    // |PictureLayerTiling::EnclosingContentsRectFromLayer()| will
+    // create a tiling that, when scaled by |max_contents_scale| above, is
+    // larger than the layer bounds by a fraction of a pixel.
+    gfx::Rect clip_rect = draw_properties().drawable_content_rect;
+    if (shared_quad_state->is_clipped)
+      clip_rect.Intersect(shared_quad_state->clip_rect);
+
+    shared_quad_state->is_clipped = true;
+    shared_quad_state->clip_rect = clip_rect;
+
+#if DCHECK_IS_ON()
+    // The aforementioned fraction of a pixel should only happen if the layer
+    // aspect ratio doesn't match the image's aspect ratio.
+    PictureLayerTiling* high_res =
+        tilings_->FindTilingWithResolution(HIGH_RESOLUTION);
+    if (high_res) {
+      float epsilon = IsDirectlyCompositedImageRasteredAtIntrinsicRatio()
+                          ? std::numeric_limits<float>::epsilon()
+                          : 1.f;
+      gfx::SizeF scaled_tiling_size(high_res->tiling_size());
+      scaled_tiling_size.Scale(1 / raster_contents_scale_);
+      DCHECK(std::abs(bounds().width() - scaled_tiling_size.width()) < epsilon);
+      DCHECK(std::abs(bounds().height() - scaled_tiling_size.height()) <
+             epsilon);
+    }
+#endif
+  }
+
   Occlusion scaled_occlusion =
       draw_properties()
           .occlusion_in_content_space.GetOcclusionWithGivenDrawTransform(
@@ -992,17 +1031,50 @@
   if (directly_composited_image_size_ == size)
     return;
 
-  directly_composited_image_size_ = size;
+  directly_composited_image_size_ =
+      ShouldDirectlyCompositeImage(size) ? size : base::nullopt;
   NoteLayerPropertyChanged();
 }
 
-float PictureLayerImpl::GetDirectlyCompositedImageRasterScale() const {
-  float x = static_cast<float>(directly_composited_image_size_->width()) /
+bool PictureLayerImpl::ShouldDirectlyCompositeImage(
+    base::Optional<gfx::Size> size) const {
+  if (!size)
+    return false;
+
+  // If the results of scaling the bounds by the expected raster scale
+  // would end up with a content rect whose width/height are more than one
+  // pixel different from the layer bounds, don't directly composite the image
+  // to avoid incorrect rendering.
+  float raster_scale = GetDirectlyCompositedImageRasterScale(size.value());
+  gfx::SizeF layer_bounds(bounds());
+  gfx::RectF scaled_bounds_rect(layer_bounds);
+  scaled_bounds_rect.Scale(raster_scale);
+
+  // Take the scaled bounds, get the enclosing rect then scale it back down -
+  // this is the same set of operations that will happen when using the tiling
+  // at that raster scale.
+  gfx::RectF content_rect(gfx::ToEnclosingRect(scaled_bounds_rect));
+  content_rect.Scale(1 / raster_scale);
+
+  return std::abs(layer_bounds.width() - content_rect.width()) < 1.f &&
+         std::abs(layer_bounds.height() - content_rect.height()) < 1.f;
+}
+
+bool PictureLayerImpl::IsDirectlyCompositedImageRasteredAtIntrinsicRatio()
+    const {
+  DCHECK(directly_composited_image_size_.has_value());
+  return MathUtil::IsWithinEpsilon(
+      directly_composited_image_raster_aspect_ratio_,
+      static_cast<float>(directly_composited_image_size_->width()) /
+          directly_composited_image_size_->height());
+}
+
+float PictureLayerImpl::GetDirectlyCompositedImageRasterScale(
+    gfx::Size directly_composited_image_size) const {
+  float x = static_cast<float>(directly_composited_image_size.width()) /
             bounds().width();
-  float y = static_cast<float>(directly_composited_image_size_->height()) /
+  float y = static_cast<float>(directly_composited_image_size.height()) /
             bounds().height();
-  DCHECK_EQ(x, 1.f);
-  DCHECK_EQ(y, 1.f);
   return GetPreferredRasterScale(gfx::Vector2dF(x, y));
 }
 
@@ -1053,9 +1125,18 @@
   }
   high_res->set_resolution(HIGH_RESOLUTION);
 
-  if (layer_tree_impl()->IsPendingTree()) {
+  if (layer_tree_impl()->IsPendingTree() ||
+      (layer_tree_impl()->settings().commit_to_active_tree &&
+       directly_composited_image_size_.has_value())) {
     // On the pending tree, drop any tilings that are non-ideal since we don't
     // need them to activate anyway.
+
+    // For DirectlyCompositedImages, if we recomputed a new raster scale, we
+    // should drop the non-ideal ones if we're committing to the active tree.
+    // Otherwise a non-ideal scale that is _larger_ than the HIGH_RESOLUTION
+    // tile will be used as the coverage scale, and we'll produce a slightly
+    // different rendering. We don't drop the tilings on the active tree if
+    // we're not committing to the active tree to prevent checkerboarding.
     tilings_->RemoveNonIdealTilings();
   }
 
@@ -1064,7 +1145,21 @@
 
 bool PictureLayerImpl::ShouldAdjustRasterScale() const {
   if (directly_composited_image_size_) {
-    float desired_raster_scale = GetDirectlyCompositedImageRasterScale();
+    // Since the raster scale is only expressed as a single dimension,
+    // we may end up rasterizing a directly composited image at an aspect-ratio
+    // that doesn't match the intrinsic size. In these cases we will re-raster
+    // as the layers bounds change the aspect ratio, until we raster at the
+    // intrinsic size (or some multiple of it as enforced by the clamping and
+    // adjustments in |RecalculateRasterScales()|.
+    const bool layer_aspect_ratio_changed = !MathUtil::IsWithinEpsilon(
+        directly_composited_image_raster_aspect_ratio_,
+        static_cast<float>(bounds().width()) / bounds().height());
+    if (layer_aspect_ratio_changed &&
+        !IsDirectlyCompositedImageRasteredAtIntrinsicRatio())
+      return true;
+
+    float desired_raster_scale = GetDirectlyCompositedImageRasterScale(
+        directly_composited_image_size_.value());
     float max_scale = std::max(desired_raster_scale, MinimumContentsScale());
     if (raster_source_scale_ < std::min(ideal_source_scale_, max_scale))
       return true;
@@ -1153,11 +1248,12 @@
 
 void PictureLayerImpl::RecalculateRasterScales() {
   if (directly_composited_image_size_) {
+    float desired_raster_scale = GetDirectlyCompositedImageRasterScale(
+        directly_composited_image_size_.value());
     if (!raster_source_scale_)
-      raster_source_scale_ = GetDirectlyCompositedImageRasterScale();
+      raster_source_scale_ = desired_raster_scale;
 
     float min_scale = MinimumContentsScale();
-    float desired_raster_scale = GetDirectlyCompositedImageRasterScale();
     float max_scale = std::max(desired_raster_scale, MinimumContentsScale());
     float clamped_ideal_source_scale =
         base::ClampToRange(ideal_source_scale_, min_scale, max_scale);
@@ -1174,6 +1270,9 @@
     raster_device_scale_ = 1.f;
     raster_contents_scale_ = raster_source_scale_;
     low_res_raster_contents_scale_ = raster_contents_scale_;
+
+    directly_composited_image_raster_aspect_ratio_ =
+        static_cast<float>(bounds().width()) / bounds().height();
     return;
   }
 
@@ -1378,7 +1477,13 @@
   if (!min_dimension)
     return setting_min;
 
-  return std::max(1.f / min_dimension, setting_min);
+  // Directly composited images may result in contents scales that are
+  // less than the configured setting. We allow this lower scale so that we
+  // can raster at the intrinsic image size.
+  const float inverse_min_dimension = 1.f / min_dimension;
+  return (directly_composited_image_size_.has_value())
+             ? inverse_min_dimension
+             : std::max(inverse_min_dimension, setting_min);
 }
 
 float PictureLayerImpl::MaximumContentsScale() const {
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 1061fc6..6337ee1 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -173,7 +173,9 @@
   float MaximumContentsScale() const;
   void UpdateViewportRectForTilePriorityInContentSpace();
   PictureLayerImpl* GetRecycledTwinLayer() const;
-  float GetDirectlyCompositedImageRasterScale() const;
+  bool ShouldDirectlyCompositeImage(base::Optional<gfx::Size> size) const;
+  bool IsDirectlyCompositedImageRasteredAtIntrinsicRatio() const;
+  float GetDirectlyCompositedImageRasterScale(gfx::Size) const;
 
   void SanityCheckTilingState() const;
 
@@ -230,8 +232,17 @@
   bool use_transformed_rasterization_ : 1;
   bool can_use_lcd_text_ : 1;
 
+  // The intrinsic size of the directly composited image. A directly composited
+  // image is an image which is the only thing drawn into a layer. In these
+  // cases we attempt to raster the image at its intrinsic size.
   base::Optional<gfx::Size> directly_composited_image_size_;
 
+  // If |directly_composited_image_size_| is set, this is the aspect ratio of
+  // the *layer* (and thus the rasterized contents) when the
+  // raster_contents_scale_ was last calculated. See comments in
+  // |ShouldAdjustRasterScale| for an explanation of how this is used.
+  float directly_composited_image_raster_aspect_ratio_;
+
   // Use this instead of |visible_layer_rect()| for tiling calculations. This
   // takes external viewport and transform for tile priority into account.
   gfx::Rect viewport_rect_for_tile_priority_in_content_space_;
diff --git a/cc/paint/display_item_list.cc b/cc/paint/display_item_list.cc
index 9429fef1..7f75976 100644
--- a/cc/paint/display_item_list.cc
+++ b/cc/paint/display_item_list.cc
@@ -56,6 +56,13 @@
   }
 }
 
+bool RotationEquivalentToAxisFlip(const SkMatrix& matrix) {
+  float skew_x = matrix.getSkewX();
+  float skew_y = matrix.getSkewY();
+  return ((skew_x == 1.f || skew_x == -1.f) &&
+          (skew_y == 1.f || skew_y == -1.f));
+}
+
 }  // namespace
 
 DisplayItemList::DisplayItemList(UsageHint usage_hint)
@@ -273,4 +280,114 @@
   return false;
 }
 
+base::Optional<DisplayItemList::DirectlyCompositedImageResult>
+DisplayItemList::GetDirectlyCompositedImageResult(
+    gfx::Size containing_layer_bounds) const {
+  const PaintOpBuffer* op_buffer = nullptr;
+  if (paint_op_buffer_.size() == 1) {
+    // The actual ops are wrapped in DrawRecord if they were previously
+    // recorded.
+    if (paint_op_buffer_.GetFirstOp()->GetType() == PaintOpType::DrawRecord) {
+      const DrawRecordOp* draw_record =
+          static_cast<const DrawRecordOp*>(paint_op_buffer_.GetFirstOp());
+      op_buffer = draw_record->record.get();
+    } else {
+      op_buffer = &paint_op_buffer_;
+    }
+  } else {
+    return base::nullopt;
+  }
+
+  const DrawImageRectOp* draw_image_rect_op = nullptr;
+  bool transpose_image_size = false;
+  constexpr size_t kNumDrawImageForOrientationOps = 10;
+  if (op_buffer->size() == 1 &&
+      op_buffer->GetFirstOp()->GetType() == PaintOpType::DrawImageRect) {
+    draw_image_rect_op =
+        static_cast<const DrawImageRectOp*>(op_buffer->GetFirstOp());
+  } else if (op_buffer->size() < kNumDrawImageForOrientationOps) {
+    // Images that respect orientation will have 5 paint operations:
+    //  (1) Save
+    //  (2) Translate
+    //  (3) Concat (rotation matrix)
+    //  (4) DrawImageRect
+    //  (5) Restore
+    // Detect these the paint op buffer and disqualify the layer as a directly
+    // composited image if any other paint op is detected.
+    for (auto* op : PaintOpBuffer::Iterator(op_buffer)) {
+      switch (op->GetType()) {
+        case PaintOpType::Save:
+        case PaintOpType::Restore:
+          break;
+        case PaintOpType::Translate: {
+          const TranslateOp* translate = static_cast<const TranslateOp*>(op);
+          if (translate->dx != 0 || translate->dy != 0)
+            return base::nullopt;
+          break;
+        }
+        case PaintOpType::Concat: {
+          // We only expect a single rotation. If we see another one, then this
+          // image won't be eligible for directly compositing.
+          if (transpose_image_size)
+            return base::nullopt;
+
+          const ConcatOp* concat_op = static_cast<const ConcatOp*>(op);
+          if (concat_op->matrix.hasPerspective() ||
+              !concat_op->matrix.preservesAxisAlignment())
+            return base::nullopt;
+
+          // If the rotation is not an axis flip, we'll need to transpose the
+          // width and height dimensions to account for the same transform
+          // applying when the layer bounds were calculated.
+          transpose_image_size =
+              RotationEquivalentToAxisFlip(concat_op->matrix);
+          break;
+        }
+        case PaintOpType::DrawImageRect:
+          if (draw_image_rect_op)
+            return base::nullopt;
+          draw_image_rect_op = static_cast<const DrawImageRectOp*>(op);
+          break;
+        default:
+          return base::nullopt;
+      }
+    }
+  }
+
+  if (!draw_image_rect_op)
+    return base::nullopt;
+
+  // The src rect must match the image size exactly, i.e. the entire image
+  // must be drawn.
+  const SkRect& src = draw_image_rect_op->src;
+  if (src.fLeft != 0 || src.fTop != 0 ||
+      src.fRight != draw_image_rect_op->image.width() ||
+      src.fBottom != draw_image_rect_op->image.height())
+    return base::nullopt;
+
+  // The DrawImageRect op's destination rect must match the layer bounds
+  // exactly. Note that the layer bounds have already taken into account image
+  // orientation so transpose the dst width/height before comparing, if
+  // appropriate.
+  const SkRect& dst = draw_image_rect_op->dst;
+  int dst_width = transpose_image_size ? dst.fBottom : dst.fRight;
+  int dst_height = transpose_image_size ? dst.fRight : dst.fBottom;
+  if (dst.fLeft != 0 || dst.fTop != 0 ||
+      dst_width != containing_layer_bounds.width() ||
+      dst_height != containing_layer_bounds.height())
+    return base::nullopt;
+
+  int width = transpose_image_size ? draw_image_rect_op->image.height()
+                                   : draw_image_rect_op->image.width();
+  int height = transpose_image_size ? draw_image_rect_op->image.width()
+                                    : draw_image_rect_op->image.height();
+  DirectlyCompositedImageResult result;
+  result.intrinsic_image_size = gfx::Size(width, height);
+  // Ensure the layer will use nearest neighbor when drawn by the display
+  // compositor, if required.
+  result.nearest_neighbor =
+      draw_image_rect_op->flags.getFilterQuality() == kNone_SkFilterQuality;
+  return result;
+}
+
 }  // namespace cc
diff --git a/cc/paint/display_item_list.h b/cc/paint/display_item_list.h
index 7a771816..926e254 100644
--- a/cc/paint/display_item_list.h
+++ b/cc/paint/display_item_list.h
@@ -166,6 +166,18 @@
   // Called after all items are appended, to process the items.
   void Finalize();
 
+  struct DirectlyCompositedImageResult {
+    gfx::Size intrinsic_image_size;
+    bool nearest_neighbor;
+  };
+
+  // If this list represents an image that should be directly composited (i.e.
+  // rasterized at the intrinsic size of the image), return the intrinsic size
+  // of the image and whether or not to use nearest neighbor filtering when
+  // scaling the layer.
+  base::Optional<DirectlyCompositedImageResult>
+  GetDirectlyCompositedImageResult(gfx::Size containing_layer_bounds) const;
+
   int NumSlowPaths() const { return paint_op_buffer_.numSlowPaths(); }
   bool HasNonAAPaint() const { return paint_op_buffer_.HasNonAAPaint(); }
   bool HasText() const { return paint_op_buffer_.HasText(); }
diff --git a/cc/paint/image_transfer_cache_entry.cc b/cc/paint/image_transfer_cache_entry.cc
index 44ebd39..155d95f1e 100644
--- a/cc/paint/image_transfer_cache_entry.cc
+++ b/cc/paint/image_transfer_cache_entry.cc
@@ -107,24 +107,19 @@
   bool add_mips_after_color_conversion =
       target_color_space && mip_mapped == GrMipMapped::kYes;
   sk_sp<SkImage> uploaded_image = source_image->makeTextureImage(
-      context, add_mips_after_color_conversion ? GrMipMapped::kNo : mip_mapped);
+      context, add_mips_after_color_conversion ? GrMipMapped::kNo : mip_mapped,
+      SkBudgeted::kNo);
 
   // Step 2: Apply a color-space conversion if necessary.
   if (uploaded_image && target_color_space) {
-    // TODO(ericrk): consider adding in the DeleteSkImageAndPreventCaching
-    // optimization from GpuImageDecodeCache where we forcefully remove the
-    // intermediate from Skia's cache.
     uploaded_image = uploaded_image->makeColorSpace(target_color_space);
   }
 
   // Step 3: If we had a colorspace conversion, we couldn't mipmap in step 1, so
   // add mips here.
   if (uploaded_image && add_mips_after_color_conversion) {
-    // TODO(ericrk): consider adding in the DeleteSkImageAndPreventCaching
-    // optimization from GpuImageDecodeCache where we forcefully remove the
-    // intermediate from Skia's cache.
-    uploaded_image =
-        uploaded_image->makeTextureImage(context, GrMipMapped::kYes);
+    uploaded_image = uploaded_image->makeTextureImage(
+        context, GrMipMapped::kYes, SkBudgeted::kNo);
   }
 
   return uploaded_image;
@@ -339,8 +334,8 @@
     DCHECK(plane_sizes_.empty());
     base::CheckedNumeric<size_t> safe_total_size(0u);
     for (size_t plane = 0; plane < plane_images.size(); plane++) {
-      plane_images[plane] =
-          plane_images[plane]->makeTextureImage(context_, GrMipMapped::kYes);
+      plane_images[plane] = plane_images[plane]->makeTextureImage(
+          context_, GrMipMapped::kYes, SkBudgeted::kNo);
       if (!plane_images[plane]) {
         DLOG(ERROR) << "Could not generate mipmap chain for plane " << plane;
         return false;
@@ -611,7 +606,7 @@
     for (size_t plane = 0; plane < plane_images_.size(); plane++) {
       DCHECK(plane_images_.at(plane));
       sk_sp<SkImage> mipped_plane = plane_images_.at(plane)->makeTextureImage(
-          context_, GrMipMapped::kYes);
+          context_, GrMipMapped::kYes, SkBudgeted::kNo);
       if (!mipped_plane)
         return;
       mipped_planes.push_back(std::move(mipped_plane));
@@ -633,11 +628,8 @@
     return;
   }
 
-  // TODO(ericrk): consider adding in the DeleteSkImageAndPreventCaching
-  // optimization from GpuImageDecodeCache where we forcefully remove the
-  // intermediate from Skia's cache.
   sk_sp<SkImage> mipped_image =
-      image_->makeTextureImage(context_, GrMipMapped::kYes);
+      image_->makeTextureImage(context_, GrMipMapped::kYes, SkBudgeted::kNo);
   if (!mipped_image)
     return;
   image_ = std::move(mipped_image);
diff --git a/chrome/VERSION b/chrome/VERSION
index 9617c1de..0c2fc7b1 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=83
 MINOR=0
-BUILD=4090
+BUILD=4091
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 58fdec5..edb80c7 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -10,6 +10,7 @@
 import("//build/util/process_version.gni")
 import("//build/util/version.gni")
 import("//chrome/android/chrome_common_shared_library.gni")
+import("//chrome/android/chrome_java_resources.gni")
 import("//chrome/android/chrome_public_apk_tmpl.gni")
 import("//chrome/android/features/dev_ui/dev_ui_module.gni")
 import("//chrome/android/features/tab_ui/buildflags.gni")
@@ -135,9 +136,34 @@
 }
 
 android_resources("chrome_app_java_resources") {
-  resource_dirs = [
-    "java/res",
-    "//chrome/android/java/res_chromium",
+  sources = chrome_java_resources
+  sources += [
+    "//chrome/android/java/res_chromium/drawable-hdpi/fre_product_logo.png",
+    "//chrome/android/java/res_chromium/drawable-hdpi/product_logo_name.png",
+    "//chrome/android/java/res_chromium/drawable-mdpi/fre_product_logo.png",
+    "//chrome/android/java/res_chromium/drawable-mdpi/product_logo_name.png",
+    "//chrome/android/java/res_chromium/drawable-xhdpi/fre_product_logo.png",
+    "//chrome/android/java/res_chromium/drawable-xhdpi/product_logo_name.png",
+    "//chrome/android/java/res_chromium/drawable-xxhdpi/fre_product_logo.png",
+    "//chrome/android/java/res_chromium/drawable-xxhdpi/product_logo_name.png",
+    "//chrome/android/java/res_chromium/drawable-xxxhdpi/fre_product_logo.png",
+    "//chrome/android/java/res_chromium/drawable-xxxhdpi/product_logo_name.png",
+    "//chrome/android/java/res_chromium/mipmap-hdpi/app_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-hdpi/app_shortcut_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-hdpi/app_single_page_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-mdpi/app_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-mdpi/app_shortcut_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-mdpi/app_single_page_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xhdpi/app_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xhdpi/app_shortcut_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xhdpi/app_single_page_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xxhdpi/app_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xxhdpi/app_shortcut_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xxhdpi/app_single_page_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xxxhdpi/app_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xxxhdpi/app_shortcut_icon.png",
+    "//chrome/android/java/res_chromium/mipmap-xxxhdpi/app_single_page_icon.png",
+    "//chrome/android/java/res_chromium/values/channel_constants.xml",
   ]
 
   deps = [
@@ -166,9 +192,9 @@
     "//third_party/android_data_chart:android_data_chart_java_resources",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_gridlayout_gridlayout_java",
+    "//third_party/android_deps:androidx_preference_preference_java",
     "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
     "//third_party/android_deps:com_android_support_design_java",
-    "//third_party/android_deps:com_android_support_preference_v7_java",
   ]
   custom_package = "org.chromium.chrome"
 }
@@ -178,7 +204,13 @@
   # resource target may clobber some resources. Once that is fixed we should add
   # the VR resurces to chrome_app_java_resources.
   android_resources("chrome_vr_java_resources") {
-    resource_dirs = [ "//chrome/android/java/res_vr" ]
+    sources = [
+      "//chrome/android/java/res_vr/drawable-nodpi/daydream_icon_background.png",
+      "//chrome/android/java/res_vr/drawable-nodpi/daydream_icon_foreground.png",
+      "//chrome/android/java/res_vr/values-v17/styles.xml",
+      "//chrome/android/java/res_vr/values-vrheadset-v26/styles.xml",
+      "//chrome/android/java/res_vr/values/values.xml",
+    ]
     deps = [ ":chrome_app_java_resources" ]
   }
 }
@@ -186,7 +218,7 @@
 # TODO (crbug/1058764) Unfork credential leak dialog password change when prototype is done.
 if (enable_password_change_in_leaked_dialog) {
   android_resources("password_change_resources") {
-    resource_dirs = [ "//chrome/android/java/res_password_change" ]
+    sources = [ "//chrome/android/java/res_password_change/layout/password_manager_dialog_with_help_button_password_change.xml" ]
     deps = [ ":chrome_app_java_resources" ]
     custom_package = "org.chromium.chrome.password_change"
   }
@@ -194,7 +226,7 @@
 
 # TODO(chouinard): Remove this wrapper target after downstream dependencies on it are replaced.
 android_resources("chrome_download_java_resources") {
-  resource_dirs = []
+  sources = []
   deps = [ "//chrome/browser/download/android:java_resources" ]
 }
 
@@ -292,6 +324,7 @@
     "//components/crash/android:java",
     "//components/dom_distiller/content/browser/android:dom_distiller_content_java",
     "//components/dom_distiller/core/android:dom_distiller_core_java",
+    "//components/dom_distiller/core/mojom:mojom_java",
     "//components/download/internal/background_service:internal_java",
     "//components/download/internal/common:internal_java",
     "//components/download/network:network_java",
@@ -352,6 +385,7 @@
     "//mojo/public/java:bindings_java",
     "//mojo/public/java:system_java",
     "//mojo/public/java/system:system_impl_java",
+    "//mojo/public/mojom/base:base_java",
     "//net/android:net_java",
     "//printing:printing_java",
     "//services/data_decoder/public/cpp/android:safe_json_java",
@@ -366,25 +400,25 @@
     "//skia/public/mojom:mojom_java",
     "//third_party/android_data_chart:android_data_chart_java",
     "//third_party/android_deps:android_arch_lifecycle_common_java",
-    "//third_party/android_deps:android_arch_lifecycle_common_java8_java",
-    "//third_party/android_deps:android_arch_lifecycle_runtime_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
     "//third_party/android_deps:androidx_collection_collection_java",
     "//third_party/android_deps:androidx_coordinatorlayout_coordinatorlayout_java",
     "//third_party/android_deps:androidx_customview_customview_java",
     "//third_party/android_deps:androidx_legacy_legacy_support_v13_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_common_java8_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_runtime_java",
 
     # TODO(bjoyce): Change to AndroidX materials after
     # ClearBrowsingDataTabsFramgent.java is converted to AndroidX.
     "//third_party/android_deps:androidx_core_core_java",
     "//third_party/android_deps:androidx_gridlayout_gridlayout_java",
     "//third_party/android_deps:androidx_mediarouter_mediarouter_java",
+    "//third_party/android_deps:androidx_preference_preference_java",
     "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
     "//third_party/android_deps:androidx_viewpager_viewpager_java",
     "//third_party/android_deps:com_android_support_design_java",
     "//third_party/android_deps:com_android_support_interpolator_java",
-    "//third_party/android_deps:com_android_support_preference_v7_java",
     "//third_party/android_deps:com_google_dagger_dagger_java",
     "//third_party/android_deps:com_google_guava_listenablefuture_java",
     "//third_party/android_deps:com_google_protobuf_protobuf_javalite_java",
@@ -832,6 +866,7 @@
     "//components/browser_ui/widget/android:test_support_java",
     "//components/crash/android:java",
     "//components/dom_distiller/core/android:dom_distiller_core_java",
+    "//components/dom_distiller/core/mojom:mojom_java",
     "//components/download/internal/background_service:internal_java",
     "//components/download/internal/common:internal_java",
     "//components/download/network:network_java",
@@ -881,6 +916,7 @@
     "//media/base/android:media_java",
     "//mojo/public/java:bindings_java",
     "//mojo/public/java:system_java",
+    "//mojo/public/mojom/base:base_java",
     "//net/android:net_java",
     "//net/android:net_java_test_support",
     "//printing:printing_java",
@@ -894,9 +930,9 @@
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
     "//third_party/android_deps:androidx_collection_collection_java",
+    "//third_party/android_deps:androidx_preference_preference_java",
     "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
     "//third_party/android_deps:com_android_support_design_java",
-    "//third_party/android_deps:com_android_support_preference_v7_java",
     "//third_party/android_deps:com_google_protobuf_protobuf_javalite_java",
     "//third_party/android_sdk:android_test_base_java",
     "//third_party/android_sdk:android_test_mock_java",
@@ -1133,7 +1169,34 @@
 
 # Overrides icon / name defined in chrome_app_java_resources.
 android_resources("chrome_public_apk_resources") {
-  resource_dirs = [ "java/res_chromium" ]
+  sources = [
+    "java/res_chromium/drawable-hdpi/fre_product_logo.png",
+    "java/res_chromium/drawable-hdpi/product_logo_name.png",
+    "java/res_chromium/drawable-mdpi/fre_product_logo.png",
+    "java/res_chromium/drawable-mdpi/product_logo_name.png",
+    "java/res_chromium/drawable-xhdpi/fre_product_logo.png",
+    "java/res_chromium/drawable-xhdpi/product_logo_name.png",
+    "java/res_chromium/drawable-xxhdpi/fre_product_logo.png",
+    "java/res_chromium/drawable-xxhdpi/product_logo_name.png",
+    "java/res_chromium/drawable-xxxhdpi/fre_product_logo.png",
+    "java/res_chromium/drawable-xxxhdpi/product_logo_name.png",
+    "java/res_chromium/mipmap-hdpi/app_icon.png",
+    "java/res_chromium/mipmap-hdpi/app_shortcut_icon.png",
+    "java/res_chromium/mipmap-hdpi/app_single_page_icon.png",
+    "java/res_chromium/mipmap-mdpi/app_icon.png",
+    "java/res_chromium/mipmap-mdpi/app_shortcut_icon.png",
+    "java/res_chromium/mipmap-mdpi/app_single_page_icon.png",
+    "java/res_chromium/mipmap-xhdpi/app_icon.png",
+    "java/res_chromium/mipmap-xhdpi/app_shortcut_icon.png",
+    "java/res_chromium/mipmap-xhdpi/app_single_page_icon.png",
+    "java/res_chromium/mipmap-xxhdpi/app_icon.png",
+    "java/res_chromium/mipmap-xxhdpi/app_shortcut_icon.png",
+    "java/res_chromium/mipmap-xxhdpi/app_single_page_icon.png",
+    "java/res_chromium/mipmap-xxxhdpi/app_icon.png",
+    "java/res_chromium/mipmap-xxxhdpi/app_shortcut_icon.png",
+    "java/res_chromium/mipmap-xxxhdpi/app_single_page_icon.png",
+    "java/res_chromium/values/channel_constants.xml",
+  ]
 
   # Dep needed to ensure override works properly.
   deps = [ ":chrome_app_java_resources" ]
@@ -1894,7 +1957,7 @@
 # generate APK stubs.
 android_resources("trichrome_dummy_resources") {
   custom_package = "org.chromium.trichromelibrary"
-  resource_dirs = [ "trichrome/res_dummy" ]
+  sources = [ "trichrome/res_dummy/values/strings.xml" ]
 }
 
 chrome_public_test_apk_manifest =
diff --git a/chrome/android/OWNERS b/chrome/android/OWNERS
index bd4e0f3..efd4cb1 100644
--- a/chrome/android/OWNERS
+++ b/chrome/android/OWNERS
@@ -11,6 +11,7 @@
 per-file static_initializers.gni=*
 per-file java_sources.gni=*
 per-file chrome_java_sources.gni=*
+per-file chrome_java_resources.gni=*
 per-file chrome_test_java_sources.gni=*
 per-file chrome_junit_test_java_sources.gni=*
 
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni
new file mode 100644
index 0000000..323e9dc
--- /dev/null
+++ b/chrome/android/chrome_java_resources.gni
@@ -0,0 +1,1385 @@
+# Copyright 2020 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.
+
+# To regenerate this list, run:
+# sed -i '/^[^#][^[]*$/d' chrome_java_resources.gni
+# (for f in $(find java/res/*/ -type f); do echo '  "'$f'",'; done; echo ']') >> chrome_java_resources.gni
+# git cl format
+
+chrome_java_resources = [
+  "java/res/anim/accelerate_quart.xml",
+  "java/res/anim/activity_close_exit.xml",
+  "java/res/anim/activity_open_enter.xml",
+  "java/res/anim/decelerate_quart.xml",
+  "java/res/anim/fast_out_slow_in_interpolator.xml",
+  "java/res/anim/no_anim.xml",
+  "java/res/anim/slide_in_up.xml",
+  "java/res/anim/slide_out_down.xml",
+  "java/res/anim/stay_hidden.xml",
+  "java/res/color/item_chooser_row_icon_color.xml",
+  "java/res/color/item_chooser_row_text_color.xml",
+  "java/res/color/payment_minimal_ui_default_tint.xml",
+  "java/res/color/payment_minimal_ui_emphasis_tint.xml",
+  "java/res/color/payment_minimal_ui_error_tint.xml",
+  "java/res/color/tint_on_blue_bg.xml",
+  "java/res/color/toolbar_icon_tint_dark.xml",
+  "java/res/color/white_mode_tint.xml",
+  "java/res/drawable-hdpi-v21/navigation_bubble_shadow.9.png",
+  "java/res/drawable-hdpi/amex_card.png",
+  "java/res/drawable-hdpi/audio_playing.png",
+  "java/res/drawable-hdpi/audio_playing_square.png",
+  "java/res/drawable-hdpi/badge_update_dark.png",
+  "java/res/drawable-hdpi/badge_update_light.png",
+  "java/res/drawable-hdpi/bg_tabstrip_background_tab_outline.9.png",
+  "java/res/drawable-hdpi/bg_tabstrip_tab.9.png",
+  "java/res/drawable-hdpi/bookmark_check_gray.png",
+  "java/res/drawable-hdpi/bookmark_edit_active.png",
+  "java/res/drawable-hdpi/bookmark_move_active.png",
+  "java/res/drawable-hdpi/breadcrumb_arrow.png",
+  "java/res/drawable-hdpi/btn_bg_holo_active_normal.png",
+  "java/res/drawable-hdpi/btn_bg_holo_active_pressed.png",
+  "java/res/drawable-hdpi/btn_bg_holo_pressed.png",
+  "java/res/drawable-hdpi/btn_close_white.png",
+  "java/res/drawable-hdpi/btn_left.png",
+  "java/res/drawable-hdpi/btn_mic.png",
+  "java/res/drawable-hdpi/btn_normal_tabs.png",
+  "java/res/drawable-hdpi/btn_right.png",
+  "java/res/drawable-hdpi/btn_star.png",
+  "java/res/drawable-hdpi/btn_star_filled.png",
+  "java/res/drawable-hdpi/btn_suggestion_refine.png",
+  "java/res/drawable-hdpi/btn_tab_close_normal.png",
+  "java/res/drawable-hdpi/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-hdpi/btn_tabstrip_new_tab_normal.png",
+  "java/res/drawable-hdpi/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-hdpi/btn_tabstrip_switch_normal.png",
+  "java/res/drawable-hdpi/btn_tabswitcher_modern.png",
+  "java/res/drawable-hdpi/btn_toolbar_home.png",
+  "java/res/drawable-hdpi/btn_toolbar_reload.png",
+  "java/res/drawable-hdpi/chrome_sync_logo.png",
+  "java/res/drawable-hdpi/contextual_search_bar_background.9.png",
+  "java/res/drawable-hdpi/contextual_search_promo_ripple.9.png",
+  "java/res/drawable-hdpi/cvc_icon.png",
+  "java/res/drawable-hdpi/cvc_icon_amex.png",
+  "java/res/drawable-hdpi/data_reduction_breakdown_sort_arrow.png",
+  "java/res/drawable-hdpi/diners_card.png",
+  "java/res/drawable-hdpi/down_arrow.png",
+  "java/res/drawable-hdpi/google_logo.png",
+  "java/res/drawable-hdpi/google_play.png",
+  "java/res/drawable-hdpi/help_outline.png",
+  "java/res/drawable-hdpi/ic_account_child_20dp.png",
+  "java/res/drawable-hdpi/ic_bluetooth_searching_black_24dp.png",
+  "java/res/drawable-hdpi/ic_chrome.png",
+  "java/res/drawable-hdpi/ic_close_all_tabs.png",
+  "java/res/drawable-hdpi/ic_content_paste_grey600_24dp.png",
+  "java/res/drawable-hdpi/ic_delete_white_24dp.png",
+  "java/res/drawable-hdpi/ic_devices_16dp.png",
+  "java/res/drawable-hdpi/ic_devices_48dp.png",
+  "java/res/drawable-hdpi/ic_dialer_icon_blue_40dp.png",
+  "java/res/drawable-hdpi/ic_dialer_not_found_red_40dp.png",
+  "java/res/drawable-hdpi/ic_download_pause.png",
+  "java/res/drawable-hdpi/ic_download_pending.png",
+  "java/res/drawable-hdpi/ic_drag_handle_grey600_24dp.png",
+  "java/res/drawable-hdpi/ic_drive_site_white_24dp.png",
+  "java/res/drawable-hdpi/ic_edit_24dp.png",
+  "java/res/drawable-hdpi/ic_email_googblue_36dp.png",
+  "java/res/drawable-hdpi/ic_error_grey800_24dp_filled.png",
+  "java/res/drawable-hdpi/ic_error_outline_googblue_24dp.png",
+  "java/res/drawable-hdpi/ic_error_outline_red_24dp.png",
+  "java/res/drawable-hdpi/ic_error_white_24dp_filled.png",
+  "java/res/drawable-hdpi/ic_event_googblue_36dp.png",
+  "java/res/drawable-hdpi/ic_exit_to_app_white_24dp.png",
+  "java/res/drawable-hdpi/ic_fast_forward_white_36dp.png",
+  "java/res/drawable-hdpi/ic_fast_rewind_white_36dp.png",
+  "java/res/drawable-hdpi/ic_file_download_white_24dp.png",
+  "java/res/drawable-hdpi/ic_folder_blue_24dp.png",
+  "java/res/drawable-hdpi/ic_history_googblue_24dp.png",
+  "java/res/drawable-hdpi/ic_link_grey600_36dp.png",
+  "java/res/drawable-hdpi/ic_logo_googleg_24dp.png",
+  "java/res/drawable-hdpi/ic_mobile_friendly_grey600_24dp.png",
+  "java/res/drawable-hdpi/ic_most_visited_placeholder.png",
+  "java/res/drawable-hdpi/ic_pause_white_24dp.png",
+  "java/res/drawable-hdpi/ic_pause_white_36dp.png",
+  "java/res/drawable-hdpi/ic_phone_googblue_36dp.png",
+  "java/res/drawable-hdpi/ic_photo_camera.png",
+  "java/res/drawable-hdpi/ic_place_googblue_36dp.png",
+  "java/res/drawable-hdpi/ic_play_arrow_white_24dp.png",
+  "java/res/drawable-hdpi/ic_play_arrow_white_36dp.png",
+  "java/res/drawable-hdpi/ic_refresh_white_24dp.png",
+  "java/res/drawable-hdpi/ic_refresh_white_36dp.png",
+  "java/res/drawable-hdpi/ic_share_white_24dp.png",
+  "java/res/drawable-hdpi/ic_skip_next_white_36dp.png",
+  "java/res/drawable-hdpi/ic_skip_previous_white_36dp.png",
+  "java/res/drawable-hdpi/ic_stop_white_36dp.png",
+  "java/res/drawable-hdpi/ic_suggestion_magnifier.png",
+  "java/res/drawable-hdpi/ic_videocam_white_24dp.png",
+  "java/res/drawable-hdpi/ic_volume_up_grey600_24dp.png",
+  "java/res/drawable-hdpi/ic_warning_white_24dp.png",
+  "java/res/drawable-hdpi/ic_watch_later_24dp.png",
+  "java/res/drawable-hdpi/incognito_simple.png",
+  "java/res/drawable-hdpi/incognito_small.png",
+  "java/res/drawable-hdpi/incognito_splash.png",
+  "java/res/drawable-hdpi/incognito_switch.png",
+  "java/res/drawable-hdpi/infobar_blocked_popups.png",
+  "java/res/drawable-hdpi/infobar_chrome.png",
+  "java/res/drawable-hdpi/infobar_downloading.png",
+  "java/res/drawable-hdpi/infobar_mobile_friendly.png",
+  "java/res/drawable-hdpi/infobar_restore.png",
+  "java/res/drawable-hdpi/infobar_screen_share.png",
+  "java/res/drawable-hdpi/infobar_translate.png",
+  "java/res/drawable-hdpi/infobar_translate_compact.png",
+  "java/res/drawable-hdpi/jcb_card.png",
+  "java/res/drawable-hdpi/location_bar_incognito_badge.png",
+  "java/res/drawable-hdpi/logo_card_back.png",
+  "java/res/drawable-hdpi/mc_card.png",
+  "java/res/drawable-hdpi/menu_update.png",
+  "java/res/drawable-hdpi/modern_location_bar.9.png",
+  "java/res/drawable-hdpi/modern_toolbar_shadow.png",
+  "java/res/drawable-hdpi/offline_pin.png",
+  "java/res/drawable-hdpi/open_in_new_tab.png",
+  "java/res/drawable-hdpi/overlay_side_shadow.9.png",
+  "java/res/drawable-hdpi/pageinfo_bad.png",
+  "java/res/drawable-hdpi/pageinfo_good.png",
+  "java/res/drawable-hdpi/pageinfo_warning.png",
+  "java/res/drawable-hdpi/permission_background_sync.png",
+  "java/res/drawable-hdpi/permission_javascript.png",
+  "java/res/drawable-hdpi/permission_mic.png",
+  "java/res/drawable-hdpi/permission_midi.png",
+  "java/res/drawable-hdpi/permission_popups.png",
+  "java/res/drawable-hdpi/permission_protected_media.png",
+  "java/res/drawable-hdpi/permission_push_notification.png",
+  "java/res/drawable-hdpi/permission_push_notification_off.png",
+  "java/res/drawable-hdpi/plus.png",
+  "java/res/drawable-hdpi/popup_bg_bottom.9.png",
+  "java/res/drawable-hdpi/preview_pin_round.png",
+  "java/res/drawable-hdpi/print.png",
+  "java/res/drawable-hdpi/progress_bar_background.9.png",
+  "java/res/drawable-hdpi/progress_bar_foreground.9.png",
+  "java/res/drawable-hdpi/qr_code.png",
+  "java/res/drawable-hdpi/reader_mode_prefs_icon.png",
+  "java/res/drawable-hdpi/sad_tab.png",
+  "java/res/drawable-hdpi/safetytip_shield.png",
+  "java/res/drawable-hdpi/screenshot.png",
+  "java/res/drawable-hdpi/send_tab.png",
+  "java/res/drawable-hdpi/settings_all_sites.png",
+  "java/res/drawable-hdpi/settings_cog.png",
+  "java/res/drawable-hdpi/settings_sensors.png",
+  "java/res/drawable-hdpi/settings_storage.png",
+  "java/res/drawable-hdpi/settings_usb.png",
+  "java/res/drawable-hdpi/shared_clipboard_40dp.png",
+  "java/res/drawable-hdpi/sharing_more.png",
+  "java/res/drawable-hdpi/shortcut_incognito.png",
+  "java/res/drawable-hdpi/shortcut_newtab.png",
+  "java/res/drawable-hdpi/spinner.png",
+  "java/res/drawable-hdpi/spinner_white.png",
+  "java/res/drawable-hdpi/star_gray.png",
+  "java/res/drawable-hdpi/star_green.png",
+  "java/res/drawable-hdpi/tab_strip_fade.png",
+  "java/res/drawable-hdpi/tab_strip_fade_for_model_selector.png",
+  "java/res/drawable-hdpi/tabswitcher_border_frame.9.png",
+  "java/res/drawable-hdpi/tabswitcher_border_frame_decoration.9.png",
+  "java/res/drawable-hdpi/tabswitcher_border_frame_inner_shadow.9.png",
+  "java/res/drawable-hdpi/tabswitcher_border_frame_shadow.9.png",
+  "java/res/drawable-hdpi/toolbar_shadow_focused.png",
+  "java/res/drawable-hdpi/toolbar_shadow_normal.png",
+  "java/res/drawable-hdpi/top_round.9.png",
+  "java/res/drawable-hdpi/unionpay_card.png",
+  "java/res/drawable-hdpi/verify_checkmark.png",
+  "java/res/drawable-hdpi/web_asset.png",
+  "java/res/drawable-hdpi/webrtc_audio.png",
+  "java/res/drawable-hdpi/webrtc_video.png",
+  "java/res/drawable-ldrtl-hdpi-v17/btn_suggestion_refine.png",
+  "java/res/drawable-ldrtl-hdpi-v17/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-ldrtl-hdpi-v17/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-ldrtl-hdpi-v17/btn_toolbar_reload.png",
+  "java/res/drawable-ldrtl-hdpi-v17/ic_share_white_24dp.png",
+  "java/res/drawable-ldrtl-hdpi-v17/ic_suggestion_magnifier.png",
+  "java/res/drawable-ldrtl-mdpi-v17/btn_suggestion_refine.png",
+  "java/res/drawable-ldrtl-mdpi-v17/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-ldrtl-mdpi-v17/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-ldrtl-mdpi-v17/btn_toolbar_reload.png",
+  "java/res/drawable-ldrtl-mdpi-v17/ic_share_white_24dp.png",
+  "java/res/drawable-ldrtl-mdpi-v17/ic_suggestion_magnifier.png",
+  "java/res/drawable-ldrtl-sw600dp-xhdpi-v17/toolbar_background.9.png",
+  "java/res/drawable-ldrtl-v17/btn_back.xml",
+  "java/res/drawable-ldrtl-v17/btn_forward.xml",
+  "java/res/drawable-ldrtl-xhdpi-v17/btn_suggestion_refine.png",
+  "java/res/drawable-ldrtl-xhdpi-v17/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-ldrtl-xhdpi-v17/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-ldrtl-xhdpi-v17/btn_toolbar_reload.png",
+  "java/res/drawable-ldrtl-xhdpi-v17/ic_share_white_24dp.png",
+  "java/res/drawable-ldrtl-xhdpi-v17/ic_suggestion_magnifier.png",
+  "java/res/drawable-ldrtl-xxhdpi-v17/btn_suggestion_refine.png",
+  "java/res/drawable-ldrtl-xxhdpi-v17/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-ldrtl-xxhdpi-v17/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-ldrtl-xxhdpi-v17/btn_toolbar_reload.png",
+  "java/res/drawable-ldrtl-xxhdpi-v17/ic_share_white_24dp.png",
+  "java/res/drawable-ldrtl-xxhdpi-v17/ic_suggestion_magnifier.png",
+  "java/res/drawable-ldrtl-xxxhdpi-v17/btn_suggestion_refine.png",
+  "java/res/drawable-ldrtl-xxxhdpi-v17/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-ldrtl-xxxhdpi-v17/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-ldrtl-xxxhdpi-v17/btn_toolbar_reload.png",
+  "java/res/drawable-ldrtl-xxxhdpi-v17/ic_share_white_24dp.png",
+  "java/res/drawable-ldrtl-xxxhdpi-v17/ic_suggestion_magnifier.png",
+  "java/res/drawable-mdpi-v21/navigation_bubble_shadow.9.png",
+  "java/res/drawable-mdpi/amex_card.png",
+  "java/res/drawable-mdpi/audio_playing.png",
+  "java/res/drawable-mdpi/audio_playing_square.png",
+  "java/res/drawable-mdpi/badge_update_dark.png",
+  "java/res/drawable-mdpi/badge_update_light.png",
+  "java/res/drawable-mdpi/bg_tabstrip_background_tab_outline.9.png",
+  "java/res/drawable-mdpi/bg_tabstrip_tab.9.png",
+  "java/res/drawable-mdpi/bookmark_check_gray.png",
+  "java/res/drawable-mdpi/bookmark_edit_active.png",
+  "java/res/drawable-mdpi/bookmark_move_active.png",
+  "java/res/drawable-mdpi/breadcrumb_arrow.png",
+  "java/res/drawable-mdpi/btn_bg_holo_active_normal.png",
+  "java/res/drawable-mdpi/btn_bg_holo_active_pressed.png",
+  "java/res/drawable-mdpi/btn_bg_holo_pressed.png",
+  "java/res/drawable-mdpi/btn_close_white.png",
+  "java/res/drawable-mdpi/btn_left.png",
+  "java/res/drawable-mdpi/btn_mic.png",
+  "java/res/drawable-mdpi/btn_normal_tabs.png",
+  "java/res/drawable-mdpi/btn_right.png",
+  "java/res/drawable-mdpi/btn_star.png",
+  "java/res/drawable-mdpi/btn_star_filled.png",
+  "java/res/drawable-mdpi/btn_suggestion_refine.png",
+  "java/res/drawable-mdpi/btn_tab_close_normal.png",
+  "java/res/drawable-mdpi/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-mdpi/btn_tabstrip_new_tab_normal.png",
+  "java/res/drawable-mdpi/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-mdpi/btn_tabstrip_switch_normal.png",
+  "java/res/drawable-mdpi/btn_tabswitcher_modern.png",
+  "java/res/drawable-mdpi/btn_toolbar_home.png",
+  "java/res/drawable-mdpi/btn_toolbar_reload.png",
+  "java/res/drawable-mdpi/chrome_sync_logo.png",
+  "java/res/drawable-mdpi/contextual_search_bar_background.9.png",
+  "java/res/drawable-mdpi/contextual_search_promo_ripple.9.png",
+  "java/res/drawable-mdpi/cvc_icon.png",
+  "java/res/drawable-mdpi/cvc_icon_amex.png",
+  "java/res/drawable-mdpi/data_reduction_breakdown_sort_arrow.png",
+  "java/res/drawable-mdpi/diners_card.png",
+  "java/res/drawable-mdpi/down_arrow.png",
+  "java/res/drawable-mdpi/google_logo.png",
+  "java/res/drawable-mdpi/google_play.png",
+  "java/res/drawable-mdpi/help_outline.png",
+  "java/res/drawable-mdpi/ic_account_child_20dp.png",
+  "java/res/drawable-mdpi/ic_bluetooth_searching_black_24dp.png",
+  "java/res/drawable-mdpi/ic_chrome.png",
+  "java/res/drawable-mdpi/ic_close_all_tabs.png",
+  "java/res/drawable-mdpi/ic_content_paste_grey600_24dp.png",
+  "java/res/drawable-mdpi/ic_delete_white_24dp.png",
+  "java/res/drawable-mdpi/ic_devices_16dp.png",
+  "java/res/drawable-mdpi/ic_devices_48dp.png",
+  "java/res/drawable-mdpi/ic_dialer_icon_blue_40dp.png",
+  "java/res/drawable-mdpi/ic_dialer_not_found_red_40dp.png",
+  "java/res/drawable-mdpi/ic_download_pause.png",
+  "java/res/drawable-mdpi/ic_download_pending.png",
+  "java/res/drawable-mdpi/ic_drag_handle_grey600_24dp.png",
+  "java/res/drawable-mdpi/ic_drive_site_white_24dp.png",
+  "java/res/drawable-mdpi/ic_edit_24dp.png",
+  "java/res/drawable-mdpi/ic_email_googblue_36dp.png",
+  "java/res/drawable-mdpi/ic_error_grey800_24dp_filled.png",
+  "java/res/drawable-mdpi/ic_error_outline_googblue_24dp.png",
+  "java/res/drawable-mdpi/ic_error_outline_red_24dp.png",
+  "java/res/drawable-mdpi/ic_error_white_24dp_filled.png",
+  "java/res/drawable-mdpi/ic_event_googblue_36dp.png",
+  "java/res/drawable-mdpi/ic_exit_to_app_white_24dp.png",
+  "java/res/drawable-mdpi/ic_fast_forward_white_36dp.png",
+  "java/res/drawable-mdpi/ic_fast_rewind_white_36dp.png",
+  "java/res/drawable-mdpi/ic_file_download_white_24dp.png",
+  "java/res/drawable-mdpi/ic_folder_blue_24dp.png",
+  "java/res/drawable-mdpi/ic_history_googblue_24dp.png",
+  "java/res/drawable-mdpi/ic_link_grey600_36dp.png",
+  "java/res/drawable-mdpi/ic_logo_googleg_24dp.png",
+  "java/res/drawable-mdpi/ic_mobile_friendly_grey600_24dp.png",
+  "java/res/drawable-mdpi/ic_most_visited_placeholder.png",
+  "java/res/drawable-mdpi/ic_pause_white_24dp.png",
+  "java/res/drawable-mdpi/ic_pause_white_36dp.png",
+  "java/res/drawable-mdpi/ic_phone_googblue_36dp.png",
+  "java/res/drawable-mdpi/ic_photo_camera.png",
+  "java/res/drawable-mdpi/ic_place_googblue_36dp.png",
+  "java/res/drawable-mdpi/ic_play_arrow_white_24dp.png",
+  "java/res/drawable-mdpi/ic_play_arrow_white_36dp.png",
+  "java/res/drawable-mdpi/ic_refresh_white_24dp.png",
+  "java/res/drawable-mdpi/ic_refresh_white_36dp.png",
+  "java/res/drawable-mdpi/ic_share_white_24dp.png",
+  "java/res/drawable-mdpi/ic_skip_next_white_36dp.png",
+  "java/res/drawable-mdpi/ic_skip_previous_white_36dp.png",
+  "java/res/drawable-mdpi/ic_stop_white_36dp.png",
+  "java/res/drawable-mdpi/ic_suggestion_magnifier.png",
+  "java/res/drawable-mdpi/ic_videocam_white_24dp.png",
+  "java/res/drawable-mdpi/ic_volume_up_grey600_24dp.png",
+  "java/res/drawable-mdpi/ic_warning_white_24dp.png",
+  "java/res/drawable-mdpi/ic_watch_later_24dp.png",
+  "java/res/drawable-mdpi/incognito_simple.png",
+  "java/res/drawable-mdpi/incognito_small.png",
+  "java/res/drawable-mdpi/incognito_splash.png",
+  "java/res/drawable-mdpi/incognito_switch.png",
+  "java/res/drawable-mdpi/infobar_blocked_popups.png",
+  "java/res/drawable-mdpi/infobar_chrome.png",
+  "java/res/drawable-mdpi/infobar_downloading.png",
+  "java/res/drawable-mdpi/infobar_mobile_friendly.png",
+  "java/res/drawable-mdpi/infobar_restore.png",
+  "java/res/drawable-mdpi/infobar_screen_share.png",
+  "java/res/drawable-mdpi/infobar_translate.png",
+  "java/res/drawable-mdpi/infobar_translate_compact.png",
+  "java/res/drawable-mdpi/jcb_card.png",
+  "java/res/drawable-mdpi/location_bar_incognito_badge.png",
+  "java/res/drawable-mdpi/logo_card_back.png",
+  "java/res/drawable-mdpi/mc_card.png",
+  "java/res/drawable-mdpi/menu_update.png",
+  "java/res/drawable-mdpi/modern_location_bar.9.png",
+  "java/res/drawable-mdpi/modern_toolbar_shadow.png",
+  "java/res/drawable-mdpi/offline_pin.png",
+  "java/res/drawable-mdpi/open_in_new_tab.png",
+  "java/res/drawable-mdpi/overlay_side_shadow.9.png",
+  "java/res/drawable-mdpi/pageinfo_bad.png",
+  "java/res/drawable-mdpi/pageinfo_good.png",
+  "java/res/drawable-mdpi/pageinfo_warning.png",
+  "java/res/drawable-mdpi/permission_background_sync.png",
+  "java/res/drawable-mdpi/permission_javascript.png",
+  "java/res/drawable-mdpi/permission_mic.png",
+  "java/res/drawable-mdpi/permission_midi.png",
+  "java/res/drawable-mdpi/permission_popups.png",
+  "java/res/drawable-mdpi/permission_protected_media.png",
+  "java/res/drawable-mdpi/permission_push_notification.png",
+  "java/res/drawable-mdpi/permission_push_notification_off.png",
+  "java/res/drawable-mdpi/plus.png",
+  "java/res/drawable-mdpi/popup_bg_bottom.9.png",
+  "java/res/drawable-mdpi/preview_pin_round.png",
+  "java/res/drawable-mdpi/print.png",
+  "java/res/drawable-mdpi/progress_bar_background.9.png",
+  "java/res/drawable-mdpi/progress_bar_foreground.9.png",
+  "java/res/drawable-mdpi/qr_code.png",
+  "java/res/drawable-mdpi/reader_mode_prefs_icon.png",
+  "java/res/drawable-mdpi/sad_tab.png",
+  "java/res/drawable-mdpi/safetytip_shield.png",
+  "java/res/drawable-mdpi/screenshot.png",
+  "java/res/drawable-mdpi/send_tab.png",
+  "java/res/drawable-mdpi/settings_all_sites.png",
+  "java/res/drawable-mdpi/settings_cog.png",
+  "java/res/drawable-mdpi/settings_sensors.png",
+  "java/res/drawable-mdpi/settings_storage.png",
+  "java/res/drawable-mdpi/settings_usb.png",
+  "java/res/drawable-mdpi/shared_clipboard_40dp.png",
+  "java/res/drawable-mdpi/sharing_more.png",
+  "java/res/drawable-mdpi/shortcut_incognito.png",
+  "java/res/drawable-mdpi/shortcut_newtab.png",
+  "java/res/drawable-mdpi/spinner.png",
+  "java/res/drawable-mdpi/spinner_white.png",
+  "java/res/drawable-mdpi/star_gray.png",
+  "java/res/drawable-mdpi/star_green.png",
+  "java/res/drawable-mdpi/tab_strip_fade.png",
+  "java/res/drawable-mdpi/tab_strip_fade_for_model_selector.png",
+  "java/res/drawable-mdpi/tabswitcher_border_frame.9.png",
+  "java/res/drawable-mdpi/tabswitcher_border_frame_decoration.9.png",
+  "java/res/drawable-mdpi/tabswitcher_border_frame_inner_shadow.9.png",
+  "java/res/drawable-mdpi/tabswitcher_border_frame_shadow.9.png",
+  "java/res/drawable-mdpi/toolbar_shadow_focused.png",
+  "java/res/drawable-mdpi/toolbar_shadow_normal.png",
+  "java/res/drawable-mdpi/top_round.9.png",
+  "java/res/drawable-mdpi/unionpay_card.png",
+  "java/res/drawable-mdpi/verify_checkmark.png",
+  "java/res/drawable-mdpi/web_asset.png",
+  "java/res/drawable-mdpi/webrtc_audio.png",
+  "java/res/drawable-mdpi/webrtc_video.png",
+  "java/res/drawable-night-hdpi/top_round.9.png",
+  "java/res/drawable-night-mdpi/top_round.9.png",
+  "java/res/drawable-night-xhdpi/top_round.9.png",
+  "java/res/drawable-night-xxhdpi/top_round.9.png",
+  "java/res/drawable-night-xxxhdpi/top_round.9.png",
+  "java/res/drawable-nodpi/bookmark_widget_preview.png",
+  "java/res/drawable-nodpi/widget_preview.png",
+  "java/res/drawable-sw600dp-hdpi/google_logo.png",
+  "java/res/drawable-sw600dp-mdpi/google_logo.png",
+  "java/res/drawable-sw600dp-xhdpi/google_logo.png",
+  "java/res/drawable-sw600dp-xhdpi/toolbar_background.9.png",
+  "java/res/drawable-sw600dp-xxhdpi/google_logo.png",
+  "java/res/drawable-sw600dp-xxxhdpi/google_logo.png",
+  "java/res/drawable-sw600dp/toolbar_shadow.xml",
+  "java/res/drawable-sw600dp/window_background.xml",
+  "java/res/drawable-sw720dp-v19/window_background.xml",
+  "java/res/drawable-sw720dp/window_background.xml",
+  "java/res/drawable-v19/action_bar_activity_bg.xml",
+  "java/res/drawable-v19/navigation_bubble_shadow.xml",
+  "java/res/drawable-v21/button_borderless_compat.xml",
+  "java/res/drawable-v21/ntp_search_box.xml",
+  "java/res/drawable-v21/popup_bg_bottom_tinted.xml",
+  "java/res/drawable-v21/text_cursor_lowend.xml",
+  "java/res/drawable-v21/tile_view_highlight.xml",
+  "java/res/drawable-v21/web_notification_button_background.xml",
+  "java/res/drawable-v21/web_notification_small_icon_background.xml",
+  "java/res/drawable-xhdpi-v21/navigation_bubble_shadow.9.png",
+  "java/res/drawable-xhdpi/amex_card.png",
+  "java/res/drawable-xhdpi/audio_playing.png",
+  "java/res/drawable-xhdpi/audio_playing_square.png",
+  "java/res/drawable-xhdpi/badge_update_dark.png",
+  "java/res/drawable-xhdpi/badge_update_light.png",
+  "java/res/drawable-xhdpi/bg_tabstrip_background_tab_outline.9.png",
+  "java/res/drawable-xhdpi/bg_tabstrip_tab.9.png",
+  "java/res/drawable-xhdpi/bookmark_check_gray.png",
+  "java/res/drawable-xhdpi/bookmark_edit_active.png",
+  "java/res/drawable-xhdpi/bookmark_move_active.png",
+  "java/res/drawable-xhdpi/breadcrumb_arrow.png",
+  "java/res/drawable-xhdpi/btn_bg_holo_active_normal.png",
+  "java/res/drawable-xhdpi/btn_bg_holo_active_pressed.png",
+  "java/res/drawable-xhdpi/btn_bg_holo_pressed.png",
+  "java/res/drawable-xhdpi/btn_close_white.png",
+  "java/res/drawable-xhdpi/btn_left.png",
+  "java/res/drawable-xhdpi/btn_mic.png",
+  "java/res/drawable-xhdpi/btn_normal_tabs.png",
+  "java/res/drawable-xhdpi/btn_right.png",
+  "java/res/drawable-xhdpi/btn_star.png",
+  "java/res/drawable-xhdpi/btn_star_filled.png",
+  "java/res/drawable-xhdpi/btn_suggestion_refine.png",
+  "java/res/drawable-xhdpi/btn_tab_close_normal.png",
+  "java/res/drawable-xhdpi/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-xhdpi/btn_tabstrip_new_tab_normal.png",
+  "java/res/drawable-xhdpi/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-xhdpi/btn_tabstrip_switch_normal.png",
+  "java/res/drawable-xhdpi/btn_tabswitcher_modern.png",
+  "java/res/drawable-xhdpi/btn_toolbar_home.png",
+  "java/res/drawable-xhdpi/btn_toolbar_reload.png",
+  "java/res/drawable-xhdpi/chrome_sync_logo.png",
+  "java/res/drawable-xhdpi/contextual_search_bar_background.9.png",
+  "java/res/drawable-xhdpi/contextual_search_promo_ripple.9.png",
+  "java/res/drawable-xhdpi/cvc_icon.png",
+  "java/res/drawable-xhdpi/cvc_icon_amex.png",
+  "java/res/drawable-xhdpi/data_reduction_breakdown_sort_arrow.png",
+  "java/res/drawable-xhdpi/diners_card.png",
+  "java/res/drawable-xhdpi/down_arrow.png",
+  "java/res/drawable-xhdpi/google_logo.png",
+  "java/res/drawable-xhdpi/google_play.png",
+  "java/res/drawable-xhdpi/help_outline.png",
+  "java/res/drawable-xhdpi/ic_account_child_20dp.png",
+  "java/res/drawable-xhdpi/ic_bluetooth_searching_black_24dp.png",
+  "java/res/drawable-xhdpi/ic_chrome.png",
+  "java/res/drawable-xhdpi/ic_close_all_tabs.png",
+  "java/res/drawable-xhdpi/ic_content_paste_grey600_24dp.png",
+  "java/res/drawable-xhdpi/ic_delete_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_devices_16dp.png",
+  "java/res/drawable-xhdpi/ic_devices_48dp.png",
+  "java/res/drawable-xhdpi/ic_dialer_icon_blue_40dp.png",
+  "java/res/drawable-xhdpi/ic_dialer_not_found_red_40dp.png",
+  "java/res/drawable-xhdpi/ic_download_pause.png",
+  "java/res/drawable-xhdpi/ic_download_pending.png",
+  "java/res/drawable-xhdpi/ic_drag_handle_grey600_24dp.png",
+  "java/res/drawable-xhdpi/ic_drive_site_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_edit_24dp.png",
+  "java/res/drawable-xhdpi/ic_email_googblue_36dp.png",
+  "java/res/drawable-xhdpi/ic_error_grey800_24dp_filled.png",
+  "java/res/drawable-xhdpi/ic_error_outline_googblue_24dp.png",
+  "java/res/drawable-xhdpi/ic_error_outline_red_24dp.png",
+  "java/res/drawable-xhdpi/ic_error_white_24dp_filled.png",
+  "java/res/drawable-xhdpi/ic_event_googblue_36dp.png",
+  "java/res/drawable-xhdpi/ic_exit_to_app_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_fast_forward_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_file_download_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_folder_blue_24dp.png",
+  "java/res/drawable-xhdpi/ic_history_googblue_24dp.png",
+  "java/res/drawable-xhdpi/ic_link_grey600_36dp.png",
+  "java/res/drawable-xhdpi/ic_logo_googleg_24dp.png",
+  "java/res/drawable-xhdpi/ic_mobile_friendly_grey600_24dp.png",
+  "java/res/drawable-xhdpi/ic_most_visited_placeholder.png",
+  "java/res/drawable-xhdpi/ic_pause_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_pause_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_phone_googblue_36dp.png",
+  "java/res/drawable-xhdpi/ic_photo_camera.png",
+  "java/res/drawable-xhdpi/ic_place_googblue_36dp.png",
+  "java/res/drawable-xhdpi/ic_play_arrow_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_play_arrow_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_refresh_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_refresh_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_share_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_skip_next_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_skip_previous_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_stop_white_36dp.png",
+  "java/res/drawable-xhdpi/ic_suggestion_magnifier.png",
+  "java/res/drawable-xhdpi/ic_videocam_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_volume_up_grey600_24dp.png",
+  "java/res/drawable-xhdpi/ic_warning_white_24dp.png",
+  "java/res/drawable-xhdpi/ic_watch_later_24dp.png",
+  "java/res/drawable-xhdpi/incognito_simple.png",
+  "java/res/drawable-xhdpi/incognito_small.png",
+  "java/res/drawable-xhdpi/incognito_splash.png",
+  "java/res/drawable-xhdpi/incognito_switch.png",
+  "java/res/drawable-xhdpi/infobar_blocked_popups.png",
+  "java/res/drawable-xhdpi/infobar_chrome.png",
+  "java/res/drawable-xhdpi/infobar_downloading.png",
+  "java/res/drawable-xhdpi/infobar_mobile_friendly.png",
+  "java/res/drawable-xhdpi/infobar_restore.png",
+  "java/res/drawable-xhdpi/infobar_screen_share.png",
+  "java/res/drawable-xhdpi/infobar_translate.png",
+  "java/res/drawable-xhdpi/infobar_translate_compact.png",
+  "java/res/drawable-xhdpi/jcb_card.png",
+  "java/res/drawable-xhdpi/location_bar_incognito_badge.png",
+  "java/res/drawable-xhdpi/logo_card_back.png",
+  "java/res/drawable-xhdpi/mc_card.png",
+  "java/res/drawable-xhdpi/menu_update.png",
+  "java/res/drawable-xhdpi/modern_location_bar.9.png",
+  "java/res/drawable-xhdpi/modern_toolbar_shadow.png",
+  "java/res/drawable-xhdpi/offline_pin.png",
+  "java/res/drawable-xhdpi/open_in_new_tab.png",
+  "java/res/drawable-xhdpi/overlay_side_shadow.9.png",
+  "java/res/drawable-xhdpi/pageinfo_bad.png",
+  "java/res/drawable-xhdpi/pageinfo_good.png",
+  "java/res/drawable-xhdpi/pageinfo_warning.png",
+  "java/res/drawable-xhdpi/permission_background_sync.png",
+  "java/res/drawable-xhdpi/permission_javascript.png",
+  "java/res/drawable-xhdpi/permission_mic.png",
+  "java/res/drawable-xhdpi/permission_midi.png",
+  "java/res/drawable-xhdpi/permission_popups.png",
+  "java/res/drawable-xhdpi/permission_protected_media.png",
+  "java/res/drawable-xhdpi/permission_push_notification.png",
+  "java/res/drawable-xhdpi/permission_push_notification_off.png",
+  "java/res/drawable-xhdpi/plus.png",
+  "java/res/drawable-xhdpi/popup_bg_bottom.9.png",
+  "java/res/drawable-xhdpi/preview_pin_round.png",
+  "java/res/drawable-xhdpi/print.png",
+  "java/res/drawable-xhdpi/progress_bar_background.9.png",
+  "java/res/drawable-xhdpi/progress_bar_foreground.9.png",
+  "java/res/drawable-xhdpi/qr_code.png",
+  "java/res/drawable-xhdpi/reader_mode_prefs_icon.png",
+  "java/res/drawable-xhdpi/sad_tab.png",
+  "java/res/drawable-xhdpi/safetytip_shield.png",
+  "java/res/drawable-xhdpi/screenshot.png",
+  "java/res/drawable-xhdpi/send_tab.png",
+  "java/res/drawable-xhdpi/settings_all_sites.png",
+  "java/res/drawable-xhdpi/settings_cog.png",
+  "java/res/drawable-xhdpi/settings_sensors.png",
+  "java/res/drawable-xhdpi/settings_storage.png",
+  "java/res/drawable-xhdpi/settings_usb.png",
+  "java/res/drawable-xhdpi/shared_clipboard_40dp.png",
+  "java/res/drawable-xhdpi/sharing_more.png",
+  "java/res/drawable-xhdpi/shortcut_incognito.png",
+  "java/res/drawable-xhdpi/shortcut_newtab.png",
+  "java/res/drawable-xhdpi/spinner.png",
+  "java/res/drawable-xhdpi/spinner_white.png",
+  "java/res/drawable-xhdpi/star_gray.png",
+  "java/res/drawable-xhdpi/star_green.png",
+  "java/res/drawable-xhdpi/tab_strip_fade.png",
+  "java/res/drawable-xhdpi/tab_strip_fade_for_model_selector.png",
+  "java/res/drawable-xhdpi/tabswitcher_border_frame.9.png",
+  "java/res/drawable-xhdpi/tabswitcher_border_frame_decoration.9.png",
+  "java/res/drawable-xhdpi/tabswitcher_border_frame_inner_shadow.9.png",
+  "java/res/drawable-xhdpi/tabswitcher_border_frame_shadow.9.png",
+  "java/res/drawable-xhdpi/toolbar_shadow_focused.png",
+  "java/res/drawable-xhdpi/toolbar_shadow_normal.png",
+  "java/res/drawable-xhdpi/top_round.9.png",
+  "java/res/drawable-xhdpi/unionpay_card.png",
+  "java/res/drawable-xhdpi/verify_checkmark.png",
+  "java/res/drawable-xhdpi/web_asset.png",
+  "java/res/drawable-xhdpi/webrtc_audio.png",
+  "java/res/drawable-xhdpi/webrtc_video.png",
+  "java/res/drawable-xxhdpi-v21/navigation_bubble_shadow.9.png",
+  "java/res/drawable-xxhdpi/amex_card.png",
+  "java/res/drawable-xxhdpi/audio_playing.png",
+  "java/res/drawable-xxhdpi/audio_playing_square.png",
+  "java/res/drawable-xxhdpi/badge_update_dark.png",
+  "java/res/drawable-xxhdpi/badge_update_light.png",
+  "java/res/drawable-xxhdpi/bg_tabstrip_background_tab_outline.9.png",
+  "java/res/drawable-xxhdpi/bg_tabstrip_tab.9.png",
+  "java/res/drawable-xxhdpi/bookmark_check_gray.png",
+  "java/res/drawable-xxhdpi/bookmark_edit_active.png",
+  "java/res/drawable-xxhdpi/bookmark_move_active.png",
+  "java/res/drawable-xxhdpi/breadcrumb_arrow.png",
+  "java/res/drawable-xxhdpi/btn_close_white.png",
+  "java/res/drawable-xxhdpi/btn_left.png",
+  "java/res/drawable-xxhdpi/btn_mic.png",
+  "java/res/drawable-xxhdpi/btn_normal_tabs.png",
+  "java/res/drawable-xxhdpi/btn_right.png",
+  "java/res/drawable-xxhdpi/btn_star.png",
+  "java/res/drawable-xxhdpi/btn_star_filled.png",
+  "java/res/drawable-xxhdpi/btn_suggestion_refine.png",
+  "java/res/drawable-xxhdpi/btn_tab_close_normal.png",
+  "java/res/drawable-xxhdpi/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-xxhdpi/btn_tabstrip_new_tab_normal.png",
+  "java/res/drawable-xxhdpi/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-xxhdpi/btn_tabstrip_switch_normal.png",
+  "java/res/drawable-xxhdpi/btn_tabswitcher_modern.png",
+  "java/res/drawable-xxhdpi/btn_toolbar_home.png",
+  "java/res/drawable-xxhdpi/btn_toolbar_reload.png",
+  "java/res/drawable-xxhdpi/chrome_sync_logo.png",
+  "java/res/drawable-xxhdpi/contextual_search_bar_background.9.png",
+  "java/res/drawable-xxhdpi/contextual_search_promo_ripple.9.png",
+  "java/res/drawable-xxhdpi/cvc_icon.png",
+  "java/res/drawable-xxhdpi/cvc_icon_amex.png",
+  "java/res/drawable-xxhdpi/data_reduction_breakdown_sort_arrow.png",
+  "java/res/drawable-xxhdpi/diners_card.png",
+  "java/res/drawable-xxhdpi/down_arrow.png",
+  "java/res/drawable-xxhdpi/google_logo.png",
+  "java/res/drawable-xxhdpi/google_play.png",
+  "java/res/drawable-xxhdpi/help_outline.png",
+  "java/res/drawable-xxhdpi/ic_account_child_20dp.png",
+  "java/res/drawable-xxhdpi/ic_bluetooth_searching_black_24dp.png",
+  "java/res/drawable-xxhdpi/ic_chrome.png",
+  "java/res/drawable-xxhdpi/ic_close_all_tabs.png",
+  "java/res/drawable-xxhdpi/ic_content_paste_grey600_24dp.png",
+  "java/res/drawable-xxhdpi/ic_delete_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_devices_16dp.png",
+  "java/res/drawable-xxhdpi/ic_devices_48dp.png",
+  "java/res/drawable-xxhdpi/ic_dialer_icon_blue_40dp.png",
+  "java/res/drawable-xxhdpi/ic_dialer_not_found_red_40dp.png",
+  "java/res/drawable-xxhdpi/ic_download_pause.png",
+  "java/res/drawable-xxhdpi/ic_download_pending.png",
+  "java/res/drawable-xxhdpi/ic_drag_handle_grey600_24dp.png",
+  "java/res/drawable-xxhdpi/ic_drive_site_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_edit_24dp.png",
+  "java/res/drawable-xxhdpi/ic_email_googblue_36dp.png",
+  "java/res/drawable-xxhdpi/ic_error_grey800_24dp_filled.png",
+  "java/res/drawable-xxhdpi/ic_error_outline_googblue_24dp.png",
+  "java/res/drawable-xxhdpi/ic_error_outline_red_24dp.png",
+  "java/res/drawable-xxhdpi/ic_error_white_24dp_filled.png",
+  "java/res/drawable-xxhdpi/ic_event_googblue_36dp.png",
+  "java/res/drawable-xxhdpi/ic_exit_to_app_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_file_download_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_folder_blue_24dp.png",
+  "java/res/drawable-xxhdpi/ic_history_googblue_24dp.png",
+  "java/res/drawable-xxhdpi/ic_link_grey600_36dp.png",
+  "java/res/drawable-xxhdpi/ic_logo_googleg_24dp.png",
+  "java/res/drawable-xxhdpi/ic_mobile_friendly_grey600_24dp.png",
+  "java/res/drawable-xxhdpi/ic_most_visited_placeholder.png",
+  "java/res/drawable-xxhdpi/ic_pause_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_pause_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_phone_googblue_36dp.png",
+  "java/res/drawable-xxhdpi/ic_photo_camera.png",
+  "java/res/drawable-xxhdpi/ic_place_googblue_36dp.png",
+  "java/res/drawable-xxhdpi/ic_play_arrow_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_play_arrow_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_refresh_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_refresh_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_share_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_skip_next_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_skip_previous_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_stop_white_36dp.png",
+  "java/res/drawable-xxhdpi/ic_suggestion_magnifier.png",
+  "java/res/drawable-xxhdpi/ic_videocam_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_volume_up_grey600_24dp.png",
+  "java/res/drawable-xxhdpi/ic_warning_white_24dp.png",
+  "java/res/drawable-xxhdpi/ic_watch_later_24dp.png",
+  "java/res/drawable-xxhdpi/incognito_simple.png",
+  "java/res/drawable-xxhdpi/incognito_small.png",
+  "java/res/drawable-xxhdpi/incognito_splash.png",
+  "java/res/drawable-xxhdpi/incognito_switch.png",
+  "java/res/drawable-xxhdpi/infobar_blocked_popups.png",
+  "java/res/drawable-xxhdpi/infobar_chrome.png",
+  "java/res/drawable-xxhdpi/infobar_downloading.png",
+  "java/res/drawable-xxhdpi/infobar_mobile_friendly.png",
+  "java/res/drawable-xxhdpi/infobar_restore.png",
+  "java/res/drawable-xxhdpi/infobar_screen_share.png",
+  "java/res/drawable-xxhdpi/infobar_translate.png",
+  "java/res/drawable-xxhdpi/infobar_translate_compact.png",
+  "java/res/drawable-xxhdpi/jcb_card.png",
+  "java/res/drawable-xxhdpi/location_bar_incognito_badge.png",
+  "java/res/drawable-xxhdpi/mc_card.png",
+  "java/res/drawable-xxhdpi/menu_update.png",
+  "java/res/drawable-xxhdpi/modern_location_bar.9.png",
+  "java/res/drawable-xxhdpi/modern_toolbar_shadow.png",
+  "java/res/drawable-xxhdpi/offline_pin.png",
+  "java/res/drawable-xxhdpi/open_in_new_tab.png",
+  "java/res/drawable-xxhdpi/overlay_side_shadow.9.png",
+  "java/res/drawable-xxhdpi/pageinfo_bad.png",
+  "java/res/drawable-xxhdpi/pageinfo_good.png",
+  "java/res/drawable-xxhdpi/pageinfo_warning.png",
+  "java/res/drawable-xxhdpi/permission_background_sync.png",
+  "java/res/drawable-xxhdpi/permission_javascript.png",
+  "java/res/drawable-xxhdpi/permission_mic.png",
+  "java/res/drawable-xxhdpi/permission_midi.png",
+  "java/res/drawable-xxhdpi/permission_popups.png",
+  "java/res/drawable-xxhdpi/permission_protected_media.png",
+  "java/res/drawable-xxhdpi/permission_push_notification.png",
+  "java/res/drawable-xxhdpi/permission_push_notification_off.png",
+  "java/res/drawable-xxhdpi/plus.png",
+  "java/res/drawable-xxhdpi/popup_bg_bottom.9.png",
+  "java/res/drawable-xxhdpi/preview_pin_round.png",
+  "java/res/drawable-xxhdpi/print.png",
+  "java/res/drawable-xxhdpi/progress_bar_background.9.png",
+  "java/res/drawable-xxhdpi/progress_bar_foreground.9.png",
+  "java/res/drawable-xxhdpi/qr_code.png",
+  "java/res/drawable-xxhdpi/reader_mode_prefs_icon.png",
+  "java/res/drawable-xxhdpi/sad_tab.png",
+  "java/res/drawable-xxhdpi/safetytip_shield.png",
+  "java/res/drawable-xxhdpi/screenshot.png",
+  "java/res/drawable-xxhdpi/send_tab.png",
+  "java/res/drawable-xxhdpi/settings_all_sites.png",
+  "java/res/drawable-xxhdpi/settings_cog.png",
+  "java/res/drawable-xxhdpi/settings_sensors.png",
+  "java/res/drawable-xxhdpi/settings_storage.png",
+  "java/res/drawable-xxhdpi/settings_usb.png",
+  "java/res/drawable-xxhdpi/shared_clipboard_40dp.png",
+  "java/res/drawable-xxhdpi/sharing_more.png",
+  "java/res/drawable-xxhdpi/shortcut_incognito.png",
+  "java/res/drawable-xxhdpi/shortcut_newtab.png",
+  "java/res/drawable-xxhdpi/spinner.png",
+  "java/res/drawable-xxhdpi/spinner_white.png",
+  "java/res/drawable-xxhdpi/star_gray.png",
+  "java/res/drawable-xxhdpi/star_green.png",
+  "java/res/drawable-xxhdpi/tab_strip_fade.png",
+  "java/res/drawable-xxhdpi/tab_strip_fade_for_model_selector.png",
+  "java/res/drawable-xxhdpi/tabswitcher_border_frame.9.png",
+  "java/res/drawable-xxhdpi/tabswitcher_border_frame_decoration.9.png",
+  "java/res/drawable-xxhdpi/tabswitcher_border_frame_inner_shadow.9.png",
+  "java/res/drawable-xxhdpi/tabswitcher_border_frame_shadow.9.png",
+  "java/res/drawable-xxhdpi/toolbar_shadow_focused.png",
+  "java/res/drawable-xxhdpi/toolbar_shadow_normal.png",
+  "java/res/drawable-xxhdpi/top_round.9.png",
+  "java/res/drawable-xxhdpi/unionpay_card.png",
+  "java/res/drawable-xxhdpi/verify_checkmark.png",
+  "java/res/drawable-xxhdpi/web_asset.png",
+  "java/res/drawable-xxhdpi/webrtc_audio.png",
+  "java/res/drawable-xxhdpi/webrtc_video.png",
+  "java/res/drawable-xxxhdpi-v21/navigation_bubble_shadow.9.png",
+  "java/res/drawable-xxxhdpi/amex_card.png",
+  "java/res/drawable-xxxhdpi/audio_playing.png",
+  "java/res/drawable-xxxhdpi/audio_playing_square.png",
+  "java/res/drawable-xxxhdpi/badge_update_dark.png",
+  "java/res/drawable-xxxhdpi/badge_update_light.png",
+  "java/res/drawable-xxxhdpi/bg_tabstrip_background_tab_outline.9.png",
+  "java/res/drawable-xxxhdpi/bg_tabstrip_tab.9.png",
+  "java/res/drawable-xxxhdpi/bookmark_check_gray.png",
+  "java/res/drawable-xxxhdpi/bookmark_edit_active.png",
+  "java/res/drawable-xxxhdpi/bookmark_move_active.png",
+  "java/res/drawable-xxxhdpi/breadcrumb_arrow.png",
+  "java/res/drawable-xxxhdpi/btn_close_white.png",
+  "java/res/drawable-xxxhdpi/btn_left.png",
+  "java/res/drawable-xxxhdpi/btn_mic.png",
+  "java/res/drawable-xxxhdpi/btn_normal_tabs.png",
+  "java/res/drawable-xxxhdpi/btn_right.png",
+  "java/res/drawable-xxxhdpi/btn_star.png",
+  "java/res/drawable-xxxhdpi/btn_star_filled.png",
+  "java/res/drawable-xxxhdpi/btn_suggestion_refine.png",
+  "java/res/drawable-xxxhdpi/btn_tab_close_normal.png",
+  "java/res/drawable-xxxhdpi/btn_tabstrip_new_incognito_tab_normal.png",
+  "java/res/drawable-xxxhdpi/btn_tabstrip_new_tab_normal.png",
+  "java/res/drawable-xxxhdpi/btn_tabstrip_new_tab_pressed.png",
+  "java/res/drawable-xxxhdpi/btn_tabstrip_switch_normal.png",
+  "java/res/drawable-xxxhdpi/btn_tabswitcher_modern.png",
+  "java/res/drawable-xxxhdpi/btn_toolbar_home.png",
+  "java/res/drawable-xxxhdpi/btn_toolbar_reload.png",
+  "java/res/drawable-xxxhdpi/chrome_sync_logo.png",
+  "java/res/drawable-xxxhdpi/contextual_search_bar_background.9.png",
+  "java/res/drawable-xxxhdpi/contextual_search_promo_ripple.9.png",
+  "java/res/drawable-xxxhdpi/cvc_icon.png",
+  "java/res/drawable-xxxhdpi/cvc_icon_amex.png",
+  "java/res/drawable-xxxhdpi/data_reduction_breakdown_sort_arrow.png",
+  "java/res/drawable-xxxhdpi/diners_card.png",
+  "java/res/drawable-xxxhdpi/down_arrow.png",
+  "java/res/drawable-xxxhdpi/google_logo.png",
+  "java/res/drawable-xxxhdpi/google_play.png",
+  "java/res/drawable-xxxhdpi/help_outline.png",
+  "java/res/drawable-xxxhdpi/ic_account_child_20dp.png",
+  "java/res/drawable-xxxhdpi/ic_bluetooth_searching_black_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_chrome.png",
+  "java/res/drawable-xxxhdpi/ic_close_all_tabs.png",
+  "java/res/drawable-xxxhdpi/ic_content_paste_grey600_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_delete_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_devices_16dp.png",
+  "java/res/drawable-xxxhdpi/ic_devices_48dp.png",
+  "java/res/drawable-xxxhdpi/ic_dialer_icon_blue_40dp.png",
+  "java/res/drawable-xxxhdpi/ic_dialer_not_found_red_40dp.png",
+  "java/res/drawable-xxxhdpi/ic_drag_handle_grey600_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_drive_site_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_edit_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_email_googblue_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_error_grey800_24dp_filled.png",
+  "java/res/drawable-xxxhdpi/ic_error_outline_googblue_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_error_outline_red_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_error_white_24dp_filled.png",
+  "java/res/drawable-xxxhdpi/ic_event_googblue_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_exit_to_app_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_fast_forward_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_fast_rewind_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_file_download_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_folder_blue_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_history_googblue_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_link_grey600_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_logo_googleg_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_mobile_friendly_grey600_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_most_visited_placeholder.png",
+  "java/res/drawable-xxxhdpi/ic_pause_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_pause_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_phone_googblue_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_photo_camera.png",
+  "java/res/drawable-xxxhdpi/ic_place_googblue_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_play_arrow_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_play_arrow_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_refresh_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_refresh_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_share_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_skip_next_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_skip_previous_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_stop_white_36dp.png",
+  "java/res/drawable-xxxhdpi/ic_suggestion_magnifier.png",
+  "java/res/drawable-xxxhdpi/ic_videocam_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_volume_up_grey600_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_warning_white_24dp.png",
+  "java/res/drawable-xxxhdpi/ic_watch_later_24dp.png",
+  "java/res/drawable-xxxhdpi/incognito_simple.png",
+  "java/res/drawable-xxxhdpi/incognito_small.png",
+  "java/res/drawable-xxxhdpi/incognito_splash.png",
+  "java/res/drawable-xxxhdpi/incognito_switch.png",
+  "java/res/drawable-xxxhdpi/infobar_blocked_popups.png",
+  "java/res/drawable-xxxhdpi/infobar_chrome.png",
+  "java/res/drawable-xxxhdpi/infobar_downloading.png",
+  "java/res/drawable-xxxhdpi/infobar_mobile_friendly.png",
+  "java/res/drawable-xxxhdpi/infobar_restore.png",
+  "java/res/drawable-xxxhdpi/infobar_screen_share.png",
+  "java/res/drawable-xxxhdpi/infobar_translate.png",
+  "java/res/drawable-xxxhdpi/infobar_translate_compact.png",
+  "java/res/drawable-xxxhdpi/jcb_card.png",
+  "java/res/drawable-xxxhdpi/location_bar_incognito_badge.png",
+  "java/res/drawable-xxxhdpi/mc_card.png",
+  "java/res/drawable-xxxhdpi/menu_update.png",
+  "java/res/drawable-xxxhdpi/offline_pin.png",
+  "java/res/drawable-xxxhdpi/open_in_new_tab.png",
+  "java/res/drawable-xxxhdpi/overlay_side_shadow.9.png",
+  "java/res/drawable-xxxhdpi/pageinfo_bad.png",
+  "java/res/drawable-xxxhdpi/pageinfo_good.png",
+  "java/res/drawable-xxxhdpi/pageinfo_warning.png",
+  "java/res/drawable-xxxhdpi/permission_background_sync.png",
+  "java/res/drawable-xxxhdpi/permission_javascript.png",
+  "java/res/drawable-xxxhdpi/permission_mic.png",
+  "java/res/drawable-xxxhdpi/permission_midi.png",
+  "java/res/drawable-xxxhdpi/permission_popups.png",
+  "java/res/drawable-xxxhdpi/permission_protected_media.png",
+  "java/res/drawable-xxxhdpi/permission_push_notification.png",
+  "java/res/drawable-xxxhdpi/permission_push_notification_off.png",
+  "java/res/drawable-xxxhdpi/plus.png",
+  "java/res/drawable-xxxhdpi/popup_bg_bottom.9.png",
+  "java/res/drawable-xxxhdpi/preview_pin_round.png",
+  "java/res/drawable-xxxhdpi/print.png",
+  "java/res/drawable-xxxhdpi/progress_bar_background.9.png",
+  "java/res/drawable-xxxhdpi/progress_bar_foreground.9.png",
+  "java/res/drawable-xxxhdpi/qr_code.png",
+  "java/res/drawable-xxxhdpi/sad_tab.png",
+  "java/res/drawable-xxxhdpi/safetytip_shield.png",
+  "java/res/drawable-xxxhdpi/screenshot.png",
+  "java/res/drawable-xxxhdpi/send_tab.png",
+  "java/res/drawable-xxxhdpi/settings_all_sites.png",
+  "java/res/drawable-xxxhdpi/settings_cog.png",
+  "java/res/drawable-xxxhdpi/settings_sensors.png",
+  "java/res/drawable-xxxhdpi/settings_storage.png",
+  "java/res/drawable-xxxhdpi/settings_usb.png",
+  "java/res/drawable-xxxhdpi/shared_clipboard_40dp.png",
+  "java/res/drawable-xxxhdpi/sharing_more.png",
+  "java/res/drawable-xxxhdpi/shortcut_incognito.png",
+  "java/res/drawable-xxxhdpi/shortcut_newtab.png",
+  "java/res/drawable-xxxhdpi/spinner.png",
+  "java/res/drawable-xxxhdpi/spinner_white.png",
+  "java/res/drawable-xxxhdpi/star_gray.png",
+  "java/res/drawable-xxxhdpi/star_green.png",
+  "java/res/drawable-xxxhdpi/tab_strip_fade.png",
+  "java/res/drawable-xxxhdpi/tab_strip_fade_for_model_selector.png",
+  "java/res/drawable-xxxhdpi/tabswitcher_border_frame.9.png",
+  "java/res/drawable-xxxhdpi/tabswitcher_border_frame_decoration.9.png",
+  "java/res/drawable-xxxhdpi/tabswitcher_border_frame_inner_shadow.9.png",
+  "java/res/drawable-xxxhdpi/tabswitcher_border_frame_shadow.9.png",
+  "java/res/drawable-xxxhdpi/toolbar_shadow_focused.png",
+  "java/res/drawable-xxxhdpi/toolbar_shadow_normal.png",
+  "java/res/drawable-xxxhdpi/top_round.9.png",
+  "java/res/drawable-xxxhdpi/unionpay_card.png",
+  "java/res/drawable-xxxhdpi/verify_checkmark.png",
+  "java/res/drawable-xxxhdpi/web_asset.png",
+  "java/res/drawable-xxxhdpi/webrtc_audio.png",
+  "java/res/drawable-xxxhdpi/webrtc_video.png",
+  "java/res/drawable/accessibility_tab_switcher_divider.xml",
+  "java/res/drawable/account_picker_background.xml",
+  "java/res/drawable/action_bar_activity_bg.xml",
+  "java/res/drawable/address.xml",
+  "java/res/drawable/bg_white_dialog.xml",
+  "java/res/drawable/bookmark_title_bar_shadow.xml",
+  "java/res/drawable/bookmark_widget_list_selector.xml",
+  "java/res/drawable/btn_back.xml",
+  "java/res/drawable/btn_bg_holo.xml",
+  "java/res/drawable/btn_bg_holo_active.xml",
+  "java/res/drawable/btn_forward.xml",
+  "java/res/drawable/btn_reload_stop.xml",
+  "java/res/drawable/button_compat_shape.xml",
+  "java/res/drawable/checkerboard_background.xml",
+  "java/res/drawable/checkmark_blue.xml",
+  "java/res/drawable/circle_white.xml",
+  "java/res/drawable/computer_black_24dp.xml",
+  "java/res/drawable/content_suggestions_card_corner_bottom.xml",
+  "java/res/drawable/content_suggestions_card_corner_top.xml",
+  "java/res/drawable/contextual_search_promo_background.xml",
+  "java/res/drawable/data_reduction_big.xml",
+  "java/res/drawable/data_reduction_illustration.xml",
+  "java/res/drawable/devices_black_24dp.xml",
+  "java/res/drawable/discover_card.xml",
+  "java/res/drawable/distilled_page_pref_background.xml",
+  "java/res/drawable/distilled_page_prefs_button_bg.xml",
+  "java/res/drawable/elo_card.xml",
+  "java/res/drawable/email.xml",
+  "java/res/drawable/explore_sites_dense_tile_background.xml",
+  "java/res/drawable/face.xml",
+  "java/res/drawable/file_picker_scrim.xml",
+  "java/res/drawable/google_pay.xml",
+  "java/res/drawable/google_pay_with_divider.xml",
+  "java/res/drawable/ic_add.xml",
+  "java/res/drawable/ic_add_circle_40dp.xml",
+  "java/res/drawable/ic_apps_blue_24dp.xml",
+  "java/res/drawable/ic_arrow_back_24dp.xml",
+  "java/res/drawable/ic_arrow_forward_blue_24dp.xml",
+  "java/res/drawable/ic_block_red.xml",
+  "java/res/drawable/ic_bluetooth_connected.xml",
+  "java/res/drawable/ic_book_round.xml",
+  "java/res/drawable/ic_cancel_circle.xml",
+  "java/res/drawable/ic_checkmark_24dp.xml",
+  "java/res/drawable/ic_cloud_offline_24dp.xml",
+  "java/res/drawable/ic_collections_grey.xml",
+  "java/res/drawable/ic_colorful_mic.xml",
+  "java/res/drawable/ic_content_copy_black.xml",
+  "java/res/drawable/ic_credit_card_black.xml",
+  "java/res/drawable/ic_done_googblue_36dp.xml",
+  "java/res/drawable/ic_drive_document_24dp.xml",
+  "java/res/drawable/ic_drive_document_36dp.xml",
+  "java/res/drawable/ic_drive_file_24dp.xml",
+  "java/res/drawable/ic_drive_file_36dp.xml",
+  "java/res/drawable/ic_drive_image_24dp.xml",
+  "java/res/drawable/ic_drive_image_36dp.xml",
+  "java/res/drawable/ic_equals_sign_round.xml",
+  "java/res/drawable/ic_error.xml",
+  "java/res/drawable/ic_error_googred_36dp.xml",
+  "java/res/drawable/ic_event_round.xml",
+  "java/res/drawable/ic_file_download_24dp.xml",
+  "java/res/drawable/ic_file_download_36dp.xml",
+  "java/res/drawable/ic_fingerprint_grey500_36dp.xml",
+  "java/res/drawable/ic_globe_24dp.xml",
+  "java/res/drawable/ic_globe_36dp.xml",
+  "java/res/drawable/ic_google_round.xml",
+  "java/res/drawable/ic_help_and_feedback.xml",
+  "java/res/drawable/ic_info_outline_grey.xml",
+  "java/res/drawable/ic_logo_googleg_20dp.xml",
+  "java/res/drawable/ic_loop_round.xml",
+  "java/res/drawable/ic_music_note_24dp.xml",
+  "java/res/drawable/ic_music_note_36dp.xml",
+  "java/res/drawable/ic_offline_pin_24dp_on_dark_bg.xml",
+  "java/res/drawable/ic_offline_pin_24dp_on_light_bg.xml",
+  "java/res/drawable/ic_offline_pin_blue_white.xml",
+  "java/res/drawable/ic_offline_pin_white.xml",
+  "java/res/drawable/ic_pause_circle_outline_white_24dp.xml",
+  "java/res/drawable/ic_person_add_24dp.xml",
+  "java/res/drawable/ic_photo_camera_black.xml",
+  "java/res/drawable/ic_photo_camera_grey.xml",
+  "java/res/drawable/ic_play_circle_filled_24dp_on_dark_bg.xml",
+  "java/res/drawable/ic_play_circle_filled_24dp_on_light_bg.xml",
+  "java/res/drawable/ic_play_circle_filled_white_24dp.xml",
+  "java/res/drawable/ic_settings_black.xml",
+  "java/res/drawable/ic_signal_cellular_0_bar.xml",
+  "java/res/drawable/ic_signal_cellular_1_bar.xml",
+  "java/res/drawable/ic_signal_cellular_2_bar.xml",
+  "java/res/drawable/ic_signal_cellular_3_bar.xml",
+  "java/res/drawable/ic_signal_cellular_4_bar.xml",
+  "java/res/drawable/ic_site_timer.xml",
+  "java/res/drawable/ic_swap_vert_round.xml",
+  "java/res/drawable/ic_sync_error_40dp.xml",
+  "java/res/drawable/ic_sync_green_40dp.xml",
+  "java/res/drawable/ic_tv_options_input_settings_rotated_grey.xml",
+  "java/res/drawable/ic_videocam_24dp.xml",
+  "java/res/drawable/ic_videocam_36dp.xml",
+  "java/res/drawable/ic_visibility_black.xml",
+  "java/res/drawable/ic_visibility_off_black.xml",
+  "java/res/drawable/ic_volume_off_white_24dp.xml",
+  "java/res/drawable/ic_volume_on_white_24dp.xml",
+  "java/res/drawable/ic_vpn_key_blue.xml",
+  "java/res/drawable/ic_vpn_key_grey.xml",
+  "java/res/drawable/ic_warning_red.xml",
+  "java/res/drawable/ic_wb_sunny_round.xml",
+  "java/res/drawable/incognito_switch_track.xml",
+  "java/res/drawable/infobar_autofill_cc.xml",
+  "java/res/drawable/infobar_download_complete.xml",
+  "java/res/drawable/infobar_download_complete_animation.xml",
+  "java/res/drawable/infobar_downloading_fill_animation.xml",
+  "java/res/drawable/infobar_downloading_sweep_animation.xml",
+  "java/res/drawable/infobar_wrapper_bg.xml",
+  "java/res/drawable/item_chooser_row_background.xml",
+  "java/res/drawable/list_divider_compat.xml",
+  "java/res/drawable/logo_avatar_anonymous.xml",
+  "java/res/drawable/logo_partly_cloudy.xml",
+  "java/res/drawable/logo_translate_round.xml",
+  "java/res/drawable/material_tooltip_background.xml",
+  "java/res/drawable/mir_card.xml",
+  "java/res/drawable/modern_toolbar_text_box_background_with_primary_color.xml",
+  "java/res/drawable/names.xml",
+  "java/res/drawable/new_tab_icon.xml",
+  "java/res/drawable/password_check_warning.xml",
+  "java/res/drawable/password_check_warning_dark_mode.xml",
+  "java/res/drawable/password_manager_onboarding_illustration01.xml",
+  "java/res/drawable/password_manager_onboarding_illustration01_dark_mode.xml",
+  "java/res/drawable/password_manager_onboarding_illustration02.xml",
+  "java/res/drawable/password_manager_onboarding_illustration02_dark_mode.xml",
+  "java/res/drawable/password_manager_onboarding_illustration03.xml",
+  "java/res/drawable/password_manager_onboarding_illustration03_dark_mode.xml",
+  "java/res/drawable/permission_location.xml",
+  "java/res/drawable/popup_bg_bottom_tinted.xml",
+  "java/res/drawable/rating_bar.xml",
+  "java/res/drawable/search_sogou.xml",
+  "java/res/drawable/shared_clipboard_zero_state_dark.xml",
+  "java/res/drawable/shared_clipboard_zero_state_light.xml",
+  "java/res/drawable/signin_header_animation.xml",
+  "java/res/drawable/smartphone_black_24dp.xml",
+  "java/res/drawable/store_locally_tooltip_background.xml",
+  "java/res/drawable/tab_indicator.xml",
+  "java/res/drawable/telephone.xml",
+  "java/res/drawable/thumbnail_gradient_top_left.xml",
+  "java/res/drawable/thumbnail_gradient_top_right.xml",
+  "java/res/drawable/tile_view_hairline_border_background.xml",
+  "java/res/drawable/tile_view_highlight.xml",
+  "java/res/drawable/tile_view_highlight_mask.xml",
+  "java/res/drawable/tile_view_highlight_plain.xml",
+  "java/res/drawable/tile_view_icon_background_modern.xml",
+  "java/res/drawable/toolbar_shadow.xml",
+  "java/res/drawable/video_player_gradient.xml",
+  "java/res/drawable/visa_card.xml",
+  "java/res/drawable/zoom_in.xml",
+  "java/res/drawable/zoom_out.xml",
+  "java/res/layout-sw360dp/preference_spinner_single_line.xml",
+  "java/res/layout-sw600dp/find_toolbar.xml",
+  "java/res/layout-sw600dp/location_bar.xml",
+  "java/res/layout-sw600dp/location_status_icon.xml",
+  "java/res/layout/accept_languages_item.xml",
+  "java/res/layout/accept_languages_list.xml",
+  "java/res/layout/accessibility_tab_switcher.xml",
+  "java/res/layout/accessibility_tab_switcher_list_item.xml",
+  "java/res/layout/account_chooser_dialog_item.xml",
+  "java/res/layout/account_chooser_dialog_title.xml",
+  "java/res/layout/account_management_account_row.xml",
+  "java/res/layout/account_picker_dialog_body.xml",
+  "java/res/layout/account_picker_new_account_row.xml",
+  "java/res/layout/account_picker_new_account_row_legacy.xml",
+  "java/res/layout/account_picker_row.xml",
+  "java/res/layout/account_picker_row_legacy.xml",
+  "java/res/layout/add_languages_main.xml",
+  "java/res/layout/add_site_dialog.xml",
+  "java/res/layout/add_to_homescreen_dialog.xml",
+  "java/res/layout/auto_sign_in_first_run_dialog.xml",
+  "java/res/layout/autofill_billing_address_dropdown.xml",
+  "java/res/layout/autofill_card_unmask_prompt.xml",
+  "java/res/layout/autofill_editor_base.xml",
+  "java/res/layout/autofill_editor_base_buttons.xml",
+  "java/res/layout/autofill_expiration_date_fix_flow.xml",
+  "java/res/layout/autofill_local_card_editor.xml",
+  "java/res/layout/autofill_name_fixflow.xml",
+  "java/res/layout/autofill_server_card_editor.xml",
+  "java/res/layout/autofill_server_data_edit_link.xml",
+  "java/res/layout/autofill_server_data_label.xml",
+  "java/res/layout/bluetooth_scanning_permission_dialog.xml",
+  "java/res/layout/bluetooth_scanning_permission_dialog_row.xml",
+  "java/res/layout/bookmark_action_bar.xml",
+  "java/res/layout/bookmark_add_edit_folder_activity.xml",
+  "java/res/layout/bookmark_edit.xml",
+  "java/res/layout/bookmark_folder_row.xml",
+  "java/res/layout/bookmark_folder_select_activity.xml",
+  "java/res/layout/bookmark_item_row.xml",
+  "java/res/layout/bookmark_main.xml",
+  "java/res/layout/bookmark_widget.xml",
+  "java/res/layout/bookmark_widget_icons_only.xml",
+  "java/res/layout/bookmark_widget_item.xml",
+  "java/res/layout/bottom_control_container.xml",
+  "java/res/layout/bottom_sheet.xml",
+  "java/res/layout/bottom_toolbar.xml",
+  "java/res/layout/bottom_toolbar_browsing.xml",
+  "java/res/layout/bottom_toolbar_menu_button.xml",
+  "java/res/layout/bottom_toolbar_tab_switcher.xml",
+  "java/res/layout/checkbox_layout.xml",
+  "java/res/layout/clear_browsing_data_tabs.xml",
+  "java/res/layout/clear_browsing_important_dialog_listview.xml",
+  "java/res/layout/clear_storage.xml",
+  "java/res/layout/compositor_view_holder.xml",
+  "java/res/layout/confirm_import_sync_data.xml",
+  "java/res/layout/confirm_important_sites_list_row.xml",
+  "java/res/layout/connection_info.xml",
+  "java/res/layout/contact_view.xml",
+  "java/res/layout/contacts_list_item_view.xml",
+  "java/res/layout/contacts_picker_dialog.xml",
+  "java/res/layout/contacts_picker_toolbar.xml",
+  "java/res/layout/content_suggestions_action_card_modern.xml",
+  "java/res/layout/content_suggestions_card_modern_reversed.xml",
+  "java/res/layout/content_suggestions_status_card_modern.xml",
+  "java/res/layout/contextual_search_bar_banner_text_view.xml",
+  "java/res/layout/contextual_search_caption_view.xml",
+  "java/res/layout/contextual_search_card_icon_view.xml",
+  "java/res/layout/contextual_search_context_view.xml",
+  "java/res/layout/contextual_search_promo_view.xml",
+  "java/res/layout/contextual_search_quick_action_icon_view.xml",
+  "java/res/layout/contextual_search_term_view.xml",
+  "java/res/layout/control_container.xml",
+  "java/res/layout/custom_preference.xml",
+  "java/res/layout/custom_tabs_bottombar.xml",
+  "java/res/layout/custom_tabs_bottombar_item.xml",
+  "java/res/layout/custom_tabs_control_container.xml",
+  "java/res/layout/custom_tabs_toolbar.xml",
+  "java/res/layout/custom_tabs_toolbar_button.xml",
+  "java/res/layout/custom_tabs_topbar.xml",
+  "java/res/layout/data_reduction_main_menu_item.xml",
+  "java/res/layout/data_reduction_stats_layout.xml",
+  "java/res/layout/data_usage_breakdown.xml",
+  "java/res/layout/data_usage_breakdown_row.xml",
+  "java/res/layout/data_usage_chart.xml",
+  "java/res/layout/date_divided_adapter_header_view_holder.xml",
+  "java/res/layout/date_view.xml",
+  "java/res/layout/default_search_engine_first_run_fragment.xml",
+  "java/res/layout/device_item_list.xml",
+  "java/res/layout/distilled_page_font_family_spinner.xml",
+  "java/res/layout/distilled_page_prefs_view.xml",
+  "java/res/layout/edit_url_suggestion_layout.xml",
+  "java/res/layout/editable_option_editor_footer.xml",
+  "java/res/layout/editable_option_editor_icons.xml",
+  "java/res/layout/empty_accessory_sheet.xml",
+  "java/res/layout/empty_background_view_tablet.xml",
+  "java/res/layout/experimental_explore_sites_category_tile_view.xml",
+  "java/res/layout/experimental_explore_sites_section.xml",
+  "java/res/layout/explore_sites_category_card_view.xml",
+  "java/res/layout/explore_sites_dense_category_card_view.xml",
+  "java/res/layout/explore_sites_dense_tile_bottom_view.xml",
+  "java/res/layout/explore_sites_dense_tile_right_view.xml",
+  "java/res/layout/explore_sites_loading_error_view.xml",
+  "java/res/layout/explore_sites_loading_from_net_view.xml",
+  "java/res/layout/explore_sites_page_layout.xml",
+  "java/res/layout/explore_sites_section.xml",
+  "java/res/layout/explore_sites_tile_view.xml",
+  "java/res/layout/fake_search_box_layout.xml",
+  "java/res/layout/find_in_page.xml",
+  "java/res/layout/find_toolbar.xml",
+  "java/res/layout/four_state_cookie_settings_preference.xml",
+  "java/res/layout/fre_data_reduction_proxy_lite_mode.xml",
+  "java/res/layout/fre_tosanduma.xml",
+  "java/res/layout/history_clear_browsing_data_header.xml",
+  "java/res/layout/history_item_view.xml",
+  "java/res/layout/history_main.xml",
+  "java/res/layout/history_privacy_disclaimer_header.xml",
+  "java/res/layout/history_toolbar.xml",
+  "java/res/layout/homepage_editor.xml",
+  "java/res/layout/http_auth_dialog.xml",
+  "java/res/layout/icon_row_menu_footer.xml",
+  "java/res/layout/incognito_description_layout.xml",
+  "java/res/layout/incognito_toggle_tabs.xml",
+  "java/res/layout/infobar_control_url_ellipsizer.xml",
+  "java/res/layout/infobar_translate_compact_content.xml",
+  "java/res/layout/infobar_translate_tab_content.xml",
+  "java/res/layout/item_chooser_dialog.xml",
+  "java/res/layout/item_chooser_dialog_row.xml",
+  "java/res/layout/language_ask_prompt_content.xml",
+  "java/res/layout/language_ask_prompt_row.xml",
+  "java/res/layout/language_ask_prompt_row_separator.xml",
+  "java/res/layout/languages_preference.xml",
+  "java/res/layout/lightweight_fre_tos.xml",
+  "java/res/layout/list_menu_button.xml",
+  "java/res/layout/list_selection_handle_view.xml",
+  "java/res/layout/location_bar.xml",
+  "java/res/layout/location_bar_base.xml",
+  "java/res/layout/location_status.xml",
+  "java/res/layout/location_status_icon.xml",
+  "java/res/layout/location_status_incognito_badge.xml",
+  "java/res/layout/main.xml",
+  "java/res/layout/manage_space_activity.xml",
+  "java/res/layout/material_tooltip.xml",
+  "java/res/layout/menu_button.xml",
+  "java/res/layout/multiline_spinner_item.xml",
+  "java/res/layout/navigation_bubble.xml",
+  "java/res/layout/navigation_popup_item.xml",
+  "java/res/layout/navigation_sheet.xml",
+  "java/res/layout/navigation_sheet_toolbar.xml",
+  "java/res/layout/new_tab_page_footer.xml",
+  "java/res/layout/new_tab_page_incognito.xml",
+  "java/res/layout/new_tab_page_layout.xml",
+  "java/res/layout/new_tab_page_offline_card.xml",
+  "java/res/layout/new_tab_page_progress_indicator.xml",
+  "java/res/layout/new_tab_page_snippets_expandable_header.xml",
+  "java/res/layout/new_tab_page_tile_grid_placeholder.xml",
+  "java/res/layout/new_tab_page_view.xml",
+  "java/res/layout/omnibox_answer_suggestion.xml",
+  "java/res/layout/omnibox_basic_suggestion.xml",
+  "java/res/layout/omnibox_entity_suggestion.xml",
+  "java/res/layout/omnibox_results_container.xml",
+  "java/res/layout/optional_toolbar_button.xml",
+  "java/res/layout/os_version_unsupported_preference.xml",
+  "java/res/layout/other_forms_of_history_dialog.xml",
+  "java/res/layout/passphrase_type_item.xml",
+  "java/res/layout/password_entry_editor.xml",
+  "java/res/layout/password_entry_exception.xml",
+  "java/res/layout/password_entry_viewer_copyable_row.xml",
+  "java/res/layout/password_entry_viewer_interactive.xml",
+  "java/res/layout/password_generation_dialog.xml",
+  "java/res/layout/password_generation_popup_explanation.xml",
+  "java/res/layout/password_manager_dialog.xml",
+  "java/res/layout/password_manager_dialog_with_help_button.xml",
+  "java/res/layout/password_no_result.xml",
+  "java/res/layout/passwords_error_dialog.xml",
+  "java/res/layout/passwords_progress_dialog.xml",
+  "java/res/layout/payment_handler_content.xml",
+  "java/res/layout/payment_minimal_ui_content.xml",
+  "java/res/layout/payment_minimal_ui_toolbar.xml",
+  "java/res/layout/payment_option_edit_icon.xml",
+  "java/res/layout/payment_request.xml",
+  "java/res/layout/payment_request_bottom_bar.xml",
+  "java/res/layout/payment_request_dropdown_item.xml",
+  "java/res/layout/payment_request_editor.xml",
+  "java/res/layout/payment_request_editor_dropdown.xml",
+  "java/res/layout/payment_request_editor_label.xml",
+  "java/res/layout/payment_request_header.xml",
+  "java/res/layout/payment_request_spinny.xml",
+  "java/res/layout/payments_request_editor_textview.xml",
+  "java/res/layout/personalized_signin_promo_view_body.xml",
+  "java/res/layout/personalized_signin_promo_view_bookmarks.xml",
+  "java/res/layout/personalized_signin_promo_view_header.xml",
+  "java/res/layout/personalized_signin_promo_view_modern_content_suggestions.xml",
+  "java/res/layout/personalized_signin_promo_view_recent_tabs.xml",
+  "java/res/layout/personalized_signin_promo_view_settings.xml",
+  "java/res/layout/photo_picker_bitmap_view.xml",
+  "java/res/layout/photo_picker_dialog.xml",
+  "java/res/layout/photo_picker_toolbar.xml",
+  "java/res/layout/powered_by_chrome_footer.xml",
+  "java/res/layout/preference_text_scale.xml",
+  "java/res/layout/radio_button_group_homepage_preference.xml",
+  "java/res/layout/radio_button_group_theme_preference.xml",
+  "java/res/layout/recent_tabs_group_item.xml",
+  "java/res/layout/recent_tabs_group_separator_invisible.xml",
+  "java/res/layout/recent_tabs_group_separator_visible.xml",
+  "java/res/layout/recent_tabs_list_item.xml",
+  "java/res/layout/recent_tabs_page.xml",
+  "java/res/layout/revamped_context_menu.xml",
+  "java/res/layout/revamped_context_menu_header.xml",
+  "java/res/layout/revamped_context_menu_row.xml",
+  "java/res/layout/revamped_context_menu_share_row.xml",
+  "java/res/layout/sad_tab.xml",
+  "java/res/layout/search_activity.xml",
+  "java/res/layout/search_engine.xml",
+  "java/res/layout/search_engine_recent_title.xml",
+  "java/res/layout/search_widget_template.xml",
+  "java/res/layout/send_tab_to_self_device_picker_item.xml",
+  "java/res/layout/send_tab_to_self_device_picker_list.xml",
+  "java/res/layout/send_tab_to_self_device_picker_toolbar.xml",
+  "java/res/layout/send_tab_to_self_feature_unavailable_prompt.xml",
+  "java/res/layout/settings_action_bar_shadow.xml",
+  "java/res/layout/share_dialog_item.xml",
+  "java/res/layout/share_sheet_content.xml",
+  "java/res/layout/share_sheet_item.xml",
+  "java/res/layout/sharing_device_picker.xml",
+  "java/res/layout/sheet_tab_toolbar.xml",
+  "java/res/layout/signin_activity.xml",
+  "java/res/layout/signin_progress_bar_dialog.xml",
+  "java/res/layout/signin_view.xml",
+  "java/res/layout/signout_wipe_storage_dialog.xml",
+  "java/res/layout/start_top_toolbar.xml",
+  "java/res/layout/status_indicator_container.xml",
+  "java/res/layout/storage_preferences_view.xml",
+  "java/res/layout/suggestions_site_tile_grid_modern.xml",
+  "java/res/layout/suggestions_tile_view.xml",
+  "java/res/layout/suggestions_tile_view_condensed.xml",
+  "java/res/layout/suspended_tab.xml",
+  "java/res/layout/sync_and_services_bottom_bar.xml",
+  "java/res/layout/sync_custom_passphrase.xml",
+  "java/res/layout/sync_enter_passphrase.xml",
+  "java/res/layout/sync_passphrase_types.xml",
+  "java/res/layout/sync_promo_view.xml",
+  "java/res/layout/tab_switcher_action_menu_layout.xml",
+  "java/res/layout/tab_switcher_toolbar.xml",
+  "java/res/layout/tile_no_text_view.xml",
+  "java/res/layout/tile_no_text_view_condensed.xml",
+  "java/res/layout/tile_view_modern.xml",
+  "java/res/layout/tile_view_modern_condensed.xml",
+  "java/res/layout/toolbar_phone.xml",
+  "java/res/layout/toolbar_space.xml",
+  "java/res/layout/toolbar_tablet.xml",
+  "java/res/layout/top_sites_tile_view.xml",
+  "java/res/layout/top_sites_tile_view_condensed.xml",
+  "java/res/layout/top_view.xml",
+  "java/res/layout/translate_menu_item.xml",
+  "java/res/layout/translate_menu_item_checked.xml",
+  "java/res/layout/tri_state_site_settings_preference.xml",
+  "java/res/layout/update_menu_item.xml",
+  "java/res/layout/updating_gms_progress_view.xml",
+  "java/res/layout/url_action_container.xml",
+  "java/res/layout/url_bar.xml",
+  "java/res/layout/video_player.xml",
+  "java/res/layout/web_notification.xml",
+  "java/res/layout/web_notification_big.xml",
+  "java/res/layout/web_notification_button.xml",
+  "java/res/layout/web_notification_icon_frame.xml",
+  "java/res/layout/web_notification_small_icon.xml",
+  "java/res/layout/website_features.xml",
+  "java/res/menu/bookmark_action_bar_menu.xml",
+  "java/res/menu/custom_tabs_menu.xml",
+  "java/res/menu/history_manager_menu.xml",
+  "java/res/menu/languages_action_bar_menu.xml",
+  "java/res/menu/main_menu.xml",
+  "java/res/menu/password_entry_editor_action_bar_menu.xml",
+  "java/res/menu/password_entry_viewer_action_bar_menu.xml",
+  "java/res/menu/prefeditor_editor_menu.xml",
+  "java/res/menu/save_password_preferences_action_bar_menu.xml",
+  "java/res/menu/website_preferences_menu.xml",
+  "java/res/mipmap-hdpi/shortcut_icon_shadow.png",
+  "java/res/mipmap-mdpi/shortcut_icon_shadow.png",
+  "java/res/mipmap-xhdpi/shortcut_icon_shadow.png",
+  "java/res/mipmap-xxhdpi/shortcut_icon_shadow.png",
+  "java/res/mipmap-xxxhdpi/shortcut_icon_shadow.png",
+  "java/res/transition/fade.xml",
+  "java/res/transition/move_image.xml",
+  "java/res/values-hdpi/dimens.xml",
+  "java/res/values-large/dimens.xml",
+  "java/res/values-ldrtl/values.xml",
+  "java/res/values-night/colors.xml",
+  "java/res/values-night/drawables.xml",
+  "java/res/values-night/values.xml",
+  "java/res/values-sw600dp-v17/styles.xml",
+  "java/res/values-sw600dp-v26/styles.xml",
+  "java/res/values-sw600dp-v27/styles.xml",
+  "java/res/values-sw600dp/colors.xml",
+  "java/res/values-sw600dp/dimens.xml",
+  "java/res/values-sw600dp/drawables.xml",
+  "java/res/values-sw600dp/values.xml",
+  "java/res/values-v19/values.xml",
+  "java/res/values-v21/styles.xml",
+  "java/res/values-v24/styles.xml",
+  "java/res/values-v25/styles.xml",
+  "java/res/values-v26/styles.xml",
+  "java/res/values-v27/styles.xml",
+  "java/res/values-v28/styles.xml",
+  "java/res/values-xhdpi/dimens.xml",
+  "java/res/values-xlarge/dimens.xml",
+  "java/res/values-xxhdpi/dimens.xml",
+  "java/res/values/attrs.xml",
+  "java/res/values/colors.xml",
+  "java/res/values/dimens.xml",
+  "java/res/values/drawables.xml",
+  "java/res/values/ic_launcher_alias.xml",
+  "java/res/values/ic_launcher_round_alias.xml",
+  "java/res/values/ids.xml",
+  "java/res/values/strings.xml",
+  "java/res/values/styles.xml",
+  "java/res/values/values.xml",
+  "java/res/xml/about_chrome_preferences.xml",
+  "java/res/xml/accessibility_preferences.xml",
+  "java/res/xml/account_management_preferences.xml",
+  "java/res/xml/autofill_server_profile_preferences.xml",
+  "java/res/xml/bookmark_widget_info.xml",
+  "java/res/xml/clear_browsing_data_button.xml",
+  "java/res/xml/clear_browsing_data_preferences_tab.xml",
+  "java/res/xml/contextual_search_preferences.xml",
+  "java/res/xml/contextual_search_tap_preferences.xml",
+  "java/res/xml/data_reduction_preferences.xml",
+  "java/res/xml/data_reduction_preferences_off_lite_mode.xml",
+  "java/res/xml/developer_preferences.xml",
+  "java/res/xml/do_not_track_preferences.xml",
+  "java/res/xml/download_preferences.xml",
+  "java/res/xml/homepage_preferences.xml",
+  "java/res/xml/languages_preferences.xml",
+  "java/res/xml/legal_information_preferences.xml",
+  "java/res/xml/main_preferences.xml",
+  "java/res/xml/manage_sync_preferences.xml",
+  "java/res/xml/network_security_config.xml",
+  "java/res/xml/notifications_preferences.xml",
+  "java/res/xml/privacy_preferences.xml",
+  "java/res/xml/search_widget_info.xml",
+  "java/res/xml/single_website_preferences.xml",
+  "java/res/xml/site_settings_preferences.xml",
+  "java/res/xml/sync_and_services_preferences.xml",
+  "java/res/xml/theme_preferences.xml",
+  "java/res/xml/tracing_preferences.xml",
+  "java/res/xml/website_preferences.xml",
+]
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index ac76225b..028a76f 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1771,6 +1771,7 @@
   "java/src/org/chromium/chrome/browser/vr/ArDelegateProvider.java",
   "java/src/org/chromium/chrome/browser/webapps/ActivateWebApkActivity.java",
   "java/src/org/chromium/chrome/browser/webapps/ActivityAssigner.java",
+  "java/src/org/chromium/chrome/browser/webapps/AddToHomescreenVerifier.java",
   "java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHost.java",
   "java/src/org/chromium/chrome/browser/webapps/ChromeWebApkHostSignature.java",
   "java/src/org/chromium/chrome/browser/webapps/GooglePlayWebApkInstallDelegate.java",
@@ -1807,9 +1808,11 @@
   "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java",
+  "java/src/org/chromium/chrome/browser/webapps/WebApkVerifier.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkVersionManager.java",
   "java/src/org/chromium/chrome/browser/webapps/WebDisplayMode.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java",
+  "java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappActivity.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappActivity0.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappActivity1.java",
@@ -1838,8 +1841,8 @@
   "java/src/org/chromium/chrome/browser/webapps/WebappLauncherActivity.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappManagedActivity.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java",
-  "java/src/org/chromium/chrome/browser/webapps/WebappScopePolicy.java",
   "java/src/org/chromium/chrome/browser/webapps/WebappSplashDelegate.java",
+  "java/src/org/chromium/chrome/browser/webapps/WebappVerifier.java",
   "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenCoordinator.java",
   "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenDialogView.java",
   "java/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenInstaller.java",
@@ -1852,6 +1855,8 @@
   "java/src/org/chromium/chrome/browser/webauth/AuthenticatorFactory.java",
   "java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java",
   "java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java",
+  "java/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequest.java",
+  "java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java",
   "java/src/org/chromium/chrome/browser/webauth/HandlerResponseCallback.java",
   "java/src/org/chromium/chrome/browser/webshare/BlobReceiver.java",
   "java/src/org/chromium/chrome/browser/webshare/ShareServiceImpl.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 8e39afd..4479c61 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -76,6 +76,7 @@
   "javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTestUtil.java",
   "javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionsTest.java",
   "javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java",
+  "javatests/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityCurrentPageVerifierTest.java",
   "javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridgeTest.java",
   "javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataTest.java",
@@ -522,8 +523,10 @@
   "javatests/src/org/chromium/chrome/browser/video/FullscreenVideoTest.java",
   "javatests/src/org/chromium/chrome/browser/video/VideoTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/ActivityAssignerTest.java",
+  "javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebApkActivityTestRule.java",
+  "javatests/src/org/chromium/chrome/browser/webapps/WebApkCurrentPageVerifierTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebApkIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcherTest.java",
@@ -540,6 +543,8 @@
   "javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenThemeColorTest.java",
   "javatests/src/org/chromium/chrome/browser/webapps/addtohomescreen/AddToHomescreenTest.java",
   "javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java",
+  "javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java",
+  "javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java",
   "javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java",
   "javatests/src/org/chromium/chrome/browser/widget/ScrimTest.java",
   "javatests/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetControllerTest.java",
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn
index ff383d6..aa37d9b 100644
--- a/chrome/android/features/autofill_assistant/BUILD.gn
+++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -46,7 +46,6 @@
     "//content/public/android:content_java",
     "//mojo/public/java:bindings_java",
     "//third_party/android_deps:android_arch_lifecycle_common_java",
-    "//third_party/android_deps:android_arch_lifecycle_runtime_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
     "//third_party/android_deps:androidx_collection_collection_java",
@@ -55,6 +54,7 @@
     "//third_party/android_deps:androidx_gridlayout_gridlayout_java",
     "//third_party/android_deps:androidx_legacy_legacy_support_core_ui_java",
     "//third_party/android_deps:androidx_legacy_legacy_support_core_utils_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_runtime_java",
     "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
     "//third_party/android_deps:com_google_android_material_material_java",
     "//third_party/blink/public/mojom:android_mojo_bindings_java",
diff --git a/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_payment_request_section_divider.xml b/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_payment_request_section_divider.xml
index 890addc8..26910bf 100644
--- a/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_payment_request_section_divider.xml
+++ b/chrome/android/features/autofill_assistant/java/res/layout/autofill_assistant_payment_request_section_divider.xml
@@ -3,11 +3,10 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<!-- TODO(b/144417635): Use @color/divider_line_bg_color once available. -->
 <View style="@style/HorizontalDivider"
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="1dp"
-      android:background="@color/divider_bg_color"
+      android:background="@color/divider_line_bg_color"
       android:layout_marginStart="@dimen/autofill_assistant_bottombar_horizontal_spacing"
       android:layout_marginEnd="@dimen/autofill_assistant_bottombar_horizontal_spacing"/>
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java
index 69c436d..5b7302b 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/user_data/AssistantCollectUserDataSection.java
@@ -244,9 +244,8 @@
                 mContext.getResources().getDimensionPixelSize(
                         R.dimen.autofill_assistant_payment_request_choice_list_padding_end),
                 verticalPadding);
-        // TODO(b/144417635): Change to omnibox_bg_color once available.
         list.setBackgroundColor(ApiCompatibilityUtils.getColor(
-                mContext.getResources(), R.color.default_bg_color_elev_0));
+                mContext.getResources(), R.color.omnibox_bg_color));
         list.setTag(AssistantTagsForTesting.COLLECT_USER_DATA_CHOICE_LIST);
         if (addButtonText != null) {
             list.setOnAddButtonClickedListener(() -> createOrEditItem(null));
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bs.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bs.xtb
index 13ee48ea..f4a930e3 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bs.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bs.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Podaci nedostaju</translation>
 <translation id="1932278019417741381">Radi lakšeg završavanja zadataka, Google će primati URL-ove i sadržaj web lokacija na kojima koristite Asistenta, kao i informacije koje pošaljete putem Asistenta. Ove informacije se mogu pohraniti na vaš Google račun. Možete isključiti Asistenta u postavkama Chromea. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Smanji vrijednost</translation>
-<translation id="3353437022146208653">Iznajmite automobil \n s Google Asistentom \n u svega nekoliko koraka.</translation>
+<translation id="3353437022146208653">Iznajmite automobil \n s Google Asistentom \n u svega nekoliko dodira.</translation>
 <translation id="4130750466177569591">Slažem se</translation>
 <translation id="4437727785356380473">Google Asistent u Chromeu je zatvoren.</translation>
 <translation id="4517854969512651305">Povećavanje vrijednosti</translation>
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">Nažalost, ne mogu vam pomoći. Nastavite sami.</translation>
 <translation id="7658239707568436148">Otkaži</translation>
 <translation id="8253702004019660079">Google Asistent u Chromeu.</translation>
-<translation id="8323517642730821247">Kupite karte za kino \n s Google Asistentom \n u svega nekoliko koraka.</translation>
+<translation id="8323517642730821247">Kupite karte za kino \n s Google Asistentom \n u svega nekoliko dodira.</translation>
 <translation id="945522503751344254">Slanje povratnih informacija</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
index b297815..8f362f8 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_cs.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Některé informace chybí</translation>
 <translation id="1932278019417741381">Abyste mohli provádět akce, Google bude dostávat adresy URL a obsah webů, ve kterých používáte Asistenta, a informace, které prostřednictvím Asistenta odesíláte. Tyto informace mohou být ukládány do vašeho účtu Google. Asistenta můžete vypnout v nastavení Chromu. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Snížit hodnotu</translation>
-<translation id="3353437022146208653">Použijte Asistenta Google \n a zapůjčete si vůz \n pouhými několika klepnutími.</translation>
+<translation id="3353437022146208653">Použijte Asistenta Google \n a půjčte si vůz \n na pár klepnutí.</translation>
 <translation id="4130750466177569591">Souhlasím</translation>
 <translation id="4437727785356380473">Asistent Google v Chromu byl zavřen.</translation>
 <translation id="4517854969512651305">Zvýšit hodnotu</translation>
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">Pardon, nedokážu vám pomoct. Je to na vás.</translation>
 <translation id="7658239707568436148">Zrušit</translation>
 <translation id="8253702004019660079">Asistent Google v Chromu.</translation>
-<translation id="8323517642730821247">Použijte Asistenta Google \n a kupte si lístky do kina \n pouhými několika klepnutími.</translation>
+<translation id="8323517642730821247">Použijte Asistenta Google \n a kupte si lístky do kina \n na pár klepnutí.</translation>
 <translation id="945522503751344254">Odeslat zpětnou vazbu</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb
index aa4013e..88ef1337 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Informazioa falta da</translation>
 <translation id="1932278019417741381">Zereginak osatzen laguntzeko, Laguntzailea eginbidearen bidez erabiltzen dituzun webguneen URLak eta edukia jasoko ditu Google-k, baita Laguntzailea erabilita bidaltzen duzun informazioa ere. Baliteke informazio hori Google-n duzun kontuan gordetzea. Laguntzailea desaktibatzeko, joan Chrome-ren ezarpenetara. <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Txikitu balioa</translation>
-<translation id="3353437022146208653">Alokatu auto bat \n Google-ren Laguntzaile eginbidearekin. \n Sakatze gutxi batzuk besterik ez dituzu egin beharko.</translation>
+<translation id="3353437022146208653">Alokatu auto bat \n Google-ren Laguntzailea eginbidearekin. \n Sakatze gutxi batzuk besterik ez dituzu beharko.</translation>
 <translation id="4130750466177569591">Ados nago</translation>
 <translation id="4437727785356380473">Itxi da Chrome-ko Google-ren Laguntzailea.</translation>
 <translation id="4517854969512651305">Handitu balioa</translation>
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">Barkatu, ezin dizut lagundu. Egin aurrera zeuk bakarrik.</translation>
 <translation id="7658239707568436148">Utzi</translation>
 <translation id="8253702004019660079">Chrome-ko Google-ren Laguntzailea.</translation>
-<translation id="8323517642730821247">Erosi zinemarako sarrerak \n Google-ren Laguntzailea eginbidearekin. \n Sakatze gutxi batzuk besterik ez dituzu egin beharko.</translation>
+<translation id="8323517642730821247">Erosi zinemarako sarrerak \n Google-ren Laguntzailea eginbidearekin. \n Sakatze gutxi batzuk besterik ez dituzu beharko.</translation>
 <translation id="945522503751344254">Bidali oharrak</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
index 05483bf..5fbf7643 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_hr.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Nedostaju podaci</translation>
 <translation id="1932278019417741381">Da bi vam pomogao sa zadacima, Google će primati URL-ove i sadržaje web-lokacija na kojima upotrebljavate Asistenta, kao i informacije koje šaljete putem Asistenta. Te se informacije mogu spremati na vaš Google račun. Asistenta možete isključiti u Chromeovim postavkama. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Smanjivanje vrijednosti</translation>
-<translation id="3353437022146208653">Najam automobila \n pomoću Google asistenta \n u samo nekoliko dodira.</translation>
+<translation id="3353437022146208653">Unajmite automobil \n pomoću Google asistenta \n u samo nekoliko dodira.</translation>
 <translation id="4130750466177569591">Slažem se</translation>
 <translation id="4437727785356380473">Zatvoren je Google asistent u Chromeu.</translation>
 <translation id="4517854969512651305">Povećavanje vrijednosti</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
index 82798e4..ba5e020 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_id.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Informasi tidak ada</translation>
 <translation id="1932278019417741381">Untuk membantu Anda menyelesaikan tugas, Google akan menerima URL dan konten situs tempat Anda menggunakan Asisten, serta informasi yang Anda kirimkan melalui Asisten. Informasi ini mungkin disimpan di Akun Google Anda. Anda dapat menonaktifkan Asisten di setelan Chrome. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Menurunkan nilai</translation>
-<translation id="3353437022146208653">Sewa mobil \n dengan Asisten Google \n hanya dalam beberapa kali ketuk.</translation>
+<translation id="3353437022146208653">Sewa mobil \n dengan Asisten Google \n cukup dengan beberapa kali ketuk.</translation>
 <translation id="4130750466177569591">Saya setuju</translation>
 <translation id="4437727785356380473">Asisten Google di Chrome ditutup.</translation>
 <translation id="4517854969512651305">Meningkatkan nilai</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb
index 65df615..2f8e7d5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ja.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">情報が不足しています</translation>
 <translation id="1932278019417741381">タスクを完了するため、アシスタントを使用したサイトの URL とコンテンツ、およびアシスタントで送信した情報が Google に送られます。この情報は、Google アカウントに保存される可能性があります。アシスタントは、Chrome の設定で無効にできます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">値を小さくします</translation>
-<translation id="3353437022146208653">Google アシスタントを使うと\n数回のタップで\nレンタカーの手続きが可能です。</translation>
+<translation id="3353437022146208653">Google アシスタントを使うと\n数回のタップで\nレンタカーを予約できます。</translation>
 <translation id="4130750466177569591">同意する</translation>
 <translation id="4437727785356380473">Chrome の Google アシスタントを終了しました。</translation>
 <translation id="4517854969512651305">値を大きくします</translation>
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">自動入力できません。残りの入力はご自身で行ってください。</translation>
 <translation id="7658239707568436148">キャンセル</translation>
 <translation id="8253702004019660079">Chrome の Google アシスタント。</translation>
-<translation id="8323517642730821247">Google アシスタントを使うと\n数回のタップで\n映画のチケット購入が可能です。</translation>
+<translation id="8323517642730821247">Google アシスタントを使うと\n数回のタップで\n映画のチケットを購入できます。</translation>
 <translation id="945522503751344254">フィードバックを送信</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb
index c8feae0..100471c7 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_kn.xtb
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">ಕ್ಷಮಿಸಿ, ನನ್ನಿಂದ ಸಹಾಯ ಮಾಡಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ, ನಿಮ್ಮ ವಿವೇಚನೆಗೆ ತಕ್ಕಂತೆ ಮುಂದುವರಿಸಿ.</translation>
 <translation id="7658239707568436148">ರದ್ದುಮಾಡಿ</translation>
 <translation id="8253702004019660079">Chrome ನಲ್ಲಿ Google ಅಸಿಸ್ಟೆಂಟ್.</translation>
-<translation id="8323517642730821247">Google Assistant ಬಳಸಿಕೊಂಡು \n ಕೆಲವೇ ಟ್ಯಾಪ್‌ಗಳ ಮೂಲಕ \n ಚಲನಚಿತ್ರದ ಟಿಕೇಟ್‌ಗಳನ್ನು ಖರೀದಿಸಿ.</translation>
+<translation id="8323517642730821247">Google Assistant ಬಳಸಿಕೊಂಡು \n ಕೆಲವೇ ಟ್ಯಾಪ್‌ಗಳ ಮೂಲಕ \n ಚಲನಚಿತ್ರದ ಟಿಕೆಟ್‌ಗಳನ್ನು ಖರೀದಿಸಿ.</translation>
 <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
index 1858112..3b1bbc5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">Извините, я ничем не могу помочь. Продолжите самостоятельно.</translation>
 <translation id="7658239707568436148">Отмена</translation>
 <translation id="8253702004019660079">Google Ассистент в Chrome</translation>
-<translation id="8323517642730821247">Купите билеты в кино\nс помощью Google Ассистента.\nПотребуется всего несколько нажатий.</translation>
+<translation id="8323517642730821247">Покупайте билеты в кино\nчерез Google Ассистента.\nЭто просто и удобно.</translation>
 <translation id="945522503751344254">Отправить отзыв</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
index 35b2dc48..3e97864b 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_sw.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Maelezo hayajakamilika</translation>
 <translation id="1932278019417741381">Ili tukusaidie ukamilishe majukumu, Google itapokea URL na maudhui ya tovuti ambako unatumia programu ya Mratibu na pia maelezo unayotuma kupitia programu ya Mratibu. Maelezo haya yanaweza kuhifadhiwa kwenye akaunti yako ya Google. Unaweza kuzima programu ya Mratibu katika mipangilio ya Chrome. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Punguza thamani</translation>
-<translation id="3353437022146208653">Kodisha gari \n ukitumia programu ya Mratibu wa Google \n kwa miguso michache tu.</translation>
+<translation id="3353437022146208653">Kodisha gari \n ukitumia programu ya Mratibu wa Google \n kwa kugusa mara chache tu.</translation>
 <translation id="4130750466177569591">Ninakubali</translation>
 <translation id="4437727785356380473">Imefunga Mratibu wa Google katika Chrome.</translation>
 <translation id="4517854969512651305">Ongeza thamani</translation>
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">Samahani, nimeshindwa kukusaidia, tafadhali endelea mwenyewe.</translation>
 <translation id="7658239707568436148">Ghairi</translation>
 <translation id="8253702004019660079">Programu ya Mratibu wa Google katika Chrome.</translation>
-<translation id="8323517642730821247">Nunua tiketi za filamu \n ukitumia programu ya Mratibu wa Google \n kwa miguso michache tu.</translation>
+<translation id="8323517642730821247">Nunua tiketi za filamu \n ukitumia programu ya Mratibu wa Google \n kwa kugusa mara chache tu.</translation>
 <translation id="945522503751344254">Tuma maoni</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ur.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ur.xtb
index 4c65219..d29e302 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ur.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ur.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">معلومات موجود نہیں ہے</translation>
 <translation id="1932278019417741381">‏ٹاسکس کو مکمل کرنے میں آپ کی مدد کرنے کے لیے، Google کو ان سائٹس کے URLs اور مواد موصول ہوں گے جن پر آپ اسسٹنٹ استعمال کرتے ہیں، نیز اسسٹنٹ کے ذریعے آپ کی جمع کروائی ہوئی معلومات بھی موصول ہوں گی۔ اس معلومات کو آپ کے Google اکاؤنٹ میں اسٹور کیا جا سکتا ہے۔ آپ Chrome کی ترتیبات میں اسسٹنٹ کو آف کر سکتے ہیں۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">قدر گھٹائیں</translation>
-<translation id="3353437022146208653">‏صرف چند تھپتھپاہٹوں میں Google اسسٹنٹ کے ساتھ ایک کار \n کرایہ پر لیں۔</translation>
+<translation id="3353437022146208653">‏صرف چند تھپتھپاہٹوں میں Google اسسٹنٹ کے ساتھ \n ایک کار کرایہ پر لیں۔</translation>
 <translation id="4130750466177569591">میں متفق ہوں</translation>
 <translation id="4437727785356380473">‏Chrome میں Google اسسٹنٹ بند ہو گئی ہے۔</translation>
 <translation id="4517854969512651305">قدر بڑھائیں</translation>
@@ -13,10 +13,10 @@
 <translation id="4952448020231702394">‏تلاش اور چیک آؤٹ جیسے ویب پر کارروائیاں مکمل کرنے میں آپ کی مدد کر کے Google اسسٹنٹ آپ کا وقت بچاتی ہے۔</translation>
 <translation id="5267269112080050255">‏Chrome میں Google اسسٹنٹ مکمل اونچائی پر کھلی ہے۔</translation>
 <translation id="6555233628095991027">‏Chrome میں Google اسسٹنٹ نصف اونچائی پر کھلی ہے۔</translation>
-<translation id="6620345200476149840">‏Chrome میں Google اسسٹنٹ \n آزمائیں</translation>
+<translation id="6620345200476149840">‏Chrome میں \n Google اسسٹنٹ آزمائیں</translation>
 <translation id="6973932557599545801">معذرت، میں مدد کرنے سے قاصر ہوں، براہ کرم اپنے طور پر جاری رکھیں۔</translation>
 <translation id="7658239707568436148">منسوخ کریں</translation>
 <translation id="8253702004019660079">‏Chrome میں Google اسسٹنٹ۔</translation>
-<translation id="8323517642730821247">‏صرف چند تھپتھپاہٹوں میں Google اسسٹنٹ \n کے ساتھ مووی ٹکٹس خریدیں۔</translation>
+<translation id="8323517642730821247">‏صرف چند تھپتھپاہٹوں میں Google اسسٹنٹ کے ساتھ \n مووی ٹکٹس خریدیں۔</translation>
 <translation id="945522503751344254">تاثرات بھیجیں</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb
index fab727e..4e4764a 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb
@@ -5,7 +5,7 @@
 <translation id="1699570257714336246">Axborot butunlay kiritilmadi</translation>
 <translation id="1932278019417741381">Google internetda ishlashingizni osonlashtirish uchun Assistent orqali kirilgan saytlarning URL manzillari va kontentlarini, shuningdek, soʻrovlarni ham oladi Bu axborot Google hisobingizga saqlanishi mumkin. Chrome sozlamalari ichidan Assistentni faolsizlantirishingiz mumkin. <ph name="BEGIN_LINK" />Batafsil axborot<ph name="END_LINK" /></translation>
 <translation id="2203046366315513658">Qiymatni kamaytirish</translation>
-<translation id="3353437022146208653">Google Assistent yordamida \n bir ikki bosish orqali \n avtomobilni ijaraga oling.</translation>
+<translation id="3353437022146208653">Google Assistent yordamida \n bir nechta bosish orqali \n avtomobilni ijaraga oling.</translation>
 <translation id="4130750466177569591">Men roziman</translation>
 <translation id="4437727785356380473">Chromedagi Google Assistent yopildi.</translation>
 <translation id="4517854969512651305">Qiymatni oshirish</translation>
@@ -17,6 +17,6 @@
 <translation id="6973932557599545801">Uzr, men yordam bera olmayman. Oʻzingiz harakat qiling.</translation>
 <translation id="7658239707568436148">Bekor qilish</translation>
 <translation id="8253702004019660079">Chromedagi Google Assistent</translation>
-<translation id="8323517642730821247">Google Assistent yordamida \n bir ikki bosish orqali \n kinoga chipta sotib oling.</translation>
+<translation id="8323517642730821247">Google Assistent yordamida \n bir nechta bosish orqali \n kinoga chipta sotib oling.</translation>
 <translation id="945522503751344254">Fikr-mulohaza</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
index 0fcece4..ddf2f96 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
@@ -13,7 +13,7 @@
 <translation id="4952448020231702394">Google 助理可帮助您在网络上完成所需操作(例如搜索和结算),从而节省您的时间。</translation>
 <translation id="5267269112080050255">Chrome 中的 Google 助理已全屏打开。</translation>
 <translation id="6555233628095991027">Chrome 中的 Google 助理已半屏打开。</translation>
-<translation id="6620345200476149840">试用 Chrome 中的\n Google 助理</translation>
+<translation id="6620345200476149840">在 Chrome 中的\n试用 Google 助理</translation>
 <translation id="6973932557599545801">抱歉,我已是爱莫能助,请您自行继续操作。</translation>
 <translation id="7658239707568436148">取消</translation>
 <translation id="8253702004019660079">Chrome 中的 Google 助理。</translation>
diff --git a/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java b/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java
index 73d60fa61..d828c86 100644
--- a/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java
+++ b/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/BLEHandler.java
@@ -505,17 +505,21 @@
      * Called by native code to process a makeCredential request.
      */
     @CalledByNative
-    void makeCredential(long client) {
-        mAuthenticator.makeCredential(client);
+    void makeCredential(long client, byte[] clientDataHash, String rpId, byte[] userId,
+            int[] algorithms, byte[][] excludedCredentialIds, boolean residentKeyRequired) {
+        mAuthenticator.makeCredential(client, clientDataHash, rpId, userId, algorithms,
+                excludedCredentialIds, residentKeyRequired);
     }
 
     /**
      * Called by CableAuthenticator to notify native code of an attestation response to a
      * makeCredential request.
      */
-    public void onAuthenticatorAttestationResponse(long client, int ctapStatus) {
-        mTaskRunner.postTask(
-                () -> BLEHandlerJni.get().onAuthenticatorAttestationResponse(client, ctapStatus));
+    public void onAuthenticatorAttestationResponse(
+            long client, int ctapStatus, byte[] attestationObject) {
+        mTaskRunner.postTask(()
+                                     -> BLEHandlerJni.get().onAuthenticatorAttestationResponse(
+                                             client, ctapStatus, attestationObject));
     }
 
     @NativeMethods
@@ -544,6 +548,7 @@
         /**
          * Called to alert native code of a response to a makeCredential request.
          */
-        void onAuthenticatorAttestationResponse(long client, int ctapStatus);
+        void onAuthenticatorAttestationResponse(
+                long client, int ctapStatus, byte[] attestationObject);
     }
 }
diff --git a/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java b/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
index cc365c2a..e90682e 100644
--- a/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
+++ b/chrome/android/features/cablev2_authenticator/internal/java/src/org/chromium/chrome/browser/webauth/authenticator/CableAuthenticator.java
@@ -13,10 +13,10 @@
 import android.os.Bundle;
 
 import com.google.android.gms.fido.Fido;
+import com.google.android.gms.fido.common.Transport;
 import com.google.android.gms.fido.fido2.Fido2PrivilegedApiClient;
 import com.google.android.gms.fido.fido2.api.common.Attachment;
 import com.google.android.gms.fido.fido2.api.common.AttestationConveyancePreference;
-import com.google.android.gms.fido.fido2.api.common.AuthenticatorAssertionResponse;
 import com.google.android.gms.fido.fido2.api.common.AuthenticatorAttestationResponse;
 import com.google.android.gms.fido.fido2.api.common.AuthenticatorErrorResponse;
 import com.google.android.gms.fido.fido2.api.common.AuthenticatorResponse;
@@ -44,8 +44,12 @@
     private static final String TAG = "CableAuthenticator";
     private static final String FIDO2_KEY_CREDENTIAL_EXTRA = "FIDO2_CREDENTIAL_EXTRA";
     private static final int FIDO2_REGISTER_INTENT_CODE = 1;
+    private static final int CLIENT_DATA_HASH_LENGTH = 32;
+
     private static final int CTAP2_OK = 0;
     private static final int CTAP2_ERR_OPERATION_DENIED = 0x27;
+    private static final int CTAP2_ERR_UNSUPPORTED_OPTION = 0x2D;
+    private static final int CTAP2_ERR_OTHER = 0x7F;
 
     private final Context mContext;
     private final CableAuthenticatorUI mUi;
@@ -62,9 +66,12 @@
         }
     }
 
-    public void makeCredential(long clientAddress) {
+    public void makeCredential(long clientAddress, byte[] clientDataHash, String rpId,
+            byte[] userId, int[] algorithms, byte[][] excludedCredentialIds,
+            boolean residentKeyRequired) {
         // TODO: handle concurrent requests
         assert mClientAddress == 0;
+        assert clientDataHash.length == CLIENT_DATA_HASH_LENGTH;
         mClientAddress = clientAddress;
         Fido2PrivilegedApiClient client = Fido.getFido2PrivilegedApiClient(mContext);
         if (client == null) {
@@ -73,23 +80,30 @@
         }
         Log.i(TAG, "have fido client");
 
-        // TODO: use actual request parameters passed from native code
         List<PublicKeyCredentialParameters> parameters = new ArrayList<>();
-        parameters.add(new PublicKeyCredentialParameters(
-                PublicKeyCredentialType.PUBLIC_KEY.toString(), -7));
-        AuthenticatorSelectionCriteria selection = new AuthenticatorSelectionCriteria.Builder()
-                                                           .setAttachment(Attachment.PLATFORM)
-                                                           .setRequireResidentKey(false)
-                                                           .build();
+        for (int i = 0; i < algorithms.length; i++) {
+            parameters.add(new PublicKeyCredentialParameters(
+                    PublicKeyCredentialType.PUBLIC_KEY.toString(), algorithms[i]));
+        }
+        // The GmsCore FIDO2 API does not actually support resident keys yet.
+        AuthenticatorSelectionCriteria selection =
+                new AuthenticatorSelectionCriteria.Builder()
+                        .setAttachment(Attachment.PLATFORM)
+                        .setRequireResidentKey(residentKeyRequired)
+                        .build();
         List<PublicKeyCredentialDescriptor> excludeCredentials =
                 new ArrayList<PublicKeyCredentialDescriptor>();
+        for (int i = 0; i < excludedCredentialIds.length; i++) {
+            excludeCredentials.add(
+                    new PublicKeyCredentialDescriptor(PublicKeyCredentialType.PUBLIC_KEY.toString(),
+                            excludedCredentialIds[i], new ArrayList<Transport>()));
+        }
         byte[] dummy = new byte[32];
         PublicKeyCredentialCreationOptions credentialCreationOptions =
                 new PublicKeyCredentialCreationOptions.Builder()
-                        .setRp(new PublicKeyCredentialRpEntity("example.com", "Example", null))
-                        .setUser(
-                                new PublicKeyCredentialUserEntity(dummy, "user", null, "User Name"))
-                        .setChallenge(dummy)
+                        .setRp(new PublicKeyCredentialRpEntity(rpId, "", ""))
+                        .setUser(new PublicKeyCredentialUserEntity(userId, "", null, ""))
+                        .setChallenge(clientDataHash)
                         .setParameters(parameters)
                         .setTimeoutSeconds(Double.valueOf(20))
                         .setExcludeList(excludeCredentials)
@@ -99,7 +113,7 @@
         BrowserPublicKeyCredentialCreationOptions browserRequestOptions =
                 new BrowserPublicKeyCredentialCreationOptions.Builder()
                         .setPublicKeyCredentialCreationOptions(credentialCreationOptions)
-                        .setOrigin(Uri.parse("https://example.com"))
+                        .setOrigin(Uri.parse("https://" + rpId))
                         .build();
         Task<PendingIntent> result = client.getRegisterPendingIntent(browserRequestOptions);
         result.addOnSuccessListener(pedingIntent -> {
@@ -127,51 +141,72 @@
             Log.e(TAG, "Received a null intent.");
             // The user cancelled the request.
             mBleHandler.onAuthenticatorAttestationResponse(
-                    mClientAddress, CTAP2_ERR_OPERATION_DENIED);
+                    mClientAddress, CTAP2_ERR_OPERATION_DENIED, null);
             return;
         }
 
-        switch (resultCode) {
-            case Activity.RESULT_CANCELED:
-                Log.e(TAG, "CANCELED.");
-                return;
-            case Activity.RESULT_OK:
-                Log.e(TAG, "OK.");
-                break;
-            default:
+        if (resultCode != Activity.RESULT_OK) {
+            Log.e(TAG,
+                    resultCode == Activity.RESULT_CANCELED
+                            ? "CANCELED."
+                            : "Failed with result code" + resultCode);
+            mBleHandler.onAuthenticatorAttestationResponse(
+                    mClientAddress, CTAP2_ERR_OPERATION_DENIED, null);
+            return;
+        }
+        Log.e(TAG, "OK.");
+
+        if (!data.hasExtra(FIDO2_KEY_CREDENTIAL_EXTRA)) {
+            if (data.hasExtra(Fido.FIDO2_KEY_ERROR_EXTRA)) {
+                Log.e(TAG, "error extra");
+            } else if (data.hasExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA)) {
+                Log.e(TAG, "resp extra");
+            } else {
                 // Something went wrong.
-                Log.e(TAG, "Failed with result code" + resultCode);
-                return;
+                Log.e(TAG,
+                        "The response is missing FIDO2_KEY_RESPONSE_EXTRA "
+                                + "and FIDO2_KEY_CREDENTIAL_EXTRA.");
+            }
+            // TODO: figure out what error to return here
+            mBleHandler.onAuthenticatorAttestationResponse(mClientAddress, CTAP2_ERR_OTHER, null);
+            return;
         }
 
-        if (data.hasExtra(FIDO2_KEY_CREDENTIAL_EXTRA)) {
-            Log.e(TAG, "cred extra");
-            PublicKeyCredential publicKeyCredential = PublicKeyCredential.deserializeFromBytes(
-                    data.getByteArrayExtra(FIDO2_KEY_CREDENTIAL_EXTRA));
-            AuthenticatorResponse response = publicKeyCredential.getResponse();
-            if (response instanceof AuthenticatorErrorResponse) {
-                AuthenticatorErrorResponse error = (AuthenticatorErrorResponse) response;
-                Log.i(TAG,
-                        "error response: " + error.getErrorMessage() + " "
-                                + String.valueOf(error.getErrorCodeAsInt()));
-            } else if (response instanceof AuthenticatorAttestationResponse) {
-                Log.i(TAG, "attestation response");
-                mBleHandler.onAuthenticatorAttestationResponse(mClientAddress, CTAP2_OK);
-            } else if (response instanceof AuthenticatorAssertionResponse) {
-                Log.i(TAG, "assertion response");
-            } else {
-                Log.i(TAG, "unknown response");
+        Log.e(TAG, "cred extra");
+        PublicKeyCredential publicKeyCredential = PublicKeyCredential.deserializeFromBytes(
+                data.getByteArrayExtra(FIDO2_KEY_CREDENTIAL_EXTRA));
+        AuthenticatorResponse response = publicKeyCredential.getResponse();
+        if (response instanceof AuthenticatorErrorResponse) {
+            AuthenticatorErrorResponse error = (AuthenticatorErrorResponse) response;
+            Log.i(TAG,
+                    "error response: " + error.getErrorMessage() + " "
+                            + String.valueOf(error.getErrorCodeAsInt()));
+
+            // ErrorCode represents DOMErrors not CTAP status codes.
+            // TODO: figure out translation of the remaining codes
+            int ctap_status;
+            switch (error.getErrorCode()) {
+                case NOT_ALLOWED_ERR:
+                    ctap_status = CTAP2_ERR_OPERATION_DENIED;
+                    break;
+                default:
+                    ctap_status = CTAP2_ERR_OTHER;
+                    break;
             }
-        } else if (data.hasExtra(Fido.FIDO2_KEY_ERROR_EXTRA)) {
-            Log.e(TAG, "error extra");
-        } else if (data.hasExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA)) {
-            Log.e(TAG, "resp extra");
-        } else {
-            // Something went wrong.
-            Log.e(TAG,
-                    "The response is missing FIDO2_KEY_RESPONSE_EXTRA "
-                            + "and FIDO2_KEY_CREDENTIAL_EXTRA.");
+            mBleHandler.onAuthenticatorAttestationResponse(mClientAddress, ctap_status, null);
+            return;
         }
+        if (!(response instanceof AuthenticatorAttestationResponse)) {
+            Log.i(TAG, "unknown response");
+            mBleHandler.onAuthenticatorAttestationResponse(mClientAddress, CTAP2_ERR_OTHER, null);
+            return;
+        }
+
+        Log.i(TAG, "attestation response");
+        AuthenticatorAttestationResponse attestation_response =
+                (AuthenticatorAttestationResponse) response;
+        mBleHandler.onAuthenticatorAttestationResponse(
+                mClientAddress, CTAP2_OK, attestation_response.getAttestationObject());
     }
 
     public void onQRCode(String value) {
diff --git a/chrome/android/features/cablev2_authenticator/internal/native/cablev2_authenticator_android.cc b/chrome/android/features/cablev2_authenticator/internal/native/cablev2_authenticator_android.cc
index e26045f..b25a7e6 100644
--- a/chrome/android/features/cablev2_authenticator/internal/native/cablev2_authenticator_android.cc
+++ b/chrome/android/features/cablev2_authenticator/internal/native/cablev2_authenticator_android.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/base64url.h"
 #include "base/memory/singleton.h"
@@ -21,6 +22,7 @@
 #include "device/fido/authenticator_supported_options.h"
 #include "device/fido/cable/cable_discovery_data.h"
 #include "device/fido/cable/v2_handshake.h"
+#include "device/fido/ctap_make_credential_request.h"
 #include "device/fido/ec_public_key.h"
 #include "device/fido/fido_constants.h"
 #include "device/fido/fido_parsing_utils.h"
@@ -39,15 +41,26 @@
 // only be included once across Chromium.
 #include "chrome/android/features/cablev2_authenticator/internal/jni_headers/BLEHandler_jni.h"
 
+using base::android::ConvertJavaStringToUTF8;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::JavaByteArrayToByteVector;
+using base::android::JavaParamRef;
+using base::android::ScopedJavaLocalRef;
+using base::android::ToJavaArrayOfByteArray;
+using base::android::ToJavaByteArray;
+using base::android::ToJavaIntArray;
+
 using device::AttestationObject;
 using device::AttestedCredentialData;
 using device::AuthenticatorData;
 using device::AuthenticatorMakeCredentialResponse;
 using device::CtapDeviceResponseCode;
+using device::CtapMakeCredentialRequest;
 using device::CtapRequestCommand;
 using device::ECPublicKey;
 using device::FidoTransportProtocol;
 using device::NoneAttestationStatement;
+using device::PublicKeyCredentialDescriptor;
 using device::fido_parsing_utils::CopyCBORBytestring;
 
 namespace {
@@ -170,7 +183,8 @@
   class Delegate {
    public:
     virtual ~Delegate() = default;
-    virtual void OnMakeCredential(uint64_t client_addr) = 0;
+    virtual void OnMakeCredential(uint64_t client_addr,
+                                  CtapMakeCredentialRequest request) = 0;
   };
 
   Client(uint64_t addr,
@@ -338,11 +352,17 @@
 
           case static_cast<uint8_t>(
               device::CtapRequestCommand::kAuthenticatorMakeCredential): {
-            if (!payload) {
+            if (!payload || !payload->is_map()) {
+              FIDO_LOG(ERROR) << "Invalid makeCredential payload";
               return false;
             }
-
-            delegate_->OnMakeCredential(addr_);
+            base::Optional<CtapMakeCredentialRequest> request =
+                CtapMakeCredentialRequest::Parse(payload->GetMap());
+            if (!request) {
+              FIDO_LOG(ERROR) << "CtapMakeCredentialRequest::Parse() failed";
+              return false;
+            }
+            delegate_->OnMakeCredential(addr_, std::move(*request));
             return true;
           }
 
@@ -432,8 +452,8 @@
   }
 
   void Start(JNIEnv* env,
-             const base::android::JavaParamRef<jobject>& ble_handler,
-             const base::android::JavaParamRef<jbyteArray>& state_bytes) {
+             const JavaParamRef<jobject>& ble_handler,
+             const JavaParamRef<jbyteArray>& state_bytes) {
     ble_handler_.Reset(ble_handler);
     env_ = env;
 
@@ -489,9 +509,8 @@
     known_mtus_.emplace(client_adr, mtu_bytes);
   }
 
-  base::android::ScopedJavaLocalRef<jobjectArray> Write(
-      jlong client_addr,
-      const base::android::JavaParamRef<jbyteArray>& data) {
+  ScopedJavaLocalRef<jobjectArray> Write(jlong client_addr,
+                                         const JavaParamRef<jbyteArray>& data) {
     auto it = clients_.find(client_addr);
     if (it == clients_.end()) {
       DCHECK(known_mtus_.find(client_addr) != known_mtus_.end());
@@ -506,46 +525,53 @@
     }
     Client* const client = it->second.get();
 
-    size_t data_len = env_->GetArrayLength(data);
-    jbyte* data_bytes = env_->GetByteArrayElements(data, nullptr);
-
+    const size_t data_len = env_->GetArrayLength(data);
+    jbyte* data_bytes = env_->GetByteArrayElements(data, /*iscopy=*/nullptr);
     base::Optional<std::vector<std::vector<uint8_t>>> response_fragments;
-    if (!client->Process(base::span<const uint8_t>(
-                             reinterpret_cast<uint8_t*>(data_bytes), data_len),
-                         &response_fragments)) {
+    const bool process_ok =
+        client->Process(base::span<const uint8_t>(
+                            reinterpret_cast<uint8_t*>(data_bytes), data_len),
+                        &response_fragments);
+    env_->ReleaseByteArrayElements(data, data_bytes, JNI_ABORT);
+    if (!process_ok) {
       return nullptr;
     }
 
-    base::android::ScopedJavaLocalRef<jclass> byte_array_class(
-        env_, env_->FindClass("[B"));
-    if (!response_fragments) {
-      base::android::ScopedJavaLocalRef<jobjectArray> ret(
-          env_, env_->NewObjectArray(0, byte_array_class.obj(), nullptr));
-      return ret;
-    }
-
-    base::android::ScopedJavaLocalRef<jobjectArray> ret(
-        env_, env_->NewObjectArray(response_fragments->size(),
-                                   byte_array_class.obj(), nullptr));
-    for (size_t i = 0; i < response_fragments->size(); i++) {
-      const std::vector<uint8_t>& fragment = response_fragments->at(i);
-
-      base::android::ScopedJavaLocalRef<jbyteArray> jbytes(
-          env_, env_->NewByteArray(fragment.size()));
-      env_->SetByteArrayRegion(jbytes.obj(), 0, fragment.size(),
-                               reinterpret_cast<const jbyte*>(fragment.data()));
-      env_->SetObjectArrayElement(ret.obj(), i, jbytes.obj());
-    }
-
-    return ret;
+    static std::vector<std::vector<uint8_t>> kEmptyFragments;
+    return ToJavaArrayOfByteArray(
+        env_, response_fragments ? *response_fragments : kEmptyFragments);
   }
 
-  void OnMakeCredential(uint64_t client_addr) override {
-    // TODO: pass request parameters to the Java side
-    Java_BLEHandler_makeCredential(env_, ble_handler_, client_addr);
+  void OnMakeCredential(uint64_t client_addr,
+                        CtapMakeCredentialRequest request) override {
+    std::vector<int> algorithms;
+    for (const auto& cred_info :
+         request.public_key_credential_params.public_key_credential_params()) {
+      if (cred_info.type == device::CredentialType::kPublicKey) {
+        algorithms.push_back(cred_info.algorithm);
+      }
+    }
+    std::vector<std::vector<uint8_t>> excluded_credential_ids;
+    for (const PublicKeyCredentialDescriptor& desc : request.exclude_list) {
+      if (desc.credential_type() == device::CredentialType::kPublicKey) {
+        excluded_credential_ids.emplace_back(desc.id());
+      }
+    }
+    // TODO: Add extension support if necessary.
+    Java_BLEHandler_makeCredential(
+        env_, ble_handler_, client_addr,
+        ToJavaByteArray(env_, request.client_data_hash),
+        ConvertUTF8ToJavaString(env_, request.rp.id),
+        // TODO: Pass full user entity once resident key support is added.
+        ToJavaByteArray(env_, request.user.id),
+        ToJavaIntArray(env_, algorithms),
+        ToJavaArrayOfByteArray(env_, excluded_credential_ids),
+        request.resident_key_required);
   }
 
-  void OnMakeCredentialResponse(uint64_t client_addr, uint32_t ctap_status) {
+  void OnMakeCredentialResponse(uint64_t client_addr,
+                                uint32_t ctap_status,
+                                base::span<const uint8_t> attestation_object) {
     DCHECK_LE(ctap_status, 0xFFu);
     auto it = clients_.find(client_addr);
     if (it == clients_.end()) {
@@ -556,27 +582,22 @@
     std::vector<uint8_t> response = {base::checked_cast<uint8_t>(ctap_status)};
     if (ctap_status == static_cast<uint8_t>(CtapDeviceResponseCode::kSuccess)) {
       // TODO: pass response parameters from the Java side.
-      AuthenticatorMakeCredentialResponse dummy_response(
-          FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy,
-          AttestationObject(
-              AuthenticatorData(
-                  device::fido_parsing_utils::CreateSHA256Hash("example.com"),
-                  static_cast<uint8_t>(AuthenticatorData::Flag::kAttestation) |
-                      static_cast<uint8_t>(
-                          AuthenticatorData::Flag::kTestOfUserPresence) |
-                      static_cast<uint8_t>(
-                          AuthenticatorData::Flag::kTestOfUserVerification),
-                  std::array<uint8_t, 4>{0},
-                  AttestedCredentialData(
-                      std::array<uint8_t, device::kAaguidLength>{0},
-                      /*credential_id_length=*/std::array<uint8_t, 2>{0, 16},
-                      std::vector<uint8_t>(16, 'a'),
-                      ECPublicKey::ExtractFromU2fRegistrationResponse(
-                          device::fido_parsing_utils::kEs256,
-                          device::test_data::kTestU2fRegisterResponse))),
-              std::make_unique<NoneAttestationStatement>()));
-
-      std::vector<uint8_t> ctap_response = AsCTAPStyleCBORBytes(dummy_response);
+      base::Optional<cbor::Value> cbor_attestation_object =
+          cbor::Reader::Read(attestation_object);
+      if (!cbor_attestation_object) {
+        FIDO_LOG(ERROR) << "invalid CBOR attestation object";
+        return;
+      }
+      base::Optional<AttestationObject> attestation_object =
+          AttestationObject::Parse(std::move(*cbor_attestation_object));
+      if (!attestation_object) {
+        FIDO_LOG(ERROR) << "AttestationObject::Parse() failed";
+        return;
+      }
+      std::vector<uint8_t> ctap_response =
+          AsCTAPStyleCBORBytes(AuthenticatorMakeCredentialResponse(
+              FidoTransportProtocol::kCloudAssistedBluetoothLowEnergy,
+              std::move(*attestation_object)));
       response.insert(response.end(), ctap_response.begin(),
                       ctap_response.end());
     }
@@ -588,30 +609,9 @@
       return;
     }
 
-    base::android::ScopedJavaLocalRef<jclass> byte_array_class(
-        env_, env_->FindClass("[B"));
-    if (!response_fragments) {
-      base::android::ScopedJavaLocalRef<jobjectArray> ret(
-          env_, env_->NewObjectArray(0, byte_array_class.obj(), nullptr));
-      NOTREACHED();
-      return;
-    }
-
-    base::android::ScopedJavaLocalRef<jobjectArray> jresponse_fragments(
-        env_, env_->NewObjectArray(response_fragments->size(),
-                                   byte_array_class.obj(), nullptr));
-    for (size_t i = 0; i < response_fragments->size(); i++) {
-      const std::vector<uint8_t>& fragment = response_fragments->at(i);
-
-      base::android::ScopedJavaLocalRef<jbyteArray> jbytes(
-          env_, env_->NewByteArray(fragment.size()));
-      env_->SetByteArrayRegion(jbytes.obj(), 0, fragment.size(),
-                               reinterpret_cast<const jbyte*>(fragment.data()));
-      env_->SetObjectArrayElement(jresponse_fragments.obj(), i, jbytes.obj());
-    }
-
-    Java_BLEHandler_sendNotification(env_, ble_handler_, client_addr,
-                                     jresponse_fragments);
+    Java_BLEHandler_sendNotification(
+        env_, ble_handler_, client_addr,
+        ToJavaArrayOfByteArray(env_, *response_fragments));
   }
 
  private:
@@ -640,13 +640,11 @@
     out_nonce_and_eid->first = nonce;
     out_nonce_and_eid->second = eid;
 
-    base::android::ScopedJavaLocalRef<jbyteArray> jbytes(
-        env_, env_->NewByteArray(sizeof(eid)));
-    env_->SetByteArrayRegion(jbytes.obj(), 0, eid.size(), (jbyte*)eid.data());
-    Java_BLEHandler_sendBLEAdvert(env_, ble_handler_, jbytes);
+    Java_BLEHandler_sendBLEAdvert(env_, ble_handler_,
+                                  ToJavaByteArray(env_, eid));
   }
 
-  bool ParseState(const base::android::JavaParamRef<jbyteArray>& state_bytes) {
+  bool ParseState(const JavaParamRef<jbyteArray>& state_bytes) {
     if (!state_bytes) {
       return false;
     }
@@ -699,11 +697,7 @@
         cbor::Writer::Write(cbor::Value(std::move(map)));
     CHECK(bytes.has_value());
 
-    base::android::ScopedJavaLocalRef<jbyteArray> jbytes(
-        env_, env_->NewByteArray(bytes->size()));
-    env_->SetByteArrayRegion(jbytes.obj(), 0, bytes->size(),
-                             (jbyte*)bytes->data());
-    Java_BLEHandler_setState(env_, ble_handler_, jbytes);
+    Java_BLEHandler_setState(env_, ble_handler_, ToJavaByteArray(env_, *bytes));
   }
 
   static bssl::UniquePtr<EC_KEY> P256KeyFromSeed(
@@ -736,10 +730,9 @@
 
 // These functions are the entry points for BLEHandler.java calling into C++.
 
-static void JNI_BLEHandler_Start(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& ble_handler,
-    const base::android::JavaParamRef<jbyteArray>& state_bytes) {
+static void JNI_BLEHandler_Start(JNIEnv* env,
+                                 const JavaParamRef<jobject>& ble_handler,
+                                 const JavaParamRef<jbyteArray>& state_bytes) {
   CableInterface::GetInstance()->Start(env, ble_handler, state_bytes);
 }
 
@@ -747,11 +740,9 @@
   CableInterface::GetInstance()->Stop();
 }
 
-static void JNI_BLEHandler_OnQRScanned(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jstring>& jvalue) {
-  CableInterface::GetInstance()->OnQRScanned(
-      base::android::ConvertJavaStringToUTF8(jvalue));
+static void JNI_BLEHandler_OnQRScanned(JNIEnv* env,
+                                       const JavaParamRef<jstring>& jvalue) {
+  CableInterface::GetInstance()->OnQRScanned(ConvertJavaStringToUTF8(jvalue));
 }
 
 static void JNI_BLEHandler_RecordClientMtu(JNIEnv* env,
@@ -763,17 +754,22 @@
   CableInterface::GetInstance()->RecordClientMTU(client, mtu_bytes);
 }
 
-static base::android::ScopedJavaLocalRef<jobjectArray> JNI_BLEHandler_Write(
+static ScopedJavaLocalRef<jobjectArray> JNI_BLEHandler_Write(
     JNIEnv* env,
     jlong client,
-    const base::android::JavaParamRef<jbyteArray>& data) {
+    const JavaParamRef<jbyteArray>& data) {
   return CableInterface::GetInstance()->Write(client, data);
 }
 
 static void JNI_BLEHandler_OnAuthenticatorAttestationResponse(
     JNIEnv* env,
     jlong client,
-    jint ctap_status) {
-  return CableInterface::GetInstance()->OnMakeCredentialResponse(client,
-                                                                 ctap_status);
+    jint ctap_status,
+    const JavaParamRef<jbyteArray>& jattestation_object) {
+  std::vector<uint8_t> attestation_object;
+  if (jattestation_object) {
+    JavaByteArrayToByteVector(env, jattestation_object, &attestation_object);
+  }
+  return CableInterface::GetInstance()->OnMakeCredentialResponse(
+      client, ctap_status, attestation_object);
 }
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
index f7f4011..b86f8d31 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -11,7 +11,6 @@
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApplicationStatus;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.tasks.TasksSurface;
 import org.chromium.chrome.browser.tasks.TasksSurfaceProperties;
 import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
@@ -95,9 +94,6 @@
                 mSurfaceMode == SurfaceMode.SINGLE_PANE ? this::initializeSecondaryTasksSurface
                                                         : null,
                 mSurfaceMode,
-                mSurfaceMode != SurfaceMode.NO_START_SURFACE
-                        ? mActivity.getToolbarManager().getFakeboxDelegate()
-                        : null,
                 mActivity.getNightModeStateProvider(), mActivity.getFullscreenManager(),
                 this::isActivityFinishingOrDestroyed);
     }
@@ -137,6 +133,21 @@
     }
 
     @Override
+    public void initWithNative() {
+        mStartSurfaceMediator.initWithNative(mSurfaceMode != SurfaceMode.NO_START_SURFACE
+                        ? mActivity.getToolbarManager().getFakeboxDelegate()
+                        : null);
+        if (mTabSwitcher != null) {
+            mTabSwitcher.initWithNative(mActivity, mActivity.getTabContentManager(),
+                    mActivity.getCompositorViewHolder().getDynamicResourceLoader());
+        }
+        if (mTasksSurface != null) {
+            mTasksSurface.onFinishNativeInitialization(
+                    mActivity, mActivity.getToolbarManager().getFakeboxDelegate());
+        }
+    }
+
+    @Override
     public Controller getController() {
         return mStartSurfaceMediator;
     }
@@ -163,8 +174,7 @@
         }
 
         // TODO(crbug.com/982018): use cached variation.
-        String feature = ChromeFeatureList.getFieldTrialParamByFeature(
-                ChromeFeatureList.START_SURFACE_ANDROID, "start_surface_variation");
+        String feature = StartSurfaceConfiguration.START_SURFACE_VARIATION.getValue();
 
         if (feature.equals("twopanes")) {
             // Do not enable two panes when the bottom bar is enabled since it will
@@ -196,9 +206,8 @@
 
         boolean hasMVTiles = mSurfaceMode == SurfaceMode.SINGLE_PANE
                 || mSurfaceMode == SurfaceMode.TWO_PANES || mSurfaceMode == SurfaceMode.TASKS_ONLY;
-        mTasksSurface = TabManagementModuleProvider.getDelegate().createTasksSurface(mActivity,
-                mPropertyModel, mActivity.getToolbarManager().getFakeboxDelegate(),
-                mSurfaceMode == SurfaceMode.SINGLE_PANE, hasMVTiles);
+        mTasksSurface = TabManagementModuleProvider.getDelegate().createTasksSurface(
+                mActivity, mPropertyModel, mSurfaceMode == SurfaceMode.SINGLE_PANE, hasMVTiles);
         mTasksSurface.getView().setId(R.id.primary_tasks_surface_view);
 
         mTasksSurfacePropertyModelChangeProcessor =
@@ -230,9 +239,11 @@
         PropertyModel propertyModel = new PropertyModel(TasksSurfaceProperties.ALL_KEYS);
         mStartSurfaceMediator.setSecondaryTasksSurfacePropertyModel(propertyModel);
         mSecondaryTasksSurface = TabManagementModuleProvider.getDelegate().createTasksSurface(
-                mActivity, propertyModel, mActivity.getToolbarManager().getFakeboxDelegate(), false,
-                false);
+                mActivity, propertyModel, false, false);
+        mSecondaryTasksSurface.onFinishNativeInitialization(
+                mActivity, mActivity.getToolbarManager().getFakeboxDelegate());
         mSecondaryTasksSurface.initialize();
+
         mSecondaryTasksSurface.getView().setId(R.id.secondary_tasks_surface_view);
         mSecondaryTasksSurfacePropertyModelChangeProcessor =
                 PropertyModelChangeProcessor.create(mPropertyModel,
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
index 465c26f..634c94b 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
@@ -32,7 +32,6 @@
 import org.chromium.chrome.browser.compositor.layouts.eventfilter.EventFilter;
 import org.chromium.chrome.browser.compositor.scene_layer.SceneLayer;
 import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabFeatureUtilities;
@@ -63,12 +62,13 @@
     private AnimatorSet mTabToSwitcherAnimation;
     private boolean mIsAnimating;
 
-    private final TabListSceneLayer mSceneLayer = new TabListSceneLayer();
+    private TabListSceneLayer mSceneLayer;
     private final StartSurface mStartSurface;
     private final StartSurface.Controller mController;
     private final TabSwitcher.TabListDelegate mTabListDelegate;
     // To force Toolbar finishes its animation when this Layout finished hiding.
     private final LayoutTab mDummyLayoutTab;
+    private boolean mIsInitialized;
 
     private float mBackgroundAlpha;
 
@@ -97,12 +97,21 @@
         mController.addOverviewModeObserver(this);
         mTabListDelegate = mStartSurface.getTabListDelegate();
         if (TabUiFeatureUtilities.isTabThumbnailAspectRatioNotOne()) {
-            mThumbnailAspectRatio = (float) ChromeFeatureList.getFieldTrialParamByFeatureAsDouble(
-                    ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, "thumbnail_aspect_ratio", 1.0);
+            mThumbnailAspectRatio = (float) TabUiFeatureUtilities.THUMBNAIL_ASPECT_RATIO.getValue();
             mThumbnailAspectRatio = MathUtils.clamp(mThumbnailAspectRatio, 0.5f, 2.0f);
         }
     }
 
+    @Override
+    public void onFinishNativeInitialization() {
+        if (mIsInitialized) return;
+
+        mIsInitialized = true;
+        mStartSurface.initWithNative();
+        mSceneLayer = new TabListSceneLayer();
+        mSceneLayer.setTabModelSelector(mTabModelSelector);
+    }
+
     // StartSurface.OverviewModeObserver implementation.
     @Override
     public void startedShowing() {}
@@ -144,7 +153,9 @@
     @Override
     public void setTabModelSelector(TabModelSelector modelSelector, TabContentManager manager) {
         super.setTabModelSelector(modelSelector, manager);
-        mSceneLayer.setTabModelSelector(modelSelector);
+        if (mSceneLayer != null) {
+            mSceneLayer.setTabModelSelector(modelSelector);
+        }
     }
 
     @Override
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
index 5bd8d1f..467ff5d 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -128,8 +128,7 @@
             @Nullable PropertyModel propertyModel,
             @Nullable ExploreSurfaceCoordinator.FeedSurfaceCreator feedSurfaceCreator,
             @Nullable SecondaryTasksSurfaceInitializer secondaryTasksSurfaceInitializer,
-            @SurfaceMode int surfaceMode, @Nullable FakeboxDelegate fakeboxDelegate,
-            NightModeStateProvider nightModeStateProvider,
+            @SurfaceMode int surfaceMode, NightModeStateProvider nightModeStateProvider,
             ChromeFullscreenManager fullscreenManager, ActivityStateChecker activityStateChecker) {
         mController = controller;
         mTabModelSelector = tabModelSelector;
@@ -137,7 +136,6 @@
         mFeedSurfaceCreator = feedSurfaceCreator;
         mSecondaryTasksSurfaceInitializer = secondaryTasksSurfaceInitializer;
         mSurfaceMode = surfaceMode;
-        mFakeboxDelegate = fakeboxDelegate;
         mNightModeStateProvider = nightModeStateProvider;
         mFullScreenManager = fullscreenManager;
         mActivityStateChecker = activityStateChecker;
@@ -146,7 +144,6 @@
             assert mSurfaceMode == SurfaceMode.SINGLE_PANE || mSurfaceMode == SurfaceMode.TWO_PANES
                     || mSurfaceMode == SurfaceMode.TASKS_ONLY
                     || mSurfaceMode == SurfaceMode.OMNIBOX_ONLY;
-            assert mFakeboxDelegate != null;
 
             mIsIncognito = mTabModelSelector.isIncognitoSelected();
 
@@ -229,11 +226,6 @@
                 };
             }
 
-            // Initialize
-            // Note that isVoiceSearchEnabled will return false in incognito mode.
-            mPropertyModel.set(IS_VOICE_RECOGNITION_BUTTON_VISIBLE,
-                    mFakeboxDelegate.getVoiceRecognitionHandler().isVoiceSearchEnabled());
-
             int toolbarHeight =
                     ContextUtils.getApplicationContext().getResources().getDimensionPixelSize(
                             R.dimen.toolbar_height_no_shadow);
@@ -259,6 +251,18 @@
         mOverviewModeState = OverviewModeState.NOT_SHOWN;
     }
 
+    public void initWithNative(@Nullable FakeboxDelegate fakeboxDelegate) {
+        mFakeboxDelegate = fakeboxDelegate;
+        if (mPropertyModel != null) {
+            assert mFakeboxDelegate != null;
+
+            // Initialize
+            // Note that isVoiceSearchEnabled will return false in incognito mode.
+            mPropertyModel.set(IS_VOICE_RECOGNITION_BUTTON_VISIBLE,
+                    mFakeboxDelegate.getVoiceRecognitionHandler().isVoiceSearchEnabled());
+        }
+    }
+
     void setSecondaryTasksSurfacePropertyModel(PropertyModel propertyModel) {
         mSecondaryTasksSurfacePropertyModel = propertyModel;
         mSecondaryTasksSurfacePropertyModel.set(IS_INCOGNITO, mIsIncognito);
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
index 212b8d4..d6f5cf89 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutPerfTest.java
@@ -36,7 +36,6 @@
 import org.chromium.chrome.browser.compositor.animation.CompositorAnimator;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
@@ -62,13 +61,16 @@
 
 /** Tests for the {@link StartSurfaceLayout}, mainly for animation performance. */
 @RunWith(ChromeJUnit4ClassRunner.class)
+// clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         "enable-features=" + ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + "<Study,"
                 + ChromeFeatureList.TAB_TO_GTS_ANIMATION + "<Study",
         "force-fieldtrials=Study/Group"})
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 @Restriction(
         {UiRestriction.RESTRICTION_TYPE_PHONE, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE})
 public class StartSurfaceLayoutPerfTest {
+    // clang-format on
     private static final String TAG = "SSLayoutPerfTest";
     private static final String BASE_PARAMS = "force-fieldtrial-params="
             + "Study.Group:soft-cleanup-delay/0/cleanup-delay/0/skip-slow-zooming/false"
@@ -92,7 +94,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
         mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
         mActivityTestRule.startMainActivityFromLauncher();
 
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
index f3224b5..c2d67aad 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceTest.java
@@ -50,7 +50,6 @@
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.OverviewModeBehaviorWatcher;
 import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.chrome.test.util.browser.FieldTrials;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.ui.test.util.UiRestriction;
@@ -77,15 +76,14 @@
 
     @Before
     public void setUp() {
-        // TODO(https://crbug.com/1060622): Removes the if check block.
-        if (StartSurfaceConfiguration.isStartSurfaceSinglePaneEnabled()) {
-            FieldTrials.getInstance().reset();
-        }
         CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, true);
 
         EmbeddedTestServer testServer =
                 EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
-        mActivityTestRule.startMainActivityFromLauncher();
+
+        // TODO(crbug.com/1051226): Test start activity with startMainActivityFromLauncher, so no
+        // tab will be created, then the single start surface should be shown if it is enabled.
+        mActivityTestRule.startMainActivityOnBlankPage();
 
         mUrl = testServer.getURL("/chrome/test/data/android/navigate/simple.html");
     }
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
index dfd792d..0ee32fd6 100644
--- a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
+++ b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -1114,13 +1114,14 @@
     }
 
     private StartSurfaceMediator createStartSurfaceMediator(@SurfaceMode int mode) {
-        return new StartSurfaceMediator(mMainTabGridController, mTabModelSelector,
-                mode == SurfaceMode.NO_START_SURFACE ? null : mPropertyModel,
+        StartSurfaceMediator mediator = new StartSurfaceMediator(mMainTabGridController,
+                mTabModelSelector, mode == SurfaceMode.NO_START_SURFACE ? null : mPropertyModel,
                 (mode == SurfaceMode.SINGLE_PANE || mode == SurfaceMode.TWO_PANES)
                         ? mFeedSurfaceCreator
                         : null,
                 mode == SurfaceMode.SINGLE_PANE ? mSecondaryTasksSurfaceInitializer : null, mode,
-                mFakeBoxDelegate, mNightModeStateProvider, mChromeFullscreenManager,
-                mActivityStateChecker);
+                mNightModeStateProvider, mChromeFullscreenManager, mActivityStateChecker);
+        mediator.initWithNative(mFakeBoxDelegate);
+        return mediator;
     }
 }
diff --git a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
index a273688..db5a4bf7 100644
--- a/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
+++ b/chrome/android/features/start_surface/public/java/src/org/chromium/chrome/features/start_surface/StartSurface.java
@@ -52,6 +52,11 @@
     void setOnTabSelectingListener(OnTabSelectingListener listener);
 
     /**
+     * Called when native initialization is completed.
+     */
+    void initWithNative();
+
+    /**
      * An observer that is notified when the StartSurface view state changes.
      */
     interface OverviewModeObserver {
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn
index 07befd3..8d13883 100644
--- a/chrome/android/features/tab_ui/BUILD.gn
+++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -141,12 +141,12 @@
     "//content/public/android:content_java",
     "//content/public/android:content_java_resources",
     "//third_party/android_deps:android_arch_lifecycle_common_java",
-    "//third_party/android_deps:android_arch_lifecycle_runtime_java",
-    "//third_party/android_deps:android_arch_lifecycle_viewmodel_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
     "//third_party/android_deps:androidx_core_core_java",
     "//third_party/android_deps:androidx_legacy_legacy_support_v13_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_runtime_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_viewmodel_java",
     "//third_party/android_deps:androidx_recyclerview_recyclerview_java",
     "//third_party/android_deps:com_google_android_material_material_java",
     "//ui/android:ui_java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
index 91895bf..b662292e 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -67,7 +67,7 @@
                 android:id="@+id/divider_view"
                 style="@style/HorizontalDivider"
                 android:layout_below="@id/tab_title"
-                android:background="@color/divider_bg_color"/>
+                android:background="@color/divider_line_bg_color"/>
             <org.chromium.ui.widget.ButtonCompat
                 android:id="@+id/create_group_button"
                 android:layout_width="wrap_content"
diff --git a/chrome/android/features/tab_ui/java/res/values/colors.xml b/chrome/android/features/tab_ui/java/res/values/colors.xml
index e2967720..201dbad 100644
--- a/chrome/android/features/tab_ui/java/res/values/colors.xml
+++ b/chrome/android/features/tab_ui/java/res/values/colors.xml
@@ -14,8 +14,8 @@
     <color name="tab_grid_card_action_button_tint_color">@color/default_icon_color</color>
     <color name="tab_grid_card_action_button_tint_color_incognito">@color/default_icon_color_light</color>
 
-    <color name="tab_grid_card_divider_tint_color">@color/divider_bg_color</color>
-    <color name="tab_grid_card_divider_tint_color_incognito">@color/divider_bg_color_light</color>
+    <color name="tab_grid_card_divider_tint_color">@color/divider_line_bg_color</color>
+    <color name="tab_grid_card_divider_tint_color_incognito">@color/divider_line_bg_color_light</color>
 
     <color name="tab_grid_card_thumbnail_placeholder_color">@color/modern_secondary_color</color>
     <color name="tab_grid_card_thumbnail_placeholder_color_incognito">@color/default_bg_color_dark_elev_3</color>
diff --git a/chrome/android/features/tab_ui/java/res/values/styles.xml b/chrome/android/features/tab_ui/java/res/values/styles.xml
index bbbd16e8..e3c1bc34 100644
--- a/chrome/android/features/tab_ui/java/res/values/styles.xml
+++ b/chrome/android/features/tab_ui/java/res/values/styles.xml
@@ -8,7 +8,7 @@
 
 <resources>
     <style name="TabGridDialogTitleTheme">
-        <item name="colorControlNormal">@color/divider_bg_color</item>
+        <item name="colorControlNormal">@color/divider_line_bg_color</item>
         <item name="colorControlActivated">@color/filled_button_bg_color</item>
         <item name="colorControlHighlight">@color/filled_button_bg_color</item>
     </style>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java
index d3573c0..caaf42f 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurface.java
@@ -4,10 +4,12 @@
 
 package org.chromium.chrome.browser.tasks;
 
+import android.content.Context;
 import android.view.View;
 import android.view.ViewGroup;
 
 import org.chromium.chrome.browser.compositor.layouts.Layout;
+import org.chromium.chrome.browser.ntp.FakeboxDelegate;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
 
 /**
@@ -51,4 +53,10 @@
      * @return The surface's container {@link View}.
      */
     View getView();
+
+    /**
+     * Called when the native initialization is completed. Anything to construct a TasksSurface but
+     * require native initialization should be constructed here.
+     */
+    void onFinishNativeInitialization(Context context, FakeboxDelegate fakeboxDelegate);
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java
index bb5e12b..06e902f3 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceCoordinator.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.tasks;
 
+import android.content.Context;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -16,6 +17,7 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
+import org.chromium.chrome.browser.tasks.tab_management.TabSwitcherCoordinator;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
@@ -30,13 +32,15 @@
     private final PropertyModelChangeProcessor mPropertyModelChangeProcessor;
     private final TasksSurfaceMediator mMediator;
     private MostVisitedListCoordinator mMostVisitedList;
+    private final PropertyModel mPropertyModel;
 
     public TasksSurfaceCoordinator(ChromeActivity activity, PropertyModel propertyModel,
-            FakeboxDelegate fakeboxDelegate, boolean isTabCarousel, boolean hasMVTiles) {
+            boolean isTabCarousel, boolean hasMVTiles) {
         mView = (TasksView) LayoutInflater.from(activity).inflate(R.layout.tasks_view_layout, null);
         mView.initialize(activity.getLifecycleDispatcher());
         mPropertyModelChangeProcessor =
                 PropertyModelChangeProcessor.create(propertyModel, mView, TasksViewBinder::bind);
+        mPropertyModel = propertyModel;
         if (isTabCarousel) {
             mTabSwitcher = TabManagementModuleProvider.getDelegate().createCarouselTabSwitcher(
                     activity, mView.getCarouselTabSwitcherContainer());
@@ -54,13 +58,13 @@
         IncognitoCookieControlsManager incognitoCookieControlsManager =
                 new IncognitoCookieControlsManager();
 
-        mMediator = new TasksSurfaceMediator(propertyModel, fakeboxDelegate,
-                incognitoLearnMoreClickListener, incognitoCookieControlsManager, isTabCarousel);
+        mMediator = new TasksSurfaceMediator(propertyModel, incognitoLearnMoreClickListener,
+                incognitoCookieControlsManager, isTabCarousel);
 
         if (hasMVTiles) {
             LinearLayout mvTilesLayout = mView.findViewById(R.id.mv_tiles_layout);
             mMostVisitedList =
-                    new MostVisitedListCoordinator(activity, mvTilesLayout, propertyModel);
+                    new MostVisitedListCoordinator(activity, mvTilesLayout, mPropertyModel);
         }
     }
 
@@ -95,4 +99,14 @@
     public View getView() {
         return mView;
     }
+
+    @Override
+    public void onFinishNativeInitialization(Context context, FakeboxDelegate fakeboxDelegate) {
+        ChromeActivity activity = (ChromeActivity) context;
+        ((TabSwitcherCoordinator) mTabSwitcher)
+                .initWithNative(activity, activity.getTabContentManager(),
+                        activity.getCompositorViewHolder().getDynamicResourceLoader());
+
+        mMediator.initWithNative(fakeboxDelegate);
+    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
index 1b9c81d1..182ab87 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
@@ -37,19 +37,27 @@
  */
 class TasksSurfaceMediator {
     @Nullable
-    private final FakeboxDelegate mFakeboxDelegate;
+    private FakeboxDelegate mFakeboxDelegate;
     private final IncognitoCookieControlsManager mIncognitoCookieControlsManager;
-    private final IncognitoCookieControlsManager.Observer mIncognitoCookieControlsObserver;
+    private IncognitoCookieControlsManager.Observer mIncognitoCookieControlsObserver;
     private final PropertyModel mModel;
 
-    TasksSurfaceMediator(PropertyModel model, FakeboxDelegate fakeboxDelegate,
-            View.OnClickListener incognitoLearnMoreClickListener,
+    TasksSurfaceMediator(PropertyModel model, View.OnClickListener incognitoLearnMoreClickListener,
             IncognitoCookieControlsManager incognitoCookieControlsManager, boolean isTabCarousel) {
+        mModel = model;
+        mModel.set(IS_TAB_CAROUSEL_VISIBLE, isTabCarousel);
+
+        model.set(INCOGNITO_LEARN_MORE_CLICK_LISTENER, incognitoLearnMoreClickListener);
+
+        // Set Incognito Cookie Controls functionality
+        mIncognitoCookieControlsManager = incognitoCookieControlsManager;
+        mModel.set(INCOGNITO_COOKIE_CONTROLS_MANAGER, mIncognitoCookieControlsManager);
+    }
+
+    public void initWithNative(FakeboxDelegate fakeboxDelegate) {
         mFakeboxDelegate = fakeboxDelegate;
         assert mFakeboxDelegate != null;
 
-        mModel = model;
-        mModel.set(IS_TAB_CAROUSEL_VISIBLE, isTabCarousel);
         mModel.set(FAKE_SEARCH_BOX_CLICK_LISTENER, new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -76,7 +84,7 @@
                 s.clear();
             }
         });
-        model.set(VOICE_SEARCH_BUTTON_CLICK_LISTENER, new View.OnClickListener() {
+        mModel.set(VOICE_SEARCH_BUTTON_CLICK_LISTENER, new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 mFakeboxDelegate.getVoiceRecognitionHandler().startVoiceRecognition(
@@ -84,11 +92,7 @@
                 RecordUserAction.record("TasksSurface.FakeBox.VoiceSearch");
             }
         });
-        model.set(INCOGNITO_LEARN_MORE_CLICK_LISTENER, incognitoLearnMoreClickListener);
 
-        // Set Incognito Cookie Controls functionality
-        mIncognitoCookieControlsManager = incognitoCookieControlsManager;
-        mModel.set(INCOGNITO_COOKIE_CONTROLS_MANAGER, mIncognitoCookieControlsManager);
         mIncognitoCookieControlsObserver = new IncognitoCookieControlsManager.Observer() {
             @Override
             public void onUpdate(boolean checked, @CookieControlsEnforcement int enforcement) {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
index f132ff4..b917801 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MultiThumbnailCardProvider.java
@@ -54,7 +54,7 @@
     private final List<Rect> mFaviconRects = new ArrayList<>(4);
     private final List<RectF> mThumbnailRects = new ArrayList<>(4);
     private final List<RectF> mFaviconBackgroundRects = new ArrayList<>(4);
-    private final TabListFaviconProvider mTabListFaviconProvider;
+    private TabListFaviconProvider mTabListFaviconProvider;
 
     private class MultiThumbnailFetcher {
         private final Tab mInitialTab;
@@ -208,8 +208,7 @@
         // TODO (https://crbug.com/1048632): Use the current profile (i.e., regular profile or
         // incognito profile) instead of always using regular profile. It works correctly now, but
         // it is not safe.
-        mTabListFaviconProvider =
-                new TabListFaviconProvider(context, Profile.getLastUsedRegularProfile());
+        mTabListFaviconProvider = new TabListFaviconProvider(context);
 
         // Initialize Paints to use.
         mEmptyThumbnailPaint = new Paint();
@@ -223,7 +222,7 @@
         mThumbnailFramePaint.setStrokeWidth(
                 resource.getDimension(R.dimen.tab_list_mini_card_frame_size));
         mThumbnailFramePaint.setColor(
-                ApiCompatibilityUtils.getColor(resource, R.color.divider_bg_color));
+                ApiCompatibilityUtils.getColor(resource, R.color.divider_line_bg_color));
         mThumbnailFramePaint.setAntiAlias(true);
 
         // TODO(996048): Use pre-defined styles to avoid style out of sync if any text/color styles
@@ -294,6 +293,10 @@
         mTabModelSelector.addObserver(mTabModelSelectorObserver);
     }
 
+    public void initWithNative() {
+        mTabListFaviconProvider.initWithNative(Profile.getLastUsedRegularProfile());
+    }
+
     /**
      * Destroy any member that needs clean up.
      */
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
index 3dddfae..31258f8 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
@@ -34,9 +34,12 @@
     private final TabGridDialogMediator mMediator;
     private final PropertyModel mToolbarPropertyModel;
     private final TabGridPanelToolbarCoordinator mToolbarCoordinator;
-    private final TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
     private final TabGridDialogParent mParentLayout;
 
+    private TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
+    private ViewGroup mContainerView;
+    private boolean mIsInitialized;
+
     TabGridDialogCoordinator(Context context, TabModelSelector tabModelSelector,
             TabContentManager tabContentManager, TabCreatorManager tabCreatorManager,
             ViewGroup containerView, TabSwitcherMediator.ResetHandler resetHandler,
@@ -48,22 +51,13 @@
                                                              : "TabGridDialogInSwitcher";
 
         mToolbarPropertyModel = new PropertyModel(TabGridPanelProperties.ALL_KEYS);
+        mContainerView = containerView;
 
         mParentLayout = new TabGridDialogParent(context, containerView);
 
-        TabSelectionEditorCoordinator.TabSelectionEditorController controller = null;
-        if (TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()) {
-            mTabSelectionEditorCoordinator = new TabSelectionEditorCoordinator(
-                    context, containerView, tabModelSelector, tabContentManager, mParentLayout);
-
-            controller = mTabSelectionEditorCoordinator.getController();
-        } else {
-            mTabSelectionEditorCoordinator = null;
-        }
-
         mMediator = new TabGridDialogMediator(context, this, mToolbarPropertyModel,
                 tabModelSelector, tabCreatorManager, resetHandler, animationSourceViewProvider,
-                controller, tabGroupTitleEditor, shareDelegateSupplier, mComponentName);
+                tabGroupTitleEditor, shareDelegateSupplier, mComponentName);
 
         // TODO(crbug.com/1031349) : Remove the inline mode logic here, make the constructor to take
         // in a mode parameter instead.
@@ -74,13 +68,29 @@
                         : TabListCoordinator.TabListMode.GRID,
                 context, tabModelSelector, tabContentManager::getTabThumbnailWithCallback, null,
                 false, gridCardOnClickListenerProvider, mMediator.getTabGridDialogHandler(),
-                TabProperties.UiType.CLOSABLE, null, containerView, null, false, mComponentName);
-
+                TabProperties.UiType.CLOSABLE, null, containerView, false, mComponentName);
         TabListRecyclerView recyclerView = mTabListCoordinator.getContainerView();
         mToolbarCoordinator = new TabGridPanelToolbarCoordinator(
                 context, recyclerView, mToolbarPropertyModel, mParentLayout);
     }
 
+    public void initWithNative(Context context, TabModelSelector tabModelSelector,
+            TabContentManager tabContentManager) {
+        if (mIsInitialized) return;
+
+        TabSelectionEditorCoordinator.TabSelectionEditorController controller = null;
+        if (TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()) {
+            mTabSelectionEditorCoordinator = new TabSelectionEditorCoordinator(
+                    context, mContainerView, tabModelSelector, tabContentManager, mParentLayout);
+
+            controller = mTabSelectionEditorCoordinator.getController();
+        } else {
+            mTabSelectionEditorCoordinator = null;
+        }
+
+        mMediator.initWithNative(controller);
+        mTabListCoordinator.initWithNative(null);
+    }
     /**
      * Destroy any members that needs clean up.
      */
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
index cd120e2..e9ca49a1 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -99,10 +99,11 @@
     private final AnimationSourceViewProvider mAnimationSourceViewProvider;
     private final TabGroupTitleEditor mTabGroupTitleEditor;
     private final DialogHandler mTabGridDialogHandler;
-    private final TabSelectionEditorCoordinator
-            .TabSelectionEditorController mTabSelectionEditorController;
     private final ObservableSupplier<ShareDelegate> mShareDelegateSupplier;
     private final String mComponentName;
+
+    private TabSelectionEditorCoordinator
+            .TabSelectionEditorController mTabSelectionEditorController;
     private KeyboardVisibilityDelegate.KeyboardVisibilityListener mKeyboardVisibilityListener;
     private int mCurrentTabId = Tab.INVALID_TAB_ID;
     private boolean mIsUpdatingTitle;
@@ -113,8 +114,6 @@
             TabModelSelector tabModelSelector, TabCreatorManager tabCreatorManager,
             TabSwitcherMediator.ResetHandler tabSwitcherResetHandler,
             AnimationSourceViewProvider animationSourceViewProvider,
-            @Nullable TabSelectionEditorCoordinator
-                    .TabSelectionEditorController tabSelectionEditorController,
             TabGroupTitleEditor tabGroupTitleEditor,
             ObservableSupplier<ShareDelegate> shareDelegateSupplier, String componentName) {
         mContext = context;
@@ -126,7 +125,6 @@
         mAnimationSourceViewProvider = animationSourceViewProvider;
         mTabGroupTitleEditor = tabGroupTitleEditor;
         mTabGridDialogHandler = new DialogHandler();
-        mTabSelectionEditorController = tabSelectionEditorController;
         mShareDelegateSupplier = shareDelegateSupplier;
         mComponentName = componentName;
 
@@ -205,6 +203,12 @@
             }
         };
         mTabModelSelector.addObserver(mTabModelSelectorObserver);
+    }
+
+    public void initWithNative(@Nullable TabSelectionEditorCoordinator
+                                       .TabSelectionEditorController tabSelectionEditorController) {
+        mTabSelectionEditorController = tabSelectionEditorController;
+
         assert mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter()
                         instanceof TabGroupModelFilter;
 
@@ -212,7 +216,9 @@
             if (result == R.id.ungroup_tab) {
                 mModel.set(TabGridPanelProperties.IS_POPUP_WINDOW_FOCUSABLE, false);
                 List<Tab> tabs = getRelatedTabs(mCurrentTabId);
-                mTabSelectionEditorController.show(tabs);
+                if (mTabSelectionEditorController != null) {
+                    mTabSelectionEditorController.show(tabs);
+                }
             } else if (result == R.id.share_tab_group) {
                 Tab tab = mTabModelSelector.getTabById(mCurrentTabId);
                 ShareParams shareParams =
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
index d2cc33066..a5ad8c3 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
@@ -96,7 +96,9 @@
                 TabGridDialogMenuItemBinder::binder);
         // clang-format on
         listView.setOnItemClickListener((p, v, pos, id) -> {
-            mOnItemClickedCallback.onResult((int) id);
+            if (mOnItemClickedCallback != null) {
+                mOnItemClickedCallback.onResult((int) id);
+            }
             mMenuWindow.dismiss();
         });
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
index ae4444a..0a753aa1 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
@@ -82,10 +82,11 @@
         TabModelSelector tabModelSelector = activity.getTabModelSelector();
         TabContentManager tabContentManager = activity.getTabContentManager();
 
-        mTabStripCoordinator =
-                new TabListCoordinator(TabListCoordinator.TabListMode.STRIP, mContext,
-                        tabModelSelector, null, null, false, null, null, TabProperties.UiType.STRIP,
-                        null, mTabListContainerView, null, true, COMPONENT_NAME);
+        mTabStripCoordinator = new TabListCoordinator(TabListCoordinator.TabListMode.STRIP,
+                mContext, tabModelSelector, null, null, false, null, null,
+                TabProperties.UiType.STRIP, null, mTabListContainerView, true, COMPONENT_NAME);
+        mTabStripCoordinator.initWithNative(
+                mActivity.getCompositorViewHolder().getDynamicResourceLoader());
 
         mModelChangeProcessor = PropertyModelChangeProcessor.create(mModel,
                 new TabGroupUiViewBinder.ViewHolder(
@@ -98,6 +99,7 @@
                 tabContentManager, activity, activity.getCompositorViewHolder(), null, null, null,
                 mTabStripCoordinator.getTabGroupTitleEditor(),
                 mActivity.getShareDelegateSupplier());
+        mTabGridDialogCoordinator.initWithNative(mContext, tabModelSelector, tabContentManager);
 
         mMediator = new TabGroupUiMediator(visibilityController, this, mModel, tabModelSelector,
                 activity, ((ChromeTabbedActivity) activity).getOverviewModeBehavior(),
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
index 15a3ccf..9c6379a 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListCoordinator.java
@@ -79,6 +79,8 @@
     private final Context mContext;
     private final TabListModel mModel;
 
+    private boolean mIsInitialized;
+
     /**
      * Construct a coordinator for UI that shows a list of tabs.
      * @param mode Modes of showing the list of tabs. Can be used in GRID or STRIP.
@@ -96,8 +98,6 @@
      * @param selectionDelegateProvider Provider to provide selected Tabs for a selectable tab list.
      *                                  It's NULL when selection is not possible.
      * @param parentView {@link ViewGroup} The root view of the UI.
-     * @param dynamicResourceLoader The {@link DynamicResourceLoader} to register dynamic UI
-     *                              resource for compositor layer animation.
      * @param attachToParent Whether the UI should attach to root view.
      * @param componentName A unique string uses to identify different components for UMA recording.
      *                      Recommended to use the class name or make sure the string is unique
@@ -110,8 +110,7 @@
                     .GridCardOnClickListenerProvider gridCardOnClickListenerProvider,
             @Nullable TabListMediator.TabGridDialogHandler dialogHandler, @UiType int itemType,
             @Nullable TabListMediator.SelectionDelegateProvider selectionDelegateProvider,
-            @NonNull ViewGroup parentView, @Nullable DynamicResourceLoader dynamicResourceLoader,
-            boolean attachToParent, String componentName) {
+            @NonNull ViewGroup parentView, boolean attachToParent, String componentName) {
         mMode = mode;
         mContext = context;
         mModel = new TabListModel();
@@ -217,15 +216,10 @@
         }
         if (recyclerListener != null) mRecyclerView.setRecyclerListener(recyclerListener);
 
-        if (dynamicResourceLoader != null) {
-            mRecyclerView.createDynamicView(dynamicResourceLoader);
-        }
-
         // TODO (https://crbug.com/1048632): Use the current profile (i.e., regular profile or
         // incognito profile) instead of always using regular profile. It works correctly now, but
         // it is not safe.
-        TabListFaviconProvider tabListFaviconProvider =
-                new TabListFaviconProvider(context, Profile.getLastUsedRegularProfile());
+        TabListFaviconProvider tabListFaviconProvider = new TabListFaviconProvider(mContext);
 
         mMediator = new TabListMediator(context, mModel, tabModelSelector, thumbnailProvider,
                 titleProvider, tabListFaviconProvider, actionOnRelatedTabs,
@@ -280,6 +274,17 @@
         return recyclerViewRect;
     }
 
+    void initWithNative(DynamicResourceLoader dynamicResourceLoader) {
+        if (mIsInitialized) return;
+
+        mIsInitialized = true;
+
+        mMediator.initWithNative(Profile.getLastUsedRegularProfile());
+        if (dynamicResourceLoader != null) {
+            mRecyclerView.createDynamicView(dynamicResourceLoader);
+        }
+    }
+
     /**
      * Update the location of the selected thumbnail.
      * @return Whether a valid {@link Rect} is obtained.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java
index de8038f..49ff52b 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java
@@ -28,24 +28,25 @@
     private static Drawable sRoundedGlobeDrawable;
     private static Drawable sRoundedChromeDrawable;
     private final int mFaviconSize;
-    private final Profile mProfile;
-    private final FaviconHelper mFaviconHelper;
     private final Context mContext;
     @ColorInt
     private final int mDefaultIconColor;
     @ColorInt
     private final int mIncognitoIconColor;
+    private boolean mIsInitialized;
+
+    private Profile mProfile;
+    private FaviconHelper mFaviconHelper;
 
     /**
      * Construct the provider that provides favicons for tab list.
      * @param context The context to use for accessing {@link android.content.res.Resources}
-     * @param profile The profile to use for getting favicons.
+     *
      */
-    public TabListFaviconProvider(Context context, Profile profile) {
+    public TabListFaviconProvider(Context context) {
         mContext = context;
         mFaviconSize = context.getResources().getDimensionPixelSize(R.dimen.default_favicon_size);
-        mProfile = profile;
-        mFaviconHelper = new FaviconHelper();
+
         if (sRoundedGlobeDrawable == null) {
             Drawable globeDrawable =
                     AppCompatResources.getDrawable(context, R.drawable.ic_globe_24dp);
@@ -65,6 +66,18 @@
         mIncognitoIconColor = mContext.getResources().getColor(R.color.default_icon_color_light);
     }
 
+    public void initWithNative(Profile profile) {
+        if (mIsInitialized) return;
+
+        mIsInitialized = true;
+        mProfile = profile;
+        mFaviconHelper = new FaviconHelper();
+    }
+
+    public boolean isInitialized() {
+        return mIsInitialized;
+    }
+
     private Drawable processBitmap(Bitmap bitmap) {
         return FaviconUtils.createRoundedBitmapDrawable(mContext.getResources(),
                 Bitmap.createScaledBitmap(bitmap, mFaviconSize, mFaviconSize, true));
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index 41caf5ffd7..f9e8e5fbb 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -262,7 +262,6 @@
     private static Map<Integer, Integer> sTabClosedFromMapTabClosedFromMap = new HashMap<>();
 
     private final Context mContext;
-    private final TabListFaviconProvider mTabListFaviconProvider;
     private final TabListModel mModel;
     private final TabModelSelector mTabModelSelector;
     private final ThumbnailProvider mThumbnailProvider;
@@ -272,6 +271,8 @@
     private final GridCardOnClickListenerProvider mGridCardOnClickListenerProvider;
     private final TabGridDialogHandler mTabGridDialogHandler;
     private final String mComponentName;
+
+    private TabListFaviconProvider mTabListFaviconProvider;
     private boolean mActionsOnAllRelatedTabs;
     private ComponentCallbacks mComponentCallbacks;
     private TabGridItemTouchHelperCallback mTabGridItemTouchHelperCallback;
@@ -749,6 +750,13 @@
             }
         };
 
+        mTabGridItemTouchHelperCallback =
+                new TabGridItemTouchHelperCallback(mModel, mTabModelSelector, mTabClosedListener,
+                        mTabGridDialogHandler, mComponentName, mActionsOnAllRelatedTabs);
+    }
+
+    public void initWithNative(Profile profile) {
+        mTabListFaviconProvider.initWithNative(profile);
         if (TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()) {
             mTabGroupTitleEditor = new TabGroupTitleEditor(mTabModelSelector) {
                 @Override
@@ -790,10 +798,6 @@
             };
             TemplateUrlServiceFactory.get().addObserver(mTemplateUrlObserver);
         }
-
-        mTabGridItemTouchHelperCallback =
-                new TabGridItemTouchHelperCallback(mModel, mTabModelSelector, mTabClosedListener,
-                        mTabGridDialogHandler, mComponentName, mActionsOnAllRelatedTabs);
     }
 
     private void onTabClosedFrom(int tabId, String fromComponent) {
@@ -1356,6 +1360,11 @@
             mModel.get(modelIndex).model.set(TabProperties.FAVICON, null);
             return;
         }
+
+        if (!mTabListFaviconProvider.isInitialized()) {
+            return;
+        }
+
         // If there is an available icon, we fetch favicon synchronously; otherwise asynchronously.
         if (icon != null) {
             Drawable drawable = mTabListFaviconProvider.getFaviconForUrlSync(
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
index 6e5412cd..e5ec778 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
@@ -14,7 +14,6 @@
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost;
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
-import org.chromium.chrome.browser.ntp.FakeboxDelegate;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tasks.TasksSurface;
 import org.chromium.chrome.browser.tasks.TasksSurfaceProperties;
@@ -36,13 +35,12 @@
      * @param activity The {@link ChromeActivity} that creates this surface.
      * @param propertyModel The {@link PropertyModel} contains the {@link TasksSurfaceProperties} to
      *         communicate with this surface.
-     * @param fakeboxDelegate The delegate of the fake search box.
      * @param isTabCarousel Whether show the Tabs in carousel mode.
      * @param hasMVTiles whether has MV tiles on the surface.
      * @return The {@link TasksSurface}.
      */
     TasksSurface createTasksSurface(ChromeActivity activity, PropertyModel propertyModel,
-            FakeboxDelegate fakeboxDelegate, boolean isTabCarousel, boolean hasMVTiles);
+            boolean isTabCarousel, boolean hasMVTiles);
 
     /**
      * Create the {@link TabSwitcher} to display Tabs in grid.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
index 3d90228..6d3b516 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
@@ -20,7 +20,6 @@
 import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
-import org.chromium.chrome.browser.ntp.FakeboxDelegate;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tasks.TasksSurface;
 import org.chromium.chrome.browser.tasks.TasksSurfaceCoordinator;
@@ -39,9 +38,8 @@
 public class TabManagementDelegateImpl implements TabManagementDelegate {
     @Override
     public TasksSurface createTasksSurface(ChromeActivity activity, PropertyModel propertyModel,
-            FakeboxDelegate fakeboxDelegate, boolean isTabCarousel, boolean hasMVTiles) {
-        return new TasksSurfaceCoordinator(
-                activity, propertyModel, fakeboxDelegate, isTabCarousel, hasMVTiles);
+            boolean isTabCarousel, boolean hasMVTiles) {
+        return new TasksSurfaceCoordinator(activity, propertyModel, isTabCarousel, hasMVTiles);
     }
 
     @Override
@@ -54,7 +52,6 @@
 
         return new TabSwitcherCoordinator(activity, activity.getLifecycleDispatcher(),
                 activity.getTabModelSelector(), activity.getTabContentManager(),
-                activity.getCompositorViewHolder().getDynamicResourceLoader(),
                 activity.getFullscreenManager(), activity,
                 activity.getMenuOrKeyboardActionController(), activity, containerView,
                 activity.getShareDelegateSupplier(),
@@ -68,7 +65,6 @@
     public TabSwitcher createCarouselTabSwitcher(ChromeActivity activity, ViewGroup containerView) {
         return new TabSwitcherCoordinator(activity, activity.getLifecycleDispatcher(),
                 activity.getTabModelSelector(), activity.getTabContentManager(),
-                activity.getCompositorViewHolder().getDynamicResourceLoader(),
                 activity.getFullscreenManager(), activity,
                 activity.getMenuOrKeyboardActionController(), activity, containerView,
                 activity.getShareDelegateSupplier(), TabListCoordinator.TabListMode.CAROUSEL);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
index ce58e59e..d2d3f6c 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
@@ -15,6 +15,7 @@
 import androidx.recyclerview.widget.GridLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
+import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.tab.Tab;
@@ -122,8 +123,12 @@
         // device, and TabGroupContinuation is turned on.
         mTabListCoordinator = new TabListCoordinator(TabListCoordinator.TabListMode.GRID, context,
                 mTabModelSelector, tabContentManager::getTabThumbnailWithCallback, null, false,
-                null, null, TabProperties.UiType.SELECTABLE, this::getSelectionDelegate, null, null,
+                null, null, TabProperties.UiType.SELECTABLE, this::getSelectionDelegate, null,
                 false, COMPONENT_NAME);
+        // Note: The TabSelectionEditorCoordinator is always created after native is initialized.
+        assert LibraryLoader.getInstance().isInitialized();
+        mTabListCoordinator.initWithNative(null);
+
         mTabListCoordinator.registerItemType(TabProperties.UiType.DIVIDER,
                 new LayoutViewBuilder(R.layout.divider_preference),
                 (model, view, propertyKey) -> {});
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
index 11a7ae3..ad7560a 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
@@ -140,7 +140,7 @@
                 boolean isIncognito = newModel.isIncognito();
                 @ColorInt
                 int primaryColor = ApiCompatibilityUtils.getColor(mContext.getResources(),
-                        isIncognito ? R.color.dark_primary_color : R.color.modern_primary_color);
+                        isIncognito ? R.color.default_bg_color_dark : R.color.modern_primary_color);
                 // TODO(995876): Update color modern_blue_300 to active_color_dark when the
                 // associated bug is landed.
                 @ColorInt
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
index 6c72ff9..9dde93f 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcher.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.tasks.tab_management;
 
+import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.graphics.RectF;
@@ -14,7 +15,9 @@
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
+import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
 import org.chromium.ui.resources.dynamics.ViewResourceAdapter;
 
 /**
@@ -40,6 +43,12 @@
      */
     void setOnTabSelectingListener(OnTabSelectingListener listener);
 
+    /**
+     * Called when the native initialization is completed.
+     */
+    void initWithNative(Context context, TabContentManager tabContentManager,
+            DynamicResourceLoader dynamicResourceLoader);
+
     // TODO(960196): Remove the following interfaces when the associated bug is resolved.
     /**
      * An observer that is notified when the TabSwitcher view state changes.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
index 65c81609..ce9706b8 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -21,6 +21,7 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
+import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
@@ -62,14 +63,17 @@
     private final TabSwitcherMediator mMediator;
     private final MultiThumbnailCardProvider mMultiThumbnailCardProvider;
     private final TabGridDialogCoordinator mTabGridDialogCoordinator;
-    private final TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
-    private final UndoGroupSnackbarController mUndoGroupSnackbarController;
     private final TabModelSelector mTabModelSelector;
     private final @TabListCoordinator.TabListMode int mMode;
     private final MessageCardProviderCoordinator mMessageCardProviderCoordinator;
+
+    private TabSelectionEditorCoordinator mTabSelectionEditorCoordinator;
+    private UndoGroupSnackbarController mUndoGroupSnackbarController;
     private TabSuggestionsOrchestrator mTabSuggestionsOrchestrator;
     private NewTabTileCoordinator mNewTabTileCoordinator;
     private TabAttributeCache mTabAttributeCache;
+    private ViewGroup mContainer;
+    private SnackbarManager.SnackbarManageable mSnackbarManageable;
 
     private final MenuOrKeyboardActionController
             .MenuOrKeyboardActionHandler mTabSwitcherMenuActionHandler =
@@ -91,23 +95,20 @@
 
     public TabSwitcherCoordinator(Context context, ActivityLifecycleDispatcher lifecycleDispatcher,
             TabModelSelector tabModelSelector, TabContentManager tabContentManager,
-            DynamicResourceLoader dynamicResourceLoader, ChromeFullscreenManager fullscreenManager,
-            TabCreatorManager tabCreatorManager,
+            ChromeFullscreenManager fullscreenManager, TabCreatorManager tabCreatorManager,
             MenuOrKeyboardActionController menuOrKeyboardActionController,
             SnackbarManager.SnackbarManageable snackbarManageable, ViewGroup container,
             ObservableSupplier<ShareDelegate> shareDelegateSupplier,
             @TabListCoordinator.TabListMode int mode) {
         mMode = mode;
         mTabModelSelector = tabModelSelector;
+        mContainer = container;
+        mSnackbarManageable = snackbarManageable;
 
         PropertyModel containerViewModel = new PropertyModel(TabListContainerProperties.ALL_KEYS);
 
-        mTabSelectionEditorCoordinator = new TabSelectionEditorCoordinator(
-                context, container, tabModelSelector, tabContentManager, null);
-
         mMediator = new TabSwitcherMediator(this, containerViewModel, tabModelSelector,
-                fullscreenManager, container, mTabSelectionEditorCoordinator.getController(),
-                tabContentManager, this, mode);
+                fullscreenManager, container, tabContentManager, this, mode);
 
         mMultiThumbnailCardProvider =
                 new MultiThumbnailCardProvider(context, tabContentManager, tabModelSelector);
@@ -122,10 +123,9 @@
                     R.plurals.bottom_tab_grid_title_placeholder, numRelatedTabs, numRelatedTabs);
         };
 
-        mTabListCoordinator =
-                new TabListCoordinator(mode, context, tabModelSelector, mMultiThumbnailCardProvider,
-                        titleProvider, true, mMediator, null, TabProperties.UiType.CLOSABLE, null,
-                        container, dynamicResourceLoader, true, COMPONENT_NAME);
+        mTabListCoordinator = new TabListCoordinator(mode, context, tabModelSelector,
+                mMultiThumbnailCardProvider, titleProvider, true, mMediator, null,
+                TabProperties.UiType.CLOSABLE, null, container, true, COMPONENT_NAME);
         mContainerViewChangeProcessor = PropertyModelChangeProcessor.create(containerViewModel,
                 mTabListCoordinator.getContainerView(), TabListContainerViewBinder::bind);
 
@@ -156,21 +156,7 @@
                         MessageCardViewBinder::bind);
             }
 
-            if (ChromeFeatureList.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)) {
-                mTabSuggestionsOrchestrator =
-                        new TabSuggestionsOrchestrator(mTabModelSelector, lifecycleDispatcher);
-                TabSuggestionMessageService tabSuggestionMessageService =
-                        new TabSuggestionMessageService(context, tabModelSelector,
-                                mTabSelectionEditorCoordinator.getController());
-                mTabSuggestionsOrchestrator.addObserver(tabSuggestionMessageService);
-                mMessageCardProviderCoordinator.subscribeMessageService(
-                        tabSuggestionMessageService);
-            }
-
-            if (ChromeFeatureList
-                            .getFieldTrialParamByFeature(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID,
-                                    "tab_grid_layout_android_new_tab_tile")
-                            .equals("NewTabTile")) {
+            if (TabUiFeatureUtilities.isTabGridLayoutAndroidNewTabTileEnabled()) {
                 mNewTabTileCoordinator =
                         new NewTabTileCoordinator(tabModelSelector, tabCreatorManager);
                 mTabListCoordinator.registerItemType(TabProperties.UiType.NEW_TAB_TILE,
@@ -205,6 +191,34 @@
         return sAppendedMessagesForTesting;
     }
 
+    @Override
+    public void initWithNative(Context context, TabContentManager tabContentManager,
+            DynamicResourceLoader dynamicResourceLoader) {
+        mTabSelectionEditorCoordinator = new TabSelectionEditorCoordinator(
+                context, mContainer, mTabModelSelector, tabContentManager, null);
+        mMediator.initWithNative(mTabSelectionEditorCoordinator.getController());
+
+        if (mTabGridDialogCoordinator != null) {
+            mTabGridDialogCoordinator.initWithNative(context, mTabModelSelector, tabContentManager);
+        }
+
+        mTabListCoordinator.initWithNative(dynamicResourceLoader);
+        mMultiThumbnailCardProvider.initWithNative();
+
+        if (mMode == TabListCoordinator.TabListMode.GRID) {
+            if (CachedFeatureFlags.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)) {
+                mTabSuggestionsOrchestrator =
+                        new TabSuggestionsOrchestrator(mTabModelSelector, mLifecycleDispatcher);
+                TabSuggestionMessageService tabSuggestionMessageService =
+                        new TabSuggestionMessageService(context, mTabModelSelector,
+                                mTabSelectionEditorCoordinator.getController());
+                mTabSuggestionsOrchestrator.addObserver(tabSuggestionMessageService);
+                mMessageCardProviderCoordinator.subscribeMessageService(
+                        tabSuggestionMessageService);
+            }
+        }
+    }
+
     // TabSwitcher implementation.
     @Override
     public void setOnTabSelectingListener(OnTabSelectingListener listener) {
@@ -379,7 +393,7 @@
     }
 
     private boolean shouldRegisterMessageItemType() {
-        return ChromeFeatureList.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)
+        return CachedFeatureFlags.isEnabled(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)
                 || (TabUiFeatureUtilities.isTabGroupsAndroidEnabled()
                         && !TabSwitcherMediator.isShowingTabsInMRUOrder());
     }
@@ -410,7 +424,9 @@
             mNewTabTileCoordinator.destroy();
         }
         mMultiThumbnailCardProvider.destroy();
-        mTabSelectionEditorCoordinator.destroy();
+        if (mTabSelectionEditorCoordinator != null) {
+            mTabSelectionEditorCoordinator.destroy();
+        }
         mMediator.destroy();
         mLifecycleDispatcher.unregister(this);
         if (mTabAttributeCache != null) {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
index 7722d4a..4eddecf 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -78,8 +78,7 @@
     private static final int DEFAULT_SOFT_CLEANUP_DELAY_MS = 3_000;
     private static final String CLEANUP_DELAY_PARAM = "cleanup-delay";
     private static final int DEFAULT_CLEANUP_DELAY_MS = 30_000;
-    private Integer mSoftCleanupDelayMsForTesting;
-    private Integer mCleanupDelayMsForTesting;
+
     private final Handler mHandler;
     private final Runnable mSoftClearTabListRunnable;
     private final Runnable mClearTabListRunnable;
@@ -91,13 +90,15 @@
     private final TabModelSelectorObserver mTabModelSelectorObserver;
     private final ObserverList<TabSwitcher.OverviewModeObserver> mObservers = new ObserverList<>();
     private final ChromeFullscreenManager mFullscreenManager;
-    private TabGridDialogMediator.DialogController mTabGridDialogController;
     private final ChromeFullscreenManager.FullscreenListener mFullscreenListener;
-
     private final ViewGroup mContainerView;
-    private final TabSelectionEditorCoordinator
-            .TabSelectionEditorController mTabSelectionEditorController;
     private final TabContentManager mTabContentManager;
+
+    private Integer mSoftCleanupDelayMsForTesting;
+    private Integer mCleanupDelayMsForTesting;
+    private TabGridDialogMediator.DialogController mTabGridDialogController;
+    private TabSelectionEditorCoordinator
+            .TabSelectionEditorController mTabSelectionEditorController;
     private TabSwitcher.OnTabSelectingListener mOnTabSelectingListener;
 
     /**
@@ -176,15 +177,12 @@
      * @param tabModelSelector {@link TabModelSelector} to observer for model and selection changes.
      * @param fullscreenManager {@link FullscreenManager} to use.
      * @param containerView The container {@link ViewGroup} to use.
-     * @param tabSelectionEditorController The controller that can control the visibility of the
-     *                                     TabSelectionEditor.
      * @param tabContentManager The {@link TabContentManager} for first meaningful paint event.
      * @param mode One of the {@link TabListCoordinator.TabListMode}.
      */
     TabSwitcherMediator(ResetHandler resetHandler, PropertyModel containerViewModel,
             TabModelSelector tabModelSelector, ChromeFullscreenManager fullscreenManager,
             ViewGroup containerView,
-            TabSelectionEditorCoordinator.TabSelectionEditorController tabSelectionEditorController,
             TabContentManager tabContentManager, MessageItemsController messageItemsController,
             @TabListCoordinator.TabListMode int mode) {
         mResetHandler = resetHandler;
@@ -291,10 +289,10 @@
         mTabModelSelector.getTabModelFilterProvider().addTabModelFilterObserver(mTabModelObserver);
 
         mContainerViewModel.set(VISIBILITY_LISTENER, this);
-        mContainerViewModel.set(IS_INCOGNITO,
-                mTabModelSelector.getTabModelFilterProvider()
-                        .getCurrentTabModelFilter()
-                        .isIncognito());
+        TabModelFilter tabModelFilter =
+                mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter();
+        mContainerViewModel.set(
+                IS_INCOGNITO, tabModelFilter == null ? false : tabModelFilter.isIncognito());
         mContainerViewModel.set(ANIMATE_VISIBILITY_CHANGES, true);
 
         // Container view takes care of padding and margin in start surface.
@@ -310,7 +308,6 @@
         mClearTabListRunnable =
                 () -> mResetHandler.resetWithTabList(null, false, mShowTabsInMruOrder);
         mHandler = new Handler();
-        mTabSelectionEditorController = tabSelectionEditorController;
         mTabContentManager = tabContentManager;
 
         // TODO(crbug.com/982018): Let the start surface pass in the parameter and add unit test for
@@ -319,6 +316,16 @@
     }
 
     /**
+     * Called after native initialization is completed.
+     * @param tabSelectionEditorController The controller that can control the visibility of the
+     *                                     TabSelectionEditor.
+     */
+    public void initWithNative(TabSelectionEditorCoordinator
+                                       .TabSelectionEditorController tabSelectionEditorController) {
+        mTabSelectionEditorController = tabSelectionEditorController;
+    }
+
+    /**
      * Set the controller of the TabGridDialog so that it can be directly controlled.
      * @param tabGridDialogController The handler of the Grid Dialog
      */
@@ -499,13 +506,12 @@
         mHandler.removeCallbacks(mSoftClearTabListRunnable);
         mHandler.removeCallbacks(mClearTabListRunnable);
         boolean quick = false;
-        if (mTabModelSelector.getTabModelFilterProvider()
-                        .getCurrentTabModelFilter()
-                        .isTabModelRestored()) {
+        TabModelFilter currentTabModelFilter =
+                mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter();
+        if (currentTabModelFilter != null && currentTabModelFilter.isTabModelRestored()) {
             if (TabFeatureUtilities.isTabToGtsAnimationEnabled()) {
                 quick = mResetHandler.resetWithTabList(
-                        mTabModelSelector.getTabModelFilterProvider().getCurrentTabModelFilter(),
-                        false, mShowTabsInMruOrder);
+                        currentTabModelFilter, false, mShowTabsInMruOrder);
             }
             setInitialScrollIndexOffset();
         }
@@ -571,7 +577,10 @@
     @Override
     public boolean onBackPressed() {
         if (!mContainerViewModel.get(IS_VISIBLE)) return false;
-        if (mTabSelectionEditorController.handleBackPressed()) return true;
+        if (mTabSelectionEditorController != null
+                && mTabSelectionEditorController.handleBackPressed()) {
+            return true;
+        }
         if (mTabGridDialogController != null && mTabGridDialogController.handleBackPressed()) {
             return true;
         }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
index d06ec35..6ead748 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridAccessibilityHelperTest.java
@@ -43,7 +43,6 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
@@ -66,6 +65,7 @@
 // clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 public class TabGridAccessibilityHelperTest {
     // clang-format on
     @IntDef({TabMovementDirection.LEFT, TabMovementDirection.RIGHT, TabMovementDirection.UP,
@@ -87,7 +87,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
         mActivityTestRule.startMainActivityFromLauncher();
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof StartSurfaceLayout);
@@ -100,7 +99,6 @@
 
     @After
     public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
         mActivityTestRule.getActivity().setRequestedOrientation(
                 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
     }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index b50d71d..14393470 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -26,6 +26,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUPS_ANDROID;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstCardFromTabSwitcher;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstTabInDialog;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickScrimToExitDialog;
@@ -69,7 +71,6 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
@@ -87,6 +88,7 @@
 // clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+@Features.EnableFeatures({TAB_GRID_LAYOUT_ANDROID, TAB_GROUPS_ANDROID})
 public class TabGridDialogTest {
     // clang-format on
 
@@ -106,8 +108,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         TabUiFeatureUtilities.setTabManagementModuleSupportedForTesting(true);
         mActivityTestRule.startMainActivityFromLauncher();
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
@@ -120,8 +120,6 @@
 
     @After
     public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
         TabUiFeatureUtilities.setTabManagementModuleSupportedForTesting(null);
     }
 
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
index 62dff19e..437677dd 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphTest.java
@@ -35,7 +35,6 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -48,7 +47,6 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
@@ -69,6 +67,7 @@
 // clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
 @Features.DisableFeatures(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS)
 @DisabledTest(message = "crbug.com/1062659 This test suite is failing on several bots.")
 public class TabGridIphTest {
@@ -84,7 +83,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         mActivityTestRule.startMainActivityOnBlankPage();
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof StartSurfaceLayout);
@@ -94,11 +92,6 @@
                                             .getCurrentTabModelFilter()::isTabModelRestored);
     }
 
-    @After
-    public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
-    }
-
     @Test
     @MediumTest
     public void testShowAndHideIphDialog() throws InterruptedException {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
index 22a3bbbe..1b8777a 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupPopupUiTest.java
@@ -33,8 +33,6 @@
 import android.view.View;
 import android.widget.FrameLayout;
 
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestRule;
@@ -44,7 +42,6 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.fullscreen.FullscreenManagerTestUtils;
@@ -59,6 +56,7 @@
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
+import org.chromium.ui.UiSwitches;
 import org.chromium.ui.test.util.UiRestriction;
 
 import java.util.List;
@@ -66,8 +64,13 @@
 /** End-to-end tests for TabGroupPopupUi component. */
 @RunWith(ChromeJUnit4ClassRunner.class)
 // clang-format off
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+// TODO(crbug.com/1058231): ENABLE_SCREENSHOT_UI_MODE is to disable IPHs for TabGroups.
+//  We should make this test more robust so that it's agnostic of IPHs.
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        UiSwitches.ENABLE_SCREENSHOT_UI_MODE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, ChromeFeatureList.CHROME_DUET,
+        ChromeFeatureList.DUET_TABSTRIP_INTEGRATION_ANDROID})
 public class TabGroupPopupUiTest {
     // clang-format on
 
@@ -77,20 +80,6 @@
     @Rule
     public TestRule mProcessor = new Features.InstrumentationProcessor();
 
-    @Before
-    public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.CHROME_DUET, true);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.DUET_TABSTRIP_INTEGRATION_ANDROID, true);
-    }
-
-    @After
-    public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.CHROME_DUET, null);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.DUET_TABSTRIP_INTEGRATION_ANDROID, null);
-    }
-
     @Test
     @MediumTest
     public void testOnAnchorViewChanged_HOME_SEARCH_TAB_SWITCHER() throws InterruptedException {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
index 1205141..9cbc0a1 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiTest.java
@@ -12,6 +12,8 @@
 import static org.hamcrest.Matchers.allOf;
 import static org.junit.Assert.assertTrue;
 
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUPS_ANDROID;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstCardFromTabSwitcher;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickNthTabInDialog;
 import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabs;
@@ -24,7 +26,6 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -36,8 +37,6 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.features.start_surface.StartSurfaceLayout;
 import org.chromium.chrome.tab_ui.R;
@@ -55,6 +54,7 @@
 // clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+@Features.EnableFeatures({TAB_GRID_LAYOUT_ANDROID, TAB_GROUPS_ANDROID})
 public class TabGroupUiTest {
     // clang-format on
 
@@ -69,8 +69,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         mActivityTestRule.startMainActivityFromLauncher();
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof StartSurfaceLayout);
@@ -80,12 +78,6 @@
                                             .getCurrentTabModelFilter()::isTabModelRestored);
     }
 
-    @After
-    public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
-    }
-
     @Test
     @MediumTest
     @Feature({"RenderTest"})
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java
index b226921..aec509d 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListContainerViewBinderTest.java
@@ -28,7 +28,6 @@
 import org.chromium.base.CommandLine;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.DisableIf;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -45,6 +44,7 @@
  * Tests for {@link TabListRecyclerView} and {@link TabListContainerViewBinder}
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 public class TabListContainerViewBinderTest extends DummyUiActivityTestCase {
     /**
      * DummyUiActivityTestCase also needs {@link ChromeFeatureList}'s
@@ -98,7 +98,6 @@
     @Override
     public void setUpTest() throws Exception {
         super.setUpTest();
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
 
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> { mRecyclerView = getActivity().findViewById(R.id.tab_list_view); });
@@ -230,7 +229,7 @@
         assertThat(mRecyclerView.getBackground(), instanceOf(ColorDrawable.class));
         assertThat(((ColorDrawable) mRecyclerView.getBackground()).getColor(),
                 equalTo(ApiCompatibilityUtils.getColor(
-                        mRecyclerView.getResources(), R.color.dark_primary_color)));
+                        mRecyclerView.getResources(), R.color.default_bg_color_dark)));
 
         mContainerModel.set(TabListContainerProperties.IS_INCOGNITO, false);
         assertThat(mRecyclerView.getBackground(), instanceOf(ColorDrawable.class));
@@ -289,7 +288,6 @@
     @Override
     public void tearDownTest() throws Exception {
         mMCP.destroy();
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
         super.tearDownTest();
     }
 }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
index 95859098..6999fe3 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
@@ -7,7 +7,6 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -16,7 +15,6 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.Tab;
@@ -38,8 +36,11 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+// clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
 public class TabSelectionEditorTest {
+    // clang-format on
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
@@ -54,8 +55,6 @@
 
     @Before
     public void setUp() throws Exception {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
-
         mActivityTestRule.startMainActivityFromLauncher();
         TabUiTestHelper.createTabs(mActivityTestRule.getActivity(), false, 2);
 
@@ -71,11 +70,6 @@
         });
     }
 
-    @After
-    public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
-    }
-
     @Test
     @MediumTest
     public void testShowTabs() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
index 7a3381d..c606c2d 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
@@ -24,7 +24,6 @@
 
 import androidx.recyclerview.widget.RecyclerView;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -37,7 +36,6 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.toolbar.IncognitoToggleTabLayout;
@@ -60,6 +58,7 @@
                 ChromeSwitches.DISABLE_TAB_MERGING_FOR_TESTING})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
 @MinAndroidSdkLevel(Build.VERSION_CODES.N)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 public class TabSwitcherMultiWindowTest {
     // clang-format on
     @Rule
@@ -70,7 +69,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
         mActivityTestRule.startMainActivityFromLauncher();
         Layout layout = mActivityTestRule.getActivity().getLayoutManager().getOverviewLayout();
         assertTrue(layout instanceof StartSurfaceLayout);
@@ -81,11 +79,6 @@
                         .getCurrentTabModelFilter()::isTabModelRestored));
     }
 
-    @After
-    public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
-    }
-
     @Test
     @MediumTest
     @TargetApi(Build.VERSION_CODES.N)
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java
index c2c6cd8..89ddb88 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediatorUnitTest.java
@@ -76,8 +76,9 @@
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        mMediator = new TasksSurfaceMediator(mPropertyModel, mFakeboxDelegate,
-                mLearnMoreOnClickListener, mCookieControlsManager, true);
+        mMediator = new TasksSurfaceMediator(
+                mPropertyModel, mLearnMoreOnClickListener, mCookieControlsManager, true);
+        mMediator.initWithNative(mFakeboxDelegate);
     }
 
     @After
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
index 559f6aa..05cbb7f 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/PseudoTabUnitTest.java
@@ -20,7 +20,6 @@
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
@@ -294,9 +293,9 @@
     }
 
     @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void getRelatedTabs_noProvider_groupDisabled_single() {
         doReturn(null).when(mTabModelFilterProvider).getTabModelFilter(anyBoolean());
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
 
         PseudoTab tab1 = PseudoTab.fromTabId(TAB1_ID);
         List<PseudoTab> related = PseudoTab.getRelatedTabs(tab1, mTabModelFilterProvider);
@@ -305,9 +304,9 @@
     }
 
     @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void getRelatedTabs_noProvider_groupDisabled_group() {
         doReturn(null).when(mTabModelFilterProvider).getTabModelFilter(anyBoolean());
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
 
         TabAttributeCache.setRootIdForTesting(TAB1_ID, TAB1_ID);
         TabAttributeCache.setRootIdForTesting(TAB2_ID, TAB1_ID);
@@ -322,9 +321,9 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void getRelatedTabs_noProvider_single() {
         doReturn(null).when(mTabModelFilterProvider).getTabModelFilter(anyBoolean());
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
 
         PseudoTab tab1 = PseudoTab.fromTabId(TAB1_ID);
         List<PseudoTab> related = PseudoTab.getRelatedTabs(tab1, mTabModelFilterProvider);
@@ -333,9 +332,9 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void getRelatedTabs_noProvider_group() {
         doReturn(null).when(mTabModelFilterProvider).getTabModelFilter(anyBoolean());
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
 
         TabAttributeCache.setRootIdForTesting(TAB1_ID, TAB1_ID);
         TabAttributeCache.setRootIdForTesting(TAB2_ID, TAB1_ID);
@@ -349,9 +348,9 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void getRelatedTabs_noProvider_badGroup() {
         doReturn(null).when(mTabModelFilterProvider).getTabModelFilter(anyBoolean());
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
 
         TabAttributeCache.setRootIdForTesting(TAB1_ID, TAB1_ID);
         TabAttributeCache.setRootIdForTesting(TAB2_ID, Tab.INVALID_TAB_ID);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java
index 5c147d0..61f477f 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediatorUnitTest.java
@@ -47,7 +47,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.share.ShareDelegate;
 import org.chromium.chrome.browser.tab.Tab;
@@ -77,8 +76,11 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+// clang-format off
+@Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
 @Features.DisableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
 public class TabGridDialogMediatorUnitTest {
+    // clang-format on
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
 
@@ -145,7 +147,6 @@
 
         MockitoAnnotations.initMocks(this);
 
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         mTab1 = prepareTab(TAB1_ID, TAB1_TITLE);
         mTab2 = prepareTab(TAB2_ID, TAB2_TITLE);
         List<Tab> tabs1 = new ArrayList<>(Arrays.asList(mTab1));
@@ -197,14 +198,13 @@
         mModel = new PropertyModel(TabGridPanelProperties.ALL_KEYS);
         mMediator = new TabGridDialogMediator(mContext, mDialogController, mModel,
                 mTabModelSelector, mTabCreatorManager, mTabSwitcherResetHandler,
-                mAnimationSourceViewProvider, mTabSelectionEditorController, mTabGroupTitleEditor,
-                mShareDelegateSupplier, "");
+                mAnimationSourceViewProvider, mTabGroupTitleEditor, mShareDelegateSupplier, "");
+        mMediator.initWithNative(mTabSelectionEditorController);
     }
 
     @After
     public void tearDown() {
         RecordHistogram.setDisabledForTests(false);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
     }
 
     @Test
@@ -875,7 +875,8 @@
         // the animationParamsProvider is null.
         mMediator = new TabGridDialogMediator(mContext, mDialogController, mModel,
                 mTabModelSelector, mTabCreatorManager, mTabSwitcherResetHandler, null,
-                mTabSelectionEditorController, mTabGroupTitleEditor, mShareDelegateSupplier, "");
+                mTabGroupTitleEditor, mShareDelegateSupplier, "");
+        mMediator.initWithNative(mTabSelectionEditorController);
 
         // Mock that the dialog is hidden and animation source view and header title are all null.
         mModel.set(TabGridPanelProperties.IS_DIALOG_VISIBLE, false);
@@ -900,7 +901,8 @@
         // the animationParamsProvider is null.
         mMediator = new TabGridDialogMediator(mContext, mDialogController, mModel,
                 mTabModelSelector, mTabCreatorManager, mTabSwitcherResetHandler, null,
-                mTabSelectionEditorController, mTabGroupTitleEditor, mShareDelegateSupplier, "");
+                mTabGroupTitleEditor, mShareDelegateSupplier, "");
+        mMediator.initWithNative(mTabSelectionEditorController);
         // Mock that the dialog is hidden and animation source view and header title are all null.
         mModel.set(TabGridPanelProperties.IS_DIALOG_VISIBLE, false);
         mModel.set(TabGridPanelProperties.ANIMATION_SOURCE_VIEW, null);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
index 036ac59..1e70db1 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallbackUnitTest.java
@@ -42,7 +42,6 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
@@ -67,6 +66,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
 public class TabGridItemTouchHelperCallbackUnitTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
@@ -167,7 +167,6 @@
         doReturn(mTab2).when(mTabGroupModelFilter).getTabAt(POSITION2);
         doReturn(mTab3).when(mTabGroupModelFilter).getTabAt(POSITION3);
         doReturn(mTab4).when(mTabGroupModelFilter).getTabAt(POSITION4);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         setupRecyclerView();
 
         mModel = new TabListModel();
@@ -209,7 +208,6 @@
     @After
     public void tearDown() {
         RecordHistogram.setDisabledForTests(false);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
     }
 
     @Test
@@ -314,8 +312,8 @@
     }
 
     @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void onReleaseTab_MergeBackward_WithoutGroup() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
         initAndAssertAllProperties();
         doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
 
@@ -340,8 +338,8 @@
     }
 
     @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void onReleaseTab_MergeForward_WithoutGroup() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
         initAndAssertAllProperties();
         doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
 
@@ -604,8 +602,8 @@
     }
 
     @Test
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void onDragTab_Hovered_GTS_WithoutGroup() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
         initAndAssertAllProperties();
         doReturn(mEmptyTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
 
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index 07aacb4..93146df 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -130,7 +130,7 @@
 @Config(manifest = Config.NONE)
 // clang-format off
 @Features.EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
-@Features.DisableFeatures(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID)
+@Features.DisableFeatures({TAB_GROUPS_ANDROID, TAB_GROUPS_CONTINUATION_ANDROID})
 public class TabListMediatorUnitTest {
     // clang-format on
     @Rule
@@ -251,7 +251,6 @@
         MockitoAnnotations.initMocks(this);
         mMocker.mock(UrlUtilitiesJni.TEST_HOOKS, mUrlUtilitiesJniMock);
 
-        CachedFeatureFlags.setForTesting(TAB_GROUPS_ANDROID, false);
         CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
         TabUiFeatureUtilities.setSearchTermChipEnabledForTesting(true);
         mTab1 = prepareTab(TAB1_ID, TAB1_TITLE, TAB1_URL);
@@ -315,6 +314,7 @@
                 .when(mUrlUtilitiesJniMock)
                 .getDomainAndRegistry(eq(TAB3_URL), anyBoolean());
         doNothing().when(mTemplateUrlService).addObserver(mTemplateUrlServiceObserver.capture());
+        doReturn(true).when(mTabListFaviconProvider).isInitialized();
 
         mModel = new TabListModel();
         TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService);
@@ -323,6 +323,7 @@
                 mTabContentManager::getTabThumbnailWithCallback, mTitleProvider,
                 mTabListFaviconProvider, false, null, mGridCardOnClickListenerProvider, null,
                 getClass().getSimpleName(), UiType.CLOSABLE);
+        mMediator.initWithNative(mProfile);
         mMediator.registerOrientationListener(mGridLayoutManager);
         TrackerFactory.setTrackerForTests(mTracker);
     }
@@ -330,7 +331,6 @@
     @After
     public void tearDown() {
         RecordHistogram.setDisabledForTests(false);
-        CachedFeatureFlags.setForTesting(TAB_GROUPS_ANDROID, null);
         CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, null);
         TabUiFeatureUtilities.setSearchTermChipEnabledForTesting(null);
         TabAttributeCache.clearAllForTesting();
@@ -1409,7 +1409,7 @@
     }
 
     @Test
-    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
+    @Features.DisableFeatures({TAB_GROUPS_ANDROID})
     public void testUrlUpdated_forSingleTab_GTS_GroupNotEnabled() {
         initAndAssertAllProperties();
         assertNotEquals(NEW_URL, mModel.get(POSITION1).model.get(TabProperties.URL));
@@ -1921,6 +1921,7 @@
                 mTabContentManager::getTabThumbnailWithCallback, mTitleProvider,
                 mTabListFaviconProvider, true, null, null, null, getClass().getSimpleName(),
                 TabProperties.UiType.CLOSABLE);
+        mMediator.initWithNative(mProfile);
 
         initAndAssertAllProperties();
 
@@ -1944,6 +1945,7 @@
                 mTabContentManager::getTabThumbnailWithCallback, mTitleProvider,
                 mTabListFaviconProvider, true, null, null, null, getClass().getSimpleName(),
                 TabProperties.UiType.CLOSABLE);
+        mMediator.initWithNative(mProfile);
 
         initAndAssertAllProperties();
 
@@ -2071,13 +2073,15 @@
         } else if (type == TabListMediatorType.TAB_STRIP) {
             uiType = TabProperties.UiType.STRIP;
         }
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
+        // TODO(crbug.com/1058196): avoid re-instanciate TabListMediator by using annotation.
+        CachedFeatureFlags.setForTesting(TAB_GROUPS_ANDROID, true);
 
         TabListMediator.SearchTermChipUtils.setIsSearchChipAdaptiveIconEnabledForTesting(false);
         mMediator = new TabListMediator(mContext, mModel, mTabModelSelector,
                 mTabContentManager::getTabThumbnailWithCallback, mTitleProvider,
                 mTabListFaviconProvider, actionOnRelatedTabs, null, null, handler,
                 getClass().getSimpleName(), uiType);
+        mMediator.initWithNative(mProfile);
 
         // There are two TabModelObserver and two TabGroupModelFilter.Observer added when
         // initializing TabListMediator, one set from TabListMediator and the other from
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
index 1296c41c..a366e8c 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -46,7 +46,6 @@
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.compositor.layouts.Layout;
 import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tab.Tab;
@@ -76,7 +75,7 @@
 @Config(manifest = Config.NONE, shadows = {ShadowRecordHistogram.class})
 @DisableFeatures(
         {ChromeFeatureList.TAB_SWITCHER_ON_RETURN, ChromeFeatureList.START_SURFACE_ANDROID})
-@EnableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
+@EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, ChromeFeatureList.TAB_TO_GTS_ANIMATION})
 public class TabSwitcherMediatorUnitTest {
     @Rule
     public TestRule mProcessor = new Features.JUnitProcessor();
@@ -142,7 +141,6 @@
     public void setUp() {
         ShadowRecordHistogram.reset();
         RecordHistogram.setDisabledForTests(true);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
 
         MockitoAnnotations.initMocks(this);
 
@@ -187,8 +185,9 @@
         mModel = new PropertyModel(TabListContainerProperties.ALL_KEYS);
         mModel.addObserver(mPropertyObserver);
         mMediator = new TabSwitcherMediator(mResetHandler, mModel, mTabModelSelector,
-                mFullscreenManager, mCompositorViewHolder, null, null, mMessageItemsController,
+                mFullscreenManager, mCompositorViewHolder, null, mMessageItemsController,
                 TabListCoordinator.TabListMode.GRID);
+        mMediator.initWithNative(null);
         mMediator.addOverviewModeObserver(mOverviewModeObserver);
         mMediator.setOnTabSelectingListener(mLayout::onTabSelecting);
     }
@@ -196,8 +195,6 @@
     @After
     public void tearDown() {
         RecordHistogram.setDisabledForTests(false);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, null);
     }
 
     @Test
@@ -565,8 +562,8 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void openDialogButton_SingleTab() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         mMediator.setTabGridDialogController(mTabGridDialogController);
         // Mock that tab 1 is a single tab.
         doReturn(new ArrayList<>(Arrays.asList(mTab1)))
@@ -576,8 +573,8 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void openDialogButton_TabGroup_NotEmpty() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         mMediator.setTabGridDialogController(mTabGridDialogController);
         // Set up a tab group.
         TabImpl newTab = prepareTab(TAB4_ID, TAB4_TITLE);
@@ -592,8 +589,8 @@
     }
 
     @Test
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void openDialogButton_TabGroup_Empty() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         mMediator.setTabGridDialogController(mTabGridDialogController);
         // Assume that due to tab model change, current group becomes empty in current model.
         doReturn(new ArrayList<>()).when(mTabModelFilter).getRelatedTabList(TAB1_ID);
diff --git a/chrome/android/features/vr/BUILD.gn b/chrome/android/features/vr/BUILD.gn
index 7d1189f9..9f50071 100644
--- a/chrome/android/features/vr/BUILD.gn
+++ b/chrome/android/features/vr/BUILD.gn
@@ -77,10 +77,10 @@
     "//content/public/android:content_java",
     "//device/vr:java",
     "//third_party/android_deps:android_arch_lifecycle_common_java",
-    "//third_party/android_deps:android_arch_lifecycle_runtime_java",
-    "//third_party/android_deps:android_arch_lifecycle_viewmodel_java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_runtime_java",
+    "//third_party/android_deps:androidx_lifecycle_lifecycle_viewmodel_java",
     "//third_party/gvr-android-keyboard:kb_java",
     "//third_party/gvr-android-sdk:gvr_common_java",
     "//ui/android:ui_full_java",
diff --git a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
index 299da1c..4647d7d8 100644
--- a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
+++ b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
@@ -1058,7 +1058,7 @@
         android:exported="true"
         android:label="WebView
         DevTools"
-        android:name="org.chromium.android_webview.devui.LauncherActivity"
+        android:name="org.chromium.android_webview.devui.MonochromeLauncherActivity"
         android:targetActivity="org.chromium.android_webview.devui.MainActivity">
       <intent-filter>
         <action android:name="android.intent.action.MAIN"/>
diff --git a/chrome/android/java/res/color/item_chooser_row_icon_color.xml b/chrome/android/java/res/color/item_chooser_row_icon_color.xml
index fe24d39..773e285f7 100644
--- a/chrome/android/java/res/color/item_chooser_row_icon_color.xml
+++ b/chrome/android/java/res/color/item_chooser_row_icon_color.xml
@@ -5,6 +5,7 @@
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:color="@color/default_icon_color_inverse" android:state_selected="true"/>
-    <item android:color="@color/default_icon_color_disabled" android:state_enabled="false"/>
+    <item android:alpha="@dimen/default_disabled_alpha"
+        android:state_enabled="false" android:color="@color/default_icon_color" />
     <item android:color="@color/default_icon_color"/>
 </selector>
diff --git a/chrome/android/java/res/color/tint_on_blue_bg.xml b/chrome/android/java/res/color/tint_on_blue_bg.xml
index d6d0924..f40b744 100644
--- a/chrome/android/java/res/color/tint_on_blue_bg.xml
+++ b/chrome/android/java/res/color/tint_on_blue_bg.xml
@@ -5,6 +5,7 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="@color/default_icon_color_inverse_disabled" android:state_enabled="false" />
+    <item android:alpha="@dimen/default_disabled_alpha"
+        android:color="@color/default_icon_color_inverse" android:state_enabled="false" />
     <item android:color="@color/default_icon_color_inverse" />
 </selector>
diff --git a/chrome/android/java/res/color/toolbar_icon_tint_dark.xml b/chrome/android/java/res/color/toolbar_icon_tint_dark.xml
index 891b016..4566a5da 100644
--- a/chrome/android/java/res/color/toolbar_icon_tint_dark.xml
+++ b/chrome/android/java/res/color/toolbar_icon_tint_dark.xml
@@ -10,6 +10,7 @@
     <item android:state_focused="true" android:color="@color/default_icon_color_dark" />
     <item android:state_pressed="true" android:color="@color/default_icon_color_dark" />
     <item android:state_activated="true" android:color="@color/default_icon_color_dark" />
-    <item android:state_enabled="false" android:color="@color/default_icon_color_disabled_dark" />
+    <item android:state_enabled="false" android:alpha="@dimen/default_disabled_alpha"
+        android:color="@color/default_icon_color_dark" />
     <item android:color="@color/default_icon_color_dark"/>
 </selector>
\ No newline at end of file
diff --git a/chrome/android/java/res/drawable/google_pay_with_divider.xml b/chrome/android/java/res/drawable/google_pay_with_divider.xml
index 7f28b308f..8938500 100644
--- a/chrome/android/java/res/drawable/google_pay_with_divider.xml
+++ b/chrome/android/java/res/drawable/google_pay_with_divider.xml
@@ -37,5 +37,5 @@
     </group>
     <path
         android:pathData="M50 16l0 -14 1 0 0 14z"
-        android:fillColor="@color/divider_bg_color" />
+        android:fillColor="@color/divider_line_bg_color" />
 </vector>
diff --git a/chrome/android/java/res/drawable/list_divider_compat.xml b/chrome/android/java/res/drawable/list_divider_compat.xml
index dddef8e..66d3669d 100644
--- a/chrome/android/java/res/drawable/list_divider_compat.xml
+++ b/chrome/android/java/res/drawable/list_divider_compat.xml
@@ -10,7 +10,7 @@
     android:insetLeft="@dimen/pref_list_padding_kitkat"
     android:insetRight="@dimen/pref_list_padding_kitkat">
     <shape>
-        <solid android:color="@color/divider_bg_color" />
+        <solid android:color="@color/divider_line_bg_color" />
         <size
             android:width="1dp"
             android:height="1dp" />
diff --git a/chrome/android/java/res/layout/find_in_page.xml b/chrome/android/java/res/layout/find_in_page.xml
index 065f795..d4f1720 100644
--- a/chrome/android/java/res/layout/find_in_page.xml
+++ b/chrome/android/java/res/layout/find_in_page.xml
@@ -39,7 +39,7 @@
         android:layout_height="match_parent"
         android:layout_marginTop="8dp"
         android:layout_marginBottom="8dp"
-        android:background="@color/divider_bg_color" />
+        android:background="@color/divider_line_bg_color" />
     <org.chromium.ui.widget.ChromeImageButton
         android:id="@+id/find_prev_button"
         style="@style/ToolbarButton"
diff --git a/chrome/android/java/res/layout/payment_minimal_ui_content.xml b/chrome/android/java/res/layout/payment_minimal_ui_content.xml
index f1f7434..71707d6 100644
--- a/chrome/android/java/res/layout/payment_minimal_ui_content.xml
+++ b/chrome/android/java/res/layout/payment_minimal_ui_content.xml
@@ -44,7 +44,7 @@
 
     <!-- Line item separator. -->
     <View
-        android:background="@color/divider_bg_color"
+        android:background="@color/divider_line_bg_color"
         android:id="@+id/line_item_separator"
         android:layout_below="@id/payment_label"
         android:layout_height="@dimen/payment_minimal_ui_separator_width"
diff --git a/chrome/android/java/res/layout/powered_by_chrome_footer.xml b/chrome/android/java/res/layout/powered_by_chrome_footer.xml
index 9c4227a..7ad2ee7 100644
--- a/chrome/android/java/res/layout/powered_by_chrome_footer.xml
+++ b/chrome/android/java/res/layout/powered_by_chrome_footer.xml
@@ -21,5 +21,5 @@
     <View
         android:layout_width="match_parent"
         android:layout_height="1dp"
-        android:background="@color/divider_bg_color" />
+        android:background="@color/divider_line_bg_color" />
 </FrameLayout>
diff --git a/chrome/android/java/res/layout/share_sheet_content.xml b/chrome/android/java/res/layout/share_sheet_content.xml
index 73c5134..a9e77016 100644
--- a/chrome/android/java/res/layout/share_sheet_content.xml
+++ b/chrome/android/java/res/layout/share_sheet_content.xml
@@ -15,7 +15,7 @@
       android:minHeight="@dimen/min_touch_target_size"
       android:id="@+id/share_sheet_chrome_apps" />
   <View
-    android:background="@color/divider_bg_color"
+    android:background="@color/divider_line_bg_color"
     android:layout_height="1dp"
     android:layout_marginLeft="16dp"
     android:layout_marginRight="16dp"
diff --git a/chrome/android/java/res/layout/translate_menu_item_checked.xml b/chrome/android/java/res/layout/translate_menu_item_checked.xml
index d92392f..aa0178ed 100644
--- a/chrome/android/java/res/layout/translate_menu_item_checked.xml
+++ b/chrome/android/java/res/layout/translate_menu_item_checked.xml
@@ -41,7 +41,7 @@
         android:id="@+id/menu_item_divider"
         android:layout_width="match_parent"
         android:layout_height="1dp"
-        android:background="@color/divider_bg_color"
+        android:background="@color/divider_line_bg_color"
         android:visibility="gone" />
 
 </LinearLayout>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
index db4ed34..7b4cd625 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -304,6 +304,7 @@
      * @return a new {@link Fido2ApiHandler} instance.
      */
     public Fido2ApiHandler createFido2ApiHandler() {
+        // TODO(nsatragno): remove after cleaning up Fido2ApiHandlerInternal.
         return new Fido2ApiHandler();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java
index cf8b1610..2b96d30 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java
@@ -57,6 +57,7 @@
                 ChromeFeatureList.PAINT_PREVIEW_DEMO,
                 ChromeFeatureList.PRIORITIZE_BOOTSTRAP_TASKS,
                 ChromeFeatureList.INSTANT_START,
+                ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR,
                 ChromeFeatureList.START_SURFACE_ANDROID,
                 ChromeFeatureList.SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT,
                 ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID,
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 72b2070..ea7d9e35 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -651,6 +651,8 @@
                             TabManagementModuleProvider.getDelegate();
                     if (tabManagementDelegate != null) {
                         mStartSurface = tabManagementDelegate.createStartSurface(this);
+                        assert LibraryLoader.getInstance().isInitialized();
+                        mStartSurface.initWithNative();
                     }
                 }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java
index 7ead7d37..30f656d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelListItem.java
@@ -325,7 +325,7 @@
         }
 
         if (mTab.isIncognito()) {
-            setBackgroundResource(R.color.dark_primary_color);
+            setBackgroundResource(R.color.default_bg_color_dark);
             mFaviconView.getBackground().setLevel(mIncognitoLevel);
             ApiCompatibilityUtils.setTextAppearance(
                     mTitleView, R.style.TextAppearance_TextLarge_Primary_Light);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java
index 6f471d6..24ad0ac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java
@@ -162,7 +162,7 @@
         updateVisibilityForLayoutOrStackButton();
         if (incognitoSelected) {
             setBackgroundColor(
-                    ApiCompatibilityUtils.getColor(getResources(), R.color.dark_primary_color));
+                    ApiCompatibilityUtils.getColor(getResources(), R.color.default_bg_color_dark));
             mStackButtonWrapper.setSelectedTabIndicatorColor(
                     mTabIconSelectedLightColor.getDefaultColor());
             ApiCompatibilityUtils.setImageTintList(mStandardButtonIcon, mTabIconLightColor);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/CurrentPageVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/CurrentPageVerifier.java
index 1c2dde822..78d39a7a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/CurrentPageVerifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/CurrentPageVerifier.java
@@ -65,7 +65,10 @@
     private final CustomTabTabObserver mVerifyOnPageLoadObserver = new CustomTabTabObserver() {
         @Override
         public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) {
-            if (!navigation.hasCommitted() || !navigation.isInMainFrame()) return;
+            if (!navigation.hasCommitted() || !navigation.isInMainFrame()
+                    || navigation.isSameDocument()) {
+                return;
+            }
             verify(navigation.getUrl());
         }
 
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 6fa4a91c..a9159300 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
@@ -144,6 +144,11 @@
     }
 
     /**
+     * Called when native initialization is completed.
+     */
+    public void onFinishNativeInitialization() {}
+
+    /**
      * Adds a {@link SceneOverlay} that can be shown in this layout to the first position in the
      * scene overlay list, meaning it will be drawn behind all other overlays.
      * @param overlay The {@link SceneOverlay} to be added.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
index 56df00a..6f856ba 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManager.java
@@ -114,9 +114,9 @@
     private int mControlsShowingToken = TokenHolder.INVALID_TOKEN;
     private int mControlsHidingToken = TokenHolder.INVALID_TOKEN;
     private boolean mUpdateRequested;
-    private final ContextualSearchPanel mContextualSearchPanel;
+    private ContextualSearchPanel mContextualSearchPanel;
     private final OverlayPanelManager mOverlayPanelManager;
-    private final ToolbarSceneLayer mToolbarOverlay;
+    private ToolbarSceneLayer mToolbarOverlay;
     private SceneOverlay mStatusIndicatorSceneOverlay;
 
     /** A delegate for interacting with the Contextual Search manager. */
@@ -220,16 +220,11 @@
 
         mAnimationHandler = new CompositorAnimationHandler(this);
 
-        mToolbarOverlay = new ToolbarSceneLayer(mContext, this, renderHost);
-
         mOverlayPanelManager = new OverlayPanelManager();
 
         // Build Layouts
         mStaticLayout = new StaticLayout(mContext, this, renderHost, null, mOverlayPanelManager);
 
-        // Contextual Search scene overlay.
-        mContextualSearchPanel = new ContextualSearchPanel(mContext, this, mOverlayPanelManager);
-
         // Set up layout parameters
         mStaticLayout.setLayoutHandlesTabLifecycles(true);
 
@@ -375,6 +370,18 @@
             TabContentManager content, ViewGroup androidContentContainer,
             ContextualSearchManagementDelegate contextualSearchDelegate,
             DynamicResourceLoader dynamicResourceLoader) {
+        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
+        mToolbarOverlay = new ToolbarSceneLayer(mContext, this, renderHost);
+
+        // Initialize Layouts
+        mStaticLayout.onFinishNativeInitialization();
+        if (getActiveLayout() != null) {
+            getActiveLayout().onFinishNativeInitialization();
+        }
+
+        // Contextual Search scene overlay.
+        mContextualSearchPanel = new ContextualSearchPanel(mContext, this, mOverlayPanelManager);
+
         // Add any SceneOverlays to a layout.
         addAllSceneOverlays();
 
@@ -396,7 +403,16 @@
         mOverlayPanelManager.setDynamicResourceLoader(dynamicResourceLoader);
         mOverlayPanelManager.setContainerView(androidContentContainer);
 
+        if (mTabModelSelector != selector) {
+            setTabModelSelector(selector);
+        }
+
+        mContentContainer = androidContentContainer;
+    }
+
+    public void setTabModelSelector(TabModelSelector selector) {
         mTabModelSelector = selector;
+        mStaticLayout.setTabModelSelector(selector, null);
         mTabModelSelectorTabObserver = new TabModelSelectorTabObserver(mTabModelSelector) {
             @Override
             public void onShown(Tab tab, @TabSelectionType int type) {
@@ -424,8 +440,6 @@
             }
         };
 
-        mContentContainer = androidContentContainer;
-
         if (mNextActiveLayout != null) startShowing(mNextActiveLayout, true);
 
         updateLayoutForTabModelSelector();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
index 870639e0f..0dad1104 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -68,6 +68,9 @@
     private boolean mCreatingNtp;
     private final ObserverList<OverviewModeObserver> mOverviewModeObservers;
 
+    /** Whether to create an overview Layout when LayoutManagerChrome is created. */
+    private boolean mCreateOverviewLayout;
+
     /**
      * Creates the {@link LayoutManagerChrome} instance.
      * @param host         A {@link LayoutManagerHost} instance.
@@ -85,9 +88,6 @@
         // Build Event Filter Handlers
         mToolbarSwipeHandler = createToolbarSwipeHandler(/* supportSwipeDown = */ true);
 
-        // Build Layouts
-        mOverviewListLayout = new OverviewListLayout(context, this, renderHost);
-        mToolbarSwipeLayout = new ToolbarSwipeLayout(context, this, renderHost);
         if (createOverviewLayout) {
             if (startSurface != null) {
                 assert TabUiFeatureUtilities.isGridTabSwitcherEnabled();
@@ -107,7 +107,7 @@
                 mOverviewLayout = tabManagementDelegate.createStartSurfaceLayout(
                         context, this, renderHost, startSurface);
             } else {
-                mOverviewLayout = new StackLayout(context, this, renderHost);
+                mCreateOverviewLayout = true;
             }
         }
     }
@@ -140,6 +140,17 @@
             TabContentManager content, ViewGroup androidContentContainer,
             ContextualSearchManagementDelegate contextualSearchDelegate,
             DynamicResourceLoader dynamicResourceLoader) {
+        Context context = mHost.getContext();
+        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
+
+        // Build Layouts
+        mOverviewListLayout = new OverviewListLayout(context, this, renderHost);
+        mToolbarSwipeLayout = new ToolbarSwipeLayout(context, this, renderHost);
+
+        if (mCreateOverviewLayout) {
+            mOverviewLayout = new StackLayout(context, this, renderHost);
+        }
+
         super.init(selector, creator, content, androidContentContainer, contextualSearchDelegate,
                 dynamicResourceLoader);
 
@@ -150,10 +161,19 @@
         mToolbarSwipeLayout.setTabModelSelector(selector, content);
         mOverviewListLayout.setTabModelSelector(selector, content);
         if (mOverviewLayout != null) {
+            mOverviewLayout.onFinishNativeInitialization();
             mOverviewLayout.setTabModelSelector(selector, content);
         }
     }
 
+    @Override
+    public void setTabModelSelector(TabModelSelector selector) {
+        super.setTabModelSelector(selector);
+        if (mOverviewLayout != null) {
+            mOverviewLayout.setTabModelSelector(selector, null);
+        }
+    }
+
     /**
      * Set the toolbar manager for layouts that need draw to different toolbars.
      * @param manager The {@link ToolbarManager} for accessing toolbar textures.
@@ -173,8 +193,12 @@
             mOverviewLayout.destroy();
             mOverviewLayout = null;
         }
-        mOverviewListLayout.destroy();
-        mToolbarSwipeLayout.destroy();
+        if (mOverviewLayout != null) {
+            mOverviewListLayout.destroy();
+        }
+        if (mToolbarSwipeLayout != null) {
+            mToolbarSwipeLayout.destroy();
+        }
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
index 8d7448fd..f4b34b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromePhone.java
@@ -26,7 +26,7 @@
  */
 public class LayoutManagerChromePhone extends LayoutManagerChrome {
     // Layouts
-    private final SimpleAnimationLayout mSimpleAnimationLayout;
+    private SimpleAnimationLayout mSimpleAnimationLayout;
 
     /**
      * Creates an instance of a {@link LayoutManagerChromePhone}.
@@ -36,15 +36,7 @@
      */
     public LayoutManagerChromePhone(LayoutManagerHost host, StartSurface startSurface) {
         super(host, true, startSurface);
-        Context context = host.getContext();
-        LayoutRenderHost renderHost = host.getLayoutRenderHost();
 
-        // Build Layouts
-        mSimpleAnimationLayout = new SimpleAnimationLayout(context, this, renderHost);
-
-        // Set up layout parameters
-        mStaticLayout.setLayoutHandlesTabLifecycles(false);
-        mToolbarSwipeLayout.setMovesToolbar(true);
     }
 
     @Override
@@ -52,9 +44,20 @@
             TabContentManager content, ViewGroup androidContentContainer,
             ContextualSearchManagementDelegate contextualSearchDelegate,
             DynamicResourceLoader dynamicResourceLoader) {
+        Context context = mHost.getContext();
+        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
+
+        // Build Layouts
+        mSimpleAnimationLayout = new SimpleAnimationLayout(context, this, renderHost);
+
+        // Set up layout parameters
+        mStaticLayout.setLayoutHandlesTabLifecycles(false);
+
         super.init(selector, creator, content, androidContentContainer, contextualSearchDelegate,
                 dynamicResourceLoader);
 
+        mToolbarSwipeLayout.setMovesToolbar(true);
+
         // Initialize Layouts
         mSimpleAnimationLayout.setTabModelSelector(selector, content);
     }
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 c243b1d..c494aa99 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
@@ -77,7 +77,6 @@
         mHandler = new Handler();
         mUnstallRunnable = new UnstallRunnable();
         mUnstalling = false;
-        mSceneLayer = new StaticTabSceneLayer();
     }
 
     /**
@@ -89,6 +88,11 @@
     }
 
     @Override
+    public void onFinishNativeInitialization() {
+        mSceneLayer = new StaticTabSceneLayer();
+    }
+
+    @Override
     public @ViewportMode int getViewportMode() {
         return ViewportMode.DYNAMIC_BROWSER_CONTROLS;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
index d4b136a..272fbb9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java
@@ -153,7 +153,7 @@
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.HORIZONTAL_TAB_SWITCHER_ANDROID)
                 || TabUiFeatureUtilities.isGridTabSwitcherEnabled()) {
             if (mTabModelSelector != null && mTabModelSelector.isIncognitoSelected()) {
-                colorId = R.color.dark_primary_color;
+                colorId = R.color.default_bg_color_dark;
             } else {
                 colorId = R.color.modern_primary_color;
             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java
index bf38398..597b41c0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabDelegateFactory.java
@@ -50,7 +50,6 @@
 import org.chromium.chrome.browser.webapps.WebappExtras;
 import org.chromium.chrome.browser.webapps.WebappInfo;
 import org.chromium.chrome.browser.webapps.WebappLauncherActivity;
-import org.chromium.chrome.browser.webapps.WebappScopePolicy;
 import org.chromium.components.browser_ui.util.BrowserControlsVisibilityDelegate;
 import org.chromium.components.browser_ui.util.ComposedBrowserControlsVisibilityDelegate;
 import org.chromium.components.embedder_support.delegate.WebContentsDelegateAndroid;
@@ -107,8 +106,8 @@
 
         @Override
         public boolean startActivityIfNeeded(Intent intent, boolean proxy) {
-            // Note: This method will not be called if applyWebappScopePolicyForUrl returns
-            // IGNORE_EXTERNAL_INTENT_REQUESTS.
+            // Note: This method will not be called if shouldDisableExternalIntentRequestsForUrl()
+            // returns false.
 
             boolean isExternalProtocol = !UrlUtilities.isAcceptedScheme(intent.toUri(0));
             boolean hasDefaultHandler = hasDefaultHandler(intent);
@@ -180,29 +179,10 @@
             return mHasActivityStarted;
         }
 
-        /**
-         * If the current activity is a webapp, applies the webapp's scope policy and returns the
-         * result. Returns {@link WebappScopePolicy#NavigationDirective#NORMAL_BEHAVIOR} if the
-         * current activity is not a webapp. Protected to allow subclasses to customize the logic.
-         */
-        protected @WebappScopePolicy.NavigationDirective int applyWebappScopePolicyForUrl(
-                String url) {
-            Context context = getAvailableContext();
-            if (context instanceof WebappActivity) {
-                WebappActivity webappActivity = (WebappActivity) context;
-                return WebappScopePolicy.applyPolicyForNavigationToUrl(
-                        webappActivity.scopePolicy(), webappActivity.getWebappInfo(), url);
-            }
-            return WebappScopePolicy.NavigationDirective.NORMAL_BEHAVIOR;
-        }
-
         @Override
         public boolean shouldDisableExternalIntentRequestsForUrl(String url) {
-            // http://crbug.com/647569 : Stay in a PWA window for a URL within the same scope.
-            if (applyWebappScopePolicyForUrl(url)
-                    == WebappScopePolicy.NavigationDirective.IGNORE_EXTERNAL_INTENT_REQUESTS) {
-                return true;
-            }
+            // http://crbug.com/647569 : Do not forward URL requests to external intents for URLs
+            // within the Webapp/TWA's scope.
             return mExternalIntentsPolicyProvider.shouldIgnoreExternalIntentHandlers(url);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java
index 191f23d..4bdca17f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/BaseCustomTabActivityComponent.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.customtabs.dependency_injection;
 
 import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TwaFinishHandler;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier;
 import org.chromium.chrome.browser.customtabs.CustomTabCompositorContentInitializer;
 import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory;
 import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
@@ -25,6 +26,7 @@
  * {@link WebappActivityComponent}.
  */
 public interface BaseCustomTabActivityComponent extends ChromeActivityComponent {
+    CurrentPageVerifier resolveCurrentPageVerifier();
     CustomTabActivityNavigationController resolveNavigationController();
     CustomTabActivityTabFactory resolveTabFactory();
     CustomTabActivityTabProvider resolveTabProvider();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
index 1739bf4..044554d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/dependency_injection/CustomTabActivityComponent.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.customtabs.dependency_injection;
 
 import org.chromium.chrome.browser.browserservices.trustedwebactivityui.TrustedWebActivityCoordinator;
-import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityClientConnectionKeeper;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityLifecycleUmaTracker;
 import org.chromium.chrome.browser.customtabs.CustomTabBottomBarDelegate;
@@ -31,7 +30,6 @@
 public interface CustomTabActivityComponent extends BaseCustomTabActivityComponent {
     TrustedWebActivityCoordinator resolveTrustedWebActivityCoordinator();
 
-    CurrentPageVerifier resolveCurrentPageVerifier();
     CustomTabBottomBarDelegate resolveBottomBarDelegate();
     CustomTabActivityTabController resolveTabController();
     CustomTabActivityLifecycleUmaTracker resolveUmaTracker();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsView.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsView.java
index 9089238..8e8cb23e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsView.java
@@ -25,8 +25,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.components.dom_distiller.core.DistilledPagePrefs;
-import org.chromium.components.dom_distiller.core.FontFamily;
-import org.chromium.components.dom_distiller.core.Theme;
+import org.chromium.dom_distiller.mojom.FontFamily;
+import org.chromium.dom_distiller.mojom.Theme;
 import org.chromium.ui.UiUtils;
 
 import java.text.NumberFormat;
@@ -133,7 +133,8 @@
                 return overrideTypeFace(view, position);
             }
 
-            private View overrideTypeFace(View view, @FontFamily int family) {
+            private View overrideTypeFace(View view, int family) {
+                FontFamily.validate(family);
                 if (view instanceof TextView) {
                     TextView textView = (TextView) view;
                     if (family == FontFamily.MONOSPACE) {
@@ -154,7 +155,7 @@
         mFontFamilySpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
             @Override
             public void onItemSelected(AdapterView<?> parent, View view, int family, long id) {
-                if (family >= 0 && family < FontFamily.NUM_ENTRIES) {
+                if (FontFamily.isKnownValue(family)) {
                     mDistilledPagePrefs.setFontFamily(family);
                 }
             }
@@ -208,7 +209,8 @@
     // DistilledPagePrefs.Observer
 
     @Override
-    public void onChangeFontFamily(@FontFamily int fontFamily) {
+    public void onChangeFontFamily(int fontFamily) {
+        FontFamily.validate(fontFamily);
         mFontFamilySpinner.setSelection(fontFamily);
     }
 
@@ -216,7 +218,8 @@
      * Changes which button is selected if the theme is changed in another tab.
      */
     @Override
-    public void onChangeTheme(@Theme int theme) {
+    public void onChangeTheme(int theme) {
+        Theme.validate(theme);
         mColorModeButtons.get(theme).setChecked(true);
     }
 
@@ -249,7 +252,8 @@
      * Initiatializes a Button and selects it if it corresponds to the current
      * theme.
      */
-    private RadioButton initializeAndGetButton(int id, final @Theme int theme) {
+    private RadioButton initializeAndGetButton(int id, final int theme) {
+        Theme.validate(theme);
         final RadioButton button = (RadioButton) findViewById(id);
         button.setOnClickListener(new View.OnClickListener() {
             @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java
index 260c130..5615cb8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbarPhone.java
@@ -61,7 +61,7 @@
             ApiCompatibilityUtils.setImageTintList(mCloseFindButton, dark);
             queryTextColorId = R.color.default_text_color;
             queryHintTextColorId = R.color.find_in_page_query_default_hint_color;
-            dividerColorId = R.color.divider_bg_color;
+            dividerColorId = R.color.divider_line_bg_color;
         }
         mFindQuery.setTextColor(
                 ApiCompatibilityUtils.getColor(getContext().getResources(), queryTextColorId));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java
index e0a34a8..506cb55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunViewPager.java
@@ -7,8 +7,6 @@
 import android.content.Context;
 import android.view.MotionEvent;
 
-// TODO(bjoyce): Need to convert fragment in FirstRunActivity.java before this
-// can be converted to Androidx.
 import androidx.viewpager.widget.ViewPager;
 
 /**
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 3be757f..30f9d5f 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
@@ -120,6 +120,8 @@
     // Whether destroy() has been called.
     private boolean mIsDestroyed;
 
+    private final int mTabStripAndToolbarHeight;
+
     @Override
     public void onContentOffsetChanged(int offset) {}
 
@@ -135,6 +137,11 @@
         updateMargins();
     }
 
+    @Override
+    public void onTopControlsHeightChanged(int topControlsHeight, int topControlsMinHeight) {
+        updateMargins();
+    }
+
     /**
      * Allows clients to listen for updates to the scroll changes of the search box on the
      * NTP.
@@ -349,6 +356,9 @@
         DownloadManagerService.getDownloadManagerService().checkForExternallyRemovedDownloads(
                 /*isOffTheRecord=*/false);
 
+        mTabStripAndToolbarHeight =
+                activity.getResources().getDimensionPixelSize(R.dimen.tab_strip_and_toolbar_height);
+
         NewTabPageUma.recordIsUserOnline();
         NewTabPageUma.recordLoadType(activity);
         NewTabPageUma.recordContentSuggestionsDisplayStatus();
@@ -422,6 +432,7 @@
 
         layoutParams.bottomMargin = mFullscreenManager.getBottomControlsHeight()
                 - mFullscreenManager.getBottomControlOffset();
+        layoutParams.topMargin = getToolbarExtraYOffset();
 
         view.setLayoutParams(layoutParams);
 
@@ -433,6 +444,16 @@
                                 R.dimen.duet_ntp_logo_top_margin));
     }
 
+    // TODO(sinansahin): This is the same as {@link ToolbarManager#getToolbarExtraYOffset}. So, we
+    // should look into sharing the logic.
+    /**
+     * @return The height that is included in the top controls but not in the toolbar or the tab
+     *         strip.
+     */
+    private int getToolbarExtraYOffset() {
+        return mFullscreenManager.getTopControlsHeight() - mTabStripAndToolbarHeight;
+    }
+
     /** @return The view container for the new tab page. */
     @VisibleForTesting
     public NewTabPageView getNewTabPageView() {
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 555e1ce8..f3ba92b 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
@@ -1256,4 +1256,9 @@
             mWindowDelegate.setWindowSoftInputMode(softInputMode);
         }
     }
+
+    public void setVoiceRecognitionHandlerForTesting(
+            VoiceRecognitionHandler voiceRecognitionHandler) {
+        mVoiceRecognitionHandler = voiceRecognitionHandler;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java
index 41ea50a..587a49b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java
@@ -382,7 +382,7 @@
     private void updateColorTheme() {
         @ColorRes
         int separatorColor =
-                mDarkTheme ? R.color.divider_bg_color_dark : R.color.divider_bg_color_light;
+                mDarkTheme ? R.color.divider_line_bg_color_dark : R.color.divider_line_bg_color_light;
 
         @ColorRes
         int textColor = 0;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
index 9b7df2581..91d9067 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
@@ -11,6 +11,7 @@
 import android.view.View;
 
 import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.locale.LocaleManager;
@@ -36,6 +37,7 @@
     private Delegate mDelegate;
     private boolean mPendingSearchPromoDecision;
     private boolean mPendingBeginQuery;
+    private boolean mNativeLibraryReady;
 
     public SearchActivityLocationBarLayout(Context context, AttributeSet attrs) {
         super(context, attrs, R.layout.location_bar_base);
@@ -72,6 +74,8 @@
     @Override
     public void onNativeLibraryReady() {
         super.onNativeLibraryReady();
+        mNativeLibraryReady = true;
+
         setAutocompleteProfile(Profile.getLastUsedRegularProfile());
 
         mPendingSearchPromoDecision = LocaleManager.getInstance().needToCheckForSearchEnginePromo();
@@ -107,8 +111,9 @@
      * Begins a new query.
      * @param isVoiceSearchIntent Whether this is a voice search.
      * @param optionalText Prepopulate with a query, this may be null.
-     * */
-    void beginQuery(boolean isVoiceSearchIntent, @Nullable String optionalText) {
+     */
+    @VisibleForTesting
+    public void beginQuery(boolean isVoiceSearchIntent, @Nullable String optionalText) {
         // Clear the text regardless of the promo decision.  This allows the user to enter text
         // before native has been initialized and have it not be cleared one the delayed beginQuery
         // logic is performed.
@@ -116,7 +121,7 @@
                 UrlBarData.forNonUrlText(optionalText == null ? "" : optionalText),
                 UrlBar.ScrollType.NO_SCROLL, SelectionState.SELECT_ALL);
 
-        if (mPendingSearchPromoDecision) {
+        if (mPendingSearchPromoDecision || (isVoiceSearchIntent && !mNativeLibraryReady)) {
             mPendingBeginQuery = true;
             return;
         }
@@ -126,6 +131,7 @@
 
     private void beginQueryInternal(boolean isVoiceSearchIntent) {
         assert !mPendingSearchPromoDecision;
+        assert !isVoiceSearchIntent || mNativeLibraryReady;
 
         if (getVoiceRecognitionHandler().isVoiceSearchEnabled() && isVoiceSearchIntent) {
             getVoiceRecognitionHandler().startVoiceRecognition(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java
index a1aeb8e..8da6e2a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareButtonController.java
@@ -14,6 +14,7 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ActivityTabProvider;
+import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.toolbar.ButtonData;
@@ -25,11 +26,6 @@
  * whether NTP is shown).
  */
 public class ShareButtonController implements ButtonDataProvider {
-    /**
-     * Default minimum width to show share button.
-     */
-    private static final int MIN_WIDTH = 360;
-
     // Context is used for fetching resources and launching preferences page.
     private final Context mContext;
 
@@ -45,8 +41,6 @@
     private final ObservableSupplier<Boolean> mBottomToolbarVisibilitySupplier;
     private OnClickListener mOnClickListener;
 
-    private Integer mMinimumWidthDp;
-
     /**
      * Creates ShareButtonController object.
      * @param context The Context for retrieving resources, etc.
@@ -105,26 +99,11 @@
     }
 
     private void updateButtonState(Tab tab) {
-        if (tab == null || tab.getWebContents() == null
-                || !ChromeFeatureList.isEnabled(ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR)) {
-            mButtonData.canShow = false;
-            return;
-        }
-
-        if (mMinimumWidthDp == null) {
-            mMinimumWidthDp = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
-                    ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR, "minimum_width", MIN_WIDTH);
-        }
-
-        float deviceWidthPX = mContext.getResources().getDisplayMetrics().widthPixels;
-        int deviceWidth =
-                (int) (deviceWidthPX / (mContext.getResources().getDisplayMetrics().density));
-
-        boolean isDeviceWideEnough = deviceWidth > mMinimumWidthDp;
-
-        if ((mBottomToolbarVisibilitySupplier.get()
-                    && BottomToolbarVariationManager.isShareButtonOnBottom())
-                || mShareDelegateSupplier.get() == null || !isDeviceWideEnough) {
+        // TODO(crbug.com/1036023) add width constraints.
+        if (!CachedFeatureFlags.isEnabled(ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR)
+                || (mBottomToolbarVisibilitySupplier.get()
+                        && BottomToolbarVariationManager.isShareButtonOnBottom())
+                || mShareDelegateSupplier.get() == null) {
             mButtonData.canShow = false;
             return;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index 24bb500..24acd8f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -209,7 +209,7 @@
         final ChromeFullscreenManager fullscreenManager = mActivity.getFullscreenManager();
         Supplier<Boolean> canAnimateBrowserControls = () -> {
             final Tab tab = mActivity.getActivityTabProvider().get();
-            return tab != null && tab.isUserInteractable();
+            return tab != null && tab.isUserInteractable() && !tab.isNativePage();
         };
         mToolbarManager.setCanAnimateNativeBrowserControlsSupplier(canAnimateBrowserControls);
         mStatusIndicatorCoordinator = new StatusIndicatorCoordinator(mActivity,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenVerifier.java
new file mode 100644
index 0000000..8c654a0
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/AddToHomescreenVerifier.java
@@ -0,0 +1,38 @@
+// Copyright 2020 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.webapps;
+
+import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.dependency_injection.ActivityScope;
+import org.chromium.components.embedder_support.util.Origin;
+import org.chromium.components.embedder_support.util.UrlUtilities;
+
+import javax.inject.Inject;
+
+/**
+ * Provides homescreen-shortcut specific behaviour for the {@link CurrentPageVerifier}.
+ */
+@ActivityScope
+public class AddToHomescreenVerifier extends WebappVerifier {
+    private final WebappExtras mWebappExtras;
+
+    @Inject
+    public AddToHomescreenVerifier(BrowserServicesIntentDataProvider intentDataProvider) {
+        mWebappExtras = intentDataProvider.getWebappExtras();
+        assert mWebappExtras != null;
+    }
+
+    @Override
+    protected String getScope() {
+        Origin origin = Origin.create(mWebappExtras.url);
+        if (origin == null) return null;
+        return origin.toString();
+    }
+
+    @Override
+    protected boolean isUrlInScope(String url) {
+        return UrlUtilities.sameDomainOrHost(mWebappExtras.url, url, true);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivity.java
index 9d1a5b15..1cf6c0a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkActivity.java
@@ -20,11 +20,6 @@
     private static final String TAG = "WebApkActivity";
 
     @Override
-    public @WebappScopePolicy.Type int scopePolicy() {
-        return WebappScopePolicy.Type.STRICT;
-    }
-
-    @Override
     protected WebappInfo createWebappInfo(Intent intent) {
         return (intent == null) ? WebApkInfo.createEmpty() : WebApkInfo.create(intent);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVerifier.java
new file mode 100644
index 0000000..433b60b
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkVerifier.java
@@ -0,0 +1,35 @@
+// Copyright 2020 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.webapps;
+
+import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.dependency_injection.ActivityScope;
+import org.chromium.components.embedder_support.util.UrlUtilities;
+
+import javax.inject.Inject;
+
+/**
+ * Provides WebAPK specific behaviour for the {@link CurrentPageVerifier}.
+ */
+@ActivityScope
+public class WebApkVerifier extends WebappVerifier {
+    private final WebappExtras mWebappExtras;
+
+    @Inject
+    public WebApkVerifier(BrowserServicesIntentDataProvider intentDataProvider) {
+        mWebappExtras = intentDataProvider.getWebappExtras();
+        assert mWebappExtras != null;
+    }
+
+    @Override
+    protected String getScope() {
+        return mWebappExtras.scopeUrl;
+    }
+
+    @Override
+    protected boolean isUrlInScope(String url) {
+        return UrlUtilities.isUrlWithinScope(url, mWebappExtras.scopeUrl);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java
new file mode 100644
index 0000000..dbd4efb
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActiveTabUmaTracker.java
@@ -0,0 +1,54 @@
+// Copyright 2020 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.webapps;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.ActivityTabProvider;
+import org.chromium.chrome.browser.ActivityTabProvider.ActivityTabTabObserver;
+import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier.VerificationState;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier.VerificationStatus;
+import org.chromium.chrome.browser.metrics.WebApkUma;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.content_public.browser.NavigationHandle;
+
+/**
+ * Handles recording user metrics for active tab.
+ */
+public class WebappActiveTabUmaTracker extends ActivityTabTabObserver {
+    @VisibleForTesting
+    public static final String HISTOGRAM_NAVIGATION_STATUS = "Webapp.NavigationStatus";
+
+    private BrowserServicesIntentDataProvider mIntentDataProvider;
+    private CurrentPageVerifier mCurrentPageVerifier;
+
+    public WebappActiveTabUmaTracker(ActivityTabProvider tabProvider,
+            BrowserServicesIntentDataProvider intentDataProvider,
+            CurrentPageVerifier currentPageVerifier) {
+        super(tabProvider);
+        mIntentDataProvider = intentDataProvider;
+        mCurrentPageVerifier = currentPageVerifier;
+    }
+
+    @Override
+    public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) {
+        if (navigation.hasCommitted() && navigation.isInMainFrame()
+                && !navigation.isSameDocument()) {
+            RecordHistogram.recordBooleanHistogram(
+                    HISTOGRAM_NAVIGATION_STATUS, !navigation.isErrorPage());
+
+            if (mIntentDataProvider.isWebApkActivity()) {
+                VerificationState verificationState = mCurrentPageVerifier.getState();
+                boolean isNavigationInScope = (verificationState == null
+                        || verificationState.status != VerificationStatus.FAILURE);
+                boolean isChildTab = (tab.getParentId() != Tab.INVALID_TAB_ID);
+                WebApkUma.recordNavigation(isChildTab, isNavigationInScope);
+            }
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index edf8af5..4e6ff8d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -17,14 +17,12 @@
 import android.text.TextUtils;
 import android.view.ViewGroup;
 
-import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ActivityState;
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.Log;
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
@@ -33,7 +31,6 @@
 import org.chromium.chrome.browser.WarmupManager;
 import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
 import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider.CustomTabsUiType;
-import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityBrowserControlsVisibilityManager;
 import org.chromium.chrome.browser.customtabs.BaseCustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabAppMenuPropertiesDelegate;
 import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory;
@@ -43,7 +40,6 @@
 import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
 import org.chromium.chrome.browser.flags.ActivityType;
-import org.chromium.chrome.browser.metrics.WebApkUma;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
 import org.chromium.chrome.browser.tab.TabDelegateFactory;
@@ -71,7 +67,6 @@
     public static final String WEBAPP_SCHEME = "webapp";
 
     private static final String TAG = "WebappActivity";
-    private static final String HISTOGRAM_NAVIGATION_STATUS = "Webapp.NavigationStatus";
     private static final long MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL = 1000;
 
     protected static final String BUNDLE_TAB_ID = "tabId";
@@ -79,7 +74,6 @@
     private WebappInfo mWebappInfo;
 
     private BrowserServicesIntentDataProvider mIntentDataProvider;
-    private TrustedWebActivityBrowserControlsVisibilityManager mBrowserControlsVisibilityManager;
     private WebappActivityTabController mTabController;
     private SplashController mSplashController;
     private TabObserverRegistrar mTabObserverRegistrar;
@@ -340,7 +334,6 @@
         onComponentCreated(component);
 
         mTabController = component.resolveTabController();
-        mBrowserControlsVisibilityManager = component.resolveBrowserControlsVisibilityManager();
         mSplashController = component.resolveSplashController();
         mTabObserverRegistrar = component.resolveTabObserverRegistrar();
         mDelegateFactory = component.resolveTabDelegateFactory();
@@ -349,8 +342,6 @@
         mStatusBarColorProvider.setUseTabThemeColor(true /* useTabThemeColor */);
 
         mNavigationController.setFinishHandler((reason) -> { handleFinishAndClose(); });
-        mNavigationController.setLandingPageOnCloseCriterion(
-                url -> WebappScopePolicy.isUrlInScope(scopePolicy(), getWebappInfo(), url));
 
         return component;
     }
@@ -408,13 +399,6 @@
         return mWebappInfo;
     }
 
-    /**
-     * @return A string containing the scope of the webapp opened in this activity.
-     */
-    public String getWebappScope() {
-        return mWebappInfo.scopeUrl();
-    }
-
     WebContentsDelegateAndroid getWebContentsDelegate() {
         assert mDelegateFactory != null;
         return mDelegateFactory.getWebContentsDelegate();
@@ -438,17 +422,6 @@
                     // not apply to fullscreen content views.
                     TabBrowserControlsConstraintsHelper.update(
                             tab, TabBrowserControlsConstraintsHelper.getConstraints(tab), true);
-
-                    RecordHistogram.recordBooleanHistogram(
-                            HISTOGRAM_NAVIGATION_STATUS, !navigation.isErrorPage());
-
-                    boolean isNavigationInScope = WebappScopePolicy.isUrlInScope(
-                            scopePolicy(), mWebappInfo, navigation.getUrl());
-                    mBrowserControlsVisibilityManager.updateIsInTwaMode(isNavigationInScope);
-                    if (mWebappInfo.isForWebApk()) {
-                        boolean isChildTab = (tab.getParentId() != Tab.INVALID_TAB_ID);
-                        WebApkUma.recordNavigation(isChildTab, isNavigationInScope);
-                    }
                 }
             }
 
@@ -480,20 +453,9 @@
                     }
                 }, MS_BEFORE_NAVIGATING_BACK_FROM_INTERSTITIAL);
             }
-
-            @Override
-            public void onObservingDifferentTab(@NonNull Tab tab) {
-                boolean isNavigationInScope = WebappScopePolicy.isUrlInScope(
-                        scopePolicy(), mWebappInfo, tab.getUrlString());
-                mBrowserControlsVisibilityManager.updateIsInTwaMode(isNavigationInScope);
-            }
         };
     }
 
-    public @WebappScopePolicy.Type int scopePolicy() {
-        return WebappScopePolicy.Type.LEGACY;
-    }
-
     @Override
     public boolean onMenuOrKeyboardAction(int id, boolean fromMenu) {
         // Disable creating bookmark.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityCoordinator.java
index 45862e7..3541c82 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivityCoordinator.java
@@ -6,9 +6,17 @@
 
 import androidx.annotation.NonNull;
 
+import org.chromium.chrome.browser.ActivityTabProvider;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityBrowserControlsVisibilityManager;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
+import org.chromium.chrome.browser.customtabs.ExternalIntentsPolicyProvider;
+import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
 import org.chromium.chrome.browser.dependency_injection.ActivityScope;
+import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
+import org.chromium.chrome.browser.lifecycle.InflationObserver;
 
 import javax.inject.Inject;
 
@@ -17,22 +25,42 @@
  * Add methods here if other components need to communicate with either of these components.
  */
 @ActivityScope
-public class WebappActivityCoordinator {
+public class WebappActivityCoordinator implements InflationObserver {
     private final WebappActivity mActivity;
     private final BrowserServicesIntentDataProvider mIntentDataProvider;
+    private final CurrentPageVerifier mCurrentPageVerifier;
+    private TrustedWebActivityBrowserControlsVisibilityManager mBrowserControlsVisibilityManager;
     private final WebappDeferredStartupWithStorageHandler mDeferredStartupWithStorageHandler;
 
+    // Whether the current page is within the webapp's scope.
+    private boolean mInScope = true;
+
     @Inject
     public WebappActivityCoordinator(ChromeActivity<?> activity,
             BrowserServicesIntentDataProvider intentDataProvider,
+            ActivityTabProvider activityTabProvider, CurrentPageVerifier currentPageVerifier,
+            Verifier verifier, CustomTabActivityNavigationController navigationController,
+            ExternalIntentsPolicyProvider externalIntentsPolicyProvider,
             WebappDeferredStartupWithStorageHandler deferredStartupWithStorageHandler,
-            WebappActionsNotificationManager actionsNotificationManager) {
+            WebappActionsNotificationManager actionsNotificationManager,
+            ActivityLifecycleDispatcher lifecycleDispatcher,
+            TrustedWebActivityBrowserControlsVisibilityManager browserControlsVisibilityManager) {
         // We don't need to do anything with |actionsNotificationManager|. We just need to resolve
         // it so that it starts working.
 
         mActivity = (WebappActivity) activity;
         mIntentDataProvider = intentDataProvider;
+        mCurrentPageVerifier = currentPageVerifier;
         mDeferredStartupWithStorageHandler = deferredStartupWithStorageHandler;
+        mBrowserControlsVisibilityManager = browserControlsVisibilityManager;
+
+        // WebappActiveTabUmaTracker sets itself as an observer of |activityTabProvider|.
+        new WebappActiveTabUmaTracker(
+                activityTabProvider, intentDataProvider, mCurrentPageVerifier);
+
+        navigationController.setLandingPageOnCloseCriterion(verifier::wasPreviouslyVerified);
+        externalIntentsPolicyProvider.setPolicyCriteria(
+                verifier::shouldIgnoreExternalIntentHandlers);
 
         mDeferredStartupWithStorageHandler.addTask((storage, didCreateStorage) -> {
             if (activity.isActivityFinishingOrDestroyed()) return;
@@ -41,6 +69,9 @@
                 updateStorage(storage);
             }
         });
+
+        currentPageVerifier.addVerificationObserver(this::onVerificationUpdate);
+        lifecycleDispatcher.register(this);
     }
 
     /**
@@ -50,6 +81,32 @@
         mDeferredStartupWithStorageHandler.initDeferredStartupForActivity();
     }
 
+    @Override
+    public void onPreInflationStartup() {}
+
+    @Override
+    public void onPostInflationStartup() {
+        // Before verification completes, optimistically expect it to be successful.
+        if (mCurrentPageVerifier.getState() == null) {
+            updateUi(true);
+        }
+    }
+
+    private void onVerificationUpdate() {
+        CurrentPageVerifier.VerificationState state = mCurrentPageVerifier.getState();
+        // Consider null |state| to be 'in scope' to mimic TWA logic. |state| should never be null
+        // for webapps.
+        boolean inScope =
+                state == null || state.status != CurrentPageVerifier.VerificationStatus.FAILURE;
+        if (inScope == mInScope) return;
+        mInScope = inScope;
+        updateUi(inScope);
+    }
+
+    private void updateUi(boolean inScope) {
+        mBrowserControlsVisibilityManager.updateIsInTwaMode(inScope);
+    }
+
     private void updateStorage(@NonNull WebappDataStorage storage) {
         // The information in the WebappDataStorage may have been purged by the
         // user clearing their history or not launching the web app recently.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java
index 67f7819..6c7277e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappIntentDataProvider.java
@@ -7,6 +7,7 @@
 import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.browser.customtabs.CustomTabsIntent;
 import androidx.browser.trusted.sharing.ShareData;
@@ -20,12 +21,12 @@
  * Stores info about a web app.
  */
 public class WebappIntentDataProvider extends BrowserServicesIntentDataProvider {
-    private int mToolbarColor;
-    private boolean mHasCustomToolbarColor;
-    private Drawable mCloseButtonIcon;
-    private ShareData mShareData;
-    private WebappExtras mWebappExtras;
-    private WebApkExtras mWebApkExtras;
+    private final int mToolbarColor;
+    private final boolean mHasCustomToolbarColor;
+    private final Drawable mCloseButtonIcon;
+    private final ShareData mShareData;
+    private final @NonNull WebappExtras mWebappExtras;
+    private final @Nullable WebApkExtras mWebApkExtras;
 
     /**
      * Returns the toolbar color to use if a custom color is not specified by the webapp.
@@ -35,7 +36,7 @@
     }
 
     WebappIntentDataProvider(int toolbarColor, boolean hasCustomToolbarColor, ShareData shareData,
-            WebappExtras webappExtras, WebApkExtras webApkExtras) {
+            @NonNull WebappExtras webappExtras, @Nullable WebApkExtras webApkExtras) {
         mToolbarColor = toolbarColor;
         mHasCustomToolbarColor = hasCustomToolbarColor;
         mCloseButtonIcon = TintedDrawable.constructTintedDrawable(
@@ -46,6 +47,12 @@
     }
 
     @Override
+    @Nullable
+    public String getUrlToLoad() {
+        return mWebappExtras.url;
+    }
+
+    @Override
     public int getToolbarColor() {
         return mToolbarColor;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappVerifier.java
new file mode 100644
index 0000000..2de1e392
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappVerifier.java
@@ -0,0 +1,48 @@
+// Copyright 2020 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.webapps;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.Promise;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
+
+/**
+ * Contains common implementation between {@link AddToHomescreenVerifier} and
+ * {@link WebApkVerifier}.
+ */
+public abstract class WebappVerifier implements Verifier {
+    @Override
+    public final Promise<Boolean> verify(String url) {
+        return Promise.fulfilled(isUrlInScope(url));
+    }
+
+    @Override
+    public final boolean wasPreviouslyVerified(String url) {
+        return isUrlInScope(url);
+    }
+
+    @Nullable
+    @Override
+    public final String getVerifiedScope(String url) {
+        if (isUrlInScope(url)) return getScope();
+        return url;
+    }
+
+    @Override
+    public boolean shouldIgnoreExternalIntentHandlers(String url) {
+        return isUrlInScope(url);
+    }
+
+    /**
+     * Returns the scope that the homscreen shortcut/WebAPK is valid for.
+     */
+    protected abstract String getScope();
+
+    /**
+     * @return {@code true} if given {@code url} is in scope of the webapp.
+     */
+    protected abstract boolean isUrlInScope(String url);
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java
index 880ef28..c5823fa8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java
@@ -4,11 +4,12 @@
 
 package org.chromium.chrome.browser.webapps.dependency_injection;
 
-import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.TrustedWebActivityBrowserControlsVisibilityManager;
 import org.chromium.chrome.browser.customtabs.dependency_injection.BaseCustomTabActivityComponent;
 import org.chromium.chrome.browser.dependency_injection.ActivityScope;
 import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
+import org.chromium.chrome.browser.webapps.AddToHomescreenVerifier;
 import org.chromium.chrome.browser.webapps.WebApkUpdateManager;
+import org.chromium.chrome.browser.webapps.WebApkVerifier;
 import org.chromium.chrome.browser.webapps.WebappActivityTabController;
 
 import dagger.Subcomponent;
@@ -20,7 +21,8 @@
 @Subcomponent(modules = {ChromeActivityCommonsModule.class, WebappActivityModule.class})
 @ActivityScope
 public interface WebappActivityComponent extends BaseCustomTabActivityComponent {
-    TrustedWebActivityBrowserControlsVisibilityManager resolveBrowserControlsVisibilityManager();
+    AddToHomescreenVerifier resolveAddToHomescreenVerifier();
     WebappActivityTabController resolveTabController();
+    WebApkVerifier resolveWebApkVerifier();
     WebApkUpdateManager resolveWebApkUpdateManager();
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java
index e4cdf8f..07894f4a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityModule.java
@@ -8,10 +8,14 @@
 
 import org.chromium.chrome.browser.browserservices.BrowserServicesActivityTabController;
 import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.Verifier;
 import org.chromium.chrome.browser.customtabs.CustomTabUmaRecorder;
 import org.chromium.chrome.browser.init.StartupTabPreloader;
+import org.chromium.chrome.browser.webapps.AddToHomescreenVerifier;
+import org.chromium.chrome.browser.webapps.WebApkVerifier;
 import org.chromium.chrome.browser.webapps.WebappActivityTabController;
 
+import dagger.Lazy;
 import dagger.Module;
 import dagger.Provides;
 
@@ -37,6 +41,13 @@
         return webappTabController;
     }
 
+    @Provides
+    public Verifier provideVerifier(Lazy<AddToHomescreenVerifier> addToHomescreenVerifier,
+            Lazy<WebApkVerifier> webApkVerifier) {
+        return mIntentDataProvider.isWebApkActivity() ? webApkVerifier.get()
+                                                      : addToHomescreenVerifier.get();
+    }
+
     @Nullable
     @Provides
     // TODO(crbug.com/1021201): Add bit to all metrics to record whether they are recorded from a
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
index c978b38..bd962523 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/AuthenticatorImpl.java
@@ -6,7 +6,6 @@
 
 import android.annotation.TargetApi;
 import android.content.Context;
-import android.hardware.fingerprint.FingerprintManager;
 import android.os.Build;
 
 import org.chromium.base.PackageUtils;
@@ -34,8 +33,6 @@
     private final WebContents mWebContents;
 
     private static final String GMSCORE_PACKAGE_NAME = "com.google.android.gms";
-    private static final int GMSCORE_MIN_VERSION = 12800000;
-    private static final int GMSCORE_MIN_VERSION_ISUVPAA = 16200000;
 
     /** Ensures only one request is processed at a time. */
     private boolean mIsOperationPending;
@@ -72,7 +69,8 @@
 
         mMakeCredentialCallback = callback;
         Context context = ChromeActivity.fromWebContents(mWebContents);
-        if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME) < GMSCORE_MIN_VERSION) {
+        if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME)
+                < Fido2ApiHandler.GMSCORE_MIN_VERSION) {
             onError(AuthenticatorStatus.NOT_IMPLEMENTED);
             return;
         }
@@ -91,7 +89,8 @@
 
         mGetAssertionCallback = callback;
         Context context = ChromeActivity.fromWebContents(mWebContents);
-        if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME) < GMSCORE_MIN_VERSION) {
+        if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME)
+                < Fido2ApiHandler.GMSCORE_MIN_VERSION) {
             onError(AuthenticatorStatus.NOT_IMPLEMENTED);
             return;
         }
@@ -117,20 +116,14 @@
         }
 
         if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME)
-                >= GMSCORE_MIN_VERSION_ISUVPAA) {
-            mIsUserVerifyingPlatformAuthenticatorAvailableCallbackQueue.add(callback);
-            Fido2ApiHandler.getInstance().isUserVerifyingPlatformAuthenticatorAvailable(
-                    mRenderFrameHost, this);
-        } else if (PackageUtils.getPackageVersion(context, GMSCORE_PACKAGE_NAME)
-                        >= GMSCORE_MIN_VERSION
-                && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-            FingerprintManager fingerprintManager =
-                    (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
-            callback.call(
-                    fingerprintManager != null && fingerprintManager.hasEnrolledFingerprints());
-        } else {
+                < Fido2ApiHandler.GMSCORE_MIN_VERSION) {
             callback.call(false);
+            return;
         }
+
+        mIsUserVerifyingPlatformAuthenticatorAvailableCallbackQueue.add(callback);
+        Fido2ApiHandler.getInstance().isUserVerifyingPlatformAuthenticatorAvailable(
+                mRenderFrameHost, this);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java
index 029f24ee..3df174f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java
@@ -11,7 +11,6 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.blink.mojom.PublicKeyCredentialCreationOptions;
 import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
-import org.chromium.chrome.browser.AppHooks;
 import org.chromium.content_public.browser.RenderFrameHost;
 
 /**
@@ -21,7 +20,7 @@
 public class Fido2ApiHandler {
     private static Fido2ApiHandler sInstance;
     private static final String GMSCORE_PACKAGE_NAME = "com.google.android.gms";
-    private static final int GMSCORE_MIN_VERSION = 12800000;
+    public static final int GMSCORE_MIN_VERSION = 201106000;
 
     @VisibleForTesting
     static void overrideInstanceForTesting(Fido2ApiHandler instance) {
@@ -34,24 +33,31 @@
     public static Fido2ApiHandler getInstance() {
         ThreadUtils.checkUiThread();
         if (sInstance == null) {
-            // The Fido2 APIs can only be used on GmsCore v19+.
+            // The Fido2 APIs can only be used on GmsCore v2020w12+.
             // This check is only if sInstance is null since some tests may
             // override sInstance for testing.
             assert PackageUtils.getPackageVersion(
                     ContextUtils.getApplicationContext(), GMSCORE_PACKAGE_NAME)
                     >= GMSCORE_MIN_VERSION;
 
-            sInstance = AppHooks.get().createFido2ApiHandler();
+            sInstance = new Fido2ApiHandler();
         }
         return sInstance;
     }
 
     protected void makeCredential(PublicKeyCredentialCreationOptions options,
-            RenderFrameHost frameHost, HandlerResponseCallback callback) {}
+            RenderFrameHost frameHost, HandlerResponseCallback callback) {
+        new Fido2CredentialRequest().handleMakeCredentialRequest(options, frameHost, callback);
+    }
 
     protected void getAssertion(PublicKeyCredentialRequestOptions options,
-            RenderFrameHost frameHost, HandlerResponseCallback callback) {}
+            RenderFrameHost frameHost, HandlerResponseCallback callback) {
+        new Fido2CredentialRequest().handleGetAssertionRequest(options, frameHost, callback);
+    }
 
     protected void isUserVerifyingPlatformAuthenticatorAvailable(
-            RenderFrameHost frameHost, HandlerResponseCallback callback) {}
+            RenderFrameHost frameHost, HandlerResponseCallback callback) {
+        new Fido2CredentialRequest().handleIsUserVerifyingPlatformAuthenticatorAvailableRequest(
+                frameHost, callback);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequest.java
new file mode 100644
index 0000000..7d926dab
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequest.java
@@ -0,0 +1,373 @@
+// Copyright 2018 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.webauth;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.net.Uri;
+import android.os.SystemClock;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.VisibleForTesting;
+
+import com.google.android.gms.fido.Fido;
+import com.google.android.gms.fido.fido2.Fido2PendingIntent;
+import com.google.android.gms.fido.fido2.Fido2PrivilegedApiClient;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorAssertionResponse;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorAttestationResponse;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorErrorResponse;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorResponse;
+import com.google.android.gms.fido.fido2.api.common.BrowserPublicKeyCredentialCreationOptions;
+import com.google.android.gms.fido.fido2.api.common.BrowserPublicKeyCredentialRequestOptions;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredential;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialCreationOptions;
+import com.google.android.gms.tasks.OnSuccessListener;
+import com.google.android.gms.tasks.Task;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.Log;
+import org.chromium.blink.mojom.AuthenticatorStatus;
+import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
+import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler;
+import org.chromium.content_public.browser.RenderFrameHost;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.content_public.browser.WebContentsStatics;
+import org.chromium.net.GURLUtils;
+import org.chromium.ui.base.ActivityWindowAndroid;
+import org.chromium.ui.base.WindowAndroid;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.security.NoSuchAlgorithmException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Uses the Google Play Services Fido2 APIs.
+ * Holds the logic of each request.
+ */
+public class Fido2CredentialRequest implements WindowAndroid.IntentCallback {
+    private static final String TAG = "Fido2Request";
+    private HandlerResponseCallback mCallback;
+    private HandlerResponseCallback mIsUserVerifyingPlatformAuthenticatorAvailableCallback;
+    private Fido2PrivilegedApiClient mFido2ApiClient;
+    private WebContents mWebContents;
+    private ActivityWindowAndroid mWindow;
+    private @RequestStatus int mRequestStatus;
+    private boolean mAppIdExtensionUsed;
+    private long mTimeoutMs;
+    private long mStartTimeMs;
+
+    @IntDef({
+            REGISTER_REQUEST,
+            SIGN_REQUEST,
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface RequestStatus {}
+
+    /** Request status: processing a register request. */
+    public static final int REGISTER_REQUEST = 1;
+
+    /** Request status: processing a sign request. */
+    public static final int SIGN_REQUEST = 2;
+
+    /** The key used to retrieve PublicKeyCredential. */
+    public static final String FIDO2_KEY_CREDENTIAL_EXTRA = "FIDO2_CREDENTIAL_EXTRA";
+
+    private void returnErrorAndResetCallback(int error) {
+        assert mCallback != null;
+        if (mCallback == null) return;
+        mCallback.onError(error);
+        mCallback = null;
+    }
+
+    // Listens for a Fido2PendingIntent.
+    private OnSuccessListener<Fido2PendingIntent> mIntentListener = new OnSuccessListener<
+            Fido2PendingIntent>() {
+        @Override
+        public void onSuccess(Fido2PendingIntent fido2PendingIntent) {
+            if (!fido2PendingIntent.hasPendingIntent()) {
+                Log.e(TAG, "Didn't receive a pending intent.");
+                returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+                return;
+            }
+
+            if (mWindow == null) {
+                mWindow = ChromeActivity.fromWebContents(mWebContents).getWindowAndroid();
+                if (mWindow == null) {
+                    Log.e(TAG, "Couldn't get ActivityWindowAndroid.");
+                    returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+                    return;
+                }
+            }
+
+            final Activity activity = mWindow.getActivity().get();
+            if (activity == null) {
+                Log.e(TAG, "Null activity.");
+                returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+                return;
+            }
+
+            Callback<Integer> mIntentTrigger = (Integer result) -> {
+                try {
+                    fido2PendingIntent.launchPendingIntent(activity, result);
+                } catch (IntentSender.SendIntentException e) {
+                    Log.e(TAG, "Failed to send Fido2 register request to Google Play Services.");
+                    returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+                }
+            };
+
+            // Record starting time that will be used to establish a timeout that will
+            // be activated when we receive a response that cannot be returned to the
+            // relying party prior to timeout.
+            mStartTimeMs = SystemClock.elapsedRealtime();
+            int requestCode =
+                    mWindow.showCancelableIntent(mIntentTrigger, Fido2CredentialRequest.this, null);
+
+            if (requestCode == WindowAndroid.START_INTENT_FAILURE) {
+                Log.e(TAG, "Failed to send Fido2 request to Google Play Services.");
+                returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+            } else {
+                Log.e(TAG, "Sent a Fido2 request to Google Play Services.");
+            }
+        }
+    };
+
+    public void handleMakeCredentialRequest(
+            org.chromium.blink.mojom.PublicKeyCredentialCreationOptions options,
+            RenderFrameHost frameHost, HandlerResponseCallback callback) {
+        assert mCallback == null;
+        mCallback = callback;
+        if (mWebContents == null) {
+            mWebContents = WebContentsStatics.fromRenderFrameHost(frameHost);
+        }
+
+        mRequestStatus = REGISTER_REQUEST;
+        mTimeoutMs = TimeUnit.MICROSECONDS.toMillis(options.adjustedTimeout.microseconds);
+
+        if (!initFido2ApiClient()) {
+            Log.e(TAG, "Google Play Services' Fido2PrivilegedApi is not available.");
+            returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+            return;
+        }
+
+        int securityCheck =
+                frameHost.performMakeCredentialWebAuthSecurityChecks(options.relyingParty.id);
+        if (securityCheck != AuthenticatorStatus.SUCCESS) {
+            returnErrorAndResetCallback(securityCheck);
+            return;
+        }
+
+        PublicKeyCredentialCreationOptions credentialCreationOptions;
+        try {
+            credentialCreationOptions = Fido2Helper.toMakeCredentialOptions(options);
+        } catch (NoSuchAlgorithmException e) {
+            returnErrorAndResetCallback(AuthenticatorStatus.ALGORITHM_UNSUPPORTED);
+            return;
+        }
+
+        BrowserPublicKeyCredentialCreationOptions browserRequestOptions =
+                new BrowserPublicKeyCredentialCreationOptions.Builder()
+                        .setPublicKeyCredentialCreationOptions(credentialCreationOptions)
+                        .setOrigin(Uri.parse(GURLUtils.getOrigin(frameHost.getLastCommittedURL())))
+                        .build();
+
+        Task<Fido2PendingIntent> result = mFido2ApiClient.getRegisterIntent(browserRequestOptions);
+        result.addOnSuccessListener(mIntentListener);
+    }
+
+    public void handleGetAssertionRequest(PublicKeyCredentialRequestOptions options,
+            RenderFrameHost frameHost, HandlerResponseCallback callback) {
+        assert mCallback == null;
+        mCallback = callback;
+        if (mWebContents == null) {
+            mWebContents = WebContentsStatics.fromRenderFrameHost(frameHost);
+        }
+
+        mRequestStatus = SIGN_REQUEST;
+        mTimeoutMs = TimeUnit.MICROSECONDS.toMillis(options.adjustedTimeout.microseconds);
+
+        if (!initFido2ApiClient()) {
+            Log.e(TAG, "Google Play Services' Fido2PrivilegedApi is not available.");
+            returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+            return;
+        }
+
+        int securityCheck =
+                frameHost.performGetAssertionWebAuthSecurityChecks(options.relyingPartyId);
+        if (securityCheck != AuthenticatorStatus.SUCCESS) {
+            returnErrorAndResetCallback(securityCheck);
+            return;
+        }
+
+        if (options.appid != null) {
+            mAppIdExtensionUsed = true;
+        }
+
+        com.google.android.gms.fido.fido2.api.common
+                .PublicKeyCredentialRequestOptions getAssertionOptions;
+        getAssertionOptions = Fido2Helper.toGetAssertionOptions(options);
+
+        BrowserPublicKeyCredentialRequestOptions browserRequestOptions =
+                new BrowserPublicKeyCredentialRequestOptions.Builder()
+                        .setPublicKeyCredentialRequestOptions(getAssertionOptions)
+                        .setOrigin(Uri.parse(GURLUtils.getOrigin(frameHost.getLastCommittedURL())))
+                        .build();
+
+        Task<Fido2PendingIntent> result = mFido2ApiClient.getSignIntent(browserRequestOptions);
+        result.addOnSuccessListener(mIntentListener);
+    }
+
+    public void handleIsUserVerifyingPlatformAuthenticatorAvailableRequest(
+            RenderFrameHost frameHost, HandlerResponseCallback callback) {
+        assert mIsUserVerifyingPlatformAuthenticatorAvailableCallback == null;
+        mIsUserVerifyingPlatformAuthenticatorAvailableCallback = callback;
+        if (mWebContents == null) {
+            mWebContents = WebContentsStatics.fromRenderFrameHost(frameHost);
+        }
+        if (!initFido2ApiClient()) {
+            Log.e(TAG, "Google Play Services' Fido2PrivilegedApi is not available.");
+            // Note that |IsUserVerifyingPlatformAuthenticatorAvailable| only returns
+            // true or false, making it unable to handle any error status.
+            // So it callbacks with false if Fido2PrivilegedApi is not available.
+            mIsUserVerifyingPlatformAuthenticatorAvailableCallback
+                    .onIsUserVerifyingPlatformAuthenticatorAvailableResponse(false);
+            mIsUserVerifyingPlatformAuthenticatorAvailableCallback = null;
+            return;
+        }
+
+        Task<Boolean> result =
+                mFido2ApiClient.isUserVerifyingPlatformAuthenticatorAvailable()
+                        .addOnSuccessListener((isUVPAA) -> {
+                            mIsUserVerifyingPlatformAuthenticatorAvailableCallback
+                                    .onIsUserVerifyingPlatformAuthenticatorAvailableResponse(
+                                            isUVPAA);
+                            mIsUserVerifyingPlatformAuthenticatorAvailableCallback = null;
+                        });
+    }
+
+    /* Initialize the FIDO2 browser API client. */
+    private boolean initFido2ApiClient() {
+        if (mFido2ApiClient != null) {
+            return true;
+        }
+
+        if (!ExternalAuthUtils.getInstance().canUseGooglePlayServices(
+                    new UserRecoverableErrorHandler.Silent())) {
+            return false;
+        }
+
+        mFido2ApiClient = Fido.getFido2PrivilegedApiClient(ContextUtils.getApplicationContext());
+        if (mFido2ApiClient == null) {
+            return false;
+        }
+        return true;
+    }
+
+    @VisibleForTesting
+    protected void setActivityWindowForTesting(ActivityWindowAndroid window) {
+        mWindow = window;
+    }
+
+    @VisibleForTesting
+    protected void setWebContentsForTesting(WebContents webContents) {
+        mWebContents = webContents;
+    }
+
+    // Handles the result.
+    @Override
+    public void onIntentCompleted(WindowAndroid window, int resultCode, Intent data) {
+        if (data == null) {
+            Log.e(TAG, "Received a null intent.");
+            // The user canceled the request.
+            returnErrorAndResetCallback(AuthenticatorStatus.NOT_ALLOWED_ERROR);
+            return;
+        }
+
+        switch (resultCode) {
+            case Activity.RESULT_CANCELED:
+                returnErrorAndResetCallback(AuthenticatorStatus.NOT_ALLOWED_ERROR);
+                break;
+            case Activity.RESULT_OK:
+                processIntentResult(data);
+                break;
+            default:
+                // Something went wrong.
+                Log.e(TAG, "Failed with result code" + resultCode);
+                returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+                break;
+        }
+    }
+
+    private void processPublicKeyCredential(Intent data) {
+        PublicKeyCredential publicKeyCredential = PublicKeyCredential.deserializeFromBytes(
+                data.getByteArrayExtra(FIDO2_KEY_CREDENTIAL_EXTRA));
+        AuthenticatorResponse response = publicKeyCredential.getResponse();
+        if (response instanceof AuthenticatorErrorResponse) {
+            processErrorResponse((AuthenticatorErrorResponse) response);
+        } else if (response instanceof AuthenticatorAttestationResponse) {
+            mCallback.onRegisterResponse(AuthenticatorStatus.SUCCESS,
+                    Fido2Helper.toMakeCredentialResponse(publicKeyCredential));
+            mCallback = null;
+        } else if (response instanceof AuthenticatorAssertionResponse) {
+            mCallback.onSignResponse(AuthenticatorStatus.SUCCESS,
+                    Fido2Helper.toGetAssertionResponse(publicKeyCredential, mAppIdExtensionUsed));
+            mCallback = null;
+        }
+    }
+
+    private void processErrorResponse(AuthenticatorErrorResponse errorResponse) {
+        Log.e(TAG,
+                "Google Play Services FIDO2 API returned an error: "
+                        + errorResponse.getErrorMessage());
+        int authenticatorStatus = Fido2Helper.convertError(
+                errorResponse.getErrorCode(), errorResponse.getErrorMessage());
+        returnErrorAndResetCallback(authenticatorStatus);
+    }
+
+    private void processKeyResponse(Intent data) {
+        switch (mRequestStatus) {
+            case REGISTER_REQUEST:
+                Log.e(TAG, "Received a register response from Google Play Services FIDO2 API");
+                mCallback.onRegisterResponse(AuthenticatorStatus.SUCCESS,
+                        Fido2Helper.toMakeCredentialResponse(
+                                AuthenticatorAttestationResponse.deserializeFromBytes(
+                                        data.getByteArrayExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA))));
+                break;
+            case SIGN_REQUEST:
+                Log.e(TAG, "Received a sign response from Google Play Services FIDO2 API");
+                mCallback.onSignResponse(AuthenticatorStatus.SUCCESS,
+                        Fido2Helper.toGetAssertionResponse(
+                                AuthenticatorAssertionResponse.deserializeFromBytes(
+                                        data.getByteArrayExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA)),
+                                mAppIdExtensionUsed));
+                break;
+        }
+        mCallback = null;
+    }
+
+    private void processIntentResult(Intent data) {
+        // If returned PublicKeyCredential, use PublicKeyCredential to retrieve
+        // [Attestation/Assertion/Error] Response, else directly retrieve
+        // [Attestation/Assertion/Error] Response.
+        if (data.hasExtra(FIDO2_KEY_CREDENTIAL_EXTRA)) {
+            processPublicKeyCredential(data);
+        } else if (data.hasExtra(Fido.FIDO2_KEY_ERROR_EXTRA)) {
+            processErrorResponse(AuthenticatorErrorResponse.deserializeFromBytes(
+                    data.getByteArrayExtra(Fido.FIDO2_KEY_ERROR_EXTRA)));
+        } else if (data.hasExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA)) {
+            processKeyResponse(data);
+        } else {
+            // Something went wrong.
+            Log.e(TAG,
+                    "The response is missing FIDO2_KEY_RESPONSE_EXTRA "
+                            + "and FIDO2_KEY_CREDENTIAL_EXTRA.");
+            returnErrorAndResetCallback(AuthenticatorStatus.UNKNOWN_ERROR);
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java
new file mode 100644
index 0000000..afb5a66
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2Helper.java
@@ -0,0 +1,380 @@
+// Copyright 2018 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.webauth;
+
+import android.util.Base64;
+
+import com.google.android.gms.fido.common.Transport;
+import com.google.android.gms.fido.fido2.api.common.Attachment;
+import com.google.android.gms.fido.fido2.api.common.AttestationConveyancePreference;
+import com.google.android.gms.fido.fido2.api.common.AuthenticationExtensions;
+import com.google.android.gms.fido.fido2.api.common.AuthenticationExtensionsClientOutputs;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorAssertionResponse;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorAttestationResponse;
+import com.google.android.gms.fido.fido2.api.common.AuthenticatorSelectionCriteria;
+import com.google.android.gms.fido.fido2.api.common.ErrorCode;
+import com.google.android.gms.fido.fido2.api.common.FidoAppIdExtension;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredential;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialCreationOptions;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialDescriptor;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialParameters;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialRpEntity;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialType;
+import com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialUserEntity;
+import com.google.android.gms.fido.fido2.api.common.UserVerificationMethodExtension;
+import com.google.android.gms.fido.fido2.api.common.UvmEntries;
+
+import org.chromium.base.Log;
+import org.chromium.blink.mojom.AuthenticatorAttachment;
+import org.chromium.blink.mojom.AuthenticatorStatus;
+import org.chromium.blink.mojom.AuthenticatorTransport;
+import org.chromium.blink.mojom.CommonCredentialInfo;
+import org.chromium.blink.mojom.GetAssertionAuthenticatorResponse;
+import org.chromium.blink.mojom.MakeCredentialAuthenticatorResponse;
+import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
+import org.chromium.blink.mojom.UvmEntry;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Utility class that provides conversions between GmsCore Fido2
+ * and authenticator.mojom data structures.
+ */
+public final class Fido2Helper {
+    private static final String TAG = "Fido2Helper";
+    private static final int ECDSA_COSE_IDENTIFIER = -7;
+    private static final String NON_EMPTY_ALLOWLIST_ERROR_MSG =
+            "Authentication request must have non-empty allowList";
+    private static final String NON_VALID_ALLOWED_CREDENTIALS_ERROR_MSG =
+            "Request doesn't have a valid list of allowed credentials.";
+    private static final String NO_SCREENLOCK_ERROR_MSG =
+            "The device is not secured with any screen lock";
+    private static final String CREDENTIAL_EXISTS_ERROR_MSG =
+            "One of the excluded credentials exists on the local device";
+    private static final String LOW_LEVEL_ERROR_MSG = "Low level error 0x6a80";
+
+    /**
+     * Converts mojo options to gmscore options.
+     * @param options Options passed in from the renderer.
+     * @return Options to be passed to Fido2 API.
+     * @throws NoSuchAlgorithmException
+     */
+    public static PublicKeyCredentialCreationOptions toMakeCredentialOptions(
+            org.chromium.blink.mojom.PublicKeyCredentialCreationOptions options)
+            throws NoSuchAlgorithmException {
+        // Pack incoming options as Fido2's BrowserMakeCredentialOptions.
+        String rpIcon = options.relyingParty.icon != null ? options.relyingParty.icon.url : null;
+        PublicKeyCredentialRpEntity rp = new PublicKeyCredentialRpEntity(
+                options.relyingParty.id, options.relyingParty.name, rpIcon);
+
+        String userIcon = options.user.icon != null ? options.user.icon.url : null;
+        PublicKeyCredentialUserEntity user = new PublicKeyCredentialUserEntity(
+                options.user.id, options.user.name, userIcon, options.user.displayName);
+
+        List<PublicKeyCredentialParameters> parameters = new ArrayList<>();
+        for (org.chromium.blink.mojom.PublicKeyCredentialParameters param :
+                options.publicKeyParameters) {
+            if (param.algorithmIdentifier == ECDSA_COSE_IDENTIFIER
+                    && param.type == org.chromium.blink.mojom.PublicKeyCredentialType.PUBLIC_KEY) {
+                parameters.add(new PublicKeyCredentialParameters(
+                        PublicKeyCredentialType.PUBLIC_KEY.toString(), param.algorithmIdentifier));
+            }
+        }
+
+        // Check that at least one incoming param is supported by the FIDO2 API.
+        if (parameters.size() == 0 && options.publicKeyParameters.length != 0) {
+            Log.e(TAG, "None of the requested parameters are supported.");
+            throw new NoSuchAlgorithmException();
+        }
+
+        List<PublicKeyCredentialDescriptor> excludeCredentials =
+                convertCredentialDescriptor(options.excludeCredentials);
+
+        double timeoutSeconds =
+                TimeUnit.MICROSECONDS.toSeconds(options.adjustedTimeout.microseconds);
+
+        AuthenticatorSelectionCriteria selection =
+                convertSelectionCriteria(options.authenticatorSelection);
+
+        AttestationConveyancePreference attestationPreference =
+                convertAttestationPreference(options.attestation);
+
+        PublicKeyCredentialCreationOptions credentialCreationOptions =
+                new PublicKeyCredentialCreationOptions.Builder()
+                        .setRp(rp)
+                        .setUser(user)
+                        .setChallenge(options.challenge)
+                        .setParameters(parameters)
+                        .setTimeoutSeconds(timeoutSeconds)
+                        .setExcludeList(excludeCredentials)
+                        .setAuthenticatorSelection(selection)
+                        .setAttestationConveyancePreference(attestationPreference)
+                        .build();
+        return credentialCreationOptions;
+    }
+
+    /**
+     * Converts gmscore AuthenticatorAttestationResponse to mojo MakeCredentialAuthenticatorResponse
+     * @param data Response from the Fido2 API.
+     * @return Response to be passed to the renderer.
+     */
+    public static MakeCredentialAuthenticatorResponse toMakeCredentialResponse(
+            AuthenticatorAttestationResponse data) {
+        MakeCredentialAuthenticatorResponse response = new MakeCredentialAuthenticatorResponse();
+        CommonCredentialInfo info = new CommonCredentialInfo();
+
+        response.attestationObject = data.getAttestationObject();
+        // An empty transports array indicates that we don't have any
+        // information about the available transports.
+        response.transports = new int[] {};
+        info.id = encodeId(data.getKeyHandle());
+        info.rawId = data.getKeyHandle();
+        info.clientDataJson = data.getClientDataJSON();
+        response.info = info;
+        return response;
+    }
+
+    public static MakeCredentialAuthenticatorResponse toMakeCredentialResponse(
+            PublicKeyCredential data) {
+        MakeCredentialAuthenticatorResponse response =
+                toMakeCredentialResponse((AuthenticatorAttestationResponse) data.getResponse());
+        return response;
+    }
+
+    /**
+     * Converts mojo options to gmscore options.
+     * @param options Options passed in from the renderer.
+     * @return Options to be passed to Fido2 API.
+     */
+    public static com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialRequestOptions
+    toGetAssertionOptions(PublicKeyCredentialRequestOptions options) {
+        double timeoutSeconds =
+                TimeUnit.MICROSECONDS.toSeconds(options.adjustedTimeout.microseconds);
+
+        List<PublicKeyCredentialDescriptor> allowCredentials =
+                convertCredentialDescriptor(options.allowCredentials);
+
+        FidoAppIdExtension fidoAppIdExtension =
+                (options.appid != null) ? new FidoAppIdExtension(options.appid) : null;
+        UserVerificationMethodExtension userVerificationMethodExtension =
+                new UserVerificationMethodExtension(options.userVerificationMethods);
+        AuthenticationExtensions authenticationExtensions =
+                new AuthenticationExtensions.Builder()
+                        .setFido2Extension(fidoAppIdExtension)
+                        .setUserVerificationMethodExtension(userVerificationMethodExtension)
+                        .build();
+
+        // Pack options as Fido2's BrowserPublicKeyCredentialRequestOptions.
+        com.google.android.gms.fido.fido2.api.common
+                .PublicKeyCredentialRequestOptions credentialRequestOptions =
+                new com.google.android.gms.fido.fido2.api.common.PublicKeyCredentialRequestOptions
+                        .Builder()
+                        .setChallenge(options.challenge)
+                        .setTimeoutSeconds(timeoutSeconds)
+                        .setRpId(options.relyingPartyId)
+                        .setAllowList(allowCredentials)
+                        /* TODO add back UserVerificationRequirement when the FIDO2 API supports it
+                         */
+                        .setAuthenticationExtensions(authenticationExtensions)
+                        .build();
+        return credentialRequestOptions;
+    }
+
+    /**
+     * Helper method that creates GetAssertionAuthenticatorResponse objects.
+     */
+    public static GetAssertionAuthenticatorResponse toGetAssertionResponse(
+            AuthenticatorAssertionResponse data, boolean appIdExtensionUsed) {
+        GetAssertionAuthenticatorResponse response = new GetAssertionAuthenticatorResponse();
+        CommonCredentialInfo info = new CommonCredentialInfo();
+        response.authenticatorData = data.getAuthenticatorData();
+        response.signature = data.getSignature();
+        response.echoAppidExtension = appIdExtensionUsed;
+        info.id = encodeId(data.getKeyHandle());
+        info.rawId = data.getKeyHandle();
+        info.clientDataJson = data.getClientDataJSON();
+        response.info = info;
+        return response;
+    }
+
+    public static GetAssertionAuthenticatorResponse toGetAssertionResponse(
+            PublicKeyCredential data, boolean appIdExtensionUsed) {
+        GetAssertionAuthenticatorResponse response = toGetAssertionResponse(
+                (AuthenticatorAssertionResponse) data.getResponse(), appIdExtensionUsed);
+        AuthenticationExtensionsClientOutputs extensionsClientOutputs =
+                data.getClientExtensionResults();
+
+        if (extensionsClientOutputs != null && extensionsClientOutputs.getUvmEntries() != null) {
+            response.echoUserVerificationMethods = true;
+            response.userVerificationMethods =
+                    getUserVerificationMethods(extensionsClientOutputs.getUvmEntries());
+        }
+        return response;
+    }
+
+    /**
+     * Helper method to convert AuthenticatorErrorResponse errors.
+     * @param errorCode
+     * @return error code corresponding to an AuthenticatorStatus.
+     */
+    public static int convertError(ErrorCode errorCode, String errorMsg) {
+        // TODO(b/113347251): Use specific error codes instead of strings when GmsCore Fido2
+        // provides them.
+        switch (errorCode) {
+            case SECURITY_ERR:
+                // AppId or rpID fails validation.
+                return AuthenticatorStatus.INVALID_DOMAIN;
+            case TIMEOUT_ERR:
+                return AuthenticatorStatus.NOT_ALLOWED_ERROR;
+            case ENCODING_ERR:
+                // Error encoding results (after user consent).
+                return AuthenticatorStatus.UNKNOWN_ERROR;
+            case NOT_ALLOWED_ERR:
+                // The implementation doesn't support resident keys.
+                if (errorMsg != null
+                        && (errorMsg.equals(NON_EMPTY_ALLOWLIST_ERROR_MSG)
+                                || errorMsg.equals(NON_VALID_ALLOWED_CREDENTIALS_ERROR_MSG))) {
+                    return AuthenticatorStatus.EMPTY_ALLOW_CREDENTIALS;
+                }
+                // The request is not allowed, possibly because the user denied permission.
+                return AuthenticatorStatus.NOT_ALLOWED_ERROR;
+            case DATA_ERR:
+            // Incoming requests were malformed/inadequate. Fallthrough.
+            case NOT_SUPPORTED_ERR:
+                // Request parameters were not supported.
+                return AuthenticatorStatus.ANDROID_NOT_SUPPORTED_ERROR;
+            case CONSTRAINT_ERR:
+                if (errorMsg != null && errorMsg.equals(NO_SCREENLOCK_ERROR_MSG)) {
+                    return AuthenticatorStatus.USER_VERIFICATION_UNSUPPORTED;
+                } else {
+                    // The user attempted to use a credential that was already registered.
+                    return AuthenticatorStatus.CREDENTIAL_EXCLUDED;
+                }
+            case INVALID_STATE_ERR:
+                if (errorMsg != null && errorMsg.equals(CREDENTIAL_EXISTS_ERROR_MSG)) {
+                    return AuthenticatorStatus.CREDENTIAL_EXCLUDED;
+                }
+            // else fallthrough.
+            case UNKNOWN_ERR:
+                if (errorMsg != null && errorMsg.equals(LOW_LEVEL_ERROR_MSG)) {
+                    // The error message returned from GmsCore when the user attempted to use a
+                    // credential that is not registered.
+                    return AuthenticatorStatus.CREDENTIAL_NOT_RECOGNIZED;
+                }
+            // fall through
+            default:
+                return AuthenticatorStatus.UNKNOWN_ERROR;
+        }
+    }
+
+    /**
+     * Base64 encodes the raw id.
+     * @param keyHandle the raw id (key handle of the credential).
+     * @return Base64-encoded id.
+     */
+    private static String encodeId(byte[] keyHandle) {
+        return Base64.encodeToString(
+                keyHandle, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
+    }
+
+    /**
+     * Parses uvmEntries into userVerificationMethods
+     * @param uvmEntries defined in gmscore.
+     * @return userVerificationMethods defined in authenticato.mojom.
+     */
+    private static UvmEntry[] getUserVerificationMethods(UvmEntries uvmEntries) {
+        List<com.google.android.gms.fido.fido2.api.common.UvmEntry> uvmEntryList =
+                uvmEntries.getUvmEntryList();
+        UvmEntry[] userVerificationMethods = new UvmEntry[uvmEntryList.size()];
+        for (int i = 0; i < uvmEntryList.size(); i++) {
+            UvmEntry uvmEntry = new UvmEntry();
+            uvmEntry.userVerificationMethod = uvmEntryList.get(i).getUserVerificationMethod();
+            uvmEntry.keyProtectionType = uvmEntryList.get(i).getKeyProtectionType();
+            uvmEntry.matcherProtectionType = uvmEntryList.get(i).getMatcherProtectionType();
+            userVerificationMethods[i] = uvmEntry;
+        }
+        return userVerificationMethods;
+    }
+
+    private static List<PublicKeyCredentialDescriptor> convertCredentialDescriptor(
+            org.chromium.blink.mojom.PublicKeyCredentialDescriptor[] mojoDescriptors) {
+        if (mojoDescriptors == null) {
+            return null;
+        }
+
+        List<PublicKeyCredentialDescriptor> descriptors = new ArrayList<>();
+        for (org.chromium.blink.mojom.PublicKeyCredentialDescriptor descriptor : mojoDescriptors) {
+            descriptors.add(
+                    new PublicKeyCredentialDescriptor(PublicKeyCredentialType.PUBLIC_KEY.toString(),
+                            descriptor.id, toTransportList(descriptor.transports)));
+        }
+        return descriptors;
+    }
+
+    private static AuthenticatorSelectionCriteria convertSelectionCriteria(
+            org.chromium.blink.mojom.AuthenticatorSelectionCriteria mojoSelection) {
+        AuthenticatorSelectionCriteria selection = null;
+        if (mojoSelection != null) {
+            /* Sets UserVerificationRequirement and RequireResidentKey to default until the FIDO2
+             * API supports the other options. */
+            selection =
+                    new AuthenticatorSelectionCriteria.Builder()
+                            .setAttachment(convertAttachment(mojoSelection.authenticatorAttachment))
+                            .build();
+        }
+        return selection;
+    }
+
+    private static List<Transport> toTransportList(int[] mojoTransports) {
+        List<Transport> fidoTransports = new ArrayList<>();
+        for (int transport : mojoTransports) {
+            fidoTransports.add(convertTransport(transport));
+        }
+        return fidoTransports;
+    }
+
+    private static Transport convertTransport(int transport) {
+        switch (transport) {
+            case AuthenticatorTransport.USB:
+                return Transport.USB;
+            case AuthenticatorTransport.NFC:
+                return Transport.NFC;
+            case AuthenticatorTransport.BLE:
+                return Transport.BLUETOOTH_LOW_ENERGY;
+            case AuthenticatorTransport.INTERNAL:
+                return Transport.INTERNAL;
+            default:
+                return Transport.USB;
+        }
+    }
+
+    private static Attachment convertAttachment(int attachment) {
+        if (attachment == AuthenticatorAttachment.NO_PREFERENCE) {
+            return null;
+        } else if (attachment == AuthenticatorAttachment.CROSS_PLATFORM) {
+            return Attachment.CROSS_PLATFORM;
+        } else {
+            return Attachment.PLATFORM;
+        }
+    }
+
+    private static AttestationConveyancePreference convertAttestationPreference(int preference) {
+        switch (preference) {
+            case org.chromium.blink.mojom.AttestationConveyancePreference.NONE:
+                return AttestationConveyancePreference.NONE;
+            case org.chromium.blink.mojom.AttestationConveyancePreference.INDIRECT:
+                return AttestationConveyancePreference.INDIRECT;
+            case org.chromium.blink.mojom.AttestationConveyancePreference.DIRECT:
+                return AttestationConveyancePreference.DIRECT;
+            case org.chromium.blink.mojom.AttestationConveyancePreference.ENTERPRISE:
+                return AttestationConveyancePreference.NONE;
+            default:
+                return AttestationConveyancePreference.NONE;
+        }
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java
index 1660720..a254637e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/appmenu/OverviewAppMenuTest.java
@@ -28,6 +28,7 @@
 import org.chromium.chrome.browser.ui.appmenu.AppMenuTestSupport;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.test.util.UiRestriction;
 
@@ -53,10 +54,10 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testAllMenuItemsWithoutStartSurface() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -87,11 +88,11 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testIncognitoAllMenuItemsWithoutStartSurface() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mActivityTestRule.getActivity().getTabModelSelector().selectModel(true);
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -122,10 +123,10 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testAllMenuItemsWithStartSurface() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, true);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -158,11 +159,11 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testIncognitoAllMenuItemsWithStartSurface() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mActivityTestRule.getActivity().getTabModelSelector().selectModel(true);
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, true);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -195,10 +196,10 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testGroupTabsIsDisabled() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -218,10 +219,10 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testGroupTabsIsEnabled() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, false);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -247,10 +248,10 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testGroupTabsIsDisabledWithStartSurface() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, true);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
@@ -270,10 +271,10 @@
     @Test
     @SmallTest
     @Feature({"Browser", "Main"})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testGroupTabsIsEnabledWithStartSurface() throws Exception {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             CachedFeatureFlags.setForTesting(ChromeFeatureList.START_SURFACE_ANDROID, true);
-            CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
             AppMenuTestSupport.showAppMenu(
                     mActivityTestRule.getAppMenuCoordinator(), null, false, false);
         });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java
index 29e0c62..5659abe 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/AutofillUpstreamTest.java
@@ -43,8 +43,8 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @RetryOnFailure
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
-        "enable-features=AutofillUpstreamEditableExpirationDate"})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=AutofillUpstream"})
 public class AutofillUpstreamTest {
     private static final String TEST_SERVER_DIR = "components/test/data/autofill";
     private static final String TEST_FORM_URL = "/credit_card_upload_form_address_and_cc.html";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityCurrentPageVerifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityCurrentPageVerifierTest.java
new file mode 100644
index 0000000..0e3f4b6
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/trustedwebactivityui/controller/TrustedWebActivityCurrentPageVerifierTest.java
@@ -0,0 +1,103 @@
+// Copyright 2020 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.browserservices.trustedwebactivityui.controller;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.CommandLine;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.browserservices.TrustedWebActivityTestUtil;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier.VerificationStatus;
+import org.chromium.chrome.browser.customtabs.CustomTabActivity;
+import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.test.MockCertVerifierRuleAndroid;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.content_public.browser.test.NativeLibraryTestRule;
+import org.chromium.content_public.common.ContentSwitches;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Tests the {@link CurrentPageVerifier} integration with Trusted Web Activity Mode.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public final class TrustedWebActivityCurrentPageVerifierTest {
+    public final CustomTabActivityTestRule mActivityTestRule = new CustomTabActivityTestRule();
+
+    public final NativeLibraryTestRule mNativeLibraryTestRule = new NativeLibraryTestRule();
+
+    public MockCertVerifierRuleAndroid mCertVerifierRule =
+            new MockCertVerifierRuleAndroid(mNativeLibraryTestRule, 0 /* net::OK */);
+
+    @Rule
+    public RuleChain mRuleChain = RuleChain.emptyRuleChain()
+                                          .around(mActivityTestRule)
+                                          .around(mNativeLibraryTestRule)
+                                          .around(mCertVerifierRule);
+
+    @Before
+    public void setUp() {
+        mActivityTestRule.getEmbeddedTestServerRule().setServerUsesHttps(true);
+        Uri mapToUri =
+                Uri.parse(mActivityTestRule.getEmbeddedTestServerRule().getServer().getURL("/"));
+        CommandLine.getInstance().appendSwitchWithValue(
+                ContentSwitches.HOST_RESOLVER_RULES, "MAP * " + mapToUri.getAuthority());
+    }
+
+    private void launchTwa(String url) throws TimeoutException {
+        String packageName = InstrumentationRegistry.getTargetContext().getPackageName();
+        Intent intent = TrustedWebActivityTestUtil.createTrustedWebActivityIntent(url);
+        TrustedWebActivityTestUtil.spoofVerification(packageName, url);
+        TrustedWebActivityTestUtil.createSession(intent, packageName);
+        mActivityTestRule.startCustomTabActivityWithIntent(intent);
+    }
+
+    private @VerificationStatus int getCurrentPageVerifierStatus() {
+        CustomTabActivity customTabActivity = mActivityTestRule.getActivity();
+        return customTabActivity.getComponent().resolveCurrentPageVerifier().getState().status;
+    }
+
+    @Test
+    @LargeTest
+    public void testInScope() throws TimeoutException {
+        String page = "https://foo.com/chrome/test/data/android/customtabs/cct_header.html";
+        String otherPageInScope =
+                "https://foo.com/chrome/test/data/android/customtabs/cct_header_frame.html";
+        launchTwa(page);
+
+        mActivityTestRule.loadUrl(otherPageInScope);
+
+        TrustedWebActivityTestUtil.waitForCurrentPageVerifierToFinish(
+                mActivityTestRule.getActivity());
+        assertEquals(VerificationStatus.SUCCESS, getCurrentPageVerifierStatus());
+    }
+
+    @Test
+    @LargeTest
+    public void testOutsideScope() throws TimeoutException {
+        String page = "https://foo.com/chrome/test/data/android/simple.html";
+        String pageDifferentOrigin = "https://bar.com/chrome/test/data/android/simple.html";
+        launchTwa(page);
+
+        mActivityTestRule.loadUrl(pageDifferentOrigin, 10 /* secondsToWait */);
+
+        TrustedWebActivityTestUtil.waitForCurrentPageVerifierToFinish(
+                mActivityTestRule.getActivity());
+        assertEquals(VerificationStatus.FAILURE, getCurrentPageVerifierStatus());
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
index 7baa6d8..27f2020 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerTest.java
@@ -556,8 +556,6 @@
             ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
     public void testStartSurfaceLayout_Disabled_HighEndPhone() throws Exception {
         // clang-format on
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, false);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
         verifyStackLayoutEnabled();
 
         // Verify accessibility
@@ -573,10 +571,9 @@
     // clang-format off
     @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
     @Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
     public void testStartSurfaceLayout_Disabled_AllPhone_Accessibility_WithoutContinuationFlag() {
         // clang-format on
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         AccessibilityUtil.setAccessibilityEnabledForTesting(true);
         verifyOverviewListLayoutEnabled();
     }
@@ -587,7 +584,8 @@
     @Feature({"Android-TabSwitcher"})
     // clang-format off
     @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @Features.EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+            ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
     public void testStartSurfaceLayout_Enabled_HighEndPhone() throws Exception {
         // clang-format on
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
@@ -595,7 +593,6 @@
 
         ApplicationTestUtils.finishActivity(mActivityTestRule.getActivity());
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, false);
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.GRID);
 
         // Verify accessibility
@@ -615,7 +612,6 @@
     @Features.DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
     public void testStartSurfaceLayout_Enabled_LowEndPhone() throws Exception {
         // clang-format on
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, true);
         verifyStartSurfaceLayoutEnable(TabListCoordinator.TabListMode.LIST);
 
         // Test Accessibility
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 9ea612cf..52c7776 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,7 @@
         mIntegers.put(R.color.modern_grey_100, 0xFFF1F3F4);
         mIntegers.put(R.color.modern_primary_color, Color.WHITE);
         mIntegers.put(R.color.default_primary_color, 0xFFF2F2F2);
-        mIntegers.put(R.color.dark_primary_color, 0xFF3C4043);
+        mIntegers.put(R.color.default_bg_color_dark, 0xFF3C4043);
     }
 
     @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
index 5e1ac97..ba80535 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
@@ -22,10 +22,10 @@
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.components.dom_distiller.core.DistilledPagePrefs;
 import org.chromium.components.dom_distiller.core.DomDistillerService;
-import org.chromium.components.dom_distiller.core.FontFamily;
-import org.chromium.components.dom_distiller.core.Theme;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.browser.test.util.UiUtils;
+import org.chromium.dom_distiller.mojom.FontFamily;
+import org.chromium.dom_distiller.mojom.Theme;
 
 /**
  * Test class for {@link DistilledPagePrefs}.
@@ -228,27 +228,27 @@
     }
 
     private static class TestingObserver implements DistilledPagePrefs.Observer {
-        private @FontFamily int mFontFamily;
-        private @Theme int mTheme;
+        private int mFontFamily;
+        private int mTheme;
         private float mFontScaling;
 
         public TestingObserver() {}
 
-        public @FontFamily int getFontFamily() {
+        public int getFontFamily() {
             return mFontFamily;
         }
 
         @Override
-        public void onChangeFontFamily(@FontFamily int font) {
+        public void onChangeFontFamily(int font) {
             mFontFamily = font;
         }
 
-        public @Theme int getTheme() {
+        public int getTheme() {
             return mTheme;
         }
 
         @Override
-        public void onChangeTheme(@Theme int theme) {
+        public void onChangeTheme(int theme) {
             mTheme = theme;
         }
 
@@ -262,11 +262,11 @@
         }
     }
 
-    private void setFontFamily(final @FontFamily int font) {
+    private void setFontFamily(final int font) {
         TestThreadUtils.runOnUiThreadBlocking(() -> mDistilledPagePrefs.setFontFamily(font));
     }
 
-    private void setTheme(final @Theme int theme) {
+    private void setTheme(final int theme) {
         TestThreadUtils.runOnUiThreadBlocking(() -> mDistilledPagePrefs.setTheme(theme));
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
index da403bf..fd5629fb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -4,6 +4,10 @@
 
 package org.chromium.chrome.browser.searchwidget;
 
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.app.Instrumentation;
@@ -20,6 +24,8 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.Callback;
@@ -37,6 +43,7 @@
 import org.chromium.chrome.browser.omnibox.UrlBar;
 import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion;
 import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion.MatchClassification;
+import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.searchwidget.SearchActivity.SearchActivityDelegate;
 import org.chromium.chrome.browser.tab.Tab;
@@ -137,10 +144,16 @@
     @Rule
     public MultiActivityTestRule mTestRule = new MultiActivityTestRule();
 
+    @Mock
+    VoiceRecognitionHandler mHandler;
+
     private TestDelegate mTestDelegate;
 
     @Before
     public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        doReturn(true).when(mHandler).isVoiceSearchEnabled();
+
         mTestDelegate = new TestDelegate();
         SearchActivity.setDelegateForTests(mTestDelegate);
         DefaultSearchEnginePromoDialog.setObserverForTests(mTestDelegate);
@@ -206,6 +219,38 @@
 
     @Test
     @SmallTest
+    public void testVoiceSearchBeforeNativeIsLoaded() throws Exception {
+        // Wait for the activity to load, but don't let it load the native library.
+        mTestDelegate.shouldDelayLoadingNative = true;
+        final SearchActivity searchActivity = startSearchActivity(0, /*isVoiceSearch=*/true);
+        final SearchActivityLocationBarLayout locationBar =
+                (SearchActivityLocationBarLayout) searchActivity.findViewById(
+                        R.id.search_location_bar);
+        locationBar.setVoiceRecognitionHandlerForTesting(mHandler);
+        locationBar.beginQuery(/* isVoiceSearchIntent= */ true, /* optionalText= */ null);
+        verify(mHandler, times(0))
+                .startVoiceRecognition(
+                        VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET);
+
+        mTestDelegate.shouldDelayNativeInitializationCallback.waitForCallback(0);
+        Assert.assertEquals(0, mTestDelegate.showSearchEngineDialogIfNeededCallback.getCallCount());
+        Assert.assertEquals(0, mTestDelegate.onFinishDeferredInitializationCallback.getCallCount());
+
+        // Start loading native, then let the activity finish initialization.
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> searchActivity.startDelayedNativeInitialization());
+
+        Assert.assertEquals(
+                1, mTestDelegate.shouldDelayNativeInitializationCallback.getCallCount());
+        mTestDelegate.showSearchEngineDialogIfNeededCallback.waitForCallback(0);
+        mTestDelegate.onFinishDeferredInitializationCallback.waitForCallback(0);
+
+        verify(mHandler).startVoiceRecognition(
+                VoiceRecognitionHandler.VoiceInteractionSource.SEARCH_WIDGET);
+    }
+
+    @Test
+    @SmallTest
     public void testTypeBeforeNativeIsLoaded() throws Exception {
         // Wait for the activity to load, but don't let it load the native library.
         mTestDelegate.shouldDelayLoadingNative = true;
@@ -436,7 +481,7 @@
         OmniboxTestUtils.waitForOmniboxSuggestions(locationBar, OMNIBOX_SHOW_TIMEOUT_MS);
 
         // Start the Activity again by firing another copy of the same Intent.
-        SearchActivity restartedActivity = startSearchActivity(1);
+        SearchActivity restartedActivity = startSearchActivity(1, /*isVoiceSearch=*/false);
         Assert.assertEquals(searchActivity, restartedActivity);
 
         // The query should be wiped.
@@ -450,10 +495,10 @@
     }
 
     private SearchActivity startSearchActivity() {
-        return startSearchActivity(0);
+        return startSearchActivity(0, /*isVoiceSearch=*/false);
     }
 
-    private SearchActivity startSearchActivity(int expectedCallCount) {
+    private SearchActivity startSearchActivity(int expectedCallCount, boolean isVoiceSearch) {
         final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         ActivityMonitor searchMonitor =
                 new ActivityMonitor(SearchActivity.class.getName(), null, false);
@@ -469,7 +514,7 @@
 
         // Fire the Intent to start up the SearchActivity.
         Intent intent = new Intent();
-        SearchWidgetProvider.startSearchActivity(intent, false);
+        SearchWidgetProvider.startSearchActivity(intent, isVoiceSearch);
         Activity searchActivity = instrumentation.waitForMonitorWithTimeout(
                 searchMonitor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL);
         Assert.assertNotNull("Activity didn't start", searchActivity);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
index 3d6eaa7..9b67f392 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tasks/ReturnToChromeTest.java
@@ -26,7 +26,6 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper;
@@ -34,6 +33,7 @@
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ApplicationTestUtils;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -45,10 +45,13 @@
  * has passed.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+// clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
         "enable-features=" + ChromeFeatureList.TAB_SWITCHER_ON_RETURN + "<Study",
         "force-fieldtrials=Study/Group"})
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 public class ReturnToChromeTest {
+    // clang-format on
     private static final String BASE_PARAMS =
             "force-fieldtrial-params=Study.Group:" + TAB_SWITCHER_ON_RETURN_MS + "/0";
     @Rule
@@ -61,8 +64,6 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
-
         EmbeddedTestServer testServer =
                 EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
         mUrl = testServer.getURL("/chrome/test/data/android/about.html");
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
index e7529eb5..6d0595a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/AdaptiveToolbarTest.java
@@ -28,7 +28,6 @@
 import android.support.test.filters.MediumTest;
 
 import org.junit.After;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestRule;
@@ -56,6 +55,7 @@
 // clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
+@Features.DisableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID})
 public class AdaptiveToolbarTest {
     // Params to turn off new tab variation in GTS.
     private static final String NO_NEW_TAB_VARIATION_PARAMS = "force-fieldtrial-params=" +
@@ -70,11 +70,6 @@
     @Rule
     public TestRule mProcessor = new Features.InstrumentationProcessor();
 
-    @Before
-    public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
-    }
-
     @After
     public void tearDown() {
         CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
index 1608e0d4..af48995 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/system/StatusBarColorControllerTest.java
@@ -11,7 +11,6 @@
 
 import androidx.annotation.ColorInt;
 
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -26,13 +25,13 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.ThemeTestUtils;
 import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -44,8 +43,11 @@
  * There are additional status bar color tests in {@link BrandColorTest}.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+// clang-format off
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID})
 public class StatusBarColorControllerTest {
+    // clang-format on
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
@@ -53,17 +55,11 @@
 
     @Before
     public void setUp() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true);
         mActivityTestRule.startMainActivityOnBlankPage();
         mScrimColor = ApiCompatibilityUtils.getColor(mActivityTestRule.getActivity().getResources(),
                 org.chromium.chrome.R.color.black_alpha_65);
     }
 
-    @After
-    public void tearDown() {
-        CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, null);
-    }
-
     /**
      * Test that the status bar color is toggled when toggling incognito while in overview mode.
      */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java
new file mode 100644
index 0000000..0af375d
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenCurrentPageVerifierTest.java
@@ -0,0 +1,100 @@
+// Copyright 2020 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.webapps;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Intent;
+import android.net.Uri;
+import android.support.test.filters.LargeTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.CommandLine;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier.VerificationStatus;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.test.MockCertVerifierRuleAndroid;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.content_public.browser.test.NativeLibraryTestRule;
+import org.chromium.content_public.common.ContentSwitches;
+
+/**
+ * Tests the {@link CurrentPageVerifier} integration with PWAs added to the homescreen.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public final class AddToHomescreenCurrentPageVerifierTest {
+    public final WebappActivityTestRule mActivityTestRule = new WebappActivityTestRule();
+
+    public final NativeLibraryTestRule mNativeLibraryTestRule = new NativeLibraryTestRule();
+
+    public MockCertVerifierRuleAndroid mCertVerifierRule =
+            new MockCertVerifierRuleAndroid(mNativeLibraryTestRule, 0 /* net::OK */);
+
+    @Rule
+    public RuleChain mRuleChain = RuleChain.emptyRuleChain()
+                                          .around(mActivityTestRule)
+                                          .around(mNativeLibraryTestRule)
+                                          .around(mCertVerifierRule);
+
+    @Before
+    public void setUp() {
+        mActivityTestRule.getEmbeddedTestServerRule().setServerUsesHttps(true);
+        Uri mapToUri =
+                Uri.parse(mActivityTestRule.getEmbeddedTestServerRule().getServer().getURL("/"));
+        CommandLine.getInstance().appendSwitchWithValue(
+                ContentSwitches.HOST_RESOLVER_RULES, "MAP * " + mapToUri.getAuthority());
+    }
+
+    private void launchWebapp(String url) {
+        Intent launchIntent = mActivityTestRule.createIntent();
+        launchIntent.putExtra(ShortcutHelper.EXTRA_URL, url);
+        mActivityTestRule.startWebappActivity(launchIntent);
+    }
+
+    private @VerificationStatus int getCurrentPageVerifierStatus() {
+        WebappActivity webappActivity = mActivityTestRule.getActivity();
+        return webappActivity.getComponent().resolveCurrentPageVerifier().getState().status;
+    }
+
+    /**
+     * Tests that {@link CurrentPageVerifier} verification succeeds if the webapp navigates to a
+     * page within the webapp origin.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Webapps"})
+    public void testInScope() {
+        String page = "https://foo.com/chrome/test/data/android/customtabs/cct_header.html";
+        String otherPageInScope = "https://foo.com/chrome/test/data/android/simple.html";
+        launchWebapp(page);
+
+        mActivityTestRule.loadUrl(otherPageInScope);
+        assertEquals(VerificationStatus.SUCCESS, getCurrentPageVerifierStatus());
+    }
+
+    /**
+     * Tests that {@link CurrentPageVerifier} verification fails if the webapp navigates to a
+     * page with a different origin than the webapp.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Webapps"})
+    public void testDifferentOrigin() {
+        String page = "https://foo.com/chrome/test/data/android/simple.html";
+        String pageDifferentOrigin = "https://bar.com/chrome/test/data/android/simple.html";
+        launchWebapp(page);
+
+        mActivityTestRule.loadUrl(pageDifferentOrigin, 10 /* secondsToWait */);
+        assertEquals(VerificationStatus.FAILURE, getCurrentPageVerifierStatus());
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkCurrentPageVerifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkCurrentPageVerifierTest.java
new file mode 100644
index 0000000..25dde42c
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkCurrentPageVerifierTest.java
@@ -0,0 +1,87 @@
+// Copyright 2020 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.webapps;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.LargeTest;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.browserservices.trustedwebactivityui.controller.CurrentPageVerifier.VerificationStatus;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.webapps.WebApkInfoBuilder;
+import org.chromium.net.test.EmbeddedTestServer;
+
+/**
+ * Tests the {@link CurrentPageVerifier} integration with {@link WebApkActivity}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public final class WebApkCurrentPageVerifierTest {
+    @Rule
+    public final WebApkActivityTestRule mActivityTestRule = new WebApkActivityTestRule();
+
+    private EmbeddedTestServer mTestServer;
+
+    @Before
+    public void setUp() {
+        mTestServer = mActivityTestRule.getTestServer();
+    }
+
+    private WebApkActivity launchWebApk(String url) {
+        WebApkInfo webApkInfo = new WebApkInfoBuilder("org.chromium.webapk.random", url).build();
+        return mActivityTestRule.startWebApkActivity(webApkInfo);
+    }
+
+    private @VerificationStatus int getCurrentPageVerifierStatus() {
+        WebappActivity webappActivity = mActivityTestRule.getActivity();
+        return webappActivity.getComponent().resolveCurrentPageVerifier().getState().status;
+    }
+
+    /**
+     * Tests that {@link CurrentPageVerifier} verification succeeds if the page is within the
+     * WebAPK scope.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Webapps"})
+    public void testInScope() {
+        String page = mTestServer.getURL("/chrome/test/data/android/customtabs/cct_header.html");
+        String otherPageInScope =
+                mTestServer.getURL("/chrome/test/data/android/customtabs/cct_header_frame.html");
+        String expectedScope = mTestServer.getURL("/chrome/test/data/android/customtabs/");
+        WebappActivity webappActivity = launchWebApk(page);
+        assertEquals(expectedScope, webappActivity.getWebappInfo().scopeUrl());
+
+        mActivityTestRule.loadUrl(otherPageInScope);
+        assertEquals(VerificationStatus.SUCCESS, getCurrentPageVerifierStatus());
+    }
+
+    /**
+     * Tests that {@link CurrentPageVerifier} verification fails if the WebAPK navigates to a page
+     * which is outside the WebAPK scope.
+     */
+    @Test
+    @LargeTest
+    @Feature({"Webapps"})
+    public void testOutsideScopeSameOrigin() {
+        String page = mTestServer.getURL("/chrome/test/data/android/customtabs/cct_header.html");
+        String pageOutsideScopeSameOrigin =
+                mTestServer.getURL("/chrome/test/data/android/simple.html");
+        String expectedScope = mTestServer.getURL("/chrome/test/data/android/customtabs/");
+        WebappActivity webappActivity = launchWebApk(page);
+        assertEquals(expectedScope, webappActivity.getWebappInfo().scopeUrl());
+
+        mActivityTestRule.loadUrl(pageOutsideScopeSameOrigin);
+        assertEquals(VerificationStatus.FAILURE, getCurrentPageVerifierStatus());
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java
index 29e3704..044685ff 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkInitializationTest.java
@@ -14,6 +14,7 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.dependency_injection.ChromeActivityCommonsModule;
@@ -118,5 +119,9 @@
                 WebappDisclosureSnackbarController.class.getName()));
         assertTrue(registeredObserverClassNames.contains(
                 WebApkActivityLifecycleUmaTracker.class.getName()));
+
+        // Test that WebappActiveTabUmaTracker is hooked up.
+        assertTrue(0 < RecordHistogram.getHistogramTotalCountForTesting(
+                           WebappActiveTabUmaTracker.HISTOGRAM_NAVIGATION_STATUS));
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
index 5a51bf3..65c5318 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
@@ -84,7 +84,7 @@
             String title = mActivityTestRule.getActivity().getActivityTab().getTitle();
 
             // Wait until the title indicates either success or failure.
-            if (!title.startsWith("Success") && !title.startsWith("Fail:")) return;
+            if (!title.startsWith("Success") && !title.startsWith("Fail")) return;
             mStatus = title;
             mCallbackHelper.notifyCalled();
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java
new file mode 100644
index 0000000..a406dd5
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2ApiTestHelper.java
@@ -0,0 +1,445 @@
+// Copyright 2018 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.webauth;
+
+import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
+
+import android.content.Intent;
+import android.os.SystemClock;
+import android.util.Base64;
+
+import androidx.annotation.Nullable;
+
+import com.google.android.gms.fido.Fido;
+import com.google.android.gms.fido.fido2.api.common.ErrorCode;
+import com.google.common.io.BaseEncoding;
+
+import org.junit.Assert;
+
+import org.chromium.blink.mojom.AuthenticatorAttachment;
+import org.chromium.blink.mojom.AuthenticatorSelectionCriteria;
+import org.chromium.blink.mojom.GetAssertionAuthenticatorResponse;
+import org.chromium.blink.mojom.MakeCredentialAuthenticatorResponse;
+import org.chromium.blink.mojom.PublicKeyCredentialCreationOptions;
+import org.chromium.blink.mojom.PublicKeyCredentialDescriptor;
+import org.chromium.blink.mojom.PublicKeyCredentialParameters;
+import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
+import org.chromium.blink.mojom.PublicKeyCredentialRpEntity;
+import org.chromium.blink.mojom.PublicKeyCredentialType;
+import org.chromium.blink.mojom.PublicKeyCredentialUserEntity;
+import org.chromium.blink.mojom.UvmEntry;
+import org.chromium.mojo_base.mojom.TimeDelta;
+import org.chromium.url.mojom.Url;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * A Helper class for testing Fido2ApiHandlerInternal.
+ */
+public class Fido2ApiTestHelper {
+    // Test data.
+    private static final String FILLER_ERROR_MSG = "Error Error";
+
+    /**
+     * This byte array is produced by
+     * com.google.android.gms.fido.fido2.api.common.AuthenticatorAttestationResponse with test data,
+     * i.e.:
+     * AuthenticatorAttestationResponse response =
+     *         new AuthenticatorAttestationResponse.Builder()
+     *                 .setAttestationObject(TEST_ATTESTATION_OBJECT)
+     *                 .setClientDataJSON(TEST_CLIENT_DATA_JSON)
+     *                 .setKeyHandle(TEST_KEY_HANDLE)
+     *                 .build().serializeToBytes();
+     */
+    private static final byte[] TEST_AUTHENTICATOR_ATTESTATION_RESPONSE = new byte[] {69, 79, -1,
+            -1, 76, 0, 0, 0, 2, 0, -1, -1, 36, 0, 0, 0, 32, 0, 0, 0, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6,
+            7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 9, 3, 0, -1, -1, 8, 0, 0,
+            0, 3, 0, 0, 0, 4, 5, 6, 0, 4, 0, -1, -1, 8, 0, 0, 0, 3, 0, 0, 0, 1, 2, 3, 0};
+
+    /**
+     * This byte array is produced by
+     * com.google.android.gms.fido.fido2.api.common.AuthenticatorAssertionResponse with test data,
+     * i.e.:
+     * AuthenticatorAssertionResponse.Builder()
+     *         .setAuthenticatorData(TEST_AUTHENTICATOR_DATA)
+     *         .setSignature(TEST_SIGNATURE)
+     *         .setClientDataJSON(TEST_CLIENT_DATA_JSON)
+     *         .setKeyHandle(TEST_KEY_HANDLE)
+     *         .build().serializeToBytes();
+     */
+    private static final byte[] TEST_AUTHENTICATOR_ASSERTION_RESPONSE = new byte[] {69, 79, -1, -1,
+            92, 0, 0, 0, 2, 0, -1, -1, 36, 0, 0, 0, 32, 0, 0, 0, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8,
+            5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 9, 3, 0, -1, -1, 8, 0, 0, 0, 3,
+            0, 0, 0, 4, 5, 6, 0, 4, 0, -1, -1, 8, 0, 0, 0, 3, 0, 0, 0, 7, 8, 9, 0, 5, 0, -1, -1, 8,
+            0, 0, 0, 3, 0, 0, 0, 10, 11, 12, 0};
+
+    /**
+     * This byte array is produced by
+     * com.google.android.gms.fido.fido2.api.common.PublicKeyCredential with test data,
+     * i.e.:
+     * AuthenticatorAssertionResponse response =
+     *         new AuthenticatorAssertionResponse.Builder()
+     *                 .setAuthenticatorData(TEST_AUTHENTICATOR_DATA)
+     *                 .setSignature(TEST_SIGNATURE)
+     *                 .setClientDataJSON(TEST_CLIENT_DATA_JSON)
+     *                 .setKeyHandle(TEST_KEY_HANDLE)
+     *                 .build();
+     * UvmEntry uvmEntry0 =
+     *         new UvmEntry.Builder()
+     *                 .setUserVerificationMethod(TEST_USER_VERIFICATION_METHOD[0])
+     *                 .setKeyProtectionType(TEST_KEY_PROTECTION_TYPE[0])
+     *                 .setMatcherProtectionType(TEST_MATCHER_PROTECTION_TYPE[0])
+     *                 .build();
+     * UvmEntry uvmEntry1 =
+     *         new UvmEntry.Builder()
+     *                 .setUserVerificationMethod(TEST_USER_VERIFICATION_METHOD[1])
+     *                 .setKeyProtectionType(TEST_KEY_PROTECTION_TYPE[1])
+     *                 .setMatcherProtectionType(TEST_MATCHER_PROTECTION_TYPE[1])
+     *                 .build();
+     * UvmEntries uvmEntries =
+     *         new UvmEntries.Builder().addUvmEntry(uvmEntry0).addUvmEntry(uvmEntry1).build();
+     * AuthenticationExtensionsClientOutputs
+     *         authenticationExtensionsClientOutputs =
+     *                 new AuthenticationExtensionsClientOutputs.Builder()
+     *                         .setUserVerificationMethodEntries(uvmEntries)
+     *                         .build();
+     * PublicKeyCredential publicKeyCredential =
+     *         new PublicKeyCredential.Builder()
+     *                 .setResponse(response)
+     *                 .setAuthenticationExtensionsClientOutputs(
+     *                         authenticationExtensionsClientOutputs)
+     *                 .build().serializeToBytes();
+     */
+    private static final byte[] TEST_ASSERTION_PUBLIC_KEY_CREDENTIAL_WITH_UVM = new byte[] {69, 79,
+            -1, -1, 4, 1, 0, 0, 2, 0, -1, -1, 28, 0, 0, 0, 10, 0, 0, 0, 112, 0, 117, 0, 98, 0, 108,
+            0, 105, 0, 99, 0, 45, 0, 107, 0, 101, 0, 121, 0, 0, 0, 0, 0, 5, 0, -1, -1, 100, 0, 0, 0,
+            69, 79, -1, -1, 92, 0, 0, 0, 2, 0, -1, -1, 36, 0, 0, 0, 32, 0, 0, 0, 5, 6, 7, 8, 5, 6,
+            7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 9, 3, 0, -1,
+            -1, 8, 0, 0, 0, 3, 0, 0, 0, 4, 5, 6, 0, 4, 0, -1, -1, 8, 0, 0, 0, 3, 0, 0, 0, 7, 8, 9,
+            0, 5, 0, -1, -1, 8, 0, 0, 0, 3, 0, 0, 0, 10, 11, 12, 0, 7, 0, -1, -1, 108, 0, 0, 0, 69,
+            79, -1, -1, 100, 0, 0, 0, 1, 0, -1, -1, 92, 0, 0, 0, 69, 79, -1, -1, 84, 0, 0, 0, 1, 0,
+            -1, -1, 76, 0, 0, 0, 2, 0, 0, 0, 32, 0, 0, 0, 69, 79, -1, -1, 24, 0, 0, 0, 1, 0, 4, 0,
+            2, 0, 0, 0, 2, 0, 4, 0, 2, 0, 0, 0, 3, 0, 4, 0, 4, 0, 0, 0, 32, 0, 0, 0, 69, 79, -1, -1,
+            24, 0, 0, 0, 1, 0, 4, 0, 0, 2, 0, 0, 2, 0, 4, 0, 1, 0, 0, 0, 3, 0, 4, 0, 1, 0, 0, 0};
+
+    /**
+     * The following byte arrays are produced by
+     * com.google.android.gms.fido.fido2.api.common.AuthenticatorErrorResponse with
+     * com.google.android.gms.fido.fido2.api.common.ErrorCode and error message;
+     * i.e.:
+     * AuthenticatorErrorResponse.Builder()
+     *                           .setErrorCode(errorCode)
+     *                           .setErrorMessage(errorMsg)
+     *                           .build().serializeToBytes();
+     */
+    private static final byte[] TEST_ERROR_WITH_FILLER_ERROR_MSG_RESPONSE_FRONT =
+            new byte[] {69, 79, -1, -1, 44, 0, 0, 0, 2, 0, 4, 0};
+    private static final byte[] TEST_ERROR_WITH_FILLER_ERROR_MSG_RESPONSE_TAIL =
+            new byte[] {0, 0, 0, 3, 0, -1, -1, 28, 0, 0, 0, 11, 0, 0, 0, 69, 0, 114, 0, 114, 0, 111,
+                    0, 114, 0, 32, 0, 69, 0, 114, 0, 114, 0, 111, 0, 114, 0, 0, 0};
+    private static final byte[] TEST_ERROR_WITH_NULL_ERROR_MSG_RESPONSE_FRONT = {
+            69, 79, -1, -1, 8, 0, 0, 0, 2, 0, 4, 0};
+    private static final byte[] TEST_ERROR_WITH_NULL_ERROR_MSG_RESPONSE_TAIL = {0, 0, 0};
+    private static final byte[] TEST_CONSTRAINTERROR_NOSCREENLOCK_RESPONSE =
+            new byte[] {69, 79, -1, -1, 116, 0, 0, 0, 2, 0, 4, 0, 29, 0, 0, 0, 3, 0, -1, -1, 100, 0,
+                    0, 0, 46, 0, 0, 0, 84, 0, 104, 0, 101, 0, 32, 0, 100, 0, 101, 0, 118, 0, 105, 0,
+                    99, 0, 101, 0, 32, 0, 105, 0, 115, 0, 32, 0, 110, 0, 111, 0, 116, 0, 32, 0, 115,
+                    0, 101, 0, 99, 0, 117, 0, 114, 0, 101, 0, 100, 0, 32, 0, 119, 0, 105, 0, 116, 0,
+                    104, 0, 32, 0, 97, 0, 110, 0, 121, 0, 32, 0, 115, 0, 99, 0, 114, 0, 101, 0, 101,
+                    0, 110, 0, 32, 0, 108, 0, 111, 0, 99, 0, 107, 0, 0, 0, 0, 0};
+    private static final byte[] TEST_EMPTYALLOWCRED_RESPONSE1 = new byte[] {69, 79, -1, -1, -128, 0,
+            0, 0, 2, 0, 4, 0, 35, 0, 0, 0, 3, 0, -1, -1, 112, 0, 0, 0, 52, 0, 0, 0, 65, 0, 117, 0,
+            116, 0, 104, 0, 101, 0, 110, 0, 116, 0, 105, 0, 99, 0, 97, 0, 116, 0, 105, 0, 111, 0,
+            110, 0, 32, 0, 114, 0, 101, 0, 113, 0, 117, 0, 101, 0, 115, 0, 116, 0, 32, 0, 109, 0,
+            117, 0, 115, 0, 116, 0, 32, 0, 104, 0, 97, 0, 118, 0, 101, 0, 32, 0, 110, 0, 111, 0,
+            110, 0, 45, 0, 101, 0, 109, 0, 112, 0, 116, 0, 121, 0, 32, 0, 97, 0, 108, 0, 108, 0,
+            111, 0, 119, 0, 76, 0, 105, 0, 115, 0, 116, 0, 0, 0, 0, 0};
+    private static final byte[] TEST_EMPTYALLOWCRED_RESPONSE2 = new byte[] {69, 79, -1, -1, -120, 0,
+            0, 0, 2, 0, 4, 0, 35, 0, 0, 0, 3, 0, -1, -1, 120, 0, 0, 0, 57, 0, 0, 0, 82, 0, 101, 0,
+            113, 0, 117, 0, 101, 0, 115, 0, 116, 0, 32, 0, 100, 0, 111, 0, 101, 0, 115, 0, 110, 0,
+            39, 0, 116, 0, 32, 0, 104, 0, 97, 0, 118, 0, 101, 0, 32, 0, 97, 0, 32, 0, 118, 0, 97, 0,
+            108, 0, 105, 0, 100, 0, 32, 0, 108, 0, 105, 0, 115, 0, 116, 0, 32, 0, 111, 0, 102, 0,
+            32, 0, 97, 0, 108, 0, 108, 0, 111, 0, 119, 0, 101, 0, 100, 0, 32, 0, 99, 0, 114, 0, 101,
+            0, 100, 0, 101, 0, 110, 0, 116, 0, 105, 0, 97, 0, 108, 0, 115, 0, 46, 0, 0, 0};
+    private static final byte[] TEST_INVALIDSTATEERROR_DUPLICATE_REGISTRATION_RESPONSE =
+            new byte[] {69, 79, -1, -1, -116, 0, 0, 0, 2, 0, 4, 0, 11, 0, 0, 0, 3, 0, -1, -1, 124,
+                    0, 0, 0, 58, 0, 0, 0, 79, 0, 110, 0, 101, 0, 32, 0, 111, 0, 102, 0, 32, 0, 116,
+                    0, 104, 0, 101, 0, 32, 0, 101, 0, 120, 0, 99, 0, 108, 0, 117, 0, 100, 0, 101, 0,
+                    100, 0, 32, 0, 99, 0, 114, 0, 101, 0, 100, 0, 101, 0, 110, 0, 116, 0, 105, 0,
+                    97, 0, 108, 0, 115, 0, 32, 0, 101, 0, 120, 0, 105, 0, 115, 0, 116, 0, 115, 0,
+                    32, 0, 111, 0, 110, 0, 32, 0, 116, 0, 104, 0, 101, 0, 32, 0, 108, 0, 111, 0, 99,
+                    0, 97, 0, 108, 0, 32, 0, 100, 0, 101, 0, 118, 0, 105, 0, 99, 0, 101, 0, 0, 0, 0,
+                    0};
+    private static final byte[] TEST_UNKNOWNERROR_CRED_NOT_RECOGNIZED_RESPONSE =
+            new byte[] {69, 79, -1, -1, 68, 0, 0, 0, 2, 0, 4, 0, 28, 0, 0, 0, 3, 0, -1, -1, 52, 0,
+                    0, 0, 22, 0, 0, 0, 76, 0, 111, 0, 119, 0, 32, 0, 108, 0, 101, 0, 118, 0, 101, 0,
+                    108, 0, 32, 0, 101, 0, 114, 0, 114, 0, 111, 0, 114, 0, 32, 0, 48, 0, 120, 0, 54,
+                    0, 97, 0, 56, 0, 48, 0, 0, 0, 0, 0};
+
+    private static final byte[] TEST_KEY_HANDLE = BaseEncoding.base16().decode(
+            "0506070805060708050607080506070805060708050607080506070805060709");
+    private static final String TEST_ENCODED_KEY_HANDLE = Base64.encodeToString(
+            TEST_KEY_HANDLE, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP);
+    private static final byte[] TEST_ATTESTATION_OBJECT = new byte[] {1, 2, 3};
+    private static final byte[] TEST_CLIENT_DATA_JSON = new byte[] {4, 5, 6};
+    private static final byte[] TEST_AUTHENTICATOR_DATA = new byte[] {7, 8, 9};
+    private static final byte[] TEST_SIGNATURE = new byte[] {10, 11, 12};
+    private static final long TIMEOUT_SAFETY_MARGIN_MS = scaleTimeout(TimeUnit.SECONDS.toMillis(1));
+    private static final long TIMEOUT_MS = scaleTimeout(TimeUnit.SECONDS.toMillis(1));
+    private static final String FIDO2_KEY_CREDENTIAL_EXTRA = "FIDO2_CREDENTIAL_EXTRA";
+    private static final int[] TEST_USER_VERIFICATION_METHOD = new int[] {0x00000002, 0x00000200};
+    private static final short[] TEST_KEY_PROTECTION_TYPE = new short[] {0x0002, 0x0001};
+    private static final short[] TEST_MATCHER_PROTECTION_TYPE = new short[] {0x0004, 0x0001};
+    private static Url createUrl(String s) {
+        Url url = new Url();
+        url.url = s;
+        return url;
+    }
+
+    /**
+     * Builds a test intent to be returned by a successful call to makeCredential.
+     * @return Intent containing the response from the Fido2 API.
+     */
+    public static Intent createSuccessfulMakeCredentialIntent() {
+        Intent intent = new Intent();
+        intent.putExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA, TEST_AUTHENTICATOR_ATTESTATION_RESPONSE);
+        return intent;
+    }
+
+    /**
+     * Construct default options for a makeCredential request.
+     * @return Options for the Fido2 API.
+     * @throws Exception
+     */
+    public static PublicKeyCredentialCreationOptions createDefaultMakeCredentialOptions()
+            throws Exception {
+        PublicKeyCredentialCreationOptions options = new PublicKeyCredentialCreationOptions();
+        options.challenge = "climb a mountain".getBytes("UTF8");
+
+        options.relyingParty = new PublicKeyCredentialRpEntity();
+        options.relyingParty.id = "subdomain.example.test";
+        options.relyingParty.name = "Acme";
+        options.relyingParty.icon = createUrl("https://icon.example.test");
+
+        options.user = new PublicKeyCredentialUserEntity();
+        options.user.id = "1098237235409872".getBytes("UTF8");
+        options.user.name = "avery.a.jones@example.com";
+        options.user.displayName = "Avery A. Jones";
+        options.user.icon = createUrl("https://usericon.example.test");
+
+        options.adjustedTimeout = new TimeDelta();
+        options.adjustedTimeout.microseconds = TimeUnit.MILLISECONDS.toMicros(TIMEOUT_MS);
+
+        PublicKeyCredentialParameters parameters = new PublicKeyCredentialParameters();
+        parameters.algorithmIdentifier = -7;
+        parameters.type = PublicKeyCredentialType.PUBLIC_KEY;
+        options.publicKeyParameters = new PublicKeyCredentialParameters[] {parameters};
+
+        PublicKeyCredentialDescriptor descriptor = new PublicKeyCredentialDescriptor();
+        descriptor.type = 0;
+        descriptor.id = new byte[] {8, 7, 6};
+        descriptor.transports = new int[] {0};
+        options.excludeCredentials = new PublicKeyCredentialDescriptor[] {descriptor};
+
+        options.authenticatorSelection = new AuthenticatorSelectionCriteria();
+        /* TODO add back UserVerificationRequirement when the FIDO2 API supports it */
+        options.authenticatorSelection.requireResidentKey = false;
+        options.authenticatorSelection.authenticatorAttachment =
+                AuthenticatorAttachment.CROSS_PLATFORM;
+        return options;
+    }
+
+    /**
+     * Verifies that the returned response matches expected values.
+     * @param response The response from the Fido2 API.
+     */
+    public static void validateMakeCredentialResponse(
+            MakeCredentialAuthenticatorResponse response) {
+        Assert.assertArrayEquals(response.attestationObject, TEST_ATTESTATION_OBJECT);
+        Assert.assertArrayEquals(response.info.rawId, TEST_KEY_HANDLE);
+        Assert.assertEquals(response.info.id, TEST_ENCODED_KEY_HANDLE);
+        Assert.assertArrayEquals(response.info.clientDataJson, TEST_CLIENT_DATA_JSON);
+    }
+
+    /**
+     * Constructs default options for a getAssertion request.
+     * @return Options for the Fido2 API
+     * @throws Exception
+     */
+    public static PublicKeyCredentialRequestOptions createDefaultGetAssertionOptions()
+            throws Exception {
+        PublicKeyCredentialRequestOptions options = new PublicKeyCredentialRequestOptions();
+        options.challenge = "climb a mountain".getBytes("UTF8");
+        options.adjustedTimeout = new TimeDelta();
+        options.adjustedTimeout.microseconds = TimeUnit.MILLISECONDS.toMicros(TIMEOUT_MS);
+        options.relyingPartyId = "subdomain.example.test";
+
+        PublicKeyCredentialDescriptor descriptor = new PublicKeyCredentialDescriptor();
+        descriptor.type = 0;
+        descriptor.id = new byte[] {8, 7, 6};
+        descriptor.transports = new int[] {0};
+        options.allowCredentials = new PublicKeyCredentialDescriptor[] {descriptor};
+        return options;
+    }
+
+    /**
+     * Builds a test intent without uvm extension to be returned by a successful call to
+     * makeCredential.
+     * @return Intent containing the response from the Fido2 API.
+     */
+    public static Intent createSuccessfulGetAssertionIntent() {
+        Intent intent = new Intent();
+        intent.putExtra(Fido.FIDO2_KEY_RESPONSE_EXTRA, TEST_AUTHENTICATOR_ASSERTION_RESPONSE);
+        return intent;
+    }
+
+    /**
+     * Builds a test intent with uvm extension to be returned by a successful call to
+     * makeCredential.
+     * @return Intent containing the response from the Fido2 API.
+     */
+    public static Intent createSuccessfulGetAssertionIntentWithUvm() {
+        Intent intent = new Intent();
+        intent.putExtra(FIDO2_KEY_CREDENTIAL_EXTRA, TEST_ASSERTION_PUBLIC_KEY_CREDENTIAL_WITH_UVM);
+        return intent;
+    }
+
+    /**
+     * Verifies that the returned userVerificationMethod matches expected values.
+     * @param userVerificationMethods The userVerificationMethods from the Fido2 API.
+     */
+    public static void validateUserVerificationMethods(
+            boolean echoUserVerificationMethods, UvmEntry[] userVerificationMethods) {
+        if (echoUserVerificationMethods) {
+            Assert.assertEquals(
+                    userVerificationMethods.length, TEST_USER_VERIFICATION_METHOD.length);
+            for (int i = 0; i < userVerificationMethods.length; i++) {
+                Assert.assertEquals(userVerificationMethods[i].userVerificationMethod,
+                        TEST_USER_VERIFICATION_METHOD[i]);
+                Assert.assertEquals(
+                        userVerificationMethods[i].keyProtectionType, TEST_KEY_PROTECTION_TYPE[i]);
+                Assert.assertEquals(userVerificationMethods[i].matcherProtectionType,
+                        TEST_MATCHER_PROTECTION_TYPE[i]);
+            }
+        }
+    }
+
+    /**
+     * Verifies that the returned response matches expected values.
+     * @param response The response from the Fido2 API.
+     */
+    public static void validateGetAssertionResponse(GetAssertionAuthenticatorResponse response) {
+        Assert.assertArrayEquals(response.authenticatorData, TEST_AUTHENTICATOR_DATA);
+        Assert.assertArrayEquals(response.signature, TEST_SIGNATURE);
+        Assert.assertArrayEquals(response.info.rawId, TEST_KEY_HANDLE);
+        Assert.assertEquals(response.info.id, TEST_ENCODED_KEY_HANDLE);
+        Assert.assertArrayEquals(response.info.clientDataJson, TEST_CLIENT_DATA_JSON);
+        validateUserVerificationMethods(
+                response.echoUserVerificationMethods, response.userVerificationMethods);
+    }
+
+    /**
+     * Verifies that the response did not return before timeout.
+     * @param startTimeMs The start time of the operation.
+     */
+    public static void verifyRespondedBeforeTimeout(long startTimeMs) {
+        long elapsedTime = SystemClock.elapsedRealtime() - startTimeMs;
+        Assert.assertTrue(elapsedTime < TIMEOUT_MS);
+    }
+
+    /**
+     * Generates error response byte array with error message that only differs by a single
+     * errorCode byte.
+     * @return Error response byte array.
+     */
+    private static byte[] generateErrorResponseBytesWithErrorMessage(Integer errorCode) {
+        byte errorByte = errorCode.byteValue();
+        ByteArrayOutputStream error_response_output = new ByteArrayOutputStream();
+        try {
+            error_response_output.write(TEST_ERROR_WITH_FILLER_ERROR_MSG_RESPONSE_FRONT);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            error_response_output.write(new byte[] {errorByte});
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            error_response_output.write(TEST_ERROR_WITH_FILLER_ERROR_MSG_RESPONSE_TAIL);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return error_response_output.toByteArray();
+    }
+
+    /**
+     * Generates error response byte array without error message that only differs by a single
+     * errorCode byte.
+     * @return Error response byte array.
+     */
+    private static byte[] generateErrorResponseBytesWithoutErrorMessage(Integer errorCode) {
+        byte errorByte = errorCode.byteValue();
+        ByteArrayOutputStream error_response_output = new ByteArrayOutputStream();
+        try {
+            error_response_output.write(TEST_ERROR_WITH_NULL_ERROR_MSG_RESPONSE_FRONT);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            error_response_output.write(new byte[] {errorByte});
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        try {
+            error_response_output.write(TEST_ERROR_WITH_NULL_ERROR_MSG_RESPONSE_TAIL);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return error_response_output.toByteArray();
+    }
+
+    /**
+     * Constructs corresponding error response byte array based on errorCode and errorMsg.
+     * @return Error response byte array.
+     */
+    private static byte[] constructErrorResponseBytes(
+            ErrorCode errorCode, @Nullable String errorMsg) {
+        if (errorMsg == null) {
+            return generateErrorResponseBytesWithoutErrorMessage(errorCode.getCode());
+        }
+        if (FILLER_ERROR_MSG.equals(errorMsg)) {
+            return generateErrorResponseBytesWithErrorMessage(errorCode.getCode());
+        }
+        switch (errorMsg) {
+            case "The device is not secured with any screen lock":
+                return TEST_CONSTRAINTERROR_NOSCREENLOCK_RESPONSE;
+            case "One of the excluded credentials exists on the local device":
+                return TEST_INVALIDSTATEERROR_DUPLICATE_REGISTRATION_RESPONSE;
+            case "Authentication request must have non-empty allowList":
+                return TEST_EMPTYALLOWCRED_RESPONSE1;
+            case "Request doesn't have a valid list of allowed credentials.":
+                return TEST_EMPTYALLOWCRED_RESPONSE2;
+            case "Low level error 0x6a80":
+                return TEST_UNKNOWNERROR_CRED_NOT_RECOGNIZED_RESPONSE;
+            default:
+                return new byte[] {};
+        }
+    }
+
+    /**
+     * Constructs an intent that returns an error response from the Fido2 API.
+     * @param errorCode Numeric values corresponding to a Fido2 error.
+     * @return an Intent containing the error response.
+     */
+    public static Intent createErrorIntent(ErrorCode errorCode, @Nullable String errorMsg) {
+        Intent intent = new Intent();
+        intent.putExtra(
+                Fido.FIDO2_KEY_ERROR_EXTRA, constructErrorResponseBytes(errorCode, errorMsg));
+        return intent;
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
new file mode 100644
index 0000000..721e4a0
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
@@ -0,0 +1,847 @@
+// Copyright 2018 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.webauth;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.ConditionVariable;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+
+import com.google.android.gms.fido.fido2.api.common.ErrorCode;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.PackageUtils;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
+import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
+import org.chromium.base.test.params.ParameterProvider;
+import org.chromium.base.test.params.ParameterSet;
+import org.chromium.base.test.params.ParameterizedRunner;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.blink.mojom.AuthenticatorStatus;
+import org.chromium.blink.mojom.GetAssertionAuthenticatorResponse;
+import org.chromium.blink.mojom.MakeCredentialAuthenticatorResponse;
+import org.chromium.blink.mojom.PublicKeyCredentialCreationOptions;
+import org.chromium.blink.mojom.PublicKeyCredentialParameters;
+import org.chromium.blink.mojom.PublicKeyCredentialRequestOptions;
+import org.chromium.blink.mojom.PublicKeyCredentialType;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
+import org.chromium.content_public.browser.test.mock.MockRenderFrameHost;
+import org.chromium.content_public.browser.test.mock.MockWebContents;
+import org.chromium.content_public.common.ContentSwitches;
+import org.chromium.net.test.EmbeddedTestServer;
+import org.chromium.net.test.ServerCertificate;
+import org.chromium.ui.base.ActivityWindowAndroid;
+import org.chromium.ui.base.WindowAndroid;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Unit tests for {@link Fido2CredentialRequestTest}.
+ */
+
+@RunWith(ParameterizedRunner.class)
+@UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1",
+        "enable-experimental-web-platform-features", "enable-features=WebAuthentication",
+        "ignore-certificate-errors"})
+public class Fido2CredentialRequestTest {
+    @Rule
+    public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
+            new ChromeActivityTestRule<>(ChromeActivity.class);
+
+    private MockActivityWindowAndroid mWindowAndroid;
+    private EmbeddedTestServer mTestServer;
+    private String mUrl;
+    private MockAuthenticatorRenderFrameHost mFrameHost;
+    private Fido2CredentialRequest mRequest;
+    private PublicKeyCredentialCreationOptions mCreationOptions;
+    private PublicKeyCredentialRequestOptions mRequestOptions;
+    private static final String GOOGLE_PLAY_SERVICES_PACKAGE = "com.google.android.gms";
+    private static final String FILLER_ERROR_MSG = "Error Error";
+    private AuthenticatorCallback mCallback;
+    private long mStartTimeMs;
+
+    /**
+     * This class constructs the parameters array that is used for testMakeCredential_with_param and
+     * testGetAssertion_with_param as input parameters.
+     */
+    public static class ErrorTestParams implements ParameterProvider {
+        private static List<ParameterSet> sErrorTestParams = Arrays.asList(
+                new ParameterSet()
+                        .value("SECURITY_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.INVALID_DOMAIN))
+                        .name("securityError"),
+                new ParameterSet()
+                        .value("TIMEOUT_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.NOT_ALLOWED_ERROR))
+                        .name("timeoutError"),
+                new ParameterSet()
+                        .value("ENCODING_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR))
+                        .name("encodingError"),
+                new ParameterSet()
+                        .value("NOT_ALLOWED_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.NOT_ALLOWED_ERROR))
+                        .name("notAllowedError"),
+                new ParameterSet()
+                        .value("DATA_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.ANDROID_NOT_SUPPORTED_ERROR))
+                        .name("dataError"),
+                new ParameterSet()
+                        .value("NOT_SUPPORTED_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.ANDROID_NOT_SUPPORTED_ERROR))
+                        .name("notSupportedError"),
+                new ParameterSet()
+                        .value("CONSTRAINT_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.CREDENTIAL_EXCLUDED))
+                        .name("constraintErrorReRegistration"),
+                new ParameterSet()
+                        .value("INVALID_STATE_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR))
+                        .name("invalidStateError"),
+                new ParameterSet()
+                        .value("UNKNOWN_ERR", FILLER_ERROR_MSG,
+                                Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR))
+                        .name("unknownError"));
+        @Override
+        public List<ParameterSet> getParameters() {
+            return sErrorTestParams;
+        }
+    }
+
+    /**
+     * Mock class for tests.
+     */
+    private class MockActivityWindowAndroid extends ActivityWindowAndroid {
+        private int mResultCode = Activity.RESULT_OK;
+        private boolean mCancelableIntentSuccess = true;
+        private Intent mResponseIntent;
+
+        /**
+         * Constructor.
+         * @param activity The app activity.
+         */
+        public MockActivityWindowAndroid(ChromeActivity activity) {
+            super(activity);
+        }
+
+        /**
+         * Mocks sending the intent to GmsCore.
+         * @param intent Fido2PendingIntent provided by the GmsCore API.
+         * @param callback The intent callback.
+         * @param contents The browser webcontents.
+         * @return success status of the call.
+         */
+        @Override
+        public int showCancelableIntent(Callback<Integer> intentTrigger,
+                WindowAndroid.IntentCallback callback, Integer errorId) {
+            // Bypass GmsCore and just call onIntentCompleted.
+            if (mCancelableIntentSuccess) {
+                callback.onIntentCompleted(this, mResultCode, mResponseIntent);
+                return 0;
+            }
+            return WindowAndroid.START_INTENT_FAILURE;
+        }
+
+        /**
+         *
+         * @param callback The object that should have received the results.
+         * @return success status of the call.
+         */
+        @Override
+        public boolean removeIntentCallback(IntentCallback callback) {
+            return true;
+        }
+
+        /**
+         * Overrides the success status of sending the intent.
+         * @param success
+         */
+        public void setCancelableIntentSuccess(boolean success) {
+            mCancelableIntentSuccess = success;
+        }
+
+        /**
+         * Overrides the result code returned in the callback.
+         * @param resultCode
+         */
+        public void setResultCode(int resultCode) {
+            mResultCode = resultCode;
+        }
+
+        /**
+         * Overrides the intent returned in the callback.
+         * @param intent
+         */
+        public void setResponseIntent(Intent intent) {
+            mResponseIntent = intent;
+        }
+    }
+
+    private static class AuthenticatorCallback extends HandlerResponseCallback {
+        private Integer mStatus;
+        private MakeCredentialAuthenticatorResponse mMakeCredentialResponse;
+        private GetAssertionAuthenticatorResponse mGetAssertionAuthenticatorResponse;
+
+        // Signals when request is complete.
+        private final ConditionVariable mDone = new ConditionVariable();
+
+        AuthenticatorCallback() {}
+
+        @Override
+        public void onRegisterResponse(
+                Integer status, MakeCredentialAuthenticatorResponse response) {
+            assert mStatus == null;
+            mStatus = status;
+            mMakeCredentialResponse = response;
+            unblock();
+        }
+
+        @Override
+        public void onSignResponse(Integer status, GetAssertionAuthenticatorResponse response) {
+            assert mStatus == null;
+            mStatus = status;
+            mGetAssertionAuthenticatorResponse = response;
+            unblock();
+        }
+
+        @Override
+        public void onError(Integer status) {
+            assert mStatus == null;
+            mStatus = status;
+            unblock();
+        }
+
+        public Integer getStatus() {
+            return mStatus;
+        }
+
+        public MakeCredentialAuthenticatorResponse getMakeCredentialResponse() {
+            return mMakeCredentialResponse;
+        }
+
+        public GetAssertionAuthenticatorResponse getGetAssertionResponse() {
+            return mGetAssertionAuthenticatorResponse;
+        }
+
+        public void blockUntilCalled() {
+            mDone.block();
+        }
+
+        private void unblock() {
+            mDone.open();
+        }
+    }
+
+    private static class MockAuthenticatorRenderFrameHost extends MockRenderFrameHost {
+        private String mLastUrl;
+
+        @Override
+        public String getLastCommittedURL() {
+            return mLastUrl;
+        }
+
+        public void setLastCommittedURL(String url) {
+            mLastUrl = url;
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        Assume.assumeTrue(gmsVersionSupported());
+        mActivityTestRule.startMainActivityOnBlankPage();
+        mTestServer = EmbeddedTestServer.createAndStartHTTPSServer(
+                InstrumentationRegistry.getInstrumentation().getContext(),
+                ServerCertificate.CERT_OK);
+        mCallback = new AuthenticatorCallback();
+        mUrl = mTestServer.getURLWithHostName(
+                "subdomain.example.test", "/content/test/data/android/authenticator.html");
+        mActivityTestRule.loadUrl(mUrl);
+        mFrameHost = new MockAuthenticatorRenderFrameHost();
+        mFrameHost.setLastCommittedURL(mUrl);
+        mRequest = new Fido2CredentialRequest();
+        mRequest.setWebContentsForTesting(new MockWebContents());
+        mCreationOptions = Fido2ApiTestHelper.createDefaultMakeCredentialOptions();
+        mRequestOptions = Fido2ApiTestHelper.createDefaultGetAssertionOptions();
+        ThreadUtils.runOnUiThreadBlocking(()
+                                                  -> mWindowAndroid = new MockActivityWindowAndroid(
+                                                             mActivityTestRule.getActivity()));
+        mStartTimeMs = SystemClock.elapsedRealtime();
+    }
+
+    @After
+    public void tearDown() {}
+
+    /**
+     * Used to enable early exit of tests on bots that don't support GmsCore v16.1+
+     */
+    private boolean gmsVersionSupported() {
+        if (PackageUtils.getPackageVersion(
+                    ContextUtils.getApplicationContext(), GOOGLE_PLAY_SERVICES_PACKAGE)
+                >= Fido2ApiHandler.GMSCORE_MIN_VERSION) {
+            return true;
+        }
+        return false;
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_success() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_unsuccessfulAttemptToShowCancelableIntent() {
+        mWindowAndroid.setCancelableIntentSuccess(false);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_missingExtra() {
+        // An intent missing FIDO2_KEY_RESPONSE_EXTRA.
+        mWindowAndroid.setResponseIntent(new Intent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_nullIntent() {
+        // Don't set an intent to be returned at all.
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.NOT_ALLOWED_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_resultCanceled() {
+        mWindowAndroid.setResultCode(Activity.RESULT_CANCELED);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.NOT_ALLOWED_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_resultUnknown() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        mWindowAndroid.setResultCode(Activity.RESULT_FIRST_USER);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_nullRpIcon() {
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.relyingParty.icon = null;
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_nullUserIcon() {
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.user.icon = null;
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_noEligibleParameters() {
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        PublicKeyCredentialParameters parameters = new PublicKeyCredentialParameters();
+        parameters.algorithmIdentifier = 1; // Not a valid algorithm identifier.
+        parameters.type = PublicKeyCredentialType.PUBLIC_KEY;
+        customOptions.publicKeyParameters = new PublicKeyCredentialParameters[] {parameters};
+
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.ALGORITHM_UNSUPPORTED));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_noEligibleParameters2() {
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        PublicKeyCredentialParameters parameters = new PublicKeyCredentialParameters();
+        parameters.type = 10; // Not a valid type.
+        customOptions.publicKeyParameters = new PublicKeyCredentialParameters[] {parameters};
+
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.ALGORITHM_UNSUPPORTED));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_parametersContainEligibleAndNoneligible() {
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        PublicKeyCredentialParameters parameters = new PublicKeyCredentialParameters();
+        parameters.algorithmIdentifier = 1; // Not a valid algorithm identifier.
+        parameters.type = PublicKeyCredentialType.PUBLIC_KEY;
+        PublicKeyCredentialParameters[] multiParams = new PublicKeyCredentialParameters[] {
+                customOptions.publicKeyParameters[0], parameters};
+        customOptions.publicKeyParameters = multiParams;
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_noExcludeCredentials() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.excludeCredentials = null;
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertionWithoutUvmRequested_success() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulGetAssertionIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateGetAssertionResponse(mCallback.getGetAssertionResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+    @Test
+    @SmallTest
+    public void testGetAssertionWithUvmRequestedWithoutUvmResponded_success() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulGetAssertionIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequestOptions.userVerificationMethods = true;
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateGetAssertionResponse(mCallback.getGetAssertionResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertionWithUvmRequestedWithUvmResponded_success() {
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createSuccessfulGetAssertionIntentWithUvm());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequestOptions.userVerificationMethods = true;
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateGetAssertionResponse(mCallback.getGetAssertionResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_unsuccessfulAttemptToShowCancelableIntent() {
+        mWindowAndroid.setCancelableIntentSuccess(false);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_missingExtra() {
+        // An intent missing FIDO2_KEY_RESPONSE_EXTRA.
+        mWindowAndroid.setResponseIntent(new Intent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_nullIntent() {
+        // Don't set an intent to be returned at all.
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.NOT_ALLOWED_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_resultCanceled() {
+        mWindowAndroid.setResultCode(Activity.RESULT_CANCELED);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.NOT_ALLOWED_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_resultUnknown() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulGetAssertionIntent());
+        mWindowAndroid.setResultCode(Activity.RESULT_FIRST_USER);
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.UNKNOWN_ERROR));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_unknownErrorCredentialNotRecognized() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createErrorIntent(
+                ErrorCode.UNKNOWN_ERR, "Low level error 0x6a80"));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(),
+                Integer.valueOf(AuthenticatorStatus.CREDENTIAL_NOT_RECOGNIZED));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_appIdUsed() {
+        PublicKeyCredentialRequestOptions customOptions = mRequestOptions;
+        customOptions.appid = "www.example.com";
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulGetAssertionIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        GetAssertionAuthenticatorResponse response = mCallback.getGetAssertionResponse();
+        Fido2ApiTestHelper.validateGetAssertionResponse(response);
+        Assert.assertEquals(response.echoAppidExtension, true);
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_attestationNone() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.attestation = org.chromium.blink.mojom.AttestationConveyancePreference.NONE;
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_attestationIndirect() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.attestation =
+                org.chromium.blink.mojom.AttestationConveyancePreference.INDIRECT;
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_attestationDirect() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.attestation = org.chromium.blink.mojom.AttestationConveyancePreference.DIRECT;
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_attestationEnterprise() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createSuccessfulMakeCredentialIntent());
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+
+        PublicKeyCredentialCreationOptions customOptions = mCreationOptions;
+        customOptions.attestation =
+                org.chromium.blink.mojom.AttestationConveyancePreference.ENTERPRISE;
+        mRequest.handleMakeCredentialRequest(customOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.SUCCESS));
+        Fido2ApiTestHelper.validateMakeCredentialResponse(mCallback.getMakeCredentialResponse());
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_invalidStateErrorDuplicateRegistration() {
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createErrorIntent(ErrorCode.INVALID_STATE_ERR,
+                        "One of the excluded credentials exists on the local device"));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(
+                mCallback.getStatus(), Integer.valueOf(AuthenticatorStatus.CREDENTIAL_EXCLUDED));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_emptyAllowCredentials1() {
+        PublicKeyCredentialRequestOptions customOptions = mRequestOptions;
+        customOptions.allowCredentials = null;
+
+        // Passes conversion and gets rejected by GmsCore
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createErrorIntent(
+                ErrorCode.NOT_ALLOWED_ERR, "Authentication request must have non-empty allowList"));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(),
+                Integer.valueOf(AuthenticatorStatus.EMPTY_ALLOW_CREDENTIALS));
+        // Verify the response returned immediately.
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_emptyAllowCredentials2() {
+        PublicKeyCredentialRequestOptions customOptions = mRequestOptions;
+        customOptions.allowCredentials = null;
+
+        // Passes conversion and gets rejected by GmsCore
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createErrorIntent(ErrorCode.NOT_ALLOWED_ERR,
+                        "Request doesn't have a valid list of allowed credentials."));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(),
+                Integer.valueOf(AuthenticatorStatus.EMPTY_ALLOW_CREDENTIALS));
+        // Verify the response returned immediately.
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testMakeCredential_constraintErrorNoScreenlock() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createErrorIntent(
+                ErrorCode.CONSTRAINT_ERR, "The device is not secured with any screen lock"));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(),
+                Integer.valueOf(AuthenticatorStatus.USER_VERIFICATION_UNSUPPORTED));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    public void testGetAssertion_constraintErrorNoScreenlock() {
+        mWindowAndroid.setResponseIntent(Fido2ApiTestHelper.createErrorIntent(
+                ErrorCode.CONSTRAINT_ERR, "The device is not secured with any screen lock"));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(),
+                Integer.valueOf(AuthenticatorStatus.USER_VERIFICATION_UNSUPPORTED));
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    @UseMethodParameter(ErrorTestParams.class)
+    public void testMakeCredential_with_param(
+            String errorCodeName, String errorMsg, Integer status) {
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createErrorIntent(ErrorCode.valueOf(errorCodeName), errorMsg));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), status);
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    @UseMethodParameter(ErrorTestParams.class)
+    public void testGetAssertion_with_param(String errorCodeName, String errorMsg, Integer status) {
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createErrorIntent(ErrorCode.valueOf(errorCodeName), errorMsg));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), status);
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    @UseMethodParameter(ErrorTestParams.class)
+    public void testMakeCredential_with_param_nullErrorMessage(
+            String errorCodeName, String errorMsg, Integer status) {
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createErrorIntent(ErrorCode.valueOf(errorCodeName), null));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleMakeCredentialRequest(mCreationOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), status);
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+
+    @Test
+    @SmallTest
+    @UseMethodParameter(ErrorTestParams.class)
+    public void testGetAssertion_with_param_nullErrorMessage(
+            String errorCodeName, String errorMsg, Integer status) {
+        mWindowAndroid.setResponseIntent(
+                Fido2ApiTestHelper.createErrorIntent(ErrorCode.valueOf(errorCodeName), null));
+        ThreadUtils.runOnUiThreadBlocking(
+                () -> mRequest.setActivityWindowForTesting(mWindowAndroid));
+        mRequest.handleGetAssertionRequest(mRequestOptions, mFrameHost, mCallback);
+        mCallback.blockUntilCalled();
+        Assert.assertEquals(mCallback.getStatus(), status);
+        Fido2ApiTestHelper.verifyRespondedBeforeTimeout(mStartTimeMs);
+    }
+}
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 54eed56..44dc8d3 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-82.0.4085.12_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-82.0.4085.13_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index a82a850..beac6293 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -2268,6 +2268,11 @@
     Automatic updates don't download on this network type, but you can check for updates manually.
   </message>
 
+  <!-- About flags page -->
+  <message name="IDS_FLAGS_IGNORED_DUE_TO_CRASHY_CHROME" desc="Text on an info bar added when user flags are dropped when chrome crashed too many times in short time." translateable="false">
+    Flags are ignored because of too many consecutive startup crashes.
+  </message>
+
   <!-- EOL Notification Strings -->
   <message name="IDS_EOL_NOTIFICATION_TITLE" desc="Notification title shown to inform the user that this device is no longer supported.">
     Final software update
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index bf9b54f4..c74d4724 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -155,11 +155,14 @@
   <message name="IDS_OS_SETTINGS_SYNC_PAGE_TITLE" desc="Settings sub-page title for sync.">
     Sync your settings
   </message>
-  <message name="IDS_OS_SETTINGS_SYNC_TURN_ON" desc="Button label for turning on sync. Sync is capitalized because it is the proper name of a feature.">
-    Turn on Sync
+  <message name="IDS_OS_SETTINGS_SYNC_TURN_ON" desc="Button label for turning on synchronization of settings across Chrome OS devices.">
+    Turn on
   </message>
-  <message name="IDS_OS_SETTINGS_SYNC_TURN_OFF" desc="Button label for turning off sync. Sync is capitalized because it is the proper name of a feature.">
-    Turn off Sync
+  <message name="IDS_OS_SETTINGS_SYNC_TURN_OFF" desc="Button label for turning off synchronization of settings across Chrome OS devices.">
+    Turn off
+  </message>
+  <message name="IDS_OS_SETTINGS_SYNC_FEATURE_LABEL" desc="Label describing the OS sync feature.">
+    Your apps and settings will sync across all Chrome OS devices where you are signed in with your Google account. For browser sync options, go to<ph name="LINK_BEGIN">&lt;a&gt;</ph>Chrome settings<ph name="LINK_END">&lt;/a&gt;</ph>.
   </message>
   <message name="IDS_OS_SETTINGS_SYNC_APPS_CHECKBOX_LABEL" desc="Label for the checkbox which enables syncing of apps across devices.">
     Apps
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_FEATURE_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_FEATURE_LABEL.png.sha1
new file mode 100644
index 0000000..e01fe7d
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_FEATURE_LABEL.png.sha1
@@ -0,0 +1 @@
+b408bd6da5e3360cd76f954d1ad558549358da4b
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_OFF.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_OFF.png.sha1
index e742047..e01fe7d 100644
--- a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_OFF.png.sha1
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_OFF.png.sha1
@@ -1 +1 @@
-63f8ef2875ef3f7525c1eb2512c24e64ce2676c2
\ No newline at end of file
+b408bd6da5e3360cd76f954d1ad558549358da4b
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_ON.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_ON.png.sha1
index 30849b7..fc0a7b1 100644
--- a/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_ON.png.sha1
+++ b/chrome/app/os_settings_strings_grdp/IDS_OS_SETTINGS_SYNC_TURN_ON.png.sha1
@@ -1 +1 @@
-e5cee8ca272e5b43525bfdcbf3b465e04e70b2b6
\ No newline at end of file
+680fcf18dcf05ea6ce6ae1c9f835d734e7fc1e60
\ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index 7d841ba7..62a65cf2 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
 <translation id="1065672644894730302">No es poden llegir les vostres preferències. És possible que algunes funcions no estiguin disponibles i que els canvis a les preferències no es desin.</translation>
-<translation id="1098170124587656448">Chromium pot ajudar a protegir-te de violacions de les dades, d'extensions inadequades i més</translation>
+<translation id="1098170124587656448">Chromium pot ajudar a protegir-te de violacions de les dades, d'extensions malicioses i més</translation>
 <translation id="1104942323762546749">Chromium vol exportar les teves contrasenyes. Escriu la contrasenya de Windows per permetre-ho.</translation>
 <translation id="113122355610423240">Chromium és el navegador predeterminat</translation>
 <translation id="1185134272377778587">Quant a Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb
index 6a24dd0..87f1667 100644
--- a/chrome/app/resources/chromium_strings_en-GB.xtb
+++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -45,6 +45,7 @@
 <translation id="2886012850691518054">Optional: Help make Chrome better by automatically sending usage statistics and crash reports to Google.</translation>
 <translation id="2910007522516064972">About &amp;Chromium</translation>
 <translation id="2977470724722393594">Chromium is up to date</translation>
+<translation id="2983934633046890458">Chromium is trying to edit passwords.</translation>
 <translation id="3032706164202344641">Chromium can't check your passwords. Try again later.</translation>
 <translation id="3032787606318309379">Adding to Chromium ...</translation>
 <translation id="3068515742935458733">Help make Chromium better by sending crash reports and <ph name="UMA_LINK" /> to Google</translation>
@@ -112,6 +113,7 @@
 <translation id="5479196819031988440">Chromium OS can't open this page.</translation>
 <translation id="5480860683791598150">Chromium needs access to your location to share your location with this site</translation>
 <translation id="549669000822060376">Please wait while Chromium installs the latest system updates.</translation>
+<translation id="5496810170689441661">Chromium is trying to edit passwords. Type your Windows password to allow this.</translation>
 <translation id="5623402015214259806">{0,plural, =0{A Chromium update is available}=1{A Chromium update is available}other{A Chromium update has been available for # days}}</translation>
 <translation id="5631814766731275228">Chromium name and picture</translation>
 <translation id="5634636535844844681">Chromium requires Windows 7 or higher.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb
index 13d910a9..2fd4699 100644
--- a/chrome/app/resources/chromium_strings_it.xtb
+++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -43,6 +43,7 @@
 <translation id="2886012850691518054">Facoltativo: aiutaci a migliorare Chromium inviando automaticamente a Google statistiche sull'utilizzo e rapporti sugli arresti anomali.</translation>
 <translation id="2910007522516064972">Informazioni su &amp;Chromium</translation>
 <translation id="2977470724722393594">Chromium è aggiornato</translation>
+<translation id="2983934633046890458">Chromium sta cercando di modificare le password.</translation>
 <translation id="3032706164202344641">Chromium non può controllare le tue password. Riprova più tardi.</translation>
 <translation id="3032787606318309379">Aggiunta a Chromium in corso...</translation>
 <translation id="3068515742935458733">Aiutaci a migliorare Chromium inviando a Google rapporti sugli arresti anomali e <ph name="UMA_LINK" /></translation>
@@ -110,6 +111,7 @@
 <translation id="5479196819031988440">Chromium OS non è in grado di aprire la pagina.</translation>
 <translation id="5480860683791598150">Chromium deve poter accedere alla tua posizione per condividerla con questo sito</translation>
 <translation id="549669000822060376">Attendi mentre Chromium installa gli aggiornamenti di sistema più recenti.</translation>
+<translation id="5496810170689441661">Chromium sta cercando di modificare le password. Per consentire la modifica, digita la tua password Windows.</translation>
 <translation id="5623402015214259806">{0,plural, =0{È disponibile un aggiornamento di Chromium}=1{È disponibile un aggiornamento di Chromium}other{È disponibile un aggiornamento di Chromium da # giorni}}</translation>
 <translation id="5631814766731275228">Nome e immagine di Chromium</translation>
 <translation id="5634636535844844681">Chromium richiede Windows 7 o versioni successive.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index 574548e..508bc43 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -43,6 +43,7 @@
 <translation id="2886012850691518054">Pilihan: Bantu jadikan Chromium lebih baik dengan menghantar statistik penggunaan dan laporan ranap kepada Google secara automatik.</translation>
 <translation id="2910007522516064972">Mengenai &amp;Chromium</translation>
 <translation id="2977470724722393594">Chromium telah dikemas kini</translation>
+<translation id="2983934633046890458">Chromium cuba mengedit kata laluan.</translation>
 <translation id="3032706164202344641">Chromium tidak dapat menyemak kata laluan anda. Cuba lagi nanti.</translation>
 <translation id="3032787606318309379">Menambah ke Chromium...</translation>
 <translation id="3068515742935458733">Bantu jadikan Chromium lebih baik dengan menghantar laporan ranap dan <ph name="UMA_LINK" /> kepada Google.</translation>
@@ -110,6 +111,7 @@
 <translation id="5479196819031988440">OS Chromium tidak boleh membuka halaman ini.</translation>
 <translation id="5480860683791598150">Chromium memerlukan akses kepada lokasi anda untuk berkongsi lokasi dengan tapak ini</translation>
 <translation id="549669000822060376">Sila tunggu sementara Chromium memasang kemas kini sistem terkini.</translation>
+<translation id="5496810170689441661">Chromium cuba mengedit kata laluan. Taip kata laluan Windows anda untuk membenarkan tindakan ini.</translation>
 <translation id="5623402015214259806">{0,plural, =0{Kemas kini Chromium tersedia}=1{Kemas kini Chromium tersedia}other{Kemas kini Chromium telah tersedia selama # hari}}</translation>
 <translation id="5631814766731275228">Nama dan gambar Chromium</translation>
 <translation id="5634636535844844681">Chromium memerlukan Windows 7 atau lebih tinggi.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb
index 7bc030a..5555e37 100644
--- a/chrome/app/resources/chromium_strings_my.xtb
+++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -46,6 +46,7 @@
 <translation id="2886012850691518054">လိုချင်မှ လုပ်ရန်: Google ထံသို့ သုံးစွဲမှု စာရင်းအင်းများ နှင့် ပျက်စီးမှု အစီရင်ခံစာများကို အလိုအလျောက် ပို့ပေးခြင်းဖြင့် Chromium ကို ပိုကောင်းလာအေင် ကူညီပေးပါ။</translation>
 <translation id="2910007522516064972">Chromium အကြောင်း</translation>
 <translation id="2977470724722393594">Chroumium ကို အပ်ဒိတ်လုပ်ထားပြီးပါပြီ</translation>
+<translation id="2983934633046890458">Chromium သည် စကားဝှက်များကို တည်းဖြတ်ရန်ကြိုးပမ်းနေသည်။</translation>
 <translation id="3032706164202344641">Chromium က သင့်စကားဝှက်များကို စစ်ဆေး၍မရပါ။ နောက်မှ ထပ်စမ်းကြည့်ပါ။</translation>
 <translation id="3032787606318309379">Chromium သို့ ထပ်ထည့်နေခြင်း...</translation>
 <translation id="3068515742935458733"><ph name="UMA_LINK" /> နှင့် ပျက်စီးမှု အစီရင်ခံချက်များကို Google သို့ပို့ခြင်းဖြင့် Chromium အားကူညီကာ ပိုမိုကောင်းမွန်စေပါ။</translation>
@@ -114,6 +115,7 @@
 <translation id="5479196819031988440">Chromium OS သည် ဤစာမျက်နှာကို ဖွင့်၍မရပါ။</translation>
 <translation id="5480860683791598150">သင်၏တည်နေရာကို ဤဝဘ်ဆိုက်နှင့် မျှဝေနိုင်ရန် Chromium သည် သင့်တည်နေရာကို အသုံးပြုခွင့်ရရန် လိုအပ်ပါသည်</translation>
 <translation id="549669000822060376">​​ကျေးဇူးပြုပြီး Chromium က စနစ်၏ နောက်ဆုံး မွမ်းမံမှုများကို တပ်ဆင်ပေးနေတာကို စောင့်ပါ။</translation>
+<translation id="5496810170689441661">Chromium သည် စကားဝှက်များ တည်းဖြတ်ရန် ကြိုးပမ်းနေသည်။ ၎င်းကို ခွင့်ပြုရန် သင်၏ Windows စကားဝှက်ကို ထည့်ပါ။</translation>
 <translation id="5623402015214259806">{0,plural, =0{Chromium အပ်ဒိတ်တစ်ခု ရနိုင်ပါသည်}=1{Chromium အပ်ဒိတ်တစ်ခု ရနိုင်ပါသည်}other{Chromium အပ်ဒိတ်တစ်ခု ရနိုင်သည်မှာ # ရက် ရှိပါပြီ}}</translation>
 <translation id="5631814766731275228">Chromium အမည်နှင့် ဓာတ်ပုံ</translation>
 <translation id="5634636535844844681">Chromium ကိုထည့်သွင်းရန် Windows 7 နှင့်အထက်လိုအပ်ပါသည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb
index f6b62ee..e97ec6f 100644
--- a/chrome/app/resources/chromium_strings_pl.xtb
+++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -43,6 +43,7 @@
 <translation id="2886012850691518054">Opcjonalnie: pomóż nam udoskonalać Chromium, wysyłając do Google statystyki użytkowania i raporty o awariach.</translation>
 <translation id="2910007522516064972">&amp;Chromium – informacje</translation>
 <translation id="2977470724722393594">Masz aktualną wersję Chromium</translation>
+<translation id="2983934633046890458">Chromium próbuje edytować hasła.</translation>
 <translation id="3032706164202344641">Chromium nie może sprawdzić Twoich haseł. Spróbuj później.</translation>
 <translation id="3032787606318309379">Dodawanie do Chromium...</translation>
 <translation id="3068515742935458733">Pomóż nam ulepszyć Chromium, przesyłając do Google raporty o awariach i <ph name="UMA_LINK" /></translation>
@@ -108,6 +109,7 @@
 <translation id="5479196819031988440">System operacyjny Chromium nie może otworzyć tej strony.</translation>
 <translation id="5480860683791598150">Chromium musi mieć dostęp do Twojej lokalizacji, by udostępnić ją tej stronie</translation>
 <translation id="549669000822060376">Poczekaj, aż Chromium zainstaluje najnowsze aktualizacje systemu.</translation>
+<translation id="5496810170689441661">Chromium próbuje edytować hasła. Aby na to zezwolić, podaj swoje hasło do systemu Windows.</translation>
 <translation id="5623402015214259806">{0,plural, =0{Dostępna jest aktualizacja Chromium}=1{Dostępna jest aktualizacja Chromium}few{Aktualizacja Chromium jest dostępna od # dni}many{Aktualizacja Chromium jest dostępna od # dni}other{Aktualizacja Chromium jest dostępna od # dnia}}</translation>
 <translation id="5631814766731275228">Nazwa i zdjęcie w Chromium</translation>
 <translation id="5634636535844844681">Chromium wymaga systemu Windows 7 lub nowszego.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb
index e340610a..0cf86d4f 100644
--- a/chrome/app/resources/chromium_strings_pt-BR.xtb
+++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -43,6 +43,7 @@
 <translation id="2886012850691518054">Opcional: Ajude a tornar o Chromium melhor enviando automaticamente as estatísticas de uso e os relatórios de erros ao Google.</translation>
 <translation id="2910007522516064972">Sobre o &amp;Chromium</translation>
 <translation id="2977470724722393594">O Chromium está atualizado</translation>
+<translation id="2983934633046890458">O Chromium está tentando editar senhas.</translation>
 <translation id="3032706164202344641">O Chromium não pode verificar suas senhas. Tente mais tarde.</translation>
 <translation id="3032787606318309379">Adicionando ao Chromium...</translation>
 <translation id="3068515742935458733">Ajude a melhorar o Chromium. Envie relatórios de erros e <ph name="UMA_LINK" /> para o Google</translation>
@@ -108,6 +109,7 @@
 <translation id="5479196819031988440">O Chromium OS não pode abrir essa página.</translation>
 <translation id="5480860683791598150">O Chromium precisa acessar seu local para compartilhá-lo com este site</translation>
 <translation id="549669000822060376">Aguarde enquanto o Chromium instala as últimas atualizações do sistema.</translation>
+<translation id="5496810170689441661">O Chromium está tentando editar senhas. Digite a senha do Windows para permitir essa ação.</translation>
 <translation id="5623402015214259806">{0,plural, =0{Uma atualização do Chromium está disponível}=1{Uma atualização do Chromium está disponível}one{Uma atualização do Chromium está disponível há # dia}other{Uma atualização do Chromium está disponível há # dias}}</translation>
 <translation id="5631814766731275228">Nome e foto do Chromium</translation>
 <translation id="5634636535844844681">O Chromium requer o Windows 7 ou versão superior.</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb
index 8e42bf7..e0ac686 100644
--- a/chrome/app/resources/chromium_strings_si.xtb
+++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -45,6 +45,7 @@
 <translation id="2886012850691518054">වෛකල්පිත: Google වෙත ස්වයංක්‍රීයව භාවිත සංඛ්‍යා ලේඛන සහ කඩිනම් වාර්තා යවමින් Chromium වඩා යහපත් කර ගැනීමට උපකාර කරන්න.</translation>
 <translation id="2910007522516064972">&amp;Chromium පිළිබඳ</translation>
 <translation id="2977470724722393594">Chromium යාවත්කාලීනයි</translation>
+<translation id="2983934633046890458">Chromium මුරපද සංස්කරණ කිරීමට උත්සාහ කරයි.</translation>
 <translation id="3032706164202344641">Chromium හට ඔබේ මුරපද පරීක්‍ෂා කළ නොහැක. පසුව නැවත උත්සාහ කරන්න.</translation>
 <translation id="3032787606318309379">Chromium වෙත එක් කෙරෙමින්...</translation>
 <translation id="3068515742935458733">බිඳ වැටුම් වාර්තා සහ <ph name="UMA_LINK" /> Google වෙත යවමින් Google Chromium දියුණු කිරීමට සහය වන්න</translation>
@@ -112,6 +113,7 @@
 <translation id="5479196819031988440">Chromium OS හට මෙම පිටුව විවෘත කළ නොහැකිය.</translation>
 <translation id="5480860683791598150">Chromium හට මෙම අඩවිය සමඟ ඔබේ ස්ථානය බෙදා ගැනීමට ඔබේ ස්ථානයට ප්‍රවේශය අවශ්‍යයි</translation>
 <translation id="549669000822060376">කරුණාකර Chromium නවතම පද්ධති යාවත්කාලීන ස්ථාපනය කරන අතරතුර රැඳී සිටින්න.</translation>
+<translation id="5496810170689441661">Chromium මුරපද සංස්කරණ කිරීමට උත්සාහ කරයි. මීට ඉඩ දීමට ඔබේ Windows මුරපදය ටයිප් කරන්න.</translation>
 <translation id="5623402015214259806">{0,plural, =0{Chromium යාවත්කාලීනයක් තිබේ}=1{Chromium යාවත්කාලීනයක් තිබේ}one{දින # ක් තුළ Chromium යාවත්කාලීනයක් ලැබී ඇත}other{දින # ක් තුළ Chromium යාවත්කාලීනයක් ලැබී ඇත}}</translation>
 <translation id="5631814766731275228">Chromium නම සහ පින්තූරය</translation>
 <translation id="5634636535844844681">Chromium හට Windows 7 හෝ ඊට ඉහළ අනුවාදයක් අවශ්‍යයි.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb
index d244b15..a235f82 100644
--- a/chrome/app/resources/chromium_strings_sk.xtb
+++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -45,6 +45,7 @@
 <translation id="2886012850691518054">Voliteľné: Pomôžte vylepšiť služby prehliadača Chromium tým, že nastavíte automatické odosielanie štatistík používania a správ o zlyhaní spoločnosti Google.</translation>
 <translation id="2910007522516064972">Informácie o prehliadači &amp;Chromium</translation>
 <translation id="2977470724722393594">Prehliadač Chromium bol aktualizovaný</translation>
+<translation id="2983934633046890458">Chromium sa pokúša upraviť heslá.</translation>
 <translation id="3032706164202344641">Chromium nemôže skontrolovať heslá. Skúste to znova neskôr.</translation>
 <translation id="3032787606318309379">Pridáva sa do prehliadača Chromium...</translation>
 <translation id="3068515742935458733">Pomôcť zlepšiť prehliadač Chromium odosielaním správ o zlyhaní a <ph name="UMA_LINK" /> spoločnosti Google</translation>
@@ -112,6 +113,7 @@
 <translation id="5479196819031988440">Chromium OS nedokáže túto stránku otvoriť.</translation>
 <translation id="5480860683791598150">Chromium potrebuje prístup k vašej polohe, aby ju mohol zdieľať s týmto webom</translation>
 <translation id="549669000822060376">Počkajte, kým Chromium nainštaluje najnovšie aktualizácie systému.</translation>
+<translation id="5496810170689441661">Chromium sa pokúša upraviť heslá. Ak to chcete povoliť, zadajte heslo systému Windows.</translation>
 <translation id="5623402015214259806">{0,plural, =0{Je k dispozícii aktualizácia prehliadača Chromium}=1{Je k dispozícii aktualizácia prehliadača Chromium}few{Aktualizácia prehliadača Chromium je k dispozícii už # dni}many{Aktualizácia prehliadača Chromium je k dispozícii už # dňa}other{Aktualizácia prehliadača Chromium je k dispozícii už # dní}}</translation>
 <translation id="5631814766731275228">Meno a obrázok profilu Chromium</translation>
 <translation id="5634636535844844681">Chromium vyžaduje Windows 7 alebo vyšší.</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index 137ea652..69a0799 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -16,11 +16,13 @@
 <translation id="1779356040007214683">Chromiumను సురక్షితం చేయడానికి, మేము <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />లో జాబితా చేయబడని మరియు మీకు తెలియకుండానే జోడించబడిన కొన్ని పొడిగింపులను నిలిపివేసాము.</translation>
 <translation id="1808667845054772817">Chromiumను మళ్లీ ఇన్‌స్టాల్ చేయి</translation>
 <translation id="1881322772814446296">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్‌పై నియంత్రణను అందిస్తున్నారు. మీ యాప్‌లు, బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు, ఇతర సెట్టింగ్‌ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డాష్‌బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. మీరు ప్రస్తుతం ఉన్న మీ Chromium డేటాను వేరుగా ఉంచడానికి ఐచ్ఛికంగా కొత్త ప్రొఫైల్‌ను సృష్టించవచ్చు. <ph name="LEARN_MORE" /></translation>
+<translation id="1911747963917069754">మీ అన్ని పాస్‌వర్డ్‌లను Chromium తనిఖీ చేయదు. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="1911763535808217981">దీనిని ఆఫ్ చేయడం ద్వారా, మీరు Chromiumకి సైన్ ఇన్ చేయకుండానే Gmail లాంటి Google సైట్‌లలో సైన్ ఇన్ చేయగలరు</translation>
 <translation id="1929939181775079593">Chromium ప్రతిస్పందించడం లేదు. ఇప్పుడు మళ్లీ ప్రారంభించాలా?</translation>
 <translation id="1966382378801805537">Chromium డిఫాల్ట్ బ్రౌజర్‌ను నిశ్చయించలేదు లేదా సెట్ చేయలేదు</translation>
 <translation id="2008474315282236005">ఇది ఈ పరికరం నుండి 1 అంశాన్ని తొలగిస్తుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, Chromiumకు <ph name="USER_EMAIL" /> లాగా సైన్ ఇన్ చేయండి.</translation>
 <translation id="2147976119693222405">Chromium OS మీ డేటాను సింక్ చేయలేకపోయింది. ఇప్పుడే సమస్యను పరిష్కరించండి.</translation>
+<translation id="2185166961232948079">Chromium - నెట్‌వర్క్ సైన్ ఇన్ - <ph name="PAGE_TITLE" /></translation>
 <translation id="2241627712206172106">మీరు కంప్యూటర్‌ను షేర్‌ చేస్తే, స్నేహితులు, కుటుంబ సభ్యులు విడివిడిగా బ్రౌజ్ చేయవచ్చు. Chromiumను వారికి నచ్చిన రీతిలో సెటప్ చేసుకోవచ్చు.</translation>
 <translation id="2347108572062610441">ఈ పొడిగింపు మీరు Chromiumని ప్రారంభించినప్పుడు చూపబడే పేజీని మార్చింది.</translation>
 <translation id="2396765026452590966"><ph name="EXTENSION_NAME" /> పొడిగింపు మీరు Chromiumని ప్రారంభించినప్పుడు చూపబడే పేజీని మార్చింది.</translation>
@@ -41,6 +43,7 @@
 <translation id="2886012850691518054">ఐచ్ఛికం: Googleకు వినియోగ‌ గణాంకాలను, క్రాష్ నివేదికలను ఆటోమేటిక్‌గా పంపడం ద్వారా Chromiumను మరింత మెరుగుపరచడానికి సహాయం చేస్తుంది.</translation>
 <translation id="2910007522516064972">&amp;Chromium గురించి</translation>
 <translation id="2977470724722393594">Chromium తాజాగా ఉంది</translation>
+<translation id="3032706164202344641">Chromium మీ పాస్‌వర్డ్‌లను తనిఖీ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="3032787606318309379">Chromiumకి జోడిస్తోంది...</translation>
 <translation id="3068515742935458733">Googleకు వినియోగ గణాంకాలు, <ph name="UMA_LINK" />ను పంపడం ద్వారా Chromiumను మెరుగుపరచడంలో సహాయపడండి</translation>
 <translation id="3103660991484857065">ఇన్‌స్టాలర్ ఆర్కైవ్‌ను వాస్తవ పరిమాణానికి తీసుకుని రావడంలో విఫలమైంది. దయచేసి Chromiumను మళ్లీ డౌన్‌లోడ్ చేయండి.</translation>
@@ -70,6 +73,7 @@
 <translation id="3945058413678539331">పాస్‌వర్డ్‌లను కాపీ చేయడానికి Chromium ప్రయత్నిస్తోంది. దీన్ని అనుమతించడానికి మీ Windows పాస్‌వర్డ్‌ను టైప్ చేయండి.</translation>
 <translation id="4036079820698952681"><ph name="BEGIN_LINK" />ప్రస్తుత సెట్టింగ్‌లను<ph name="END_LINK" /> నివేదించడం ద్వారా Chromiumను మెరుగుపరచడంలో సహాయపడండి</translation>
 <translation id="4050175100176540509">ముఖ్యమైన భద్రతా మెరుగుదలలు మరియు కొత్త ఫీచర్‌లు తాజా వెర్షన్‌లో అందుబాటులో ఉన్నాయి.</translation>
+<translation id="419998258129752635"><ph name="PAGE_TITLE" /> - నెట్‌వర్క్ సైన్ ఇన్ - Chromium</translation>
 <translation id="421369550622382712">Chromium కోసం గొప్ప అనువర్తనాలు, ఆటలు, పొడిగింపులు మరియు థీమ్‌లను కనుగొనండి.</translation>
 <translation id="4216212958613226427">Chromium UI ప్రదర్శించడం కోసం ఈ భాష ఉపయోగించబడింది</translation>
 <translation id="4230135487732243613">మీ Chromium డేటాను ఈ ఖాతాకు జోడించాలా?</translation>
@@ -78,6 +82,7 @@
 <translation id="4407044323746248786">ఏదేమైనా Chromium నుండి నిష్క్రమించాలా?</translation>
 <translation id="4415566066719264597">నేపథ్యంలో అమలయ్యేందుకు Chromiumని అనుమతించండి</translation>
 <translation id="4423735387467980091">Chromiumను అనుకూలీకరించండి మరియు నియంత్రించండి</translation>
+<translation id="4544142686420020088">Chromium అప్‌డేట్ అవ్వలేదు, ఏదో తప్పు జరిగింది. <ph name="BEGIN_LINK" />Chromium అప్‌డేట్ సమస్యలు, విఫలమైన అప్‌డేట్‌లను పరిష్కరించండి.<ph name="END_LINK" /></translation>
 <translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేసారు. ఇప్పుడు మీరు సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్‌మార్క్‌లు, చరిత్ర మరియు ఇతర సెట్టింగ్‌లను యాక్సెస్ చేయవచ్చు.</translation>
 <translation id="459535195905078186">Chromium అనువర్తనాలు</translation>
 <translation id="4677944499843243528">ఈ ప్రొఫైల్‌ను మరొక కంప్యూటర్ (<ph name="HOST_NAME" />)లో మరో Chromium ప్రాసెస్ (<ph name="PROCESS_ID" />) ఉపయోగిస్తున్నట్లు కనిపిస్తోంది. Chromium ప్రొఫైల్‌ను లాక్ చేసినందున అది పాడవదు. ఈ ప్రొఫైల్‌ను వేరే ప్రాసెస్‌లు ఏవీ ఉపయోగించడం లేదని మీకు ఖచ్చితంగా తెలిస్తే, ప్రొఫైల్‌ను అన్‌లాక్ చేసి Chromiumను మళ్లీ ప్రారంభించవచ్చు.</translation>
@@ -111,6 +116,7 @@
 <translation id="5820394555380036790">Chromium OS</translation>
 <translation id="5862307444128926510">Chromiumకు స్వాగతం</translation>
 <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation>
+<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - నెట్‌వర్క్ సైన్ ఇన్</translation>
 <translation id="5987687638152509985">సింక్‌ను ప్రారంభించడానికి Chromiumను అప్‌డేట్ చేయండి</translation>
 <translation id="6013050204643758987"><ph name="BEGIN_LINK_LINUX_OSS" />Linux (బీటా) <ph name="END_LINK_LINUX_OSS" /> లాగానే, Chromium OS కూడా అదనపు <ph name="BEGIN_LINK_CROS_OSS" /> ఓపెన్ సోర్స్ సాఫ్ట్‌వేర్‌ <ph name="END_LINK_CROS_OSS" /> మూలంగానే సాధ్యమైంది.</translation>
 <translation id="6055895534982063517">కొత్త Chromium వెర్షన్ అందుబాటులో ఉంది, ఇది మునుపటి కంటే వేగవంతంగా ఉంటుంది.</translation>
@@ -150,6 +156,7 @@
 <translation id="6893813176749746474">Chromium నవీకరించబడింది, కానీ మీరు దీన్ని గత 30 రోజులుగా ఉపయోగించలేదు.</translation>
 <translation id="6964305034639999644">Chromium అజ్ఞా&amp;త విండోలో లింక్‌ను తెరువు</translation>
 <translation id="6990124437352146030">ఈ సైట్ కోసం మీ మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి Chromiumకు అనుమతి అవసరం</translation>
+<translation id="701244094609242530">Chromium మీ ఎక్స్‌టెన్షన్‌లను తనిఖీ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="705851970750939768">Chromiumను అప్‌డేట్ చేయి</translation>
 <translation id="7066436765290594559">Chromium OS మీ డేటాను సింక్ చేయ‌లేక‌పోయింది. దయచేసి మీ సింక్‌ రహస్య పదబంధాన్ని అప్‌డేట్ చేయండి.</translation>
 <translation id="7067091210845072982">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం ఒక వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. వివరణలను సృష్టించడానికి, చిత్రాలు Googleకు పంపబడతాయి.</translation>
@@ -190,6 +197,7 @@
 <translation id="8013436988911883588">ఓసారి Chromiumకి యాక్సెస్ లభించాక, ఆపై వెబ్‌సైట్‌లకు ఏమైనా యాక్సెస్‌ కావాలంటే అవి మిమ్మల్ని అడగవచ్చు.</translation>
 <translation id="81770708095080097">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chromium దీన్ని బ్లాక్ చేసింది.</translation>
 <translation id="8248265253516264921">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం ఒక వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. వివరణలను సృష్టించడానికి, చిత్రాలు Googleకు పంపబడతాయి. మీరు దీన్ని ఎప్పుడైనా సెట్టింగ్‌లలో ఆఫ్ చేయవచ్చు.</translation>
+<translation id="8266560134891435528">మీరు సైన్ ఇన్ చేయనందున Chromium మీ పాస్‌వర్డ్‌లను తనిఖీ చేయలేదు</translation>
 <translation id="8276522524898344151">పాస్‌వర్డ్‌లను కాపీ చేయడానికి Chromium ప్రయత్నిస్తోంది.</translation>
 <translation id="8290862415967981663">ఈ ఫైల్ అపాయకరం కావచ్చు, కాబట్టి Chromium దీన్ని బ్లాక్ చేసింది.</translation>
 <translation id="8330519371938183845">మీ పరికరాల అంతటా Chromiumను సింక్ చేయడానికి, వ్యక్తిగతీకరించడానికి సైన్ ఇన్ చేయండి</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb
index 7e4ff4a7..cb3848a8 100644
--- a/chrome/app/resources/chromium_strings_uz.xtb
+++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -43,6 +43,7 @@
 <translation id="2886012850691518054">Ixtiyoriy: Google’ga foydalanish statistikasi va ishdan chiqish hisobotlarini jo‘natish orqali Chromium’ni takomillashtirishga yordam bering</translation>
 <translation id="2910007522516064972">&amp;Chromium haqida</translation>
 <translation id="2977470724722393594">Siz Chromium brauzerining eng oxirgi versiyasidan foydalanyapsiz.</translation>
+<translation id="2983934633046890458">Chromium parollarni tahrirlashga urinmoqda.</translation>
 <translation id="3032706164202344641">Chromium parollaringizni tekshira olmadi. Keyinroq qayta urining.</translation>
 <translation id="3032787606318309379">Chromium‘ga o‘rnatilmoqda...</translation>
 <translation id="3068515742935458733">Google‘ga ishdan chiqishlar hisoboti va <ph name="UMA_LINK" />‘ni jo‘natib Chromium yaxshilanishiga yordam berish.</translation>
@@ -108,6 +109,7 @@
 <translation id="5479196819031988440">Chromium OS bu sahifani ocha olmaydi.</translation>
 <translation id="5480860683791598150">Bu sayt manzilingizdan foydalanishi uchun Chromium brauzeriga ruxsat berishingiz lozim</translation>
 <translation id="549669000822060376">Chromium tizimning oxirgi yangilanishlarini o‘rnatib olgunicha kutib turing.</translation>
+<translation id="5496810170689441661">Chromium parollarni tahrirlashga urinmoqda. Ruxsat berish uchun Windows parolingizni kiriting.</translation>
 <translation id="5623402015214259806">{0,plural, =0{Chromium uchun yangilanish mavjud}=1{Chromium uchun yangilanish mavjud}other{Chromium uchun yangilanish mavjud (# kun)}}</translation>
 <translation id="5631814766731275228">Chromium profili nomi va rasmi</translation>
 <translation id="5634636535844844681">Chromium brauzeri ishlashi uchun kompyuterda Windows 7 yoki undan yangiroq versiyadagi operatsion tizim o‘rnatilgan bo‘lishi lozim.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index a137578..f1cf019 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Lees en verander al jou data op die huidige webwerf wanneer dit opgeroep word</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> wil jou instellings terugstel.</translation>
 <translation id="1243314992276662751">Laai op</translation>
-<translation id="1243398753772016127">Werwe kan nie jou blaai-aktiwiteit op verskillende werwe gebruik om advertensies te personaliseer nie</translation>
 <translation id="1244265436519979884">Linux-terugstelling vind tans plaas</translation>
 <translation id="1244303850296295656">Uitbreidingfout</translation>
 <translation id="1246905108078336582">Verwyder voorstel van knipbord af?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Aan – gepasmaakte instellings</translation>
 <translation id="1489664337021920575">Kies 'n ander opsie</translation>
 <translation id="1493892686965953381">Wag tans vir <ph name="LOAD_STATE_PARAMETER" /> …</translation>
-<translation id="1494438840282430403">Vee ook blaaierdata uit (<ph name="URL" />), wat jou by Google.com kan afmeld.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ander beskikbare toestelle.</translation>
 <translation id="1495677929897281669">Terug na oortjie</translation>
 <translation id="1499271269825557605">As jy nie 'n uitbreiding herken nie, of as jou blaaier nie werk soos verwag nie, kan jy uitbreidings hier afskakel of pasmaak.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Hierdie ikoon sal sigbaar wees wanneer die uitbreiding op die huidige bladsy kan reageer. Gebruik hierdie uitbreiding deur op die ikoon te klik of deur <ph name="EXTENSION_SHORTCUT" /> te druk.</translation>
 <translation id="257779572837908839">Stel op as Chromebox vir vergaderings</translation>
 <translation id="2580889980133367162">Laat <ph name="HOST" /> altyd toe om veelvuldige lêers af te laai</translation>
-<translation id="2580924999637585241">Totaal: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lank</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kon nie Kerberos-kaartjie kry nie. Probeer weer of kontak jou organisasie se toesteladministrateur. (Foutkode: <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Opspringers geblokkeer:</translation>
 <translation id="480990236307250886">Maak die tuisblad oop</translation>
 <translation id="4811503964269049987">Groepeer geselekteerde oortjie</translation>
-<translation id="4811818760963189951">Afgeskakel omdat jy geskiedenissinkronisering gedeaktiveer het</translation>
 <translation id="4813136279048157860">My prente</translation>
 <translation id="4813512666221746211">Netwerkfout</translation>
 <translation id="4814378367953456825">Voer 'n naam in vir hierdie vingerafdruk</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Bykomende inhoudinstellings</translation>
 <translation id="5042282098504489593">Maak instellings oop om <ph name="USB_DEVICE_NAME" /> aan Linux te koppel</translation>
 <translation id="5043913660911154449">Of spesifiseer jou drukker se PPD <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Afgeskakel omdat jy jou sinkroniseringdata met 'n wagfrase geënkripteer het</translation>
 <translation id="5045550434625856497">Verkeerde wagwoord</translation>
 <translation id="504561833207953641">Maak tans in bestaande blaaiersessie oop.</translation>
 <translation id="5047421709274785093">Keer dat werwe beweging- en ligsensors gebruik</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">Net iemand met jou wagfrase kan jou geënkripteerde data lees. Die wagfrase word nie na Google gestuur of deur Google geberg nie. As jy jou wagfrase vergeet of hierdie instelling wil verander, sal jy <ph name="BEGIN_LINK" />sinkronisering moet terugstel<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Welkom by die <ph name="SHORT_PRODUCT_NAME" />-familie. Dit is geen gewone rekenaar nie.</translation>
 <translation id="6358884629796491903">Draak</translation>
-<translation id="6360719647236334056">Gebruik jou Chrome-blaaigeskiedenis om Search, advertensies en ander Google-dienste te personaliseer</translation>
 <translation id="6361850914223837199">Foutbesonderhede:</translation>
 <translation id="6362853299801475928">Gee 'n kwessie aan …</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Sê vir ons hoe ons vaar.</translation>
 <translation id="6759193508432371551">Fabriekterugstelling</translation>
 <translation id="6762833852331690540">Aan</translation>
-<translation id="6764693078871405569">Vee ook blaaierdata uit (<ph name="URL" />), wat jou by kan <ph name="DOMAIN" /> afmeld.</translation>
 <translation id="6767566652486411142">Kies 'n ander taal …</translation>
 <translation id="6767639283522617719">Kan nie by die domein aansluit nie. Maak seker dat die instellings vir die organisatoriese eenheid korrek is.</translation>
 <translation id="6769712124046837540">Voeg tans drukker by …</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 1b5f6c9..72c0827 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">ሲጠራ በአሁኑ ድር ጣቢያ ላይ ያለውን ውሂብ ሁሉ ያነብባል እና ይቀይራል</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ቅንብሮችዎን ዳግም ማስጀመር ይፈልጋሉ።</translation>
 <translation id="1243314992276662751">ስቀል</translation>
-<translation id="1243398753772016127">ጣቢያዎች ማስታወቂያዎችን ግላዊነት ለማላበስ የአሰሳ እንቅስቃሴዎን በተለያዩ ጣቢያዎች ላይ መጠቀም አይችሉም</translation>
 <translation id="1244265436519979884">Linux ወደነበረበት መመለስ አሁን በሂደት ላይ ነው</translation>
 <translation id="1244303850296295656">የቅጥያ ስህተት</translation>
 <translation id="1246905108078336582">የአስተያየት ጥቆማ ከቅንጥብ ሰሌዳ ይወገድ?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">በርቷል - ብጁ ቅንብሮች</translation>
 <translation id="1489664337021920575">ሌላ አማራጭ ይሞክሩ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />ን በመጠበቅ ላይ...</translation>
-<translation id="1494438840282430403">እርስዎን ከGoogle.com ሊያስወጣዎት የሚችለውን የአሰሳ ውሂብ (<ph name="URL" />) በተጨማሪ ያጽዱ።</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> የሚገኙ ሌሎች መሣሪያዎች።</translation>
 <translation id="1495677929897281669">ወደ ትር ተመለስ</translation>
 <translation id="1499271269825557605">ቅጥያን የማያውቁት ከሆነ ወይም የእርስዎ አሳሽ እንደሚጠበቀው እየሠራ ካልሆነ፣ ቅጥያዎችን እዚህ ላይ ማጥፋት ወይም ብጁ ማድረግ ይችላሉ።</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">ቅጥያው በአሁኑ ገጽ ላይ መስራት ሲችል ይህ አዶ የሚታይ ይሆናል። አዶውን ጠቅ በማድረግ ወይም <ph name="EXTENSION_SHORTCUT" />ን በመጫን ይህንን ቅጥያ ይጠቀሙበት።</translation>
 <translation id="257779572837908839">እንደ Chromebox ለስብሰባዎች ያዋቅሩ</translation>
 <translation id="2580889980133367162">ሁልጊዜም <ph name="HOST" /> ከአንድ በላይ ፋይሎችን እንዲያወርድ ይፍቀዱ</translation>
-<translation id="2580924999637585241">አጠቃላይ፦ <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ረጅም</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (የመሣሪያ ስርዓት <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">የKerberos ቲኬት ማግኘት አልተቻለም። እንደገና ይሞክሩ፣ ወይም የድርጅትዎን የመሣሪያ አስተዳዳሪ ያነጋግሩ። (የስህተት ኮድ፦ <ph name="ERROR_CODE" />)።</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">ብቅ-ባዮች ታግደዋል፦</translation>
 <translation id="480990236307250886">መነሻ ገጹን ክፈት</translation>
 <translation id="4811503964269049987">የተመረጠ ቡድንን ሰብስብ</translation>
-<translation id="4811818760963189951">እርስዎ የታሪክ ስምረትን ስላሰናከሉ ጠፍቷል</translation>
 <translation id="4813136279048157860">የእኔ ምስሎች</translation>
 <translation id="4813512666221746211">የአውታረ መረብ ስህተት</translation>
 <translation id="4814378367953456825">ለዚህ ጣት አሻራ ስም ያስገቡ</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">ተጨማሪ የይዘት ቅንብሮች</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />ን ከLinux ጋር ለማገናኘት ቅንብሮችን ይክፈቱ</translation>
 <translation id="5043913660911154449">ወይም የእርስዎን አታሚ PPD ይጥቀሱ <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">የስምረት ውሂብዎን በይለፍ ሐረግ ስላመሰጠሩት ጠፍቷል</translation>
 <translation id="5045550434625856497">ትክክል ያልሆነ የይለፍ ቃል</translation>
 <translation id="504561833207953641">በነባር የአሳሽ ክፍለ-ጊዜ ውስጥ በመክፈት ላይ።</translation>
 <translation id="5047421709274785093">ጣቢያዎች የእንቅስቃሴ እና የብርሃን ዳሳሾችን እንዳይጠቀሙ አግድ</translation>
@@ -3962,7 +3957,6 @@
 <translation id="63566973648609420">የእርስዎን የይለፍ ሐረግ ያለው ሰው ብቻ ነው የተመሰጠረ ውሂብዎን ማየት የሚችለው። የይለፍ ሐረጉ ለGoogle አይላክም ወይም በእሱ አይከማችም። የይለፍ ሐረግዎን ከረሱት <ph name="BEGIN_LINK" />ስምረትን ዳግም ማስጀመር<ph name="END_LINK" /> ይኖርብዎታል።</translation>
 <translation id="6357619544108132570">እንኳን ወደ የ<ph name="SHORT_PRODUCT_NAME" /> ቤተሰብ በደህና መጡ። ይሄ የተለመደው ኮምፒውተር አይደለም።</translation>
 <translation id="6358884629796491903">ድራጎን</translation>
-<translation id="6360719647236334056">ፍለጋን፣ ማስታወቂያዎችን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ የእርስዎን Chrome አሰሳ ታሪክ ይጠቀሙ</translation>
 <translation id="6361850914223837199">የስህተት ዝርዝሮች፦</translation>
 <translation id="6362853299801475928">&amp;ችግር ሪፖርት አድርግ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4240,7 +4234,6 @@
 <translation id="6758056191028427665">እንዴት እኛ እያደርግን እንደሆነ እንድናውቅ ያድርጉን።</translation>
 <translation id="6759193508432371551">የፋብሪካ ዳግም ማስጀመር</translation>
 <translation id="6762833852331690540">አብራ</translation>
-<translation id="6764693078871405569">እርስዎን ከ<ph name="DOMAIN" /> ሊያስወጣዎት የሚችለውን የአሰሳ ውሂብ (<ph name="URL" />) በተጨማሪ ያጽዱ።</translation>
 <translation id="6767566652486411142">ሌላ ቋንቋ ይምረጡ...</translation>
 <translation id="6767639283522617719">ጎራውን መቀላቀል አልተቻለም። ቅንብሮቹ ለድርጅታዊ አሃድ ትክክል መሆናቸውን ያረጋግጡ።</translation>
 <translation id="6769712124046837540">አታሚን በማከል ላይ...</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index def4027..912080c 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">قراءة جميع بياناتك وتغييرها على موقع الويب الحالي عند الاستدعاء</translation>
 <translation id="1242633766021457174">يريد <ph name="THIRD_PARTY_TOOL_NAME" /> إعادة ضبط إعداداتك.</translation>
 <translation id="1243314992276662751">تحميل</translation>
-<translation id="1243398753772016127">لا يمكن للمواقع الإلكترونية تخصيص الإعلانات بالاستناد إلى نشاط تصفّحك لمواقع إلكترونية أخرى.</translation>
 <translation id="1244265436519979884">‏استعادة Linux قيد التقدم حاليًا</translation>
 <translation id="1244303850296295656">خطأ في الإضافة</translation>
 <translation id="1246905108078336582">هل تريد إزالة اقتراح من الحافظة؟</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">قيد التفعيل - الإعدادات المخصصة</translation>
 <translation id="1489664337021920575">تحديد خيار آخر</translation>
 <translation id="1493892686965953381">في انتظار <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">‏محو بيانات التصفّح (<ph name="URL" />) أيضًا (قد يؤدي ذلك إلى تسجيل خروجك من Google.com.)</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> من الأجهزة الأخرى المتاحة.</translation>
 <translation id="1495677929897281669">الرجوع إلى علامة التبويب</translation>
 <translation id="1499271269825557605">في حال عدم التعرُّف على إحدى الإضافات أو في حال كان متصفّحك لا يعمل كما هو متوقع، يمكنك إيقاف الإضافات أو تخصيصها هنا.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">سيكون هذا الرمز مرئيًا عندما تتمكن الإضافة من تنفيذ الإجراءات على الصفحة الحالية. يمكنك استخدام هذه الإضافة بالنقر على الرمز أو بالضغط على <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">‏الإعداد كجهاز Chromebox للاجتماعات</translation>
 <translation id="2580889980133367162">السماح دائمًا لـ <ph name="HOST" /> بتنزيل عدة ملفات</translation>
-<translation id="2580924999637585241">الإجمالي: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">طويل</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (النظام الأساسي <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">‏تعذّر الحصول على تذكرة Kerberos. يُرجى إعادة المحاولة أو التواصل مع مشرف أجهزة مؤسستك. (رمز الخطأ <ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">تمّ حظر النوافذ المنبثقة:</translation>
 <translation id="480990236307250886">فتح الصفحة الرئيسية</translation>
 <translation id="4811503964269049987">إضافة علامة التبويب المحدّدة إلى مجموعة جديدة</translation>
-<translation id="4811818760963189951">تم إيقاف هذه الميزة بسبب إيقاف مزامنة السجلّ.</translation>
 <translation id="4813136279048157860">صوري</translation>
 <translation id="4813512666221746211">حدث خطأ في الشبكة</translation>
 <translation id="4814378367953456825">يُرجى إدخال اسم لبصمة الإصبع هذه</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">إعدادات المحتوى الإضافية</translation>
 <translation id="5042282098504489593">‏يُرجى الانتقال إلى "الإعدادات" لربط <ph name="USB_DEVICE_NAME" /> بنظام التشغيل Linux.</translation>
 <translation id="5043913660911154449">‏أو حدِّد ملف PPD للطابعة <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">تم الإيقاف بسبب ترميز البيانات المتزامنة باستخدام عبارة مرور.</translation>
 <translation id="5045550434625856497">كلمة مرور غير صحيحة</translation>
 <translation id="504561833207953641">جارٍ الفتح في جلسة المتصفِّح الحالي.</translation>
 <translation id="5047421709274785093">منع مواقع الويب من استخدام أجهزة استشعار الإضاءة والحركة</translation>
@@ -3964,7 +3959,6 @@
 <translation id="63566973648609420">‏لا يمكن لأحد قراءة بياناتك المشفرة سوى من لديه عبارة المرور التي تستخدمها. ولا يتم إرسال عبارة المرور إلى شركة Google أو تخزينها لديها. إذا نسيت عبارة المرور أو رغبت في تغيير هذا الإعداد، فسيلزمك <ph name="BEGIN_LINK" />إعادة ضبط المزامنة<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">مرحبًا بانضمامك إلى عائلة <ph name="SHORT_PRODUCT_NAME" />. معنا ستستمتع بجهاز كمبيوتر غير عادي.</translation>
 <translation id="6358884629796491903">تنين</translation>
-<translation id="6360719647236334056">‏استخدِم سجلّ التصفُّح في Chrome لتخصيص "بحث Google" والإعلانات وخدمات Google الأخرى.</translation>
 <translation id="6361850914223837199">تفاصيل الخطأ:</translation>
 <translation id="6362853299801475928">&amp;الإبلاغ عن مشكلة...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4242,7 +4236,6 @@
 <translation id="6758056191028427665">يُرجى تقييم أدائنا.</translation>
 <translation id="6759193508432371551">إعادة الضبط على الإعدادات الأصلية</translation>
 <translation id="6762833852331690540">مفعّل</translation>
-<translation id="6764693078871405569">محو بيانات التصفّح (<ph name="URL" />) أيضًا (سيؤدي ذلك إلى تسجيل خروجك من <ph name="DOMAIN" />.)</translation>
 <translation id="6767566652486411142">اختيار لغة أخرى...</translation>
 <translation id="6767639283522617719">يتعذَّر ضم الجهاز إلى النطاق. يُرجى التأكُّد من صحة الإعدادات في الوحدة التنظيمية.</translation>
 <translation id="6769712124046837540">جارٍ إضافة طابعة...</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 7c65632..75c2258c 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -187,7 +187,6 @@
 <translation id="1241753985463165747">অনুৰোধমৰ্মে বৰ্তমানৰ ৱেবছাইটটোত আপোনাৰ সকলো ডেটা পঢ়া আৰু সলনি কৰা</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />এ আপোনাৰ ছেটিংসমূহ ৰিছেট কৰিবলৈ বিচাৰিছে৷</translation>
 <translation id="1243314992276662751">আপল’ড কৰক</translation>
-<translation id="1243398753772016127">আপুনি বেলেগে বেলেগ ছাইটত কৰা ব্ৰাউজিং কাৰ্যকলাপ ছাইটসমূহে বিজ্ঞাপন ব্যক্তিগতকৃত কৰিবলৈ ব্যৱহাৰ কৰিব নোৱাৰে</translation>
 <translation id="1244265436519979884">বর্তমান Linuxক পুনঃস্থাপন কৰা প্ৰক্ৰিয়া চলি আছে</translation>
 <translation id="1244303850296295656">এক্সটেনশ্বনৰ আসোঁৱাহ</translation>
 <translation id="1246905108078336582">ক্লিপব’ৰ্ডৰ পৰা পৰামৰ্শ আঁতৰাবনে?</translation>
@@ -353,7 +352,6 @@
 <translation id="1487335504823219454">অন - কাষ্টম ছেটিং</translation>
 <translation id="1489664337021920575">অন্য বিকল্প বাছনি কৰক</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />লৈ অপেক্ষা কৰি থকা হৈছে...</translation>
-<translation id="1494438840282430403">ব্ৰাউজিঙৰ ডেটাও (<ph name="URL" />) মচক যি আপোনাক Google.comৰ পৰা ছাইন আউট কৰাব পাৰে।</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> অন্য উপলব্ধ ডিভাইচ।</translation>
 <translation id="1495677929897281669">টেবলৈ উভতি যাওক</translation>
 <translation id="1499271269825557605">আপুনি যদি কোনো এক্সটেনশ্বন চিনাক্ত কৰিব পৰা নাই অথবা আপোনাৰ ব্ৰাউজাৰটোৱে আশা কৰা ধৰণে কাম কৰা নাই, আপুনি ইয়াত এক্সটেনশ্বনসমূহ অফ অথবা কাষ্টমাইজ কৰিব পাৰে।</translation>
@@ -513,6 +511,7 @@
 <translation id="1697686431566694143">ফাইল সম্পাদনা কৰক</translation>
 <translation id="1698122934742150150">কেৱল বর্তমানৰ ইনক’গনিট’ ছেশ্বন</translation>
 <translation id="1698650002254827833">এপৰ সূচীখন ল’ড কৰিব নোৱাৰি। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক।</translation>
+<translation id="1700079447639026019">কেতিয়াও কুকিসমূহ ব্যৱহাৰ কৰিব নোৱৰা ছাইটসমূহ</translation>
 <translation id="1701062906490865540">এই লোকজনক আঁতৰাওক</translation>
 <translation id="1703331064825191675">আপোনাৰ পাছৱৰ্ডসমূহক লৈ কেতিয়াও চিন্তিত নহ’ব</translation>
 <translation id="1704970325597567340"><ph name="DATE" />ত সুৰক্ষা পৰীক্ষা চলোৱা হৈছে</translation>
@@ -730,6 +729,7 @@
 <translation id="1990512225220753005">এই পৃষ্ঠাটোত শ্বৰ্টকাটসমূহ নেদেখুৱাব</translation>
 <translation id="1992397118740194946">ছেট কৰা হোৱা নাই</translation>
 <translation id="1994173015038366702">ছাইট URL</translation>
+<translation id="1995916364271252349">ছাইটসমূহে কি তথ্য ব্যৱহাৰ কৰিব আৰু দেখুৱাব পাৰে সেয়া নিয়ন্ত্ৰণ কৰে (অৱস্থান, কেমেৰা, পপ-আপ আৰু বহুতো)</translation>
 <translation id="1997484222658892567">আপোনাৰ স্থানীয় কম্পিউটাৰত <ph name="URL" />এ স্থায়ীভাৱে বেছিকৈ ডেটা সঞ্চয় কৰিব বিচাৰে</translation>
 <translation id="1997616988432401742">আপোনাৰ প্ৰমাণপত্ৰ</translation>
 <translation id="1999115740519098545">আৰম্ভণি</translation>
@@ -985,6 +985,7 @@
 <translation id="2335111415680198280">{0,plural, =1{#খন ৱিণ্ড' বন্ধ কৰক}one{#খন ৱিণ্ড' বন্ধ কৰক}other{#খন ৱিণ্ড' বন্ধ কৰক}}</translation>
 <translation id="2335122562899522968">এই পৃষ্ঠাটোৱে কুকি ছেট কৰে।</translation>
 <translation id="2336228925368920074">সকলো টেব বুকমার্ক কৰক...</translation>
+<translation id="2336376423977300504">ৱিণ্ড'সমূহ বন্ধ হৈ থাকিলে সদায় কুকিসমূহ মচক</translation>
 <translation id="2336381494582898602">পাৱাৰৱাশ্ব</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" />এ যোৰা লাগিব খোজে</translation>
 <translation id="2342740338116612727">বুকমাৰ্ক যোগ কৰা হ’ল</translation>
@@ -1176,7 +1177,6 @@
 <translation id="2575247648642144396">এক্সটেনশ্বনটোৱে বর্তমানৰ পৃষ্ঠাটোত কার্য কৰিব পাৰিলে এই আইকনটো দেখা পোৱা যাব। আইকনটোত ক্লিক কৰি বা <ph name="EXTENSION_SHORTCUT" />ত টিপি এই এক্সটেনশ্বনটো ব্যৱহাৰ কৰক।</translation>
 <translation id="257779572837908839">বৈঠকৰ বাবে Chromebox হিচাপে ছেট আপ কৰক</translation>
 <translation id="2580889980133367162"><ph name="HOST" />ক সদায় একাধিক ফাইল ডাউনল’ড কৰিবলৈ অনুমতি দিয়ক</translation>
-<translation id="2580924999637585241">মুঠ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">দীঘল</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (প্লেটফ’র্ম <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos টিকেট লাভ কৰিব পৰা নগ’ল। আকৌ চেষ্টা কৰক অথবা আপোনাৰ প্ৰতিষ্ঠানৰ ডিভাইচ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক। (আসোঁৱাহ ক’ড <ph name="ERROR_CODE" />)।</translation>
@@ -1722,6 +1722,7 @@
 <translation id="3317459757438853210">পৃষ্ঠাখনৰ দুয়োফালে</translation>
 <translation id="3317678681329786349">কেমেৰা আৰু মাইক্ৰ’ফ’নৰ ব্যৱহাৰ অৱৰোধ কৰা হৈছে</translation>
 <translation id="3319048459796106952">নতুন &amp;ইনক'গনিট' ৱিণ্ড'</translation>
+<translation id="3320630259304269485">সুৰক্ষিত ব্ৰাউজিং (বিপজ্জনক ছাইটসমূহৰ পৰা সুৰক্ষা) আৰু অন্য সুৰক্ষা সম্পর্কীয় ছেটিংসমূহ</translation>
 <translation id="3323521181261657960">ব’নাছ! আপুনি আৰু বেছি স্ক্ৰীণ টাইম পাইছে</translation>
 <translation id="3325910708063135066">Mac ছিষ্টেম অগ্ৰাধিকাৰত কেমেৰা আৰু মাইক্ৰ’ফ’ন অফ কৰা আছে</translation>
 <translation id="3328489342742826322">বেকআপৰ পৰা পুনঃস্থাপন কৰিলে আপোনাৰ Linux ফাইলবোৰৰ ফ’ল্ডাৰত ইতিমধ্যে থকা Linux এপ্লিকেশ্বনটো মচি পেলাব।</translation>
@@ -1837,6 +1838,7 @@
 <translation id="3487007233252413104">পৰিচয়বিহীন ফাংশ্বন</translation>
 <translation id="348780365869651045">AppCacheৰ বাবে অপেক্ষা কৰি থকা হৈছে...</translation>
 <translation id="3488065109653206955">আংশিকভাৱে সক্ৰিয় কৰা হৈছে</translation>
+<translation id="3489025949017384019">বহুতো ছাইটে সঠিকভাৱে কাম নকৰিব পাৰে</translation>
 <translation id="3492788708641132712">ছিংক কৰা সুবিধাটোৱে কাম কৰা নাই। পুনৰ ছাইন ইন কৰি চেষ্টা কৰক।</translation>
 <translation id="3493486281776271508">ইণ্টাৰনেট সংযোগৰ আৱশ্যক</translation>
 <translation id="3493881266323043047">ব্যৱহাৰৰ সময়সীমা</translation>
@@ -1990,6 +1992,7 @@
 <translation id="3688526734140524629">চেনেল সলনি কৰক</translation>
 <translation id="3688578402379768763">আপ-টু-ডে’ট আছে</translation>
 <translation id="3688794912214798596">ভাষাসমূহ সলনি কৰক...</translation>
+<translation id="3690369331356918524">কোনো ডেটা উলংঘনৰ ফলত পাছৱৰ্ডসমূহ ফাদিল হ’লে আপোনাক সকীয়নি দিয়ে</translation>
 <translation id="3691231116639905343">কীব’র্ড এপ্</translation>
 <translation id="3691267899302886494"><ph name="HOST" />এ আপোনাৰ স্ক্ৰীণ শ্বেয়াৰ কৰিব বিচাৰে</translation>
 <translation id="369135240373237088">এটা বিদ্যালয় একাউণ্টৰ জৰিয়তে পুনৰ ছাইন ইন কৰক</translation>
@@ -2124,6 +2127,7 @@
 <translation id="3841964634449506551">অমান্য পাছৱৰ্ড</translation>
 <translation id="3842552989725514455">চেৰিফ ফণ্ট</translation>
 <translation id="3846116211488856547">ৱেবছাইট, Android এপ্ আৰু বহুতো কাম কৰিবলৈ সঁজুলি লাভ কৰক। Linux ইনষ্টল কৰিলে <ph name="DOWNLOAD_SIZE" /> পৰিমাণৰ ডেটা ডাউনল‘ড হ‘ব।</translation>
+<translation id="3847319713229060696">প্ৰত্যেকজন বাবে ৱেবত সুৰক্ষা উন্নত কৰাত সহায় কৰক</translation>
 <translation id="385051799172605136">উভতি যাওক</translation>
 <translation id="3850914401008572843">এই ফ’ল্ডাৰটোত ছিষ্টেম ফাইলসমূহ থকাৰ কাৰণে <ph name="ORIGIN" />এ ইয়াক খুলিব নোৱাৰে</translation>
 <translation id="3851428669031642514">অসুৰক্ষিত স্ক্ৰিপ্ট ল’ড কৰক</translation>
@@ -2594,6 +2598,7 @@
 <translation id="4534661889221639075">আকৌ চেষ্টা কৰক।</translation>
 <translation id="4535127706710932914">ডিফ’ল্ট প্ৰ’ফাইল</translation>
 <translation id="4535767533210902251">ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো আপোনাৰ কীব’ৰ্ডৰ একেবাৰে ওপৰৰ সোঁফালৰ কী-ত আছে। যিকোনো এটা আঙুলিৰে এইটো লাহেকৈ স্পর্শ কৰক।</translation>
+<translation id="4536140153723794651">যিকোনো সময়তে কুকিসমূহ ব্যৱহাৰ কৰিব পৰা ছাইটসমূহ</translation>
 <translation id="4538417792467843292">শব্দ মচক</translation>
 <translation id="4538684596480161368"><ph name="HOST" />ত সদায় আনছেণ্ডবক্স কৰা প্লাগইন অৱৰোধ কৰক</translation>
 <translation id="4538792345715658285">এণ্টাৰপ্ৰাইজৰ নীতিয়ে ইনষ্টল কৰিছে।</translation>
@@ -2688,6 +2693,7 @@
 <translation id="4665446389743427678"><ph name="SITE" />এ ষ্ট’ৰ কৰা সকলো ডেটা মচা যাব।</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />ক সক্ষম কৰিবলৈ ক্লিক কৰক</translation>
 <translation id="4670064810192446073">ভাৰ্চুৱেল ৰিয়েলিটি</translation>
+<translation id="4672879467403304774">আপুনি ছাইন ইন হৈ থকা অৱস্থাত Chrome আৰু অন্য Google এপ্‌সমূহত আপোনাক সুৰক্ষিত কৰি ৰাখে</translation>
 <translation id="46733273239502219">ইনষ্টল হৈ থকা এপ্‌সমূহত অফলাইন ডেটাও মচা হ’ব</translation>
 <translation id="4673442866648850031">ষ্টাইলাছ আঁতৰালে ষ্টাইলাছ সঁজুলিসমূহ খোলক</translation>
 <translation id="4677772697204437347">GPU মেম’ৰী</translation>
@@ -2771,7 +2777,6 @@
 <translation id="4808667324955055115">পপ-আপ অৱৰোধ কৰা হৈছে:</translation>
 <translation id="480990236307250886">গৃহ পৃষ্ঠাটো খোলক</translation>
 <translation id="4811503964269049987">বাছনি কৰা টেবৰ গোট বনাওক</translation>
-<translation id="4811818760963189951">আপুনি ইতিহাস ছিংক কৰাটো অক্ষম কৰাৰ বাবে অফ কৰা হৈছে</translation>
 <translation id="4813136279048157860">মোৰ প্ৰতিচ্ছবি</translation>
 <translation id="4813512666221746211">নেটৱৰ্কৰ আসোঁৱাহ</translation>
 <translation id="4814378367953456825">এই ফিংগাৰপ্ৰিণ্টটোৰ বাবে এটা নাম দিয়ক</translation>
@@ -2938,7 +2943,6 @@
 <translation id="5040823038948176460">সমলৰ অতিৰিক্ত ছেটিংসমূহ</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />ক Linuxৰ সৈতে সংযুক্ত কৰিবলৈ ছেটিংসমূহ খোলক</translation>
 <translation id="5043913660911154449">অথবা আপোনাৰ প্ৰিণ্টাৰ PPD নিৰ্দিষ্ট কৰক <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">আপুনি আপোনাৰ ছিংক ডেটা এটা পাছফ্ৰেজৰ সৈতে এনক্ৰিপ্ট কৰাৰ বাবে অফ কৰা হৈছে</translation>
 <translation id="5045550434625856497">ভুল পাছৱৰ্ড</translation>
 <translation id="504561833207953641">পূর্বে থকা ব্ৰাউজাৰ ছেশ্বনত খুলি আছে।</translation>
 <translation id="5047421709274785093">গতি আৰু পোহৰৰ ছেন্সৰ ব্যৱহাৰ কৰাৰ ক্ষেত্ৰত ছাইটবোৰক অৱৰোধ কৰক</translation>
@@ -3101,6 +3105,7 @@
 <translation id="5275352920323889391">কুকুৰ</translation>
 <translation id="527605982717517565"><ph name="HOST" />ত সদায় JavaScriptক অনুমতি দিয়ক</translation>
 <translation id="5280174558369304332">আঁতৰ হ'বলগীয়া এক্সটেনশ্বনসমূহ:</translation>
+<translation id="5280243692621919988">আপুনি সকলো ৱিণ্ড' বন্ধ কৰিলে কুকিসমূহ আৰু ছাইটৰ ডেটা মচক</translation>
 <translation id="5280426389926346830">শ্বৰ্টকাট সৃষ্টি কৰিবনে?</translation>
 <translation id="528208740344463258">Android এপ্‌ ডাউনল’ড কৰি ব্যৱহাৰ কৰিবলৈ আপুনি প্ৰথমতে প্ৰয়োজনীয় আপডে’টসমূহ ইনষ্টল কৰিব লাগিব। <ph name="DEVICE_TYPE" /> আপডে’ট হৈ থকা সময়ত আপুনি এইটো ব্যৱহাৰ কৰিব নোৱাৰে। ইনষ্টল হোৱা সম্পূৰ্ণ হ’লে আপোনাৰ <ph name="DEVICE_TYPE" /> ৰিষ্টাৰ্ট হ’ব।</translation>
 <translation id="5282733140964383898">"ট্ৰেক নকৰিব" সুবিধাটো সক্ষম কৰা মানে আপোনাৰ ব্ৰাজিং ট্ৰেফিকৰ সৈতে এটা অনুৰোধ অন্তর্ভুক্ত কৰা হ’ব। কোনো ৱেবছাইটে অনুৰোধটোক সঁহাৰি জনোৱা বা নজনোৱা আৰু অনুৰোধটো কেনেকৈ কার্যকৰী কৰে তাৰ ওপৰত ফলাফলসমূহ নির্ভৰ কৰে। উদাহৰণস্বৰূপে, কিছুমান ৱেবছাইটে আপোনাক আপুনি চোৱা অন্য ৱেবছাইটসমূহৰ ভিত্তিক নোহোৱা কিছুমান বিজ্ঞাপন প্ৰদর্শন কৰি এই অনুৰোধলৈ সঁহাৰি জনাব পাৰে। বহুতো ৱেবছাইটে তথাপিও আপোনাৰ ব্ৰাউজিং ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰিব - উদাহৰণস্বৰূপে সুৰক্ষা উন্নত কৰিবলৈ, সমল যোগান ধৰিবলৈ, সেই ৱেবছাইটসমূহত সেৱা, বিজ্ঞাপন আৰু চুপাৰিছসমূহ প্ৰদান কৰিবলৈ আৰু ৰিপর্টিং কৰা পৰিসংখ্যা সৃষ্টি কৰিবলৈ ডেটা সংগ্ৰহ আৰু ব্যৱহাৰ কৰিব। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation>
@@ -4176,10 +4181,10 @@
 <translation id="6758056191028427665">আমি কেনে প্ৰদৰ্শন কৰিছোঁ আমাক জনাওক৷</translation>
 <translation id="6759193508432371551">ফেক্টৰী ৰিছেট কৰক</translation>
 <translation id="6762833852331690540">অন আছে</translation>
-<translation id="6764693078871405569">ব্ৰাউজিঙৰ ডেটাও (<ph name="URL" />) মচক যি আপোনাক <ph name="DOMAIN" />ৰ পৰা ছাইন আউট কৰাব।</translation>
 <translation id="6767566652486411142">অন্য এটা ভাষা বাছনি কৰক...</translation>
 <translation id="6767639283522617719">ড’মেইনটোত যোগদান কৰিব নোৱাৰি। সংস্থাৰ ইউনিটৰ বাবে ছেটিংসমূহ শুদ্ধ বুলি নিশ্চিত কৰক।</translation>
 <translation id="6769712124046837540">প্ৰিণ্টাৰ যোগ কৰি থকা হৈছে...</translation>
+<translation id="6770602306803890733">আপোনাৰ লগতে ৱেবত থকা প্ৰত্যেকজনৰ বাবে সুৰক্ষা উন্নত কৰে</translation>
 <translation id="6770664076092644100">NFCৰ মাধ্যমেৰে সত্যাপন কৰক</translation>
 <translation id="6771503742377376720">এটা প্ৰমাণীকৰণ কৰ্তৃপক্ষ</translation>
 <translation id="6772339735733515807">আপোনাৰ এক্সটেনশ্বনসমূহ পৰিচালনা কৰক</translation>
@@ -4205,6 +4210,7 @@
 <translation id="6798578729981748444">আমদানি সম্পূর্ণ কৰিবলৈ Firefoxৰ সকলো ৱিণ্ড’ বন্ধ কৰক।</translation>
 <translation id="6798780071646309401">কেপছ লক অন আছে</translation>
 <translation id="6798954102094737107">প্লাগ ইন: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">সাধাৰণ ছেটিংসমূহ</translation>
 <translation id="6801435275744557998">টাচ্চ স্ক্ৰীণ কেলিব্ৰেট কৰক</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">ঠিক আছে</translation>
@@ -4320,6 +4326,8 @@
 <translation id="6965382102122355670">ঠিক আছে</translation>
 <translation id="6965648386495488594">পৰ্ট</translation>
 <translation id="6965978654500191972">ডিভাইচ</translation>
+<translation id="6966201992886493384">ছাইটসমূহে আপোনাৰ ব্ৰাউজিঙৰ অভিজ্ঞতা উন্নত কৰিবলৈ কুকিসমূহ ব্যৱহাৰ কৰিব পাৰে, যেনে, আপোনাক ছাইন ইন কৰি ৰাখিবলৈ অথবা আপোনাৰ শ্বপিং কার্টত থকা বস্তুবোৰ মনত ৰাখিবলৈ</translation>
+<translation id="696780070563539690">আপুনি বিভিন্ন ছাইটসমূহত কৰা ব্ৰাউজিঙৰ কার্যকলাপ চাবলৈ ছাইটসমূহে কুকিসমূহ ব্যৱহাৰ কৰিব নোৱাৰে, যেনে, বিজ্ঞাপন ব্যক্তিগতকৃত কৰিবলৈ</translation>
 <translation id="6968288415730398122">স্ক্ৰীণ লক কনফিগাৰ কৰিবলৈ নিজৰ পাছৱৰ্ড দিয়ক</translation>
 <translation id="6970480684834282392">ষ্টার্ট আপৰ প্ৰকাৰ</translation>
 <translation id="6970856801391541997">নির্দিষ্ট পৃষ্ঠা প্ৰিণ্ট কৰক</translation>
@@ -4723,6 +4731,7 @@
 <translation id="7507207699631365376">এই প্ৰদানকাৰীৰ <ph name="BEGIN_LINK" />গোপনীয়তাৰ নীতি<ph name="END_LINK" /> চাওক</translation>
 <translation id="7507930499305566459">স্থিতি উত্তৰদাতাৰ প্ৰমাণপত্ৰ</translation>
 <translation id="7508054832109420082">প্ৰিণ্টাৰসমূহ এক্সেছ কৰাৰ অনুমতি দিয়ক</translation>
+<translation id="751120035300339">ছাইটসমূহে আপোনাৰ ব্ৰাউজিঙৰ অভিজ্ঞতা উন্নত কৰিবলৈ কুকিসমূহ ব্যৱহাৰ কৰিব নোৱাৰে, যেনে, আপোনাক ছাইন ইন কৰি ৰাখিবলৈ অথবা আপোনাৰ শ্বপিং কার্টত থকা বস্তুবোৰ মনত ৰাখিবলৈ</translation>
 <translation id="7513029293694390567">ষ্ট’ৰ কৰি থোৱা ক্ৰিডেনশ্বিয়েল ব্যৱহাৰ কৰি ৱেবছাইটত স্বয়ংক্রিয়ভাৱে ছাইন ইন কৰক। যদি অক্ষম কৰি ৰখা হয় তেন্তে প্ৰতিবাৰ কোনো ৱেবছাইটত ছাইন ইন কৰাৰ সময়ত আপোনাক নিশ্চিত কৰিবলৈ কোৱা হ’ব।</translation>
 <translation id="7514239104543605883">আপোনাৰ ডিভাইচটোলৈ প্ৰতিলিপি কৰক</translation>
 <translation id="7514365320538308">ডাউনল'ড কৰক</translation>
@@ -5347,6 +5356,7 @@
 <translation id="8320459152843401447">আপোনাৰ সম্পূর্ণ স্ক্ৰীণ</translation>
 <translation id="8322814362483282060">এই পৃষ্ঠাটোৰ আপোনাৰ মাইক্ৰফ’নৰ এক্সেছ অৱৰোধ কৰি ৰখা হৈছিল।</translation>
 <translation id="8323167517179506834">URL টাইপ কৰক</translation>
+<translation id="8324784016256120271">আপুনি বিভিন্ন ছাইটসমূহত কৰা ব্ৰাউজিঙৰ কার্যকলাপ চাবলৈ ছাইটসমূহে কুকিসমূহ ব্যৱহাৰ কৰিব পাৰে, যেনে, বিজ্ঞাপন ব্যক্তিগতকৃত কৰিবলৈ</translation>
 <translation id="8326478304147373412">PKCS #7, প্ৰমাণপত্ৰ চ্চেইন</translation>
 <translation id="8327039559959785305">Linux ফাইল মাউণ্ট কৰি থাকোঁতে আসোঁৱাহ হ’ল। অনুগ্ৰহ কৰি আকৌ চেষ্টা কৰক।</translation>
 <translation id="8327676037044516220">অনুমতি আৰু সমলৰ ছেটিংসমূহ</translation>
@@ -5401,6 +5411,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> নেটৱৰ্ক, সংযোগ কৰি থকা হৈছে</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">প্ৰথমে সোধক (চুপাৰিছ কৰা)</translation>
+<translation id="8417573335434189196">আপোনাক বিপজ্জনক ৱেবছাইটসমূহ, ডাউনল'ডসমূহ অথবা এক্সটেনশ্বনসমূহৰ পৰা সুৰক্ষা প্ৰদান নকৰে। Chromeএ এই ছেটিংটো চুপাৰিছ নকৰে।</translation>
 <translation id="8418445294933751433">টেব হিচাপে &amp;দেখুৱাওক</translation>
 <translation id="8419098111404128271">’<ph name="SEARCH_TEXT" />’ৰ সন্ধানৰ ফলাফল</translation>
 <translation id="8419368276599091549">আপোনাৰ <ph name="DEVICE_TYPE" />লৈ স্বাগতম!</translation>
@@ -5564,6 +5575,7 @@
 <translation id="8642947597466641025">পাঠৰ আকাৰ ডাঙৰ কৰক</translation>
 <translation id="8644655801811752511">এই সুৰক্ষা চাবিটো ৰিছেট কৰিব নোৱাৰি। চাবিটো ভৰোৱাৰ লগে লগে সেইটো ৰিছেট কৰি চাওক।</translation>
 <translation id="8645354835496065562">ছেন্সৰৰ এক্সেছ প্ৰদান কৰা কার্য অব্যাহত ৰাখক</translation>
+<translation id="8645920082661222035">বিপজ্জনক ঘটনাবোৰৰ সম্পর্কে অনুমান কৰে আৰু সেইবোৰ ঘটাৰ পূর্বে আপোনাক সকীয়নি দিয়ে</translation>
 <translation id="8647834505253004544">ৱেব ঠিকনাটো মান্য নহয়</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> বা <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">যদিও আপুনি নিজৰ পুৰণি প্ৰ’ফাইলটো এক্সেছ কৰিব নোৱাৰে, তথাপি সেইটো আঁতৰাব পাৰে।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index c7675fd..843b350a 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -186,7 +186,6 @@
 <translation id="1241753985463165747">Lazım gəldiyi zaman cari veb səhifədə olan datanı oxuyun və dəyişdirin</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ayarlarınızı sıfırlamaq istəyir.</translation>
 <translation id="1243314992276662751">Yükləyin</translation>
-<translation id="1243398753772016127">Saytlar reklamları fərdiləşdirmək üçün müxtəlif saytlarda axtarış fəaliyyətinizi istifadə edə bilməz</translation>
 <translation id="1244265436519979884">Linux hazırda bərpa edilir</translation>
 <translation id="1244303850296295656">Artırma xətası</translation>
 <translation id="1246905108078336582">Təklif mübadilə buferindən silinsin?</translation>
@@ -353,7 +352,6 @@
 <translation id="1487335504823219454">Aktiv - xüsusi ayarlar</translation>
 <translation id="1489664337021920575">Fərqli seçim edin</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> üçün gözləyir...</translation>
-<translation id="1494438840282430403">Həmçinin baxış datasını (<ph name="URL" />) silin, bunun nəticəsində Google.com ünvanından çıxa bilərsiniz.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> başqa əlçatan cihazlar.</translation>
 <translation id="1495677929897281669">Taba geri qayıdın</translation>
 <translation id="1499271269825557605">Artırmanı tanımırsınızsa və ya brauzeriniz qaydasında işləmirsə, artırmaları burada deaktiv edə və ya fərdiləşdirə bilərsiniz.</translation>
@@ -1185,7 +1183,6 @@
 <translation id="2575247648642144396">Artırmalar cari səhifədə fəaliyyət göstərəndə bu ikona görünəcək. İkonaya klikləməklə və ya <ph name="EXTENSION_SHORTCUT" /> bu artırmanı istifadə edin.</translation>
 <translation id="257779572837908839">Görüşlər üçün Chromebox olaraq ayarlayın</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> hostuna çoxsaylı faylları endirməyə həmişə icazə verin</translation>
-<translation id="2580924999637585241">Toplam: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Uzun</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos bileti əldə edilmədi. Yenidən cəhd edin və ya cihaz admini ilə əlaqə saxlayın. (Xəta kodu <ph name="ERROR_CODE" />).</translation>
@@ -2812,7 +2809,6 @@
 <translation id="4808667324955055115">Popaplar blok edildi:</translation>
 <translation id="480990236307250886">Əsas səhifəni açın</translation>
 <translation id="4811503964269049987">Seçilmiş tabelin qrupa əlavə edilməsi</translation>
-<translation id="4811818760963189951">Tarixçə sinxronlaşdırmasını qeyri-aktiv etdiyiniz üçün deaktiv edilib</translation>
 <translation id="4813136279048157860">Şəkillərim</translation>
 <translation id="4813512666221746211">Şəbəkə xətası</translation>
 <translation id="4814378367953456825">Bu barmaq izi üçün ad daxil edin</translation>
@@ -2981,7 +2977,6 @@
 <translation id="5040823038948176460">Əlavə məzmun ayarları</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> cihazını Linux'a qoşmaq üçün Ayarları açın</translation>
 <translation id="5043913660911154449">Və ya printer PPD faylını təyin edin <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Sinxronlaşdırma datanızı parol ifadəsi ilə şifrlədiyiniz üçün deaktiv edilib</translation>
 <translation id="5045550434625856497">Yanlış parol</translation>
 <translation id="504561833207953641">Mövcud brauzer sessiyasında açılır.</translation>
 <translation id="5047421709274785093">Saytların hərəkət və işıq senorlarından istifadə etməsini blok edin</translation>
@@ -3956,7 +3951,6 @@
 <translation id="63566973648609420">Yalnız parol sözünüzü bilən adam şifrələnmiş məlumatınızı oxuya bilər. Parol söz Google tərəfindən göndərilmir və yadda saxlanılmır. Əgər parol sözü unutmusunuzsa və ya bu ayarı dəyişmək istəyirsinizsə <ph name="BEGIN_LINK" />sinxronizasiyanı sıfırlamalısınız<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> ailəsinə xoş gəlmisiniz. Bu, adi kompüter deyil.</translation>
 <translation id="6358884629796491903">Əjdaha</translation>
-<translation id="6360719647236334056">Axtarış, reklam və digər Google xidmətlərini fərdiləşdirmək üçün Chrome baxış tarixçənizdən istifadə edin</translation>
 <translation id="6361850914223837199">Xəta detalları:</translation>
 <translation id="6362853299801475928">Problemi xəbər verin...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4234,7 +4228,6 @@
 <translation id="6758056191028427665">Necə işlədiyimizi bizə bildirin.</translation>
 <translation id="6759193508432371551">Zavod Sıfırlaması</translation>
 <translation id="6762833852331690540">Aktiv</translation>
-<translation id="6764693078871405569">Həmçinin baxış datasını (<ph name="URL" />) silin, bunun nəticəsində <ph name="DOMAIN" /> ünvanından çıxacaqsınız.</translation>
 <translation id="6767566652486411142">Başqa Dil Seçin...</translation>
 <translation id="6767639283522617719">Domenə qoşulmaq alınmadı. Ayarların təşkilatı vahidlərə uyğun olduğuna əmin olun.</translation>
 <translation id="6769712124046837540">Printer əlavə olunur...</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 89c9081b..01b6f9bc 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Прагляд і змяненне любых вашых даных на бягучым вэб-сайце (пры выкліку)</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> запытвае дазвол скінуць налады.</translation>
 <translation id="1243314992276662751">Запампаваць</translation>
-<translation id="1243398753772016127">Сайты не могуць выкарыстоўваць вашы дзеянні ў браўзеры на розных сайтах, каб персаналізаваць рэкламу</translation>
 <translation id="1244265436519979884">Ідзе аднаўленне кантэйнера Linux</translation>
 <translation id="1244303850296295656">Памылка пашырэння</translation>
 <translation id="1246905108078336582">Выдаліць прапанову з буфера абмену?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Уключана – карыстальніцкія налады</translation>
 <translation id="1489664337021920575">Выбраць іншы варыянт</translation>
 <translation id="1493892686965953381">Чакаецца <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Таксама выдаліць гісторыю праглядаў сайта (<ph name="URL" />). (Гэта можа прывесці да выхаду з уліковага запісу на дамене Google.com.)</translation>
 <translation id="1495486559005647033">Іншых даступных прылад: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Вярнуцца на ўкладку</translation>
 <translation id="1499271269825557605">Тут вы можаце наладжваць пашырэнні або выключаць іх – у тым выпадку, калі вы не пазнаяце нейкае пашырэнне або калі браўзер перастае працаваць належным чынам.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Гэты значок будзе бачным, калі пашырэнне можа працаваць на бягучай старонцы. Каб выкарыстаць гэта пашырэнне, націсніце на значок або націсніце клавішы <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Задаць як Chromebox для сустрэч</translation>
 <translation id="2580889980133367162">Заўсёды дазваляць хосту <ph name="HOST" /> спампоўваць некалькі файлаў</translation>
-<translation id="2580924999637585241">Усяго: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Доўгая</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Не ўдалося атрымаць білет Kerberos. Паўтарыце спробу або звярніцеся да адміністратара прылад сваёй арганізацыі. (Код памылкі: <ph name="ERROR_CODE" />.)</translation>
@@ -2017,7 +2014,7 @@
 <translation id="3690369331356918524">Папярэджвае вас у выпадку, калі пры ўцечцы даных былі раскрыты паролі</translation>
 <translation id="3691231116639905343">Праграмы для клавіятуры</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> просіць вас абагуліць экран</translation>
-<translation id="369135240373237088">Увайдзіце з дапамогай школьнага ўліковага запісу</translation>
+<translation id="369135240373237088">Увайдзіце з дапамогай навучальнага ўліковага запісу</translation>
 <translation id="3693415264595406141">Пароль:</translation>
 <translation id="3694027410380121301">Выбраць папярэднюю ўкладку</translation>
 <translation id="369489984217678710">Паролі і іншыя даныя для ўваходу ў сістэму</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Заблакіраваны выплыўныя вокны:</translation>
 <translation id="480990236307250886">Адкрыць галоўную старонку</translation>
 <translation id="4811503964269049987">Дадаць выбраную ўкладку ў групу</translation>
-<translation id="4811818760963189951">Выключана, паколькі вы адключылі сінхранізацыю гісторыі</translation>
 <translation id="4813136279048157860">Мае відарысы</translation>
 <translation id="4813512666221746211">Памылка сеткі</translation>
 <translation id="4814378367953456825">Увядзіце назву для гэтага адбітка пальца</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Дадатковыя налады змесціва</translation>
 <translation id="5042282098504489593">Каб падключыць прыладу "<ph name="USB_DEVICE_NAME" />" да сістэмы Linux, адкрыйце Налады</translation>
 <translation id="5043913660911154449">Або ўкажыце файл PPD прынтара <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Выключана, паколькі вы зашыфравалі даныя сінхранізацыі з дапамогай фразы-пароля</translation>
 <translation id="5045550434625856497">Няправільны пароль</translation>
 <translation id="504561833207953641">Ідзе адкрыццё ў бягучым сеансе браўзера.</translation>
 <translation id="5047421709274785093">Заблакіраваць сайтам выкарыстанне датчыкаў руху і святла</translation>
@@ -3127,7 +3122,7 @@
 <translation id="5242724311594467048">Уключыць пашырэнне "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Паўтарыце спробу праз некалькі секунд</translation>
 <translation id="5244474230056479698">Сінхранізуецца з <ph name="EMAIL" /></translation>
-<translation id="5245610266855777041">Пачатак працы са школьным уліковым запісам</translation>
+<translation id="5245610266855777041">Пачатак працы з навучальным уліковым запісам</translation>
 <translation id="5246282308050205996">Збой праграмы "<ph name="APP_NAME" />". Націсніце на гэта ўсплывальнае папярэджанне, каб перазапусціць праграму.</translation>
 <translation id="5247051749037287028">Бачная назва (неабавязкова)</translation>
 <translation id="5249624017678798539">У браўзеры адбыўся збой пры незавершанай спампоўцы.</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Толькі карыстальнікі, якія ведаюць фразу-пароль, могуць чытаць вашы зашыфраваныя даныя. Google не адпраўляе і не захоўвае фразу-пароль. Калі вы не памятаеце фразу-пароль або хочаце змяніць гэту наладу, вам трэба <ph name="BEGIN_LINK" />скінуць сінхранізацыю<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Вітаем у сямействе <ph name="SHORT_PRODUCT_NAME" />. Гэта – не звычайны камп'ютар.</translation>
 <translation id="6358884629796491903">Дракон</translation>
-<translation id="6360719647236334056">Выкарыстоўвайце гісторыю прагляду сайтаў у Chrome, каб персаналізаваць Пошук, рэкламу і іншыя сэрвісы Google</translation>
 <translation id="6361850914223837199">Падрабязныя звесткі аб памылцы:</translation>
 <translation id="6362853299801475928">&amp;Паведаміць аб праблеме...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Паведаміце нам, што вы думаеце пра наш прадукт.</translation>
 <translation id="6759193508432371551">Скід да заводскіх налад</translation>
 <translation id="6762833852331690540">Уключана</translation>
-<translation id="6764693078871405569">Таксама выдаліць гісторыю праглядаў сайта (<ph name="URL" />). (Гэта прывядзе да выхаду з уліковага запісу на дамене <ph name="DOMAIN" />.)</translation>
 <translation id="6767566652486411142">Выбраць іншую мову...</translation>
 <translation id="6767639283522617719">Не ўдаецца далучыцца да дамена. Праверце правільнасць налад арганізацыйнай адзінкі.</translation>
 <translation id="6769712124046837540">Дадаецца прынтар...</translation>
@@ -4869,7 +4862,7 @@
 <translation id="761530003705945209">Рэзервовае капіраванне на Google Дыск. Лёгка аднаўляйце даныя і пераносьце іх на іншыя прылады. У рэзервовую копію ўваходзяць даныя праграм. Рэзервовыя копіі запампоўваюцца ў Google і шыфруюцца пад паролем ад вашага Уліковага запісу Google.</translation>
 <translation id="7616214729753637086">Прылада рэгіструецца...</translation>
 <translation id="7617366389578322136">Ідзе падключэнне да прылады "<ph name="DEVICE_NAME" />"</translation>
-<translation id="762068974690945752">Тут можна дадаць школьны ўліковы запіс або кіраваць уліковымі запісамі дзяцей. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
+<translation id="762068974690945752">Тут можна дадаць навучальны ўліковы запіс або кіраваць уліковымі запісамі дзяцей. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
 <translation id="7621382409404463535">Сістэме не ўдалося захаваць канфігурацыю прылады.</translation>
 <translation id="7622114377921274169">Ідзе зарадка.</translation>
 <translation id="7624337243375417909">Caps Lock выключаны</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 0e311a1..b8901978 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Четене и промяна на всичките ви данни в текущия уебсайт (при извикване)</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> иска да нулира настройките ви.</translation>
 <translation id="1243314992276662751">Качване</translation>
-<translation id="1243398753772016127">Сайтовете не могат да използват активността ви при сърфиране на различните сайтове, за да персонализират рекламите</translation>
 <translation id="1244265436519979884">В момента се извършва възстановяване на Linux</translation>
 <translation id="1244303850296295656">Грешка в разширението</translation>
 <translation id="1246905108078336582">Искате ли да премахнете предложението от буферната памет?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Включено – персонализирани настройки</translation>
 <translation id="1489664337021920575">Изберете друга опция</translation>
 <translation id="1493892686965953381">Изчаква се <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Също така изчистване на данните за сърфирането (<ph name="URL" />), което може да прекрати сесията ви в Google.com.</translation>
 <translation id="1495486559005647033">Още <ph name="NUM_PRINTERS" /> налични устройства.</translation>
 <translation id="1495677929897281669">Назад към раздела</translation>
 <translation id="1499271269825557605">Ако не разпознавате дадено разширение или браузърът ви не работи правилно, оттук можете да изключите или да персонализирате разширенията.</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Тази икона ще бъде видима, когато разширението може да изпълнява действия върху текущата страница. Използвайте го, като кликнете върху иконата или натиснете „<ph name="EXTENSION_SHORTCUT" />“.</translation>
 <translation id="257779572837908839">Настройване като Chromebox за срещи</translation>
 <translation id="2580889980133367162">Винаги да е разрешено на <ph name="HOST" /> да изтегля няколко файла</translation>
-<translation id="2580924999637585241">Общо: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Дълго</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Пропускът за Kerberos не можа да бъде получен. Опитайте отново или се обърнете към администратора на устройства за организацията си. (Код на грешката: <ph name="ERROR_CODE" />)</translation>
@@ -2818,7 +2815,6 @@
 <translation id="4808667324955055115">Изскачащите прозорци са блокирани:</translation>
 <translation id="480990236307250886">Отваряне на началната страница</translation>
 <translation id="4811503964269049987">Добавяне на избрания раздел към група</translation>
-<translation id="4811818760963189951">Изключена, защото сте деактивирали синхронизирането на историята</translation>
 <translation id="4813136279048157860">Моите изображения</translation>
 <translation id="4813512666221746211">Грешка в мрежата</translation>
 <translation id="4814378367953456825">Въведете име за този отпечатък</translation>
@@ -2987,7 +2983,6 @@
 <translation id="5040823038948176460">Допълнителни настройки за съдържанието</translation>
 <translation id="5042282098504489593">Отворете настройките, за да свържете <ph name="USB_DEVICE_NAME" /> с Linux</translation>
 <translation id="5043913660911154449">Или посочете PPD файла за принтера си. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Изключена, защото шифровате синхронизираните си данни посредством пропуск</translation>
 <translation id="5045550434625856497">Грешна парола</translation>
 <translation id="504561833207953641">Отваря се в съществуваща сесия на браузъра.</translation>
 <translation id="5047421709274785093">Забраняване на сайтовете да използват сензори за движение и светлина</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Само някой с пропуска ви може да прочете шифрованите ви данни – той не се изпраща до Google, нито се съхранява от нас. Ако го забравите или искате да промените тази настройка, ще се наложи <ph name="BEGIN_LINK" />да нулирате синхронизирането<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Добре дошли в семейството на <ph name="SHORT_PRODUCT_NAME" />. Това не е обикновен компютър.</translation>
 <translation id="6358884629796491903">Дракон</translation>
-<translation id="6360719647236334056">Използване на историята ви на сърфиране в Chrome за персонализиране на търсенето, рекламите и други услуги на Google</translation>
 <translation id="6361850914223837199">Подробности за грешката:</translation>
 <translation id="6362853299801475928">&amp;Подаване на сигнал за проблем...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Уведомете ни как се справяме.</translation>
 <translation id="6759193508432371551">Възстановяване на фабричните настройки</translation>
 <translation id="6762833852331690540">Включено</translation>
-<translation id="6764693078871405569">Също така изчистване на данните за сърфирането (<ph name="URL" />), при което ще излезете от <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Избор на друг език...</translation>
 <translation id="6767639283522617719">Присъединяването към домейна не успя. Проверете дали настройките за организационната единица са правилни.</translation>
 <translation id="6769712124046837540">Добавяне на принтер...</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index f244869..ff5135f 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">চালু করলে বর্তমান ওয়েবসাইটের সব ডেটা পড়ে ও পরিবর্তন করে</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> আপনার সেটিংস রিসেট করতে চায়।</translation>
 <translation id="1243314992276662751">আপলোড</translation>
-<translation id="1243398753772016127">বিজ্ঞাপন নিজের মতো করে সাজিয়ে নিতে Sites আপনার অন্যান্য সাইটে করা ব্রাউজিং অ্যাক্টিভিটি ব্যবহার করতে পারবে না</translation>
 <translation id="1244265436519979884">বর্তমানে Linux ফিরিয়ে আনার কাজ চলছে</translation>
 <translation id="1244303850296295656">এক্সটেনশন সমস্যা</translation>
 <translation id="1246905108078336582">ক্লিপবোর্ড থেকে সাজেশন সরাতে চান?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">চালু - কাস্টম সেটিংস</translation>
 <translation id="1489664337021920575">অন্য বিকল্প বেছে নিন</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />এর জন্য প্রতীক্ষারত...</translation>
-<translation id="1494438840282430403">এছাড়াও ব্রাউজিং ডেটা (<ph name="URL" />) মুছে দিলে আপনি হয়ত Google.com থেকে সাইন-আউট হয়ে যাবেন।</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" />টি অন্যান্য উপলব্ধ ডিভাইস৷</translation>
 <translation id="1495677929897281669">ট্যাবে ফিরে যান</translation>
 <translation id="1499271269825557605">আপনি যদি এক্সটেনশন শনাক্ত করতে না পারেন অথবা আপনার ব্রাউজার প্রত্যাশা অনুয়ায়ী কাজ না করলে, এখান থেকে এক্সটেনশন বন্ধ বা কাস্টমাইজ করতে পারেন।</translation>
@@ -1186,7 +1184,6 @@
 <translation id="2575247648642144396">এই আইকনটি দৃশ্যমান হবে যখন এক্সটেনশন বর্তমান পৃষ্ঠার উপর কাজ করতে পারবে৷ আইকনে ক্লিক করে বা <ph name="EXTENSION_SHORTCUT" /> টিপে এই এক্সটেনশন ব্যবহার করুন৷</translation>
 <translation id="257779572837908839">মিটিংয়ের জন্য Chromebox সেট-আপ করুন</translation>
 <translation id="2580889980133367162">একাধিক ফাইল ডাউনলোড করতে <ph name="HOST" />-কে সবসময় অনুমতি দিন</translation>
-<translation id="2580924999637585241">মোট: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">দীর্ঘ সময়</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (প্ল্যাটফর্ম <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos টিকিট পাওয়া যায়নি। আবার চেষ্টা করুন অথবা আপনার সংস্থার ডিভাইস অ্যাডমিনের সাথে যোগাযোগ করুন। (সমস্যার কোড <ph name="ERROR_CODE" />)।</translation>
@@ -2527,7 +2524,7 @@
 <translation id="439266289085815679"><ph name="USER_EMAIL" /> এর মাধ্যমে ব্লুটুথ কনফিগারেশন নিয়ন্ত্রিত হয়।</translation>
 <translation id="4392896746540753732">কনফিগারেশন ফাইল এডিট করুন</translation>
 <translation id="4394049700291259645">বন্ধ</translation>
-<translation id="439817266247065935">আপনার ডিভাইস ভালভাবে বন্ধ করা হয়নি। Linux অ্যাপ ব্যবহার করার জন্য Linux রিস্টার্ট করুন।</translation>
+<translation id="439817266247065935">আপনার ডিভাইস সঠিকভাবে বন্ধ করা হয়নি। Linux অ্যাপ ব্যবহার করার জন্য Linux রিস্টার্ট করুন।</translation>
 <translation id="4400367121200150367">যে সাইটগুলি কখনও পাসওয়ার্ড সংরক্ষণ করে না সেগুলি এখানে দেখা যাবে</translation>
 <translation id="4400632832271803360">সবথেকে উপরের-সারির কীগুলির আচরণ পরিবর্তন করতে লঞ্চার কী ধরে থাকুন</translation>
 <translation id="4400963414856942668">স্টার আইকনে ক্লিক করে কোনও ট্যাবকে বুকমার্ক করতে পারেন</translation>
@@ -2808,7 +2805,6 @@
 <translation id="4808667324955055115">পপ-আপগুলি ব্লক করা হয়েছে:</translation>
 <translation id="480990236307250886">হোম পৃষ্ঠাটি খুলুন</translation>
 <translation id="4811503964269049987">বেছে নেওয়া ট্যাবকে নতুন কোনও গ্রুপে যুক্ত করুন</translation>
-<translation id="4811818760963189951">আপনি ইতিহাস সিঙ্ক করা বন্ধ করে দিয়েছেন তাই এটি বন্ধ হয়ে গেছে</translation>
 <translation id="4813136279048157860">আমার ছবি</translation>
 <translation id="4813512666221746211">নেটওয়ার্ক  ত্রুটি</translation>
 <translation id="4814378367953456825">এই আঙুলের ছাপের একটি নাম লিখুন</translation>
@@ -2977,7 +2973,6 @@
 <translation id="5040823038948176460">অতিরিক্ত কন্টেন্ট সেটিংস</translation>
 <translation id="5042282098504489593">Linux-এ <ph name="USB_DEVICE_NAME" /> যোগ করতে সেটিংস চালু করুন</translation>
 <translation id="5043913660911154449">অথবা আপনার নির্দিষ্ট প্রিন্টার PPD ফাইলটি বেছে নিন <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">একটি পাসফ্রেজ দিয়ে আপনার সিঙ্ক ডেটা এনক্রিপ্ট করেছেন তাই এটি বন্ধ করা হয়েছে</translation>
 <translation id="5045550434625856497">ভুল পাসওয়ার্ড</translation>
 <translation id="504561833207953641">আগে থেকে থাকা ব্রাউজার সেশনে খোলা হচ্ছে।</translation>
 <translation id="5047421709274785093">মোশন এবং হাল্কা সেন্সর ব্যবহার করা থেকে সাইটকে ব্লক করুন</translation>
@@ -3955,7 +3950,6 @@
 <translation id="63566973648609420">শুধুমাত্র আপনার পাসফ্রেজসহ কোনো ব্যক্তি আপনার এনক্রিপ্ট করা ডেটা পড়তে পারবেন৷ পাসফ্রেজটি Google-এ পাঠানো হয় না বা এর দ্বারা সংরক্ষণ করা হয় না৷ যদি আপনি আপনার পাসফ্রেজ ভুলে যান বা এই সেটিং পরিবর্তন করতে চান, তাহলে আপনাকে <ph name="BEGIN_LINK" />সিঙ্ক রিসেট<ph name="END_LINK" /> করতে হবে।</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> পরিবারে স্বাগতম৷ এটি কোনো সাধারণ কম্পিউটার নয়৷</translation>
 <translation id="6358884629796491903">ড্রাগন</translation>
-<translation id="6360719647236334056">সার্চ করা, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Chrome-এর ব্রাউজিং ইতিহাস ব্যবহার করুন</translation>
 <translation id="6361850914223837199">ত্রুটির বিশদ বিবরণ:</translation>
 <translation id="6362853299801475928">&amp;কোনও সমস্যা অভিযোগ করুন...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4233,7 +4227,6 @@
 <translation id="6758056191028427665">আমাদের পরিষেবা কেমন লাগছে তা জানান।</translation>
 <translation id="6759193508432371551">ফ্যাক্টরি রিসেট</translation>
 <translation id="6762833852331690540">চালু করা আছে</translation>
-<translation id="6764693078871405569">এছাড়াও ব্রাউজিং ডেটা (<ph name="URL" />) মুছে দিলে আপনি <ph name="DOMAIN" /> থেকে সাইন-আউট হয়ে যাবেন।</translation>
 <translation id="6767566652486411142">অন্য ভাষা বেছে নিন...</translation>
 <translation id="6767639283522617719">ডোমেনে যোগ করা যাবে না। প্রতিষ্ঠানের ইউনিটের জন্য সেটিংস সঠিক কিনা ভাল করে দেখে নিন।</translation>
 <translation id="6769712124046837540">প্রিন্টার যোগ করা হচ্ছে...</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb
index 7658bfd2..0dcabda6 100644
--- a/chrome/app/resources/generated_resources_bs.xtb
+++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Čita i mijenja sve vaše podatke na trenutnoj web lokaciji kada se pozove</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> želi vratiti vaše postavke na zadano.</translation>
 <translation id="1243314992276662751">Otpremi</translation>
-<translation id="1243398753772016127">Web lokacije ne mogu koristiti vašu aktivnost pregledanja na različitim web lokacijama radi prilagođavanja oglasa</translation>
 <translation id="1244265436519979884">Vraćanje Linuxa je trenutno u toku</translation>
 <translation id="1244303850296295656">Greška ekstenzije</translation>
 <translation id="1246905108078336582">Ukloniti prijedlog iz međumemorije?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Uključeno – prilagođene postavke</translation>
 <translation id="1489664337021920575">Odaberite drugu opciju</translation>
 <translation id="1493892686965953381">Čeka se <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Također obrišite podatke pregledanja (<ph name="URL" />), što vas može odjaviti s domene Google.com.</translation>
 <translation id="1495486559005647033">Broj drugih dostupnih uređaja: <ph name="NUM_PRINTERS" /></translation>
 <translation id="1495677929897281669">Natrag na karticu</translation>
 <translation id="1499271269825557605">Ako ne prepoznajete ekstenziju ili ako vaš preglednik ne funkcionira kako bi trebalo, ovdje možete isključiti ili prilagoditi ekstenzije.</translation>
@@ -1052,7 +1050,7 @@
 <translation id="241082044617551207">Nepoznati dodatak</translation>
 <translation id="2412593942846481727">Ažuriranje je dostupno</translation>
 <translation id="2413749388954403953">Promijeni korisnički interfejs oznaka</translation>
-<translation id="2417206894320497232">Plugin VM je spreman za upotrebu.</translation>
+<translation id="2417206894320497232">Plugin VM je spreman za upotrebu.</translation>
 <translation id="241727068219398187">Podaci su šifrirani vašom šifrom za Google od
           <ph name="TIME" />. Ovo ne uključuje načine plaćanja i adrese s Google Paya.</translation>
 <translation id="2419706071571366386">Radi sigurnosti, odjavite se kada vaš računar nije u upotrebi.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ikona će se vidjeti kada ekstenzija može djelovati na trenutnoj stranici. Da koristite ovu ekstenziju kliknite na ikonu ili pritisnite tipke prečice <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Postavite kao Chromebox za sastanke</translation>
 <translation id="2580889980133367162">Uvijek dozvoli da <ph name="HOST" /> preuzima višestruke fajlove</translation>
-<translation id="2580924999637585241">Ukupno: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Duga</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Preuzimanje Kerberos tiketa nije uspjelo. Pokušajte ponovo ili se obratite administratoru uređaja organizacije. (Kȏd greške: <ph name="ERROR_CODE" />).</translation>
@@ -2017,7 +2014,7 @@
 <translation id="3690369331356918524">Upozorava vas ako su lozinke izložene pri narušavanju podataka</translation>
 <translation id="3691231116639905343">Tipkovnice</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> želi dijeliti vaš ekran</translation>
-<translation id="369135240373237088">Prijavite se ponovo sa školskim računom</translation>
+<translation id="369135240373237088">Prijavi se ponovo sa školskim računom</translation>
 <translation id="3693415264595406141">Lozinka:</translation>
 <translation id="3694027410380121301">Odaberi prethodnu karticu</translation>
 <translation id="369489984217678710">Lozinke i drugi podaci za prijavu</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Skočni prozori su blokirani:</translation>
 <translation id="480990236307250886">Otvorite početnu stranicu</translation>
 <translation id="4811503964269049987">Dodaj odabranu karticu u grupu</translation>
-<translation id="4811818760963189951">Isključeno jer ste onemogućili sinhroniziranje historije</translation>
 <translation id="4813136279048157860">Moje slike</translation>
 <translation id="4813512666221746211">Greška na mreži</translation>
 <translation id="4814378367953456825">Unesite naziv za ovaj otisak prsta</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Dodatne postavke sadržaja</translation>
 <translation id="5042282098504489593">Otvorite Postavke da biste povezali uređaj <ph name="USB_DEVICE_NAME" /> s Linuxom</translation>
 <translation id="5043913660911154449">Ili navedite PPD štampača <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Isključeno je jer ste šifrirali svoje sinhronizirane podatke pristupnim izrazom</translation>
 <translation id="5045550434625856497">Pogrešna lozinka</translation>
 <translation id="504561833207953641">Otvaranje u postojećoj sesiji preglednika.</translation>
 <translation id="5047421709274785093">Web-lokacijama nije dopuštena upotreba senzora pokreta i osvjetljenja</translation>
@@ -3127,7 +3122,7 @@
 <translation id="5242724311594467048">Omogućiti "<ph name="EXTENSION_NAME" />"?</translation>
 <translation id="5243522832766285132">Pokušajte ponovo za nekoliko trenutaka</translation>
 <translation id="5244474230056479698">Sinhroniziranje s korisničkim računom <ph name="EMAIL" /></translation>
-<translation id="5245610266855777041">Počnite koristiti školski račun</translation>
+<translation id="5245610266855777041">Počni koristiti školski račun</translation>
 <translation id="5246282308050205996">Došlo je do pada aplikacije <ph name="APP_NAME" />. Kliknite na ovaj balon da ponovo pokrenete aplikaciju.</translation>
 <translation id="5247051749037287028">Ime za prikaz (izborno)</translation>
 <translation id="5249624017678798539">Preglednik se srušio prije nego što je preuzimanje završeno.</translation>
@@ -3143,7 +3138,7 @@
 <translation id="5260508466980570042">Žao nam je, ne možemo potvrditi vašu adresu e-pošte ili lozinku. Pokušajte ponovo.</translation>
 <translation id="5261683757250193089">Otvori u Web trgovini</translation>
 <translation id="5262178194499261222">Ukloni lozinku</translation>
-<translation id="5263468185123738872">Pokrenite Plugin VM da instalirate operativni sistem za goste.</translation>
+<translation id="5263468185123738872">Pokrenite Plugin VM da instalirate operativni sistem za goste.</translation>
 <translation id="5264148714798105376">Ovo može potrajati minut ili više.</translation>
 <translation id="5264252276333215551">Povežite se na internet da pokrenete aplikaciju u načinu rada kioska.</translation>
 <translation id="5265562206369321422">Van mreže duže od sedmicu dana</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Vaše šifrirane podatke može čitati isključivo osoba koja ima vašu šifru za pristup. Šifra za pristup se ne šalje Googleu niti je Google pohranjuje. Ukoliko zaboravite šifru za pristup ili želite promijeniti ovu postavku, morat ćete <ph name="BEGIN_LINK" />poništiti sinhronizaciju<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Dobro došli u porodicu proizvoda <ph name="SHORT_PRODUCT_NAME" />. Ovo nije obični računar.</translation>
 <translation id="6358884629796491903">Zmaj</translation>
-<translation id="6360719647236334056">Koristite historiju pregledanja Chromea da personalizirate Pretraživanje, oglase i druge Googleove usluge</translation>
 <translation id="6361850914223837199">Detalji o grešci</translation>
 <translation id="6362853299801475928">&amp;Prijavi problem...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Recite nam koliko ste zadovoljni nama.</translation>
 <translation id="6759193508432371551">Vraćanje na fabričke postavke</translation>
 <translation id="6762833852331690540">Uključeno</translation>
-<translation id="6764693078871405569">Također obrišite podatke pregledanja (<ph name="URL" />), što vas može odjaviti s domene <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Odaberite drugi jezik...</translation>
 <translation id="6767639283522617719">Nije se moguće pridružiti domeni. Provjerite jesu li postavke tačne za organizacionu jedinicu.</translation>
 <translation id="6769712124046837540">Dodavanje štampača...</translation>
@@ -5699,7 +5692,7 @@
 <translation id="8688672835843460752">Dostupno</translation>
 <translation id="8691418731028620688">Povežite se na WiFi</translation>
 <translation id="8695825812785969222">Otvori &amp;lokaciju...</translation>
-<translation id="8698269656364382265">Da se vratite na prethodni ekran, prevucite prstom s lijeve strane.</translation>
+<translation id="8698269656364382265">Da se vratite na prethodni ekran, prevucite prstom slijeva nadesno.</translation>
 <translation id="869884720829132584">Meni aplikacija</translation>
 <translation id="869891660844655955">Datum isteka</translation>
 <translation id="8703346390800944767">Preskoči oglas</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 8778aa2..95f3c52 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Llegir i modificar totes les teves dades del lloc web que estàs visitant quan s'invoqui</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> vol restablir la vostra configuració.</translation>
 <translation id="1243314992276662751">Penja</translation>
-<translation id="1243398753772016127">Els llocs web no poden fer servir la teva activitat de navegació en diferents llocs web per personalitzar els anuncis</translation>
 <translation id="1244265436519979884">Hi ha una restauració de Linux en curs</translation>
 <translation id="1244303850296295656">Error d'extensió</translation>
 <translation id="1246905108078336582">Vols suprimir el suggeriment del porta-retalls?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Sincronització activada: configuració personalitzada</translation>
 <translation id="1489664337021920575">Tria una altra opció</translation>
 <translation id="1493892686965953381">S'està esperant <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Esborra també les dades de navegació (<ph name="URL" />). Pot ser que, en fer-ho, se't tanqui la sessió de Google.com.</translation>
 <translation id="1495486559005647033">Hi ha disponibles <ph name="NUM_PRINTERS" /> dispositius més.</translation>
 <translation id="1495677929897281669">Torna a la pestanya</translation>
 <translation id="1499271269825557605">Si no reconeixes una extensió o si el navegador no funciona de la manera esperada, pots desactivar o personalitzar les extensions aquí.</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">Aquesta icona serà visible quan les extensions puguin actuar a la pàgina actual. Per fer servir aquesta extensió, feu clic a la icona o premeu <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Estableix com a Chromebox per a reunions</translation>
 <translation id="2580889980133367162">Permet sempre que <ph name="HOST" /> baixi diversos fitxers</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Llarg</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plataforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">No s'ha pogut obtenir el tiquet de Kerberos. Torna-ho a provar o contacta amb l'administrador del dispositiu de la teva organització. (Codi d'error: <ph name="ERROR_CODE" />).</translation>
@@ -2722,7 +2719,7 @@
 <translation id="4659077111144409915">Compte principal</translation>
 <translation id="4660476621274971848">La versió esperada era <ph name="EXPECTED_VERSION" />, però la que hi havia era <ph name="NEW_ID" /></translation>
 <translation id="4660838440047236328">la distribució de la teva habitació</translation>
-<translation id="4661407454952063730">Les dades de les aplicacions poden ser qualsevol informació que les aplicacions desin (en funció de la configuració del desenvolupador), com ara els contactes, els missatges i les fotos.</translation>
+<translation id="4661407454952063730">Les dades de les aplicacions poden ser qualsevol mena de dada que hagi desat una aplicació (en funció de la configuració del desenvolupador), com ara els contactes, els missatges i les fotos.</translation>
 <translation id="4661931051827810091">Envia URL anònims d'algunes pàgines que visites, informació limitada del sistema i part del contingut de les pàgines per ajudar a detectar i bloquejar amenaces noves contra tots els usuaris del web.</translation>
 <translation id="4662788913887017617">Comparteix aquesta adreça d'interès amb el teu iPhone</translation>
 <translation id="4663373278480897665">La càmera es pot utilitzar</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">S'han bloquejat les finestres emergents:</translation>
 <translation id="480990236307250886">Obre la pàgina d'inici</translation>
 <translation id="4811503964269049987">Agrupa la pestanya seleccionada</translation>
-<translation id="4811818760963189951">S'ha desactivat perquè has desactivat la sincronització de l'historial</translation>
 <translation id="4813136279048157860">Les meves imatges</translation>
 <translation id="4813512666221746211">Error de la xarxa</translation>
 <translation id="4814378367953456825">Introdueix un nom per a aquesta empremta digital</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Configuració addicional del contingut</translation>
 <translation id="5042282098504489593">Obre Configuració per connectar <ph name="USB_DEVICE_NAME" /> a Linux</translation>
 <translation id="5043913660911154449">També pots especificar el fitxer PPD de la teva impressora. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">S'ha desactivat perquè has encriptat les dades de sincronització amb una frase de contrasenya</translation>
 <translation id="5045550434625856497">Contrasenya incorrecta</translation>
 <translation id="504561833207953641">S'està obrint a la sessió actual del navegador.</translation>
 <translation id="5047421709274785093">Impedeix que els llocs web utilitzin els sensors de moviment i de llum</translation>
@@ -3964,7 +3959,6 @@
 <translation id="63566973648609420">Només els usuaris que sàpiguen la teva frase de contrasenya poden llegir les dades que encriptis. La frase de contrasenya no s'envia a Google, ni Google l'emmagatzema. Si l'oblides o vols canviar aquesta configuració, hauràs de <ph name="BEGIN_LINK" />restablir la sincronització<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Us donem la benvinguda a la família <ph name="SHORT_PRODUCT_NAME" />. Aquest no és un ordinador convencional.</translation>
 <translation id="6358884629796491903">Drac</translation>
-<translation id="6360719647236334056">Utilitza l'historial de navegació de Chrome per personalitzar la Cerca, els anuncis i altres serveis de Google</translation>
 <translation id="6361850914223837199">Detalls de l'error:</translation>
 <translation id="6362853299801475928">&amp;Informa d'un problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4242,7 +4236,6 @@
 <translation id="6758056191028427665">Digue'ns si ho estem fent bé.</translation>
 <translation id="6759193508432371551">Restabliment de fàbrica</translation>
 <translation id="6762833852331690540">Activat</translation>
-<translation id="6764693078871405569">Esborra també les dades de navegació (<ph name="URL" />). En fer-ho, se't tancarà la sessió del domini <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Tria un altre idioma...</translation>
 <translation id="6767639283522617719">No es pot connectar el domini. Comprova que la configuració sigui l'adequada per a la unitat organitzativa.</translation>
 <translation id="6769712124046837540">S'està afegint la impressora...</translation>
@@ -5243,7 +5236,7 @@
 <translation id="8068809649322155577">Amb aquesta acció s'esborraran totes les dades i galetes emmagatzemades per <ph name="SITE_GROUP_NAME" />, per tots els llocs web que contingui i per les seves aplicacions instal·lades.</translation>
 <translation id="8069615408251337349">Google Cloud Print</translation>
 <translation id="8071432093239591881">Imprimeix com a imatge</translation>
-<translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Les dades de les aplicacions poden ser qualsevol informació que desin (en funció de la configuració del desenvolupador), com ara els contactes, els missatges i les fotos.<ph name="END_PARAGRAPH1" />
+<translation id="8073499153683482226"><ph name="BEGIN_PARAGRAPH1" />Les dades de les aplicacions poden ser qualsevol mena de dada que hagi desat una aplicació (en funció de la configuració del desenvolupador), com ara els contactes, els missatges i les fotos.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Les dades de les còpies de seguretat no ocupen espai de la quota d'emmagatzematge de Drive del teu fill.<ph name="END_PARAGRAPH2" />
     <ph name="BEGIN_PARAGRAPH3" />Pots desactivar aquest servei a Configuració.<ph name="END_PARAGRAPH3" /></translation>
 <translation id="8074127646604999664">Permet que els llocs tancats fa poc acabin d'enviar i rebre dades</translation>
@@ -5261,7 +5254,7 @@
 <translation id="8093359998839330381"><ph name="PLUGIN_NAME" /> no respon</translation>
 <translation id="8095105960962832018"><ph name="BEGIN_PARAGRAPH1" />Crea còpies de seguretat a Google Drive. Canvia de dispositiu o restaura'n les dades fàcilment en qualsevol moment. La còpia de seguretat inclou dades d'aplicacions.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Les còpies de seguretat es pengen a Google i s'encripten amb la contrasenya del teu Compte de Google.<ph name="END_PARAGRAPH2" />
-    <ph name="BEGIN_PARAGRAPH3" />Les dades de les aplicacions poden ser qualsevol informació que desin (en funció de la configuració del desenvolupador), com ara els contactes, els missatges i les fotos.<ph name="END_PARAGRAPH3" />
+    <ph name="BEGIN_PARAGRAPH3" />Les dades de les aplicacions poden ser qualsevol mena de dada que hagi desat una aplicació (en funció de la configuració del desenvolupador), com ara els contactes, els missatges i les fotos.<ph name="END_PARAGRAPH3" />
     <ph name="BEGIN_PARAGRAPH4" />Les dades de les còpies de seguretat no ocupen espai de la quota d'emmagatzematge de Drive.<ph name="END_PARAGRAPH4" />
     <ph name="BEGIN_PARAGRAPH5" />Pots desactivar aquest servei a Configuració.<ph name="END_PARAGRAPH5" /></translation>
 <translation id="80974698889265265">Els PIN no coincideixen</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index d462282..e030dd2b 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Při zavolání číst a měnit všechna data na aktuálním webu</translation>
 <translation id="1242633766021457174">Nástroj <ph name="THIRD_PARTY_TOOL_NAME" /> chce resetovat vaše nastavení.</translation>
 <translation id="1243314992276662751">Nahrát</translation>
-<translation id="1243398753772016127">Weby nemohou personalizovat reklamy na základě vaší aktivity na různých webových stránkách</translation>
 <translation id="1244265436519979884">Probíhá obnovování kontejneru systému Linux</translation>
 <translation id="1244303850296295656">Chyba rozšíření</translation>
 <translation id="1246905108078336582">Odstranit návrh ze schránky?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Zapnuto – vlastní nastavení</translation>
 <translation id="1489664337021920575">Vyberte jinou možnost</translation>
 <translation id="1493892686965953381">Čekání na <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Také vymazat údaje o prohlížení (<ph name="URL" />), což může vést k odhlášení z webu Google.com.</translation>
 <translation id="1495486559005647033">Další dostupná zařízení: <ph name="NUM_PRINTERS" /></translation>
 <translation id="1495677929897281669">Zpět na kartu</translation>
 <translation id="1499271269825557605">Pokud nějaké rozšíření nepoznáváte nebo prohlížeč nefunguje podle očekávání, můžete zde rozšíření vypnout nebo si je přizpůsobit.</translation>
@@ -483,7 +481,7 @@
 <translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Přidejte tiskárnu do služby Google Cloud Print a tiskněte odkudkoli.}few{Přidejte # tiskárny do služby Google Cloud Print a tiskněte odkudkoli.}many{Přidejte # tiskárny do služby Google Cloud Print a tiskněte odkudkoli.}other{Přidejte # tiskáren do služby Google Cloud Print a tiskněte odkudkoli.}}</translation>
 <translation id="1656528038316521561">Neprůhlednost pozadí</translation>
 <translation id="1657406563541664238">Pomozte <ph name="PRODUCT_NAME" /> zlepšit tím, že budete Googlu automaticky zasílat statistiky o využívání a zprávy o selhání aplikace</translation>
-<translation id="1657937299377480641">Pokud se chceš znovu přihlásit kvůli přístupu ke vzdělávacím materiálům, požádej rodiče, aby ti udělil oprávnění</translation>
+<translation id="1657937299377480641">Jestli se chceš znovu přihlásit kvůli přístupu ke vzdělávacím materiálům, požádej rodiče, aby ti udělili oprávnění</translation>
 <translation id="1658424621194652532">Tato stránka používá váš mikrofon.</translation>
 <translation id="1660204651932907780">Povolit webům přehrávat zvuky (doporučeno)</translation>
 <translation id="1660763353352708040">Problém se síťovým adaptérem</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">Ikona se zobrazí, když bude možné rozšíření použít na aktuální stránce. Rozšíření aktivujete kliknutím na ikonu nebo klávesovou zkratkou <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Nastavit jako Chromebox pro videokonference</translation>
 <translation id="2580889980133367162">Vždy povolit hostiteli <ph name="HOST" /> stahování několika souborů</translation>
-<translation id="2580924999637585241">Celkem: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dlouhé</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Lístek Kerberos se nepodařilo získat. Zkuste to znovu nebo kontaktujte správce zařízení své organizace. (Kód chyby <ph name="ERROR_CODE" />).</translation>
@@ -2455,7 +2452,7 @@
 <translation id="4263223596040212967">Zkontrolujte rozložení klávesnice a zkuste to znovu.</translation>
 <translation id="4263757076580287579">Registrace tiskárny byla zrušena.</translation>
 <translation id="426564820080660648">Chcete-li zkontrolovat dostupnost aktualizací, použijte síť Ethernet, Wi-Fi nebo mobilní datové připojení.</translation>
-<translation id="4267455501101322486">Pokud chceš přidat účet pro přístup ke vzdělávacím materiálům, požádej rodiče, aby ti udělil oprávnění</translation>
+<translation id="4267455501101322486">Jestli chceš přidat účet pro přístup ke vzdělávacím materiálům, požádej rodiče, aby ti udělili oprávnění</translation>
 <translation id="4267953847983678297">Automaticky se připojit k mobilní síti</translation>
 <translation id="4268025649754414643">Šifrování klíče</translation>
 <translation id="4270393598798225102">Verze <ph name="NUMBER" /></translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">Byla zablokována vyskakovací okna:</translation>
 <translation id="480990236307250886">Otevřít domovskou stránku</translation>
 <translation id="4811503964269049987">Přidat vybranou kartu do skupiny</translation>
-<translation id="4811818760963189951">Vypnuto, protože jste zakázali synchronizaci historie</translation>
 <translation id="4813136279048157860">Moje obrázky</translation>
 <translation id="4813512666221746211">Chyba sítě</translation>
 <translation id="4814378367953456825">Zadejte název tohoto otisku prstu</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">Další nastavení obsahu</translation>
 <translation id="5042282098504489593">Chcete-li zařízení <ph name="USB_DEVICE_NAME" /> připojit k Linuxu, otevřete Nastavení</translation>
 <translation id="5043913660911154449">Případně zadejte PPD tiskárny <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Vypnuto, protože jste synchronizovaná data zašifrovali pomocí heslové fráze</translation>
 <translation id="5045550434625856497">Nesprávné heslo</translation>
 <translation id="504561833207953641">Otevírání v existující relaci prohlížeče.</translation>
 <translation id="5047421709274785093">Bránit webům v používání senzorů pohybu a světla</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">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, budete muset <ph name="BEGIN_LINK" />synchronizaci resetovat<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Vítejte v rodině produktů <ph name="SHORT_PRODUCT_NAME" />. Nejedná se o obyčejný počítač.</translation>
 <translation id="6358884629796491903">Drak</translation>
-<translation id="6360719647236334056">Nechte si Vyhledávání, reklamy a další služby Google personalizovat s využitím historie prohlížení v Chromu</translation>
 <translation id="6361850914223837199">Podrobnosti o chybě:</translation>
 <translation id="6362853299801475928">&amp;Oznámení problému...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">Sdělte nám, jak si vedeme.</translation>
 <translation id="6759193508432371551">Tovární nastavení</translation>
 <translation id="6762833852331690540">Zapnuto</translation>
-<translation id="6764693078871405569">Také vymazat údaje o prohlížení (<ph name="URL" />), což může vést k odhlášení z domény <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Vybrat jiný jazyk...</translation>
 <translation id="6767639283522617719">Přidání do domény se nezdařilo. Zkontrolujte, zda jsou nastavení pro organizační jednotku správná.</translation>
 <translation id="6769712124046837540">Přidávání tiskárny...</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index 52bd4048..50bd083 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Læse og redigere alle dine data på det aktuelle website, når dette er aktiveret</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> vil gerne nulstille dine indstillinger.</translation>
 <translation id="1243314992276662751">Upload</translation>
-<translation id="1243398753772016127">Sites kan ikke anvende din browseraktivitet på flere forskellige websites til at tilpasse annoncer</translation>
 <translation id="1244265436519979884">Linux er i øjeblikket ved at blive gendannet</translation>
 <translation id="1244303850296295656">Udvidelsesfejl</translation>
 <translation id="1246905108078336582">Vil du fjerne forslaget fra udklipsholderen?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Til – tilpassede indstillinger</translation>
 <translation id="1489664337021920575">Vælg en anden mulighed</translation>
 <translation id="1493892686965953381">Venter på <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Ryd også browserdata (<ph name="URL" />), hvilket muligvis logger dig ud af Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> andre tilgængelige enheder.</translation>
 <translation id="1495677929897281669">Tilbage til fanen</translation>
 <translation id="1499271269825557605">Hvis du ikke kan genkende en udvidelse, eller hvis din browser ikke fungerer som forventet, kan du deaktivere og tilpasse udvidelser her.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Dette ikon vil være synligt, når udvidelsen fungerer på den aktuelle side. Brug denne udvidelse ved at klikke på ikonet eller ved at trykke på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfigurer til Chromebox videokonference</translation>
 <translation id="2580889980133367162">Tillad altid, at <ph name="HOST" /> downloader flere forskellige filer</translation>
-<translation id="2580924999637585241">I alt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lang</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /><ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" /> ) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Din Kerberos-billet kunne ikke hentes. Prøv igen, eller kontakt din organisations enhedsadministrator. (fejlkode <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Pop op-vinduer er blokeret:</translation>
 <translation id="480990236307250886">Åbn startsiden</translation>
 <translation id="4811503964269049987">Opret en gruppe med de valgte faner</translation>
-<translation id="4811818760963189951">Deaktiveret, da du har deaktiveret synkronisering af historik</translation>
 <translation id="4813136279048157860">Mine billeder</translation>
 <translation id="4813512666221746211">Netværksfejl</translation>
 <translation id="4814378367953456825">Angiv et navn til dette fingeraftryk</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Yderligere indstillinger for indhold</translation>
 <translation id="5042282098504489593">Åbn Indstillinger for at knytte <ph name="USB_DEVICE_NAME" /> til Linux</translation>
 <translation id="5043913660911154449">Du kan også angive PPD-filen for printeren <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Deaktiveret, da du har krypteret dine synkroniseringsdata med en adgangssætning</translation>
 <translation id="5045550434625856497">Ugyldig adgangskode</translation>
 <translation id="504561833207953641">Åbner i eksisterende browsersession.</translation>
 <translation id="5047421709274785093">Bloker websites, så de ikke kan anvende bevægelses- og lyssensorer</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">Det er kun personer med din adgangssætning, der kan læse dine krypterede data. Adgangssætningen sendes ikke til og gemmes ikke af Google. Hvis du glemmer din adgangssætning eller vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkroniseringen<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Velkommen til <ph name="SHORT_PRODUCT_NAME" />-familien. Dette er ikke en almindelig computer.</translation>
 <translation id="6358884629796491903">Drage</translation>
-<translation id="6360719647236334056">Brug din Chrome-browserhistorik til at tilpasse Søgning, annoncer og andre Google-tjenester</translation>
 <translation id="6361850914223837199">Info om fejl:</translation>
 <translation id="6362853299801475928">&amp;Rapporter et problem...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Fortæl os, hvad du synes.</translation>
 <translation id="6759193508432371551">Gendannelse af fabriksindstillinger</translation>
 <translation id="6762833852331690540">Til</translation>
-<translation id="6764693078871405569">Ryd også browserdata (<ph name="URL" />), hvilket muligvis logger dig ud af <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Vælg et andet sprog...</translation>
 <translation id="6767639283522617719">Enheden kunne ikke knyttes til domænet. Sørg for, at indstillingerne er angivet korrekt for organisationsenheden.</translation>
 <translation id="6769712124046837540">Tilføjer printer...</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index da9076e8..9c58abb2 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Beim Aufrufen alle Ihre Daten auf der aktuellen Website lesen und ändern</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> möchte Ihre Einstellungen zurücksetzen.</translation>
 <translation id="1243314992276662751">Hochladen</translation>
-<translation id="1243398753772016127">Websites können Ihre Browseraktivitäten auf anderen Websites nicht verwenden, um Werbung zu personalisieren</translation>
 <translation id="1244265436519979884">Wiederherstellung für Linux wird gerade ausgeführt</translation>
 <translation id="1244303850296295656">Erweiterungsfehler</translation>
 <translation id="1246905108078336582">Vorschlag aus Zwischenablage entfernen?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">An – benutzerdefinierte Einstellungen</translation>
 <translation id="1489664337021920575">Andere Option auswählen</translation>
 <translation id="1493892686965953381">Warten auf <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Auch Browserdaten (<ph name="URL" />) löschen, wodurch Sie möglicherweise von google.de abgemeldet werden.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> weitere Geräte verfügbar</translation>
 <translation id="1495677929897281669">Zurück zum Tab</translation>
 <translation id="1499271269825557605">Wenn Sie eine Erweiterung nicht wiedererkennen oder Ihr Browser nicht wie erwartet funktioniert, können Sie die Erweiterungen hier deaktivieren oder anpassen.</translation>
@@ -515,6 +513,7 @@
 <translation id="1697686431566694143">Datei bearbeiten</translation>
 <translation id="1698122934742150150">Nur aktuelle Inkognitositzung</translation>
 <translation id="1698650002254827833">Die App-Liste kann nicht geladen werden. Bitte versuchen Sie es noch einmal.</translation>
+<translation id="1700079447639026019">Websites, die nie Cookies verwenden dürfen</translation>
 <translation id="1701062906490865540">Diese Person entfernen</translation>
 <translation id="1703331064825191675">Sie müssen sich keine Sorgen mehr um Ihre Passwörter machen</translation>
 <translation id="1704970325597567340">Der Sicherheitscheck wurde am <ph name="DATE" /> durchgeführt</translation>
@@ -735,6 +734,7 @@
 <translation id="1990512225220753005">Keine Verknüpfungen auf dieser Seite anzeigen</translation>
 <translation id="1992397118740194946">Nicht eingerichtet</translation>
 <translation id="1994173015038366702">Website-URL</translation>
+<translation id="1995916364271252349">Steuert, welche Informationen Websites nutzen und anzeigen können (z. B. Standort, Kamera, Pop-ups)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> möchte umfangreiche Daten dauerhaft auf Ihrem lokalen Computer speichern</translation>
 <translation id="1997616988432401742">Meine Zertifikate</translation>
 <translation id="1999115740519098545">Beim Start</translation>
@@ -990,6 +990,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# Fenster schließen}other{# Fenster schließen}}</translation>
 <translation id="2335122562899522968">Diese Seite hat Cookies gesetzt.</translation>
 <translation id="2336228925368920074">Alle Tabs als Lesezeichen speichern...</translation>
+<translation id="2336376423977300504">Cookies immer löschen, wenn Fenster geschlossen werden</translation>
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> möchte eine Kopplung durchführen</translation>
 <translation id="2342740338116612727">Lesezeichen hinzugefügt</translation>
@@ -1183,7 +1184,6 @@
 <translation id="2575247648642144396">Dieses Symbol wird eingeblendet, wenn die Erweiterung auf die aktuelle Seite angewendet werden kann. Klicken Sie auf das Symbol oder drücken Sie <ph name="EXTENSION_SHORTCUT" />, um diese Erweiterung zu verwenden.</translation>
 <translation id="257779572837908839">Als Chromebox für Meetings einrichten</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> immer das Herunterladen mehrerer Dateien gestatten</translation>
-<translation id="2580924999637585241">Gesamt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lang</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Plattform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos-Ticket konnte nicht abgerufen werden (Fehlercode: <ph name="ERROR_CODE" />). Versuchen Sie es noch einmal oder wenden Sie sich an den Geräteadministrator Ihrer Organisation.</translation>
@@ -1731,6 +1731,7 @@
 <translation id="3317459757438853210">Beidseitig</translation>
 <translation id="3317678681329786349">Kamera und Mikrofon blockiert</translation>
 <translation id="3319048459796106952">Neues &amp;Inkognito-Fenster</translation>
+<translation id="3320630259304269485">Safe Browsing (Schutz vor schädlichen Websites) und andere Sicherheitseinstellungen</translation>
 <translation id="3323521181261657960">Bonus! Gerätenutzungsdauer verlängert</translation>
 <translation id="3325910708063135066">Kamera und Mikrofon wurden in den Mac-Systemeinstellungen ausgeschaltet</translation>
 <translation id="3328489342742826322">Bei der Wiederherstellung aus einer Sicherung werden bestehende Linux-Anwendungen und -Daten in Ihren Linux-Dateiordnern gelöscht.</translation>
@@ -1850,6 +1851,7 @@
 <translation id="3487007233252413104">Anonyme Funktion</translation>
 <translation id="348780365869651045">Warten auf AppCache...</translation>
 <translation id="3488065109653206955">Teilweise aktiviert</translation>
+<translation id="3489025949017384019">Viele Websites funktionieren eventuell nicht richtig</translation>
 <translation id="3492788708641132712">Die Synchronisierung funktioniert nicht. Melden Sie sich noch einmal an.</translation>
 <translation id="3493486281776271508">Es ist eine Internetverbindung erforderlich</translation>
 <translation id="3493881266323043047">Gültigkeit</translation>
@@ -2005,6 +2007,7 @@
 <translation id="3688526734140524629">Kanal ändern</translation>
 <translation id="3688578402379768763">Auf dem neusten Stand</translation>
 <translation id="3688794912214798596">Sprachen ändern…</translation>
+<translation id="3690369331356918524">Sie werden gewarnt, wenn Passwörter durch eine Datenpanne preisgegeben werden</translation>
 <translation id="3691231116639905343">Tastatur-Apps</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> möchte Ihren Bildschirm freigeben</translation>
 <translation id="369135240373237088">Noch einmal mit einem Konto einer Bildungseinrichtung anmelden</translation>
@@ -2143,6 +2146,7 @@
 <translation id="3841964634449506551">Passwort ungültig</translation>
 <translation id="3842552989725514455">Schriftart Serif</translation>
 <translation id="3846116211488856547">Tools für die Entwicklung erhalten, z. B. von Websites und Android-Apps. Für die Installation von Linux werden <ph name="DOWNLOAD_SIZE" /> an Daten heruntergeladen.</translation>
+<translation id="3847319713229060696">Helfen Sie mit, das Web für alle sicherer zu machen</translation>
 <translation id="385051799172605136">Zurück</translation>
 <translation id="3850914401008572843"><ph name="ORIGIN" /> kann diesen Ordner nicht öffnen, weil er Systemdateien enthält</translation>
 <translation id="3851428669031642514">Unsichere Skripts laden</translation>
@@ -2625,6 +2629,7 @@
 <translation id="4534661889221639075">Versuchen Sie es noch einmal.</translation>
 <translation id="4535127706710932914">Standardprofil</translation>
 <translation id="4535767533210902251">Der Fingerabdrucksensor ist die Taste rechts oben auf der Tastatur. Berühren Sie ihn leicht mit dem Finger.</translation>
+<translation id="4536140153723794651">Websites, die immer Cookies verwenden dürfen</translation>
 <translation id="4538417792467843292">Wort löschen</translation>
 <translation id="4538684596480161368">Plug-ins ohne Sandbox auf <ph name="HOST" /> immer blockieren</translation>
 <translation id="4538792345715658285">Durch Unternehmensrichtlinie installiert</translation>
@@ -2722,6 +2727,7 @@
 <translation id="4665446389743427678">Alle von <ph name="SITE" /> gespeicherten Daten werden gelöscht.</translation>
 <translation id="4668721319092543482">Zum Aktivieren von <ph name="PLUGIN_NAME" /> klicken</translation>
 <translation id="4670064810192446073">Virtual Reality</translation>
+<translation id="4672879467403304774">Schützt Sie in Chrome und anderen Google-Apps, wenn Sie angemeldet sind</translation>
 <translation id="46733273239502219">Offlinedaten in installierten Apps werden auch gelöscht</translation>
 <translation id="4673442866648850031">Eingabestift-Tools werden automatisch geöffnet, sobald der Eingabestift entfernt wird</translation>
 <translation id="4677772697204437347">GPU-Speicher</translation>
@@ -2806,7 +2812,6 @@
 <translation id="4808667324955055115">Pop-ups blockiert:</translation>
 <translation id="480990236307250886">Startseite öffnen</translation>
 <translation id="4811503964269049987">Ausgewählten Tab zu neuer Gruppe hinzufügen</translation>
-<translation id="4811818760963189951">Aus, weil die Synchronisierung des Verlaufs deaktiviert ist</translation>
 <translation id="4813136279048157860">Meine Bilder</translation>
 <translation id="4813512666221746211">Netzwerkfehler</translation>
 <translation id="4814378367953456825">Geben Sie einen Namen für diesen Fingerabdruck ein</translation>
@@ -2975,7 +2980,6 @@
 <translation id="5040823038948176460">Zusätzliche Inhaltseinstellungen</translation>
 <translation id="5042282098504489593">"Einstellungen" öffnen, um <ph name="USB_DEVICE_NAME" /> mit Linux zu verbinden</translation>
 <translation id="5043913660911154449">Oder Sie können die PPD für den Drucker auswählen <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Deaktiviert, weil Ihre Synchronisierungsdaten mit einer Passphrase verschlüsselt sind</translation>
 <translation id="5045550434625856497">Falsches Passwort</translation>
 <translation id="504561833207953641">Wird in einer aktuellen Browsersitzung geöffnet.</translation>
 <translation id="5047421709274785093">Verwendung von Bewegungs- und Lichtsensoren für Websites blockieren</translation>
@@ -3140,6 +3144,7 @@
 <translation id="5275352920323889391">Hund</translation>
 <translation id="527605982717517565">JavaScript auf <ph name="HOST" /> immer zulassen</translation>
 <translation id="5280174558369304332">Zu entfernende Erweiterungen:</translation>
+<translation id="5280243692621919988">Cookies und Websitedaten löschen, wenn alle Fenster geschlossen werden</translation>
 <translation id="5280426389926346830">Verknüpfung erstellen?</translation>
 <translation id="528208740344463258">Wenn Sie Android-Apps herunterladen und verwenden möchten, müssen Sie zuerst dieses erforderliche Update installieren. Sie können Ihr <ph name="DEVICE_TYPE" /> während des Updates nicht nutzen. Nach Abschluss der Installation wird Ihr <ph name="DEVICE_TYPE" /> neu gestartet.</translation>
 <translation id="5282733140964383898">Wenn Sie "Do Not Track" aktivieren, wird eine Anfrage in Ihre Browseraufrufe aufgenommen. Welche Auswirkungen dies hat, hängt davon ab, ob eine Website auf die Anfrage reagiert und wie diese interpretiert wird. Einige Websites reagieren möglicherweise auf die Anfrage, indem sie Anzeigen einblenden, die nicht auf anderen von Ihnen besuchten Websites basieren. Viele Websites erfassen und nutzen dennoch Ihre Browserdaten, etwa zur Verbesserung der Sicherheit, zur Bereitstellung von Inhalten, Diensten, Anzeigen und Empfehlungen auf der Website sowie zur Erstellung von Berichtsstatistiken. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
@@ -3835,7 +3840,7 @@
 <translation id="6207282396926186323"><ph name="APP_NAME" /> installieren (Linux-App)</translation>
 <translation id="6207937957461833379">Land/Region</translation>
 <translation id="6208521041562685716">Mobile Daten werden aktiviert</translation>
-<translation id="6209908325007204267">Ihr Gerät beinhaltet ein Chrome Enterprise-Upgrade, aber Ihr Nutzername ist nicht mit einem Enterprise-Konto verknüpft. Rufen Sie g.co/ChromeEnterpriseAccount auf einem Zweitgerät auf und erstellen Sie ein Enterprise-Konto.</translation>
+<translation id="6209908325007204267">Ihr Gerät beinhaltet ein Chrome Enterprise-Upgrade, aber Ihr Nutzername ist nicht mit einem Unternehmenskonto verknüpft. Rufen Sie g.co/ChromeEnterpriseAccount auf einem Zweitgerät auf und erstellen Sie ein Unternehmenskonto.</translation>
 <translation id="6211495400987308581"><ph name="PROFILE_NAME" />: Synchronisierung funktioniert nicht</translation>
 <translation id="6212039847102026977">Erweiterte Netzwerkeigenschaften anzeigen</translation>
 <translation id="6212168817037875041">Display deaktivieren</translation>
@@ -3951,7 +3956,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />Synchronisierung zurücksetzen<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Willkommen bei der <ph name="SHORT_PRODUCT_NAME" />-Familie. Dies ist kein herkömmlicher Computer.</translation>
 <translation id="6358884629796491903">Drache</translation>
-<translation id="6360719647236334056">Über Ihren Browserverlauf in Chrome die Google-Suche, Werbung und andere Google-Dienste personalisieren</translation>
 <translation id="6361850914223837199">Fehlerdetails:</translation>
 <translation id="6362853299801475928">P&amp;roblem melden...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4229,10 +4233,10 @@
 <translation id="6758056191028427665">Teilen Sie uns mit, wie zufrieden Sie mit uns sind.</translation>
 <translation id="6759193508432371551">Zurücksetzen auf Werkseinstellungen</translation>
 <translation id="6762833852331690540">An</translation>
-<translation id="6764693078871405569">Auch Browserdaten (<ph name="URL" />) löschen, wodurch Sie von <ph name="DOMAIN" /> abgemeldet werden.</translation>
 <translation id="6767566652486411142">Andere Sprache auswählen…</translation>
 <translation id="6767639283522617719">Beitritt zur Domain nicht möglich. Achten Sie darauf, dass die Einstellungen für die Organisationseinheit richtig sind.</translation>
 <translation id="6769712124046837540">Drucker wird hinzugefügt...</translation>
+<translation id="6770602306803890733">Verbessert die Sicherheit für Sie und alle im Internet</translation>
 <translation id="6770664076092644100">Über NFC bestätigen</translation>
 <translation id="6771503742377376720">Ist eine Zertifizierungsstelle</translation>
 <translation id="6772339735733515807">Erweiterungen verwalten</translation>
@@ -4258,6 +4262,7 @@
 <translation id="6798578729981748444">Schließen Sie alle Firefox-Fenster, um den Import abzuschließen.</translation>
 <translation id="6798780071646309401">Feststelltaste an</translation>
 <translation id="6798954102094737107">Plug-in: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">Allgemeine Einstellungen</translation>
 <translation id="6801435275744557998">Touchscreen kalibrieren</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">Ok</translation>
@@ -4376,6 +4381,8 @@
 <translation id="6965382102122355670">Ok</translation>
 <translation id="6965648386495488594">Port</translation>
 <translation id="6965978654500191972">Gerät</translation>
+<translation id="6966201992886493384">Websites können Cookies verwenden, um Ihnen das Surfen zu erleichtern. Diese sorgen zum Beispiel dafür, dass Sie angemeldet bleiben oder dass Artikel in Ihrem Einkaufswagen gespeichert bleiben</translation>
+<translation id="696780070563539690">Websites können Ihre Cookies nicht dazu verwenden, Ihre Browseraktivitäten auf anderen Websites aufzuzeichnen und damit zum Beispiel Werbung zu personalisieren</translation>
 <translation id="6968288415730398122">Geben Sie Ihr Passwort ein, um die Displaysperre zu konfigurieren</translation>
 <translation id="6970480684834282392">Starttyp</translation>
 <translation id="6970856801391541997">Bestimmte Seiten drucken</translation>
@@ -4785,6 +4792,7 @@
 <translation id="7507207699631365376"><ph name="BEGIN_LINK" />Datenschutzerklärung<ph name="END_LINK" /> dieses Dienstanbieters ansehen</translation>
 <translation id="7507930499305566459">Zertifikat für Statusantwortdienst</translation>
 <translation id="7508054832109420082">Zugriff auf Drucker geben</translation>
+<translation id="751120035300339">Websites können keine Cookies verwenden, um Ihnen das Surfen zu erleichtern. Diese sorgen zum Beispiel dafür, dass Sie angemeldet bleiben oder dass Artikel in Ihrem Einkaufswagen gespeichert bleiben</translation>
 <translation id="7513029293694390567">Sie werden mithilfe gespeicherter Anmeldedaten automatisch auf Websites angemeldet. Wenn diese Funktion deaktiviert ist, werden Sie bei jeder Anmeldung auf einer Website nach einer Bestätigung gefragt.</translation>
 <translation id="7514239104543605883">Auf mein Gerät kopieren</translation>
 <translation id="7514365320538308">Herunterladen</translation>
@@ -5414,6 +5422,7 @@
 <translation id="8320459152843401447">Gesamten Bildschirm</translation>
 <translation id="8322814362483282060">Diese Seite darf nicht auf Ihr Mikrofon zugreifen.</translation>
 <translation id="8323167517179506834">URL eingeben</translation>
+<translation id="8324784016256120271">Websites können Cookies verwenden, um Ihre Browseraktivitäten auf anderen Websites aufzuzeichnen und damit zum Beispiel Werbung zu personalisieren</translation>
 <translation id="8326478304147373412">PKCS #7, Zertifikatkette</translation>
 <translation id="8327039559959785305">Fehler beim Bereitstellen von Linux-Dateien. Bitte versuchen Sie es noch einmal.</translation>
 <translation id="8327676037044516220">Berechtigungen und Inhaltseinstellungen</translation>
@@ -5469,6 +5478,7 @@
 <translation id="8408068190360279472">Netzwerk: <ph name="NETWORK_TYPE" />, Verbindung wird hergestellt</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">Zuerst fragen (empfohlen)</translation>
+<translation id="8417573335434189196">Damit sind Sie nicht vor schädlichen Websites, Downloads oder Erweiterungen geschützt. Wir raten von dieser Einstellung ab.</translation>
 <translation id="8418445294933751433">Al&amp;s Tab anzeigen</translation>
 <translation id="8419098111404128271">Suchergebnisse für "<ph name="SEARCH_TEXT" />"</translation>
 <translation id="8419368276599091549">Willkommen bei Ihrem <ph name="DEVICE_TYPE" />!</translation>
@@ -5634,6 +5644,7 @@
 <translation id="8642947597466641025">Schriftgrad vergrößern</translation>
 <translation id="8644655801811752511">Dieser Sicherheitsschlüssel kann nicht zurückgesetzt werden. Versuchen Sie, den Schlüssel direkt nach dem Einstecken zurückzusetzen.</translation>
 <translation id="8645354835496065562">Zugriff auf Sensor weiterhin zulassen</translation>
+<translation id="8645920082661222035">Erkennt schädliche Ereignisse im Voraus und warnt Sie, bevor sie eintreten</translation>
 <translation id="8647834505253004544">Keine gültige Webadresse</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> oder <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">Sie können zwar nicht mehr auf Ihr altes Profil zugreifen, aber Sie können es noch entfernen.</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 2b012cd..f73b3ba 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Ανάγνωση και αλλαγή όλων των δεδομένων σας στον τρέχοντα ιστότοπο κατά την κλήση</translation>
 <translation id="1242633766021457174">Το <ph name="THIRD_PARTY_TOOL_NAME" /> θέλει να επαναφέρει τις ρυθμίσεις σας.</translation>
 <translation id="1243314992276662751">Μεταφόρτωση</translation>
-<translation id="1243398753772016127">Οι τοποθεσίες δεν μπορούν να χρησιμοποιήσουν τη δραστηριότητα περιήγησης μεταξύ διαφορετικών τοποθεσιών για την εξατομίκευση των διαφημίσεων</translation>
 <translation id="1244265436519979884">Η επαναφορά Linux βρίσκεται σε εξέλιξη.</translation>
 <translation id="1244303850296295656">Σφάλμα επέκτασης</translation>
 <translation id="1246905108078336582">Θέλετε να καταργήσετε την πρόταση από το πρόχειρο;</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Ενεργοποίηση - προσαρμοσμένες ρυθμίσεις</translation>
 <translation id="1489664337021920575">Ορίστε κάποια άλλη επιλογή</translation>
 <translation id="1493892686965953381">Αναμονή για <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Επίσης, διαγράψτε δεδομένα περιήγησης (<ph name="URL" />) τα οποία μπορεί να σας αποσυνδέσουν από το Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ακόμα διαθέσιμες συσκευές.</translation>
 <translation id="1495677929897281669">Επιστροφή στην καρτέλα</translation>
 <translation id="1499271269825557605">Εάν δεν αναγνωρίζετε κάποια επέκταση ή αν το πρόγραμμα περιήγησης δεν λειτουργεί με τον αναμενόμενο τρόπο, μπορείτε να απενεργοποιήσετε ή να προσαρμόσετε τις επεκτάσεις εδώ.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Αυτό το εικονίδιο θα είναι ορατό όταν η επέκταση μπορεί να λειτουργήσει στην τρέχουσα σελίδα. Χρησιμοποιήστε αυτήν την επέκταση κάνοντας κλικ στο εικονίδιο ή πατώντας <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Ρύθμιση ως Chromebox για συνεδριάσεις</translation>
 <translation id="2580889980133367162">Να επιτρέπεται πάντα στον κεντρικό υπολογιστή <ph name="HOST" /> η λήψη πολλών αρχείων</translation>
-<translation id="2580924999637585241">Σύνολο: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Μακρά</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Πλατφόρμα <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Δεν ήταν δυνατή η λήψη εισιτηρίου Kerberos. Δοκιμάστε ξανά ή επικοινωνήστε με τον διαχειριστή συσκευών του οργανισμού σας. (Κωδικός σφάλματος <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Αναδυόμενα παράθυρα που αποκλείστηκαν:</translation>
 <translation id="480990236307250886">Άνοιγμα της αρχικής σελίδας</translation>
 <translation id="4811503964269049987">Ομαδοποίηση επιλεγμένων καρτελών</translation>
-<translation id="4811818760963189951">Απενεργοποιήθηκε επειδή έχετε απενεργοποιήσει τον συγχρονισμό ιστορικού.</translation>
 <translation id="4813136279048157860">Οι εικόνες μου</translation>
 <translation id="4813512666221746211">Σφάλμα δικτύου</translation>
 <translation id="4814378367953456825">Εισαγάγετε ένα όνομα για αυτό το μοναδικό χαρακτηριστικό</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Επιπλέον ρυθμίσεις περιεχομένου</translation>
 <translation id="5042282098504489593">Ανοίξτε τις Ρυθμίσεις για να συνδέσετε τη συσκευή <ph name="USB_DEVICE_NAME" /> στα Linux</translation>
 <translation id="5043913660911154449">Εναλλακτικά, καθορίστε το PPD του εκτυπωτή σας <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Απενεργοποιήθηκε επειδή κρυπτογραφήσατε τα δεδομένα συγχρονισμού σας με μια φράση πρόσβασης</translation>
 <translation id="5045550434625856497">Λανθασμένος κωδικός πρόσβασης</translation>
 <translation id="504561833207953641">Άνοιγμα σε υπάρχουσα περίοδο σύνδεσης προγράμματος περιήγησης.</translation>
 <translation id="5047421709274785093">Να μην επιτρέπεται στους ιστοτόπους να χρησιμοποιούν αισθητήρες κίνησης και φωτός</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">Μόνο κάποιος που γνωρίζει τη φράση πρόσβασης μπορεί να διαβάσει τα κρυπτογραφημένα δεδομένα σας. Η φράση πρόσβασης δεν αποστέλλεται ούτε αποθηκεύεται στην Google. Εάν ξεχάσετε τη φράση πρόσβασης ή θέλετε να αλλάξετε αυτήν τη ρύθμιση, θα πρέπει να <ph name="BEGIN_LINK" />επαναφέρετε τον συγχρονισμό<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Καλώς ορίσατε στην οικογένεια <ph name="SHORT_PRODUCT_NAME" />. Πρόκειται για έναν μη συμβατικό υπολογιστή.</translation>
 <translation id="6358884629796491903">Δράκος</translation>
-<translation id="6360719647236334056">Χρησιμοποιήστε το ιστορικό περιήγησης του Chrome για εξατομίκευση της Αναζήτησης, των διαφημίσεων και άλλων υπηρεσιών Google</translation>
 <translation id="6361850914223837199">Λεπτομέρειες σφάλματος:</translation>
 <translation id="6362853299801475928">&amp;Αναφορά προβλήματος...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Πείτε μας πώς τα πηγαίνουμε</translation>
 <translation id="6759193508432371551">Επαναφορά εργοστασιακών ρυθμίσεων</translation>
 <translation id="6762833852331690540">Ενεργό</translation>
-<translation id="6764693078871405569">Επίσης, διαγράψτε δεδομένα περιήγησης (<ph name="URL" />) τα οποία μπορεί να σας αποσυνδέσουν από τον τομέα <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Επιλογή άλλης γλώσσας…</translation>
 <translation id="6767639283522617719">Δεν είναι δυνατή η σύνδεση στον τομέα. Βεβαιωθείτε ότι οι ρυθμίσεις είναι σωστές για τη μονάδα οργάνωσης.</translation>
 <translation id="6769712124046837540">Προσθήκη εκτυπωτή…</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 9893bd4e..c6ce5f1 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838"><ph name="FILE_NAME" /> contains sensitive content, and has been blocked.</translation>
 <translation id="1061904396131502319">Almost time for a break</translation>
+<translation id="1064552680598333868">Changes to microphone will take effect when Linux is next restarted.</translation>
 <translation id="1067048845568873861">Created</translation>
 <translation id="1067291318998134776">Linux (Beta)</translation>
 <translation id="1067922213147265141">Other Google services</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">To ask for access, contact the administrator of this device.</translation>
 <translation id="1149401351239820326">Expiry month</translation>
 <translation id="1150565364351027703">Sunglasses</translation>
+<translation id="1151841030700667295">You'll be signed out of all sites, including in open tabs.</translation>
 <translation id="1151917987301063366">Always allow <ph name="HOST" /> to access sensors</translation>
 <translation id="1153356358378277386">Paired devices</translation>
 <translation id="1153636665119721804">Google Advanced Protection programme</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">Read and change all your data on the current website when invoked</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> wants to reset your settings.</translation>
 <translation id="1243314992276662751">Upload</translation>
-<translation id="1243398753772016127">Sites can’t use your browsing activity across different sites to personalise ads</translation>
 <translation id="1244265436519979884">Linux restore currently in progress</translation>
 <translation id="1244303850296295656">Extension error</translation>
 <translation id="1246905108078336582">Remove suggestion from clipboard?</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">Howdy.</translation>
 <translation id="138784436342154190">Restore default start-up page?</translation>
 <translation id="1390548061267426325">Open as a Standard Tab</translation>
+<translation id="1392232653471491344">Linux restart required</translation>
 <translation id="1393283411312835250">Sun and clouds</translation>
 <translation id="1393787139683794508">This will clear all data and cookies stored by <ph name="ORIGIN_NAME" />.</translation>
 <translation id="1395730723686586365">Updater started</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> to allow pairing</translation>
 <translation id="1422159345171879700">Load Unsafe Scripts</translation>
 <translation id="1426410128494586442">Yes</translation>
+<translation id="142655739075382478"><ph name="APP_NAME" /> is blocked</translation>
 <translation id="1426870617281699524">Click Try Again, and accept the prompt on your computer</translation>
 <translation id="1427269577154060167">Country</translation>
 <translation id="142758023928848008">Enable sticky keys (to perform keyboard shortcuts by typing them sequentially)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">&amp;Language Settings</translation>
 <translation id="1478340334823509079">Details: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Installation is not enabled</translation>
+<translation id="1481537595330271162">Error resizing disk</translation>
 <translation id="1482626744466814421">Bookmark This Tab...</translation>
 <translation id="1483493594462132177">Send</translation>
 <translation id="1484979925941077974">Site is using Bluetooth</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">On – customised settings</translation>
 <translation id="1489664337021920575">Choose another option</translation>
 <translation id="1493892686965953381">Waiting for <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Also clear browsing data (<ph name="URL" />) which may sign you out of Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> other available devices.</translation>
 <translation id="1495677929897281669">Back to tab</translation>
 <translation id="1499271269825557605">If you don’t recognise an extension, or if your browser isn’t working as expected, you can turn off or customise extensions here.</translation>
@@ -607,6 +610,7 @@
 <translation id="1805822111539868586">Inspect views</translation>
 <translation id="1805888043020974594">Print server</translation>
 <translation id="1805967612549112634">Confirm PIN</translation>
+<translation id="1806335016774576568">Switch to another open app</translation>
 <translation id="1809734401532861917">Add my bookmarks, history, passwords and other settings to <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1813278315230285598">Services</translation>
 <translation id="18139523105317219">EDI Party Name</translation>
@@ -693,6 +697,7 @@
 <translation id="1921050530041573580">Pair your phone with Messages</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Open with</translation>
+<translation id="1925017091976104802">Press <ph name="MODIFIER_KEY_DESCRIPTION" /> to paste</translation>
 <translation id="1925021887439448749">Enter custom web address</translation>
 <translation id="1925124445985510535">Safety check ran at <ph name="TIME" /></translation>
 <translation id="1926339101652878330">These settings are controlled by enterprise policy. Please contact your administrator for more information.</translation>
@@ -838,6 +843,7 @@
 <translation id="2135787500304447609">&amp;Resume</translation>
 <translation id="2136372518715274136">Enter new password</translation>
 <translation id="2136476978468204130">The passphrase you entered is incorrect</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{Cookies are blocked.}=1{Cookies are blocked – 1 exception}other{Cookies are blocked – {COUNT} exceptions}}</translation>
 <translation id="2138398485845393913">Connection to '<ph name="DEVICE_NAME" />' still in progress</translation>
 <translation id="2139545522194199494">Network <ph name="NETWORK_INDEX" /> of <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, signal strength <ph name="SIGNAL_STRENGTH" />%, managed by your administrator, connect</translation>
 <translation id="2139919072249842737">Set up button</translation>
@@ -1005,11 +1011,13 @@
 <translation id="2346953515226895098">SODA Service</translation>
 <translation id="2347644257713614136">Use of Hangouts and Cast for Education is governed by the Google Privacy Policy.</translation>
 <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Error loading data</translation>
 <translation id="2349896577940037438">If your additional Web &amp; App Activity setting is turned on, this data may be saved to your Google Account. You can see your data, delete it and change your account settings at account.google.com.</translation>
 <translation id="2350133097354918058">Reloaded</translation>
 <translation id="2350182423316644347">Initialising application...</translation>
 <translation id="2350796302381711542">Allow <ph name="HANDLER_HOSTNAME" /> to open all <ph name="PROTOCOL" /> links instead of <ph name="REPLACED_HANDLER_TITLE" />?</translation>
 <translation id="2351266942280602854">Language and input</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 item}other{{NUM_ITEMS} items}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Lock screen notes are automatically saved to <ph name="LOCK_SCREEN_APP_NAME" />. Your most recent note will remain on the lock screen.</translation>
 <translation id="2353297238722298836">Camera and microphone allowed</translation>
@@ -1043,6 +1051,7 @@
 <translation id="2392369802118427583">Activate</translation>
 <translation id="2394566832561516196">Settings will be cleared on next reload.</translation>
 <translation id="2395616325548404795">Your <ph name="DEVICE_TYPE" /> has successfully been enrolled for enterprise management, but failed to send its asset and location information. Please manually enter this information from your Admin console for this device.</translation>
+<translation id="2396387085693598316">Your admin has blocked '<ph name="EXTENSION_NAME" />'</translation>
 <translation id="2396783860772170191">Enter 4-digit pin (0000-9999)</translation>
 <translation id="2399939490305346086">Security key sign-in data</translation>
 <translation id="2400664245143453337">Immediate update required</translation>
@@ -1190,7 +1199,6 @@
 <translation id="2575247648642144396">This icon will be visible when the extension can act on the current page. Use this extension by clicking on the icon or by pressing <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Set up as Chromebox for meetings</translation>
 <translation id="2580889980133367162">Always allow <ph name="HOST" /> to download multiple files</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Long</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Couldn't get Kerberos ticket. Try again, or contact your organisation's device admin. (Error code <ph name="ERROR_CODE" />).</translation>
@@ -1331,6 +1339,7 @@
 <translation id="2753677631968972007">Manually control site permissions.</translation>
 <translation id="2755367719610958252">Manage accessibility features</translation>
 <translation id="275662540872599901">screen off</translation>
+<translation id="2757338480560142065">Make sure that the password you are saving matches your password for <ph name="WEBSITE" /></translation>
 <translation id="2762441749940182211">Camera blocked</translation>
 <translation id="2765217105034171413">Small</translation>
 <translation id="2766161002040448006">Ask a parent</translation>
@@ -1583,6 +1592,7 @@
 <translation id="3090819949319990166">Can't copy external crx file to <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" paired</translation>
 <translation id="3092699946856346803">Please insert your SIM and try again</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 potentially harmful extension is off. You can also remove it.}other{{NUM_EXTENSIONS} potentially harmful extensions are off. You can also remove them.}}</translation>
 <translation id="3101709781009526431">Date and time</translation>
 <translation id="3103941660000130485">Error upgrading Linux</translation>
 <translation id="310671807099593501">Site is using Bluetooth</translation>
@@ -1657,6 +1667,7 @@
 <translation id="3201422919974259695">Available USB devices will appear here.</translation>
 <translation id="3202131003361292969">Path</translation>
 <translation id="3202173864863109533">This tab's audio is being muted.</translation>
+<translation id="3208321278970793882">App</translation>
 <translation id="3208584281581115441">Check now</translation>
 <translation id="3208703785962634733">Unconfirmed</translation>
 <translation id="32101887417650595">Can’t connect to printer</translation>
@@ -1677,6 +1688,7 @@
 <translation id="3239373508713281971">Time limit removed for <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Select the root directory of the extension to pack. To update an extension, also select the private key file to reuse.</translation>
 <translation id="3244294424315804309">Continue muting sound</translation>
+<translation id="3246107497225150582">{0,plural, =1{Update device within a day}other{Update device within # days}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Network error</translation>
 <translation id="3248902735035392926">Safety matters. Take a moment and <ph name="BEGIN_LINK" />check your extensions now<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1763,6 +1775,7 @@
 <translation id="3356580349448036450">Complete</translation>
 <translation id="3359256513598016054">Certificate Policy Constraints</translation>
 <translation id="3360297538363969800">Printing failed. Please check your printer and try again.</translation>
+<translation id="3364986687961713424">From your administrator: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Use either Ctrl or Alt</translation>
 <translation id="3367047597842238025">Set up your <ph name="DEVICE_TYPE" /> just as you want it and discover all the amazing capabilities at your fingertips.</translation>
 <translation id="3368922792935385530">Connected</translation>
@@ -1867,6 +1880,7 @@
 <translation id="3496213124478423963">Zoom Out</translation>
 <translation id="3497560059572256875">Share Doodle</translation>
 <translation id="3498215018399854026">We could not reach your parent at the moment. Please try again.</translation>
+<translation id="3500417806337761827">Error mounting share. Too many SMB shares are already mounted.</translation>
 <translation id="3505030558724226696">Revoke device access</translation>
 <translation id="3507421388498836150">Current Permissions for "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="3507888235492474624">Re-scan Bluetooth devices</translation>
@@ -1932,6 +1946,7 @@
 <translation id="3592260987370335752">&amp;Learn more</translation>
 <translation id="359283478042092570">Enter</translation>
 <translation id="3593965109698325041">Certificate Name Constraints</translation>
+<translation id="3595381248165458839">Contact your organisation's device administrator</translation>
 <translation id="3596235046596950091">Enable cloud services</translation>
 <translation id="3596414637720633074">Block third-party cookies in Incognito</translation>
 <translation id="3599221874935822507">Raised</translation>
@@ -2065,6 +2080,7 @@
 <translation id="3742666961763734085">Can’t find an organisational unit with that name. Please try again.</translation>
 <translation id="3744111561329211289">Background sync</translation>
 <translation id="3746127522257263495">Adding G Suite for Education account in Android apps is not supported.</translation>
+<translation id="3747039297326604768">Couldn't open Plugin VM</translation>
 <translation id="3747077776423672805">To remove apps, go to Settings &gt; Google Play Store &gt; Manage Android preferences &gt; Apps or Application manager. Then tap the app that you want to uninstall (you may need to swipe right or left to find the app). Then tap Uninstall or Disable.</translation>
 <translation id="3748026146096797577">Not Connected</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2140,6 +2156,7 @@
 <translation id="3827774300009121996">&amp;Full Screen</translation>
 <translation id="3828029223314399057">Search bookmarks</translation>
 <translation id="3829765597456725595">SMB file share</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Your administrator turned 1 potentially harmful extension back on}other{Your administrator turned {NUM_EXTENSIONS} potentially harmful extensions back on}}</translation>
 <translation id="3831436149286513437">Google Drive search suggestions</translation>
 <translation id="383161972796689579">The owner of this device has disabled new users from being added</translation>
 <translation id="3834775135533257713">Could not add application "<ph name="TO_INSTALL_APP_NAME" />" because it conflicts with "<ph name="INSTALLED_APP_NAME" />".</translation>
@@ -2316,6 +2333,7 @@
 <translation id="4047726037116394521">Go home</translation>
 <translation id="4050225813016893843">Authentication method</translation>
 <translation id="4052120076834320548">Tiny</translation>
+<translation id="4056908315660577142">You reached the time limit that your parent set for <ph name="APP_NAME" /> Chrome app. You can use it for <ph name="TIME_LIMIT" /> tomorrow.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">View in Store</translation>
 <translation id="4058647953897694817">Verify via Bluetooth</translation>
@@ -2447,6 +2465,7 @@
 <translation id="424963718355121712">Apps must be served from the host they affect</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4250680216510889253">No</translation>
+<translation id="4252035718262427477">Web page, single file (web bundle)</translation>
 <translation id="4252852543720145436">Protected content identifiers</translation>
 <translation id="4252899949534773101">Bluetooth is disabled</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> – Tab content shared</translation>
@@ -2542,6 +2561,7 @@
 <translation id="4400963414856942668">You can click the star to bookmark a tab</translation>
 <translation id="4403775189117163360">Choose a different folder</translation>
 <translation id="4404136731284211429">Scan again</translation>
+<translation id="4404843640767531781"><ph name="APP_NAME" /> is blocked by your parent. Ask your parent for permission to use this app.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">H&amp;elp</translation>
 <translation id="4409697491990005945">Margins</translation>
@@ -2611,6 +2631,7 @@
 <translation id="450099669180426158">Exclamation mark icon</translation>
 <translation id="4501530680793980440">Confirm Removal</translation>
 <translation id="4502423230170890588">Remove from this device</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{Cookies are allowed}=1{Cookies are allowed – 1 exception}other{Cookies are allowed – {COUNT} exceptions}}</translation>
 <translation id="4504940961672722399">Use this extension by clicking on this icon or by pressing <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="4508051413094283164">Open all in incognito window</translation>
 <translation id="4508265954913339219">Activation failed</translation>
@@ -2724,6 +2745,7 @@
 <translation id="465878909996028221">Only http, https and file protocols are supported for browser redirects.</translation>
 <translation id="4659077111144409915">Primary account</translation>
 <translation id="4660476621274971848">Expected version '<ph name="EXPECTED_VERSION" />', but version was '<ph name="NEW_ID" />'</translation>
+<translation id="4660540330091848931">Resizing</translation>
 <translation id="4660838440047236328">the layout of your room</translation>
 <translation id="4661407454952063730">App data can be any data that an app has saved (based on developer settings), including data such as contacts, messages and photos.</translation>
 <translation id="4661931051827810091">Sends anonymous URLs of some pages that you visit, limited system information and some page content to help discover and block new threats against all users on the web.</translation>
@@ -2819,7 +2841,6 @@
 <translation id="4808667324955055115">Pop-ups blocked:</translation>
 <translation id="480990236307250886">Open the homepage</translation>
 <translation id="4811503964269049987">Group selected tab</translation>
-<translation id="4811818760963189951">Turned off because you disabled history sync</translation>
 <translation id="4813136279048157860">My Images</translation>
 <translation id="4813512666221746211">Network error</translation>
 <translation id="4814378367953456825">Enter a name for this fingerprint</translation>
@@ -2908,6 +2929,7 @@
 <translation id="4918086044614829423">Accept</translation>
 <translation id="4918221908152712722">Install <ph name="APP_NAME" /> (no download required)</translation>
 <translation id="4920887663447894854">The following sites have been blocked from tracking your location on this page:</translation>
+<translation id="49226369361073053">{0,plural, =0{Update device now}=1{Update device within 1 second}other{Update device within # seconds}}</translation>
 <translation id="492299503953721473">Remove Android apps</translation>
 <translation id="4923279099980110923">Yes, I want to help</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2988,7 +3010,6 @@
 <translation id="5040823038948176460">Additional content settings</translation>
 <translation id="5042282098504489593">Open Settings to connect <ph name="USB_DEVICE_NAME" /> to Linux</translation>
 <translation id="5043913660911154449">Or specify your printer PPD <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Turned off because you encrypted your sync data with a passphrase</translation>
 <translation id="5045550434625856497">Incorrect password</translation>
 <translation id="504561833207953641">Opening in existing browser session.</translation>
 <translation id="5047421709274785093">Block sites from using motion and light sensors</translation>
@@ -3059,6 +3080,7 @@
 <translation id="5135085122826131075">Access your Assistant when you say "Ok Google".</translation>
 <translation id="5135533361271311778">Could not create bookmark item.</translation>
 <translation id="5137501176474113045">Delete this item</translation>
+<translation id="5138982052046316113">Resize Linux disk</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> search</translation>
 <translation id="5139823398361067371">Enter the PIN for your security key. If you don’t know the PIN, you’ll need to reset the security key.</translation>
 <translation id="5139955368427980650">&amp;Open</translation>
@@ -3215,6 +3237,7 @@
 <translation id="5353252989841766347">Export Passwords From Chrome</translation>
 <translation id="5355099869024327351">Allow the Assistant to show you notifications</translation>
 <translation id="5355926466126177564">The extension "<ph name="EXTENSION_NAME" />" has changed the page that is shown when you search from the Omnibox.</translation>
+<translation id="535911077628776608"><ph name="FILE_NAME" /> may be dangerous. Send to Google Advanced Protection for scanning? Press Shift + F6 to cycle to the downloads bar area.</translation>
 <translation id="5359910752122114278">1 result</translation>
 <translation id="5360150013186312835">Show in Toolbar</translation>
 <translation id="5362741141255528695">Select private key file.</translation>
@@ -3353,6 +3376,7 @@
 <translation id="5539221284352502426">The password that you entered was rejected by the server. Possible reasons include: The password is too short. The password must include numbers or symbols. The password must be different from previous passwords.</translation>
 <translation id="5541694225089836610">Action is disabled by your administrator</translation>
 <translation id="5542132724887566711">Profile</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> requires you to update this device immediately.</translation>
 <translation id="5542750926112347543">Cookies from <ph name="DOMAIN" /> blocked</translation>
 <translation id="5542949973455282971">Connecting to <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Checking for status...</translation>
@@ -3398,6 +3422,7 @@
 <translation id="5593357315997824387">Sync my files</translation>
 <translation id="5595152862129936745">Very far</translation>
 <translation id="5595485650161345191">Edit address</translation>
+<translation id="5595727715083333657">Your container doesn't support being resized. To adjust the amount of space that is pre-allocated to Linux (beta), back up and then restore into a new container.</translation>
 <translation id="5596627076506792578">More options</translation>
 <translation id="5600706100022181951">Update will be downloaded using <ph name="UPDATE_SIZE_MB" /> MB of mobile data. Would you like to continue?</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -3470,6 +3495,7 @@
 <translation id="5691511426247308406">Family</translation>
 <translation id="5691772641933328258">Fingerprint not recognised</translation>
 <translation id="5692183275898619210">Printing complete</translation>
+<translation id="5692875591060376599">The selected file is unknown and may be dangerous. Send to Google Advanced Protection for scanning?</translation>
 <translation id="569425414730375234">Current incognito session: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">Report abuse from '<ph name="EXTENSION_NAME" />'</translation>
 <translation id="5696679855467848181">Current PPD file in use: <ph name="PPD_NAME" /></translation>
@@ -3681,6 +3707,7 @@
 <translation id="5976160379964388480">Others</translation>
 <translation id="5978277834170881274">Use basic spell check</translation>
 <translation id="5979084224081478209">Check passwords</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{You turned 1 potentially harmful extension back on}other{You turned {NUM_EXTENSIONS} potentially harmful extensions back on}}</translation>
 <translation id="5979421442488174909">&amp;Translate to <ph name="LANGUAGE" /></translation>
 <translation id="5979469435153841984">To bookmark pages, click the star in the address bar</translation>
 <translation id="5984222099446776634">Recently Visited</translation>
@@ -3931,6 +3958,7 @@
 <translation id="6309510305002439352">Microphone turned off</translation>
 <translation id="6311220991371174222">Cannot start Chrome because something went wrong when opening your profile. Try to restart Chrome.</translation>
 <translation id="6312403991423642364">Unknown network error</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Safety check ran 1 day ago}other{Safety check ran {NUM_DAYS} days ago}}</translation>
 <translation id="6312638141433622592">Offer to show articles in reader mode, when supported</translation>
 <translation id="6313641880021325787">EXIT VR</translation>
 <translation id="6314819609899340042">You have successfully enabled debugging features on this <ph name="IDS_SHORT_PRODUCT_NAME" /> device.</translation>
@@ -3946,6 +3974,7 @@
 <translation id="6325191661371220117">Disable auto-launch</translation>
 <translation id="6326175484149238433">Remove from Chrome</translation>
 <translation id="6326855256003666642">Keepalive Count</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> requires you to update this device before the deadline.</translation>
 <translation id="6327785803543103246">Web proxy auto-discovery</translation>
 <translation id="6333064448949140209">File will be sent to Google for debugging</translation>
 <translation id="6339668969738228384">Create a new profile for <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -3965,7 +3994,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Welcome to the <ph name="SHORT_PRODUCT_NAME" /> family. This is no ordinary computer.</translation>
 <translation id="6358884629796491903">Dragon</translation>
-<translation id="6360719647236334056">Use your Chrome browsing history to personalise Search, ads and other Google services</translation>
 <translation id="6361850914223837199">Error details:</translation>
 <translation id="6362853299801475928">&amp;Report an issue...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3973,11 +4001,13 @@
 <translation id="6366190659675876144">Standard protection</translation>
 <translation id="636850387210749493">Enterprise enrolment</translation>
 <translation id="6370021412472292592">Could not load manifest.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Change password}other{Change passwords}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Try Again</translation>
 <translation id="6377268785556383139">1 result for '<ph name="SEARCH_TEXT" />'</translation>
 <translation id="6380143666419481200">Accept and continue</translation>
 <translation id="6384275966486438344">Change your search settings to: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">Connect to the Internet and try again</translation>
 <translation id="6385543213911723544">Sites can save and read cookie data</translation>
 <translation id="6386099547750337629">If this is unexpected, please contact support.</translation>
 <translation id="6387674443318562538">Split vertical</translation>
@@ -4056,6 +4086,7 @@
 <translation id="6478248366783946499">Keep dangerous file?</translation>
 <translation id="6483485061007832714">Open download</translation>
 <translation id="6483805311199035658">Opening <ph name="FILE" />...</translation>
+<translation id="6485092675191826776">Plugin VM licence has expired</translation>
 <translation id="6488384360522318064">Select language</translation>
 <translation id="648927581764831596">None available</translation>
 <translation id="6490471652906364588">USB-C device (right port)</translation>
@@ -4243,9 +4274,9 @@
 <translation id="6758056191028427665">Let us know how we’re doing.</translation>
 <translation id="6759193508432371551">Factory reset</translation>
 <translation id="6762833852331690540">On</translation>
-<translation id="6764693078871405569">Also clear browsing data (<ph name="URL" />) which will sign you out of <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Choose another language…</translation>
 <translation id="6767639283522617719">Can’t join the domain. Make sure that the settings are correct for the organisational unit.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> recommends that you update this device.</translation>
 <translation id="6769712124046837540">Adding printer...</translation>
 <translation id="6770602306803890733">Improves security for you and everyone on the web</translation>
 <translation id="6770664076092644100">Verify via NFC</translation>
@@ -4378,6 +4409,7 @@
 <translation id="6943836128787782965">HTTP get failed</translation>
 <translation id="6945221475159498467">Select</translation>
 <translation id="694592694773692225">Redirect blocked on this page.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 compromised password}other{{NUM_PASSWORDS} compromised passwords}}</translation>
 <translation id="6949434160682548041">Password (optional)</translation>
 <translation id="6950627417367801484">Restore apps</translation>
 <translation id="6950943362443484797">We'll install that app for you</translation>
@@ -4462,6 +4494,7 @@
 <translation id="7053983685419859001">Block</translation>
 <translation id="7055152154916055070">Redirect blocked:</translation>
 <translation id="7056526158851679338">&amp;Inspect Devices</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Safety check ran 1 minute ago}other{Safety check ran {NUM_MINS} minutes ago}}</translation>
 <translation id="7057767408836081338">Failed to obtain app data. Trying to run the app anyway…</translation>
 <translation id="7059858479264779982">Set to auto-launch</translation>
 <translation id="7059893117020417984">To browse privately, click the dots icon menu to open an incognito window</translation>
@@ -4705,6 +4738,7 @@
 <translation id="7371006317849674875">Start time</translation>
 <translation id="7371490947952970241">You can turn off location by turning off the main location setting on this device. You can also turn off the use of Wi-Fi, mobile networks and sensors for location in location settings.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Update device within an hour}other{Update device within # hours}}</translation>
 <translation id="7376553024552204454">Highlight the mouse cursor when it's moving</translation>
 <translation id="7377451353532943397">Continue blocking sensor access</translation>
 <translation id="73786666777299047">Open Chrome Web Store</translation>
@@ -4722,6 +4756,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">Set up connection on your <ph name="PHONE_NAME" /></translation>
 <translation id="7401778920660465883">Dismiss this message</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Safety check ran 1 hour ago}other{Safety check ran {NUM_HOURS} hours ago}}</translation>
 <translation id="740624631517654988">Pop-up blocked</translation>
 <translation id="7407430846095439694">Import and Bind</translation>
 <translation id="7407504355934009739">Most people block notifications from this site</translation>
@@ -4752,6 +4787,7 @@
 <translation id="7441830548568730290">Other users</translation>
 <translation id="7442465037756169001">Your Hangouts Meet hardware is ready to be set up.</translation>
 <translation id="744341768939279100">Create a new profile</translation>
+<translation id="744366959743242014">Loading data; this may take up to a few seconds.</translation>
 <translation id="7443806024147773267">Access your passwords whenever you're signed in to your Google account</translation>
 <translation id="7444983668544353857">Disable <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Automatically install apps</translation>
@@ -4787,6 +4823,7 @@
 <translation id="7489761397368794366">Call from your device</translation>
 <translation id="749028671485790643">Person <ph name="VALUE" /></translation>
 <translation id="7490813197707563893">MAC address</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 cookie}other{{NUM_COOKIES} cookies}}</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> extension may collect all the text you type, including personal data like passwords and credit card numbers. Do you want to use this extension?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Forgot your old password?</translation>
@@ -4807,10 +4844,14 @@
 <translation id="7513029293694390567">Automatically sign in to websites using stored credentials. If disabled, you will be asked for confirmation every time before signing in to a website.</translation>
 <translation id="7514239104543605883">Copy to your device</translation>
 <translation id="7514365320538308">Download</translation>
+<translation id="751523031290522286"><ph name="APP_NAME" /> is blocked by admin. Ask admin for permission to use this app.</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> is paused</translation>
+<translation id="7517063221058203587">{0,plural, =1{Update device within 1 minute}other{Update device within # minutes}}</translation>
 <translation id="7520766081042531487">Incognito portal: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">Say 'Ok Google'</translation>
 <translation id="7525067979554623046">Create</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 more}other{{NUM_DOWNLOADS} more}}</translation>
 <translation id="7529411698175791732">Check your Internet connection. If the problem continues, try signing out and signing in again.</translation>
 <translation id="7530016656428373557">Discharge Rate in Watts</translation>
 <translation id="7531779363494549572">Go to Settings &gt; Apps &amp; notifications &gt; Notifications.</translation>
@@ -4979,6 +5020,7 @@
 <translation id="7765158879357617694">Move</translation>
 <translation id="7766807826975222231">Take a tour</translation>
 <translation id="7766838926148951335">Accept permissions</translation>
+<translation id="7768770796815395237">Change</translation>
 <translation id="7769672763586021400">Model ID</translation>
 <translation id="7770651108375708429">Disconnect Wi-Fi</translation>
 <translation id="7771452384635174008">Layout</translation>
@@ -5415,6 +5457,7 @@
 <translation id="8286963743045814739">You can browse privately using an incognito window</translation>
 <translation id="8287902281644548111">Search by API call/URL</translation>
 <translation id="8288032458496410887">Uninstall <ph name="APP" />...</translation>
+<translation id="8289128870594824098">Disk size</translation>
 <translation id="8291967909914612644">Home provider country</translation>
 <translation id="8294431847097064396">Source</translation>
 <translation id="8297006494302853456">Weak</translation>
@@ -5627,6 +5670,7 @@
 <translation id="8608618451198398104">Add a Kerberos ticket</translation>
 <translation id="8609465669617005112">Move up</translation>
 <translation id="8610103157987623234">Incorrect format, please try again</translation>
+<translation id="8612935480510351790"><ph name="FILE_NAME" /> may be dangerous. Send to Google Advanced Protection for scanning?</translation>
 <translation id="8613164732773110792">Lowercase characters, digits, underscores or dashes only</translation>
 <translation id="8615618338313291042">Incognito App: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Drop shadow</translation>
@@ -5654,6 +5698,7 @@
 <translation id="8641606876632989680">Chrome will notify you when you sign in with a compromised password</translation>
 <translation id="8642900771896232685">2 seconds</translation>
 <translation id="8642947597466641025">Make Text Larger</translation>
+<translation id="8643443571868262066"><ph name="FILE_NAME" /> may be dangerous. Send to Google Advanced Protection for scanning?</translation>
 <translation id="8644655801811752511">Can’t reset this security key. Try resetting the key immediately after inserting it.</translation>
 <translation id="8645354835496065562">Continue allowing sensor access</translation>
 <translation id="8645920082661222035">Predicts and warns you about dangerous events before they happen</translation>
@@ -6074,6 +6119,7 @@
 <translation id="9169931577761441333">Add <ph name="APP_NAME" /> to Home screen</translation>
 <translation id="9170848237812810038">&amp;Undo</translation>
 <translation id="9170884462774788842">Another programme on your computer added a theme that may change the way Chrome works.</translation>
+<translation id="917350715406657904">You reached the time limit that your parent set for <ph name="APP_NAME" />. You can use it for <ph name="TIME_LIMIT" /> tomorrow.</translation>
 <translation id="9173995187295789444">Scanning for Bluetooth devices...</translation>
 <translation id="9174401638287877180">Send usage and diagnostic data. Help improve your child's Android experience by automatically sending diagnostic, device and app usage data to Google. This won't be used to identify your child, and will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. If additional Web &amp; App Activity setting is turned on for your child, this data may be saved to their Google Account.</translation>
 <translation id="917510707618656279">Ask when a site wants to access HID devices</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index c6aea7f..c91d937 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Leer y modificar todos los datos del sitio web actual cuando se invoca</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> quiere restablecer la configuración.</translation>
 <translation id="1243314992276662751">Cargar</translation>
-<translation id="1243398753772016127">Los sitios no podrán usar tu actividad de navegación en diferentes sitios para personalizar anuncios</translation>
 <translation id="1244265436519979884">El restablecimiento de Linux está en curso</translation>
 <translation id="1244303850296295656">Error de extensión</translation>
 <translation id="1246905108078336582">¿Quieres quitar la sugerencia del portapapeles?</translation>
@@ -196,7 +195,7 @@
 <translation id="1251366534849411931">Llave de apertura esperada: <ph name="ERROR_LINE" /></translation>
 <translation id="1252987234827889034">Se produjo un error en el perfil</translation>
 <translation id="1254593899333212300">Conexión directa a Internet</translation>
-<translation id="1259152067760398571">Ayer se ejecutó la verificación de seguridad</translation>
+<translation id="1259152067760398571">La verificación de seguridad se ejecutó ayer</translation>
 <translation id="1260451001046713751">Siempre permitir ventanas emergentes y redireccionamientos de <ph name="HOST" /></translation>
 <translation id="126156426083987769">Hubo un problema con las licencias del dispositivo en el modo de demostración.</translation>
 <translation id="126710816202626562">Idioma de traducción:</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Activado: Configuración personalizada</translation>
 <translation id="1489664337021920575">Elegir otra opción</translation>
 <translation id="1493892686965953381">Esperando <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">También quiero borrar los datos de navegación (<ph name="URL" />), lo que posiblemente me haga salir de Google.com.</translation>
 <translation id="1495486559005647033">Hay otros <ph name="NUM_PRINTERS" /> dispositivos disponibles.</translation>
 <translation id="1495677929897281669">Volver a la pestaña</translation>
 <translation id="1499271269825557605">Si no reconoces una extensión o el navegador no funciona correctamente, puedes desactivar o personalizar extensiones aquí.</translation>
@@ -518,7 +516,7 @@
 <translation id="1700079447639026019">Sitios que nunca pueden usar cookies</translation>
 <translation id="1701062906490865540">Eliminar a esta persona</translation>
 <translation id="1703331064825191675">Ya no tendrás que preocuparte por tus contraseñas</translation>
-<translation id="1704970325597567340">El <ph name="DATE" />, se ejecutó la verificación de seguridad</translation>
+<translation id="1704970325597567340">La verificación de seguridad se ejecutó el <ph name="DATE" /></translation>
 <translation id="1706586824377653884">Agregado por el administrador</translation>
 <translation id="1706625117072057435">Niveles de zoom</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
@@ -691,7 +689,7 @@
 <translation id="1921584744613111023"><ph name="DPI" /> ppp</translation>
 <translation id="192494336144674234">Abrir con</translation>
 <translation id="1925021887439448749">Ingresa una dirección web personalizada</translation>
-<translation id="1925124445985510535">A las <ph name="TIME" />, se ejecutó la verificación de seguridad</translation>
+<translation id="1925124445985510535">La verificación de seguridad se ejecutó a las <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Esta configuración se controla por medio de una política de la empresa. Ponte en contacto con tu administrador para obtener más información.</translation>
 <translation id="1927632033341042996">Dedo <ph name="NEW_FINGER_NUMBER" /></translation>
 <translation id="1928202201223835302">Ingresar PIN anterior</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Este ícono estará visible cuando la extensión se pueda utilizar en la página actual. Para usar esta extensión, haz clic en el ícono o presiona <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurar como Chromebox para reuniones</translation>
 <translation id="2580889980133367162">Siempre permitir que <ph name="HOST" /> descargue varios archivos</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Largo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plataforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">No se pudo obtener el ticket de Kerberos. Vuelve a intentarlo o comunícate con el administrador de dispositivos de tu organización. (Código de error <ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">Se bloquearon ventanas emergentes:</translation>
 <translation id="480990236307250886">Abrir la página principal</translation>
 <translation id="4811503964269049987">Crear un grupo con la pestaña seleccionada</translation>
-<translation id="4811818760963189951">Se desactivó porque inhabilitaste la sincronización del historial</translation>
 <translation id="4813136279048157860">Mis imágenes</translation>
 <translation id="4813512666221746211">Error de red</translation>
 <translation id="4814378367953456825">Escribe un nombre para esta huella digital</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Configuración adicional de contenido</translation>
 <translation id="5042282098504489593">Abrir la configuración para conectar <ph name="USB_DEVICE_NAME" /> a Linux</translation>
 <translation id="5043913660911154449">O especifica el PPD de tu impresora. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Se desactivó porque encriptaste los datos de sincronización con una frase de contraseña</translation>
 <translation id="5045550434625856497">Contraseña incorrecta</translation>
 <translation id="504561833207953641">Abriendo en una sesión existente del navegador</translation>
 <translation id="5047421709274785093">Bloquear el uso de los sensores de luz y movimiento en los sitios</translation>
@@ -3318,7 +3313,7 @@
 <translation id="5495597166260341369">Pantalla encendida</translation>
 <translation id="5496587651328244253">Organizar</translation>
 <translation id="5499313591153584299">Este archivo puede dañar el equipo.</translation>
-<translation id="5500709606820808700">Hoy se ejecutó la verificación de seguridad</translation>
+<translation id="5500709606820808700">La verificación de seguridad se ejecutó hoy</translation>
 <translation id="5502500733115278303">Importado desde Firefox</translation>
 <translation id="5505264765875738116">Los sitios no podrán preguntarte si quieres recibir notificaciones</translation>
 <translation id="5505307013568720083">Se agotó la tinta</translation>
@@ -3962,7 +3957,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />restablecer la sincronización<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Te damos la bienvenida a la familia <ph name="SHORT_PRODUCT_NAME" />. Esta no es una computadora convencional.</translation>
 <translation id="6358884629796491903">Dragón</translation>
-<translation id="6360719647236334056">Usa tu historial de navegación de Chrome para personalizar la Búsqueda, los anuncios y otros Servicios de Google</translation>
 <translation id="6361850914223837199">Detalles del error:</translation>
 <translation id="6362853299801475928">&amp;Cómo informar de un problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4240,7 +4234,6 @@
 <translation id="6758056191028427665">Danos tu opinión sobre nuestro trabajo.</translation>
 <translation id="6759193508432371551">Restablecer configuración de fábrica</translation>
 <translation id="6762833852331690540">Sí</translation>
-<translation id="6764693078871405569">También quiero borrar los datos de navegación (<ph name="URL" />), lo que me hará salir de <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Elegir otro idioma…</translation>
 <translation id="6767639283522617719">No se puede unir al dominio. Asegúrate de que sea correcta la configuración de la unidad organizacional.</translation>
 <translation id="6769712124046837540">Agregando impresora…</translation>
@@ -6025,7 +6018,7 @@
 <translation id="9101691533782776290">Iniciar aplicación</translation>
 <translation id="9102610709270966160">Habilitar extensión</translation>
 <translation id="9103868373786083162">Presiona para retroceder; usa el menú contextual para consultar el historial</translation>
-<translation id="9108808586816295166">Es posible que el DNS seguro no esté disponible en todo momento</translation>
+<translation id="9108808586816295166">Es posible que el DNS seguro no esté disponible en todo momento</translation>
 <translation id="9109122242323516435">Para liberar espacio, borra archivos del almacenamiento del dispositivo.</translation>
 <translation id="9109283579179481106">Conéctate a una red móvil</translation>
 <translation id="9111102763498581341">Desbloquear</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 6bf414c9..625a0b9 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Leer y modificar todos los datos del sitio web actual cuando se ejecute</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> quiere restablecer la configuración.</translation>
 <translation id="1243314992276662751">Subir</translation>
-<translation id="1243398753772016127">Los sitios web no podrán utilizar tu actividad de navegación para personalizar anuncios</translation>
 <translation id="1244265436519979884">Hay una restauración de Linux en curso</translation>
 <translation id="1244303850296295656">Error de extensión</translation>
 <translation id="1246905108078336582">¿Quieres quitar la sugerencia del portapapeles?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Activada: configuración personalizada</translation>
 <translation id="1489664337021920575">Elegir otra opción</translation>
 <translation id="1493892686965953381">Esperando <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Borrar también los datos de navegación (<ph name="URL" />); esto puede causar que se cierre tu sesión en Google.com</translation>
 <translation id="1495486559005647033">Otros <ph name="NUM_PRINTERS" /> dispositivos disponibles.</translation>
 <translation id="1495677929897281669">Volver a la pestaña</translation>
 <translation id="1499271269825557605">Si no reconoces una extensión o el navegador no funciona correctamente, aquí puedes desactivar o personalizar las extensiones.</translation>
@@ -1052,7 +1050,7 @@
 <translation id="241082044617551207">Complemento desconocido</translation>
 <translation id="2412593942846481727">Actualización disponible</translation>
 <translation id="2413749388954403953">Cambiar la interfaz de usuario de marcadores</translation>
-<translation id="2417206894320497232">Ya puedes usar Plugin VM</translation>
+<translation id="2417206894320497232">Ya puedes usar Plugin VM.</translation>
 <translation id="241727068219398187">Se han cifrado los datos con tu contraseña de Google desde el
           <ph name="TIME" />. El cifrado no incluye los métodos de pago ni las direcciones de Google Pay.</translation>
 <translation id="2419706071571366386">Por motivos de seguridad, cierra la sesión cuando termines de utilizar tu ordenador.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Este icono estará visible cuando la extensión se pueda utilizar en la página actual. Para utilizar la extensión, haz clic en el icono o pulsa <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurar como Chromebox para reuniones</translation>
 <translation id="2580889980133367162">Permitir siempre a <ph name="HOST" /> descargar varios archivos</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Largo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plataforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">No se ha podido obtener el ticket de Kerberos. Vuelve a intentarlo o ponte en contacto con el administrador de dispositivos de tu organización. Código de error: <ph name="ERROR_CODE" />.</translation>
@@ -1717,7 +1714,7 @@
 <translation id="3293644607209440645">Enviar esta página</translation>
 <translation id="32939749466444286">El contenedor de Linux no se ha iniciado. Inténtalo de nuevo.</translation>
 <translation id="3294437725009624529">Invitado</translation>
-<translation id="3296193636298964625">Chrome no ha podido comprobar todas tus contraseñas porque son demasiadas.</translation>
+<translation id="3296193636298964625">Chrome no ha podido comprobar todas tus contraseñas porque hay demasiadas.</translation>
 <translation id="329703603001918157">No se puede editar el acceso directo</translation>
 <translation id="329838636886466101">Reparar</translation>
 <translation id="3298789223962368867">URL introducida no válida</translation>
@@ -2017,7 +2014,7 @@
 <translation id="3690369331356918524">Te avisa si tus contraseñas se ven expuestas en una quiebra de seguridad de datos</translation>
 <translation id="3691231116639905343">Aplicaciones de teclados</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> quiere compartir tu pantalla</translation>
-<translation id="369135240373237088">Iniciar sesión con una cuenta de centro educativo</translation>
+<translation id="369135240373237088">Inicia sesión de nuevo con una cuenta de centro educativo</translation>
 <translation id="3693415264595406141">Contraseña:</translation>
 <translation id="3694027410380121301">Seleccionar pestaña anterior</translation>
 <translation id="369489984217678710">Contraseñas y otros datos de inicio de sesión</translation>
@@ -2818,7 +2815,6 @@
 <translation id="4808667324955055115">Pop-ups bloqueados</translation>
 <translation id="480990236307250886">Abrir página de inicio</translation>
 <translation id="4811503964269049987">Agrupar pestañas seleccionadas</translation>
-<translation id="4811818760963189951">Se ha desactivado porque has inhabilitado la sincronización del historial</translation>
 <translation id="4813136279048157860">Mis imágenes</translation>
 <translation id="4813512666221746211">Error de red</translation>
 <translation id="4814378367953456825">Escribe un nombre para esta huella digital</translation>
@@ -2987,7 +2983,6 @@
 <translation id="5040823038948176460">Configuración de contenido adicional</translation>
 <translation id="5042282098504489593">Abrir Ajustes para conectar <ph name="USB_DEVICE_NAME" /> a Linux</translation>
 <translation id="5043913660911154449">O especifica el archivo PPD de tu impresora. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Se ha desactivado porque cifraste tu sincronización de datos con una frase de contraseña</translation>
 <translation id="5045550434625856497">Contraseña incorrecta</translation>
 <translation id="504561833207953641">Se está abriendo en una sesión de navegador existente.</translation>
 <translation id="5047421709274785093">Evitar que los sitios web usen los sensores de luz y movimiento</translation>
@@ -2997,7 +2992,7 @@
 <translation id="5052499409147950210">Editar sitio web</translation>
 <translation id="5053604404986157245">La contraseña de TPM generada de forma aleatoria no está disponible. Esto es normal después de un Powerwash.</translation>
 <translation id="5057110919553308744">Al hacer clic en la extensión</translation>
-<translation id="5057403786441168405">Gestiona las cuentas con las que hayas iniciado sesión. Los sitios web, las aplicaciones y las extensiones de Chrome y Google Play pueden usar estas cuentas para personalizar tu experiencia si has concedido los permisos correspondientes. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
+<translation id="5057403786441168405">Gestiona las cuentas con las que hayas iniciado sesión. Los sitios web, las aplicaciones y las extensiones de Chrome y Google Play pueden usar estas cuentas para personalizar tu experiencia en función de los permisos existentes. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="5060332552815861872">Hay 1 impresora que se puede guardar.</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Esta carpeta contiene un marcador. ¿Seguro que quieres eliminarla?}other{Esta carpeta contiene # marcadores. ¿Seguro que quieres eliminarla?}}</translation>
 <translation id="5062930723426326933">Se ha producido un error al iniciar sesión. Conéctate a Internet y vuelve a intentarlo.</translation>
@@ -3964,7 +3959,6 @@
 <translation id="63566973648609420">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 estos ajustes, debes <ph name="BEGIN_LINK" />restablecer la sincronización<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Te damos la bienvenida a la familia <ph name="SHORT_PRODUCT_NAME" />. Este no es un ordenador convencional.</translation>
 <translation id="6358884629796491903">Dragón</translation>
-<translation id="6360719647236334056">Utiliza tu historial de navegación de Chrome para personalizar la Búsqueda, los anuncios y otros Servicios de Google</translation>
 <translation id="6361850914223837199">Detalles del error:</translation>
 <translation id="6362853299801475928">&amp;Notificar un error...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4242,7 +4236,6 @@
 <translation id="6758056191028427665">Envíanos tu opinión sobre nuestro servicio.</translation>
 <translation id="6759193508432371551">Restablecer estado de fábrica</translation>
 <translation id="6762833852331690540">Activado</translation>
-<translation id="6764693078871405569">Borrar también los datos de navegación (<ph name="URL" />), lo que cerrará tu sesión en <ph name="DOMAIN" /></translation>
 <translation id="6767566652486411142">Elegir otro idioma...</translation>
 <translation id="6767639283522617719">No se puede vincular el dominio. Comprueba que la configuración de la unidad organizativa sea correcta.</translation>
 <translation id="6769712124046837540">Añadiendo impresora...</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 7637268..9586d24 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Aktiveerimisel saate praegusel veebisaidil lugeda ja muuta kõiki oma andmeid</translation>
 <translation id="1242633766021457174">Tööriist <ph name="THIRD_PARTY_TOOL_NAME" /> soovib teie seaded lähtestada.</translation>
 <translation id="1243314992276662751">Laadi üles</translation>
-<translation id="1243398753772016127">Saidid ei saa reklaamide isikupärastamiseks eri saitidel teie sirvimistegevust kasutada.</translation>
 <translation id="1244265436519979884">Linuxi taastamine on pooleli</translation>
 <translation id="1244303850296295656">Laienduse viga</translation>
 <translation id="1246905108078336582">Kas eemaldada soovitus lõikelaualt?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Sees – kohandatud seaded</translation>
 <translation id="1489664337021920575">Tehke teine valik</translation>
 <translation id="1493892686965953381">Laienduse <ph name="LOAD_STATE_PARAMETER" /> ootamine ...</translation>
-<translation id="1494438840282430403">Kustutage ka sirvimisandmed (<ph name="URL" />). See võib teid saidilt Google.com välja logida.</translation>
 <translation id="1495486559005647033">Saadaval on veel <ph name="NUM_PRINTERS" /> seadet.</translation>
 <translation id="1495677929897281669">Tagasi vahelehele</translation>
 <translation id="1499271269825557605">Kui laiendus on teile võõras või brauser ei tööta ootuspäraselt, saate siin laiendusi kohandada või need välja lülitada.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ikoon on nähtav, kui laiendus saab praegusel lehel toimida. Laienduse kasutamiseks klõpsake ikoonil või vajutage klahvikombinatsiooni <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Seadista seadmena Chromebox koosolekutele</translation>
 <translation id="2580889980133367162">Luba alati hostil <ph name="HOST" /> laadida alla mitu faili</translation>
-<translation id="2580924999637585241">Kokku: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Pikk</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platvorm <ph name="PLATFORM_VERSION" />), <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberose pileti hankimine ebaõnnestus. Proovige uuesti või võtke ühendust oma organisatsiooni seadmete administraatoriga. (Veakood <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Hüpikaknad on blokeeritud</translation>
 <translation id="480990236307250886">Ava avaleht</translation>
 <translation id="4811503964269049987">Grupeeri valitud vaheleht</translation>
-<translation id="4811818760963189951">Lülitati välja, kuna keelasite ajaloo sünkroonimise</translation>
 <translation id="4813136279048157860">Minu pildid</translation>
 <translation id="4813512666221746211">Võrgu viga</translation>
 <translation id="4814378367953456825">Sisestage sellele sõrmejäljele nimi</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Täiendavad sisuseaded</translation>
 <translation id="5042282098504489593">Seadme <ph name="USB_DEVICE_NAME" /> Linuxiga ühendamiseks avage menüü Seaded</translation>
 <translation id="5043913660911154449">Või määrake printeri PPD <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Lülitati välja, kuna krüpteerisite oma sünkroonitud andmed parooliga</translation>
 <translation id="5045550434625856497">Vale salasõna</translation>
 <translation id="504561833207953641">Olemasolevas brauseriseansis avamine.</translation>
 <translation id="5047421709274785093">Blokeeri saitide jaoks liikumis- ja valgusandurite kasutamine</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Teie krüpteeritud andmeid saavad lugeda vaid need, kes teavad teie parooli – seda ei saadeta Google'ile ja Google ei talleta seda. Kui unustate parooli või soovite seda seadet muuta, tuleb teil <ph name="BEGIN_LINK" />sünkroonimine lähtestada<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Tere tulemast <ph name="SHORT_PRODUCT_NAME" />'i kasutajate perre. See ei ole tavaline arvuti.</translation>
 <translation id="6358884629796491903">Draakon</translation>
-<translation id="6360719647236334056">Kasutage oma Chrome'i sirvimisajalugu otsingu, reklaamide ja muude Google'i teenuste isikupärastamiseks</translation>
 <translation id="6361850914223837199">Vea üksikasjad:</translation>
 <translation id="6362853299801475928">&amp;Probleemidest teavitamine ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Andke teada, kuidas meil läheb.</translation>
 <translation id="6759193508432371551">Tehaseseadete lähtestamine</translation>
 <translation id="6762833852331690540">Sees</translation>
-<translation id="6764693078871405569">Kustutage ka sirvimisandmed (<ph name="URL" />). See võib teid saidilt <ph name="DOMAIN" /> välja logida.</translation>
 <translation id="6767566652486411142">Valige teine keel …</translation>
 <translation id="6767639283522617719">Domeeniga ei saa liituda. Veenduge, et organisatsiooniüksuse seaded oleksid õiged.</translation>
 <translation id="6769712124046837540">Printeri lisamine ...</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index c70cfd6..23d183e 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Abiarazitakoan, irakurri eta aldatu uneko webgunean dituzun datu guztiak</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> tresnak ezarpenak berrezarri nahi ditu.</translation>
 <translation id="1243314992276662751">Kargatu</translation>
-<translation id="1243398753772016127">Webguneek ezingo dituzte erabili zure arakatze-jarduerak webguneetan erakusten zaizkizun iragarkiak pertsonalizatzeko</translation>
 <translation id="1244265436519979884">Linux-en edukiontzia leheneratzen</translation>
 <translation id="1244303850296295656">Luzapenaren errorea</translation>
 <translation id="1246905108078336582">Iradokizuna arbeletik kendu nahi duzu?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Aktibatuta: ezarpen pertsonalizatuak</translation>
 <translation id="1489664337021920575">Hautatu beste aukera bat</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> parametroaren zain…</translation>
-<translation id="1494438840282430403">Garbitu arakatze-datuak ere (<ph name="URL" />); Google.com webguneko saioa ixtea eragin dezake horrek.</translation>
 <translation id="1495486559005647033">Beste <ph name="NUM_PRINTERS" /> gailu erabilgarri.</translation>
 <translation id="1495677929897281669">Itzuli fitxara</translation>
 <translation id="1499271269825557605">Luzapenen bat ezagutzen ez baduzu edo arakatzaileak ez badu funtzionatzen behar bezala, desaktibatu edo pertsonalizatu luzapenak hemen.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ikono hau ikusgai egongo da luzapena orri honetan ekintzak egin ditzakeenean. Luzapena erabiltzeko, sakatu ikonoa edo <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfiguratu bileretarako Chromebox gisa</translation>
 <translation id="2580889980133367162">Eman beti hainbat fitxategi deskargatzeko baimena <ph name="HOST" /> ostalariari</translation>
-<translation id="2580924999637585241">Guztira: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Luzea</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (<ph name="PLATFORM_VERSION" /> plataforma) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Ezin izan da lortu Kerberos-eko zerbitzu-eskaera. Saiatu berriro edo jarri harremanetan erakundeko gailuen administratzailearekin. (Errore-kodea: <ph name="ERROR_CODE" />).</translation>
@@ -2284,7 +2281,7 @@
 <translation id="3994374631886003300"><ph name="DEVICE_TYPE" /> gailua desblokeatzeko, desblokeatu telefonoa eta hurbil ezazu.</translation>
 <translation id="3994878504415702912">&amp;Zooma</translation>
 <translation id="3995138139523574647">USB-C gailua (eskuinaldeko atzeko ataka)</translation>
-<translation id="4002329649066944389">Kudeatu webguneen salbuespen zehatzak</translation>
+<translation id="4002329649066944389">Kudeatu webgunearen salbuespen zehatzak</translation>
 <translation id="4002440992267487163">PIN kodearen konfigurazioa</translation>
 <translation id="4005817994523282006">Ordu-zona hautemateko metodoa</translation>
 <translation id="4007856537951125667">Ezkutatu lasterbideak</translation>
@@ -2536,7 +2533,7 @@
 <translation id="439266289085815679"><ph name="USER_EMAIL" /> erabiltzaileak kontrolatzen du Bluetooth konfigurazioa.</translation>
 <translation id="4392896746540753732">Editatu konfigurazio-fitxategia</translation>
 <translation id="4394049700291259645">Desgaitu</translation>
-<translation id="439817266247065935">Gailua ez da behar bezala itxi. Linux-eko aplikazioak erabiltzeko, berrabiarazi Linux.</translation>
+<translation id="439817266247065935">Gailua ez da behar bezala itxi. Linux-erako aplikazioak erabiltzeko, berrabiarazi Linux.</translation>
 <translation id="4400367121200150367">Hemen agertuko dira pasahitzak inoiz gordetzen ez dituzten webguneak</translation>
 <translation id="4400632832271803360">Goiko errenkadako teklen portaera aldatzeko, eduki sakatuta Abiarazlea tekla</translation>
 <translation id="4400963414856942668">Fitxen laster-markak egiteko, egin klik izarrean</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Leiho gainerakorrak blokeatuta daude:</translation>
 <translation id="480990236307250886">Ireki orri nagusia</translation>
 <translation id="4811503964269049987">Taldekatu hautatutako fitxa</translation>
-<translation id="4811818760963189951">Desaktibatu egin da historiaren sinkronizazioa desgaitu duzulako</translation>
 <translation id="4813136279048157860">Nire irudiak</translation>
 <translation id="4813512666221746211">Sarearen errorea</translation>
 <translation id="4814378367953456825">Idatzi hatz-markaren izena</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Edukiaren ezarpen gehigarriak</translation>
 <translation id="5042282098504489593">Ireki Ezarpenak atala <ph name="USB_DEVICE_NAME" /> gailua Linux-era konektatzeko</translation>
 <translation id="5043913660911154449">Edo zehaztu inprimagailuaren PPD fitxategia <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Desaktibatu egin da pasaesaldi batekin enkriptatu dituzulako sinkronizatutako datuak</translation>
 <translation id="5045550434625856497">Pasahitz okerra</translation>
 <translation id="504561833207953641">Dagoen arakatze-saioan irekitzen.</translation>
 <translation id="5047421709274785093">Ez utzi webguneei mugimendu- eta argi-sentsoreak erabiltzen</translation>
@@ -2998,7 +2993,7 @@
 <translation id="5052499409147950210">Editatu webgunea</translation>
 <translation id="5053604404986157245">Ausaz sortutako TPM pasahitza ez dago erabilgarri. Normala da hori gertatzea fabrikako ezarpenak berrezarri ondoren.</translation>
 <translation id="5057110919553308744">Luzapena sakatzen duzunean</translation>
-<translation id="5057403786441168405">Kudeatu saioa hasita duten kontuak. Baimenen arabera, Chrome eta Google Play-ko webgune, aplikazio eta luzapenek kontu horiek erabil ditzakete zerbitzua pertsonalizatzeko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
+<translation id="5057403786441168405">Kudeatu saioa hasita daukaten kontuak. Baimenen arabera, Chrome eta Google Play-ko webgune, aplikazio eta luzapenek kontu horiek erabil ditzakete zerbitzua pertsonalizatzeko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="5060332552815861872">1 inprimagailu dago gordetzeko.</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Laster-marka bat du karpeta honek. Ziur ezabatu nahi duzula?}other{# laster-marka ditu karpeta honek. Ziur ezabatu nahi duzula?}}</translation>
 <translation id="5062930723426326933">Ezin izan da saioa hasi. Konektatu Internetera eta saiatu berriro.</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Pasaesaldia duten pertsonek soilik irakur ditzakete enkriptatutako datuak. Pasaesaldia ez da Google-ra bidaltzen, ezta bertan gordetzen ere. Pasaesaldia ahazten bazaizu edo ezarpena aldatu nahi baduzu, sinkronizazioa berrezarri beharko duzu. <ph name="BEGIN_LINK" />Berrezarri sinkronizazioa<ph name="END_LINK" /></translation>
 <translation id="6357619544108132570">Ongi etorri <ph name="SHORT_PRODUCT_NAME" /> familiara. Hau ez da ohiko ordenagailua.</translation>
 <translation id="6358884629796491903">Dragoia</translation>
-<translation id="6360719647236334056">Erabili Chrome-ko arakatze-historia Bilaketa, iragarkiak eta Google-ren beste zerbitzu batzuk pertsonalizatzeko</translation>
 <translation id="6361850914223837199">Errorearen xehetasunak:</translation>
 <translation id="6362853299801475928">&amp;Eman arazo baten berri…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Eman iritzia.</translation>
 <translation id="6759193508432371551">Jatorrizko datuak berrezartzea</translation>
 <translation id="6762833852331690540">Aktibatuta</translation>
-<translation id="6764693078871405569">Garbitu arakatze-datuak ere (<ph name="URL" />); <ph name="DOMAIN" /> webguneko saioa ixtea eragin dezake horrek.</translation>
 <translation id="6767566652486411142">Aukeratu beste hizkuntza bat…</translation>
 <translation id="6767639283522617719">Ezin izan da sartu domeinuan. Ziurtatu antolamendu-unitatearen ezarpenak zuzenak direla.</translation>
 <translation id="6769712124046837540">Inprimagailua gehitzen…</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index c0859a1..3c72318 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">خواندن و تغییر همه داده‌های شما در وب‌سایت کنونی هنگام فراخوانی</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> می‌خواهد تنظیمات شما را بازنشانی کند.</translation>
 <translation id="1243314992276662751">بارگذاری</translation>
-<translation id="1243398753772016127">سایت‌ها نمی‌توانند از فعالیت مرور شما در سایت‌های مختلف برای شخصی‌سازی آگهی استفاده کنند</translation>
 <translation id="1244265436519979884">‏درحال‌حاضر بازیابی Linux درحال انجام است</translation>
 <translation id="1244303850296295656">خطای افزونه</translation>
 <translation id="1246905108078336582">پیشنهاد از بریده‌دان حذف شود؟</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">روشن - تنظیمات سفارشی</translation>
 <translation id="1489664337021920575">انتخاب گزینه‌ای دیگر</translation>
 <translation id="1493892686965953381">انتظار برای <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">‏همچنین داده‌های محصول مرور (<ph name="URL" />) را پاک می‌کند که ممکن است شما را از سیستم Google.com خارج کند.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> دستگاه دیگر در دسترس است.</translation>
 <translation id="1495677929897281669">برگشتن به برگه</translation>
 <translation id="1499271269825557605">اگر افزونه‌ای برایتان آشنا نیست یا اگر مرورگری طبق انتظار کار نمی‌کند، می‌توانید افزونه‌ها را در اینجا خاموش یا سفارشی کنید.</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">وقتی برنامه افزودنی بتواند در صفحه کنونی کار کند این نماد قابل مشاهده خواهد بود. با کلیک کردن روی نماد یا با فشار دادن <ph name="EXTENSION_SHORTCUT" /> از این برنامه افزودنی استفاده کنید.</translation>
 <translation id="257779572837908839">‏راه‌اندازی به‌عنوان Chromebox برای جلسات</translation>
 <translation id="2580889980133367162">همیشه به <ph name="HOST" /> اجازه داده شود چند فایل را بارگیری کند</translation>
-<translation id="2580924999637585241">مجموع: <ph name="SHEETS_LABEL" /><ph name="NUMBER_OF_SHEETS" /></translation>
 <translation id="258095186877893873">طولانی</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (پلتفورم <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">‏بلیت Kerberos اضافه نشد. دوباره امتحان کنید یا با سرپرست دستگاه سازمانتان تماس بگیرید. (کد خطا: <ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">پنجره‌های بازشو مسدود هستند:</translation>
 <translation id="480990236307250886">باز کردن صفحه اصلی</translation>
 <translation id="4811503964269049987">گروه‌بندی برگه انتخابی</translation>
-<translation id="4811818760963189951">چون همگام‌سازی سابقه را غیرفعال کرده‌اید، خاموش شده است</translation>
 <translation id="4813136279048157860">تصاویر من</translation>
 <translation id="4813512666221746211">خطای شبکه</translation>
 <translation id="4814378367953456825">نامی برای این اثرانگشت وارد کنید</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">تنظیمات محتوای دیگر</translation>
 <translation id="5042282098504489593">‏برای اتصال <ph name="USB_DEVICE_NAME" /> به Linux، «تنظیمات» را باز کنید</translation>
 <translation id="5043913660911154449">‏یا PPD چاپگرتان را تعیین کنید <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">چون داده‌های همگام‌سازی‌تان را با عبارت عبور رمزگذاری کرده‌اید، خاموش شده است</translation>
 <translation id="5045550434625856497">گذرواژه نادرست</translation>
 <translation id="504561833207953641">درحال باز شدن در جلسه مرورگر کنونی.</translation>
 <translation id="5047421709274785093">استفاده از حسگرهای نوری و حرکتی توسط سایت‌ها مسدود شود</translation>
@@ -3962,7 +3957,6 @@
 <translation id="63566973648609420">‏فقط فردی که عبارت عبور شما را دارد می‌تواند اطلاعات رمزگذاری‌شده‌تان را بخواند. این عبارت عبور به Google ارسال یا در سرورهای آن ذخیره نمی‌شود. اگر عبارت عبورتان را فراموش کنید، باید همگام‌سازی را بازنشانی کنید. <ph name="BEGIN_LINK" />بازنشانی همگام‌سازی<ph name="END_LINK" /></translation>
 <translation id="6357619544108132570">به خانواده <ph name="SHORT_PRODUCT_NAME" /> خوش آمدید. این یک رایانه معمولی نیست.</translation>
 <translation id="6358884629796491903">اژدها</translation>
-<translation id="6360719647236334056">‏استفاده از سابقه مرور Chrome برای شخصی‌سازی «جستجو»، آگهی‌ها، و دیگر سرویس‌های Google</translation>
 <translation id="6361850914223837199">جزئیات خطا:</translation>
 <translation id="6362853299801475928">&amp;گزارش یک مشکل...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4240,7 +4234,6 @@
 <translation id="6758056191028427665">عملکردمان را به ما نشان دهید.</translation>
 <translation id="6759193508432371551">بازنشانی به تنظیمات کارخانه</translation>
 <translation id="6762833852331690540">روشن</translation>
-<translation id="6764693078871405569">همچنین داده‌های محصول مرور (<ph name="URL" />) را پاک می‌کند که شما را از سیستم <ph name="DOMAIN" /> خارج می‌کند.</translation>
 <translation id="6767566652486411142">انتخاب زبانی دیگر…</translation>
 <translation id="6767639283522617719">نمی‌توان دستگاه را به دامنه وصل کرد. مطمئن شوید تنظیمات مربوط به واحد سازمانی صحیح است.</translation>
 <translation id="6769712124046837540">در حال افزودن چاپگر...</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 22bbbe7..9fade9b 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">lukea ja muokata kaikkia avoimen verkkosivuston tietojasi kutsuttaessa</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> haluaa nollata asetuksesi.</translation>
 <translation id="1243314992276662751">Lähetä</translation>
-<translation id="1243398753772016127">Sivustot eivät voi personoida sinulle mainoksia muiden sivustojen selaustoimintasi perusteella.</translation>
 <translation id="1244265436519979884">Linux-palautus käynnissä</translation>
 <translation id="1244303850296295656">Laajennusvirhe</translation>
 <translation id="1246905108078336582">Poistetaanko ehdotus leikepöydältä?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Päällä – muokatut asetukset</translation>
 <translation id="1489664337021920575">Valitse toinen vaihtoehto</translation>
 <translation id="1493892686965953381">Odotetaan parametria <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Poista lisäksi selaustiedot (<ph name="URL" />). Tämä saattaa kirjata sinut ulos Google.comista.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> muuta laitetta käytettävissä.</translation>
 <translation id="1495677929897281669">Takaisin välilehdelle</translation>
 <translation id="1499271269825557605">Jos et tunnista laajennusta tai selain ei toimi odotetusti, täällä voit muokata tai asettaa pois päältä laajennuksia.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Tämä kuvake näkyy, kun laajennus voi toimia nykyisellä sivulla. Ota laajennus käyttöön klikkaamalla kuvaketta tai painamalla <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Määritä Chromebox kokouksille ‑tilaan</translation>
 <translation id="2580889980133367162">Anna aina isännän <ph name="HOST" /> ladata useita tiedostoja</translation>
-<translation id="2580924999637585241">Yhteensä: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Pitkä</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (alusta <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos-tukipyynnön hakeminen epäonnistui. Yritä uudelleen tai ota yhteyttä organisaatiosi järjestelmänvalvojaan. (Virhekoodi <ph name="ERROR_CODE" />).</translation>
@@ -2454,7 +2451,7 @@
 <translation id="4263223596040212967">Tarkista näppäimistöasettelu ja yritä uudelleen.</translation>
 <translation id="4263757076580287579">Tulostimen rekisteröinti on peruutettu.</translation>
 <translation id="426564820080660648">Tarkista päivitykset Ethernetin, Wi-Fin tai mobiilitiedonsiirron kautta.</translation>
-<translation id="4267455501101322486">Pyydä vanhemmalta lupaa, jotta tili voi saada pääsyn oppimateriaaliin.</translation>
+<translation id="4267455501101322486">Pyydä vanhemmiltasi lupa lisätä tili, niin että siltä pääsee oppimateriaaleihin.</translation>
 <translation id="4267953847983678297">Yhdistä automaattisesti mobiiliverkkoon</translation>
 <translation id="4268025649754414643">Avaimen salakoodaus</translation>
 <translation id="4270393598798225102">Versio <ph name="NUMBER" /></translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">Ponnahdusikkunat estetty:</translation>
 <translation id="480990236307250886">Avaa oma etusivu</translation>
 <translation id="4811503964269049987">Lisää valittu välilehti ryhmään</translation>
-<translation id="4811818760963189951">Pois päältä, koska laitoit historian synkronoinnin pois päältä</translation>
 <translation id="4813136279048157860">Omat kuvat</translation>
 <translation id="4813512666221746211">Verkkovirhe</translation>
 <translation id="4814378367953456825">Anna sormenjäljelle nimi</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Muut sisältöasetukset</translation>
 <translation id="5042282098504489593">Avaa Asetukset, jotta <ph name="USB_DEVICE_NAME" /> voidaan yhdistää Linuxiin</translation>
 <translation id="5043913660911154449">Tai kerro tulostimen PPD <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Pois päältä, koska salasit synkronointidatan tunnuslauseella</translation>
 <translation id="5045550434625856497">Väärä salasana</translation>
 <translation id="504561833207953641">Avataan nykyisessä selainistunnossa</translation>
 <translation id="5047421709274785093">Estä sivustoja käyttämästä liike- ja valotunnistimia.</translation>
@@ -3964,7 +3959,6 @@
 <translation id="63566973648609420">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, <ph name="BEGIN_LINK" />synkronointi on nollattava<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Tervetuloa <ph name="SHORT_PRODUCT_NAME" />-perheeseen. Tämä ei ole mikään tavallinen tietokone.</translation>
 <translation id="6358884629796491903">Lohikäärme</translation>
-<translation id="6360719647236334056">Personoi Hakua, mainoksia ja muita Googlen palveluja Chromen selaushistoriasi perusteella</translation>
 <translation id="6361850914223837199">Virheen tiedot:</translation>
 <translation id="6362853299801475928">&amp;Ilmoita ongelmasta...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4242,7 +4236,6 @@
 <translation id="6758056191028427665">Kerro mielipiteesi</translation>
 <translation id="6759193508432371551">Tehdasasetusten palauttaminen</translation>
 <translation id="6762833852331690540">Päällä</translation>
-<translation id="6764693078871405569">Poista lisäksi selaustiedot (<ph name="URL" />). Tämä kirjaa sinut ulos osoitteesta <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Valitse toinen kieli…</translation>
 <translation id="6767639283522617719">Verkkotunnukseen liittyminen ei onnistu. Varmista, että organisaatioyksikön asetukset on määritetty oikein.</translation>
 <translation id="6769712124046837540">Tulostinta lisätään…</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 3c43b6d..1930b57 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Basahin at baguhin ang lahat ng iyong data sa kasalukuyang website kapag na-invoke</translation>
 <translation id="1242633766021457174">Gustong i-reset ng <ph name="THIRD_PARTY_TOOL_NAME" /> ang iyong mga setting.</translation>
 <translation id="1243314992276662751">I-upload</translation>
-<translation id="1243398753772016127">Hindi puwedeng gamitin ng mga site ang iyong aktibidad sa pag-browse sa lahat ng iba't ibang site para mag-personalize ng mga ad</translation>
 <translation id="1244265436519979884">Kasalukuyang isinasagawa ang pag-restore ng Linux</translation>
 <translation id="1244303850296295656">Error sa extension</translation>
 <translation id="1246905108078336582">Alisin ang suhestyon mula sa clipboard?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Naka-on - mga custom na setting</translation>
 <translation id="1489664337021920575">Pumili ng ibang opsyon</translation>
 <translation id="1493892686965953381">Hinihintay ang <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">I-clear din ang data mula sa pag-browse (<ph name="URL" />) na posibleng mag-sign out sa iyo sa Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> (na) iba pang available na device.</translation>
 <translation id="1495677929897281669">Bumalik sa tab</translation>
 <translation id="1499271269825557605">Kung hindi mo nakikilala ang isang extension, o kung hindi gumagana ang iyong browser gaya nang inaasahan, puwede mong i-off o i-customize ang mga extension dito.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Makikita ang icon na ito kapag makakakilos ang extension sa kasalukuyang pahina. Gamitin ang extension na ito sa pamamagitan ng pag-click sa icon o sa pamamagitan ng pagpindot sa <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">I-set up bilang Chromebox for meetings</translation>
 <translation id="2580889980133367162">Palaging payagan ang <ph name="HOST" /> na mag-download ng maraming file</translation>
-<translation id="2580924999637585241">Kabuuan: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Matagal</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Hindi makuha ang ticket ng Kerberos. Subukan ulit, o makipag-ugnayan sa admin ng device ng iyong organisasyon. (Code ng error <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Naka-block ang mga pop-up</translation>
 <translation id="480990236307250886">Buksan ang home page</translation>
 <translation id="4811503964269049987">Pagpangkatin ang Napiling Tab</translation>
-<translation id="4811818760963189951">Na-off dahil na-disable mo ang pag-sync ng history</translation>
 <translation id="4813136279048157860">Aking Mga Larawan</translation>
 <translation id="4813512666221746211">Error sa network</translation>
 <translation id="4814378367953456825">Maglagay ng pangalan para sa fingerprint na ito</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Mga karagdagang setting ng content</translation>
 <translation id="5042282098504489593">Buksan ang Mga Setting para ikonekta ang <ph name="USB_DEVICE_NAME" /> sa Linux</translation>
 <translation id="5043913660911154449">O tukuyin ang PPD ng iyong printer <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Naka-off dahil na na-encrypt mo ang iyong sini-sync na data gamit ang isang passphrase</translation>
 <translation id="5045550434625856497">Hindi wastong password</translation>
 <translation id="504561833207953641">Binubuksan sa kasalukuyang session ng browser.</translation>
 <translation id="5047421709274785093">I-block ang paggamit ng mga site ng mga motion at light sensor</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Ang taong may alam ng passphrase mo lang ang makakabasa sa iyong naka-encrypt na data. Hindi ipinapadala sa o iniimbak ng Google ang passphrase. Kung makalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, kakailanganin mong <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Welcome sa pamilya ng <ph name="SHORT_PRODUCT_NAME" />. Hindi ito ordinaryong computer.</translation>
 <translation id="6358884629796491903">Dragon</translation>
-<translation id="6360719647236334056">Gamitin ang iyong history ng pag-browse ng Chrome para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation>
 <translation id="6361850914223837199">Mga detalye ng error:</translation>
 <translation id="6362853299801475928">&amp;Mag-ulat ng isang isyu...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Ipaalam sa amin kung ano ang iyong palagay sa ginagawa namin.</translation>
 <translation id="6759193508432371551">Factory reset</translation>
 <translation id="6762833852331690540">Naka-on</translation>
-<translation id="6764693078871405569">I-clear din ang data mula sa pag-browse (<ph name="URL" />) na posibleng mag-sign out sa iyo sa <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Pumili ng Iba Pang Wika...</translation>
 <translation id="6767639283522617719">Hindi maisama sa domain. Tiyaking tama ang mga setting para sa unit ng organisasyon.</translation>
 <translation id="6769712124046837540">Idinaragdag ang printer...</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index e5b0adef..d889b257 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Lire et modifier toutes vos données sur le site Web actuel, lorsqu'il est invoqué</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> souhaite que vous réinitialisiez vos paramètres.</translation>
 <translation id="1243314992276662751">Téléverser</translation>
-<translation id="1243398753772016127">Les sites ne peuvent pas utiliser votre activité de navigation sur différent sites afin de personnaliser les annonces</translation>
 <translation id="1244265436519979884">Restauration Linux en cours…</translation>
 <translation id="1244303850296295656">Erreur au niveau des extensions</translation>
 <translation id="1246905108078336582">Supprimer la suggestion du presse-papiers?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Paramètres personnalisés activés</translation>
 <translation id="1489664337021920575">Choisir une autre option</translation>
 <translation id="1493892686965953381">En attente de <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Aussi effacer les données de navigation (<ph name="URL" />), ce qui risque de vous déconnecter de Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> autres appareils accessibles.</translation>
 <translation id="1495677929897281669">Retour à l'onglet</translation>
 <translation id="1499271269825557605">Si vous ne reconnaissez pas une extension, ou si votre navigateur ne fonctionne pas comme prévu, vous pouvez désactiver ou personnaliser les extensions ici.</translation>
@@ -1191,7 +1189,6 @@
 <translation id="2575247648642144396">Cette icône s'affiche lorsque l'extension peut être utilisée dans la page affichée. Pour utiliser cette extension, cliquez sur l'icône ou appuyez sur <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurer en tant que Chromebox pour les réunions</translation>
 <translation id="2580889980133367162">Toujours autoriser <ph name="HOST" /> à télécharger plusieurs fichiers</translation>
-<translation id="2580924999637585241">Total : <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Long</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plateforme <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Impossible de récupérer le ticket Kerberos. Réessayez ou communiquez avec l'administrateur des appareils de votre organisation. (Code d'erreur : <ph name="ERROR_CODE" />.)</translation>
@@ -2820,7 +2817,6 @@
 <translation id="4808667324955055115">Fenêtres contextuelles bloquées :</translation>
 <translation id="480990236307250886">Ouvrir la page d'accueil</translation>
 <translation id="4811503964269049987">Ajouter l'onglet sélectionné à un groupe</translation>
-<translation id="4811818760963189951">Désactivé parce que vous avez désactivé la synchronisation de l'historique</translation>
 <translation id="4813136279048157860">Mes images</translation>
 <translation id="4813512666221746211">Erreur réseau</translation>
 <translation id="4814378367953456825">Entrez un nom pour cette empreinte digitale</translation>
@@ -2989,7 +2985,6 @@
 <translation id="5040823038948176460">Paramètres de contenu supplémentaires</translation>
 <translation id="5042282098504489593">Ouvrez le menu Paramètres pour connecter <ph name="USB_DEVICE_NAME" /> à Linux</translation>
 <translation id="5043913660911154449">Ou encore, sélectionnez le fichier PPD de votre imprimante <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Désactivé parce que vous avez chiffré vos données synchronisées avec une phrase de passe</translation>
 <translation id="5045550434625856497">Mot de passe incorrect</translation>
 <translation id="504561833207953641">Ouverture dans une session de navigateur existante.</translation>
 <translation id="5047421709274785093">Bloquer l'utilisation de capteurs de mouvement et de luminosité par les sites</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">Seule une personne connaissant votre phrase de passe peut lire vos données chiffrées. Google ne reçoit pas la phrase de passe et ne la stocke pas. Si vous l'oubliez ou souhaitez modifier ce paramètre, vous devrez <ph name="BEGIN_LINK" />réinitialiser la synchronisation<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Bienvenue dans la famille <ph name="SHORT_PRODUCT_NAME" />. Cet ordinateur n'est pas comme les autres.</translation>
 <translation id="6358884629796491903">Dragon</translation>
-<translation id="6360719647236334056">Utiliser votre historique de navigation Chrome pour personnaliser la recherche, les annonces et d'autres services Google</translation>
 <translation id="6361850914223837199">Information sur l'erreur :</translation>
 <translation id="6362853299801475928">Signale&amp;r un problème...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Donnez-nous votre avis sur nos services.</translation>
 <translation id="6759193508432371551">Rétablir la configuration d'usine</translation>
 <translation id="6762833852331690540">Activé</translation>
-<translation id="6764693078871405569">Aussi effacer les données de navigation (<ph name="URL" />), ce qui vous déconnectera de <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Choisir une autre langue…</translation>
 <translation id="6767639283522617719">Impossible d'associer le domaine. Assurez-vous que les paramètres sont corrects pour l'unité organisationnelle.</translation>
 <translation id="6769712124046837540">Ajout d'une imprimante en cours…</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index bd54fc1..8a2ff4a 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Accéder à toutes vos données sur le site Web actuellement consulté et les modifier</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> souhaite rétablir vos paramètres.</translation>
 <translation id="1243314992276662751">Importer</translation>
-<translation id="1243398753772016127">Les sites ne peuvent pas utiliser votre activité de navigation sur d'autres sites pour personnaliser les annonces</translation>
 <translation id="1244265436519979884">Restauration Linux…</translation>
 <translation id="1244303850296295656">Erreur au niveau des extensions.</translation>
 <translation id="1246905108078336582">Supprimer la suggestion du presse-papiers ?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Activée – Paramètres personnalisés</translation>
 <translation id="1489664337021920575">Sélectionner une autre option</translation>
 <translation id="1493892686965953381">En attente de <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Effacer également les données de navigation (<ph name="URL" />), ce qui risque de vous déconnecter de Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> autres périphériques disponibles</translation>
 <translation id="1495677929897281669">Retour à l'onglet</translation>
 <translation id="1499271269825557605">Si vous ne reconnaissez pas une extension ou si votre navigateur ne fonctionne pas comme prévu, vous pouvez désactiver ou personnaliser les extensions sur cette page.</translation>
@@ -483,7 +481,7 @@
 <translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Ajoutez l'imprimante à Google Cloud Print pour imprimer des documents où que vous soyez.}one{Ajoutez # imprimante à Google Cloud Print pour imprimer des documents où que vous soyez.}other{Ajoutez # imprimantes à Google Cloud Print pour imprimer des documents où que vous soyez.}}</translation>
 <translation id="1656528038316521561">Opacité de l'arrière-plan</translation>
 <translation id="1657406563541664238">Nous aider à améliorer <ph name="PRODUCT_NAME" /> en envoyant automatiquement les statistiques d'utilisation et les rapports d'erreur à Google</translation>
-<translation id="1657937299377480641">Pour vous reconnecter afin d'accéder à des ressources pédagogiques, demandez à un parent de vous accorder l'autorisation</translation>
+<translation id="1657937299377480641">Pour te reconnecter afin d'accéder à des ressources pédagogiques, demande à un de tes parents de t'accorder l'autorisation</translation>
 <translation id="1658424621194652532">Cette page a accès à votre micro</translation>
 <translation id="1660204651932907780">Autoriser le son des sites (recommandé)</translation>
 <translation id="1660763353352708040">Problème d'adaptateur secteur</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Cette icône s'affiche lorsque l'extension peut être utilisée au sein de la page qui s'affiche actuellement. Pour utiliser cette extension, cliquez sur l'icône ou appuyez sur <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurer en tant que Chromebox pour la visioconférence</translation>
 <translation id="2580889980133367162">Toujours autoriser <ph name="HOST" /> à télécharger plusieurs fichiers</translation>
-<translation id="2580924999637585241">Total : <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Long</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Plate-forme <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Impossible de récupérer le ticket Kerberos. Veuillez réessayer ou contacter l'administrateur des appareils de votre organisation. (Code d'erreur : <ph name="ERROR_CODE" />).</translation>
@@ -2017,7 +2014,7 @@
 <translation id="3690369331356918524">Vous alerte si des mots de passe sont compromis lors d'une violation des données</translation>
 <translation id="3691231116639905343">Applications de clavier</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> souhaite partager votre écran</translation>
-<translation id="369135240373237088">Connectez-vous à nouveau avec un compte scolaire</translation>
+<translation id="369135240373237088">Connecte-toi à nouveau avec un compte scolaire</translation>
 <translation id="3693415264595406141">Mot de passe :</translation>
 <translation id="3694027410380121301">Sélectionner l'onglet précédent</translation>
 <translation id="369489984217678710">Mots de passe et autres données de connexion</translation>
@@ -2457,7 +2454,7 @@
 <translation id="4263223596040212967">Vérifiez la disposition de votre clavier et réessayez.</translation>
 <translation id="4263757076580287579">L'enregistrement de l'imprimante a été annulé.</translation>
 <translation id="426564820080660648">Pour rechercher des mises à jour, veuillez utiliser une connexion Ethernet, Wi-Fi ou de données mobiles.</translation>
-<translation id="4267455501101322486">Pour ajouter un compte afin d'accéder à des ressources pédagogiques, demandez à un parent de vous accorder l'autorisation</translation>
+<translation id="4267455501101322486">Pour ajouter un compte afin d'accéder à des ressources pédagogiques, demande à un de tes parents de t'accorder l'autorisation</translation>
 <translation id="4267953847983678297">Se connecter automatiquement au réseau mobile</translation>
 <translation id="4268025649754414643">Chiffrement de la clé</translation>
 <translation id="4270393598798225102">Version <ph name="NUMBER" /></translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Pop-up bloqués :</translation>
 <translation id="480990236307250886">Ouvrir la page d'accueil</translation>
 <translation id="4811503964269049987">Regrouper les onglets sélectionnés</translation>
-<translation id="4811818760963189951">Fonctionnalité désactivée, car vous avez arrêté la synchronisation de l'historique</translation>
 <translation id="4813136279048157860">Mes images</translation>
 <translation id="4813512666221746211">Erreur réseau.</translation>
 <translation id="4814378367953456825">Attribuez un nom à cette empreinte</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Paramètres de contenu supplémentaires</translation>
 <translation id="5042282098504489593">Ouvrir les paramètres pour connecter <ph name="USB_DEVICE_NAME" /> à Linux</translation>
 <translation id="5043913660911154449">Vous pouvez également préciser le fichier PPD correspondant à votre imprimante <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Fonctionnalité désactivée, car vous avez chiffré vos données synchronisées à l'aide d'une phrase secrète</translation>
 <translation id="5045550434625856497">Mot de passe incorrect</translation>
 <translation id="504561833207953641">Ouverture dans une session de navigateur existante.</translation>
 <translation id="5047421709274785093">Empêcher les sites d'utiliser des capteurs de mouvement et de lumière</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">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 ou si vous voulez modifier ce paramètre, vous devrez <ph name="BEGIN_LINK" />réinitialiser la synchronisation<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Bienvenue dans la famille <ph name="SHORT_PRODUCT_NAME" />. Cet ordinateur n'est pas comme les autres.</translation>
 <translation id="6358884629796491903">Dragon</translation>
-<translation id="6360719647236334056">Utiliser votre historique de navigation dans Chrome pour personnaliser la recherche, les annonces et d'autres services Google</translation>
 <translation id="6361850914223837199">Informations sur l'erreur :</translation>
 <translation id="6362853299801475928">Signale&amp;r un problème...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Faites-nous part de vos commentaires.</translation>
 <translation id="6759193508432371551">Rétablir la configuration d'usine</translation>
 <translation id="6762833852331690540">Activé</translation>
-<translation id="6764693078871405569">Effacer également les données de navigation (<ph name="URL" />), ce qui vous déconnectera de <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Sélectionner une autre langue…</translation>
 <translation id="6767639283522617719">Impossible d'effectuer l'association au domaine. Assurez-vous que les paramètres sont corrects pour l'unité organisationnelle.</translation>
 <translation id="6769712124046837540">Ajout d'une imprimante en cours…</translation>
@@ -4870,7 +4863,7 @@
 <translation id="761530003705945209">Sauvegarder dans Google Drive. Restaurez vos données ou changez d'appareil facilement et à tout moment. Les données des applications sont également sauvegardées. Vos sauvegardes sont importées dans Google et chiffrées à l'aide du mot de passe de votre compte Google.</translation>
 <translation id="7616214729753637086">Enregistrement de l'appareil...</translation>
 <translation id="7617366389578322136">Connexion à "<ph name="DEVICE_NAME" />"…</translation>
-<translation id="762068974690945752">Ajoutez un compte scolaire ou gérez des comptes d'utilisateurs mineurs ici. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
+<translation id="762068974690945752">Ajoutez un compte scolaire ou gérez les comptes de jeunes utilisateurs ici. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="7621382409404463535">Échec de l'enregistrement de la configuration de l'appareil.</translation>
 <translation id="7622114377921274169">En charge.</translation>
 <translation id="7624337243375417909">touche de verrouillage des majuscules désactivée</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 2d8f133..8236f78 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Ler e cambiar todos os teus datos no sitio web actual cando se invoque</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> quere restablecer a túa configuración.</translation>
 <translation id="1243314992276662751">Cargar</translation>
-<translation id="1243398753772016127">Os sitios web non poderán utilizar a túa actividade de navegación a través de distintos sitios para personalizar os anuncios</translation>
 <translation id="1244265436519979884">Estase restaurando Linux</translation>
 <translation id="1244303850296295656">Erro de extensión</translation>
 <translation id="1246905108078336582">Queres quitar a suxestión do portapapeis?</translation>
@@ -196,7 +195,7 @@
 <translation id="1251366534849411931">Falta unha chave de apertura: <ph name="ERROR_LINE" /></translation>
 <translation id="1252987234827889034">Produciuse un erro no perfil</translation>
 <translation id="1254593899333212300">Conexión directa a Internet</translation>
-<translation id="1259152067760398571">A revisión de seguranza executouse onte</translation>
+<translation id="1259152067760398571">A comprobación de seguranza executouse onte</translation>
 <translation id="1260451001046713751">Permitir sempre ventás emerxentes e redireccións desde <ph name="HOST" /></translation>
 <translation id="126156426083987769">Produciuse un problema coas licenzas do dispositivo do modo de demostración.</translation>
 <translation id="126710816202626562">Idioma da tradución:</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Activado: configuración personalizada</translation>
 <translation id="1489664337021920575">Seleccionar outra opción</translation>
 <translation id="1493892686965953381">Agardando por <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Borrar tamén os datos de navegación (<ph name="URL" />), o que pode provocar que peches sesión en Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> dispositivos máis dispoñibles.</translation>
 <translation id="1495677929897281669">Volver á pestana</translation>
 <translation id="1499271269825557605">Se non recoñeces unha extensión ou se o navegador non funciona como debería, podes desactivar ou personalizar as extensións aquí.</translation>
@@ -520,7 +518,7 @@
 <translation id="1700079447639026019">Sitios que nunca poden utilizar cookies</translation>
 <translation id="1701062906490865540">Eliminar esta persoa</translation>
 <translation id="1703331064825191675">Non te preocupes nunca polos teus contrasinais</translation>
-<translation id="1704970325597567340">A revisión de seguranza executouse o <ph name="DATE" /></translation>
+<translation id="1704970325597567340">A comprobación de seguranza executouse o <ph name="DATE" /></translation>
 <translation id="1706586824377653884">Engadido polo administrador</translation>
 <translation id="1706625117072057435">Niveis de zoom</translation>
 <translation id="1708338024780164500">(Inactiva)</translation>
@@ -693,7 +691,7 @@
 <translation id="1921584744613111023"><ph name="DPI" /> ppp</translation>
 <translation id="192494336144674234">Abrir con</translation>
 <translation id="1925021887439448749">Introducir enderezo web personalizado</translation>
-<translation id="1925124445985510535">A revisión de seguranza executouse á seguinte hora: <ph name="TIME" /></translation>
+<translation id="1925124445985510535">A comprobación de seguranza executouse á seguinte hora: <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Estas opcións de configuración están controladas pola política empresarial. Ponte en contacto co administrador para obter máis información.</translation>
 <translation id="1927632033341042996">Dedo <ph name="NEW_FINGER_NUMBER" /></translation>
 <translation id="1928202201223835302">Introducir PIN antigo</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">Esta icona estará visible cando a extensión se poida utilizar na páxina actual. Para utilizar a extensión, fai clic na icona ou preme <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurar como Chromebox para reunións</translation>
 <translation id="2580889980133367162">Permitir sempre a <ph name="HOST" /> descargar varios ficheiros</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Longo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plataforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Non se puido obter o tícket de Kerberos. Téntao outra vez ou contacta co administrador de dispositivos da túa organización. (Código de erro <ph name="ERROR_CODE" />).</translation>
@@ -1617,7 +1614,7 @@
     Descrición:
     <ph name="LINUX_DESCRIPTION" /></translation>
 <translation id="3149510190863420837">Aplicacións de Chrome</translation>
-<translation id="3150693969729403281">Realizar agora a revisión de seguranza</translation>
+<translation id="3150693969729403281">Realizar agora a comprobación de seguranza</translation>
 <translation id="3150927491400159470">Volver cargar de maneira forzada</translation>
 <translation id="315116470104423982">Datos móbiles</translation>
 <translation id="3151539355209957474">Hora de inicio</translation>
@@ -1752,7 +1749,7 @@
 <translation id="3341703758641437857">Permitir acceso aos URL dos ficheiros</translation>
 <translation id="3342361181740736773">Á extensión "<ph name="TRIGGERING_EXTENSION_NAME" />" gustaríalle eliminar esta extensión.</translation>
 <translation id="3345135638360864351">A túa solicitude para acceder a este sitio non se puido enviar a <ph name="NAME" />. Téntao de novo.</translation>
-<translation id="3345634917232014253">A revisión de seguranza executouse hai un momento</translation>
+<translation id="3345634917232014253">A comprobación de seguranza executouse hai un momento</translation>
 <translation id="3345886924813989455">Non se atopou ningún navegador compatible</translation>
 <translation id="3347086966102161372">C&amp;opiar enderezo da imaxe</translation>
 <translation id="3348038390189153836">Dispositivo extraíble detectado</translation>
@@ -2818,7 +2815,6 @@
 <translation id="4808667324955055115">Ventás emerxentes bloqueadas:</translation>
 <translation id="480990236307250886">Abre a páxina de inicio</translation>
 <translation id="4811503964269049987">Agrupar a pestana seleccionada</translation>
-<translation id="4811818760963189951">Desactivouse a opción porque desactivaches a sincronización do historial</translation>
 <translation id="4813136279048157860">As miñas imaxes</translation>
 <translation id="4813512666221746211">Erro de rede</translation>
 <translation id="4814378367953456825">Ponlle un nome a esta impresión dixital</translation>
@@ -2987,7 +2983,6 @@
 <translation id="5040823038948176460">Configuración de contido adicional</translation>
 <translation id="5042282098504489593">Para conectar o dispositivo <ph name="USB_DEVICE_NAME" /> con Linux, abre Configuración</translation>
 <translation id="5043913660911154449">Tamén podes especificar o PPD da túa impresora <ph name="LINK_BEGIN" />Máis información<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Desactivouse a opción porque encriptaches os datos sincronizados cunha frase de acceso</translation>
 <translation id="5045550434625856497">Contrasinal incorrecto</translation>
 <translation id="504561833207953641">Abrindo nunha sesión xa aberta do navegador.</translation>
 <translation id="5047421709274785093">Impedir que os sitios utilicen sensores de movemento e de luz</translation>
@@ -3320,7 +3315,7 @@
 <translation id="5495597166260341369">Manter a pantalla activada</translation>
 <translation id="5496587651328244253">Organizar</translation>
 <translation id="5499313591153584299">É posible que este ficheiro sexa daniño para o teu ordenador.</translation>
-<translation id="5500709606820808700">A revisión de seguranza executouse hoxe</translation>
+<translation id="5500709606820808700">A comprobación de seguranza executouse hoxe</translation>
 <translation id="5502500733115278303">Importados desde Firefox</translation>
 <translation id="5505264765875738116">Os sitios non poden pedir permiso para enviar notificacións</translation>
 <translation id="5505307013568720083">Non hai tinta</translation>
@@ -3964,7 +3959,6 @@
 <translation id="63566973648609420">Só alguén co teu contrasinal pode ler os teus datos encriptados. O contrasinal non se envía nin se almacena en Google. Se esqueciches o contrasinal ou queres cambiar esta configuración, deberás <ph name="BEGIN_LINK" />restablecer a sincronización<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Dámosche a benvida á familia de <ph name="SHORT_PRODUCT_NAME" />. Este non é un ordenador normal.</translation>
 <translation id="6358884629796491903">Dragón</translation>
-<translation id="6360719647236334056">Utiliza o teu historial de navegación de Chrome para personalizar a Busca, os anuncios e outros servizos de Google</translation>
 <translation id="6361850914223837199">Detalles dos erros:</translation>
 <translation id="6362853299801475928">&amp;Informar dun problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4242,7 +4236,6 @@
 <translation id="6758056191028427665">Indícanos o teu grao de satisfacción.</translation>
 <translation id="6759193508432371551">Restablecemento de fábrica</translation>
 <translation id="6762833852331690540">Si</translation>
-<translation id="6764693078871405569">Borrar tamén os datos de navegación (<ph name="URL" />), o que pode provocar que peches sesión en <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Escoller outro idioma…</translation>
 <translation id="6767639283522617719">O dispositivo non se puido vincular ao dominio. Asegúrate de que a configuración sexa correcta para a unidade organizativa.</translation>
 <translation id="6769712124046837540">Engadindo impresora...</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 78ad66974..1be2a5d 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">માગવામાં આવે ત્યારે વર્તમાન વેબસાઇટ પર તમારો બધો ડેટા વાંચો અને બદલો</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />, તમારી સેટિંગ્સને ફરીથી સેટ કરવા માગે છે.</translation>
 <translation id="1243314992276662751">અપલોડ કરો</translation>
-<translation id="1243398753772016127">સાઇટ જાહેરાતોને વ્યક્તિગત બનાવવા માટે બધી અલગ-અલગ સાઇટ પરની તમારી બ્રાઉઝિંગ પ્રવૃત્તિનો ઉપયોગ કરી શકતી નથી</translation>
 <translation id="1244265436519979884">હાલમાં Linuxને પહેલાંના જેવું કરવાની પ્રક્રિયા ચાલુ છે</translation>
 <translation id="1244303850296295656">એક્સટેંશન ભૂલ</translation>
 <translation id="1246905108078336582">શું ક્લિપબોર્ડમાંથી સૂચન કાઢી નાખીએ?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">ચાલુ - કસ્ટમ સેટિંગ્સ</translation>
 <translation id="1489664337021920575">બીજો વિકલ્પ પસંદ કરો</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> માટે પ્રતીક્ષારત...</translation>
-<translation id="1494438840282430403">બ્રાઉઝિંગ ડેટા (<ph name="URL" />) પણ સાફ કરો જે તમને Google.comમાંથી સાઇન આઉટ કરશે.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> અન્ય ઉપલબ્ધ ઉપકરણો.</translation>
 <translation id="1495677929897281669">ટૅબ પર પાછા જાઓ</translation>
 <translation id="1499271269825557605">જો તમે એક્સ્ટેંશનને ઓળખતા ન હો અથવા તમારું બ્રાઉઝર અપેક્ષા પ્રમાણે કામ ન કરતું હોય, તો તમે અહીં એક્સ્ટેંશનને કસ્ટમાઇઝ કરી શકો છો અથવા બંધ કરી શકો છો.</translation>
@@ -514,6 +512,7 @@
 <translation id="1697686431566694143">ફાઇલમાં ફેરફાર કરો</translation>
 <translation id="1698122934742150150">ફક્ત વર્તમાન છૂપું સત્ર</translation>
 <translation id="1698650002254827833">ઍપની સૂચિ લોડ કરી શકાતી નથી. કૃપા કરીને ફરી પ્રયાસ કરો.</translation>
+<translation id="1700079447639026019">કુકીનો ક્યારેય ઉપયોગ કરી શકતી નથી એવી સાઇટ</translation>
 <translation id="1701062906490865540">આ વ્યક્તિને દૂર કરો</translation>
 <translation id="1703331064825191675">તમારા પાસવર્ડ વિશે ક્યારેય ચિંતા કરશો નહીં</translation>
 <translation id="1704970325597567340"><ph name="DATE" />ના રોજ સલામતી માટે તપાસ કરવામાં આવી હતી</translation>
@@ -734,6 +733,7 @@
 <translation id="1990512225220753005">આ પેજ પર શૉર્ટકટ બતાવશો નહીં</translation>
 <translation id="1992397118740194946">સેટ નથી</translation>
 <translation id="1994173015038366702">સાઈટ URL</translation>
+<translation id="1995916364271252349">સાઇટ કઈ માહિતીનો ઉપયોગ કરી શકે અને કઈ માહિતી બતાવી શકે તે નિયંત્રિત કરો (સ્થાન, કૅમેરા, પૉપ-અપ અને અન્ય ઘણું)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> તમારા સ્થાનિક કમ્પ્યુટર પર કાયમી ધોરણે વિશાળ ડેટા સ્ટોર કરવા માગે છે</translation>
 <translation id="1997616988432401742">તમારા પ્રમાણપત્રો</translation>
 <translation id="1999115740519098545">સ્ટાર્ટઅપ પર</translation>
@@ -989,6 +989,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# વિન્ડો બંધ કરો}one{# વિન્ડો બંધ કરો}other{# વિન્ડો બંધ કરો}}</translation>
 <translation id="2335122562899522968">આ પૃષ્ઠ કૂકીઝ સેટ કરે છે.</translation>
 <translation id="2336228925368920074">બધા ટૅબ્સ બુકમાર્ક  કરો...</translation>
+<translation id="2336376423977300504">જ્યારે પણ વિંડો બંધ હોય ત્યારે કુકી સાફ કરો</translation>
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" />, જોડી કરવા માગે છે</translation>
 <translation id="2342740338116612727">બુકમાર્ક ઉમેર્યા</translation>
@@ -1183,7 +1184,6 @@
 <translation id="2575247648642144396">જ્યારે એક્સ્ટેંશન વર્તમાન પૃષ્ઠ પર કાર્ય કરી શકે ત્યારે આ આયકન દૃશ્યક્ષમ હશે. આયકન પર ક્લિક કરીને અથવા <ph name="EXTENSION_SHORTCUT" /> દબાવીને આ એક્સ્ટેંશનનો ઉપયોગ કરો.</translation>
 <translation id="257779572837908839">મીટિંગ માટે Chromebox તરીકે સેટ કરો</translation>
 <translation id="2580889980133367162">બહુવિધ ફાઇલો ડાઉનલોડ કરવા માટે હંમેશા <ph name="HOST" /> ને મંજૂરી આપો</translation>
-<translation id="2580924999637585241">કુલ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">લાંબો</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (પ્લેટફોર્મ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberosની ટિકિટ મેળવી શકાઈ નથી. ફરી પ્રયાસ કરો અથવા તમારી સંસ્થાના ડિવાઇસ વ્યવસ્થાપકનો સંપર્ક કરો. (ભૂલનો કોડ <ph name="ERROR_CODE" />).</translation>
@@ -1731,6 +1731,7 @@
 <translation id="3317459757438853210">બંને બાજુ</translation>
 <translation id="3317678681329786349">કૅમેરા અને માઇક્રોફોન અવરોધિત</translation>
 <translation id="3319048459796106952">નવી &amp;છુપી વિંડો</translation>
+<translation id="3320630259304269485">Safe Browsing (જોખમકારક સાઇટથી સુરક્ષા) અને અન્ય સુરક્ષા સેટિંગ</translation>
 <translation id="3323521181261657960">બોનસ! તમને હજી વધુ સ્ક્રીન સમય મળ્યો છે</translation>
 <translation id="3325910708063135066">Mac સિસ્ટમ પસંદગીઓમાં કૅમેરા અને માઇક્રોફોન બંધ છે</translation>
 <translation id="3328489342742826322">કોઈ બૅકઅપમાંથી પુનઃસ્થાપિત કરવાથી હાલની બધી Linux ઍપ્લિકેશનો અને તમારા Linux ફાઇલ ફોલ્ડરમાંનો ડેટા ડિલીટ થઈ જશે.</translation>
@@ -1850,6 +1851,7 @@
 <translation id="3487007233252413104">અનામી કાર્ય</translation>
 <translation id="348780365869651045">AppCache ની પ્રતીક્ષા કરી રહ્યું છે...</translation>
 <translation id="3488065109653206955">આંશિક રીતે સક્રિય કરેલું</translation>
+<translation id="3489025949017384019">ઘણી સાઇટ કદાચ યોગ્ય રીતે કાર્ય ન કરે</translation>
 <translation id="3492788708641132712">સમન્વયન કામ કરી રહ્યું નથી. ફરીથી સાઇન ઇન કરવાનો પ્રયાસ કરો.</translation>
 <translation id="3493486281776271508">ઇન્ટરનેટ કનેક્શન આવશ્યક છે</translation>
 <translation id="3493881266323043047">માન્યતા</translation>
@@ -2005,6 +2007,7 @@
 <translation id="3688526734140524629">ચેનલ બદલો</translation>
 <translation id="3688578402379768763">અપ-ટુ-ડેટ</translation>
 <translation id="3688794912214798596">ભાષાઓ બદલો...</translation>
+<translation id="3690369331356918524">જો ડેટા ઉલ્લંઘનમાં પાસવર્ડ જાહેર થાય તો તમને ચેતવણી આપવામાં આવે છે</translation>
 <translation id="3691231116639905343">કીબોર્ડ ઍપ</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> તમારી સ્ક્રીન શેર કરવા માગે છે</translation>
 <translation id="369135240373237088">સ્કૂલ એકાઉન્ટ વડે ફરી સાઇન ઇન કરો</translation>
@@ -2143,6 +2146,7 @@
 <translation id="3841964634449506551">પાસવર્ડ અમાન્ય</translation>
 <translation id="3842552989725514455">Serif ફૉન્ટ</translation>
 <translation id="3846116211488856547">વેબસાઇટ, Android ઍપ અને બીજા ઘણા માટે વિકાસના સાધનો મેળવો. Linux ઇન્સ્ટૉલ કરવાથી <ph name="DOWNLOAD_SIZE" /> ડેટા ડાઉનલોડ થશે.</translation>
+<translation id="3847319713229060696">વેબ પરની દરેક વ્યક્તિ માટે સુરક્ષાને બહેતર બનાવવા સહાય કરો</translation>
 <translation id="385051799172605136">પાછળ</translation>
 <translation id="3850914401008572843"><ph name="ORIGIN" /> આ ફોલ્ડરને ખોલી શકતું નથી કારણ કે તેમાં સિસ્ટમ ફાઇલો છે</translation>
 <translation id="3851428669031642514">અસુરક્ષિત સ્ક્રિપ્ટ્સ લોડ કરો</translation>
@@ -2625,6 +2629,7 @@
 <translation id="4534661889221639075">ફરી પ્રયાસ કરો.</translation>
 <translation id="4535127706710932914">ડિફૉલ્ટ પ્રોફાઇલ</translation>
 <translation id="4535767533210902251">ફિંગરપ્રિન્ટ સેન્સર એ તમારા કીબોર્ડ પર સૌથી ઉપર જમણી બાજુ સ્થિત કી છે. તેને કોઈપણ આંગળી વડે હળવેથી સ્પર્શ કરો.</translation>
+<translation id="4536140153723794651">હંમેશાં કુકીનો ઉપયોગ કરી શકતી સાઇટ</translation>
 <translation id="4538417792467843292">શબ્દ ડિલીટ કરો</translation>
 <translation id="4538684596480161368"><ph name="HOST" /> પર અનસેન્ડબૉક્સ્ડ પ્લગિન્સને હંમેશાં અવરોધિત કરો</translation>
 <translation id="4538792345715658285">ઉદ્યોગ નીતિ દ્વારા ઇન્સ્ટોલ થયેલું છે.</translation>
@@ -2722,6 +2727,7 @@
 <translation id="4665446389743427678"><ph name="SITE" />નો સ્ટોર કરેલો બધો ડેટા ડિલીટ કરવામાં આવશે.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />ને ચાલુ કરવા માટે ક્લિક કરો</translation>
 <translation id="4670064810192446073">વર્ચ્યુઅલ રિયાલિટી</translation>
+<translation id="4672879467403304774">તમે સાઇન ઇન કરેલું હોય ત્યારે Chrome અને Googleની અન્ય ઍપ પર તમને સલામત રાખે છે</translation>
 <translation id="46733273239502219">ઇન્સ્ટૉલ કરેલી ઍપમાંનો ઑફલાઇન ડેટા પણ સાફ થઈ જશે</translation>
 <translation id="4673442866648850031">જ્યારે સ્ટાઇલસ દૂર કરવામાં આવ્યું હોય ત્યારે સ્ટાઇલસનાં સાધનો ખોલો</translation>
 <translation id="4677772697204437347">GPU મેમરી</translation>
@@ -2806,7 +2812,6 @@
 <translation id="4808667324955055115">પૉપ-અપ બ્લૉક કરેલ છે:</translation>
 <translation id="480990236307250886">હોમ પેજ ખોલો</translation>
 <translation id="4811503964269049987">પસંદ કરેલી ટૅબનું ગ્રૂપ બનાવો</translation>
-<translation id="4811818760963189951">બંધ થયું કારણ કે તમે ઇતિહાસને સિંક કરવાનું બંધ કર્યું છે</translation>
 <translation id="4813136279048157860">મારી છબીઓ</translation>
 <translation id="4813512666221746211">નેટવર્ક ભૂલ</translation>
 <translation id="4814378367953456825">આ ફિંગરપ્રિન્ટ માટેનું નામ દાખલ કરો</translation>
@@ -2975,7 +2980,6 @@
 <translation id="5040823038948176460">કન્ટેન્ટના વધારાના સેટિંગ</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />ને Linuxથી કનેક્ટ કરવા માટે સેટિંગ ખોલો</translation>
 <translation id="5043913660911154449">તમારા પ્રિન્ટરની PPD ફાઇલનો ઉલ્લેખ કરો <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">બંધ થયું કારણ કે તમે તમારો સિંક ડેટા પાસફ્રેઝ વડે એન્ક્રિપ્ટ કર્યો છે</translation>
 <translation id="5045550434625856497">ખોટો પાસવર્ડ</translation>
 <translation id="504561833207953641">હાલના બ્રાઉઝર સત્રમાં ખોલી રહ્યા છીએ.</translation>
 <translation id="5047421709274785093">સાઇટને મોશન અને લાઇટ સેન્સરનો ઉપયોગ કરવાથી બ્લૉક કરો</translation>
@@ -3140,6 +3144,7 @@
 <translation id="5275352920323889391">કૂતરું</translation>
 <translation id="527605982717517565"><ph name="HOST" /> પર JavaScript ને હંમેશા મંજૂરી આપો </translation>
 <translation id="5280174558369304332">કાઢી નાખવા માટેના એક્સ્ટેંશન:</translation>
+<translation id="5280243692621919988">જ્યારે તમે બધી વિંડો બંધ કરો, ત્યારે કુકી અને સાઇટનો ડેટા સાફ કરો</translation>
 <translation id="5280426389926346830">શૉર્ટકટ બનાવીએ?</translation>
 <translation id="528208740344463258">Android ઍપ ડાઉનલોડ કરીને તેનો ઉપયોગ કરવા માટે, તમારે પહેલાં આ આવશ્યક અપડેટ ઇન્સ્ટૉલ કરવી જરૂરી છે. જ્યારે તમારું <ph name="DEVICE_TYPE" /> અપડેટ થઈ રહ્યું હોય, ત્યારે તમે તેનો ઉપયોગ કરી શકશો નહીં. એકવાર ઇન્સ્ટૉલેશન પૂર્ણ થઈ જાય એટલે તમારું <ph name="DEVICE_TYPE" /> ફરી શરૂ થશે.</translation>
 <translation id="5282733140964383898">‘ટ્રૅક કરશો નહીં' ચાલુ કરવાનો અર્થ થાય કે કોઈ વિનંતીને તમારા બ્રાઉઝિંગ ટ્રાફિક સાથે શામેલ કરવામાં આવશે. કોઈ વેબસાઇટ વિનંતીનો કેવો જવાબ આપે છે અને વિનંતીનું અર્થઘટન કેવી રીતે કરવામાં આવ્યું છે એના પર કોઈ પણ અસર નિર્ભર કરે છે. ઉદાહરણ તરીકે, કેટલીક વેબસાઇટ આ વિનંતીનો જવાબ તમને એવી જાહેરાતો બતાવીને આપી શકે કે જે તમે મુલાકાત લીધેલી બીજી વેબસાઇટ પર આધારિત નથી. ઘણી વેબસાઇટ તેમ છતાંય તમારા બ્રાઉઝિંગ ડેટાને એકત્રિત કરશે અને તેનો ઉપયોગ કરશે - ઉદાહરણ તરીકે, સુરક્ષા વધારવા માટે, તેમની વેબસાઇટ પર કન્ટેન્ટ, સેવાઓ, જાહેરાતો અને ભલામણ પ્રદાન કરવા માટે, રિપોર્ટિંગ માટેના આંકડા તૈયાર કરવા માટે કરશે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
@@ -3953,7 +3958,6 @@
 <translation id="63566973648609420">માત્ર તમારા પાસફ્રેઝ સાથેની કોઈ વ્યક્તિ જ તમારા એન્ક્રિપ્ટ કરેલા ડેટાને વાંચી શકે છે. Googleને પાસફ્રેઝ મોકલવામાં આવતો નથી કે એના દ્વારા સ્ટોર કરવામાં આવતો નથી. જો તમે તમારો પાસફ્રેઝ ભૂલી જાઓ અથવા આ સેટિંગ બદલવા માંગતા હો, તો તમારે <ph name="BEGIN_LINK" />સિંકને ફરીથી સેટ<ph name="END_LINK" /> કરવું પડશે.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> કુટુંબમાં આપનું સ્વાગત છે. આ કોઈ સામાન્ય કમ્પ્યુટર નથી.</translation>
 <translation id="6358884629796491903">ડ્રેગન</translation>
-<translation id="6360719647236334056">શોધ, જાહેરાતો અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા Chrome બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરો</translation>
 <translation id="6361850914223837199">ભૂલ વિગતો:</translation>
 <translation id="6362853299801475928">&amp;સમસ્યાની જાણ કરો...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4231,10 +4235,10 @@
 <translation id="6758056191028427665">અમને જણાવો કે અમે કેવું કાર્ય કરી રહ્યાં છીએ.</translation>
 <translation id="6759193508432371551">ફેક્ટરી ફરીથી સેટ કરો</translation>
 <translation id="6762833852331690540">ચાલુ</translation>
-<translation id="6764693078871405569">બ્રાઉઝિંગ ડેટા (<ph name="URL" />) પણ સાફ કરો જે તમને <ph name="DOMAIN" />માંથી સાઇન આઉટ કરશે.</translation>
 <translation id="6767566652486411142">બીજી ભાષા પસંદ કરો...</translation>
 <translation id="6767639283522617719">ડોમેન જોડી શકાતું નથી. સંસ્થાકીય એકમ માટે સેટિંગ યોગ્ય છે તેની ખાતરી કરો.</translation>
 <translation id="6769712124046837540">પ્રિન્ટર ઉમેરી રહ્યું છે...</translation>
+<translation id="6770602306803890733">તમારી સાથે જ વેબ પરની દરેક વ્યક્તિ માટે સુરક્ષાને બહેતર બનાવે છે</translation>
 <translation id="6770664076092644100">NFC મારફતે ચકાસો</translation>
 <translation id="6771503742377376720">એ એક પ્રમાણન અધિકારી છે</translation>
 <translation id="6772339735733515807">તમારાં એક્સ્ટેંશન મેનેજ કરો</translation>
@@ -4260,6 +4264,7 @@
 <translation id="6798578729981748444">આયાત કરવાનું સમાપ્ત કરવા માટે, બધી Firefox વિંડો બંધ કરો.</translation>
 <translation id="6798780071646309401">caps lock ચાલુ છે</translation>
 <translation id="6798954102094737107">પ્લગિન: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">સામાન્ય સેટિંગ</translation>
 <translation id="6801435275744557998">ટચસ્ક્રીનને કેલિબ્રેટ કરો</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">બરાબર, સમજાઇ ગયું</translation>
@@ -4378,6 +4383,8 @@
 <translation id="6965382102122355670">બરાબર, સમજાઇ ગયું</translation>
 <translation id="6965648386495488594">પોર્ટ</translation>
 <translation id="6965978654500191972">ઉપકરણ</translation>
+<translation id="6966201992886493384">સાઇટ તમને વધુ સારો બ્રાઉઝિંગ અનુભવ આપવા માટે કુકીનો ઉપયોગ કરી શકે છે. ઉદાહરણ તરીકે, તમને સાઇન ઇન કરીને રાખવા અથવા તમારા શૉપિંગ કાર્ટની આઇટમ યાદ રાખવા માટે</translation>
+<translation id="696780070563539690">સાઇટ વિવિધ સાઇટ પરની તમારી બ્રાઉઝિંગ પ્રવૃત્તિ જોવા માટે તમારી કુકીનો ઉપયોગ કરી શકશે નહીં. ઉદાહરણ તરીકે, મનગમતી જાહેરાતો બનાવવા માટે</translation>
 <translation id="6968288415730398122">સ્ક્રીન લૉક ગોઠવવા માટે તમારો પાસવર્ડ દાખલ કરો</translation>
 <translation id="6970480684834282392">સ્ટાર્ટઅપ પ્રકાર</translation>
 <translation id="6970856801391541997">ખાસ પેજ પ્રિન્ટ કરો</translation>
@@ -4787,6 +4794,7 @@
 <translation id="7507207699631365376">આ પ્રદાતાની <ph name="BEGIN_LINK" />પ્રાઇવસી પૉલિસી<ph name="END_LINK" /> જુઓ</translation>
 <translation id="7507930499305566459">પ્રતિસાદકર્તાની સ્થિતિનું પ્રમાણપત્ર</translation>
 <translation id="7508054832109420082">પ્રિન્ટરનો ઍક્સેસ આપો</translation>
+<translation id="751120035300339">સાઇટ તમને વધુ સારો બ્રાઉઝિંગ અનુભવ આપવા માટે કુકીનો ઉપયોગ કરી શકતી નથી. ઉદાહરણ તરીકે, તમને સાઇન ઇન કરીને રાખવા અથવા તમારા શૉપિંગ કાર્ટની આઇટમ યાદ રાખવા માટે</translation>
 <translation id="7513029293694390567">સંગ્રહિત ઓળખપત્રનો ઉપયોગ કરીને વેબસાઇટ્સમાં આપમેળે સાઇન ઇન કરો. જો અક્ષમ કરેલ હોય, તો વેબસાઇટમાં સાઇન ઇન કરતાં પહેલાં દર વખતે તમને પુષ્ટિકરણ માટે કહેવામાં આવશે.</translation>
 <translation id="7514239104543605883">તમારા ડિવાઇસ પર કૉપિ કરો</translation>
 <translation id="7514365320538308">ડાઉનલોડ કરો</translation>
@@ -5411,6 +5419,7 @@
 <translation id="8320459152843401447">તમારી સંપૂર્ણ સ્ક્રીન</translation>
 <translation id="8322814362483282060">આ પૃષ્ઠને તમારા માઇક્રોફોનને ઍક્સેસ કરવાથી અવરોધિત કરવામાં આવ્યું છે.</translation>
 <translation id="8323167517179506834">URL લખો</translation>
+<translation id="8324784016256120271">સાઇટ વિવિધ સાઇટ પરની તમારી બ્રાઉઝિંગ પ્રવૃત્તિ જોવા માટે કુકીનો ઉપયોગ કરી શકે છે. ઉદાહરણ તરીકે, મનગમતી જાહેરાતો બનાવવા માટે</translation>
 <translation id="8326478304147373412">PKCS #7, પ્રમાણપત્ર ચેન</translation>
 <translation id="8327039559959785305">Linux ફાઇલોને માઉન્ટ કરવામાં ભૂલ આવી છે. કૃપા કરીને ફરી પ્રયાસ કરો.</translation>
 <translation id="8327676037044516220">પરવાનગીઓ અને કન્ટેન્ટ સેટિંગ</translation>
@@ -5466,6 +5475,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> નેટવર્ક, કનેક્ટ કરી રહ્યું છે</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">પહેલા પૂછો (ભલામણ કરેલ)</translation>
+<translation id="8417573335434189196">જોખમકારક વેબસાઇટ, ડાઉનલોડ અને એક્સ્ટેંશન સામે તમારું રક્ષણ કરતું નથી. Chrome આ સેટિંગનો ઉપયોગ કરવાનો સુઝાવ આપતું નથી.</translation>
 <translation id="8418445294933751433">ટૅબ તરીકે &amp;બતાવો</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' માટે શોધ પરિણામ</translation>
 <translation id="8419368276599091549">તમારા <ph name="DEVICE_TYPE" /> પર સ્વાગત છે!</translation>
@@ -5631,6 +5641,7 @@
 <translation id="8642947597466641025">ટેક્સ્ટ મોટો કરો</translation>
 <translation id="8644655801811752511">સુરક્ષા કોડ રીસેટ કરી શકાતો નથી. કોડ શામેલ કર્યા પછી તરત જ તેને રીસેટ કરવાનો પ્રયાસ કરો.</translation>
 <translation id="8645354835496065562">સેન્સરના ઍક્સેસની મંજૂરી ચાલુ રાખો</translation>
+<translation id="8645920082661222035">જોખમકારક ઇવેન્ટ થાય તે પહેલાં તેનું અનુમાન લગાવીને તેના વિશે તમને ચેતવણી આપે છે</translation>
 <translation id="8647834505253004544">વેબ ઍડ્રેસ માન્ય નથી</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> અથવા <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">જો કે તમે હવે તમારી જૂની પ્રોફાઇલ ઍક્સેસ કરી શકતા નથી, છતાં તમે તેને કાઢી નાખી શકો છો.</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 9ccc78dd..5aa7ce31 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -185,7 +185,6 @@
 <translation id="1241753985463165747">लागू किए जाने पर अभी वाली वेबसाइट पर मौजूद आपका डेटा पढ़ और बदल सकता है</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> आपकी सेटिंग को रीसेट करना चाहता है.</translation>
 <translation id="1243314992276662751">अपलोड करें</translation>
-<translation id="1243398753772016127">'साइटें' अलग-अलग साइटों पर की जाने वाली आपकी ब्राउज़िंग गतिविधि का इस्तेमाल दर्शकों की पसंद को ध्यान में रखकर विज्ञापन दिखाने में नहीं कर सकता</translation>
 <translation id="1244265436519979884">फ़िलहाल, Linux की बहाल करने की प्रक्रिया जारी है</translation>
 <translation id="1244303850296295656">एक्‍सटेंशन गड़बड़ी</translation>
 <translation id="1246905108078336582">क्लिपबोर्ड से सुझाव हटाना चाहते हैं?</translation>
@@ -351,7 +350,6 @@
 <translation id="1487335504823219454">चालू - कस्टम सेटिंग</translation>
 <translation id="1489664337021920575">कोई दूसरा विकल्प चुनें</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> की प्रतीक्षा कर रहा है...</translation>
-<translation id="1494438840282430403">ब्राउज़िंग डेटा (<ph name="URL" />) भी मिटाएं, इससे आप Google.com से साइन आउट हो सकते हैं.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> अन्य उपलब्ध डिवाइस.</translation>
 <translation id="1495677929897281669">टैब पर वापस जाएं</translation>
 <translation id="1499271269825557605">अगर आप किसी एक्सटेंशन को नहीं पहचानते या आपका ब्राउज़र उम्मीद के मुताबिक काम नहीं कर रहा है, तो आप यहां एक्सटेंशन को बंद कर सकते हैं या पसंद के मुताबिक बना सकते हैं.</translation>
@@ -1176,7 +1174,6 @@
 <translation id="2575247648642144396">यह आइकॉन तब दिखाई देगा जब एक्सटेंशन मौजूदा पेज पर काम कर सकेगा. आइकॉन पर क्लिक करके या <ph name="EXTENSION_SHORTCUT" /> को दबाकर यह एक्सटेंशन चालू करें.</translation>
 <translation id="257779572837908839">मीटिंग के लिए Chromebox के रूप में सेट अप करें</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> को एकाधिक फ़ाइलें हमेशा डाउनलोड करने दें</translation>
-<translation id="2580924999637585241">कुल: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">लंबा</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (प्‍लेटफ़ॉर्म <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos टिकट नहीं मिल सका. फिर से कोशिश करें या अपने संगठन के डिवाइस एडमिन से संपर्क करें. (गड़बड़ी कोड <ph name="ERROR_CODE" />).</translation>
@@ -4174,7 +4171,6 @@
 <translation id="6758056191028427665">हमें बताएं कि हम कैसा प्रदर्शन कर रहे हैं.</translation>
 <translation id="6759193508432371551">फैक्टरी रीसेट करें</translation>
 <translation id="6762833852331690540">चालू है</translation>
-<translation id="6764693078871405569">ब्राउज़िंग डेटा (<ph name="URL" />) भी मिटाएं, इससे आप <ph name="DOMAIN" />.से साइन आउट हो जाएंगे.</translation>
 <translation id="6767566652486411142">कोई दूसरी भाषा चुनें...</translation>
 <translation id="6767639283522617719">डोमेन से नहीं जोड़ सकते. पक्का करें कि संगठनात्मक इकाई के लिए सेटिंग सही हैं.</translation>
 <translation id="6769712124046837540">प्रिंटर जोड़ा जा रहा है...</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index e5e802e..17b16316 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">čitati i mijenjati sve vaše podatke na trenutačnoj web-lokaciji pri pozivanju</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> želi vratiti vaše postavke na zadano.</translation>
 <translation id="1243314992276662751">Prenesi</translation>
-<translation id="1243398753772016127">Web-lokacije ne mogu prilagođavati oglase na temelju vaše aktivnosti pregledavanja na različitim web-lokacijama</translation>
 <translation id="1244265436519979884">U tijeku je vraćanje Linuxa</translation>
 <translation id="1244303850296295656">Pogreška proširenja</translation>
 <translation id="1246905108078336582">Želite li ukloniti prijedlog iz međuspremnika?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Uključeno – prilagođene postavke</translation>
 <translation id="1489664337021920575">Odaberite neku drugu opciju</translation>
 <translation id="1493892686965953381">Čeka se <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Izbrišite i podatke o pregledavanju (<ph name="URL" />), čime ćete se možda odjaviti s web-lokacije Google.com.</translation>
 <translation id="1495486559005647033">Broj ostalih dostupnih uređaja: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Natrag na karticu</translation>
 <translation id="1499271269825557605">Ako ne prepoznajete proširenje ili ako vaš preglednik ne radi kako treba, ovdje možete isključiti proširenja ili ih prilagoditi.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ova će ikona biti vidljiva kada proširenje bude moglo djelovati na trenutačnoj stranici. Aktivirajte to proširenje tako što ćete kliknuti ikonu ili pritisnuti <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Postavi kao Chromebox za videokonferencije</translation>
 <translation id="2580889980133367162">Uvijek dozvoli hostu <ph name="HOST" /> preuzimanje više datoteka</translation>
-<translation id="2580924999637585241">Ukupno: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dugo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Dohvaćanje Kerberosovog tiketa nije uspjelo. Pokušajte ponovo ili se obratite administratoru uređaja u svojoj organizaciji. (Kôd pogreške <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Skočni su prozori blokirani:</translation>
 <translation id="480990236307250886">Otvori početnu stranicu</translation>
 <translation id="4811503964269049987">Dodaj odabranu karticu u grupu</translation>
-<translation id="4811818760963189951">Isključeno jer ste onemogućili sinkronizaciju povijesti</translation>
 <translation id="4813136279048157860">Moje slike</translation>
 <translation id="4813512666221746211">Pogreška mreže</translation>
 <translation id="4814378367953456825">Unesite naziv za ovaj otisak prsta</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Dodatne postavke sadržaja</translation>
 <translation id="5042282098504489593">Otvorite Postavke da biste povezali uređaj <ph name="USB_DEVICE_NAME" /> s Linuxom</translation>
 <translation id="5043913660911154449">Možete i navesti PPD pisača. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Isključeno jer ste sinkronizaciju podataka kriptirali šifrom</translation>
 <translation id="5045550434625856497">Pogrešna zaporka</translation>
 <translation id="504561833207953641">Otvaranje u postojećoj sesiji preglednika.</translation>
 <translation id="5047421709274785093">Web-lokacijama nije dopuštena upotreba senzora pokreta i osvjetljenja</translation>
@@ -3321,7 +3316,7 @@
 <translation id="5495597166260341369">Ostavi uključen zaslon</translation>
 <translation id="5496587651328244253">Organizacija</translation>
 <translation id="5499313591153584299">Ta datoteka može biti štetna za vaše računalo.</translation>
-<translation id="5500709606820808700">Sigurnosna je provjera danas izvršena</translation>
+<translation id="5500709606820808700">Sigurnosna provjera izvršena je danas</translation>
 <translation id="5502500733115278303">Uvezeno iz Firefoxa</translation>
 <translation id="5505264765875738116">Web-lokacije ne mogu postavljati pitanja o slanju obavijesti</translation>
 <translation id="5505307013568720083">Nema tinte</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />poništiti sinkronizaciju<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Dobro došli u obitelj <ph name="SHORT_PRODUCT_NAME" />. To nije obično računalo.</translation>
 <translation id="6358884629796491903">Zmaj</translation>
-<translation id="6360719647236334056">Upotreba povijesti pregledavanja u Chromeu za prilagodbu Pretraživanja, oglasa i drugih Googleovih usluga</translation>
 <translation id="6361850914223837199">Detalji pogreške:</translation>
 <translation id="6362853299801475928">&amp;Prijavljivanje problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Recite nam koliko ste zadovoljni nama.</translation>
 <translation id="6759193508432371551">Vraćanje na tvorničke postavke</translation>
 <translation id="6762833852331690540">Uključeno</translation>
-<translation id="6764693078871405569">Izbrišite i podatke o pregledavanju (<ph name="URL" />), čime ćete se odjaviti s web-lokacije <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Odabir drugog jezika…</translation>
 <translation id="6767639283522617719">Nije uspjelo pridruživanje domeni. Provjerite jesu li postavke ispravne za organizacijsku jedinicu.</translation>
 <translation id="6769712124046837540">Dodavanje pisača...</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 8860c2b..3f751e3 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Összes adat olvasása és módosítása az aktuális webhelyen meghívás esetén</translation>
 <translation id="1242633766021457174">A(z) <ph name="THIRD_PARTY_TOOL_NAME" /> vissza akarja állítani a beállításokat.</translation>
 <translation id="1243314992276662751">Feltöltés</translation>
-<translation id="1243398753772016127">A webhelyek nem használhatják fel az Ön különböző webhelyeken végzett böngészési tevékenységeit a hirdetések személyre szabásához</translation>
 <translation id="1244265436519979884">Folyamatban van a Linux helyreállítása</translation>
 <translation id="1244303850296295656">Bővítménnyel kapcsolatos hiba</translation>
 <translation id="1246905108078336582">Eltávolítja a javaslatot a vágólapról?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Be – egyéni beállítások</translation>
 <translation id="1489664337021920575">Másik lehetőség kiválasztása</translation>
 <translation id="1493892686965953381">Várakozás a következőre: <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">A böngészési adatok (<ph name="URL" />) törlésével együtt, ami kiléptetheti a google.com webhelyéről.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> további elérhető eszköz.</translation>
 <translation id="1495677929897281669">Vissza a lapra</translation>
 <translation id="1499271269825557605">Ha nem ismeri fel valamelyik bővítményt, vagy ha a böngésző nem a vártnak megfelelően működik, itt kikapcsolhatja és személyre szabhatja a bővítményeket.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ez az ikon akkor látható, ha az adott bővítmény műveletet hajthat végre az aktuális oldalon. A bővítményt az ikonra kattintva, illetve a következő billentyűkódot megnyomva használhatja: <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Beállítás videokonferenciákhoz készült Chromebox eszközként</translation>
 <translation id="2580889980133367162">A(z) <ph name="HOST" /> mindig letölthet több fájlt</translation>
-<translation id="2580924999637585241">Összesen: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Hosszú</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (<ph name="PLATFORM_VERSION" /> platform) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Nem sikerült a Kerberos-jegy lekérése. Próbálja újra, vagy forduljon a szervezet eszközadminisztrátorához. (Hibakód: <ph name="ERROR_CODE" />).</translation>
@@ -2818,7 +2815,6 @@
 <translation id="4808667324955055115">Előugró ablakok letiltva:</translation>
 <translation id="480990236307250886">A kezdőoldal megnyitása</translation>
 <translation id="4811503964269049987">A kijelölt lap csoportba helyezése</translation>
-<translation id="4811818760963189951">Ki van kapcsolva, mert letiltotta az előzmények szinkronizálását</translation>
 <translation id="4813136279048157860">Saját képek</translation>
 <translation id="4813512666221746211">Hálózati hiba</translation>
 <translation id="4814378367953456825">Nevezze el ezt az ujjlenyomatot</translation>
@@ -2987,7 +2983,6 @@
 <translation id="5040823038948176460">További tartalombeállítások</translation>
 <translation id="5042282098504489593">Ha csatlakoztatni szeretné a(z) <ph name="USB_DEVICE_NAME" /> eszközt a Linux rendszerhez, nyissa meg a Beállítások menüt</translation>
 <translation id="5043913660911154449">Vagy adja meg a nyomtatóhoz tartozó PPD-fájlt – <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Ki van kapcsolva, mert Ön összetett jelszóval titkosította szinkronizálási adatait</translation>
 <translation id="5045550434625856497">Helytelen jelszó</translation>
 <translation id="504561833207953641">Megnyitás meglévő böngésző-munkamenetben.</translation>
 <translation id="5047421709274785093">A mozgás- és fényérzékelők használatnak tiltása a webhelyek számára</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">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, <ph name="BEGIN_LINK" />alaphelyzetbe kell állítania a szinkronizálást<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Üdvözli a <ph name="SHORT_PRODUCT_NAME" />-család. Ez nem csupán egy hétköznapi számítógép.</translation>
 <translation id="6358884629796491903">Sárkány</translation>
-<translation id="6360719647236334056">Az Ön Chrome-os böngészési előzményeinek használata a Keresés, a hirdetések és más Google-szolgáltatások személyre szabására</translation>
 <translation id="6361850914223837199">Hiba részletei:</translation>
 <translation id="6362853299801475928">&amp;Hibabejelentés...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Ossza meg velünk, mennyire van megelégedve munkánkkal.</translation>
 <translation id="6759193508432371551">Gyári beállítások visszaállítása</translation>
 <translation id="6762833852331690540">Be</translation>
-<translation id="6764693078871405569">A böngészési adatok (<ph name="URL" />) törlésével együtt, ami kiléptetheti a(z) <ph name="DOMAIN" /> webhelyéről.</translation>
 <translation id="6767566652486411142">Másik nyelv választása…</translation>
 <translation id="6767639283522617719">Nem sikerült csatlakozni a domainhez. Győződjön meg róla, hogy a beállítások megfelelnek a helyi szervezeti egységnek.</translation>
 <translation id="6769712124046837540">Nyomtató hozzáadása...</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index c69adb6..d34ad77c3 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Կարդալ և փոխել ձեր բոլոր տվյալներն ընթացիկ կայքում, երբ այն բացվում է</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />-ը ցանկանում է վերակայել ձեր կարգավորումները:</translation>
 <translation id="1243314992276662751">Վերբեռնել</translation>
-<translation id="1243398753772016127">Կայքերը չեն կարող օգտագործել տարբեր կայքերում ձեր կատարած գործողությունները գովազդն անհատականացնելու համար։</translation>
 <translation id="1244265436519979884">Լինուքսի վերականգնումն ընթացքի մեջ է</translation>
 <translation id="1244303850296295656">Ընդլայնման սխալ</translation>
 <translation id="1246905108078336582">Հեռացնե՞լ առաջարկը սեղմատախտակից:</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Միացված է – անհատականացված կարգավորումներ</translation>
 <translation id="1489664337021920575">Ընտրեք մեկ այլ տարբերակ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />-ի սպասում…</translation>
-<translation id="1494438840282430403">Ջնջել նաև այցելությունների պատմությունը (<ph name="URL" />)։ Նկատի ունեցեք, որ արդյունքում հնարավոր է դուրս գրվեք ձեր հաշվից Google.com կայքում։</translation>
 <translation id="1495486559005647033">Եվս <ph name="NUM_PRINTERS" /> մատչելի սարք:</translation>
 <translation id="1495677929897281669">Վերադառնալ ներդիր</translation>
 <translation id="1499271269825557605">Եթե ընդլայնումը ձեզ անծանոթ է, կամ եթե ձեր դիտարկիչը սխալներով է աշխատում, կարող եք անջատել կամ կարգավորել ընդլայնումներն այստեղ։</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Այս պատկերակը կցուցադրվի, եթե ընդլայնումը կարող է աշխատել բեռնված էջում: Օգտագործեք այս ընդլայնումը՝ սեղմելով պատկերակի կամ <ph name="EXTENSION_SHORTCUT" />:</translation>
 <translation id="257779572837908839">Կարգավորել «Chromebox տեսաժողովների համար» ռեժիմը</translation>
 <translation id="2580889980133367162">Միշտ թույլ տալ <ph name="HOST" />-ին ներբեռնել մի քանի ֆայլ</translation>
-<translation id="2580924999637585241">Ընդամենը՝ <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Երկար</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (հենք՝ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Չհաջողվեց բեռնել Kerberos տոմսը: Նորից փորձեք կամ կապվեք կազմակերպության սարքի ադմինիստրատորի հետ (սխալի կոդը՝ <ph name="ERROR_CODE" />):</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Ելնող պատուհաններն արգելափակված են՝</translation>
 <translation id="480990236307250886">Բացել գլխավոր էջը</translation>
 <translation id="4811503964269049987">Ավելացնել ընտրված ներդիրը խմբում</translation>
-<translation id="4811818760963189951">Անջատված է, քանի որ դուք անջատել եք պատմության համաժամացումը։</translation>
 <translation id="4813136279048157860">Իմ պատկերները</translation>
 <translation id="4813512666221746211">Ցանցի սխալ</translation>
 <translation id="4814378367953456825">Անուն տվեք այս մատնահետքին</translation>
@@ -2989,7 +2985,6 @@
 <translation id="5040823038948176460">Բովանդակության լրացուցիչ կարգավորումներ</translation>
 <translation id="5042282098504489593">Անցեք Կարգավորումներ՝ <ph name="USB_DEVICE_NAME" /> սարքը Լինուքսին միացնելու համար</translation>
 <translation id="5043913660911154449">Կամ նշեք ձեր տպիչի PPD ֆայլը <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Անջատված է, քանի որ դուք անցաբառով գաղտնագրել եք ձեր համաժամացված տվյալները։</translation>
 <translation id="5045550434625856497">Գաղտնաբառը սխալ է</translation>
 <translation id="504561833207953641">Բացվում է դիտարկիչի ընթացիկ աշխատաշրջանում։</translation>
 <translation id="5047421709274785093">Արգելել կայքերին օգտագործել շարժման և լուսավորության սենսորները</translation>
@@ -3968,7 +3963,6 @@
 <translation id="63566973648609420">Միայն ձեր անցաբառն ունեցող օգտատերը կարող է կարդալ ձեր գաղտնագրված տվյալները: Անցաբառը չի ուղարկվում Google-ին և չի պահվում դրա կողմից: Անցաբառը մոռանալու դեպքում ձեզ անհրաժեշտ կլինի <ph name="BEGIN_LINK" />վերակայել համաժամացումը<ph name="END_LINK" />:</translation>
 <translation id="6357619544108132570">Բարի գալուստ <ph name="SHORT_PRODUCT_NAME" />-ի ընտանիք: Սա սովորական համակարգիչ չէ:</translation>
 <translation id="6358884629796491903">Վիշապ</translation>
-<translation id="6360719647236334056">Օգտագործեք Chrome-ի այցելությունների պատմությունը՝ գովազդը, Որոնումը և Google-ի մյուս ծառայություններն անհատականացնելու համար</translation>
 <translation id="6361850914223837199">Սխալի մանրամասներ՝</translation>
 <translation id="6362853299801475928">&amp;Հաղորդել խնդրի մասին…</translation>
 <translation id="6365069501305898914">Ֆեյսբուք</translation>
@@ -4246,7 +4240,6 @@
 <translation id="6758056191028427665">Կիսվեք մեզ հետ ձեր տպավորություններով:</translation>
 <translation id="6759193508432371551">Գործարանային կարգավորումների վերականգնում</translation>
 <translation id="6762833852331690540">Միացված է</translation>
-<translation id="6764693078871405569">Ջնջել նաև այցելությունների պատմությունը (<ph name="URL" />)։ Նկատի ունեցեք, որ արդյունքում հնարավոր է դուրս գրվեք ձեր հաշվից <ph name="DOMAIN" /> կայքում։</translation>
 <translation id="6767566652486411142">Ընտրել մեկ այլ լեզու...</translation>
 <translation id="6767639283522617719">Չհաջողվեց միանալ տիրույթին: Համոզվեք, որ ստորաբաժանման կարգավորումները ճիշտ են:</translation>
 <translation id="6769712124046837540">Տպիչի ավելացում…</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index e7eda8e..06cb6c8 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Membaca dan mengubah semua data di situs saat ini jika diminta</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ingin menyetel ulang setelan Anda.</translation>
 <translation id="1243314992276662751">Upload</translation>
-<translation id="1243398753772016127">Situs tidak dapat menggunakan aktivitas penjelajahan Anda di situs lain untuk mempersonalisasi iklan</translation>
 <translation id="1244265436519979884">Pemulihan Linux saat ini sedang berlangsung</translation>
 <translation id="1244303850296295656">Kesalahan ekstensi</translation>
 <translation id="1246905108078336582">Hapus saran dari papan klip?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Aktif - setelan khusus</translation>
 <translation id="1489664337021920575">Pilih opsi lain</translation>
 <translation id="1493892686965953381">Menunggu <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Hapus juga data penjelajahan (<ph name="URL" />) yang mungkin akan membuat Anda logout dari Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> perangkat lain tersedia.</translation>
 <translation id="1495677929897281669">Kembali ke tab</translation>
 <translation id="1499271269825557605">Jika Anda tidak mengenali ekstensi, atau jika browser tidak berfungsi sesuai harapan, Anda dapat menonaktifkan atau menyesuaikan ekstensi di sini.</translation>
@@ -521,7 +519,7 @@
 <translation id="1700079447639026019">Situs yang tidak boleh menggunakan cookie</translation>
 <translation id="1701062906490865540">Hapus orang ini</translation>
 <translation id="1703331064825191675">Tidak perlu mengkhawatirkan sandi Anda</translation>
-<translation id="1704970325597567340">Pemeriksaan keselamatan berjalan pada <ph name="DATE" /></translation>
+<translation id="1704970325597567340">Pemeriksaan keselamatan berjalan tanggal <ph name="DATE" /></translation>
 <translation id="1706586824377653884">Ditambahkan oleh administrator Anda</translation>
 <translation id="1706625117072057435">Tingkat perbesar/perkecil</translation>
 <translation id="1708338024780164500">(Tidak aktif)</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ikon ini akan terlihat saat ekstensi dapat berperan di halaman aktif. Gunakan ekstensi ini dengan mengeklik ikon atau dengan menekan <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Siapkan sebagai Chromebox untuk meeting</translation>
 <translation id="2580889980133367162">Selalu izinkan <ph name="HOST" /> untuk mendownload beberapa file</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lama</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Tidak dapat mengambil tiket Kerberos. Coba lagi atau hubungi admin perangkat organisasi Anda. (Kode error <ph name="ERROR_CODE" />).</translation>
@@ -1715,7 +1712,7 @@
 <translation id="3293644607209440645">Kirim halaman ini</translation>
 <translation id="32939749466444286">Container Linux tidak dimulai. Harap coba lagi.</translation>
 <translation id="3294437725009624529">Tamu</translation>
-<translation id="3296193636298964625">Chrome tidak dapat memeriksa semua sandi Anda karena terlalu banyak.</translation>
+<translation id="3296193636298964625">Chrome tidak dapat memeriksa semua sandi Anda karena jumlahnya terlalu banyak.</translation>
 <translation id="329703603001918157">Tidak dapat mengedit pintasan</translation>
 <translation id="329838636886466101">Perbaiki</translation>
 <translation id="3298789223962368867">URL yang dimasukkan tidak valid.</translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">Pop-up diblokir:</translation>
 <translation id="480990236307250886">Buka beranda</translation>
 <translation id="4811503964269049987">Masukkan Tab yang Dipilih ke Grup</translation>
-<translation id="4811818760963189951">Dinonaktifkan karena Anda menonaktifkan sinkronisasi histori</translation>
 <translation id="4813136279048157860">Gambar Saya</translation>
 <translation id="4813512666221746211">Kesalahan jaringan</translation>
 <translation id="4814378367953456825">Masukkan nama untuk sidik jari ini</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">Setelan konten tambahan</translation>
 <translation id="5042282098504489593">Buka Setelan untuk menghubungkan <ph name="USB_DEVICE_NAME" /> ke Linux</translation>
 <translation id="5043913660911154449">Atau tentukan PPD printer <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Dinonaktifkan karena Anda mengenkripsi data yang disinkronkan dengan frasa sandi</translation>
 <translation id="5045550434625856497">Sandi salah</translation>
 <translation id="504561833207953641">Membuka di sesi browser yang ada.</translation>
 <translation id="5047421709274785093">Blokir situs agar tidak menggunakan sensor gerakan dan cahaya</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">Hanya orang yang memiliki frasa sandi Anda yang dapat membaca data terenkripsi. Frasa sandi tidak dikirim ke atau disimpan oleh Google. Jika lupa frasa sandi atau ingin mengubah setelan ini, Anda perlu <ph name="BEGIN_LINK" />menyetel ulang sinkronisasi<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Selamat datang di keluarga <ph name="SHORT_PRODUCT_NAME" />. Ini bukan komputer biasa.</translation>
 <translation id="6358884629796491903">Naga</translation>
-<translation id="6360719647236334056">Gunakan histori penjelajahan Chrome Anda untuk mempersonalisasi Penelusuran, iklan, dan layanan Google lainnya</translation>
 <translation id="6361850914223837199">Detail kesalahan:</translation>
 <translation id="6362853299801475928">&amp;Melaporkan masalah...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">Berikan masukan Anda tentang kinerja kami.</translation>
 <translation id="6759193508432371551">Kembalikan ke setelan pabrik</translation>
 <translation id="6762833852331690540">Aktif</translation>
-<translation id="6764693078871405569">Hapus juga data penjelajahan (<ph name="URL" />) yang akan membuat Anda logout dari <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Pilih Bahasa Lain...</translation>
 <translation id="6767639283522617719">Tidak dapat bergabung dengan domain. Pastikan setelan sudah benar untuk unit organisasi.</translation>
 <translation id="6769712124046837540">Menambahkan printer...</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 5e3621b..5820972f 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Lesa og breyta öllum gögnum á núverandi vefsvæði þegar þetta er virkjað</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> vill endurstilla stillingarnar þínar.</translation>
 <translation id="1243314992276662751">Hlaða inn</translation>
-<translation id="1243398753772016127">Vefsvæði geta ekki notfært sér vafravirkni þína á mismunandi vefsvæðum til að sérsníða auglýsingar</translation>
 <translation id="1244265436519979884">Endurheimt Linux stendur yfir</translation>
 <translation id="1244303850296295656">Villa í viðbót</translation>
 <translation id="1246905108078336582">Fjarlægja tillögu af klippiborði?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Kveikt – sérsniðnar stillingar</translation>
 <translation id="1489664337021920575">Velja annan valkost</translation>
 <translation id="1493892686965953381">Beðið eftir <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Hreinsa einnig vefskoðunargögn (<ph name="URL" />) sem gæti skráð þig út af Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> önnur tiltæk tæki</translation>
 <translation id="1495677929897281669">Aftur á flipa</translation>
 <translation id="1499271269825557605">Ef þú þekkir ekki viðbót eða ef vafrinn virkar ekki eins og hann á að gera geturðu slökkt á viðbótum eða sérsniðið þær hér.</translation>
@@ -483,7 +481,7 @@
 <translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Bættu prentaranum við Google skýjaprentun til að prenta hvaðan sem er.}one{Bættu # prentara við Google skýjaprentun til að prenta hvaðan sem er.}other{Bættu # prenturum við Google skýjaprentun til að prenta hvaðan sem er.}}</translation>
 <translation id="1656528038316521561">Gagnsæi bakgrunns</translation>
 <translation id="1657406563541664238">Hjálpa til við að bæta <ph name="PRODUCT_NAME" /> með því að senda sjálfkrafa talnagögn um notkun og tilkynningar um hrun til Google</translation>
-<translation id="1657937299377480641">Til að skrá þig inn aftur fyrir aðgang að menntunarleiðum skaltu biðja foreldri um að veita þér þá heimild</translation>
+<translation id="1657937299377480641">Til að skrá þig inn aftur og fá aðgang að menntabrunnum skaltu biðja foreldri um að gefa þér leyfi</translation>
 <translation id="1658424621194652532">Þessi síða hefur aðgang að hljóðnemanum.</translation>
 <translation id="1660204651932907780">Leyfa vefsvæðum að spila hljóð (mælt með)</translation>
 <translation id="1660763353352708040">Vandamál í straumbreyti</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Þetta tákn verður sýnilegt þegar hægt er að nota viðbótina á síðunni sem er opin. Notaðu viðbótina með því að smella á táknið eða ýta á <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Setja upp Chromebox fyrir fundi</translation>
 <translation id="2580889980133367162">Leyfa <ph name="HOST" /> alltaf að sækja margar skrár</translation>
-<translation id="2580924999637585241">Samtals: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Löng</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (kerfi <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Ekki var hægt að sækja Kerberos-miða. Reyndu aftur eða hafðu samband við tækjastjóra fyrirtækisins. (Villukóði <ph name="ERROR_CODE" />).</translation>
@@ -2457,7 +2454,7 @@
 <translation id="4263223596040212967">Athugaðu lyklaskipanina og reyndu aftur.</translation>
 <translation id="4263757076580287579">Hætt var við skráningu prentara.</translation>
 <translation id="426564820080660648">Notaðu Ethernet, Wi-Fi eða farsímagögn til að leita að uppfærslum.</translation>
-<translation id="4267455501101322486">Til að bæta við reikningi fyrir aðgang að menntunarleiðum skaltu biðja foreldri um að veita þér þá heimild</translation>
+<translation id="4267455501101322486">Til að bæta við reikningi og fá aðgang að menntabrunnum skaltu biðja foreldri um að gefa þér leyfi</translation>
 <translation id="4267953847983678297">Tengjast sjálfkrafa við farsímanet</translation>
 <translation id="4268025649754414643">Lykladulritun</translation>
 <translation id="4270393598798225102">Útgáfa <ph name="NUMBER" /></translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Lokað á sprettiglugga:</translation>
 <translation id="480990236307250886">Opna heimasíðuna</translation>
 <translation id="4811503964269049987">Setja valinn flipa í hóp</translation>
-<translation id="4811818760963189951">Slökkt er á þessu vegna þess að þú slökktir á samstillingu ferils</translation>
 <translation id="4813136279048157860">Myndirnar mínar</translation>
 <translation id="4813512666221746211">Netvilla</translation>
 <translation id="4814378367953456825">Veldu fingrafarinu heiti</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Fleiri efnisstillingar</translation>
 <translation id="5042282098504489593">Opnaðu „Stillingar“ til að tengja <ph name="USB_DEVICE_NAME" /> við Linux</translation>
 <translation id="5043913660911154449">Eða tilgreindu PPD prentarans <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Slökkt vegna þess að þú dulkóðaðir samstillingargögn með aðgangsorði</translation>
 <translation id="5045550434625856497">Rangt aðgangsorð</translation>
 <translation id="504561833207953641">Opnast í núverandi vafralotu.</translation>
 <translation id="5047421709274785093">Ekki leyfa vefsvæðum að nota hreyfi- og birtuskynjara</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Aðeins þeir sem vita aðgangsorðið geta lesið dulkóðuðu gögnin þín. Aðgangsorðið er ekki sent til Google eða vistað þar. Ef þú gleymir aðgangsorðinu eða þig langar að breyta þessari stillingu þarftu að <ph name="BEGIN_LINK" />endurstilla samstillingu<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Komdu fagnandi í <ph name="SHORT_PRODUCT_NAME" /> fjölskylduna. Þetta er engin venjuleg tölva.</translation>
 <translation id="6358884629796491903">Dreki</translation>
-<translation id="6360719647236334056">Nota vafraferil Chrome til að sérsníða leitina, auglýsingar og aðra þjónustu Google</translation>
 <translation id="6361850914223837199">Villuupplýsingar:</translation>
 <translation id="6362853299801475928">Tilkynna um vandamál...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Láttu okkur vita hvernig við stöndum okkur.</translation>
 <translation id="6759193508432371551">Núllstilling</translation>
 <translation id="6762833852331690540">Kveikt</translation>
-<translation id="6764693078871405569">Hreinsa einnig vefskoðunargögn (<ph name="URL" />) sem mun skrá þig út af <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Velja annað tungumál...</translation>
 <translation id="6767639283522617719">Ekki tókst að tengjast léninu. Gakktu úr skugga um að stillingarnar séu réttar fyrir skipulagseininguna.</translation>
 <translation id="6769712124046837540">Bætir prentara við...</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index a70d1d5b..7caf45ab 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838">Il file <ph name="FILE_NAME" /> include contenuti sensibili, quindi è stato bloccato.</translation>
 <translation id="1061904396131502319">È quasi ora di fare una pausa</translation>
+<translation id="1064552680598333868">Le modifiche apportate al microfono verranno applicate dopo il riavvio di Linux.</translation>
 <translation id="1067048845568873861">Data creazione</translation>
 <translation id="1067291318998134776">Linux (beta)</translation>
 <translation id="1067922213147265141">Altri servizi Google</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">Per richiedere l'accesso, contatta l'amministratore del dispositivo.</translation>
 <translation id="1149401351239820326">Mese di scadenza</translation>
 <translation id="1150565364351027703">Occhiali da sole</translation>
+<translation id="1151841030700667295">Uscirai da tutti i siti, schede aperte incluse.</translation>
 <translation id="1151917987301063366">Consenti sempre a <ph name="HOST" /> di accedere ai sensori</translation>
 <translation id="1153356358378277386">Dispositivi accoppiati</translation>
 <translation id="1153636665119721804">Programma di protezione avanzata di Google</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">Lettura e modifica di tutti i dati sul sito web corrente (se richiamato)</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> vuole ripristinare le impostazioni.</translation>
 <translation id="1243314992276662751">Carica</translation>
-<translation id="1243398753772016127">I siti non possono usare la tua attività di navigazione su diversi siti web per personalizzare gli annunci.</translation>
 <translation id="1244265436519979884">È in corso il ripristino di Linux</translation>
 <translation id="1244303850296295656">Errore delle estensioni</translation>
 <translation id="1246905108078336582">Rimuovere il suggerimento dagli appunti?</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">Salve.</translation>
 <translation id="138784436342154190">Ripristinare la pagina iniziale predefinita?</translation>
 <translation id="1390548061267426325">Apri in una scheda normale</translation>
+<translation id="1392232653471491344">Riavvio di Linux richiesto</translation>
 <translation id="1393283411312835250">Sole e nuvole</translation>
 <translation id="1393787139683794508">Verranno cancellati tutti i dati e i cookie memorizzati da <ph name="ORIGIN_NAME" />.</translation>
 <translation id="1395730723686586365">Programma di aggiornamento avviato</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> per consentire l'accoppiamento</translation>
 <translation id="1422159345171879700">Carica script non sicuri</translation>
 <translation id="1426410128494586442">Sì</translation>
+<translation id="142655739075382478"><ph name="APP_NAME" /> è bloccata</translation>
 <translation id="1426870617281699524">Fai clic su Riprova e accetta la richiesta sul computer</translation>
 <translation id="1427269577154060167">Paese</translation>
 <translation id="142758023928848008">Attiva tasti bloccati (per eseguire scorciatoie da tastiera digitandole in sequenza)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">&amp;Impostazioni lingua</translation>
 <translation id="1478340334823509079">Dettagli: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">L'installazione non è attiva</translation>
+<translation id="1481537595330271162">Errore durante il ridimensionamento del disco</translation>
 <translation id="1482626744466814421">Aggiungi questa scheda ai preferiti…</translation>
 <translation id="1483493594462132177">Invia</translation>
 <translation id="1484979925941077974">Il sito usa il Bluetooth</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">Con: impostazioni personalizzate</translation>
 <translation id="1489664337021920575">Scegli un'altra opzione</translation>
 <translation id="1493892686965953381">In attesa di <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Cancella anche i dati di navigazione (<ph name="URL" />) che potrebbero farti uscire dall'account su Google.com.</translation>
 <translation id="1495486559005647033">Ci sono altri <ph name="NUM_PRINTERS" /> dispositivi disponibili.</translation>
 <translation id="1495677929897281669">Torna alla scheda</translation>
 <translation id="1499271269825557605">Se non riconosci un'estensione o se il browser non funziona come previsto, puoi disattivare o personalizzare le estensioni qui.</translation>
@@ -607,6 +610,7 @@
 <translation id="1805822111539868586">Esamina visualizzazioni</translation>
 <translation id="1805888043020974594">Server di stampa</translation>
 <translation id="1805967612549112634">Conferma PIN</translation>
+<translation id="1806335016774576568">Passa a un'altra app aperta</translation>
 <translation id="1809734401532861917">Aggiungi preferiti, cronologia, password e altre impostazioni a <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1813278315230285598">Servizi</translation>
 <translation id="18139523105317219">EDI Party Name</translation>
@@ -693,6 +697,7 @@
 <translation id="1921050530041573580">Accoppia il telefono con Messaggi</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Apri con</translation>
+<translation id="1925017091976104802">Premi <ph name="MODIFIER_KEY_DESCRIPTION" /> per incollare</translation>
 <translation id="1925021887439448749">Inserisci l'indirizzo web personalizzato</translation>
 <translation id="1925124445985510535">Il controllo di sicurezza è stato eseguito alle ore <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Queste impostazioni sono regolate da norme aziendali. Contatta l'amministratore per avere ulteriori informazioni.</translation>
@@ -838,6 +843,7 @@
 <translation id="2135787500304447609">&amp;Riprendi</translation>
 <translation id="2136372518715274136">Inserisci la nuova password</translation>
 <translation id="2136476978468204130">La passphrase inserita non è corretta</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{I cookie sono bloccati.}=1{I cookie sono bloccati, 1 eccezione}other{I cookie sono bloccati, {COUNT} eccezioni}}</translation>
 <translation id="2138398485845393913">Connessione a "<ph name="DEVICE_NAME" />" ancora in corso</translation>
 <translation id="2139545522194199494">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, intensità del segnale <ph name="SIGNAL_STRENGTH" />%, gestita dall'amministratore, connetti</translation>
 <translation id="2139919072249842737">Pulsante di configurazione</translation>
@@ -1005,11 +1011,13 @@
 <translation id="2346953515226895098">Servizio SODA</translation>
 <translation id="2347644257713614136">L'utilizzo di Hangouts e Cast for Education è regolato dalle Norme sulla privacy di Google.</translation>
 <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Errore durante il caricamento dei dati</translation>
 <translation id="2349896577940037438">Se hai attivato l'impostazione Attività web e app aggiuntiva, queste informazioni potrebbero essere salvate nel tuo Account Google. Puoi vedere ed eliminare i tuoi dati, nonché modificare le impostazioni account all'indirizzo account.google.com.</translation>
 <translation id="2350133097354918058">Ricaricata</translation>
 <translation id="2350182423316644347">Inizializzazione dell'applicazione in corso...</translation>
 <translation id="2350796302381711542">Consentire a <ph name="HANDLER_HOSTNAME" /> di aprire tutti i link <ph name="PROTOCOL" /> al posto di <ph name="REPLACED_HANDLER_TITLE" />?</translation>
 <translation id="2351266942280602854">Lingua e immissione</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 elemento}other{{NUM_ITEMS} elementi}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Le note sulla schermata di blocco vengono salvate automaticamente nell'app <ph name="LOCK_SCREEN_APP_NAME" />. La nota più recente rimarrà sulla schermata di blocco.</translation>
 <translation id="2353297238722298836">Videocamera e microfono consentiti</translation>
@@ -1043,6 +1051,7 @@
 <translation id="2392369802118427583">Attiva</translation>
 <translation id="2394566832561516196">Le impostazioni verranno cancellate al prossimo aggiornamento della pagina.</translation>
 <translation id="2395616325548404795">Il dispositivo <ph name="DEVICE_TYPE" /> è stato registrato correttamente per la gestione aziendale, ma l'invio delle relative informazioni su asset e posizione non è riuscito. Inserisci manualmente queste informazioni nella Console di amministrazione del dispositivo.</translation>
+<translation id="2396387085693598316">Il tuo amministratore ha bloccato "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="2396783860772170191">Inserisci il PIN di 4 cifre (0000-9999)</translation>
 <translation id="2399939490305346086">Dati di accesso del token di sicurezza</translation>
 <translation id="2400664245143453337">È richiesto l'aggiornamento immediato</translation>
@@ -1189,7 +1198,6 @@
 <translation id="2575247648642144396">Questa icona sarà visibile quando l'estensione potrà agire sulla pagina corrente. Utilizza questa estensione facendo clic sull'icona o premendo <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configura come Chromebox per videoconferenze</translation>
 <translation id="2580889980133367162">Consenti sempre a <ph name="HOST" /> di scaricare più file</translation>
-<translation id="2580924999637585241">Totale: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lungo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (piattaforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Impossibile recuperare la richiesta di Kerberos. Riprova o contatta l'amministratore del dispositivo dell'organizzazione. (Codice errore: <ph name="ERROR_CODE" />).</translation>
@@ -1330,6 +1338,7 @@
 <translation id="2753677631968972007">Controlla manualmente le autorizzazioni del sito.</translation>
 <translation id="2755367719610958252">Gestisci funzioni di accessibilità</translation>
 <translation id="275662540872599901">schermo spento</translation>
+<translation id="2757338480560142065">Assicurati che la password che vuoi salvare corrisponda alla password di <ph name="WEBSITE" /></translation>
 <translation id="2762441749940182211">Videocamera bloccata</translation>
 <translation id="2765217105034171413">Piccole</translation>
 <translation id="2766161002040448006">Rivolgiti a un genitore</translation>
@@ -1582,6 +1591,7 @@
 <translation id="3090819949319990166">Impossibile copiare il file crx esterno su <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" accoppiato</translation>
 <translation id="3092699946856346803">Inserisci la SIM e riprova</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 estensione potenzialmente dannosa è stata disattivata. Puoi anche rimuoverla.}other{{NUM_EXTENSIONS} estensioni potenzialmente dannose sono state disattivate. Puoi anche rimuoverle.}}</translation>
 <translation id="3101709781009526431">Data e ora</translation>
 <translation id="3103941660000130485">Errore durante l'upgrade di Linux</translation>
 <translation id="310671807099593501">Il sito sta usando il Bluetooth</translation>
@@ -1656,6 +1666,7 @@
 <translation id="3201422919974259695">I dispositivi USB disponibili vengono indicati qui.</translation>
 <translation id="3202131003361292969">Percorso</translation>
 <translation id="3202173864863109533">L'audio di questa scheda sta per essere disattivato.</translation>
+<translation id="3208321278970793882">App</translation>
 <translation id="3208584281581115441">Controlla ora</translation>
 <translation id="3208703785962634733">Non confermato</translation>
 <translation id="32101887417650595">Impossibile collegarsi alla stampante</translation>
@@ -1676,6 +1687,7 @@
 <translation id="3239373508713281971">Limite di tempo per l'app <ph name="APP_NAME" /> rimosso</translation>
 <translation id="3241680850019875542">Seleziona la directory principale dell'estensione di cui creare il pacchetto. Per aggiornare un'estensione, seleziona anche il file delle chiave privata da riutilizzare.</translation>
 <translation id="3244294424315804309">Continua a tenere l'audio disattivato</translation>
+<translation id="3246107497225150582">{0,plural, =1{Aggiorna il dispositivo entro un giorno}other{Aggiorna il dispositivo entro # giorni}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - Errore di rete</translation>
 <translation id="3248902735035392926">La sicurezza è importante. Prenditi un attimo per <ph name="BEGIN_LINK" />controllare ora le tue estensioni<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1762,6 +1774,7 @@
 <translation id="3356580349448036450">Fine</translation>
 <translation id="3359256513598016054">Vincoli criteri certificati</translation>
 <translation id="3360297538363969800">Errore di stampa. Controlla la stampante e riprova.</translation>
+<translation id="3364986687961713424">Dal tuo amministratore: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Usa il tasto CTRL o ALT</translation>
 <translation id="3367047597842238025">Configura il tuo <ph name="DEVICE_TYPE" /> secondo le tue preferenze e scopri tutte le incredibili funzionalità a portata di mano.</translation>
 <translation id="3368922792935385530">Connessa</translation>
@@ -1866,6 +1879,7 @@
 <translation id="3496213124478423963">Riduci</translation>
 <translation id="3497560059572256875">Condividi doodle</translation>
 <translation id="3498215018399854026">In questo momento, non è possibile raggiungere il tuo genitore. Riprova.</translation>
+<translation id="3500417806337761827">Errore durante il montaggio della condivisione. Sono già montate troppe condivisioni SMB.</translation>
 <translation id="3505030558724226696">Revoca accesso ai dispositivi</translation>
 <translation id="3507421388498836150">Autorizzazioni attuali di "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="3507888235492474624">Ripeti la ricerca di dispositivi Bluetooth</translation>
@@ -1931,6 +1945,7 @@
 <translation id="3592260987370335752">&amp;Ulteriori informazioni</translation>
 <translation id="359283478042092570">Entra</translation>
 <translation id="3593965109698325041">Vincoli nomi certificati</translation>
+<translation id="3595381248165458839">Contatta l'amministratore del dispositivo dell'organizzazione</translation>
 <translation id="3596235046596950091">Attiva servizi cloud</translation>
 <translation id="3596414637720633074">Blocca cookie di terze parti nella modalità di navigazione in incognito</translation>
 <translation id="3599221874935822507">In rilievo</translation>
@@ -2064,6 +2079,7 @@
 <translation id="3742666961763734085">Impossibile trovare un'unità organizzativa con il nome indicato. Riprova.</translation>
 <translation id="3744111561329211289">Sincronizzazione in background</translation>
 <translation id="3746127522257263495">L'aggiunta di un account G Suite for Education nelle app Android non è supportata.</translation>
+<translation id="3747039297326604768">Impossibile aprire Plugin VM</translation>
 <translation id="3747077776423672805">Per rimuovere le app apri Impostazioni &gt; Google Play Store &gt; Gestisci le preferenze Android &gt; App o Gestione applicazioni, quindi tocca l'app che vuoi disinstallare (potresti dover scorrere verso sinistra o verso destra per trovarla) e infine tocca Disinstalla o Disattiva.</translation>
 <translation id="3748026146096797577">Non connesso</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2139,6 +2155,7 @@
 <translation id="3827774300009121996">&amp;Schermo intero</translation>
 <translation id="3828029223314399057">Cerca tra i Preferiti</translation>
 <translation id="3829765597456725595">Condivisione file SMB</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{L'amministratore ha riattivato 1 estensione potenzialmente dannosa}other{L'amministratore ha riattivato {NUM_EXTENSIONS} estensioni potenzialmente dannose}}</translation>
 <translation id="3831436149286513437">Suggerimenti di ricerca di Google Drive</translation>
 <translation id="383161972796689579">Il proprietario di questo dispositivo ha disattivato l'aggiunta di nuovi utenti</translation>
 <translation id="3834775135533257713">Impossibile aggiungere l'applicazione "<ph name="TO_INSTALL_APP_NAME" />" perché è in conflitto con "<ph name="INSTALLED_APP_NAME" />".</translation>
@@ -2315,6 +2332,7 @@
 <translation id="4047726037116394521">Vai alla Home page</translation>
 <translation id="4050225813016893843">Metodo di autenticazione</translation>
 <translation id="4052120076834320548">Minuscolo</translation>
+<translation id="4056908315660577142">Hai raggiunto il tempo massimo impostato dal genitore per l'app di Chrome <ph name="APP_NAME" />. Domani potrai utilizzare l'app per <ph name="TIME_LIMIT" />.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">Visualizza nello Store</translation>
 <translation id="4058647953897694817">Verifica tramite Bluetooth</translation>
@@ -2446,6 +2464,7 @@
 <translation id="424963718355121712">Le app devono essere installate dall'host che controllano</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4250680216510889253">No</translation>
+<translation id="4252035718262427477">Pagina web, file singolo (bundle web)</translation>
 <translation id="4252852543720145436">Identificatori di contenuti protetti</translation>
 <translation id="4252899949534773101">Il Bluetooth è disabilitato</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - Contenuti delle schede condivisi</translation>
@@ -2541,6 +2560,7 @@
 <translation id="4400963414856942668">Puoi fare clic sulla stella per aggiungere una scheda ai preferiti</translation>
 <translation id="4403775189117163360">Scegli una cartella diversa</translation>
 <translation id="4404136731284211429">Analizza di nuovo</translation>
+<translation id="4404843640767531781"><ph name="APP_NAME" /> è stata bloccata da un genitore. Chiedi al tuo genitore l'autorizzazione per poter usare l'app.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">G&amp;uida</translation>
 <translation id="4409697491990005945">Margini</translation>
@@ -2610,6 +2630,7 @@
 <translation id="450099669180426158">Icona punto esclamativo</translation>
 <translation id="4501530680793980440">Conferma rimozione</translation>
 <translation id="4502423230170890588">Rimuovi da questo dispositivo</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{I cookie sono consentiti}=1{I cookie sono consentiti, 1 eccezione}other{I cookie sono consentiti, {COUNT} eccezioni}}</translation>
 <translation id="4504940961672722399">Utilizza questa estensione facendo clic su questa icona o premendo <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="4508051413094283164">Apri tutto nella finestra di navigazione in incognito</translation>
 <translation id="4508265954913339219">Attivazione non riuscita</translation>
@@ -2723,6 +2744,7 @@
 <translation id="465878909996028221">Per i reindirizzamenti del browser sono supportati solo http, https e i protocolli di file.</translation>
 <translation id="4659077111144409915">Account principale</translation>
 <translation id="4660476621274971848">Versione prevista: "<ph name="EXPECTED_VERSION" />", versione rilevata: "<ph name="NEW_ID" />"</translation>
+<translation id="4660540330091848931">Ridimensionamento</translation>
 <translation id="4660838440047236328">Dati sulla struttura della tua stanza</translation>
 <translation id="4661407454952063730">Per dati delle app si intende qualsiasi dato salvato da un'app (in base alle impostazioni dello sviluppatore), inclusi dati come contatti, messaggi e foto.</translation>
 <translation id="4661931051827810091">Invia gli URL anonimi di alcune pagine visitate, informazioni limitate sul sistema e alcuni contenuti delle pagine per contribuire a scoprire e bloccare le nuove minacce per tutti gli utenti del Web.</translation>
@@ -2818,7 +2840,6 @@
 <translation id="4808667324955055115">Popup bloccati</translation>
 <translation id="480990236307250886">Apri pagina iniziale</translation>
 <translation id="4811503964269049987">Aggiungi scheda selezionata a nuovo gruppo</translation>
-<translation id="4811818760963189951">L'elemento è stato disattivato perché hai disabilitato la sincronizzazione della cronologia</translation>
 <translation id="4813136279048157860">Le mie immagini</translation>
 <translation id="4813512666221746211">Errore di rete</translation>
 <translation id="4814378367953456825">Inserisci un nome per questa impronta</translation>
@@ -2907,6 +2928,7 @@
 <translation id="4918086044614829423">Accetto</translation>
 <translation id="4918221908152712722">Installa <ph name="APP_NAME" /> (non è richiesto alcun download)</translation>
 <translation id="4920887663447894854">Il monitoraggio della tua posizione da parte dei seguenti siti è stato bloccato su questa pagina:</translation>
+<translation id="49226369361073053">{0,plural, =0{Aggiorna ora il dispositivo}=1{Aggiorna il dispositivo entro 1 secondo}other{Aggiorna il dispositivo entro # secondi}}</translation>
 <translation id="492299503953721473">Rimuovi app Android</translation>
 <translation id="4923279099980110923">Sì, desidero dare il mio contributo</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2987,7 +3009,6 @@
 <translation id="5040823038948176460">Altre impostazioni contenuti</translation>
 <translation id="5042282098504489593">Apri le Impostazioni per collegare <ph name="USB_DEVICE_NAME" /> a Linux</translation>
 <translation id="5043913660911154449">In alternativa, specifica il file PPD della stampante. <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Elemento disattivato perché hai criptato i tuoi dati di sincronizzazione con una passphrase</translation>
 <translation id="5045550434625856497">Password non corretta</translation>
 <translation id="504561833207953641">Apertura nella sessione del browser esistente.</translation>
 <translation id="5047421709274785093">Impedisci ai siti di usare i sensori di movimento e della luce</translation>
@@ -3058,6 +3079,7 @@
 <translation id="5135085122826131075">Accedi all'assistente quando dici "Ok Google".</translation>
 <translation id="5135533361271311778">Impossibile creare l'elemento nei Preferiti.</translation>
 <translation id="5137501176474113045">Elimina questa voce</translation>
+<translation id="5138982052046316113">Ridimensiona disco Linux</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, ricerca in <ph name="DEFAULT_SEARCH_ENGINE_NAME" /></translation>
 <translation id="5139823398361067371">Inserisci il PIN del token di sicurezza. Se non conosci il PIN, devi reimpostare il token di sicurezza.</translation>
 <translation id="5139955368427980650">&amp;Apri</translation>
@@ -3214,6 +3236,7 @@
 <translation id="5353252989841766347">Esporta le password da Chrome</translation>
 <translation id="5355099869024327351">Consenti all'assistente di mostrarti le notifiche</translation>
 <translation id="5355926466126177564">L'estensione "<ph name="EXTENSION_NAME" />" ha cambiato la pagina mostrata quando esegui ricerche dalla omnibox.</translation>
+<translation id="535911077628776608">Il file <ph name="FILE_NAME" /> potrebbe essere pericoloso. Inviare alla protezione avanzata di Google per la scansione? Premi Maiusc+F6 per passare alla parte con la barra dei download.</translation>
 <translation id="5359910752122114278">1 risultato</translation>
 <translation id="5360150013186312835">Mostra in barra degli strumenti</translation>
 <translation id="5362741141255528695">Seleziona il file della chiave privata.</translation>
@@ -3352,6 +3375,7 @@
 <translation id="5539221284352502426">La password inserita è stata rifiutata dal server. Alcune possibili cause sono: la password è troppo breve; la password deve includere numeri o simboli; la password deve essere diversa dalle password precedenti.</translation>
 <translation id="5541694225089836610">Azione disattivata dall'amministratore</translation>
 <translation id="5542132724887566711">Profilo</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> richiede l'immediato aggiornamento di questo dispositivo.</translation>
 <translation id="5542750926112347543">Cookie provenienti da <ph name="DOMAIN" /> bloccati</translation>
 <translation id="5542949973455282971">Connessione a <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Verifica dello stato in corso...</translation>
@@ -3397,6 +3421,7 @@
 <translation id="5593357315997824387">Sincronizza i miei file</translation>
 <translation id="5595152862129936745">Molto lontano</translation>
 <translation id="5595485650161345191">Modifica indirizzo</translation>
+<translation id="5595727715083333657">Il tuo contenitore non supporta il ridimensionamento. Per modificare la quantità di spazio preassegnata a Linux (beta), effettua il backup e il ripristino in un nuovo contenitore.</translation>
 <translation id="5596627076506792578">Altre opzioni</translation>
 <translation id="5600706100022181951">Il download dell'aggiornamento richiederà <ph name="UPDATE_SIZE_MB" /> MB di dati mobili. Vuoi continuare?</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -3469,6 +3494,7 @@
 <translation id="5691511426247308406">Famiglia</translation>
 <translation id="5691772641933328258">Impronta digitale non riconosciuta</translation>
 <translation id="5692183275898619210">Stampa completata</translation>
+<translation id="5692875591060376599">Il file selezionato è sconosciuto e potrebbe essere pericoloso. Inviare alla protezione avanzata di Google per la scansione?</translation>
 <translation id="569425414730375234">Sessione di navigazione in incognito corrente: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">Segnala illecito per "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="5696679855467848181">File PPD attualmente in uso: <ph name="PPD_NAME" /></translation>
@@ -3680,6 +3706,7 @@
 <translation id="5976160379964388480">Altri</translation>
 <translation id="5978277834170881274">&amp;Usa controllo ortografico di base</translation>
 <translation id="5979084224081478209">Controlla password</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{Hai riattivato 1 estensione potenzialmente dannosa}other{Hai riattivato {NUM_EXTENSIONS} estensioni potenzialmente dannose}}</translation>
 <translation id="5979421442488174909">&amp;Traduci in <ph name="LANGUAGE" /></translation>
 <translation id="5979469435153841984">Per aggiungere una pagina ai preferiti, fai clic sulla stella nella barra degli indirizzi</translation>
 <translation id="5984222099446776634">Visitati di recente</translation>
@@ -3930,6 +3957,7 @@
 <translation id="6309510305002439352">Microfono disattivato</translation>
 <translation id="6311220991371174222">Impossibile avviare Chrome perché si è verificato un errore durante l'apertura del profilo. Prova a riavviare il browser.</translation>
 <translation id="6312403991423642364">Errore di rete sconosciuto</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Il controllo di sicurezza è stato eseguito 1 giorno fa}other{Il controllo di sicurezza è stato eseguito {NUM_DAYS} giorni fa}}</translation>
 <translation id="6312638141433622592">Chiedi di mostrare gli articoli in modalità Reader, se supportata</translation>
 <translation id="6313641880021325787">ESCI DA REALTÀ VIRTUALE</translation>
 <translation id="6314819609899340042">Hai attivato le funzioni di debug su questo dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
@@ -3945,6 +3973,7 @@
 <translation id="6325191661371220117">Disattiva avvio automatico</translation>
 <translation id="6326175484149238433">Rimuovi da Chrome</translation>
 <translation id="6326855256003666642">Conteggio attività keep-alive</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> richiede l'aggiornamento di questo dispositivo prima della scadenza.</translation>
 <translation id="6327785803543103246">Rilevamento automatico proxy web</translation>
 <translation id="6333064448949140209">Il file sarà inviato a Google per il debug</translation>
 <translation id="6339668969738228384">Crea un nuovo profilo per <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -3964,7 +3993,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />reimpostare la sincronizzazione<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Benvenuto nella famiglia di <ph name="SHORT_PRODUCT_NAME" />. Questo non è un computer come gli altri.</translation>
 <translation id="6358884629796491903">Drago</translation>
-<translation id="6360719647236334056">Utilizza la tua cronologia di navigazione di Chrome per personalizzare la Ricerca, gli annunci e altri servizi Google</translation>
 <translation id="6361850914223837199">Dettagli errore:</translation>
 <translation id="6362853299801475928">Segnala un p&amp;roblema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3972,11 +4000,13 @@
 <translation id="6366190659675876144">Protezione standard</translation>
 <translation id="636850387210749493">Registrazione aziendale</translation>
 <translation id="6370021412472292592">Impossibile caricare il file manifest.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Cambia password}other{Cambia le password}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Riprova</translation>
 <translation id="6377268785556383139">1 risultato per "<ph name="SEARCH_TEXT" />"</translation>
 <translation id="6380143666419481200">Accetta e continua</translation>
 <translation id="6384275966486438344">Modifica delle impostazioni di ricerca per: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">Connettiti a Internet e riprova</translation>
 <translation id="6385543213911723544">I siti possono memorizzare e leggere i dati dei cookie</translation>
 <translation id="6386099547750337629">Se non era previsto, contatta l'assistenza.</translation>
 <translation id="6387674443318562538">Divisione in verticale</translation>
@@ -4055,6 +4085,7 @@
 <translation id="6478248366783946499">Conservare il file pericoloso?</translation>
 <translation id="6483485061007832714">Apri download</translation>
 <translation id="6483805311199035658">Apertura di <ph name="FILE" /> in corso...</translation>
+<translation id="6485092675191826776">La licenza Plugin VM è scaduta</translation>
 <translation id="6488384360522318064">Seleziona lingua</translation>
 <translation id="648927581764831596">Nessuno disponibile</translation>
 <translation id="6490471652906364588">Dispositivo USB-C (porta a destra)</translation>
@@ -4242,9 +4273,9 @@
 <translation id="6758056191028427665">Comunicaci la tua opinione sul nostro lavoro.</translation>
 <translation id="6759193508432371551">Ripristino dati di fabbrica</translation>
 <translation id="6762833852331690540">On</translation>
-<translation id="6764693078871405569">Cancella anche i dati di navigazione (<ph name="URL" />) che ti faranno uscire dall'account su <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Seleziona un'altra lingua…</translation>
 <translation id="6767639283522617719">Impossibile aggiungere al dominio. Assicurati che le impostazioni dell'unità organizzativa siano corrette.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> ti consiglia di aggiornare questo dispositivo.</translation>
 <translation id="6769712124046837540">Aggiunta della stampante...</translation>
 <translation id="6770602306803890733">Aumenta la sicurezza per te e per tutti gli utenti del Web</translation>
 <translation id="6770664076092644100">Verifica tramite NFC</translation>
@@ -4377,6 +4408,7 @@
 <translation id="6943836128787782965">Recupero HTTP non riuscito</translation>
 <translation id="6945221475159498467">Seleziona</translation>
 <translation id="694592694773692225">Reindirizzamento bloccato in questa pagina.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 password compromessa}other{{NUM_PASSWORDS} password compromesse}}</translation>
 <translation id="6949434160682548041">Password (facoltativa)</translation>
 <translation id="6950627417367801484">Ripristina le app</translation>
 <translation id="6950943362443484797">L'app verrà installata automaticamente</translation>
@@ -4461,6 +4493,7 @@
 <translation id="7053983685419859001">Blocca</translation>
 <translation id="7055152154916055070">Reindirizzamento bloccato:</translation>
 <translation id="7056526158851679338">&amp;Ispeziona dispositivi</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Il controllo di sicurezza è stato eseguito 1 minuto fa}other{Il controllo di sicurezza è stato eseguito {NUM_MINS} minuti fa}}</translation>
 <translation id="7057767408836081338">Impossibile recuperare i dati dell'app, tentativo di esecuzione dell'app comunque in corso…</translation>
 <translation id="7059858479264779982">Imposta avvio automatico</translation>
 <translation id="7059893117020417984">Per navigare in privato, fai clic sul menu con un'icona con tre puntini per aprire una finestra di navigazione in incognito</translation>
@@ -4704,6 +4737,7 @@
 <translation id="7371006317849674875">Ora di inizio</translation>
 <translation id="7371490947952970241">Puoi disabilitare la geolocalizzazione disattivando l'impostazione Posizione principale su questo dispositivo. Puoi anche disattivare l'uso di reti Wi-Fi e mobili e di sensori per la geolocalizzazione nelle impostazioni di geolocalizzazione.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Aggiorna il dispositivo entro un'ora}other{Aggiorna il dispositivo entro # ore}}</translation>
 <translation id="7376553024552204454">Evidenzia il puntatore del mouse durante lo spostamento</translation>
 <translation id="7377451353532943397">Continua a impedire l'accesso ai sensori</translation>
 <translation id="73786666777299047">Apri Chrome Web Store</translation>
@@ -4721,6 +4755,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">Configura la connessione sul tuo <ph name="PHONE_NAME" /></translation>
 <translation id="7401778920660465883">Elimina questo messaggio</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Il controllo di sicurezza è stato eseguito 1 ora fa}other{Il controllo di sicurezza è stato eseguito {NUM_HOURS} ore fa}}</translation>
 <translation id="740624631517654988">Popup bloccato</translation>
 <translation id="7407430846095439694">Importa e associa</translation>
 <translation id="7407504355934009739">La maggior parte degli utenti blocca le notifiche da questo sito</translation>
@@ -4751,6 +4786,7 @@
 <translation id="7441830548568730290">Altri utenti</translation>
 <translation id="7442465037756169001">L'hardware Hangouts Meet è pronto per la configurazione.</translation>
 <translation id="744341768939279100">Crea un nuovo profilo</translation>
+<translation id="744366959743242014">Il caricamento dei dati potrebbe richiedere alcuni secondi.</translation>
 <translation id="7443806024147773267">Puoi avere a disposizione le tue password ogni volta che accedi al tuo Account Google</translation>
 <translation id="7444983668544353857">Disabilita <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Installare automaticamente le app</translation>
@@ -4786,6 +4822,7 @@
 <translation id="7489761397368794366">Chiama dal tuo dispositivo</translation>
 <translation id="749028671485790643">Persona <ph name="VALUE" /></translation>
 <translation id="7490813197707563893">Indirizzo MAC</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 cookie}other{{NUM_COOKIES} cookie}}</translation>
 <translation id="7493386493263658176">L'estensione <ph name="EXTENSION_NAME" /> potrebbe memorizzare tutto il testo digitato, inclusi dati personali quali password e numeri di carte di credito. Vuoi utilizzare l'estensione?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Hai dimenticato la vecchia password?</translation>
@@ -4806,10 +4843,14 @@
 <translation id="7513029293694390567">Accedi automaticamente ai siti web utilizzando credenziali memorizzate. Se la funzione non è attiva, ti viene chiesta la conferma prima di ogni accesso ai siti web.</translation>
 <translation id="7514239104543605883">Copia sul tuo dispositivo</translation>
 <translation id="7514365320538308">Scarica</translation>
+<translation id="751523031290522286"><ph name="APP_NAME" /> è stata bloccata dal tuo amministratore. Chiedi all'amministratore l'autorizzazione per poter usare l'app.</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> in sospeso</translation>
+<translation id="7517063221058203587">{0,plural, =1{Aggiorna il dispositivo entro 1 minuto}other{Aggiorna il dispositivo entro # minuti}}</translation>
 <translation id="7520766081042531487">Portale in modalità di navigazione in incognito: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">Di' "Ok Google"</translation>
 <translation id="7525067979554623046">Crea</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 altro}other{Altri {NUM_DOWNLOADS}}}</translation>
 <translation id="7529411698175791732">Controlla la connessione a Internet. Se il problema persiste, prova a uscire e ad accedere di nuovo.</translation>
 <translation id="7530016656428373557">Velocità di esaurimento in watt</translation>
 <translation id="7531779363494549572">Seleziona Impostazioni &gt; App e notifiche &gt; Notifiche.</translation>
@@ -4978,6 +5019,7 @@
 <translation id="7765158879357617694">Sposta</translation>
 <translation id="7766807826975222231">Fai un tour</translation>
 <translation id="7766838926148951335">Accetta le autorizzazioni</translation>
+<translation id="7768770796815395237">Cambia</translation>
 <translation id="7769672763586021400">ID modello</translation>
 <translation id="7770651108375708429">Disconnettiti dal Wi-Fi</translation>
 <translation id="7771452384635174008">Layout</translation>
@@ -5413,6 +5455,7 @@
 <translation id="8286963743045814739">Puoi navigare in privato usando una finestra di navigazione in incognito</translation>
 <translation id="8287902281644548111">Cerca per chiamata API/URL</translation>
 <translation id="8288032458496410887">Disinstallare <ph name="APP" />…</translation>
+<translation id="8289128870594824098">Dimensione disco</translation>
 <translation id="8291967909914612644">Paese del provider principale</translation>
 <translation id="8294431847097064396">Origine</translation>
 <translation id="8297006494302853456">Debole</translation>
@@ -5625,6 +5668,7 @@
 <translation id="8608618451198398104">Aggiungi una richiesta di Kerberos</translation>
 <translation id="8609465669617005112">Sposta su</translation>
 <translation id="8610103157987623234">Formato errato, riprova</translation>
+<translation id="8612935480510351790">Il file <ph name="FILE_NAME" /> potrebbe essere pericoloso. Inviare alla protezione avanzata di Google per la scansione?</translation>
 <translation id="8613164732773110792">Solo caratteri minuscoli, numeri, trattini bassi o trattini</translation>
 <translation id="8615618338313291042">Applicazione in incognito: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Ombreggiatura</translation>
@@ -5652,6 +5696,7 @@
 <translation id="8641606876632989680">Chrome ti invierà una notifica quando esegui l'accesso con una password compromessa</translation>
 <translation id="8642900771896232685">2 secondi</translation>
 <translation id="8642947597466641025">Ingrandisci le dimensioni del testo</translation>
+<translation id="8643443571868262066">Il file <ph name="FILE_NAME" /> potrebbe essere pericoloso. Inviare alla protezione avanzata di Google per la scansione?</translation>
 <translation id="8644655801811752511">Impossibile reimpostare questo token di sicurezza. Prova a reimpostare il token subito dopo averlo inserito.</translation>
 <translation id="8645354835496065562">Continua a consentire l'accesso ai sensori</translation>
 <translation id="8645920082661222035">Prevede eventi pericolosi e ti avvisa prima che si verifichino</translation>
@@ -6072,6 +6117,7 @@
 <translation id="9169931577761441333">Aggiungi <ph name="APP_NAME" /> alla schermata Home</translation>
 <translation id="9170848237812810038">&amp;Annulla</translation>
 <translation id="9170884462774788842">Un altro programma sul computer ha aggiunto un tema che potrebbe modificare il funzionamento di Chrome.</translation>
+<translation id="917350715406657904">Hai raggiunto il tempo massimo impostato dal genitore per <ph name="APP_NAME" />. Domani potrai utilizzare l'app per <ph name="TIME_LIMIT" />.</translation>
 <translation id="9173995187295789444">Ricerca di dispositivi Bluetooth...</translation>
 <translation id="9174401638287877180">Invia dati diagnostici e sull'utilizzo. Contribuisci a migliorare l'esperienza Android di tuo figlio tramite l'invio automatico a Google di dati diagnostici e sull'utilizzo delle app e del dispositivo. Non verranno utilizzati per identificare tuo figlio e contribuiranno alla stabilità delle app e del sistema, nonché ad altri miglioramenti. Alcuni dati aggregati saranno utili anche alle app e ai partner di Google, come ad esempio agli sviluppatori Android. Se l'impostazione Attività web e app aggiuntiva è attiva per tuo figlio, questi dati potrebbero essere salvati nel suo Account Google.</translation>
 <translation id="917510707618656279">Chiedi conferma quando un sito vuole accedere ai dispositivi Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index f0e97c94..73826fc 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">קרא ושנה את כל הנתונים שלך באתר הנוכחי בעת הקריאה</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> רוצה לאפס את ההגדרות שלך.</translation>
 <translation id="1243314992276662751">העלה</translation>
-<translation id="1243398753772016127">אתרים לא יכולים להשתמש בפעילות הגלישה שלך באתרים אחרים כדי להתאים אישית מודעות</translation>
 <translation id="1244265436519979884">‏מתבצע כעת שחזור של Linux</translation>
 <translation id="1244303850296295656">שגיאת תוסף</translation>
 <translation id="1246905108078336582">להסיר את ההצעה מהלוח?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">מופעל - הגדרות מותאמות אישית</translation>
 <translation id="1489664337021920575">יש לבחור אפשרות אחרת</translation>
 <translation id="1493892686965953381">ממתין ל-<ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">‏אפשר לסמן את התיבה הזו ואז יוסרו גם נתוני הגלישה (<ph name="URL" />), מה שעשוי לנתק אותך מ-Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> מכשירים זמינים נוספים.</translation>
 <translation id="1495677929897281669">חזרה לכרטיסייה</translation>
 <translation id="1499271269825557605">אם לא מזהים תוסף כלשהו או אם הדפדפן לא פועל בצורה תקינה, אפשר להשבית את התוספים או להתאים אותם אישית מכאן.</translation>
@@ -736,7 +734,7 @@
 <translation id="1990512225220753005">לא להציג קיצורי דרך בדף הזה</translation>
 <translation id="1992397118740194946">לא מוגדר</translation>
 <translation id="1994173015038366702">כתובת אתר</translation>
-<translation id="1995916364271252349">בדף הזה אפשר לשלוט על המידע שאתרים יכולים להשתמש בו ולהציג אותו (מיקום, מצלמה, חלונות נפתחים ועוד)</translation>
+<translation id="1995916364271252349">בדף הזה אפשר לשלוט על המידע שאתרים יכולים להשתמש בו ולהציג אותו (מיקום, מצלמה, חלונות קופצים ועוד)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> רוצה לאחסן כמות גדולה של נתונים במחשב המקומי שלך באופן קבוע</translation>
 <translation id="1997616988432401742">האישורים שלך</translation>
 <translation id="1999115740519098545">בעת ההפעלה</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">סמל זה יוצג כאשר התוסף יכול לפעול בדף הנוכחי. השתמש בתוסף זה על ידי לחיצה על הסמל או על ידי הקשה על <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">‏הגדרה כ-Chromebox לניהול פגישות</translation>
 <translation id="2580889980133367162">תמיד אפשר ל-<ph name="HOST" /> להוריד קבצים מרובים</translation>
-<translation id="2580924999637585241">סך הכל: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ארוכה</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (פלטפורמה <ph name="PLATFORM_VERSION" />‏) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">‏לא ניתן לקבל כרטיס Kerberos. עליך לנסות שוב, או ליצור קשר עם מנהל המכשיר בארגון. (קוד שגיאה <ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">חלונות קופצים חסומים</translation>
 <translation id="480990236307250886">פתח את דף הבית</translation>
 <translation id="4811503964269049987">קיבוץ הכרטיסיות שנבחרו</translation>
-<translation id="4811818760963189951">האפשרות לא זמינה כי השבתת את סנכרון ההיסטוריה</translation>
 <translation id="4813136279048157860">התמונות שלי</translation>
 <translation id="4813512666221746211">שגיאת רשת</translation>
 <translation id="4814378367953456825">יש לתת שם לטביעת האצבע הזו</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">הגדרות תוכן נוספות</translation>
 <translation id="5042282098504489593">‏פתיחת ההגדרות כדי לחבר את <ph name="USB_DEVICE_NAME" /> אל Linux</translation>
 <translation id="5043913660911154449">‏לחלופין, אפשר לציין את ה-PPD של המדפסת <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">האפשרות לא זמינה כי הצפנת את נתוני הסנכרון באמצעות ביטוי סיסמה</translation>
 <translation id="5045550434625856497">סיסמה שגויה</translation>
 <translation id="504561833207953641">פותח בסשן קיים של הדפדפן.</translation>
 <translation id="5047421709274785093">מניעת שימוש של אתרים בחיישני תנועה ואור</translation>
@@ -3962,7 +3957,6 @@
 <translation id="63566973648609420">‏רק מי שיודע את ביטוי הסיסמה יכול לקרוא את הנתונים המוצפנים. ביטוי הסיסמה לא נשלח אל Google והיא אינה מאחסנת אותו. אם תשכח את ביטוי הסיסמה או אם תרצה לשנות את ההגדרה הזו, יהיה עליך <ph name="BEGIN_LINK" />לאפס את הסנכרון<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">ברוכים הבאים אל משפחת <ph name="SHORT_PRODUCT_NAME" />. לא מדובר במחשב רגיל.</translation>
 <translation id="6358884629796491903">דרקון</translation>
-<translation id="6360719647236334056">‏התאמה אישית של חיפוש Google, מודעות ושירותי Google אחרים באמצעות היסטוריית הגלישה של Chrome</translation>
 <translation id="6361850914223837199">פרטי השגיאה:</translation>
 <translation id="6362853299801475928">&amp;דווח על בעיה...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4240,7 +4234,6 @@
 <translation id="6758056191028427665">נשמח לקבל ממך משוב.</translation>
 <translation id="6759193508432371551">איפוס להגדרות היצרן</translation>
 <translation id="6762833852331690540">מופעל</translation>
-<translation id="6764693078871405569">אפשר לסמן את התיבה הזו ואז יוסרו גם נתוני הגלישה (<ph name="URL" />), מה שיגרום ליציאה מ-<ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">בחירת שפה אחרת...</translation>
 <translation id="6767639283522617719">לא ניתן להצטרף לדומיין. יש לוודא שההגדרות של היחידה הארגונית נכונות.</translation>
 <translation id="6769712124046837540">הוספת מדפסת...</translation>
@@ -6026,7 +6019,7 @@
 <translation id="9101691533782776290">הפעל את היישום</translation>
 <translation id="9102610709270966160">הפעל תוסף</translation>
 <translation id="9103868373786083162">לחץ כדי לחזור אחורה, תפריט הקשר כדי לראות היסטוריה</translation>
-<translation id="9108808586816295166">‏ייתכן שה-DNS המאובטח לא יהיה זמין כל העת</translation>
+<translation id="9108808586816295166">‏ה-DNS המאובטח לא יהיה בהכרח זמין תמיד</translation>
 <translation id="9109122242323516435">כדי לפנות שטח, מחק קבצים מאחסון המכשיר.</translation>
 <translation id="9109283579179481106">חיבור לרשת סלולרית</translation>
 <translation id="9111102763498581341">בטל נעילה</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 90ddcfc..3eda600d 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">呼び出しの時点でアクセスしているウェブサイト上の全データの読み取りと変更</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> が設定のリセットを求めています。</translation>
 <translation id="1243314992276662751">アップロード</translation>
-<translation id="1243398753772016127">サイトはあなたが別のサイトで閲覧した内容に基づいて広告をカスタマイズできなくなります</translation>
 <translation id="1244265436519979884">現在、Linux の復元が進行中です</translation>
 <translation id="1244303850296295656">拡張機能のエラー</translation>
 <translation id="1246905108078336582">クリップボードから候補を削除してもよろしいですか?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">オン - カスタム設定</translation>
 <translation id="1489664337021920575">別の方法を選択</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> を待機しています...</translation>
-<translation id="1494438840282430403">閲覧履歴(<ph name="URL" />)も削除します。これにより、Google.com からログアウトします。</translation>
 <translation id="1495486559005647033">利用可能なデバイスが <ph name="NUM_PRINTERS" /> 個あります。</translation>
 <translation id="1495677929897281669">タブに戻る</translation>
 <translation id="1499271269825557605">拡張機能が認識されないかブラウザが想定どおり動作しない場合は、ここで拡張機能を無効にするかカスタマイズできます。</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">このアイコンは、表示中のページで拡張機能が使用できる場合に表示されます。この拡張機能を使用するには、アイコンをクリックするか、<ph name="EXTENSION_SHORTCUT" /> を押します。</translation>
 <translation id="257779572837908839">Chromebox for meetings として設定</translation>
 <translation id="2580889980133367162">複数のファイルをダウンロードすることを <ph name="HOST" /> に常に許可する</translation>
-<translation id="2580924999637585241">印刷総数: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">長い</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" />(プラットフォーム <ph name="PLATFORM_VERSION" />)<ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos チケットを取得できませんでした。もう一度お試しいただくか、組織のデバイス管理者にお問い合わせください。(エラーコード <ph name="ERROR_CODE" />)。</translation>
@@ -1714,7 +1711,7 @@
 <translation id="3293644607209440645">このページを送信</translation>
 <translation id="32939749466444286">Linux コンテナを起動できませんでした。もう一度お試しください。</translation>
 <translation id="3294437725009624529">ゲスト</translation>
-<translation id="3296193636298964625">パスワードの数が多すぎるため、Chrome で一部のパスワードを確認できませんでした。</translation>
+<translation id="3296193636298964625">保存されているパスワードの数が多すぎるため、Chrome で一部のパスワードを確認できませんでした。</translation>
 <translation id="329703603001918157">ショートカットの編集はできません</translation>
 <translation id="329838636886466101">修復</translation>
 <translation id="3298789223962368867">入力された URL が無効です。</translation>
@@ -2810,7 +2807,6 @@
 <translation id="4808667324955055115">ポップアップがブロックされました:</translation>
 <translation id="480990236307250886">ホームページを開く</translation>
 <translation id="4811503964269049987">選択したタブをグループ化する</translation>
-<translation id="4811818760963189951">履歴の同期を無効にしたため、オフになりました</translation>
 <translation id="4813136279048157860">自分の画像</translation>
 <translation id="4813512666221746211">ネットワーク エラー</translation>
 <translation id="4814378367953456825">このフィンガープリントの名前を入力してください</translation>
@@ -2979,7 +2975,6 @@
 <translation id="5040823038948176460">その他のコンテンツの設定</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> を Linux に接続する設定を開きます</translation>
 <translation id="5043913660911154449">または、プリンタの PPD を指定してください(<ph name="LINK_BEGIN" />詳細<ph name="LINK_END" />)</translation>
-<translation id="5044314273978194362">パスフレーズを設定して同期データを暗号化したため、オフになりました</translation>
 <translation id="5045550434625856497">パスワードが正しくありません</translation>
 <translation id="504561833207953641">既存のブラウザ セッションで開いています。</translation>
 <translation id="5047421709274785093">サイトによるモーション センサーと光センサーの使用をブロックする</translation>
@@ -3955,7 +3950,6 @@
 <translation id="63566973648609420">パスフレーズを知っているユーザーだけが暗号化データを読み取ることができます。パスフレーズが Google に送信されたり Google で保存されたりすることはありません。パスフレーズを忘れた場合や、この設定を変更する場合は、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />する必要があります。</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> ファミリーへようこそ。これは新しいタイプのパソコンです。</translation>
 <translation id="6358884629796491903">ドラゴン</translation>
-<translation id="6360719647236334056">Chrome の閲覧履歴を使用して、検索結果、広告、その他の Google サービスをカスタマイズする</translation>
 <translation id="6361850914223837199">エラーの詳細:</translation>
 <translation id="6362853299801475928">問題の報告(&amp;R)...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4233,7 +4227,6 @@
 <translation id="6758056191028427665">アンケートにご協力ください。</translation>
 <translation id="6759193508432371551">初期状態へのリセット</translation>
 <translation id="6762833852331690540">オン</translation>
-<translation id="6764693078871405569">閲覧履歴(<ph name="URL" />)も削除します。これにより、<ph name="DOMAIN" /> からログアウトします。</translation>
 <translation id="6767566652486411142">別の言語を選択...</translation>
 <translation id="6767639283522617719">ドメインを追加できません。組織部門の設定が正しいことをご確認ください。</translation>
 <translation id="6769712124046837540">プリンタの追加...</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb
index 8be0e0e..d2e263c 100644
--- a/chrome/app/resources/generated_resources_ka.xtb
+++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">გამოძახებისას მიმდინარე ვებსაიტზე არსებული თქვენი ყველა მონაცემების წაკითხვა და შეცვლა</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />-ს თქვენი პარამეტრების გადაყენება სურს.</translation>
 <translation id="1243314992276662751">ატვირთვა</translation>
-<translation id="1243398753772016127">ვებსაიტები ვერ გამოიყენებს თქვენი დათვალიერების აქტივობას სხვადასხვა ვებსაიტზე რეკლამის პერსონალიზებისთვის</translation>
 <translation id="1244265436519979884">ამჟამად მიმდინარეობს Linux აღდგენა</translation>
 <translation id="1244303850296295656">გაფართოების შეცდომა</translation>
 <translation id="1246905108078336582">გსურთ შემოთავაზების გაცვლის ბუფერიდან ამოშლა?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">ჩართულია — მორგებული პარამეტრები</translation>
 <translation id="1489664337021920575">სხვა ვარიანტის არჩევა</translation>
 <translation id="1493892686965953381">ელოდება <ph name="LOAD_STATE_PARAMETER" />-ს…</translation>
-<translation id="1494438840282430403">დათვალიერების მონაცემების (<ph name="URL" />) გასუფთავებაც (შესაძლოა, გამოხვიდეთ Google.com-დან).</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> სხვა ხელმისაწვდომი მოწყობილობა.</translation>
 <translation id="1495677929897281669">ჩანართზე დაბრუნება</translation>
 <translation id="1499271269825557605">თუ გაფართოებას ვერ ცნობთ ან ბრაუზერი მოლოდინისამებრ არ მუშაობს, აქ შეგიძლიათ გამორთოთ ან მოირგოთ გაფართოებები.</translation>
@@ -521,7 +519,7 @@
 <translation id="1700079447639026019">საიტები, რომლებსაც არასოდეს შეუძლია ქუქი-ჩანაწერების გამოყენება</translation>
 <translation id="1701062906490865540">ამ მომხმარებლის ამოშლა</translation>
 <translation id="1703331064825191675">ნუღარ ინერვიულებთ თქვენს პაროლებზე</translation>
-<translation id="1704970325597567340">უსაფრთხოების შემოწმება შესრულდა <ph name="DATE" />-ს</translation>
+<translation id="1704970325597567340">უსაფრთხოების შემოწმება შესრულდა <ph name="DATE" />-ში</translation>
 <translation id="1706586824377653884">დამატებულია თქვენი ადმინისტრატორის მიერ</translation>
 <translation id="1706625117072057435">მასშტაბირების დონეები</translation>
 <translation id="1708338024780164500">(არააქტიური)</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">ეს ხატულა ხილული იქნება, როდესაც გაფართოება შეძლებს მიმდინარე გვერდზე მოქმედებას. გამოიყენეთ ეს გაფართოება ხატულაზე დაწკაპუნებით ან <ph name="EXTENSION_SHORTCUT" />-ზე დაჭერით.</translation>
 <translation id="257779572837908839">დაყენდეს, როგორც Chromebox შეხვედრებისთვის</translation>
 <translation id="2580889980133367162">ყოველთვის დართეთ ნება <ph name="HOST" />-ს ჩამოტვირთოს რამოდენიმე ფაილი</translation>
-<translation id="2580924999637585241">სულ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ხანგრძლივი</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (პლატფორმა <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos ბილეთის მიღება ვერ მოხერხდა. ცადეთ ხელახლა, ან დაუკავშირდით თქვენი ორგანიზაციის მოწყობილობის ადმინისტრატორს. (შეცდომის კოდი: <ph name="ERROR_CODE" />).</translation>
@@ -2818,7 +2815,6 @@
 <translation id="4808667324955055115">ამომხტარი ფანჯრები დაბლოკილია:</translation>
 <translation id="480990236307250886">გახსენით საწყისი გვერდი</translation>
 <translation id="4811503964269049987">არჩეული ჩანართის დაჯგუფება</translation>
-<translation id="4811818760963189951">გამორთულია, რადგან გათიშული გაქვთ ისტორიის სინქრონიზაცია</translation>
 <translation id="4813136279048157860">ჩემი სურათები</translation>
 <translation id="4813512666221746211">ქსელის შეცდომა</translation>
 <translation id="4814378367953456825">შეიყვანეთ თითის ამ ანაბეჭდის სახელი</translation>
@@ -2987,7 +2983,6 @@
 <translation id="5040823038948176460">კონტენტის დამატებითი პარამეტრები</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> რომ დაუკავშიროთ Linux-ს, გახსენით პარამეტრები</translation>
 <translation id="5043913660911154449">ან მიუთითეთ პრინტერის PPD. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">გამორთულია, რადგან სინქრონიზაციის მონაცემები საიდუმლო ფრაზით დაშიფრეთ</translation>
 <translation id="5045550434625856497">არასწორი პაროლი</translation>
 <translation id="504561833207953641">მიმდინარეობს ბრაუზერის არსებულ სესიაში გახსნა.</translation>
 <translation id="5047421709274785093">საიტებისთვის მოძრაობისა და განათების სენსორების გამოყენების აკრძალვა</translation>
@@ -3964,7 +3959,6 @@
 <translation id="63566973648609420">თქვენი დაშიფრული მონაცემების წაკითხვა შეუძლია მხოლოდ იმ ადამიანს, რომელმაც იცის თქვენი საიდუმლო ფრაზა. საიდუმლო ფრაზა არ იგზავნება Google-ში და არ ინახება მის მიერ. საიდუმლო ფრაზის დავიწყების ან ამ პარამეტრის შეცვლის სურვილის შემთხვევაში, <ph name="BEGIN_LINK" />სინქრონიზაციის გადაყენება<ph name="END_LINK" /> მოგიწევთ.</translation>
 <translation id="6357619544108132570">მოგესალმებათ <ph name="SHORT_PRODUCT_NAME" />-ის გუნდი. ეს არ არის ჩვეულებრივი კომპიუტერი.</translation>
 <translation id="6358884629796491903">დრაკონი</translation>
-<translation id="6360719647236334056">Chrome-ში თქვენი დათვალიერების ისტორიის გამოყენება Search-ის, რეკლამისა და Google-ის სხვა სერვისების თქვენზე მოსარგებად</translation>
 <translation id="6361850914223837199">შეცდომის დეტალები:</translation>
 <translation id="6362853299801475928">&amp;მოხსენება პრობლემის შესახებ…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4242,7 +4236,6 @@
 <translation id="6758056191028427665">შეგვატყობინეთ, როგორ ვმუშაობთ.</translation>
 <translation id="6759193508432371551">ქარხნული პარამეტრების დაბრუნება</translation>
 <translation id="6762833852331690540">ჩართული</translation>
-<translation id="6764693078871405569">დათვალიერების მონაცემების (<ph name="URL" />) გასუფთავებაც (შესაძლოა, გამოხვიდეთ <ph name="DOMAIN" />-დან).</translation>
 <translation id="6767566652486411142">სხვა ენის არჩევა...</translation>
 <translation id="6767639283522617719">დომენში გაწევრიანება ვერ ხერხდება. დარწმუნდით, რომ ორგანიზაციული ერთეულის პარამეტრები სწორია.</translation>
 <translation id="6769712124046837540">პრინტერის დამატება…</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index 21b9a287..896447c3 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Шақырылған кезде ағымдағы вебсайттағы барлық деректерді оқу және өзгерту</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> параметрлеріңізді бастапқы қалпына келтіргісі келеді.</translation>
 <translation id="1243314992276662751">Жүктеп салу</translation>
-<translation id="1243398753772016127">Сайттар жарнамаларды жекелендіру үшін браузерді қолдану мәліметіңізді пайдалана алмайды.</translation>
 <translation id="1244265436519979884">Linux жүйесі қалпына келтірілуде.</translation>
 <translation id="1244303850296295656">Кеңейтім қатесі</translation>
 <translation id="1246905108078336582">Ұсыныс буферден өшірілсін бе?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Қосу – пайдаланушылық параметрлер</translation>
 <translation id="1489664337021920575">Басқа опция қолданып көріңіз</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> күту…</translation>
-<translation id="1494438840282430403">Браузерді пайдалану деректерін де (<ph name="URL" />) өшіріңіз (Google.com сайтында есептік жазбаңыздан шығарылуыңыз мүмкін).</translation>
 <translation id="1495486559005647033">Басқа <ph name="NUM_PRINTERS" /> қолжетімді құрылғы бар.</translation>
 <translation id="1495677929897281669">Қойындыға оралу</translation>
 <translation id="1499271269825557605">Егер кеңейтімді анықтай алмасаңыз немесе браузер дұрыс жұмыс істемей тұрса, кеңейтімдерді осы жерден өшіруіңізге немесе реттеуіңізге болады.</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Бұл бетбелгі кеңейтім ағымдағы бетте әрекет еткенде ғана көрінеді. Бұл кеңейтімді белгішені басу арқылы немесе <ph name="EXTENSION_SHORTCUT" /> басу арқылы пайдаланыңыз.</translation>
 <translation id="257779572837908839">Кездесулерге арналған Chromebox құрылғысы ретінде реттеу</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> хостына әрқашан бірнеше файлды жүктеуге рұқсат беру</translation>
-<translation id="2580924999637585241">Барлығы: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Ұзақ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (<ph name="PLATFORM_VERSION" /> платформасы) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos билетін алу мүмкін болмады. Қайталап көріңіз немесе ұйымыңыздың құрылғы әкімшісіне хабарласыңыз. (Қате коды: <ph name="ERROR_CODE" />)</translation>
@@ -1714,7 +1711,7 @@
 <translation id="3293644607209440645">Осы бетті жіберу</translation>
 <translation id="32939749466444286">Linux контейнері іске қосылмады. Қайталап көріңіз.</translation>
 <translation id="3294437725009624529">Қонақ</translation>
-<translation id="3296193636298964625">Құпия сөз көп болғандықтан Chrome сіздің барлық құпия сөзіңізді тексере алмайды.</translation>
+<translation id="3296193636298964625">Құпия сөз көп болғандықтан, Chrome сіздің барлық құпия сөзіңізді тексере алмайды.</translation>
 <translation id="329703603001918157">Таңбаша өзгертілмейді</translation>
 <translation id="329838636886466101">Жөндеу</translation>
 <translation id="3298789223962368867">Жарамсыз URL енгізілді.</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">Қалқымалы терезелерге тыйым салынған</translation>
 <translation id="480990236307250886">Негізгі бетті ашу</translation>
 <translation id="4811503964269049987">Таңдалған қойындыны жаңа топқа енгізу</translation>
-<translation id="4811818760963189951">Өшірулі, себебі тарихты синхрондау ажыратылған.</translation>
 <translation id="4813136279048157860">Суреттерім</translation>
 <translation id="4813512666221746211">Желі қатесі</translation>
 <translation id="4814378367953456825">Осы саусақ ізінің атауын енгізіңіз.</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Қосымша мазмұн параметрлері</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> құрылғысын Linux жүйесіне жалғау үшін "Параметрлер" бөлімін ашыңыз.</translation>
 <translation id="5043913660911154449">Немесе принтер үшін PPD файлын көрсетіңіз <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Өшірулі, себебі синхрондалатын деректерді құпия фразамен шифрладыңыз.</translation>
 <translation id="5045550434625856497">Құпия сөз дұрыс емес</translation>
 <translation id="504561833207953641">Бұрыннан бар браузер сеансында ашылуда.</translation>
 <translation id="5047421709274785093">Сайттардың қозғалыс және жарық датчиктерін пайдалануына тыйым салу</translation>
@@ -3491,7 +3486,7 @@
 <translation id="5722930212736070253">Қап! Zip Archiver жұмысында қате шықты.</translation>
 <translation id="572328651809341494">Соңғы қойындылар</translation>
 <translation id="5723508132121499792">Фонда орындалып жатқан қолданбалар жоқ</translation>
-<translation id="5723967018671998714">Үшінші тараптың cookie файлдары Инкогнито режимінде бөгелген.</translation>
+<translation id="5723967018671998714">Үшінші тараптың cookie файлдары инкогнито режимінде бөгелген.</translation>
 <translation id="5727728807527375859">Кеңейтімдер, қолданбалар және тақырыптар компьютеріңізді зақымдауы мүмкін. Жалғастыру қажет пе?</translation>
 <translation id="5729712731028706266">&amp;Көру</translation>
 <translation id="5732392974455271431">Ата-анаңыз оны сіз үшін бөгеуден шығара алады</translation>
@@ -3962,7 +3957,6 @@
 <translation id="63566973648609420">Тек құпия фразаны білетін адам ғана шифрланған деректерді оқи алады. Құпия фраза Google қызметіне жіберілмейді және онда сақталмайды. Құпия фразаны ұмытып қалған жағдайда немесе бұл параметрді өзгерткіңіз келгенде, <ph name="BEGIN_LINK" />синхрондауды бастапқы күйіне қайтару<ph name="END_LINK" /> қажет болады.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> өнімдер тобына қош келдіңіз. Бұл қарапайым компьютер емес.</translation>
 <translation id="6358884629796491903">Айдаһар</translation>
-<translation id="6360719647236334056">Search, жарнамалар және басқа да Google қызметтерін жеке қажеттіліктерге бейімдеу үшін Chrome браузерін қолдану тарихын пайдаланыңыз.</translation>
 <translation id="6361850914223837199">Қате мәліметтері:</translation>
 <translation id="6362853299801475928">&amp;Мәселе туралы хабарлау…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4240,7 +4234,6 @@
 <translation id="6758056191028427665">Қал-жағдайыңызды айтып беріңіз.</translation>
 <translation id="6759193508432371551">Зауыттық параметрлерге қайта орнату</translation>
 <translation id="6762833852331690540">Қосулы</translation>
-<translation id="6764693078871405569">Браузерді пайдалану деректерін де (<ph name="URL" />) өшіріңіз (<ph name="DOMAIN" /> сайтында есептік жазбаңыздан шығарыласыз).</translation>
 <translation id="6767566652486411142">Басқа тіл таңдау...</translation>
 <translation id="6767639283522617719">Құрылғыны доменге қосу мүмкін емес. Бұл ұйымдық бірлік үшін дұрыс параметрлер орнатылғанын тексеріңіз.</translation>
 <translation id="6769712124046837540">Принтер қосылуда…</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index cea32da0..e417b61 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">អាន និងផ្លាស់ប្តូរទិន្នន័យទាំងអស់របស់អ្នកនៅលើគេហទំព័របច្ចុប្បន្ន នៅពេលដែលវាត្រូវបានប្រើប្រាស់</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ចង់កំណត់ការកំណត់របស់អ្នកឡើងវិញ</translation>
 <translation id="1243314992276662751">ទាញឡើង</translation>
-<translation id="1243398753772016127">គេហទំព័រ​មិនអាចប្រើ​សកម្មភាព​រុករក​តាមអ៊ីនធឺណិត​របស់អ្នក​នៅលើ​គេហទំព័រ​ផ្សេងៗគ្នា ដើម្បីកំណត់​ការផ្សាយ​ពាណិជ្ជកម្ម​ឱ្យ​ស្របតាម​បុគ្គលបានទេ</translation>
 <translation id="1244265436519979884">បច្ចុប្បន្ននេះ ការស្ដារ Linux កំពុង​ដំណើរការ</translation>
 <translation id="1244303850296295656">កំហុសឆ្គងកម្មវិធីបន្ថែម</translation>
 <translation id="1246905108078336582">លុប​ការណែនាំ​ចេញពី​ឃ្លីបបត?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">បើក - ការកំណត់ផ្ទាល់ខ្លួន</translation>
 <translation id="1489664337021920575">ជ្រើសរើស​ជម្រើស​ផ្សេងទៀត</translation>
 <translation id="1493892686965953381">កំពុងរង់ចាំ <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">សម្អាត​ទិន្នន័យ​រុករក (<ph name="URL" />) ដែលអាច​នាំអ្នក​ចេញពី Google.com ផងដែរ។</translation>
 <translation id="1495486559005647033">មាន <ph name="NUM_PRINTERS" /> ឧបករណ៍ទៀត។</translation>
 <translation id="1495677929897281669">ត្រឡប់ទៅ​ផ្ទាំងវិញ</translation>
 <translation id="1499271269825557605">ប្រសិនបើ​អ្នក​មិន​ស្គាល់​កម្មវិធី​បន្ថែម ឬ​ប្រសិនបើ​កម្មវិធី​រុករក​តាមអ៊ីនធឺណិត​របស់អ្នក​មិន​ដំណើរការ​ដូច​ការរំពឹងទុក​ទេ អ្នក​អាច​បិទ ឬ​ប្ដូរ​កម្មវិធី​បន្ថែម​តាមបំណង​នៅទីនេះ​។</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">រូបតំណាងនេះនឹងអាចមើលឃើញ នៅពេលកម្មវិធីបន្ថែមអាចធ្វើសកម្មភាពនៅលើទំព័របច្ចុប្បន្ន។ ប្រើកម្មវិធីបន្ថែមនេះដោយការចុចនៅលើរូបតំណាងនេះ ដោយការចុច <ph name="EXTENSION_SHORTCUT" />។</translation>
 <translation id="257779572837908839">រៀបចំជា Chromebox សម្រាប់ការប្រជុំ</translation>
 <translation id="2580889980133367162">អនុញ្ញាតឲ្យ <ph name="HOST" /> ទាញយកឯកសារច្រើនជានិច្ច</translation>
-<translation id="2580924999637585241">សរុប៖ <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">វែង</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (អង្គប្រតិបត្តិការ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">មិនអាច​យក​សំបុត្រ Kerberos បានទេ។ សូមព្យាយាម​ម្ដងទៀត ឬទាក់ទង​អ្នកគ្រប់គ្រង​ឧបករណ៍​របស់​ស្ថាប័ន​អ្នក។ (លេខកូដ​មានបញ្ហា <ph name="ERROR_CODE" />)។</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">បានទប់ស្កាត់​ផ្ទាំងផុស៖</translation>
 <translation id="480990236307250886">បើកទំព័រដើម</translation>
 <translation id="4811503964269049987">បញ្ចូលផ្ទាំង​ដែលបានជ្រើសរើស​ទៅក្នុងក្រុម</translation>
-<translation id="4811818760963189951">បានបិទ​ ដោយសារអ្នកបានបិទ​សមកាលកម្ម​ប្រវត្តិ</translation>
 <translation id="4813136279048157860">រូបភាព​របស់ខ្ញុំ</translation>
 <translation id="4813512666221746211">កំហុសឆ្គងបណ្តាញ</translation>
 <translation id="4814378367953456825">បញ្ចូល​ឈ្មោះ​សម្រាប់​ស្នាមម្រាមដៃនេះ</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">ការកំណត់​ខ្លឹមសារ​បន្ថែម</translation>
 <translation id="5042282098504489593">បើក​ការកំណត់ ដើម្បី​ភ្ជាប់ <ph name="USB_DEVICE_NAME" /> ទៅ Linux</translation>
 <translation id="5043913660911154449">ឬបញ្ជាក់ PPD ម៉ាស៊ីន​បោះពុម្ព​របស់អ្នក <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">បានបិទ ដោយសារអ្នកបានអ៊ីនគ្រីប​ទិន្នន័យសមកាលកម្មរបស់អ្នកដោយប្រើឃ្លា​សម្ងាត់</translation>
 <translation id="5045550434625856497">ពាក្យសម្ងាត់មិនត្រឹមត្រូវ</translation>
 <translation id="504561833207953641">កំពុង​បើក​នៅក្នុង​រយៈពេលចូលប្រើកម្មវិធីរុករកដែលមានស្រាប់។</translation>
 <translation id="5047421709274785093">ទប់ស្កាត់​ទំព័រ​មិនឱ្យប្រើ​ឧបករណ៍​ចាប់សញ្ញាពន្លឺ​ និងចលនា</translation>
@@ -3143,7 +3138,7 @@
 <translation id="5260508466980570042">សូមទោស អ៊ីមែល ឫ ពាក្យសម្ងាត់របស់អ្នកមិនអាចផ្ទៀងផ្ទាត់បានទេ។ សូមព្យាយាមម្តងទៀត។</translation>
 <translation id="5261683757250193089">បើក​នៅ​ក្នុង Web Store</translation>
 <translation id="5262178194499261222">លុប​ពាក្យ​សម្ងាត់</translation>
-<translation id="5263468185123738872">សូមចាប់ផ្ដើម Plugin VM ដើម្បីដំឡើងប្រព័ន្ធ​ប្រតិបត្តិការសម្រាប់ភ្ញៀវ។</translation>
+<translation id="5263468185123738872">សូមចាប់ផ្ដើម Plugin VM ដើម្បីដំឡើងប្រព័ន្ធ​ប្រតិបត្តិការភ្ញៀវ។</translation>
 <translation id="5264148714798105376">វាអាច​ចំណាយ​ពេល​បន្តិច។</translation>
 <translation id="5264252276333215551">សូមភ្ជាប់ទៅអ៊ីនធឺណិតដើម្បីបើកដំណើរការកម្មវិធីរបស់អ្នកនៅក្នុងរបៀបបញ្ជរ។</translation>
 <translation id="5265562206369321422">ក្រៅបណ្ដាញច្រើនជាងមួយសប្តាហ៍</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">មានតែបុគ្គលដែលមានឃ្លាសម្ងាត់របស់អ្នកប៉ុណ្ណោះ ដែលអាចអានទិន្នន័យដែលបានអ៊ិនគ្រីបរបស់អ្នក។ ឃ្លាសម្ងាត់នេះមិនត្រូវបានផ្ញើទៅ ឬផ្ទុកដោយ Google ឡើយ។ ប្រសិនបើអ្នកភ្លេចឃ្លាសម្ងាត់របស់អ្នក ឬចង់ប្តូរការកំណត់នេះ អ្នកត្រូវ<ph name="BEGIN_LINK" />កំណត់សមកាលកម្មឡើងវិញ<ph name="END_LINK" />។</translation>
 <translation id="6357619544108132570">ស្វាគមន៍មកកាន់គ្រួសារ <ph name="SHORT_PRODUCT_NAME" />។ នេះមិនមែនជាកុំព្យូទ័រធម្មតាទេ។</translation>
 <translation id="6358884629796491903">នាគ</translation>
-<translation id="6360719647236334056">ប្រើប្រវត្តិ​រុករក​តាមអ៊ីនធឺណិតរបស់អ្នក​ Chrome ដើម្បី​ធ្វើឱ្យ​ការស្វែងរក ការផ្សាយ​ពាណិជ្ជកម្ម និងសេវាកម្ម Google ផ្សេងទៀតស្របនឹងអ្នក</translation>
 <translation id="6361850914223837199">ព័ត៌មានលំអិតកំហុសឆ្គង៖</translation>
 <translation id="6362853299801475928">រាយការណ៍បញ្ហា...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">អនុញ្ញាតឱ្យយើងដឹងថា ការបំពេញការងាររបស់យើងដូចម្ដេចដែរ។</translation>
 <translation id="6759193508432371551">កំណត់ដូចដើមឡើងវិញ</translation>
 <translation id="6762833852331690540">បើក</translation>
-<translation id="6764693078871405569">សម្អាត​ទិន្នន័យ​រុករក (<ph name="URL" />) ដែលនឹង​នាំអ្នក​ចេញពី <ph name="DOMAIN" /> ផងដែរ។</translation>
 <translation id="6767566652486411142">ជ្រើសរើស​ភាសា​ផ្សេងទៀត...</translation>
 <translation id="6767639283522617719">មិន​អាចភ្ជាប់​ទៅដែន​បានទេ។ សូម​ប្រាកដថា ការកំណត់មាន​ភាព​ត្រឹមត្រូវ​សម្រាប់​ឯកតារៀបចំ។</translation>
 <translation id="6769712124046837540">កំពុងបន្ថែមម៉ាស៊ីនបោះពុម្ព...</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 17a42b4..f170f3ce 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">ಮನವಿ ಸಲ್ಲಿಸಿದಾಗ, ಪ್ರಸ್ತುತ ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಎಲ್ಲ ಡೇಟಾವನ್ನು ಓದಿ, ಬದಲಾಯಿಸಿ</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮರುಹೊಂದಿಸಲು ಬಯಸುತ್ತದೆ.</translation>
 <translation id="1243314992276662751">ಅಪ್‌ಲೋಡ್</translation>
-<translation id="1243398753772016127">ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು, ವಿಭಿನ್ನ ಸೈಟ್‌ಗಳಲ್ಲಿ ನೀವು ನಡೆಸುವ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಸೈಟ್‌ಗಳು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation>
 <translation id="1244265436519979884">ಪ್ರಸ್ತುತವಾಗಿ Linux ಮರುಸ್ಥಾಪನೆ ಪ್ರಗತಿಯಲ್ಲಿದೆ</translation>
 <translation id="1244303850296295656">ವಿಸ್ತರಣೆ ದೋಷ</translation>
 <translation id="1246905108078336582">ಕ್ಲಿಪ್‌ಬೋರ್ಡ್‌ನಿಂದ ಸಲಹೆಗಳನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation>
@@ -196,7 +195,7 @@
 <translation id="1251366534849411931">ಓಪನಿಂಗ್ ಕರ್ಲಿ ಬ್ರಾಕೆಟ್ ಅನ್ನು ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ: <ph name="ERROR_LINE" /></translation>
 <translation id="1252987234827889034">ಪ್ರೊಫೈಲ್ ದೋಷ ಸಂಭವಿಸಿದೆ</translation>
 <translation id="1254593899333212300">ನೇರ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕ</translation>
-<translation id="1259152067760398571">ಸುರಕ್ಷತಾ ಪರಿಶೀಲನೆಯನ್ನು ನಿನ್ನೆಯ ದಿನ ನಡೆಸಾಲಾಗಿದೆ</translation>
+<translation id="1259152067760398571">ಸುರಕ್ಷತಾ ಪರಿಶೀಲನೆಯನ್ನು ನಿನ್ನೆಯ ದಿನ ನಡೆಸಲಾಗಿದೆ</translation>
 <translation id="1260451001046713751"><ph name="HOST" /> ನಿಂದ ಪಾಪ್-ಅಪ್‍ಗಳು ಮತ್ತು ಮರುನಿರ್ದೇಶನಗಳನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation>
 <translation id="126156426083987769">ಡೆಮೊ ಮೋಡ್ ಸಾಧನದ ಪರವಾನಗಿಗಳಲ್ಲಿ ಸಮಸ್ಯೆ ಸಂಭವಿಸಿದೆ.</translation>
 <translation id="126710816202626562">ಅನುವಾದ ಭಾಷೆ:</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">ಆನ್ - ಕಸ್ಟಮ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="1489664337021920575">ಇನ್ನೊಂದು ಆಯ್ಕೆಯನ್ನು ಆರಿಸಿ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ...</translation>
-<translation id="1494438840282430403">ನಿಮ್ಮನ್ನು Google.com ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಬಹುದಾದ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು (<ph name="URL" />) ಸಹ ತೆರವುಗೊಳಿಸಿ.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ಇತರ ಲಭ್ಯವಿರುವ ಸಾಧನಗಳು.</translation>
 <translation id="1495677929897281669">ಟ್ಯಾಬ್‌ಗೆ ಮರಳಿ</translation>
 <translation id="1499271269825557605">ನಿಮಗೆ ವಿಸ್ತರಣೆಯೊಂದನ್ನು ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗದಿದ್ದರೆ, ಅಥವಾ ನಿಮ್ಮ ಬ್ರೌಸರ್ ನಿರೀಕ್ಷೆಯಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸದಿದ್ದರೆ, ನೀವು ವಿಸ್ತರಣೆಗಳನ್ನು ಇಲ್ಲಿ ಆಫ್ ಮಾಡಬಹುದು ಅಥವಾ ಕಸ್ಟಮೈಸ್ ಮಾಡಬಹುದು.</translation>
@@ -519,6 +517,7 @@
 <translation id="1697686431566694143">ಫೈಲ್ ಎಡಿಟ್ ಮಾಡಿ</translation>
 <translation id="1698122934742150150">ಪ್ರಸ್ತುತ ಅದೃಶ್ಯ ಸೆಶನ್ ಮಾತ್ರ</translation>
 <translation id="1698650002254827833">ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
+<translation id="1700079447639026019">ಎಂದಿಗೂ ಕುಕೀಗಳನ್ನು ಬಳಸದ ಸೈಟ್‌ಗಳು</translation>
 <translation id="1701062906490865540">ಈ ವ್ಯಕ್ತಿಯನ್ನು ತೆಗೆದುಹಾಕು</translation>
 <translation id="1703331064825191675">ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳ ಬಗ್ಗೆ ಎಂದಿಗೂ ಚಿಂತಿಸಬೇಡಿ</translation>
 <translation id="1704970325597567340">ಸುರಕ್ಷತೆ ಪರಿಶೀಲನೆಯನ್ನು <ph name="DATE" /> ರಂದು ನಡೆಸಲಾಗಿದೆ</translation>
@@ -739,6 +738,7 @@
 <translation id="1990512225220753005">ಈ ಪುಟದಲ್ಲಿ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ತೋರಿಸಬೇಡಿ</translation>
 <translation id="1992397118740194946">ಹೊಂದಿಸಿಲ್ಲ</translation>
 <translation id="1994173015038366702">ಸೈಟ್ URL</translation>
+<translation id="1995916364271252349">ಸೈಟ್ ಯಾವ ಮಾಹಿತಿಯನ್ನು ಬಳಸಬಹುದು ಮತ್ತು ಪ್ರದರ್ಶಿಸಬಹುದು ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಿ (ಸ್ಥಳ, ಕ್ಯಾಮರಾ, ಪಾಪ್-ಅಪ್‌ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟು)</translation>
 <translation id="1997484222658892567">ನಿಮ್ಮ ಸ್ಥಳೀಯ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ದೊಡ್ಡ ಪ್ರಮಾಣದ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಣೆ ಮಾಡಲು <ph name="URL" /> ಬಯಸುತ್ತದೆ</translation>
 <translation id="1997616988432401742">ನಿಮ್ಮ ಪ್ರಮಾಣಪತ್ರಗಳು</translation>
 <translation id="1999115740519098545">ಸ್ಟಾರ್ಟ್‌ಅಪ್‌ನಲ್ಲಿ</translation>
@@ -994,6 +994,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# ವಿಂಡೋ ಮುಚ್ಚಿ}one{# ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚಿ}other{# ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚಿ}}</translation>
 <translation id="2335122562899522968">ಈ ಪುಟವು ಕುಕೀಸ್‌ಗಳನ್ನು ಸೆಟ್ ಮಾಡುತ್ತದೆ.</translation>
 <translation id="2336228925368920074">ಎಲ್ಲಾ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಬುಕ್‌ಮಾರ್ಕ್ ಮಾಡಿ...</translation>
+<translation id="2336376423977300504">ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚುವಾಗ ಯಾವಾಗಲೂ ಕುಕೀಗಳನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
 <translation id="2336381494582898602">ಪವರ್‌ವಾಶ್</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> ಜೋಡಿಸಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="2342740338116612727">ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ</translation>
@@ -1187,7 +1188,6 @@
 <translation id="2575247648642144396">ಪ್ರಸ್ತುತ ಪುಟದಲ್ಲಿ ವಿಸ್ತರಣೆಯು ಕಾರ್ಯನಿರ್ವಹಿಸಿದಾಗ ಈ ಐಕಾನ್ ಗೋಚರಿಸುತ್ತದೆ. ಐಕಾನ್‌ನ ಮೇಲೆ ಕ್ಲಿಕ್ ಮಾಡುವುದರ ಮೂಲಕ ಅಥವಾ <ph name="EXTENSION_SHORTCUT" /> ಒತ್ತುವುದರ ಮೂಲಕ ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸಿ.</translation>
 <translation id="257779572837908839">ಸಭೆಗಳಿಗಾಗಿ Chromebox ಅನ್ನು ಸೆಟಪ್‌ ಮಾಡಿ</translation>
 <translation id="2580889980133367162">ಬಹು ಫೈಲ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು <ph name="HOST" /> ಗೆ ಎಲ್ಲಾ ಸಮಯದಲ್ಲೂ ಅನುಮತಿ ನೀಡಿ</translation>
-<translation id="2580924999637585241">ಒಟ್ಟು:<ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ದೀರ್ಘ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /><ph name="PRODUCT_VERSION" /> (ಪ್ಲ್ಯಾಟ್‌ಫಾರ್ಮ್ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos ಟಿಕೆಟ್ ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ ನಿಮ್ಮ ಸಂಸ್ಥೆಯ ಸಾಧನ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ. (ದೋಷ ಕೋಡ್ <ph name="ERROR_CODE" />).</translation>
@@ -1714,7 +1714,7 @@
 <translation id="3293644607209440645">ಈ ಪುಟವನ್ನು ಕಳುಹಿಸಿ</translation>
 <translation id="32939749466444286">Linux ಕಂಟೇನರ್ ಪ್ರಾರಂಭವಾಗಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="3294437725009624529">ಅತಿಥಿ</translation>
-<translation id="3296193636298964625">ಹಲವಾರು ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿರು ಕಾರಣ, Chrome ಗೆ ನಿಮ್ಮ ಎಲ್ಲಾ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation>
+<translation id="3296193636298964625">ಹಲವಾರು ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿರುವ ಕಾರಣ, Chrome ಗೆ ನಿಮ್ಮ ಎಲ್ಲಾ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation>
 <translation id="329703603001918157">ಶಾರ್ಟ್‌ಕಟ್‌ ಎಡಿಟ್‌ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
 <translation id="329838636886466101">ರಿಪೇರ್</translation>
 <translation id="3298789223962368867">ಅಮಾನ್ಯ URL ನಮೂದಿಸಲಾಗಿದೆ.</translation>
@@ -1735,6 +1735,7 @@
 <translation id="3317459757438853210">ಎರಡು-ಕಡೆಗಳಿಂದ</translation>
 <translation id="3317678681329786349">ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೊಫೋನ್ ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation>
 <translation id="3319048459796106952">ಹೊಸ &amp;ಅಜ್ಞಾತ ವಿಂಡೋ</translation>
+<translation id="3320630259304269485">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್‌ (ಅಪಾಯಕಾರಿ ಸೈಟ್‌ಗಳಿಂದ ರಕ್ಷಣೆ) ಮತ್ತು ಇತರೆ ಭದ್ರತಾ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="3323521181261657960">ಬೋನಸ್! ನೀವು ಇನ್ನಷ್ಟು ವೀಕ್ಷಣಾ ಅವಧಿಯನ್ನು ಪಡೆದಿದ್ದೀರಿ</translation>
 <translation id="3325910708063135066">Mac ಸಿಸ್ಟಂ ಆದ್ಯತೆಗಳಲ್ಲಿ ಕ್ಯಾಮರಾ ಹಾಗೂ ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="3328489342742826322">ಬ್ಯಾಕಪ್ ಮೂಲಕ ಮರುಸ್ಥಾಪಿಸುವುದರಿಂದ ನಿಮ್ಮ Linux ಫೈಲ್‌ಗಳ ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ Linux ಆ್ಯಪ್‌ಗಳು ಹಾಗೂ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ.</translation>
@@ -1854,6 +1855,7 @@
 <translation id="3487007233252413104">ಅನಾಮಧೇಯ ಕಾರ್ಯ</translation>
 <translation id="348780365869651045">AppCache ಗಾಗಿ ನಿರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="3488065109653206955">ಭಾಗಶಃ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
+<translation id="3489025949017384019">ಹಲವಾರು ಸೈಟ್‌ಗಳು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು</translation>
 <translation id="3492788708641132712">ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ. ಮತ್ತೊಮ್ಮೆ ಸೈನ್‌ ಇನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="3493486281776271508">ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕದ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="3493881266323043047">ವಾಯಿದೆ</translation>
@@ -2009,6 +2011,7 @@
 <translation id="3688526734140524629">ಚಾನಲ್ ಬದಲಿಸಿ</translation>
 <translation id="3688578402379768763">ನವೀಕೃತವಾಗಿದೆ</translation>
 <translation id="3688794912214798596">ಭಾಷೆಗಳನ್ನು ಬದಲಾಯಿಸಿ...</translation>
+<translation id="3690369331356918524">ಡೇಟಾ ಉಲ್ಲಂಘನೆಯ ಮೂಲಕ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಬಹಿರಂಗವಾದರೆ, ನಿಮಗೆ ಎಚ್ಚರಿಕೆ ನೀಡುತ್ತದೆ</translation>
 <translation id="3691231116639905343">ಕೀಬೋರ್ಡ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ನಿಮ್ಮ ಪರದೆಯನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಬಯಸುತ್ತದೆ</translation>
 <translation id="369135240373237088">ಶಾಲೆ ಖಾತೆ ಮೂಲಕ ಪುನಃ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
@@ -2147,6 +2150,7 @@
 <translation id="3841964634449506551">ಪಾಸ್‌ವರ್ಡ್ ಅಮಾನ್ಯವಾಗಿದೆ</translation>
 <translation id="3842552989725514455">Serif ಫಾಂಟ್</translation>
 <translation id="3846116211488856547">ವೆಬ್‌ಸೈಟ್‌ಗಳು, Android ಆ್ಯಪ್‍ಗಳು, ಮತ್ತು ಇನ್ನೂ ಹೆಚ್ಚಿನವುಗಳನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸಲು ಪರಿಕರಗಳನ್ನು ಪಡೆಯಿರಿ. Linux ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡುವುದರಿಂದ <ph name="DOWNLOAD_SIZE" /> ಗಾತ್ರದ ಡೇಟಾವನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
+<translation id="3847319713229060696">ಎಲ್ಲರಿಗಾಗಿ ವೆಬ್‌ನ ಸುರಕ್ಷತೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯಮಾಡಿ</translation>
 <translation id="385051799172605136">ಹಿಂದೆ</translation>
 <translation id="3850914401008572843"><ph name="ORIGIN" /> ಗೆ ಈ ಫೋಲ್ಡರ್ ಅನ್ನು ತೆರೆಯಲು ಸಾಧ್ಯವಿಲ್ಲ ಏಕೆಂದರೆ ಇದರಲ್ಲಿ ಸಿಸ್ಟಂ ಫೈಲ್‍‍ಗಳಿವೆ</translation>
 <translation id="3851428669031642514">ಅಸುರಕ್ಷಿತ ಸ್ಕ್ರಿಪ್ಟ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಿ</translation>
@@ -2629,6 +2633,7 @@
 <translation id="4534661889221639075">ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="4535127706710932914">ಡಿಫಾಲ್ಟ್ ಪ್ರೊಫೈಲ್</translation>
 <translation id="4535767533210902251">ನಿಮ್ಮ ಕೀಬೋರ್ಡ್‌ನಲ್ಲಿ ಮೇಲೆ ಬಲತುದಿಯಲ್ಲಿರುವ ಕೀ, ಫಿಂಗರ್‌ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಆಗಿದೆ. ಯಾವುದೇ ಬೆರಳಿನ ಮೂಲಕ ಅದನ್ನು ಮೆಲ್ಲಗೆ ಸ್ಪರ್ಶಿಸಿ.</translation>
+<translation id="4536140153723794651">ಯಾವಾಗಲೂ ಕುಕೀಗಳನ್ನು ಬಳಸುವ ಸೈಟ್‌ಗಳು</translation>
 <translation id="4538417792467843292">ಪದವನ್ನು ಅಳಿಸಿ</translation>
 <translation id="4538684596480161368"><ph name="HOST" /> ನಲ್ಲಿ ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ರದ್ದುಗೊಳಿಸಲಾಗಿರುವ ಪ್ಲಗ್-ಇನ್‌ಗಳನ್ನು ಯಾವಾಗಲೂ ನಿರ್ಬಂಧಿಸು</translation>
 <translation id="4538792345715658285">ಎಂಟರ್‌ಪ್ರೈಸ್ ನೀತಿಯಿಂದ ಸ್ಥಾಪಿಸಲಾಗಿದೆ.</translation>
@@ -2726,6 +2731,7 @@
 <translation id="4665446389743427678"><ph name="SITE" /> ವೆಬ್‌ಸೈಟ್‌ ಮೂಲಕ ಸಂಗ್ರಹಣೆ ಮಾಡಲಾದ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುವುದು.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> ಸಕ್ರಿಯಗೊಳಿಸಲು ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
 <translation id="4670064810192446073">ವರ್ಚುವಲ್ ರಿಯಾಲಿಟಿ</translation>
+<translation id="4672879467403304774">ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗ, Chrome ಹಾಗೂ ಇತರ Google ಆ್ಯಪ್‌ಗಳಲ್ಲಿ ನಿಮ್ಮನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸುತ್ತದೆ</translation>
 <translation id="46733273239502219">ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲಾದ ಆ್ಯಪ್‌ಗಳಲ್ಲಿನ ಆಫ್‌ಲೈನ್ ಡೇಟಾವನ್ನು ಸಹ ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ</translation>
 <translation id="4673442866648850031">ಸ್ಟೈಲಸ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿದಾಗ ಸ್ಟೈಲಸ್ ಪರಿಕರಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="4677772697204437347">GPU ಮೆಮೊರಿ</translation>
@@ -2810,7 +2816,6 @@
 <translation id="4808667324955055115">ಪಾಪ್-ಅಪ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ:</translation>
 <translation id="480990236307250886">ಹೋಮ್ ತೆರೆಯಿರಿ</translation>
 <translation id="4811503964269049987">ಆಯ್ಕೆಮಾಡಿದ ಟ್ಯಾಬ್ ಅನ್ನು ಸಮೂಹಗೊಳಿಸಿ</translation>
-<translation id="4811818760963189951">ಇತಿಹಾಸ ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ನೀವು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ ಕಾರಣ ಇದನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="4813136279048157860">ನನ್ನ ಚಿತ್ರಗಳು</translation>
 <translation id="4813512666221746211">ನೆಟ್‌ವರ್ಕ್  ದೋಷ</translation>
 <translation id="4814378367953456825">ಈ ಫಿಂಗರ್‌ಪ್ರಿಂಟ್‌ಗಾಗಿ ಹೆಸರೊಂದನ್ನು ನಮೂದಿಸಿ</translation>
@@ -2980,7 +2985,6 @@
 <translation id="5040823038948176460">ಹೆಚ್ಚುವರಿ ವಿಷಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> ಅನ್ನು Linux ಗೆ ಸಂಪರ್ಕಿಸಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="5043913660911154449">ಅಥವಾ ನಿಮ್ಮ ಪ್ರಿಂಟರ್ PPD ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">ನಿಮ್ಮ ಸಿಂಕ್ ಡೇಟಾವನ್ನು ನೀವು ಪಾಸ್‌ಫ್ರೇಸ್‌ನ ಮೂಲಕ ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ಕಾರಣ, ಇದನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="5045550434625856497">ತಪ್ಪು ಪಾಸ್‌ವರ್ಡ್</translation>
 <translation id="504561833207953641">ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಬ್ರೌಸರ್ ಸೆಶನ್‌ನಲ್ಲಿ ತೆರೆಯಲಾಗುತ್ತಿದೆ.</translation>
 <translation id="5047421709274785093">ಚಲನೆ ಮತ್ತು ಬೆಳಕಿನ ಸೆನ್ಸರ್‌ಗಳನ್ನು ಬಳಸದಂತೆ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
@@ -3145,6 +3149,7 @@
 <translation id="5275352920323889391">ನಾಯಿ</translation>
 <translation id="527605982717517565"><ph name="HOST" /> ನಲ್ಲಿ JavaScript ಅನ್ನು ಯಾವಾಗಲೂ ಅನುಮತಿಸಿ</translation>
 <translation id="5280174558369304332">ತೆಗೆದುಹಾಕಲಾಗುವ ವಿಸ್ತರಣೆಗಳು:</translation>
+<translation id="5280243692621919988">ನೀವು ಎಲ್ಲಾ ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚುವಾಗ ಯಾವಾಗಲೂ ಕುಕೀಗಳು ಮತ್ತು ಸೈಟ್ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
 <translation id="5280426389926346830">ಶಾರ್ಟ್‌ಕಟ್ ರಚಿಸಬೇಕೆ?</translation>
 <translation id="528208740344463258">Android ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಮತ್ತು ಬಳಸಲು, ಮೊದಲು ನೀವು ಅಗತ್ಯವಿರುವ ಈ ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡಬೇಕು. ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅಪ್‌ಡೇಟ್ ಆಗುತ್ತಿರುವಾಗ, ಅದನ್ನು ಬಳಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಿಲ್ಲ. ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡುವಿಕೆ ಪೂರ್ಣಗೊಂಡ ನಂತರ, ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಮರುಪ್ರಾರಂಭವಾಗುತ್ತದೆ.</translation>
 <translation id="5282733140964383898">‘ಟ್ರ್ಯಾಕ್ ಮಾಡಬೇಡಿ’ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದೆಂದರೆ ವಿನಂತಿಯನ್ನು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ದಟ್ಟಣೆಯೊಂದಿಗೆ ಸೇರಿಸುವುದು ಎಂದರ್ಥ. ಎಫೆಕ್ಟ್‌ , ವೆಬ್‌ಸೈಟ್ ವಿನಂತಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತದೆಯೇ ಇಲ್ಲವೇ ಮತ್ತು ವಿನಂತಿಯನ್ನು ಹೇಗೆ ಅರ್ಥೈಸಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಅವಲಂಬಿಸಿರುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಕೆಲವು ವೆಬ್‌ಸೈಟ್‌ಗಳು, ನೀವು ಭೇಟಿ ನೀಡುವ ಇತರ ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಆಧರಿಸದಿರುವ ಜಾಹೀರಾತುಗಳನ್ನು ನಿಮಗೆ ಪ್ರದರ್ಶಿಸುವ ಮೂಲಕ ಈ ವಿನಂತಿಗೆ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನೀಡಬಹುದು. ಹಲವು ವೆಬ್‌ಸೈಟ್‌ಗಳು ಈಗಲೂ ಸಹ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುತ್ತವೆ ಮತ್ತು ಬಳಸುತ್ತವೆ - ಉದಾಹರಣೆಗೆ ಭದ್ರತೆಯನ್ನು ಸುಧಾರಿಸಲು, ತಮ್ಮ ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿ ವಿಷಯಗಳು, ಸೇವೆಗಳು, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಶಿಫಾರಸುಗಳನ್ನು ಒದಗಿಸಲು, ಮತ್ತು ವರದಿ ಅಂಕಿಅಂಶಗಳನ್ನು ಸೃಷ್ಟಿಸಲು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
@@ -3957,7 +3962,6 @@
 <translation id="63566973648609420">ನಿಮ್ಮ ಎನ್‍‍ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾದ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಪಾಸ್‍‍ಫ್ರೇಸ್‍‍ ಹೊಂದಿರುವವರು ಮಾತ್ರ ಓದಬಹುದು. ಪಾಸ್‍‍ಫ್ರೇಸ್‍ ಅನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುವುದಿಲ್ಲ ಅಥವಾ ಅದನ್ನು ಸಂಗ್ರಹಿಸುವುದಿಲ್ಲ. ನಿಮ್ಮ ಪಾಸ್‍‍ಫ್ರೇಸ್ ಅನ್ನು ನೀವು ಮರೆತಿದ್ದರೆ ಅಥವಾ ಈ ಸೆಟ್ಟಿಂಗ್ ಬದಲಾಯಿಸಲು ಬಯಸಿದರೆ, ನೀವು <ph name="BEGIN_LINK" />ಸಿಂಕ್ ಮರುಹೊಂದಿಸಬೇಕಾಗುತ್ತದೆ<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> ಕುಟುಂಬಕ್ಕೆ ಸುಸ್ವಾಗತ. ಇದು ಸಾಧಾರಣ ಕಂಪ್ಯೂಟರ್‌ ಅಲ್ಲ.</translation>
 <translation id="6358884629796491903">ಡ್ರ್ಯಾಗನ್‌</translation>
-<translation id="6360719647236334056">ಹುಡುಕಾಟ, ಜಾಹೀರಾತುಗಳು ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ Chrome ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು ಬಳಸಿ</translation>
 <translation id="6361850914223837199">ದೋಷ  ವಿವರಗಳು:</translation>
 <translation id="6362853299801475928">&amp;ಸಮಸ್ಯೆಯನ್ನು ವರದಿಮಾಡಿ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4235,10 +4239,10 @@
 <translation id="6758056191028427665">ನಮ್ಮ ಕೆಲಸದ ಕುರಿತು ನಿಮ್ಮ ಅಭಿಪ್ರಾಯವನ್ನು ತಿಳಿಸಿ.</translation>
 <translation id="6759193508432371551">ಫ್ಯಾಕ್ಟರಿ ರಿಸೆಟ್‌</translation>
 <translation id="6762833852331690540">ಆನ್‌ ಆಗಿದೆ</translation>
-<translation id="6764693078871405569">ನಿಮ್ಮನ್ನು <ph name="DOMAIN" /> ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡಬಹುದಾದ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು (<ph name="URL" />) ಸಹ ತೆರವುಗೊಳಿಸಿ.</translation>
 <translation id="6767566652486411142">ಬೇರೊಂದು ಭಾಷೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿ...</translation>
 <translation id="6767639283522617719">ಡೊಮೇನ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಸಾಂಸ್ಥಿಕ ಘಟಕಕ್ಕಾಗಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಸರಿಯಾಗಿವೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="6769712124046837540">ಮುದ್ರಕ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...</translation>
+<translation id="6770602306803890733">ನಿಮಗಾಗಿ ಹಾಗೂ ವೆಬ್‌ನಲ್ಲಿರುವ ಎಲ್ಲರಿಗಾಗಿ ಸುರಕ್ಷತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ</translation>
 <translation id="6770664076092644100">NFC ಮೂಲಕ ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="6771503742377376720">ಪ್ರಮಾಣಪತ್ರ ಪ್ರಾಧಿಕಾರವಾಗಿದೆ</translation>
 <translation id="6772339735733515807">ನಿಮ್ಮ ವಿಸ್ತರಣೆಗಳನ್ನು ನಿರ್ವಹಿಸಿ</translation>
@@ -4264,6 +4268,7 @@
 <translation id="6798578729981748444">ಆಮದು ಮಾಡುವುದನ್ನು ಪೂರ್ತಿಗೊಳಿಸಲು, ಎಲ್ಲಾ Firefox ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚಿ.</translation>
 <translation id="6798780071646309401">caps lock ಆನ್</translation>
 <translation id="6798954102094737107">ಪ್ಲಗಿನ್: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">ಸಾಮಾನ್ಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="6801435275744557998">ಟಚ್‌ಸ್ಕ್ರೀನ್ ಕ್ಯಾಲಿಬ್ರೇಟ್ ಮಾಡಿ</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">ಸರಿ</translation>
@@ -4382,6 +4387,8 @@
 <translation id="6965382102122355670">ಸರಿ</translation>
 <translation id="6965648386495488594">ಪೋರ್ಟ್</translation>
 <translation id="6965978654500191972">ಸಾಧನ</translation>
+<translation id="6966201992886493384">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು, ಉದಾಹರಣೆಗೆ, ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಆಗಿರಿಸಲು ಅಥವಾ ನಿಮ್ಮ ಶಾಪಿಂಗ್ ಕಾರ್ಟ್‌ನಲ್ಲಿರುವ ಐಟಂಗಳನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳಲು ಸೈಟ್‌ಗಳು ಕುಕೀಗಳನ್ನು ಬಳಸಬಹುದು</translation>
+<translation id="696780070563539690">ವಿವಿಧ ಸೈಟ್‌ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸುವುದಕ್ಕಾಗಿ, ನಿಮ್ಮ ಕುಕೀಗಳನ್ನು ಬಳಸಲು ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ</translation>
 <translation id="6968288415730398122">ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸಿ</translation>
 <translation id="6970480684834282392">ಸ್ಟಾರ್ಟ್ಅಪ್ ಪ್ರಕಾರ</translation>
 <translation id="6970856801391541997">ನಿರ್ದಿಷ್ಟ ಪುಟಗಳನ್ನು ಮುದ್ರಿಸಿ</translation>
@@ -4792,6 +4799,7 @@
 <translation id="7507207699631365376">ಈ ಪೂರೈಕೆದಾರರ <ph name="BEGIN_LINK" />ಗೌಪ್ಯತೆ ನೀತಿಯನ್ನು<ph name="END_LINK" /> ನೋಡಿ</translation>
 <translation id="7507930499305566459">ಸ್ಥಿತಿ ಪ್ರತಿಕ್ರಿಯೆ ನೀಡುವವರ ಪ್ರಮಾಣಪತ್ರ</translation>
 <translation id="7508054832109420082">ಪ್ರಿಂಟರ್‌ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಿ</translation>
+<translation id="751120035300339">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಸುಧಾರಿಸಲು, ಉದಾಹರಣೆಗೆ, ನಿಮ್ಮನ್ನು ಸೈನ್ ಇನ್ ಆಗಿರಿಸಲು ಅಥವಾ ನಿಮ್ಮ ಶಾಪಿಂಗ್ ಕಾರ್ಟ್‌ನಲ್ಲಿರುವ ಐಟಂಗಳನ್ನು ನೆನಪಿಟ್ಟುಕೊಳ್ಳುವುದಕ್ಕಾಗಿ ಕುಕೀಗಳನ್ನು ಬಳಸಲು, ಸೈಟ್‌ಗಳಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ</translation>
 <translation id="7513029293694390567">ಸಂಗ್ರಹಿಸಲಾದ ರುಜುವಾತುಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ಮೂಲಕ ವೆಬ್‌ಸೈಟ್‌ಗಳಿಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡಿ. ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ವೆಬ್‌ಸೈಟ್‌ಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವ ಮೊದಲು ಪ್ರತಿ ಬಾರಿಯೂ ನಿಮಗೆ ದೃಢೀಕರಿಸಲು ಕೇಳಲಾಗುವುದು.</translation>
 <translation id="7514239104543605883">ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ನಕಲಿಸಿ</translation>
 <translation id="7514365320538308">ಡೌನ್‌ಲೋಡ್</translation>
@@ -5418,6 +5426,7 @@
 <translation id="8320459152843401447">ನಿಮ್ಮ ಸಂಪೂರ್ಣ ಪರದೆ</translation>
 <translation id="8322814362483282060">ಈ ಪುಟವನ್ನು ನಿಮ್ಮ ಮೈಕ್ರೋಫೋನ್ ಪ್ರವೇಶದಿಂದ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="8323167517179506834">URL ಟೈಪ್ ಮಾಡಿ</translation>
+<translation id="8324784016256120271">ವಿವಿಧ ಸೈಟ್‌ಗಳಾದ್ಯಂತ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು, ಉದಾಹರಣೆಗೆ, ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈಟ್‌ಗಳು ಕುಕೀಗಳನ್ನು ಬಳಸಬಹುದು</translation>
 <translation id="8326478304147373412">PKCS #7, ಪ್ರಮಾಣಪತ್ರ ಸರಣಿ</translation>
 <translation id="8327039559959785305">Linux ಫೈಲ್‌ಗಳನ್ನು ಮೌಂಟ್ ಮಾಡುವಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ. ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="8327676037044516220">ಅನುಮತಿಗಳು ಮತ್ತು ವಿಷಯ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
@@ -5473,6 +5482,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> ನೆಟ್‌ವರ್ಕ್, ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
+<translation id="8417573335434189196">ಅಪಾಯಕಾರಿ ವೆಬ್‌ಸೈಟ್‌ಗಳು, ಡೌನ್‌ಲೋಡ್‌ಗಳು ಅಥವಾ ವಿಸ್ತರಣೆಗಳ ವಿರುದ್ಧ ನಿಮಗೆ ರಕ್ಷಣೆ ನೀಡುವುದಿಲ್ಲ. Chrome ಈ ಸೆಟ್ಟಿಂಗ್‌ ಅನ್ನು ಶಿಫಾರಸು ಮಾಡುವುದಿಲ್ಲ.</translation>
 <translation id="8418445294933751433">ಟ್ಯಾಬ್‌ನಂತೆ &amp;ತೋರಿಸಿ</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' ಕುರಿತ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು</translation>
 <translation id="8419368276599091549">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಸಾಧನಕ್ಕೆ ಸ್ವಾಗತ!</translation>
@@ -5640,6 +5650,7 @@
 <translation id="8642947597466641025">ಪಠ್ಯವನ್ನು ದೊಡ್ಡದಾಗಿ ಮಾಡಿಕೊಳ್ಳಿ</translation>
 <translation id="8644655801811752511">ಈ ಭದ್ರತೆ ಕೀ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಕೀ ಅನ್ನು ಮರುಸೇರ್ಪಡಿಸಿದ ನಂತರ, ಅದನ್ನು ಕೂಡಲೇ ಮರುಹೊಂದಿಸಲು ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="8645354835496065562">ಸೆನ್ಸರ್‌ ಪ್ರವೇಶದ ಅನುಮತಿಯನ್ನು ಮುಂದುವರೆಸಿ</translation>
+<translation id="8645920082661222035">ಅಪಾಯಕಾರಿ ಘಟನೆಗಳು ಸಂಭವಿಸುವ ಮೊದಲೇ, ಅವುಗಳನ್ನು ಪತ್ತೆಹಚ್ಚುತ್ತದೆ ಮತ್ತು ನಿಮಗೆ ಎಚ್ಚರಿಕೆ ನೀಡುತ್ತದೆ</translation>
 <translation id="8647834505253004544">ಇದು ಮಾನ್ಯವಾದ ವೆಬ್‌ ವಿಳಾಸವಲ್ಲ</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> ಅಥವಾ <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">ನಿಮ್ಮ ಹಳೆಯ ಪ್ರೊಫೈಲ್‌ಗೆ ಪ್ರವೇಶಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗದಿದ್ದರೂ, ಅದನ್ನು ನೀವು ತೆಗೆದುಹಾಕಬಹುದು.</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index ba75aff..6c69184 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">호출할 경우 현재 웹사이트에 있는 모든 데이터를 읽고 변경합니다.</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />에서 설정을 재설정하려 합니다.</translation>
 <translation id="1243314992276662751">업로드</translation>
-<translation id="1243398753772016127">사이트에서 사용자의 타 사이트 탐색 활동 정보를 이용해 광고를 맞춤설정할 수 없습니다.</translation>
 <translation id="1244265436519979884">현재 Linux 복원이 진행 중입니다.</translation>
 <translation id="1244303850296295656">확장 프로그램 오류</translation>
 <translation id="1246905108078336582">클립보드에서 추천 항목을 삭제하시겠습니까?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">사용 - 맞춤 설정</translation>
 <translation id="1489664337021920575">다른 옵션 선택</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />을(를) 기다리는 중...</translation>
-<translation id="1494438840282430403">인터넷 사용 기록(<ph name="URL" />)도 삭제합니다. 이렇게 하면 Google.com에서 로그아웃될 수 있습니다.</translation>
 <translation id="1495486559005647033">사용 가능한 다른 기기가 <ph name="NUM_PRINTERS" />개 있습니다.</translation>
 <translation id="1495677929897281669">탭으로 돌아가기</translation>
 <translation id="1499271269825557605">알 수 없는 확장 프로그램이 있거나 브라우저가 예상대로 작동하지 않는다면 여기에서 확장 프로그램을 사용 중지하거나 맞춤설정할 수 있습니다.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">현재 페이지에서 확장 프로그램을 실행할 수 있으면 아이콘이 표시됩니다. 아이콘을 클릭하거나 <ph name="EXTENSION_SHORTCUT" />을(를) 눌러 확장 프로그램을 사용합니다.</translation>
 <translation id="257779572837908839">Chromebox 화상회의 시스템으로 설정</translation>
 <translation id="2580889980133367162"><ph name="HOST" />에서 여러 파일을 다운로드할 수 있도록 항상 허용</translation>
-<translation id="2580924999637585241">합계: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">길게</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" />(플랫폼 <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos 티켓을 가져올 수 없습니다. 다시 시도해 보거나 조직의 기기 관리자에게 문의하세요. (오류 코드 <ph name="ERROR_CODE" />)</translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">팝업 차단됨</translation>
 <translation id="480990236307250886">홈페이지 열기</translation>
 <translation id="4811503964269049987">선택한 탭 그룹화</translation>
-<translation id="4811818760963189951">기록 동기화를 비활성화했으므로 사용 중지되었습니다.</translation>
 <translation id="4813136279048157860">내 이미지</translation>
 <translation id="4813512666221746211">네트워크 오류</translation>
 <translation id="4814378367953456825">지문 이름 입력</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">추가 콘텐츠 설정</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />을(를) Linux에 연결하려면 설정으로 이동하세요.</translation>
 <translation id="5043913660911154449">또는 프린터 PPD 지정 <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">암호로 동기화 데이터를 암호화했으므로 사용 중지됨</translation>
 <translation id="5045550434625856497">비밀번호가 잘못되었습니다.</translation>
 <translation id="504561833207953641">기존 브라우저 세션에서 여는 중입니다.</translation>
 <translation id="5047421709274785093">사이트에서 모션 및 조도 센서 사용 차단</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">암호를 아는 사람만 암호화된 데이터를 읽을 수 있습니다. 암호는 Google로 전송되거나 Google에 저장되지 않습니다. 암호가 기억나지 않거나 이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />해야 합니다.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> 가족이 되신 것을 환영합니다. 뛰어난 기능을 경험해 보세요.</translation>
 <translation id="6358884629796491903">용</translation>
-<translation id="6360719647236334056">내 Chrome 방문 기록을 사용하여 Google 검색, 광고 및 다른 Google 서비스를 맞춤설정</translation>
 <translation id="6361850914223837199">오류 세부정보:</translation>
 <translation id="6362853299801475928">문제 신고하기(&amp;R)...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">개선할 점이나 격려하고 싶은 점을 알려주세요.</translation>
 <translation id="6759193508432371551">초기화</translation>
 <translation id="6762833852331690540">사용</translation>
-<translation id="6764693078871405569">인터넷 사용 기록(<ph name="URL" />)도 삭제합니다. 이렇게 하면 <ph name="DOMAIN" />에서 로그아웃됩니다.</translation>
 <translation id="6767566652486411142">다른 언어 선택...</translation>
 <translation id="6767639283522617719">도메인에 가입할 수 없습니다. 조직 단위에 맞는 설정인지 확인하세요.</translation>
 <translation id="6769712124046837540">프린터 추가 중...</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb
index 3715ec2..a9f0d6f 100644
--- a/chrome/app/resources/generated_resources_ky.xtb
+++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Учурдагы вебсайт ачылганда, андагы бардык дайын-даректериңизди окуп, өзгөртүңүз</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> жөндөөлөрдү баштапкы абалга келтиргени жатат.</translation>
 <translation id="1243314992276662751">Жүктөп берүү</translation>
-<translation id="1243398753772016127">Сайттар жарнамаларды жекелештирүү үчүн башка сайттардагы серептөө аракеттериңизди колдоно алышпайт</translation>
 <translation id="1244265436519979884">Учурда Linux калыбына келтирилүүдө</translation>
 <translation id="1244303850296295656">Кеңейтүү катасы</translation>
 <translation id="1246905108078336582">Сунуш алмашуу буферинен өчүрүлсүнбү?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Күйүк – ыңгайлаштырылган жөндөөлөр</translation>
 <translation id="1489664337021920575">Башка параметрди тандоо</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> күтүүдө…</translation>
-<translation id="1494438840282430403">Google.com сайтынан чыгарып сала турган серептөө маалыматы да (<ph name="URL" />) тазалансын.</translation>
 <translation id="1495486559005647033">Мүмкүн болгон башка <ph name="NUM_PRINTERS" /> түзмөк.</translation>
 <translation id="1495677929897281669">Өтмөккө кайтуу</translation>
 <translation id="1499271269825557605">Эгер кеңейтүү тааныш көрүнбөсө же серепчиңиз ойдогудай иштебей жатса, кеңейтүүлөрдү бул жерден өчүрүп же ыңгайлаштырып алсаңыз болот.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Бул сүрөтчө ушул беттеги кеңейтүү иштеп баштаганда көрүнөт. Бул кеңейтүүнү колдонуу үчүн, сүрөтчөнү чыкылдатыңыз же <ph name="EXTENSION_SHORTCUT" /> басып коюңуз.</translation>
 <translation id="257779572837908839">Жыйналыштар үчүн Chromebox'ту жөндөө</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> бир нече файлды жүктөп алууга ар дайым уруксат берилсин</translation>
-<translation id="2580924999637585241">Бардыгы: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Узак</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos билети алынган жок. Кайталап көрүңүз же уюмуңуздун түзмөгүнүн администраторуна кайрылыңыз. (Ката коду: <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Калкыма терезелер бөгөттөлгөн:</translation>
 <translation id="480990236307250886">Башкы бетти ачуу</translation>
 <translation id="4811503964269049987">Тандалган топтун өтмөгү</translation>
-<translation id="4811818760963189951">Таржымалды шайкештирүүнү өчүргөнүңүзгө байланыштуу өчүрүлдү</translation>
 <translation id="4813136279048157860">Менин сүрөттөрүм</translation>
 <translation id="4813512666221746211">Тармактык ката</translation>
 <translation id="4814378367953456825">Бул манжа изине ат коюңуз</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Кошумча мазмун жөндөөлөрү</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> түзмөгүн Linux менен байланыштыруу үчүн, Жөндөөлөрдү ачыңыз</translation>
 <translation id="5043913660911154449">Же принтериңиздин PPD файлын көрсөтүңүз <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Шайкештирүү маалыматын өткөрүүчү сүйлөм менен шифрлегениңизге байланыштуу өчүрүлдү</translation>
 <translation id="5045550434625856497">Сырсөз туура эмес</translation>
 <translation id="504561833207953641">Терезе же өтмөк серепчинин учурдагы сеансында ачылат.</translation>
 <translation id="5047421709274785093">Сайттарда кыймыл жана жарык сенсорлорун колдонуу бөгөттөлсүн</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Шифрленген дайын-даректериңизди купуя сөз айкашын билген адам гана окуй алат. Бул купуя сөз айкашы Google'га жөнөтүлбөйт же анда сакталбайт. Эгер купуя сөз айкашыңызды унутуп калсаңыз, <ph name="BEGIN_LINK" />шайкештирүүнү баштапкы абалга келтиришиңиз<ph name="END_LINK" /> керек болот.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> үй-бүлөсүнө кош келиңиз. Бул кадимки компьютер эмес.</translation>
 <translation id="6358884629796491903">Ажыдаар</translation>
-<translation id="6360719647236334056">Издөө, жарнама жана башка Google кызматтарын жекечелештирүү үчүн Chrome'догу серептөө таржымалын колдонуу</translation>
 <translation id="6361850914223837199">Катанын чоо-жайы:</translation>
 <translation id="6362853299801475928">Маселе жөнүндө &amp;кабар берүү…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Биздин ишибиз тууралуу билдирип коюңуз.</translation>
 <translation id="6759193508432371551">Демейки жөндөөлөргө кайтаруу</translation>
 <translation id="6762833852331690540">Күйүк</translation>
-<translation id="6764693078871405569"><ph name="DOMAIN" /> сайтынан чыгарып сала турган серептөө маалыматы да (<ph name="URL" />) тазалансын.</translation>
 <translation id="6767566652486411142">Башка тилди тандоо...</translation>
 <translation id="6767639283522617719">Доменге туташпай жатат. Уюмдук бөлүм үчүн коюлган жөндөөлөр туура экенин текшериңиз.</translation>
 <translation id="6769712124046837540">Принтер кошуу…</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb
index 4aa49e4..db545d0 100644
--- a/chrome/app/resources/generated_resources_lo.xtb
+++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">ອ່ານ ແລະ ປ່ຽນທຸກຂໍ້ມູນຂອງທ່ານໃນເວັບໄຊປັດຈຸບັນເມື່ອມີການຮ້ອງຂໍ</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ຕ້ອງ​ການ​ຕັ້ງ​ການ​ຕັ້ງ​ຄ່າ​ຂອງ​ທ່ານຄືນ​ໃໝ່.</translation>
 <translation id="1243314992276662751">ອັບ​ໂຫຼດ</translation>
-<translation id="1243398753772016127">ເວັບໄຊບໍ່ສາມາດໃຊ້ການເຄື່ອນໄຫວທ່ອງເວັບຂອງທ່ານໃນທົ່ວເວັບໄຊຕ່າງໆເພື່ອປັບແຕ່ງໂຄສະນາໃຫ້ເປັນແບບສ່ວນຕົວໄດ້</translation>
 <translation id="1244265436519979884">ການກູ້ຄືນຂໍ້ມູນຂອງ Linux ພວມດຳເນີນຢູ່ໃນປັດຈຸບັນ</translation>
 <translation id="1244303850296295656">ສ່ວນຂະຫຍາຍຜິດພາດ</translation>
 <translation id="1246905108078336582">ລຶບການແນະນຳອອກຈາກຄລິບບອດບໍ?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">ເປີດໃຊ້ - ການຕັ້ງຄ່າແບບກຳນົດເອງ</translation>
 <translation id="1489664337021920575">ເລືອກຕົວເລືອກອື່ນ</translation>
 <translation id="1493892686965953381">ກໍາລັງລໍຖ້າ <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">ຍັງລຶບລ້າງຂໍ້ມູນການນຳໃຊ້ (<ph name="URL" />) ນຳອີກ ເຊິ່ງອາດຈະນຳທ່ານອອກຈາກລະບົບ Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ອຸ​ປະ​ກອນ​ທີ່​ມີ​ຢູ່​ອື່ນໆ​.</translation>
 <translation id="1495677929897281669">ກັບຄືນຫາແຖບ</translation>
 <translation id="1499271269825557605">ຖ້າທ່ານບໍ່ຮູ້ຈັກສ່ວນຂະຫຍາຍໃດໜຶ່ງ ຫຼື ຖ້າໂປຣແກຣມທ່ອງເວັບຂອງທ່ານບໍ່ເຮັດວຽກຕາມທີ່ຄາດໄວ້, ທ່ານສາມາດປິດ ຫຼື ປັບແຕ່ງສ່ວນຂະຫຍາຍໄດ້ຢູ່ບ່ອນນີ້.</translation>
@@ -385,7 +383,7 @@
 <translation id="1524430321211440688">ແປ້ນພິມ</translation>
 <translation id="1524563461097350801">ບໍ່, ຂອບໃຈ</translation>
 <translation id="1525740877599838384">ໃຊ້ແຕ່ Wi-Fi ເພື່ອກຳນົດສະຖານທີ່</translation>
-<translation id="152629053603783244">ຣິສະຕາດ Linux</translation>
+<translation id="152629053603783244">ຣີສະຕາດ Linux</translation>
 <translation id="1526560967942511387">ເອກະສານບໍ່ມີຫົວຂໍ້</translation>
 <translation id="1529891865407786369">ແຫຼ່ງພະລັງງານ</translation>
 <translation id="1530838837447122178">ເປີດການຕັ້ງຄ່າອຸປະກອນເມົ້າ ແລະ ແຜ່ນສຳຜັດ</translation>
@@ -1188,7 +1186,6 @@
 <translation id="2575247648642144396">ຈະສາມາດເຫັນໄອຄອນນີ້ໄດ້ ເມື່ອສ່ວນຂະຫຍາຍສາມາດດໍາເນີນການຢູ່ໃນໜ້າປະຈຸບັນໄດ້. ໃຊ້ສ່ວນຂະຫຍາຍນີ້ໂດຍການຄລິກໃສ່ໄອຄອນ ຫຼືໂດຍການກົດ <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">ຕັ້ງຄ່າເປັນ Chromebox ສຳລັບປະຊຸມ</translation>
 <translation id="2580889980133367162">ອະ​ນຸ​ຍາດ​ໃຫ້ <ph name="HOST" /> ດາວໂຫລດຫຼາຍ​ໄຟລ໌ທຸກຄັ້ງ</translation>
-<translation id="2580924999637585241">ທັງ​ຫມົດ​: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ຍາວ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (ພະແລັດຟອມ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">ບໍ່ສາມາດຮັບປີ້ Kerberos ໄດ້. ລອງອີກຄັ້ງ ຫຼື ຕິດຕໍ່ຫາຜູ້ເບິ່ງແຍງລະບົບອຸປະກອນຂອງອົງການຂອງທ່ານ. (ລະຫັດຂໍ້ຜິດພາດ: <ph name="ERROR_CODE" />).</translation>
@@ -2534,7 +2531,7 @@
 <translation id="439266289085815679">ການກຳນົດຄ່າ Bluetooth ຖືກຄວບຄຸມໂດຍ <ph name="USER_EMAIL" />.</translation>
 <translation id="4392896746540753732">ແກ້ໄຂໄຟລ໌ກຳນົດຄ່າ</translation>
 <translation id="4394049700291259645">ປິດ​ໃຊ້ງານ</translation>
-<translation id="439817266247065935">ອຸປະກອນຂອງທ່ານປິດເຄື່ອງຢ່າງບໍ່ຖືກຕ້ອງ. ຣິສະຕາດ Linux ເພື່ອໃຊ້ແອັບ Linux.</translation>
+<translation id="439817266247065935">ອຸປະກອນຂອງທ່ານປິດເຄື່ອງຢ່າງບໍ່ຖືກຕ້ອງ. ຣີສະຕາດ Linux ເພື່ອໃຊ້ແອັບ Linux.</translation>
 <translation id="4400367121200150367">ເວັບໄຊທີ່ບໍ່ບັນທຶກລະຫັດຜ່ານໄວ້ຈະປາກົດຢູ່ບ່ອນນີ້</translation>
 <translation id="4400632832271803360">ກົດປຸ່ມຕົວເປີດໃຊ້ຄ້າງໄວ້ເພື່ອປ່ຽນພຶດຕິກຳຂອງປຸ່ມແຖວເທິງ</translation>
 <translation id="4400963414856942668">ທ່ານສາມາດຄລິກໃສ່ຮູບດາວເພື່ອບຸກມາກແຖບໃດໜຶ່ງໄວ້</translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">ບລັອກປັອບອັບໄວ້ແລ້ວ:</translation>
 <translation id="480990236307250886">ເປີດໜ້າຫຼັກ</translation>
 <translation id="4811503964269049987">ຈັດກຸ່ມແຖບທີ່ເລືອກ</translation>
-<translation id="4811818760963189951">ປິດແລ້ວ ເພາະວ່າທ່ານປິດການນຳໃຊ້ການຊິ້ງຂໍ້ມູນປະຫວັດ</translation>
 <translation id="4813136279048157860">ຮູບພາບຂອງຂ້ອຍ</translation>
 <translation id="4813512666221746211">ເຄືອຂ່າຍຜິດພາດ</translation>
 <translation id="4814378367953456825">ປ້ອນຊື່ສຳລັບລາຍນິ້ວມືນີ້</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">ການຕັ້ງຄ່າເນື້ອຫາເພີ່ມເຕີມ</translation>
 <translation id="5042282098504489593">ເປີດການຕັ້ງຄ່າເພື່ອເຊື່ອມຕໍ່ <ph name="USB_DEVICE_NAME" /> ກັບ Linux</translation>
 <translation id="5043913660911154449">ຫຼື ລະບຸ PPD ຂອງເຄື່ອງພິມຂອງທ່ານ <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">ປິດແລ້ວ ເພາະວ່າທ່ານໄດ້ເຂົ້າລະຫັດລັບຂໍ້ມູນທີ່ຊິ້ງຂອງທ່ານດ້ວຍລະຫັດຜ່ານ</translation>
 <translation id="5045550434625856497">ລະ​ຫັດ​ຜ່ານ​ບໍ່​ຖືກ​ຕ້ອງ​</translation>
 <translation id="504561833207953641">ກຳລັງເປີດໃນເຊດຊັນໂປຣແກຣມທ່ອງເວັບທີ່ມີຢູ່ແລ້ວ.</translation>
 <translation id="5047421709274785093">ບລັອກບໍ່ໃຫ້ເວັບໄຊໃຊ້ເຊັນເຊີກວດຈັບການເຄື່ອນໄຫວ ແລະ ແສງ</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">ສະເພາະຜູ້ທີ່ມີວະລີຜ່ານຂອງທ່ານເທົ່ານັ້ນສາມາດອ່ານຂໍ້ມູນທີ່ເຂົ້າລະຫັດໄວ້ຂອງທ່ານໄດ້. ວະລີຜ່ານຈະບໍ່ຖືກສົ່ງຫາ ຫຼື ຮັກສາໄວ້ໂດຍ Google. ຖ້າທ່ານລືມວະລີຜ່ານຂອງທ່ານ ຫຼື ຕ້ອງການປ່ຽນການຕັ້ງຄ່ານີ້, ທ່ານຈະຈຳເປັນຕ້ອງ <ph name="BEGIN_LINK" />ຣີເຊັດການຊິ້ງຂໍ້ມູນ<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">ຍິນດີຕ້ອນຮັບສູ່ຄອບຄົວ <ph name="SHORT_PRODUCT_NAME" />. ນີ້ບໍ່ແມ່ນຄອມພິວເຕີທົ່ວໄປ.</translation>
 <translation id="6358884629796491903">ມັງກອນ</translation>
-<translation id="6360719647236334056">ໃຊ້ປະຫວັດການທ່ອງເວັບໃນ Chrome ຂອງທ່ານເພື່ອປັບແຕ່ງຊອກຫາ, ໂຄສະນາ ແລະ ການບໍລິການອື່ນຂອງ Google ໃຫ້ເປັນແບບສ່ວນຕົວ.</translation>
 <translation id="6361850914223837199">ລາຍ​ລະ​ອຽດ​ຂໍ້​ຜິດ​ພາດ​:</translation>
 <translation id="6362853299801475928">ລາຍ​ງານ​ບັນ​ຫາ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">ໃຫ້ພວກເຮົາຮູ້ວ່າພວກເຮົາກຳລັງເຮັດໄດ້ດີສໍ່າໃດ.</translation>
 <translation id="6759193508432371551">ຕັ້ງຄ່າຄືນເປັນຄ່າໂຮງ​ງານ</translation>
 <translation id="6762833852331690540">ເປີດ</translation>
-<translation id="6764693078871405569">ຍັງລຶບລ້າງຂໍ້ມູນການນຳໃຊ້ (<ph name="URL" />) ນຳອີກ ເຊິ່ງອາດຈະນຳທ່ານອອກຈາກລະບົບ <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">ເລືອກພາສາອື່ນ...</translation>
 <translation id="6767639283522617719">ບໍ່ສາມາດເຂົ້າຮ່ວມໂດເມນໄດ້. ກະລຸນາກວດໃຫ້ແນ່ໃຈວ່າການຕັ້ງຄ່າຖືກຕ້ອງແລ້ວສຳລັບໜ່ວຍງານອົງການ.</translation>
 <translation id="6769712124046837540">ກໍາລັງເພີ່ມເຄື່ອງ​ພິມ ...</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 736f15f..09cd8423 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Skaityti ir keisti visus dabartinės svetainės duomenis, kai suaktyvinama</translation>
 <translation id="1242633766021457174">„<ph name="THIRD_PARTY_TOOL_NAME" />“ nori iš naujo nustatyti nustatymus.</translation>
 <translation id="1243314992276662751">Įkelti</translation>
-<translation id="1243398753772016127">Svetainės negali naudoti jūsų naršymo veiklos skirtingose svetainėse, kad galėtų suasmeninti skelbimus</translation>
 <translation id="1244265436519979884">Šiuo metu vykdomas „Linux“ atkūrimas</translation>
 <translation id="1244303850296295656">Plėtinio klaida</translation>
 <translation id="1246905108078336582">Pašalinti pasiūlymą iš iškarpinės?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Įjungta – tinkinti nustatymai</translation>
 <translation id="1489664337021920575">Pasirinkti kitą parinktį</translation>
 <translation id="1493892686965953381">Laukiama <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Taip pat išvalyti naršymo duomenis (<ph name="URL" />). Tai padarius galite būti atjungti nuo Google.com.</translation>
 <translation id="1495486559005647033">Kitų pasiekiamų įrenginių: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Atgal į skirtuką</translation>
 <translation id="1499271269825557605">Jei neatpažįstate plėtinio arba jei jūsų naršyklė neveikia, kaip numatyta, galite išjungti arba tinkinti plėtinius čia.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ši piktograma bus matoma, kai plėtinys galės veikti dabartiniame puslapyje. Naudokite šį plėtinį spustelėję piktogramą arba paspaudę <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Nustatyti kaip „Chromebox“ susitikimams</translation>
 <translation id="2580889980133367162">Visada leisti <ph name="HOST" /> atsisiųsti kelis failus</translation>
-<translation id="2580924999637585241">Iš viso: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Ilga</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_VERSION" /> versijos „<ph name="PRODUCT_NAME" />“ (platforma „<ph name="PLATFORM_VERSION" />“) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Nepavyko gauti „Kerberos“ bilieto. Bandykite dar kartą arba susisiekite su organizacijos įrenginio administratoriumi. (Klaidos kodas <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Iššokantieji langai užblokuoti:</translation>
 <translation id="480990236307250886">Atidaryti pagrindinį puslapį</translation>
 <translation id="4811503964269049987">Grupuoti pasirinktą skirtuką</translation>
-<translation id="4811818760963189951">Išjungta, nes išjungėte istorijos sinchronizavimą</translation>
 <translation id="4813136279048157860">Mano vaizdai</translation>
 <translation id="4813512666221746211">Tinklo klaida</translation>
 <translation id="4814378367953456825">Įveskite šio kontrolinio kodo pavadinimą</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Papildomi turinio nustatymai</translation>
 <translation id="5042282098504489593">Norėdami prisijungti „<ph name="USB_DEVICE_NAME" />“ prie „Linux“, atidarykite nustatymus</translation>
 <translation id="5043913660911154449">Arba nurodykite spausdintuvo PPD. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Išjungta, nes užšifravote sinchronizuojamus duomenis naudodami slaptafrazę</translation>
 <translation id="5045550434625856497">Neteisingas slaptažodis</translation>
 <translation id="504561833207953641">Atidaroma esamoje naršyklės sesijoje.</translation>
 <translation id="5047421709274785093">Neleisti svetainėms naudoti judesio ir šviesos jutiklių</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />iš naujo nustatyti sinchronizavimą<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Sveikiname prisijungus prie „<ph name="SHORT_PRODUCT_NAME" />“ šeimos. Tai nėra įprastas kompiuteris.</translation>
 <translation id="6358884629796491903">Drakonas</translation>
-<translation id="6360719647236334056">„Chrome“ naršymo istorijos naudojimas Paieškai, skelbimams ir kitoms „Google“ paslaugoms suasmeninti</translation>
 <translation id="6361850914223837199">Išsami klaidos informacija:</translation>
 <translation id="6362853299801475928">&amp;Pateikti ataskaitą apie problemą...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Pateikite atsiliepimų.</translation>
 <translation id="6759193508432371551">Gamykliniai nustatymai</translation>
 <translation id="6762833852331690540">Įjungta</translation>
-<translation id="6764693078871405569">Taip pat išvalyti naršymo duomenis (<ph name="URL" />). Tai padarius būsite atjungti nuo <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Pasirinkti kitą kalbą...</translation>
 <translation id="6767639283522617719">Nepavyko prisijungti prie domeno. Įsitikinkite, kad organizacinio vieneto nustatymai yra teisingi.</translation>
 <translation id="6769712124046837540">Pridedamas spausdintuvas...</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 06d1578..78dde02 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Lasīt un mainīt visus jūsu datus pašreizējā vietnē, kad aktivizēts</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> vēlas atiestatīt jūsu iestatījumus.</translation>
 <translation id="1243314992276662751">Augšupielādēt</translation>
-<translation id="1243398753772016127">Vietnes nevar izmantot jūsu pārlūkošanas darbības dažādās vietnēs, lai personalizētu reklāmas.</translation>
 <translation id="1244265436519979884">Šobrīd notiek Linux atjaunošana</translation>
 <translation id="1244303850296295656">Paplašinājuma kļūda</translation>
 <translation id="1246905108078336582">Vai noņemt ieteikumu no starpliktuves?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Ieslēgta — pielāgoti iestatījumi</translation>
 <translation id="1489664337021920575">Izvēlēties citu iespēju</translation>
 <translation id="1493892686965953381">Gaida <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Arī notīrīt pārlūkošanas datus (<ph name="URL" />). Tādējādi varat tikt izrakstīts no vietnes Google.com.</translation>
 <translation id="1495486559005647033">Vēl <ph name="NUM_PRINTERS" /> pieejamas ierīces.</translation>
 <translation id="1495677929897281669">Atgriezties cilnē</translation>
 <translation id="1499271269825557605">Ja neatpazīstat kādu paplašinājumu vai ja pārlūks nedarbojas, kā paredzēts, šeit varat izslēgt vai pielāgot paplašinājumus.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Šī ikona ir redzama, ja pašlaik atvērtajā lapā var lietot paplašinājumu. Lai lietotu šo paplašinājumu, noklikšķiniet uz ikonas vai nospiediet taustiņu kombināciju <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Iestatīt kā sistēmu “Chromebox sapulcēm”</translation>
 <translation id="2580889980133367162">Vienmēr ļaut saimniekdatoram <ph name="HOST" /> lejupielādēt vairākus failus</translation>
-<translation id="2580924999637585241">Kopā: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Ilgi</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Neizdevās iegūt Kerberos biļeti. Mēģiniet vēlreiz vai sazinieties ar savas organizācijas ierīču administratoru. (Kļūdas kods: <ph name="ERROR_CODE" />.)</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Uznirstošie logi ir bloķēti</translation>
 <translation id="480990236307250886">Atvērt sākumlapu</translation>
 <translation id="4811503964269049987">Ievietot atlasīto cilni grupā</translation>
-<translation id="4811818760963189951">Izslēgts, jo ir atspējota vēstures sinhronizēšana.</translation>
 <translation id="4813136279048157860">Mani attēli</translation>
 <translation id="4813512666221746211">Tīkla kļūda</translation>
 <translation id="4814378367953456825">Ievadiet šī pirksta nospieduma nosaukumu.</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Papildu satura iestatījumi</translation>
 <translation id="5042282098504489593">Atvērt iestatījumus, lai savienotu <ph name="USB_DEVICE_NAME" /> ar Linux</translation>
 <translation id="5043913660911154449">Varat arī norādīt printera PPD. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Izslēgts, jo jūsu sinhronizētie dati tiek šifrēti ar ieejas frāzi.</translation>
 <translation id="5045550434625856497">Nepareiza parole</translation>
 <translation id="504561833207953641">Tiek atvērts esošā pārlūka sesijā.</translation>
 <translation id="5047421709274785093">Neļaut vietnēm izmantot kustību un gaismas sensorus</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />jāatiestata sinhronizācija<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Laipni lūdzam <ph name="SHORT_PRODUCT_NAME" /> datoru saimē! Šis ir kas vairāk nekā vienkārši dators.</translation>
 <translation id="6358884629796491903">Pūķis</translation>
-<translation id="6360719647236334056">Chrome pārlūkošanas vēstures izmantošana, lai personalizētu Meklēšanu, reklāmas un citus Google pakalpojumus</translation>
 <translation id="6361850914223837199">Sīkāka informācija par kļūdu:</translation>
 <translation id="6362853299801475928">&amp;Ziņot par problēmu...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Sniedziet atsauksmes par pakalpojuma darbību.</translation>
 <translation id="6759193508432371551">Rūpnīcas datu atiestatīšana</translation>
 <translation id="6762833852331690540">Ieslēgts</translation>
-<translation id="6764693078871405569">Arī notīrīt pārlūkošanas datus (<ph name="URL" />). Tādējādi tiksiet izrakstīts no vietnes <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Izvēlēties citu valodu…</translation>
 <translation id="6767639283522617719">Nevar pievienoties domēnam. Organizācijas vienības iestatījumiem ir jābūt pareiziem.</translation>
 <translation id="6769712124046837540">Printera pievienošana...</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index c9dcaed..bbed79a 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Прочитајте ги и променете ги сите ваши податоци на тековниот веб-сајт кога ќе биде побарано</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> сака да ги ресетира вашите поставки.</translation>
 <translation id="1243314992276662751">Постави</translation>
-<translation id="1243398753772016127">Сајтовите не може да ја користат вашата активност од прелистувањето на различни сајтови за персонализирање реклами</translation>
 <translation id="1244265436519979884">Обновата на Linux моментално е во тек</translation>
 <translation id="1244303850296295656">Грешка на наставка</translation>
 <translation id="1246905108078336582">Дали да се отстрани предлогот од привремената меморија?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Вклучено - приспособени поставки</translation>
 <translation id="1489664337021920575">Изберете друга опција</translation>
 <translation id="1493892686965953381">Се чека <ph name="LOAD_STATE_PARAMETER" />…</translation>
-<translation id="1494438840282430403">Избришете ги и податоците од прелистувањето (<ph name="URL" />), а тоа може да ве одјави од Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> други достапни уреди.</translation>
 <translation id="1495677929897281669">Назад на картичката</translation>
 <translation id="1499271269825557605">Ако не ја препознавате екстензијата или ако вашиот прелистувач не работи според очекувањата, може да ги исклучите или приспособите екстензиите тука.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Иконата ќе се гледа кога наставката може да дејствува на тековната страница. Користете ја наставката со кликање на иконата или со притискање <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Поставете како „Chromebox за состаноци“</translation>
 <translation id="2580889980133367162">Секогаш дозволи <ph name="HOST" /> да презема повеќе датотеки</translation>
-<translation id="2580924999637585241">Вкупно: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Долго</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Не можеше да се преземе билетот на Kerberos. Обидете се повторно или контактирајте со администраторот на уредот во вашата организација. (Код за грешка <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Блокирани скокачки прозорци:</translation>
 <translation id="480990236307250886">Отвори ја почетната страница</translation>
 <translation id="4811503964269049987">Групирајте ја избраната картичка</translation>
-<translation id="4811818760963189951">Исклучено бидејќи ја оневозможивте синхронизацијата на историјата</translation>
 <translation id="4813136279048157860">Мои слики</translation>
 <translation id="4813512666221746211">Грешка на мрежа</translation>
 <translation id="4814378367953456825">Внесете име за отпечатоков</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Дополнителни поставки за содржини</translation>
 <translation id="5042282098504489593">Отворете „Поставки“ за да го поврзете <ph name="USB_DEVICE_NAME" /> со Linux</translation>
 <translation id="5043913660911154449">Или одредете го PPD на вашиот печатач <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Исклучено бидејќи синхронизираните податоци ги шифриравте со лозинка</translation>
 <translation id="5045550434625856497">Погрешна лозинка</translation>
 <translation id="504561833207953641">Се отвора во постојната сесија на прелистувачот.</translation>
 <translation id="5047421709274785093">Блокирај го користењето сензори за движење и светлина на сајтовите</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Само лицата што ја знаат вашата лозинка може да ги прочитаат шифрираните податоци. Лозинката не се испраќа до Google ниту пак се складира. Ако ја заборавите, ќе треба да ја <ph name="BEGIN_LINK" />ресетирате синхронизацијата<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Добре дојдовте во семејството на <ph name="SHORT_PRODUCT_NAME" />. Ова не е обичен компјутер.</translation>
 <translation id="6358884629796491903">Змеј</translation>
-<translation id="6360719647236334056">Користете ја историјата на прелистување на Chrome за да ги персонализирате „Пребарувањето“, рекламите и другите услуги на Google</translation>
 <translation id="6361850914223837199">Детали за грешка:</translation>
 <translation id="6362853299801475928">&amp;Пријави проблем…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Оценете ја нашата работа.</translation>
 <translation id="6759193508432371551">Ресетирање до фабрички вредности</translation>
 <translation id="6762833852331690540">Вклучено</translation>
-<translation id="6764693078871405569">Избришете ги и податоците од прелистувањето (<ph name="URL" />), а тоа ќе ве одјави од <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Изберете друг јазик…</translation>
 <translation id="6767639283522617719">Не може да се приклучи на доменот. Проверете дали поставките се точни за организациската единица.</translation>
 <translation id="6769712124046837540">Се додава печатач…</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 66843b4..fea95063 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">നിർദ്ദേശിക്കപ്പെടുമ്പോൾ നിലവിലെ വെബ്‌സൈറ്റിലെ നിങ്ങളുടെ ഡാറ്റ മുഴുവൻ വായിച്ച് അതിൽ മാറ്റം വരുത്തുക</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />, നിങ്ങളുടെ ക്രമീകരണം റീസെറ്റ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു.</translation>
 <translation id="1243314992276662751">അപ്‌ലോഡുചെയ്യുക</translation>
-<translation id="1243398753772016127">പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ വ്യത്യസ്ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി ഉപയോഗിക്കാൻ സൈറ്റുകൾക്കാവില്ല</translation>
 <translation id="1244265436519979884">Linux പുനഃസ്ഥാപിക്കൽ നിലവിൽ പുരോഗതിയിലാണ്</translation>
 <translation id="1244303850296295656">വിപുലീകരണ പിശക്</translation>
 <translation id="1246905108078336582">ക്ലിപ്പ്ബോർഡിൽ നിന്ന് നിർദ്ദേശം നീക്കം ചെയ്യണോ?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">ഇഷ്‌ടാനുസൃത ക്രമീകരണം ഓണാക്കുക</translation>
 <translation id="1489664337021920575">മറ്റൊരു ഓപ്ഷൻ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />-നായി കാത്തിരിക്കുന്നു...</translation>
-<translation id="1494438840282430403">Google.com-ൽ നിന്ന് നിങ്ങളെ സൈൻ ഔട്ട് ചെയ്‌തേക്കാവുന്ന ബ്രൗസിംഗ് ഡാറ്റയും (<ph name="URL" />) മായ്‌ക്കുക.</translation>
 <translation id="1495486559005647033">ലഭ്യമായ മറ്റ് <ph name="NUM_PRINTERS" /> ഉപകരണങ്ങ‌ൾ.</translation>
 <translation id="1495677929897281669">ടാബിലേക്ക് മടങ്ങുക</translation>
 <translation id="1499271269825557605">നിങ്ങളൊരു വിപുലീകരണത്തെ തിരിച്ചറിയുന്നില്ലെങ്കിലോ നിങ്ങളുടെ ബ്രൗസർ പ്രതീക്ഷിച്ചത് പോലെ പ്രവർത്തിക്കുന്നില്ലെങ്കിലോ നിങ്ങൾക്കത് ഓഫാക്കാം, അല്ലെങ്കിൽ വിപുലീകരണങ്ങൾ ഇവിടെ ഇഷ്ടാനുസൃതമാക്കാം.</translation>
@@ -515,6 +513,7 @@
 <translation id="1697686431566694143">ഫയൽ എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="1698122934742150150">നിലവിലെ അദൃശ്യ സെഷന് മാത്രം</translation>
 <translation id="1698650002254827833">ആപ്പുകളുടെ ലിസ്‌റ്റ് ലോഡ് ചെയ്യാനാവില്ല. വീണ്ടും ശ്രമിക്കുക.</translation>
+<translation id="1700079447639026019">ഒരിക്കലും കുക്കികൾ ഉപയോഗിക്കാനാവാത്ത സൈറ്റുകൾ</translation>
 <translation id="1701062906490865540">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation>
 <translation id="1703331064825191675">നിങ്ങളുടെ പാസ്‌വേഡുകളെക്കുറിച്ച് ഇനി ആശങ്ക വേണ്ട</translation>
 <translation id="1704970325597567340"><ph name="DATE" />-ന് സുരക്ഷാ പരിശോധന നടത്തി</translation>
@@ -735,6 +734,7 @@
 <translation id="1990512225220753005">ഈ പേജിൽ കുറുക്കുവഴികൾ കാണിക്കരുത്</translation>
 <translation id="1992397118740194946">സജ്ജമാക്കിയിട്ടില്ല</translation>
 <translation id="1994173015038366702">സൈറ്റ് URL</translation>
+<translation id="1995916364271252349">സൈറ്റുകൾക്ക് എന്തൊക്കെ വിവരങ്ങൾ ഉപയോഗിക്കാനാവുമെന്നും കാണിക്കാനാവുമെന്നും നിയന്ത്രിക്കുന്നു (ലൊക്കേഷൻ, ക്യാമറ, പോപ്പ്-അപ്പുകൾ എന്നിവയും മറ്റും)</translation>
 <translation id="1997484222658892567">നിങ്ങളുടെ ലോക്കൽ കമ്പ്യൂട്ടറിൽ ശാശ്വതമായി വലിയ ഡാറ്റ സംഭരിക്കാൻ <ph name="URL" />ആഗ്രഹിക്കുന്നു</translation>
 <translation id="1997616988432401742">നിങ്ങളുടെ സർട്ടിഫിക്കറ്റുകൾ</translation>
 <translation id="1999115740519098545">തുടക്കത്തില്‍</translation>
@@ -990,6 +990,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# വിന്‍ഡോ അടയ്ക്കുക}other{# വിൻഡോകൾ അടയ്ക്കുക}}</translation>
 <translation id="2335122562899522968">ഈ പേജ് കുക്കികളെ സജ്ജമാക്കുന്നു.</translation>
 <translation id="2336228925368920074">എല്ലാ ടാബുകളും ബുക്ക്‌മാര്‍‌ക്ക് ചെയ്യുക...</translation>
+<translation id="2336376423977300504">വിൻ‌ഡോകൾ‌ അടയ്‌ക്കുമ്പോൾ‌ എല്ലായ്‌പ്പോഴും കുക്കികൾ‌ മായ്‌ക്കുക</translation>
 <translation id="2336381494582898602">പവർവാഷ്</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> ജോടിയാക്കാൻ താൽപ്പര്യപ്പെടുന്നു</translation>
 <translation id="2342740338116612727">ബുക്ക്‌മാര്‍ക്കുകള്‍ ചേര്‍ത്തു</translation>
@@ -1184,7 +1185,6 @@
 <translation id="2575247648642144396">വിപുലീകരണത്തിന് നിലവിലെ പേജിൽ പ്രവർത്തിക്കാൻ കഴിയുമ്പോൾ ഈ ഐക്കൺ ദൃശ്യമാകും. ഐക്കണിൽ ക്ലിക്ക് ചെയ്‌തുകൊണ്ടോ <ph name="EXTENSION_SHORTCUT" /> അമർത്തിക്കൊണ്ടോ ഈ വിപുലീകരണം ഉപയോഗിക്കുക</translation>
 <translation id="257779572837908839">മീറ്റിംഗിനുള്ള Chromebox സജ്ജമാക്കുക</translation>
 <translation id="2580889980133367162">എല്ലായ്‌പ്പോഴും ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ <ph name="HOST" />-നെ അനുവദിക്കുക</translation>
-<translation id="2580924999637585241">ആകെ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ദൈർഘ്യമേറിയ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (പ്ലാറ്റ്‌ഫോം <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos ടിക്കറ്റ് ലഭ്യമാക്കാനായില്ല. വീണ്ടും ശ്രമിക്കുകയോ നിങ്ങളുടെ സ്ഥാപനത്തിന്റെ ഉപകരണ അഡ്‌മിനുമായി ബന്ധപ്പെടുകയോ ചെയ്യുക. (പിശക് കോഡ് <ph name="ERROR_CODE" />).</translation>
@@ -1732,6 +1732,7 @@
 <translation id="3317459757438853210">രണ്ട്-വശങ്ങളുള്ള</translation>
 <translation id="3317678681329786349">ക്യാമറയും മൈക്രോഫോണും ബ്ലോക്ക് ചെയ്‌‌തു</translation>
 <translation id="3319048459796106952">പുതിയ &amp;അദൃശ്യ വിൻഡോ</translation>
+<translation id="3320630259304269485">സുരക്ഷിത ബ്രൗസിംഗും (അപകടകരമായ സൈറ്റുകളിൽ നിന്നുള്ള പരിരക്ഷ) മറ്റ് സുരക്ഷാ ക്രമീകരണവും</translation>
 <translation id="3323521181261657960">ബോണസ്! നിങ്ങൾക്ക് കൂടുതൽ സ്‌ക്രീൻ സമയം ലഭിച്ചിരിക്കുന്നു</translation>
 <translation id="3325910708063135066">Mac സിസ്‌റ്റം മുൻഗണനകളിൽ ക്യാമറയും മൈക്രോഫോണും ഓഫാക്കി</translation>
 <translation id="3328489342742826322">ബാക്കപ്പിൽ നിന്ന് പുനഃസ്ഥാപിക്കുന്നത്, നിങ്ങളുടെ നിലവിലുള്ള Linux ആപ്പുകളെയും നിങ്ങളുടെ Linux ഫയലുകളുടെ ഫോൾഡറിലെ ഡാറ്റയും ഇല്ലാതാക്കും.</translation>
@@ -1851,6 +1852,7 @@
 <translation id="3487007233252413104">അജ്ഞാത പ്രവർത്തനം</translation>
 <translation id="348780365869651045">AppCache എന്നതിനായി കാത്തിരിക്കുന്നു...</translation>
 <translation id="3488065109653206955">ഭാഗികമായി പ്രവര്‍ത്തനക്ഷമമാക്കി</translation>
+<translation id="3489025949017384019">പല സൈറ്റുകളും ശരിയായി പ്രവർത്തിച്ചേക്കില്ല</translation>
 <translation id="3492788708641132712">സമന്വയം പ്രവർത്തിക്കുന്നില്ല. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നത് പരീക്ഷിച്ചുനോക്കൂ.</translation>
 <translation id="3493486281776271508">ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്</translation>
 <translation id="3493881266323043047">സാധുത</translation>
@@ -2006,6 +2008,7 @@
 <translation id="3688526734140524629">ചാനൽ മാറ്റുക</translation>
 <translation id="3688578402379768763">അപ്‌ടുഡാറ്റാണ്</translation>
 <translation id="3688794912214798596">ഭാഷകൾ മാറ്റുക...</translation>
+<translation id="3690369331356918524">പാസ്‌വേഡുകൾ, ഡാറ്റാ ലംഘനത്തിന്റെ ഭാഗമായി വെളിപ്പെട്ടാൽ നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുന്നു</translation>
 <translation id="3691231116639905343">കീബോഡ് ആപ്പുകൾ</translation>
 <translation id="3691267899302886494">നിങ്ങളുടെ സ്‌ക്രീൻ പങ്കിടാൻ <ph name="HOST" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="369135240373237088">സ്‌കൂൾ അക്കൗണ്ട് ഉപയോഗിച്ച് വീണ്ടും സൈൻ ഇൻ ചെയ്യുക</translation>
@@ -2144,6 +2147,7 @@
 <translation id="3841964634449506551">പാസ്‌വേഡ് അസാധുവാണ്</translation>
 <translation id="3842552989725514455">Serif font </translation>
 <translation id="3846116211488856547">വെബ്സൈറ്റുകളും Android ആപ്പുകളും മറ്റും വികസിപ്പിച്ചെടുക്കാൻ ടൂളുകൾ നേടുക. Linux ഇൻസ്‌റ്റാൾ ചെയ്യുമ്പോൾ <ph name="DOWNLOAD_SIZE" /> ഡാറ്റ ഡൗൺലോഡ് ചെയ്യപ്പെടും.</translation>
+<translation id="3847319713229060696">എല്ലാവർക്കുമായി വെബിലെ സുരക്ഷ മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation>
 <translation id="385051799172605136">പിന്നോട്ട്</translation>
 <translation id="3850914401008572843">സിസ്‌റ്റം ഫയലുകൾ അടങ്ങിയിരിക്കുന്നതിനാൽ <ph name="ORIGIN" /> എന്നതിന് ഈ ഫോൾഡർ തുറക്കാനാവില്ല</translation>
 <translation id="3851428669031642514">സുരക്ഷിതമല്ലാത്ത സ്‌ക്രിപ്‌റ്റുകൾ ലോഡ് ചെയ്യുക</translation>
@@ -2625,6 +2629,7 @@
 <translation id="4534661889221639075">വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="4535127706710932914">ഡിഫോൾട്ട് പ്രൊഫൈൽ</translation>
 <translation id="4535767533210902251">വിരലടയാള സെൻസർ നിങ്ങളുടെ കീബോർഡിൽ മുകളിലെ വലതുഭാഗത്തെ കീയാണ്. ഏതെങ്കിലും വിരലുകൊണ്ട് അതിൽ മൃദുവായി സ്‌പർശിക്കുക.</translation>
+<translation id="4536140153723794651">എല്ലായ്‌പ്പോഴും കുക്കികൾ ഉപയോഗിക്കാനാവുന്ന സൈറ്റുകൾ</translation>
 <translation id="4538417792467843292">പദം ഇല്ലാതാക്കുക</translation>
 <translation id="4538684596480161368"><ph name="HOST" /> എന്നതില്‍ എല്ലായ്‌പ്പോഴും ഈ അൺസാൻഡ്‌ബോക്‌സ് ചെയ്‌ത പ്ലഗിന്നുകളെ തടയുക</translation>
 <translation id="4538792345715658285">എന്റർപ്രൈസ് നയത്തിനാൽ ഇൻസ്റ്റാൾ ചെയ്യപ്പെട്ടത്</translation>
@@ -2722,6 +2727,7 @@
 <translation id="4665446389743427678"><ph name="SITE" /> സംഭരിച്ച മുഴുവൻ ഡാറ്റയും ഇല്ലാതാക്കപ്പെടും.</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> പ്രവർത്തനക്ഷമമാക്കാൻ ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="4670064810192446073">വെർച്വൽ റിയാലിറ്റി</translation>
+<translation id="4672879467403304774">നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുമ്പോൾ Chrome-ലും മറ്റ് Google ആപ്പുകളിലും നിങ്ങളെ സുരക്ഷിതരാക്കുന്നു</translation>
 <translation id="46733273239502219">ഇൻസ്‍റ്റാൾ ചെയ്‍ത ആപ്പുകളിലുള്ള ഓഫ്‍ലൈൻ ഡാറ്റയും മായ്‌ക്കും</translation>
 <translation id="4673442866648850031">സ്റ്റൈലസ് നീക്കംചെയ്യുമ്പോൾ സ്റ്റൈലസ് ടൂളുകൾ തുറക്കുക</translation>
 <translation id="4677772697204437347">GPU മെമ്മറി</translation>
@@ -2806,7 +2812,6 @@
 <translation id="4808667324955055115">പോപ്-അപ്പുകൾ ബ്ലോക്ക് ചെയ്തു</translation>
 <translation id="480990236307250886">ഹോംപേജ് തുറക്കുക</translation>
 <translation id="4811503964269049987">തിരഞ്ഞെടുത്ത ഗ്രൂപ്പ് ടാബ്</translation>
-<translation id="4811818760963189951">നിങ്ങൾ ചരിത്രം സമന്വയിപ്പിക്കൽ പ്രവർത്തനരഹിതമാക്കിയതിനാൽ ഓഫാക്കി</translation>
 <translation id="4813136279048157860">എന്റെ ചിത്രങ്ങൾ</translation>
 <translation id="4813512666221746211">നെറ്റ്‌വര്‍ക്ക് പിശക്</translation>
 <translation id="4814378367953456825">ഈ ഫിംഗർപ്രിന്റിന് ഒരു പേര് നൽകുക</translation>
@@ -2975,7 +2980,6 @@
 <translation id="5040823038948176460">അധിക ഉള്ളടക്ക ക്രമീകരണം</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> Linux-ലേക്ക് കണക്റ്റ് ചെയ്യാൻ ക്രമീകരണം തുറക്കുക</translation>
 <translation id="5043913660911154449">അല്ലെങ്കിൽ നിങ്ങളുടെ പ്രിന്റർ PPD വ്യക്തമാക്കുക <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">നിങ്ങളുടെ സമന്വയ ഡാറ്റ ഒരു പാസ്‌ഫ്രെയ്‌സ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്‌തതിനാൽ ഓഫാക്കി</translation>
 <translation id="5045550434625856497">പാസ്‍വേഡ് തെറ്റാണ്</translation>
 <translation id="504561833207953641">നിലവിലുള്ള ബ്രൗസര്‍ സെഷനില്‍ തുറക്കുന്നു.</translation>
 <translation id="5047421709274785093">ചലന സെൻസറുകളും വെളിച്ച സെൻസറുകളും ഉപയോഗിക്കുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
@@ -3140,6 +3144,7 @@
 <translation id="5275352920323889391">നായ</translation>
 <translation id="527605982717517565"><ph name="HOST" /> ല്‍‌ എപ്പോഴുംJavaScript അനുവദിക്കുക</translation>
 <translation id="5280174558369304332">വിപുലീകരണങ്ങൾ നീക്കം ചെയ്യപ്പെടും:</translation>
+<translation id="5280243692621919988">വിൻ‌ഡോകൾ‌ അടയ്‌ക്കുമ്പോൾ‌ കുക്കികളും സൈറ്റ് ഡാറ്റയും മായ്‌ക്കുക</translation>
 <translation id="5280426389926346830">കുറുക്കുവഴി സൃഷ്‌ടിക്കണോ?</translation>
 <translation id="528208740344463258">Android ആപ്പുകൾ ഡൗൺലോഡ് ചെയ്‌ത് ഉപയോഗിക്കാൻ ആദ്യം നിങ്ങൾ ഈ ആവശ്യമായ അപ്‌ഡേറ്റ് ഇൻസ്‌റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. <ph name="DEVICE_TYPE" /> അപ്ഡേറ്റ് ചെയ്യുമ്പോൾ, നിങ്ങൾക്കത് ഉപയോഗിക്കാനാവില്ല. ഇൻസ്റ്റലേഷൻ പൂർത്തിയായി കഴിയുമ്പോൾ, നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> റീസ്റ്റാർട്ട് ചെയ്യും.</translation>
 <translation id="5282733140964383898">നിങ്ങളുടെ ബ്രൗസിംഗ് ട്രാഫിക്കിൽ ഒരു അഭ്യർത്ഥന ഉൾപ്പെടുത്തുമെന്നാണ് "ട്രാക്ക് ചെയ്യരുത്" പ്രവർത്തനക്ഷമമാക്കുന്നതിലൂടെ അർത്ഥമാക്കുന്നത്. ഒരു വെബ്‌സൈറ്റ്, അഭ്യർത്ഥനയിന്മേൽ പ്രതികരിക്കുന്നോ എന്നതിനേയും അഭ്യർത്ഥന വ്യാഖ്യാനിക്കുന്നതെങ്ങനെ എന്നതിനേയും ആശ്രയിച്ചുള്ളതായിരിക്കും ഏതൊരു ഇഫക്റ്റും. ഉദാഹരണത്തിന്, ചില വെബ്‌സൈറ്റുകൾ, നിങ്ങൾ സന്ദർശിച്ച മറ്റ് വെബ്‌സൈറ്റുകളെ അടിസ്ഥാനമാക്കിയുള്ളതല്ലാത്ത പരസ്യങ്ങൾ കാണിച്ച് ഈ അഭ്യർത്ഥനയോട് പ്രതികരിച്ചേക്കാം. നിരവധി വെബ്‌സൈറ്റുകൾ തുടർന്നും നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റ ശേഖരിക്കുകയും ഉപയോഗിക്കുകയും ചെയ്യും - ഉദാഹരണത്തിന് സുരക്ഷ മെച്ചപ്പെടുത്തുന്നതിനും അവരുടെ വെബ്‌സൈറ്റുകളിൽ ഉള്ളടക്കവും സേവനങ്ങളും പരസ്യങ്ങളും നൽകുന്നതിനും റിപ്പോർട്ടിംഗ് സ്ഥിതിവിവരക്കണക്കുകൾ സൃഷ്‌ടിക്കുന്നതിനും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
@@ -3953,7 +3958,6 @@
 <translation id="63566973648609420">നിങ്ങളുടെ പാസ്‌ഫ്രെയ്‌സുള്ള ഒരാൾക്ക് മാത്രമേ എൻക്രിപ്‌റ്റ് ചെയ്‌ത ഡാറ്റ വായിക്കാനാവൂ. Google-ലേക്ക് പാസ്‌ഫ്രെയ്‌സ് അയയ്‌ക്കുകയോ Google അത് സൂക്ഷിക്കുകയോ ചെയ്യില്ല. പാസ്‌ഫ്രെയ്‌സ് മറന്നുപോയെങ്കിലോ ഈ ക്രമീകരണം മാറ്റണമെങ്കിലോ നിങ്ങൾ <ph name="BEGIN_LINK" />സമന്വയിപ്പിക്കൽ റീസെറ്റ് ചെയ്യേണ്ടതുണ്ട്<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> കുടുംബത്തിലേക്ക് സ്വാഗതം. ഇതൊരു സാധാരണ കമ്പ്യൂട്ടറല്ല.</translation>
 <translation id="6358884629796491903">ഡ്രാഗൺ</translation>
-<translation id="6360719647236334056">തിരയലും പരസ്യങ്ങളും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ നിങ്ങളുടെ Chrome ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിക്കുക</translation>
 <translation id="6361850914223837199">പിശക് വിശദാംശങ്ങൾ‌:</translation>
 <translation id="6362853299801475928">&amp;ഒരു പ്രശ്നം റിപ്പോര്‍ട്ടുചെയ്യുക...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4231,10 +4235,10 @@
 <translation id="6758056191028427665">ഞങ്ങളുടെ പ്രവർത്തനത്തെക്കുറിച്ചുള്ള അഭിപ്രായം അറിയിക്കൂ.</translation>
 <translation id="6759193508432371551">ഫാക്‌ടറി റീസെറ്റ് ചെയ്യൽ</translation>
 <translation id="6762833852331690540">ഓണാണ്</translation>
-<translation id="6764693078871405569"><ph name="DOMAIN" /> എന്നതിൽ നിന്ന് നിങ്ങളെ സൈൻ ഔട്ട് ചെയ്യുന്ന ബ്രൗസിംഗ് ഡാറ്റയും (<ph name="URL" />) മായ്‌ക്കുക.</translation>
 <translation id="6767566652486411142">മറ്റൊരു ഭാഷ തിരഞ്ഞെടുക്കുക...</translation>
 <translation id="6767639283522617719">ഡൊമെയ്‌ൻ ബന്ധിപ്പിക്കാനാവില്ല. ഓർഗനൈസേഷണൽ യൂണിറ്റിനുള്ള ക്രമീകരണം ശരിയാണെന്ന് ഉറപ്പാക്കുക.</translation>
 <translation id="6769712124046837540">പ്രിന്റർ ചേർക്കുന്നു...</translation>
+<translation id="6770602306803890733">നിങ്ങൾക്കും വെബിലെ എല്ലാവർക്കും സുരക്ഷ മെച്ചപ്പെടുത്തുന്നു</translation>
 <translation id="6770664076092644100">NFC വഴി പരിശോധിച്ചുറപ്പിക്കുക</translation>
 <translation id="6771503742377376720">ഒരു സര്‍ട്ടിഫിക്കറ്റ് അതോറിറ്റി ആണ്</translation>
 <translation id="6772339735733515807">നിങ്ങളുടെ വിപുലീകരണങ്ങൾ മാനേജ് ചെയ്യുക</translation>
@@ -4260,6 +4264,7 @@
 <translation id="6798578729981748444">ഇമ്പോർട്ട് ചെയ്യൽ പൂർത്തിയാക്കാൻ, എല്ലാ Firefox വിന്‍ഡോകളും അടയ്ക്കുക.</translation>
 <translation id="6798780071646309401">ക്യാപ്‌സ് ലോക്ക് ഓണാണ്</translation>
 <translation id="6798954102094737107">പ്ലഗിൻ: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">പൊതു ക്രമീകരണം</translation>
 <translation id="6801435275744557998">ടച്ച്സ്‌ക്രീൻ കാലിബറേറ്റ് ചെയ്യുക</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">ശരി</translation>
@@ -4378,6 +4383,8 @@
 <translation id="6965382102122355670">ശരി</translation>
 <translation id="6965648386495488594">പോര്‍ട്ട്</translation>
 <translation id="6965978654500191972">ഉപകരണം</translation>
+<translation id="6966201992886493384">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാവുന്നതാണ്, ഉദാഹരണത്തിന്, സൈൻ ഇൻ ചെയ്‌ത നിലയിൽ തുടരാനോ ഷോപ്പിംഗ് കാർട്ടിലെ ഇനങ്ങൾ ഓർമ്മിക്കാനോ പോലുള്ള കാര്യങ്ങൾക്ക്</translation>
+<translation id="696780070563539690">വ്യത്യസ്‌ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി കാണാൻ സൈറ്റുകൾക്ക് നിങ്ങളുടെ കുക്കികൾ ഉപയോഗിക്കാനാവില്ല, ഉദാഹരണത്തിന്, പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ</translation>
 <translation id="6968288415730398122">സ്‌ക്രീൻ ലോക്ക് കോൺഫിഗർ ചെയ്യാൻ പാസ്‌വേഡ് നൽകുക</translation>
 <translation id="6970480684834282392">സ്റ്റാർട്ടപ്പ് തരം</translation>
 <translation id="6970856801391541997">പ്രിന്‍റ് പ്രത്യേക പേജുകൾ</translation>
@@ -4787,6 +4794,7 @@
 <translation id="7507207699631365376">ഈ ദാതാവിന്റെ <ph name="BEGIN_LINK" />സ്വകാര്യതാ നയം<ph name="END_LINK" /> കാണുക</translation>
 <translation id="7507930499305566459">സ്റ്റാറ്റസ് റെസ്‌പോണ്ടര്‍‌ സര്‍‌ട്ടിഫിക്കറ്റ്</translation>
 <translation id="7508054832109420082">പ്രിൻ്ററുകൾക്ക് ആക്‌സസ് നൽകുക</translation>
+<translation id="751120035300339">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാനാവില്ല, ഉദാഹരണത്തിന്, സൈൻ ഇൻ ചെയ്‌ത നിലയിൽ തുടരാനോ ഷോപ്പിംഗ് കാർട്ടിലെ ഇനങ്ങൾ ഓർമ്മിക്കാനോ</translation>
 <translation id="7513029293694390567">സംരക്ഷിച്ച ക്രെഡൻഷ്യലുകൾ ഉപയോഗിച്ച് വെബ്‌സൈറ്റുകളിലേക്ക് സ്വയം സൈൻ ഇൻ ചെയ്യുക. പ്രവർത്തനരഹിതമാണെങ്കിൽ, ഒരു വെബ്‌സൈറ്റിലേക്ക് സൈൻ ഇൻ ചെയ്യുന്നതിന് മുമ്പ് ഓരോ തവണയും നിങ്ങളോട് സ്ഥിരീകരിക്കാൻ ആവശ്യപ്പെടും.</translation>
 <translation id="7514239104543605883">നിങ്ങളുടെ ഉപകരണത്തിലേക്ക് പകർത്തുക</translation>
 <translation id="7514365320538308">ഡൗൺലോഡ് ചെയ്യുക</translation>
@@ -5417,6 +5425,7 @@
 <translation id="8320459152843401447">നിങ്ങളുടെ മുഴുവൻ സ്‌ക്രീനും</translation>
 <translation id="8322814362483282060">നിങ്ങളുടെ മൈക്രോഫോൺ ആക്‌സസ്സുചെയ്യുന്നതിൽ നിന്ന് ഈ പേജിനെ തടഞ്ഞിരിക്കുന്നു.</translation>
 <translation id="8323167517179506834">URL ടൈപ്പുചെയ്യുക</translation>
+<translation id="8324784016256120271">വ്യത്യസ്‌ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി കാണാൻ സൈറ്റുകൾക്ക് കുക്കികൾ ഉപയോഗിക്കാനാവും, ഉദാഹരണത്തിന്, പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ</translation>
 <translation id="8326478304147373412">PKCS #7, സര്‍‌ട്ടിഫിക്കറ്റ് ചെയിന്‍‌</translation>
 <translation id="8327039559959785305">Linux ഫയലുകൾ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="8327676037044516220">അനുമതി, ഉള്ളടക്ക ക്രമീകരണം</translation>
@@ -5472,6 +5481,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> നെറ്റ്‍വർക്ക്, കണക്റ്റ് ചെയ്യുന്നു</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">ആദ്യം ചോദിക്കുക (ശുപാർശ ചെയ്‌തത്)</translation>
+<translation id="8417573335434189196">അപകടകരമായ വെബ്‌സൈറ്റുകൾ ഡൗൺലോഡുകൾ അല്ലെങ്കിൽ വിപുലീകരണങ്ങളിൽ നിന്ന് നിങ്ങളെ പരിരക്ഷിക്കില്ല. Chrome ഈ ക്രമീകരണം ശുപാർശ ചെയ്യുന്നില്ല.</translation>
 <translation id="8418445294933751433">&amp;ടാബായി കാണിക്കുക</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' എന്നതിനുള്ള തിരയൽ ഫലം</translation>
 <translation id="8419368276599091549">നിങ്ങളുടെ <ph name="DEVICE_TYPE" />-ലേക്ക് സ്വാഗതം!</translation>
@@ -5637,6 +5647,7 @@
 <translation id="8642947597466641025">പാഠത്തെ വലുതാക്കുക</translation>
 <translation id="8644655801811752511">ഈ സുരക്ഷാ കീ പുനഃസജ്ജീകരിക്കാനാകില്ല. സുരക്ഷാ കീ ബന്ധിപ്പിച്ച ഉടൻ അത് പുനഃസജ്ജീകരിക്കാൻ ശ്രമിക്കുക.</translation>
 <translation id="8645354835496065562">സെൻസർ ആക്‌സസ് അനുവദിക്കുന്നത് തുടരുക</translation>
+<translation id="8645920082661222035">അപകടകരമായ ഇവന്റുകൾ നടക്കുന്നതിന് മുമ്പ് അവ പ്രവചിക്കുകയും നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകുകയും ചെയ്യുന്നു</translation>
 <translation id="8647834505253004544">ശരിയായ വെബ് വിലാസമല്ല</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> അല്ലെങ്കിൽ <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">നിങ്ങളുടെ പഴയ പ്രൊഫൈൽ ഇനിയങ്ങോട്ട് ആക്സസ് ചെയ്യാനാകില്ലെങ്കിലും നിങ്ങൾക്കത് ഇല്ലാതാക്കാം.</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb
index ee29b08..1dcbe1d 100644
--- a/chrome/app/resources/generated_resources_mn.xtb
+++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Одоогийн вэбсайтыг ажиллуулж байх үед бүх өгөгдлөө унших, өөрчлөх</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> таны тохиргоог шинэчлэхийг хүсэж байна.</translation>
 <translation id="1243314992276662751">Байршуул</translation>
-<translation id="1243398753772016127">Сайтууд зарыг хувийн болгохын тулд өөр өөр сайт дээрх таны хөтчийн үйл ажиллагааг ашиглах боломжгүй</translation>
 <translation id="1244265436519979884">Linux-г одоогоор сэргээж байна</translation>
 <translation id="1244303850296295656">Өргөтгөлийн алдаа</translation>
 <translation id="1246905108078336582">Түр санах ойгоос зөвлөмжийг устгах уу?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Асаалттай - өөрчлөх тохиргоо</translation>
 <translation id="1489664337021920575">Өөр сонголтыг сонгох</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />-ыг хүлээж байна...</translation>
-<translation id="1494438840282430403">Мөн хайлтын өгөгдлийг (<ph name="URL" />) устгах. Ингэснээр таныг Google.com-с гаргаж болзошгүй.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> бусад боломжтой төхөөрөмжүүд.</translation>
 <translation id="1495677929897281669">Таб руу буцах</translation>
 <translation id="1499271269825557605">Хэрэв та өргөтгөлийг танихгүй эсвэл таны хөтөч сайн ажиллахгүй байвал та өргөтгөлийг эндээс унтраах эсвэл өөрчлөх боломжтой.</translation>
@@ -1185,7 +1183,6 @@
 <translation id="2575247648642144396">Өргөтгөл нь тухайн хуудсанд ажиллахад тэмдэглэгээ харагдана. Энэхүү тэмдэглэгээн дээр дарж эсвэл <ph name="EXTENSION_SHORTCUT" /> дээр дарснаар өргөлтгөлийг ашиглах боломжтой.</translation>
 <translation id="257779572837908839">Уулзалтад зориулсан Chromebox-р тохируулах</translation>
 <translation id="2580889980133367162"><ph name="HOST" />-ийг хэд хэдэн файл татаж авахыг үргэлж зөвшөөрөх</translation>
-<translation id="2580924999637585241">Нийт: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Урт</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /><ph name="PRODUCT_VERSION" /> (Платформ <ph name="PLATFORM_VERSION" /> ) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos тасалбарыг авч чадсангүй. Дахин оролдоно уу эсвэл байгууллагынхаа төхөөрөмжийн админтай холбогдоно уу. (Алдааны код <ph name="ERROR_CODE" />).</translation>
@@ -2813,7 +2810,6 @@
 <translation id="4808667324955055115">Попапыг хориглосон.</translation>
 <translation id="480990236307250886">Нүүр хуудсыг нээх</translation>
 <translation id="4811503964269049987">Сонгосон табыг бүлэгт нэмэх</translation>
-<translation id="4811818760963189951">Та түүхийг синк хийхийг идэвхгүй болгосон тул унтраасан</translation>
 <translation id="4813136279048157860">Миний зураг</translation>
 <translation id="4813512666221746211">Сүлжээний алдаа</translation>
 <translation id="4814378367953456825">Энэ хурууны хээний нэрийг оруулна уу</translation>
@@ -2982,7 +2978,6 @@
 <translation id="5040823038948176460">Контентын нэмэлт тохиргоо</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" />-г Linux-д холбохын тулд Тохиргоог нээнэ үү</translation>
 <translation id="5043913660911154449">Эсвэл хэвлэгчийнхээ PPD-г заах <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Та синк хийх өгөгдлөө нэвтрэх үгээр шифрлэсэн тул унтраасан</translation>
 <translation id="5045550434625856497">Буруу нууц үг</translation>
 <translation id="504561833207953641">Ашиглалтад байгаа хөтчийн харилцан үйлдэлд нээж байна.</translation>
 <translation id="5047421709274785093">Сайтуудад хөдөлгөөн болон гэрэл мэдрэгч ашиглахыг нь хориглох</translation>
@@ -3959,7 +3954,6 @@
 <translation id="63566973648609420">Зөвхөн таны нэвтрэх үгийг мэддэг хүн л таны шифрлэсэн өгөгдлийг унших боломжтой. Нэвтрэх үгийг Google-д илгээх болон хадгалахгүй. Хэрэв та нэвтрэх үгээ мартсан, эсвэл тохиргоог өөрчлөх бол <ph name="BEGIN_LINK" />синкийг дахин тохируулах<ph name="END_LINK" /> шаардлагатай.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" />-ийн гэр бүлд тавтай морилно уу. Энэ зүгээр ч нэг энгийн компьютер биш ээ.</translation>
 <translation id="6358884629796491903">Луу</translation>
-<translation id="6360719647236334056">Хайлт, зар болон Google-н бусад үйлчилгээг хувийн болгохын тулд Chrome хөтчийн түүхээ ашиглаарай</translation>
 <translation id="6361850914223837199">Алдааны талаарх дэлгэрэнгүй мэдээлэл:</translation>
 <translation id="6362853299801475928">&amp; Асуудлыг мэдэгдэх ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4237,7 +4231,6 @@
 <translation id="6758056191028427665">Биднийг хэр ажиллаж байгааг мэдэгдэнэ үү.</translation>
 <translation id="6759193508432371551">Үйлдвэрийн тохиргоонд нь буцааж оруулах</translation>
 <translation id="6762833852331690540">Асаалттай</translation>
-<translation id="6764693078871405569">Мөн хайлтын өгөгдлийг (<ph name="URL" />) устгах. Ингэснээр таныг <ph name="DOMAIN" />-с гаргах болно.</translation>
 <translation id="6767566652486411142">Өөр хэл сонгох...</translation>
 <translation id="6767639283522617719">Домайнд нэгдэх боломжгүй байна. Байгууллагын нэгжийн тохиргоог зөв эсэхийг шалгана уу.</translation>
 <translation id="6769712124046837540">Принтерийг нэмж байна...</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index cacdcee58..0c57937 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">विनंती केल्यावर सध्याच्या वेबसाइटवर असलेला सर्व डेटा वाचू आणि बदलू शकता</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> आपल्या सेटिंग्ज रीसेट करू इच्छिते.</translation>
 <translation id="1243314992276662751">अपलोड करा</translation>
-<translation id="1243398753772016127">जाहिराती पर्सनलाइझ करण्यासाठी साइट तुमची ब्राउझिंग ॲक्टिव्हिटी विविध साइटवर वापरू शकत नाहीत</translation>
 <translation id="1244265436519979884">Linux रिस्टोअर सध्या प्रगतीपथावर आहे</translation>
 <translation id="1244303850296295656">एक्स्टेंशन एरर</translation>
 <translation id="1246905108078336582">क्लिपबोर्डवरून सूचना काढून टाकायची आहे का?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">चालू - कस्टम सेटिंग्ज</translation>
 <translation id="1489664337021920575">दुसरा पर्याय निवडा</translation>
 <translation id="1493892686965953381">यासाठी प्रतीक्षा करत आहे <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">तसेच ब्राउझिंग डेटा (<ph name="URL" />) साफ करा ज्यामुळे तुम्ही Google.com वरून साइन आउट होऊ शकाल.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> अन्य उपलब्ध डिव्हाइसेस.</translation>
 <translation id="1495677929897281669">टॅबवर परत</translation>
 <translation id="1499271269825557605">तुम्हाला एखादे एक्स्टेंशन ओळखता येत नसल्यास किंवा तुमचा ब्राउझर अपेक्षेनुसार काम करत नसल्यास, तुम्ही येथे एक्स्टेंशन बंद किंवा कस्टमाइझ करू शकता.</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">एक्स्टेंशन वर्तमान पेजवर ॲक्शन करु शकत असेल तेव्हा हे आयकन दृश्यमान होईल. आयकनवर क्लिक करुन किंवा <ph name="EXTENSION_SHORTCUT" /> दाबून हे एक्स्टेंशन वापरा.</translation>
 <translation id="257779572837908839">मीटिंगसाठी Chromebox म्हणून सेट अप करा</translation>
 <translation id="2580889980133367162">एकापेक्षा जास्त फायली डाउनलोड करण्यास <ph name="HOST" /> ला नेहमी अनुमती द्या</translation>
-<translation id="2580924999637585241">एकूण: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">दीर्घ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (प्लॅटफॉर्म <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos तिकीट मिळवू शकलो नाही. पुन्हा प्रयत्न करा किंवा तुमच्या संस्थेच्या डिव्हाइस ॲडमिनशी संपर्क साधा. (एरर कोड <ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">पॉप-अप ब्लॉक केले</translation>
 <translation id="480990236307250886">होम पेज उघडा</translation>
 <translation id="4811503964269049987">निवडलेला टॅब एकत्रित करा</translation>
-<translation id="4811818760963189951">तुम्ही इतिहास सिंक बंद केल्यामुळे बंद केले</translation>
 <translation id="4813136279048157860">माझ्या इमेज</translation>
 <translation id="4813512666221746211">नेटवर्क एरर</translation>
 <translation id="4814378367953456825">या फिंगरप्रिंटसाठी एखादे नाव एंटर करा</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">अतिरिक्त आशय सेटिंग्ज</translation>
 <translation id="5042282098504489593">Linux शी <ph name="USB_DEVICE_NAME" /> कनेक्ट करण्यासाठी सेटिंग्ज उघडा</translation>
 <translation id="5043913660911154449">किंवा तुमची PPD नमूद करा <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">तुम्ही तुमचा सिंक डेटा पासफ्रेझने एंक्रिप्ट केल्यामुळे बंद केले</translation>
 <translation id="5045550434625856497">चुकीचा पासवर्ड</translation>
 <translation id="504561833207953641">अस्तित्वात असलेल्या ब्राउझर सेशनमध्ये उघडत आहे.</translation>
 <translation id="5047421709274785093">गती आणि प्रकाश सेन्सर वापरण्यापासून साइटना ब्लॉक करा</translation>
@@ -2995,7 +2990,7 @@
 <translation id="5052499409147950210">साइट संपादित करा</translation>
 <translation id="5053604404986157245">रँडमली जनरेट केलेला TPM पासवर्ड उपलब्ध नाही. Powerwash नंतर हे सामान्य आहे.</translation>
 <translation id="5057110919553308744">तुम्ही एक्स्टेंशनवर क्लिक करता तेव्हा</translation>
-<translation id="5057403786441168405">तुमची साइन-इन केलेली खाती व्यवस्थापित करा. परवानग्यांवर अवलंबून, तुमचा अनुभव कस्टमाइझ करण्यासाठी Chrome आणि Google Play मधील अ‍ॅप्स, वेबसाइट आणि एक्स्टेंशन ही खाती वापरू शकतील. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
+<translation id="5057403786441168405">तुमची साइन-इन केलेली खाती व्यवस्थापित करा. परवानग्या असल्यास, Chrome आणि Google Play मधील अ‍ॅप्स, वेबसाइट आणि एक्स्टेंशन तुमचा अनुभव कस्टमाइझ करण्यासाठी ही खाती वापरू शकतील. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
 <translation id="5060332552815861872">सेव्ह करण्यासाठी एक प्रिंटर उपलब्ध आहे.</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{या फोल्डरमध्ये एक बुकमार्क आहे. तुम्हाला खात्री आहे की तुम्ही ते हटवू इच्छिता?}other{या फोल्डरमध्ये # बुकमार्क आहेत. तुम्हाला खात्री आहे की तुम्ही ते हटवू इच्छिता?}}</translation>
 <translation id="5062930723426326933">साइन इन अयशस्वी, कृपया इंटरनेटशी कनेक्ट करा आणि पुन्हा प्रयत्न करा.</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">फक्त तुमचा सांकेतिक पासफ्रेझ असलेली एखादी व्यक्ती तुमचा एंक्रिप्ट केलेला डेटा वाचू शकते. सांकेतिक पासफ्रेझ Google कडे पाठविला किंवा त्याद्वारे स्टोअर केला जात नाही.  तुमचा सांकेतिक पासफ्रेझ विसरल्यास किंवा हे सेटिंग बदलू इच्छित असल्यास, तुम्हाला <ph name="BEGIN_LINK" />सिंक रीसेट करण्याची आवश्यकता असेल<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> कुटुंबात तुमचे स्वागत आहे. हा नेहमीचा कॉंप्युटर नाहीये.</translation>
 <translation id="6358884629796491903">ड्रॅगन</translation>
-<translation id="6360719647236334056">शोध, जाहिराती आणि इतर Google सेवा पर्सनलाइझ करण्यासाठी तुमचा Chrome ब्राउझिंग इतिहास वापरा</translation>
 <translation id="6361850914223837199">एरर तपशील:</translation>
 <translation id="6362853299801475928">&amp;समस्या नोंदवणे...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">आम्ही आमचे काम कसे करत आहोत त्याबद्दल आम्हाला कळवा.</translation>
 <translation id="6759193508432371551">फॅक्टरी रीसेट</translation>
 <translation id="6762833852331690540">सुरू</translation>
-<translation id="6764693078871405569">तसेच ब्राउझिंग डेटा (<ph name="URL" />) साफ करा ज्यामुळे तुम्ही <ph name="DOMAIN" /> वरून साइन आउट व्हाल.</translation>
 <translation id="6767566652486411142">दुसरी भाषा निवडा...</translation>
 <translation id="6767639283522617719">डोमेनशी जोडू शकत नाही. संस्थात्मक एककासाठी सेटिंग्ज योग्य असल्याची खात्री करा.</translation>
 <translation id="6769712124046837540">प्रिंटर जोडणे...</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index e764d81c..9ac5d6a3 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838"><ph name="FILE_NAME" /> mengandungi kandungan sensitif, dan telah disekat.</translation>
 <translation id="1061904396131502319">Masa rehat hampir tiba</translation>
+<translation id="1064552680598333868">Perubahan pada mikrofon akan berkuat kuasa apabila Linux dimulakan semula selepas ini.</translation>
 <translation id="1067048845568873861">Dibuat</translation>
 <translation id="1067291318998134776">Linux (Beta)</translation>
 <translation id="1067922213147265141">Perkhidmatan Google yang lain</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">Untuk meminta akses, hubungi pentadbir peranti ini.</translation>
 <translation id="1149401351239820326">Bulan tamat tempoh</translation>
 <translation id="1150565364351027703">Cermin mata hitam</translation>
+<translation id="1151841030700667295">Anda akan dilog keluar daripada semua tapak, termasuk dalam tab yang terbuka.</translation>
 <translation id="1151917987301063366">Sentiasa benarkan <ph name="HOST" /> mengakses penderia</translation>
 <translation id="1153356358378277386">Peranti digandingkan</translation>
 <translation id="1153636665119721804">Program Perlindungan Lanjutan Google</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">Baca dan ubah semua data anda pada tapak web semasa apabila digunakan</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> mahu menetapkan semula tetapan anda.</translation>
 <translation id="1243314992276662751">Muat naik</translation>
-<translation id="1243398753772016127">Tapak tidak boleh menggunakan aktiviti penyemakan imbas anda di tapak lain untuk memperibadikan iklan</translation>
 <translation id="1244265436519979884">Pemulihan Linux sedang dijalankan</translation>
 <translation id="1244303850296295656">Ralat sambungan</translation>
 <translation id="1246905108078336582">Alih keluar cadangan daripada papan keratan?</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">Helo.</translation>
 <translation id="138784436342154190">Pulihkan halaman permulaan lalai?</translation>
 <translation id="1390548061267426325">Buka sebagai Tab Biasa</translation>
+<translation id="1392232653471491344">Linux perlu dimulakan semula</translation>
 <translation id="1393283411312835250">Matahari dan awan</translation>
 <translation id="1393787139683794508">Tindakan ini akan mengosongkan semua data dan kuki yang disimpan oleh <ph name="ORIGIN_NAME" />.</translation>
 <translation id="1395730723686586365">Pengemaskinian bermula</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> untuk membolehkan penggandingan</translation>
 <translation id="1422159345171879700">Muatkan Skrip yang Tidak Selamat</translation>
 <translation id="1426410128494586442">Ya</translation>
+<translation id="142655739075382478"><ph name="APP_NAME" /> disekat</translation>
 <translation id="1426870617281699524">Klik Cuba Lagi dan terima gesaan pada komputer anda</translation>
 <translation id="1427269577154060167">Negara</translation>
 <translation id="142758023928848008">Dayakan kekunci lekit (untuk melaksanakan pintasan papan kekunci dengan menaipnya mengikut urutan)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">&amp;Tetapan Bahasa</translation>
 <translation id="1478340334823509079">Butiran: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Pemasangan tidak didayakan</translation>
+<translation id="1481537595330271162">Ralat semasa mengubah saiz cakera</translation>
 <translation id="1482626744466814421">Tanda Tab Ini...</translation>
 <translation id="1483493594462132177">Hantar</translation>
 <translation id="1484979925941077974">Tapak sedang menggunakan Bluetooth</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">Hidup - tetapan tersuai</translation>
 <translation id="1489664337021920575">Buat pilihan lain</translation>
 <translation id="1493892686965953381">Menunggu untuk <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Kosongkan data semakan imbas (<ph name="URL" />) juga, yang mungkin melog anda keluar daripada Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> peranti lain yang tersedia.</translation>
 <translation id="1495677929897281669">Kembali ke tab</translation>
 <translation id="1499271269825557605">Jika anda tidak mengecam sambungan itu atau jika penyemak imbas anda tidak berfungsi seperti yang dijangkakan, anda boleh mematikan atau menyesuaikan sambungan di sini.</translation>
@@ -607,6 +610,7 @@
 <translation id="1805822111539868586">Periksa paparan</translation>
 <translation id="1805888043020974594">Pelayan cetak</translation>
 <translation id="1805967612549112634">Sahkan PIN</translation>
+<translation id="1806335016774576568">Tukar kepada apl terbuka yang lain</translation>
 <translation id="1809734401532861917">Tambahkan penanda halaman, sejarah, kata laluan dan tetapan saya yang lain pada <ph name="USER_EMAIL_ADDRESS" />.</translation>
 <translation id="1813278315230285598">Perkhidmatan</translation>
 <translation id="18139523105317219">Nama Pihak EDI</translation>
@@ -693,6 +697,7 @@
 <translation id="1921050530041573580">Gandingkan telefon anda dengan Messages</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Buka dengan</translation>
+<translation id="1925017091976104802">Tekan <ph name="MODIFIER_KEY_DESCRIPTION" /> untuk menampal</translation>
 <translation id="1925021887439448749">Masukkan alamat web tersuai</translation>
 <translation id="1925124445985510535">Semakan keselamatan dijalankan pada <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Tetapan ini dikawal oleh dasar perusahaan. Sila hubungi pentadbir anda untuk mendapatkan maklumat lanjut.</translation>
@@ -838,6 +843,7 @@
 <translation id="2135787500304447609">&amp;Sambung semula</translation>
 <translation id="2136372518715274136">Masukkan kata laluan baharu</translation>
 <translation id="2136476978468204130">Ungkapan laluan yang anda masukkan tidak betul</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{Kuki disekat.}=1{Kuki disekat, 1 pengecualian}other{Kuki disekat, {COUNT} pengecualian}}</translation>
 <translation id="2138398485845393913">Sambungan ke "<ph name="DEVICE_NAME" />" masih berlangsung</translation>
 <translation id="2139545522194199494">Rangkaian <ph name="NETWORK_INDEX" /> daripada <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Kekuatan Isyarat <ph name="SIGNAL_STRENGTH" />%, Diurus oleh Pentadbir anda, Sambung</translation>
 <translation id="2139919072249842737">Butang penyediaan</translation>
@@ -1005,11 +1011,13 @@
 <translation id="2346953515226895098">SODA Service</translation>
 <translation id="2347644257713614136">Penggunaan Hangouts and Cast for Education dikawal oleh Dasar Privasi Google.</translation>
 <translation id="2348176352564285430">Apl: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Ralat semasa memuatkan data</translation>
 <translation id="2349896577940037438">Jika tetapan Aktiviti Web &amp; Apl tambahan anda dihidupkan, data ini mungkin disimpan pada Akaun Google anda. Anda dapat melihat data anda, memadamkan data dan menukar tetapan akaun melalui account.google.com.</translation>
 <translation id="2350133097354918058">Dimuat semula</translation>
 <translation id="2350182423316644347">Memulakan aplikasi...</translation>
 <translation id="2350796302381711542">Benarkan <ph name="HANDLER_HOSTNAME" /> untuk membuka semua <ph name="PROTOCOL" /> pautan  dan bukannya <ph name="REPLACED_HANDLER_TITLE" />?</translation>
 <translation id="2351266942280602854">Bahasa dan input</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 item}other{{NUM_ITEMS} item}}</translation>
 <translation id="2352662711729498748">&lt;1 MB</translation>
 <translation id="2352810082280059586">Nota kunci skrin disimpan secara automatik ke <ph name="LOCK_SCREEN_APP_NAME" />. Nota terbaharu anda akan kekal pada kunci skrin.</translation>
 <translation id="2353297238722298836">Kamera dan mikrofon dibenarkan</translation>
@@ -1043,6 +1051,7 @@
 <translation id="2392369802118427583">Aktifkan</translation>
 <translation id="2394566832561516196">Tetapan akan dikosongkan pada muat semula seterusnya.</translation>
 <translation id="2395616325548404795"><ph name="DEVICE_TYPE" /> anda berjaya didaftarkan untuk pengurusan perusahaan, tetapi gagal menghantar maklumat aset dan lokasinya. Sila masukkan maklumat ini secara manual daripada Admin console anda untuk peranti ini.</translation>
+<translation id="2396387085693598316">Pentadbir anda telah menyekat "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="2396783860772170191">Masukkan PIN 4 angka (0000-9999)</translation>
 <translation id="2399939490305346086">Data log masuk kunci keselamatan</translation>
 <translation id="2400664245143453337">Kemas kini segera diperlukan</translation>
@@ -1190,7 +1199,6 @@
 <translation id="2575247648642144396">Ikon ini akan dapat dilihat apabila perlanjutan boleh bertindak ke atas halaman semasa. Gunakan sambungan ini dengan mengklik pada ikon atau dengan menekan <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Sediakan Chromebox untuk mesyuarat</translation>
 <translation id="2580889980133367162">Sentiasa benarkan <ph name="HOST" /> memuat turun berbilang fail</translation>
-<translation id="2580924999637585241">Jumlah: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lama</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Gagal mendapatkan tiket Kerberos. Cuba lagi atau hubungi pentadbir peranti organisasi anda. (Kod ralat <ph name="ERROR_CODE" />).</translation>
@@ -1331,6 +1339,7 @@
 <translation id="2753677631968972007">Kawal kebenaran tapak secara manual.</translation>
 <translation id="2755367719610958252">Urus ciri kebolehaksesan</translation>
 <translation id="275662540872599901">skrin dimatikan</translation>
+<translation id="2757338480560142065">Pastikan kata laluan yang anda simpan sepadan dengan kata laluan anda untuk <ph name="WEBSITE" /></translation>
 <translation id="2762441749940182211">Kamera disekat</translation>
 <translation id="2765217105034171413">Kecil</translation>
 <translation id="2766161002040448006">Tanya ibu/bapa</translation>
@@ -1583,6 +1592,7 @@
 <translation id="3090819949319990166">Tidak dapat menyalin fail crx luar ke <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" digandingkan</translation>
 <translation id="3092699946856346803">Sila masukkan SIM anda dan cuba lagi</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 sambungan yang mungkin berbahaya dimatikan. Anda juga boleh mengalih keluar sambungan tersebut.}other{{NUM_EXTENSIONS} sambungan yang mungkin berbahaya dimatikan. Anda juga boleh mengalih keluar sambungan tersebut.}}</translation>
 <translation id="3101709781009526431">Tarikh dan masa</translation>
 <translation id="3103941660000130485">Ralat semasa meningkatkan Linux</translation>
 <translation id="310671807099593501">Tapak sedang menggunakan bluetooth</translation>
@@ -1657,6 +1667,7 @@
 <translation id="3201422919974259695">Peranti USB yang tersedia akan dipaparkan di sini.</translation>
 <translation id="3202131003361292969">Laluan</translation>
 <translation id="3202173864863109533">Audio bagi tab ini sedang diredam.</translation>
+<translation id="3208321278970793882">Apl</translation>
 <translation id="3208584281581115441">Semak sekarang</translation>
 <translation id="3208703785962634733">Tidak disahkan</translation>
 <translation id="32101887417650595">Tidak dapat menyambungkan ke pencetak</translation>
@@ -1677,6 +1688,7 @@
 <translation id="3239373508713281971">Had masa dialih keluar untuk <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Pilih direktori akar bagi sambungan untuk pek. Untuk mengemas kini sambungan, pilih kunci persendirian untuk gunakan semula juga.</translation>
 <translation id="3244294424315804309">Teruskan meredam bunyi</translation>
+<translation id="3246107497225150582">{0,plural, =1{Kemas kini pranti dalam masa sehari}other{Kemas kini peranti dalam masa # hari}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - Ralat rangkaian</translation>
 <translation id="3248902735035392926">Keselamatan adalah perkara penting. Luangkan masa dan <ph name="BEGIN_LINK" />semak sambungan anda<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1763,6 +1775,7 @@
 <translation id="3356580349448036450">Selesai</translation>
 <translation id="3359256513598016054">Kekangan Dasar Sijil</translation>
 <translation id="3360297538363969800">Pencetakan gagal. Sila periksa pencetak anda dan cuba lagi.</translation>
+<translation id="3364986687961713424">Daripada pentadbir anda: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Gunakan sama ada Ctrl atau Alt</translation>
 <translation id="3367047597842238025">Sediakan <ph name="DEVICE_TYPE" /> anda sepertimana yang anda ingini dan temui semua keupayaan yang menakjubkan di hujung jari anda.</translation>
 <translation id="3368922792935385530">Disambungkan</translation>
@@ -1867,6 +1880,7 @@
 <translation id="3496213124478423963">Zum Keluar</translation>
 <translation id="3497560059572256875">Kongsi Coretan</translation>
 <translation id="3498215018399854026">Kami tidak dapat menghubungi ibu bapa anda pada masa ini. Sila cuba lagi.</translation>
+<translation id="3500417806337761827">Ralat semasa melekapkan perkongsian. Terlalu banyak perkongsian SMB telah dilekapkan.</translation>
 <translation id="3505030558724226696">Batalkan akses peranti</translation>
 <translation id="3507421388498836150">Kebenaran Semasa untuk "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="3507888235492474624">Imbas semula peranti Bluetooth</translation>
@@ -1932,6 +1946,7 @@
 <translation id="3592260987370335752">&amp;Ketahui lebih lanjut</translation>
 <translation id="359283478042092570">Masuk</translation>
 <translation id="3593965109698325041">Kekangan Nama Sijil</translation>
+<translation id="3595381248165458839">Hubungi pentadbir peranti organisasi anda</translation>
 <translation id="3596235046596950091">Dayakan perkhidmatan awan</translation>
 <translation id="3596414637720633074">Sekat kuki pihak ketiga dalam Inkognito</translation>
 <translation id="3599221874935822507">Ditinggikan</translation>
@@ -2065,6 +2080,7 @@
 <translation id="3742666961763734085">Tidak dapat menemui unit organisasi dengan nama itu. Sila cuba lagi.</translation>
 <translation id="3744111561329211289">Penyegerakan latar belakang</translation>
 <translation id="3746127522257263495">Tidak menyokong penambahan akaun G Suite for Education dalam apl Android.</translation>
+<translation id="3747039297326604768">Tidak dapat membuka Plugin VM</translation>
 <translation id="3747077776423672805">Untuk mengalih keluar apl, pergi ke Tetapan &gt; Gedung Google Play &gt; Urus pilihan Android &gt; Apl atau Pengurus aplikasi. Kemudian, ketik apl yang ingin dinyahpasang (anda mungkin perlu meleret ke kanan atau ke kiri untuk mencari apl). Kemudian, ketik Nyahpasang atau Lumpuhkan.</translation>
 <translation id="3748026146096797577">Tidak Disambung</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2140,6 +2156,7 @@
 <translation id="3827774300009121996">&amp;Skrin Penuh</translation>
 <translation id="3828029223314399057">Cari penanda halaman</translation>
 <translation id="3829765597456725595">Perkongsian fail SMB</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Pentadbir anda telah menghidupkan semula 1 sambungan yang mungkin berbahaya}other{Pentadbir anda telah menghidupkan semula {NUM_EXTENSIONS} sambungan yang mungkin berbahaya}}</translation>
 <translation id="3831436149286513437">Cadangan carian Google Drive</translation>
 <translation id="383161972796689579">Pemilik peranti ini telah melumpuhkan pengguna baharu daripada ditambah</translation>
 <translation id="3834775135533257713">Tidak dapat menambahkan aplikasi "<ph name="TO_INSTALL_APP_NAME" />" kerana bercanggah dengan "<ph name="INSTALLED_APP_NAME" />".</translation>
@@ -2316,6 +2333,7 @@
 <translation id="4047726037116394521">Layari laman utama</translation>
 <translation id="4050225813016893843">Kaedah pengesahan</translation>
 <translation id="4052120076834320548">Sangat Kecil</translation>
+<translation id="4056908315660577142">Anda telah mencapai had masa yang ditetapkan oleh ibu/bapa anda untuk apl Chrome <ph name="APP_NAME" />. Anda boleh menggunakan apl tersebut selama <ph name="TIME_LIMIT" /> esok.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">Lihat di Gedung</translation>
 <translation id="4058647953897694817">Sahkan melalui Bluetooth</translation>
@@ -2447,6 +2465,7 @@
 <translation id="424963718355121712">Apl mesti disampaikan daripada hos yang dipengaruhinya</translation>
 <translation id="4250229828105606438">Tangkapan skrin</translation>
 <translation id="4250680216510889253">Tidak</translation>
+<translation id="4252035718262427477">Halaman Web, Fail Tunggal (Himpunan Web)</translation>
 <translation id="4252852543720145436">Pengecam kandungan yang dilindungi</translation>
 <translation id="4252899949534773101">Bluetooth dilumpuhkan</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - Kandungan tab dikongsi</translation>
@@ -2542,6 +2561,7 @@
 <translation id="4400963414856942668">Anda boleh mengklik bintang untuk menandai tab</translation>
 <translation id="4403775189117163360">Pilih folder yang lain</translation>
 <translation id="4404136731284211429">Imbas lagi</translation>
+<translation id="4404843640767531781"><ph name="APP_NAME" /> disekat oleh ibu/bapa anda. Minta kebenaran untuk menggunakan apl ini daripada ibu bapa anda.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">B&amp;antuan</translation>
 <translation id="4409697491990005945">Margin</translation>
@@ -2611,6 +2631,7 @@
 <translation id="450099669180426158">Ikon tanda seru</translation>
 <translation id="4501530680793980440">Sahkan Pengalihan Keluar</translation>
 <translation id="4502423230170890588">Alih keluar daripada peranti ini</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{Kuki dibenarkan}=1{Kuki dibenarkan, 1 pengecualian}other{Kuki dibenarkan, {COUNT} pengecualian}}</translation>
 <translation id="4504940961672722399">Gunakan sambungan ini dengan mengklik pada ikon ini atau dengan menekan <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="4508051413094283164">Buka semua dalam tetingkap inkognito</translation>
 <translation id="4508265954913339219">Pengaktifan gagal</translation>
@@ -2724,6 +2745,7 @@
 <translation id="465878909996028221">Hanya http, https dan protokol fail disokong untuk pengubahan hala penyemak imbas.</translation>
 <translation id="4659077111144409915">Akaun utama</translation>
 <translation id="4660476621274971848">Versi yang dijangkakan "<ph name="EXPECTED_VERSION" />", tetapi versi sebenar ialah "<ph name="NEW_ID" />"</translation>
+<translation id="4660540330091848931">Mengubah saiz</translation>
 <translation id="4660838440047236328">reka letak bilik anda</translation>
 <translation id="4661407454952063730">Data apl boleh jadi sebarang data yang telah disimpan oleh apl (berdasarkan tetapan pembangun), termasuk data seperti kenalan, mesej dan foto.</translation>
 <translation id="4661931051827810091">Menghantar URL awanama sesetengah halaman yang anda lawati, maklumat sistem yang terhad dan sebahagian kandungan halaman untuk menemukan serta menyekat ancaman baharu terhadap semua pengguna web.</translation>
@@ -2819,7 +2841,6 @@
 <translation id="4808667324955055115">Tetingkap timbul disekat:</translation>
 <translation id="480990236307250886">Buka halaman utama</translation>
 <translation id="4811503964269049987">Tab Pilihan Kumpulan</translation>
-<translation id="4811818760963189951">Dimatikan kerana anda melumpuhkan penyegerakan sejarah</translation>
 <translation id="4813136279048157860">Imej Saya</translation>
 <translation id="4813512666221746211">Ralat rangkaian</translation>
 <translation id="4814378367953456825">Masukkan nama untuk cap jari ini</translation>
@@ -2908,6 +2929,7 @@
 <translation id="4918086044614829423">Terima</translation>
 <translation id="4918221908152712722">Pasang <ph name="APP_NAME" /> (tidak perlu dimuat turun)</translation>
 <translation id="4920887663447894854">Tapak berikut telah disekat daripada menjejaki lokasi anda pada halaman ini:</translation>
+<translation id="49226369361073053">{0,plural, =0{Kemas kini peranti sekarang}=1{Kemas kini peranti dalam masa 1 saat}other{Kemas kini peranti dalam masa # saat}}</translation>
 <translation id="492299503953721473">Alih keluar apl Android</translation>
 <translation id="4923279099980110923">Ya, saya ingin membantu</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2988,7 +3010,6 @@
 <translation id="5040823038948176460">Tetapan kandungan tambahan</translation>
 <translation id="5042282098504489593">Buka Tetapan untuk menyambungkan <ph name="USB_DEVICE_NAME" /> ke Linux</translation>
 <translation id="5043913660911154449">Anda juga boleh menentukan PPD pencetak anda <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Dimatikan kerana anda menyulitkan penyegerakan data anda dengan ungkapan laluan</translation>
 <translation id="5045550434625856497">Kata laluan tidak sah</translation>
 <translation id="504561833207953641">Membuka sesi penyemak imbas yang sedia ada.</translation>
 <translation id="5047421709274785093">Sekat tapak daripada menggunakan penderia gerakan dan cahaya</translation>
@@ -3059,6 +3080,7 @@
 <translation id="5135085122826131075">Akses Assistant anda apabila anda menyebut "Ok Google".</translation>
 <translation id="5135533361271311778">Tidak dapat mencipta item penanda halaman.</translation>
 <translation id="5137501176474113045">Padam item ini</translation>
+<translation id="5138982052046316113">Ubah Saiz Cakera Linux</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, Carian <ph name="DEFAULT_SEARCH_ENGINE_NAME" /></translation>
 <translation id="5139823398361067371">Masukkan PIN untuk kunci keselamatan anda. Jika anda tidak tahu nombor PIN, anda perlu menetapkan semula kunci keselamatan itu.</translation>
 <translation id="5139955368427980650">&amp;Buka</translation>
@@ -3215,6 +3237,7 @@
 <translation id="5353252989841766347">Eksport Kata Laluan Daripada Chrome</translation>
 <translation id="5355099869024327351">Benarkan Assistant untuk menunjukkan pemberitahuan kepada anda</translation>
 <translation id="5355926466126177564">Sambungan "<ph name="EXTENSION_NAME" />" telah menukar halaman yang ditunjukkan apabila anda membuat carian daripada Kotak Omni.</translation>
+<translation id="535911077628776608"><ph name="FILE_NAME" /> mungkin berbahaya. Hantar kepada Perlindungan Lanjutan Google untuk pengimbasan? Tekan Shift+F6 untuk mencapai kawasan bar muat turun.</translation>
 <translation id="5359910752122114278">1 hasil</translation>
 <translation id="5360150013186312835">Tunjukkan dalam Bar Alat</translation>
 <translation id="5362741141255528695">Pilih fail kunci persendirian.</translation>
@@ -3353,6 +3376,7 @@
 <translation id="5539221284352502426">Kata laluan yang anda masukkan telah ditolak oleh pelayan. Sebab yang mungkin termasuk: Kata laluan terlalu pendek. Kata laluan mesti merangkumi nombor atau simbol. Kata laluan mesti berbeza daripada kata laluan yang sebelumnya.</translation>
 <translation id="5541694225089836610">Tindakan dilumpuhkan oleh pentadbir anda</translation>
 <translation id="5542132724887566711">Profil</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> menghendaki anda mengemas kini peranti ini dengan segera.</translation>
 <translation id="5542750926112347543">Kuki daripada <ph name="DOMAIN" /> disekat</translation>
 <translation id="5542949973455282971">Disambungkan ke <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Memeriksa status...</translation>
@@ -3398,6 +3422,7 @@
 <translation id="5593357315997824387">Segerakkan fail saya</translation>
 <translation id="5595152862129936745">Sangat jauh</translation>
 <translation id="5595485650161345191">Edit alamat</translation>
+<translation id="5595727715083333657">Bekas anda tidak menyokong ubah saiz. Untuk melaraskan jumlah ruang yang telah diperuntukkan lebih awal kepada Linux (Beta), buat sandaran, kemudian pulihkan dalam bekas baharu.</translation>
 <translation id="5596627076506792578">Lagi pilihan</translation>
 <translation id="5600706100022181951">Kemas kini akan dimuat turun menggunakan <ph name="UPDATE_SIZE_MB" /> MB data mudah alih. Adakah anda ingin meneruskan?</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -3470,6 +3495,7 @@
 <translation id="5691511426247308406">Keluarga</translation>
 <translation id="5691772641933328258">Cap jari tidak dikenali</translation>
 <translation id="5692183275898619210">Pencetakan selesai</translation>
+<translation id="5692875591060376599">Fail yang dipilih tidak diketahui dan mungkin berbahaya. Hantar kepada Perlindungan Lanjutan Google untuk pengimbasan?</translation>
 <translation id="569425414730375234">Sesi inkognito semasa: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">Laporkan penyalahgunaan daripada "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="5696679855467848181">Fail PPD yang sedang digunakan: <ph name="PPD_NAME" /></translation>
@@ -3681,6 +3707,7 @@
 <translation id="5976160379964388480">Lain-lain</translation>
 <translation id="5978277834170881274">&amp;Gunakan semak ejaan asas</translation>
 <translation id="5979084224081478209">Semak kata laluan</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{Anda telah menghidupkan semula 1 sambungan yang mungkin berbahaya}other{Anda telah menghidupkan semula {NUM_EXTENSIONS} sambungan yang mungkin berbahaya}}</translation>
 <translation id="5979421442488174909">&amp;Terjemahkan ke <ph name="LANGUAGE" /></translation>
 <translation id="5979469435153841984">Untuk menandai halaman, klik bintang dalam bar alamat</translation>
 <translation id="5984222099446776634">Dilawati Baru-baru Ini</translation>
@@ -3931,6 +3958,7 @@
 <translation id="6309510305002439352">Mikrofon dimatikan</translation>
 <translation id="6311220991371174222">Tidak dapat memulakan Chrome kerana berlaku kesilapan semasa membuka profil anda. Cuba mulakan semula Chrome.</translation>
 <translation id="6312403991423642364">Ralat rangkaian tidak diketahui</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Semakan keselamatan dijalankan 1 hari yang lalu}other{Semakan keselamatan dijalankan {NUM_DAYS} hari yang lalu}}</translation>
 <translation id="6312638141433622592">Tawarkan untuk memaparkan artikel dalam mod pembaca apabila disokong</translation>
 <translation id="6313641880021325787">KELUAR DARIPADA VR</translation>
 <translation id="6314819609899340042">Anda telah berjaya mendayakan ciri penyahpepijatan pada <ph name="IDS_SHORT_PRODUCT_NAME" /> peranti ini.</translation>
@@ -3946,6 +3974,7 @@
 <translation id="6325191661371220117">Lumpuhkan autolancar</translation>
 <translation id="6326175484149238433">Alih keluar dari Chrome</translation>
 <translation id="6326855256003666642">Kiraan Pengekal</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> menghendaki anda mengemas kini peranti ini sebelum tarikh akhir.</translation>
 <translation id="6327785803543103246">Autopenemuan proksi web</translation>
 <translation id="6333064448949140209">Fail akan dihantar kepada Google untuk dinyahpepijat</translation>
 <translation id="6339668969738228384">Buat profil baharu untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -3965,7 +3994,6 @@
 <translation id="63566973648609420">Hanya orang yang tahu ungkapan laluan anda boleh membaca data anda yang disulitkan. Ungkapan laluan tidak dihantar atau disimpan oleh Google. Jika anda terlupa ungkapan laluan atau ingin menukar tetapan ini, anda perlu <ph name="BEGIN_LINK" />menetapkan semula penyegerakan<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Selamat datang ke keluarga <ph name="SHORT_PRODUCT_NAME" />. Ini bukan komputer biasa.</translation>
 <translation id="6358884629796491903">Naga</translation>
-<translation id="6360719647236334056">Gunakan sejarah penyemakan imbas Chrome anda untuk memperibadikan Carian, iklan dan perkhidmatan Google yang lain</translation>
 <translation id="6361850914223837199">Butiran ralat:</translation>
 <translation id="6362853299801475928">&amp;Laporkan isu...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3973,11 +4001,13 @@
 <translation id="6366190659675876144">Perlindungan Standard</translation>
 <translation id="636850387210749493">Pendaftaran perusahaan</translation>
 <translation id="6370021412472292592">Tidak dapat memuatkan manifes.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Tukar kata laluan}other{Tukar kata laluan}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Cuba Lagi</translation>
 <translation id="6377268785556383139">1 hasil carian untuk '<ph name="SEARCH_TEXT" />'</translation>
 <translation id="6380143666419481200">Terima dan teruskan</translation>
 <translation id="6384275966486438344">Ubah tetapan carian anda kepada: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">Sambung kepada Internet, kemudian cuba lagi</translation>
 <translation id="6385543213911723544">Tapak boleh menyimpan dan membaca data kuki</translation>
 <translation id="6386099547750337629">Jika perkara ini tidak dijangka, sila hubungi sokongan.</translation>
 <translation id="6387674443318562538">Pisah Menegak</translation>
@@ -4056,6 +4086,7 @@
 <translation id="6478248366783946499">Simpan fail berbahaya?</translation>
 <translation id="6483485061007832714">Buka muat turun</translation>
 <translation id="6483805311199035658">Membuka <ph name="FILE" />...</translation>
+<translation id="6485092675191826776">Lesen Plugin VM telah tamat tempoh</translation>
 <translation id="6488384360522318064">Pilih bahasa</translation>
 <translation id="648927581764831596">Tiada yang tersedia</translation>
 <translation id="6490471652906364588">Peranti USB-C (port kanan)</translation>
@@ -4243,9 +4274,9 @@
 <translation id="6758056191028427665">Beritahu kami tentang prestasi kami.</translation>
 <translation id="6759193508432371551">Tetapan semula kilang</translation>
 <translation id="6762833852331690540">Hidupkan</translation>
-<translation id="6764693078871405569">Kosongkan data semakan imbas (<ph name="URL" />) juga, yang akan melog anda keluar daripada <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Pilih Bahasa Lain...</translation>
 <translation id="6767639283522617719">Tidak dapat menghubungkan domain. Pastikan tetapan untuk unit organisasi adalah betul.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> mengesyorkan pengemaskinian peranti ini.</translation>
 <translation id="6769712124046837540">Menambah pencetak...</translation>
 <translation id="6770602306803890733">Meningkatkan keselamatan untuk anda dan semua orang yang melayari web</translation>
 <translation id="6770664076092644100">Sahkan melalui NFC</translation>
@@ -4378,6 +4409,7 @@
 <translation id="6943836128787782965">HTTP gagal</translation>
 <translation id="6945221475159498467">Pilih</translation>
 <translation id="694592694773692225">Ubah hala disekat pada halaman ini.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 kata laluan yang terjejas}other{{NUM_PASSWORDS} kata laluan yang terjejas}}</translation>
 <translation id="6949434160682548041">Kata laluan (pilihan)</translation>
 <translation id="6950627417367801484">Pulihkan apl</translation>
 <translation id="6950943362443484797">Kami akan memasang apl itu untuk anda</translation>
@@ -4462,6 +4494,7 @@
 <translation id="7053983685419859001">Sekat</translation>
 <translation id="7055152154916055070">Ubah hala disekat:</translation>
 <translation id="7056526158851679338">&amp;Periksa Peranti</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Semakan keselamatan dijalankan 1 minit yang lalu}other{Semakan keselamatan dijalankan {NUM_MINS} minit yang lalu}}</translation>
 <translation id="7057767408836081338">Gagal mendapatkan data apl, sedang cuba menjalankan apl juga...</translation>
 <translation id="7059858479264779982">Tetapkan kepada autolancar</translation>
 <translation id="7059893117020417984">Untuk menyemak imbas secara tertutup, klik menu ikon titik untuk membuka tetingkap inkognito</translation>
@@ -4705,6 +4738,7 @@
 <translation id="7371006317849674875">Masa mula</translation>
 <translation id="7371490947952970241">Anda boleh mematikan Lokasi dengan mematikan tetapan Lokasi utama pada peranti ini. Anda juga boleh mematikan penggunaan Wi-Fi, rangkaian mudah alih dan penderia untuk lokasi dalam tetapan lokasi.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Kemas kini peranti dalam masa sejam}other{Kemas kini peranti dalam masa # jam}}</translation>
 <translation id="7376553024552204454">Serlahkan kursor tetikus semasa kursor bergerak</translation>
 <translation id="7377451353532943397">Teruskan menyekat akses penderia</translation>
 <translation id="73786666777299047">Buka Gedung Web Chrome</translation>
@@ -4722,6 +4756,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">Sediakan sambungan pada <ph name="PHONE_NAME" /> anda</translation>
 <translation id="7401778920660465883">Ketepikan mesej ini</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Semakan keselamatan dijalankan 1 jam yang lalu}other{Semakan keselamatan dijalankan {NUM_HOURS} jam yang lalu}}</translation>
 <translation id="740624631517654988">Pop muncul disekat</translation>
 <translation id="7407430846095439694">Import dan Ikat</translation>
 <translation id="7407504355934009739">Kebanyakan orang menyekat pemberitahuan daripada tapak ini</translation>
@@ -4752,6 +4787,7 @@
 <translation id="7441830548568730290">Pengguna lain</translation>
 <translation id="7442465037756169001">Hangouts Meet hardware anda sudah boleh disediakan.</translation>
 <translation id="744341768939279100">Buat profil baharu</translation>
+<translation id="744366959743242014">Memuatkan data, proses ini mungkin mengambil masa beberapa saat.</translation>
 <translation id="7443806024147773267">Akses kata laluan anda pada bila-bila masa anda log masuk ke Akaun Google anda</translation>
 <translation id="7444983668544353857">Lumpuhkan <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Memasang apl secara automatik</translation>
@@ -4787,6 +4823,7 @@
 <translation id="7489761397368794366">Panggilan daripada peranti anda</translation>
 <translation id="749028671485790643"><ph name="VALUE" /> orang</translation>
 <translation id="7490813197707563893">Alamat MAC</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 kuki}other{{NUM_COOKIES} kuki}}</translation>
 <translation id="7493386493263658176">Sambungan <ph name="EXTENSION_NAME" /> boleh mengumpul semua teks yang anda taip, termasuk data peribadi seperti kata laluan dan nombor kad kredit. Adakah anda ingin menggunakan sambungan ini?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Terlupa kata laluan lama anda?</translation>
@@ -4807,10 +4844,14 @@
 <translation id="7513029293694390567">Log masuk secara automatik ke tapak web menggunakan bukti kelayakan yang disimpan. Jika dilumpuhkan, anda akan diminta memberikan pengesahan setiap kali sebelum mengelog masuk ke tapak web.</translation>
 <translation id="7514239104543605883">Salin ke peranti anda</translation>
 <translation id="7514365320538308">Muat Turun</translation>
+<translation id="751523031290522286"><ph name="APP_NAME" /> disekat oleh pentadbir. Minta kebenaran untuk menggunakan apl ini daripada pentadbir.</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> dijeda</translation>
+<translation id="7517063221058203587">{0,plural, =1{Kemas kini peranti dalam masa 1 minit}other{Kemas kini peranti dalam masa # minit}}</translation>
 <translation id="7520766081042531487">Portal Inkognito: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">Sebut "Ok Google".</translation>
 <translation id="7525067979554623046">Cipta</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 lagi}other{{NUM_DOWNLOADS} lagi}}</translation>
 <translation id="7529411698175791732">Semak sambungan Internet anda. Jika masalah ini masih berterusan, cuba log keluar dan log masuk semula.</translation>
 <translation id="7530016656428373557">Kadar Nyahcas dalam Watt</translation>
 <translation id="7531779363494549572">Pergi ke Tetapan &gt; Apl &amp; pemberitahuan &gt; Pemberitahuan.</translation>
@@ -4979,6 +5020,7 @@
 <translation id="7765158879357617694">Alih</translation>
 <translation id="7766807826975222231">Buat lawatan</translation>
 <translation id="7766838926148951335">Terima kebenaran</translation>
+<translation id="7768770796815395237">Tukar</translation>
 <translation id="7769672763586021400">ID Model</translation>
 <translation id="7770651108375708429">Putuskan sambungan Wi-Fi</translation>
 <translation id="7771452384635174008">Susun atur</translation>
@@ -5415,6 +5457,7 @@
 <translation id="8286963743045814739">Anda boleh menyemak imbas secara tertutup menggunakan tetingkap inkognito</translation>
 <translation id="8287902281644548111">Cari menggunakan panggilan API/URL</translation>
 <translation id="8288032458496410887">Nyahpasang <ph name="APP" />...</translation>
+<translation id="8289128870594824098">Saiz cakera</translation>
 <translation id="8291967909914612644">Negara pembekal tempatan</translation>
 <translation id="8294431847097064396">Sumber</translation>
 <translation id="8297006494302853456">Lemah</translation>
@@ -5628,6 +5671,7 @@
 <translation id="8608618451198398104">Tambahkan tiket Kerberos</translation>
 <translation id="8609465669617005112">Alihkan ke atas</translation>
 <translation id="8610103157987623234">Format salah, sila cuba lagi</translation>
+<translation id="8612935480510351790"><ph name="FILE_NAME" /> mungkin berbahaya. Hantar kepada Perlindungan Lanjutan Google untuk pengimbasan?</translation>
 <translation id="8613164732773110792">Aksara huruf kecil, angka, garis bawah atau sempang sahaja</translation>
 <translation id="8615618338313291042">Apl Inkognito: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Letak bayang</translation>
@@ -5655,6 +5699,7 @@
 <translation id="8641606876632989680">Chrome akan memaklumkan kepada anda apabila anda log masuk menggunakan kata laluan yang terjejas</translation>
 <translation id="8642900771896232685">2 saat</translation>
 <translation id="8642947597466641025">Jadikan Teks Lebih Besar</translation>
+<translation id="8643443571868262066"><ph name="FILE_NAME" /> mungkin berbahaya. Hantar kepada Perlindungan Lanjutan Google untuk pengimbasan?</translation>
 <translation id="8644655801811752511">Tidak dapat menetapkan semula kunci keselamatan ini. Cuba tetapkan semula kunci sejurus selepas memasukkannya.</translation>
 <translation id="8645354835496065562">Teruskan membenarkan akses penderia</translation>
 <translation id="8645920082661222035">Meramalkan dan memberi anda amaran tentang peristiwa berbahaya sebelum peristiwa itu berlaku</translation>
@@ -6075,6 +6120,7 @@
 <translation id="9169931577761441333">Tambahkan <ph name="APP_NAME" /> pada Skrin utama</translation>
 <translation id="9170848237812810038">&amp;Buat asal</translation>
 <translation id="9170884462774788842">Program lain pada komputer anda menambah tema yang boleh mengubah cara Chrome berfungsi.</translation>
+<translation id="917350715406657904">Anda telah mencapai had masa yang telah ditetapkan oleh ibu/bapa anda untuk <ph name="APP_NAME" />. Anda boleh menggunakan aplikasi ini selama <ph name="TIME_LIMIT" /> esok.</translation>
 <translation id="9173995187295789444">Mengimbas peranti Bluetooth...</translation>
 <translation id="9174401638287877180">Hantar data penggunaan dan diagnostik. Bantu kami meningkatkan pengalaman Android anak anda dengan menghantar data diagnostik dan penggunaan peranti serta apl kepada Google secara automatik. Data ini tidak akan digunakan untuk mengenal pasti anak anda dan akan membantu peningkatan kestabilan sistem dan apl serta pelbagai lagi. Sesetengah data agregat juga akan membantu apl dan rakan kongsi Google, seperti pembangun Android. Jika tetapan Aktiviti Web &amp; Apl tambahan dihidupkan untuk anak anda, data ini mungkin disimpan pada Akaun Googlenya.</translation>
 <translation id="917510707618656279">Tanya apabila tapak mahu mengakses peranti Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 6d29595..51eeb0d 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838"><ph name="FILE_NAME" /> တွင် အလွန်အရေးကြီးသော အကြောင်းအရာများ ပါဝင်သည့်အတွက် ပိတ်ထားသည်။</translation>
 <translation id="1061904396131502319">ခေတ္တနားချိန် ရောက်တော့မည်</translation>
+<translation id="1064552680598333868">Linux ကို ပြန်လည်စတင်ပြီးသည့်နောက် မိုက်ခရိုဖုန်းအတွက် ပြောင်းလဲမှုများ အကျိုးသက်ရောက်မှုရှိလာပါမည်။</translation>
 <translation id="1067048845568873861">ပြုလုပ်ပြီးပါပြီ</translation>
 <translation id="1067291318998134776">Linux (စမ်းသပ်ဆော့ဖ်ဝဲ)</translation>
 <translation id="1067922213147265141">အခြား Google ဝန်ဆောင်မှုများ</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">ဝင်ကြည့်ခွင့်တောင်းရန် ဤစက်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။</translation>
 <translation id="1149401351239820326">သက်တမ်းကုန်ဆုံးမည့်လ</translation>
 <translation id="1150565364351027703">နေကာမျက်မှန်များ</translation>
+<translation id="1151841030700667295">ဖွင့်ထားသော တဘ်များအပါအဝင် ဝဘ်ဆိုက်အားလုံးမှ သင် ထွက်သွားပါမည်။</translation>
 <translation id="1151917987301063366">အာရုံခံကိရိယာများကို <ph name="HOST" /> အား အမြဲအသုံးပြုခွင့်ပေးရန်</translation>
 <translation id="1153356358378277386">တွဲချိတ်ထားသည့် စက်ပစ္စည်းများ</translation>
 <translation id="1153636665119721804">Google အဆင့်မြင့်ကာကွယ်ရေး အစီအစဉ်</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">စတင်လည်ပတ်သည့်အခါ လက်ရှိဖွင့်ထားသော ဝဘ်ဆိုက်ပေါ်တွင် သင်၏ ဒေတာအားလုံးကို ဖတ်ရှုပြီး ပြောင်းလဲပါ</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />က သင်၏ ဆက်တင်များကို ပြန်ညှိလိုသည်။</translation>
 <translation id="1243314992276662751">အာပ်လုဒ် လုပ်ရန်</translation>
-<translation id="1243398753772016127">ဝဘ်ဆိုက်များသည် ကြော်ငြာများ ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန်အတွက် သင့်ကြည့်ရှုခြင်းများကို မတူညီသည့်ဝဘ်ဆိုက်များအကြား အသုံးပြု၍မရပါ</translation>
 <translation id="1244265436519979884">Linux ပြန်ယူခြင်းကို လောလောဆယ် လုပ်ဆောင်နေသည်</translation>
 <translation id="1244303850296295656">အိတ်စတန်းရှင်း မှားယွင်းမှု</translation>
 <translation id="1246905108078336582">ကလစ်ဘုတ်မှ အကြံပြုချက်ကို ဖယ်ရှားလိုပါသလား။</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">မင်္ဂလာပါ။</translation>
 <translation id="138784436342154190">စဖွင့်စာမျက်နှာကို မူလအတိုင်း ပြန်ထားလိုပါသလား။</translation>
 <translation id="1390548061267426325">ပုံမှန် တပ်ဖ် အနေဖြင့် ဖွင့်မည်</translation>
+<translation id="1392232653471491344">Linux ကို ပြန်လည်စတင်ရန် လိုအပ်သည်</translation>
 <translation id="1393283411312835250">နေနှင့် မိုးတိမ်</translation>
 <translation id="1393787139683794508">ဤသို့လုပ်ဆောင်ခြင်းဖြင့် <ph name="ORIGIN_NAME" /> က သိမ်းဆည်းထားသည့် ကွတ်ကီးနှင့် ဒေတာများအားလုံးကို ရှင်းလင်းလိုက်ပါမည်။</translation>
 <translation id="1395730723686586365">မွမ်းမံရေး လုပ်ကိုင်မှု စတင်ပြီ</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268">တွဲချိတ်ခြင်းအား ခွင့်ပြုရန် <ph name="TURN_ON_BLUETOOTH_LINK" /></translation>
 <translation id="1422159345171879700">မလုံခြုံသည့် Script များကို ဖွင့်ရန်</translation>
 <translation id="1426410128494586442">Yes</translation>
+<translation id="142655739075382478"><ph name="APP_NAME" /> ကို ပိတ်ထားသည်</translation>
 <translation id="1426870617281699524">ထပ်လုပ်ကြည့်ရန် ကို နှိပ်ပြီး သင့်ကွန်ပျူတာပေါ်ရှိ မေးမြန်းမှုအကွက်ထဲတွင် လက်ခံရန် ကို နှိပ်ပါ။</translation>
 <translation id="1427269577154060167">နိုင်ငံ</translation>
 <translation id="142758023928848008">စေးကပ် ကီးများကို ဖွင့်ထားရန် (ကီးဘုတ် ဖြတ်လမ်းများကို ၎င်းတို့ကို ဆက်တိုက် ရိုက်လျက် အသုံးပြုရန် အတွက်)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">နှင့်ဘာသာစကား ဆက်တင်များ</translation>
 <translation id="1478340334823509079">အသေးစိတ်များ: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">ထည့်သွင်းမှု ဖွင့်မထားပါ</translation>
+<translation id="1481537595330271162">ဒစ်ခ်ကို အရွယ်အစားပြင်ပြင်ခြင်းအမှား</translation>
 <translation id="1482626744466814421">ဤတဘ်၏လိပ်စာကို မှတ်ခြင်း...</translation>
 <translation id="1483493594462132177">ပို့ရန်</translation>
 <translation id="1484979925941077974">ဝဘ်ဆိုက်က ဘလူးတုသ်ကို အသုံးပြုနေသည်</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">ဖွင့် - စိတ်ကြိုက်ဆက်တင်များ</translation>
 <translation id="1489664337021920575">အခြား နည်းလမ်းတစ်ခုကို ရွေးရန်</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" />ကို စောင့်နေ...</translation>
-<translation id="1494438840282430403">ဖွင့်ကြည့်ထားသည့် မှတ်တမ်းဒေတာ (<ph name="URL" />) ကို လည်း‌ရှင်းလင်းမည်ဖြစ်ပြီး Google.com မှ ထွက်သွားပါမည်။</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ရနိုင်သည့် အခြား ကိရိယာများ</translation>
 <translation id="1495677929897281669">တဘ်သို့ ပြန်သွားရန်</translation>
 <translation id="1499271269825557605">နောက်ဆက်တွဲတစ်ခုကို မမှတ်မိလျှင် သို့မဟုတ် သင့်ဘရောင်ဇာသည် ထင်ထားသည့်အတိုင်း အလုပ်လုပ်ခြင်းမရှိလျှင် ဤနေရာတွင် နောက်ဆက်တွဲများကို ပိတ်ခြင်း သို့မဟုတ် စိတ်ကြိုက်ပြင်ဆင်နိုင်သည်။</translation>
@@ -519,7 +522,7 @@
 <translation id="1697686431566694143">ဖိုင်တည်းဖြတ်ရန်</translation>
 <translation id="1698122934742150150">လက်ရှိ လျှို့ဝှက်သုံး သတ်မှတ်ချိန်သာ</translation>
 <translation id="1698650002254827833">အက်ပ်စာရင်းကို ဖွင့်၍မရပါ။ ထပ်စမ်းကြည့်ပါ။</translation>
-<translation id="1700079447639026019">ကွတ်ကီးများကို ဘယ်တော့မျှ အသုံးမပြုနိုင်သည့် ဝဘ်ဆိုက်များ</translation>
+<translation id="1700079447639026019">ကွတ်ကီးများကို ဘယ်တော့မှ အသုံးမပြုနိုင်သည့် ဝဘ်ဆိုက်များ</translation>
 <translation id="1701062906490865540">ဒီလူကို ဖယ်ထုတ်ရန်</translation>
 <translation id="1703331064825191675">သင့်စကားဝှက်များနှင့် ပတ်သက်ပြီး မည်သည့်အခါမှ စိတ်ပူစရာမလိုခြင်း</translation>
 <translation id="1704970325597567340"><ph name="DATE" /> ၌ လုံခြုံရေးစစ်ဆေးခဲ့သည်</translation>
@@ -608,6 +611,7 @@
 <translation id="1805822111539868586">စစ်ဆေးသည့် မြင်ကွင်း</translation>
 <translation id="1805888043020974594">ပုံနှိပ်စက်ဆာဗာ</translation>
 <translation id="1805967612549112634">ပင်နံပါတ် အတည်ပြုပါ</translation>
+<translation id="1806335016774576568">ဖွင့်ထားသည့် အခြားအက်ပ်တစ်ခုသို့ ပြောင်းရန်</translation>
 <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> သို့ ကျွန်ုပ်၏ ဝဘ်လိပ်စာများ၊ မှတ်တမ်း၊ စကားဝှက်များနှင့် အခြားဆက်တင်များကို ထည့်သွင်းပါ</translation>
 <translation id="1813278315230285598">ဝန်​ဆောင်​မှု​များ</translation>
 <translation id="18139523105317219">EDI ပါတီ အမည်</translation>
@@ -694,6 +698,7 @@
 <translation id="1921050530041573580">သင့်ဖုန်းကို Messages နှင့် တွဲချိတ်ပါ</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">ဖြင့်ဖွင့်ပါ</translation>
+<translation id="1925017091976104802">ကူးထည့်ရန် <ph name="MODIFIER_KEY_DESCRIPTION" /> ကို နှိပ်ပါ</translation>
 <translation id="1925021887439448749">စိတ်ကြိုက်ဝဘ်လိပ်စာကို ထည့်ရန်</translation>
 <translation id="1925124445985510535"><ph name="TIME" /> ၌ လုံခြုံရေးစစ်ဆေးခဲ့သည်</translation>
 <translation id="1926339101652878330">ဤချိန်ညှိချက်များအား လုပ်ငန်းပေါ်လစီမှ ထိန်းချုပ်ပါသည်။ နောက်ထပ်အချက်လက်များ အတွက် သင့်ကြီးကြပ်သူအား ကျေးဇူးပြု၍ ဆက်သွယ်ပါ။</translation>
@@ -839,6 +844,7 @@
 <translation id="2135787500304447609">ပြန်လည် ရှေ့ဆက်မည်</translation>
 <translation id="2136372518715274136">စကားဝှက်အသစ် ထည့်ပါ</translation>
 <translation id="2136476978468204130">သင်ထည့်သွင်းထားသည့် လျှို့ဝှက်စကားစုသည် မမှန်ကန်ပါ</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{ကွတ်ကီးများကို ပိတ်ထားသည်။}=1{ကွတ်ကီးများကို ပိတ်ထားသည်၊ ခြွင်းချက် ၁ ခု}other{ကွတ်ကီးများကို ပိတ်ထားသည်၊ ခြွင်းချက် {COUNT} ခု}}</translation>
 <translation id="2138398485845393913">"<ph name="DEVICE_NAME" />" သို့ ချိတ်ဆက်နေဆဲဖြစ်သည်</translation>
 <translation id="2139545522194199494">ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက်မှ <ph name="NETWORK_INDEX" />၊ <ph name="NETWORK_NAME" />၊ လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />%၊ သင့် 'စီမံခန့်ခွဲသူ' က ကြီးကြပ်ထားသည်၊ ချိတ်ဆက်ရန်</translation>
 <translation id="2139919072249842737">စနစ်ထည့်သွင်းရန် ခလုတ်</translation>
@@ -1006,11 +1012,13 @@
 <translation id="2346953515226895098">SODA ဝန်ဆောင်မှု</translation>
 <translation id="2347644257713614136">ပညာရေးအတွက် Hangouts နှင့် Cast အသုံးပြုခြင်းကို 'Google ပုဂ္ဂိုလ်ရေးဆိုင်ရာ မူဝါဒ' အရ ထိန်းချုပ်ထားသည်။</translation>
 <translation id="2348176352564285430">အက်ပ် − <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">ဒေတာတင်မှု အမှား</translation>
 <translation id="2349896577940037438">သင်၏ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သင့် Google အကောင့်သို့ သိမ်းသွားပါမည်။ သင်၏ ဒေတာများကို ကြည့်ခြင်း၊ ဖျက်ခြင်းနှင့် သင့်အကောင့်ဆက်တင်များ ပြောင်းခြင်းတို့ကို account.google.com တွင် လုပ်ဆောင်နိုင်သည်။</translation>
 <translation id="2350133097354918058">ပြန်လည် စတင်ထားသည်</translation>
 <translation id="2350182423316644347">အပလီကေးရှင်းကို စသုံးရန် လုပ်ကိုင်နေ...</translation>
 <translation id="2350796302381711542"><ph name="HANDLER_HOSTNAME" /> အား <ph name="REPLACED_HANDLER_TITLE" /> အစား လင့်များ <ph name="PROTOCOL" /> အားလုံးကို ဖွင့်ခွင့် ပြုရမလား?</translation>
 <translation id="2351266942280602854">ဘာသာစကား နှင့် ရိုက်သွင်းမှု</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{၁ ခု}other{{NUM_ITEMS} ခု}}</translation>
 <translation id="2352662711729498748">&lt; ၁ မီဂါဘိုက်</translation>
 <translation id="2352810082280059586">လော့ခ်မျက်နှာပြင်တွင် မှတ်သားထားသည့် မှတ်စုများကို <ph name="LOCK_SCREEN_APP_NAME" /> သို့ အလိုအလျောက် သိမ်းဆည်းပေးပါသည်။ သင်နောက်ဆုံးမှတ်သားထားသည့် မှတ်စုကို လော့ခ်မျက်နှာပြင်ပေါ်တွင် မြင်နိုင်ပါမည်။</translation>
 <translation id="2353297238722298836">ကင်မရာနှင့် မိုက်ခရိုဖုန်းကို သုံးခွင့်ပြုထားသည်</translation>
@@ -1044,6 +1052,7 @@
 <translation id="2392369802118427583">စသုံးရန်</translation>
 <translation id="2394566832561516196">နောက် တစ်ခါ ပြန်တင်စဉ် ဆက်တင်များကို ရှင်းပစ်မည်။</translation>
 <translation id="2395616325548404795">လုပ်ငန်းစီမံခန့်ခွဲမှုအတွက် <ph name="DEVICE_TYPE" /> ကို အောင်မြင်စွာ စာရင်းသွင်းပြီးပါပြီ။ သို့သော် ၎င်း၏ ပိုင်ဆိုင်မှုများနှင့် တည်နေရာအချက်အလက်များကို ပို့၍မရပါ။ ဤစက်ပစ္စည်းအတွက် စီမံခန့်ခွဲမှုကွန်ဆိုးလ်မှနေ၍ ဤအချက်အလက်များကို ကိုယ်တိုင်ထည့်သွင်းပါ။</translation>
+<translation id="2396387085693598316">သင့်စီမံခန့်ခွဲသူသည် "<ph name="EXTENSION_NAME" />" ကို ပိတ်ထားသည်</translation>
 <translation id="2396783860772170191">ဂဏန်း ၄ လုံးပါ ပင်နံပါတ်ထည့်ရန် (၀၀၀၀−၉၉၉၉)</translation>
 <translation id="2399939490305346086">လုံခြုံရေးကီး လက်မှတ်ထိုးဝင်ခြင်းဒေတာများ</translation>
 <translation id="2400664245143453337">ချက်ချင်း အပ်ဒိတ်လုပ်ရန် လိုအပ်သည်</translation>
@@ -1191,7 +1200,6 @@
 <translation id="2575247648642144396">လက်ရှိ စာမျက်နှာတွင် အိတ်စတန်းရှင်း လုပ်ဆောင်နိုင်စဉ်တွင် ဤအိုင်ကွန် မြင်ရပါမည်။ <ph name="EXTENSION_SHORTCUT" /> သို့မဟုတ် အိုင်ကွန်ကိုနှိပ်ကာ ဤအိတ်စတန်းရှင်းကို အသုံးပြုနိုင်ပါသည်။</translation>
 <translation id="257779572837908839">အစည်းအဝေးများအတွက် Chromebox အဖြစ် စနစ်ထည့်သွင်းရန်</translation>
 <translation id="2580889980133367162"><ph name="HOST" />အား ဖိုင် အများအပြား ဒေါင်းလုဒ် လုပ်မှုကို အမြဲတမ်း ခွင့်ပြုရန်</translation>
-<translation id="2580924999637585241">စုစုပေါင်း: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ရှည်</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos လက်မှတ်ကို ရှာမတွေ့ပါ။ ထပ်စမ်းကြည့်ပါ သို့မဟုတ် သင့်အဖွဲ့အစည်း၏ စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။ (အမှားကုဒ် <ph name="ERROR_CODE" />)။</translation>
@@ -1332,6 +1340,7 @@
 <translation id="2753677631968972007">ဝဘ်ဆိုက်ခွင့်ပြုချက်များကို ကိုယ်တိုင် ထိန်းချုပ်မည်။</translation>
 <translation id="2755367719610958252">သုံးစွဲနိုင်ခြင်းဆိုင်ရာ ဝန်ဆောင်မှုများကို စီမံပါ</translation>
 <translation id="275662540872599901">မျက်နှာပြင်ကို ပိတ်ထားသည်</translation>
+<translation id="2757338480560142065">သင်သိမ်းနေသည့် စကားဝှက်သည် <ph name="WEBSITE" /> အတွက် သင့်စကားဝှက်နှင့် ကိုက်ညီမှု ရှိ၊ မရှိ စစ်ဆေးပါ</translation>
 <translation id="2762441749940182211">ကင်မရာကို ပိတ်ထားသည်</translation>
 <translation id="2765217105034171413">သေး</translation>
 <translation id="2766161002040448006">မိဘ ခွင့်တောင်းရန်</translation>
@@ -1584,6 +1593,7 @@
 <translation id="3090819949319990166">ပြင်ပရှိ crx ဖိုင်ကို <ph name="TEMP_CRX_FILE" /> သို့ ကူးယူမရပါ။</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" အတူတွဲပြီး</translation>
 <translation id="3092699946856346803">သင့်ဆင်းမ်ကတ် ထည့်သွင်းပြီး ထပ်စမ်းကြည့်ပါ</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲ ၁ ခုကို ပိတ်ထားသည်။ သင်၎င်းကို ဖယ်ရှားနိုင်သည်။}other{အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲ {NUM_EXTENSIONS} ခုကို ပိတ်ထားသည်။ သင်၎င်းတို့ကို ဖယ်ရှားနိုင်သည်။}}</translation>
 <translation id="3101709781009526431">ရက်စွဲ နှင့် အချိန်</translation>
 <translation id="3103941660000130485">Linux ကို အဆင့်မြှင့်ရာတွင် အမှားအယွင်းရှိနေသည်</translation>
 <translation id="310671807099593501">ဝဘ်ဆိုက်က ဘလူးတုသ်ကို အသုံးပြုနေသည်</translation>
@@ -1658,6 +1668,7 @@
 <translation id="3201422919974259695">အသုံးပြုနိုင်သော USB စက်ပစ္စည်းများကို ဤနေရာတွင် တွေ့ရပါမည်။</translation>
 <translation id="3202131003361292969">လမ်းကြောင်း</translation>
 <translation id="3202173864863109533">ဤ တဘ်၏ အသံကို ပိတ်ထား၏။</translation>
+<translation id="3208321278970793882">အက်ပ်</translation>
 <translation id="3208584281581115441">ယခု စစ်ကြည့်ရန်</translation>
 <translation id="3208703785962634733">အတည်မပြုသေး</translation>
 <translation id="32101887417650595">ပုံနှိပ်စက်သို့ ချိတ်ဆက်၍မရပါ</translation>
@@ -1678,6 +1689,7 @@
 <translation id="3239373508713281971"><ph name="APP_NAME" /> အတွက် အချိန်ကန့်သတ်ချက် ဖယ်ရှားလိုက်သည်</translation>
 <translation id="3241680850019875542">ထုပ်ရန် အတွက် တိုးချဲ့မှု၏ ရင်းမြစ် ဒါရိုက်ထရီကို ရွေးပါ။ တိုးချဲ့မှု တစ်ခုကို အပ်ဒိတ်လုပ်ရန်၊ ကိုယ်ပိုင် သော့ ပြန်သုံးရန်ကိုပါ ရွေးပါ။</translation>
 <translation id="3244294424315804309">အသံကို ဆက်လက်ပိတ်ထားရန်</translation>
+<translation id="3246107497225150582">{0,plural, =1{စက်ကို တစ်ရက်အတွင်း အပ်ဒိတ်လုပ်ပါ}other{စက်ကို # ရက်အတွင်း အပ်ဒိတ်လုပ်ပါ}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - ကွန်ရက်အမှားအယွင်း</translation>
 <translation id="3248902735035392926">လုံခြုံမှုက အရေးကြီးပါသည်။ အချိန်ခဏပေး၍ <ph name="BEGIN_LINK" />ယခုပင် သင်၏နောက်ဆက်တွဲများကို စစ်ဆေးပါ<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1764,6 +1776,7 @@
 <translation id="3356580349448036450">ပြီးဆုံးပြီ</translation>
 <translation id="3359256513598016054">အသိမှတ်ပြုလက်မှတ် ပေါ်လစီကန့်သတ်ချက်များ</translation>
 <translation id="3360297538363969800">ပရင့်ထုတ် မရခဲ့ပါ။ ကျေးဇူးပြုပြီး သင်၏ ပရင်တာကို စစ်ကြည့်ပြီး ထပ် စမ်းပါ။</translation>
+<translation id="3364986687961713424">သင်၏ စီမံခန့်ခွဲသူထံမှ- <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Ctrl သို့မဟုတ် Alt သုံးရန်</translation>
 <translation id="3367047597842238025">သင့်စိတ်တိုင်းကျ <ph name="DEVICE_TYPE" /> ကို စနစ်ထည့်သွင်းပြီး အံ့ဩဖွယ်လုပ်ဆောင်ချက်များအားလုံးကို ရှာဖွေလိုက်ပါ။</translation>
 <translation id="3368922792935385530">ချိတ်ဆက်ထားပြီ</translation>
@@ -1868,6 +1881,7 @@
 <translation id="3496213124478423963">ဇူးမ်ဖြုတ်ရန်</translation>
 <translation id="3497560059572256875">Doodle မျှဝေရန်</translation>
 <translation id="3498215018399854026">သင့်မိဘများကို ယခုမဆက်သွယ်နိုင်သေးပါ။ ကျေးဇူးပြု၍ ထပ်မံကြိုးစားပါ။</translation>
+<translation id="3500417806337761827">မျှဝေမှုကို တပ်ဆင်ခြင်းအမှား။ SMB မျှဝေမှုများစွာကို တပ်ဆင်ထားသည်။</translation>
 <translation id="3505030558724226696">စက်ပစ္စည်း ဝင်ရောက်ခွင့် ပြန်ရုပ်သိမ်းရန်</translation>
 <translation id="3507421388498836150">"<ph name="EXTENSION_NAME" />" အတွက်လက်ရှိ ခွင့်ပြုချက်များ</translation>
 <translation id="3507888235492474624">ဘလူးတုသ် စက်များ ပြန်ရှာရန်</translation>
@@ -1933,6 +1947,7 @@
 <translation id="3592260987370335752">ပိုမို လေ့လာရန်</translation>
 <translation id="359283478042092570">အင်တာ</translation>
 <translation id="3593965109698325041">လက်မှတ် အမည် ကန့်သတ်ချက်များ</translation>
+<translation id="3595381248165458839">သင့်အဖွဲ့အစည်း၏ စက်ပစ္စည်းစီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ</translation>
 <translation id="3596235046596950091">Cloud ဝန်ဆောင်မှုများဖွင့်ပါ</translation>
 <translation id="3596414637720633074">'ရုပ်ဖျက်' မုဒ်တွင် ပြင်ပကုမ္ပဏီ၏ ကွတ်ကီးများကို ပိတ်ပါ</translation>
 <translation id="3599221874935822507">စာလုံးကြွ ပြုလုပ်ထားသည်</translation>
@@ -2066,6 +2081,7 @@
 <translation id="3742666961763734085">ထိုအမည်ဖြင့် အဖွဲ့အစည်းကို မတွေ့ပါ။ ထပ်စမ်းကြည့်ပါ။</translation>
 <translation id="3744111561329211289">နောက်ခံတွင် စင့်ခ်လုပ်ခြင်း</translation>
 <translation id="3746127522257263495">G Suite for Education အကောင့်ကို Android အက်ပ်များအတွင်း ထည့်သွင်းခြင်းအား ပံ့ပိုးမထားပါ။</translation>
+<translation id="3747039297326604768">Plugin VM ကို ဖွင့်၍မရခြင်း</translation>
 <translation id="3747077776423672805">အက်ပ်များကို ဖယ်ရှားရန် ဆက်တင်များ &gt; Google Play စတိုး &gt; Android ရွေးချယ်ချက်များ စီမံရန် &gt; အက်ပ်များ (သို့) အပလီကေးရှင်း မန်နေဂျာသို့ သွားပါ။ ထို့နောက် သင်ဖယ်ရှားလိုသော အက်ပ်ကိုတို့ပါ (ထိုအက်ပ်ကိုရှာရန် ညာ (သို့) ဘယ်ကို ပွတ်ဆွဲရပါမည်)။ ထို့နောက် 'ဖယ်ရှားရန်' သို့မဟုတ် 'ပိတ်ရန်' ကိုတို့ပါ။</translation>
 <translation id="3748026146096797577">ချိတ်ဆက် မထား</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2141,6 +2157,7 @@
 <translation id="3827774300009121996">မျက်နှာပြင် အပြည့်</translation>
 <translation id="3828029223314399057">စညှပ်များကို ရှာဖွေရန်</translation>
 <translation id="3829765597456725595">SMB ဖိုင်မျှဝေမှု</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{သင့်စီမံခန့်ခွဲသူက အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲ ၁ ခုကို ပြန်ဖွင့်လိုက်သည်}other{သင့်စီမံခန့်ခွဲသူက အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲ {NUM_EXTENSIONS} ခုကို ပြန်ဖွင့်လိုက်သည်}}</translation>
 <translation id="3831436149286513437">Google Drive ရှာဖွေမှု အကြံပြုချက်များ</translation>
 <translation id="383161972796689579">အသုံးပြုသူများ ထပ်ပေါင်းထည့်ရန် ဤစက်ပစ္စည်း ပိုင်ရှင်မှ ပိတ်ထားပါသည်</translation>
 <translation id="3834775135533257713">"<ph name="INSTALLED_APP_NAME" />" နှင့် တူနေသောကြောင့် "<ph name="TO_INSTALL_APP_NAME" />" အပလီကေးရှင်းကိုထည့်သွင်း၍မရပါ။</translation>
@@ -2316,6 +2333,7 @@
 <translation id="4047726037116394521">ပင်မ စာမျက်နှာသို့ သွားရန်</translation>
 <translation id="4050225813016893843">အထောက်အထားစိစစ်ခြင်း နည်းလမ်း</translation>
 <translation id="4052120076834320548">သေး</translation>
+<translation id="4056908315660577142"><ph name="APP_NAME" /> Chrome အက်ပ်အတွက် သင့်မိဘကသတ်မှတ်ထားသည့် အချိန်ကန့်သတ်ချက် ပြည့်သွားပါပြီ။ မနက်ဖြန် <ph name="TIME_LIMIT" /> ကြာ အသုံးပြုနိုင်ပါမည်။</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">စတိုးမှာ ကြည့်ရန်</translation>
 <translation id="4058647953897694817">ဘလူးတုသ် မှတစ်ဆင့် အတည်ပြုရန်</translation>
@@ -2447,6 +2465,7 @@
 <translation id="424963718355121712">အက်ပ်များကို ၎င်းတို့အကျိုးသက်ရောက်မှုရှိသည့် ဆာဗာပင်ရင်းက ဝန်ဆောင်ပေးရမည်</translation>
 <translation id="4250229828105606438">မျက်နှာပြင် လျှပ်တပြက်ပုံ</translation>
 <translation id="4250680216510889253">No</translation>
+<translation id="4252035718262427477">ဝဘ်စာမျက်နှာ၊ ဖိုင်တစ်ဖိုင် (ဝဘ်အတွဲ)</translation>
 <translation id="4252852543720145436">ကာကွယ်ထားသည့် အကြောင်းအရာ ခွဲခြားစိစစ်သည့်စနစ်များ</translation>
 <translation id="4252899949534773101">ဘလူးတုသ် ပိတ်ထားသည်</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - တဘ်အကြောင်းအရာများကို မျှဝေထားသည်</translation>
@@ -2542,6 +2561,7 @@
 <translation id="4400963414856942668">ကြယ်ပွင့်ကို နှိပ်ပြီး တဘ်၏လိပ်စာကို မှတ်ထားနိုင်သည်</translation>
 <translation id="4403775189117163360">အခြားဖိုင်တွဲတစ်ခု ရွေးပါ</translation>
 <translation id="4404136731284211429">ထပ်ရှာရန်</translation>
+<translation id="4404843640767531781"><ph name="APP_NAME" /> ကို သင့်မိဘက ပိတ်ထားသည်။ ဤအက်ပ်အသုံးပြုရန် သင့်မိဘထံ ခွင့်တောင်းပါ။</translation>
 <translation id="4405117686468554883">*.jpeg၊ *.jpg၊ *.png</translation>
 <translation id="4408599188496843485">အကူညီ</translation>
 <translation id="4409697491990005945">မာဂျင်များ</translation>
@@ -2611,6 +2631,7 @@
 <translation id="450099669180426158">အာမေဍိတ်သံ သင်္ကေတ အိုင်ကွန်</translation>
 <translation id="4501530680793980440">ဖယ်ရှားမှု အတည်ပြုရန်</translation>
 <translation id="4502423230170890588">ဤစက်မှဖယ်ရှားရန်</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{ကွတ်ကီးများကို ခွင့်ပြုထားသည်}=1{ကွတ်ကီးများကို ခွင့်ပြုထားသည်၊ ခြွင်းချက် ၁ ခု}other{ကွတ်ကီးများကို ခွင့်ပြုထားသည်၊ ခြွင်းချက် {COUNT} ခု}}</translation>
 <translation id="4504940961672722399">ဒီတိုးချဲ့မှုကို ဒီအိုင်ကွန်ကို ကလစ်ပြီး သို့မဟုတ် <ph name="EXTENSION_SHORTCUT" />ကို နှိပ်ပြီး အသုံးပြုပါ။</translation>
 <translation id="4508051413094283164">အားလုံးကို ရုပ်ဖျက် ဝင်းဒိုးဖြင့် ဖွင့်ရန်</translation>
 <translation id="4508265954913339219">ဖွင့်သုံးမှု မအောင်မြင်</translation>
@@ -2724,6 +2745,7 @@
 <translation id="465878909996028221">ဘရောင်ဇာ တစ်ဆင့်ပြန်ညွှန်ပြခြင်းများအတွက် http၊ https နှင့် ဖိုင်ပရိုတိုကောများကိုသာ ပံ့ပိုးထားပါသည်။</translation>
 <translation id="4659077111144409915">ပင်မ အကောင့်</translation>
 <translation id="4660476621274971848">ဗားရှင်း "<ph name="EXPECTED_VERSION" />" ကို မျှော်မှန်းထားသော်လည်း ဗားရှင်းမှာ "<ph name="NEW_ID" />" ဖြစ်နေသည်</translation>
+<translation id="4660540330091848931">အရွယ်အစား ပြန်ပြင်နေသည်</translation>
 <translation id="4660838440047236328">သင့်အခန်း၏ အပြင်အဆင်</translation>
 <translation id="4661407454952063730">အက်ပ်ဒေတာဆိုသည်မှာ အဆက်အသွယ်၊ မက်ဆေ့ဂျ်နှင့် ဓာတ်ပုံများကဲ့သို့ ဒေတာများ အပါအဝင် (ဆော့ဖ်ဝဲအင်ဂျင်နီယာ၏ ဆက်တင်များအပေါ်မူတည်၍) အက်ပ်တစ်ခုက သိမ်းဆည်းလိုက်သော ဒေတာများဖြစ်ပါသည်။</translation>
 <translation id="4661931051827810091">ဝဘ်ပေါ်ရှိ အသုံးပြုသူများအားလုံးကို ပစ်မှတ်ထားသည့် အန္တရာယ်များကို ရှာဖွေရာ၌ အထောက်အကူဖြစ်စေရန်နှင့် အန္တရာယ်အသစ်များကို ပိတ်နိုင်ရန် သင်ဝင်ကြည့်သည့် အချို့ဝဘ်ဆိုက်များ၏ အမည်မဖော်သော URL များ၊ ကန့်သတ်ထားသည့် စနစ်အချက်အလက်များနှင့် အချို့သော ဝဘ်ဆိုက်ပါအကြောင်းအရာတို့ကို ပို့သည်။</translation>
@@ -2819,7 +2841,6 @@
 <translation id="4808667324955055115">ပေါ့ပ်အပ်များကို ပိတ်ထားသည်</translation>
 <translation id="480990236307250886">ပင်မ စာမျက်နှာဖွင့်</translation>
 <translation id="4811503964269049987">ရွေးထားသောတဘ်ကို အုပ်စုဖွဲ့ရန်</translation>
-<translation id="4811818760963189951">မှတ်တမ်းစင့်ခ်လုပ်ခြင်းကို သင် ပိတ်ထားသဖြင့် ပိတ်လိုက်သည်</translation>
 <translation id="4813136279048157860">ကျွန်ုပ်၏ ပုံများ</translation>
 <translation id="4813512666221746211">ကွန်ရက် ပြဿနာ</translation>
 <translation id="4814378367953456825">ဤလက်ဗွေအတွက် အမည်တစ်ခု ထည့်ရန်</translation>
@@ -2908,6 +2929,7 @@
 <translation id="4918086044614829423">လက်ခံရန်</translation>
 <translation id="4918221908152712722"><ph name="APP_NAME" /> ကို ထည့်သွင်းပါ (ဒေါင်းလုဒ်လုပ်ရန် မလိုပါ)</translation>
 <translation id="4920887663447894854">ဒီစာမျက်နှာ ပေါ်မှာ သင်၏ တည်နေရာကို ခြေရာခံ မရအောင် အောက်ပါ ဆိုက်များကို ပိတ်ဆို့ခဲ့သည်:</translation>
+<translation id="49226369361073053">{0,plural, =0{စက်ကို ယခုအပ်ဒိတ်လုပ်ခြင်း}=1{စက်ကို ၁ စက္ကန့်အတွင်း အပ်ဒိတ်လုပ်ပါ}other{စက်ကို # စက္ကန့်အတွင်း အပ်ဒိတ်လုပ်ပါ}}</translation>
 <translation id="492299503953721473">Android အက်ပ်များကို ဖယ်ရှားပါ</translation>
 <translation id="4923279099980110923">ကျွန်ုပ် ကူညီလိုပါသည်</translation>
 <translation id="4924352752174756392">၁၂ ဆ</translation>
@@ -2988,7 +3010,6 @@
 <translation id="5040823038948176460">နောက်ထပ် အကြောင်းအရာ ဆက်တင်များ</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> ကို Linux နှင့် ချိတ်ဆက်ရန် 'ဆက်တင်များ' ကိုဖွင့်ပါ</translation>
 <translation id="5043913660911154449">သို့မဟုတ် သင့်ပုံနှိပ်စက် PPD ကို သတ်မှတ်ပါ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">သင် စင့်ခ်လုပ်သောဒေတာများကို စကားဝှက်စာဖြင့် အသွင်ဝှက်ထားသောကြောင့် ပိတ်လိုက်သည်</translation>
 <translation id="5045550434625856497">စကားဝှက် မမှန်ပါ</translation>
 <translation id="504561833207953641">လက်ရှိ ဘရောင်ဇာစက်ရှင်တွင် ဖွင့်နေသည်</translation>
 <translation id="5047421709274785093">ဝဘ်ဆိုက်များကို လှုပ်ရှားမှုနှင့် အလင်းအာရုံခံကိရိယာများ အသုံးပြုခြင်းမှ ပိတ်ထားရန်</translation>
@@ -3059,6 +3080,7 @@
 <translation id="5135085122826131075">"Ok Google" ဟုပြောသည့်အခါ သင်၏ Assistant ကို အသုံးပြုနိုင်သည်။</translation>
 <translation id="5135533361271311778">စာညှပ် အရာကို ဖန်တီး မပေးနိုင်ခဲ့ပါ။</translation>
 <translation id="5137501176474113045">ဒီအရာကို ဖျက်ရန်</translation>
+<translation id="5138982052046316113">Linux ဒစ်ခ်ကို အရွယ်အစားပြန်ပြင်ခြင်း</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />၊ <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> Search</translation>
 <translation id="5139823398361067371">သင်၏လုံခြုံရေးကီးအတွက် ပင်နံပါတ် ထည့်ပါ။ ပင်နံပါတ်မသိပါက လုံခြုံရေးကီးကို ပြင်ဆင်သတ်မှတ်ရပါမည်။</translation>
 <translation id="5139955368427980650">&amp;ဖွင့်</translation>
@@ -3215,6 +3237,7 @@
 <translation id="5353252989841766347">Chrome မှစကားဝှက်များကို ထုတ်ယူပါ</translation>
 <translation id="5355099869024327351">သင့်အား အကြောင်းကြားချက်များ ပြနိုင်ရန် Assistant ကို ခွင့်ပြုပါ</translation>
 <translation id="5355926466126177564">Omnibox မှ သင်ရှာဖွေသောအခါ စာမျက်နှာမှ ပြသသည်များကို တိုးချဲလိုင်း "<ph name="EXTENSION_NAME" />" မှ ပြောင်းလဲခဲ့၏။</translation>
+<translation id="535911077628776608"><ph name="FILE_NAME" /> သည် အန္တရာယ်ရှိနိုင်သည်။ စစ်ဆေးရန် 'Google အဆင့်မြင့်ကာကွယ်ရေး' သို့ ပို့လိုပါသလား။ ဒေါင်းလုဒ်များ ဘားဧရိယာသို့ သွားရန် Shift+F6 နှိပ်ပါ။</translation>
 <translation id="5359910752122114278">ရလဒ် ၁ ခု</translation>
 <translation id="5360150013186312835">ကိရိယာဘားတွင် ပြရန်</translation>
 <translation id="5362741141255528695">ကိုယ်ပိုင် သော့ ဖိုင် ရွေးရန်</translation>
@@ -3353,6 +3376,7 @@
 <translation id="5539221284352502426">သင်ထည့်ထားသော စကားဝှက်ကို ဆာဗာမှ ငြင်းဆိုလိုက်သည်။ ဖြစ်နိုင်သည့် အကြောင်းရင်းများတွင် − စကားဝှက်တိုလွန်းခြင်းတို့ ပါဝင်သည်။ စကားဝှက်တွင် နံပါတ် သို့မဟုတ် သင်္ကေတများ ပါရမည်။ စကားဝှက်သည် ယခင်စကားဝှက်များနှင့် ကွဲပြားရမည်။</translation>
 <translation id="5541694225089836610">လုပ်ဆောင်ချက်ကို သင့်စီမံခန့်ခွဲသူက ပိတ်ထားပါသည်</translation>
 <translation id="5542132724887566711">ပရိုဖိုင်</translation>
+<translation id="5542133445231529202">ဤစက်ကို ချက်ချင်း အပ်ဒိတ်လုပ်ရန် <ph name="ORGANIZATION_NAME" /> က လိုလားသည်။</translation>
 <translation id="5542750926112347543"><ph name="DOMAIN" /> ထံမှ ကွတ်ကီးများကို ပိတ်ထားသည်</translation>
 <translation id="5542949973455282971"><ph name="CARRIER_NAME" /> သို့ ချိတ်ဆက်နေသည်</translation>
 <translation id="5543983818738093899">အခြေအနေကို စစ်ကြည့်နေ...</translation>
@@ -3398,6 +3422,7 @@
 <translation id="5593357315997824387">ကျွန်ုပ်၏ ဖိုင်များကို စင့်ခ်လုပ်ရန်</translation>
 <translation id="5595152862129936745">အလွန်ဝေးသည်</translation>
 <translation id="5595485650161345191">လိပ်စာ တည်းဖြတ်ရန်</translation>
+<translation id="5595727715083333657">သင့်ကွန်တိန်နာသည် အရွယ်အစားပြန်ပြုပြင်ခြင်းကို မပံ့ပိုးပါ။ Linux (စမ်းသပ်ဆော့ဖ်ဝဲ) အတွက် သတ်မှတ်ပေးထားသည့် နေရာပမာဏကို ချိန်ညှိရန် မိတ္တူကူးပြီး ကွန်တိန်နာအသစ်သို့ ပြန်သွင်းပါ။</translation>
 <translation id="5596627076506792578">ပိုမို ရွေးချယ်စရာများ</translation>
 <translation id="5600706100022181951">အပ်ဒိတ်ကို ဒေါင်းလုဒ်လုပ်ရန် မိုဘိုင်းဒေတာ <ph name="UPDATE_SIZE_MB" /> MB ကို သုံးပါမည်။ ရှေ့ဆက်လိုပါသလား။</translation>
 <translation id="5601503069213153581">ပင်နံပါတ်</translation>
@@ -3471,6 +3496,7 @@
 <translation id="5691511426247308406">မိသားစု</translation>
 <translation id="5691772641933328258">လက်ဗွေကို မသိပါ</translation>
 <translation id="5692183275898619210">ပုံနှိပ်ထုတ်ယူပြီးပြီ</translation>
+<translation id="5692875591060376599">ရွေးထားသည့်ဖိုင်သည် အမျိုးအမည်မသိရသည့်အတွက် အန္တရာယ်ရှိနိုင်သည်။ စစ်ဆေးရန် 'Google အဆင့်မြင့်ကာကွယ်ရေး' သို့ ပို့လိုပါသလား။</translation>
 <translation id="569425414730375234">လက်ရှိ ရုပ်ဖျက်စက်ရှင်- <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" သည် အလွဲသုံးစားလုပ်ကြောင်း တိုင်ကြားရန်</translation>
 <translation id="5696679855467848181">လက်ရှိအသုံးပြုနေသည့် PPD ဖိုင်− <ph name="PPD_NAME" /></translation>
@@ -3680,6 +3706,7 @@
 <translation id="5976160379964388480">အခြားများ</translation>
 <translation id="5978277834170881274">&amp;အခြေခံ စာလုံးပေါင်းစစ်ဆေးခြင်းကို အသုံးပြုရန်</translation>
 <translation id="5979084224081478209">စကားဝှက်များ စစ်ဆေးရန်</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{သင်သည် အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲ ၁ ခုကို ပြန်ဖွင့်လိုက်သည်}other{သင်သည် အန္တရာယ်ရှိနိုင်သော နောက်ဆက်တွဲ {NUM_EXTENSIONS} ခုကို ပြန်ဖွင့်လိုက်သည်}}</translation>
 <translation id="5979421442488174909">&amp;ကို <ph name="LANGUAGE" />ဘာသာသို့ ပြန်ဆိုရန်</translation>
 <translation id="5979469435153841984">မှတ်ထားသော လိပ်စာများသို့ သွားရန် လိပ်စာဘားရှိ ကြယ်ပွင့်ကို နှိပ်ပါ</translation>
 <translation id="5984222099446776634">မကြာသေးခင်က လည်ပတ်ခဲ့သော</translation>
@@ -3931,6 +3958,7 @@
 <translation id="6309510305002439352">မိုက်ခရိုဖုန်း ပိတ်ထားသည်</translation>
 <translation id="6311220991371174222">သင့်ပရိုဖိုင်ကို ဖွင့်စဉ်တွင် တစ်ခုခုချွတ်ယွင်းသွားသောကြောင့် Chrome ကို မစတင်နိုင်ခဲ့ပါ။ Chrome ကို ပြန်ဖွင့်ပါ။</translation>
 <translation id="6312403991423642364">ကွန်ရက်အမှားအကြောင်း မသိပါ</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{ပြီးခဲ့သည့် ၁ ရက်က လုံခြုံရေးစစ်ဆေးခဲ့သည်}other{ပြီးခဲ့သည့် {NUM_DAYS} ရက်က လုံခြုံရေးစစ်ဆေးခဲ့သည်}}</translation>
 <translation id="6312638141433622592">ပံ့ပိုးထားသည့်အခါ ဆောင်းပါးများကို ဖတ်ရှုစနစ်မုဒ်တွင် ပြပေးနိုင်သည်</translation>
 <translation id="6313641880021325787">VR မှထွက်ရန်</translation>
 <translation id="6314819609899340042">ဤ<ph name="IDS_SHORT_PRODUCT_NAME" />စက်ပစ္စည်းပေါ်တွင် ချို့ယွင်းချင်ရှာဖွေပြုပြင်ရေး အင်္ဂါရပ်များကို သင်အောင်မြင်စွာ ဖွင့်ထားပြီးဖြစ်သည်။</translation>
@@ -3946,6 +3974,7 @@
 <translation id="6325191661371220117">အလိုအလျောက်-စတင်ခြင်း မပြုရန်</translation>
 <translation id="6326175484149238433">Chrome ထဲမှ ဖယ်ရှားပစ်ရန်</translation>
 <translation id="6326855256003666642">Keepalive အရေအတွက်</translation>
+<translation id="632707535499064463">ကုန်ဆုံးချိန်မတိုင်မီ ဤစက်ကို မဖြစ်မနေအပ်ဒိတ်လုပ်ရန် <ph name="ORGANIZATION_NAME" /> က လိုလားသည်။</translation>
 <translation id="6327785803543103246">ဝဘ်ပရောက်စီ အလိုအလျောက် ရှာဖွေမှု</translation>
 <translation id="6333064448949140209">အမှားရှာဖွေရန် ဖိုင်ကို Google သို့ ပို့လိုက်ပါမည်</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> အတွက် ပရိုဖိုင်အသစ် ပြုလုပ်ရန်</translation>
@@ -3965,7 +3994,6 @@
 <translation id="63566973648609420">သင့်စကားဝှက်ရှိသူသာ သင်အသွင်ဝှက်ထားသည့် ဒေတာများကို ဖတ်နိုင်မည် ဖြစ်သည်။ စကားဝှက်ကို Google သို့ပို့ခြင်း သို့မဟုတ် သိမ်းဆည်းထားခြင်း မရှိပါ။ သင့်စကားဝှက်ကို မေ့သွားလျှင် သို့မဟုတ် ဤဆက်တင်ကို ပြောင်းလဲလိုလျှင် <ph name="BEGIN_LINK" />စင့်ခ်လုပ်ခြင်းကို ပြန်လည်သတ်မှတ်ပေးရန်<ph name="END_LINK" /> လိုအပ်ပါသည်။</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> မိသားစုမှ ကြိုဆိုပါသည်။ ဒါဟာ သာမန် ကွန်ပျူတာ မဟုတ်ပါ။</translation>
 <translation id="6358884629796491903">နဂါး</translation>
-<translation id="6360719647236334056">Search၊ ကြော်ငြာနှင့် အခြားသော Google ဝန်ဆောင်မှုများကို ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်ရန် သင်၏ Chrome ကြည့်ရှုမှုမှတ်တမ်းအား အသုံးပြုခြင်း</translation>
 <translation id="6361850914223837199">မှားယွင်းမှု အသေးစိတ်များ:</translation>
 <translation id="6362853299801475928">&amp;ပြဿနာ အစီရင်ခံရန်...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3973,11 +4001,13 @@
 <translation id="6366190659675876144">သာမန်ကာကွယ်မှု</translation>
 <translation id="636850387210749493">လုပ်ငန်း အမည်စာရင်းသွင်းခြင်း</translation>
 <translation id="6370021412472292592">ကြေညာစာတမ်းကို တင် မပေးနိုင်ခဲ့ပါ။</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{စကားဝှက် ပြောင်းရန်}other{စကားဝှက်များ ပြောင်းရန်}}</translation>
 <translation id="6374077068638737855">အိုင်စ်ဝါဆယ်လ</translation>
 <translation id="6374469231428023295">ထပ်စမ်းကြည့်ပါ</translation>
 <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' အတွက် ရလဒ် ၁ ခု</translation>
 <translation id="6380143666419481200">လက်ခံပြီး ဆက်လုပ်ရန်</translation>
 <translation id="6384275966486438344">သင့်ရှာဖွေမှု ကြိုတင်ချိန်ညှိချက်များကို သို့ပြောင်းပါ: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">အင်တာနက်ချိတ်ပြီး ထပ်စမ်းကြည့်ပါ</translation>
 <translation id="6385543213911723544">ဆိုက်များက ကွတ်ကီး ဒေတာကို သိမ်းဆည်းနိုင်ကာ ဖတ်နိုင်</translation>
 <translation id="6386099547750337629">တစ်ခုခု မှားယွင်းသွားလျှင် ဝန်ဆောင်မှုဌာနသို့ ဆက်သွယ်ပါ။</translation>
 <translation id="6387674443318562538">ဒေါင်လိုက် ခွဲရန်</translation>
@@ -4056,6 +4086,7 @@
 <translation id="6478248366783946499">အန္တရာယ်ရှိသည့် ဖိုင်ကို သိမ်းလိုပါသလား။</translation>
 <translation id="6483485061007832714">ဒေါင်းလုဒ်လုပ်ထားသည့် ဖိုင်ကို ဖွင့်ခြင်း</translation>
 <translation id="6483805311199035658"><ph name="FILE" />ကို ဖွင့်ပေးနေ...</translation>
+<translation id="6485092675191826776">Plugin VM လိုင်စင် သက်တမ်းကုန်သွားပါပြီ</translation>
 <translation id="6488384360522318064">ဘာသာစကား ရွေးချယ်ရန်</translation>
 <translation id="648927581764831596">မရနိုင်ပါ</translation>
 <translation id="6490471652906364588">USB-C ကိရိယာ (ညာ ပို့တ်)</translation>
@@ -4241,9 +4272,9 @@
 <translation id="6758056191028427665">ကျွန်ုပ်တို့၏ ဝန်ဆောင်မှုများအတွက် စိတ်ကျေနပ်မှုမည်မျှရှိကြောင်း ပြောပြပေးပါ။</translation>
 <translation id="6759193508432371551">စက်ရုံဆက်တင် ပြန်လည်သပ်မှတ်</translation>
 <translation id="6762833852331690540">ဖွင့်ထားသည်</translation>
-<translation id="6764693078871405569">ဖွင့်ကြည့်ထားသည့် မှတ်တမ်းဒေတာ (<ph name="URL" />) ကိုလည်း ရှင်းလင်းမည်ဖြစ်ပြီး <ph name="DOMAIN" /> မှ ထွက်သွားပါမည်။</translation>
 <translation id="6767566652486411142">အခြားဘာသာစကားတစ်ခု ရွေးရန်...</translation>
 <translation id="6767639283522617719">ဒိုမိန်းသို့ ချိတ်ဆက်၍မရပါ။ အဖွဲ့အစည်းဌာနအတွက် ဆက်တင်များ မှန်ကန်ခြင်းရှိမရှိ သေချာစစ်ဆေးပါ။</translation>
+<translation id="6769557323306147204">သင်ဤစက်ကို အပ်ဒိတ်လုပ်ရန် <ph name="ORGANIZATION_NAME" /> က အကြံပြုသည်။</translation>
 <translation id="6769712124046837540">ပရင်တာ ထည့်နေ…</translation>
 <translation id="6770602306803890733">သင်နှင့် ဝဘ်ပေါ်ရှိ လူအားလုံးအတွက် လုံခြုံရေးကို တိုးမြှင့်ထားသည်</translation>
 <translation id="6770664076092644100">NFC မှတစ်ဆင့် အတည်ပြုရန်</translation>
@@ -4376,6 +4407,7 @@
 <translation id="6943836128787782965">HTTP မှာ မအောင်မြင်ခဲ့</translation>
 <translation id="6945221475159498467">ရွေးရန်</translation>
 <translation id="694592694773692225">ဤစာမျက်နှာတွင် တဆင့်ပြန်ညွှန်ခြင်းကို ပိတ်ထားသည်။</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{ကျိုးပေါက်ထားသည့် စကားဝှက် ၁ ခု}other{ကျိုးပေါက်ထားသည့် စကားဝှက် {NUM_PASSWORDS} ခု}}</translation>
 <translation id="6949434160682548041">စကားဝှက် (ချန်လှပ်ထားနိုင်သည်)</translation>
 <translation id="6950627417367801484">အက်ပ်များကို ပြန်ယူရန်</translation>
 <translation id="6950943362443484797">၎င်းအက်ပ်ကို သင့်အတွက် ထည့်သွင်းပေးပါမည်</translation>
@@ -4391,7 +4423,7 @@
 <translation id="6965648386495488594">ပေါ့ထ်</translation>
 <translation id="6965978654500191972">စက်ပစ္စည်း</translation>
 <translation id="6966201992886493384">ဝဘ်ဆိုက်များသည် ကွတ်ကီးများကို အသုံးပြုပြီး သင်၏ ဝဘ်ဆိုက်ကြည့်ရှုမှုကို ပိုမိုကောင်းမွန်အောင်ပြုလုပ်ပေးနိုင်သည်၊ ဥပမာ အမြဲလက်မှတ်ထိုးဝင်ထားပေးခြင်း သို့မဟုတ် စျေးခြင်းတောင်းအတွင်းရှိ အရာများကို မှတ်သားပေးခြင်း တို့ဖြစ်သည်</translation>
-<translation id="696780070563539690">ဝဘ်ဆိုက်များသည် ဥပမာအနေနှင့် ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် မတူညီသည့် ဝဘ်ဆိုက်များတစ်လျှောက်တွင် ကွတ်ကီးများသုံးပြီး သင့်ကြည့်ရှုခြင်းများကို ကြည့်နိုင်မည်မဟုတ်ပါ</translation>
+<translation id="696780070563539690">ဝဘ်ဆိုက်များသည် ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် ဥပမာအားဖြင့် မတူညီသည့် ဝဘ်ဆိုက်များတစ်လျှောက်တွင် ကွတ်ကီးများသုံးပြီး သင့်ကြည့်ရှုခြင်းများကို ကြည့်နိုင်မည်မဟုတ်ပါ</translation>
 <translation id="6968288415730398122">မျက်နှာပြင်လော့ခ်ကို စီစဉ်သတ်မှတ်ရန် စကားဝှက်ထည့်ပါ</translation>
 <translation id="6970480684834282392">အစပြု အမျိုးစား</translation>
 <translation id="6970856801391541997">တိကျသည့် စာမျက်နှာများ ပရင့်ထုတ်မည်</translation>
@@ -4460,6 +4492,7 @@
 <translation id="7053983685419859001">ပိတ်ဆို့ရန်</translation>
 <translation id="7055152154916055070">တစ်ဆင့်ပြန်ညွှန်ခြင်းကို ပိတ်ထားသည်−</translation>
 <translation id="7056526158851679338">&amp;ကိရိယာများကို စုံစမ်းရန်</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{ပြီးခဲ့သည့် ၁ မိနစ်က လုံခြုံရေး စစ်ဆေးခဲ့သည်}other{ပြီးခဲ့သည့် {NUM_MINS} မိနစ်က လုံခြုံရေး စစ်ဆေးခဲ့သည်}}</translation>
 <translation id="7057767408836081338">အက်ပ်ဒေတာရယူ၍ မရပါ၊ မည်သို့ဖြစ်စေ အက်ပ်ကိုဖွင့်ရန် ကြိုးစားနေသည်...</translation>
 <translation id="7059858479264779982">အော်တို-ဖွင့်တင်သို့ သတ်မှတ်ရန်</translation>
 <translation id="7059893117020417984">သီးသန့်ကြည့်ရှုရန် အစက်သင်္ကေတ မီနူးကိုနှိပ်ပြီး ရုပ်ဖျက်ဝင်းဒိုးတစ်ခု ဖွင့်ပါ</translation>
@@ -4703,6 +4736,7 @@
 <translation id="7371006317849674875">စတင်ချိန်</translation>
 <translation id="7371490947952970241">'တည်နေရာ' ကို ပိတ်ရန် ဤစက်ပစ္စည်းရှိ ပင်မ 'တည်နေရာ' ဆက်တင်ကို ပိတ်ပါ။ တည်နေရာဆက်တင်များတွင် တည်နေရာအတွက် Wi-Fi၊ မိုဘိုင်းကွန်ရက်များနှင့် အာရုံခံကိရိယာများအသုံးပြုမှုကိုလည်း ပိတ်နိုင်သည်။</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{စက်ကို တစ်နာရီအတွင်း အပ်ဒိတ်လုပ်ပါ}other{စက်ကို # နာရီအတွင်း အပ်ဒိတ်လုပ်ပါ}}</translation>
 <translation id="7376553024552204454">မြှားရွေ့လျားနေသည့်အချိန်တွင် ၎င်းကိုထင်ရှားအောင်ပြုလုပ်ပါ</translation>
 <translation id="7377451353532943397">အာရုံခံကိရိယာ အသုံးပြုခွင့်ကို ဆက်လက်ပိတ်ထားရန်</translation>
 <translation id="73786666777299047">Chrome Web စတိုးကို ဖွင့်ရန်</translation>
@@ -4720,6 +4754,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">သင့် <ph name="PHONE_NAME" /> တွင် ချိတ်ဆက်မှုကို သတ်မှတ်ပါ</translation>
 <translation id="7401778920660465883">ဤ စာကို ပယ်ဖျက်ရန်</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{ပြီးခဲ့သည့် ၁ နာရီက လုံခြုံရေးစစ်ဆေးခဲ့သည်}other{ပြီးခဲ့သည့် {NUM_HOURS} နာရီက လုံခြုံရေးစစ်ဆေးခဲ့သည်}}</translation>
 <translation id="740624631517654988">ပေါ့အာပ် ပိတ်ဆို့ထား</translation>
 <translation id="7407430846095439694">တင်သွင်းရန်နှင့် ချိတ်တွဲရန်</translation>
 <translation id="7407504355934009739">လူအများစုသည် ဤဝဘ်ဆိုက်မှ အကြောင်းကြားချက်များကို ပိတ်ကြသည်</translation>
@@ -4750,6 +4785,7 @@
 <translation id="7441830548568730290">အခြားအသုံးပြုသူများ</translation>
 <translation id="7442465037756169001">သင်၏ Hangouts Meet စက်ကို စနစ်ထည့်သွင်းရန် အဆင်သင့် ဖြစ်နေပါပြီ။</translation>
 <translation id="744341768939279100">ပရိုဖိုင် အသစ်ကို ဖန်တီးရန်</translation>
+<translation id="744366959743242014">ဒေတာများကို ဖွင့်နေသည်၊ စက္ကန့်အနည်းငယ် ကြာနိုင်သည်။</translation>
 <translation id="7443806024147773267">သင်၏ Google အကောင့်သို့ လက်မှတ်ထိုးဝင်သည့်အခါတိုင်း သင့်စကားဝှက်များကို အသုံးပြုနိုင်သည်</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ပိတ်</translation>
 <translation id="7448430327655618736">အက်ပ်များကို အလိုအလျောက် ထည့်သွင်းနိုင်သည်</translation>
@@ -4785,6 +4821,7 @@
 <translation id="7489761397368794366">သင့်စက်မှ ခေါ်ဆိုရန်</translation>
 <translation id="749028671485790643">ပုဂ္ဂိုလ် <ph name="VALUE" /></translation>
 <translation id="7490813197707563893">MAC လိပ်စာ</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{ကွတ်ကီး ၁ ခု}other{ကွတ်ကီး {NUM_COOKIES} ခု}}</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> နောက်ဆက်တွဲသည် စကားဝှက်နှင့် အကြွေးဝယ်ကဒ်နံပါတ်ကဲ့သို့ ကိုယ်ရေးကိုယ်တာ ဒေတာများအပါအဝင် သင်ရိုက်လိုက်သည့် စာများအားလုံးကို သိမ်းဆည်းထားနိုင်ပါသည်။ ဤနောက်ဆက်တွဲကို အသုံးပြုလိုပါသလား။</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">သင့်စကားဝှက်အဟောင်းကို မေ့ပြီလား?</translation>
@@ -4805,10 +4842,14 @@
 <translation id="7513029293694390567">သိမ်းဆည်းထားသည့် အထောက်အထားများကိုအသုံးပြုပြီး ဝဘ်ဆိုက်များသို့ အလိုအလျောက် လက်မှတ်ထိုးဝင်ပါ။ ဤဝန်ဆောင်မှုကို ပိတ်ထားပါက ဝဘ်ဆိုက်တစ်ခုသို့ လက်မှတ်ထိုး ဝင်သည့်အခါတိုင်း အတည်ပြုချက် တောင်းပါလိမ့်မည်။</translation>
 <translation id="7514239104543605883">သင့်စက်သို့ မိတ္တူကူးရန်</translation>
 <translation id="7514365320538308">ဒေါင်းလုဒ်</translation>
+<translation id="751523031290522286"><ph name="APP_NAME" /> ကို စီမံခန့်ခွဲသူက ပိတ်ထားသည်။ ဤအက်ပ်အသုံးပြုရန် စီမံခန့်ခွဲသူထံ ခွင့်တောင်းပါ။</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> ကို ခဏရပ်ထားသည်</translation>
+<translation id="7517063221058203587">{0,plural, =1{စက်ကို ၁ မိနစ်အတွင်း အပ်ဒိတ်လုပ်ပါ}other{စက်ကို # မိနစ်အတွင်း အပ်ဒိတ်လုပ်ပါ}}</translation>
 <translation id="7520766081042531487">ရုပ်ဖျက်ဌာန-: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">"Ok Google" ဟုပြောပါ</translation>
 <translation id="7525067979554623046">ဖန်တီးရန်</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{နောက်ထပ် ၁ ခု}other{နောက်ထပ် {NUM_DOWNLOADS} ခု}}</translation>
 <translation id="7529411698175791732">အင်တာနက်ချိတ်ဆက်မှုကို စစ်ကြည့်ပါ။ ပြဿနာဆက်လက်ရှိနေသေးပါက ထွက်လိုက်ပြီး ပြန်လည်၍ လက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation>
 <translation id="7530016656428373557">အားကုန်မှုနှုန်း ဝပ်</translation>
 <translation id="7531779363494549572">ဆက်တင်များ &gt; အက်ပ်နှင့် အကြောင်းကြားချက်များ &gt; အကြောင်းကြားချက်များ သို့သွားပါ။</translation>
@@ -4977,6 +5018,7 @@
 <translation id="7765158879357617694">ရွှေ့ရန်</translation>
 <translation id="7766807826975222231">လေ့လာ ကြည့်ရှုပါ</translation>
 <translation id="7766838926148951335">ခွင့်ပြုချက်များကို လက်ခံရန်</translation>
+<translation id="7768770796815395237">ပြောင်းရန်</translation>
 <translation id="7769672763586021400">မော်ဒယ်နံပါတ်</translation>
 <translation id="7770651108375708429">Wi-Fi ချိတ်ဆက်မှုဖြုတ်ရန်</translation>
 <translation id="7771452384635174008">အပြင်အဆင်</translation>
@@ -5412,6 +5454,7 @@
 <translation id="8286963743045814739">ရုပ်ဖျက်ဝင်းဒိုးသုံးပြီး သီးသန့်ကြည့်ရှုနိုင်ပါသည်</translation>
 <translation id="8287902281644548111">API ခေါ်ဆိုမှု/URL တို့ဖြင့် ရှာရန်</translation>
 <translation id="8288032458496410887"><ph name="APP" /> ကို ဖယ်ရှားပါ...</translation>
+<translation id="8289128870594824098">ဒစ်ခ်အရွယ်အစား</translation>
 <translation id="8291967909914612644">ပင်မထောက်ပံ့သူ နိုင်ငံ</translation>
 <translation id="8294431847097064396">အရင်းအမြစ်</translation>
 <translation id="8297006494302853456">အားမကောင်းပါ</translation>
@@ -5431,7 +5474,7 @@
 <translation id="8320459152843401447">သင့်စခရင်တစ်ခုလုံး</translation>
 <translation id="8322814362483282060">ဒီစာမျက်နှာကို သင်၏ မိုက်ခရိုဖုန်းကို ရယူသုံးမရအောင် ပိတ်ဆို့ထားသည်။</translation>
 <translation id="8323167517179506834">URL ရိုက်ထည့်ရန်</translation>
-<translation id="8324784016256120271">ဝဘ်ဆိုက်များသည် ဥပမာအနေနှင့် ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် မတူညီသည့် ဝဘ်ဆိုက်များတစ်လျှောက်တွင် ကွတ်ကီးများသုံးပြီး သင့်ကြည့်ရှုခြင်းများကို ကြည့်နိုင်သည်</translation>
+<translation id="8324784016256120271">ဝဘ်ဆိုက်များသည် ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် ဥပမာအားဖြင့် မတူညီသည့် ဝဘ်ဆိုက်များတစ်လျှောက်တွင် ကွတ်ကီးများသုံးပြီး သင့်ကြည့်ရှုခြင်းများကို ကြည့်နိုင်သည်</translation>
 <translation id="8326478304147373412">PKCS #7၊ လက်မှတ် ကွင်းဆက်</translation>
 <translation id="8327039559959785305">Linux ဖိုင်များကို တင်ရာတွင် အမှားအယွင်းရှိနေသည်။ ထပ်စမ်းကြည့်ပါ။</translation>
 <translation id="8327676037044516220">ခွင့်ပြုချက်များနှင့် အကြောင်းအရာ ဆက်တင်များ</translation>
@@ -5487,7 +5530,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> ကွန်ရက်၊ ချိတ်ဆက်နေသည်</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">ဦးစွာ မေးပါ (အကြံပြုထား)</translation>
-<translation id="8417573335434189196">အန္တရာယ်ရှိသော ဝဘ်ဆိုက်၊ ဒေါင်းလုဒ် သို့မဟုတ် နောက်ဆက်တွဲများ၏ ရန်မှ မကာကွယ်ပေးပါ။ Chrome သည် ဤဆက်တင်ကို အကြံမပြုပါ။</translation>
+<translation id="8417573335434189196">အန္တရာယ်ရှိသော ဝဘ်ဆိုက်၊ ဒေါင်းလုဒ် သို့မဟုတ် နောက်ဆက်တွဲများ၏ ရန်မှ ကာကွယ်မပေးပါ။ Chrome သည် ဤဆက်တင်ကို အကြံမပြုပါ။</translation>
 <translation id="8418445294933751433">တဲပ် အနေဖြင့် &amp;ပြ</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' အတွက် ရှာဖွေမှု ရလဒ်များ</translation>
 <translation id="8419368276599091549">သင့် <ph name="DEVICE_TYPE" /> မှ ကြိုဆိုပါသည်။</translation>
@@ -5624,6 +5667,7 @@
 <translation id="8608618451198398104">Kerberos လက်မှတ်တစ်ခု ထည့်ခြင်း</translation>
 <translation id="8609465669617005112">အပေါ်ရွှေ့ပါ</translation>
 <translation id="8610103157987623234">ပုံစံ မမှန်ပါ၊ ထပ်စမ်းကြည့်ပါ</translation>
+<translation id="8612935480510351790"><ph name="FILE_NAME" /> သည် အန္တရာယ်ရှိနိုင်သည်။ စစ်ဆေးရန် 'Google အဆင့်မြင့်ကာကွယ်ရေး' သို့ ပို့လိုပါသလား။</translation>
 <translation id="8613164732773110792">အက္ခရာအသေးများ၊ ဂဏန်းများ၊ အောက်မျဉ်းများ သို့မဟုတ် မျဉ်းတိုများသာ</translation>
 <translation id="8615618338313291042">ရုပ်ဖျက် အက်ပ်: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">အရိပ်ထည့်ခြင်း</translation>
@@ -5651,6 +5695,7 @@
 <translation id="8641606876632989680">ကျိုးပေါက်ထားသည့် စကားဝှက်ဖြင့် လက်မှတ်ထိုးဝင်သည့်အခါ Chrome က သင့်ကို ကြောင်းကြားပါမည်</translation>
 <translation id="8642900771896232685">၂ စက္ကန့်</translation>
 <translation id="8642947597466641025">စာလုံးပိုကြီးလာအောင် လုပ်</translation>
+<translation id="8643443571868262066"><ph name="FILE_NAME" /> သည် အန္တရာယ်ရှိနိုင်သည်။ စစ်ဆေးရန် 'Google အဆင့်မြင့်ကာကွယ်ရေး' သို့ ပို့လိုပါသလား။</translation>
 <translation id="8644655801811752511">ဤလုံခြုံရေးကီးကို ပြင်ဆင်သတ်မှတ်၍ မရပါ။ ကီးကိုထည့်ပြီးသည်နှင့် ချက်ချင်း ပြင်ဆင်သတ်မှတ်ကြည့်ပါ။</translation>
 <translation id="8645354835496065562">အာရုံခံကိရိယာ အသုံးပြုခွင့်ကို ဆက်လက်ခွင့်ပြုရန်</translation>
 <translation id="8645920082661222035">အန္တရာယ်ရှိသည့် ဖြစ်ရပ်များ မဖြစ်ပွားမီ ခန့်မှန်းပြီး သင့်အား သတိပေးသည်</translation>
@@ -6071,6 +6116,7 @@
 <translation id="9169931577761441333"><ph name="APP_NAME" /> ကို ပင်မစာမျက်နှာသို့ ထည့်ရန်</translation>
 <translation id="9170848237812810038">&amp;ပြန်ဖျက်ရန်</translation>
 <translation id="9170884462774788842">Chrome အလုပ်လုပ်ပုံပေါင်းလဲသွားစေမည့် အရောင်အဖွဲ့ တစ်ခုကို သင့်ကွန်ပျူတာရှိ အခြား ပရိုဂရမ်မှ ပေါင်းထည့်ခဲ့သည်။</translation>
+<translation id="917350715406657904"><ph name="APP_NAME" /> အတွက် သင့်မိဘသတ်မှတ်ထားသော အချိန်ကန့်သတ်ချက် ပြည့်သွားပြီ။ မနက်ဖြန်တွင် ၎င်းကို <ph name="TIME_LIMIT" /> ကြာ အသုံးပြုနိုင်သည်။</translation>
 <translation id="9173995187295789444">ဘလူးတုသ် စက်များ ရှာနေသည်…</translation>
 <translation id="9174401638287877180">အသုံးပြုမှုနှင့် အမှားရှာဖွေမှုဒေတာ ပို့ပါ။ အမှားရှာဖွေမှု၊ စက်ပစ္စည်းနှင့်အက်ပ် အသုံးပြုမှုဒေတာများကို Google သို့ အလိုအလျောက်ပို့၍ သင့်ကလေး၏ Android အသုံးပြုမှု ပိုမိုကောင်းမွန်လာစေရန် ကူညီပါ။ ၎င်းကို အသုံးပြု၍ သင့်ကလေး မည်သူမည်ဝါဖြစ်ကြောင်း ထုတ်ဖော်သွားမည် မဟုတ်ဘဲ စနစ်နှင့် အက်ပ်တည်ငြိမ်မှု၊ အခြား တိုးတက်ပြင်ဆင်မှုများအတွက် အသုံးပြုသွားပါမည်။ စုစည်းထားသော ဒေတာအချို့က Google အက်ပ်နှင့် Android ဆော့ဖ်ဝဲအင်ဂျင်နီယာများကဲ့သို့ ပါတနာများကို ကူညီပေးပါမည်။ သင့်ကလေးအတွက် ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သူ၏ Google အကောင့်သို့ သိမ်းသွားပါမည်။</translation>
 <translation id="917510707618656279">ဝဘ်ဆိုက်က ဘလူးတုသ်စက်များကို အသုံးပြုလိုသည့်အခါ ခွင့်တောင်းရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index ff3885d..ee6b8bab8 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -186,7 +186,6 @@
 <translation id="1241753985463165747">इन्भोक गरिएको बेला हालको वेबसाइटमा रहेका आफ्ना सम्पूर्ण डेटा पढ्नुहोस् र तिनीहरूलाई परिवर्तन गर्नुहोस्</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> तपाईँका सेटिङहरू रिसेट गर्न चाहन्छ।</translation>
 <translation id="1243314992276662751">अपलोड गर्नुहोस्</translation>
-<translation id="1243398753772016127">साइटहरूले विज्ञापन वैयक्तीकृत गर्ने प्रयोजनका लागि विभिन्न साइटमा तपाईंको ब्राउजिङसम्बन्धी क्रियाकलाप प्रयोग गर्न सक्दैनन्</translation>
 <translation id="1244265436519979884">हाल Linux को पुनर्स्थापना हुँदै छ</translation>
 <translation id="1244303850296295656">एक्स्टेन्सन त्रुटि</translation>
 <translation id="1246905108078336582">क्लिपबोर्डको सुझाव हटाउने हो?</translation>
@@ -353,7 +352,6 @@
 <translation id="1487335504823219454">सक्रिय - आफू अनुकूल सेटिङहरू</translation>
 <translation id="1489664337021920575">अर्को विकल्प छनौट गर्नुहोस्</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> लाई प्रतिक्षा गर्दै...</translation>
-<translation id="1494438840282430403">ब्राउजिङ डेटा (<ph name="URL" />) पनि हटाउनुहोस्। यस कार्यले तपाईंलाई Google.com बाट साइन आउट गराउन सक्ने छ।</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> अन्य उपलब्ध यन्त्रहरू।</translation>
 <translation id="1495677929897281669">ट्याबमा फर्कनुहोस्</translation>
 <translation id="1499271269825557605">तपाईंले कुनै एक्स्टेन्सन चिन्न सक्नुभएन भने वा तपाईंको ब्राउजरले अपेक्षा गरिएअनुसार काम गर्दै छैन भने तपाईं यहाँबाट एक्स्टेन्सनहरू निष्क्रिय पार्न वा तिनलाई आफूले रोजेअनुसार पार्न सक्नुहुन्छ।</translation>
@@ -514,6 +512,7 @@
 <translation id="1697686431566694143">फाइल सम्पादन गर्नुहोस्</translation>
 <translation id="1698122934742150150">हालको गुप्त सत्र मात्र</translation>
 <translation id="1698650002254827833">अनुप्रयोगहरूको सूची लोड गर्न सकिएन। कृपया पुनः प्रयास गर्नुहोस्।</translation>
+<translation id="1700079447639026019">कुकीहरू कदापि प्रयोग गर्न नपाउने साइटहरू</translation>
 <translation id="1701062906490865540">यो व्यक्तिलाई हटाउनुहोस्</translation>
 <translation id="1703331064825191675">आफ्ना पासवर्डका बारेमा कहिल्यै चिन्ता नगर्नुहोस्</translation>
 <translation id="1704970325597567340"><ph name="DATE" /> मा सुरक्षा जाँच गरिएको थियो</translation>
@@ -734,6 +733,7 @@
 <translation id="1990512225220753005">यस पृष्ठमा सर्टकटहरू नदेखाउनुहोस्</translation>
 <translation id="1992397118740194946">सेट गरिएको छैन</translation>
 <translation id="1994173015038366702">साइट URL</translation>
+<translation id="1995916364271252349">साइटहरूले के कस्ता जानकारी (स्थान, क्यामेरा, पप-अप र अन्य कुरा) प्रयोग गर्न र देखाउन पाउँछन् भन्ने कुरा नियन्त्रण गर्छ</translation>
 <translation id="1997484222658892567"><ph name="URL" /> तपाईंको स्थानीय कम्प्युटरमा स्थायी रूपमा ठूलो परिमाणको डेटा भण्डारण गर्न चाहन्छ</translation>
 <translation id="1997616988432401742">तपाईंका प्रमाणपत्रहरू</translation>
 <translation id="1999115740519098545">सुरूवातमा</translation>
@@ -989,6 +989,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# विन्डो बन्द गर्नुहोस्}other{# विन्डोहरू बन्द गर्नुहोस्}}</translation>
 <translation id="2335122562899522968">यो पेज कुकीहरू तय गर्नुहोस् ।</translation>
 <translation id="2336228925368920074">सबै ट्याबहरू लाई नुकमार्क गर्नुहोस्...</translation>
+<translation id="2336376423977300504">विन्डोहरू बन्द गरेपछि सधैँ कुकीहरू हटाइयोस्</translation>
 <translation id="2336381494582898602">पावरवास</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> जोडा बनाउन चाहन्छ</translation>
 <translation id="2342740338116612727">पुस्तक चिन्हहरू थपिए</translation>
@@ -1183,7 +1184,6 @@
 <translation id="2575247648642144396">जब एक्स्टेन्सनले हालको पृष्ठमा कार्य गर्न सक्छ तब यो प्रतिमालाई देख्न सकिनेछ। प्रतिमामा क्लिक गरेर वा <ph name="EXTENSION_SHORTCUT" /> लाई थिचेर यो एक्स्टेन्सन प्रयोग गर्नुहोस्।</translation>
 <translation id="257779572837908839">बैठकहरूका लागि क्रोमबक्सको रूपमा सेटअप गर्नुहोस्‌</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> लाई धेरै फाइलहरू डाउनलोड गर्ने अनुमति सँधै दिनुहोस्</translation>
-<translation id="2580924999637585241">जम्मा: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">लामो</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (मञ्च <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos को टिकट प्राप्त गर्न सकिएन। फेरि प्रयास गर्नुहोस् वा आफ्नो सङ्गठनका यन्त्र व्यवस्थापकलाई सम्पर्क गर्नुहोस्। (त्रुटि कोड <ph name="ERROR_CODE" />)।</translation>
@@ -1312,7 +1312,7 @@
 <translation id="2739191690716947896">डिबग गर्नुहोस्</translation>
 <translation id="2739240477418971307">आफ्नो पहुँच क्षमता सेटिङहरू परिवर्तन गर्नुहोस्</translation>
 <translation id="274029851662193272">दबेको</translation>
-<translation id="2741713322780029189">रिकोभरी टर्मिनल खोल्नुहोस्</translation>
+<translation id="2741713322780029189">रिकभरी टर्मिनल खोल्नुहोस्</translation>
 <translation id="2741912629735277980">लग इन गर्ने स्क्रिनको डिस्प्ले UI</translation>
 <translation id="274290345632688601">Linux का अनुप्रयोग तथा फाइलहरू पुनर्स्थापना गरिँदै</translation>
 <translation id="2743387203779672305">क्लिपबोर्डमा प्रतिलिपि बनाउँनुहोस्</translation>
@@ -1732,6 +1732,7 @@
 <translation id="3317459757438853210">दुई-छेउ भएको</translation>
 <translation id="3317678681329786349">क्यामेरा र माइक्रोफोन प्रयोग गर्नमाथि रोक लगाइयो</translation>
 <translation id="3319048459796106952">नयाँ &amp;इन्कोग्निटो विन्डो</translation>
+<translation id="3320630259304269485">सुरक्षित ब्राउजिङ (जोखिमपूर्ण साइटहरूबाट सुरक्षा) र सुरक्षासम्बन्धी अन्य सेटिङ</translation>
 <translation id="3323521181261657960">बोनस! तपाईंले यन्त्रमा हेरेर बिताउने थप समय प्राप्त गर्नुभयो</translation>
 <translation id="3325910708063135066">Mac का सिस्टमसम्बन्धी प्राथमिकताहरूमा क्यामेरा र माइक्रोफोन निष्क्रिय पारिएका छन्</translation>
 <translation id="3328489342742826322">कुनै ब्याकअपबाट पुनर्स्थापना गर्नुले विद्यमान Linux अनुप्रयोगहरू र तपाईंको Linux फाइलहरूको फोल्डरमा रहेको डेटा मेट्ने छ।</translation>
@@ -1851,6 +1852,7 @@
 <translation id="3487007233252413104">बेनाम प्रकार्य</translation>
 <translation id="348780365869651045">AppCache को प्रतीक्षामा...</translation>
 <translation id="3488065109653206955">आंशिक रूपमा सक्रिय बनाइएको</translation>
+<translation id="3489025949017384019">कयौँ साइटहरू राम्ररी नचल्न सक्छन्</translation>
 <translation id="3492788708641132712">सिंकले काम गरिरहेको छैन। फेरि साइन इन गरी हेर्नुहोस्।</translation>
 <translation id="3493486281776271508">इन्टरनेट जडान आवश्यक छ</translation>
 <translation id="3493881266323043047">वैधता</translation>
@@ -2006,6 +2008,7 @@
 <translation id="3688526734140524629">च्यानल परिवर्तन गर्नुहोस्</translation>
 <translation id="3688578402379768763">नवीनतम</translation>
 <translation id="3688794912214798596">भाषाहरू बदल्नुहोस्...</translation>
+<translation id="3690369331356918524">डेटा चोरीका घटनामा पासवर्डहरू खुलासा हुँदा तपाईंलाई चेतावनी दिन्छ</translation>
 <translation id="3691231116639905343">किबोर्डका अनुप्रयोगहरू</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> तपाईंको स्क्रिन आदान प्रदान गर्न चाहन्छ</translation>
 <translation id="369135240373237088">विद्यालयको खाता प्रयोग गरेर फेरि साइन इन गर्नुहोस्</translation>
@@ -2144,6 +2147,7 @@
 <translation id="3841964634449506551">पासवर्ड मिलेन</translation>
 <translation id="3842552989725514455">सेरिफ फन्ट</translation>
 <translation id="3846116211488856547">वेबसाइट, Android अनुप्रयोग र थप कुराहरू विकास गर्ने उपकरणहरू प्राप्त गर्नुहोस्। Linux स्थापना गर्नुले <ph name="DOWNLOAD_SIZE" /> डेटा डाउनलोड हुने छ।</translation>
+<translation id="3847319713229060696">वेब प्रयोग गर्ने सम्पूर्ण प्रयोगकर्ताहरूलाई सुरक्षित रहन मद्दत गर्नुहोस्</translation>
 <translation id="385051799172605136">पछाडि जानुहोस्</translation>
 <translation id="3850914401008572843"><ph name="ORIGIN" /> ले यो फोल्डर खोल्न सक्दैन किनभने यसमा प्रणालीका फाइलहरू छन्</translation>
 <translation id="3851428669031642514">असुरक्षित स्क्रिप्टहरू लोड गर्नुहोस्</translation>
@@ -2625,6 +2629,7 @@
 <translation id="4534661889221639075">फेरि प्रयास गर्नुहोस्।</translation>
 <translation id="4535127706710932914">पूर्वनिर्धारित प्रोफाइल</translation>
 <translation id="4535767533210902251">तपाईंको किबोर्डको दायाँतिर सबैभन्दा माथि रहेको कुञ्जी फिंगरप्रिन्ट सेन्सर हो। यसलाई कुनै एक औँलाले हल्का छुनुहोस्।</translation>
+<translation id="4536140153723794651">कुकीहरू सधैँ प्रयोग गर्न पाउने साइटहरू</translation>
 <translation id="4538417792467843292">शब्द मेट्नुहोस्</translation>
 <translation id="4538684596480161368"><ph name="HOST" />मा स्यान्डबक्स हटाइएको प्लग इनहरूलाई सधैँ रोक्नुहोस्।</translation>
 <translation id="4538792345715658285">उद्योग नीतिद्वारा स्थपित।</translation>
@@ -2722,6 +2727,7 @@
 <translation id="4665446389743427678"><ph name="SITE" /> ले भण्डारण गरेको सबै डेटा मेटाइने छ।</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> लाई सक्षम पार्न क्लिक गर्नुहोस्।</translation>
 <translation id="4670064810192446073">भर्चुअल रियालिटी</translation>
+<translation id="4672879467403304774">तपाईं साइन इन हुनुभएका बेला तपाईंलाई Chrome र Google का अन्य अनुप्रयोगहरूमा सुरक्षित राख्छ</translation>
 <translation id="46733273239502219">स्थापना गरिएका अनुप्रयोगहरूमा रहेको अफलाइन डेटा पनि हटाइने छ</translation>
 <translation id="4673442866648850031">स्टाइलस निकाल्दा स्टाइलस सम्बन्धी उपकरणहरू खोल्नुहोस्</translation>
 <translation id="4677772697204437347">GPU स्मृति</translation>
@@ -2806,7 +2812,6 @@
 <translation id="4808667324955055115">रोक लगाइएका पपअपहरू:</translation>
 <translation id="480990236307250886">गृह पृष्ठ खोल्नुहोस्</translation>
 <translation id="4811503964269049987">चयन गरिएको ट्याब कुनै समूहमा थप्नुहोस्</translation>
-<translation id="4811818760963189951">तपाईंले इतिहास सिंक असक्षम पार्नुभएको हुँदा निष्क्रिय पारियो</translation>
 <translation id="4813136279048157860">मेरा छविहरू</translation>
 <translation id="4813512666221746211">सञ्जाल त्रुटि</translation>
 <translation id="4814378367953456825">यो फिंगरप्रिन्टको नाम प्रविष्टि गर्नुहोस्</translation>
@@ -2975,7 +2980,6 @@
 <translation id="5040823038948176460">सामग्रीका अतिरिक्त सेटिङहरू</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> लाई Linux मा जडान गर्न सेटिङहरू खोल्नुहोस्</translation>
 <translation id="5043913660911154449">वा आफ्नो प्रिन्टरको PPD तोक्नुहोस् <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">तपाईंले एउटा पासफ्रेज प्रयोग गरी आफ्नो सिंक गरिएको डेटा इन्क्रिप्ट गर्नुभएको हुँदा निष्क्रिय पारियो</translation>
 <translation id="5045550434625856497">गलत पासवर्ड</translation>
 <translation id="504561833207953641">विद्यमान ब्राउजर सत्रमा खोल्दै।</translation>
 <translation id="5047421709274785093">साइटहरूलाई चाल र प्रकाशसम्बन्धी सेन्सरहरू प्रयोग गर्नबाट रोक लगाउनुहोस्</translation>
@@ -3140,6 +3144,7 @@
 <translation id="5275352920323889391">कुकुर</translation>
 <translation id="527605982717517565"><ph name="HOST" /> मा सँधै जाभास्क्रिप्टको लागि अनुम</translation>
 <translation id="5280174558369304332">हटाइनु पर्ने विस्तारहरू:</translation>
+<translation id="5280243692621919988">तपाईंले सबै विन्डो बन्द गरेपछि कुकी र साइटका डेटा हटाइयोस्</translation>
 <translation id="5280426389926346830">सर्टकट सिर्जना गर्ने हो?</translation>
 <translation id="528208740344463258">Android अनुप्रयोगहरू डाउनलोड गर्न र प्रयोग गर्न, तपाईंले पहिले यो आवश्यक अद्यावधिक स्थापना गर्नु पर्छ। तपाईंको <ph name="DEVICE_TYPE" /> अद्यावधिक भइरहेका अवस्थामा, तपाईं यसलाई प्रयोग गर्न सक्नुहुन्न। स्थापना सम्पन्न भएपछि, तपाईंको <ph name="DEVICE_TYPE" /> पुनः सुरु हुने छ।</translation>
 <translation id="5282733140964383898">‘ट्रयाक नगर्नुहोस्’ लाई सक्रिय गर्नु भनेको अनुरोधलाई तपाईंको ब्राउजिङ ट्राफिकसँग संलग्न गरिनेछ। कुनै पनि प्रभाव वेबसाइटले अनुरोधमा गरेको प्रतिक्रिया र अनुरोधलाई वर्णन गरिएको आधारमा निर्भर हुन्छ। उदाहरणका लागि, तपाईंले हेर्नुभएको अन्य वेबसाइटहरूमा आधारित नरहेका विज्ञापनहरू देखाएर केही वेबसाइटहरूले यस अनुरोधमा प्रतिक्रिया दिन सक्छन्। धैरै वेबसाइटहरूले अझै पनि सुरक्षामा सुधार गर्ने, उनीहरूका वेबसाइटहरूमा सामग्री, सेवा, विज्ञापन र सिफारिस प्रदान गर्ने र रिपोर्ट गर्ने, तथ्याङ्कहरू उत्पन्न गर्ने जस्ता तपाईंको ब्राउजिङ डेटालाई सङ्कलन र प्रयोग गर्न सक्छन्। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation>
@@ -3950,7 +3955,6 @@
 <translation id="63566973648609420">तपाईंको इन्क्रिप्ट गरिएको डेटालाई तपाईंको पासफ्रेज भएको व्यक्तिले मात्र पढ्न सक्छ। पासफ्रेजलाई Google मा पठाइँदैन वा त्यहाँ भण्डारण गरिदैन। यदि तपाईंले आफ्नो पासफ्रेज बिर्सनुभयो वा यस सेटिङलाई परिवर्तन गर्न चाहनुहुन्छ भने तपाईंले <ph name="BEGIN_LINK" />सिंकलाई रिसेट<ph name="END_LINK" /> गर्नुपर्ने हुन्छ।</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> परिवारमा स्वागत छ। यो कुनै साधारण कम्प्युटर होइन।</translation>
 <translation id="6358884629796491903">ड्रागन</translation>
-<translation id="6360719647236334056">खोज, विज्ञापन तथा Google का अन्य सेवाहरू आफू अनुकूल पार्न आफ्नो Chrome को ब्राउजिङ इतिहासको प्रयोग गर्नुहोस्</translation>
 <translation id="6361850914223837199">त्रुटि विवरणहरू:</translation>
 <translation id="6362853299801475928">एउटा मामिलालाई &amp;रिपोर्ट गर्नुहोस्...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4228,10 +4232,10 @@
 <translation id="6758056191028427665">हामी कस्तो काम गर्दैछौं भन्नेबारे प्रतिक्रिया दिनुहोस्।</translation>
 <translation id="6759193508432371551">कारखाना रिसेट</translation>
 <translation id="6762833852331690540">सक्रिय छ</translation>
-<translation id="6764693078871405569">ब्राउजिङ डेटा (<ph name="URL" />) पनि हटाउनुहोस्। यस कार्यले तपाईंलाई <ph name="DOMAIN" /> बाट साइन आउट गराउने छ।</translation>
 <translation id="6767566652486411142">अर्को भाषा छनौट गर्नुहोस्...</translation>
 <translation id="6767639283522617719">डोमेन जोड्न सकिँदैन। संगठनात्मक एकाइका लागि सेटिङहरू सही छन् भन्ने सुनिश्चित गर्नुहोस्।</translation>
 <translation id="6769712124046837540">मुद्रक थप्दै...</translation>
+<translation id="6770602306803890733">तपाईं र वेब प्रयोग गर्ने सम्पूर्ण प्रयोगकर्ताहरूलाई झन् सुरक्षित राख्छ</translation>
 <translation id="6770664076092644100">NFC मार्फत पुष्टि गर्नुहोस्</translation>
 <translation id="6771503742377376720">एउटा प्रमाणीकरण अधिकार हो</translation>
 <translation id="6772339735733515807">आफ्ना एक्स्टेन्सनहरूको व्यवस्थापन गर्नुहोस्</translation>
@@ -4257,6 +4261,7 @@
 <translation id="6798578729981748444">आयात गर्ने कार्य समाप्त गर्न Firefox का सबै विन्डोहरू बन्द गर्नुहोस्।</translation>
 <translation id="6798780071646309401">क्याप्स लक सक्रिय छ</translation>
 <translation id="6798954102094737107">प्लगइन: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">सामान्य सेटिङ</translation>
 <translation id="6801435275744557998">टचस्क्रिनलाई क्यालिब्रेट गर्नुहोस्</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">ठिक छ</translation>
@@ -4375,6 +4380,8 @@
 <translation id="6965382102122355670">ठिक छ</translation>
 <translation id="6965648386495488594">पोर्ट</translation>
 <translation id="6965978654500191972">यन्त्र</translation>
+<translation id="6966201992886493384">तपाईंलाई साइन इन अवस्थामै राख्ने वा तपाईंको किनमेलको कार्टमा भएका वस्तुहरू सम्झने जस्ता तपाईंका ब्राउजिङ अनुभवमा सुधार ल्याउन साइटहरूले कुकीहरूको प्रयोग गर्न सक्छन्</translation>
+<translation id="696780070563539690">साइटहरूले तपाईंका गतिविधिअनुसार विज्ञापन देखाउने जस्ता प्रयोजनहरूका लागि विभिन्न साइटहरूमा तपाईंको ब्राउजिङसम्बन्धी गतिविधि हेर्न तपाईंका कुकीहरूको प्रयोग गर्न सक्दैनन्</translation>
 <translation id="6968288415730398122">स्क्रिन लक कन्फिगर गर्न आफ्नो पासवर्ड प्रविष्टि गर्नुहोस्</translation>
 <translation id="6970480684834282392">स्टार्टअप प्रकार</translation>
 <translation id="6970856801391541997">निर्दिष्ट पृष्ठहरू प्रिन्ट गर्नुहोस्</translation>
@@ -4784,6 +4791,7 @@
 <translation id="7507207699631365376">यो प्रदायकको <ph name="BEGIN_LINK" />गोपनीयता नीति<ph name="END_LINK" /> हेर्नुहोस्</translation>
 <translation id="7507930499305566459">स्थिति जवाफकर्ता प्रमाणपत्र</translation>
 <translation id="7508054832109420082">प्रिन्टरहरूमाथि पहुँच राख्न दिनुहोस्</translation>
+<translation id="751120035300339">तपाईंलाई साइन इन अवस्थामै राख्ने वा तपाईंको किनमेलको कार्टमा भएका वस्तुहरू सम्झने जस्ता तपाईंका ब्राउजिङ अनुभवमा सुधार ल्याउन साइटहरूले कुकीहरूको प्रयोग गर्न सक्दैनन्</translation>
 <translation id="7513029293694390567">भण्डारण गरिएका प्रमाणपत्रहरूको प्रयोग गरेर वेबसाइटहरूमा स्वचालित रूपमा साइन इन गर्नुहोस्। यो सुविधा असक्षम गरिएमा वेबसाइटमा साइन इन गर्नुभन्दा पहिले तपाईंलाई हरेक पटक पुुष्टि गर्न भनिने छ।</translation>
 <translation id="7514239104543605883">प्रतिलिपि गरी तपाईंको यन्त्रमा टाँस्नुहोस्</translation>
 <translation id="7514365320538308">डाउनलोड गर्नुहोस्</translation>
@@ -5413,6 +5421,7 @@
 <translation id="8320459152843401447">तपाईँको सम्पूर्ण स्क्रिन</translation>
 <translation id="8322814362483282060">यो पृष्ठलाई तपाईंको माइक्रोफोनको पहुँच गर्नबाट ब्लक गरिएको छ।</translation>
 <translation id="8323167517179506834">युआरएल टाइप गर्नुहोस्</translation>
+<translation id="8324784016256120271">साइटहरूले तपाईंका गतिविधिअनुसार विज्ञापन देखाउने जस्ता प्रयोजनहरूका लागि विभिन्न साइटहरूमा तपाईंको ब्राउजिङसम्बन्धी गतिविधि हेर्न कुकीहरूको प्रयोग गर्न सक्छन्</translation>
 <translation id="8326478304147373412">PKCS # 7, प्रमाणपत्र चेन</translation>
 <translation id="8327039559959785305">Linux का फाइलहरू माउन्ट गर्ने क्रममा त्रुटि भयो। कृपया फेरि प्रयास गर्नुहोस्।</translation>
 <translation id="8327676037044516220">अनुमति र सामग्रीसम्बन्धी सेटिङहरू</translation>
@@ -5468,6 +5477,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> नेटवर्क, जोड्दै</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">पहिलो (सिफारिस गरिएको) सोध्नुहोस्</translation>
+<translation id="8417573335434189196">तपाईंलाई जोखिमपूर्ण वेबसाइट, डाउनलोड र एक्स्टेन्सनहरूबाट सुरक्षा प्रदान गर्दैन। Chrome यो सेटिङ लागू गर्न सिफारिस गर्दैन।</translation>
 <translation id="8418445294933751433">&amp;ट्याबको रूपमा देखाउनुहोस्</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' सम्बन्धी खोजका परिणामहरू</translation>
 <translation id="8419368276599091549">तपाईंको <ph name="DEVICE_TYPE" /> मा स्वागत छ!</translation>
@@ -5633,6 +5643,7 @@
 <translation id="8642947597466641025">पाठ ठूलो बानउनुहोस्</translation>
 <translation id="8644655801811752511">यो सुरक्षा साँचो रिसेट गर्न सकिएन। साँचो प्रविष्टि गर्नेबित्तिकै यसलाई रिसेट गरी हेर्नुहोस्।</translation>
 <translation id="8645354835496065562">सेन्सरलाई पहुँच राख्ने अनुमति दिन जारी राख्नुहोस्</translation>
+<translation id="8645920082661222035">जोखिमपूर्ण घटनाहरू घट्नुअघि नै तिनको पूर्वानुमान गर्छ र तपाईंलाई त्यसबारे चेतावनी दिन्छ</translation>
 <translation id="8647834505253004544">मान्य वेब ठेगाना होइन</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> वा <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">आफ्नो पुरानो प्रोफाइलमाथि अब उप्रान्त पहुँच राख्न नसके तापनि तपाईं अझै पनि यसलाई हटाउन भने सक्नुहुन्छ।</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 19b321c..b4128f7 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Al je gegevens op de huidige website lezen en wijzigen wanneer dit wordt aangeroepen</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> wil je instellingen resetten.</translation>
 <translation id="1243314992276662751">Uploaden</translation>
-<translation id="1243398753772016127">Sites kunnen je browse-activiteit op verschillende sites niet gebruiken om advertenties te personaliseren.</translation>
 <translation id="1244265436519979884">Linux-herstel wordt momenteel uitgevoerd</translation>
 <translation id="1244303850296295656">Fout met extensie</translation>
 <translation id="1246905108078336582">Suggestie verwijderen van klembord?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Aan - aangepaste instellingen</translation>
 <translation id="1489664337021920575">Een andere optie kiezen</translation>
 <translation id="1493892686965953381">Wachten op <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Ook browsergegevens wissen (<ph name="URL" />). Als je dit doet, kun je worden uitgelogd bij Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> andere beschikbare apparaten.</translation>
 <translation id="1495677929897281669">Terug naar tabblad</translation>
 <translation id="1499271269825557605">Als je een extensie niet herkent of als je browser niet werkt zoals verwacht, kun je extensies hier uitschakelen of aanpassen.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Dit pictogram is zichtbaar wanneer de extensie acties kan uitvoeren op de huidige pagina. Gebruik deze extensie door op het pictogram te klikken of op <ph name="EXTENSION_SHORTCUT" /> te drukken.</translation>
 <translation id="257779572837908839">Instellen als Chromebox for meetings</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> altijd toestaan meerdere bestanden te downloaden</translation>
-<translation id="2580924999637585241">Totaal: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lang</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kan Kerberos-ticket niet ophalen. Probeer het opnieuw of neem contact op met de apparaatbeheerder van je organisatie. (Foutcode <ph name="ERROR_CODE" />).</translation>
@@ -2144,7 +2141,7 @@
 <translation id="383161972796689579">De eigenaar van dit apparaat heeft het toevoegen van nieuwe gebruikers uitgeschakeld</translation>
 <translation id="3834775135533257713">De app <ph name="TO_INSTALL_APP_NAME" /> kan niet worden toegevoegd, omdat deze conflicten veroorzaakt met <ph name="INSTALLED_APP_NAME" />.</translation>
 <translation id="3835522725882634757">O nee! Deze server verzendt gegevens die <ph name="PRODUCT_NAME" /> niet begrijpt. <ph name="BEGIN_LINK" />Meld een fout<ph name="END_LINK" /> en voeg de <ph name="BEGIN2_LINK" />onbewerkte vermelding<ph name="END2_LINK" /> toe.</translation>
-<translation id="383669374481694771">Dit is algemene informatie over dit apparaat en hoe je het gebruikt (zoals batterijniveau, systeem- en app-activiteit en fouten). De gegevens worden gebruikt om Android te verbeteren voor iedereen. Daarnaast helpen bepaalde verzamelde gegevens Google-apps en -partners, zoals Android-ontwikkelaars bij de verbetering van hun apps en producten.</translation>
+<translation id="383669374481694771">Dit is algemene informatie over dit apparaat en hoe je het gebruikt (zoals batterijniveau, systeem- en app-activiteit en fouten). De gegevens worden gebruikt om Android te verbeteren voor iedereen. Daarnaast helpen bepaalde verzamelde gegevens Google-apps en -partners, zoals Android-ontwikkelaars, bij de verbetering van hun apps en producten.</translation>
 <translation id="3838085852053358637">Kan extensie niet laden</translation>
 <translation id="3838486795898716504">Meer <ph name="PAGE_TITLE" /></translation>
 <translation id="3838543471119263078">Cookies en andere site- en plug-ingegevens</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Pop-ups geblokkeerd:</translation>
 <translation id="480990236307250886">Open de homepage</translation>
 <translation id="4811503964269049987">Geselecteerd tabblad toevoegen aan groep</translation>
-<translation id="4811818760963189951">Uitgeschakeld omdat je de synchronisatie van geschiedenis hebt uitgeschakeld</translation>
 <translation id="4813136279048157860">Mijn afbeeldingen</translation>
 <translation id="4813512666221746211">Netwerkfout</translation>
 <translation id="4814378367953456825">Geef een naam op voor deze vingerafdruk</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Aanvullende contentinstellingen</translation>
 <translation id="5042282098504489593">Instellingen openen om <ph name="USB_DEVICE_NAME" /> te verbinden met Linux</translation>
 <translation id="5043913660911154449">Of geef de PPD van je printer op. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Uitgeschakeld omdat je je gesynchroniseerde gegevens hebt versleuteld met een wachtwoordzin</translation>
 <translation id="5045550434625856497">Onjuist wachtwoord</translation>
 <translation id="504561833207953641">Wordt geopend in een bestaande browsersessie.</translation>
 <translation id="5047421709274785093">Het gebruik van bewegings- en lichtsensoren blokkeren voor alle sites</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />synchronisatie resetten<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Welkom bij de <ph name="SHORT_PRODUCT_NAME" />-familie. Dit is geen gewone computer.</translation>
 <translation id="6358884629796491903">Draak</translation>
-<translation id="6360719647236334056">Je Chrome-browsegeschiedenis gebruiken om Google Zoeken, advertenties en andere Google-services te personaliseren</translation>
 <translation id="6361850914223837199">Foutdetails:</translation>
 <translation id="6362853299801475928">&amp;Een probleem melden...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Laat ons weten of we goed bezig zijn.</translation>
 <translation id="6759193508432371551">Terugzetten op fabrieksinstellingen</translation>
 <translation id="6762833852331690540">Aan</translation>
-<translation id="6764693078871405569">Ook browsergegevens wissen (<ph name="URL" />). Als je dit doet, word je uitgelogd bij <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Een andere taal kiezen…</translation>
 <translation id="6767639283522617719">Kan het domein niet koppelen. Zorg ervoor dat je de juiste instellingen gebruikt voor de organisatie-eenheid.</translation>
 <translation id="6769712124046837540">Printer toevoegen…</translation>
@@ -5741,7 +5734,7 @@
 <translation id="8737709691285775803">Shill</translation>
 <translation id="8738766971144275885">Dit bestand is versleuteld en kan niet worden geopend.</translation>
 <translation id="8742371904523228557">Je code voor <ph name="ORIGIN" /> is<ph name="ONE_TIME_CODE" />.</translation>
-<translation id="8742998548129056176">Dit is algemene informatie over je apparaat en hoe je het gebruikt (zoals batterijniveau, systeem- en app-activiteit en fouten). De gegevens worden gebruikt om Android te verbeteren voor iedereen. Daarnaast helpen bepaalde verzamelde gegevens Google-apps en -partners, zoals Android-ontwikkelaars bij de verbetering van hun apps en producten.</translation>
+<translation id="8742998548129056176">Dit is algemene informatie over je apparaat en hoe je het gebruikt (zoals batterijniveau, systeem- en app-activiteit en fouten). De gegevens worden gebruikt om Android te verbeteren voor iedereen. Daarnaast helpen bepaalde verzamelde gegevens Google-apps en -partners, zoals Android-ontwikkelaars, bij de verbetering van hun apps en producten.</translation>
 <translation id="8743390665131937741">Zoomniveau volledig scherm:</translation>
 <translation id="8743864605301774756">1 uur geleden geüpdatet</translation>
 <translation id="8746654918629346731">Je hebt '<ph name="EXTENSION_NAME" />' al aangevraagd</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 83a09b5f..858eb0c 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">lese og endre alle dataene dine på det nåværende nettstedet ved start</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> vil tilbakestille innstillingene dine.</translation>
 <translation id="1243314992276662751">Last opp</translation>
-<translation id="1243398753772016127">Nettsteder kan ikke bruke nettleseraktiviteten din fra ulike nettsteder for å vise deg personlig tilpassede annonser</translation>
 <translation id="1244265436519979884">Linux-gjenoppretting pågår</translation>
 <translation id="1244303850296295656">Feil med utvidelse</translation>
 <translation id="1246905108078336582">Vil du fjerne forslaget fra utklippstavlen?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">På – egendefinerte innstillinger</translation>
 <translation id="1489664337021920575">Velg et annet alternativ</translation>
 <translation id="1493892686965953381">Venter på <ph name="LOAD_STATE_PARAMETER" /> …</translation>
-<translation id="1494438840282430403">Slett også nettlesingsdata (<ph name="URL" />), noe som kan medføre at du blir logget av Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> andre tilgjengelige enheter.</translation>
 <translation id="1495677929897281669">Tilbake til fanen</translation>
 <translation id="1499271269825557605">Hvis det er utvidelser du ikke kjenner igjen, eller hvis nettleseren ikke fungerer som forventet, kan du slå av eller tilpasse utvidelser her.</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Dette ikonet vises når utvidelsen kan brukes på den gjeldende siden. Aktivér utvidelsen ved å klikke på ikonet eller trykke på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfigurer som en Chromebox for møter</translation>
 <translation id="2580889980133367162">Tillat alltid at <ph name="HOST" /> laster ned flere filer</translation>
-<translation id="2580924999637585241">Totalt: <ph name="SHEETS_LABEL" /> <ph name="NUMBER_OF_SHEETS" /></translation>
 <translation id="258095186877893873">Lang</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> – <ph name="PRODUCT_VERSION" /> (plattform <ph name="PLATFORM_VERSION" />) – <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kunne ikke hente Kerberos-saken. Prøv på nytt, eller kontakt enhetsadministratoren for organisasjonen din. (Feilkode <ph name="ERROR_CODE" />).</translation>
@@ -2814,7 +2811,6 @@
 <translation id="4808667324955055115">Blokkerte forgrunnsvinduer:</translation>
 <translation id="480990236307250886">Åpne startsiden</translation>
 <translation id="4811503964269049987">Gruppér den valgte fanen</translation>
-<translation id="4811818760963189951">Slått av fordi du har deaktivert loggsynkronisering</translation>
 <translation id="4813136279048157860">Mine bilder</translation>
 <translation id="4813512666221746211">Nettverksfeil</translation>
 <translation id="4814378367953456825">Skriv inn et navn for dette fingeravtrykket</translation>
@@ -2983,7 +2979,6 @@
 <translation id="5040823038948176460">Flere innholdsinnstillinger</translation>
 <translation id="5042282098504489593">Åpne Innstillinger for å koble <ph name="USB_DEVICE_NAME" /> til Linux</translation>
 <translation id="5043913660911154449">Eller angi PPD-fil for skriveren <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Slått av fordi du har kryptert synkroniseringsdataene med en passordfrase.</translation>
 <translation id="5045550434625856497">Feil passord</translation>
 <translation id="504561833207953641">Åpner i den eksisterende nettleserøkten.</translation>
 <translation id="5047421709274785093">Blokkér nettsteder fra å bruke bevegelses- og lyssensorer</translation>
@@ -3960,7 +3955,6 @@
 <translation id="63566973648609420">Bare de som har passordfrasen din, kan lese de krypterte dataene dine. Passordfrasen blir verken sendt til Google eller lagret av oss. Hvis du glemmer passordfrasen eller vil endre denne innstillingen, må du <ph name="BEGIN_LINK" />tilbakestille synkroniseringen<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Velkommen til <ph name="SHORT_PRODUCT_NAME" />-familien. Dette er ingen vanlig datamaskin.</translation>
 <translation id="6358884629796491903">Drage</translation>
-<translation id="6360719647236334056">Bruk Chrome-nettleserloggen for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation>
 <translation id="6361850914223837199">Feildetaljer:</translation>
 <translation id="6362853299801475928">&amp;Rapportér et problem</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4238,7 +4232,6 @@
 <translation id="6758056191028427665">Gi oss tilbakemelding.</translation>
 <translation id="6759193508432371551">Tilbakestilling til fabrikkstandard</translation>
 <translation id="6762833852331690540">På</translation>
-<translation id="6764693078871405569">Slett også nettlesingsdata (<ph name="URL" />), noe som medfører at du blir logget av <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Velg et annet språk</translation>
 <translation id="6767639283522617719">Kan ikke bli med på domenet. Kontrollér at innstillingene for organisasjonsenheten er riktige.</translation>
 <translation id="6769712124046837540">Legger til skriver …</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index f5e8634..5fcb623 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -187,7 +187,6 @@
 <translation id="1241753985463165747">ଲାଗୁ କରାଗଲେ ସାମ୍ପ୍ରତିକ ୱେବ୍‍ସାଇଟ୍‍‍ରେ ଆପଣଙ୍କ ଡାଟା ପଢ଼ନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ଆପଣଙ୍କର ସେଟିଂସ୍‌କୁ ରିସେଟ୍ କରିବାକୁ ଚାହୁଁଛି।</translation>
 <translation id="1243314992276662751">ଅପ୍‌ଲୋଡ୍ କରନ୍ତୁ</translation>
-<translation id="1243398753772016127">ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବାକୁ ଭିନ୍ନ ସାଇଟ୍‍ଗୁଡ଼ିକରେ ସାଇଟ୍‍ଗୁଡ଼ିକ ଆପଣଙ୍କର ବ୍ରାଉଜିଂ କାର୍ଯ୍ୟକଳାପ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ</translation>
 <translation id="1244265436519979884">ବର୍ତ୍ତମାନ Linuxର ରିଷ୍ଟୋର୍ ଚାଲିଛି</translation>
 <translation id="1244303850296295656">ଏକ୍ସଟେନ୍‌ସନ୍ ତ୍ରୁଟି</translation>
 <translation id="1246905108078336582">କ୍ଲିପ୍‍‍ବୋର୍ଡରୁ ପ୍ରସ୍ତାବ କାଢ଼ି ଦେବେ?</translation>
@@ -354,7 +353,6 @@
 <translation id="1487335504823219454">ଅନ୍ - କଷ୍ଟମ୍ ସେଟିଂସ୍</translation>
 <translation id="1489664337021920575">ଅନ୍ୟ ଏକ ବିକଳ୍ପ ବାଛନ୍ତୁ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> ପାଇଁ ଅପେକ୍ଷାରତ...</translation>
-<translation id="1494438840282430403">ଆପଣଙ୍କୁ Google.comରୁ ସାଇନ୍ ଆଉଟ୍ କରିଦେଇପାରୁଥିବା ବ୍ରାଉଜିଂ ଡାଟା (<ph name="URL" />)କୁ ମଧ୍ୟ ଖାଲି କରନ୍ତୁ।</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ଅନ୍ୟ ଉପଲବ୍ଧ ଥିବା ଡିଭାଇସ୍‌</translation>
 <translation id="1495677929897281669">ଟାବ୍‌କୁ ଫେରନ୍ତୁ</translation>
 <translation id="1499271269825557605">ଯଦି ଆପଣ କୌଣସି ଏକ୍ସଟେନ୍‌ସନ୍‍କୁ ଚିହ୍ନଟ କରିପାରୁନାହାଁନ୍ତି କିମ୍ବା ଆପଣଙ୍କର ବ୍ରାଉଜର୍ ଆଶା ଅନୁଯାୟୀ କାର୍ଯ୍ୟ କରୁନାହିଁ, ତେବେ ଆପଣ ଏଠାରେ ଏକ୍ସଟେନ୍‌ସନ୍‍ଗୁଡ଼ିକୁ ବନ୍ଦ କରିପାରିବେ କିମ୍ବା କଷ୍ଟମାଇଜ୍ କରିପାରିବେ।</translation>
@@ -514,6 +512,7 @@
 <translation id="1697686431566694143">ଫାଇଲ୍ ଏଡିଟ୍ କରନ୍ତୁ</translation>
 <translation id="1698122934742150150">କେବଳ ବର୍ତ୍ତମାନର ଇନ୍‌କଗ୍ନିଟୋ ସମୟ ଅବଧି</translation>
 <translation id="1698650002254827833">ଆପ୍ସର ତାଲିକା ଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
+<translation id="1700079447639026019">କୁକୀଗୁଡ଼ିକୁ କେବେ ବି ବ୍ୟବହାର କରିପାରୁନଥିବା ସାଇଟଗୁଡ଼ିକ</translation>
 <translation id="1701062906490865540">ଏହି ବ୍ୟକ୍ତିଙ୍କୁ ବାହାର କରନ୍ତୁ</translation>
 <translation id="1703331064825191675">ଆପଣଙ୍କର ପାସ୍‍ୱାର୍ଡଗୁଡ଼ିକ ବିଷୟରେ କେବେ ବି ଚିନ୍ତା କରନ୍ତୁ ନାହିଁ</translation>
 <translation id="1704970325597567340">ସୁରକ୍ଷା ଯାଞ୍ଚ <ph name="DATE" />ରେ ଚାଲିଥିଲା</translation>
@@ -734,6 +733,7 @@
 <translation id="1990512225220753005">ଏହି ପୃଷ୍ଠାରେ ସର୍ଟକଟ୍‌ଗୁଡ଼ିକ ଦେଖାନ୍ତୁ ନାହିଁ</translation>
 <translation id="1992397118740194946">ସେଟ୍ ହୋଇନାହିଁ</translation>
 <translation id="1994173015038366702">ସାଇଟ୍ URL</translation>
+<translation id="1995916364271252349">ସାଇଟଗୁଡ଼ିକ କେଉଁ ସୂଚନା ବ୍ୟବହାର କରିପାରିବ ଏବଂ ଦେଖାଇପାରିବ ତାହା ନିୟନ୍ତ୍ରଣ କରେ (ଲୋକେସନ୍, କ୍ୟାମେରା, ପପ୍-ଅପଗୁଡ଼ିକ ଏବଂ ଆହୁରି ଅନେକ କିଛି)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> ସ୍ଥାୟୀରୂପେ ଆପଣଙ୍କର ସ୍ଥାନୀୟ କମ୍ପ୍ୟୁଟର୍‌ରେ ଅଧିକ ଡାଟା ଷ୍ଟୋର୍ କରିବାକୁ ଚାହୁଁଛି</translation>
 <translation id="1997616988432401742">ଆପଣଙ୍କ ସାର୍ଟିଫିକେଟ୍</translation>
 <translation id="1999115740519098545">ଆରମ୍ଭ ପୃଷ୍ଠାରେ</translation>
@@ -989,6 +989,7 @@
 <translation id="2335111415680198280">{0,plural, =1{#ଟି ୱିଣ୍ଡୋ ବନ୍ଦ କରନ୍ତୁ}other{#ଟି ୱିଣ୍ଡୋ ବନ୍ଦ କରନ୍ତୁ}}</translation>
 <translation id="2335122562899522968">ଏହି ପୃଷ୍ଠା କୁକୀଗୁଡ଼ିକ ସେଟ୍ କରେ।</translation>
 <translation id="2336228925368920074">ସମସ୍ତ ଟାବ୍‌କୁ ବୁକ୍‌ମାର୍କ କରନ୍ତୁ...</translation>
+<translation id="2336376423977300504">ୱିଣ୍ଡୋଗୁଡ଼ିକ ବନ୍ଦ ଥିବା ସମୟରେ ସର୍ବଦା କୁକୀଗୁଡ଼ିକୁ ଖାଲି କରନ୍ତୁ</translation>
 <translation id="2336381494582898602">ପାୱାର୍‍ୱାସ୍</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> ପେୟାର୍ କରିବାକୁ ଚାହୁଁଛି</translation>
 <translation id="2342740338116612727">ବୁକ୍‌ମାର୍କ ଯୋଗ କରାଗଲା</translation>
@@ -1182,7 +1183,6 @@
 <translation id="2575247648642144396">ଏହି ଆଇକନ୍ ସେତେବେଳେ ଦେଖାଦେବ, ଯେତେବେଳେ ଏକ୍ସଟେନ୍‌ସନ୍‌ ସାମ୍ପ୍ରତିକ ପୃଷ୍ଠାରେ କାର୍ଯ୍ୟ କରିପାରିବ। ଆଇକନ୍ ଉପରେ କ୍ଲିକ୍ କରି କିମ୍ବା<ph name="EXTENSION_SHORTCUT" /> ଦବାଇ ଏହି ଏକ୍ସଟେନ୍‌ସନ୍‌କୁ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="257779572837908839">ମିଟିଂ ପାଇଁ Chromebox ରୂପେ ସେଟ୍ ଅପ୍ କରନ୍ତୁ</translation>
 <translation id="2580889980133367162">ଏକାଧିକ ଫାଇଲ୍‌କୁ ଡାଉନ୍‌ଲୋଡ୍ କରିବାକୁ ସର୍ବଦା <ph name="HOST" />କୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation>
-<translation id="2580924999637585241">ସମୁଦାୟ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ଲମ୍ଵା</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (ପ୍ଲାଟ୍‌ଫର୍ମ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos ଟିକେଟ୍ ମିଳିଲା ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ବା ଆପଣଙ୍କ ସଂସ୍ଥାର ଡିଭାଇସ୍ ଆଡ୍‍ମିନ୍‍ଙ୍କ ସହିତ ଯୋଗାଯୋଗ କରନ୍ତୁ। (ତ୍ରୁଟି କୋଡ୍ <ph name="ERROR_CODE" />)।</translation>
@@ -1730,6 +1730,7 @@
 <translation id="3317459757438853210">ଦୁଇ-ତରଫା</translation>
 <translation id="3317678681329786349">କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ବ୍ଲକ୍ ଅଛି</translation>
 <translation id="3319048459796106952">&amp;ନୂତନ ଗୁପ୍ତ ୱିଣ୍ଡୋ</translation>
+<translation id="3320630259304269485">ସେଫ୍ ବ୍ରାଉଜିଂ (ବିପଦଜନକ ସାଇଟଗୁଡ଼ିକ ଠାରୁ ସୁରକ୍ଷା) ଏବଂ ଅନ୍ୟ ସୁରକ୍ଷା ସେଟିଂସ୍</translation>
 <translation id="3323521181261657960">ବୋନସ୍! ଆପଣ ଅଧିକ ସ୍କ୍ରିନ୍ ସମୟ ପାଇଛନ୍ତି</translation>
 <translation id="3325910708063135066">Mac ସିଷ୍ଟମ୍ ଅଗ୍ରାଧିକାରଗୁଡ଼ିକରେ କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ବନ୍ଦ କରାଯାଇଛି</translation>
 <translation id="3328489342742826322">କୌଣସି ବ୍ୟାକ୍‍ଅପ୍‍ରୁ ରିଷ୍ଟୋର୍ କରିବା ଦ୍ୱାରା ଆପଣଙ୍କର Linux ଫାଇଲ୍ସ ଫୋଲ୍ଡର୍‍‍ରେ ପୂର୍ବରୁ ଥିବା Linux ଆପ୍ଲିକେସନ୍ସ ଏବଂ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।</translation>
@@ -1849,6 +1850,7 @@
 <translation id="3487007233252413104">ନାମହୀନ ଫକ୍‌ସନ୍</translation>
 <translation id="348780365869651045">AppCache ପାଇଁ ଅପେକ୍ଷାରତ...</translation>
 <translation id="3488065109653206955">ଆଶିଂକ ଭାବେ ସକ୍ରିୟ କରାଯାଇଛି</translation>
+<translation id="3489025949017384019">ଅନେକ ସାଇଟ୍ ସଠିକ ଭାବେ କାର୍ଯ୍ୟ କରିନପାରେ</translation>
 <translation id="3492788708641132712">ସିଙ୍କ କାମ କରୁନାହିଁ। ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="3493486281776271508">ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଆବଶ୍ୟକ</translation>
 <translation id="3493881266323043047">ବୈଧତା:</translation>
@@ -2004,6 +2006,7 @@
 <translation id="3688526734140524629">ଚ୍ୟାନେଲ୍ ପରିବର୍ତ୍ତନ କରନ୍ତୁ</translation>
 <translation id="3688578402379768763">ଅପ୍-ଟୁ-ଡେଟ୍</translation>
 <translation id="3688794912214798596">ଭାଷାଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ କରନ୍ତୁ...</translation>
+<translation id="3690369331356918524">ଯଦି ଡାଟା ଚୋରି ଯୋଗୁଁ ପାସୱାର୍ଡଗୁଡ଼ିକ ବିପଦରେ ପଡ଼ିଯାଏ, ତେବେ ଆପଣଙ୍କୁ ଚେତାବନୀ ଦେଇଥାଏ</translation>
 <translation id="3691231116639905343">କୀବୋର୍ଡ ଆପ୍ସ</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ ସେୟାର୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି</translation>
 <translation id="369135240373237088">ଏକ ସ୍କୁଲ ଆକାଉଣ୍ଟ ସହିତ ପୁଣି ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation>
@@ -2142,6 +2145,7 @@
 <translation id="3841964634449506551">ପାସ୍‌ୱାର୍ଡ ଅବୈଧ ଅଟେ</translation>
 <translation id="3842552989725514455">ସେରିଫ୍‌ ଫଣ୍ଟ</translation>
 <translation id="3846116211488856547">ୱେବ୍‍ସାଇଟ୍, Android ଆପ୍ସ ଏବଂ ଆହୁରି ଅନେକ କିଛିକୁ ଡେଭଲପ୍ କରିବା ପାଇଁ ଟୁଲ୍‍ଗୁଡ଼ିକୁ ପ୍ରାପ୍ତ କରନ୍ତୁ। Linuxକୁ ଇନ୍‌ଷ୍ଟଲ୍ କରିବା ଦ୍ଵାରା <ph name="DOWNLOAD_SIZE" /> ପରିମାଣର ଡାଟା ଡାଉନ୍‍‍ଲୋଡ୍ ହେବ।</translation>
+<translation id="3847319713229060696">ୱେବରେ ସମସ୍ତଙ୍କ ପାଇଁ ସୁରକ୍ଷାକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ</translation>
 <translation id="385051799172605136">ପଛକୁ</translation>
 <translation id="3850914401008572843">ସିଷ୍ଟମ୍ ଫାଇଲ୍‌ଗୁଡ଼ିକ ଥିବା ଯୋଗୁଁ <ph name="ORIGIN" /> ଏହି ଫୋଲ୍ଡର୍‍କୁ ଖୋଲି ପାରିବ ନାହିଁ</translation>
 <translation id="3851428669031642514">ଅସୁରକ୍ଷିତ ସ୍କ୍ରିପ୍ଟ ଲୋଡ୍‍ କରନ୍ତୁ</translation>
@@ -2623,6 +2627,7 @@
 <translation id="4534661889221639075">ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="4535127706710932914">ଡିଫଲ୍ଟ ପ୍ରୋଫାଇଲ୍</translation>
 <translation id="4535767533210902251">ଆପଣଙ୍କ କୀବୋର୍ଡର ଉପର ଡାହାଣ କୀ ଟିପଚିହ୍ନ ସେନ୍ସର୍ ଅଟେ। ଏହାକୁ କୌଣସି ଆଙ୍ଗୁଠିରେ ହାଲୁକା ଭାବେ ସ୍ପର୍ଶ କରନ୍ତୁ।</translation>
+<translation id="4536140153723794651">କୁକୀଗୁଡ଼ିକୁ ସର୍ବଦା ବ୍ୟବହାର କରିପାରୁଥିବା ସାଇଟଗୁଡ଼ିକ</translation>
 <translation id="4538417792467843292">ଶବ୍ଦ ଡିଲିଟ୍ କରନ୍ତୁ</translation>
 <translation id="4538684596480161368"><ph name="HOST" />ରେ ସର୍ବଦା ଅନ୍‌ସ୍ୟାଣ୍ଡବକ୍ସ କରାଯାଇଥିବା ପ୍ଲଗଇନ୍‌ଗୁଡ଼ିକ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
 <translation id="4538792345715658285">ଏଣ୍ଟରପ୍ରାଇଜ୍ ନୀତି ଦ୍ୱାରା ଇନ୍‍ଷ୍ଟଲ୍ କରାଯାଇଛି।</translation>
@@ -2720,6 +2725,7 @@
 <translation id="4665446389743427678"><ph name="SITE" /> ଦ୍ୱାରା ଷ୍ଟୋର୍‌ କରାଯାଇଥିବା ସମସ୍ତ ଡାଟା ଡିଲିଟ୍‌ କରାଯିବ।</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" />କୁ ସକ୍ଷମ କରିବା ପାଇଁ କ୍ଲିକ୍ କରନ୍ତୁ</translation>
 <translation id="4670064810192446073">ଭର୍ଚୁଆଲ୍ ରିଆଲିଟୀ</translation>
+<translation id="4672879467403304774">ଆପଣ ସାଇନ୍ ଇନ୍ ହେଲେ ଆପଣଙ୍କୁ Chrome ଏବଂ ଅନ୍ୟ Google ଆପଗୁଡ଼ିକରେ ସୁରକ୍ଷିତ ରଖେ</translation>
 <translation id="46733273239502219">ଇନଷ୍ଟଲ୍ କରାଯାଇଥିବା ଆପ୍‍ଗୁଡ଼ିକରୁ ଅଫ୍‍ଲାଇନ୍ ଡାଟା ମଧ୍ୟ ଖାଲି କରାଯିବ</translation>
 <translation id="4673442866648850031">ଷ୍ଟାଇଲସ୍ ବାହାର କରିବା ସମୟରେ ଷ୍ଟାଇଲସ୍ ଟୁଲ୍ ଖୋଲନ୍ତୁ</translation>
 <translation id="4677772697204437347">GPU ମେମୋରୀ</translation>
@@ -2804,7 +2810,6 @@
 <translation id="4808667324955055115">ପପ୍-ଅପ୍‌ଗୁଡିକ ଅବରୋଧ ହୋଇଛି:</translation>
 <translation id="480990236307250886">ମୂଳପୃଷ୍ଠାଟି ଖୋଲନ୍ତୁ</translation>
 <translation id="4811503964269049987">ଚୟନିତ ଟାବକୁ ଗୋଷ୍ଠୀଭୁକ୍ତ କରନ୍ତୁ</translation>
-<translation id="4811818760963189951">ଆପଣ ଇତିହାସ ସିଙ୍କ୍ ଅକ୍ଷମ କରିଦେଇଥିବା ଯୋଗୁଁ ବନ୍ଦ ହୋଇଯାଇଛି</translation>
 <translation id="4813136279048157860">ମୋ ଛବି</translation>
 <translation id="4813512666221746211">ନେଟ୍‌ୱର୍କ ତ୍ରୁଟି</translation>
 <translation id="4814378367953456825">ଏହି ଟିପଚିହ୍ନ ପାଇଁ ଏକ ନାମ ଲେଖନ୍ତୁ</translation>
@@ -2973,7 +2978,6 @@
 <translation id="5040823038948176460">ଅତିରିକ୍ତ ବିଷୟବସ୍ତୁ ସେଟିଂସ୍</translation>
 <translation id="5042282098504489593">Linuxରେ <ph name="USB_DEVICE_NAME" /> ସଂଯୋଗ କରିବା ପାଇଁ ସେଟିଂସ୍ ଖୋଲନ୍ତୁ</translation>
 <translation id="5043913660911154449">କିମ୍ବା ଆପଣଙ୍କ ପ୍ରିଣ୍ଟର୍ PPD ନିର୍ଦ୍ଦିଷ୍ଟ କରନ୍ତୁ <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">ଏକ ପାସଫ୍ରେଜ୍ ମାଧ୍ୟମରେ ଆପଣ ଆପଣଙ୍କ ସିଙ୍କ୍ ଡାଟାକୁ ଏନକ୍ରିପ୍ଟ କରିଥିବା ଯୋଗୁଁ ଏହା ବନ୍ଦ ହୋଇଯାଇଛି</translation>
 <translation id="5045550434625856497">ଭୁଲ ପାସୱାର୍ଡ</translation>
 <translation id="504561833207953641">ପୂର୍ବରୁ ଥିବା ବ୍ରାଉଜର୍‌ ଅବଧିରେ ଖୋଲୁଛି</translation>
 <translation id="5047421709274785093">ମୋସନ୍ ଏବଂ ଲାଇଟ୍ ସେନ୍ସର୍ ବ୍ୟବହାର କରିବାରୁ ସାଇଟ୍‍ଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
@@ -3128,7 +3132,7 @@
 <translation id="5260508466980570042">କ୍ଷମା କରିବେ, ଆପଣଙ୍କର ଇମେଲ୍ ଏବଂ ପାସ୍‌ୱର୍ଡ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="5261683757250193089">ୱେବ୍ ଷ୍ଟୋର୍‌‌ରେ ଖୋଲନ୍ତୁ</translation>
 <translation id="5262178194499261222">ପାସୱାର୍ଡ କାଢ଼ି ଦିଅନ୍ତୁ</translation>
-<translation id="5263468185123738872">ଗେଷ୍ଟ ଅପରେଟିଂ ସିଷ୍ଟମ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ Plugin VM ଲଞ୍ଚ କରନ୍ତୁ।</translation>
+<translation id="5263468185123738872">ଗେଷ୍ଟ ଅପରେଟିଂ ସିଷ୍ଟମ୍ ଇନଷ୍ଟଲ୍ କରିବାକୁ ଦୟାକରି Plugin VM ଲଞ୍ଚ କରନ୍ତୁ।</translation>
 <translation id="5264148714798105376">ଏଥିରେ ଗୋଟିଏ ମିନିଟ୍‌ କିମ୍ବା କିଛି ଅଧିକ ସମୟ ଲାଗିପାରେ।</translation>
 <translation id="5264252276333215551">କିଓସ୍କ ମୋଡ୍‌ରେ ଆପଣଙ୍କର ଆପ୍‌ ଲଞ୍ଚ କରିବାକୁ ଦୟାକରି ଇଣ୍ଟର୍ନେଟ୍‍କୁ ସଂଯୋଗ କରନ୍ତୁ।</translation>
 <translation id="5265562206369321422">ଏକ ସପ୍ତାହରୁ ଅଧିକ ସମୟ ପର୍ଯ୍ୟନ୍ତ ଅଫ୍‍ଲାଇନ୍ ଅଛି</translation>
@@ -3138,6 +3142,7 @@
 <translation id="5275352920323889391">ଶ୍ୱାନ</translation>
 <translation id="527605982717517565">ସର୍ବଦା <ph name="HOST" />ରେ JavaScriptକୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation>
 <translation id="5280174558369304332">କଢ଼ାଯିବାକୁ ଥିବା ଏକ୍ସଟେନ୍‌ସନ୍‌ଗୁଡ଼ିକ:</translation>
+<translation id="5280243692621919988">ଆପଣ ସମସ୍ତ ୱିଣ୍ଡୋ ବନ୍ଦ କରିବା ସମୟରେ କୁକୀଗୁଡ଼ିକୁ ଏବଂ ସାଇଟ୍ ଡାଟା ଖାଲି କରନ୍ତୁ</translation>
 <translation id="5280426389926346830">ସର୍ଟକଟ୍ ତିଆରି କରିବେ?</translation>
 <translation id="528208740344463258">Android ଆପ୍ସକୁ ଡାଉନ୍‌ଲୋଡ୍ ଏବଂ ବ୍ୟବହାର କରିବାକୁ, ପ୍ରଥମେ ଆପଣଙ୍କୁ ଏହି ଆବଶ୍ୟକୀୟ ଅପ୍‌ଡେଟ୍‌ ଇନ୍‌ଷ୍ଟଲ୍ କରିବାକୁ ହେବ। ଆପଣଙ୍କର <ph name="DEVICE_TYPE" /> ଅପ୍‌ଡେଟ୍‌ ହେବା ସମୟରେ, ଆପଣ ଏହାକୁ ବ୍ୟବହାର କରିପାରିବେ ନାହିଁ। ଇନ୍‌ଷ୍ଟଲେସନ୍ ଶେଷ ହେବା ପରେ, ଆପଣଙ୍କର <ph name="DEVICE_TYPE" /> ରିଷ୍ଟାର୍ଟ ହେବ।</translation>
 <translation id="5282733140964383898">"ଟ୍ରାକ୍ କରନ୍ତୁ ନାହିଁ" କୁ ସକ୍ଷମ କରିବା ଅର୍ଥ ହେଲା ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଭିଡରେ ଏକ ଅନୁରୋଧକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଛି। କୌଣସି ପ୍ରଭାବ ଏହା ଉପରେ ନିର୍ଭର କରେ ଯେ, କୌଣସି ୱେବ୍‍ସାଇଟ୍ ଅନୁରୋଧର ପ୍ରତିକ୍ରିୟା କରେ କି ନାହିଁ ଏବଂ ଅନୁରୋଧକୁ କିପରି ଭାବରେ ବ୍ୟାଖ୍ୟା କରାଯାଉଛି। ଉଦାହରଣ ସ୍ୱରୂପ, କିଛି ୱେବ୍‍ସାଇଟ୍ ଆପଣ ଯାଇଥିବା ଅନ୍ୟ ୱେବ୍‍ସାଇଟ୍‍ଗୁଡ଼ିକ ଉପରେ ଆଧାରିତ ନଥିବା ବିଜ୍ଞାପନ ଦେଖାଇବାର ମାଧ୍ୟମରେ ଏହି ଅନୁରୋଧର ପ୍ରତିକ୍ରିୟା କରିଥାଏ। ଅନେକ ୱେବ୍‍ସାଇଟ୍ ଏବେବି ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଡାଟା ସଂଗ୍ରହ ଏବଂ ବ୍ୟବହାର କରିବେ - ଉଦାହରଣ ସ୍ୱରୂପ ସୁରକ୍ଷାକୁ ଉନ୍ନତ କରିବା ପାଇଁ, ସେମାନଙ୍କର ୱେବ୍‍ସାଇଟ୍‍‍ରେ ବିଷୟବସ୍ତୁ, ସେବାଗୁଡ଼ିକ, ବିଜ୍ଞାପନ ଓ ସୁପାରିଶ୍‍ଗୁଡ଼ିକ ପ୍ରଦାନ କରିବା ପାଇଁ। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation>
@@ -3949,7 +3954,6 @@
 <translation id="63566973648609420">ଆପଣଙ୍କ ଏନ୍‌କ୍ରିପ୍ଟ ହୋଇଥିବା ଡାଟାକୁ କେବଳ ଆପଣଙ୍କ ପାସ୍‍‍ଫ୍ରେଜ୍ ଥିବା ଜଣେ ବ୍ୟକ୍ତି ପଢ଼ିପାରିବେ। Google ଦ୍ବାରା ପାସ୍‍‍ଫ୍ରେଜ୍ ପଠାଯାଏ ନାହିଁ ବା ଷ୍ଟୋର୍ କରାଯାଏନାହିଁ। ଯଦି ଆପଣ ନିଜର ପାସ୍‍‍ଫ୍ରେଜ୍ ଭୁଲିଯାଇଛନ୍ତି କିମ୍ବା ଏହି ସେଟିଂ ପରିବର୍ତ୍ତନ କରିବାକୁ ଚାହୁଁଛନ୍ତି, ତେବେ ଆପଣଙ୍କୁ <ph name="BEGIN_LINK" />ସିଙ୍କ୍ ରିସେଟ୍<ph name="END_LINK" /> କରିବାକୁ ହେବ।</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> ପରିବାରକୁ ସ୍ୱାଗତ। ଏହା ଏକ ସାଧାରଣ କମ୍ପ୍ୟୁଟର୍ ନୁହେଁ।</translation>
 <translation id="6358884629796491903">ଡ୍ରାଗନ୍</translation>
-<translation id="6360719647236334056">Search, ads ଏବଂ ଅନ୍ୟ Google ସେବାଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ଆପଣଙ୍କ Chrome ବ୍ରାଉଜିଂ ଇତିହାସ ବ୍ୟବହାର କରନ୍ତୁ</translation>
 <translation id="6361850914223837199">ତ୍ରୁଟି ବିବରଣୀ:</translation>
 <translation id="6362853299801475928">ଏକ ସମସ୍ୟା ରିପୋର୍ଟ କରନ୍ତୁ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4229,10 +4233,10 @@
 <translation id="6758056191028427665">ଆମେ କେଉଁଭଳି କାମ କରୁଛୁ, ତାହା ଆମକୁ ଜଣାନ୍ତୁ।</translation>
 <translation id="6759193508432371551">ଫ୍ୟାକ୍ଟୋରୀ ରିସେଟ୍</translation>
 <translation id="6762833852331690540">ଚାଲୁ ଅଛି</translation>
-<translation id="6764693078871405569">ଆପଣଙ୍କୁ <ph name="DOMAIN" />ରୁ ସାଇନ୍ ଆଉଟ୍ କରିଦେବା ବ୍ରାଉଜିଂ ଡାଟା (<ph name="URL" />)କୁ ମଧ୍ୟ ଖାଲି କରନ୍ତୁ।</translation>
 <translation id="6767566652486411142">ଅନ୍ୟ ଏକ ଭାଷା ବାଛନ୍ତୁ...</translation>
 <translation id="6767639283522617719">ଡୋମେନ୍‌ରେ ଯୋଗ ଦେଇପାରିବ ନାହିଁ। ଏହା ସୁନିଶ୍ଚିତ କରନ୍ତୁ, ଯେ ସଂଗଠନାତ୍ମକ ୟୁନିଟ୍ ପାଇଁ ସେଟିଂସ୍‌ଗୁଡ଼ିକ ଠିକ୍‌ ଅଟେ।</translation>
 <translation id="6769712124046837540">ପ୍ରିଣ୍ଟର୍ ଯୋଗ କରାଯାଉଛି...</translation>
+<translation id="6770602306803890733">ଆପଣ ଏବଂ ୱେବରେ ଥିବା ପ୍ରତ୍ୟେକ ବ୍ୟକ୍ତିଙ୍କ ପାଇଁ ସୁରକ୍ଷାକୁ ଉନ୍ନତ କରେ</translation>
 <translation id="6770664076092644100">NFC ମାଧ୍ୟମରେ ଯାଞ୍ଚ କରନ୍ତୁ</translation>
 <translation id="6771503742377376720">ଏକ ସାର୍ଟିଫିକେଟ୍ କର୍ତ୍ତୃପକ୍ଷ</translation>
 <translation id="6772339735733515807">ଆପଣଙ୍କର ଏକ୍ସଟେନ୍‍ସନ୍‍ଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ</translation>
@@ -4258,6 +4262,7 @@
 <translation id="6798578729981748444">ଇମ୍ପୋର୍ଟିଂ ସମାପ୍ତ କରିବାକୁ ସମସ୍ତ Firefox ୱିଣ୍ଡୋ ବନ୍ଦ କରନ୍ତୁ।</translation>
 <translation id="6798780071646309401">caps lock ଚାଲୁ ଅଛି</translation>
 <translation id="6798954102094737107">ପ୍ଲଗ୍‌ଇନ୍: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">ସାଧାରଣ ସେଟିଂସ୍</translation>
 <translation id="6801435275744557998">ଟଚ୍‌ସ୍କ୍ରିନ୍‌କୁ କାଲିବ୍ରେଟ୍ କରନ୍ତୁ</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">ଠିକ୍ ଅଛି</translation>
@@ -4376,6 +4381,8 @@
 <translation id="6965382102122355670">ଓକେ ବଟନ୍</translation>
 <translation id="6965648386495488594">ପୋର୍ଟ</translation>
 <translation id="6965978654500191972">ଡିଭାଇସ୍</translation>
+<translation id="6966201992886493384">ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଅନୁଭୂତିକୁ ଉନ୍ନତ କରିବା ନିମନ୍ତେ, ଉଦାହରଣ ସ୍ୱରୂପ, ଆପଣଙ୍କୁ ସାଇନ୍ ଇନ୍ ରଖିବା କିମ୍ବା ଆପଣଙ୍କ ସପିଂ କାର୍ଟରେ ଥିବା ଆଇଟମଗୁଡ଼ିକୁ ମନେରଖିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ</translation>
+<translation id="696780070563539690">ବିଭିନ୍ନ ସାଇଟରେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ କାର୍ଯ୍ୟକଳାପକୁ ଦେଖିବା ନିମନ୍ତେ, ଉଦାହରଣ ସ୍ୱରୂପ, ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ</translation>
 <translation id="6968288415730398122">ସ୍କ୍ରିନ୍ ଲକ୍‌କୁ କନ୍‌ଫିଗର୍ କରିବା ପାଇଁ ନିଜର ପାସ୍‌ୱାର୍ଡ ଲେଖନ୍ତୁ</translation>
 <translation id="6970480684834282392">ଷ୍ଟାର୍ଟ‍ଅପ୍‌ ପ୍ରକାର</translation>
 <translation id="6970856801391541997">ନିର୍ଦ୍ଧିଷ୍ଟ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ପ୍ରିଣ୍ଟ କରନ୍ତୁ</translation>
@@ -4785,6 +4792,7 @@
 <translation id="7507207699631365376">ଏହି ପ୍ରଦାନକାରୀଙ୍କର <ph name="BEGIN_LINK" />ଗୋପନୀୟତା ନୀତି<ph name="END_LINK" /> ଦେଖନ୍ତୁ</translation>
 <translation id="7507930499305566459">ସ୍ଥିତି ପ୍ରତିକ୍ରିୟାଦାତା ସାର୍ଟିଫିକେଟ୍</translation>
 <translation id="7508054832109420082">ପ୍ରିଣ୍ଟର୍‌ଗୁଡ଼ିକୁ ଆକ୍ସେସ୍ ଦିଅନ୍ତୁ</translation>
+<translation id="751120035300339">ଆପଣଙ୍କ ବ୍ରାଉଜିଂ ଅନୁଭୂତିକୁ ଉନ୍ନତ କରିବା ନିମନ୍ତେ, ଉଦାହରଣ ସ୍ୱରୂପ, ଆପଣଙ୍କୁ ସାଇନ୍ ଇନ୍ ରଖିବା କିମ୍ବା ଆପଣଙ୍କ ସପିଂ କାର୍ଟରେ ଥିବା ଆଇଟମଗୁଡ଼ିକୁ ମନେରଖିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ</translation>
 <translation id="7513029293694390567">ଷ୍ଟୋର୍ ଥିବା ବିଶ୍ୱସନୀୟତା ବ୍ୟବହାର କରି ୱେବ୍‌ସାଇଟ୍‌ରେ ସ୍ୱଚାଳିତରୂପେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ। ଯଦି ଏହା ଅକ୍ଷମ କରାଯାଏ, ତେବେ ଏକ ୱେବ୍‌ସାଇଟ୍‌ରେ ସାଇନ୍ ଇନ୍ କରିବା ପୂର୍ବରୁ ପ୍ରତ୍ୟେକଥର ଆପଣଙ୍କୁ ସୁନିଶ୍ଚିତ କରିବା ପାଇଁ କୁହାଯିବ।</translation>
 <translation id="7514239104543605883">ଆପଣଙ୍କର ଡିଭାଇସ୍‍କୁ କପି କରନ୍ତୁ</translation>
 <translation id="7514365320538308">ଡାଉନ୍‌‌ଲୋଡ୍‌ କରନ୍ତୁ</translation>
@@ -5412,6 +5420,7 @@
 <translation id="8320459152843401447">ଆପଣଙ୍କର ସମ୍ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍</translation>
 <translation id="8322814362483282060">ଏହି ପୃଷ୍ଠାକୁ ଆପଣଙ୍କ ମାଇକ୍ରୋଫୋନ୍ ଆକ୍ସେସ୍ କରିବାରୁ ବ୍ଲକ୍ କରାଯାଇଛି।</translation>
 <translation id="8323167517179506834">URL ଟାଇପ୍ କରନ୍ତୁ</translation>
+<translation id="8324784016256120271">ବିଭିନ୍ନ ସାଇଟରେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ କାର୍ଯ୍ୟକଳାପକୁ ଦେଖିବା ନିମନ୍ତେ, ଉଦାହରଣ ସ୍ୱରୂପ, ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ସାଇଟଗୁଡ଼ିକ କୁକୀଗୁଡ଼ିକୁ ବ୍ୟବହାର କରିପାରିବ</translation>
 <translation id="8326478304147373412">PKCS #7, ସାର୍ଟିଫିକେଟ୍ ଚେନ୍</translation>
 <translation id="8327039559959785305">Linux ଫାଇଲ୍‌ଗୁଡ଼ିକର ମାଉଣ୍ଟିଙ୍ଗରେ ତ୍ରୁଟି। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
 <translation id="8327676037044516220">ଅନୁମତି ଏବଂ ବିଷୟବସ୍ତୁ ସେଟିଂସ୍</translation>
@@ -5467,6 +5476,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> ନେଟ୍‍ୱାର୍କ, ସଂଯୁକ୍ତ ହେଉଛି</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">ପ୍ରଥମେ ପଚାରନ୍ତୁ (ସୁପାରିଶ କରାଯାଇଛି)</translation>
+<translation id="8417573335434189196">ବିପଦଜନକ ୱେବସାଇଟ୍, ଡାଉନଲୋଡ୍ କିମ୍ବା ଏକ୍ସଟେନ୍ସନଗୁଡ଼ିକ ଠାରୁ ଆପଣଙ୍କୁ ରକ୍ଷା କରେ ନାହିଁ। Chrome ଏହି ସେଟିଂକୁ ସୁପାରିଶ କରେ ନାହିଁ।</translation>
 <translation id="8418445294933751433">&amp;ଟ୍ୟାବ୍ ଭାବେ ଦେଖାନ୍ତୁ</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' ପାଇଁ ସନ୍ଧାନ ଫଳାଫଳ</translation>
 <translation id="8419368276599091549">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />କୁ ସ୍ୱାଗତ!</translation>
@@ -5632,6 +5642,7 @@
 <translation id="8642947597466641025">ଟେକ୍ସଟ୍ ବଡ଼ କରନ୍ତୁ</translation>
 <translation id="8644655801811752511">ଏହି ସୁରକ୍ଷା କୀ ରିସେଟ୍ କରିପାରିବ ନାହିଁ। କୀ ଭର୍ତ୍ତି କରିସାରିବା ପରେ ତୁରନ୍ତ ରିସେଟ୍ କରି ଦେଖନ୍ତୁ।</translation>
 <translation id="8645354835496065562">ସେନ୍ସର୍ ଆକ୍‌ସେସ୍ କରିବାର ଅନୁମତି ଦେବା ଜାରି ରଖନ୍ତୁ</translation>
+<translation id="8645920082661222035">ବିପଦଜନକ ଘଟଣାଗୁଡ଼ିକ ଘଟିବା ପୂର୍ବରୁ ସେଗୁଡ଼ିକର ପୂର୍ବାନୁମାନ କରି ଆପଣଙ୍କୁ ଚେତାବନୀ ଦିଏ</translation>
 <translation id="8647834505253004544">ଏକ ବୈଧ ୱେବ୍‌ସାଇଟ୍ ଠିକଣା ନୁହେଁ</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> କିମ୍ବା <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">ଯଦିଓ, ଆପଣ ଆପଣଙ୍କର ପୁରୁଣା ପ୍ରୋଫାଇଲ୍‌କୁ ଏବେ ଆଉ ଆକ୍ସେସ୍‌ କରିପାରୁନାହାନ୍ତି, ତଥାପି ଆପଣ ଏହାକୁ ଏବେ ମଧ୍ୟ କାଢିପାରିବେ।</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 7665e25..d12d3ac 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">ਚਲਾਏ ਜਾਣ 'ਤੇ ਵਰਤਮਾਨ ਵੈੱਬਸਾਈਟ ਦਾ ਸਾਰਾ ਡਾਟਾ ਪੜ੍ਹੋ ਅਤੇ ਬਦਲੋ</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ।</translation>
 <translation id="1243314992276662751">ਅਪਲੋਡ ਕਰੋ</translation>
-<translation id="1243398753772016127">ਸਾਈਟਾਂ ਵੱਖ-ਵੱਖ ਸਾਈਟਾਂ ਵਿਚਲੀ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਦੀ ਵਰਤੋਂ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ</translation>
 <translation id="1244265436519979884">ਇਸ ਵੇਲੇ Linux ਦੀ ਮੁੜ-ਬਹਾਲੀ ਜਾਰੀ ਹੈ</translation>
 <translation id="1244303850296295656">ਐਕਸਟੈਂਸ਼ਨ ਗੜਬੜ</translation>
 <translation id="1246905108078336582">ਕੀ ਕਲਿੱਪਬੋਰਡ ਤੋਂ ਸੁਝਾਅ ਨੂੰ ਹਟਾਉਣਾ ਹੈ?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">ਚਾਲੂ - ਸੈਟਿੰਗਾਂ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ</translation>
 <translation id="1489664337021920575">ਕੋਈ ਹੋਰ ਵਿਕਲਪ ਚੁਣੋ</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ...</translation>
-<translation id="1494438840282430403">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ (<ph name="URL" />) ਵੀ ਕਲੀਅਰ ਕਰੋ ਜੋ ਸ਼ਾਇਦ ਤੁਹਾਨੂੰ Google.com ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰ ਦੇਵੇ।</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> ਹੋਰ ਉਪਲਬਧ ਡਿਵਾਈਸਾਂ।</translation>
 <translation id="1495677929897281669">ਟੈਬ 'ਤੇ ਵਾਪਸ ਜਾਓ</translation>
 <translation id="1499271269825557605">ਜੇ ਤੁਸੀਂ ਕਿਸੇ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਨਹੀਂ ਪਛਾਣਦੇ, ਜਾਂ ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਰ ਉਮੀਦ ਮੁਤਾਬਕ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ, ਤਾਂ ਤੁਸੀਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਇੱਥੇ ਬੰਦ ਜਾਂ ਵਿਉਂਤਬੱਧ ਕਰ ਸਕਦੇ ਹੋ।</translation>
@@ -518,6 +516,7 @@
 <translation id="1697686431566694143">ਫ਼ਾਈਲ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation>
 <translation id="1698122934742150150">ਸਿਰਫ਼ ਵਰਤਮਾਨ ਇਨਕੋਗਨਿਟੋ ਸੈਸ਼ਨ</translation>
 <translation id="1698650002254827833">ਐਪਾਂ ਦੀ ਸੂਚੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਕਿਰਪਾ ਕਰਕੇ ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
+<translation id="1700079447639026019">ਉਹ ਸਾਈਟਾਂ ਜੋ ਕਦੇ ਵੀ ਕੁਕੀਜ਼ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ</translation>
 <translation id="1701062906490865540">ਇਹ ਵਿਅਕਤੀ ਹਟਾਓ</translation>
 <translation id="1703331064825191675">ਕਦੇ ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਦਾ ਫ਼ਿਕਰ ਨਾ ਕਰੋ</translation>
 <translation id="1704970325597567340">ਸੁਰੱਖਿਆ ਜਾਂਚ <ph name="DATE" /> ਨੂੰ ਚਲਾਈ ਗਈ</translation>
@@ -738,6 +737,7 @@
 <translation id="1990512225220753005">ਇਸ ਪੰਨੇ 'ਤੇ ਸ਼ਾਰਟਕੱਟ ਨਾ ਦਿਖਾਓ</translation>
 <translation id="1992397118740194946">ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ</translation>
 <translation id="1994173015038366702">ਸਾਈਟ URL</translation>
+<translation id="1995916364271252349">ਸਾਈਟਾਂ ਵੱਲੋਂ ਵਰਤੀ ਅਤੇ ਦਿਖਾਈ ਜਾ ਸਕਣ ਵਾਲੀ ਜਾਣਕਾਰੀ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ (ਟਿਕਾਣਾ, ਕੈਮਰਾ, ਪੌਪ-ਅੱਪ ਅਤੇ ਹੋਰ)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> ਦੀ ਤੁਹਾਡੇ ਸਥਾਨਕ ਕੰਪਿਊਟਰ 'ਤੇ ਸਥਾਈ ਤੌਰ 'ਤੇ ਬਹੁਤ ਜ਼ਿਆਦਾ ਡਾਟਾ ਸਟੋਰ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ</translation>
 <translation id="1997616988432401742">ਤੁਹਾਡੇ ਸਰਟੀਫਿਕੇਟ</translation>
 <translation id="1999115740519098545">ਸਟਾਰਟਅਪ ਤੇ</translation>
@@ -993,6 +993,7 @@
 <translation id="2335111415680198280">{0,plural, =1{# ਵਿੰਡੋ ਬੰਦ ਕਰੋ}one{# ਵਿੰਡੋ ਬੰਦ ਕਰੋ}other{# ਵਿੰਡੋ ਬੰਦ ਕਰੋ}}</translation>
 <translation id="2335122562899522968">ਇਸ ਸਫ਼ੇ ਨੇ ਕੁਕੀਜ਼ ਸੈਟ ਕੀਤੀਆਂ।</translation>
 <translation id="2336228925368920074">ਸਾਰੀਆਂ ਟੈਬਾਂ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ...</translation>
+<translation id="2336376423977300504">ਵਿੰਡੋ ਨੂੰ ਬੰਦ ਕਰਨ ਵੇਲੇ ਕੁਕੀਜ਼ ਨੂੰ ਹਮੇਸ਼ਾਂ ਕਲੀਅਰ ਕਰੋ</translation>
 <translation id="2336381494582898602">ਪਾਵਰਵਾਸ਼</translation>
 <translation id="2340263603246777781"><ph name="ORIGIN" /> ਜੋੜਾਬੱਧ ਕਰਨਾ ਚਾਹੁੰਦੀ ਹੈ</translation>
 <translation id="2342740338116612727">ਬੁੱਕਮਾਰਕ ਸ਼ਾਮਲ ਕੀਤੇ ਗਏ</translation>
@@ -1186,7 +1187,6 @@
 <translation id="2575247648642144396">ਇਹ ਪ੍ਰਤੀਕ ਉਦੋਂ ਦਿਖਾਈ ਦੇਵੇਗਾ ਜਦੋਂ ਐਕਸਟੈਂਸ਼ਨ ਮੌਜੂਦਾ ਪੰਨੇ 'ਤੇ ਕਾਰਵਾਈ ਕਰ ਸਕਦੀ ਹੈ। ਪ੍ਰਤੀਕ 'ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਜਾਂ <ph name="EXTENSION_SHORTCUT" /> ਨੂੰ ਦਬਾ ਕੇ ਇਹ ਐਕਸਟੈਂਸ਼ਨ ਵਰਤੋ।</translation>
 <translation id="257779572837908839">ਮੀਟਿੰਗਾਂ ਲਈ Chromebox ਵਜੋਂ ਸਥਾਪਤ ਕਰੋ</translation>
 <translation id="2580889980133367162">ਹਮੇਸ਼ਾਂ <ph name="HOST" /> ਨੂੰ ਕਈ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਕਰਨ ਦਿਓ</translation>
-<translation id="2580924999637585241">ਕੁੱਲ: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ਲੰਮਾ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (ਪਲੇਟਫਾਰਮ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos ਟਿਕਟ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ ਆਪਣੀ ਸੰਸਥਾ ਦੇ ਡੀਵਾਈਸ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ। (ਗੜਬੜ ਕੋਡ <ph name="ERROR_CODE" />)।</translation>
@@ -1733,6 +1733,7 @@
 <translation id="3317459757438853210">ਦੋ-ਪੱਖੀ</translation>
 <translation id="3317678681329786349">ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤੇ ਗਏ</translation>
 <translation id="3319048459796106952">ਨਵੀਂ &amp;ਗੁਮਨਾਮ window</translation>
+<translation id="3320630259304269485">ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ (ਖਤਰਨਾਕ ਸਾਈਟਾਂ ਤੋਂ ਸੁਰੱਖਿਆ) ਅਤੇ ਹੋਰ ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ</translation>
 <translation id="3323521181261657960">ਬੋਨਸ! ਤੁਹਾਡਾ ਸਕ੍ਰੀਨ ਸਮਾਂ ਵਧਾਇਆ ਗਿਆ</translation>
 <translation id="3325910708063135066">Mac ਸਿਸਟਮ ਤਰਜੀਹਾਂ ਵਿੱਚ ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬੰਦ ਕੀਤੇ ਹੋਏ ਹਨ</translation>
 <translation id="3328489342742826322">ਬੈਕਅੱਪ ਤੋਂ ਮੁੜ-ਬਹਾਲ ਕਰਨ ਨਾਲ ਤੁਹਾਡੇ Linux ਫ਼ਾਈਲਾਂ ਦੇ ਫੋਲਡਰ ਵਿੱਚ ਮੌਜੂਦ ਸਾਰੀਆਂ Linux ਐਪਲੀਕੇਸ਼ਨਾਂ ਅਤੇ ਡਾਟਾ ਮਿਟ ਜਾਵੇਗਾ।</translation>
@@ -1852,6 +1853,7 @@
 <translation id="3487007233252413104">ਅਨਾਮ ਫੰਕਸ਼ਨ</translation>
 <translation id="348780365869651045">AppCache ਦੀ ਉਡੀਕ ਕਰ ਰਿਹਾ ਹੈ...</translation>
 <translation id="3488065109653206955">ਅੰਸ਼ਕ ਤੌਰ ਤੇ ਸਕਿਰਿਆ ਕੀਤਾ</translation>
+<translation id="3489025949017384019">ਸ਼ਾਇਦ ਕਈ ਸਾਈਟਾਂ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ</translation>
 <translation id="3492788708641132712">ਸਮਕਾਲੀਕਰਨ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਹੈ। ਦੁਬਾਰਾ ਸਾਈਨ ਇਨ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="3493486281776271508">ਇੰਟਰਨੈੱਟ ਕਨੈਕਸ਼ਨ ਲੋੜੀਂਦਾ ਹੈ</translation>
 <translation id="3493881266323043047">ਪ੍ਰਮਾਣਿਕਤਾ</translation>
@@ -2007,6 +2009,7 @@
 <translation id="3688526734140524629">ਚੈਨਲ ਬਦਲੋ</translation>
 <translation id="3688578402379768763">ਅਪ-ਟੂ-ਡੇਟ</translation>
 <translation id="3688794912214798596">ਭਾਸ਼ਾਵਾਂ ਬਦਲੋ...</translation>
+<translation id="3690369331356918524">ਡਾਟਾ ਉਲੰਘਣਾ ਵਿੱਚ ਪਾਸਵਰਡਾਂ ਦਾ ਖੁਲਾਸਾ ਹੋਣ 'ਤੇ ਤੁਹਾਨੂੰ ਚਿਤਾਵਨੀ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ</translation>
 <translation id="3691231116639905343">ਕੀ-ਬੋਰਡ ਐਪਾਂ</translation>
 <translation id="3691267899302886494"><ph name="HOST" /> ਦੀ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਦੀ ਇੱਛਾ ਹੈ</translation>
 <translation id="369135240373237088">ਸਕੂਲੀ ਖਾਤੇ ਨਾਲ ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰੋ</translation>
@@ -2145,6 +2148,7 @@
 <translation id="3841964634449506551">ਅਵੈਧ ਪਾਸਵਰਡ</translation>
 <translation id="3842552989725514455">Serif ਫੌਂਟ</translation>
 <translation id="3846116211488856547">ਵੈੱਬਸਾਈਟਾਂ, Android ਐਪਾਂ ਦਾ ਵਿਕਾਸ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਕਰਨ ਲਈ ਟੂਲ ਪ੍ਰਾਪਤ ਕਰੋ। Linux ਸਥਾਪਤ ਕਰਨ ਲਈ <ph name="DOWNLOAD_SIZE" /> ਡਾਟਾ ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾਵੇਗਾ।</translation>
+<translation id="3847319713229060696">ਵੈੱਬ 'ਤੇ ਸੁਰੱਖਿਆ ਨੂੰ ਹਰੇਕ ਲਈ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ</translation>
 <translation id="385051799172605136">ਪਿੱਛੇ</translation>
 <translation id="3850914401008572843"><ph name="ORIGIN" /> ਸਾਈਟ ਇਹ ਫੋਲਡਰ ਨਹੀਂ ਖੋਲ੍ਹ ਸਕਦੀ ਕਿਉਂਕਿ ਇਸ ਵਿੱਚ ਸਿਸਟਮ ਫ਼ਾਈਲਾਂ ਹਨ</translation>
 <translation id="3851428669031642514">ਅਸੁਰੱਖਿਅਤ ਸਕ੍ਰਿਪਟਾਂ ਲੋਡ ਕਰੋ</translation>
@@ -2627,6 +2631,7 @@
 <translation id="4534661889221639075">ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="4535127706710932914">ਪੂਰਵ-ਨਿਰਧਾਰਤ ਪ੍ਰੋਫਾਈਲ</translation>
 <translation id="4535767533210902251">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਤੁਹਾਡੇ ਕੀਬੋਰਡ 'ਤੇ ਸਿਖਰਲੀ ਸੱਜੇ ਪਾਸੇ ਦੀ ਕੁੰਜੀ ਹੈ। ਇਸਨੂੰ ਕਿਸੇ ਵੀ ਉਂਗਲ ਨਾਲ ਹਲਕਾ ਜਿਹਾ ਸਪਰਸ਼ ਕਰੋ।</translation>
+<translation id="4536140153723794651">ਉਹ ਸਾਈਟਾਂ ਜੋ ਹਮੇਸ਼ਾਂ ਕੁਕੀਜ਼ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੀਆਂ ਹਨ</translation>
 <translation id="4538417792467843292">ਸ਼ਬਦ ਮਿਟਾਓ</translation>
 <translation id="4538684596480161368">ਹਮੇਸ਼ਾਂ <ph name="HOST" /> ਤੇ ਅਨਸੈਂਡਬੌਕਸਿਡ ਪਲਗਇੰਸ ਨੂੰ ਬਲੌਕ ਕਰੋ</translation>
 <translation id="4538792345715658285">ਐਂਟਰਪ੍ਰਾਈਜ ਨੀਤੀ ਵੱਲੋਂ ਸਥਾਪਤ ਕੀਤਾ ਗਿਆ।</translation>
@@ -2724,6 +2729,7 @@
 <translation id="4665446389743427678"><ph name="SITE" /> ਵੱਲੋਂ ਸਟੋਰ ਕੀਤਾ ਸਾਰਾ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation>
 <translation id="4668721319092543482"><ph name="PLUGIN_NAME" /> ਨੂੰ ਚਾਲੂ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="4670064810192446073">ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ</translation>
+<translation id="4672879467403304774">ਜਦੋਂ ਤੁਸੀਂ ਸਾਈਨ-ਇਨ ਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ Chrome ਅਤੇ ਹੋਰ Google ਐਪਾਂ 'ਤੇ ਸੁਰੱਖਿਅਤ ਰਹਿੰਦੇ ਹੋ</translation>
 <translation id="46733273239502219">ਸਥਾਪਤ ਕੀਤੀਆਂ ਐਪਾਂ ਵਿਚਲੇ ਆਫ਼ਲਾਈਨ ਡਾਟੇ ਨੂੰ ਵੀ ਕਲੀਅਰ ਕਰ ਦਿੱਤਾ ਜਾਵੇਗਾ</translation>
 <translation id="4673442866648850031">ਸਟਾਈਲਸ ਦੇ ਹਟਾਏ ਜਾਣ 'ਤੇ ਸਟਾਈਲਸ ਟੂਲ ਖੋਲ੍ਹੋ</translation>
 <translation id="4677772697204437347">GPU ਮੈਮਰੀ</translation>
@@ -2808,7 +2814,6 @@
 <translation id="4808667324955055115">ਪੌਪ-ਅੱਪ ਬਲਾਕ ਕੀਤੇ ਗਏ:</translation>
 <translation id="480990236307250886">ਹੋਮ ਪੇਜ ਖੋਲ੍ਹੋ</translation>
 <translation id="4811503964269049987">ਚੁਣੀ ਗਈ ਟੈਬ ਨੂੰ ਗਰੁੱਪਬੱਧ ਕਰੋ</translation>
-<translation id="4811818760963189951">ਬੰਦ ਹੋ ਗਿਆ ਕਿਉਂਕਿ ਤੁਸੀਂ ਇਤਿਹਾਸ ਸਮਕਾਲੀਕਰਨ ਬੰਦ ਕੀਤਾ ਹੈ</translation>
 <translation id="4813136279048157860">ਮੇਰੇ ਚਿੱਤਰ</translation>
 <translation id="4813512666221746211">ਨੈੱਟਵਰਕ ਗੜਬੜ</translation>
 <translation id="4814378367953456825">ਇਸ ਫਿੰਗਰਪ੍ਰਿੰਟ ਲਈ ਨਾਮ ਦਾਖਲ ਕਰੋ</translation>
@@ -2977,7 +2982,6 @@
 <translation id="5040823038948176460">ਵਧੀਕ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> ਨੂੰ Linux ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ</translation>
 <translation id="5043913660911154449">ਜਾਂ ਆਪਣਾ ਪ੍ਰਿੰਟਰ PPD ਨਿਰਧਾਰਤ ਕਰੋ <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">ਬੰਦ ਹੋ ਗਿਆ ਕਿਉਂਕਿ ਤੁਸੀਂ ਆਪਣੇ ਸਮਕਾਲੀਕਰਨ ਡਾਟੇ ਨੂੰ ਪਾਸਫਰੇਜ਼ ਨਾਲ ਇਨਕ੍ਰਿਪਟ ਕੀਤਾ ਹੈ</translation>
 <translation id="5045550434625856497">ਗਲਤ ਪਾਸਵਰਡ</translation>
 <translation id="504561833207953641">ਮੌਜੂਦਾ ਬ੍ਰਾਊਜ਼ਰ ਸੈਸ਼ਨ ਵਿੱਚ ਖੋਲ੍ਹੀ ਜਾ ਰਹੀ ਹੈ।</translation>
 <translation id="5047421709274785093">ਸਾਈਟਾਂ ਨੂੰ ਮੋਸ਼ਨ ਅਤੇ ਲਾਈਟ ਸੈਂਸਰ ਵਰਤਣ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation>
@@ -3142,6 +3146,7 @@
 <translation id="5275352920323889391">ਕੁੱਤਾ</translation>
 <translation id="527605982717517565">ਹਮੇਸ਼ਾਂ <ph name="HOST" /> ਤੇ JavaScript ਦੀ ਆਗਿਆ ਦਿਓ</translation>
 <translation id="5280174558369304332">ਹਟਾਈਆਂ ਜਾਣ ਵਾਲੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ:</translation>
+<translation id="5280243692621919988">ਸਾਰੀਆਂ ਵਿੰਡੋ ਨੂੰ ਬੰਦ ਕਰਨ ਵੇਲੇ ਕੁਕੀਜ਼ ਅਤੇ ਸਾਈਟ ਡਾਟੇ ਨੂੰ ਕਲੀਅਰ ਕਰੋ</translation>
 <translation id="5280426389926346830">ਕੀ ਸ਼ਾਰਟਕੱਟ ਬਣਾਉਣਾ ਹੈ?</translation>
 <translation id="528208740344463258">Android ਐਪਾਂ ਡਾਊਨਲੋਡ ਕਰਨ ਅਤੇ ਵਰਤਣ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਇਹ ਲੋੜੀਂਦਾ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕਰਨਾ ਪਵੇਗਾ। ਤੁਹਾਡੇ <ph name="DEVICE_TYPE" /> ਡੀਵਾਈਸ ਦੇ ਅੱਪਡੇਟ ਹੋਣ ਤੱਕ ਤੁਸੀਂ ਇਸ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਸਕਦੇ। ਸਥਾਪਨਾ ਪੂਰੀ ਹੋਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡੇ <ph name="DEVICE_TYPE" /> ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation>
 <translation id="5282733140964383898">"ਟ੍ਰੈਕ ਨਾ ਕਰੋ" ਨੂੰ ਚਾਲੂ ਕਰਨ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਟਰੈਫ਼ਿਕ ਨਾਲ ਇੱਕ ਬੇਨਤੀ ਸ਼ਾਮਲ ਕੀਤੀ ਜਾਵੇਗੀ। ਕੋਈ ਵੀ ਨਤੀਜਾ ਇਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ ਕਿ ਕੋਈ ਵੈੱਬਸਾਈਟ ਤੁਹਾਡੀ ਬੇਨਤੀ 'ਤੇ ਪ੍ਰਤਿਕਿਰਿਆ ਕਰਦੀ ਹੈ ਜਾਂ ਨਹੀਂ ਅਤੇ ਤੁਹਾਡੀ ਬੇਨਤੀ ਦਾ ਅਰਥ ਕਿਵੇਂ ਕੱਢਿਆ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਕੁਝ ਵੈੱਬਸਾਈਟਾਂ ਤੁਹਾਨੂੰ ਉਹ ਵਿਗਿਆਪਨ ਦਿਖਾ ਕੇ ਇਸ ਬੇਨਤੀ 'ਤੇ ਪ੍ਰਤਿਕਿਰਿਆ ਕਰ ਸਕਦੀਆਂ ਹਨ ਜੋ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੀਆਂ ਗਈਆਂ ਹੋਰ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਆਧਾਰਿਤ ਨਹੀਂ ਹਨ। ਕਈ ਵੈੱਬਸਾਈਟਾਂ ਅਜੇ ਵੀ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟੇ ਨੂੰ ਇਕੱਤਰ ਕਰਨਗੀਆਂ ਅਤੇ ਉਸਦੀ ਵਰਤੋਂ ਕਰਨਗੀਆਂ - ਉਦਾਹਰਨ ਲਈ, ਸੁਰੱਖਿਆ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਉਹਨਾਂ ਦੀਆਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ ਸਮੱਗਰੀ, ਸੇਵਾਵਾਂ, ਵਿਗਿਆਪਨ ਅਤੇ ਸਿਫ਼ਾਰਸ਼ਾਂ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਲਈ, ਅਤੇ ਰਿਪੋਰਟਿੰਗ ਅੰਕੜੇ ਸਿਰਜਣ ਲਈ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation>
@@ -3953,7 +3958,6 @@
 <translation id="63566973648609420">ਤੁਹਾਡੇ ਇਨਕ੍ਰਿਪਟਡ ਡਾਟੇ ਨੂੰ ਸਿਰਫ਼ ਓਹੀ ਵਿਅਕਤੀ ਪੜ੍ਹ ਸਕਦਾ ਹੈ ਜਿਸ ਕੋਲ ਤੁਹਾਡਾ ਪਾਸਫਰੇਜ਼ ਹੋਵੇ। ਪਾਸਫਰੇਜ਼ Google ਨੂੰ ਭੇਜਿਆ ਜਾਂ ਉਸ ਵੱਲੋਂ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਫਰੇਜ਼ ਭੁੱਲ ਜਾਂਦੇ ਹੋ ਜਾਂ ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ <ph name="BEGIN_LINK" />ਸਮਕਾਲੀਕਰਨ ਨੂੰ ਰੀਸੈੱਟ<ph name="END_LINK" /> ਕਰਨ ਦੀ ਲੋੜ ਪਵੇਗੀ।</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> ਪਰਿਵਾਰ ਵਿੱਚ ਸੁਆਗਤ ਹੈ। ਇਹ ਸਧਾਰਨ ਕੰਪਿਊਟਰ ਨਹੀਂ ਹੈ।</translation>
 <translation id="6358884629796491903">ਡਰੈਗਨ</translation>
-<translation id="6360719647236334056">ਖੋਜ, ਵਿਗਿਆਪਨਾਂ ਅਤੇ ਹੋਰ Google ਸੇਵਾਵਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਆਪਣਾ Chrome ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਵਰਤੋ</translation>
 <translation id="6361850914223837199">ਗੜਬੜ ਵੇਰਵੇ:</translation>
 <translation id="6362853299801475928">&amp;ਇੱਕ ਸਮੱਸਿਆ ਦੀ ਰਿਪੋਰਟ ਕਰੋ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4231,10 +4235,10 @@
 <translation id="6758056191028427665">ਸਾਨੂੰ ਦੱਸੋ ਕਿ ਸਾਡਾ ਪ੍ਰਦਰਸ਼ਨ ਕਿਹੋ ਜਿਹਾ ਹੈ।</translation>
 <translation id="6759193508432371551">ਫੈਕਟਰੀ ਰੀਸੈਟ</translation>
 <translation id="6762833852331690540">ਚਾਲੂ</translation>
-<translation id="6764693078871405569">ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟਾ (<ph name="URL" />) ਵੀ ਕਲੀਅਰ ਕਰੋ ਜੋ ਤੁਹਾਨੂੰ <ph name="DOMAIN" /> ਤੋਂ ਸਾਈਨ-ਆਊਟ ਕਰ ਦੇਵੇਗਾ।</translation>
 <translation id="6767566652486411142">ਕੋਈ ਹੋਰ ਭਾਸ਼ਾ ਚੁਣੋ...</translation>
 <translation id="6767639283522617719">ਡੋਮੇਨ ਸ਼ਾਮਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਪੱਕਾ ਕਰੋ ਕਿ ਸੰਸਥਾਗਤ ਇਕਾਈ ਲਈ ਸੈਟਿੰਗਾਂ ਸਹੀ ਹਨ।</translation>
 <translation id="6769712124046837540">ਪ੍ਰਿੰਟਰ ਜੋੜ ਰਿਹਾ ਹੈ...</translation>
+<translation id="6770602306803890733">ਵੈੱਬ 'ਤੇ ਤੁਹਾਡੀ ਅਤੇ ਹਰ ਕਿਸੇ ਲਈ ਸੁਰੱਖਿਆ ਨੂੰ ਬਿਹਤਰ ਬਣਾਇਆ ਜਾਂਦਾ ਹੈ</translation>
 <translation id="6770664076092644100">NFC ਰਾਹੀਂ ਪੁਸ਼ਟੀ ਕਰੋ</translation>
 <translation id="6771503742377376720">ਇੱਕ ਸਰਟੀਫਿਕੇਸ਼ਨ ਅਥਾੱਰਿਟੀ ਹੈ</translation>
 <translation id="6772339735733515807">ਆਪਣੀਆਂ ਐਕਸਟੈਂਸ਼ਨਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation>
@@ -4260,6 +4264,7 @@
 <translation id="6798578729981748444">ਆਯਾਤ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ, ਸਾਰੀਆਂ Firefox ਵਿੰਡੋਆਂ ਬੰਦ ਕਰੋ।</translation>
 <translation id="6798780071646309401">ਕੈਪਸ ਲੌਕ ਚਾਲੂ</translation>
 <translation id="6798954102094737107">ਪਲੱਗਇਨ: <ph name="PLUGIN_NAME" /></translation>
+<translation id="6801129617625983991">ਆਮ ਸੈਟਿੰਗਾਂ</translation>
 <translation id="6801435275744557998">ਟੱਚਸਕ੍ਰੀਨ ਨੂੰ ਕੈਲੀਬ੍ਰੇਟ ਕਰੋ</translation>
 <translation id="6802031077390104172"><ph name="USAGE" /> (<ph name="OID" />)</translation>
 <translation id="6805038906417219576">ਠੀਕ</translation>
@@ -4378,6 +4383,8 @@
 <translation id="6965382102122355670">ਠੀਕ</translation>
 <translation id="6965648386495488594">ਪੋਰਟ</translation>
 <translation id="6965978654500191972">ਡੀਵਾਈਸ</translation>
+<translation id="6966201992886493384">ਸਾਈਟਾਂ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਵਰਤ ਸਕਦੀਆਂ ਹਨ, ਉਦਾਹਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਜਾਂ ਤੁਹਾਡੇ ਖਰੀਦਦਾਰੀ ਕਾਰਟ ਵਿਚਲੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਯਾਦ ਰੱਖਣ ਲਈ</translation>
+<translation id="696780070563539690">ਸਾਈਟਾਂ ਵੱਖ-ਵੱਖ ਸਾਈਟਾਂ ਵਿਚਲੀ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਦੇਖਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਨਹੀਂ ਵਰਤ ਸਕਦੀਆਂ, ਉਦਾਹਰਨ ਲਈ, ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ</translation>
 <translation id="6968288415730398122">ਸਕ੍ਰੀਨ ਲਾਕ ਸੰਰੂਪਿਤ ਕਰਨ ਲਈ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ</translation>
 <translation id="6970480684834282392">ਸਟਾਰਟਅਪ ਪ੍ਰਕਾਰ</translation>
 <translation id="6970856801391541997">ਚੋਣਵੇਂ ਪੰਨੇ ਪ੍ਰਿੰਟ ਕਰੋ</translation>
@@ -4787,6 +4794,7 @@
 <translation id="7507207699631365376">ਇਸ ਪ੍ਰਦਾਨਕ ਦੀ <ph name="BEGIN_LINK" />ਪਰਦੇਦਾਰੀ ਨੀਤੀ<ph name="END_LINK" /> ਦੇਖੋ</translation>
 <translation id="7507930499305566459">ਸਥਿਤੀ ਜਵਾਬ ਪ੍ਰਮਾਣ-ਪੱਤਰ</translation>
 <translation id="7508054832109420082">ਪ੍ਰਿੰਟਰਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿਓ</translation>
+<translation id="751120035300339">ਸਾਈਟਾਂ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਨੁਭਵ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਨਹੀਂ ਵਰਤ ਸਕਦੀਆਂ, ਉਦਾਹਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਸਾਈਨ-ਇਨ ਜਾਂ ਤੁਹਾਡੇ ਖਰੀਦਦਾਰੀ ਕਾਰਟ ਵਿਚਲੀਆਂ ਆਈਟਮਾਂ ਨੂੰ ਯਾਦ ਰੱਖਣ ਲਈ</translation>
 <translation id="7513029293694390567">ਸਟੋਰ ਕੀਤੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਪਣੇ-ਆਪ ਸਾਈਟਾਂ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ। ਬੰਦ ਹੋਣ 'ਤੇ, ਤਾਂ ਤੁਹਾਨੂੰ ਇੱਕ ਵੈੱਬਸਾਈਟ 'ਤੇ ਸਾਈਨ-ਇਨ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਹਰ ਵਾਰ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।</translation>
 <translation id="7514239104543605883">ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਕਾਪੀ ਕਰੋ</translation>
 <translation id="7514365320538308">ਡਾਊਨਲੋਡ ਕਰੋ</translation>
@@ -5414,6 +5422,7 @@
 <translation id="8320459152843401447">ਤੁਹਾਡੀ ਪੂਰੀ ਸਕ੍ਰੀਨ</translation>
 <translation id="8322814362483282060">ਇਹ ਸਫ਼ਾ ਤੁਹਾਡੇ ਮਾਈਕ੍ਰੋਫੋਨ ਤੱਕ ਪਹੁੰਚਣ ਤੋਂ ਬਲੌਕ ਕੀਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="8323167517179506834">URL ਟਾਈਪ ਕਰੋ</translation>
+<translation id="8324784016256120271">ਸਾਈਟਾਂ ਵੱਖ-ਵੱਖ ਸਾਈਟਾਂ ਵਿਚਲੀ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਦੇਖਣ ਲਈ ਕੁਕੀਜ਼ ਨੂੰ ਵਰਤ ਸਕਦੀਆਂ ਹਨ, ਉਦਾਹਰਨ ਲਈ, ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ</translation>
 <translation id="8326478304147373412">PKCS #7, ਪ੍ਰਮਾਣ-ਪੱਤਰ ਚੇਨ</translation>
 <translation id="8327039559959785305">Linux ਫ਼ਾਈਲਾਂ ਨੂੰ ਮਾਊਂਟ ਕਰਨ ਵਿੱਚ ਗੜਬੜ ਹੋ ਗਈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="8327676037044516220">ਇਜਾਜ਼ਤਾਂ ਅਤੇ ਸਮੱਗਰੀ ਸੈਟਿੰਗਾਂ</translation>
@@ -5469,6 +5478,7 @@
 <translation id="8408068190360279472"><ph name="NETWORK_TYPE" /> ਨੈੱਟਵਰਕ, ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation>
 <translation id="8410775397654368139">Google Play</translation>
 <translation id="8413385045638830869">ਸਭ ਤੋਂ ਪਹਿਲਾਂ ਪੁਛੋ ( ਸਿਫ਼ਾਰਸ਼  ਕੀਤੇ)</translation>
+<translation id="8417573335434189196">ਤੁਹਾਨੂੰ ਖਤਰਨਾਕ ਵੈੱਬਸਾਈਟਾਂ, ਡਾਊਨਲੋਡਾਂ ਅਤੇ ਐਕਸਟੈਂਸ਼ਨਾਂ ਤੋਂ ਸੁਰੱਖਿਅਤ ਨਹੀਂ ਰੱਖਿਆ ਜਾਂਦਾ। Chrome ਇਸ ਸੈਟਿੰਗ ਦੀ ਸਿਫ਼ਾਰਸ਼ ਨਹੀਂ ਕਰਦਾ।</translation>
 <translation id="8418445294933751433">&amp;ਟੈਬ ਦੇ ਤੌਰ ਤੇ ਦਿਖਾਓ</translation>
 <translation id="8419098111404128271">'<ph name="SEARCH_TEXT" />' ਦੇ ਖੋਜ ਨਤੀਜੇ</translation>
 <translation id="8419368276599091549">ਤੁਹਾਡੇ <ph name="DEVICE_TYPE" /> ਵਿੱਚ ਜੀ ਆਇਆਂ ਨੂੰ!</translation>
@@ -5634,6 +5644,7 @@
 <translation id="8642947597466641025">ਟੈਕਸਟ ਨੂੰ ਵੱਡਾ ਕਰੋ</translation>
 <translation id="8644655801811752511">ਇਸ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਨੂੰ ਰੀਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਕੁੰਜੀ ਨੂੰ ਪਾ ਕੇ ਝੱਟ ਉਸਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
 <translation id="8645354835496065562">ਸੈਂਸਰ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿੰਦੇ ਰਹੋ</translation>
+<translation id="8645920082661222035">ਖਤਰਨਾਕ ਘਟਨਾਵਾਂ ਦਾ ਪਤਾ ਕਰਕੇ ਉਹਨਾਂ ਦੇ ਵਾਪਰਨ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਨੂੰ ਚਿਤਾਵਨੀ ਦਿੱਤੀ ਜਾਂਦੀ ਹੈ</translation>
 <translation id="8647834505253004544">ਇੱਕ ਵੈਧ ਵੈੱਬ ਪਤਾ ਨਹੀਂ ਹੈ</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> ਜਾਂ <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8650543407998814195">ਹਾਲਾਂਕਿ ਹੁਣ ਤੁਸੀਂ ਆਪਣੇ ਪੁਰਾਣੇ ਪ੍ਰੋਫਾਈਲ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕਰ ਸਕਦੇ ਹੋ, ਪਰ ਤੁਸੀਂ ਉਸਨੂੰ ਅਜੇ ਵੀ ਹਟਾ ਸਕਦੇ ਹੋ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 148bc4e..89a5f4c 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838">Plik <ph name="FILE_NAME" /> zawiera treści o charakterze kontrowersyjnym, więc został zablokowany.</translation>
 <translation id="1061904396131502319">Wielkimi krokami nadchodzi przerwa</translation>
+<translation id="1064552680598333868">Zmiany ustawień mikrofonu zostaną wprowadzone po następnym uruchomieniu Linuksa.</translation>
 <translation id="1067048845568873861">Utworzono</translation>
 <translation id="1067291318998134776">Linux (Beta)</translation>
 <translation id="1067922213147265141">Inne usługi Google</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">Aby uzyskać dostęp, skontaktuj się z administratorem tego urządzenia.</translation>
 <translation id="1149401351239820326">Miesiąc utraty ważności</translation>
 <translation id="1150565364351027703">Okulary przeciwsłoneczne</translation>
+<translation id="1151841030700667295">Wylogujemy Cię ze wszystkich stron – także na otwartych kartach.</translation>
 <translation id="1151917987301063366">Zawsze zezwalaj witrynie <ph name="HOST" /> na dostęp do czujników</translation>
 <translation id="1153356358378277386">Sparowane urządzenia</translation>
 <translation id="1153636665119721804">Program Ochrony zaawansowanej Google</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">Odczyt i zmiana wszystkich Twoich danych na bieżącej stronie po wywołaniu</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> chce zresetować Twoje ustawienia.</translation>
 <translation id="1243314992276662751">Prześlij</translation>
-<translation id="1243398753772016127">Witryny nie mogą wykorzystywać Twojej aktywności związanej z przeglądaniem różnych witryn do personalizowania reklam.</translation>
 <translation id="1244265436519979884">W tej chwili trwa przywracanie Linuksa</translation>
 <translation id="1244303850296295656">Błąd rozszerzenia</translation>
 <translation id="1246905108078336582">Usunąć podpowiedź ze schowka?</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">Cześć.</translation>
 <translation id="138784436342154190">Przywrócić domyślną stronę startową?</translation>
 <translation id="1390548061267426325">Otwórz jako zwykłą kartę</translation>
+<translation id="1392232653471491344">Wymagane ponowne uruchomienie Linuksa</translation>
 <translation id="1393283411312835250">Słońce i chmury</translation>
 <translation id="1393787139683794508">Spowoduje to wyczyszczenie wszystkich danych i plików cookie zapisanych przez <ph name="ORIGIN_NAME" />.</translation>
 <translation id="1395730723686586365">Aktualizator został uruchomiony</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" />, by umożliwić sparowanie</translation>
 <translation id="1422159345171879700">Wczytaj niezabezpieczone skrypty</translation>
 <translation id="1426410128494586442">Tak</translation>
+<translation id="142655739075382478">Aplikacja <ph name="APP_NAME" /> jest zablokowana</translation>
 <translation id="1426870617281699524">Kliknij Spróbuj ponownie i zaakceptuj komunikat na komputerze</translation>
 <translation id="1427269577154060167">Kraj</translation>
 <translation id="142758023928848008">Włącz klawisze trwałe (by używać skrótów klawiszowych przez sekwencyjne naciskanie klawiszy)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">&amp;Ustawienia języka</translation>
 <translation id="1478340334823509079">Szczegóły: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Instalacja nie została włączona</translation>
+<translation id="1481537595330271162">Błąd podczas zmiany rozmiaru dysku</translation>
 <translation id="1482626744466814421">Dodaj tę kartę do zakładek...</translation>
 <translation id="1483493594462132177">Wyślij</translation>
 <translation id="1484979925941077974">Strona używa Bluetootha</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">Włączone – ustawienia niestandardowe</translation>
 <translation id="1489664337021920575">Wybierz inną opcję</translation>
 <translation id="1493892686965953381">Czekam na <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Wyczyść też dane przeglądania (<ph name="URL" />) – w rezultacie może dojść do wylogowania z Google.com</translation>
 <translation id="1495486559005647033">Inne dostępne urządzenia (<ph name="NUM_PRINTERS" />).</translation>
 <translation id="1495677929897281669">Wróć do karty</translation>
 <translation id="1499271269825557605">Jeśli nie rozpoznajesz jakiegoś rozszerzenia lub przeglądarka nie działa w oczekiwany sposób, tutaj możesz wyłączyć lub dostosować rozszerzenia.</translation>
@@ -607,6 +610,7 @@
 <translation id="1805822111539868586">Zobacz widoki</translation>
 <translation id="1805888043020974594">Serwer druku</translation>
 <translation id="1805967612549112634">Potwierdź kod PIN</translation>
+<translation id="1806335016774576568">Przełącz na inną otwartą aplikację</translation>
 <translation id="1809734401532861917">Dodaj moje zakładki, historię, hasła i inne ustawienia do profilu <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1813278315230285598">Usługi</translation>
 <translation id="18139523105317219">Nazwa strony EDI</translation>
@@ -693,6 +697,7 @@
 <translation id="1921050530041573580">Sparuj swój telefon z Wiadomościami</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Otwórz za pomocą</translation>
+<translation id="1925017091976104802">Naciśnij <ph name="MODIFIER_KEY_DESCRIPTION" />, by wkleić</translation>
 <translation id="1925021887439448749">Wpisz niestandardowy adres internetowy</translation>
 <translation id="1925124445985510535">Potwierdzenie bezpieczeństwa zostało wykonane o <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Te ustawienia są kontrolowane przez zasady obowiązujące w firmie. Skontaktuj się z administratorem, by uzyskać więcej informacji.</translation>
@@ -838,6 +843,7 @@
 <translation id="2135787500304447609">&amp;Wznów</translation>
 <translation id="2136372518715274136">Wpisz nowe hasło</translation>
 <translation id="2136476978468204130">Wpisane hasło jest nieprawidłowe</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{Pliki cookie są blokowane.}=1{Pliki cookie są blokowane, 1 wyjątek}few{Pliki cookie są blokowane, {COUNT} wyjątki}many{Pliki cookie są blokowane, {COUNT} wyjątków}other{Pliki cookie są blokowane, {COUNT} wyjątku}}</translation>
 <translation id="2138398485845393913">Połączenie z urządzeniem „<ph name="DEVICE_NAME" />” jest nadal w toku</translation>
 <translation id="2139545522194199494">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />%, zarządzana przez administratora, połącz</translation>
 <translation id="2139919072249842737">Przycisk konfiguracji</translation>
@@ -1005,11 +1011,13 @@
 <translation id="2346953515226895098">Usługa SODA</translation>
 <translation id="2347644257713614136">Korzystanie z Hangouts i Cast for Education podlega Polityce prywatności Google.</translation>
 <translation id="2348176352564285430">Aplikacja: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Błąd podczas ładowania danych</translation>
 <translation id="2349896577940037438">Jeśli włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na Twoim koncie Google. Na account.google.com możesz je zobaczyć, usunąć oraz zmienić ustawienia konta.</translation>
 <translation id="2350133097354918058">Załadowano ponownie</translation>
 <translation id="2350182423316644347">Inicjuję aplikację...</translation>
 <translation id="2350796302381711542">Zezwolić usłudze <ph name="HANDLER_HOSTNAME" /> na otwieranie wszystkich linków <ph name="PROTOCOL" /> zamiast usługi <ph name="REPLACED_HANDLER_TITLE" />?</translation>
 <translation id="2351266942280602854">Język i wprowadzanie</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 pozycja}few{{NUM_ITEMS} pozycje}many{{NUM_ITEMS} pozycji}other{{NUM_ITEMS} pozycji}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Notatki na ekranie blokady są automatycznie zapisywane w aplikacji <ph name="LOCK_SCREEN_APP_NAME" />. Ostatnia notatka pozostanie na ekranie blokady.</translation>
 <translation id="2353297238722298836">Zezwolono na dostęp do kamery i mikrofonu</translation>
@@ -1043,6 +1051,7 @@
 <translation id="2392369802118427583">Aktywuj</translation>
 <translation id="2394566832561516196">Ustawienia zostaną wyczyszczone przy następnym ponownym ładowaniu.</translation>
 <translation id="2395616325548404795">Urządzenie <ph name="DEVICE_TYPE" /> zostało zarejestrowane do zarządzania w firmie, ale nie wysłało informacji o zasobie ani lokalizacji. Wpisz te informacje ręcznie przy urządzeniu w konsoli administracyjnej.</translation>
+<translation id="2396387085693598316">Administrator zablokował rozszerzenie „<ph name="EXTENSION_NAME" />”.</translation>
 <translation id="2396783860772170191">Wpisz 4-cyfrowy kod PIN (0000–9999)</translation>
 <translation id="2399939490305346086">Dane logowania na kluczu bezpieczeństwa</translation>
 <translation id="2400664245143453337">Wymagana natychmiastowa aktualizacja</translation>
@@ -1190,7 +1199,6 @@
 <translation id="2575247648642144396">Ta ikona będzie widoczna, gdy rozszerzenie będzie mogło działać na bieżącej stronie. Użyj tego rozszerzenia, klikając ikonę lub naciskając <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Skonfiguruj jako Chromeboxa wideokonferencje</translation>
 <translation id="2580889980133367162">Zawsze zezwalaj <ph name="HOST" /> na pobieranie wielu plików</translation>
-<translation id="2580924999637585241">Łącznie: <ph name="SHEETS_LABEL" /> – <ph name="NUMBER_OF_SHEETS" /></translation>
 <translation id="258095186877893873">Długie</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Nie udało się pobrać biletu Kerberos. Spróbuj jeszcze raz lub skontaktuj się z administratorem urządzeń w Twojej organizacji. Kod błędu: <ph name="ERROR_CODE" />.</translation>
@@ -1331,6 +1339,7 @@
 <translation id="2753677631968972007">Ręcznie określ uprawnienia do witryn.</translation>
 <translation id="2755367719610958252">Zarządzaj ułatwieniami dostępu</translation>
 <translation id="275662540872599901">ekran wyłączony</translation>
+<translation id="2757338480560142065">Upewnij się, że zapisujesz hasło do witryny <ph name="WEBSITE" />.</translation>
 <translation id="2762441749940182211">Zablokowano dostęp do kamery</translation>
 <translation id="2765217105034171413">Mały</translation>
 <translation id="2766161002040448006">Poproś rodzica</translation>
@@ -1583,6 +1592,7 @@
 <translation id="3090819949319990166">Nie można skopiować zewnętrznego pliku CRX jako <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">Sparowano „<ph name="DEVICE_NAME" />”</translation>
 <translation id="3092699946856346803">Włóż kartę SIM i spróbuj ponownie</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 potencjalnie niebezpieczne rozszerzenie zostało wyłączone. Możesz je też usunąć.}few{{NUM_EXTENSIONS} potencjalnie niebezpieczne rozszerzenia zostały wyłączone. Możesz je też usunąć.}many{{NUM_EXTENSIONS} potencjalnie niebezpiecznych rozszerzeń zostało wyłączonych. Możesz je też usunąć.}other{{NUM_EXTENSIONS} potencjalnie niebezpiecznego rozszerzenia zostało wyłączone. Możesz je też usunąć.}}</translation>
 <translation id="3101709781009526431">Data i godzina</translation>
 <translation id="3103941660000130485">Błąd uaktualniania Linuksa</translation>
 <translation id="310671807099593501">Strona używa Bluetootha</translation>
@@ -1657,6 +1667,7 @@
 <translation id="3201422919974259695">Tutaj będą widoczne dostępne urządzenia USB.</translation>
 <translation id="3202131003361292969">Ścieżka</translation>
 <translation id="3202173864863109533">Dźwięk z karty został wyciszony.</translation>
+<translation id="3208321278970793882">Aplikacja</translation>
 <translation id="3208584281581115441">Sprawdź teraz</translation>
 <translation id="3208703785962634733">Niepotwierdzony</translation>
 <translation id="32101887417650595">Nie można połączyć się z drukarką</translation>
@@ -1677,6 +1688,7 @@
 <translation id="3239373508713281971">Usunięto limit czasu dla aplikacji <ph name="APP_NAME" />.</translation>
 <translation id="3241680850019875542">Wybierz główny katalog rozszerzenia, które chcesz umieścić w pakiecie. Aby zaktualizować rozszerzenie, wybierz również plik kluczy prywatnych do ponownego użycia.</translation>
 <translation id="3244294424315804309">Nadal wyciszaj dźwięk</translation>
+<translation id="3246107497225150582">{0,plural, =1{Aktualizacja urządzenia nastąpi w ciągu 1 dnia}few{Aktualizacja urządzenia nastąpi w ciągu # dni}many{Aktualizacja urządzenia nastąpi w ciągu # dni}other{Aktualizacja urządzenia nastąpi w ciągu # dnia}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – błąd sieci</translation>
 <translation id="3248902735035392926">Dbaj o bezpieczeństwo. Poświęć chwilę na <ph name="BEGIN_LINK" />sprawdzenie swoich rozszerzeń<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1717,7 +1729,7 @@
 <translation id="3293644607209440645">Wyślij tę stronę</translation>
 <translation id="32939749466444286">Kontener Linuksa nie uruchomił się. Spróbuj ponownie.</translation>
 <translation id="3294437725009624529">Gość</translation>
-<translation id="3296193636298964625">Chrome nie udało się sprawdzić wszystkich Twoich haseł, bo jest ich zbyt dużo.</translation>
+<translation id="3296193636298964625">Przeglądarce Chrome nie udało się sprawdzić wszystkich Twoich haseł, bo jest ich zbyt dużo.</translation>
 <translation id="329703603001918157">Nie można edytować skrótu</translation>
 <translation id="329838636886466101">Napraw</translation>
 <translation id="3298789223962368867">Wprowadzono nieprawidłowy adres URL.</translation>
@@ -1763,6 +1775,7 @@
 <translation id="3356580349448036450">Zakończone</translation>
 <translation id="3359256513598016054">Ograniczenia zasad certyfikatu</translation>
 <translation id="3360297538363969800">Drukowanie nie udało się. Sprawdź swoją drukarkę i spróbuj ponownie.</translation>
+<translation id="3364986687961713424">Od administratora: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Użyj klawisza Ctrl lub Alt</translation>
 <translation id="3367047597842238025"><ph name="DEVICE_TYPE" /> oferuje wiele możliwości. Skonfiguruj go tak jak chcesz i zobacz, co potrafi.</translation>
 <translation id="3368922792935385530">Połączone</translation>
@@ -1867,6 +1880,7 @@
 <translation id="3496213124478423963">Pomniejsz</translation>
 <translation id="3497560059572256875">Udostępnij doodla</translation>
 <translation id="3498215018399854026">Obecnie nie możemy się skontaktować z Twoim rodzicem. Spróbuj ponownie.</translation>
+<translation id="3500417806337761827">Błąd podczas podłączania udziału. Podłączono zbyt wiele udziałów SMB.</translation>
 <translation id="3505030558724226696">Anuluj dostęp do urządzeń</translation>
 <translation id="3507421388498836150">Obecne uprawnienia rozszerzenia „<ph name="EXTENSION_NAME" />”</translation>
 <translation id="3507888235492474624">Skanuj ponownie w poszukiwaniu urządzeń Bluetooth</translation>
@@ -1932,6 +1946,7 @@
 <translation id="3592260987370335752">&amp;Więcej informacji</translation>
 <translation id="359283478042092570">Wpisz</translation>
 <translation id="3593965109698325041">Ograniczenia nazwy certyfikatu</translation>
+<translation id="3595381248165458839">Skontaktuj się z administratorem urządzenia w organizacji</translation>
 <translation id="3596235046596950091">Włącz usługi w chmurze</translation>
 <translation id="3596414637720633074">Blokowanie plików cookie innych firm w trybie incognito</translation>
 <translation id="3599221874935822507">Uniesiony</translation>
@@ -2065,6 +2080,7 @@
 <translation id="3742666961763734085">Nie znaleziono jednostki organizacyjnej o tej nazwie. Spróbuj jeszcze raz.</translation>
 <translation id="3744111561329211289">Synchronizacja w tle</translation>
 <translation id="3746127522257263495">Nie jest możliwe dodanie konta G Suite dla Szkół i Uczelni w aplikacjach na Androida.</translation>
+<translation id="3747039297326604768">Nie udało się otworzyć wtyczki Plugin VM</translation>
 <translation id="3747077776423672805">Aby usunąć aplikacje, otwórz Ustawienia &gt; Sklep Google Play &gt; Zarządzaj ustawieniami Androida &gt; Aplikacje lub Menedżer aplikacji. Następnie kliknij aplikację, którą chcesz odinstalować (jeśli to konieczne, przesuń palcem w prawo lub w lewo, by ją znaleźć), a potem kliknij Odinstaluj lub Wyłącz.</translation>
 <translation id="3748026146096797577">Brak połączenia</translation>
 <translation id="3752582316358263300">OK</translation>
@@ -2140,6 +2156,7 @@
 <translation id="3827774300009121996">&amp;Pełny ekran</translation>
 <translation id="3828029223314399057">Przeszukaj zakładki</translation>
 <translation id="3829765597456725595">Udział plików SMB</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Twój administrator ponownie włączył 1 potencjalnie niebezpieczne rozszerzenie}few{Twój administrator ponownie włączył {NUM_EXTENSIONS} potencjalnie niebezpieczne rozszerzenia}many{Twój administrator ponownie włączył {NUM_EXTENSIONS} potencjalnie niebezpiecznych rozszerzeń}other{Twój administrator ponownie włączył {NUM_EXTENSIONS} potencjalnie niebezpiecznego rozszerzenia}}</translation>
 <translation id="3831436149286513437">Podpowiedzi z Dysku Google podczas wyszukiwania</translation>
 <translation id="383161972796689579">Właściciel tego urządzenia wyłączył możliwość dodawania nowych użytkowników</translation>
 <translation id="3834775135533257713">Nie udało się dodać aplikacji „<ph name="TO_INSTALL_APP_NAME" />”, bo występuje konflikt z aplikacją „<ph name="INSTALLED_APP_NAME" />”.</translation>
@@ -2316,6 +2333,7 @@
 <translation id="4047726037116394521">Wróć do ekranu głównego</translation>
 <translation id="4050225813016893843">Metoda uwierzytelniania</translation>
 <translation id="4052120076834320548">Malutki</translation>
+<translation id="4056908315660577142">Upłynął ustawiony przez rodzica limit czasu korzystania z aplikacji <ph name="APP_NAME" /> w Chrome. Jutro możesz z niej korzystać przez <ph name="TIME_LIMIT" />.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> – <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">Wyświetl w sklepie</translation>
 <translation id="4058647953897694817">Zweryfikuj przez Bluetooth</translation>
@@ -2447,6 +2465,7 @@
 <translation id="424963718355121712">Aplikacje muszą być udostępniane z hosta, którego dotyczą</translation>
 <translation id="4250229828105606438">Zrzut ekranu</translation>
 <translation id="4250680216510889253">Nie</translation>
+<translation id="4252035718262427477">Strona internetowa, pojedynczy plik (Web Bundle)</translation>
 <translation id="4252852543720145436">Identyfikatory treści chronionych</translation>
 <translation id="4252899949534773101">Bluetooth jest wyłączony</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> – udostępniono zawartość karty</translation>
@@ -2536,12 +2555,13 @@
 <translation id="439266289085815679">Konfiguracją Bluetooth zarządza <ph name="USER_EMAIL" />.</translation>
 <translation id="4392896746540753732">Edytuj plik konfiguracji</translation>
 <translation id="4394049700291259645">Wyłącz</translation>
-<translation id="439817266247065935">Twoje urządzenie nie zostało poprawnie zamknięte. Uruchom ponownie Linuksa, aby używać aplikacji na Linuksa.</translation>
+<translation id="439817266247065935">Twoje urządzenie nie zostało poprawnie zamknięte. Uruchom ponownie Linuksa, aby używać aplikacji w tym systemie.</translation>
 <translation id="4400367121200150367">Tutaj będą wyświetlane strony, które nigdy nie zapisują haseł</translation>
 <translation id="4400632832271803360">Przytrzymaj klawisz programu uruchamiającego, by zmienić działanie klawiszy z górnego rzędu</translation>
 <translation id="4400963414856942668">Aby dodać kartę do zakładek, możesz kliknąć gwiazdkę</translation>
 <translation id="4403775189117163360">Wybierz inny folder</translation>
 <translation id="4404136731284211429">Skanuj ponownie</translation>
+<translation id="4404843640767531781">Twój rodzic zablokował aplikację <ph name="APP_NAME" />. Aby móc z niej korzystać, poproś go o pozwolenie.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">Pomo&amp;c</translation>
 <translation id="4409697491990005945">Marginesy</translation>
@@ -2611,6 +2631,7 @@
 <translation id="450099669180426158">Ikona wykrzyknika</translation>
 <translation id="4501530680793980440">Potwierdź usunięcie</translation>
 <translation id="4502423230170890588">Usuń z tego urządzenia</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{Pliki cookie są dozwolone}=1{Pliki cookie są dozwolone, 1 wyjątek}few{Pliki cookie są dozwolone, {COUNT} wyjątki}many{Pliki cookie są dozwolone, {COUNT} wyjątków}other{Pliki cookie są dozwolone, {COUNT} wyjątku}}</translation>
 <translation id="4504940961672722399">Użyj tego rozszerzenia, klikając tę ikonę lub naciskając <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="4508051413094283164">Otwórz wszystkie w oknie incognito</translation>
 <translation id="4508265954913339219">Aktywacja nie powiodła się</translation>
@@ -2724,6 +2745,7 @@
 <translation id="465878909996028221">Przekierowania przeglądarki działają tylko z protokołami http, https i file.</translation>
 <translation id="4659077111144409915">Konto główne</translation>
 <translation id="4660476621274971848">To jest wersja „<ph name="NEW_ID" />”, a oczekiwano wersji „<ph name="EXPECTED_VERSION" />”</translation>
+<translation id="4660540330091848931">Zmieniam rozmiar</translation>
 <translation id="4660838440047236328">układ Twojego pokoju.</translation>
 <translation id="4661407454952063730">Dane aplikacji mogą obejmować dowolne informacje zapisane przez aplikację (w zależności od ustawień określonych przez dewelopera) – w tym dane takie jak kontakty, wiadomości i zdjęcia.</translation>
 <translation id="4661931051827810091">Wysyła anonimowo adresy URL niektórych odwiedzanych przez Ciebie stron, niektóre informacje o systemie i niektóre treści ze stron, by pomóc w wykrywaniu i blokowaniu nowych zagrożeń dla wszystkich użytkowników internetu.</translation>
@@ -2819,7 +2841,6 @@
 <translation id="4808667324955055115">Zablokowane wyskakujące okienka:</translation>
 <translation id="480990236307250886">Otwórz stronę główną</translation>
 <translation id="4811503964269049987">Dodaj wybraną kartę do grupy</translation>
-<translation id="4811818760963189951">Wyłączono, ponieważ synchronizacja historii jest wyłączona</translation>
 <translation id="4813136279048157860">Moje obrazy</translation>
 <translation id="4813512666221746211">Błąd sieci</translation>
 <translation id="4814378367953456825">Wpisz nazwę tego odcisku</translation>
@@ -2908,6 +2929,7 @@
 <translation id="4918086044614829423">Akceptuj</translation>
 <translation id="4918221908152712722">Zainstaluj aplikację <ph name="APP_NAME" /> (nie wymaga pobrania)</translation>
 <translation id="4920887663447894854">Następującym witrynom zablokowano możliwość śledzenia Twojej lokalizacji na tej stronie:</translation>
+<translation id="49226369361073053">{0,plural, =0{Aktualizacja urządzenia nastąpi teraz}=1{Aktualizacja urządzenia nastąpi w ciągu 1 sekundy}few{Aktualizacja urządzenia nastąpi w ciągu # sekund}many{Aktualizacja urządzenia nastąpi w ciągu # sekund}other{Aktualizacja urządzenia nastąpi w ciągu # sekundy}}</translation>
 <translation id="492299503953721473">Usuń aplikacje na Androida</translation>
 <translation id="4923279099980110923">Tak, chcę pomóc</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2988,7 +3010,6 @@
 <translation id="5040823038948176460">Dodatkowe ustawienia treści</translation>
 <translation id="5042282098504489593">Aby podłączyć urządzenie <ph name="USB_DEVICE_NAME" /> do Linuksa, otwórz Ustawienia</translation>
 <translation id="5043913660911154449">Lub wskaż plik PPD drukarki <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Wyłączono, ponieważ synchronizowane dane są szyfrowane za pomocą hasła</translation>
 <translation id="5045550434625856497">Nieprawidłowe hasło</translation>
 <translation id="504561833207953641">Otwieram w istniejącej sesji przeglądarki.</translation>
 <translation id="5047421709274785093">Nie zezwalaj stronom internetowym na używanie czujników ruchu i światła</translation>
@@ -2998,7 +3019,7 @@
 <translation id="5052499409147950210">Edytowanie strony internetowej</translation>
 <translation id="5053604404986157245">Losowo generowane hasło TPM jest niedostępne. Ta sytuacja jest normalna po użyciu funkcji Powerwash.</translation>
 <translation id="5057110919553308744">Gdy klikniesz rozszerzenie</translation>
-<translation id="5057403786441168405">Zarządzanie kontami zalogowanych użytkowników. Strony, aplikacje i rozszerzenia w Chrome i Google Play mogą używać tych kont do dostosowywania swojego wyglądu i działania (jeśli mają odpowiednie uprawnienia). <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
+<translation id="5057403786441168405">Zarządzanie kontami zalogowanych użytkowników. Witryny, aplikacje i rozszerzenia w Chrome i Google Play mogą używać tych kont do dostosowywania swojego wyglądu i działania (jeśli mają odpowiednie uprawnienia). <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
 <translation id="5060332552815861872">Dostępna do zapisania jest jedna drukarka.</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Ten folder zawiera zakładkę. Na pewno chcesz go usunąć?}few{Ten folder zawiera # zakładki. Na pewno chcesz go usunąć?}many{Ten folder zawiera # zakładek. Na pewno chcesz go usunąć?}other{Ten folder zawiera # zakładki. Na pewno chcesz go usunąć?}}</translation>
 <translation id="5062930723426326933">Logowanie nieudane. Połącz się z internetem i spróbuj ponownie.</translation>
@@ -3059,6 +3080,7 @@
 <translation id="5135085122826131075">Uruchamiaj Asystenta, mówiąc „OK Google”.</translation>
 <translation id="5135533361271311778">Nie można utworzyć zakładki.</translation>
 <translation id="5137501176474113045">Usuń ten element</translation>
+<translation id="5138982052046316113">Zmień rozmiar dysku Linuksa</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, szukaj w: <ph name="DEFAULT_SEARCH_ENGINE_NAME" /></translation>
 <translation id="5139823398361067371">Wpisz kod PIN klucza bezpieczeństwa. Jeśli go nie znasz, musisz zresetować klucz.</translation>
 <translation id="5139955368427980650">&amp;Otwórz</translation>
@@ -3215,6 +3237,7 @@
 <translation id="5353252989841766347">Eksportowanie haseł z Chrome</translation>
 <translation id="5355099869024327351">Pozwól Asystentowi wyświetlać powiadomienia</translation>
 <translation id="5355926466126177564">Rozszerzenie „<ph name="EXTENSION_NAME" />” ustawiło inną stronę wyświetlaną po wyszukiwaniu w omniboksie.</translation>
+<translation id="535911077628776608">Plik <ph name="FILE_NAME" /> może być niebezpieczny. Czy wysłać go do przeskanowania przez Ochronę zaawansowaną Google? Naciśnij Shift+F6, by przejść do obszaru paska pobranych plików.</translation>
 <translation id="5359910752122114278">1 wynik</translation>
 <translation id="5360150013186312835">Pokaż na pasku narzędzi</translation>
 <translation id="5362741141255528695">Wybierz plik kluczy prywatnych.</translation>
@@ -3353,6 +3376,7 @@
 <translation id="5539221284352502426">Podane hasło zostało odrzucone przez serwer. Możliwe, że jest ono za krótkie, musi zawierać cyfry lub symbole albo musi się różnić od poprzednich haseł.</translation>
 <translation id="5541694225089836610">Administrator wyłączył to działanie</translation>
 <translation id="5542132724887566711">Profil</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> wymaga jak najszybszego zaktualizowania urządzenia.</translation>
 <translation id="5542750926112347543">Pliki cookie z witryny <ph name="DOMAIN" /> zostały zablokowane</translation>
 <translation id="5542949973455282971">Łączę z siecią <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Sprawdzam stan...</translation>
@@ -3398,6 +3422,7 @@
 <translation id="5593357315997824387">Synchronizuj moje pliki</translation>
 <translation id="5595152862129936745">Bardzo daleko</translation>
 <translation id="5595485650161345191">Edytuj adres</translation>
+<translation id="5595727715083333657">Kontener nie obsługuje zmiany rozmiaru. Aby zmienić ilość miejsca wstępnie przydzielonego dla Linuksa (beta), utwórz kopię zapasową i przywróć ją w nowym kontenerze.</translation>
 <translation id="5596627076506792578">Więcej opcji</translation>
 <translation id="5600706100022181951">Pobranie aktualizacji wykorzysta <ph name="UPDATE_SIZE_MB" /> MB mobilnej transmisji danych. Czy chcesz kontynuować?</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -3470,6 +3495,7 @@
 <translation id="5691511426247308406">Rodzina</translation>
 <translation id="5691772641933328258">Nie rozpoznano odcisku palca</translation>
 <translation id="5692183275898619210">Drukowanie zakończone</translation>
+<translation id="5692875591060376599">Wybrany plik jest nieznany i może być niebezpieczny. Wysłać go do przeskanowania przez Ochronę zaawansowaną Google?</translation>
 <translation id="569425414730375234">Bieżąca sesja incognito: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">Zgłoś nadużycie dotyczące rozszerzenia „<ph name="EXTENSION_NAME" />”</translation>
 <translation id="5696679855467848181">Bieżący plik PPD: <ph name="PPD_NAME" /></translation>
@@ -3681,6 +3707,7 @@
 <translation id="5976160379964388480">Pozostałe</translation>
 <translation id="5978277834170881274">&amp;Używaj podstawowego sprawdzania pisowni</translation>
 <translation id="5979084224081478209">Sprawdź hasła</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{Ponownie włączono 1 potencjalnie niebezpieczne rozszerzenie}few{Ponownie włączono {NUM_EXTENSIONS} potencjalnie niebezpieczne rozszerzenia}many{Ponownie włączono {NUM_EXTENSIONS} potencjalnie niebezpiecznych rozszerzeń}other{Ponownie włączono {NUM_EXTENSIONS} potencjalnie niebezpiecznego rozszerzenia}}</translation>
 <translation id="5979421442488174909">&amp;Przetłumacz na język <ph name="LANGUAGE" /></translation>
 <translation id="5979469435153841984">Aby dodać stronę do zakładek, kliknij gwiazdkę na pasku adresu</translation>
 <translation id="5984222099446776634">Ostatnio odwiedzone</translation>
@@ -3931,6 +3958,7 @@
 <translation id="6309510305002439352">Mikrofon wyłączony</translation>
 <translation id="6311220991371174222">Nie można uruchomić Chrome – coś poszło nie tak podczas otwierania Twojego profilu. Spróbuj jeszcze raz uruchomić Chrome.</translation>
 <translation id="6312403991423642364">Nieznany błąd sieci</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Potwierdzenie bezpieczeństwa zostało wykonane 1 dzień temu}few{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_DAYS} dni temu}many{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_DAYS} dni temu}other{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_DAYS} dnia temu}}</translation>
 <translation id="6312638141433622592">Proponuj wyświetlanie artykułów w trybie czytnika, gdy jest obsługiwany.</translation>
 <translation id="6313641880021325787">WYŁĄCZ TRYB VR</translation>
 <translation id="6314819609899340042">Funkcje debugowania zostały włączone na urządzeniu <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
@@ -3946,6 +3974,7 @@
 <translation id="6325191661371220117">Wyłącz automatyczne uruchamianie</translation>
 <translation id="6326175484149238433">Usuń z Chrome</translation>
 <translation id="6326855256003666642">Liczba elementów wymuszających aktywność</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> wymaga zaktualizowania tego urządzenia przed podanym terminem.</translation>
 <translation id="6327785803543103246">Automatyczne wykrywanie internetowego serwera proxy</translation>
 <translation id="6333064448949140209">Plik zostanie wysłany do Google w celu debugowania</translation>
 <translation id="6339668969738228384">Utwórz nowy profil dla adresu <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -3965,7 +3994,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />zresetować synchronizację<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Witamy w rodzinie <ph name="SHORT_PRODUCT_NAME" />. To nie jest zwyczajny komputer.</translation>
 <translation id="6358884629796491903">Smok</translation>
-<translation id="6360719647236334056">Wykorzystywanie historii przeglądania w Chrome do personalizowania wyników wyszukiwania, reklam i działania innych usług Google</translation>
 <translation id="6361850914223837199">Szczegóły błędu:</translation>
 <translation id="6362853299801475928">&amp;Zgłoś problem</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3973,11 +4001,13 @@
 <translation id="6366190659675876144">Standardowa ochrona</translation>
 <translation id="636850387210749493">Rejestracja w firmie</translation>
 <translation id="6370021412472292592">Nie można wczytać pliku manifestu.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Zmień hasło}few{Zmień hasła}many{Zmień hasła}other{Zmień hasła}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Spróbuj jeszcze raz</translation>
 <translation id="6377268785556383139">1 wynik dla zapytania „<ph name="SEARCH_TEXT" />”</translation>
 <translation id="6380143666419481200">Zaakceptuj i kontynuuj</translation>
 <translation id="6384275966486438344">Zmiana ustawień wyszukiwania na: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">Połącz się z internetem i spróbuj ponownie</translation>
 <translation id="6385543213911723544">Strony mogą zapisywać dane w plikach cookie i je odczytywać</translation>
 <translation id="6386099547750337629">Jeśli jest to niezgodne z oczekiwaniami, skontaktuj się z pomocą.</translation>
 <translation id="6387674443318562538">Podziel pionowo</translation>
@@ -4056,6 +4086,7 @@
 <translation id="6478248366783946499">Zachować niebezpieczny plik?</translation>
 <translation id="6483485061007832714">Otwieranie pobranego pliku</translation>
 <translation id="6483805311199035658">Otwieram <ph name="FILE" />...</translation>
+<translation id="6485092675191826776">Licencja na wtyczkę Plugin VM wygasła</translation>
 <translation id="6488384360522318064">Wybierz język</translation>
 <translation id="648927581764831596">Brak dostępnych</translation>
 <translation id="6490471652906364588">Urządzenie USB-C (prawy port)</translation>
@@ -4243,9 +4274,9 @@
 <translation id="6758056191028427665">Co sądzisz o efektach naszej pracy?</translation>
 <translation id="6759193508432371551">Ustawienia fabryczne</translation>
 <translation id="6762833852331690540">Włączono</translation>
-<translation id="6764693078871405569">Wyczyść też dane przeglądania (<ph name="URL" />) – w rezultacie może też dojść do wylogowania z <ph name="DOMAIN" /></translation>
 <translation id="6767566652486411142">Wybierz inny język...</translation>
 <translation id="6767639283522617719">Nie można dołączyć do domeny. Upewnij się, że jednostka organizacyjna ma poprawne ustawienia.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> zaleca zaktualizowanie tego urządzenia.</translation>
 <translation id="6769712124046837540">Dodaję drukarkę...</translation>
 <translation id="6770602306803890733">Zwiększa bezpieczeństwo Twoje i pozostałych użytkowników internetu</translation>
 <translation id="6770664076092644100">Zweryfikuj przez NFC</translation>
@@ -4378,6 +4409,7 @@
 <translation id="6943836128787782965">Wykonanie metody GET protokołu HTTP nie powiodło się.</translation>
 <translation id="6945221475159498467">Wybierz</translation>
 <translation id="694592694773692225">Przekierowanie zostało zablokowane na tej stronie.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 przejęte hasło}few{{NUM_PASSWORDS} przejęte hasła}many{{NUM_PASSWORDS} przejętych haseł}other{{NUM_PASSWORDS} przejętego hasła}}</translation>
 <translation id="6949434160682548041">Hasło (opcjonalnie)</translation>
 <translation id="6950627417367801484">Przywróć aplikacje</translation>
 <translation id="6950943362443484797">Zainstalujemy dla Ciebie tę aplikację</translation>
@@ -4462,6 +4494,7 @@
 <translation id="7053983685419859001">Blokuj</translation>
 <translation id="7055152154916055070">Zablokowano przekierowanie:</translation>
 <translation id="7056526158851679338">&amp;Sprawdź urządzenia</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Potwierdzenie bezpieczeństwa zostało wykonane 1 minutę temu}few{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_MINS} minuty temu}many{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_MINS} minut temu}other{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_MINS} minuty temu}}</translation>
 <translation id="7057767408836081338">Nie udało się pobrać danych aplikacji. Próbuję ją jednak uruchomić...</translation>
 <translation id="7059858479264779982">Ustaw automatyczne uruchamianie</translation>
 <translation id="7059893117020417984">Aby przeglądać prywatnie, kliknij ikonę menu z kropkami i otwórz okno incognito</translation>
@@ -4705,6 +4738,7 @@
 <translation id="7371006317849674875">Godzina rozpoczęcia</translation>
 <translation id="7371490947952970241">Aby wyłączyć lokalizację, wyłącz główne ustawienie Lokalizacja na tym urządzeniu. W ustawieniach lokalizacji możesz też wyłączyć korzystanie z sieci Wi‑Fi, sieci komórkowych i czujników przy określaniu lokalizacji.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Aktualizacja urządzenia nastąpi w ciągu godziny}few{Aktualizacja urządzenia nastąpi w ciągu # godzin}many{Aktualizacja urządzenia nastąpi w ciągu # godzin}other{Aktualizacja urządzenia nastąpi w ciągu # godziny}}</translation>
 <translation id="7376553024552204454">Podświetlaj wskaźnik myszy, gdy się porusza</translation>
 <translation id="7377451353532943397">Nadal blokuj dostęp do czujników</translation>
 <translation id="73786666777299047">Otwórz Chrome Web Store</translation>
@@ -4722,6 +4756,7 @@
 <translation id="7400418766976504921">Adres URL</translation>
 <translation id="7400839060291901923">Skonfiguruj połączenie na telefonie <ph name="PHONE_NAME" /></translation>
 <translation id="7401778920660465883">Zamknij tę wiadomość</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Potwierdzenie bezpieczeństwa zostało wykonane 1 godzinę temu}few{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_HOURS} godziny temu}many{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_HOURS} godzin temu}other{Potwierdzenie bezpieczeństwa zostało wykonane {NUM_HOURS} godziny temu}}</translation>
 <translation id="740624631517654988">Zablokowano wyskakujące okienko</translation>
 <translation id="7407430846095439694">Zaimportuj i powiąż</translation>
 <translation id="7407504355934009739">Większość użytkowników blokuje powiadomienia z tej strony</translation>
@@ -4752,6 +4787,7 @@
 <translation id="7441830548568730290">Inni użytkownicy</translation>
 <translation id="7442465037756169001">Hardware Hangouts Meet jest gotowy do konfiguracji.</translation>
 <translation id="744341768939279100">Utwórz nowy profil</translation>
+<translation id="744366959743242014">Wczytuję dane. Może to potrwać kilka sekund.</translation>
 <translation id="7443806024147773267">Miej dostęp do swoich haseł zawsze wtedy, gdy zalogujesz się na swoje konto Google</translation>
 <translation id="7444983668544353857">Wyłącz – <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Automatyczne instalowanie aplikacji</translation>
@@ -4787,6 +4823,7 @@
 <translation id="7489761397368794366">Zadzwoń ze swojego urządzenia</translation>
 <translation id="749028671485790643">Osoba <ph name="VALUE" /></translation>
 <translation id="7490813197707563893">Adres MAC</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 plik cookie}few{{NUM_COOKIES} pliki cookie}many{{NUM_COOKIES} plików cookie}other{{NUM_COOKIES} pliku cookie}}</translation>
 <translation id="7493386493263658176">Rozszerzenie <ph name="EXTENSION_NAME" /> może rejestrować wszystko, co wpisujesz, w tym poufne informacje takie jak hasła i numery kart kredytowych. Czy chcesz używać tego rozszerzenia?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Nie pamiętasz starego hasła?</translation>
@@ -4807,10 +4844,14 @@
 <translation id="7513029293694390567">Automatycznie loguj się na stronach, używając zapisanych danych logowania. Jeśli ta funkcja jest wyłączona, przed każdym zalogowaniem się zobaczysz prośbę o potwierdzenie.</translation>
 <translation id="7514239104543605883">Skopiuj na swoje urządzenie</translation>
 <translation id="7514365320538308">Pobierz</translation>
+<translation id="751523031290522286">Administrator zablokował aplikację <ph name="APP_NAME" />. Aby móc z niej korzystać, poproś go o pozwolenie.</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> – wstrzymano</translation>
+<translation id="7517063221058203587">{0,plural, =1{Aktualizacja urządzenia nastąpi w ciągu 1 minuty}few{Aktualizacja urządzenia nastąpi w ciągu # minut}many{Aktualizacja urządzenia nastąpi w ciągu # minut}other{Aktualizacja urządzenia nastąpi w ciągu # minuty}}</translation>
 <translation id="7520766081042531487">Portal incognito: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">Powiedz „OK Google”</translation>
 <translation id="7525067979554623046">Utwórz</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 więcej}few{{NUM_DOWNLOADS} więcej}many{{NUM_DOWNLOADS} więcej}other{{NUM_DOWNLOADS} więcej}}</translation>
 <translation id="7529411698175791732">Sprawdź połączenie z internetem. Jeśli problem nie ustąpi, wyloguj się i zaloguj ponownie.</translation>
 <translation id="7530016656428373557">Szybkość rozładowywania w watach</translation>
 <translation id="7531779363494549572">Otwórz Ustawienia &gt; Aplikacje i powiadomienia &gt; Powiadomienia.</translation>
@@ -4979,6 +5020,7 @@
 <translation id="7765158879357617694">Przenieś</translation>
 <translation id="7766807826975222231">Obejrzyj prezentację</translation>
 <translation id="7766838926148951335">Zaakceptuj uprawnienia</translation>
+<translation id="7768770796815395237">Zmień</translation>
 <translation id="7769672763586021400">Identyfikator modelu</translation>
 <translation id="7770651108375708429">Rozłączanie się z siecią Wi-Fi</translation>
 <translation id="7771452384635174008">Układ</translation>
@@ -5415,6 +5457,7 @@
 <translation id="8286963743045814739">Możesz przeglądać prywatnie w oknie incognito</translation>
 <translation id="8287902281644548111">Wyszukaj według wywołania interfejsu API lub adresu URL</translation>
 <translation id="8288032458496410887">Odinstaluj aplikację <ph name="APP" />…</translation>
+<translation id="8289128870594824098">Rozmiar dysku</translation>
 <translation id="8291967909914612644">Kraj operatora macierzystego</translation>
 <translation id="8294431847097064396">Źródło</translation>
 <translation id="8297006494302853456">Słaby</translation>
@@ -5627,6 +5670,7 @@
 <translation id="8608618451198398104">Dodawanie biletu Kerberos</translation>
 <translation id="8609465669617005112">W górę</translation>
 <translation id="8610103157987623234">Nieprawidłowy format – spróbuj ponownie</translation>
+<translation id="8612935480510351790">Plik <ph name="FILE_NAME" /> może być niebezpieczny. Czy wysłać go do przeskanowania przez Ochronę zaawansowaną Google?</translation>
 <translation id="8613164732773110792">Możesz użyć tylko małych liter, cyfr, podkreśleń i myślników</translation>
 <translation id="8615618338313291042">Aplikacja w trybie incognito: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Z cieniem</translation>
@@ -5654,6 +5698,7 @@
 <translation id="8641606876632989680">Chrome powiadomi Cię w razie logowania za pomocą przejętego hasła</translation>
 <translation id="8642900771896232685">2 s</translation>
 <translation id="8642947597466641025">Powiększ tekst</translation>
+<translation id="8643443571868262066">Plik <ph name="FILE_NAME" /> może być niebezpieczny. Wysłać go do przeskanowania przez Ochronę zaawansowaną Google?</translation>
 <translation id="8644655801811752511">Nie udało się zresetować tego klucza bezpieczeństwa. Spróbuj go zresetować zaraz po włożeniu.</translation>
 <translation id="8645354835496065562">Nadal zezwalaj na dostęp do czujników</translation>
 <translation id="8645920082661222035">Przewiduje niebezpieczne zdarzenia i ostrzega Cię przed nimi, zanim nastąpią</translation>
@@ -6074,6 +6119,7 @@
 <translation id="9169931577761441333">Dodaj aplikację <ph name="APP_NAME" /> do ekranu głównego</translation>
 <translation id="9170848237812810038">&amp;Cofnij</translation>
 <translation id="9170884462774788842">Inny program na Twoim komputerze dodał motyw, który może zmienić działanie Chrome.</translation>
+<translation id="917350715406657904">Upłynął ustawiony przez rodzica limit czasu korzystania z aplikacji <ph name="APP_NAME" />. Jutro możesz z niej korzystać przez <ph name="TIME_LIMIT" />.</translation>
 <translation id="9173995187295789444">Skanuję w poszukiwaniu urządzeń Bluetooth…</translation>
 <translation id="9174401638287877180">Wysyłaj dane diagnostyczne oraz informacje o użyciu. Pomóż ulepszyć działanie Androida na urządzeniu dziecka, automatycznie wysyłając do Google dane diagnostyczne oraz informacje o używaniu urządzenia i aplikacji. Nie zostaną one użyte do zidentyfikowania Twojego dziecka. Wykorzystamy je, by poprawić stabilność systemu i aplikacji oraz wprowadzić inne ulepszenia. Niektóre dane zbiorcze pomogą nam też udoskonalić aplikacje Google lub zostaną wykorzystane przez naszych partnerów, na przykład deweloperów aplikacji na Androida. Jeśli na koncie Google dziecka włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na jego koncie.</translation>
 <translation id="917510707618656279">Pytaj, gdy strona chce uzyskać dostęp do urządzeń Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index 8c10c2e..790854e 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838">O arquivo <ph name="FILE_NAME" /> apresenta conteúdo sensível e foi bloqueado.</translation>
 <translation id="1061904396131502319">Está quase na hora de fazer uma pausa</translation>
+<translation id="1064552680598333868">As mudanças no microfone entrarão em vigor quando o Linux for reiniciado.</translation>
 <translation id="1067048845568873861">Criado em</translation>
 <translation id="1067291318998134776">Linux (Beta)</translation>
 <translation id="1067922213147265141">Outros serviços do Google</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">Para solicitar acesso, entre em contato com o administrador deste dispositivo.</translation>
 <translation id="1149401351239820326">Mês de expiração</translation>
 <translation id="1150565364351027703">Óculos de sol</translation>
+<translation id="1151841030700667295">Sua conta será desconectada de todos os sites, inclusive nas guias abertas.</translation>
 <translation id="1151917987301063366">Sempre permitir que <ph name="HOST" /> acesse os sensores</translation>
 <translation id="1153356358378277386">Dispositivos pareados</translation>
 <translation id="1153636665119721804">Programa Proteção Avançada do Google</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">Ler e alterar todos os seus dados no website atual quando invocado</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> deseja redefinir suas configurações.</translation>
 <translation id="1243314992276662751">Fazer upload</translation>
-<translation id="1243398753772016127">O Google Sites não pode usar sua atividade de navegação em diferentes sites para personalizar anúncios</translation>
 <translation id="1244265436519979884">A restauração do Linux está em andamento</translation>
 <translation id="1244303850296295656">Erro na extensão</translation>
 <translation id="1246905108078336582">Remover sugestão da área de transferência?</translation>
@@ -196,7 +197,7 @@
 <translation id="1251366534849411931">Chave de abertura esperada: <ph name="ERROR_LINE" /></translation>
 <translation id="1252987234827889034">Ocorreu um erro de perfil</translation>
 <translation id="1254593899333212300">Conexão direta à Internet</translation>
-<translation id="1259152067760398571">A confirmação de segurança foi executada ontem</translation>
+<translation id="1259152067760398571">A "confirmação de segurança" foi executada ontem</translation>
 <translation id="1260451001046713751">Sempre permitir pop-ups e redirecionamentos de <ph name="HOST" /></translation>
 <translation id="126156426083987769">Ocorreu um problema com as licenças do dispositivo no modo de demonstração.</translation>
 <translation id="126710816202626562">Idioma de tradução:</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">Como vai?</translation>
 <translation id="138784436342154190">Restaurar página de inicialização padrão?</translation>
 <translation id="1390548061267426325">Abrir como guia normal</translation>
+<translation id="1392232653471491344">É necessário atualizar o Linux</translation>
 <translation id="1393283411312835250">Sol e nuvens</translation>
 <translation id="1393787139683794508">Isso limpará todos os dados e cookies armazenados por <ph name="ORIGIN_NAME" />.</translation>
 <translation id="1395730723686586365">Atualizador iniciado</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> para permitir o pareamento</translation>
 <translation id="1422159345171879700">Carregar scripts não seguros</translation>
 <translation id="1426410128494586442">Sim</translation>
+<translation id="142655739075382478">O app <ph name="APP_NAME" /> está bloqueado</translation>
 <translation id="1426870617281699524">Clique em Tentar novamente e aceite a solicitação no seu computador</translation>
 <translation id="1427269577154060167">País</translation>
 <translation id="142758023928848008">Ativar tecla aderente (para executar atalhos do teclado digitando-os em sequência)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">&amp;Configurações de idioma</translation>
 <translation id="1478340334823509079">Detalhes: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">A instalação não está ativada</translation>
+<translation id="1481537595330271162">Erro ao redimensionar o disco</translation>
 <translation id="1482626744466814421">Adicionar esta guia aos favoritos...</translation>
 <translation id="1483493594462132177">Enviar</translation>
 <translation id="1484979925941077974">O site está usando o Bluetooth</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">Sincronização ativada - configurações personalizadas</translation>
 <translation id="1489664337021920575">Escolher outra opção</translation>
 <translation id="1493892686965953381">Aguardando <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Limpar também os dados de navegação (<ph name="URL" />). Sua conta poderá ser desconectada de google.com.br.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> outros dispositivos disponíveis.</translation>
 <translation id="1495677929897281669">Voltar à guia</translation>
 <translation id="1499271269825557605">Caso não reconheça uma extensão, ou se seu navegador não estiver funcionando como o esperado, você poderá desativar ou personalizar extensões aqui.</translation>
@@ -521,7 +524,7 @@
 <translation id="1700079447639026019">Sites que nunca podem usar cookies</translation>
 <translation id="1701062906490865540">Remover esta pessoa</translation>
 <translation id="1703331064825191675">Nunca se preocupe com suas senhas</translation>
-<translation id="1704970325597567340">A confirmação de segurança foi executada em <ph name="DATE" /></translation>
+<translation id="1704970325597567340">A "confirmação de segurança" foi executada em <ph name="DATE" /></translation>
 <translation id="1706586824377653884">Adicionado pelo seu administrador</translation>
 <translation id="1706625117072057435">Níveis de zoom</translation>
 <translation id="1708338024780164500">(Inativa)</translation>
@@ -607,6 +610,7 @@
 <translation id="1805822111539868586">Inspecionar visualizações</translation>
 <translation id="1805888043020974594">Servidor de impressão</translation>
 <translation id="1805967612549112634">Confirmar PIN</translation>
+<translation id="1806335016774576568">Alternar para outro app aberto</translation>
 <translation id="1809734401532861917">Adicionar meus favoritos, histórico, senhas e outras configurações a <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1813278315230285598">Serviços</translation>
 <translation id="18139523105317219">Nome da Parte EDI</translation>
@@ -693,8 +697,9 @@
 <translation id="1921050530041573580">Parear o smartphone com o app Mensagens</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Abrir com</translation>
+<translation id="1925017091976104802">Pressione <ph name="MODIFIER_KEY_DESCRIPTION" /> para colar</translation>
 <translation id="1925021887439448749">Digite o endereço da Web personalizado</translation>
-<translation id="1925124445985510535">A confirmação de segurança foi executada em <ph name="TIME" /></translation>
+<translation id="1925124445985510535">A "confirmação de segurança" foi executada às <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Essas configurações são controladas pela política empresarial. Entre em contato com seu administrador para ter mais informações.</translation>
 <translation id="1927632033341042996">Dedo <ph name="NEW_FINGER_NUMBER" /></translation>
 <translation id="1928202201223835302">Digite o PIN antigo</translation>
@@ -739,7 +744,7 @@
 <translation id="1990512225220753005">Não mostrar atalhos nesta página</translation>
 <translation id="1992397118740194946">Não definido</translation>
 <translation id="1994173015038366702">URL do site</translation>
-<translation id="1995916364271252349">Controla quais informações os sites podem usar e mostrar (local, câmera, pop-ups e muito mais)</translation>
+<translation id="1995916364271252349">Controla quais informações os sites podem usar e mostrar (local, câmera, pop-ups, entre outros)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> quer armazenar permanentemente dados grandes no computador local</translation>
 <translation id="1997616988432401742">Seus certificados</translation>
 <translation id="1999115740519098545">Inicialização</translation>
@@ -838,6 +843,7 @@
 <translation id="2135787500304447609">&amp;Retomar</translation>
 <translation id="2136372518715274136">Digite a nova senha</translation>
 <translation id="2136476978468204130">A senha longa informada está incorreta</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{Os cookies foram bloqueados.}=1{Os cookies foram bloqueados, 1 exceção}one{Os cookies foram bloqueados, {COUNT} exceção}other{Os cookies foram bloqueados, {COUNT} exceções}}</translation>
 <translation id="2138398485845393913">A conexão com "<ph name="DEVICE_NAME" />" ainda está em andamento</translation>
 <translation id="2139545522194199494">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, intensidade de sinal em <ph name="SIGNAL_STRENGTH" />%, gerenciada pelo seu administrador, conectar</translation>
 <translation id="2139919072249842737">Botão "Configurar"</translation>
@@ -1005,11 +1011,13 @@
 <translation id="2346953515226895098">Serviço SODA</translation>
 <translation id="2347644257713614136">O uso do Hangouts e do Cast for Education é regido pela Política de Privacidade do Google.</translation>
 <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Erro ao carregar os dados</translation>
 <translation id="2349896577940037438">Se a configuração "Atividade na Web e de apps adicional" estiver ativada, esses dados poderão ser salvos na sua Conta do Google. Você pode ver seus dados, excluí-los e mudar as configurações da sua conta em account.google.com.</translation>
 <translation id="2350133097354918058">Atualizada</translation>
 <translation id="2350182423316644347">Inicializando aplicativo...</translation>
 <translation id="2350796302381711542">Permitir que <ph name="HANDLER_HOSTNAME" /> abra todos os links de <ph name="PROTOCOL" /> em vez de <ph name="REPLACED_HANDLER_TITLE" />?</translation>
 <translation id="2351266942280602854">Idioma e entrada</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 item}one{{NUM_ITEMS} item}other{{NUM_ITEMS} itens}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">As anotações na tela de bloqueio são salvas automaticamente no <ph name="LOCK_SCREEN_APP_NAME" />. Sua anotação mais recente ficará na tela de bloqueio.</translation>
 <translation id="2353297238722298836">Câmera e microfone permitidos</translation>
@@ -1043,6 +1051,7 @@
 <translation id="2392369802118427583">Ativar</translation>
 <translation id="2394566832561516196">As configurações serão apagadas na próxima atualização.</translation>
 <translation id="2395616325548404795">Seu <ph name="DEVICE_TYPE" /> foi registrado para o gerenciamento empresarial, mas as informações de localização e recurso não foram enviadas. Forneça essas informações manualmente no Admin Console do dispositivo.</translation>
+<translation id="2396387085693598316">Seu administrador bloqueou a extensão <ph name="EXTENSION_NAME" /></translation>
 <translation id="2396783860772170191">Insira o PIN de quatro dígitos (0000-9999)</translation>
 <translation id="2399939490305346086">Dados de login da chave de segurança</translation>
 <translation id="2400664245143453337">Atualização imediata necessária</translation>
@@ -1190,7 +1199,6 @@
 <translation id="2575247648642144396">Este ícone ficará visível quando a extensão puder agir na página atual. Para usar essa extensão, clique no ícone ou pressione <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurar como Chromebox para reuniões</translation>
 <translation id="2580889980133367162">Sempre permitir que <ph name="HOST" /> faça download de vários arquivos</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Longo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plataforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Não foi possível acessar o tíquete do Kerberos. Tente novamente ou entre em contato com o administrador do dispositivo da sua organização. Código de erro: <ph name="ERROR_CODE" />.</translation>
@@ -1331,6 +1339,7 @@
 <translation id="2753677631968972007">Controlar as permissões de sites manualmente.</translation>
 <translation id="2755367719610958252">Gerenciar recursos de acessibilidade</translation>
 <translation id="275662540872599901">tela desativada</translation>
+<translation id="2757338480560142065">A senha que você está salvando precisa corresponder à usada em <ph name="WEBSITE" /></translation>
 <translation id="2762441749940182211">Câmera bloqueada</translation>
 <translation id="2765217105034171413">Pequeno</translation>
 <translation id="2766161002040448006">Pedir para pai/mãe</translation>
@@ -1583,6 +1592,7 @@
 <translation id="3090819949319990166">Não foi possível copiar o arquivo externo crx em <ph name="TEMP_CRX_FILE" />.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" pareado</translation>
 <translation id="3092699946856346803">Insira seu chip e tente novamente</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 extensão possivelmente nociva foi desativada. Você também pode removê-la.}one{{NUM_EXTENSIONS} extensão possivelmente nociva foi desativada. Você também pode removê-la.}other{{NUM_EXTENSIONS} extensões possivelmente nocivas foram desativadas. Você também pode removê-las.}}</translation>
 <translation id="3101709781009526431">Data e hora</translation>
 <translation id="3103941660000130485">Erro no upgrade do Linux</translation>
 <translation id="310671807099593501">O site está usando o Bluetooth</translation>
@@ -1657,6 +1667,7 @@
 <translation id="3201422919974259695">Os dispositivos USB disponíveis serão exibidos aqui.</translation>
 <translation id="3202131003361292969">Caminho</translation>
 <translation id="3202173864863109533">O áudio desta guia está sendo desativado.</translation>
+<translation id="3208321278970793882">App</translation>
 <translation id="3208584281581115441">Confirmar agora</translation>
 <translation id="3208703785962634733">Não confirmado</translation>
 <translation id="32101887417650595">Não foi possível se conectar à impressora</translation>
@@ -1677,6 +1688,7 @@
 <translation id="3239373508713281971">Tempo limite removido para <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Selecione o diretório raiz da extensão a ser empacotada. Para atualizar uma extensão, selecione também a chave privada a ser reutilizada.</translation>
 <translation id="3244294424315804309">Continuar com o som desativado</translation>
+<translation id="3246107497225150582">{0,plural, =1{Atualize o dispositivo em 1 dia}one{Atualize o dispositivo em # dia}other{Atualize o dispositivo em # dias}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - Erro de rede</translation>
 <translation id="3248902735035392926">A segurança é importante. Aproveite e <ph name="BEGIN_LINK" />verifique suas extensões agora<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1763,6 +1775,7 @@
 <translation id="3356580349448036450">Concluído</translation>
 <translation id="3359256513598016054">Restrições da diretiva de certificação</translation>
 <translation id="3360297538363969800">Ocorreu uma falha na impressão. Verifique sua impressora e tente novamente.</translation>
+<translation id="3364986687961713424">Do seu administrador: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Use Ctrl ou Alt</translation>
 <translation id="3367047597842238025">Configure o <ph name="DEVICE_TYPE" /> como você quiser e descubra todos os recursos incríveis ao seu alcance.</translation>
 <translation id="3368922792935385530">Conectado</translation>
@@ -1867,6 +1880,7 @@
 <translation id="3496213124478423963">Afastar</translation>
 <translation id="3497560059572256875">Compartilhar doodle</translation>
 <translation id="3498215018399854026">Não foi possível contatar seu pai/mãe no momento. Tente novamente.</translation>
+<translation id="3500417806337761827">Erro ao ativar o compartilhamento. Muitos compartilhamentos PME já estão ativos.</translation>
 <translation id="3505030558724226696">Revogar acesso ao dispositivo</translation>
 <translation id="3507421388498836150">Permissões atuais para "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="3507888235492474624">Procurar dispositivos Bluetooth novamente</translation>
@@ -1932,6 +1946,7 @@
 <translation id="3592260987370335752">&amp;Saiba mais</translation>
 <translation id="359283478042092570">Entrar</translation>
 <translation id="3593965109698325041">Restrições de nome do certificado</translation>
+<translation id="3595381248165458839">Entre em contato com o administrador de dispositivos da sua organização</translation>
 <translation id="3596235046596950091">Ativar serviços em nuvem</translation>
 <translation id="3596414637720633074">Bloquear cookies de terceiros na navegação anônima</translation>
 <translation id="3599221874935822507">Em relevo</translation>
@@ -2065,6 +2080,7 @@
 <translation id="3742666961763734085">Não foi possível encontrar uma unidade organizacional com esse nome. Tente novamente.</translation>
 <translation id="3744111561329211289">Sincronização em segundo plano</translation>
 <translation id="3746127522257263495">Não há compatibilidade com a adição de contas do G Suite for Education em apps para Android.</translation>
+<translation id="3747039297326604768">Não foi possível abrir o Plugin VM</translation>
 <translation id="3747077776423672805">Para remover apps, acesse "Configurações" &gt; "Google Play Store" &gt; "Gerenciar preferências do Android" &gt; "Apps" ou "Gerenciador de aplicativos". Depois, toque no app que você quer desinstalar (talvez seja necessário deslizar para a direita ou esquerda para encontrar o app). Em seguida, toque em "Desinstalar" ou "Desativar".</translation>
 <translation id="3748026146096797577">Não conectado</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2140,6 +2156,7 @@
 <translation id="3827774300009121996">&amp;Tela cheia</translation>
 <translation id="3828029223314399057">Pesquisar favoritos</translation>
 <translation id="3829765597456725595">Compartilhamento de arquivos SMB</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{O administrador reativou 1 extensão possivelmente nociva}one{O administrador reativou {NUM_EXTENSIONS} extensão possivelmente nociva}other{O administrador reativou {NUM_EXTENSIONS} extensões possivelmente nocivas}}</translation>
 <translation id="3831436149286513437">Sugestões de pesquisa do Google Drive</translation>
 <translation id="383161972796689579">O proprietário deste dispositivo desativou a adição de novos usuários</translation>
 <translation id="3834775135533257713">Não foi possível adicionar o app "<ph name="TO_INSTALL_APP_NAME" />" porque ele entra em conflito com o app "<ph name="INSTALLED_APP_NAME" />".</translation>
@@ -2316,6 +2333,7 @@
 <translation id="4047726037116394521">Ir para página inicial</translation>
 <translation id="4050225813016893843">Método de autenticação</translation>
 <translation id="4052120076834320548">Minúscula</translation>
+<translation id="4056908315660577142">Você atingiu o limite de tempo que seu pai/mãe definiu para o app <ph name="APP_NAME" /> do Chrome. Você poderá usá-lo por <ph name="TIME_LIMIT" /> amanhã.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">Ver na Store</translation>
 <translation id="4058647953897694817">Verificar pelo Bluetooth</translation>
@@ -2447,6 +2465,7 @@
 <translation id="424963718355121712">Os apps precisam ser veiculados a partir do host que afetam</translation>
 <translation id="4250229828105606438">Captura de tela</translation>
 <translation id="4250680216510889253">Não</translation>
+<translation id="4252035718262427477">Página da Web, arquivo único (Web Bundle)</translation>
 <translation id="4252852543720145436">Identificadores de conteúdo protegido</translation>
 <translation id="4252899949534773101">Bluetooth desativado</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - Conteúdo da guia compartilhado</translation>
@@ -2542,6 +2561,7 @@
 <translation id="4400963414856942668">Você pode clicar no ícone da estrela para adicionar uma guia aos favoritos</translation>
 <translation id="4403775189117163360">Escolher uma pasta diferente</translation>
 <translation id="4404136731284211429">Verificar novamente</translation>
+<translation id="4404843640767531781">O app <ph name="APP_NAME" /> foi bloqueado pelo seu pai/mãe. É necessário pedir permissão para usá-lo.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">A&amp;juda</translation>
 <translation id="4409697491990005945">Margens</translation>
@@ -2611,6 +2631,7 @@
 <translation id="450099669180426158">Ícone de ponto de exclamação</translation>
 <translation id="4501530680793980440">Confirmar remoção</translation>
 <translation id="4502423230170890588">Remover deste dispositivo</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{Os cookies foram permitidos}=1{Os cookies foram permitidos, 1 exceção}one{Os cookies foram permitidos, {COUNT} exceção}other{Os cookies foram permitidos, {COUNT} exceções}}</translation>
 <translation id="4504940961672722399">Para usar esta extensão, clique neste ícone ou pressione <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="4508051413094283164">Abrir todos em uma janela anônima</translation>
 <translation id="4508265954913339219">Falha na ativação</translation>
@@ -2724,6 +2745,7 @@
 <translation id="465878909996028221">Apenas os protocolos http, https e file são compatíveis com redirecionamentos do navegador.</translation>
 <translation id="4659077111144409915">Conta principal</translation>
 <translation id="4660476621274971848">A versão esperada era "<ph name="EXPECTED_VERSION" />", mas a instalada foi a "<ph name="NEW_ID" />"</translation>
+<translation id="4660540330091848931">Redimensionando</translation>
 <translation id="4660838440047236328">o layout do ambiente.</translation>
 <translation id="4661407454952063730">Os dados de apps podem ser quaisquer dados que um app tenha salvo (com base nas configurações do desenvolvedor), incluindo dados como contatos, mensagens e fotos.</translation>
 <translation id="4661931051827810091">Envia URLs anônimos de algumas páginas que você visita, informações do sistema limitadas e parte do conteúdo das páginas para ajudar a descobrir e bloquear novas ameaças contra todos os usuários da Web.</translation>
@@ -2819,7 +2841,6 @@
 <translation id="4808667324955055115">Pop-ups bloqueados:</translation>
 <translation id="480990236307250886">Abrir a página inicial</translation>
 <translation id="4811503964269049987">Colocar guia selecionada no grupo</translation>
-<translation id="4811818760963189951">Desativado porque você desligou a sincronização do histórico</translation>
 <translation id="4813136279048157860">Minhas imagens</translation>
 <translation id="4813512666221746211">Erro na rede</translation>
 <translation id="4814378367953456825">Insira um nome para essa impressão digital</translation>
@@ -2908,6 +2929,7 @@
 <translation id="4918086044614829423">Aceitar</translation>
 <translation id="4918221908152712722">Instale o <ph name="APP_NAME" /> (nenhum download é necessário)</translation>
 <translation id="4920887663447894854">Os seguintes sites foram impedidos de rastrear o seu local nesta página:</translation>
+<translation id="49226369361073053">{0,plural, =0{Atualize o dispositivo agora}=1{Atualize o dispositivo em 1 segundo}one{Atualize o dispositivo em # segundo}other{Atualize o dispositivo em # segundos}}</translation>
 <translation id="492299503953721473">Remover apps Android</translation>
 <translation id="4923279099980110923">Sim, eu quero ajudar</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2988,7 +3010,6 @@
 <translation id="5040823038948176460">Mais configurações de conteúdo</translation>
 <translation id="5042282098504489593">Abra as configurações para conectar o <ph name="USB_DEVICE_NAME" /> ao Linux</translation>
 <translation id="5043913660911154449">Ou especifique a impressora PPD <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Desativado porque os dados de sincronização foram criptografados com uma senha longa</translation>
 <translation id="5045550434625856497">Senha incorreta</translation>
 <translation id="504561833207953641">Abrindo em uma sessão de navegador existente.</translation>
 <translation id="5047421709274785093">Impedir que sites usem sensores de luz e movimento</translation>
@@ -3059,6 +3080,7 @@
 <translation id="5135085122826131075">Acessar seu Assistente sempre que você disser "Ok Google".</translation>
 <translation id="5135533361271311778">Não foi possível criar um item de favorito.</translation>
 <translation id="5137501176474113045">Excluir este item</translation>
+<translation id="5138982052046316113">Redimensionar disco do Linux</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, pesquisa no <ph name="DEFAULT_SEARCH_ENGINE_NAME" /></translation>
 <translation id="5139823398361067371">Insira o PIN da sua chave de segurança. Se não souber o PIN, redefina a chave de segurança.</translation>
 <translation id="5139955368427980650">&amp;Abrir</translation>
@@ -3215,6 +3237,7 @@
 <translation id="5353252989841766347">Exportar senhas do Chrome</translation>
 <translation id="5355099869024327351">Permitir que o Assistente mostre notificações</translation>
 <translation id="5355926466126177564">A extensão "<ph name="EXTENSION_NAME" />" alterou a página que é exibida quando você pesquisa na Omnibox.</translation>
+<translation id="535911077628776608"><ph name="FILE_NAME" /> pode ser perigoso. Enviar para verificação no Proteção Avançada do Google? Pressione Shift+F6 para voltar à área da barra de downloads.</translation>
 <translation id="5359910752122114278">1 resultado</translation>
 <translation id="5360150013186312835">Mostrar na barra de ferramentas</translation>
 <translation id="5362741141255528695">Selecionar arquivo de chave privada.</translation>
@@ -3321,7 +3344,7 @@
 <translation id="5495597166260341369">Manter a tela ligada</translation>
 <translation id="5496587651328244253">Organizar</translation>
 <translation id="5499313591153584299">Este arquivo pode ser prejudicial para seu computador.</translation>
-<translation id="5500709606820808700">A confirmação de segurança foi executada hoje</translation>
+<translation id="5500709606820808700">A "confirmação de segurança" foi executada hoje</translation>
 <translation id="5502500733115278303">Importado do Firefox</translation>
 <translation id="5505264765875738116">Os sites não podem pedir para enviar notificações</translation>
 <translation id="5505307013568720083">Sem tinta</translation>
@@ -3353,6 +3376,7 @@
 <translation id="5539221284352502426">A senha inserida foi recusada pelo servidor. Entre os possíveis motivos estão: a senha é muito curta, não inclui números ou símbolos ou é igual a senhas anteriores.</translation>
 <translation id="5541694225089836610">Ação desativada pelo administrador</translation>
 <translation id="5542132724887566711">Perfil</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> precisa que você atualize o dispositivo imediatamente.</translation>
 <translation id="5542750926112347543">Os cookies de <ph name="DOMAIN" /> foram bloqueados</translation>
 <translation id="5542949973455282971">Conectando-se à <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Verificando status...</translation>
@@ -3398,6 +3422,7 @@
 <translation id="5593357315997824387">Sincronizar meus arquivos</translation>
 <translation id="5595152862129936745">Muito longe</translation>
 <translation id="5595485650161345191">Editar endereço</translation>
+<translation id="5595727715083333657">Seu contêiner não é compatível com redimensionamento. Para ajustar a quantidade de espaço pré-alocada no Linux (Beta), faça backup e restaure em um novo contêiner.</translation>
 <translation id="5596627076506792578">Mais opções</translation>
 <translation id="5600706100022181951">O download da atualização será feito com <ph name="UPDATE_SIZE_MB" /> MB de dados móveis. Quer continuar?</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -3471,6 +3496,7 @@
 <translation id="5691511426247308406">Família</translation>
 <translation id="5691772641933328258">Impressão digital não reconhecida</translation>
 <translation id="5692183275898619210">Impressão concluída</translation>
+<translation id="5692875591060376599">O arquivo selecionado é desconhecido e pode ser perigoso. Enviar para verificação no Proteção Avançada do Google?</translation>
 <translation id="569425414730375234">Sessão anônima atual: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">Denunciar abuso de "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="5696679855467848181">Arquivo PPD atual em uso: <ph name="PPD_NAME" /></translation>
@@ -3682,6 +3708,7 @@
 <translation id="5976160379964388480">Outros</translation>
 <translation id="5978277834170881274">&amp;Usar a verificação ortográfica básica</translation>
 <translation id="5979084224081478209">Verificar senhas</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{Você reativou 1 extensão possivelmente nociva}one{Você reativou {NUM_EXTENSIONS} extensão possivelmente nociva}other{Você reativou {NUM_EXTENSIONS} extensões possivelmente nocivas}}</translation>
 <translation id="5979421442488174909">&amp;Traduzir para o <ph name="LANGUAGE" /></translation>
 <translation id="5979469435153841984">Para adicionar páginas aos favoritos, clique na estrela na barra de endereço</translation>
 <translation id="5984222099446776634">Visitados recentemente</translation>
@@ -3933,6 +3960,7 @@
 <translation id="6309510305002439352">Microfone desativado</translation>
 <translation id="6311220991371174222">Não foi possível iniciar o Chrome porque algo deu errado ao abrir seu perfil. Tente reiniciar o Chrome.</translation>
 <translation id="6312403991423642364">Erro de rede desconhecido</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{A confirmação de segurança foi executada há 1 dia}one{A confirmação de segurança foi executada há {NUM_DAYS} dia}other{A confirmação de segurança foi executada há {NUM_DAYS} dias}}</translation>
 <translation id="6312638141433622592">Oferecer a opção de mostrar artigos no modo leitor, quando compatível</translation>
 <translation id="6313641880021325787">SAIR DE RV</translation>
 <translation id="6314819609899340042">Você ativou os recursos de depuração neste dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
@@ -3948,6 +3976,7 @@
 <translation id="6325191661371220117">Desativar inicialização automática</translation>
 <translation id="6326175484149238433">Remover do Google Chrome</translation>
 <translation id="6326855256003666642">Contagem de manutenção de atividade</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> precisa que você atualize o dispositivo antes do fim do prazo.</translation>
 <translation id="6327785803543103246">Descoberta automática do proxy da Web</translation>
 <translation id="6333064448949140209">O arquivo será enviado ao Google para depuração</translation>
 <translation id="6339668969738228384">Criar um novo perfil para <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -3967,7 +3996,6 @@
 <translation id="63566973648609420">Somente uma pessoa que tenha sua senha longa pode ler seus dados criptografados. A senha longa não é enviada para o Google ou armazenada por ele. Se você esquecer sua senha longa ou quiser alterar essa configuração, será necessário <ph name="BEGIN_LINK" />redefinir a sincronização<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Bem-vindo à família do <ph name="SHORT_PRODUCT_NAME" />. Este não é um computador qualquer.</translation>
 <translation id="6358884629796491903">Dragão</translation>
-<translation id="6360719647236334056">Use o histórico de navegação do Chrome para personalizar a Pesquisa, os anúncios e outros serviços do Google</translation>
 <translation id="6361850914223837199">Detalhes do erro:</translation>
 <translation id="6362853299801475928">&amp;Informar um problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3975,11 +4003,13 @@
 <translation id="6366190659675876144">Proteção padrão</translation>
 <translation id="636850387210749493">Registro da empresa</translation>
 <translation id="6370021412472292592">Não foi possível carregar o manifesto.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Mudar senha}one{Mudar senha}other{Mudar senhas}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Repetir</translation>
 <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation>
 <translation id="6380143666419481200">Aceitar e continuar</translation>
 <translation id="6384275966486438344">Alterar suas configurações de pesquisa para: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">Conecte-se à Internet e tente novamente</translation>
 <translation id="6385543213911723544">Os sites podem salvar e ler os dados dos cookies</translation>
 <translation id="6386099547750337629">Se isso for inesperado, entre em contato com o suporte.</translation>
 <translation id="6387674443318562538">Divisão vertical</translation>
@@ -4058,6 +4088,7 @@
 <translation id="6478248366783946499">Manter arquivo perigoso?</translation>
 <translation id="6483485061007832714">Abrir o download</translation>
 <translation id="6483805311199035658">Abrindo <ph name="FILE" />...</translation>
+<translation id="6485092675191826776">A licença do Plugin VM expirou</translation>
 <translation id="6488384360522318064">Selecionar idioma</translation>
 <translation id="648927581764831596">Nenhum disponível</translation>
 <translation id="6490471652906364588">Dispositivo USB-C (porta da direita)</translation>
@@ -4245,9 +4276,9 @@
 <translation id="6758056191028427665">Diga como estamos nos saindo.</translation>
 <translation id="6759193508432371551">Configuração original</translation>
 <translation id="6762833852331690540">Ativado</translation>
-<translation id="6764693078871405569">Limpar também os dados de navegação (<ph name="URL" />). Sua conta poderá ser desconectada de <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Escolher outro idioma…</translation>
 <translation id="6767639283522617719">Não é possível vincular ao domínio. Verifique se as configurações da unidade organizacional estão corretas.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> recomenda que você atualize este dispositivo.</translation>
 <translation id="6769712124046837540">Adicionando impressora...</translation>
 <translation id="6770602306803890733">Melhora a segurança para você e para todos na Web</translation>
 <translation id="6770664076092644100">Verificar por NFC</translation>
@@ -4380,6 +4411,7 @@
 <translation id="6943836128787782965">HTTP falhou</translation>
 <translation id="6945221475159498467">Selecionar</translation>
 <translation id="694592694773692225">Redirecionamento bloqueado nesta página.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 senha comprometida}one{{NUM_PASSWORDS} senha comprometida}other{{NUM_PASSWORDS} senhas comprometidas}}</translation>
 <translation id="6949434160682548041">Senha (opcional)</translation>
 <translation id="6950627417367801484">Restaurar apps</translation>
 <translation id="6950943362443484797">Instalaremos este app para você</translation>
@@ -4464,6 +4496,7 @@
 <translation id="7053983685419859001">Bloquear</translation>
 <translation id="7055152154916055070">Redirecionamento bloqueado:</translation>
 <translation id="7056526158851679338">&amp;Inspecionar dispositivos</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{A confirmação de segurança foi executada há 1 minuto}one{A confirmação de segurança foi executada há {NUM_MINS} minuto}other{A confirmação de segurança foi executada há {NUM_MINS} minutos}}</translation>
 <translation id="7057767408836081338">Falha ao acessar os dados do app. Tentando executá-lo mesmo assim…</translation>
 <translation id="7059858479264779982">Definir para abertura automática</translation>
 <translation id="7059893117020417984">Para navegar com privacidade, clique no menu de ícone de pontos para abrir uma janela anônima</translation>
@@ -4707,6 +4740,7 @@
 <translation id="7371006317849674875">Horário de início</translation>
 <translation id="7371490947952970241">Na configuração de localização principal do dispositivo é possível desativar esse recurso. Você também pode desativar o uso de Wi-Fi, redes móveis e sensores de local nessas configurações.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Atualize o dispositivo em uma hora}one{Atualize o dispositivo em # hora}other{Atualize o dispositivo em # horas}}</translation>
 <translation id="7376553024552204454">Destacar o cursor do mouse quando ele estiver se movendo</translation>
 <translation id="7377451353532943397">Continuar bloqueando o acesso ao sensor</translation>
 <translation id="73786666777299047">Abrir a Chrome Web Store</translation>
@@ -4724,6 +4758,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">Configurar conexão no <ph name="PHONE_NAME" /></translation>
 <translation id="7401778920660465883">Dispensar esta mensagem</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{A confirmação de segurança foi executada há 1 hora}one{A confirmação de segurança foi executada há {NUM_HOURS} hora}other{A confirmação de segurança foi executada há {NUM_HOURS} horas}}</translation>
 <translation id="740624631517654988">Pop-up bloqueado</translation>
 <translation id="7407430846095439694">Importar e vincular</translation>
 <translation id="7407504355934009739">A maior parte das pessoas bloqueia as notificações deste site</translation>
@@ -4754,6 +4789,7 @@
 <translation id="7441830548568730290">Outros usuários</translation>
 <translation id="7442465037756169001">Seu hardware Hangouts Meet está pronto para ser configurado.</translation>
 <translation id="744341768939279100">Criar um novo perfil</translation>
+<translation id="744366959743242014">Carregando dados. Isso pode demorar um pouco.</translation>
 <translation id="7443806024147773267">Acesse suas senhas sempre que estiver utilizando sua Conta Google</translation>
 <translation id="7444983668544353857">Desativar <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Instalar apps automaticamente</translation>
@@ -4789,6 +4825,7 @@
 <translation id="7489761397368794366">Ligar do seu dispositivo</translation>
 <translation id="749028671485790643">Pessoa <ph name="VALUE" /></translation>
 <translation id="7490813197707563893">Endereço MAC</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 cookie}one{{NUM_COOKIES} cookie}other{{NUM_COOKIES} cookies}}</translation>
 <translation id="7493386493263658176">A extensão <ph name="EXTENSION_NAME" /> pode coletar todo o texto que você digita, incluindo dados pessoais, como senhas e números de cartão de crédito. Quer usar essa extensão?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Esqueceu sua senha antiga?</translation>
@@ -4809,10 +4846,14 @@
 <translation id="7513029293694390567">Faça login automaticamente nos sites que usam credenciais armazenadas. Quando o recurso estiver desativado, será necessário fornecer uma confirmação todas as vezes que fizer login em um site.</translation>
 <translation id="7514239104543605883">Copiar para o dispositivo</translation>
 <translation id="7514365320538308">Fazer o download</translation>
+<translation id="751523031290522286">O app <ph name="APP_NAME" /> está bloqueado pelo administrador. Você precisa pedir permissão para usá-lo.</translation>
+<translation id="7516981202574715431">O app <ph name="APP_NAME" /> está pausado</translation>
+<translation id="7517063221058203587">{0,plural, =1{Atualize o dispositivo em 1 minuto}one{Atualize o dispositivo em # minuto}other{Atualize o dispositivo em # minutos}}</translation>
 <translation id="7520766081042531487">Portal de navegação anônima: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">Diga "Ok Google"</translation>
 <translation id="7525067979554623046">Criar</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{Mais 1}one{Mais {NUM_DOWNLOADS}}other{Mais {NUM_DOWNLOADS}}}</translation>
 <translation id="7529411698175791732">Verifique sua conexão com a Internet. Se o problema continuar, tente sair e fazer login novamente.</translation>
 <translation id="7530016656428373557">Taxa de descarga em Watts</translation>
 <translation id="7531779363494549572">Acesse Config. &gt; Apps e notificações &gt; Notificações.</translation>
@@ -4981,6 +5022,7 @@
 <translation id="7765158879357617694">Mover</translation>
 <translation id="7766807826975222231">Fazer o tour</translation>
 <translation id="7766838926148951335">Aceitar permissões</translation>
+<translation id="7768770796815395237">Mudar</translation>
 <translation id="7769672763586021400">Código do modelo</translation>
 <translation id="7770651108375708429">Desconectar Wi-Fi</translation>
 <translation id="7771452384635174008">Layout</translation>
@@ -5417,6 +5459,7 @@
 <translation id="8286963743045814739">Você pode navegar com privacidade usando uma janela anônima</translation>
 <translation id="8287902281644548111">Pesquisar por chamada de API/URL</translation>
 <translation id="8288032458496410887">Desinstalar <ph name="APP" />...</translation>
+<translation id="8289128870594824098">Tamanho do disco</translation>
 <translation id="8291967909914612644">País do provedor doméstico</translation>
 <translation id="8294431847097064396">Origem</translation>
 <translation id="8297006494302853456">Fraco</translation>
@@ -5629,6 +5672,7 @@
 <translation id="8608618451198398104">Adicionar um tíquete do Kerberos</translation>
 <translation id="8609465669617005112">Mover para cima</translation>
 <translation id="8610103157987623234">Formato incorreto. Tente novamente</translation>
+<translation id="8612935480510351790"><ph name="FILE_NAME" /> pode ser perigoso. Enviar para verificação no Proteção Avançada do Google?</translation>
 <translation id="8613164732773110792">Apenas caracteres minúsculos, dígitos, sublinhados ou traços</translation>
 <translation id="8615618338313291042">Aplicativo anônimo: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Sombra projetada</translation>
@@ -5656,6 +5700,7 @@
 <translation id="8641606876632989680">O Chrome enviará uma notificação quando você fizer login com uma senha comprometida</translation>
 <translation id="8642900771896232685">2 segundos</translation>
 <translation id="8642947597466641025">Aumentar o texto</translation>
+<translation id="8643443571868262066"><ph name="FILE_NAME" /> pode ser perigoso. Enviar para verificação no Proteção Avançada do Google?</translation>
 <translation id="8644655801811752511">Não é possível redefinir esta chave de segurança. Tente redefinir a chave imediatamente após inseri-la.</translation>
 <translation id="8645354835496065562">Continuar permitindo acesso ao sensor</translation>
 <translation id="8645920082661222035">Prevê eventos perigosos e alerta você antes que eles aconteçam</translation>
@@ -6076,6 +6121,7 @@
 <translation id="9169931577761441333">Adicionar o app <ph name="APP_NAME" /> à tela inicial</translation>
 <translation id="9170848237812810038">&amp;Desfazer</translation>
 <translation id="9170884462774788842">Outro programa em seu computador adicionou um tema que pode mudar a forma como o Google Chrome funciona.</translation>
+<translation id="917350715406657904">Você atingiu o limite de tempo que seu pai/mãe definiu para o app <ph name="APP_NAME" />. Você poderá usá-lo amanhã por <ph name="TIME_LIMIT" />.</translation>
 <translation id="9173995187295789444">Procurando dispositivos Bluetooth…</translation>
 <translation id="9174401638287877180">Envie dados de uso e diagnóstico. Ajude a melhorar a experiência da criança com o Android enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles não serão usados para identificar a criança e ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e nossos parceiros, como os desenvolvedores Android. Se a configuração "Atividade na Web e de apps adicional" estiver ativada para a criança, esses dados poderão ser salvos na Conta do Google dela.</translation>
 <translation id="917510707618656279">Perguntar quando um site quiser acessar dispositivos Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 575d42c..a7f91f4 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Ler e alterar todos os dados no Website atual quando invocado</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> pretende repor as suas definições.</translation>
 <translation id="1243314992276662751">Carregar</translation>
-<translation id="1243398753772016127">Os sites não podem utilizar a sua atividade de navegação em diferentes sites para personalizar anúncios.</translation>
 <translation id="1244265436519979884">Neste momento, está a decorrer o restauro do Linux.</translation>
 <translation id="1244303850296295656">Erro de extensão</translation>
 <translation id="1246905108078336582">Pretende remover a sugestão da área de transferência?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Ativado - definições personalizadas</translation>
 <translation id="1489664337021920575">Escolher outra opção</translation>
 <translation id="1493892686965953381">A aguardar <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Limpar também os dados de navegação (<ph name="URL" />), o que poderá terminar a sua sessão em Google.com.</translation>
 <translation id="1495486559005647033">Mais <ph name="NUM_PRINTERS" /> dispositivos disponíveis.</translation>
 <translation id="1495677929897281669">Voltar ao separador</translation>
 <translation id="1499271269825557605">Se não reconhecer uma extensão ou o seu navegador não estiver a funcionar conforme esperado, pode desativar ou personalizar as extensões aqui.</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">Este ícone estará visível quando a extensão puder agir na página atual. Clique no ícone ou prima <ph name="EXTENSION_SHORTCUT" /> para utilizar esta extensão.</translation>
 <translation id="257779572837908839">Configurar como Chromebox para reuniões</translation>
 <translation id="2580889980133367162">Permitir sempre que o <ph name="HOST" /> transfira vários ficheiros</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Longo</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (plataforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Não foi possível obter a permissão Kerberos. Tente novamente ou contacte o administrador do dispositivo da entidade. (Código de erro <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Pop-ups bloqueados:</translation>
 <translation id="480990236307250886">Abrir a página de início</translation>
 <translation id="4811503964269049987">Agrupar o separador selecionado</translation>
-<translation id="4811818760963189951">Desativado porque desativou a sincronização do histórico.</translation>
 <translation id="4813136279048157860">As minhas imagens</translation>
 <translation id="4813512666221746211">Erro de rede</translation>
 <translation id="4814378367953456825">Introduza um nome para esta impressão digital.</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Definições de conteúdo adicionais</translation>
 <translation id="5042282098504489593">Abra as Definições para ligar o <ph name="USB_DEVICE_NAME" /> ao Linux.</translation>
 <translation id="5043913660911154449">Em alternativa, especifique o PPD da impressora. <ph name="LINK_BEGIN" />Saber mais<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">A definição foi desativada porque encriptou os seus dados sincronizados com uma frase de acesso.</translation>
 <translation id="5045550434625856497">Palavra-passe incorrecta</translation>
 <translation id="504561833207953641">A abrir numa sessão existente do navegador…</translation>
 <translation id="5047421709274785093">Impedir que os sites utilizem sensores de movimento e de luz</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />repor a sincronização<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Bem-vindo à família <ph name="SHORT_PRODUCT_NAME" />. Este não é um computador comum.</translation>
 <translation id="6358884629796491903">Dragão</translation>
-<translation id="6360719647236334056">Utilize o histórico de navegação do Chrome para personalizar a Pesquisa, os anúncios e outros Serviços Google</translation>
 <translation id="6361850914223837199">Detalhes do erro:</translation>
 <translation id="6362853299801475928">&amp;Comunicar um problema...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Dê-nos a sua opinião acerca do nosso desempenho.</translation>
 <translation id="6759193508432371551">Reposição de dados de fábrica</translation>
 <translation id="6762833852331690540">Ativado</translation>
-<translation id="6764693078871405569">Limpar também os dados de navegação (<ph name="URL" />), o que poderá terminar a sua sessão em <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Selecionar outro idioma…</translation>
 <translation id="6767639283522617719">Não é possível associar ao domínio. Certifique-se de que as definições estão corretas para a unidade organizacional.</translation>
 <translation id="6769712124046837540">A adicionar impressora…</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 77a9b3fb..173f2ab 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Citește și modifică toate datele tale de pe site-ul actual (când se invocă)</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> dorește să restabilească setările.</translation>
 <translation id="1243314992276662751">Încărcați</translation>
-<translation id="1243398753772016127">Site-urile nu pot folosi activitatea ta de navigare de pe diferite site-uri pentru a personaliza anunțurile</translation>
 <translation id="1244265436519979884">O restabilire Linux este în desfășurare</translation>
 <translation id="1244303850296295656">Eroare privind extensiile</translation>
 <translation id="1246905108078336582">Elimini sugestia din clipboard?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Activat – setări personalizate</translation>
 <translation id="1489664337021920575">Alege altă opțiune</translation>
 <translation id="1493892686965953381">Se așteaptă <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Șterge și datele de navigare (<ph name="URL" />), acțiune care te poate deconecta de la Google.com.</translation>
 <translation id="1495486559005647033">Încă <ph name="NUM_PRINTERS" /> dispozitive disponibile.</translation>
 <translation id="1495677929897281669">Înpoi la filă</translation>
 <translation id="1499271269825557605">Dacă nu recunoști o extensie sau dacă browserul nu funcționează așa cum te așteptai, poți să dezactivezi sau să personalizezi extensiile aici.</translation>
@@ -739,7 +737,7 @@
 <translation id="1990512225220753005">Nu afișa comenzi rapide pe această pagină</translation>
 <translation id="1992397118740194946">Nu este setat</translation>
 <translation id="1994173015038366702">Adresa URL a site-ului</translation>
-<translation id="1995916364271252349">Stabilește ce informații pot folosi și afișa site-urile (locația, camera foto, mesaje pop-up și altele)</translation>
+<translation id="1995916364271252349">Stabilește ce informații pot folosi și afișa site-urile (locația, camera foto, ferestre pop-up și altele)</translation>
 <translation id="1997484222658892567"><ph name="URL" /> dorește să stocheze permanent cantități mari de date pe computer</translation>
 <translation id="1997616988432401742">Certificatele tale</translation>
 <translation id="1999115740519098545">La pornire</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Această pictogramă va fi vizibilă atunci când extensia poate acționa pe pagina actuală. Utilizați această extensie dând clic pe pictogramă sau apăsând pe <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Configurează ca Chromebox pentru videoconferințe</translation>
 <translation id="2580889980133367162">Permiteți întotdeauna <ph name="HOST" /> să descarce mai multe fișiere</translation>
-<translation id="2580924999637585241">Total: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lungă</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Nu s-a putut afișa tichetul Kerberos. Încearcă din nou sau contactează administratorul dispozitivului organizației. (Cod de eroare <ph name="ERROR_CODE" />)</translation>
@@ -2734,7 +2731,7 @@
 <translation id="4665446389743427678">Toate datele stocate de <ph name="SITE" /> vor fi șterse.</translation>
 <translation id="4668721319092543482">Dă clic pentru a activa <ph name="PLUGIN_NAME" /></translation>
 <translation id="4670064810192446073">Realitate virtuală</translation>
-<translation id="4672879467403304774">Te protejează în Chrome și în alte aplicații Google dacă te-ai conectat</translation>
+<translation id="4672879467403304774">Te protejează în Chrome și în alte aplicații Google când ești conectat</translation>
 <translation id="46733273239502219">Datele offline din aplicațiile instalate vor fi șterse la rândul lor</translation>
 <translation id="4673442866648850031">Deschide instrumentele pentru creion când acesta este înlăturat</translation>
 <translation id="4677772697204437347">Memorie GPU</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Ferestre pop-up blocate:</translation>
 <translation id="480990236307250886">Deschide pagina de pornire</translation>
 <translation id="4811503964269049987">Adaugă fila selectată la un grup</translation>
-<translation id="4811818760963189951">S-a dezactivat, deoarece ai dezactivat sincronizarea istoricului</translation>
 <translation id="4813136279048157860">Imaginile mele</translation>
 <translation id="4813512666221746211">Eroare de rețea</translation>
 <translation id="4814378367953456825">Introdu un nume pentru amprentă</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Setări suplimentare privind conținutul</translation>
 <translation id="5042282098504489593">Deschide Setările pentru a conecta <ph name="USB_DEVICE_NAME" /> la Linux</translation>
 <translation id="5043913660911154449">Sau indică PPD-ul imprimantei <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">S-a dezactivat, deoarece ai criptat datele sincronizate folosind o expresie de acces</translation>
 <translation id="5045550434625856497">Parolă incorectă</translation>
 <translation id="504561833207953641">Se deschide în sesiunea de browser existentă.</translation>
 <translation id="5047421709274785093">Blochează folosirea senzorilor de mișcare și de lumină de către site-uri</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">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ă <ph name="BEGIN_LINK" />resetezi sincronizarea<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Bun venit în familia <ph name="SHORT_PRODUCT_NAME" />. Acesta nu este un computer obișnuit.</translation>
 <translation id="6358884629796491903">Dragon</translation>
-<translation id="6360719647236334056">Folosește istoricul de navigare Chrome pentru a personaliza Căutarea, anunțurile și alte servicii Google</translation>
 <translation id="6361850914223837199">Detaliile erorii:</translation>
 <translation id="6362853299801475928">&amp;Raportează o problemă...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Spune-ne cum ne descurcăm.</translation>
 <translation id="6759193508432371551">Resetare la setările din fabrică</translation>
 <translation id="6762833852331690540">Activat</translation>
-<translation id="6764693078871405569">Șterge și datele de navigare (<ph name="URL" />), acțiune care te poate deconecta de la <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Alege altă limbă...</translation>
 <translation id="6767639283522617719">Dispozitivul nu poate fi asociat domeniului. Asigură-te că setările pentru unitatea organizațională sunt corecte.</translation>
 <translation id="6769712124046837540">Se adaugă imprimanta...</translation>
@@ -4392,8 +4385,8 @@
 <translation id="6965382102122355670">OK</translation>
 <translation id="6965648386495488594">Port</translation>
 <translation id="6965978654500191972">Dispozitiv</translation>
-<translation id="6966201992886493384">Site-urile pot folosi cookie-uri pentru a-ți îmbunătăți experiența de navigare, de exemplu, pentru a te menține conectat(ă) sau pentru a reține articolele din coșul tău de cumpărături</translation>
-<translation id="696780070563539690">Site-urile nu pot folosi cookie-uri pentru a vedea activitatea ta de navigare de pe diferite site-uri, de exemplu, pentru a personaliza anunțurile</translation>
+<translation id="6966201992886493384">Site-urile pot folosi cookie-uri pentru a-ți îmbunătăți experiența de navigare, de exemplu, pentru a te menține conectat(ă) sau pentru a reține articolele din coșul de cumpărături</translation>
+<translation id="696780070563539690">Site-urile nu pot folosi cookie-uri pentru a-ți vedea activitatea de navigare de pe diferite site-uri, de exemplu, pentru a personaliza anunțurile</translation>
 <translation id="6968288415730398122">Introdu parola pentru a configura blocarea ecranului</translation>
 <translation id="6970480684834282392">Tip de pornire</translation>
 <translation id="6970856801391541997">Printează anumite pagini</translation>
@@ -4803,7 +4796,7 @@
 <translation id="7507207699631365376">Consultă <ph name="BEGIN_LINK" />politica de confidențialitate<ph name="END_LINK" /> a furnizorului</translation>
 <translation id="7507930499305566459">Certificat de respondent de stare</translation>
 <translation id="7508054832109420082">Permite accesul imprimantelor</translation>
-<translation id="751120035300339">Site-urile nu pot folosi cookie-uri pentru a-ți îmbunătăți experiența de navigare, de exemplu, pentru a te menține conectat(ă) sau pentru a reține articolele din coșul tău de cumpărături</translation>
+<translation id="751120035300339">Site-urile nu pot folosi cookie-uri pentru a-ți îmbunătăți experiența de navigare, de exemplu, pentru a te menține conectat(ă) sau pentru a reține articolele din coșul de cumpărături</translation>
 <translation id="7513029293694390567">Te conectezi automat la site-uri folosind datele de conectare stocate. Dacă funcția este dezactivată, ți se va solicita confirmarea de fiecare dată înainte de a te conecta la un site.</translation>
 <translation id="7514239104543605883">Copiază pe dispozitiv</translation>
 <translation id="7514365320538308">Descarcă</translation>
@@ -5434,7 +5427,7 @@
 <translation id="8320459152843401447">Tot ecranul</translation>
 <translation id="8322814362483282060">Accesul acestei pagini la microfonul dvs. a fost blocat.</translation>
 <translation id="8323167517179506834">Introduceți adresa URL</translation>
-<translation id="8324784016256120271">Site-urile pot folosi cookie-uri pentru a vedea activitatea ta de navigare de pe diferite site-uri, de exemplu, pentru a personaliza anunțurile</translation>
+<translation id="8324784016256120271">Site-urile pot folosi cookie-uri pentru a-ți vedea activitatea de navigare de pe diferite site-uri, de exemplu, pentru a personaliza anunțurile</translation>
 <translation id="8326478304147373412">PKCS #7, lanț de certificate</translation>
 <translation id="8327039559959785305">Eroare la instalarea fișierelor Linux. Încearcă din nou.</translation>
 <translation id="8327676037044516220">Permisiuni și setări privind conținutul</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index e0ec972..76f5a5d 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Просмотр и изменение всех ваших данных на текущем сайте</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> предлагает сбросить настройки</translation>
 <translation id="1243314992276662751">Загрузить</translation>
-<translation id="1243398753772016127">Сайты не могут отслеживать ваши действия в браузере для показа персонализированной рекламы.</translation>
 <translation id="1244265436519979884">Выполняется восстановление Linux.</translation>
 <translation id="1244303850296295656">Ошибка расширения</translation>
 <translation id="1246905108078336582">Удалить подсказку из буфера обмена?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Вкл. – пользовательские настройки</translation>
 <translation id="1489664337021920575">Выбрать другой вариант</translation>
 <translation id="1493892686965953381">Ожидание загрузки <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Также удалить данные о работе в браузере (<ph name="URL" />). Возможно, при этом вы выйдете из аккаунта на сайте google.com.</translation>
 <translation id="1495486559005647033">Количество других доступных устройств: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Вернуться на вкладку</translation>
 <translation id="1499271269825557605">Если вы обнаружили незнакомое расширение или заметили сбои в работе браузера, вы можете отключить расширение или изменить его настройки.</translation>
@@ -1188,7 +1186,6 @@
 <translation id="2575247648642144396">Значок будет отображаться, если расширение может работать на загруженной странице. Активируйте его, нажав на значок или с помощью комбинации клавиш <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Использовать в качестве Chromebox для видеоконференций</translation>
 <translation id="2580889980133367162">Всегда разрешать <ph name="HOST" /> скачивать несколько файлов</translation>
-<translation id="2580924999637585241">Всего: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">долгая</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Не удалось загрузить билет Kerberos. Повторите попытку или обратитесь к администратору устройства. Код ошибки: <ph name="ERROR_CODE" />.</translation>
@@ -2015,7 +2012,7 @@
 <translation id="3690369331356918524">Сообщает, если пароли были раскрыты в результате утечки данных.</translation>
 <translation id="3691231116639905343">Клавиатуры</translation>
 <translation id="3691267899302886494">Сайт <ph name="HOST" /> запрашивает доступ к вашему экрану.</translation>
-<translation id="369135240373237088">Снова войдите в учебный аккаунт</translation>
+<translation id="369135240373237088">Войдите снова, используя учебный аккаунт</translation>
 <translation id="3693415264595406141">Пароль:</translation>
 <translation id="3694027410380121301">Выбрать предыдущую вкладку</translation>
 <translation id="369489984217678710">Пароли и другие данные для входа</translation>
@@ -2495,7 +2492,7 @@
 <translation id="4336434711095810371">Удалить все данные</translation>
 <translation id="4336979451636460645">Просмотреть сетевые журналы можно на странице <ph name="DEVICE_LOG_LINK" /></translation>
 <translation id="4340515029017875942"><ph name="ORIGIN" /> запрашивает доступ к приложению "<ph name="EXTENSION_NAME" />"</translation>
-<translation id="434404122609091467">Использовать текущего поставщика услуг.</translation>
+<translation id="434404122609091467">Использовать текущего поставщика услуг</translation>
 <translation id="4345587454538109430">Настройка...</translation>
 <translation id="4345732373643853732">Серверу неизвестно это имя пользователя.</translation>
 <translation id="4348766275249686434">Собирать данные об ошибках</translation>
@@ -2534,7 +2531,7 @@
 <translation id="439266289085815679">Конфигурацию Bluetooth контролирует пользователь <ph name="USER_EMAIL" />.</translation>
 <translation id="4392896746540753732">Изменение файла конфигурации.</translation>
 <translation id="4394049700291259645">Отключить</translation>
-<translation id="439817266247065935">Вы неправильно завершили работу устройства. Чтобы использовать приложения для Linux, перезагрузите эту операционную систему.</translation>
+<translation id="439817266247065935">Работа устройства была завершена неправильно. Чтобы использовать приложения для Linux, перезагрузите эту операционную систему.</translation>
 <translation id="4400367121200150367">Здесь появятся сайты, которые никогда не сохраняют пароли</translation>
 <translation id="4400632832271803360">Чтобы сменить функции клавиш верхнего ряда, удерживайте клавишу Launcher</translation>
 <translation id="4400963414856942668">Чтобы добавить страницу в закладки, нажмите на значок звездочки.</translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">Всплывающие окна заблокированы</translation>
 <translation id="480990236307250886">Перейти на главную страницу</translation>
 <translation id="4811503964269049987">Добавить выбранную вкладку в группу</translation>
-<translation id="4811818760963189951">Отключено, поскольку вы отключили синхронизацию истории</translation>
 <translation id="4813136279048157860">Мои изображения</translation>
 <translation id="4813512666221746211">Ошибка сети</translation>
 <translation id="4814378367953456825">Введите название для этого отпечатка пальца.</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">Дополнительные настройки контента</translation>
 <translation id="5042282098504489593">Откройте настройки, чтобы подключить устройство <ph name="USB_DEVICE_NAME" /> к Linux</translation>
 <translation id="5043913660911154449">Или укажите PPD-файл для принтера. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Отключено, поскольку синхронизируемые данные зашифрованы с помощью кодовой фразы</translation>
 <translation id="5045550434625856497">Неправильный пароль</translation>
 <translation id="504561833207953641">Окно или вкладка откроются в текущем сеансе браузера.</translation>
 <translation id="5047421709274785093">Запретить сайтам использовать датчики движения и освещенности</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">Ваши зашифрованные данные может прочитать только тот, кто знает кодовую фразу. Она не пересылается и не хранится в Google. Если вы забудете фразу или решите изменить эту настройку, вам придется <ph name="BEGIN_LINK" />сбросить параметры синхронизации<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Поздравляем с приобретением продукта семейства <ph name="SHORT_PRODUCT_NAME" />! Это больше, чем просто компьютер.</translation>
 <translation id="6358884629796491903">Дракон</translation>
-<translation id="6360719647236334056">Используйте историю браузера Chrome для персонализации результатов поиска, рекламы и сервисов Google</translation>
 <translation id="6361850914223837199">Сведения об ошибке:</translation>
 <translation id="6362853299801475928">&amp;Сообщить о проблеме...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">Расскажите, как у вас дела.</translation>
 <translation id="6759193508432371551">Сброс настроек</translation>
 <translation id="6762833852331690540">Включено</translation>
-<translation id="6764693078871405569">Также удалить данные о работе в браузере (<ph name="URL" />). При этом вы выйдете из аккаунта на сайте <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Выбрать другой язык…</translation>
 <translation id="6767639283522617719">Не удалось подключить устройство к домену. Проверьте настройки организационного подразделения.</translation>
 <translation id="6769712124046837540">Добавление принтера...</translation>
@@ -5696,7 +5689,7 @@
 <translation id="8688672835843460752">Свободно</translation>
 <translation id="8691418731028620688">Подключиться к сети Wi-Fi</translation>
 <translation id="8695825812785969222">Открыть &amp;адрес...</translation>
-<translation id="8698269656364382265">Чтобы вернуться на предыдущий экран, проведите по экрану слева направо.</translation>
+<translation id="8698269656364382265">Чтобы вернуться на предыдущий экран, проведите слева направо.</translation>
 <translation id="869884720829132584">Меню приложений</translation>
 <translation id="869891660844655955">Срок действия</translation>
 <translation id="8703346390800944767">Пропустить</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 3990cae..05a72c6 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838"><ph name="FILE_NAME" /> හට සංවේදී අන්තර්ගතය අඩංගුයි, එය අවහිර කර ඇත.</translation>
 <translation id="1061904396131502319">විවේකයක් සඳහා වේලාවයි</translation>
+<translation id="1064552680598333868">මයික්‍රොෆෝනය වෙත වෙනස්කම් ලිනක්ස් මීළඟ වරට යළි ඇරඹූ විට ක්‍රියාත්මක වෙයි.</translation>
 <translation id="1067048845568873861">සාදන ලදි</translation>
 <translation id="1067291318998134776">Linux (බීටා)</translation>
 <translation id="1067922213147265141">වෙනත් Google සේවාවන්</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">ප්‍රවේශය ඉල්ලීමට, මෙම උපාංගයේ පරිපාලකයා සම්බන්ධ කර ගන්න.</translation>
 <translation id="1149401351239820326">කල් ඉකුත් වන මාසය</translation>
 <translation id="1150565364351027703">අව් කණ්නාඩි</translation>
+<translation id="1151841030700667295">ඔබ විවෘත පටිති ඇතුළුව සියලුම වෙබ් අඩවිවලින් වරනු ලැබේ.</translation>
 <translation id="1151917987301063366"><ph name="HOST" /> හට සැමවිටම සංවේදකවලට ප්‍රවේශ වීමට ඉඩ දෙන්න</translation>
 <translation id="1153356358378277386">යුගලිත උපාංග</translation>
 <translation id="1153636665119721804">Google ඉහළ ආරක්‍ෂණ වැඩසටහන</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">සඳහන් කළ විට වත්මන් වෙබ් අඩවියේ ඔබේ සියලු දත්ත කියවන්න සහ වෙනස් කරන්න</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> හට ඔබේ සැකසීම් යළි සැකසීමට අවශ්‍යයි.</translation>
 <translation id="1243314992276662751">උඩුගත</translation>
-<translation id="1243398753772016127">දැන්වීම් පෞද්ගලීකරණයට අඩවි වලට විවිධ අඩවි හරහා ඔබේ බ්‍රවුස් කිරීමේ ක්‍රියාකාරකම් භාවිතා කළ නොහැක</translation>
 <translation id="1244265436519979884">ලිනක්ස් ප්‍රතිසාධනය දැන් සිදු වෙමින් පවතියි</translation>
 <translation id="1244303850296295656">දිගු දෝෂය</translation>
 <translation id="1246905108078336582">පසුරු පුවරුවෙන් යෝජනාව ඉවත් කරන්නේද?</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">හෙලෝ.</translation>
 <translation id="138784436342154190">පෙරනිමි ආරම්භක පිටුව ප්‍රතිසාධනය කරනවා ද?</translation>
 <translation id="1390548061267426325">සාමාන්‍ය ටැබයක් ලෙස විවෘත කරන්න</translation>
+<translation id="1392232653471491344">ලිනක්ස් යළි ඇරඹුම අවශ්‍යයි</translation>
 <translation id="1393283411312835250">හිරු හා වළාකුළු</translation>
 <translation id="1393787139683794508">මෙය <ph name="ORIGIN_NAME" /> විසින් ගබා කරනු ලැබූ සියලුම දත්ත සහ කුකී ඉවත් කරයි.</translation>
 <translation id="1395730723686586365">යාවත්කාලකය ඇරඹිණි</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268">යුගල කිරීමට ඉඩ දීමට <ph name="TURN_ON_BLUETOOTH_LINK" /></translation>
 <translation id="1422159345171879700">අනාරක්ෂිත ස්ක්‍රිප්ට පූර්ණය කරන්න</translation>
 <translation id="1426410128494586442">ඔව්</translation>
+<translation id="142655739075382478"><ph name="APP_NAME" /> අවහිර කර ඇත</translation>
 <translation id="1426870617281699524">නැවත උත්සාහ කර, සහ ඔබේ පරිගණකය මත උත්ප්‍රේරකය පිළිගන්න</translation>
 <translation id="1427269577154060167">රට</translation>
 <translation id="142758023928848008">ඇළෙන යතුරු සක්‍රීය කරන්න (යතුරු පුවරු කෙටිමං සඳහා ඒවා අනුක්‍රමිකව ටයිප් කිරීම)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">භාශා සැකසුම්</translation>
 <translation id="1478340334823509079">විස්තර: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">ස්ථාපනය සබල කර නැත</translation>
+<translation id="1481537595330271162">තැටිය ප්‍රතිප්‍රමාණ කිරීමේ දෝෂය</translation>
 <translation id="1482626744466814421">මෙම පටිත්ත පිටුසන් කරන්න...</translation>
 <translation id="1483493594462132177">යවන්න</translation>
 <translation id="1484979925941077974">වෙබ් අඩවිය බ්ලූටූත් භාවිත කරයි</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">ක්‍රියාත්මකයි - අභිරුචි සැකසීම්</translation>
 <translation id="1489664337021920575">වෙනත් විකල්පයක් තෝරන්න</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> අපේක්ෂාවෙන්...</translation>
-<translation id="1494438840282430403">ඔබව Google.com වෙතින් වැරිය හැකි බ්‍රවුස් කිරීමේ දත්ත (<ph name="URL" />) ද හිස් කරන්න.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> අනෙකුත් තිබෙන උපාංග</translation>
 <translation id="1495677929897281669">ආපසු පටිත්ත වෙත</translation>
 <translation id="1499271269825557605">ඔබ දිගුවක් හඳුනා නොගන්නේ නම්, හෝ ඔබේ බ්‍රවුසරය අපේක්‍ෂිත පරිදි ක්‍රියා නොකරන්නේ නම්, ඔබට මෙහි දිගු අක්‍රිය කිරීමට හෝ අභිරුචි කිරීමට හැකිය.</translation>
@@ -604,6 +607,7 @@
 <translation id="1805822111539868586">දසුන් පිරික්සන්න</translation>
 <translation id="1805888043020974594">මුද්‍රණ සේවාදායකය</translation>
 <translation id="1805967612549112634">රහස් අංකය තහවුරු කරන්න</translation>
+<translation id="1806335016774576568">වෙනත් විවෘත යෙදුමකට මාරු වන්න</translation>
 <translation id="1809734401532861917">මගේ පිටුසන්, ඉතිහාසය, මුරපද සහ වෙනත් සැකසීම් <ph name="USER_EMAIL_ADDRESS" /> වෙත එක් කරන්න</translation>
 <translation id="1813278315230285598">සේවා</translation>
 <translation id="18139523105317219">EDI සාද නාමය</translation>
@@ -690,6 +694,7 @@
 <translation id="1921050530041573580">ඔබේ දුරකථනය 'පණිවුඩ' සමඟ යුගලන්න</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">විවෘත කරන්න</translation>
+<translation id="1925017091976104802">ඇලවීමට <ph name="MODIFIER_KEY_DESCRIPTION" /> ඔබන්න</translation>
 <translation id="1925021887439448749">අභිරුචි වෙබ් ලිපිනය ඇතුළු කරන්න</translation>
 <translation id="1925124445985510535">ආරක්‍ෂක පරීක්‍ෂාව <ph name="TIME" /> ට ධාවන විය</translation>
 <translation id="1926339101652878330">මෙම  සැකසීම් ව්‍යවසාය ප්‍රතිපත්තිය මගින් පාලනය වේ. තවත් විස්තර සඳහා කරුණාකර ඔබගේ පරිපාලක අමතන්න.</translation>
@@ -835,6 +840,7 @@
 <translation id="2135787500304447609">නැවත පටන්ගැනීම (&amp;R)</translation>
 <translation id="2136372518715274136">නව මුරපදය ඇතුළු කරන්න</translation>
 <translation id="2136476978468204130">ඔබ ඇතුළු කළ මුර-වැකිකඩ වැරදියි</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{කුකී අවහිර කෙරේ.}=1{කුකී අවහිර කෙරේ, 1 ව්‍යතිරේකයක්}one{කුකී අවහිර කෙරේ, ව්‍යතිරේක {COUNT} ක්}other{කුකී අවහිර කෙරේ, ව්‍යතිරේක {COUNT} ක්}}</translation>
 <translation id="2138398485845393913">"<ph name="DEVICE_NAME" />" වෙත සබැඳුම තවම සිදු කෙරෙමින් පවතී</translation>
 <translation id="2139545522194199494"><ph name="NETWORK_COUNT" />න් <ph name="NETWORK_INDEX" /> වැනි ජාලය, <ph name="NETWORK_NAME" />, සංඥා ප්‍රබලතාව <ph name="SIGNAL_STRENGTH" />%, ඔබේ පරිපාලකයා විසින් කළමනාකරණය කරයි, සබඳින්න</translation>
 <translation id="2139919072249842737">පිහිටුවීමේ බොත්තම</translation>
@@ -1002,11 +1008,13 @@
 <translation id="2346953515226895098">SODA සේවය</translation>
 <translation id="2347644257713614136">අධ්‍යාපනය සඳහා Hangouts සහ Cast භාවිතය Google රහස්‍යතා ප්‍රතිපත්තිය මගින් පාලනය වේ.</translation>
 <translation id="2348176352564285430">යෙදුම: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">දත්ත පූරණය කිරීමේ දෝෂයකි</translation>
 <translation id="2349896577940037438">ඔබේ අමතර වෙබ් සහ යෙදුම් ක්‍රියාකාරකම් සැකසීම සක්‍රීය නම්, මෙම දත්ත ඔබේ Google ගිණුුමට සුරකිනු ලැබේ. account.google.com හි ඔබට ඔබේ දත්ත බැලීමට, එය වෙනස් කිරීමට සහ ඔබේ ගිණුම් සැකසීම් වෙනස් කිරීමට හැකිය.</translation>
 <translation id="2350133097354918058">යළි පූරණ කළා</translation>
 <translation id="2350182423316644347">යෙදුම ආරම්භ කරමින්...</translation>
 <translation id="2350796302381711542"><ph name="REPLACED_HANDLER_TITLE" /> වෙනුවට සියලු <ph name="PROTOCOL" /> සබැඳි විවෘත කිරීමට <ph name="HANDLER_HOSTNAME" />ට ඉඩ දෙන්නද?</translation>
 <translation id="2351266942280602854">භාෂාව සහ ආදානය</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 අයිතමයක්}one{අයිතම {NUM_ITEMS} ක්}other{අයිතම {NUM_ITEMS} ක්}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">අගුලු තිර සටහන් ස්වයංක්‍රියව <ph name="LOCK_SCREEN_APP_NAME" /> වෙත සුරැකේ. ඔබගේ වඩාත් මෑත සටහන අගුලු තිරය මත පවතිනු ඇත.</translation>
 <translation id="2353297238722298836">කැමරාව සහ මයික්‍රෆෝනයට ඉඩ දෙන ලදී</translation>
@@ -1040,6 +1048,7 @@
 <translation id="2392369802118427583">සක්‍රිය කරන්න</translation>
 <translation id="2394566832561516196">ඊළඟ නැවත පැටවීමේදී පසුතල මැකෙනු ඇත.</translation>
 <translation id="2395616325548404795">ඔබේ <ph name="DEVICE_TYPE" /> ව්‍යවසායකත්ව කළමනාකරණය සඳහා සාර්ථකව ඇතුළත් කරගෙන ඇති නමුත්, එහි වත්කම් සහ පිහිටීම් තොරතුරු යැවීමට අසමත් විය. මෙම උපාංගය සඳහා ඔබේ පරිපාලක කොන්සෝලයෙන් මෙම තොරතුරු හස්තීයව ඇතුළු කරන්න.</translation>
+<translation id="2396387085693598316">ඔබේ පරිපාලකයා "<ph name="EXTENSION_NAME" />" අවහිර කර ඇත</translation>
 <translation id="2396783860772170191">ඉලක්කම් 4ක රහස් අංකය ඇතුළත් කරන්න (0000-9999)</translation>
 <translation id="2399939490305346086">ආරක්‍ෂක යතුරු පුරන දත්ත</translation>
 <translation id="2400664245143453337">වහා යාවත්කාලීන කිරීම අවශ්‍යයි</translation>
@@ -1187,7 +1196,6 @@
 <translation id="2575247648642144396">දිගුවට වත්මන් පිටුවේ ක්‍රියා කළ හැකි විට මෙම අයිකනය පෙනෙනු ඇත. අයිකනය මත ක්ලික් කිරීමෙන් හෝ <ph name="EXTENSION_SHORTCUT" /> එබීමෙන් මෙම දිගුව භාවිතා කරන්න.</translation>
 <translation id="257779572837908839">රැස්වීම් සඳහා Chromebox ලෙස පිහිටුවන්න</translation>
 <translation id="2580889980133367162">ගොනු කිහිපයක් බාගැනීම සඳහා  <ph name="HOST" /> වෙත සැමවිටම ඉඩදෙන්න</translation>
-<translation id="2580924999637585241">එකතුව: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">දිග</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (වේදිකාව<ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos ප්‍රවේශපත්‍රය ලබා ගත නොහැකි විය. නැවත උත්සාහ කරන්න, නැති නම් ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න. (දෝෂ කේතය <ph name="ERROR_CODE" />).</translation>
@@ -1328,6 +1336,7 @@
 <translation id="2753677631968972007">වෙබ් අඩවි අවසර හස්තීයව පාලන කරන්න.</translation>
 <translation id="2755367719610958252">ප්‍රවේශ්‍යතා විශේෂාංග කළමනාකරණය කරන්න</translation>
 <translation id="275662540872599901">තිරය ක්‍රියාවිරහිතයි</translation>
+<translation id="2757338480560142065">ඔබ සුරකින මුරපදය <ph name="WEBSITE" /> සඳහා වන ඔබේ මුරපදයට ගැළපෙන බව සහතික කර ගන්න</translation>
 <translation id="2762441749940182211">කැමරාව අවහිරයි</translation>
 <translation id="2765217105034171413">කුඩා</translation>
 <translation id="2766161002040448006">දෙමාපියෙකුගෙන් අසන්න</translation>
@@ -1580,6 +1589,7 @@
 <translation id="3090819949319990166"><ph name="TEMP_CRX_FILE" /> වෙත බාහිර crx ගොනුව පිටපත් කළ නොහැක.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" යුගල විය</translation>
 <translation id="3092699946856346803">ඔබේ SIM පත එක් කර නැවත උත්සාහ කරන්න</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 හානිකර විය හැකි දිගුවක් අක්‍රියයි. ඔබට එය ඉවත් කිරීමට ද හැකිය.}one{හානිකර විය හැකි දිගු {NUM_EXTENSIONS} ක් අක්‍රියයි. ඔබට ඒවා ඉවත් කිරීමට ද හැකිය.}other{හානිකර විය හැකි දිගු {NUM_EXTENSIONS} ක් අක්‍රියයි. ඔබට ඒවා ඉවත් කිරීමට ද හැකිය.}}</translation>
 <translation id="3101709781009526431">දිනය හා වේලාව</translation>
 <translation id="3103941660000130485">ලිනක්ස් උත්ශ්‍රේණි කිරීමේ දෝෂයයි</translation>
 <translation id="310671807099593501">අඩවිය බ්ලූටූත් භාවිත කරයි</translation>
@@ -1654,6 +1664,7 @@
 <translation id="3201422919974259695">ලද හැකි USB උපාංග මෙහි දිස් වෙති.</translation>
 <translation id="3202131003361292969">පෙත</translation>
 <translation id="3202173864863109533">මෙම ටැබයේ ශ්‍රව්‍යයන් නිහඬ කර ඇත.</translation>
+<translation id="3208321278970793882">යෙදුම</translation>
 <translation id="3208584281581115441">දැන් පරීක්‍ෂා කරන්න</translation>
 <translation id="3208703785962634733">තහවුරු කර නොමැත</translation>
 <translation id="32101887417650595">මුද්‍රකයට සම්බන්ධ කළ නොහැක</translation>
@@ -1674,6 +1685,7 @@
 <translation id="3239373508713281971"><ph name="APP_NAME" /> සඳහා වන කාල සීමාව</translation>
 <translation id="3241680850019875542">ඇසිරීම සඳහා වන දිගුවල මූල නාමාවලිය තෝරන්න. දිගුවක් යාවත් කිරීමට, නැවත භාවිතා කිරීමට පුද්ගලික යතුරද තෝරන්න.</translation>
 <translation id="3244294424315804309">හඬ නිහඬ කිරීම දිගටම කරගෙන යන්න</translation>
+<translation id="3246107497225150582">{0,plural, =1{උපාංගය දිනයක් තුළ යාවත්කාලීන කරන්න}one{උපාංගය දින # ක් තුළ යාවත්කාලීන කරන්න}other{උපාංගය දින # ක් තුළ යාවත්කාලීන කරන්න}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> - ජාල දෝෂය</translation>
 <translation id="3248902735035392926">ආරක්‍ෂාව වැදගත්. මොහොතක් ලබා ගෙන <ph name="BEGIN_LINK" />දැන් ඔබේ දිගු පරීක්‍ෂා කරන්න<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1760,6 +1772,7 @@
 <translation id="3356580349448036450">සම්පූර්ණ</translation>
 <translation id="3359256513598016054">සහතික ප්‍රතිපත්ති නිරෝධනයන්</translation>
 <translation id="3360297538363969800">මුද්‍රණය අසාර්ථකයි. කරුණාකර ඔබේ මුද්‍රකය පිරික්සා නැවත උත්සහ කරන්න.</translation>
+<translation id="3364986687961713424">ඔබේ පරිපාලක වෙතින්: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Ctrl හෝ Alt භාවිතා කරන්න</translation>
 <translation id="3367047597842238025">ඔබට අවශ්‍ය ආකාරයට ඔබගේ <ph name="DEVICE_TYPE" /> පිහිටුවා, ඔබගේ ඇඟිලි තුඩු මත විස්මය දනවන හැකියාවන් සොයාගන්න.</translation>
 <translation id="3368922792935385530">සම්බන්ධ කළ</translation>
@@ -1864,6 +1877,7 @@
 <translation id="3496213124478423963">කුඩා කරන්න</translation>
 <translation id="3497560059572256875">Doodle බෙදා ගන්න</translation>
 <translation id="3498215018399854026">අපට ඔබේ දෙමව්පියන් වෙත ලඟාවිය නොහැකි විය. කරුණාකර නැවත උත්සහ කරන්න.</translation>
+<translation id="3500417806337761827">පංගුව නැංවීමේ දෝෂය. දැනටමත් නංවා ඇත SMB පංගු සංඛ්‍යාව ඉතා වැඩියි.</translation>
 <translation id="3505030558724226696">උපාංග පිවිසුම ඉවත් කරන්න</translation>
 <translation id="3507421388498836150">"<ph name="EXTENSION_NAME" />" සඳහා වත්මන් අවසර</translation>
 <translation id="3507888235492474624">බ්ලූටූත් උපාංග යළි ස්කෑන් කරන්න</translation>
@@ -1929,6 +1943,7 @@
 <translation id="3592260987370335752">සහ වැඩිදුර ඉගෙන ගන්න</translation>
 <translation id="359283478042092570">ඇතුළ් කරන්න</translation>
 <translation id="3593965109698325041">සහතික නාම නිරොධය</translation>
+<translation id="3595381248165458839">ඔබේ සංවිධානයේ උපාංග පරිපාලකයා සම්බන්ධ කර ගන්න</translation>
 <translation id="3596235046596950091">ක්ලවුඩ් සේවා සබල කරන්න</translation>
 <translation id="3596414637720633074">අප්‍රසිද්ධය තුළ තෙවන පාර්ශ්ව කුකී අවහිර කරන්න</translation>
 <translation id="3599221874935822507">නංවන ලද</translation>
@@ -2062,6 +2077,7 @@
 <translation id="3742666961763734085">එම නම සහිත ආයතනික ඒකකය සොයා ගැනීමට නොහැක. නැවත උත්සාහ කරන්න.</translation>
 <translation id="3744111561329211289">පසුබිමෙහි සමමුහුර්තකරණය</translation>
 <translation id="3746127522257263495">Android යෙදුම් තුළ G Suite for Education ගිණුම එක් කිරීමට සහය නොදැක්වේ.</translation>
+<translation id="3747039297326604768">Plugin VM විවෘත කළ නොහැකි විය</translation>
 <translation id="3747077776423672805">යෙදුම් ඉවත් කිරීමට, සැකසීම් &gt; Google Play Store &gt; Android මනාප කළමනාකරණය &gt; යෙදුම් හෝ යෙදුම් කළමනාකරු වෙත යන්න. අනතුරුව ඔබට අස්ථාපනය කිරීමට අවශ්‍ය යෙදුම තට්ටු කරන්න (ඔබට යෙදුම සොයා ගැනීමට දකුණට හෝ වමට ස්වයිප් කිරීමට අවශ්‍ය විය හැකිය). අනතුරුව අස්ථාපනය කරන්න හෝ අබල කරන්න තට්ටු කරන්න.</translation>
 <translation id="3748026146096797577">සබැඳී නැත</translation>
 <translation id="3752582316358263300">හරි...</translation>
@@ -2137,6 +2153,7 @@
 <translation id="3827774300009121996">&amp;පූර්ණ තිරය</translation>
 <translation id="3828029223314399057">පිටු සලකුණු සොයන්න</translation>
 <translation id="3829765597456725595">SMB ගොනු බෙදා ගැනීම</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{ඔබේ පරිපාලකයා 1 හානිකර විය හැකි දිගුවක් ආපසු සක්‍රීය කර ඇත}one{ඔබේ පරිපාලකයා හානිකර විය හැකි දිගු {NUM_EXTENSIONS} ක් ආපසු සක්‍රීය කර ඇත}other{ඔබේ පරිපාලකයා හානිකර විය හැකි දිගු {NUM_EXTENSIONS} ක් ආපසු සක්‍රීය කර ඇත}}</translation>
 <translation id="3831436149286513437">Google Drive සෙවීමේ යෝජනා</translation>
 <translation id="383161972796689579">මෙම උපාංගයේ හිමිකරු නව පරිශීලකයන් එක් කිරීමෙන් අබල කර ඇත.</translation>
 <translation id="3834775135533257713">"<ph name="INSTALLED_APP_NAME" />" සමඟ ගැටෙන නිසා "<ph name="TO_INSTALL_APP_NAME" />" යෙදුම එක් කිරීමට නොහැකි විය.</translation>
@@ -2314,6 +2331,7 @@
 <translation id="4047726037116394521">මුල් පිටුවට යන්න</translation>
 <translation id="4050225813016893843">සත්‍යාපන ක්‍රමය</translation>
 <translation id="4052120076834320548">කුඩා</translation>
+<translation id="4056908315660577142">ඔබ ඔබේ මාපියන් <ph name="APP_NAME" /> Chrome යෙදුම සඳහා සකසා ඇති කාල සීමාවට ළඟා විය. හෙට ඔබට එය <ph name="TIME_LIMIT" /> ට භාවිත කළ හැක.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">අලෙවිසැලෙහි බලන්න</translation>
 <translation id="4058647953897694817">බ්ලූටූත් හරහා තහවුරු කරන්න</translation>
@@ -2445,6 +2463,7 @@
 <translation id="424963718355121712">යෙදුම් ඒවාට බලපාන සත්කාරක වෙතින් සැපයිය යුතුය</translation>
 <translation id="4250229828105606438">තිරරූපය</translation>
 <translation id="4250680216510889253">නැත</translation>
+<translation id="4252035718262427477">වෙබ් පිටුව, තනි ගොනුව (වෙබ් පොදිය)</translation>
 <translation id="4252852543720145436">ආරක්ෂිත අන්තර්ගතය හැඳුනුම්කාරක</translation>
 <translation id="4252899949534773101">බ්ලූටූත් අබලයි</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> - ටැබ අන්තර්ගතය බෙදා ගත්</translation>
@@ -2540,6 +2559,7 @@
 <translation id="4400963414856942668">ඔබට පටිත්තක් පිටුසන් කිරීමට තරුව ක්ලික් කළ හැක</translation>
 <translation id="4403775189117163360">වෙනත් ෆෝල්ඩරයක් තෝරන්න</translation>
 <translation id="4404136731284211429">නැවත ස්කෑන් කරන්න</translation>
+<translation id="4404843640767531781">ඔබේ මාපිය <ph name="APP_NAME" /> අවහිර කර ඇත. මෙම යෙදුම භාවිත කිරීමට ඔබේ මාපියවරුන්ගෙන් අවසර ඉල්ලන්න.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">උ&amp;පකාරය</translation>
 <translation id="4409697491990005945">තීරු</translation>
@@ -2609,6 +2629,7 @@
 <translation id="450099669180426158">විස්මයාර්ථ ලකුණ අයිකනය</translation>
 <translation id="4501530680793980440">ඉවත්කිරීම තහවුරු කරන්න</translation>
 <translation id="4502423230170890588">මෙම උපාංගයෙන් ඉවත් කරන්නද?</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{කුකීවලට ඉඩ දෙනු ලැබේ}=1{කුකීවලට ඉඩ දෙනු ලැබේ, 1 ව්‍යතිරේකයක්}one{කුකීවලට ඉඩ දෙනු ලැබේ, ව්‍යතිරේක {COUNT} ක්}other{කුකීවලට ඉඩ දෙනු ලැබේ, ව්‍යතිරේක {COUNT} ක්}}</translation>
 <translation id="4504940961672722399">මෙම අයිකනය මත ක්ලික් කිරීමෙන් හෝ <ph name="EXTENSION_SHORTCUT" /> එබීමෙන් මෙම දිගුව භාවිතා කරන්න.</translation>
 <translation id="4508051413094283164">සියල්ල අප්‍රසිද්ධ කවුළුවක විවෘත කරන්න</translation>
 <translation id="4508265954913339219">සක්‍රිය කිරීම අසාර්ථක විය</translation>
@@ -2722,6 +2743,7 @@
 <translation id="465878909996028221">බ්‍රවුසර ප්‍රතියොමු කිරීම් සඳහා http, https සහ ගොනු ප්‍රොටොකෝලවලට පමණක් සහය දැක්වේ.</translation>
 <translation id="4659077111144409915">ප්‍රාථමික ගිණුම</translation>
 <translation id="4660476621274971848">අපේක්ෂිත අනුවාදය "<ph name="EXPECTED_VERSION" />", නමුත් අනුවාදය වූයේ "<ph name="NEW_ID" />"</translation>
+<translation id="4660540330091848931">ප්‍රතිප්‍රමාණ කිරීම</translation>
 <translation id="4660838440047236328">ඔබේ කාමරයේ වින්‍යාසය</translation>
 <translation id="4661407454952063730">යෙදුම් දත්ත යනු සම්බන්ධතා, පණිවුඩ, සහ ඡායාරූප වැනි දත්ත ඇතුළුව, යෙදුමක් විසින් සුරැක ඇති (සංවර්ධක සැකසීම් මත පදනම්ව) කිසියම් දත්ත වේ.</translation>
 <translation id="4661931051827810091">වෙබය මත සියලුම පරිශීලකයින්ට එරෙහි නව තර්ජන සොයා ගැනීමට සහ අවහිර කිරීමට ඔබ පැමිණෙන සමහර පිටුවල නිර්නාමික URL, සීමිත පද්ධති තොරතුරු, සහ යම් පිටු අන්තර්ගතය යවයි.</translation>
@@ -2817,7 +2839,6 @@
 <translation id="4808667324955055115">උත්පතන අවහිරයි:</translation>
 <translation id="480990236307250886">මුල් පිටුව විවෘත කරන්න</translation>
 <translation id="4811503964269049987">තේරූ පටිත්ත සමූහ කරන්න</translation>
-<translation id="4811818760963189951">ඔබ ඉතිහාස සමමුහූර්තය අබල කළ බැවින් අක්‍රිය කළා</translation>
 <translation id="4813136279048157860">මගේ රූප</translation>
 <translation id="4813512666221746211">ජාල දෝෂයකි</translation>
 <translation id="4814378367953456825">මෙම ඇඟිලි සලකුණ සඳහා නමක් ඇතුළත් කරන්න</translation>
@@ -2906,6 +2927,7 @@
 <translation id="4918086044614829423">පිළිගන්න</translation>
 <translation id="4918221908152712722"><ph name="APP_NAME" /> ස්ථාපනය කරන්න (බාගැනීමක් අවශ්‍ය නොවේ)</translation>
 <translation id="4920887663447894854">පහත අඩවි මෙම පිටුවෙහි ඔබගේ පිහිටීම හඹා යාමෙන් අවහිර කර ඇත.</translation>
+<translation id="49226369361073053">{0,plural, =0{උපාංගය දැන් යාවත්කාලීන කරන්න}=1{උපාංගය 1 තත්පරයක් තුළ යාවත්කාලීන කරන්න}one{උපාංගය තත්පර # ක් තුළ යාවත්කාලීන කරන්න}other{උපාංගය තත්පර # ක් තුළ යාවත්කාලීන කරන්න}}</translation>
 <translation id="492299503953721473">Android යෙදුම් ඉවත් කරන්න</translation>
 <translation id="4923279099980110923">ඔව්, මට උපකාර කිරීමට අවශ්‍යයි</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2986,7 +3008,6 @@
 <translation id="5040823038948176460">අමතර අන්තර්ගත සැකසීම්</translation>
 <translation id="5042282098504489593">ලිනක්ස් වෙත <ph name="USB_DEVICE_NAME" /> සම්බන්ධ කිරීමට සැකසීම් විවෘත කරන්න</translation>
 <translation id="5043913660911154449">නැති නම්, ඔබේ මුද්‍රක PPD සඳහන් කරන්න <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">ඔබ මුර වැකිකඩක් සමඟ ඔබේ සමමුහූර්ත දත්ත සංකේතන කළ බැවින් අක්‍රිය කළා</translation>
 <translation id="5045550434625856497">රහස්වචනය වැරදියි</translation>
 <translation id="504561833207953641">පවතින බ්‍රවුසර සැසිය තුළ විවෘත කිරීම.</translation>
 <translation id="5047421709274785093">චලිත සහ ආලෝක සංවේදක භාවිතයෙන් අඩවි අවහිර කරන්න</translation>
@@ -3057,6 +3078,7 @@
 <translation id="5135085122826131075">ඔබ "Ok Google" යැයි කියන විට වේලාවක ඔබේ සහකරු වෙත ප්‍රවේශ වන්න</translation>
 <translation id="5135533361271311778">පිටු සලකුණු අයිතමය සෑදිය නොහැකි විය.</translation>
 <translation id="5137501176474113045">මෙම අයිතමය මකන්න</translation>
+<translation id="5138982052046316113">ලිනක්ස් තැටිය ප්‍රතිප්‍රමාණ කරන්න</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> සෙවීම</translation>
 <translation id="5139823398361067371">ඔබේ ආරක්‍ෂක යතුර සඳහා රහස් අංකය ඇතුළත් කරන්න. ඔබ රහස් අංකය නොදනී නම්, ඔබට ආරක්‍ෂක යතුරු යළි සැකසීමට අවශ්‍ය වෙයි.</translation>
 <translation id="5139955368427980650">විවෘත කරන්න</translation>
@@ -3213,6 +3235,7 @@
 <translation id="5353252989841766347">Chrome වෙතින් මුරපද නිර්යාත කරන්න</translation>
 <translation id="5355099869024327351">සහකරුට ඔබට දැනුම් දීම් පෙන්වීමට අවසර දෙන්න</translation>
 <translation id="5355926466126177564">"<ph name="EXTENSION_NAME" />" දිගුව ඔබ Omnibox වෙතින් සොයන විට කුමන පිටුව පෙන්වන්නේද යන්න වෙනස් කර තිබේ.</translation>
+<translation id="535911077628776608"><ph name="FILE_NAME" /> අනතුරුදායක විය හැක. ස්කෑන් කිරීම සඳහා Google ඉහළ ආරක්‍ෂාව වෙත යවන්නේද? බාගැනීම් තීරු ප්‍රදේශයට මාරු වීමට Shift+F6 ඔබන්න.</translation>
 <translation id="5359910752122114278">1 ප්‍රතිඑලයක්</translation>
 <translation id="5360150013186312835">මෙවලම් තීරුවෙහි පෙන්වන්න</translation>
 <translation id="5362741141255528695">පුද්ගලික යතුරු ගොනුව තෝරන්න.</translation>
@@ -3351,6 +3374,7 @@
 <translation id="5539221284352502426">ඔබ ඇතුළු කළ මුරපදය සේවාදායකය විසින් ප්‍රතික්ෂේප කරන ලදී. විය හැකි හේතුවල ඇතුළත් වන්නේ: මුරපදය ඉතා කෙටි වේ. මුරපදයේ අංක හෝ සංකේත ඇතුළත් විය යුතුය. මුරපදය මීට පෙර මුරපදවලින් වෙනස් විය යුතුය.</translation>
 <translation id="5541694225089836610">ක්‍රියාව ඔබේ පරිපාලකයා විසින් අබල කරනු ලැබ ඇත</translation>
 <translation id="5542132724887566711">පැතිකඩ</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> මෙම උපාංගය වහාම යාවත්කාලීන කිරීම අවශ්‍ය කරයි.</translation>
 <translation id="5542750926112347543"><ph name="DOMAIN" /> වෙතින් කුකී අවහිරයි</translation>
 <translation id="5542949973455282971"><ph name="CARRIER_NAME" /> වෙත සම්බන්ධ කිරීම</translation>
 <translation id="5543983818738093899">තත්වය සඳහා පරීක්ෂා කරමින්...</translation>
@@ -3396,6 +3420,7 @@
 <translation id="5593357315997824387">මාගේ ගොනු සමමුහුර්ත කරන්න</translation>
 <translation id="5595152862129936745">බොහෝ දුරින්</translation>
 <translation id="5595485650161345191">ලිපිනය සංස්කරණය</translation>
+<translation id="5595727715083333657">ඔබේ බඳුන ප්‍රතිප්‍රමාණ කිරීමට සහය නොදක්වයි. ලිනක්ස් (බීටා) වෙත කලින් වෙන් කරන ලද ඉඩ ප්‍රමාණය ගැළපීමට, උපස්ථ කර පසුව නව බඳුනකට ප්‍රතිසාධන කරන්න.</translation>
 <translation id="5596627076506792578">තවත් විකල්ප</translation>
 <translation id="5600706100022181951">යාවත්කාලීනය <ph name="UPDATE_SIZE_MB" /> MB ජංගම දත්ත භාවිත කර බාගනු ඇත. ඔබ දිගටම කරගෙන යාමට කැමතිද?</translation>
 <translation id="5601503069213153581">PIN</translation>
@@ -3469,6 +3494,7 @@
 <translation id="5691511426247308406">පවුල</translation>
 <translation id="5691772641933328258">ඇඟිලි සලකුණ හඳුනා නොගැනිණි</translation>
 <translation id="5692183275898619210">මුද්‍රණ කිරීම සම්පූර්ණයි</translation>
+<translation id="5692875591060376599">තේරූ ගොනුව නොදන්නා අතර, අනතුරුදායක විය හැක. ස්කෑන් කිරීම සඳහා Google ඉහළ ආරක්‍ෂාව වෙත යවන්නේද?</translation>
 <translation id="569425414730375234">වත්මන් අප්‍රසිද්ධ සැසිය: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">"<ph name="EXTENSION_NAME" />" වෙතින් අයථා පරිහරණය වාර්තා කරන්න</translation>
 <translation id="5696679855467848181">භාවිතයේ පවතින වත්මන් PPD ගොනුව: <ph name="PPD_NAME" /></translation>
@@ -3680,6 +3706,7 @@
 <translation id="5976160379964388480">වෙනත්</translation>
 <translation id="5978277834170881274">&amp;මූලික අක්‍ෂර වින්‍යාස පරීක්‍ෂාව භාවිත කරන්න</translation>
 <translation id="5979084224081478209">මුරපද පරීක්‍ෂා කරන්න</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{ඔබ 1 හානිකර විය හැකි දිගුවක් ආපසු සක්‍රීය කර ඇත}one{ඔබ හානිකර විය හැකි දිගු {NUM_EXTENSIONS} ක් ආපසු සක්‍රීය කර ඇත}other{ඔබ හානිකර විය හැකි දිගු {NUM_EXTENSIONS} ක් ආපසු සක්‍රීය කර ඇත}}</translation>
 <translation id="5979421442488174909"><ph name="LANGUAGE" /> ට පරිවර්තනය කරන්න</translation>
 <translation id="5979469435153841984">පිටුවලට පිටුසන් යෙදීමට, ලිපින තීරුව තුළ ඇති තරුව ක්ලික් කරන්න</translation>
 <translation id="5984222099446776634">මෑතදී පිවිසි</translation>
@@ -3930,6 +3957,7 @@
 <translation id="6309510305002439352">මයික්‍රොෆෝනය අක්‍රියයි</translation>
 <translation id="6311220991371174222">ඔබේ පැතිකඩ විවෘත කරන විට යම් දෙයක් වැරදී ගිය නිසා Chrome ආරම්භ කළ නොහැකිය. Chrome නැවත ආරම්භ කිරීමට උත්සාහ කරන්න.</translation>
 <translation id="6312403991423642364">නොදන්නා ජාල දෝෂය</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{ආරක්‍ෂක පරීක්‍ෂාව 1 දිනකට පෙර ධාවන විය}one{ආරක්‍ෂක පරීක්‍ෂාව දින {NUM_DAYS} කට පෙර ධාවන විය}other{ආරක්‍ෂක පරීක්‍ෂාව දින {NUM_DAYS} කට පෙර ධාවන විය}}</translation>
 <translation id="6312638141433622592">සහය දැක්වෙන විට, ලිපි පාඨක ප්‍රකාරයේ පෙන්වීමට පිරිනමන්න</translation>
 <translation id="6313641880021325787">VR වෙතින් ඉවත් වන්න</translation>
 <translation id="6314819609899340042">ඔබ සාර්ථකව මෙම <ph name="IDS_SHORT_PRODUCT_NAME" /> උපාංගය මත දෝශ නිරාකරණ විශේෂාංග සක්‍රීය කර ඇත.</translation>
@@ -3945,6 +3973,7 @@
 <translation id="6325191661371220117">ස්වයං-දියත් කිරීම අබල කරන්න</translation>
 <translation id="6326175484149238433">Chrome වෙතින් ඉවත් කරන්න</translation>
 <translation id="6326855256003666642">Keepalive ගණන</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> යල් පැනීමට පෙර මෙම උපාංගය යාවත්කාලීන කිරීම අවශ්‍ය කරයි.</translation>
 <translation id="6327785803543103246">වෙබ් ප්‍රොක්සි ස්වයං අනාවරණය</translation>
 <translation id="6333064448949140209">ගොනුව නිදොස් කිරීම සඳහා Google වෙත යවනු ඇත</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> සඳහා නව පැතිකඩක් තනන්න</translation>
@@ -3964,7 +3993,6 @@
 <translation id="63566973648609420">සංකේතනය කළ දත්ත කියවිය හැක්කේ ඔබේ මුරවැකිකඩ සහිත අයකුට පමණි. මෙම මුරවැකිකඩ Google වෙත යැවීම හෝ ගබඩා කර ගැනීම නොකෙරේ. ඔබට ඔබේ මුරවැකිකඩ අමතක නම් හෝ මෙම සැකසීම් වෙනස් කිරීමට අවශ්‍ය නම්, ඔබ <ph name="BEGIN_LINK" />සමමුහුර්ත කිරීම යළි සැකසීම<ph name="END_LINK" /> අවශ්‍ය වනු ඇත.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> පවුලට සාදරයෙන් පිළිගනිමු. මෙය සාමාන්‍ය පරිගණකයක් නොවේ.</translation>
 <translation id="6358884629796491903">මකරා</translation>
-<translation id="6360719647236334056">සෙවීම, දැන්වීම් සහ අනෙකුත් Google සේවා පුද්ගලායන කිරීමට ඔබේ Chrome බ්‍රවුස් කිරීමේ ඉතිහාසයට භාවිත කරන්න</translation>
 <translation id="6361850914223837199">දෝශ විස්තර:</translation>
 <translation id="6362853299801475928">ගැටළුවක් වාර්තා කරන්න...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3972,11 +4000,13 @@
 <translation id="6366190659675876144">සම්මත ආරක්‍ෂාව</translation>
 <translation id="636850387210749493">ව්‍යාපාරික බඳවාගැනීම</translation>
 <translation id="6370021412472292592">ලේඛනය පැටවිය නොහැකි විය.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{මුරපදය වෙනස් කරන්න}one{මුරපද වෙනස් කරන්න}other{මුරපද වෙනස් කරන්න}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">නැවත උත්සහ කරන්න</translation>
 <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' සඳහා 1 ප්‍රතිඵලයක්</translation>
 <translation id="6380143666419481200">පිළිගෙන ඉදිරියට යන්න</translation>
 <translation id="6384275966486438344">ඔබේ සෙවුම් සැකසුම් මෙලෙස වෙනස් කරන්න: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">අන්තර්ජාලයට සම්බන්ධ කර නැවත උත්සාහ කරන්න</translation>
 <translation id="6385543213911723544">අඩවිවලට කුකි දත්ත සුරැකීමට සහ කියවීමට හැකිය</translation>
 <translation id="6386099547750337629">මෙය අනපේක්‍ෂිත නම්, සහය සම්බන්ධ කර ගන්න.</translation>
 <translation id="6387674443318562538">සිරස්ව වෙන් කරන්න</translation>
@@ -4055,6 +4085,7 @@
 <translation id="6478248366783946499">අනතුරුදායක ගොනුව තබා ගන්නවා ද?</translation>
 <translation id="6483485061007832714">බාගැනීම විවෘත කරන්න</translation>
 <translation id="6483805311199035658"><ph name="FILE" /> විවෘත කෙරෙමින්...</translation>
+<translation id="6485092675191826776">Plugin VM බලපත්‍රය කල් ඉකුත් වී ඇත</translation>
 <translation id="6488384360522318064">භාෂාව තෝරන්න</translation>
 <translation id="648927581764831596">කිසිත් ලද නොහැක</translation>
 <translation id="6490471652906364588">USB-C උපාංගය (දකුණු තොට)</translation>
@@ -4240,9 +4271,9 @@
 <translation id="6758056191028427665">අපි සිදු කරන්නේ කෙසේදැයි අපට දන්වන්න.</translation>
 <translation id="6759193508432371551">කර්මාන්තශාලා නැවත සැකසුම</translation>
 <translation id="6762833852331690540">සක්‍රීය</translation>
-<translation id="6764693078871405569">ඔබව <ph name="DOMAIN" /> වෙතින් වරන බ්‍රවුස් කිරීමේ දත්ත (<ph name="URL" />) ද හිස් කරන්න.</translation>
 <translation id="6767566652486411142">වෙනත් භාෂාවක් තෝරන්න...</translation>
 <translation id="6767639283522617719">වසමට එකතු විය නොහැක. ආයතනික ඒකකය සඳහා සැකසීම් නිවැරදි බවට වග බලා ගන්න.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> ඔබෙන් මෙම උපාංගය යාවත්කාලීන කිරීම නිර්දේශ කරයි.</translation>
 <translation id="6769712124046837540">මුද්‍රකයක් එක් කරමින්...</translation>
 <translation id="6770602306803890733">ඔබේ සහ වෙබය මත සියලු දෙනාගේම ආරක්‍ෂාව වැඩිදියුණු කරයි</translation>
 <translation id="6770664076092644100">NFC හරහා තහවුරු කරන්න</translation>
@@ -4375,6 +4406,7 @@
 <translation id="6943836128787782965">HTTP අසාර්ථක විය</translation>
 <translation id="6945221475159498467">තෝරන්න</translation>
 <translation id="694592694773692225">හරවා යැවීම මෙම පිටුවෙහි අවහිරයි.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{සමථයට පත් වූ 1 මුරපදයක්}one{සමථයට පත් වූ මුරපද {NUM_PASSWORDS} ක්}other{සමථයට පත් වූ මුරපද {NUM_PASSWORDS} ක්}}</translation>
 <translation id="6949434160682548041">මුරපදය (විකල්පමය)</translation>
 <translation id="6950627417367801484">යෙදුම් ප්‍රතිස්ථාපනය කරන්න</translation>
 <translation id="6950943362443484797">අප එම යෙදුම ඔබට ස්ථාපනය කරන්නෙමු</translation>
@@ -4459,6 +4491,7 @@
 <translation id="7053983685419859001">අවහිර කරන්න</translation>
 <translation id="7055152154916055070">හරවා යැවීම අවහිරයි:</translation>
 <translation id="7056526158851679338">&amp;උපාංග පරීක්ෂා කරන්න</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{ආරක්‍ෂක පරීක්‍ෂාව 1 විනාඩියකට පෙර ධාවන විය}one{ආරක්‍ෂක පරීක්‍ෂාව විනාඩි {NUM_MINS} කට පෙර ධාවන විය}other{ආරක්‍ෂක පරීක්‍ෂාව විනාඩි {NUM_MINS} කට පෙර ධාවන විය}}</translation>
 <translation id="7057767408836081338">යෙදුම් දත්ත ලබා ගැනීම අසාර්ථක විය, කෙසේ වෙතත් යෙදුම ධාවන කිරීමට උත්සාහ කෙරේ...</translation>
 <translation id="7059858479264779982">ස්වයං-දියත්කිරීමට සකසන්න</translation>
 <translation id="7059893117020417984">රහසිගතව බ්‍රවුස් කිරීම සඳහා, අප්‍රසිද්ධ කවුළුවක් විවෘත කිරීම සඳහා තිත් නිරූපක මෙනුව ක්ලික් කරන්න</translation>
@@ -4702,6 +4735,7 @@
 <translation id="7371006317849674875">ආරම්භක වේලාව</translation>
 <translation id="7371490947952970241">ඔබට මෙම උපාංගයෙහි ප්‍රධාන සැකසීම අක්‍රිය කිරීමෙන් ස්ථානය අක්‍රිය කළ හැක. ඔබට Wi‑Fi, ජංගම ජාල සහ ස්ථාන සැකසීම් තුළ ස්ථානය සඳහා වන සංවේදක භාවිතය ද අක්‍රිය කළ හැක.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{උපාංගය පැයක් තුළ යාවත්කාලීන කරන්න}one{උපාංගය පැය # ක් තුළ යාවත්කාලීන කරන්න}other{උපාංගය පැය # ක් තුළ යාවත්කාලීන කරන්න}}</translation>
 <translation id="7376553024552204454">චලනය වන විට මූසිකයේ කර්සරය උද්දීපනය කරන්න</translation>
 <translation id="7377451353532943397">සංවේදක ප්‍රවේශය දිගටම අවහිර කරන්න</translation>
 <translation id="73786666777299047">Chrome Web Store විවෘත කරන්න</translation>
@@ -4719,6 +4753,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">ඔබේ <ph name="PHONE_NAME" /> මත සම්බන්ධතාව පිහිටුවන්න</translation>
 <translation id="7401778920660465883">මෙම පණිවුඩය ඉවත ලන්න</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{ආරක්‍ෂක පරීක්‍ෂාව 1 පැයකට පෙර ධාවන විය}one{ආරක්‍ෂක පරීක්‍ෂාව පැය {NUM_HOURS} කට පෙර ධාවන විය}other{ආරක්‍ෂක පරීක්‍ෂාව පැය {NUM_HOURS} කට පෙර ධාවන විය}}</translation>
 <translation id="740624631517654988">පොප් අප් බාධා කරන ලදි</translation>
 <translation id="7407430846095439694">ආයාත කිරීම සහ බැදීම</translation>
 <translation id="7407504355934009739">බොහෝ අය මෙම වෙබ් අඩවියෙන් එන දැනුම් දීම් අවහිර කරති</translation>
@@ -4749,6 +4784,7 @@
 <translation id="7441830548568730290">වෙනත් පරිශීලකයන්</translation>
 <translation id="7442465037756169001">Your Hangouts Meet hardware is ready to be set up.</translation>
 <translation id="744341768939279100">නව පැතිකඩ නිර්මාණය කරන්න</translation>
+<translation id="744366959743242014">දත්ත පූරණ කිරීම, මෙයට තත්පර කිහිපයක් දක්වා ගත විය හැක.</translation>
 <translation id="7443806024147773267">ඔබ ඔබේ Google ගිණුමට පුරනය වී සිටින සැම විටම ඔබේ මුරපද වෙත ප්‍රවේශ වන්න</translation>
 <translation id="7444983668544353857">අක්‍රිය කරන්න <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">යෙදුම් ස්වයංක්‍රීයව ස්ථාපන කරන්න</translation>
@@ -4784,6 +4820,7 @@
 <translation id="7489761397368794366">ඔබේ උපාංගයෙන් අමතන්න</translation>
 <translation id="749028671485790643"><ph name="VALUE" /> පුද්ගලයා</translation>
 <translation id="7490813197707563893">MAC ලිපිනය</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 කුකීයක්}one{කුකී {NUM_COOKIES} ක්}other{කුකී {NUM_COOKIES} ක්}}</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> දිගුව විසින් මුරපද සහ ණය කාඩ්පත් අංක වැනි පුද්ගලික දත්ත ඇතුළු, ඔබ ටයිප් කරන සියලු පෙළ එකතු කළ හැක. ඔබට මෙම දිගුව භාවිතා කිරීමට අවශ්‍යයි ද?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">ඔබගේ පැරැණි මුරපදය අමතකද?</translation>
@@ -4804,10 +4841,14 @@
 <translation id="7513029293694390567">ගබඩා කළ අක්තපත්‍ර භාවිතයෙන් වෙබ් අඩවි වෙත ස්වයංක්‍රීයව පුරන්න. අබල කළහොත්, ඔබ වෙබ් අඩවියකට පිරීමට පෙර සෑම විටම ඔබෙන් තහවුරු කිරීමට ඉල්ලනු ඇත.</translation>
 <translation id="7514239104543605883">ඔබේ උපාංගයට පිටපත් කරන්න</translation>
 <translation id="7514365320538308">බාගන්න</translation>
+<translation id="751523031290522286">පරිපාලකයා <ph name="APP_NAME" /> අවහිර කර ඇත. මෙම යෙදුම භාවිත කිරීමට පරිපාලකයාගෙන් අවසර ඉල්ලන්න.</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> විරාම කෙරේ</translation>
+<translation id="7517063221058203587">{0,plural, =1{උපාංගය 1 විනාඩියක් තුළ යාවත්කාලීන කරන්න}one{උපාංගය විනාඩි # ක් තුළ යාවත්කාලීන කරන්න}other{උපාංගය විනාඩි # ක් තුළ යාවත්කාලීන කරන්න}}</translation>
 <translation id="7520766081042531487">අප්‍රසිද්ධ ද්වාරය: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">"Ok Google" පවසන්න</translation>
 <translation id="7525067979554623046">නිර්මාණය කරන්න</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{තව 1 ක්}one{තව {NUM_DOWNLOADS} ක්}other{තව {NUM_DOWNLOADS} ක්}}</translation>
 <translation id="7529411698175791732">ඔබේ අන්තර්ජාල සබැඳුම පරීක්ෂා කරන්න. ප්‍රශ්නය දිගටම පැවතුණහොත්, වරා නැවත පිරීමට උත්සාහ කරන්න.</translation>
 <translation id="7530016656428373557">විසර්ජන අනුපාතය වොට් මගින්</translation>
 <translation id="7531779363494549572">සැකසීම් &gt; යෙදුම් සහ දැනුම්දීම් &gt; දැනුම්දීම් වෙත යන්න.</translation>
@@ -4976,6 +5017,7 @@
 <translation id="7765158879357617694">චලනය කරන්න</translation>
 <translation id="7766807826975222231">සංචාරයක් කරන්න</translation>
 <translation id="7766838926148951335">අවසර පිළිගන්න</translation>
+<translation id="7768770796815395237">වෙනස</translation>
 <translation id="7769672763586021400">ආදර්ශ ID</translation>
 <translation id="7770651108375708429">Wi-Fi එක විසන්ධි කරන්න</translation>
 <translation id="7771452384635174008">පැතිකඩ</translation>
@@ -5410,6 +5452,7 @@
 <translation id="8286963743045814739">ඔබට අප්‍රසිද්ධ කවුළුවක් භාවිතයෙන් රහසිගතව බ්‍රවුස් කළ හැක</translation>
 <translation id="8287902281644548111">API ඇමතුමට/URL එකට අනුව සොයන්න</translation>
 <translation id="8288032458496410887"><ph name="APP" /> අස්ථාපනය කරමින්...</translation>
+<translation id="8289128870594824098">තැටි ප්‍රමාණය</translation>
 <translation id="8291967909914612644">නිවෙස් සපයන්නාගේ රට</translation>
 <translation id="8294431847097064396">මූලාශ්‍රය</translation>
 <translation id="8297006494302853456">දුර්වලයි</translation>
@@ -5622,6 +5665,7 @@
 <translation id="8608618451198398104">Kerberos ප්‍රවේශපත්‍රයක් එක් කරන්න</translation>
 <translation id="8609465669617005112">ඉහළට යන්න</translation>
 <translation id="8610103157987623234">වැරදි ආකෘතිය, නැවත උත්සාහ කරන්න</translation>
+<translation id="8612935480510351790"><ph name="FILE_NAME" /> අනතුරුදායක විය හැක. ස්කෑන් කිරීම සඳහා Google ඉහළ ආරක්‍ෂාව වෙත යවන්නේද?</translation>
 <translation id="8613164732773110792">ඉංග්‍රීසි සිම්පල් අකුරු, අංක, පහත් ඉර, හෝ මැද ඉර පමණයි</translation>
 <translation id="8615618338313291042">ඉන්කග්නිටෝ යෙදු: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">පතිත ඡායාව</translation>
@@ -5649,6 +5693,7 @@
 <translation id="8641606876632989680">ඔබ සමථයට පත් වූ මුරපදයක් සමඟ පුරන විට Chrome ඔබට දැනුම් දෙයි</translation>
 <translation id="8642900771896232685">තත්පර 2ක්</translation>
 <translation id="8642947597466641025">පෙළ විශාල කරන්න</translation>
+<translation id="8643443571868262066"><ph name="FILE_NAME" /> අනතුරුදායක විය හැක. ස්කෑන් කිරීම සඳහා Google ඉහළ ආරක්‍ෂාව වෙත යවන්නේද?</translation>
 <translation id="8644655801811752511">මෙම ආරක්‍ෂක යතුර යළි සැකසිය නොහැක. ඔබ එය ඇතුළත් කළ පසු වහාම එය යළි සැකසීමට උත්සාහ කරන්න.</translation>
 <translation id="8645354835496065562">සංවේදක ප්‍රවේශයට දිගටම ඉඩ දෙන්න</translation>
 <translation id="8645920082661222035">අනතුරුදායක සිදුවීම් සිදු වීමට පෙර ඒවා පුරෝකථන කර ඔබට අවවාද කරයි</translation>
@@ -6069,6 +6114,7 @@
 <translation id="9169931577761441333">මුල් තිරය වෙත <ph name="APP_NAME" /> එක් කරන්න</translation>
 <translation id="9170848237812810038">&amp;පසුගමනය</translation>
 <translation id="9170884462774788842">වෙනත් වැඩසටහනක් Chrome  වැඩ කරන ආකාරය වෙනස් කළ හැකි තේමාවක් එකතු කරන ලදි.</translation>
+<translation id="917350715406657904">ඔබ ඔබේ මාපියන් <ph name="APP_NAME" /> සඳහා සකසා ඇති කාල සීමාවට ළඟා විය. ඔබට එය හෙට <ph name="TIME_LIMIT" />කට භාවිත කළ හැක.</translation>
 <translation id="9173995187295789444">බ්ලූටූත් උපාංග සඳහා ස්කෑන් කරමින්...</translation>
 <translation id="9174401638287877180">භාවිත සහ දෝෂ නිර්ණ දත්ත යවන්න. ස්වයංක්‍රියව රෝග විනිශ්චය, උපාංග සහ යෙදුම් භාවිත දත්ත Google වෙත යැවීමෙන් ඔබගේ දරුවාගේ Android අත්දැකීම වැඩි දියුණු කර ගැනීමට උපකාරී වන්න. මෙය ඔබේ දරුවා හඳුනා ගැනීමට භාවිත නොකෙරෙන අතර, පද්ධති සහ යෙදුම් ස්ථායිතාවට සහ අනෙකුත් වැඩිදියුණු කිරීම්වලට උදවු කරයි. සමහර එකතු කළ දත්ත Google යෙදුම්වලට සහ Android සංවර්ධකයින් වැනි හවුල්කරුවන්ට ද උදවු කරති. ඔබේ දරුවා සඳහා අමතර වෙබ් සහ යෙදුම් ක්‍රියාකාරකම් සැකසීම සක්‍රීය කර තිබේ නම්, මෙම දත්ත ඔවුන්ගේ Google ගිණුමට සුරැකිය හැක.</translation>
 <translation id="917510707618656279">වෙබ් අඩවියකට බ්ලූටූත් උපාංග වෙත පිවිසීමට අවශ්‍ය විටදී අසන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 8bbe8c45..27a8b89 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838">Súbor <ph name="FILE_NAME" /> zahŕňa citlivý obsah a bol zablokovaný.</translation>
 <translation id="1061904396131502319">Už je takmer čas na prestávku</translation>
+<translation id="1064552680598333868">Zmeny mikrofónu sa uplatnia po ďalšom reštartovaní systému Linux.</translation>
 <translation id="1067048845568873861">Vytvorené</translation>
 <translation id="1067291318998134776">Linux (Beta)</translation>
 <translation id="1067922213147265141">Ďalšie služby Googlu</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">Ak chcete požiadať o prístup, kontaktujte správcu tohto zariadenia.</translation>
 <translation id="1149401351239820326">Mesiac vypršania platnosti</translation>
 <translation id="1150565364351027703">Slnečné okuliare</translation>
+<translation id="1151841030700667295">Systém vás odhlási zo všetkých webov (aj v otvorených kartách).</translation>
 <translation id="1151917987301063366">Vždy povoliť webu <ph name="HOST" /> prístup k senzorom</translation>
 <translation id="1153356358378277386">Spárované zariadenia</translation>
 <translation id="1153636665119721804">Program rozšírenej ochrany Google</translation>
@@ -188,7 +190,6 @@
 <translation id="1241753985463165747">Čítať a meniť všetky údaje na aktuálnom webe (po vyvolaní)</translation>
 <translation id="1242633766021457174">Nástroj <ph name="THIRD_PARTY_TOOL_NAME" /> chce resetovať vaše nastavenia.</translation>
 <translation id="1243314992276662751">Nahrať</translation>
-<translation id="1243398753772016127">Weby nemôžu prispôsobovať reklamy na základe vašej aktivity prehliadania na rôznych stránkach</translation>
 <translation id="1244265436519979884">Prebieha obnovenie systému Linux</translation>
 <translation id="1244303850296295656">Chyba rozšírenia</translation>
 <translation id="1246905108078336582">Chcete odstrániť návrh zo schránky?</translation>
@@ -280,6 +281,7 @@
 <translation id="1386387014181100145">Dobrý deň!</translation>
 <translation id="138784436342154190">Obnoviť predvolenú stránku pri spustení?</translation>
 <translation id="1390548061267426325">Otvoriť ako bežnú kartu</translation>
+<translation id="1392232653471491344">Vyžaduje sa reštartovanie systému LInux</translation>
 <translation id="1393283411312835250">Slnko a mraky</translation>
 <translation id="1393787139683794508">Týmto vymažete všetky dáta a súbory cookie uložené zdrojom <ph name="ORIGIN_NAME" />.</translation>
 <translation id="1395730723686586365">Služba Updater bola spustená</translation>
@@ -308,6 +310,7 @@
 <translation id="1420920093772172268">Ak chcete povoliť párovanie, <ph name="TURN_ON_BLUETOOTH_LINK" /></translation>
 <translation id="1422159345171879700">Načítať nebezpečné skripty</translation>
 <translation id="1426410128494586442">Áno</translation>
+<translation id="142655739075382478">Aplikácia <ph name="APP_NAME" /> je blokovaná</translation>
 <translation id="1426870617281699524">Kliknite na možnosť Skúsiť znova a potvrďte výzvu v počítači</translation>
 <translation id="1427269577154060167">Krajina</translation>
 <translation id="142758023928848008">Povoliť funkciu Jedným prstom (umožňuje uskutočňovať klávesové skratky ich postupným zadávaním)</translation>
@@ -346,6 +349,7 @@
 <translation id="1476607407192946488">&amp;Nastavenia jazyka</translation>
 <translation id="1478340334823509079">Podrobnosti: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Inštalácia nie je povolená</translation>
+<translation id="1481537595330271162">Pri menení veľkosti disku sa vyskytla chyba</translation>
 <translation id="1482626744466814421">Pridať kartu medzi záložky…</translation>
 <translation id="1483493594462132177">Odoslať</translation>
 <translation id="1484979925941077974">Web používa Bluetooth</translation>
@@ -355,7 +359,6 @@
 <translation id="1487335504823219454">Zapnutá – vlastné nastavenia</translation>
 <translation id="1489664337021920575">Vybrať inú možnosť</translation>
 <translation id="1493892686965953381">Čakanie na <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Vymazať tiež dáta prehliadania (<ph name="URL" />), po čom vás môže systém odhlásiť z domény Google.com.</translation>
 <translation id="1495486559005647033">Ďalšie dostupné zariadenia: <ph name="NUM_PRINTERS" /></translation>
 <translation id="1495677929897281669">Späť na kartu</translation>
 <translation id="1499271269825557605">Ak nespoznávate určité rozšírenie alebo prehliadač nefunguje očakávaným spôsobom, na tejto stránke môžete vypnúť alebo prispôsobiť rozšírenia.</translation>
@@ -607,6 +610,7 @@
 <translation id="1805822111539868586">Skontrolovať zobrazenia</translation>
 <translation id="1805888043020974594">Tlačový server</translation>
 <translation id="1805967612549112634">Potvrdenie kódu PIN</translation>
+<translation id="1806335016774576568">Prepnúť na inú otvorenú aplikáciu</translation>
 <translation id="1809734401532861917">Pridať záložky, históriu, heslá a ďalšie nastavenia do účtu <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="1813278315230285598">Služby</translation>
 <translation id="18139523105317219">Názov strany EDI</translation>
@@ -693,6 +697,7 @@
 <translation id="1921050530041573580">Spárujte si telefón so Správami</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Otvoriť pomocou</translation>
+<translation id="1925017091976104802">Prilepte stlačením klávesa <ph name="MODIFIER_KEY_DESCRIPTION" /></translation>
 <translation id="1925021887439448749">Zadajte vlastnú webovú adresu</translation>
 <translation id="1925124445985510535">Kontrola bezpečnosti prebehla o <ph name="TIME" /></translation>
 <translation id="1926339101652878330">Tieto nastavenia sú riadené podnikovými pravidlami. Ďalšie informácie získate od správcu.</translation>
@@ -838,6 +843,7 @@
 <translation id="2135787500304447609">&amp;Obnoviť</translation>
 <translation id="2136372518715274136">Zadajte nové heslo</translation>
 <translation id="2136476978468204130">Zadaná prístupová fráza je nesprávna</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{Súbory cookie sú blokované.}=1{Súbory cookie sú blokované, 1 výnimka}few{Súbory cookie sú blokované, {COUNT} výnimky}many{Cookies are blocked, {COUNT} exceptions}other{Súbory cookie sú blokované, {COUNT} výnimiek}}</translation>
 <translation id="2138398485845393913">Stále prebieha pripájanie k zariadeniu <ph name="DEVICE_NAME" /></translation>
 <translation id="2139545522194199494"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, sila signálu <ph name="SIGNAL_STRENGTH" /> %, ovládaná správcom, pripojenie</translation>
 <translation id="2139919072249842737">Tlačidlo nastavenia</translation>
@@ -1005,11 +1011,13 @@
 <translation id="2346953515226895098">Služba SODA</translation>
 <translation id="2347644257713614136">Používanie služieb Hangouts a Cast for Education sa riadi pravidlami ochrany súkromia spoločnosti Google.</translation>
 <translation id="2348176352564285430">Aplikácia: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Chyba pri načítavaní údajov</translation>
 <translation id="2349896577940037438">Ak aktivujete ďalšiu aktivitu na internete a v aplikáciách, tieto údaje sa uložia vo vašom účte Google. Môžete ich zobraziť a odstrániť na account.google.com, kde tiež môžete zmeniť nastavenia účtu.</translation>
 <translation id="2350133097354918058">Znovu načítané</translation>
 <translation id="2350182423316644347">Inicializujú sa aplikácie...</translation>
 <translation id="2350796302381711542">Chcete povoliť obslužnému nástroju <ph name="HANDLER_HOSTNAME" /> otvárať všetky odkazy s protokolom <ph name="PROTOCOL" /> (namiesto obslužného nástroja <ph name="REPLACED_HANDLER_TITLE" />)?</translation>
 <translation id="2351266942280602854">Jazyk a vstup</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 položka}few{{NUM_ITEMS} položky}many{{NUM_ITEMS} položky}other{{NUM_ITEMS} položiek}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Poznámky na uzamknutej obrazovke sa automaticky ukladajú do aplikácie <ph name="LOCK_SCREEN_APP_NAME" />. Na uzamknutej obrazovke zostane posledná poznámka.</translation>
 <translation id="2353297238722298836">Kamera a mikrofón sú povolené</translation>
@@ -1043,6 +1051,7 @@
 <translation id="2392369802118427583">Aktivovať</translation>
 <translation id="2394566832561516196">Pri ďalšom opätovnom načítaní budú nastavenia vymazané.</translation>
 <translation id="2395616325548404795">Zariadenie <ph name="DEVICE_TYPE" /> bolo úspešne zaregistrované na podnikovú správu. Nepodarilo sa však odoslať informácie o obsahu a polohe. Zadajte tieto informácie ručne v Správcovskej konzole pre toto zariadenie.</translation>
+<translation id="2396387085693598316">Váš správca zablokoval <ph name="EXTENSION_NAME" /></translation>
 <translation id="2396783860772170191">Zadajte štvorciferný PIN (0000 – 9999)</translation>
 <translation id="2399939490305346086">Prihlasovacie údaje bezpečnostného kľúča</translation>
 <translation id="2400664245143453337">Vyžaduje sa okamžitá aktualizácia</translation>
@@ -1189,7 +1198,6 @@
 <translation id="2575247648642144396">Ikona sa zobrazí, keď sa na aktuálnej stránke bude dať použiť rozšírenie. Rozšírenie použijete kliknutím na ikonu alebo stlačením klávesov <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Nastaviť ako Chromebox pre videokonferencie</translation>
 <translation id="2580889980133367162">Vždy povoliť hostiteľovi <ph name="HOST" /> sťahovať viacero súborov</translation>
-<translation id="2580924999637585241">Celkom: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dlhé</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Tiket Kerberos nie je možné získať. Vyskúšajte to znova alebo kontaktujte správcu zariadení organizácie. (Kód chyby: <ph name="ERROR_CODE" />).</translation>
@@ -1330,6 +1338,7 @@
 <translation id="2753677631968972007">Ručne ovládať povolenia webu</translation>
 <translation id="2755367719610958252">Spravovať funkcie dostupnosti</translation>
 <translation id="275662540872599901">obrazovka je vypnutá</translation>
+<translation id="2757338480560142065">Ukladané heslo sa musí zhodovať s tým, ktoré používate pre web <ph name="WEBSITE" />.</translation>
 <translation id="2762441749940182211">Kamera je zablokovaná</translation>
 <translation id="2765217105034171413">Malé</translation>
 <translation id="2766161002040448006">Opýtať sa rodiča</translation>
@@ -1582,6 +1591,7 @@
 <translation id="3090819949319990166">Externý súbor crx nie je možné skopírovať do súboru <ph name="TEMP_CRX_FILE" /></translation>
 <translation id="3090871774332213558">Zariadenie „<ph name="DEVICE_NAME" />“ bolo spárované</translation>
 <translation id="3092699946856346803">Vložte SIM kartu a skúste to znova</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 potenciálne škodlivé rozšírenie je vypnuté. Môžete ho tiež odstrániť.}few{{NUM_EXTENSIONS} potenciálne škodlivé rozšírenia sú vypnuté. Môžete ich tiež odstrániť.}many{{NUM_EXTENSIONS} potentially harmful extensions are off. You can also remove them.}other{{NUM_EXTENSIONS} potenciálne škodlivých rozšírení je vypnutých. Môžete ich tiež odstrániť.}}</translation>
 <translation id="3101709781009526431">Dátum a čas</translation>
 <translation id="3103941660000130485">Chyba pri inovovaní systému Linux</translation>
 <translation id="310671807099593501">Web používa Bluetooth</translation>
@@ -1656,6 +1666,7 @@
 <translation id="3201422919974259695">Tu sa budú zobrazovať dostupné zariadenia USB.</translation>
 <translation id="3202131003361292969">Cesta</translation>
 <translation id="3202173864863109533">Zvuk tejto karty bol stlmený.</translation>
+<translation id="3208321278970793882">Aplikácia</translation>
 <translation id="3208584281581115441">Skontrolovať</translation>
 <translation id="3208703785962634733">Nepotvrdené</translation>
 <translation id="32101887417650595">K tlačiarni sa nepodarilo pripojiť</translation>
@@ -1676,6 +1687,7 @@
 <translation id="3239373508713281971">Bol odstránený časový limit pre aplikáciu <ph name="APP_NAME" /></translation>
 <translation id="3241680850019875542">Vyberte koreňový adresár rozšírenia, ktoré chcete zbaliť. Ak chcete rozšírenie aktualizovať, vyberte tiež súbor súkromného kľúča, ktorý sa má znova použiť.</translation>
 <translation id="3244294424315804309">Ponechať zvuk vypnutý</translation>
+<translation id="3246107497225150582">{0,plural, =1{Aktualizujte zariadenie do jedného dňa}few{Aktualizujte zariadenie # dní}many{Aktualizujte zariadenie # dňa}other{Aktualizujte zariadenie # dní}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Chyba siete</translation>
 <translation id="3248902735035392926">Na bezpečnosti záleží. Strávte chvíľu <ph name="BEGIN_LINK" />kontrolou rozšírení<ph name="END_LINK" />.</translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1762,6 +1774,7 @@
 <translation id="3356580349448036450">Dokončené</translation>
 <translation id="3359256513598016054">Obmedzenia certifikačnej politiky</translation>
 <translation id="3360297538363969800">Tlač zlyhala. Skontrolujte tlačiareň a skúste to znova.</translation>
+<translation id="3364986687961713424">Od správcu: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Použite Ctrl alebo Alt</translation>
 <translation id="3367047597842238025">Nastavte si zariadenie <ph name="DEVICE_TYPE" /> podľa svojich predstáv a objavte všetky úžasné možnosti, ktoré vám prináša.</translation>
 <translation id="3368922792935385530">Pripojené</translation>
@@ -1866,6 +1879,7 @@
 <translation id="3496213124478423963">Oddialiť</translation>
 <translation id="3497560059572256875">Zdieľať doodle</translation>
 <translation id="3498215018399854026">V tejto chvíli sa nám nepodarilo spojiť s vaším rodičom. Skúste to znova neskôr.</translation>
+<translation id="3500417806337761827">Chyba pri inštalácií zdieľaného priestoru. Už je nainštalovaných príliš veľa zdieľaných priestorov SMB.</translation>
 <translation id="3505030558724226696">Odvolať prístup k zariadeniam</translation>
 <translation id="3507421388498836150">Aktuálne povolenia pre rozšírenie <ph name="EXTENSION_NAME" /></translation>
 <translation id="3507888235492474624">Znova vyhľadať zariadenia Bluetooth</translation>
@@ -1931,6 +1945,7 @@
 <translation id="3592260987370335752">&amp;Viac informácií</translation>
 <translation id="359283478042092570">Vstúpiť</translation>
 <translation id="3593965109698325041">Obmedzenia názvu certifikátu</translation>
+<translation id="3595381248165458839">Kontaktujte správcu zariadení organizácie</translation>
 <translation id="3596235046596950091">Povoliť cloudové služby</translation>
 <translation id="3596414637720633074">Blokovať súbory cookie tretích strán v anonymnom režime</translation>
 <translation id="3599221874935822507">Reliéf</translation>
@@ -2064,6 +2079,7 @@
 <translation id="3742666961763734085">Nepodarilo sa nájsť organizačnú jednotku s daným názvom. Skúste to znova.</translation>
 <translation id="3744111561329211289">Synchronizácia na pozadí</translation>
 <translation id="3746127522257263495">Pridanie účtu G Suite for Education do aplikácií pre Android nie je podporované.</translation>
+<translation id="3747039297326604768">Plugin VM sa nepodarilo otvoriť</translation>
 <translation id="3747077776423672805">Ak chcete odstrániť aplikácie, prejdite do časti Nastavenia &gt; Obchod Google Play &gt; Spravovať predvoľby Androidu &gt; Aplikácie alebo Správca aplikácií. Potom klepnite na aplikáciu, ktorú chcete odinštalovať (možno budete musieť aplikáciu nájsť potiahnutím prstom doľava alebo doprava). Potom klepnite na možnosť Odinštalovať alebo Deaktivovať.</translation>
 <translation id="3748026146096797577">Nepripojené</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2139,6 +2155,7 @@
 <translation id="3827774300009121996">&amp;Celá obrazovka</translation>
 <translation id="3828029223314399057">Prehľadať záložky</translation>
 <translation id="3829765597456725595">Zdieľané úložisko SMB</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Váš správca znova zapol 1 potenciálne škodlivé rozšírenie}few{Váš správca znova zapol {NUM_EXTENSIONS} potenciálne škodlivé rozšírenia}many{Your administrator turned {NUM_EXTENSIONS} potentially harmful extensions back on}other{Váš správca znova zapol {NUM_EXTENSIONS} potenciálnych škodlivých rozšírení}}</translation>
 <translation id="3831436149286513437">Návrhy vyhľadávania z Disku Google</translation>
 <translation id="383161972796689579">Vlastník tohto zariadenia zakázal pridávanie nových používateľov</translation>
 <translation id="3834775135533257713">Aplikáciu <ph name="TO_INSTALL_APP_NAME" /> sa nepodarilo pridať, pretože je v konflikte s aplikáciou <ph name="INSTALLED_APP_NAME" />.</translation>
@@ -2315,6 +2332,7 @@
 <translation id="4047726037116394521">Prejsť na plochu</translation>
 <translation id="4050225813016893843">Spôsob overenia</translation>
 <translation id="4052120076834320548">Drobné</translation>
+<translation id="4056908315660577142">Vypršal časový limit, ktorý tvoj rodič nastavil pre aplikáciu pre Chrome <ph name="APP_NAME" />. Zajtra ju môžeš používať <ph name="TIME_LIMIT" />.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> – <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">Zobraziť v Obchode</translation>
 <translation id="4058647953897694817">Overiť prostredníctvom rozhrania Bluetooth</translation>
@@ -2446,6 +2464,7 @@
 <translation id="424963718355121712">Aplikácie musia byť poskytované od hostiteľa, ktorého ovplyvňujú</translation>
 <translation id="4250229828105606438">Snímka obrazovky</translation>
 <translation id="4250680216510889253">Nie</translation>
+<translation id="4252035718262427477">Webová stránka, jeden súbor (webový balík)</translation>
 <translation id="4252852543720145436">Identifikátory chráneného obsahu</translation>
 <translation id="4252899949534773101">Rozhranie Bluetooth je zakázané</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> – Bol zdieľaný obsah karty</translation>
@@ -2541,6 +2560,7 @@
 <translation id="4400963414856942668">Kartu uložíte ako záložku kliknutím na hviezdičku</translation>
 <translation id="4403775189117163360">Vybrať iný priečinok</translation>
 <translation id="4404136731284211429">Znova skontrolovať</translation>
+<translation id="4404843640767531781">Aplikáciu <ph name="APP_NAME" /> zablokoval tvoj rodič. Ak chceš používať túto aplikáciu, požiadaj rodiča o povolenie.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">P&amp;omocník</translation>
 <translation id="4409697491990005945">Okraje</translation>
@@ -2610,6 +2630,7 @@
 <translation id="450099669180426158">Ikona Výkričník</translation>
 <translation id="4501530680793980440">Potvrdiť odstránenie</translation>
 <translation id="4502423230170890588">Odstrániť z tohto zariadenia</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{Súbory cookie sú povolené}=1{Súbory cookie sú povolené, 1 výnimka}few{Súbory cookie sú povolené, {COUNT} výnimky}many{Cookies are allowed, {COUNT} exceptions}other{Súbory cookie sú povolené, {COUNT} výnimiek}}</translation>
 <translation id="4504940961672722399">Rozšírenie použijete stlačením klávesov <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="4508051413094283164">Otvoriť všetky v okne inkognito</translation>
 <translation id="4508265954913339219">Aktivácia zlyhala</translation>
@@ -2723,6 +2744,7 @@
 <translation id="465878909996028221">Presmerovania prehliadača podporujú iba protokoly http, https a file.</translation>
 <translation id="4659077111144409915">Primárny účet</translation>
 <translation id="4660476621274971848">Očakávaná verzia bola „<ph name="EXPECTED_VERSION" />“. Skutočná verzia bola „<ph name="NEW_ID" />“.</translation>
+<translation id="4660540330091848931">Mení sa veľkosť</translation>
 <translation id="4660838440047236328">rozložení vašej miestnosti.</translation>
 <translation id="4661407454952063730">Dáta aplikácií môžu byť ľubovoľné údaje uložené aplikáciou (na základe nastavení vývojára) vrátane údajov, ako sú kontakty, správy a fotky.</translation>
 <translation id="4661931051827810091">Odosiela anonymné webové adresy niektorých navštívených stránok, obmedzené informácie o systéme a určitý obsah stránok, aby pomáhalo objavovať a blokovať nové hrozby pre všetkých používateľov na internete.</translation>
@@ -2818,7 +2840,6 @@
 <translation id="4808667324955055115">Boli zablokované kontextové okná:</translation>
 <translation id="480990236307250886">Otvoriť domovskú stránku</translation>
 <translation id="4811503964269049987">Zoskupiť vybrané karty</translation>
-<translation id="4811818760963189951">Vypnuté, pretože ste deaktivovali synchronizáciu histórie</translation>
 <translation id="4813136279048157860">Moje obrázky</translation>
 <translation id="4813512666221746211">Chyba siete</translation>
 <translation id="4814378367953456825">Pomenujte tento odtlačok prsta</translation>
@@ -2907,6 +2928,7 @@
 <translation id="4918086044614829423">Prijať</translation>
 <translation id="4918221908152712722">Nainštalujte si <ph name="APP_NAME" /> (bez nutnosti stiahnutia)</translation>
 <translation id="4920887663447894854">Tieto webové stránky majú zablokované sledovanie vašej polohy na tejto stránke:</translation>
+<translation id="49226369361073053">{0,plural, =0{Ihneď aktualizujte zariadenie}=1{Update device within 1 second}few{Aktualizujte zariadenie do # sekúnd}many{Aktualizujte zariadenie do # sekundy}other{Aktualizujte zariadenie do # sekúnd}}</translation>
 <translation id="492299503953721473">Odstrániť aplikácie pre Android</translation>
 <translation id="4923279099980110923">Áno, chcem pomôcť</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2987,7 +3009,6 @@
 <translation id="5040823038948176460">Ďalšie nastavenia obsahu</translation>
 <translation id="5042282098504489593">Ak chcete pripojiť zariadenie <ph name="USB_DEVICE_NAME" /> k systému Linux, otvorte Nastavenia</translation>
 <translation id="5043913660911154449">Prípadne špecifikuje PPD svojej tlačiarne <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Vypnuté, pretože ste zašifrovali údaje synchronizácie prístupovou frázou</translation>
 <translation id="5045550434625856497">Nesprávne heslo</translation>
 <translation id="504561833207953641">Otvára sa v existujúcej relácii prehliadača.</translation>
 <translation id="5047421709274785093">Zakázať webom používať senzory pohybu a svetla</translation>
@@ -3058,6 +3079,7 @@
 <translation id="5135085122826131075">Aktivujte svojho Asistenta vyslovením výrazu „OK Google“.</translation>
 <translation id="5135533361271311778">Nepodarilo sa vytvoriť položku záložiek</translation>
 <translation id="5137501176474113045">Odstrániť túto položku</translation>
+<translation id="5138982052046316113">Zmena veľkosti disku Linux</translation>
 <translation id="5139112070765735680"><ph name="QUERY_NAME" />, vyhľadávanie vo vyhľadávači <ph name="DEFAULT_SEARCH_ENGINE_NAME" /></translation>
 <translation id="5139823398361067371">Zadajte kód PIN bezpečnostného kľúča Ak si ho nepamätáte, budete musieť bezpečnostný kľúč resetovať.</translation>
 <translation id="5139955368427980650">&amp;Otvoriť</translation>
@@ -3142,7 +3164,7 @@
 <translation id="5260508466980570042">Vašu e-mailovú adresu alebo vaše heslo sa nepodarilo overiť. Skúste to znova.</translation>
 <translation id="5261683757250193089">Otvoriť v Internetovom obchode</translation>
 <translation id="5262178194499261222">Odstrániť heslo</translation>
-<translation id="5263468185123738872">Spustite Plugin VM a nainštalujte si tak operačný systém pre hostí</translation>
+<translation id="5263468185123738872">Spustite Plugin VM a nainštalujte si tak operačný systém pre hostí.</translation>
 <translation id="5264148714798105376">Môže to chvíľu trvať.</translation>
 <translation id="5264252276333215551">Ak chcete aplikáciu spustiť v režime verejného terminálu, pripojte sa k internetu.</translation>
 <translation id="5265562206369321422">Offline viac ako týždeň</translation>
@@ -3214,6 +3236,7 @@
 <translation id="5353252989841766347">Export hesiel z Chromu</translation>
 <translation id="5355099869024327351">Umožnite Asistentovi zobrazovať vám upozornenia</translation>
 <translation id="5355926466126177564">Rozšírenie „<ph name="EXTENSION_NAME" />“ zmenilo stránku, ktorá sa zobrazí pri vyhľadávaní pomocou všeobecného poľa.</translation>
+<translation id="535911077628776608">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný. Chcete ho odoslať na kontrolu do rozšírenej ochrany Googlu? Stláčaním klávesov Shift + F6 prejdite do oblasti panela so stiahnutými súbormi.</translation>
 <translation id="5359910752122114278">1 výsledok</translation>
 <translation id="5360150013186312835">Zobraziť na paneli s nástrojmi</translation>
 <translation id="5362741141255528695">Vybrať súbor súkromného kľúča.</translation>
@@ -3352,6 +3375,7 @@
 <translation id="5539221284352502426">Zadané heslo bolo zamietnuté serverom. Možné dôvody: Heslo je príliš krátke. Heslo musí obsahovať čísla alebo symboly. Heslo sa musí odlišovať od predchádzajúcich hesiel.</translation>
 <translation id="5541694225089836610">Správca akciu zakázal</translation>
 <translation id="5542132724887566711">Profil</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> požaduje, aby ste toto zariadenie ihneď aktualizovali.</translation>
 <translation id="5542750926112347543">Boli zablokované súbory cookie z domény <ph name="DOMAIN" /></translation>
 <translation id="5542949973455282971">Pripája sa k operátorovi <ph name="CARRIER_NAME" /></translation>
 <translation id="5543983818738093899">Kontroluje sa stav...</translation>
@@ -3397,6 +3421,7 @@
 <translation id="5593357315997824387">Synchronizovať moje súbory</translation>
 <translation id="5595152862129936745">Veľmi ďaleko</translation>
 <translation id="5595485650161345191">Upraviť adresu</translation>
+<translation id="5595727715083333657">Váš kontajner nepodporuje zmenu veľkosti. Ak chcete upraviť priestor, ktorý bol vopred pridelený systému Linux (Beta), vytvorte zálohu a potom ju obnovte do nového kontajnera.</translation>
 <translation id="5596627076506792578">Ďalšie možnosti</translation>
 <translation id="5600706100022181951">Aktualizácia bude stiahnutá použitím <ph name="UPDATE_SIZE_MB" /> MB mobilných dát. Chcete pokračovať?</translation>
 <translation id="5601503069213153581">Kód PIN</translation>
@@ -3469,6 +3494,7 @@
 <translation id="5691511426247308406">Rodina</translation>
 <translation id="5691772641933328258">Odtlačok prsta nebol rozpoznaný</translation>
 <translation id="5692183275898619210">Tlač je dokončená</translation>
+<translation id="5692875591060376599">Vybraný súbor je neznámy a môže byť nebezpečný. Chcete ho odoslať na kontrolu do rozšírenej ochrany Googlu?</translation>
 <translation id="569425414730375234">Aktuálna relácia anonymného režimu: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">Nahlásiť obťažovanie rozšírením <ph name="EXTENSION_NAME" /></translation>
 <translation id="5696679855467848181">Aktuálny používaný súbor PPD: <ph name="PPD_NAME" /></translation>
@@ -3680,6 +3706,7 @@
 <translation id="5976160379964388480">Ostatné</translation>
 <translation id="5978277834170881274">&amp;Použiť základnú kontrolu pravopisu</translation>
 <translation id="5979084224081478209">Skontrolovať heslá</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{Znova ste zapli 1 potenciálne škodlivé rozšírenie}few{Znova ste zapli {NUM_EXTENSIONS} potenciálne škodlivé rozšírenia}many{You turned {NUM_EXTENSIONS} potentially harmful extensions back on}other{Znova ste zapli {NUM_EXTENSIONS} potenciálnych škodlivých rozšírení}}</translation>
 <translation id="5979421442488174909">&amp;Preložiť do jazyka <ph name="LANGUAGE" /></translation>
 <translation id="5979469435153841984">Stránky uložíte ako záložky kliknutím na hviezdičku v paneli s adresou</translation>
 <translation id="5984222099446776634">Nedávno navštívené</translation>
@@ -3930,6 +3957,7 @@
 <translation id="6309510305002439352">Mikrofón je vypnutý</translation>
 <translation id="6311220991371174222">Chrome nie je možné spustiť, pretože pri otváraní profilu nastala chyba. Skúste Chrome reštartovať.</translation>
 <translation id="6312403991423642364">Neznáma chyba siete</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Kontrola bezpečnosti prebehla pred 1 dňom}few{Kontrola bezpečnosti prebehla pred {NUM_DAYS} dňami}many{Kontrola bezpečnosti prebehla pred {NUM_DAYS} dňa}other{Kontrola bezpečnosti prebehla pred {NUM_DAYS} dňami}}</translation>
 <translation id="6312638141433622592">Ponúkať zobrazenie článkov v režime čítačky (ak je podporované)</translation>
 <translation id="6313641880021325787">UKONČIŤ VR</translation>
 <translation id="6314819609899340042">Na tomto zariadení <ph name="IDS_SHORT_PRODUCT_NAME" /> ste úspešne aktivovali funkcie ladenia.</translation>
@@ -3945,6 +3973,7 @@
 <translation id="6325191661371220117">Zakázať automatické spúšťanie</translation>
 <translation id="6326175484149238433">Odstrániť z Chromu</translation>
 <translation id="6326855256003666642">Počet akcií zabraňujúcich ukončeniu</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> požaduje, aby ste toto zariadenie aktualizovali do stanoveného termínu.</translation>
 <translation id="6327785803543103246">Automatické zisťovanie webového proxy servera</translation>
 <translation id="6333064448949140209">Súbor bude odoslaný Googlu na účely ladenia</translation>
 <translation id="6339668969738228384">Vytvoriť nový profil pre používateľa <ph name="USER_EMAIL_ADDRESS" /></translation>
@@ -3964,7 +3993,6 @@
 <translation id="63566973648609420">Š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 <ph name="BEGIN_LINK" />resetovať synchronizáciu<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Vítame vás do rodiny produktov <ph name="SHORT_PRODUCT_NAME" />. Toto nie je obyčajný počítač.</translation>
 <translation id="6358884629796491903">Drak</translation>
-<translation id="6360719647236334056">Prispôsobovať Vyhľadávanie, reklamy a ďalšie služby Googlu pomocou histórie prehliadania Chromu</translation>
 <translation id="6361850914223837199">Podrobnosti chyby:</translation>
 <translation id="6362853299801475928">Nahlásenie p&amp;roblému...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3972,11 +4000,13 @@
 <translation id="6366190659675876144">Štandardná ochrana</translation>
 <translation id="636850387210749493">Registrácia podniku</translation>
 <translation id="6370021412472292592">Manifest sa nepodarilo načítať.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Zmeniť heslo}few{Zmeniť heslá}many{Zmeniť heslá}other{Zmeniť heslá}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Skúsiť znova</translation>
 <translation id="6377268785556383139">1 výsledok pre hľadaný výraz „<ph name="SEARCH_TEXT" />“</translation>
 <translation id="6380143666419481200">Súhlasím, pokračovať</translation>
 <translation id="6384275966486438344">Zmeniť nastavenia vyhľadávania na: <ph name="SEARCH_HOST" /></translation>
+<translation id="6385149369087767061">Pripojte sa k internetu a skúste to znova</translation>
 <translation id="6385543213911723544">Webové stránky môžu ukladať a čítať údaje súborov cookie</translation>
 <translation id="6386099547750337629">Ak ide o neočakávané správanie, kontaktujte podporu.</translation>
 <translation id="6387674443318562538">Rozdeliť zvislo</translation>
@@ -4013,7 +4043,7 @@
 <translation id="642469772702851743">Toto zariadenie (sériové číslo: <ph name="SERIAL_NUMBER" />) uzamkol jeho vlastník.</translation>
 <translation id="6426200009596957090">Otvoriť nastavenia ChromeVox</translation>
 <translation id="6428450836711225518">Overenie telefónneho čísla</translation>
-<translation id="6428982734197629783">Spracúva sa obrázok…</translation>
+<translation id="6428982734197629783">Obrázok sa spracúva</translation>
 <translation id="6429384232893414837">Chyba aktualizácie</translation>
 <translation id="6430814529589430811">ASCII s kódovaním Base64, jeden certifikát</translation>
 <translation id="6431347207794742960">Prehliadač <ph name="PRODUCT_NAME" /> nastaví automatické aktualizácie pre všetkých používateľov tohto počítača.</translation>
@@ -4055,6 +4085,7 @@
 <translation id="6478248366783946499">Ponechať nebezpečný súbor?</translation>
 <translation id="6483485061007832714">Otvorenie stiahnutého súboru</translation>
 <translation id="6483805311199035658">Otváranie súboru <ph name="FILE" />...</translation>
+<translation id="6485092675191826776">Platnosť licencie Plugin VM vypršala</translation>
 <translation id="6488384360522318064">Výber jazyka</translation>
 <translation id="648927581764831596">Nie je k dispozícii</translation>
 <translation id="6490471652906364588">Zariadenie USB-C (port vpravo)</translation>
@@ -4242,9 +4273,9 @@
 <translation id="6758056191028427665">Dajte nám tak vedieť, ako sa nám darí v našom úsilí.</translation>
 <translation id="6759193508432371551">Obnovenie výrobných nastavení</translation>
 <translation id="6762833852331690540">Zapnuté</translation>
-<translation id="6764693078871405569">Vymazať tiež dáta prehliadania (<ph name="URL" />), po čom vás systém odhlási z domény <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Vybrať iný jazyk…</translation>
 <translation id="6767639283522617719">Nepodarilo sa pripojiť k doméne. Skontrolujte, či sú nastavenia organizačnej jednotky správne.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> odporúča, aby ste toto zariadenie aktualizovali.</translation>
 <translation id="6769712124046837540">Pridáva sa tlačiareň...</translation>
 <translation id="6770602306803890733">Zvyšuje zabezpečenie pre vás aj ostatných na internete</translation>
 <translation id="6770664076092644100">Overiť prostredníctvom NFC</translation>
@@ -4377,6 +4408,7 @@
 <translation id="6943836128787782965">Príkaz get protokolu HTTP zlyhal</translation>
 <translation id="6945221475159498467">Vybrať</translation>
 <translation id="694592694773692225">Presmerovanie bolo zablokované na tejto stránke.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 prelomené heslo}few{{NUM_PASSWORDS} prelomené heslá}many{{NUM_PASSWORDS} compromised passwords}other{{NUM_PASSWORDS} prelomených hesiel}}</translation>
 <translation id="6949434160682548041">Heslo (voliteľné)</translation>
 <translation id="6950627417367801484">Obnoviť aplikácie</translation>
 <translation id="6950943362443484797">Aplikáciu pre vás nainštalujeme</translation>
@@ -4461,6 +4493,7 @@
 <translation id="7053983685419859001">Blokovať</translation>
 <translation id="7055152154916055070">Presmerovanie bolo zablokované:</translation>
 <translation id="7056526158851679338">&amp;Preskúmať zariadenia</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Kontrola bezpečnosti prebehla pred 1 minútou}few{Kontrola bezpečnosti prebehla pred {NUM_MINS} minútami}many{Kontrola bezpečnosti prebehla pred {NUM_MINS} minúty}other{Kontrola bezpečnosti prebehla pred {NUM_MINS} minútami}}</translation>
 <translation id="7057767408836081338">Dáta aplikácie sa nepodarilo získať. Napriek tomu sa aplikáciu pokúsime spustiť…</translation>
 <translation id="7059858479264779982">Nastaviť na automatické spúšťanie</translation>
 <translation id="7059893117020417984">Ak chcete prehliadať v súkromí, otvorte okno inkognito klepnutím na ponuku s ikonou bodiek</translation>
@@ -4704,6 +4737,7 @@
 <translation id="7371006317849674875">Čas začiatku</translation>
 <translation id="7371490947952970241">Nastavenie Poloha môžete deaktivovať vypnutím hlavného nastavenia Poloha v tomto zariadení. V nastaveniach polohy môžete tiež vypnúť určovanie polohy pomocou siete Wi‑Fi, mobilnej siete a senzorov.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Aktualizujte zariadenie do hodiny}few{Aktualizujte zariadenie do # hodín}many{Aktualizujte zariadenie do # hodiny}other{Aktualizujte zariadenie do # hodín}}</translation>
 <translation id="7376553024552204454">Zvýrazňovať kurzor myši, keď sa hýbe</translation>
 <translation id="7377451353532943397">Naďalej blokovať prístup k senzorom</translation>
 <translation id="73786666777299047">Otvoriť Internetový obchod Chrome</translation>
@@ -4721,6 +4755,7 @@
 <translation id="7400418766976504921">Webová adresa</translation>
 <translation id="7400839060291901923">Nastavenie pripojenia v telefóne <ph name="PHONE_NAME" /></translation>
 <translation id="7401778920660465883">Zrušiť túto správu</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Kontrola bezpečnosti prebehla pred hodinou}few{Kontrola bezpečnosti prebehla pred {NUM_HOURS} hodinami}many{Kontrola bezpečnosti prebehla pred {NUM_HOURS} hodiny}other{Kontrola bezpečnosti prebehla pred {NUM_HOURS} hodinami}}</translation>
 <translation id="740624631517654988">Zablokované vyskakovacie okno</translation>
 <translation id="7407430846095439694">Importovať a spojiť</translation>
 <translation id="7407504355934009739">Väčšina ľudí blokuje upozornenia z tohto webu</translation>
@@ -4751,6 +4786,7 @@
 <translation id="7441830548568730290">Ostatní používatelia</translation>
 <translation id="7442465037756169001">Ovládač Hangouts Meet hardware je pripravený na nastavenie.</translation>
 <translation id="744341768939279100">Vytvoriť nový profil</translation>
+<translation id="744366959743242014">Načítavajú sa údaje. Môže to niekoľko sekúnd trvať.</translation>
 <translation id="7443806024147773267">Získajte prístup k svojim heslám, keď sa prihlásite do účtu Google</translation>
 <translation id="7444983668544353857">Zakázať zariadenie <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Inštalujte aplikácie automaticky</translation>
@@ -4786,6 +4822,7 @@
 <translation id="7489761397368794366">Zavolať z vášho zariadenia</translation>
 <translation id="749028671485790643">Osoba <ph name="VALUE" /></translation>
 <translation id="7490813197707563893">Adresa MAC</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 súbor cookie}few{{NUM_COOKIES} súbory cookie}many{{NUM_COOKIES} cookies}other{{NUM_COOKIES} súborov cookie}}</translation>
 <translation id="7493386493263658176"><ph name="EXTENSION_NAME" /> môže zhromažďovať všetok text, ktorý zadáte, vrátane osobných údajov, ako sú heslá a čísla kreditných kariet. Chcete použiť toto rozšírenie?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Zabudli ste svoje staré heslo?</translation>
@@ -4806,10 +4843,14 @@
 <translation id="7513029293694390567">Prihlasovať sa na weboch automaticky pomocou uložených prihlasovacích údajov. Keď je táto funkcia vypnutá, zobrazí sa vám pred každým prihlásením žiadosť o potvrdenie.</translation>
 <translation id="7514239104543605883">Kopírovať do zariadenia</translation>
 <translation id="7514365320538308">Stiahnuť</translation>
+<translation id="751523031290522286">Aplikácia <ph name="APP_NAME" /> bola zablokovaná správcom. Požiadajte ho o povolenie používať túto aplikáciu.</translation>
+<translation id="7516981202574715431">Doména <ph name="APP_NAME" /> je pozastavená</translation>
+<translation id="7517063221058203587">{0,plural, =1{Aktualizujte zariadenie do 1 minúty}few{Aktualizujte zariadenie do # minút}many{Aktualizujte zariadenie do # minúty}other{Aktualizujte zariadenie do # minút}}</translation>
 <translation id="7520766081042531487">Anonymný portál: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">Povedzte „Ok Google“</translation>
 <translation id="7525067979554623046">Vytvoriť</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{1 ďalšia položka}few{{NUM_DOWNLOADS} ďalšie položky}many{{NUM_DOWNLOADS} more}other{{NUM_DOWNLOADS} ďalších položiek}}</translation>
 <translation id="7529411698175791732">Skontrolujte internetové pripojenie. Ak problém pretrváva, skúste sa odhlásiť a znovu prihlásiť.</translation>
 <translation id="7530016656428373557">Vybíjanie batérie (W)</translation>
 <translation id="7531779363494549572">Prejdite do časti Nastavenia &gt; Aplikácie a upozornenia &gt; Upozornenia.</translation>
@@ -4978,6 +5019,7 @@
 <translation id="7765158879357617694">Presunúť</translation>
 <translation id="7766807826975222231">Spustiť prehliadku</translation>
 <translation id="7766838926148951335">Prijať povolenia</translation>
+<translation id="7768770796815395237">Zmeniť</translation>
 <translation id="7769672763586021400">ID modelu</translation>
 <translation id="7770651108375708429">Odpojiť Wi-Fi</translation>
 <translation id="7771452384635174008">Rozloženie</translation>
@@ -5153,7 +5195,7 @@
 <translation id="7961015016161918242">Nikdy</translation>
 <translation id="7963826112438303517">Asistent pomocou týchto záznamov a vyslovených žiadostí vytvorí a aktualizuje váš hlasový model, ktorý je uložený iba v zariadeniach s aktivovanou funkciou Voice Match. Hlasovú aktivitu zobrazíte alebo zmeníte v nastaveniach Asistenta.</translation>
 <translation id="7966241909927244760">K&amp;opírovať adresu obrázka</translation>
-<translation id="7968072247663421402">Možnosti poskytovateľa:</translation>
+<translation id="7968072247663421402">Možnosti poskytovateľa</translation>
 <translation id="7968742106503422125">Čítať a upravovať dáta, ktoré kopírujete a prilepujete</translation>
 <translation id="7968833647796919681">Povoliť zhromažďovanie údajov o výkonnosti</translation>
 <translation id="7968982339740310781">Zobraziť podrobnosti</translation>
@@ -5413,6 +5455,7 @@
 <translation id="8286963743045814739">Prehliadať v súkromí môžete v okne inkognito</translation>
 <translation id="8287902281644548111">Hľadajte podľa volania rozhrania API alebo webovej adresy</translation>
 <translation id="8288032458496410887">Odinštalovať aplikáciu <ph name="APP" />…</translation>
+<translation id="8289128870594824098">Veľkosť na disku</translation>
 <translation id="8291967909914612644">Krajina poskytovateľa domácej siete</translation>
 <translation id="8294431847097064396">Zdroj</translation>
 <translation id="8297006494302853456">Slabé</translation>
@@ -5625,6 +5668,7 @@
 <translation id="8608618451198398104">Pridanie tiketu Kerberos</translation>
 <translation id="8609465669617005112">Presunúť nahor</translation>
 <translation id="8610103157987623234">Nesprávny formát. Skúste to znova.</translation>
+<translation id="8612935480510351790">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný. Chcete ho odoslať na kontrolu do rozšírenej ochrany Googlu?</translation>
 <translation id="8613164732773110792">Iba malé znaky, čísla, podčiarkovníky alebo pomlčky</translation>
 <translation id="8615618338313291042">Aplikácia inkognito: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Vrhnutý tieň</translation>
@@ -5652,6 +5696,7 @@
 <translation id="8641606876632989680">Chrome vás upozorní, keď sa prihlásite pomocou prelomeného hesla</translation>
 <translation id="8642900771896232685">2 sekundy</translation>
 <translation id="8642947597466641025">Zväčšiť text</translation>
+<translation id="8643443571868262066">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný. Chcete ho odoslať na kontrolu do rozšírenej ochrany Googlu?</translation>
 <translation id="8644655801811752511">Tento bezpečnostný kľúč sa nedá resetovať. Skúste ho resetovať ihneď po vložení.</translation>
 <translation id="8645354835496065562">Naďalej umožňovať prístup k senzorom</translation>
 <translation id="8645920082661222035">Predpovedá nebezpečné udalosti a upozorní vás, než k nim dôjde</translation>
@@ -6072,6 +6117,7 @@
 <translation id="9169931577761441333">Pridať aplikáciu <ph name="APP_NAME" /> na plochu</translation>
 <translation id="9170848237812810038">&amp;Naspäť</translation>
 <translation id="9170884462774788842">Iný program v počítači pridal motív, ktorý môže zmeniť spôsob fungovania prehliadača Chrome.</translation>
+<translation id="917350715406657904">Vypršal časový limit, ktorý tvoj rodič nastavil pre aplikáciu <ph name="APP_NAME" />. Zajtra ju môžeš používať <ph name="TIME_LIMIT" />.</translation>
 <translation id="9173995187295789444">Vyhľadávajú sa zariadenia Bluetooth...</translation>
 <translation id="9174401638287877180">Odosielanie údajov o využití a diagnostiky. Pomôžte zlepšiť prostredie Androidu svojho dieťaťa automatickým odosielaním diagnostík a údajov o používaní zariadenia a aplikácií do Googlu. Nebudú slúžiť na zistenie totožnosti vášho dieťaťa. Pomôžu zvýšiť stabilitu systému a aplikácií a poskytovať ďalšie zlepšenia. Niektoré súhrnné údaje tiež pomôžu aplikáciám Google a partnerom, ako napríklad vývojárom pre Android. Ak pre dieťa zapnete nastavenie ďalšej aktivity na internete a v aplikáciách, tieto údaje sa môžu uložiť do jeho účtu Google.</translation>
 <translation id="917510707618656279">Opýtať sa, keď chce web získať prístup k zariadeniam Bluetooth</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 716c1d09..cbfd9a3 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Branje in spreminjanje vseh vaših podatkov na trenutnem spletnem mestu, če je zagnano</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> želi ponastaviti nastavitve.</translation>
 <translation id="1243314992276662751">Prenesi</translation>
-<translation id="1243398753772016127">Spletna mesta ne morejo uporabljati vaše dejavnosti brskanja na različnih spletnih mestih za individualno prilagajanje oglasov</translation>
 <translation id="1244265436519979884">Trenutno poteka obnavljanje vsebnika za Linux</translation>
 <translation id="1244303850296295656">Napaka razširitve</translation>
 <translation id="1246905108078336582">Ali želite odstraniti predlog iz odložišča?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Vklopljeno – nastavitve po meri</translation>
 <translation id="1489664337021920575">Izberite drugo možnost</translation>
 <translation id="1493892686965953381">Čakanje na <ph name="LOAD_STATE_PARAMETER" /> ...</translation>
-<translation id="1494438840282430403">Izbriši tudi podatke brskanja (<ph name="URL" />), s čimer ste lahko odjavljeni iz domene Google.com.</translation>
 <translation id="1495486559005647033">Število drugih razpoložljivih naprav: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Nazaj na zavihek</translation>
 <translation id="1499271269825557605">Če razširitve ne prepoznate ali če brskalnik ne deluje po pričakovanjih, lahko tukaj izklopite ali prilagodite razširitve.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Ikona bo vidna, če lahko razširitev deluje na trenutni strani. Razširitev uporabite tako, da kliknete ikono ali pritisnete <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Nastavitev kot Chromebox za videokonference</translation>
 <translation id="2580889980133367162">Gostitelju <ph name="HOST" /> vedno dovoli prenos več datotek</translation>
-<translation id="2580924999637585241">Skupaj: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Dolga</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Okolje <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kartončka za Kerberos ni bilo mogoče pridobiti. Poskusite znova ali se obrnite na skrbnika naprave organizacije. (Koda napake <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Blokirana so pojavna okna:</translation>
 <translation id="480990236307250886">Odpri domačo stran</translation>
 <translation id="4811503964269049987">Uvrsti izbrani zavihek v skupino</translation>
-<translation id="4811818760963189951">Izklopljeno, ker ste onemogočili sinhronizacijo zgodovine</translation>
 <translation id="4813136279048157860">Moje slike</translation>
 <translation id="4813512666221746211">Napaka v omrežju</translation>
 <translation id="4814378367953456825">Vnesite ime za ta prstni odtis</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Dodatne nastavitve vsebine</translation>
 <translation id="5042282098504489593">Odprite nastavitve, če želite napravo <ph name="USB_DEVICE_NAME" /> povezati z Linuxom</translation>
 <translation id="5043913660911154449">Ali določite datoteko PPD za tiskalnik. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Izklopljeno, ker ste sinhronizirane podatke šifrirali z geslom</translation>
 <translation id="5045550434625856497">Nepravilno geslo</translation>
 <translation id="504561833207953641">Odpiranje v obstoječi seji brskalnika.</translation>
 <translation id="5047421709274785093">Spletnim mestom prepreči uporabo tipal za gibanje in svetlobo</translation>
@@ -3967,7 +3962,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />sinhronizacijo ponastaviti<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Pozdravljeni v družini <ph name="SHORT_PRODUCT_NAME" />. To ni navaden računalnik.</translation>
 <translation id="6358884629796491903">Zmaj</translation>
-<translation id="6360719647236334056">Prilagajanje Iskanja Google, oglasov in drugih Googlovih storitev z zgodovino brskanja v Chromu</translation>
 <translation id="6361850914223837199">Podrobnosti o napaki:</translation>
 <translation id="6362853299801475928">&amp;Prijavite težavo ...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4245,7 +4239,6 @@
 <translation id="6758056191028427665">Sporočite nam, kako ste zadovoljni z nami.</translation>
 <translation id="6759193508432371551">Ponastavitev na tovarniške nastavitve</translation>
 <translation id="6762833852331690540">Vklopljeno</translation>
-<translation id="6764693078871405569">Izbriši tudi podatke brskanja (<ph name="URL" />), s čimer boste odjavljeni iz domene <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Izberi drugi jezik …</translation>
 <translation id="6767639283522617719">Domeni se ni mogoče pridružiti. Preverite, ali so nastavitve za organizacijsko enoto pravilne.</translation>
 <translation id="6769712124046837540">Dodajanje tiskalnika ...</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index ddceff1..df8a15e 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Lexo dhe ndrysho të gjitha të dhënat në sajtin aktual të uebit kur të kërkohet</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> dëshiron të rivendosë cilësimet e tua.</translation>
 <translation id="1243314992276662751">Ngarko</translation>
-<translation id="1243398753772016127">Sajtet nuk mund t'i përdorin të dhënat e shfletimit nëpër sajte të ndryshme për të personalizuar reklamat</translation>
 <translation id="1244265436519979884">Restaurimi i Linux aktualisht në vazhdim</translation>
 <translation id="1244303850296295656">Shtesa e paketës</translation>
 <translation id="1246905108078336582">Të hiqet sugjerimi nga kujtesa e fragmenteve?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Aktive - cilësimet e personalizuara</translation>
 <translation id="1489664337021920575">Zgjidh një opsion tjetër</translation>
 <translation id="1493892686965953381">Po pret për <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Pastro gjithashtu të dhënat e shfletimit, (<ph name="URL" />)gjë që mund të të bëjë të dalësh nga Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> pajisje të tjera të ofrueshme.</translation>
 <translation id="1495677929897281669">Kthehu te skeda</translation>
 <translation id="1499271269825557605">Nëse nuk e njeh një shtesë ose nëse shfletuesi nuk funksionon siç pritet, mund t'i çaktivizosh ose personalizosh shtesat këtu.</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Kjo ikonë do të jetë e dukshme kur shtesa të arrijë të veprojë në faqen aktuale. Përdore këtë shtesë duke klikuar mbi ikonën ose duke shtypur <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfiguroje si "Chromebox për takime"</translation>
 <translation id="2580889980133367162">Lejo gjithmonë që <ph name="HOST" /> të shkarkojë shumë skedarë</translation>
-<translation id="2580924999637585241">Totali: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">E gjatë</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platforma <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Nuk mund të merrej bileta e Kerberos. Provo përsëri ose kontakto me administratorin e pajisjes së organizatës. (Kodi i gabimit <ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">Dritaret kërcyese u bllokuan:</translation>
 <translation id="480990236307250886">Hap faqen bazë</translation>
 <translation id="4811503964269049987">Skeda e zgjedhur e grupit</translation>
-<translation id="4811818760963189951">Çaktivizuar sepse ke çaktivizuar sinkronizimin e historikut</translation>
 <translation id="4813136279048157860">Imazhet e mia</translation>
 <translation id="4813512666221746211">Gabim në rrjet</translation>
 <translation id="4814378367953456825">Fut një emër për këtë gjurmë gishti</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Cilësimet shtesë të përmbajtjeve</translation>
 <translation id="5042282098504489593">Hap "Cilësimet" për ta lidhur <ph name="USB_DEVICE_NAME" /> me Linux</translation>
 <translation id="5043913660911154449">Ose specifiko skedarin PPD të printerit <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Çaktivizuar sepse i ke enkriptuar të dhënat e sinkronizimit me një frazë kalimi</translation>
 <translation id="5045550434625856497">Fjalëkalim i gabuar</translation>
 <translation id="504561833207953641">Po hapet në sesionin ekzistues të shfletuesit.</translation>
 <translation id="5047421709274785093">Blloko sajtet nga përdorimi i sensorëve të lëvizjes dhe të dritës</translation>
@@ -3962,7 +3957,6 @@
 <translation id="63566973648609420">Vetëm dikush me frazën tënde të kalimit mund të lexojë të dhënat e tua të koduara. Kjo frazë kalimi nuk dërgohet te Google dhe as nuk ruhet nga ai. Nëse e harron frazën tënde të kalimit apo dëshiron të ndryshosh këtë cilësim, duhet që të <ph name="BEGIN_LINK" />rivendosësh sinkronizimin<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Mirë se erdhe në familjen <ph name="SHORT_PRODUCT_NAME" />. Ky nuk është kompjuter i zakonshëm.</translation>
 <translation id="6358884629796491903">Dragua</translation>
-<translation id="6360719647236334056">Përdor historikun tënd të shfletimit të Chrome për të personalizuar "Kërko", reklamat dhe shërbime të tjera të Google</translation>
 <translation id="6361850914223837199">Detajet e gabimit:</translation>
 <translation id="6362853299801475928">&amp;Raporto një problem...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4240,7 +4234,6 @@
 <translation id="6758056191028427665">Na trego se si po ecim.</translation>
 <translation id="6759193508432371551">Rivendosje në gjendje fabrike</translation>
 <translation id="6762833852331690540">Aktiv</translation>
-<translation id="6764693078871405569">Pastro gjithashtu të dhënat e shfletimit, (<ph name="URL" />) gjë që mund të të bëjë të dalësh nga <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Zgjidh një gjuhë tjetër...</translation>
 <translation id="6767639283522617719">Nuk mund t'i bashkohet domenit. Sigurohu që cilësimet të jenë të sakta për njësinë organizative.</translation>
 <translation id="6769712124046837540">Po shton printerin...</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index b20f2cc7..461a0a6 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Читање и мењање података на актуелном веб-сајту по позиву</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> жели да ресетује подешавања.</translation>
 <translation id="1243314992276662751">Отпреми</translation>
-<translation id="1243398753772016127">Сајтови не могу да користе активности прегледања на различитим сајтовима за персонализацију огласа</translation>
 <translation id="1244265436519979884">У току је враћање Linux података</translation>
 <translation id="1244303850296295656">Грешка додатка</translation>
 <translation id="1246905108078336582">Желите ли да уклоните предлог из привремене меморије?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Укључено – прилагођена подешавања</translation>
 <translation id="1489664337021920575">Одабери другу опцију</translation>
 <translation id="1493892686965953381">Чека се <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Обриши и податке прегледања (<ph name="URL" />). Ово може да вас одјави са Google.com.</translation>
 <translation id="1495486559005647033">Других доступних уређаја: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Назад на картицу</translation>
 <translation id="1499271269825557605">Ако не препознајете додатак или ако прегледач не ради на очекивани начин, овде можете да искључите или прилагодите додатке.</translation>
@@ -1049,7 +1047,7 @@
 <translation id="241082044617551207">Непозната додатна компонента</translation>
 <translation id="2412593942846481727">Доступно је ажурирање</translation>
 <translation id="2413749388954403953">Мењање корисничког интерфејса обележивача</translation>
-<translation id="2417206894320497232">Додатна компонента VM је спремна за коришћење.</translation>
+<translation id="2417206894320497232">Plugin VM је спреман за коришћење.</translation>
 <translation id="241727068219398187">Подаци су шифровани помоћу Google лозинке од
           <ph name="TIME" />. То не обухвата начине плаћања и адресе из Google Pay-а.</translation>
 <translation id="2419706071571366386">Из безбедносних разлога се одјавите када не користите рачунар.</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Ова икона ће бити видљива када додатак буде могао да функционише на тренутној страници. Користите овај додатак кликом на икону или притиском на <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Подеси као Chromebox за састанке</translation>
 <translation id="2580889980133367162">Увек дозволи хосту <ph name="HOST" /> да преузима више датотека</translation>
-<translation id="2580924999637585241">Укупно: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Дуго</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Преузимање Kerberos тикета није успело. Пробајте поново или се обратите администратору уређаја у организацији. (Кôд грешке <ph name="ERROR_CODE" />)</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">Искачући прозори су блокирани:</translation>
 <translation id="480990236307250886">Отвори почетну страницу</translation>
 <translation id="4811503964269049987">Додајте изабрану картицу у групу</translation>
-<translation id="4811818760963189951">Искључено је зато што сте онемогућили синхронизацију историје</translation>
 <translation id="4813136279048157860">Моје слике</translation>
 <translation id="4813512666221746211">Грешка на мрежи</translation>
 <translation id="4814378367953456825">Унесите назив за овај отисак прста</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Додатна подешавања садржаја</translation>
 <translation id="5042282098504489593">Отворите Подешавања да бисте повезали <ph name="USB_DEVICE_NAME" /> са Linux-ом</translation>
 <translation id="5043913660911154449">Или наведите PPD штампача <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Искључено је зато што сте шифровали податке за синхронизацију помоћу приступне фразе</translation>
 <translation id="5045550434625856497">Неисправна лозинка</translation>
 <translation id="504561833207953641">Отвара се у постојећој сесији прегледача.</translation>
 <translation id="5047421709274785093">Блокирај сајтове тако да не користе сензоре за покрет и светло</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">Само неко ко има приступну фразу може да чита шифроване податке. Google не шаље нити чува приступну фразу. Ако заборавите приступну фразу или желите да промените ово подешавање, мораћете да <ph name="BEGIN_LINK" />ресетујете синхронизацију<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Добро дошли у <ph name="SHORT_PRODUCT_NAME" /> породицу. Ово није обичан рачунар.</translation>
 <translation id="6358884629796491903">Змај</translation>
-<translation id="6360719647236334056">Користите Chrome историју прегледања за персонализацију Претраге, огласа и других Google услуга</translation>
 <translation id="6361850914223837199">Детаљи грешке:</translation>
 <translation id="6362853299801475928">П&amp;ријави проблем...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">Поделите утиске о нашем учинку.</translation>
 <translation id="6759193508432371551">Враћање фабричких подешавања</translation>
 <translation id="6762833852331690540">Укључено</translation>
-<translation id="6764693078871405569">Обриши и податке прегледања (<ph name="URL" />). Ово ће вас одјавити са <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Одаберите други језик…</translation>
 <translation id="6767639283522617719">Придруживање домену није успело. Уверите се да су подешавања исправна за организациону јединицу.</translation>
 <translation id="6769712124046837540">Додавање штампача...</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 7125f72..cbe7da4 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Läsa och ändra all din data på den aktuella webbplatsen när den anropas</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> önskar återställa dina inställningar.</translation>
 <translation id="1243314992276662751">Ladda upp</translation>
-<translation id="1243398753772016127">Webbplatser kan inte anpassa annonser med hjälp av din webbaktivitet från olika webbplatser</translation>
 <translation id="1244265436519979884">Återställning av Linux pågår</translation>
 <translation id="1244303850296295656">Fel i tillägg</translation>
 <translation id="1246905108078336582">Vill du ta bort förslaget från urklipp?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Aktiverat – anpassade inställningar</translation>
 <translation id="1489664337021920575">Välj ett annat alternativ</translation>
 <translation id="1493892686965953381">Väntar på <ph name="LOAD_STATE_PARAMETER" /> ...</translation>
-<translation id="1494438840282430403">Rensa även webbinformation (<ph name="URL" />), vilket kan innebära att du loggas ut från Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> andra tillgängliga enheter.</translation>
 <translation id="1495677929897281669">Tillbaka till flik</translation>
 <translation id="1499271269825557605">Om du inte känner igen ett tillägg eller om webbläsaren inte fungerar som den ska kan du stänga av eller anpassa tillägg här.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Den här ikonen visas när tillägget kan aktiveras för den aktuella sidan. Använd tillägget genom att klicka på ikonen eller genom att trycka på <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Konfigurera som Chromebox för möten</translation>
 <translation id="2580889980133367162">Tillåt alltid att <ph name="HOST" /> laddar flera filer</translation>
-<translation id="2580924999637585241">Totalt: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lång</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Plattform <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Det gick inte att hämta Kerberos-biljetten. Försök igen eller kontakta organisationens enhetsadministratör. (Felkod: <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Popup-fönster har blockerats</translation>
 <translation id="480990236307250886">Öppna startsidan</translation>
 <translation id="4811503964269049987">Lägg till vald flik i gruppen</translation>
-<translation id="4811818760963189951">Inaktiverat eftersom du har stängt av historiksynkronisering</translation>
 <translation id="4813136279048157860">Mina bilder</translation>
 <translation id="4813512666221746211">Nätverksfel</translation>
 <translation id="4814378367953456825">Ge fingeravtrycket ett namn</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Ytterligare innehållsinställningar</translation>
 <translation id="5042282098504489593">Öppna inställningarna om du vill ansluta <ph name="USB_DEVICE_NAME" /> till Linux</translation>
 <translation id="5043913660911154449">Eller ange PPD-fil för skrivaren <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Inaktiverat eftersom du har krypterat data som synkroniseras med en lösenfras</translation>
 <translation id="5045550434625856497">Felaktigt lösenord</translation>
 <translation id="504561833207953641">Öppnas i en befintlig webbläsarsession.</translation>
 <translation id="5047421709274785093">Blockera webbplatser från att använda rörelse- och ljussensorer</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />återställa synkroniseringen<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Välkommen till <ph name="SHORT_PRODUCT_NAME" />-familjen. Det här är inte vilken dator som helst.</translation>
 <translation id="6358884629796491903">Drake</translation>
-<translation id="6360719647236334056">Anpassa Sök, annonser och andra tjänster från Google utifrån webbhistoriken i Chrome</translation>
 <translation id="6361850914223837199">Information om felet:</translation>
 <translation id="6362853299801475928">&amp;Rapportera ett problem...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Berätta hur vi sköter oss.</translation>
 <translation id="6759193508432371551">Återställ standardinställningar</translation>
 <translation id="6762833852331690540">På</translation>
-<translation id="6764693078871405569">Rensa även webbinformation (<ph name="URL" />), vilket kan innebära att du loggas ut från <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Välj ett annat språk …</translation>
 <translation id="6767639283522617719">Det gick inte att ansluta till domänen. Kontrollera inställningarna för organisationsenheten.</translation>
 <translation id="6769712124046837540">Lägger till skrivare ...</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index f7a4e44..3485b36 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Soma na ubadilishe data yako yote kwenye tovuti unayovinjari sasa inapotumwa</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> inataka kuweka upya mipangilio yako.</translation>
 <translation id="1243314992276662751">Pakia</translation>
-<translation id="1243398753772016127">Tovuti haziwezi kutumia shughuli zako za kuvinjari kwenye tovuti tofauti ili kuweka mapendeleo kwenye matangazo</translation>
 <translation id="1244265436519979884">Shughuli ya kupakia metadata ya Linux inaendelea wakati huu</translation>
 <translation id="1244303850296295656">Hitilafu ya kiendelezi</translation>
 <translation id="1246905108078336582">Je, ungependa kuondoa pendekezo kwenye ubao wa kunakili?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Imewashwa - mipangilio maalum</translation>
 <translation id="1489664337021920575">Jaribu chaguo jingine</translation>
 <translation id="1493892686965953381">Inasubiri <ph name="LOAD_STATE_PARAMETER" /> ...</translation>
-<translation id="1494438840282430403">Futa pia data ya kuvinjari (<ph name="URL" />), hatua inayoweza kukuondoa kwenye Google.com.</translation>
 <translation id="1495486559005647033">Vifaa vingine <ph name="NUM_PRINTERS" /> vinapatikana.</translation>
 <translation id="1495677929897281669">Rudi kwenye kichupo</translation>
 <translation id="1499271269825557605">Ikiwa hutambui kiendelezi au ikiwa kivinjari chako hakifanyi kazi kama inavyotarajiwa, unaweza kuzima au kuweka mapendeleo ya viendelezi hapa.</translation>
@@ -480,7 +478,7 @@
 <translation id="1653526288038954982">{NUM_PRINTER,plural, =1{Ongeza printa kwenye Google Cloud Print ili uweze kuchapisha kutoka mahali popote.}other{Ongeza printa # kwenye Google Cloud Print ili uweze kuchapisha kutoka mahali popote.}}</translation>
 <translation id="1656528038316521561">Nuru ya mandharinyuma</translation>
 <translation id="1657406563541664238">Saidia kuboresha <ph name="PRODUCT_NAME" /> kwa kutumia Google takwimu za matumizi na ripoti wakati wowote huduma hii inapoacha kufanya kazi.</translation>
-<translation id="1657937299377480641">Ili uingie katika akaunti tena ufikie nyenzo za elimu, mwombe mzazi ruhusa</translation>
+<translation id="1657937299377480641">Ili uingie katika akaunti tena na ufikie nyenzo za elimu, mwombe mzazi ruhusa</translation>
 <translation id="1658424621194652532">Ukarasa huu unafikia maikrofoni yako.</translation>
 <translation id="1660204651932907780">Ruhusu tovuti kucheza sauti (inapendekezwa)</translation>
 <translation id="1660763353352708040">Tatizo la adapta ya nishati</translation>
@@ -1187,7 +1185,6 @@
 <translation id="2575247648642144396">Aikoni hii itaonekana wakati kiendelezi kitakapoweza kufanya kazi kwenye ukurasa wa sasa. Tumia kiendelezi hiki kwa kubofya aikoni au kwa kubonyeza <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Weka mipangilio kuwa Chromebox ya mikutano</translation>
 <translation id="2580889980133367162">Ruhusu <ph name="HOST" /> kupakua faili nyingi wakati wote</translation>
-<translation id="2580924999637585241">Jumla: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Muda mrefu</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Jukwaa <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Imeshindwa kupata tiketi za Kerberos. Jaribu tena au wasiliana na msimamizi wa kifaa katika shirika lako. (Msimbo wa hitilafu <ph name="ERROR_CODE" />).</translation>
@@ -1233,7 +1230,7 @@
 <translation id="2637400434494156704">PIN si Sahihi. Umebakisha mara moja ya kujaribu.</translation>
 <translation id="2638087589890736295">Kauli ya siri inahitajika ili uanze kusawazisha</translation>
 <translation id="264083724974021997">Unganisha kwenye simu yako - Kidirisha</translation>
-<translation id="2641065435954454414">Inatayarisha kupakua picha</translation>
+<translation id="2641065435954454414">Inatayarisha kupakua</translation>
 <translation id="2642111877055905627">Mpira wa soka</translation>
 <translation id="2643698698624765890">Dhibiti viendelezi vyako kwa kubofya Viendelezi katika menyu ya Window.</translation>
 <translation id="264810637653812429">Haikupata vifaa vyovyote vinavyooana.</translation>
@@ -2814,7 +2811,6 @@
 <translation id="4808667324955055115">Umezuia madirisha ibukizi:</translation>
 <translation id="480990236307250886">Fungua ukurasa wa kwanza</translation>
 <translation id="4811503964269049987">Kichupo cha Kikundi Kilichochaguliwa</translation>
-<translation id="4811818760963189951">Kimezimwa kwa sababu umezima usawazishaji wa historia</translation>
 <translation id="4813136279048157860">Picha Zangu</translation>
 <translation id="4813512666221746211">Hitilafu ya mtandao</translation>
 <translation id="4814378367953456825">Weka jina la alama ya kidole</translation>
@@ -2983,7 +2979,6 @@
 <translation id="5040823038948176460">Mipangilio ya ziada ya maudhui</translation>
 <translation id="5042282098504489593">Fungua Mipangilio ili uunganishe <ph name="USB_DEVICE_NAME" /> kwenye Linux</translation>
 <translation id="5043913660911154449">Au ubainishe PPD ya printa yako <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Kimezimwa kwa sababu umesimba kwa njia fiche data yako ya kusawazisha ukitumia kauli ya siri</translation>
 <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation>
 <translation id="504561833207953641">Inafungua katika kipindi cha kuvinjari kilichopo.</translation>
 <translation id="5047421709274785093">Zuia tovuti zisitumie vitambuzi vya mwendo na mwangaza</translation>
@@ -3960,7 +3955,6 @@
 <translation id="63566973648609420">Ni mtu mwenye kauli yako ya siri tu anaweza kusoma data yako iliyosimbwa kwa njia fiche. Kauli ya siri haitumwi au kuhifadhiwa na Google. Ukisahau kauli yako ya siri, au unataka kubadilisha mipangilio hii, utahitaji <ph name="BEGIN_LINK" />kuweka upya usawazishaji<ph name="END_LINK" /></translation>
 <translation id="6357619544108132570">Karibu kwenye familia ya <ph name="SHORT_PRODUCT_NAME" />. Hii si kompyuta ya kawaida.</translation>
 <translation id="6358884629796491903">Joka</translation>
-<translation id="6360719647236334056">Tumia historia yako ya kuvinjari kwenye Chrome ili uweke mapendeleo katika huduma ya Tafuta, matangazo na huduma nyingine za Google</translation>
 <translation id="6361850914223837199">Maelezo ya hitilafu:</translation>
 <translation id="6362853299801475928">&amp;Ripoti matumizi mabaya...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4238,7 +4232,6 @@
 <translation id="6758056191028427665">Tueleze jinsi huduma inavyokuridhisha.</translation>
 <translation id="6759193508432371551">Rejesha upya mipangilio ya kiwandani</translation>
 <translation id="6762833852331690540">Imewashwa</translation>
-<translation id="6764693078871405569">Futa pia data ya kuvinjari (<ph name="URL" />), hatua inayoweza kukuondoa kwenye akaunti ya <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Chagua Lugha Nyingine...</translation>
 <translation id="6767639283522617719">Imeshindwa kuunganisha kwenye kikoa. Hakikisha kuwa mipangilio ni sahihi katika kitengo cha shirika.</translation>
 <translation id="6769712124046837540">Inaongeza printa...</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 7987f41..d74e3e1 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">அனுமதித்தால், தற்போதைய இணையதளத்தில் உங்கள் எல்லாத் தரவையும் படிக்கும், மாற்றும்</translation>
 <translation id="1242633766021457174">உங்கள் அமைப்புகளை மீட்டமைக்க <ph name="THIRD_PARTY_TOOL_NAME" /> விரும்புகிறது.</translation>
 <translation id="1243314992276662751">பதிவேற்று</translation>
-<translation id="1243398753772016127">விளம்பரங்களைப் பிரத்தியேகமாக்குவதற்காக வெவ்வேறு தளங்களிலான உங்களது உலாவல் செயல்பாட்டைத் தளங்களால் பயன்படுத்த முடியாது</translation>
 <translation id="1244265436519979884">Linux மீட்டமைத்தல் செயலில் உள்ளது</translation>
 <translation id="1244303850296295656">நீட்டிப்புப் பிழை</translation>
 <translation id="1246905108078336582">கிளிப்போர்டிலிருந்து பரிந்துரையை அகற்றவா?</translation>
@@ -354,7 +353,6 @@
 <translation id="1487335504823219454">இயக்கத்தில் - பிரத்தியேக அமைப்புகள்</translation>
 <translation id="1489664337021920575">வேறொரு விருப்பத்தைத் தேர்வுசெய்யவும்</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> க்காக காத்திருக்கிறது...</translation>
-<translation id="1494438840282430403">உலாவிய தரவையும் (<ph name="URL" />) அழி. இது Google.comமில் இருந்து உங்களை வெளியேற்றக்கூடும்.</translation>
 <translation id="1495486559005647033">கிடைக்கும் <ph name="NUM_PRINTERS" /> பிற சாதனங்கள்.</translation>
 <translation id="1495677929897281669">தாவலுக்குத் திரும்பு</translation>
 <translation id="1499271269825557605">நீட்டிப்பு ஒன்றை உங்களால் கண்டறிய முடியவில்லை என்றாலோ உங்கள் உலாவி எதிர்பார்த்தபடி வேலை செய்யவில்லை என்றாலோ இங்கே நீட்டிப்புகளை முடக்கிக் கொள்ளலாம் அல்லது பிரத்தியேகமாக்கிக் கொள்ளலாம்.</translation>
@@ -1180,7 +1178,6 @@
 <translation id="2575247648642144396">நீட்டிப்பானது தற்போதைய பக்கத்தில் செயல்படும்போது, இந்த ஐகான் தெரியும். ஐகானில் கிளிக் செய்து அல்லது <ph name="EXTENSION_SHORTCUT" /> ஐ அழுத்தி இந்த நீட்டிப்பைப் பயன்படுத்துக.</translation>
 <translation id="257779572837908839">சந்திப்புகளுக்கான Chromebox சாதனமாக அமை</translation>
 <translation id="2580889980133367162">பல கோப்புகளைப் பதிவிறக்க எப்போதும் <ph name="HOST" /> ஐ அனுமதி</translation>
-<translation id="2580924999637585241">மொத்தம்: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">நீண்ட</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (இயங்குதளம் <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos டிக்கெட்டைப் பெற இயலவில்லை. மீண்டும் முயலவும் அல்லது உங்கள் நிறுவனத்தின் சாதன நிர்வாகியைத் தொடர்பு கொள்ளவும். (பிழை குறியீடு <ph name="ERROR_CODE" />).</translation>
@@ -2795,7 +2792,6 @@
 <translation id="4808667324955055115">பாப்-அப்கள் தடுக்கப்பட்டுள்ளன</translation>
 <translation id="480990236307250886">முகப்புப் பக்கத்தைத் திற</translation>
 <translation id="4811503964269049987">தேர்ந்தெடுத்த தாவலைக் குழுவாக்கு</translation>
-<translation id="4811818760963189951">நீங்கள் வரலாற்று ஒத்திசைவை முடக்கியுள்ளதால் ஆஃப் செய்யப்பட்டுள்ளது</translation>
 <translation id="4813136279048157860">எனது படங்கள்</translation>
 <translation id="4813512666221746211">நெட்வொர்க் பிழை</translation>
 <translation id="4814378367953456825">இந்தக் கைரேகைக்கு ஒரு பெயரை உள்ளிடவும்</translation>
@@ -2964,7 +2960,6 @@
 <translation id="5040823038948176460">கூடுதல் உள்ளடக்க அமைப்புகள்</translation>
 <translation id="5042282098504489593">Linuxஸுடன் <ph name="USB_DEVICE_NAME" /> சாதனத்தை இணைக்க அமைப்புகளைத் திறக்கவும்</translation>
 <translation id="5043913660911154449">அல்லது உங்கள் பிரிண்டரின் PPDயைக் குறிப்பிடுங்கள் <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">கடவுச்சொற்றொடர் முலம் உங்கள் ஒத்திசைவு தரவை என்க்ரிப்ஷன் செய்ததால் முடக்கப்பட்டுள்ளது</translation>
 <translation id="5045550434625856497">தவறான கடவுச்சொல்</translation>
 <translation id="504561833207953641">செயலிலுள்ள உலாவி அமர்வில் திறக்கிறது.</translation>
 <translation id="5047421709274785093">தளங்கள் நகர்வு மற்றும் ஒளி உணர்விகளைப் பயன்படுத்துவதைத் தடு</translation>
@@ -3936,7 +3931,6 @@
 <translation id="63566973648609420">உங்கள் கடவுச்சொற்றொடரை அறிந்தவரால் மட்டுமே என்கிரிப்ட் செய்யப்பட்ட உங்கள் தரவைப் படிக்க முடியும். கடவுச்சொற்றொடரானது Googleக்கு அனுப்பப்படுவதில்லை அல்லது Google அதைச் சேமிப்பதில்லை. கடவுச்சொற்றொடரை மறந்துவிட்டால் அல்லது இந்த அமைப்பை மாற்ற விரும்பினால், நீங்கள் <ph name="BEGIN_LINK" />ஒத்திசைவை மீட்டமைக்க வேண்டும்<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> குடும்பத்திற்கு வரவேற்கிறோம். இது சாதாரணக் கம்ப்யூட்டர் அல்ல.</translation>
 <translation id="6358884629796491903">டிராகன்</translation>
-<translation id="6360719647236334056">தேடல், விளம்பரங்கள் மற்றும் பிற Google சேவைகளைப் பிரத்தியேகமாக்க உங்கள் Chrome உலாவல் வரலாற்றைப் பயன்படுத்தவும்</translation>
 <translation id="6361850914223837199">பிழை விவரங்கள்:</translation>
 <translation id="6362853299801475928">&amp;சிக்கலைப் புகார் செய்க...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4213,7 +4207,6 @@
 <translation id="6758056191028427665">எவ்வாறு செயல்படுகிறோம் என்பதை எங்களுக்குத் தெரிவிக்கவும்.</translation>
 <translation id="6759193508432371551">தொழிற்சாலை மீட்டமைவு</translation>
 <translation id="6762833852331690540">ஆன் செய்யப்பட்டுள்ளது</translation>
-<translation id="6764693078871405569">உலாவியத் தரவையும் அழி (<ph name="URL" />). இது உங்களை <ph name="DOMAIN" /> கணக்கில் இருந்து வெளியேற்றும்.</translation>
 <translation id="6767566652486411142">மற்றொரு மொழியைத் தேர்வுசெய்க...</translation>
 <translation id="6767639283522617719">டொமைனுடன் இணைக்க முடியவில்லை. நிறுவன யூனிட்டின் அமைப்புகள் சரியாக இருப்பதை உறுதிசெய்யவும்.</translation>
 <translation id="6769712124046837540">பிரிண்டரைச் சேர்க்கிறது...</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 2cccf64..4ee4962 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -39,6 +39,7 @@
 <translation id="1042174272890264476">మీ కంప్యూటర్‌‍లో కూడా <ph name="SHORT_PRODUCT_NAME" /> యొక్క అంతర్గత RLZ లైబ్రరీ ఉంటుంది. RLZ శోధనలను మరియు నిర్దిష్ట ప్రమోషనల్ ప్రచారం ద్వారా ఉపయోగించబడిన <ph name="SHORT_PRODUCT_NAME" /> వినియోగాన్ని లెక్కించడానికి, ప్రత్యేకం కానటువంటి, వ్యక్తిగతంగా గుర్తించలేని ట్యాగ్‌ను సమర్పిస్తుంది. ఈ లేబుల్‌లు కొన్నిసార్లు <ph name="PRODUCT_NAME" />లోని Google శోధన ప్రశ్నలలో కనిపిస్తాయి.</translation>
 <translation id="1043818413152647937">అలాగే, ఈ యాప్‌ల నుండి డేటాను క్లియర్ చేయాలా?</translation>
 <translation id="1046635659603195359">మీరు ఇప్పటికే మరో పరికరంలో మీ Google అసిస్టెంట్‌ని ఉపయోగించి Voice Matchని సెటప్ చేసినట్టున్నారు. ఈ పరికరంలో వాయిస్ నమూనాని రూపొందించడం కోసం ఈ మునుపటి రికార్డింగ్‌లు ఉపయోగించబడతాయి. ఇందుకు నిమిషం కంటే తక్కువ సమయం పడుతుంది.</translation>
+<translation id="104710386808485638">Linuxను రీస్టార్ట్ చేయాలా?</translation>
 <translation id="1047431265488717055">లింక్ వచ&amp;నం కాపీ చేయి</translation>
 <translation id="1048286738600630630">ప్రదర్శనలు</translation>
 <translation id="1049743911850919806">అజ్ఞాత మోడ్</translation>
@@ -117,6 +118,7 @@
 <translation id="1161575384898972166">దయచేసి క్లయింట్ స‌ర్టిఫికెట్‌ను ఎగుమతి చేయ‌డానికి <ph name="TOKEN_NAME" />కు సైన్ ఇన్ చేయండి.</translation>
 <translation id="1163931534039071049">ఫ్రేమ్ మూలాన్ని &amp;వీక్షించండి</translation>
 <translation id="1164674268730883318"><ph name="DEVICE_TYPE" />కు Smart Lockని ఆఫ్ చేయాలా?</translation>
+<translation id="1164891049599601209">మోసపూరిత సైట్‌లోకి ప్రవేశించారు</translation>
 <translation id="1164899421101904659">PIN అన్‌లాక్ కీని నమోదు చేయండి</translation>
 <translation id="1165039591588034296">ఎర్రర్</translation>
 <translation id="1166212789817575481">కుడివైపు టాబ్‌లను మూసివెయ్యి</translation>
@@ -186,7 +188,6 @@
 <translation id="1241753985463165747">అభ్యర్థించినప్పుడు ప్రస్తుత వెబ్‌సైట్‌లో మీ మొత్తం డేటాను చదవండి మరియు మార్చండి</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> మీ సెట్టింగ్‌లను రీసెట్ చేయాలనుకుంటోంది.</translation>
 <translation id="1243314992276662751">అప్‌లోడ్ చేయి</translation>
-<translation id="1243398753772016127">వేర్వేరు సైట్‌లలో మీరు చేసిన బ్రౌజింగ్ కార్యకలాపాన్ని ఉపయోగించి, సైట్‌లు ప్రకటనలను వ్యక్తిగతీకరించలేవు</translation>
 <translation id="1244265436519979884">ప్రస్తుతం Linux పునరుద్ధరణ ప్రోగ్రెస్‌లో ఉంది</translation>
 <translation id="1244303850296295656">ఎక్స్‌టెన్షన్ ఎర్రర్</translation>
 <translation id="1246905108078336582">క్లిప్‌బోర్డ్ నుండి సూచనను తొలగించాలా?</translation>
@@ -353,7 +354,6 @@
 <translation id="1487335504823219454">ఆన్ - అనుకూల సెట్టింగ్‌లు</translation>
 <translation id="1489664337021920575">మరొక ఎంపికను ఎంచుకోండి</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> కోసం వేచి ఉంది...</translation>
-<translation id="1494438840282430403">అలాగే బ్రౌజింగ్ డేటాను (<ph name="URL" />) క్లియర్ చేస్తుంది, దీని వలన మీరు Google.com నుండి సైన్ అవుట్ చేయబడవచ్చు.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> అందుబాటులో ఉన్న ఇతర పరికరాలు.</translation>
 <translation id="1495677929897281669">తిరిగి ట్యాబ్‌కు వెళ్లు</translation>
 <translation id="1499271269825557605">మీరు ఎక్స్‌టెన్షన్‌ను గుర్తించకపోతే, లేదా మీ బ్రౌజర్ ఊహించిన విధంగా పని చేయకపోతే, మీరు ఇక్కడ ఆపివేయవచ్చు లేదా ఎక్స్‌టెన్షన్‌లను అనుకూలీకరించవచ్చు.</translation>
@@ -400,6 +400,7 @@
 <translation id="1545177026077493356">స్వయంచాలక కియోస్క్ మోడ్</translation>
 <translation id="1545775234664667895">"<ph name="THEME_NAME" />" థీమ్ వ్యవస్థాపించబడింది.</translation>
 <translation id="1546280085599573572">ఈ ఎక్స్‌టెన్ష‌న్‌ మీరు హోమ్ బటన్‌ను క్లిక్ చేసినప్పుడు చూపబడే పేజీని మార్చింది.</translation>
+<translation id="1546452108651444655"><ph name="CHILD_NAME" /> <ph name="EXTENSION_TYPE" />ను ఇన్‌స్టాల్ చేయాలనుకుంటుంది, అది కింది వాటిని చేయగలదు:</translation>
 <translation id="1549275686094429035">ARC ఎనేబుల్ చేయబడింది</translation>
 <translation id="1549788673239553762"><ph name="APP_NAME" /> <ph name="VOLUME_NAME" />ని యాక్సెస్ చేయాలనుకుంటోంది. దీని వలన మీ ఫైల్‌లు మారవచ్చు లేదా తొలగించబడవచ్చు.</translation>
 <translation id="1553538517812678578">అపరిమిత</translation>
@@ -498,6 +499,7 @@
 <translation id="1679806121152819234">ప్లగ్ఇన్ VM</translation>
 <translation id="1679810534535368772">మీరు ఖచ్చితంగా నిష్క్రమించాలనుకుంటున్నారా?</translation>
 <translation id="167983332380191032">నిర్వహణ సేవ HTTP ఎర్రర్‌ని పంపింది.</translation>
+<translation id="1680841347983561661">దయచేసి కొన్ని క్షణాలలో Google Playని మళ్లీ ప్రారంభించడానికి ట్రై చేయండి.</translation>
 <translation id="1680849702532889074">మీ Linux అప్లికేషన్ ఇన్‌స్టాలేషన్ సమయంలో ఎర్రర్ ఏర్పడింది.</translation>
 <translation id="16815041330799488">క్లిప్‌బోర్డ్‌కు కాపీ చేసిన వచనం మరియు చిత్రాలను చూడటానికి సైట్‌లను అనుమతించవద్దు</translation>
 <translation id="1682548588986054654">కొత్త అజ్ఞాత విండో</translation>
@@ -907,6 +909,7 @@
 <translation id="2220572644011485463">PIN లేదా పాస్‌వర్డ్</translation>
 <translation id="2224444042887712269">ఈ సెట్టింగ్ <ph name="OWNER_EMAIL" />కి సంబంధించినది.</translation>
 <translation id="2224551243087462610">ఫోల్డర్ పేరును సవరించు</translation>
+<translation id="2225864335125757863">మీ ఖాతాను సురక్షితంగా ఉంచడానికి వెంటనే ఈ పాస్‌వర్డ్‌లను మార్చండి:</translation>
 <translation id="2226449515541314767">ఈ సైట్ MIDI పరికరాలకు పూర్తి నియంత్రణ లేకుండా బ్లాక్ చేయబడింది.</translation>
 <translation id="222704500187107962">ప్రస్తుత అజ్ఞాత సెషన్ నుండి మీరు నిష్క్రమించిన తర్వాత, ఈ మినహాయింపు ఆటోమేటిక్‌గా తొలగించబడుతుంది</translation>
 <translation id="2227179592712503583">సూచనను తీసివేయి</translation>
@@ -1031,6 +1034,7 @@
 <translation id="2387052489799050037">హోమ్‌కు వెళ్లండి</translation>
 <translation id="2387458720915042159">ప్రాక్సీ కనెక్షన్ రకం</translation>
 <translation id="2391419135980381625">ప్రామాణిక ఫాంట్</translation>
+<translation id="2392163307141705938"><ph name="IDS_SHORT_PRODUCT_NAME" /> కోసం మీ తల్లి/తండ్రి సెట్ చేసిన సమయ పరిమితిని మీరు చేరుకున్నారు.</translation>
 <translation id="2392369802118427583">సక్రియం చెయ్యి</translation>
 <translation id="2394566832561516196">సెట్టింగ్‌లు తర్వాతిసారి మళ్లీ లోడ్‌ చేసే సమయంలో క్లియర్ చేయబడతాయి.</translation>
 <translation id="2395616325548404795">మీ <ph name="DEVICE_TYPE" /> ఎంటర్‌ప్రైజ్ నిర్వహణ కోసం విజయవంతంగా నమోదు చేయబడింది, కానీ దాని లక్షణ మరియు స్థాన సమాచారాన్ని పంపడంలో విఫలమైంది. దయచేసి ఈ పరికరం కోసం ఈ సమాచారాన్ని మీ నిర్వాహక కన్సోల్ నుండి మాన్యువల్‌గా నమోదు చేయండి.</translation>
@@ -1098,6 +1102,7 @@
 <translation id="247949520305900375">ఆడియోను భాగస్వామ్యం చేయి</translation>
 <translation id="2480868415629598489">మీరు కాపీ చేసి, అతికించే డేటాను సవరించడం</translation>
 <translation id="2482878487686419369">ప్రకటనలు</translation>
+<translation id="2483610039979585156">మీరు అన్ని <ph name="ORIGIN" /> ట్యాబ్‌లను మూసివేసే వరకు <ph name="ORIGIN" /> <ph name="FILENAME" />ను ఎడిట్ చేయగలదు</translation>
 <translation id="2484959914739448251">మీ అన్ని సమకాలీకరించబడుతున్న పరికరాలతో సహా, మీ Google ఖాతా నుండి బ్రౌజింగ్ డేటాను తీసివేయడానికి, <ph name="BEGIN_LINK" />మీ రహస్య పదబంధాన్ని నమోదు చేయండి<ph name="END_LINK" />.</translation>
 <translation id="2485005079599453134">ఈ పరికరంలో పాస్‌వర్డ్ సేవ్ చేయబడింది</translation>
 <translation id="2485422356828889247">అన్ఇన్‌స్టాల్ చేయి</translation>
@@ -1180,7 +1185,6 @@
 <translation id="2575247648642144396">ప్రస్తుత పేజీలో ఎక్స్‌టెన్ష‌న్‌ను అమలు చేయగలిగినప్పుడు ఈ చిహ్నం కనిపిస్తుంది. చిహ్నంపై క్లిక్ చేయడం ద్వారా లేదా <ph name="EXTENSION_SHORTCUT" />ను నొక్కడం ద్వారా ఈ ఎక్స్‌టెన్ష‌న్‌ను ఉపయోగించండి.</translation>
 <translation id="257779572837908839">సమావేశాల కోసం Chromebox వలె సెటప్ చేయండి</translation>
 <translation id="2580889980133367162">బహుళ ఫైల్‌లను డౌన్‌లోడ్ చేయడానికి <ph name="HOST" />ను ఎల్లప్పుడూ అనుమతించు</translation>
-<translation id="2580924999637585241">మొత్తం: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">ఎక్కువ</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (ప్లాట్‌ఫారమ్ <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos టిక్కెట్‌ను పొందడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నించండి లేదా మీ సంస్థ పరికర నిర్వాహకులను సంప్రదించండి. (ఎర్రర్ కోడ్ <ph name="ERROR_CODE" />).</translation>
@@ -1314,6 +1318,7 @@
 <translation id="274290345632688601">Linux యాప్‌లు &amp; ఫైల్‌లను పునరుద్ధరిస్తోంది</translation>
 <translation id="2743387203779672305">క్లిప్‌బోర్డ్‌కు కాపీ చేయి</translation>
 <translation id="2745080116229976798">Microsoft Qualified Subordination</translation>
+<translation id="2748061034695037846"><ph name="DOMAIN" /> పాజ్ చేయబడింది</translation>
 <translation id="2749756011735116528"><ph name="PRODUCT_NAME" />కు సైన్ ఇన్ చేయండి</translation>
 <translation id="2749881179542288782">స్పెల్ చెక్‌తో పాటు వ్యాకరణాన్ని కూడా తనిఖీ చేయి</translation>
 <translation id="2751739896257479635">EAP 2వ దశ ప్రమాణీకరణ</translation>
@@ -1322,6 +1327,7 @@
 <translation id="275662540872599901">స్క్రీన్ ఆఫ్‌లో ఉంది</translation>
 <translation id="2762441749940182211">కెమెరా బ్లాక్ చేయబడింది</translation>
 <translation id="2765217105034171413">చిన్నది</translation>
+<translation id="2766161002040448006">తల్లి/తండ్రిని అడగండి</translation>
 <translation id="276969039800130567"><ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేసారు.</translation>
 <translation id="2770465223704140727">జాబితాను నుండి తొలగించు</translation>
 <translation id="2770690685823456775">మీ పాస్‌వర్డ్‌లను మరో ఫోల్డర్‌కు ఎగుమతి చేయండి</translation>
@@ -1578,6 +1584,7 @@
 <translation id="3115580024857770654">అన్నీ కుదించు</translation>
 <translation id="3117362587799608430">డాక్‌కు పూర్తి అనుకూలత లేదు</translation>
 <translation id="3118319026408854581"><ph name="PRODUCT_NAME" /> సహాయం</translation>
+<translation id="3118654181216384296">దయచేసి, కొన్ని క్షణాల్లో Linuxను మళ్లీ ప్రారంభించండానికి ట్రై చేయండి.</translation>
 <translation id="3120430004221004537">దీనిలో నిర్దిష్ట చర్య కోసం తగిన ఎన్‌క్రిప్షన్ లేదు: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="3121793941267913344">ఈ <ph name="IDS_SHORT_PRODUCT_NAME" /> పరికరాన్ని రీసెట్ చేయండి</translation>
 <translation id="3122464029669770682">CPU</translation>
@@ -1587,6 +1594,7 @@
 <translation id="3127156390846601284">దీని వలన చూపబడిన అన్ని సైట్‌ల కోసం మీ పరికరంలో నిల్వ చేయబడిన ఏ డేటా అయినా తొలగించబడుతుంది. మీరు కొనసాగించదలిచారా?</translation>
 <translation id="3127860049873093642">ఛార్జింగ్ మరియు పనితీరు సమస్యలను నివారించడానికి, అనుకూలమైన డెల్ లేదా USB టైప్-సి పవర్ అడాప్టర్‌ను ఉపయోగించండి.</translation>
 <translation id="3129173833825111527">ఎడమ సరిహద్దు</translation>
+<translation id="3129215702932019810">యాప్‌ను ప్రారంభించడంలో ఎర్రర్ ఏర్పడింది</translation>
 <translation id="3130528281680948470">మీ పరికరం రీసెట్ చేయబడుతుంది మరియు అన్ని వినియోగదారు ఖాతాలు మరియు స్థానిక డేటా తీసివేయబడుతుంది. దీన్ని రద్దు చేయడం సాధ్యపడదు.</translation>
 <translation id="313205617302240621">పాస్‌వర్డ్‌ను మర్చిపోయారా?</translation>
 <translation id="3132996321662585180">ప్రతిరోజూ రిఫ్రెష్ చేయండి</translation>
@@ -1807,6 +1815,7 @@
 <translation id="3441653493275994384">స్క్రీన్</translation>
 <translation id="3445925074670675829">USB-C పరికరం</translation>
 <translation id="344630545793878684">అనేక వెబ్‌సైట్‌ల్లోని మీ డేటాను చదవండి</translation>
+<translation id="3448086340637592206">Google Chrome, Chrome OS అదనపు నిబంధనలు</translation>
 <translation id="3448492834076427715">ఖాతాను అప్‌డేట్ చేయి</translation>
 <translation id="3449393517661170867">ట్యాబ్‌లు ఉన్న కొత్త విండో</translation>
 <translation id="3449839693241009168"><ph name="EXTENSION_NAME" />కు ఆదేశాలను పంపడానికి <ph name="SEARCH_KEY" /> నొక్కండి</translation>
@@ -2162,6 +2171,7 @@
 <translation id="3873423927483480833">పిన్‌లను చూపుతుంది</translation>
 <translation id="3873915545594852654">ARC++కి సంబంధించి ఒక సమస్య సంభవించింది.</translation>
 <translation id="3879748587602334249">డౌన్‌లోడ్ మేనేజ‌ర్‌</translation>
+<translation id="3881321138433527084">సురక్షిత బ్రౌజింగ్ ఆఫ్ చేయబడింది. వెబ్‌లో సురక్షితంగా ఉండటానికి, దాన్ని ఆన్ చేయండి.</translation>
 <translation id="3882165008614329320">కెమెరా లేదా ఫైల్‌లో ఇప్పటికే ఉన్న వీడియో</translation>
 <translation id="3886446263141354045">మీరు ఈ సైట్‌ను యాక్సెస్ చేయడానికి చేసిన అభ్యర్థన <ph name="NAME" />కు పంపబడింది</translation>
 <translation id="3888550877729210209"><ph name="LOCK_SCREEN_APP_NAME" />తో గమనికలు రూపొందిస్తున్నారు</translation>
@@ -2510,6 +2520,7 @@
 <translation id="4384652540891215547">పొడిగింపును సక్రియం చేయండి</translation>
 <translation id="438503109373656455">సారటోగా</translation>
 <translation id="4387004326333427325">ప్రామాణీకరణ ప్రమాణపత్రం రిమోట్‌లో తిరస్కరించబడింది</translation>
+<translation id="4387890294700445764">చోరీకి గురైన పాస్‌వర్డ్‌లు</translation>
 <translation id="4389091756366370506">వినియోగదారు <ph name="VALUE" /></translation>
 <translation id="4390000551125140321">{0,plural, =1{అజ్ఞాతం}other{# తెరవబడిన అజ్ఞాత విండోలు}}</translation>
 <translation id="439266289085815679">బ్లూటూత్ కాన్ఫిగరేషన్ <ph name="USER_EMAIL" /> ద్వారా నియంత్రించబడుతుంది.</translation>
@@ -2543,6 +2554,7 @@
 <translation id="4429030830601238961">ఈ డేటా మీ సంస్థ యొక్క భద్రతా పాలసీలను ఉల్లంఘిస్తుంది, కాబట్టి అది అతికించబడదు.</translation>
 <translation id="4430019312045809116">వాల్యూమ్</translation>
 <translation id="4430369329743628066">బుక్‌మార్క్ జోడించబడింది</translation>
+<translation id="4432621511648257259">పాస్‌వర్డ్ తప్పు</translation>
 <translation id="4434045419905280838">పాప్-అప్‌లు మరియు మళ్లింపులు</translation>
 <translation id="443454694385851356">లెగసీ (అసురక్షితం)</translation>
 <translation id="443475966875174318">అనుకూలంగా లేని అప్లికేషన్‌లను అప్‌డేట్ చేయండి లేదా తీసివేయండి</translation>
@@ -2823,6 +2835,7 @@
 <translation id="4850669014075537160">స్క్రోలింగ్</translation>
 <translation id="4850886885716139402">వీక్షణ</translation>
 <translation id="4853020600495124913">&amp;కొత్త విండోలో తెరువు</translation>
+<translation id="4854317507773910281">ఆమోదం కోసం తల్లి/తండ్రి ఖాతాను ఎంచుకోండి</translation>
 <translation id="485480310608090163">మరిన్ని సెట్టింగ్‌లు మరియు అనుమతులు</translation>
 <translation id="4856478137399998590">మీ మొబైల్ డేటా సేవ యాక్టివేట్ చేయబడింది, ఉపయోగించడానికి సిద్ధంగా ఉంది</translation>
 <translation id="4856855265648545577">షెల్ఫ్‌లోని లాంచర్, వెనుకకు, ఓవర్‌వ్యూ బటన్‌లను టాబ్లెట్ మోడ్‌లో చూపుతుంది. ChromeVox (మాటల రూపంలోని ఫీడ్‌బ్యాక్) లేదా స్విచ్ యాక్సెస్‌ను ఎనేబుల్ చేసినప్పుడు ఆన్ అవుతుంది.</translation>
@@ -2966,6 +2979,7 @@
 <translation id="504561833207953641">ఇప్పటికే ఉన్న బ్రౌజర్ సెషన్‌లో తెరుస్తోంది.</translation>
 <translation id="5047421709274785093">చలనం మరియు కాంతి సర్దుబాటు సెన్సార్‌లను ఉపయోగించకుండా సైట్‌లను బ్లాక్ చేయి</translation>
 <translation id="5050042263972837708">సమూహం పేరు</translation>
+<translation id="5051073330196664891">Google యూనివర్సల్ సేవా నిబంధనలు (uToS)</translation>
 <translation id="5051836348807686060">మీరు ఎంచుకున్న భాషలకు స్పెల్‌చెక్ మద్దతు లేదు</translation>
 <translation id="5052499409147950210">సైట్‌ను సవరించండి</translation>
 <translation id="5053604404986157245">యాదృచ్చికంగా రూపొందించబడిన TPM పాస్‌వర్డ్ అందుబాటులో లేదు. ఇది పవర్‌వాష్ తర్వాత సర్వసాధారణం.</translation>
@@ -3004,6 +3018,7 @@
 <translation id="5097002363526479830">'<ph name="NAME" />' నెట్‌వర్క్‌కు కనెక్ట్ చేయడంలో విఫలమైంది: <ph name="DETAILS" /></translation>
 <translation id="5101042277149003567">అన్ని బుక్‌మార్క్‌లను తెరువు</translation>
 <translation id="5101839224773798795">కర్సర్ ఆపినప్పుడు ఆటోమేటిక్‌గా క్లిక్ అవుతుంది</translation>
+<translation id="5107443654503185812">ఎక్స్‌టెన్షన్, సురక్షిత బ్రౌజింగ్‌ను ఆఫ్ చేసింది</translation>
 <translation id="5108967062857032718">సెట్టింగ్‌లు - Android యాప్‌లను తీసివేయి</translation>
 <translation id="5109044022078737958">మియా</translation>
 <translation id="5111646998522066203">అజ్ఞాత మోడ్‌ని విడిచిపెట్టు</translation>
@@ -3093,6 +3108,7 @@
 <translation id="523505283826916779">యాక్సెస్‌ సెట్టింగ్‌లు</translation>
 <translation id="5235750401727657667">కొత్త ట్యాబ్‌ను తెరిచేటప్పుడు మీరు చూసే పేజీని భర్తీ చేయండి</translation>
 <translation id="5238278114306905396">"<ph name="EXTENSION_NAME" />" యాప్ ఆటోమేటిక్‌గా తీసివేయబడింది.</translation>
+<translation id="5239730228370806996">ఈ డ్రాప్ చేయబడిన డేటా, మీ సంస్థకు చెందిన భద్రతా పాలసీలను ఉల్లంఘిస్తోంది. అయినప్పటికీ మీరు కొనసాగించాలనుకుంటున్నారా?</translation>
 <translation id="5241128660650683457">మీరు సందర్శించే వెబ్‌సైట్‌ల్లోని మీ మొత్తం డేటాను చదవండి</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"ను ప్రారంభించాలా?</translation>
 <translation id="5243522832766285132">దయచేసి కొన్ని నిమిషాల్లో మళ్లీ ప్రయత్నించండి</translation>
@@ -3113,7 +3129,7 @@
 <translation id="5260508466980570042">క్షమించండి, మీ ఇమెయిల్ లేదా పాస్‌వర్డ్ ధృవీకరించబడలేదు. దయచేసి మళ్ళీ ప్రయత్నించండి.</translation>
 <translation id="5261683757250193089">వెబ్ స్టోర్‌లో తెరవండి</translation>
 <translation id="5262178194499261222">పాస్‌వర్డ్‌ను తీసివేయి</translation>
-<translation id="5263468185123738872">దయచేసి గెస్ట్ ఆపరేటింగ్ సిస్టమ్‌ను ఇన్‌స్టాల్ చేయడానికి Plugin VMను ప్రారంభించండి.</translation>
+<translation id="5263468185123738872">గెస్ట్ ఆపరేటింగ్ సిస్టమ్‌ను ఇన్‌స్టాల్ చేయడానికి దయచేసి Plugin VMను ప్రారంభించండి.</translation>
 <translation id="5264148714798105376">ఇది ఇంచుమించు ఒక నిమిషంలో పూర్తి కావచ్చు.</translation>
 <translation id="5264252276333215551">మీ యాప్‌ను కియోస్క్ మోడ్‌లో ప్రారంభించడానికి దయచేసి ఇంటర్నెట్‌కు కనెక్ట్ చేయండి.</translation>
 <translation id="5265562206369321422">వారానికి పైగా ఆఫ్‌లైన్‌లో ఉంది</translation>
@@ -3384,6 +3400,7 @@
 <translation id="5618075537869101857">అయ్యో, కియోస్క్ అప్లికేషన్‌ను ప్రారంభించడం సాధ్యపడలేదు.</translation>
 <translation id="5618333180342767515">(దీనికి కొన్ని నిమిషాల సమయం పట్టవచ్చు)</translation>
 <translation id="56197088284879152">ఈ రిమోట్ పరికరానికి ఉన్న కనెక్షన్ రద్దీగా ఉంది: "<ph name="DEVICE_NAME" />".</translation>
+<translation id="5620163320393916465">సేవ్ చేసిన పాస్‌వర్డ్‌లు ఏవీ లేవు</translation>
 <translation id="5620549857835247159">షెల్ఫ్‌లోని లాంచర్, వెనుకకు, ఓవర్‌వ్యూ బటన్‌లను టాబ్లెట్ మోడ్‌లో చూపుతుంది.</translation>
 <translation id="5620568081365989559">DevTools <ph name="FOLDER_PATH" />కు పూర్తి యాక్సెస్‌ను అభ్యర్థిస్తున్నాయి. మీరు ఎటువంటి ముఖ్యమైన సమాచారాన్ని బహిర్గతం చేయలేదని నిర్ధారించుకోండి.</translation>
 <translation id="5620612546311710611">వినియోగ గణాంకాలు</translation>
@@ -3477,6 +3494,7 @@
 <translation id="5747785204778348146">డెవలపర్ - అస్థిరం</translation>
 <translation id="5747809636523347288">అతికించి <ph name="URL" />కు వెళ్ళండి</translation>
 <translation id="5750324801516359607">దూరంగా ఉండాలి</translation>
+<translation id="5751887393582880060">ఈ అప్‌లోడ్, మీ సంస్థకు చెందిన భద్రతా పాలసీలను ఉల్లంఘిస్తోంది. అయినప్పటికీ మీరు కొనసాగించాలనుకుంటున్నారా?</translation>
 <translation id="5756163054456765343">స&amp;హాయ కేంద్రం</translation>
 <translation id="5759728514498647443">మీరు <ph name="APP_NAME" /> ద్వారా ముద్రించడానికి పంపే పత్రాలు <ph name="APP_NAME" /> ద్వారా చదవబడతాయి.</translation>
 <translation id="5763751966069581670">USB పరికరాలు కనుగొనబడలేదు</translation>
@@ -3690,6 +3708,7 @@
 <translation id="6040852767465482106">అనామక గుర్తింపు</translation>
 <translation id="6041046205544295907"><ph name="BEGIN_PARAGRAPH1" />మీ పరికర స్థానాన్ని అంచనా వేయడంలో సహాయపడటానికి Wi‑Fi, మొబైల్ నెట్‌వర్క్‌లు మరియు సెన్సార్‌ల వంటి మూలాధారాలను Google స్థాన సేవ ఉపయోగిస్తుంది.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />మీరు మీ పరికరంలో ప్రధాన స్థాన సెట్టింగ్‌ని ఆఫ్ చేయడం ద్వారా స్థానాన్ని ఆఫ్ చేయవచ్చు. మీరు స్థాన సెట్టింగ్‌లలో స్థానం కోసం Wi‑Fi, మొబైల్ నెట్‌వర్క్‌లు మరియు సెన్సార్‌ల వినియోగాన్ని కూడా ఆఫ్ చేయవచ్చు.<ph name="END_PARAGRAPH2" /></translation>
+<translation id="6041150002191391409">మీరు అన్ని <ph name="ORIGIN" /> ట్యాబ్‌లను మూసివేసే వరకు <ph name="ORIGIN" /> <ph name="FOLDERNAME" />లో ఉన్న ఫైల్స్‌ను చూడగలదు</translation>
 <translation id="6041155700700864984">పూర్తి స్క్రీన్ నుండి నిష్క్రమించు</translation>
 <translation id="604124094241169006">స్వయంచాలకంగా</translation>
 <translation id="6042308850641462728">మరింత</translation>
@@ -3828,6 +3847,7 @@
 <translation id="622537739776246443">ప్రొఫైల్ తొలగించబడుతుంది</translation>
 <translation id="6225475702458870625">మీ <ph name="PHONE_NAME" /> నుండి డేటా కనెక్షన్ అందుబాటులో ఉంది</translation>
 <translation id="6226777517901268232">ప్రైవేట్ కీ ఫైల్ (ఐచ్ఛికం)</translation>
+<translation id="6227280783235722609">ఎక్స్‌టెన్షన్</translation>
 <translation id="6228691855869374890">ఈ సైట్ MIDI పరికరాలకు పూర్తి నియంత్రణను కలిగి ఉంది.</translation>
 <translation id="6228720835160974792">ఈ చిత్రానికి QR కోడ్‌ను రూపొందించండి</translation>
 <translation id="6229890768313448549">Google Play సేవా నిబంధనలను లోడ్ చేయడం సాధ్యపడదు. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
@@ -3880,6 +3900,7 @@
 <translation id="6285120108426285413"><ph name="FILE_NAME" /> సాధారణంగా డౌన్‌లోడ్ చేయబడలేదు మరియు ప్రమాదకరమైనది కావచ్చు.</translation>
 <translation id="6285120908535925801">{NUM_PRINTER,plural, =1{మీ నెట్‌వర్క్‌లోని కొత్త ప్రింటర్}other{మీ నెట్‌వర్క్‌లోని కొత్త ప్రింటర్‌లు}}</translation>
 <translation id="6286708577777130801">సేవ్ చేసిన పాస్‌వర్డ్ వివరాలు</translation>
+<translation id="6291163159361301370">Linuxను ప్రారంభించడానికి, <ph name="ORGANIZATION_NAME" />కు మీ డేటాను బ్యాకప్ చేసి, ఈ Chromebookను ఫ్యాక్టరీ సెట్టింగ్‌లకు రీసెట్ చేయాలి.</translation>
 <translation id="6291949900244949761">సైట్ USB పరికరాలను యాక్సెస్ చేయాలనుకున్నప్పుడు అడుగు (సిఫార్సు చేయబడింది)</translation>
 <translation id="6291953229176937411">శోధినిలో &amp;చూపించు</translation>
 <translation id="6295158916970320988">అన్ని సైట్‌లు</translation>
@@ -3929,7 +3950,6 @@
 <translation id="63566973648609420">మీ రహస్య పదబంధాన్ని కలిగి ఉన్న వారు మాత్రమే మీ ఎన్‌క్రిప్ట్ చేసిన‌ డేటాను చదవగలరు. రహస్య పదబంధం ఎవరికీ పంపబడదు లేదా Googleలో నిల్వ చేయబడదు. మీరు మీ రహస్య పదబంధాన్ని మర్చిపోతే లేదా ఈ సెట్టింగ్‌ను మార్చాలనుకుంటే, సింక్‌ను రీసెట్ చేయాల్సి ఉంటుంది. <ph name="BEGIN_LINK" />సింక్‌ను రీసెట్ చేయండి<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> కుటుంబానికి స్వాగతం. ఇది సాధారణ కంప్యూటర్ కాదు.</translation>
 <translation id="6358884629796491903">డ్రాగన్</translation>
-<translation id="6360719647236334056">శోధన, యాడ్‌లు, ఇతర Google సర్వీస్‌లు వ్యక్తిగతీకరించడానికి మీ Chrome బ్రౌజింగ్ చరిత్రను ఉపయోగించండి</translation>
 <translation id="6361850914223837199">ఎర్రర్ వివరాలు:</translation>
 <translation id="6362853299801475928">&amp;ఒక సమస్యను నివేదించండి...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3978,7 +3998,7 @@
 <translation id="642469772702851743">ఈ (SN: <ph name="SERIAL_NUMBER" />) పరికరం యజమానిచే లాక్ చేయబడింది.</translation>
 <translation id="6426200009596957090">ChromeVox సెట్టింగ్‌లను తెరువు</translation>
 <translation id="6428450836711225518">మీ ఫోన్ నంబర్‌ను ధృవీకరించండి</translation>
-<translation id="6428982734197629783">ఇమేజ్ ప్రాసెస్ చేస్తోంది</translation>
+<translation id="6428982734197629783">ఇమేజ్‌ను ప్రాసెస్ చేస్తోంది</translation>
 <translation id="6429384232893414837">అప్‌డేట్‌లో ఎర్రర్</translation>
 <translation id="6430814529589430811">Base64-ఎన్‌కోడ్ చేసిన ASCII, ఒక్క సర్టిఫికెట్</translation>
 <translation id="6431347207794742960"><ph name="PRODUCT_NAME" />ఈ కంప్యూటర్ వినియోగదారులందరికీ ఆటోమేటిక్ అప్‌డేట్‌లను సెట్ చేస్తుంది.</translation>
@@ -4207,7 +4227,6 @@
 <translation id="6758056191028427665">మేము అందించే సేవలు ఎలా ఉన్నాయో మాకు తెలియజేయండి.</translation>
 <translation id="6759193508432371551">ఫ్యాక్టరీ రీసెట్</translation>
 <translation id="6762833852331690540">ఆన్‌లో ఉంది</translation>
-<translation id="6764693078871405569">అలాగే బ్రౌజింగ్ డేటాను (<ph name="URL" />) క్లియర్ చేస్తుంది, దీని వలన మీరు <ph name="DOMAIN" /> నుండి సైన్ అవుట్ చేయబడతారు.</translation>
 <translation id="6767566652486411142">మరొక భాషను ఎంచుకోండి...</translation>
 <translation id="6767639283522617719">డొమైన్‌కు చేర్చడం సాధ్యపడలేదు. సంస్థాగత యూనిట్ యొక్క సెట్టింగ్‌లు సరిగ్గా ఉన్నాయని నిర్ధారించుకోండి.</translation>
 <translation id="6769712124046837540">ప్రింటర్‌ని జోడిస్తోంది...</translation>
@@ -4584,6 +4603,7 @@
 <translation id="7258225044283673131">అప్లికేషన్ స్పందించడం లేదు. యాప్‌ను మూసివేయడానికి "బలవంతంగా మూసివేయి" ఎంచుకోండి.</translation>
 <translation id="7258697411818564379">మీ పిన్ జోడించబడింది</translation>
 <translation id="7262004276116528033">ఈ సైన్-ఇన్ సేవను <ph name="SAML_DOMAIN" /> హోస్ట్ చేస్తోంది</translation>
+<translation id="7266898409676782635"><ph name="DEVICE_TYPE" /> చిట్కాలతో పాటు Google ప్రోడక్ట్‌లకు సంబంధించిన ఆఫర్‌లు, అప్‌డేట్‌లను పొందండి, , అలాగే ఫీడ్‌బ్యాక్‌ను షేర్ చేయండి. ఏ సమయంలో అయినా సభ్యత్వాన్ని తీసివేయండి.</translation>
 <translation id="7268127947535186412">ఈ సెట్టింగ్‌ను పరికరం యజమాని నిర్వహిస్తున్నారు.</translation>
 <translation id="7270858098575133036">MIDI పరికరాలను యాక్సెస్ చేయడానికి సిస్టమ్ విశిష్ట సందేశాలను సైట్ ఉపయోగించాలనుకున్నప్పుడు అడుగు</translation>
 <translation id="7272674038937250585">వివరణ ఏదీ అందించబడలేదు</translation>
@@ -4658,6 +4678,7 @@
 <translation id="7364796246159120393">ఫైల్‌ను ఎంచుకోండి</translation>
 <translation id="7366415735885268578">సైట్‌ను జోడించండి</translation>
 <translation id="7366909168761621528">బ్రౌజింగ్ డేటా</translation>
+<translation id="7367714965999718019">QR కోడ్ జెనరేటర్</translation>
 <translation id="736877393389250337"><ph name="URL" />ను <ph name="ALTERNATIVE_BROWSER_NAME" />లో తెరవలేకపోయింది. దయచేసి మీ సిస్టమ్ నిర్వాహకుడిని సంప్రదించండి.</translation>
 <translation id="7370592524170198497">ఈథర్‌నెట్ EAP:</translation>
 <translation id="7371006317849674875">ప్రారంభ సమయం</translation>
@@ -4921,7 +4942,9 @@
 <translation id="7737238973539693982">Linux (బీటా)ని తొలగించండి</translation>
 <translation id="7740996059027112821">ప్రామాణికం</translation>
 <translation id="7744047395460924128">మీ ప్రింటింగ్ చరిత్రను చూడండి</translation>
+<translation id="7744192722284567281">డేటా ఉల్లంఘనలో కనుగొనబడింది</translation>
 <translation id="7750228210027921155">చిత్రంలో చిత్రం</translation>
+<translation id="7751229152614300329">సురక్షిత బ్రౌజింగ్ అప్‌డేట్ చేయబడి ఉంది, మిమ్మల్ని హానికరమైన సైట్‌లు, డౌన్‌లోడ్‌ల నుండి రక్షిస్తోంది</translation>
 <translation id="7751260505918304024">అన్నీ చూపించు</translation>
 <translation id="7754704193130578113">ప్రతి ఫైల్‌ను డౌన్‌లోడ్ చేసే ముందు ఎక్కడ సేవ్ చేయాలో అడుగు</translation>
 <translation id="7755287808199759310">మీ తల్లి/తండ్రి దీన్ని మీ కోసం అన్‌బ్లాక్ చేయగలరు</translation>
@@ -5068,6 +5091,7 @@
 <translation id="7910768399700579500">&amp;క్రొత్త ఫోల్డర్</translation>
 <translation id="7911118814695487383">Linux</translation>
 <translation id="7912080627461681647">సర్వర్‌లో మీ పాస్‌వర్డ్ మార్చబడింది. దచయేసి సైన్ అవుట్ చేసి, సైన్ ఇన్ చేయండి.</translation>
+<translation id="7914583336730284547">ఈ డ్రాప్ చేయబడిన ఫైల్స్, మీ సంస్థకు చెందిన భద్రతా పాలసీలను ఉల్లంఘిస్తున్నాయి. అయినప్పటికీ మీరు కొనసాగించాలనుకుంటున్నారా?</translation>
 <translation id="7915457674565721553">తల్లిదండ్రుల నియంత్రణలను సెటప్ చేయడానికి ఇంటర్నెట్‌కు కనెక్ట్ చేయండి</translation>
 <translation id="7915471803647590281">దయచేసి అభిప్రాయాన్ని పంపడానికి ముందు ఏమి జరిగిందో మాకు చెప్పండి.</translation>
 <translation id="7918257978052780342">నమోదు చేయి</translation>
@@ -5107,7 +5131,7 @@
 <translation id="7961015016161918242">ఎప్పుడూ లేదు</translation>
 <translation id="7963826112438303517">మీ వాయిస్ నమూనాను సృష్టించడానికి, అప్‌డేట్ చేయడానికి మీ అసిస్టెంట్ ఈ రికార్డింగ్‌లను, మీ ప్రసంగ అభ్యర్థనలను ఉపయోగిస్తుంది, ఈ వాయిస్ నమూనా మీరు Voice Match ఆన్ చేసిన పరికరాలలో మాత్రమే నిల్వ చేయబడుతుంది. అసిస్టెంట్ సెట్టింగ్‌లలో వాయిస్ కార్యకలాపం చూడండి లేదా దానికి తిరిగి శిక్షణను ఇవ్వండి.</translation>
 <translation id="7966241909927244760">చిత్రం చిరునామాను కా&amp;పీ చేయండి</translation>
-<translation id="7968072247663421402">ప్రొవైడర్ ఎంపికలు</translation>
+<translation id="7968072247663421402">ప్రొవైడర్ ఆప్షన్‌లు</translation>
 <translation id="7968742106503422125">మీరు కాపీ చేసి, అతికించే డేటాను చదవడం మరియు సవరించడం</translation>
 <translation id="7968833647796919681">పనితీరు డేటా సేకరణను ప్రారంభించు</translation>
 <translation id="7968982339740310781">వివరాలను వీక్షించండి</translation>
@@ -5163,6 +5187,7 @@
 <translation id="8028803902702117856"><ph name="SIZE" />, <ph name="FILE_NAME" /> డౌన్‌లోడ్ చేస్తోంది</translation>
 <translation id="8028993641010258682">పరిమాణం</translation>
 <translation id="8030656706657716245">ప్రింటర్‌ను జోడించండి</translation>
+<translation id="8030852056903932865">ఆమోదించు</translation>
 <translation id="8032244173881942855">ట్యాబ్‌ను ప్రసారం చేయడం సాధ్యపడలేదు.</translation>
 <translation id="8033827949643255796">ఎంచుకోబడ్డాయి</translation>
 <translation id="803435727213847625">{COUNT,plural, =0{అన్నింటినీ &amp;అజ్ఞాత విండోలో తెరవండి}=1{&amp;అజ్ఞాత విండోలో తెరవండి}other{అన్నింటినీ (#) &amp;అజ్ఞాత విండోలో తెరవండి}}</translation>
@@ -5485,6 +5510,7 @@
 <translation id="8472623782143987204">హార్డ్‌వేర్ మద్దతు గలది</translation>
 <translation id="8473863474539038330">చిరునామాలు మరియు మరిన్ని</translation>
 <translation id="8475313423285172237">మీ కంప్యూటర్‌లోని మరో ప్రోగ్రామ్ జోడించిన ఎక్స్‌టెన్షన్ కారణంగా Chrome పని చేసే విధానం మారవచ్చు.</translation>
+<translation id="8476659515398963495">ఈ అతికించిన డేటా, మీ సంస్థకు చెందిన భద్రతా పాలసీలను ఉల్లంఘిస్తోంది. అయినప్పటికీ మీరు కొనసాగించాలనుకుంటున్నారా?</translation>
 <translation id="8477241577829954800">బదులు పెట్టు</translation>
 <translation id="8477384620836102176">&amp;సాధారణ</translation>
 <translation id="8480082892550707549">మీరు ఇంతకుముందు ఈ సైట్ నుండి ఫైల్‌లను డౌన్‌లోడ్ చేసినప్పటికీ, సైట్ తాత్కాలికంగా అసురక్షితం కావచ్చు (హ్యాకింగ్‌కు గురై ఉండవచ్చు). ఈ ఫైల్‌ను తర్వాత డౌన్‌లోడ్ చేయడానికి ప్రయత్నించండి.</translation>
@@ -5536,6 +5562,7 @@
 <translation id="8546930481464505581">టచ్ బార్‌ని అనుకూలీకరించండి</translation>
 <translation id="8547013269961688403">పూర్తి స్క్రీన్ మాగ్నిఫయర్‌ను ప్రారంభించండి</translation>
 <translation id="85486688517848470">ఎగువ-అడ్డు వరుసలోని కీల ప్రవర్తనను మార్చడానికి శోధన కీని నొక్కి ఉంచండి</translation>
+<translation id="8550165047974571882">మీరు అన్ని <ph name="ORIGIN" /> ట్యాబ్‌లను మూసివేసే వరకు <ph name="ORIGIN" /> <ph name="FOLDERNAME" />లో ఉన్న ఫైల్స్‌ను ఎడిట్ చేయగలదు</translation>
 <translation id="8551388862522347954">లైసెన్స్‌లు</translation>
 <translation id="8553342806078037065">ఇతర వ్యక్తులను నిర్వహించు</translation>
 <translation id="8554899698005018844">భాష లేదు</translation>
@@ -5596,6 +5623,7 @@
 <translation id="8639047128869322042">హానికరమైన సాఫ్ట్‌వేర్‌ కోసం తనిఖీ చేస్తోంది...</translation>
 <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - పోర్ట్</translation>
 <translation id="8639635302972078117">వినియోగం &amp; విశ్లేషణల డేటాను పంపండి. ఈ పరికరం ప్రస్తుతం సమస్య విశ్లేషణ డేటాను, పరికరం డేటాను, దానితో పాటు యాప్ వినియోగ డేటాను ఆటోమేటిక్‌గా Googleకు పంపుతోంది. ఇది మీ చిన్నారిని గుర్తించడానికి ఉపయోగించబడదు, ఇది కేవలం సిస్టమ్, యాప్ స్థిరత్వానికి, ఇతర మెరుగుదలలకు సహాయపడుతుంది. కొంత ఏకీకృత డేటా కూడా Google యాప్‌లకు, Android డెవలపర్‌ల లాంటి భాగస్వాములకు సహాయపడుతుంది. మీ చిన్నారి కోసం అదనపు వెబ్ &amp; యాప్ కార్యకలాపం సెట్టింగ్‌ను ఆన్ చేసినట్లయితే, ఈ డేటా వారి Google ఖాతాలో సేవ్ చేయబడవచ్చు.</translation>
+<translation id="8641606876632989680">చోరీకి గురైన పాస్‌వర్డ్‌తో మీరు సైన్ ఇన్ చేసినప్పుడు, Chrome తెలియజేస్తుంది</translation>
 <translation id="8642900771896232685">2 సెకన్లు</translation>
 <translation id="8642947597466641025">టెక్స్ట్‌ని పెద్దదిగా చెయ్యి</translation>
 <translation id="8644655801811752511">ఈ సెక్యూరిటీ కీని రీసెట్ చేయలేకపోయింది. కీని ఇన్‌సర్ట్ చేసిన తక్షణం రీసెట్ చేయడానికి ప్రయత్నించండి.</translation>
@@ -5692,6 +5720,7 @@
 <translation id="874689135111202667">{0,plural, =1{ఈ సైట్‌కు ఒక ఫైల్‌ను అప్‌లోడ్ చేయాలా?}other{ఈ సైట్‌కు # ఫైల్‌లను అప్‌లోడ్ చేయాలా?}}</translation>
 <translation id="8748384418490037181">Smart Lock ఎంపికలు</translation>
 <translation id="8749863574775030885">తెలియని విక్రేత అందించిన USB పరికరాలకు యాక్సెస్</translation>
+<translation id="8750133148106010815">Google Playను ప్రారంభించడానికి, <ph name="ORGANIZATION_NAME" />కు మీ డేటాను బ్యాకప్ చేసి, ఈ Chromebookను ఫ్యాక్టరీ సెట్టింగ్‌లకు రీసెట్ చేయాలి.</translation>
 <translation id="8750155211039279868"><ph name="ORIGIN" /> ఈ సీరియల్ పోర్ట్‌లలో ఒకదానితో కనెక్ట్ (అనుసంధానం) కావాలని కోరుకుంటుంది</translation>
 <translation id="8754200782896249056">&lt;p&gt;When running <ph name="PRODUCT_NAME" />ను మద్దతు ఉన్న డెస్క్‌టాప్ పరిసరంలో అమలు చేస్తున్నప్పుడు, సిస్టమ్ ప్రాక్సీ సెట్టింగ్‌లు ఉపయోగించబడతాయి.  అయితే, మీ సిస్టమ్ మద్దతు ఇవ్వడం లేదు లేదా మీ సిస్టమ్ కాన్ఫిగరేషన్‌ను ప్రారంభించడంలో సమస్య ఉంది.&lt;/p&gt;
 
@@ -5746,6 +5775,7 @@
 <translation id="8809147117840417135">లేత నీలి ఆకుపచ్చ రంగు</translation>
 <translation id="8813698869395535039"><ph name="USERNAME" />కు సైన్ ఇన్ చేయడం సాధ్యపడదు</translation>
 <translation id="8813811964357448561">పేపర్ షీట్</translation>
+<translation id="8813872945700551674">"<ph name="EXTENSION_NAME" />"ను ఆమోదించమని తల్లి/తండ్రిని అడగండి</translation>
 <translation id="8813969267212093033">సిస్టమ్ వచనం ఈ భాషలో చూపబడుతుంది</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8814687660896548945">దయచేసి వేచి ఉండండి. ఆర్కైవ్ స్కాన్ అవుతోంది...</translation>
@@ -6031,6 +6061,7 @@
 <translation id="9203398526606335860">&amp;ప్రొఫైలింగ్ అనుమతించబడింది</translation>
 <translation id="9203904171912129171">ఒక పరికరాన్ని ఎంచుకోండి</translation>
 <translation id="9203962528777363226">ఈ పరికరం యొక్క నిర్వాహకుడు కొత్త‌ వినియోగదారులను జోడించడం నిలిపివేశారు</translation>
+<translation id="9211177926627870898">అప్‌డేట్ అవసరం</translation>
 <translation id="9214520840402538427">అయ్యో!  ఇన‌స్ట‌లేష‌న్-సమయ లక్షణాల ప్రారంభ సమయం ముగిసింది.  దయచేసి మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation>
 <translation id="9214695392875603905">కప్ కేక్</translation>
 <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" జోడించబడింది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index a2f7487..bbc3839 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">อ่านและเปลี่ยนแปลงข้อมูลทั้งหมดในเว็บไซต์ปัจจุบันเมื่อเรียกใช้</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> ต้องการรีเซ็ตการตั้งค่าของคุณ</translation>
 <translation id="1243314992276662751">อัปโหลด</translation>
-<translation id="1243398753772016127">เว็บไซต์จะใช้กิจกรรมการท่องเว็บตามเว็บไซต์ต่างๆ เพื่อปรับโฆษณาตามโปรไฟล์ของผู้ใช้ไม่ได้</translation>
 <translation id="1244265436519979884">กำลังดำเนินการคืนค่า Linux</translation>
 <translation id="1244303850296295656">ข้อผิดพลาดของส่วนขยาย</translation>
 <translation id="1246905108078336582">นำคำแนะนำออกจากคลิปบอร์ดไหม</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">เปิด - การตั้งค่าที่กำหนดเอง</translation>
 <translation id="1489664337021920575">เลือกตัวเลือกอื่น</translation>
 <translation id="1493892686965953381">กำลังรอ <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">รวมถึงล้างข้อมูลการท่องเว็บ (<ph name="URL" />) ซึ่งอาจนำคุณออกจากระบบของ Google.com</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> อุปกรณ์อื่นๆ ที่พร้อมใช้งาน</translation>
 <translation id="1495677929897281669">กลับไปที่แท็บ</translation>
 <translation id="1499271269825557605">หากคุณจำส่วนขยายไม่ได้ หรือหากเบราว์เซอร์ไม่ทำงานตามที่คิด คุณปิดหรือกำหนดค่าการทำงานของส่วนขยายด้วยตนเองได้ที่นี่</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">ไอคอนนี้จะปรากฏเมื่อส่วนขยายสามารถทำงานบนหน้าเว็บปัจจุบัน ใช้ส่วนขยายนี้โดยคลิกที่ไอคอน หรือกด <ph name="EXTENSION_SHORTCUT" /></translation>
 <translation id="257779572837908839">ตั้งค่าเป็น Chromebox วิดีโอคอนเฟอเรนซ์</translation>
 <translation id="2580889980133367162">อนุญาตให้ <ph name="HOST" /> ดาวน์โหลดไฟล์หลายไฟล์เสมอ</translation>
-<translation id="2580924999637585241">รวม: <ph name="SHEETS_LABEL" /> <ph name="NUMBER_OF_SHEETS" /> หน้า</translation>
 <translation id="258095186877893873">ยาว</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (แพลตฟอร์ม <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">ดึงข้อมูลตั๋ว Kerberos ไม่สำเร็จ ลองอีกครั้ง หรือติดต่อผู้ดูแลระบบอุปกรณ์ขององค์กร (รหัสข้อผิดพลาด <ph name="ERROR_CODE" />)</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">บล็อกป๊อปอัปอยู่:</translation>
 <translation id="480990236307250886">เปิดหน้าแรก</translation>
 <translation id="4811503964269049987">จัดกลุ่มแท็บที่เลือก</translation>
-<translation id="4811818760963189951">ปิดเพราะคุณปิดการซิงค์ประวัติการเข้าชมไว้</translation>
 <translation id="4813136279048157860">รูปภาพของฉัน</translation>
 <translation id="4813512666221746211">ข้อผิดพลาดของเครือข่าย</translation>
 <translation id="4814378367953456825">ป้อนชื่อให้ลายนิ้วมือนี้</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">การตั้งค่าเนื้อหาเพิ่มเติม</translation>
 <translation id="5042282098504489593">เปิดการตั้งค่าเพื่อเชื่อมต่อ <ph name="USB_DEVICE_NAME" /> กับ Linux</translation>
 <translation id="5043913660911154449">หรือระบุ PPD ของเครื่องพิมพ์ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">ปิดเพราะคุณเข้ารหัสข้อมูลที่ซิงค์ด้วยรหัสผ่าน</translation>
 <translation id="5045550434625856497">รหัสผ่านไม่ถูกต้อง</translation>
 <translation id="504561833207953641">กำลังเปิดในเซสชันเบราว์เซอร์ที่มีอยู่</translation>
 <translation id="5047421709274785093">บล็อกเว็บไซต์ไม่ให้ใช้เซ็นเซอร์จับความเคลื่อนไหวและเซ็นเซอร์แสง</translation>
@@ -3143,7 +3138,7 @@
 <translation id="5260508466980570042">ขออภัย ไม่สามารถยืนยันอีเมลหรือรหัสผ่านของคุณได้ โปรดลองอีกครั้ง</translation>
 <translation id="5261683757250193089">เปิดในเว็บสโตร์</translation>
 <translation id="5262178194499261222">นำรหัสผ่านออก</translation>
-<translation id="5263468185123738872">โปรดเปิด Plugin VM เพื่อติดตั้งระบบปฏิบัติการภายนอก</translation>
+<translation id="5263468185123738872">โปรดเปิด Plugin VM เพื่อติดตั้งระบบปฏิบัติการอื่น</translation>
 <translation id="5264148714798105376">อาจใช้เวลาประมาณ 1 นาที</translation>
 <translation id="5264252276333215551">โปรดเชื่อมต่ออินเทอร์เน็ตเพื่อเปิดแอปในโหมดคีออสก์</translation>
 <translation id="5265562206369321422">ออฟไลน์นานกว่าหนึ่งสัปดาห์</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">เฉพาะผู้ที่มีรหัสผ่านของคุณเท่านั้นจึงจะสามารถอ่านข้อมูลที่เข้ารหัสของคุณได้ Google จะไม่ส่งหรือจัดเก็บรหัสผ่านนี้ หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ คุณจะต้อง<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation>
 <translation id="6357619544108132570">ยินดีต้อนรับสู่ครอบครัว <ph name="SHORT_PRODUCT_NAME" /> คอมพิวเตอร์นี้ไม่ธรรมดา</translation>
 <translation id="6358884629796491903">มังกร</translation>
-<translation id="6360719647236334056">ใช้ประวัติการท่องเว็บใน Chrome เพื่อปรับเปลี่ยน Search, โฆษณา และบริการอื่นๆ ของ Google ให้เหมาะกับคุณ</translation>
 <translation id="6361850914223837199">รายละเอียดข้อผิดพลาด:</translation>
 <translation id="6362853299801475928">&amp;รายงานปัญหา...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">แจ้งให้เราทราบถึงความพึงพอใจ</translation>
 <translation id="6759193508432371551">รีเซ็ตเป็นค่าเริ่มต้นจากโรงงาน</translation>
 <translation id="6762833852331690540">เปิด</translation>
-<translation id="6764693078871405569">รวมถึงล้างข้อมูลการท่องเว็บ (<ph name="URL" />) ซึ่งอาจนำคุณออกจากระบบของ <ph name="DOMAIN" /></translation>
 <translation id="6767566652486411142">เลือกภาษาอื่น...</translation>
 <translation id="6767639283522617719">เข้าร่วมโดเมนไม่ได้ ตรวจสอบว่าการตั้งค่าสำหรับหน่วยขององค์กรถูกต้อง</translation>
 <translation id="6769712124046837540">กำลังเพิ่มเครื่องพิมพ์...</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 6ea2923..b844be19 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Çağrıldığında geçerli web sitesindeki tüm verilerinizi okuma ve değiştirme</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />, ayarlarınızı sıfırlamak istiyor.</translation>
 <translation id="1243314992276662751">Yükle</translation>
-<translation id="1243398753772016127">Siteler, reklamları kişiselleştirmek için farklı sitelerde gezinme etkinliğinizi kullanamaz</translation>
 <translation id="1244265436519979884">Linux için geri yükleme şu anda devam ediyor</translation>
 <translation id="1244303850296295656">Uzantı hatası</translation>
 <translation id="1246905108078336582">Öneri panodan kaldırılsın mı?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Açık - özel ayarlar</translation>
 <translation id="1489664337021920575">Başka bir seçenek belirleyin</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> bekleniyor...</translation>
-<translation id="1494438840282430403">Ayrıca tarama verilerini (<ph name="URL" />) temizle. Bu işlem Google.com oturumunuzu kapatabilir.</translation>
 <translation id="1495486559005647033">Kullanılabilir <ph name="NUM_PRINTERS" /> cihaz daha var.</translation>
 <translation id="1495677929897281669">Sekmeye dön</translation>
 <translation id="1499271269825557605">Bir uzantıyı tanımıyorsanız ya da tarayıcınız beklendiği gibi çalışmıyorsa uzantıları burada kapatabilir veya özelleştirebilirsiniz.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Uzantı, mevcut sayfada işlem yapabildiğinde bu simge görünür. Simgeyi tıklayarak veya <ph name="EXTENSION_SHORTCUT" /> tuşuna basarak bu uzantıyı kullanın.</translation>
 <translation id="257779572837908839">Chromebox video konferansı olarak kurun</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> ana makinesinin birden fazla dosya indirmesine her zaman izin ver</translation>
-<translation id="2580924999637585241">Toplam: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Uzun</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Platform: <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos bileti alınamadı. Tekrar deneyin veya kuruluşunuzun cihaz yöneticisi ile iletişim kurun. (Hata kodu <ph name="ERROR_CODE" />).</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Engellenen pop-up'lar:</translation>
 <translation id="480990236307250886">Ana sayfayı aç</translation>
 <translation id="4811503964269049987">Seçilen Sekmeleri Grupla</translation>
-<translation id="4811818760963189951">Geçmiş senkronizasyonunu devre dışı bıraktığınızdan kapatıldı</translation>
 <translation id="4813136279048157860">Görsellerim</translation>
 <translation id="4813512666221746211">Ağ hatası</translation>
 <translation id="4814378367953456825">Bu parmak izi için bir ad girin</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Ek içerik ayarları</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> cihazını Linux'a bağlamak için Ayarlar'ı açın</translation>
 <translation id="5043913660911154449">İsterseniz yazıcınızın PPD'sini de belirtebilirsiniz <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Senkronizasyon verilerinizi bir parola ile şifrelediğinizden kapatıldı</translation>
 <translation id="5045550434625856497">Hatalı parola</translation>
 <translation id="504561833207953641">Mevcut tarayıcı oturumunda açılıyor.</translation>
 <translation id="5047421709274785093">Sitelerin hareket ve ışık sensörlerini kullanmasını engelle</translation>
@@ -3966,7 +3961,6 @@
 <translation id="63566973648609420">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 <ph name="BEGIN_LINK" />senkronizasyonu sıfırlamanız<ph name="END_LINK" /> gerekir.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> ailesine hoş geldiniz. Bu sıradan bir bilgisayar değildir.</translation>
 <translation id="6358884629796491903">Ejderha</translation>
-<translation id="6360719647236334056">Arama, reklamlar ve diğer Google hizmetlerini kişiselleştirmek için Chrome tarama geçmişinizi kullanın</translation>
 <translation id="6361850914223837199">Hata ayrıntıları:</translation>
 <translation id="6362853299801475928">&amp;Sorun bildir...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4244,7 +4238,6 @@
 <translation id="6758056191028427665">Bizimle ilgili görüşünüzü bildirin.</translation>
 <translation id="6759193508432371551">Fabrika ayarlarına sıfırlama</translation>
 <translation id="6762833852331690540">Açık</translation>
-<translation id="6764693078871405569">Ayrıca tarama verilerini (<ph name="URL" />) temizle. Bu işlem <ph name="DOMAIN" /> oturumunuzu kapatabilir.</translation>
 <translation id="6767566652486411142">Başka Bir Dil Seç...</translation>
 <translation id="6767639283522617719">Alan adına katılınamıyor. Kuruluş birimi ayarlarının doğruluğundan emin olun.</translation>
 <translation id="6769712124046837540">Yazıcı ekleniyor...</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 80a057cf..5e40f9c 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Читати та змінювати всі ваші дані на поточному веб-сайті, коли він викликається</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> хоче скинути ваші налаштування.</translation>
 <translation id="1243314992276662751">Завантажити</translation>
-<translation id="1243398753772016127">Сайти не можуть використовувати дані про ваші дії у веб-переглядачі, щоб персоналізувати рекламу</translation>
 <translation id="1244265436519979884">Триває відновлення Linux</translation>
 <translation id="1244303850296295656">Помилка розширення</translation>
 <translation id="1246905108078336582">Видалити пропозицію з буфера обміну?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Спеціальні налаштування ввімкнено</translation>
 <translation id="1489664337021920575">Вибрати інший варіант</translation>
 <translation id="1493892686965953381">Очікування <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Також видалити дані веб-перегляду (<ph name="URL" />), що може призвести до виходу з облікового запису на веб-сайті Google.com.</translation>
 <translation id="1495486559005647033">Інші доступні пристрої: <ph name="NUM_PRINTERS" />.</translation>
 <translation id="1495677929897281669">Назад на вкладку</translation>
 <translation id="1499271269825557605">Якщо ви не впізнаєте розширення або веб-переглядач працює неналежним чином, вимкніть чи налаштуйте розширення тут.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Цей значок відображатиметься, якщо розширення зможе працювати на поточній сторінці. Запустіть розширення, натиснувши значок або комбінацію клавіш <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Налаштувати як Chromebox для відеоконференцій</translation>
 <translation id="2580889980133367162">Завжди дозволяти <ph name="HOST" /> завантажувати декілька файлів</translation>
-<translation id="2580924999637585241">Усього: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Довго</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (платформа <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Не вдалось отримати квиток Kerberos. Повторіть спробу або зв'яжіться з адміністратором пристрою у своїй організації. (Код помилки: <ph name="ERROR_CODE" />)</translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Спливаючі вікна заблоковано:</translation>
 <translation id="480990236307250886">Відкрити домашню сторінку</translation>
 <translation id="4811503964269049987">Додати вибрану вкладку в групу</translation>
-<translation id="4811818760963189951">Вимкнено, оскільки ви вимкнули синхронізацію історії</translation>
 <translation id="4813136279048157860">Мої зображення</translation>
 <translation id="4813512666221746211">Помилка мережі</translation>
 <translation id="4814378367953456825">Введіть назву цього відбитка пальця</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Додаткові налаштування контенту</translation>
 <translation id="5042282098504489593">Відкрийте налаштування, щоб під’єднати <ph name="USB_DEVICE_NAME" /> до Linux</translation>
 <translation id="5043913660911154449">Або виберіть файл PPD принтера <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Вимкнено, оскільки ви зашифрували синхронізовані дані парольною фразою</translation>
 <translation id="5045550434625856497">Неправильний пароль</translation>
 <translation id="504561833207953641">Відкривається в наявному сеансі веб-переглядача.</translation>
 <translation id="5047421709274785093">Заборонити сайтам доступ до датчиків руху й світла</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Ваші зашифровані дані можуть переглядати лише користувачі, які знають вашу парольну фразу. Парольна фраза не надсилається й не зберігається в Google. Якщо ви забули її або хочете змінити це налаштування, <ph name="BEGIN_LINK" />скиньте синхронізацію<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Вітаємо у світі <ph name="SHORT_PRODUCT_NAME" />. Це не звичайний комп’ютер.</translation>
 <translation id="6358884629796491903">Дракон</translation>
-<translation id="6360719647236334056">Персоналізуйте Пошук, оголошення й інші сервіси Google за допомогою історії веб-перегляду Chrome</translation>
 <translation id="6361850914223837199">Деталі помилки:</translation>
 <translation id="6362853299801475928">&amp;Повідомити про проблему...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Поділіться з нами своїми враженнями.</translation>
 <translation id="6759193508432371551">Відновлення заводських налаштувань</translation>
 <translation id="6762833852331690540">Увімкнено</translation>
-<translation id="6764693078871405569">Також видалити дані веб-перегляду (<ph name="URL" />), що може призвести до виходу з облікового запису на веб-сайті <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Вибрати іншу мову…</translation>
 <translation id="6767639283522617719">Не вдається приєднатися до домену. Переконайтеся, що налаштування для організаційного підрозділу правильні.</translation>
 <translation id="6769712124046837540">Додавання принтера…</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb
index ebbbf3b..f39b314 100644
--- a/chrome/app/resources/generated_resources_ur.xtb
+++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -189,7 +189,6 @@
 <translation id="1241753985463165747">موجودہ ویب سائٹ پر موجود اپنے سبھی ڈیٹا کو چلائے جانے پر پڑھیں اور انہیں تبدیل کریں</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> آپ کی ترتیبات کو دوبارہ ترتیب دینا چاہتا ہے۔</translation>
 <translation id="1243314992276662751">اپ لوڈ کریں</translation>
-<translation id="1243398753772016127">اشتہارات کو مختلف سائٹس پر ذاتی نوعیت کا بنانے کے لیے سائٹس آپ کے براؤزنگ کی سرگرمی کا استعمال نہیں کر سکتی ہیں</translation>
 <translation id="1244265436519979884">‏Linux بحالی فی الحال جاری ہے</translation>
 <translation id="1244303850296295656">ایکسٹینشن میں خرابی</translation>
 <translation id="1246905108078336582">کلپ بورڈ سے تجویز ہٹائیں؟</translation>
@@ -356,7 +355,6 @@
 <translation id="1487335504823219454">آن - حسب ضرورت ترتیبات</translation>
 <translation id="1489664337021920575">دوسرے اختیار کا انتخاب کریں</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> کیلئے منتظر…</translation>
-<translation id="1494438840282430403">‏براؤزنگ ڈیٹا (<ph name="URL" />) بھی صاف کریں جس سے آپ Google.com سے سائن آؤٹ ہو سکتے ہیں۔</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> دیگر دستیاب آلات۔</translation>
 <translation id="1495677929897281669">ٹیب پر واپس جائیں</translation>
 <translation id="1499271269825557605">اگر آپ ایکسٹینشن کی شناخت نہیں کرتے ہیں یا آپ کا براؤزر توقع کے مطابق کام نہیں کرتا ہے تو آپ ایکسٹینشنز کو آف یا یہاں ان کو حسب ضرورت بنا سکتے ہیں۔</translation>
@@ -1188,7 +1186,6 @@
 <translation id="2575247648642144396">جب ایکسٹینشن موجودہ صفحہ پر کارروائی کر سکے گا تو یہ آئیکن دیکھا جا سکے گا۔ آئیکن پر کلک کر کے یا <ph name="EXTENSION_SHORTCUT" /> کو دبا کر اس ایکسٹینشن کو استعمال کریں۔</translation>
 <translation id="257779572837908839">‏Chromebox برائے میٹنگز کے طور پر سیٹ کریں</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> کو ہمیشہ متعدد فائلیں ڈاؤن لوڈ کرنے کی اجازت دیں</translation>
-<translation id="2580924999637585241">کُل: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">طویل</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (پلیٹ فارم <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">‏Kerberos کی ٹکٹ حاصل نہیں کی جا سکی۔ دوبارہ کوشش کریں یا اپنی تنظیم کے آلہ کے منتظم سے رابطہ کریں۔ (خرابی کا کوڈ <ph name="ERROR_CODE" />)۔</translation>
@@ -1715,7 +1712,7 @@
 <translation id="3293644607209440645">یہ صفحہ بھیجیں</translation>
 <translation id="32939749466444286">‏Linux کنٹینر شروع نہیں ہوا۔ براہ کرم دوبارہ کوشش کریں۔</translation>
 <translation id="3294437725009624529">مہمان</translation>
-<translation id="3296193636298964625">‏بہت سارے پاس ورڈز ہونے کی وجہ سے Chrome آپ کے تمام پاس ورڈز کو چیک نہیں کر سکتا ہے۔</translation>
+<translation id="3296193636298964625">‏بہت سارے پاس ورڈز ہونے کی وجہ سے Chrome آپ کے تمام پاس ورڈز کو چیک نہیں کر سکا۔</translation>
 <translation id="329703603001918157">شارٹ کٹ میں ترمیم نہیں کیا جا سکتی</translation>
 <translation id="329838636886466101">درست کریں</translation>
 <translation id="3298789223962368867">‏غلط URL درج کیا گیا۔</translation>
@@ -2811,7 +2808,6 @@
 <translation id="4808667324955055115">پوپ - اپس مسدود ہیں:</translation>
 <translation id="480990236307250886">ہوم صفحہ کھولیں</translation>
 <translation id="4811503964269049987">منتخب کردہ ٹیب کا گروپ بنائیں</translation>
-<translation id="4811818760963189951">آف ہے کیونکہ آپ نے سرگزشت کی مطابقت پذیری غیر فعال کر دی ہے</translation>
 <translation id="4813136279048157860">میری تصاویر</translation>
 <translation id="4813512666221746211">نیٹ ورک کی خرابی</translation>
 <translation id="4814378367953456825">اس فنگر پرنٹ کے لئے ایک نام درج کریں</translation>
@@ -2980,7 +2976,6 @@
 <translation id="5040823038948176460">اضافی مواد کی ترتیبات</translation>
 <translation id="5042282098504489593">‏<ph name="USB_DEVICE_NAME" /> کو Linux سے منسلک کرنے کیلئے ترتیبات کھولیں</translation>
 <translation id="5043913660911154449">‏یا اپنے پرنٹر PPD کی وضاحت کریں <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">آف ہے کیونکہ آپ نے اپنا سنک ڈیٹا ایک پاس فریز سے مرموز کیا ہے</translation>
 <translation id="5045550434625856497">غلط پاس ورڈ</translation>
 <translation id="504561833207953641">موجودہ براؤزر کے سیشن میں کھل رہا ہے۔</translation>
 <translation id="5047421709274785093">سائٹس کو موشن اور لائٹ سینسرز استعمال کرنے سے مسدود کریں</translation>
@@ -2990,7 +2985,7 @@
 <translation id="5052499409147950210">سائٹ میں ترمیم کریں</translation>
 <translation id="5053604404986157245">‏اتفاقی طور پر تیار کردہ TPM پاس ورڈ دستیاب نہیں ہے۔ پاور واش کے بعد یہ عام سی چیز ہے۔</translation>
 <translation id="5057110919553308744">جب آپ ایکسٹینشن پر کلک کرتے ہیں</translation>
-<translation id="5057403786441168405">‏اپنے سائن ان کردہ اکاؤنٹس کا نظم کریں۔ Chrome اور Google Play کی ویب سائٹس، ایپس اور ایکسٹینشنز اجازتوں کی بنیاد پر آپ کے تجربہ کو حسب ضرورت بنانے کیلئے ان اکاؤنٹس کا استعمال کر سکتی ہیں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
+<translation id="5057403786441168405">‏اپنے سائن ان کردہ اکاؤنٹس کا نظم کریں۔ ویب سائٹس، ایپس اور Chrome اور Google Play میں ایکسٹینشنز اجازتوں کی بنیاد پر آپ کے تجربہ کو حسب ضرورت بنانے کیلئے ان اکاؤنٹس کا استعمال کر سکتی ہیں۔ <ph name="LINK_BEGIN" />مزید جانیں<ph name="LINK_END" /></translation>
 <translation id="5060332552815861872">محفوظ کرنے کے لیے 1 پرنٹر دستیاب ہے۔</translation>
 <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{اس فولڈر میں ایک بُک مارک شامل ہے۔ کیا آپ واقعی اسے حذف کرنا چاہتے ہیں؟}other{اس فولڈر میں # بُک مارکس شامل ہیں۔ کیا آپ واقعی اسے حذف کرنا چاہتے ہیں؟}}</translation>
 <translation id="5062930723426326933">سائن ان ناکام ہوگیا، براہ کرم انٹرنیٹ سے منسلک ہوں اور دوبارہ کوشش کریں۔</translation>
@@ -3485,7 +3480,7 @@
 <translation id="5722930212736070253">افوہ! زِپ آرکائیور میں ایک خرابی پیش آ گئی ہے۔</translation>
 <translation id="572328651809341494">حالیہ ٹیبز</translation>
 <translation id="5723508132121499792">کوئی پس منظر ایپس نہیں چل رہی ہیں</translation>
-<translation id="5723967018671998714">فریق ثالث کے کوکیز کو پوشیدگی وضع میں مسدود کردیا گیا ہے</translation>
+<translation id="5723967018671998714">فریق ثالث کی کوکیز پوشیدگی وضع میں مسدود کی جاتی ہیں</translation>
 <translation id="5727728807527375859">ایکسٹینشز، ایپس اور تھیمز آپ کے کمپیوٹر کو نقصان پہنچا سکتی ہیں۔ کیا آپ واقعی جاری رکھنا چاہتے ہیں؟</translation>
 <translation id="5729712731028706266">&amp;منظر</translation>
 <translation id="5732392974455271431">آپ کے والدین آپ کیلئے اسے غیر مسدود کر سکتے ہیں</translation>
@@ -3956,7 +3951,6 @@
 <translation id="63566973648609420">‏صرف وہ شخص جس کے پاس آپ کا پاس فریز ہے آپ کے مرموز کردہ ڈیٹا کو پڑھ سکتا ہے۔ پاس فریز Google کو نہیں بھیجا جاتا یا اس کے ذریعے اسٹور نہیں کیا جاتا ہے۔ اگر آپ اپنا پاس فریز بھول جاتے ہیں یا اس ترتیب کو تبدیل کرنا چاہتے ہیں تو آپ کو <ph name="BEGIN_LINK" />مطابقت پذیری دوبارہ ترتیب دینے<ph name="END_LINK" /> کی ضرورت ہوگی۔</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> فیملی میں خوش آمدید۔ یہ معمولی کمپیوٹر نہیں ہے۔</translation>
 <translation id="6358884629796491903">ڈریگن</translation>
-<translation id="6360719647236334056">‏تلاش، اشتہارات اور Google کی دیگر سروسز کو ذاتی نوعیت کا بنانے کے لیے اپنی Chrome براؤزنگ سرگزشت استعمال کریں</translation>
 <translation id="6361850914223837199">خرابی کی تفصیلات</translation>
 <translation id="6362853299801475928">&amp;ایک مسئلہ کی اطلاع دیں…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4234,7 +4228,6 @@
 <translation id="6758056191028427665">ہماری کارکردگی کے بارے میں ہمیں بتائیں۔</translation>
 <translation id="6759193508432371551">فیکٹری ری سیٹ</translation>
 <translation id="6762833852331690540">آن</translation>
-<translation id="6764693078871405569">براؤزنگ ڈیٹا (<ph name="URL" />) بھی صاف کریں جس سے آپ <ph name="DOMAIN" /> سے سائن آؤٹ ہو جائیں گے۔</translation>
 <translation id="6767566652486411142">کسی دوسری زبان کا انتخاب کریں...</translation>
 <translation id="6767639283522617719">ڈومین میں شامل نہیں کیا جا سکا۔ یقینی بنائیں کہ ترتیبات تنظیمی یونٹ کے لیے درست ہیں۔</translation>
 <translation id="6769712124046837540">پرنٹر کو شامل کیا جا رہا ہے…</translation>
@@ -4354,7 +4347,7 @@
 <translation id="6922745772873733498">پرنٹ کرنے کے لیے پِن درج کریں</translation>
 <translation id="6923132443355966645">سکرول / کلک کریں</translation>
 <translation id="6923633482430812883">‏اشتراک کو ماؤنٹ کرنے میں خرابی پیش آگئی۔ براہ کرم چیک کریں کہ جس فائل سرور سے آپ منسلک ہو رہے ہیں وہ SMBv2 یا اس کے بعد کے ورژن کا تعاون کرتا ہے۔</translation>
-<translation id="692615146179981818">اس پاس ورڈ کو ہٹانے سے آپ کا اکاؤنٹ <ph name="DOMAIN" /> سے حذف نہیں ہوگا۔ اپنا اکاؤنٹ دوسروں سے محفوظ رکھنے کیلئے <ph name="DOMAIN" /> سے حذف کریں یا اپنا پاس ورڈ تبدیل کریں۔</translation>
+<translation id="692615146179981818">اس پاس ورڈ کو ہٹانے سے آپ کا اکاؤنٹ <ph name="DOMAIN" /> سے حذف نہیں ہوگا۔ اپنا اکاؤنٹ دوسروں سے محفوظ رکھنے کیلئے اپنا پاس ورڈ تبدیل کریں یا <ph name="DOMAIN" /> سے اپنا اکاؤنٹ حذف کریں۔</translation>
 <translation id="6930036377490597025">بیرونی سیکیورٹی کلید یا پہلے سے شامل سینسر</translation>
 <translation id="6930161297841867798">{NUM_EXTENSIONS,plural, =1{ایک ایکسٹینشن مسترد کر دی گئی ہے}other{# ایکسٹینشنز مسترد کر دی گئی ہیں}}</translation>
 <translation id="6930321203306643451">اپ گریڈ مکمل ہو گیا</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb
index c8ef183c..332b62e4 100644
--- a/chrome/app/resources/generated_resources_uz.xtb
+++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -52,6 +52,7 @@
 <translation id="1058262162121953039">PUK</translation>
 <translation id="1061745542578250838"><ph name="FILE_NAME" /> fayli ichida virusli kontent mavjudligi ehtimoli tufayli bloklandi.</translation>
 <translation id="1061904396131502319">Tanaffus qilish vaqti keldi</translation>
+<translation id="1064552680598333868">Mikrofon oʻzgarishlari Linux qayta ishga tushganda kuchga kiradi.</translation>
 <translation id="1067048845568873861">Yaratilgan sanasi</translation>
 <translation id="1067291318998134776">Linux (Beta)</translation>
 <translation id="1067922213147265141">Boshqa Google xizmatlari</translation>
@@ -112,6 +113,7 @@
 <translation id="1147991416141538220">Ruxsat olish uchun bu qurilma administratoriga murojaat qiling.</translation>
 <translation id="1149401351239820326">Muddati tugaydigan oy</translation>
 <translation id="1150565364351027703">Qora ko‘zoynak</translation>
+<translation id="1151841030700667295">Barcha saytlardagi hisobingizdan avtomatik chiqarilasiz (shuningdek, ochiq varaqlardan ham).</translation>
 <translation id="1151917987301063366"><ph name="HOST" /> saytiga sensorlardan foydalanishga doim ruxsat berilsin</translation>
 <translation id="1153356358378277386">Ulangan qurilmalar</translation>
 <translation id="1153636665119721804">Google Kengaytirilgan himoya dasturi</translation>
@@ -189,7 +191,6 @@
 <translation id="1241753985463165747">Chaqirilganda joriy sayt ma’lumotlarini ko‘rish va o‘zgartirishga ruxsat berish</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> brauzerning dastlabki sozlamalarini tiklamoqchi.</translation>
 <translation id="1243314992276662751">Yuklash</translation>
-<translation id="1243398753772016127">Saytlar reklamalarni sizga moslashtirish uchun brauzerdagi faoliyatingizni kuzata olmaydi</translation>
 <translation id="1244265436519979884">Ayni vaqtda Linux fayllari tiklanmoqda</translation>
 <translation id="1244303850296295656">Kengaytma xatoligi</translation>
 <translation id="1246905108078336582">Klipbord taklifi olib tashlansinmi?</translation>
@@ -281,6 +282,7 @@
 <translation id="1386387014181100145">Salom!</translation>
 <translation id="138784436342154190">Standart boshlang‘ich sahifa tiklansinmi?</translation>
 <translation id="1390548061267426325">Oddiy ichki oynada ochish</translation>
+<translation id="1392232653471491344">Linuxni qaytadan ishga tushirish kerak</translation>
 <translation id="1393283411312835250">Quyosh va bulutlar</translation>
 <translation id="1393787139683794508">Bunda <ph name="ORIGIN_NAME" /> saytidan saqlangan barcha maʼlumotlar va cookie fayllar tozalab tashlanadi.</translation>
 <translation id="1395730723686586365">Yangilash vositasi ishga tushdi</translation>
@@ -309,6 +311,7 @@
 <translation id="1420920093772172268">Ulanishga ruxsat berish uchun <ph name="TURN_ON_BLUETOOTH_LINK" /></translation>
 <translation id="1422159345171879700">Xavfsiz bo‘lmagan skriptlarni yuklash</translation>
 <translation id="1426410128494586442">Ha</translation>
+<translation id="142655739075382478"><ph name="APP_NAME" /> bloklandi</translation>
 <translation id="1426870617281699524">“Qayta urinish” ustiga bosing va kompyuteringizda so‘rovni qabul qiling</translation>
 <translation id="1427269577154060167">Mamlakat</translation>
 <translation id="142758023928848008">Yopishqoq klavishlar yoqilsin (tezkor tugmalarni navbat bilan terish orqali bajarish)</translation>
@@ -347,6 +350,7 @@
 <translation id="1476607407192946488">Til sozlamalari</translation>
 <translation id="1478340334823509079">Batafsil ma’lumotlar: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">O‘rnatishga ruxsat berilmagan</translation>
+<translation id="1481537595330271162">Disk hajmi oʻzgarmadi</translation>
 <translation id="1482626744466814421">Bu varaqni bukmarklash...</translation>
 <translation id="1483493594462132177">Yuborish</translation>
 <translation id="1484979925941077974">Saytda Bluetooth ishlatilmoqda</translation>
@@ -356,7 +360,6 @@
 <translation id="1487335504823219454">Yoniq – foydalanuvchi sozlamalari</translation>
 <translation id="1489664337021920575">Boshqasini tanlang</translation>
 <translation id="1493892686965953381"><ph name="LOAD_STATE_PARAMETER" /> yuklanishi kutilmoqda...</translation>
-<translation id="1494438840282430403">Shuningdek, brauzer tarixi (<ph name="URL" />) ham tozalansin (Google.com hisobingizdan avtomatik chiqib ketasiz).</translation>
 <translation id="1495486559005647033">Boshqa mavjud qurilmalar soni: <ph name="NUM_PRINTERS" /></translation>
 <translation id="1495677929897281669">Varaqqa qaytish</translation>
 <translation id="1499271269825557605">Kengaytmani tanimasangiz yoki brauzer kutganingizdek ishlamasa, kengaytmalarni bu yerdan faolsizlantirishingiz yoki boshqarishingiz mumkin.</translation>
@@ -605,6 +608,7 @@
 <translation id="1805822111539868586">Sahifalar kodini ko‘rib chiqish</translation>
 <translation id="1805888043020974594">Bosma server</translation>
 <translation id="1805967612549112634">PIN kodni tasdiqlang</translation>
+<translation id="1806335016774576568">Boshqa ochiq ilovaga oʻtish</translation>
 <translation id="1809734401532861917">Xatcho‘plar, tarix, parollar va boshqa sozlamalarim <ph name="USER_EMAIL_ADDRESS" /> hisobida saqlansin.</translation>
 <translation id="1813278315230285598">Xizmatlar</translation>
 <translation id="18139523105317219">EDI tarafi nomi</translation>
@@ -691,6 +695,7 @@
 <translation id="1921050530041573580">Telefonni Xabarlar ilovangizga ulang</translation>
 <translation id="1921584744613111023"><ph name="DPI" /> dpi</translation>
 <translation id="192494336144674234">Quyidagi bilan ochish…</translation>
+<translation id="1925017091976104802">Joylash uchun <ph name="MODIFIER_KEY_DESCRIPTION" /> tugmalarini bosing</translation>
 <translation id="1925021887439448749">Boshqa veb-manzilni kiriting</translation>
 <translation id="1925124445985510535">Xavfsizlik tekshiruvi <ph name="TIME" /> da bajarilgan</translation>
 <translation id="1926339101652878330">Bu sozlamalar korporativ tartib-qoidalarga ko‘ra nazorat qilinadi. Qo‘shimcha ma’lumot olish uchun administratorga murojaat qiling.</translation>
@@ -836,6 +841,7 @@
 <translation id="2135787500304447609">&amp;Qaytarish</translation>
 <translation id="2136372518715274136">Yangi parolni kiriting</translation>
 <translation id="2136476978468204130">Kodli ibora xato kiritildi</translation>
+<translation id="2137122615728646911">{COUNT,plural, =0{Cookie fayllari bloklandi.}=1{Cookie fayllari bloklandi, 1 ta istisno}other{Cookie fayllari bloklandi, {COUNT} ta istisno}}</translation>
 <translation id="2138398485845393913">“<ph name="DEVICE_NAME" />” qurilmasiga ulanish bajarilmoqda</translation>
 <translation id="2139545522194199494">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, Nomi: <ph name="NETWORK_NAME" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" />%, Administrator boshqaruvida, Ulanish</translation>
 <translation id="2139919072249842737">Sozlash tugmasi</translation>
@@ -1003,11 +1009,13 @@
 <translation id="2346953515226895098">SODA xizmati</translation>
 <translation id="2347644257713614136">Ta’lim muassasalari uchun Hangouts va Cast xizmatlaridan foydalanish Google maxfiylik siyosati bilan tartibga solinadi.</translation>
 <translation id="2348176352564285430">Ilova: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="234889437187286781">Maʼlumotlarni yuklashda xatolik yuz berdi</translation>
 <translation id="2349896577940037438">Agar Kengaytirilgan veb-qidiruv va ilovalar tarixi yoqilsa, bu maʼlumotlar Google hisobingizda saqlanadi. Maʼlumotlaringizni account.google.com orqali koʻrish, oʻchirib tashlash va oʻzgartirish mumkin.</translation>
 <translation id="2350133097354918058">Qayta ishga tushirildi</translation>
 <translation id="2350182423316644347">Ilova ishga tushirilmoqda...</translation>
 <translation id="2350796302381711542">“<ph name="PROTOCOL" />” kabi havolalarga ishlov berish uchun <ph name="REPLACED_HANDLER_TITLE" /> o‘rniga <ph name="HANDLER_HOSTNAME" /> xizmati foydalanilsinmi?</translation>
 <translation id="2351266942280602854">Til va matn kiritish</translation>
+<translation id="2352495879228166246">{NUM_ITEMS,plural, =1{1 ta element}other{{NUM_ITEMS} ta element}}</translation>
 <translation id="2352662711729498748">&lt; 1 MB</translation>
 <translation id="2352810082280059586">Ekran qulfi qaydlari <ph name="LOCK_SCREEN_APP_NAME" /> ilovasiga avtomatik saqlanadi. Oxirgi qaydlar qulflangan ekranda ko‘rsatiladi.</translation>
 <translation id="2353297238722298836">Kamera va mikrofondan foydalanish mumkin</translation>
@@ -1041,6 +1049,7 @@
 <translation id="2392369802118427583">Faollashtirish</translation>
 <translation id="2394566832561516196">Sozlamalar keyingi ishga tushirishda tozalanadi.</translation>
 <translation id="2395616325548404795"><ph name="DEVICE_TYPE" /> qurilmangiz korporativ domen ro‘yxatidan o‘tkazildi, lekin obyekt va uning joylashuvi ma’lumotlarini uzatishda xatolik yuz berdi. Bu ma’lumotni administrator paneli orqali o‘zingiz kiriting.</translation>
+<translation id="2396387085693598316">“<ph name="EXTENSION_NAME" />” administrator tomonidan bloklandi</translation>
 <translation id="2396783860772170191">4 ta raqami PIN kod kiriting (0000-9999)</translation>
 <translation id="2399939490305346086">Elektron kalitdagi kirish maʼlumotlari</translation>
 <translation id="2400664245143453337">Hoziroq yangilanishi zarur</translation>
@@ -1188,7 +1197,6 @@
 <translation id="2575247648642144396">Agar kengaytma joriy sahifada ishlay olsa, uning ikonkasi paydo bo‘ladi. Bu kengaytmani ikonkasi ustiga bosib yoki <ph name="EXTENSION_SHORTCUT" /> tugmalar birkmasini bosib faollashtiring.</translation>
 <translation id="257779572837908839">Video muloqotlar uchun Chromebox sifatida foydalanish</translation>
 <translation id="2580889980133367162"><ph name="HOST" /> saytidan har doim birdaniga bir nechta fayl yuklab olishga ruxsat berilsin</translation>
-<translation id="2580924999637585241">Jami: <ph name="NUMBER_OF_SHEETS" /><ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Uzoq</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (<ph name="PLATFORM_VERSION" /> platformasi) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Kerberos chiptasini olish imkonsiz. Yana urining yoki tashkilotingizning qurilma boʻyicha administratoriga murojaat qiling. (Xatolik kodi: <ph name="ERROR_CODE" />).</translation>
@@ -1329,6 +1337,7 @@
 <translation id="2753677631968972007">Sayt ruxsatlarini qoʻlda boshqarish.</translation>
 <translation id="2755367719610958252">Maxsus imkoniyatlarni sozlash</translation>
 <translation id="275662540872599901">ekran o‘chiq</translation>
+<translation id="2757338480560142065">Saqlayotgan parolingiz <ph name="WEBSITE" /> uchun mos kelishini tekshiring</translation>
 <translation id="2762441749940182211">Kamera bloklandi</translation>
 <translation id="2765217105034171413">Kichik</translation>
 <translation id="2766161002040448006">Ota-onangizdan soʻrang</translation>
@@ -1581,6 +1590,7 @@
 <translation id="3090819949319990166">Tashqi CRX faylni <ph name="TEMP_CRX_FILE" /> jildiga nusxalab bo‘lmadi.</translation>
 <translation id="3090871774332213558">“<ph name="DEVICE_NAME" />” qurilmasi ulandi</translation>
 <translation id="3092699946856346803">SIM kartani joylang va qaytadan urining</translation>
+<translation id="3099836255427453137">{NUM_EXTENSIONS,plural, =1{1 ta ehtimolan zararli kengaytma faolsizlantirildi. Uni oʻchirib tashlash mumkin.}other{{NUM_EXTENSIONS} ta ehtimolan zararli kengaytma faolsizlantirildi. Ularni oʻchirib tashlash mumkin.}}</translation>
 <translation id="3101709781009526431">Sana va vaqt</translation>
 <translation id="3103941660000130485">Linux yangilanmadi</translation>
 <translation id="310671807099593501">Sayt Bluetooth aloqasidan foydalanmoqda</translation>
@@ -1655,6 +1665,7 @@
 <translation id="3201422919974259695">Mavjud USB qurilmalar bu yerda chiqadi.</translation>
 <translation id="3202131003361292969">Fayl yo‘lagi</translation>
 <translation id="3202173864863109533">Bu ichki oyna ovozi o‘chirib qo‘yilgan</translation>
+<translation id="3208321278970793882">Ilova</translation>
 <translation id="3208584281581115441">Hozir tekshirish</translation>
 <translation id="3208703785962634733">Tasdiqlanmagan</translation>
 <translation id="32101887417650595">Printerga ulanmadi</translation>
@@ -1675,6 +1686,7 @@
 <translation id="3239373508713281971"><ph name="APP_NAME" /> uchun vaqt cheklovi olib tashlandi</translation>
 <translation id="3241680850019875542">To‘plamga qo‘shilayotgan kengaytmaning ildiz jildini tanlang. Kengaytmani yangilash uchun esa xususiy kalitni ko‘rsating.</translation>
 <translation id="3244294424315804309">Ovoz o‘chirib qo‘yilsin</translation>
+<translation id="3246107497225150582">{0,plural, =1{Qurilmani 1 kun ichida oʻchirib yoqish kerak}other{Qurilmani # kun ichida oʻchirib yoqish kerak}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – tarmoq xatosi</translation>
 <translation id="3248902735035392926">Xavfsizlik muhim ahamiyatga ega. Vaqt ajrating va hoziroq <ph name="BEGIN_LINK" />kengaytmalaringizni tekshiring<ph name="END_LINK" /></translation>
 <translation id="3249950116250264636"><ph name="APP_NAME" /> (<ph name="APP_URL" />)</translation>
@@ -1761,6 +1773,7 @@
 <translation id="3356580349448036450">Tayyor</translation>
 <translation id="3359256513598016054">Sertifikatlar siyosati cheklovlari</translation>
 <translation id="3360297538363969800">Chop etish vaqtida xatolik yuz berdi. Printer holatini tekshiring va qayta urinib ko‘ring.</translation>
+<translation id="3364986687961713424">Administratordan: <ph name="ADMIN_MESSAGE" /></translation>
 <translation id="3365598184818502391">Ctrl yoki Alt tugmasini bosing</translation>
 <translation id="3367047597842238025"><ph name="DEVICE_TYPE" /> qurilmasini o‘z didingizda sozlang va qo‘lingiz ostidagi ajoyib imkoniyatlar bilan tanishing.</translation>
 <translation id="3368922792935385530">Ulanilgan</translation>
@@ -1865,6 +1878,7 @@
 <translation id="3496213124478423963">Kichiklashtirish</translation>
 <translation id="3497560059572256875">Doodle ulashish</translation>
 <translation id="3498215018399854026">Ota-onangiz bilan bog‘lanib bo‘lmadi. Qaytadan urinib ko‘ring.</translation>
+<translation id="3500417806337761827">Umumiy jild ulanmadi. Allaqachon juda koʻp umumiy SMB jildlar ulangan.</translation>
 <translation id="3505030558724226696">Qurilmadan ruxsatni olib qo‘yish</translation>
 <translation id="3507421388498836150">“<ph name="EXTENSION_NAME" />” uchun joriy ruxsatlar</translation>
 <translation id="3507888235492474624">Bluetooth qurilmalarni qayta qidirish</translation>
@@ -1930,6 +1944,7 @@
 <translation id="3592260987370335752">&amp;Batafsil ma’lumot</translation>
 <translation id="359283478042092570">Kirish</translation>
 <translation id="3593965109698325041">Sertifikat nomiga cheklovlar</translation>
+<translation id="3595381248165458839">Tashkilotingizning qurilma boʻyicha administratoriga murojaat qiling</translation>
 <translation id="3596235046596950091">Bulutli xizmatlarni yoqish</translation>
 <translation id="3596414637720633074">Inkognito rejimidagi tashqi cookie fayllarni taqiqlash</translation>
 <translation id="3599221874935822507">Qavariq</translation>
@@ -2063,6 +2078,7 @@
 <translation id="3742666961763734085">Bu nomdagi tashkilot qismi topilmadi. Qayta urining.</translation>
 <translation id="3744111561329211289">Orqa fonda sinxronlash</translation>
 <translation id="3746127522257263495">Android ilovalariga G Suite for Education hisobini kiritish imkonsiz.</translation>
+<translation id="3747039297326604768">Plugin VM ochilmadi</translation>
 <translation id="3747077776423672805">Ilovalarni oʻchirib tashlash uchun Sozlamalar &gt; Google Play Market &gt; Android sozlamalari boshqaruvi &gt; Ilovalar yoki Ilovalar menejeri menyusiga kiring. Kerakli ilovani tanlab (ilovani topish uchun ekranni oʻng yoki chapga suring), “Oʻchirib tashlash” yoki “Faolsizlantirish” tugmasini bosing.</translation>
 <translation id="3748026146096797577">Ulanilmagan</translation>
 <translation id="3752582316358263300">OK...</translation>
@@ -2138,6 +2154,7 @@
 <translation id="3827774300009121996">&amp;To‘liq ekran rejimi</translation>
 <translation id="3828029223314399057">Xatcho‘plardan qidirish</translation>
 <translation id="3829765597456725595">Fayllarni Samba (SMB) orqali ulashish</translation>
+<translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{1 ta ehtimolan zararli kengaytma administrator tomonidan qayta yoqildi}other{{NUM_EXTENSIONS} ta ehtimolan zararli kengaytma administrator tomonidan qayta yoqildi}}</translation>
 <translation id="3831436149286513437">Google Drive qidiruv tavsiyalari</translation>
 <translation id="383161972796689579">Bu qurilmaning egasi yangi foydalanuvchilarni qo‘shish imkoniyatini o‘chirib qo‘ygan</translation>
 <translation id="3834775135533257713">“<ph name="TO_INSTALL_APP_NAME" />” ilovasi o‘rnatilmadi, chunki u “<ph name="INSTALLED_APP_NAME" />” ilovasi bilan moslasha olmayapti.</translation>
@@ -2314,6 +2331,7 @@
 <translation id="4047726037116394521">Boshiga</translation>
 <translation id="4050225813016893843">Autentifikatsiya usuli</translation>
 <translation id="4052120076834320548">Kichkina</translation>
+<translation id="4056908315660577142">Ota-onangiz Chromedagi <ph name="APP_NAME" /> ilovasi uchun belgilagan foydalanish vaqti tugadi. Ertaga yana <ph name="TIME_LIMIT" /> ishlata olasiz.</translation>
 <translation id="4057041477816018958"><ph name="SPEED" /> - <ph name="RECEIVED_AMOUNT" /></translation>
 <translation id="4057896668975954729">Internet-do‘konda ochish</translation>
 <translation id="4058647953897694817">Bluetooth orqali tasdiqlash</translation>
@@ -2445,6 +2463,7 @@
 <translation id="424963718355121712">Ilovalar yopilishidan avval ochiq qolgan saytlar bilan birga ishga tushiriladi</translation>
 <translation id="4250229828105606438">Skrinshot</translation>
 <translation id="4250680216510889253">Yo‘q</translation>
+<translation id="4252035718262427477">Veb sahifa, yagona faylda (veb arxiv)</translation>
 <translation id="4252852543720145436">Himoyalangan kontent identifikatorlari</translation>
 <translation id="4252899949534773101">Bluetooth yoqilmagan</translation>
 <translation id="4252996741873942488"><ph name="WINDOW_TITLE" /> – varaqni ko‘rishga ruxsat berildi</translation>
@@ -2495,7 +2514,7 @@
 <translation id="4336434711095810371">Barcha maʼlumotlarni tozalash</translation>
 <translation id="4336979451636460645">Tarmoq jurnallarini <ph name="DEVICE_LOG_LINK" /> sahifasida ko‘rish mumkin</translation>
 <translation id="4340515029017875942"><ph name="ORIGIN" /> “<ph name="EXTENSION_NAME" />” ilovasiga ruxsat so‘ramoqda</translation>
-<translation id="434404122609091467">Joriy internet provayderingiz orqali</translation>
+<translation id="434404122609091467">Joriy xizmat provayderingiz orqali</translation>
 <translation id="4345587454538109430">Sozlash...</translation>
 <translation id="4345732373643853732">Bu login serverga notanish</translation>
 <translation id="4348766275249686434">Xatolar haqidagi ma’lumotlarni to‘plash</translation>
@@ -2540,6 +2559,7 @@
 <translation id="4400963414856942668">Varaqni bukmarklash uchun yulduzchani bosing</translation>
 <translation id="4403775189117163360">Boshqa jildni tanlash</translation>
 <translation id="4404136731284211429">Yana qidirish</translation>
+<translation id="4404843640767531781"><ph name="APP_NAME" /> ota-onangiz tomonidan bloklangan. Bu ilovadan foydalanish uchun ota-onangizdan ruxsat oling.</translation>
 <translation id="4405117686468554883">*.jpeg, *.jpg, *.png</translation>
 <translation id="4408599188496843485">&amp;Yordam</translation>
 <translation id="4409697491990005945">Maydonlar</translation>
@@ -2609,6 +2629,7 @@
 <translation id="450099669180426158">Undov belgisi</translation>
 <translation id="4501530680793980440">O‘chirishni tasdiqlash</translation>
 <translation id="4502423230170890588">Shu qurilmadan olib tashlash</translation>
+<translation id="4504374760782163539">{COUNT,plural, =0{Cookie fayllariga ruxsat berildi}=1{Cookie fayllariga ruxsat berildi, 1 ta istisno}other{Cookie fayllariga ruxsat berildi, {COUNT} ta istisno}}</translation>
 <translation id="4504940961672722399">Bu kengaytmani ikonkasi ustiga bosib yoki <ph name="EXTENSION_SHORTCUT" /> tugmalar birikmasini bosib faollashtiring.</translation>
 <translation id="4508051413094283164">Barchasini inkognito oynalarda ochish</translation>
 <translation id="4508265954913339219">Faollashtirib bo‘lmadi</translation>
@@ -2722,6 +2743,7 @@
 <translation id="465878909996028221">Brauzer yoʻnaltirishlarda faqat http, https va fayl protokollari ishlaydi.</translation>
 <translation id="4659077111144409915">Asosiy hisob</translation>
 <translation id="4660476621274971848">“<ph name="EXPECTED_VERSION" />” versiyasi kutilayotgandi, lekin “<ph name="NEW_ID" />” versiyasi o‘rnatildi</translation>
+<translation id="4660540330091848931">Hajmi oʻzgartirilmoqda</translation>
 <translation id="4660838440047236328">xonangiz dizayni</translation>
 <translation id="4661407454952063730">Ilovalarga tegishli maʼlumotlar – bu (dasturchi oʻrnatgan sozlamalarga asoslanib) ilovalar tomonidan saqlangan har qanday maʼlumot, shuningdek, kontaktlar, xabarlar va suratlar bo‘lishi mumkin.</translation>
 <translation id="4661931051827810091">Ayrim ochilgan sahifalar URL manzillari, cheklangan tizim va sahifalar axborotini anonim ravishda Google serverlariga yuboradi va internetdagi yangi tahdidlarni aniqlashga yordam berib, barcha foydalanuvchilarni bu tahdidlardan himoya qiladi.</translation>
@@ -2817,7 +2839,6 @@
 <translation id="4808667324955055115">Qalqib chiquvchi oynalar taqiqlangan</translation>
 <translation id="480990236307250886">Bosh sahifani ochish</translation>
 <translation id="4811503964269049987">Belgilangan varaqni guruhlash</translation>
-<translation id="4811818760963189951">Tarix sinxronizatsiyasi yoniq emasligi uchun faolsizlantirildi</translation>
 <translation id="4813136279048157860">Rasmlarim</translation>
 <translation id="4813512666221746211">Tarmoq xatoligi</translation>
 <translation id="4814378367953456825">Bu barmoq izini nomlang</translation>
@@ -2906,6 +2927,7 @@
 <translation id="4918086044614829423">Qabul qilish</translation>
 <translation id="4918221908152712722">Oʻrnatish: <ph name="APP_NAME" /> (yuklab olinmaydi)</translation>
 <translation id="4920887663447894854">Quyidagi saytlar joylashuvingiz ma’lumotlarini ko‘rmoqchi bo‘lganda bloklangan:</translation>
+<translation id="49226369361073053">{0,plural, =0{Qurilmani hoziroq oʻchirib yoqish kerak}=1{Qurilmani 1 soniya ichida oʻchirib yoqish kerak}other{Qurilmani # soniya ichida oʻchirib yoqish kerak}}</translation>
 <translation id="492299503953721473">Android ilovarni olib tashlash</translation>
 <translation id="4923279099980110923">Ha, menga yordam kerak</translation>
 <translation id="4924352752174756392">12x</translation>
@@ -2986,7 +3008,6 @@
 <translation id="5040823038948176460">Qoʻshimcha kontent sozlamlari</translation>
 <translation id="5042282098504489593"><ph name="USB_DEVICE_NAME" /> qurilmasini Linux tizimiga ulash uchun Sozlamalarni oching</translation>
 <translation id="5043913660911154449">Yoki printeringiz PPD faylini tanlang <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Maʼlumotlaringiz kodli ibora bilan shifrlangani uchun faolsizlantirildi</translation>
 <translation id="5045550434625856497">Parol noto‘g‘ri</translation>
 <translation id="504561833207953641">Mavjud brauzer seansida ochilmoqda.</translation>
 <translation id="5047421709274785093">Saytlarga harakat va yorug‘lik sensorlaridan foydalanishni taqiqlash</translation>
@@ -3057,6 +3078,7 @@
 <translation id="5135085122826131075">Asistentdan “Ok Google” deb aytib foydalanish</translation>
 <translation id="5135533361271311778">Xatcho‘p yaratib bo‘lmadi.</translation>
 <translation id="5137501176474113045">O‘chirish</translation>
+<translation id="5138982052046316113">Linux Disk hajmini oʻzgartirish</translation>
 <translation id="5139112070765735680"><ph name="DEFAULT_SEARCH_ENGINE_NAME" /> orqali qidirish: <ph name="QUERY_NAME" /></translation>
 <translation id="5139823398361067371">Elektron kalit PIN kodini kiriting. PIN kodni bilmasangiz, elektron kalit sozlamalarini qayta tiklash kerak.</translation>
 <translation id="5139955368427980650">&amp;Ochish</translation>
@@ -3213,6 +3235,7 @@
 <translation id="5353252989841766347">Parollarni Chrome’dan eksport qilish</translation>
 <translation id="5355099869024327351">Sizga bildirishnomalar chiqishi uchun Assistentni ishga tushiradi.</translation>
 <translation id="5355926466126177564">“<ph name="EXTENSION_NAME" />” kengaytmasi omniboks orqali qidiruv so‘rovini kiritishda ishlatiladigan birlamchi qidiruv tizimini o‘zgartirdi.</translation>
+<translation id="535911077628776608"><ph name="FILE_NAME" /> fayli xavfli boʻlishi mumkin. Tekshirish uchun Google kengaytirilgan himoya tizimiga yuborilsinmi? Yuklanmalar paneliga qaytish uchun Shift+F6 tugmalarini bosing.</translation>
 <translation id="5359910752122114278">1 ta natija</translation>
 <translation id="5360150013186312835">Asboblar panelida ko‘rsatish</translation>
 <translation id="5362741141255528695">Yopiq kalit faylini tanlang.</translation>
@@ -3351,6 +3374,7 @@
 <translation id="5539221284352502426">Server kiritilgan parolni qabul qilmadi. Unutmangki: Parol juda qisqa, raqamlar va belgilardan iborat va avval ishlatilmagan bo‘lishi zarur.</translation>
 <translation id="5541694225089836610">Bu amalni administrator faolsizlantirgan</translation>
 <translation id="5542132724887566711">Profil</translation>
+<translation id="5542133445231529202"><ph name="ORGANIZATION_NAME" /> tomonidan bu qurilmani zudlik bilan oʻchirib yoqish talab qilinmoqda.</translation>
 <translation id="5542750926112347543"><ph name="DOMAIN" /> saytidan cookie fayllar bloklandi</translation>
 <translation id="5542949973455282971"><ph name="CARRIER_NAME" /> nomli tarmoqqa ulanmoqda</translation>
 <translation id="5543983818738093899">Holat tekshirilmoqda...</translation>
@@ -3396,6 +3420,7 @@
 <translation id="5593357315997824387">Fayllaringizni sinxronlang</translation>
 <translation id="5595152862129936745">Juda uzoq</translation>
 <translation id="5595485650161345191">Manzilni o‘zgartirish</translation>
+<translation id="5595727715083333657">Bu konteyner hajmini oʻzgartirish imkonsiz. Diskdagi Linux (beta) uchun oldindan ajratilgan joyni kengaytirish uchun konteynerni zaxiralang va keyin yangi konteynerda tiklang.</translation>
 <translation id="5596627076506792578">Boshqa sozlamalar</translation>
 <translation id="5600706100022181951">Yangilanishni yuklab olish uchun <ph name="UPDATE_SIZE_MB" /> mobil trafik zarur. Yuklab olinsinmi?</translation>
 <translation id="5601503069213153581">PIN kod</translation>
@@ -3468,6 +3493,7 @@
 <translation id="5691511426247308406">Oilaviy</translation>
 <translation id="5691772641933328258">Barmoq izi aniqlanmadi</translation>
 <translation id="5692183275898619210">Chop etildi</translation>
+<translation id="5692875591060376599">Tanlangan fayl nomaʼlum va zararli boʻlishi mumkin. Tekshirish uchun Google kengaytirilgan himoya tizimiga yuborilsinmi?</translation>
 <translation id="569425414730375234">Joriy inkognito seans: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" /></translation>
 <translation id="5696143504434933566">“<ph name="EXTENSION_NAME" />” ustidan shikoyat qilish</translation>
 <translation id="5696679855467848181">Joriy PPD fayl: <ph name="PPD_NAME" /></translation>
@@ -3679,6 +3705,7 @@
 <translation id="5976160379964388480">Boshqa</translation>
 <translation id="5978277834170881274">&amp;Oddiy imlo tekshiruvini ishlatish</translation>
 <translation id="5979084224081478209">Parollarni tekshiring</translation>
+<translation id="5979156418378918004">{NUM_EXTENSIONS,plural, =1{1 ta ehtimolan zararli kengaytmani qayta yoqdingiz}other{{NUM_EXTENSIONS} ta ehtimolan zararli kengaytmani qayta yoqdingiz}}</translation>
 <translation id="5979421442488174909"><ph name="LANGUAGE" /> tiliga &amp;tarjima qilish</translation>
 <translation id="5979469435153841984">Sahifalarni xatcho‘plarga qo‘shish uchun manzillar qatoridagi yulduzchani bosing</translation>
 <translation id="5984222099446776634">So‘nggi ochilgan sahifalar</translation>
@@ -3929,6 +3956,7 @@
 <translation id="6309510305002439352">Mikrofon oʻchiq</translation>
 <translation id="6311220991371174222">Profilni ochib bo‘lmadi. Chrome’ni qaytadan ishga tushiring.</translation>
 <translation id="6312403991423642364">Noma’lum tarmoq xatoligi</translation>
+<translation id="6312567056350025599">{NUM_DAYS,plural, =1{Xavfsizlik tekshiruvi 1 kun oldin bajarilgan}other{Xavfsizlik tekshiruvi {NUM_DAYS} kun oldin bajarilgan}}</translation>
 <translation id="6312638141433622592">Imkoniyatga qarab, maqolalar mutolaa rejimida taklif qilinsin</translation>
 <translation id="6313641880021325787">VR MUHITIDAN CHIQISH</translation>
 <translation id="6314819609899340042"><ph name="IDS_SHORT_PRODUCT_NAME" /> qurilmasida nosozliklarni ko‘rib chiqish fuksiyalari yoqildi.</translation>
@@ -3944,6 +3972,7 @@
 <translation id="6325191661371220117">Avto-ishga tushirishni o‘chirib qo‘yish</translation>
 <translation id="6326175484149238433">Chrome‘dan olib tashlash</translation>
 <translation id="6326855256003666642">Keepalive ulanishlari soni</translation>
+<translation id="632707535499064463"><ph name="ORGANIZATION_NAME" /> tomonidan bu qurilmani muddati tugamasdan oʻchirib yoqish talab qilinmoqda.</translation>
 <translation id="6327785803543103246">Proksi-server avtomatik aniqlanishi</translation>
 <translation id="6333064448949140209">Fayl batafsil ko‘rib chiqilishi uchun Google serverlariga yuboriladi</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> hisobi uchun yangi profil yaratilsin.</translation>
@@ -3963,7 +3992,6 @@
 <translation id="63566973648609420">Shifrlangan ma’lumotlaringizni faqat kodli iborani biladiganlar ko‘ra oladi. Bu iborani Google bilmaydi va o‘z serverlarida saqlamaydi. Agar kodli iborani unutsangiz yoki bu sozlamani o‘zgaritrmoqchi bo‘lsangiz <ph name="BEGIN_LINK" />sinxronizatsiya sozlamalarini qayta tiklashingiz<ph name="END_LINK" /> lozim.</translation>
 <translation id="6357619544108132570"><ph name="SHORT_PRODUCT_NAME" /> oilasi mahsuloti xaridi bilan tabriklaymiz! Bu oddiy kompyuterdan ham yaxshiroq.</translation>
 <translation id="6358884629796491903">Ajdar</translation>
-<translation id="6360719647236334056">Qidiruv, reklama va boshqa Google xizmatlarini sizga moslashtirish uchun Chromedagi tarix maʼlumotlaringiz ishlatilishi mumkin</translation>
 <translation id="6361850914223837199">Xatolik tafsilotlari:</translation>
 <translation id="6362853299801475928">&amp;Muammo haqida xabar qilish</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -3971,11 +3999,13 @@
 <translation id="6366190659675876144">Standart himoya</translation>
 <translation id="636850387210749493">Korporativ domen ro‘yxatidan o‘tish</translation>
 <translation id="6370021412472292592">Aniqlovchi faylni yuklab bo‘lmadi.</translation>
+<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Parolni almashtirish}other{Parollarni almashtirish}}</translation>
 <translation id="6374077068638737855">Iceweasel</translation>
 <translation id="6374469231428023295">Qaytadan</translation>
 <translation id="6377268785556383139">“<ph name="SEARCH_TEXT" />” uchun bitta natija</translation>
 <translation id="6380143666419481200">Qabul qilish va davom etish</translation>
 <translation id="6384275966486438344"><ph name="SEARCH_HOST" /> qidiruv tizimidan foydalanish</translation>
+<translation id="6385149369087767061">Internetga ulanib, qaytadan urining</translation>
 <translation id="6385543213911723544">Cookie-fayllarni saqlash va o‘qish imkoniyatiga ega saytlar</translation>
 <translation id="6386099547750337629">Bu xato kutilmagan boʻlsa, koʻmak xizmati bilan bogʻlaning.</translation>
 <translation id="6387674443318562538">Vertikal ajratish</translation>
@@ -4054,6 +4084,7 @@
 <translation id="6478248366783946499">Xavfli fayl yuklab olinsinmi?</translation>
 <translation id="6483485061007832714">Yuklanmani ochish</translation>
 <translation id="6483805311199035658"><ph name="FILE" /> ochilmoqda...</translation>
+<translation id="6485092675191826776">Plugin VM litsenziyasining muddati tugagan</translation>
 <translation id="6488384360522318064">Tilni tanlash</translation>
 <translation id="648927581764831596">Mavjud emas</translation>
 <translation id="6490471652906364588">USB-C qurilma (o‘ng port)</translation>
@@ -4241,9 +4272,9 @@
 <translation id="6758056191028427665">Bizga fikr-mulohaza yuboring.</translation>
 <translation id="6759193508432371551">Zavod sozlamalariga qaytarish</translation>
 <translation id="6762833852331690540">Yoniq</translation>
-<translation id="6764693078871405569">Shuningdek, brauzer tarixi (<ph name="URL" />) ham tozalansin (<ph name="DOMAIN" /> hisobingizdan avtomatik chiqib ketasiz).</translation>
 <translation id="6767566652486411142">Boshqa tilni tanlang...</translation>
 <translation id="6767639283522617719">Domenga ulana olmadi. Tashkilot qismi uchun bu sozlamalarni tekshiring.</translation>
+<translation id="6769557323306147204"><ph name="ORGANIZATION_NAME" /> tomonidan bu qurilmani oʻchirib yoqish tavsiya etilmoqda.</translation>
 <translation id="6769712124046837540">Printer qo‘shilmoqda...</translation>
 <translation id="6770602306803890733">Siz va yaqinlaringizni internetdan yaxshiroq himoyalaydi</translation>
 <translation id="6770664076092644100">NFC orqali tasdiqlash</translation>
@@ -4376,6 +4407,7 @@
 <translation id="6943836128787782965">HTTP GET so‘rovida xatolik yuz berdi</translation>
 <translation id="6945221475159498467">Tanlash</translation>
 <translation id="694592694773692225">Bu sahifada yo‘naltirish bloklandi.</translation>
+<translation id="6947526360212886241">{NUM_PASSWORDS,plural, =1{1 ta parol oshkor etilgan}other{{NUM_PASSWORDS} ta parol oshkor etilgan}}</translation>
 <translation id="6949434160682548041">Parol (ixtiyoriy)</translation>
 <translation id="6950627417367801484">Ilovalarni tiklash</translation>
 <translation id="6950943362443484797">Sizga bu ilovani o‘rnatib beramiz</translation>
@@ -4460,6 +4492,7 @@
 <translation id="7053983685419859001">Taqiqlash</translation>
 <translation id="7055152154916055070">Yo‘naltirish bloklandi:</translation>
 <translation id="7056526158851679338">&amp;Qurilmalarni tekshirish</translation>
+<translation id="7057184853669165321">{NUM_MINS,plural, =1{Xavfsizlik tekshiruvi 1 daqiqa oldin bajarilgan}other{Xavfsizlik tekshiruvi {NUM_MINS} daqiqa oldin bajarilgan}}</translation>
 <translation id="7057767408836081338">Ilova maʼlumotlari yuklanmadi, lekin hali ham urinilmoqda...</translation>
 <translation id="7059858479264779982">Avtomatik ishga tushirishni sozlash</translation>
 <translation id="7059893117020417984">Yashirin kezish uchun menyudagi nuqtalar ikonkasini bosib inkognito oyna oching</translation>
@@ -4703,6 +4736,7 @@
 <translation id="7371006317849674875">Boshlanish vaqti</translation>
 <translation id="7371490947952970241">Qurilmangizda asosiy Joylashuv sozlamasini faolsizlantirish orqali Joylashuvni aniqlash xizmatini faolsizlantirish mumkin. Shuningdek, joylashuv parametri orqali joylashuv axboroti uchun Wi-Fi va mobil tarmoqlardan foydalanish hamda sensorlarni ham faolsizlantirish mumkin.</translation>
 <translation id="7375053625150546623">EAP</translation>
+<translation id="7375235221357833624">{0,plural, =1{Qurilmani bir soat ichida oʻchirib yoqish kerak}other{Qurilmani # soat ichida oʻchirib yoqish kerak}}</translation>
 <translation id="7376553024552204454">Sichqoncha siljiganda ajratib ko‘rsatilsin</translation>
 <translation id="7377451353532943397">Sensor doim bloklansin</translation>
 <translation id="73786666777299047">Chrome internet-do‘konida ochish</translation>
@@ -4720,6 +4754,7 @@
 <translation id="7400418766976504921">URL</translation>
 <translation id="7400839060291901923">Internet tarqatilishini <ph name="PHONE_NAME" /> telefoningizda sozlang</translation>
 <translation id="7401778920660465883">Bu xabarni yopish</translation>
+<translation id="7405938989981604410">{NUM_HOURS,plural, =1{Xavfsizlik tekshiruvi 1 soat oldin bajarilgan}other{Xavfsizlik tekshiruvi {NUM_HOURS} soat oldin bajarilgan}}</translation>
 <translation id="740624631517654988">Qalqib chiquvchi oyna bloklandi</translation>
 <translation id="7407430846095439694">Import qilish va bog‘lash</translation>
 <translation id="7407504355934009739">Aksariyat foydalanuvchilar bu saytdagi bildirishnomalarni bloklaydi</translation>
@@ -4750,6 +4785,7 @@
 <translation id="7441830548568730290">Boshqa foydalanuvchilar</translation>
 <translation id="7442465037756169001">Hangouts Meet qurilmasi sozlash uchun tayyor</translation>
 <translation id="744341768939279100">Yangi profil yaratish</translation>
+<translation id="744366959743242014">Maʼlumotlar yuklanmoqda, biroz kuting.</translation>
 <translation id="7443806024147773267">Istalgan qurilmadan Google hisobingizga kirsangiz, barcha parollaringizni doim ishlata olasiz.</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> qurilmasini o‘chirib qo‘yish</translation>
 <translation id="7448430327655618736">Ilovalarni avtomatik ravishda oʻrnatish</translation>
@@ -4785,6 +4821,7 @@
 <translation id="7489761397368794366">Qurilmangizdan telefon qilish</translation>
 <translation id="749028671485790643"><ph name="VALUE" /> ta foydalanuvchi</translation>
 <translation id="7490813197707563893">MAC manzil</translation>
+<translation id="7491963308094506985">{NUM_COOKIES,plural, =1{1 ta cookie fayl}other{{NUM_COOKIES} ta cookie fayl}}</translation>
 <translation id="7493386493263658176">“<ph name="EXTENSION_NAME" />” kengaytmasi parollar va bank kartalaringiz kabi barcha matnlarni saqlay oladi. Ishga tushirilsinmi?</translation>
 <translation id="7494694779888133066"><ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="7495778526395737099">Eski parolingizni unutdingizmi?</translation>
@@ -4805,10 +4842,14 @@
 <translation id="7513029293694390567">Saqlangan hisob ma’lumotlaridan foydalanib veb-saytlarga avtomatik kirish. Bu funksiya o‘chirilsa, har safar veb-saytga kirishdan oldin to‘ldirish so‘raladi.</translation>
 <translation id="7514239104543605883">Qurilmaga nusxalash</translation>
 <translation id="7514365320538308">Yuklab olish</translation>
+<translation id="751523031290522286"><ph name="APP_NAME" /> administrator tomonidan bloklandi. Bu ilovadan foydalanish uchun administratordan ruxsat oling.</translation>
+<translation id="7516981202574715431"><ph name="APP_NAME" /> pauza qilindi</translation>
+<translation id="7517063221058203587">{0,plural, =1{Qurilmani 1 daqiqa ichida oʻchirib yoqish kerak}other{Qurilmani # daqiqa ichida oʻchirib yoqish kerak}}</translation>
 <translation id="7520766081042531487">Inkognito rejimidagi portal: <ph name="SUBFRAME_SITE" /></translation>
 <translation id="7521387064766892559">JavaScript</translation>
 <translation id="7522255036471229694">“Ok Google” deb ayting</translation>
 <translation id="7525067979554623046">Yaratish</translation>
+<translation id="7526658513669652747">{NUM_DOWNLOADS,plural, =1{Yana 1 ta}other{Yana {NUM_DOWNLOADS} ta}}</translation>
 <translation id="7529411698175791732">Internetga ulanishni tekshiring. Yana muammo bo‘lsa, hisobingizdan chiqing va qayta kiring.</translation>
 <translation id="7530016656428373557">Quvvatsizlantirish tezligi Vattda</translation>
 <translation id="7531779363494549572">Sozlamalar &gt; Ilovalar va bildirishnomalar &gt; Bildirishnomalar sahifasini oching.</translation>
@@ -4977,6 +5018,7 @@
 <translation id="7765158879357617694">Ko‘chirib o‘tkazish</translation>
 <translation id="7766807826975222231">Ko‘proq o‘rganish</translation>
 <translation id="7766838926148951335">Ruxsatlarni qabul qilish</translation>
+<translation id="7768770796815395237">Oʻzgartirish</translation>
 <translation id="7769672763586021400">Model identifikatori</translation>
 <translation id="7770651108375708429">Wi-Fi aloqasini uzish</translation>
 <translation id="7771452384635174008">Tugmalar tartibi</translation>
@@ -5411,6 +5453,7 @@
 <translation id="8286963743045814739">Inkognito oynada internetni yashirin kezishingiz mumkin</translation>
 <translation id="8287902281644548111">API soʻrovi yoki URL manzil asosida qidirish</translation>
 <translation id="8288032458496410887"><ph name="APP" /> o‘chirilmoqda...</translation>
+<translation id="8289128870594824098">Disk hajmi</translation>
 <translation id="8291967909914612644">Mahalliy ta’minotchi mamlakati</translation>
 <translation id="8294431847097064396">Manba</translation>
 <translation id="8297006494302853456">Zaif</translation>
@@ -5623,6 +5666,7 @@
 <translation id="8608618451198398104">Kerberos chiptasini kiritish</translation>
 <translation id="8609465669617005112">Tepaga o‘tish</translation>
 <translation id="8610103157987623234">Format xato. Qaytadan urining</translation>
+<translation id="8612935480510351790"><ph name="FILE_NAME" /> fayli xavfli boʻlishi mumkin. Tekshirish uchun Google kengaytirilgan himoya tizimiga yuborilsinmi?</translation>
 <translation id="8613164732773110792">Faqat kichik harflar, raqamlar, ostki chiziqlar yoki tirelar</translation>
 <translation id="8615618338313291042">Inkognito rejimidagi Ilova: <ph name="APP_NAME" /></translation>
 <translation id="8619803522055190423">Soyali</translation>
@@ -5650,6 +5694,7 @@
 <translation id="8641606876632989680">Google hisobingizga kirsangiz, Chrome oshkor qilingan parollar haqida xabar qiladi</translation>
 <translation id="8642900771896232685">2 soniya</translation>
 <translation id="8642947597466641025">Matnni yiriklashtirish</translation>
+<translation id="8643443571868262066"><ph name="FILE_NAME" /> fayli xavfli boʻlishi mumkin. Tekshirish uchun Google kengaytirilgan himoya tizimiga yuborilsinmi?</translation>
 <translation id="8644655801811752511">Bu elektron kalit sozlamalari qayta tiklanmaydi Elektron kalit ulanishi bilan, uning sozlamalarini qayta tiklash mumkin</translation>
 <translation id="8645354835496065562">Sensordan foydalanishga ruxsat berilsin</translation>
 <translation id="8645920082661222035">Xavfli tahdidlarni aniqlaydi va sizni ulardan himoya qiladi</translation>
@@ -6024,7 +6069,7 @@
 <translation id="9101691533782776290">Ishga tushirish</translation>
 <translation id="9102610709270966160">Kengaytmani yoqish</translation>
 <translation id="9103868373786083162">Ortga qaytish uchun bosing, brauzer tarixini ko‘rish uchun kontekst menyusini tanlang</translation>
-<translation id="9108808586816295166">Xavfsiz DNS xizmati har doim ishlamasligi ham mumkin</translation>
+<translation id="9108808586816295166">Xavfsiz DNS xizmati har doim ham ishlamasligi mumkin</translation>
 <translation id="9109122242323516435">Joy ochish uchun qurilma xotirasidan fayllarni o‘chiring</translation>
 <translation id="9109283579179481106">Mobil tarmoqqa ulanish</translation>
 <translation id="9111102763498581341">Qulfdan yechish</translation>
@@ -6070,6 +6115,7 @@
 <translation id="9169931577761441333"><ph name="APP_NAME" /> ilovasini bosh ekranga joylash</translation>
 <translation id="9170848237812810038">&amp;Bekor qilish</translation>
 <translation id="9170884462774788842">Kompyuteringizdagi dasturlardan biri Chrome faoliyatiga ta’sir qiladigan mavzu o‘rnatib qo‘ydi.</translation>
+<translation id="917350715406657904">Ota-onangiz <ph name="APP_NAME" /> uchun belgilagan foydalanish vaqti tugadi. Ertaga yana <ph name="TIME_LIMIT" /> ishlata olasiz.</translation>
 <translation id="9173995187295789444">Bluetooth qurilmalar qidirilmoqda...</translation>
 <translation id="9174401638287877180">Foydalanish statistikasi va diagnostika axborotini yuborish. Diagnostika hamda qurilma va ilovadan foydalanish statistikasini Google kompaniyasiga avtomatik yuborish orqali Androidni yaxshilashga yordam bering. Ushbu axborotdan farzandingiz shaxsini aniqlash uchun foydalanilmaydi. Ular tizim va ilovalar barqarorligi kabilarni yaxshilash uchun ishlatiladi. Ayrim toʻplangan maʼlumotlar Android dasturchilar kabi hamkorlarimizga ham oʻz ilovalari va mahsulotlarini yanada yaxshilashga yordam beradi. Agar farzandingiz uchun Veb va ilovalardagi kengaytirilgan faoliyat tarixi yoqilgan boʻlsa, bu maʼlumotlar uning Google hisobiga saqlanadi.</translation>
 <translation id="917510707618656279">Sayt Bluetooth qurilmalardan foydalanish oldidan ruxsat olsin</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index dbffb70..6fcbc9299 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Đọc và thay đổi tất cả dữ liệu của bạn trên trang web hiện tại khi được gọi ra</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> muốn đặt lại cài đặt của bạn.</translation>
 <translation id="1243314992276662751">Tải lên</translation>
-<translation id="1243398753772016127">Các trang web không thể dùng hoạt động duyệt web trên nhiều trang web để cá nhân hóa quảng cáo</translation>
 <translation id="1244265436519979884">Hiện đang khôi phục Linux</translation>
 <translation id="1244303850296295656">Lỗi tiện ích</translation>
 <translation id="1246905108078336582">Xóa nội dung đề xuất khỏi khay nhớ tạm?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Bật - cài đặt tùy chỉnh</translation>
 <translation id="1489664337021920575">Chọn tùy chọn khác</translation>
 <translation id="1493892686965953381">Đang đợi <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Xóa cả dữ liệu duyệt web (<ph name="URL" />), việc này có thể khiến bạn bị đăng xuất khỏi Google.com.</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> thiết bị hiện có khác.</translation>
 <translation id="1495677929897281669">Quay lại tab</translation>
 <translation id="1499271269825557605">Nếu không nhận ra một tiện ích hoặc nếu trình duyệt hiện không hoạt động như mong đợi, thì bạn có thể tắt hoặc tùy chỉnh tiện ích tại đây.</translation>
@@ -1190,7 +1188,6 @@
 <translation id="2575247648642144396">Biểu tượng này sẽ hiển thị khi tiện ích có thể hoạt động trên trang hiện tại. Sử dụng tiện ích này bằng cách nhấp vào biểu tượng hoặc bằng cách nhấn <ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Thiết lập làm Chromebox cho hội họp</translation>
 <translation id="2580889980133367162">Luôn cho phép <ph name="HOST" /> tải xuống nhiều tệp</translation>
-<translation id="2580924999637585241">Tổng số: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Lâu</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Nền tảng <ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Không tìm thấy phiếu Kerberos. Hãy thử lại hoặc liên hệ với quản trị viên thiết bị của tổ chức bạn. (Mã lỗi <ph name="ERROR_CODE" />).</translation>
@@ -2457,7 +2454,7 @@
 <translation id="4263223596040212967">Kiểm tra bố cục bàn phím rồi thử lại.</translation>
 <translation id="4263757076580287579">Đăng ký máy in đã bị hủy.</translation>
 <translation id="426564820080660648">Để kiểm tra các cập nhật, hãy sử dụng kết nối Ethernet, Wi-Fi hoặc dữ liệu di động.</translation>
-<translation id="4267455501101322486">Nếu bạn muốn thêm tài khoản dùng để truy cập vào các tài nguyên giáo dục, hãy xin phép cha mẹ của bạn</translation>
+<translation id="4267455501101322486">Nếu bạn muốn thêm tài khoản để truy cập vào các tài nguyên giáo dục, hãy xin phép cha mẹ của bạn</translation>
 <translation id="4267953847983678297">Tự động kết nối với mạng di động</translation>
 <translation id="4268025649754414643">Mã hóa Khóa</translation>
 <translation id="4270393598798225102">Phiên bản <ph name="NUMBER" /></translation>
@@ -2819,7 +2816,6 @@
 <translation id="4808667324955055115">Đã chặn cửa sổ bật lên:</translation>
 <translation id="480990236307250886">Mở trang chủ</translation>
 <translation id="4811503964269049987">Nhóm thẻ đã chọn</translation>
-<translation id="4811818760963189951">Tính năng này đã bị tắt vì bạn đã vô hiệu hóa tính năng đồng bộ hóa lịch sử</translation>
 <translation id="4813136279048157860">Hình ảnh của tôi</translation>
 <translation id="4813512666221746211">Lỗi mạng</translation>
 <translation id="4814378367953456825">Nhập tên cho vân tay này</translation>
@@ -2988,7 +2984,6 @@
 <translation id="5040823038948176460">Các tùy chọn cài đặt nội dung khác</translation>
 <translation id="5042282098504489593">Mở phần Cài đặt để kết nối <ph name="USB_DEVICE_NAME" /> với Linux</translation>
 <translation id="5043913660911154449">Hoặc chỉ định tệp PPD cho máy in của bạn <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Tính năng này đã bị tắt do bạn đã mã hóa dữ liệu đồng bộ hóa bằng cụm mật khẩu</translation>
 <translation id="5045550434625856497">Mật khẩu sai</translation>
 <translation id="504561833207953641">Mở trong phiên trình duyệt hiện tại.</translation>
 <translation id="5047421709274785093">Chặn các trang web sử dụng cảm biến chuyển động và ánh sáng</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">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 sẽ cần <ph name="BEGIN_LINK" />đặt lại đồng bộ hóa<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Chào mừng bạn đến với nhóm sản phẩm <ph name="SHORT_PRODUCT_NAME" />. Đây không phải là máy tính thông thường.</translation>
 <translation id="6358884629796491903">Rồng</translation>
-<translation id="6360719647236334056">Sử dụng lịch sử duyệt web trên Chrome để điều chỉnh tính năng Tìm kiếm, quảng cáo và các dịch vụ khác của Google cho phù hợp với bạn</translation>
 <translation id="6361850914223837199">Chi tiết lỗi:</translation>
 <translation id="6362853299801475928">&amp;Báo cáo sự cố...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Hãy cho chúng tôi biết ý kiến của bạn về dịch vụ của chúng tôi.</translation>
 <translation id="6759193508432371551">Khôi phục cài đặt gốc</translation>
 <translation id="6762833852331690540">Đang bật</translation>
-<translation id="6764693078871405569">Xóa cả dữ liệu duyệt web (<ph name="URL" />), việc này sẽ khiến bạn bị đăng xuất khỏi <ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Chọn ngôn ngữ khác...</translation>
 <translation id="6767639283522617719">Không thể kết hợp miền. Hãy đảm bảo các tùy chọn cài đặt cho đơn vị tổ chức là chính xác.</translation>
 <translation id="6769712124046837540">Đang thêm máy in...</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 95b2699..f7531f581 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">调用时可读取和更改您在当前网站上的所有数据</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" />要重置您的设置。</translation>
 <translation id="1243314992276662751">上传</translation>
-<translation id="1243398753772016127">网站无法根据您在各个不同网站上的浏览活动为您展示个性化广告</translation>
 <translation id="1244265436519979884">正在进行 Linux 恢复</translation>
 <translation id="1244303850296295656">扩展程序错误</translation>
 <translation id="1246905108078336582">从剪贴板中移除建议?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">开启 - 自定义设置</translation>
 <translation id="1489664337021920575">选择其他选项</translation>
 <translation id="1493892686965953381">正在等待<ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">一并清除浏览数据 (<ph name="URL" />),这可能会使您在 Google.com 上退出帐号。</translation>
 <translation id="1495486559005647033">另外<ph name="NUM_PRINTERS" />个可用的设备。</translation>
 <translation id="1495677929897281669">返回到标签页</translation>
 <translation id="1499271269825557605">如果您不认识某款扩展程序或者您的浏览器无法按预期运行,您可在此处关闭或自定义扩展程序。</translation>
@@ -480,7 +478,7 @@
 <translation id="1653526288038954982">{NUM_PRINTER,plural, =1{请将该打印机添加到 Google 云打印,以便您可以随时随地进行打印。}other{请将 # 台打印机添加到 Google 云打印,以便您可以随时随地进行打印。}}</translation>
 <translation id="1656528038316521561">背景不透明度</translation>
 <translation id="1657406563541664238">将使用情况统计信息和崩溃报告自动发送给 Google,帮助我们完善 <ph name="PRODUCT_NAME" /></translation>
-<translation id="1657937299377480641">要重新登录以访问教育资源,请让您的家长向您授予权限</translation>
+<translation id="1657937299377480641">要重新登录并访问教育资源,请让您的家长向您授予权限</translation>
 <translation id="1658424621194652532">此网页正在使用您的麦克风。</translation>
 <translation id="1660204651932907780">允许网站播放声音(推荐)</translation>
 <translation id="1660763353352708040">电源适配器问题</translation>
@@ -1186,7 +1184,6 @@
 <translation id="2575247648642144396">仅当此扩展程序能够对当前网页采取操作时,该图标才会显示。要使用此扩展程序,请点击该图标或按 <ph name="EXTENSION_SHORTCUT" />。</translation>
 <translation id="257779572837908839">设为 Chromebox 会易设备</translation>
 <translation id="2580889980133367162">始终允许 <ph name="HOST" /> 下载多个文件</translation>
-<translation id="2580924999637585241">总计:<ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">长</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" />(平台:<ph name="PLATFORM_VERSION" />)<ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">无法获取 Kerberos 票据。请重试或与贵单位的设备管理员联系。(错误代码:<ph name="ERROR_CODE" />)。</translation>
@@ -2452,7 +2449,7 @@
 <translation id="4263223596040212967">请检查键盘布局,然后重试。</translation>
 <translation id="4263757076580287579">已取消注册打印机。</translation>
 <translation id="426564820080660648">要检查是否有更新,请使用以太网、WLAN 或移动数据。</translation>
-<translation id="4267455501101322486">要添加帐号以访问教育资源,请让您的家长向您授予权限</translation>
+<translation id="4267455501101322486">要添加帐号并访问教育资源,请让您的家长向您授予权限</translation>
 <translation id="4267953847983678297">自动连接到移动网络</translation>
 <translation id="4268025649754414643">密钥加密</translation>
 <translation id="4270393598798225102">版本 <ph name="NUMBER" /></translation>
@@ -2814,7 +2811,6 @@
 <translation id="4808667324955055115">已拦截弹出式窗口:</translation>
 <translation id="480990236307250886">打开主页</translation>
 <translation id="4811503964269049987">为所选标签页建组</translation>
-<translation id="4811818760963189951">此功能已关闭,因为您停用了历史记录同步功能</translation>
 <translation id="4813136279048157860">我的图片</translation>
 <translation id="4813512666221746211">网络错误</translation>
 <translation id="4814378367953456825">请为此指纹输入一个名称</translation>
@@ -2983,7 +2979,6 @@
 <translation id="5040823038948176460">更多内容设置</translation>
 <translation id="5042282098504489593">打开“设置”以将<ph name="USB_DEVICE_NAME" />连接到 Linux</translation>
 <translation id="5043913660911154449">或指定您的打印机 PPD <ph name="LINK_BEGIN" />了解详情<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">此功能已关闭,因为您使用密码加密了同步数据</translation>
 <translation id="5045550434625856497">密码不正确</translation>
 <translation id="504561833207953641">正在现有的浏览器会话中打开。</translation>
 <translation id="5047421709274785093">禁止网站使用动作传感器和光传感器</translation>
@@ -3960,7 +3955,6 @@
 <translation id="63566973648609420">只有知道您密码的人才能读取您的已加密数据。系统不会将该密码发送给 Google,Google 也不会存储该密码。如果您忘记了密码或想更改此设置,则需<ph name="BEGIN_LINK" />重置同步<ph name="END_LINK" />。</translation>
 <translation id="6357619544108132570">欢迎使用<ph name="SHORT_PRODUCT_NAME" />系列产品!这不是一款普通的计算机。</translation>
 <translation id="6358884629796491903">龙</translation>
-<translation id="6360719647236334056">利用您的 Chrome 浏览记录为您提供个性化的 Google 搜索、广告和其他 Google 服务</translation>
 <translation id="6361850914223837199">错误详情:</translation>
 <translation id="6362853299801475928">报告问题(&amp;R)...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4238,7 +4232,6 @@
 <translation id="6758056191028427665">让我们知道您的满意度。</translation>
 <translation id="6759193508432371551">恢复出厂设置</translation>
 <translation id="6762833852331690540">已开启</translation>
-<translation id="6764693078871405569">一并清除浏览数据 (<ph name="URL" />),这会使您在 <ph name="DOMAIN" /> 上退出帐号。</translation>
 <translation id="6767566652486411142">选择另一种语言…</translation>
 <translation id="6767639283522617719">无法加入到该网域中。请确保这一组织单元的设置正确无误。</translation>
 <translation id="6769712124046837540">添加打印机…</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 630f43a..d446d5c 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">調用時讀取及變更您在目前網站上的所有資料</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> 要求重設您的設定。</translation>
 <translation id="1243314992276662751">上載</translation>
-<translation id="1243398753772016127">網站不能使用您在其他網站的瀏覽活動放送個人化廣告</translation>
 <translation id="1244265436519979884">正在執行 Linux 還原</translation>
 <translation id="1244303850296295656">擴充功能錯誤</translation>
 <translation id="1246905108078336582">要從剪貼簿中移除建議嗎?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">開啟 - 自訂設定</translation>
 <translation id="1489664337021920575">選擇其他選項</translation>
 <translation id="1493892686965953381">正在等待 <ph name="LOAD_STATE_PARAMETER" />…</translation>
-<translation id="1494438840282430403">一併清除瀏覽資料 (<ph name="URL" />),此操作可能會將您登出 Google.com。</translation>
 <translation id="1495486559005647033">還有 <ph name="NUM_PRINTERS" /> 個可用裝置。</translation>
 <translation id="1495677929897281669">返回分頁</translation>
 <translation id="1499271269825557605">如果您無法識別任何擴充程式,或瀏覽器無法預期運作,您可以在這裡關閉或自訂擴充程式。</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">畫面上顯示這個圖示時,表示擴充功能可在目前網頁上運作。如要啟用這項擴充功能,請按一下圖示或按下 <ph name="EXTENSION_SHORTCUT" />。</translation>
 <translation id="257779572837908839">設定為 Chromebox 視像會議</translation>
 <translation id="2580889980133367162">永遠允許 <ph name="HOST" /> 下載多個檔案</translation>
-<translation id="2580924999637585241">總計:<ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">長</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (平台:<ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">無法取得 Kerberos 票證。請再試一次,或與您機構的裝置管理員聯絡。(錯誤代碼 <ph name="ERROR_CODE" />)。</translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">已封鎖彈出式視窗:</translation>
 <translation id="480990236307250886">開啟首頁</translation>
 <translation id="4811503964269049987">將所選分頁分組</translation>
-<translation id="4811818760963189951">由於您已停用記錄同步處理功能,因此系統已關閉此功能</translation>
 <translation id="4813136279048157860">我的圖片</translation>
 <translation id="4813512666221746211">網絡錯誤</translation>
 <translation id="4814378367953456825">請輸入此指紋的名稱</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">其他內容設定</translation>
 <translation id="5042282098504489593">開啟「設定」以將 <ph name="USB_DEVICE_NAME" /> 連線至 Linux</translation>
 <translation id="5043913660911154449">或指定打印機的 PPD <ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">由於您已使用密碼短語將同步資料加密,因此系統已停用此功能</translation>
 <translation id="5045550434625856497">密碼不正確</translation>
 <translation id="504561833207953641">正在現有的瀏覽器工作階段中開啟。</translation>
 <translation id="5047421709274785093">禁止網站使用動態和光線感應器</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">只有知道密碼短語的使用者才能讀取您的加密資料。系統不會將密碼短語傳送給 Google,Google 也不會儲存密碼短語。如果您忘記自己的密碼短語,或希望變更這項設定,則必須<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" />。</translation>
 <translation id="6357619544108132570">歡迎使用 <ph name="SHORT_PRODUCT_NAME" /> 系列機種,體驗不同凡響的新世代電腦。</translation>
 <translation id="6358884629796491903">龍</translation>
-<translation id="6360719647236334056">使用您的 Chrome 瀏覽記錄,為您提供個人化的搜尋服務、廣告和其他 Google 服務</translation>
 <translation id="6361850914223837199">錯誤詳情:</translation>
 <translation id="6362853299801475928">報告問題(&amp;R)…</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">請讓我們瞭解您的滿意度。</translation>
 <translation id="6759193508432371551">恢復原廠設定</translation>
 <translation id="6762833852331690540">開啟</translation>
-<translation id="6764693078871405569">一併清除瀏覽資料 (<ph name="URL" />),此操作可能會將您登出 <ph name="DOMAIN" />。</translation>
 <translation id="6767566652486411142">選擇其他語言…</translation>
 <translation id="6767639283522617719">無法加入網域。請確定機構單位的設定正確。</translation>
 <translation id="6769712124046837540">新增打印機…</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index c47fba9..e7a08c7 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">叫用時讀取及變更你在目前網站上的所有資料</translation>
 <translation id="1242633766021457174"><ph name="THIRD_PARTY_TOOL_NAME" /> 要求重設您的設定。</translation>
 <translation id="1243314992276662751">上傳</translation>
-<translation id="1243398753772016127">網站不能根據你在各網站的瀏覽活動放送個人化廣告</translation>
 <translation id="1244265436519979884">目前正在執行 Linux 還原作業</translation>
 <translation id="1244303850296295656">擴充功能錯誤</translation>
 <translation id="1246905108078336582">要從剪貼簿中移除建議嗎?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">開啟 - 自訂設定</translation>
 <translation id="1489664337021920575">選擇其他選項</translation>
 <translation id="1493892686965953381">正在等待 <ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">一併清除瀏覽資料 (<ph name="URL" />),這項操作可能會將你登出 Google.com。</translation>
 <translation id="1495486559005647033">還有 <ph name="NUM_PRINTERS" /> 個可用裝置。</translation>
 <translation id="1495677929897281669">返回分頁</translation>
 <translation id="1499271269825557605">如果你對某個擴充功能沒有印象,或是瀏覽器無法正常運作,可以在這裡關閉或自訂擴充功能。</translation>
@@ -1189,7 +1187,6 @@
 <translation id="2575247648642144396">畫面上顯示這個圖示時,表示擴充功能可在目前網頁上運作。如要啟用這項擴充功能,請按一下圖示或按下 <ph name="EXTENSION_SHORTCUT" />。</translation>
 <translation id="257779572837908839">設為 Chromebox 視訊會議解決方案</translation>
 <translation id="2580889980133367162">永遠允許 <ph name="HOST" /> 下載多個檔案</translation>
-<translation id="2580924999637585241">總計:<ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">長</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (平台:<ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">無法取得 Kerberos 票證。請再試一次,或與貴機構的裝置管理員聯絡。(錯誤代碼 <ph name="ERROR_CODE" />)。</translation>
@@ -2817,7 +2814,6 @@
 <translation id="4808667324955055115">已封鎖彈出式視窗:</translation>
 <translation id="480990236307250886">開啟首頁</translation>
 <translation id="4811503964269049987">將所選分頁分組</translation>
-<translation id="4811818760963189951">你已停用歷史記錄同步功能,因此系統已關閉這項功能</translation>
 <translation id="4813136279048157860">我的圖片</translation>
 <translation id="4813512666221746211">網路錯誤</translation>
 <translation id="4814378367953456825">請輸入這個指紋的名稱</translation>
@@ -2986,7 +2982,6 @@
 <translation id="5040823038948176460">其他內容設定</translation>
 <translation id="5042282098504489593">開啟設定以將 <ph name="USB_DEVICE_NAME" /> 連線至 Linux</translation>
 <translation id="5043913660911154449">或指定印表機 PPD。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">你已使用通關密語加密同步資料,因此系統已停用這項功能</translation>
 <translation id="5045550434625856497">密碼不正確</translation>
 <translation id="504561833207953641">正於現有瀏覽器工作階段中開啟。</translation>
 <translation id="5047421709274785093">禁止網站使用動作感應器和光源感應器</translation>
@@ -3963,7 +3958,6 @@
 <translation id="63566973648609420">只有知道通關密語的使用者可以讀取你的加密資料。系統不會將通關密語傳送給 Google,Google 也不會儲存通關密語。如果你忘記自己的通關密語,或是想變更這項設定,則必須<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" />。</translation>
 <translation id="6357619544108132570">歡迎使用 <ph name="SHORT_PRODUCT_NAME" /> 系列機種,體驗不同凡響的新世代電腦。</translation>
 <translation id="6358884629796491903">龍</translation>
-<translation id="6360719647236334056">使用你的 Chrome 瀏覽記錄,為你提供個人化的搜尋服務、廣告內容和其他各項 Google 服務</translation>
 <translation id="6361850914223837199">錯誤詳細資料:</translation>
 <translation id="6362853299801475928">回報問題(&amp;R)...</translation>
 <translation id="6365069501305898914">Facebook</translation>
@@ -4241,7 +4235,6 @@
 <translation id="6758056191028427665">請讓我們瞭解你的滿意度。</translation>
 <translation id="6759193508432371551">恢復原廠設定</translation>
 <translation id="6762833852331690540">開啟</translation>
-<translation id="6764693078871405569">一併清除瀏覽資料 (<ph name="URL" />)。這項操作會將你登出 <ph name="DOMAIN" />。</translation>
 <translation id="6767566652486411142">選擇其他語言...</translation>
 <translation id="6767639283522617719">無法加入網域。請確認該機構單位使用正確設定。</translation>
 <translation id="6769712124046837540">新增印表機...</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 4fe56af..69373e2 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -188,7 +188,6 @@
 <translation id="1241753985463165747">Funda uphinde ushintshe idatha yakho kuwebhusayithi yamanje uma kuhoxisiwe</translation>
 <translation id="1242633766021457174">I-<ph name="THIRD_PARTY_TOOL_NAME" /> ifuna ukusetha kabusha izilungiselelo zakho.</translation>
 <translation id="1243314992276662751">Layisha</translation>
-<translation id="1243398753772016127">Amasayithi awakwazi ukusebenzisa umsebenzi wokuphequlula kuwo wonke ahlukahlukene ukwenza ngezifiso izikhangiso</translation>
 <translation id="1244265436519979884">Ukubuyiselwa kwe-Linux manje kuyaqhubeka</translation>
 <translation id="1244303850296295656">Iphutha lesandiso</translation>
 <translation id="1246905108078336582">Susa isiphakamiso kusukela kubhodi lokunamathisela?</translation>
@@ -355,7 +354,6 @@
 <translation id="1487335504823219454">Kuvuliwe - izilungiselelo zangokwezifiso</translation>
 <translation id="1489664337021920575">Khetha enye inketho</translation>
 <translation id="1493892686965953381">Ilindele i-<ph name="LOAD_STATE_PARAMETER" />...</translation>
-<translation id="1494438840282430403">Futhi sula idatha yopheqululo (<ph name="URL" />) engase ikwenze uphume ngemvume ku-Google.com</translation>
 <translation id="1495486559005647033"><ph name="NUM_PRINTERS" /> amanye amadivayisi atholakalayo.</translation>
 <translation id="1495677929897281669">Emuva kuthebhu</translation>
 <translation id="1499271269825557605">Uma ungasazi isandiso, noma uma isiphequluli sakho singasebenzi njengokulindelekile, ungavala noma wenze ngezifiso izandiso lapha.</translation>
@@ -1188,7 +1186,6 @@
 <translation id="2575247648642144396">Lesi sithonjana sizobonakala uma isandiso singenza okuthile kukhasi lamanje. Sebenzisa lesi sandiso ngokuchofoza kusithonjana noma ngokucindezela ku-<ph name="EXTENSION_SHORTCUT" />.</translation>
 <translation id="257779572837908839">Setha njenge-Chromebox yemihlangano</translation>
 <translation id="2580889980133367162">Vumela njalo i-<ph name="HOST" /> ukuthi ilande amafayela amaningi</translation>
-<translation id="2580924999637585241">Inani: <ph name="NUMBER_OF_SHEETS" /> <ph name="SHEETS_LABEL" /></translation>
 <translation id="258095186877893873">Yide</translation>
 <translation id="2582253231918033891"><ph name="PRODUCT_NAME" /> <ph name="PRODUCT_VERSION" /> (Ipulatifomu engu-<ph name="PLATFORM_VERSION" />) <ph name="DEVICE_SERIAL_NUMBER" /></translation>
 <translation id="2584109212074498965">Ayikwazanga ukuthola ithikithi le-Kerberos. Zama futhi, noma xhumana nomphathi wedivayisi yenhlangano yakho. (Ikhodi yephutha engu-<ph name="ERROR_CODE" />).</translation>
@@ -2816,7 +2813,6 @@
 <translation id="4808667324955055115">Okwesikhashana kuvinjelwe:</translation>
 <translation id="480990236307250886">Vula ikhasi lasekhaya</translation>
 <translation id="4811503964269049987">Ithebhu Yeqembu Elikhethiwe</translation>
-<translation id="4811818760963189951">Kuvaliwe ngoba ukhubaze ukuvumelanisa umlando</translation>
 <translation id="4813136279048157860">Izithombe zami</translation>
 <translation id="4813512666221746211">Iphutha lenethiwekhi</translation>
 <translation id="4814378367953456825">Faka igama lalesi sigxivizo somunwe</translation>
@@ -2985,7 +2981,6 @@
 <translation id="5040823038948176460">Izilungiselelo zokuqukethwe ezingeziwe</translation>
 <translation id="5042282098504489593">Vula izilungiselelo ukuze uxhume i-<ph name="USB_DEVICE_NAME" /> ku-Linux</translation>
 <translation id="5043913660911154449">Noma cacisa i-PPD yephrinta <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation>
-<translation id="5044314273978194362">Kuvaliwe ngoba ubethele idatha yakho evunyelaniswe ngomushwana wokungena</translation>
 <translation id="5045550434625856497">Iphasiwedi engalungile</translation>
 <translation id="504561833207953641">Ukuvula iseshini yesiphequluli esikhona.</translation>
 <translation id="5047421709274785093">Vimbela amasayithi kusukela ekusebenziseni izinzwa zokunyakaza nezokukhanya</translation>
@@ -3965,7 +3960,6 @@
 <translation id="63566973648609420">Umuntu onomushwana wakho wokungena kuphela onafunda idatha yakho ebetheliwe. Umushwana wokungena awuthunyelwa ku-Google noma awugcinwa kuyo. Uma ukhohlwe umushwana wakho wokungena noma ufuna ukushintsha lesi silungiselelo, kuzomele <ph name="BEGIN_LINK" />usethe kabusha ukuvumelanisa<ph name="END_LINK" />.</translation>
 <translation id="6357619544108132570">Siyakwamukela kumndeni we-<ph name="SHORT_PRODUCT_NAME" />. Lena akuyona neze ikhompyutha ejwayelekile.</translation>
 <translation id="6358884629796491903">Isilo</translation>
-<translation id="6360719647236334056">Sebenzisa umlando wakho wokuphequlula we-Chrome ukuze wenze Usesho ngokwezifiso, izikhangiso namanye amasevisi e-Google</translation>
 <translation id="6361850914223837199">Imininingwane yephutha:</translation>
 <translation id="6362853299801475928">&amp;Bika inkinga...</translation>
 <translation id="6365069501305898914">I-Facebook</translation>
@@ -4243,7 +4237,6 @@
 <translation id="6758056191028427665">Sazise ukuthi siqhuba kanjani.</translation>
 <translation id="6759193508432371551">Ukusetha kabusha kwasekuqaleni</translation>
 <translation id="6762833852331690540">Vuliwe</translation>
-<translation id="6764693078871405569">Futhi sula idatha yopheqululo (<ph name="URL" />) ezokwenza uphume ngemvume ku-<ph name="DOMAIN" />.</translation>
 <translation id="6767566652486411142">Khetha olunye ulimi...</translation>
 <translation id="6767639283522617719">Ayikwazi ukujoyina isizinda. Yenza isiqiniseko sokuthi izilungiselelo zilungile kuyunithi yenhlangano.</translation>
 <translation id="6769712124046837540">Ingeza iphrinta...</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index 9c5258ab..f7bc92b 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -106,7 +106,7 @@
 <translation id="4293420128516039005">Inicia la sessió per sincronitzar i personalitzar Chrome en tots els teus dispositius</translation>
 <translation id="4328355335528187361">Google Chrome Dev (mDNS-In)</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
-<translation id="4335235004908507846">Chrome pot ajudar a protegir-te de violacions de les dades, d'extensions inadequades i més</translation>
+<translation id="4335235004908507846">Chrome pot ajudar a protegir-te de violacions de les dades, d'extensions malicioses i més</translation>
 <translation id="4343195214584226067"><ph name="EXTENSION_NAME" /> s'ha afegit a Chrome</translation>
 <translation id="4384570495110188418">Chrome no pot comprovar les teves contrasenyes perquè no tens la sessió iniciada</translation>
 <translation id="4407807842708586359">Google Chrome OS</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb
index 3e6e95b..ec2b5c9 100644
--- a/chrome/app/resources/google_chrome_strings_en-GB.xtb
+++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -162,6 +162,7 @@
 <translation id="573759479754913123">About Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5804318322022881572">Couldn't launch Chrome. Try again.</translation>
+<translation id="5867197326698922595">Google Chrome is trying to edit passwords.</translation>
 <translation id="5895138241574237353">Restart</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – Network sign-in</translation>
 <translation id="5940385492829620908">Your web, bookmarks and other Chrome stuff live here.</translation>
@@ -244,6 +245,7 @@
 <translation id="870251953148363156">Update &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome cannot determine or set the default browser</translation>
 <translation id="8823341990149967727">Chrome is Out of Date</translation>
+<translation id="8834965163890861871">Google Chrome is trying to edit passwords. Type your Windows password to allow this.</translation>
 <translation id="884296878221830158">It also controls what page is shown when you start Chrome or click the Home button.</translation>
 <translation id="8862326446509486874">You do not have appropriate rights for system-level installation. Try running the installer again as Administrator.</translation>
 <translation id="8914504000324227558">Relaunch Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index 4386decc..53b96a0b 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -152,6 +152,7 @@
 <translation id="573759479754913123">Informazioni su Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5804318322022881572">Impossibile avviare Chrome. Riprova.</translation>
+<translation id="5867197326698922595">Google Chrome sta cercando di modificare le password.</translation>
 <translation id="5895138241574237353">Riavvia</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Accesso rete</translation>
 <translation id="5940385492829620908">Il tuoi siti web, i tuoi segnalibri e gli altri contenuti Chrome sempre disponibili e aggiornati qui.</translation>
@@ -234,6 +235,7 @@
 <translation id="870251953148363156">Aggiorna &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome non è in grado di determinare o impostare il browser predefinito</translation>
 <translation id="8823341990149967727">Chrome non è aggiornato</translation>
+<translation id="8834965163890861871">Google Chrome sta cercando di modificare le password. Per consentire la modifica, digita la tua password Windows.</translation>
 <translation id="884296878221830158">Controlla anche la pagina visualizzata all'avvio di Chrome o quando fai clic sul pulsante Pagina iniziale.</translation>
 <translation id="8862326446509486874">Non disponi dei diritti appropriati per l'installazione a livello di sistema. Prova a eseguire nuovamente il programma di installazione come Amministratore.</translation>
 <translation id="8914504000324227558">Riavvia Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 7ad9542..d5d4eb6 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -154,6 +154,7 @@
 <translation id="573759479754913123">Mengenai Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5804318322022881572">Tidak dapat melancarkan Chrome. Cuba lagi.</translation>
+<translation id="5867197326698922595">Google Chrome cuba mengedit kata laluan.</translation>
 <translation id="5895138241574237353">Mulakan Semula</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Log Masuk Rangkaian</translation>
 <translation id="5940385492829620908">Web, penanda halaman dan barangan Chrome anda yang lain tinggal di sini.</translation>
@@ -236,6 +237,7 @@
 <translation id="870251953148363156">Kemas kini &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome tidak dapat menentukan atau menetapkan penyemak imbas lalai</translation>
 <translation id="8823341990149967727">Chrome sudah Usang</translation>
+<translation id="8834965163890861871">Google Chrome cuba mengedit kata laluan. Taip kata laluan Windows anda untuk membenarkan tindakan ini.</translation>
 <translation id="884296878221830158">Sambungan turut mengawal halaman yang ditunjukkan apabila anda memulakan Chrome atau mengklik butang Laman Utama.</translation>
 <translation id="8862326446509486874">Anda tidak mempunyai hak wajar untuk pemasangan peringkat sistem. Cuba jalankan pemasang semula sebagai Pentadbir.</translation>
 <translation id="8914504000324227558">Lancarkan semula Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb
index 620acbd..d0f5ef8 100644
--- a/chrome/app/resources/google_chrome_strings_my.xtb
+++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -162,6 +162,7 @@
 <translation id="573759479754913123">Chrome OS အကြောင်း</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5804318322022881572">Chrome ကို ဖွင့်၍မရပါ။ ထပ်စမ်းကြည့်ပါ။</translation>
+<translation id="5867197326698922595">Google Chrome က စကားဝှက်များ တည်းဖြတ်ရန် ကြိုးပမ်းနေသည်။</translation>
 <translation id="5895138241574237353">ပြန်စတင်မည</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ကွန်ရက် လက်မှတ်ထိုးဝင်ခြင်း</translation>
 <translation id="5940385492829620908">သင်၏ ဝဘ်၊ စာညှပ်များ၊ နှင့် အခြားသော Chrome အရာများဟာ ဒီမှာ နေထိုင်ကြပါသည်။</translation>
@@ -244,6 +245,7 @@
 <translation id="870251953148363156">&amp;Google Chrome ကို အဆင့်မြှင့်ရန်</translation>
 <translation id="873133009373065397">Google Chrome သည် မူရင်းဘရောင်ဇာကို ဆုံးဖြတ်ပေးခြင်းသော်လည်းကောင်း သတ်မှတ်ခြင်းသော်လည်းကောင်း လုပ်၍မရပါ</translation>
 <translation id="8823341990149967727">Chrome မှာ ဟောင်းသွားပြီ</translation>
+<translation id="8834965163890861871">Google Chrome သည် စကားဝှက်များ တည်းဖြတ်ရန် ကြိုးပမ်းနေသည်။ ၎င်းကို ခွင့်ပြုရန် သင်၏ Windows စကားဝှက်ကို ထည့်ပါ။</translation>
 <translation id="884296878221830158">သင် Chrome ကိုအစပြုချိန် သို့မဟုတ် ပင်မခလုတ် နှိပ်လိုက်လျှင် မည်သည့် စာမျက်နှာပြမည်ကိုပါ ထိန်းချုပ်ပါသည်။</translation>
 <translation id="8862326446509486874">သင့်ဆီမှာ စနစ်အဆင့်မှာ တပ်ဆင်နိုင်ရန် အတွက် လိုအပ်သည့် လုပ်ပိုင်ခွင့်များ မရှိပါ။ တပ်ဆင်သူကို ထပ်ပြီး စီမံအုပ်ချုပ်သူ အဖြစ် ဖွင့်သုံးကြည့်ပါ။</translation>
 <translation id="8914504000324227558">Chromium ကို အသစ်တစ်ဖန် ပြန်စရန်</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index 62e17395..267b54b 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -152,6 +152,7 @@
 <translation id="573759479754913123">System operacyjny Chrome – informacje</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5804318322022881572">Nie udało się uruchomić Chrome. Spróbuj ponownie.</translation>
+<translation id="5867197326698922595">Google Chrome próbuje edytować hasła.</translation>
 <translation id="5895138241574237353">Uruchom ponownie</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – logowanie do sieci</translation>
 <translation id="5940385492829620908">Tu są Twoje strony, zakładki i inne dane z Chrome.</translation>
@@ -234,6 +235,7 @@
 <translation id="870251953148363156">Aktualizuj &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome nie może określić ani ustawić domyślnej przeglądarki</translation>
 <translation id="8823341990149967727">Chrome jest nieaktualny</translation>
+<translation id="8834965163890861871">Google Chrome próbuje edytować hasła. Aby na to zezwolić, podaj swoje hasło do systemu Windows.</translation>
 <translation id="884296878221830158">Kontroluje także to, jaka strona wyświetla się po uruchomieniu Chrome lub kliknięciu przycisku strony głównej.</translation>
 <translation id="8862326446509486874">Nie masz odpowiednich uprawnień do przeprowadzenia instalacji na poziomie systemowym. Uruchom ponownie program instalacyjny jako administrator.</translation>
 <translation id="8914504000324227558">Uruchom Chrome ponownie</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index 235ef00..75f6058 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -152,6 +152,7 @@
 <translation id="573759479754913123">Sobre o Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" />: Google Chrome Canary</translation>
 <translation id="5804318322022881572">Não foi possível iniciar o Chrome. Tente novamente.</translation>
+<translation id="5867197326698922595">O Google Chrome está tentando editar senhas.</translation>
 <translation id="5895138241574237353">Reiniciar</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Login na rede</translation>
 <translation id="5940385492829620908">Sua Web, seus favoritos e demais conteúdo do Chrome estão aqui.</translation>
@@ -234,6 +235,7 @@
 <translation id="870251953148363156">Atualizar o Google Chrome</translation>
 <translation id="873133009373065397">O Google Chrome não pode determinar ou definir o navegador padrão</translation>
 <translation id="8823341990149967727">O Google Chrome está desatualizado</translation>
+<translation id="8834965163890861871">O Google Chrome está tentando editar senhas. Digite a senha do Windows para permitir essa ação.</translation>
 <translation id="884296878221830158">Controla também qual página deve ser exibida quando você inicia o Chrome ou clica no botão "Página inicial".</translation>
 <translation id="8862326446509486874">Você não tem os direitos adequados para instalação no nível do sistema. Tente executar o instalador novamente como administrador.</translation>
 <translation id="8914504000324227558">Reiniciar o Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb
index 12f6628..479b3e3 100644
--- a/chrome/app/resources/google_chrome_strings_si.xtb
+++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -162,6 +162,7 @@
 <translation id="573759479754913123">Chrome OS පිළිබඳ</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome කැනරි</translation>
 <translation id="5804318322022881572">Chrome දියත් කළ නොහැකි විය. නැවත උත්සාහ කරන්න.</translation>
+<translation id="5867197326698922595">Google Chrome මුරපද සංස්කරණ කිරීමට උත්සහ කරයි.</translation>
 <translation id="5895138241574237353">යළි අරඹන්න</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - ජාල පුරනය</translation>
 <translation id="5940385492829620908">ඔබේ වෙබ් අඩවි, පිටු සලකුණු සහ වෙනත් Chrome උපකරණ මෙහි ඇත.</translation>
@@ -244,6 +245,7 @@
 <translation id="870251953148363156">Google Chrome යාවත්කාලීන කරන්න</translation>
 <translation id="873133009373065397">Google Chrome හට පෙරනිමි බ්‍රව්සරය නිර්ණය කිරීමට හෝ සැකසීමට නොහැකිය</translation>
 <translation id="8823341990149967727">Chrome යල් පැන ගොස් ඇත</translation>
+<translation id="8834965163890861871">Google Chrome මුරපද සංස්කරණ කිරීමට උත්සහ කරයි. එයට ඉඩදීම සඳහා Windows මුරපදය යොදන්න.</translation>
 <translation id="884296878221830158">ඔබ ක්‍රෝම් ආරම්භ කළ විට හෝ මුල්පිටු බොත්තම ක්ලික් කළ විට පෙන්විය යුත්තේ කුමන පිටුවදැයි එමඟින් පාලනය කරයි.</translation>
 <translation id="8862326446509486874">ඔබට පද්ධති මට්ටමේ ස්ථානපයකට අයිතිය නැත. නැවත පරිපාලක වශයෙන් ස්ථාපකය ධාවනය කිරීමට උත්සාහ කරන්න.</translation>
 <translation id="8914504000324227558">Chrome නැවත දියත් කරන්න</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index 665b7ca2..30e4c67 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -158,6 +158,7 @@
 <translation id="573759479754913123">Informácie o systéme Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
 <translation id="5804318322022881572">Chrome sa nepodarilo spustiť. Skúste to znova.</translation>
+<translation id="5867197326698922595">Google Chrome sa pokúša upraviť heslá.</translation>
 <translation id="5895138241574237353">Reštartovať</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> – prihlásenie do siete</translation>
 <translation id="5940385492829620908">Tu nájdete svoj obsah na webe, záložky a ďalšie položky prehliadača Chrome.</translation>
@@ -240,6 +241,7 @@
 <translation id="870251953148363156">Aktualizácia prehliadača &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome nedokáže určiť alebo nastaviť predvolený prehliadač</translation>
 <translation id="8823341990149967727">Prehliadač Chrome je zastaraný</translation>
+<translation id="8834965163890861871">Google Chrome sa pokúša upraviť heslá. Ak to chcete povoliť, zadajte heslo systému Windows.</translation>
 <translation id="884296878221830158">Tiež určuje, ktorá stránka sa zobrazí pri spustení prehliadača Chrome alebo po kliknutí na tlačidlo Domovská stránka.</translation>
 <translation id="8862326446509486874">Nemáte potrebné práva na inštaláciu na úrovni systému. Skúste inštalátor spustiť znova ako správca.</translation>
 <translation id="8914504000324227558">Znova spustiť prehliadač Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index 38f5686c..6a35d4ab 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -48,6 +48,7 @@
 <translation id="2309047409763057870">ఇది Google Chrome యొక్క రెండవ ఇన‌స్ట‌లేష‌న్. దీన్ని మీ డిఫాల్ట్ బ్రౌజర్‌గా చేయడం సాధ్యపడదు.</translation>
 <translation id="2341767445688917208">Chrome OS మీ పాస్‌వర్డ్‌‌లను సింక్ చేయలేకపోయింది. ఇప్పుడే సమస్యను పరిష్కరించండి.</translation>
 <translation id="2348335408836342058">ఈ సైట్ కోసం మీ కెమెరా మరియు మైక్రోఫోన్‌ను యాక్సెస్ చేయడానికి Chromeకు అనుమతి అవసరం</translation>
+<translation id="234869673307233423">Chrome మీ పాస్‌వర్డ్‌లను తనిఖీ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="2429317896000329049">మీ డొమైన్ కోసం సింక్‌ అందుబాటులో లేనందున Google Chrome మీ డేటాను సింక్ చేయ‌లేక‌పోయింది.</translation>
 <translation id="2467438592969358367">Google Chrome మీ పాస్‌వర్డ్‌లను ఎగుమతి చేయాలనుకుంటోంది. దీనిని అనుమతించడం కోసం మీ Windows పాస్‌వర్డ్‌ని టైప్ చేయండి.</translation>
 <translation id="2485422356828889247">అన్ఇన్‌స్టాల్ చేయి</translation>
@@ -68,6 +69,8 @@
 <translation id="2857540653560290388">Chromeను ప్రారంభిస్తోంది...</translation>
 <translation id="2871893339301912279">మీరు Chromeకు సైన్ ఇన్ చేసారు!</translation>
 <translation id="2888126860611144412">Chrome పరిచయం</translation>
+<translation id="2929907241665500097">Chrome అప్‌డేట్ అవ్వలేదు, ఏదో తప్పు జరిగింది. <ph name="BEGIN_LINK" />Chrome అప్‌డేట్ సమస్యలు, విఫలమైన అప్‌డేట్‌లను పరిష్కరించండి.<ph name="END_LINK" /></translation>
+<translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - నెట్‌వర్క్ సైన్ ఇన్ - Chrome</translation>
 <translation id="3037838751736561277">Google Chrome నేపథ్య మోడ్‌లో ఉంది.</translation>
 <translation id="3065168410429928842">Chrome ట్యాబ్</translation>
 <translation id="3080151273017101988">Google Chromeను మూసివేసినపుడు, యాప్‌లను నేపథ్యంలో అమలు చేయడాన్ని కొనసాగించు</translation>
@@ -106,7 +109,9 @@
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4335235004908507846">డేటా ఉల్లంఘనలు, చెడు ఎక్స్‌టెన్షన్‌లు మొదలైన వాటి నుండి మిమ్మల్ని సురక్షితంగా ఉంచడంలో Chrome సహాయపడగలదు</translation>
 <translation id="4343195214584226067">Chromeకు <ph name="EXTENSION_NAME" /> జోడించబడింది</translation>
+<translation id="4384570495110188418">మీరు సైన్ ఇన్ చేయలేదు కాబట్టి Chrome మీ పాస్‌వర్డ్‌లను తనిఖీ చేయలేదు</translation>
 <translation id="4407807842708586359">Google Chrome OS</translation>
+<translation id="4450664632294415862">Chrome - నెట్‌వర్క్ సైన్ ఇన్ - <ph name="PAGE_TITLE" /></translation>
 <translation id="4458462641685292929">Google Chromeలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="4480040274068703980">సైన్ ఇన్ చేయడంలో ఎర్రర్ ఏర్పడినందున Chrome OS మీ డేటాను సింక్ చేయలేకపోయింది.</translation>
 <translation id="4561051373932531560">మీరు Google Chrome వెబ్‌లో ఫోన్ నంబర్ క్లిక్ చేసేలా అవ‌కాశం ఇస్తుంది మరియు Skypeతో కాల్ చేస్తుంది!</translation>
@@ -116,6 +121,7 @@
 <translation id="4600710005438004015">Chromeను తాజా వెర్షన్‌కు అప్‌డేట్ చేయడం సాధ్యం కాలేదు, కాబట్టి మీరు కొత్త ఫీచర్‌లు మరియు భద్రతా పరిష్కారాలను పొందలేరు.</translation>
 <translation id="4631713731678262610">Chrome మెనూలో దాచండి</translation>
 <translation id="4633000520311261472">Chromeను సురక్షితం చేయడానికి, మేము <ph name="IDS_EXTENSION_WEB_STORE_TITLE" />లో జాబితా చేయబడని మరియు మీకు తెలియకుండానే జోడించబడిన కొన్ని పొడిగింపులను నిలిపివేసాము.</translation>
+<translation id="4653397506175047429">మీ అన్ని పాస్‌వర్డ్‌లను Chrome చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="4728575227883772061">పేర్కొనబడని ఎర్రర్ కారణంగా ఇన్‌స్టాలేషన్ విఫలమైంది. ప్రస్తుతం Google Chrome అమలు అవుతున్నట్లయితే, దయచేసి దానిని మూసివేసి, మళ్ళీ ప్రయత్నించండి.</translation>
 <translation id="4750550185319565338"><ph name="PLUGIN_NAME" />ని ప్రారంభించడానికి Chromeను పునఃప్రారంభించండి</translation>
 <translation id="4754614261631455953">Google Chrome కెనరీ (mDNS-In)</translation>
@@ -149,6 +155,7 @@
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5804318322022881572">Chromeను ప్రారంభించడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5895138241574237353">మళ్ళీ ప్రారంభించు</translation>
+<translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - నెట్‌వర్క్ సైన్ ఇన్</translation>
 <translation id="5940385492829620908">మీ వెబ్, బుక్‌మార్క్‌లు మరియు ఇతర Chrome అంశాలు ఇక్కడ చూపబడతాయి.</translation>
 <translation id="5941830788786076944">Google Chromeను డిఫాల్ట్ బ్రౌజర్‌గా చేసుకోండి</translation>
 <translation id="6070348360322141662">అదనపు భద్రత దృష్ట్యా, Google Chrome మీ డేటాను ఎన్‌క్రిప్ట్ చేస్తుంది</translation>
@@ -204,6 +211,7 @@
 <translation id="7855730255114109580">Google Chrome తాజాగా ఉంది</translation>
 <translation id="7890208801193284374">మీరు కంప్యూటర్‌ను షేర్‌ చేస్తే, స్నేహితులు, కుటుంబ సభ్యులు విడివిడిగా బ్రౌజ్ చేయవచ్చు. Chromeను వారికి నచ్చిన రీతిలో సెటప్ చేసుకోవచ్చు.</translation>
 <translation id="7896673875602241923">మునుపు ఒకరు ఈ కంప్యూటర్‌లో Chromeకు <ph name="ACCOUNT_EMAIL_LAST" /> లాగా సైన్ ఇన్ చేశారు. దయచేసి మీ సమాచారాన్ని విడిగా ఉంచడానికి కొత్త Chrome వినియోగదారును సృష్టించండి.</translation>
+<translation id="7905891027772979035">Chrome మీ ఎక్స్‌టెన్షన్‌లను తనిఖీ చేయలేకపోయింది. తర్వాత మళ్లీ ట్రై చేయండి.</translation>
 <translation id="7916016681687251387">Chrome OS మీ డేటాను సింక్ చేయలేకపోయింది. ఇప్పుడే సమస్యను పరిష్కరించండి.</translation>
 <translation id="7930071585467473040">పాస్‌వర్డ్‌లను కాపీ చేయడానికి Google Chrome ప్రయత్నిస్తోంది.</translation>
 <translation id="7962410387636238736">Windows XP మరియు Windows Vistaలకు ఇప్పుడు మద్దతు లేనందున ఈ కంప్యూటర్ ఇకపై Google Chrome అప్‌డేట్‌లను స్వీకరించదు</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb
index 62dde4de..87643c8 100644
--- a/chrome/app/resources/google_chrome_strings_uz.xtb
+++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -159,6 +159,7 @@
 <translation id="573759479754913123">Chrome OS haqida</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
 <translation id="5804318322022881572">Chrome ishga tushmadi. Qayta urining.</translation>
+<translation id="5867197326698922595">Google Chrome parollarni tahrirlashga urinmoqda.</translation>
 <translation id="5895138241574237353">Qayta ishga tushirish</translation>
 <translation id="5903106910045431592"><ph name="PAGE_TITLE" /> - Tarmoqqa kirish</translation>
 <translation id="5940385492829620908">Chrome‘dagi barcha veb sahifalar, xatcho‘plar va boshqa ma’lumotlarni bu yerdan topish mumkin.</translation>
@@ -241,6 +242,7 @@
 <translation id="870251953148363156">&amp;Google Chrome’ni yangilash</translation>
 <translation id="873133009373065397">Google Chrome asosiy brauzerni aniqlay olmadi yoki tayinlay olmadi</translation>
 <translation id="8823341990149967727">Chrome versiyasi eskirdi</translation>
+<translation id="8834965163890861871">Google Chrome parollarni tahrirlashga urinmoqda. Ruxsat berish uchun Windows parolingizni kiriting.</translation>
 <translation id="884296878221830158">Bundan tashqari kengaytma Chrome ochilganida yoki Bosh sahifa tugmasi bosilganida qaysi sahifa ko‘rsatilishini nazorat qiladi.</translation>
 <translation id="8862326446509486874">Sizda tizim darajasida o‘rnatish uchun yetarli ruxsatlar yo‘q. O‘rnatish dasturini administrator nomidan qayta ishga tushiring.</translation>
 <translation id="8914504000324227558">Chrome’ni qayta ishga tushiring</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index dc5ab97..581a021 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3820,6 +3820,8 @@
       "component_updater/cros_component_manager.h",
       "component_updater/metadata_table_chromeos.cc",
       "component_updater/metadata_table_chromeos.h",
+      "component_updater/smart_dim_component_installer.cc",
+      "component_updater/smart_dim_component_installer.h",
       "device_identity/chromeos/device_oauth2_token_store_chromeos.cc",
       "device_identity/chromeos/device_oauth2_token_store_chromeos.h",
       "device_identity/device_identity_provider.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7d0aafa..998877a 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2727,7 +2727,7 @@
     {"enable-cros-ime-assist-autocorrect",
      flag_descriptions::kImeAssistAutocorrectName,
      flag_descriptions::kImeAssistAutocorrectDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kAssistPersonalInfo)},
+     FEATURE_VALUE_TYPE(chromeos::features::kAssistAutoCorrect)},
     {"enable-cros-ime-assist-personal-info",
      flag_descriptions::kImeAssistPersonalInfoName,
      flag_descriptions::kImeAssistPersonalInfoDescription, kOsCrOS,
@@ -4814,10 +4814,6 @@
                                     "BackForwardCache")},
 
 #if defined(OS_ANDROID)
-    {"android-setup-search-engine",
-     flag_descriptions::kAndroidSetupSearchEngineName,
-     flag_descriptions::kAndroidSetupSearchEngineDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kAndroidSetupSearchEngine)},
     {"omnibox-remove-suggestions-from-clipboard",
      flag_descriptions::kOmniboxRemoveSuggestionsFromClipboardName,
      flag_descriptions::kOmniboxRemoveSuggestionsFromClipboardDescription,
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
index f8ae6d6..6d1d023 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -36,7 +36,6 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/omnibox/browser/autocomplete_classifier.h"
-#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_match_type.h"
@@ -105,17 +104,13 @@
  * The prefetch occurs as a side-effect of calling OnOmniboxFocused() on
  * the AutocompleteController object.
  */
-class ZeroSuggestPrefetcher : public AutocompleteControllerDelegate {
+class ZeroSuggestPrefetcher {
  public:
   explicit ZeroSuggestPrefetcher(Profile* profile);
 
  private:
-  ~ZeroSuggestPrefetcher() override = default;
   void SelfDestruct();
 
-  // AutocompleteControllerDelegate:
-  void OnResultChanged(bool default_match_changed) override;
-
   std::unique_ptr<AutocompleteController> controller_;
   base::OneShotTimer expire_timer_;
 };
@@ -123,7 +118,7 @@
 ZeroSuggestPrefetcher::ZeroSuggestPrefetcher(Profile* profile)
     : controller_(new AutocompleteController(
           std::make_unique<ChromeAutocompleteProviderClient>(profile),
-          this,
+          nullptr,  // We only want to warm up the cache, don't need the result.
           AutocompleteProvider::TYPE_ZERO_SUGGEST)) {
   AutocompleteInput input(base::string16(), metrics::OmniboxEventProto::NTP,
                           ChromeAutocompleteSchemeClassifier(profile));
@@ -140,12 +135,6 @@
   delete this;
 }
 
-void ZeroSuggestPrefetcher::OnResultChanged(bool default_match_changed) {
-  // Nothing to do here, the results have been cached.
-  // We don't want to trigger deletion here because this is being called by the
-  // AutocompleteController object.
-}
-
 }  // namespace
 
 AutocompleteControllerAndroid::AutocompleteControllerAndroid(Profile* profile)
@@ -400,7 +389,9 @@
 }
 
 void AutocompleteControllerAndroid::OnResultChanged(
+    AutocompleteController* controller,
     bool default_match_changed) {
+  DCHECK(controller == autocomplete_controller_.get());
   if (autocomplete_controller_ && !inside_synchronous_start_)
     NotifySuggestionsReceived(autocomplete_controller_->result());
 }
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.h b/chrome/browser/android/omnibox/autocomplete_controller_android.h
index d90a88e..2c4f2b3 100644
--- a/chrome/browser/android/omnibox/autocomplete_controller_android.h
+++ b/chrome/browser/android/omnibox/autocomplete_controller_android.h
@@ -13,7 +13,7 @@
 #include "base/memory/singleton.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
+#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
@@ -26,7 +26,7 @@
 class Profile;
 
 // The native part of the Java AutocompleteController class.
-class AutocompleteControllerAndroid : public AutocompleteControllerDelegate,
+class AutocompleteControllerAndroid : public AutocompleteController::Observer,
                                       public KeyedService {
  public:
   explicit AutocompleteControllerAndroid(Profile* profile);
@@ -112,8 +112,9 @@
   ~AutocompleteControllerAndroid() override;
   void InitJNI(JNIEnv* env, jobject obj);
 
-  // AutocompleteControllerDelegate implementation.
-  void OnResultChanged(bool default_match_changed) override;
+  // AutocompleteController::Observer implementation.
+  void OnResultChanged(AutocompleteController* controller,
+                       bool default_match_changed) override;
 
   // Notifies the Java AutocompleteController that suggestions were received
   // based on the text the user typed in last.
diff --git a/chrome/browser/android/preferences/website_preference_bridge.cc b/chrome/browser/android/preferences/website_preference_bridge.cc
index 9b3b618..0685cbb 100644
--- a/chrome/browser/android/preferences/website_preference_bridge.cc
+++ b/chrome/browser/android/preferences/website_preference_bridge.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/engagement/important_sites_util.h"
 #include "chrome/browser/media/android/cdm/media_drm_license_manager.h"
 #include "chrome/browser/notifications/notification_permission_context.h"
-#include "chrome/browser/permissions/permission_manager_factory.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_android.h"
@@ -228,8 +227,8 @@
     embedder_url = url;
   else
     embedder_url = GURL(embedder_str);
-  return PermissionManagerFactory::GetForProfile(
-             GetActiveUserProfile(is_incognito))
+  return permissions::PermissionsClient::Get()
+      ->GetPermissionManager(GetActiveUserProfile(is_incognito))
       ->GetPermissionStatus(content_type, url, embedder_url)
       .content_setting;
 }
@@ -470,8 +469,8 @@
     const JavaParamRef<jstring>& origin) {
   GURL origin_url(ConvertJavaStringToUTF8(env, origin));
   permissions::PermissionResult status =
-      PermissionManagerFactory::GetForProfile(
-          ProfileAndroid::FromProfileAndroid(jprofile))
+      permissions::PermissionsClient::Get()
+          ->GetPermissionManager(ProfileAndroid::FromProfileAndroid(jprofile))
           ->GetPermissionStatus(ContentSettingsType::NOTIFICATIONS, origin_url,
                                 origin_url);
   return status.content_setting == ContentSetting::CONTENT_SETTING_BLOCK &&
diff --git a/chrome/browser/android/vr/autocomplete_controller.cc b/chrome/browser/android/vr/autocomplete_controller.cc
index 5adba4e..8724735 100644
--- a/chrome/browser/android/vr/autocomplete_controller.cc
+++ b/chrome/browser/android/vr/autocomplete_controller.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/vr/model/omnibox_suggestions.h"
 #include "components/omnibox/browser/autocomplete_classifier.h"
-#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/search_engines/util.h"
 
@@ -71,7 +70,11 @@
           false};
 }
 
-void AutocompleteController::OnResultChanged(bool default_match_changed) {
+void AutocompleteController::OnResultChanged(
+    ::AutocompleteController* controller,
+    bool default_match_changed) {
+  DCHECK(controller == autocomplete_controller_.get());
+
   std::vector<OmniboxSuggestion> suggestions;
   for (const auto& match : autocomplete_controller_->result()) {
     const gfx::VectorIcon* icon = &match.GetVectorIcon(false);
diff --git a/chrome/browser/android/vr/autocomplete_controller.h b/chrome/browser/android/vr/autocomplete_controller.h
index 6b07d06..d2a79dc 100644
--- a/chrome/browser/android/vr/autocomplete_controller.h
+++ b/chrome/browser/android/vr/autocomplete_controller.h
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/values.h"
 #include "chrome/browser/vr/model/omnibox_suggestions.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
+#include "components/omnibox/browser/autocomplete_controller.h"
 #include "url/gurl.h"
 
 class AutocompleteController;
@@ -21,7 +21,7 @@
 
 namespace vr {
 
-class AutocompleteController : public AutocompleteControllerDelegate {
+class AutocompleteController : public ::AutocompleteController::Observer {
  public:
   using SuggestionCallback =
       base::RepeatingCallback<void(std::vector<OmniboxSuggestion>)>;
@@ -41,7 +41,9 @@
   std::tuple<GURL, bool> GetUrlFromVoiceInput(const base::string16& input);
 
  private:
-  void OnResultChanged(bool default_match_changed) override;
+  // ::AutocompleteController::Observer:
+  void OnResultChanged(::AutocompleteController* controller,
+                       bool default_match_changed) override;
 
   Profile* profile_;
   ChromeAutocompleteProviderClient* client_;
diff --git a/chrome/browser/apps/app_shim/BUILD.gn b/chrome/browser/apps/app_shim/BUILD.gn
index 2bca48e..b6958c4 100644
--- a/chrome/browser/apps/app_shim/BUILD.gn
+++ b/chrome/browser/apps/app_shim/BUILD.gn
@@ -14,20 +14,17 @@
     "app_shim_listener.mm",
     "app_shim_manager_mac.cc",
     "app_shim_manager_mac.h",
+    "app_shim_registry_mac.cc",
+    "app_shim_registry_mac.h",
     "app_shim_termination_manager.cc",
     "app_shim_termination_manager.h",
-    "extension_app_shim_manager_delegate_mac.cc",
-    "extension_app_shim_manager_delegate_mac.h",
     "mach_bootstrap_acceptor.cc",
     "mach_bootstrap_acceptor.h",
   ]
 
   deps = [
     "//apps",
-    "//chrome/browser/apps/platform_apps",
-    "//chrome/browser/extensions",
     "//chrome/browser/web_applications/components",
-    "//chrome/browser/web_applications/extensions",
     "//chrome/common",
     "//chrome/common:app_mode_app_support",
     "//chrome/common:constants",
@@ -38,8 +35,7 @@
     "//components/version_info",
     "//content/public/browser",
     "//content/public/common",
-    "//extensions/browser",
-    "//extensions/common",
+    "//services/preferences/public/cpp:cpp",
     "//ui/views:views",
   ]
 }
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
index 7b332ef7..b94f0ba 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac.cc
@@ -24,9 +24,8 @@
 #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_listener.h"
+#include "chrome/browser/apps/app_shim/app_shim_registry_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_termination_manager.h"
-#include "chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h"
-#include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
index 0952ab4..46973767 100644
--- a/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
+++ b/chrome/browser/apps/app_shim/app_shim_manager_mac_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/test/mock_callback.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
-#include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
+#include "chrome/browser/apps/app_shim/app_shim_registry_mac.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/profiles/avatar_menu.h"
 #include "chrome/common/mac/app_shim.mojom.h"
diff --git a/chrome/browser/apps/platform_apps/app_shim_registry_mac.cc b/chrome/browser/apps/app_shim/app_shim_registry_mac.cc
similarity index 98%
rename from chrome/browser/apps/platform_apps/app_shim_registry_mac.cc
rename to chrome/browser/apps/app_shim/app_shim_registry_mac.cc
index c64d660e..c90f105 100644
--- a/chrome/browser/apps/platform_apps/app_shim_registry_mac.cc
+++ b/chrome/browser/apps/app_shim/app_shim_registry_mac.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
+#include "chrome/browser/apps/app_shim/app_shim_registry_mac.h"
 
 #include <memory>
 #include <utility>
diff --git a/chrome/browser/apps/platform_apps/app_shim_registry_mac.h b/chrome/browser/apps/app_shim/app_shim_registry_mac.h
similarity index 94%
rename from chrome/browser/apps/platform_apps/app_shim_registry_mac.h
rename to chrome/browser/apps/app_shim/app_shim_registry_mac.h
index e2195df4..ba4957f 100644
--- a/chrome/browser/apps/platform_apps/app_shim_registry_mac.h
+++ b/chrome/browser/apps/app_shim/app_shim_registry_mac.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_APPS_PLATFORM_APPS_APP_SHIM_REGISTRY_MAC_H_
-#define CHROME_BROWSER_APPS_PLATFORM_APPS_APP_SHIM_REGISTRY_MAC_H_
+#ifndef CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_REGISTRY_MAC_H_
+#define CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_REGISTRY_MAC_H_
 
 #include <set>
 #include <string>
@@ -96,4 +96,4 @@
   base::FilePath override_user_data_dir_;
 };
 
-#endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_APP_SHIM_REGISTRY_MAC_H_
+#endif  // CHROME_BROWSER_APPS_APP_SHIM_APP_SHIM_REGISTRY_MAC_H_
diff --git a/chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc b/chrome/browser/apps/app_shim/app_shim_registry_mac_unittest.cc
similarity index 98%
rename from chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc
rename to chrome/browser/apps/app_shim/app_shim_registry_mac_unittest.cc
index 2123e9b..ebb4ed57 100644
--- a/chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc
+++ b/chrome/browser/apps/app_shim/app_shim_registry_mac_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
+#include "chrome/browser/apps/app_shim/app_shim_registry_mac.h"
 
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
 #include "components/prefs/testing_pref_service.h"
diff --git a/chrome/browser/apps/platform_apps/BUILD.gn b/chrome/browser/apps/platform_apps/BUILD.gn
index 37975f0..1ec39f4 100644
--- a/chrome/browser/apps/platform_apps/BUILD.gn
+++ b/chrome/browser/apps/platform_apps/BUILD.gn
@@ -12,8 +12,6 @@
     "app_load_service.h",
     "app_load_service_factory.cc",
     "app_load_service_factory.h",
-    "app_shim_registry_mac.cc",
-    "app_shim_registry_mac.h",
     "app_termination_observer.cc",
     "app_termination_observer.h",
     "app_window_registry_util.cc",
@@ -24,6 +22,8 @@
     "browser_context_keyed_service_factories.h",
     "chrome_apps_browser_api_provider.cc",
     "chrome_apps_browser_api_provider.h",
+    "extension_app_shim_manager_delegate_mac.cc",
+    "extension_app_shim_manager_delegate_mac.h",
     "install_chrome_app.cc",
     "install_chrome_app.h",
     "platform_app_launch.cc",
@@ -48,6 +48,7 @@
     "//chrome/app:command_ids",
     "//chrome/browser/extensions",
     "//chrome/browser/media/router/discovery",
+    "//chrome/browser/web_applications/components:components",
     "//chrome/browser/web_applications/extensions",
     "//chrome/common",
     "//components/crx_file",
@@ -64,5 +65,9 @@
     "//ui/gfx",
   ]
 
+  if (is_mac) {
+    deps += [ "//chrome/browser/apps/app_shim" ]
+  }
+
   allow_circular_includes_from = [ "//chrome/browser/extensions" ]
 }
diff --git a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm b/chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm
similarity index 95%
rename from chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
rename to chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm
index e8c3b1e..a073f72f 100644
--- a/chrome/browser/apps/app_shim/app_shim_interactive_uitest_mac.mm
+++ b/chrome/browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm
@@ -28,8 +28,8 @@
 #include "chrome/browser/apps/app_shim/app_shim_host_bootstrap_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_listener.h"
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
-#include "chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h"
 #include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
+#include "chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/extensions/launch_util.h"
@@ -270,7 +270,6 @@
 const extensions::Extension* AppShimInteractiveTest::InstallAppWithShim(
     AppType type,
     const char* name) {
-
   const extensions::Extension* app;
   switch (type) {
     case APP_TYPE_PACKAGED:
@@ -378,7 +377,7 @@
     listener.WaitUntilRemoved();
     int exit_code;
     ASSERT_TRUE(shim_process.WaitForExitWithTimeout(
-                    TestTimeouts::action_timeout(), &exit_code));
+        TestTimeouts::action_timeout(), &exit_code));
 
     EXPECT_FALSE(GetFirstHostedAppWindow());
     EXPECT_FALSE(HasAppShimHost(profile(), app->id()));
@@ -493,10 +492,11 @@
 
   // Showing the window causes the shim to launch.
   {
-    base::scoped_nsobject<WindowedNSNotificationObserver>
-    ns_observer([[WindowedNSNotificationObserver alloc]
-        initForWorkspaceNotification:NSWorkspaceDidLaunchApplicationNotification
-                            bundleId:bundle_id]);
+    base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer(
+        [[WindowedNSNotificationObserver alloc]
+            initForWorkspaceNotification:
+                NSWorkspaceDidLaunchApplicationNotification
+                                bundleId:bundle_id]);
     WindowedAppShimLaunchObserver observer(app->id());
     window_1->Show(extensions::AppWindow::SHOW_INACTIVE);
     EXPECT_TRUE([ns_observer wait]);
@@ -535,10 +535,11 @@
 
   // Showing one of the windows should launch the shim.
   {
-    base::scoped_nsobject<WindowedNSNotificationObserver>
-    ns_observer([[WindowedNSNotificationObserver alloc]
-        initForWorkspaceNotification:NSWorkspaceDidLaunchApplicationNotification
-                            bundleId:bundle_id]);
+    base::scoped_nsobject<WindowedNSNotificationObserver> ns_observer(
+        [[WindowedNSNotificationObserver alloc]
+            initForWorkspaceNotification:
+                NSWorkspaceDidLaunchApplicationNotification
+                                bundleId:bundle_id]);
     WindowedAppShimLaunchObserver observer(app->id());
     window_1->Show(extensions::AppWindow::SHOW_INACTIVE);
     EXPECT_TRUE([ns_observer wait]);
@@ -610,7 +611,8 @@
   base::FilePath shim_path = updated_paths.front();
   NSMutableDictionary* plist_64 = [NSMutableDictionary
       dictionaryWithContentsOfFile:base::mac::FilePathToNSString(
-          shim_path.Append("Contents").Append("Info.plist"))];
+                                       shim_path.Append("Contents")
+                                           .Append("Info.plist"))];
 
   // Copy 32 bit shim to where it's expected to be.
   // CopyDirectory doesn't seem to work when copying and renaming in one go.
@@ -630,17 +632,13 @@
 
   NSArray* keys_to_copy = @[
     base::mac::CFToNSCast(kCFBundleIdentifierKey),
-    base::mac::CFToNSCast(kCFBundleNameKey),
-    app_mode::kCrAppModeShortcutIDKey,
-    app_mode::kCrAppModeUserDataDirKey,
-    app_mode::kBrowserBundleIDKey
+    base::mac::CFToNSCast(kCFBundleNameKey), app_mode::kCrAppModeShortcutIDKey,
+    app_mode::kCrAppModeUserDataDirKey, app_mode::kBrowserBundleIDKey
   ];
   for (NSString* key in keys_to_copy) {
-    [plist setObject:[plist_64 objectForKey:key]
-              forKey:key];
+    [plist setObject:[plist_64 objectForKey:key] forKey:key];
   }
-  [plist writeToFile:plist_path
-          atomically:YES];
+  [plist writeToFile:plist_path atomically:YES];
 
   base::mac::RemoveQuarantineAttribute(shim_path);
 
diff --git a/chrome/browser/apps/app_shim/app_shim_quit_interactive_uitest_mac.mm b/chrome/browser/apps/platform_apps/app_shim_quit_interactive_uitest_mac.mm
similarity index 96%
rename from chrome/browser/apps/app_shim/app_shim_quit_interactive_uitest_mac.mm
rename to chrome/browser/apps/platform_apps/app_shim_quit_interactive_uitest_mac.mm
index d911bf6..c21ff64 100644
--- a/chrome/browser/apps/app_shim/app_shim_quit_interactive_uitest_mac.mm
+++ b/chrome/browser/apps/platform_apps/app_shim_quit_interactive_uitest_mac.mm
@@ -91,9 +91,8 @@
   void SetUpCommandLine(base::CommandLine* command_line) override {
     PlatformAppBrowserTest::SetUpCommandLine(command_line);
     // Simulate an app shim initiated launch, i.e. launch app but not browser.
-    app_path_ = test_data_dir_
-        .AppendASCII("platform_apps")
-        .AppendASCII("minimal");
+    app_path_ =
+        test_data_dir_.AppendASCII("platform_apps").AppendASCII("minimal");
     command_line->AppendSwitchNative(apps::kLoadAndLaunchApp,
                                      app_path_.value());
     command_line->AppendSwitch(switches::kSilentLaunch);
@@ -117,8 +116,7 @@
   NSWindow* window = [[NSApp windows] objectAtIndex:0];
   NSEvent* event = cocoa_test_event_utils::KeyEventWithKeyCode(
       0, 'q', NSKeyDown, NSCommandKeyMask);
-  [window postEvent:event
-            atStart:NO];
+  [window postEvent:event atStart:NO];
 
   // This will time out if the event above does not terminate Chrome.
   RunUntilBrowserProcessQuits();
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.cc b/chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.cc
similarity index 98%
rename from chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.cc
rename to chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.cc
index c1de3cb..2e756fbc 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.cc
+++ b/chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h"
+#include "chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.h"
 
 #include "apps/launcher.h"
 #include "chrome/browser/apps/app_shim/app_shim_termination_manager.h"
diff --git a/chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h b/chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.h
similarity index 90%
rename from chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h
rename to chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.h
index c930290..5402998 100644
--- a/chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h
+++ b/chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_APPS_APP_SHIM_EXTENSION_APP_SHIM_MANAGER_DELEGATE_MAC_H_
-#define CHROME_BROWSER_APPS_APP_SHIM_EXTENSION_APP_SHIM_MANAGER_DELEGATE_MAC_H_
+#ifndef CHROME_BROWSER_APPS_PLATFORM_APPS_EXTENSION_APP_SHIM_MANAGER_DELEGATE_MAC_H_
+#define CHROME_BROWSER_APPS_PLATFORM_APPS_EXTENSION_APP_SHIM_MANAGER_DELEGATE_MAC_H_
 
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
 
@@ -51,4 +51,4 @@
 
 }  // namespace apps
 
-#endif  // CHROME_BROWSER_APPS_APP_SHIM_EXTENSION_APP_SHIM_MANAGER_DELEGATE_MAC_H_
+#endif  // CHROME_BROWSER_APPS_PLATFORM_APPS_EXTENSION_APP_SHIM_MANAGER_DELEGATE_MAC_H_
diff --git a/chrome/browser/apps/platform_apps/shortcut_manager.cc b/chrome/browser/apps/platform_apps/shortcut_manager.cc
index 93ce9f91..2dba9a3a 100644
--- a/chrome/browser/apps/platform_apps/shortcut_manager.cc
+++ b/chrome/browser/apps/platform_apps/shortcut_manager.cc
@@ -30,7 +30,7 @@
 #include "extensions/common/extension_set.h"
 
 #if defined(OS_MACOSX)
-#include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
+#include "chrome/browser/apps/app_shim/app_shim_registry_mac.h"
 #include "chrome/common/mac/app_mode_common.h"
 #endif
 
diff --git a/chrome/browser/browser_process_platform_part_mac.mm b/chrome/browser/browser_process_platform_part_mac.mm
index 84f0d25..f9704811 100644
--- a/chrome/browser/browser_process_platform_part_mac.mm
+++ b/chrome/browser/browser_process_platform_part_mac.mm
@@ -9,7 +9,7 @@
 #include "base/time/time.h"
 #import "chrome/browser/app_controller_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
-#include "chrome/browser/apps/app_shim/extension_app_shim_manager_delegate_mac.h"
+#include "chrome/browser/apps/platform_apps/extension_app_shim_manager_delegate_mac.h"
 #include "chrome/browser/chrome_browser_application_mac.h"
 #include "components/metal_util/test_shader.h"
 
diff --git a/chrome/browser/chooser_controller/mock_chooser_controller_view.cc b/chrome/browser/chooser_controller/mock_chooser_controller_view.cc
new file mode 100644
index 0000000..8f620194
--- /dev/null
+++ b/chrome/browser/chooser_controller/mock_chooser_controller_view.cc
@@ -0,0 +1,9 @@
+// Copyright 2020 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.
+
+#include "chrome/browser/chooser_controller/mock_chooser_controller_view.h"
+
+MockChooserControllerView::MockChooserControllerView() = default;
+
+MockChooserControllerView::~MockChooserControllerView() = default;
diff --git a/chrome/browser/chooser_controller/mock_chooser_controller_view.h b/chrome/browser/chooser_controller/mock_chooser_controller_view.h
new file mode 100644
index 0000000..1ef3b54
--- /dev/null
+++ b/chrome/browser/chooser_controller/mock_chooser_controller_view.h
@@ -0,0 +1,28 @@
+// Copyright 2020 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.
+
+#ifndef CHROME_BROWSER_CHOOSER_CONTROLLER_MOCK_CHOOSER_CONTROLLER_VIEW_H_
+#define CHROME_BROWSER_CHOOSER_CONTROLLER_MOCK_CHOOSER_CONTROLLER_VIEW_H_
+
+#include "chrome/browser/chooser_controller/chooser_controller.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+
+class MockChooserControllerView : public ChooserController::View {
+ public:
+  MockChooserControllerView();
+  MockChooserControllerView(MockChooserControllerView&) = delete;
+  MockChooserControllerView& operator=(MockChooserControllerView&) = delete;
+  ~MockChooserControllerView() override;
+
+  // ChooserController::View
+  MOCK_METHOD0(OnOptionsInitialized, void());
+  MOCK_METHOD1(OnOptionAdded, void(size_t index));
+  MOCK_METHOD1(OnOptionRemoved, void(size_t index));
+  MOCK_METHOD1(OnOptionUpdated, void(size_t index));
+  MOCK_METHOD1(OnAdapterEnabledChanged, void(bool enabled));
+  MOCK_METHOD1(OnRefreshStateChanged, void(bool enabled));
+};
+
+#endif  // CHROME_BROWSER_CHOOSER_CONTROLLER_MOCK_CHOOSER_CONTROLLER_VIEW_H_
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index a9365ae9..1e0a4c4 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -3616,6 +3616,7 @@
     case service_manager::SandboxType::kSoda:
     case service_manager::SandboxType::kProxyResolver:
     case service_manager::SandboxType::kPdfConversion:
+    case service_manager::SandboxType::kSharingService:
       // Should never reach here.
       CHECK(0);
       return base::string16();
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index e1f5734..471d5954f 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -179,7 +179,7 @@
     "//components/arc",
     "//components/arc/media_session",
     "//components/arc/mojom:mojom_traits",
-    "//components/autofill/core/browser:browser",
+    "//components/autofill/core/browser",
     "//components/browser_sync",
     "//components/captive_portal/core",
     "//components/component_updater:crl_set_remover",
diff --git a/chrome/browser/chromeos/input_method/assistive_suggester.cc b/chrome/browser/chromeos/input_method/assistive_suggester.cc
index cbc358b..8d4b291 100644
--- a/chrome/browser/chromeos/input_method/assistive_suggester.cc
+++ b/chrome/browser/chromeos/input_method/assistive_suggester.cc
@@ -1,4 +1,4 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2019 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.
 
@@ -65,10 +65,10 @@
 
 AssistiveSuggester::AssistiveSuggester(InputMethodEngine* engine,
                                        Profile* profile)
-    : engine_(engine), profile_(profile) {
-  personal_data_manager_ =
-      autofill::PersonalDataManagerFactory::GetForProfile(profile_);
-}
+    : engine_(engine),
+      profile_(profile),
+      personal_data_manager_(
+          autofill::PersonalDataManagerFactory::GetForProfile(profile)) {}
 
 void AssistiveSuggester::OnFocus(int context_id) {
   context_id_ = context_id;
@@ -94,10 +94,9 @@
     if (event.key == "Tab" || event.key == "Right") {
       engine_->ConfirmCompositionText(false, false);
       return true;
-    } else {
-      DismissSuggestion();
-      suggestion_dismissed_ = true;
     }
+    DismissSuggestion();
+    suggestion_dismissed_ = true;
   }
 
   return false;
@@ -126,15 +125,10 @@
     return false;
   }
 
-  if (context_id_ == -1)
+  if (context_id_ == -1 || suggestion_shown_)
     return false;
-
-  bool surrounding_text_changed = false;
-  if (!suggestion_shown_) {
-    Suggest(text, cursor_pos, anchor_pos);
-    surrounding_text_changed = suggestion_shown_;
-  }
-  return surrounding_text_changed;
+  Suggest(text, cursor_pos, anchor_pos);
+  return suggestion_shown_;
 }
 
 void AssistiveSuggester::Suggest(const std::string& text,
@@ -164,36 +158,34 @@
   if (action == AssistiveType::kGenericAction)
     return "";
 
-  if (action == AssistiveType::kPersonalEmail) {
-    std::string email = profile_->GetProfileUserName();
-    return email;
-  } else {
-    auto autofill_profiles = personal_data_manager_->GetProfilesToSuggest();
-    if (autofill_profiles.size() > 0) {
-      // Currently, we are just picking the first candidate, will improve the
-      // strategy in the future.
-      auto* data = autofill_profiles[0];
-      base::string16 suggestion;
-      switch (action) {
-        case AssistiveType::kPersonalName:
-          suggestion = data->GetRawInfo(autofill::ServerFieldType::NAME_FULL);
-          break;
-        case AssistiveType::kPersonalAddress:
-          suggestion = data->GetRawInfo(
-              autofill::ServerFieldType::ADDRESS_HOME_STREET_ADDRESS);
-          break;
-        case AssistiveType::kPersonalPhoneNumber:
-          suggestion = data->GetRawInfo(
-              autofill::ServerFieldType::PHONE_HOME_WHOLE_NUMBER);
-          break;
-        default:
-          NOTREACHED();
-          break;
-      }
-      return base::UTF16ToUTF8(suggestion);
-    }
+  if (action == AssistiveType::kPersonalEmail)
+    return profile_->GetProfileUserName();
+
+  auto autofill_profiles = personal_data_manager_->GetProfilesToSuggest();
+  if (autofill_profiles.empty())
+    return "";
+
+  // Currently, we are just picking the first candidate, will improve the
+  // strategy in the future.
+  auto* data = autofill_profiles[0];
+  base::string16 suggestion;
+  switch (action) {
+    case AssistiveType::kPersonalName:
+      suggestion = data->GetRawInfo(autofill::ServerFieldType::NAME_FULL);
+      break;
+    case AssistiveType::kPersonalAddress:
+      suggestion = data->GetRawInfo(
+          autofill::ServerFieldType::ADDRESS_HOME_STREET_ADDRESS);
+      break;
+    case AssistiveType::kPersonalPhoneNumber:
+      suggestion =
+          data->GetRawInfo(autofill::ServerFieldType::PHONE_HOME_WHOLE_NUMBER);
+      break;
+    default:
+      NOTREACHED();
+      break;
   }
-  return "";
+  return base::UTF16ToUTF8(suggestion);
 }
 
 void AssistiveSuggester::ShowSuggestion(const std::string& text) {
diff --git a/chrome/browser/chromeos/input_method/assistive_suggester.h b/chrome/browser/chromeos/input_method/assistive_suggester.h
index 479782d..822a6f2 100644
--- a/chrome/browser/chromeos/input_method/assistive_suggester.h
+++ b/chrome/browser/chromeos/input_method/assistive_suggester.h
@@ -1,4 +1,4 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
+// Copyright 2019 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.
 
@@ -59,16 +59,16 @@
   void ShowSuggestion(const std::string& text);
   void DismissSuggestion();
 
-  InputMethodEngine* engine_;
+  InputMethodEngine* const engine_;
 
   // ID of the focused text field, 0 if none is focused.
   int context_id_ = -1;
 
   // User's Chrome user profile.
-  Profile* profile_;
+  Profile* const profile_;
 
   // Personal data manager provided by autofill service.
-  autofill::PersonalDataManager* personal_data_manager_;
+  autofill::PersonalDataManager* const personal_data_manager_;
 
   // If we are showing a suggestion right now.
   bool suggestion_shown_ = false;
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine.cc b/chrome/browser/chromeos/input_method/native_input_method_engine.cc
index 65e9f8f..9d9b9ee 100644
--- a/chrome/browser/chromeos/input_method/native_input_method_engine.cc
+++ b/chrome/browser/chromeos/input_method/native_input_method_engine.cc
@@ -205,8 +205,9 @@
     // If |assistive_suggester_| changes the surrounding text, no longer need
     // to call the following function, as the information is out-dated.
     if (assistive_suggester_->OnSurroundingTextChanged(text, cursor_pos,
-                                                       anchor_pos))
+                                                       anchor_pos)) {
       return;
+    }
   }
   base_observer_->OnSurroundingTextChanged(engine_id, text, cursor_pos,
                                            anchor_pos, offset_pos);
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine.h b/chrome/browser/chromeos/input_method/native_input_method_engine.h
index 81b14eb..6819964 100644
--- a/chrome/browser/chromeos/input_method/native_input_method_engine.h
+++ b/chrome/browser/chromeos/input_method/native_input_method_engine.h
@@ -48,9 +48,8 @@
    public:
     // |base_observer| is to forward events to extension during this migration.
     // It will be removed when the official extension is completely migrated.
-    explicit ImeObserver(
-        std::unique_ptr<InputMethodEngineBase::Observer> base_observer,
-        std::unique_ptr<AssistiveSuggester> assistive_suggester);
+    ImeObserver(std::unique_ptr<InputMethodEngineBase::Observer> base_observer,
+                std::unique_ptr<AssistiveSuggester> assistive_suggester);
     ~ImeObserver() override;
 
     // InputMethodEngineBase::Observer:
diff --git a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
index 9b8017c5..f1daca77 100644
--- a/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/welcome_screen_browsertest.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/chromeos/login/screens/welcome_screen.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
 #include "chrome/browser/chromeos/login/test/oobe_base_test.h"
+#include "chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
 #include "chrome/browser/chromeos/login/test/test_predicate_waiter.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
@@ -42,11 +43,6 @@
       "keyboard_layout" : "xkb:us::eng",
     })";
 
-chromeos::OobeUI* GetOobeUI() {
-  auto* host = chromeos::LoginDisplayHost::default_host();
-  return host ? host->GetOobeUI() : nullptr;
-}
-
 void ToggleAccessibilityFeature(const std::string& feature_name,
                                 bool new_value) {
   test::JSChecker js = test::OobeJS();
@@ -87,70 +83,50 @@
 
 }  // namespace
 
-class WelcomeScreenBrowserTest : public InProcessBrowserTest {
+class WelcomeScreenBrowserTest : public OobeBaseTest {
  public:
   WelcomeScreenBrowserTest() = default;
   ~WelcomeScreenBrowserTest() override = default;
 
-  // InProcessBrowserTest:
-
-  void SetUpOnMainThread() override {
-    ASSERT_TRUE(data_dir_.CreateUniqueTempDir());
-    base::FilePath startup_manifest =
+  // OobeBaseTest:
+  bool SetUpUserDataDirectory() override {
+    if (!OobeBaseTest::SetUpUserDataDirectory())
+      return false;
+    EXPECT_TRUE(data_dir_.CreateUniqueTempDir());
+    const base::FilePath startup_manifest =
         data_dir_.GetPath().AppendASCII("startup_manifest.json");
-    base::WriteFile(startup_manifest, kStartupManifest,
-                    strlen(kStartupManifest));
+    const int file_size = strlen(kStartupManifest);
+    const int written =
+        base::WriteFile(startup_manifest, kStartupManifest, file_size);
+    EXPECT_EQ(written, file_size);
     path_override_ = std::make_unique<base::ScopedPathOverride>(
         chromeos::FILE_STARTUP_CUSTOMIZATION_MANIFEST, startup_manifest);
-
-    ShowLoginWizard(OobeScreen::SCREEN_TEST_NO_WINDOW);
-    test::TestPredicateWaiter(base::BindRepeating([]() {
-      return WizardController::default_controller() != nullptr;
-    })).Wait();
-    WizardController::default_controller()
-        ->screen_manager()
-        ->DeleteScreenForTesting(WelcomeView::kScreenId);
-    auto welcome_screen = std::make_unique<WelcomeScreen>(
-        GetOobeUI()->GetView<WelcomeScreenHandler>(),
-        base::BindRepeating(&WelcomeScreenBrowserTest::OnWelcomeScreenExit,
-                            base::Unretained(this)));
-    welcome_screen_ = welcome_screen.get();
-    observer_ = std::make_unique<LanguageReloadObserver>(welcome_screen_);
-    WizardController::default_controller()
-        ->screen_manager()
-        ->SetScreenForTesting(std::move(welcome_screen));
-    InProcessBrowserTest::SetUpOnMainThread();
+    return true;
   }
-
+  void SetUpOnMainThread() override {
+    OobeBaseTest::SetUpOnMainThread();
+    observer_ = std::make_unique<LanguageReloadObserver>(welcome_screen());
+  }
   void TearDownOnMainThread() override {
     observer_.reset();
-    InProcessBrowserTest::TearDownOnMainThread();
+    OobeBaseTest::TearDownOnMainThread();
+  }
+
+  WelcomeScreen* welcome_screen() {
+    EXPECT_NE(WizardController::default_controller(), nullptr);
+    WelcomeScreen* welcome_screen = WelcomeScreen::Get(
+        WizardController::default_controller()->screen_manager());
+    EXPECT_NE(welcome_screen, nullptr);
+    return welcome_screen;
   }
 
   void WaitForScreenExit() {
-    if (screen_exit_)
-      return;
-    base::RunLoop run_loop;
-    screen_exit_callback_ = run_loop.QuitClosure();
-    run_loop.Run();
+    OobeScreenExitWaiter(WelcomeView::kScreenId).Wait();
   }
-
-  void OnWelcomeScreenExit() {
-    screen_exit_ = true;
-    if (screen_exit_callback_) {
-      std::move(screen_exit_callback_).Run();
-    }
-  }
-
-  WelcomeScreen* welcome_screen_ = nullptr;
   std::unique_ptr<LanguageReloadObserver> observer_;
-
  private:
   std::unique_ptr<base::ScopedPathOverride> path_override_;
   base::ScopedTempDir data_dir_;
-  bool screen_exit_ = false;
-
-  base::OnceClosure screen_exit_callback_;
 };
 
 class WelcomeScreenSystemDevModeBrowserTest : public WelcomeScreenBrowserTest {
@@ -166,7 +142,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, WelcomeScreenElements) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
 
   test::OobeJS().ExpectVisiblePath({"connect", "welcomeScreen"});
@@ -189,12 +164,10 @@
 // for measurements during OOBE speedup work.
 // TODO(crbug.com/1058022): Remove after speedup work.
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, OobeStartupTime) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
 }
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, WelcomeScreenNext) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
   WaitForScreenExit();
@@ -202,7 +175,6 @@
 
 // Set of browser tests for Welcome Screen Language options.
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, WelcomeScreenLanguageFlow) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "languageSelectionButton"});
@@ -214,7 +186,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenLanguageElements) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "languageSelectionButton"});
@@ -228,7 +199,6 @@
 // Flaky: https://crbug.com/1025396.
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        DISABLED_WelcomeScreenLanguageSelection) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
 
   test::OobeJS().TapOnPath(
@@ -255,7 +225,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenKeyboardSelection) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "languageSelectionButton"});
@@ -268,7 +237,7 @@
   test::OobeJS().GetBool(
       "document.getElementById('connect').$.welcomeScreen.currentKeyboard=="
       "'US'");
-  ASSERT_TRUE(welcome_screen_->GetInputMethod() ==
+  ASSERT_TRUE(welcome_screen()->GetInputMethod() ==
               extension_id_prefix + "xkb:us:intl:eng");
 
   test::OobeJS().SelectElementInPath(extension_id_prefix + "xkb:us:workman:eng",
@@ -278,14 +247,13 @@
           "document.getElementById('connect').$.welcomeScreen.currentKeyboard=="
           "'") +
       extension_id_prefix + "xkb:us:workman:eng'");
-  ASSERT_TRUE(welcome_screen_->GetInputMethod() ==
+  ASSERT_TRUE(welcome_screen()->GetInputMethod() ==
               extension_id_prefix + "xkb:us:workman:eng");
 }
 
 // Set of browser tests for Welcome Screen Accessibility options.
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenAccessibilityFlow) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -295,10 +263,8 @@
   WaitForScreenExit();
 }
 
-// Flaky: https://crbug.com/1047175.
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
-                       DISABLED_WelcomeScreenAccessibilitySpokenFeedback) {
-  welcome_screen_->Show();
+                       WelcomeScreenAccessibilitySpokenFeedback) {
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -313,7 +279,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenAccessibilityLargeCursor) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -328,7 +293,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenAccessibilityHighContrast) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -343,7 +307,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenAccessibilitySelectToSpeak) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -358,7 +321,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenAccessibilityScreenMagnifier) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -373,7 +335,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest,
                        WelcomeScreenAccessibilityDockedMagnifier) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -390,10 +351,9 @@
   EXPECT_EQ(
       StartupCustomizationDocument::GetInstance()->initial_locale_default(),
       "en-US");
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   const std::string locale = "ru";
-  welcome_screen_->SetApplicationLocale(locale);
+  welcome_screen()->SetApplicationLocale(locale);
   test::OobeJS().TapOnPath({"connect", "welcomeScreen", "welcomeNextButton"});
   WaitForScreenExit();
   EXPECT_EQ(g_browser_process->local_state()->GetString(
@@ -410,7 +370,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenBrowserTest, A11yVirtualKeyboard) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "accessibilitySettingsButton"});
@@ -425,7 +384,6 @@
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenSystemDevModeBrowserTest,
                        DebuggerModeTest) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().ClickOnPath(
       {"connect", "welcomeScreen", "enableDebuggingLink"});
@@ -463,7 +421,6 @@
 };
 
 IN_PROC_BROWSER_TEST_F(WelcomeScreenTimezone, ChangeTimezoneFlow) {
-  welcome_screen_->Show();
   OobeScreenWaiter(WelcomeView::kScreenId).Wait();
   test::OobeJS().TapOnPath(
       {"connect", "welcomeScreen", "timezoneSettingsButton"});
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
index bea54ed..010047e 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
@@ -1550,7 +1550,7 @@
   std::move(callback).Run(std::move(reply), sampled_data_);
 }
 
-bool DeviceStatusCollector::ShouldFetchCrosHealthData() const {
+bool DeviceStatusCollector::ShouldFetchCrosHealthdData() const {
   return report_power_status_ || report_storage_status_ || report_cpu_info_ ||
          report_timezone_info_ || report_memory_info_ || report_backlight_info_;
 }
@@ -1881,7 +1881,7 @@
   if (report_storage_status_)
     state->FetchEMMCLifeTime(emmc_lifetime_fetcher_);
 
-  if (ShouldFetchCrosHealthData()) {
+  if (ShouldFetchCrosHealthdData()) {
     state->FetchCrosHealthdData(cros_healthd_data_fetcher_);
   } else {
     // Sample CPU temperature in a background thread.
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.h b/chrome/browser/chromeos/policy/status_collector/device_status_collector.h
index 357f8f2..1c5369ef 100644
--- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.h
+++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.h
@@ -328,7 +328,7 @@
 
   // Returns true if data (e.g. CPU info, power status, etc.) should be fetched
   // from cros_healthd.
-  bool ShouldFetchCrosHealthData() const;
+  bool ShouldFetchCrosHealthdData() const;
 
   // Callback invoked when reporting users pref is changed.
   void ReportingUsersChanged();
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.cc b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
index f2c598c..23ead9f 100644
--- a/chrome/browser/component_updater/cros_component_installer_chromeos.cc
+++ b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
@@ -37,7 +37,7 @@
 const ComponentConfig kConfigs[] = {
     {"epson-inkjet-printer-escpr", "5.0",
      "1913a5e0a6cad30b6f03e176177e0d7ed62c5d6700a9c66da556d7c3f5d6a47e"},
-    {"cros-termina", "820.1",
+    {"cros-termina", "830.1",
      "e9d960f84f628e1f42d05de4046bb5b3154b6f1f65c08412c6af57a29aecaffb"},
     {"rtanalytics-light", "17.0",
      "69f09d33c439c2ab55bbbe24b47ab55cb3f6c0bd1f1ef46eefea3216ec925038"},
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc
index b7dcaf8..54d0ac2 100644
--- a/chrome/browser/component_updater/registration.cc
+++ b/chrome/browser/component_updater/registration.cc
@@ -49,6 +49,10 @@
 #include "chrome/browser/resource_coordinator/tab_manager.h"
 #endif
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/component_updater/smart_dim_component_installer.h"
+#endif  // defined(OS_CHROMEOS)
+
 #if BUILDFLAG(ENABLE_NACL)
 #include "chrome/browser/component_updater/pnacl_component_installer.h"
 #endif  // BUILDFLAG(ENABLE_NACL)
@@ -179,6 +183,9 @@
   if (profile_prefs->GetBoolean(prefs::kLiveCaptionEnabled))
     component_updater::RegisterSODAComponent(cus, profile_prefs,
                                              base::OnceClosure());
+#if defined(OS_CHROMEOS)
+  RegisterSmartDimComponent(cus);
+#endif  // !defined(OS_CHROMEOS)
 }
 
 }  // namespace component_updater
diff --git a/chrome/browser/component_updater/smart_dim_component_installer.cc b/chrome/browser/component_updater/smart_dim_component_installer.cc
new file mode 100644
index 0000000..f214328
--- /dev/null
+++ b/chrome/browser/component_updater/smart_dim_component_installer.cc
@@ -0,0 +1,186 @@
+// Copyright 2020 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.
+
+#include "chrome/browser/component_updater/smart_dim_component_installer.h"
+
+#include <cstddef>
+
+#include "base/bind.h"
+#include "base/feature_list.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/logging.h"
+#include "base/memory/ref_counted.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/task/post_task.h"
+#include "base/version.h"
+#include "chrome/browser/chromeos/power/ml/smart_dim/ml_agent.h"
+#include "chromeos/constants/chromeos_features.h"
+#include "components/component_updater/component_updater_service.h"
+
+namespace {
+
+const base::FilePath::CharType kSmartDimFeaturePreprocessorConfigFileName[] =
+    FILE_PATH_LITERAL("example_preprocessor_config.pb");
+const base::FilePath::CharType kSmartDimModelFileName[] =
+    FILE_PATH_LITERAL("mlservice-model-smart_dim.tflite");
+const base::FilePath::CharType kSmartDimMetaJsonFileName[] =
+    FILE_PATH_LITERAL("smart_dim_meta.json");
+
+constexpr base::FeatureParam<std::string> kVersion{
+    &chromeos::features::kSmartDimExperimentalComponent,
+    "smart_dim_experimental_version", "2019.11.12.0"};
+
+// The SHA256 of the SubjectPublicKeyInfo used to sign the extension.
+// The extension id is: ghiclnejioiofblmbphpgbhaojnkempa
+const uint8_t kSmartDimPublicKeySHA256[32] = {
+    0x67, 0x82, 0xbd, 0x49, 0x8e, 0x8e, 0x51, 0xbc, 0x1f, 0x7f, 0x61,
+    0x70, 0xe9, 0xda, 0x4c, 0xf0, 0x30, 0x2e, 0x24, 0x4d, 0x68, 0x17,
+    0x19, 0xad, 0x26, 0x6e, 0xd0, 0x33, 0x03, 0xb3, 0xe5, 0xff};
+
+const char kMLSmartDimManifestName[] = "Smart Dim";
+
+void UpdateSmartDimMlAgent(const base::FilePath& meta_json_path,
+                           const base::FilePath& preprocessor_pb_path,
+                           const base::FilePath& model_path) {
+  auto& smart_dim_ml_agent =
+      *chromeos::power::ml::SmartDimMlAgent::GetInstance();
+  // If IsDownloadWorkerReady(), newly downloaded components will take effect
+  // on next reboot. This makes sure the updating happens at most once.
+  if (smart_dim_ml_agent.IsDownloadWorkerReady()) {
+    DVLOG(1) << "Download_worker in SmartDimMlAgent is ready, does nothing.";
+    return;
+  }
+
+  if (meta_json_path.empty() || preprocessor_pb_path.empty() ||
+      model_path.empty()) {
+    DLOG(ERROR) << "Necessary paths are empty!";
+    return;
+  }
+
+  std::string metadata_json, preprocessor_proto, model_flatbuffer;
+  if (!base::ReadFileToString(meta_json_path, &metadata_json) ||
+      !base::ReadFileToString(preprocessor_pb_path, &preprocessor_proto) ||
+      !base::ReadFileToString(model_path, &model_flatbuffer)) {
+    DLOG(ERROR) << "Failed reading component files.";
+    return;
+  }
+
+  smart_dim_ml_agent.OnComponentReady(metadata_json, preprocessor_proto,
+                                      model_flatbuffer);
+}
+
+}  // namespace
+
+namespace component_updater {
+
+SmartDimComponentInstallerPolicy::SmartDimComponentInstallerPolicy(
+    std::string expected_version)
+    : expected_version_(expected_version) {}
+
+SmartDimComponentInstallerPolicy::~SmartDimComponentInstallerPolicy() = default;
+
+bool SmartDimComponentInstallerPolicy::
+    SupportsGroupPolicyEnabledComponentUpdates() const {
+  return false;
+}
+
+bool SmartDimComponentInstallerPolicy::RequiresNetworkEncryption() const {
+  return false;
+}
+
+update_client::CrxInstaller::Result
+SmartDimComponentInstallerPolicy::OnCustomInstall(
+    const base::DictionaryValue& manifest,
+    const base::FilePath& install_dir) {
+  return update_client::CrxInstaller::Result(0);  // Nothing custom here.
+}
+
+void SmartDimComponentInstallerPolicy::OnCustomUninstall() {}
+
+void SmartDimComponentInstallerPolicy::ComponentReady(
+    const base::Version& version,
+    const base::FilePath& install_dir,
+    std::unique_ptr<base::DictionaryValue> manifest) {
+  DVLOG(1) << "Component ready, version " << version.GetString() << " in "
+           << install_dir.value();
+  base::PostTask(
+      FROM_HERE,
+      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      base::BindOnce(
+          &UpdateSmartDimMlAgent, install_dir.Append(kSmartDimMetaJsonFileName),
+          install_dir.Append(kSmartDimFeaturePreprocessorConfigFileName),
+          install_dir.Append(kSmartDimModelFileName)));
+}
+
+// Called during startup and installation before ComponentReady().
+bool SmartDimComponentInstallerPolicy::VerifyInstallation(
+    const base::DictionaryValue& manifest,
+    const base::FilePath& install_dir) const {
+  // Get component version from manifest and compare to the expected_version_.
+  // Note: versions should not be treated as simple strings, for example,
+  // base::Version("2020.02.06") == base::Version("2020.2.6").
+  const auto* version_value = manifest.FindKey("version");
+  DCHECK(version_value);
+  const base::Version component_version(version_value->GetString());
+  const base::Version expected_version(expected_version_);
+  if (component_version != expected_version) {
+    DVLOG(1) << "Version " << component_version
+             << " doesn't match expected_version " << expected_version;
+    return false;
+  }
+  // No need to actually validate the pb and tflite files here, since we'll do
+  // the checking in UpdateSmartDimMlAgent.
+  return base::PathExists(
+             install_dir.Append(kSmartDimFeaturePreprocessorConfigFileName)) &&
+         base::PathExists(install_dir.Append(kSmartDimModelFileName)) &&
+         base::PathExists(install_dir.Append(kSmartDimMetaJsonFileName));
+}
+
+base::FilePath SmartDimComponentInstallerPolicy::GetRelativeInstallDir() const {
+  return base::FilePath(FILE_PATH_LITERAL("SmartDim"));
+}
+
+void SmartDimComponentInstallerPolicy::GetHash(
+    std::vector<uint8_t>* hash) const {
+  DCHECK(hash);
+  hash->assign(kSmartDimPublicKeySHA256,
+               kSmartDimPublicKeySHA256 + base::size(kSmartDimPublicKeySHA256));
+}
+
+std::string SmartDimComponentInstallerPolicy::GetName() const {
+  return kMLSmartDimManifestName;
+}
+
+update_client::InstallerAttributes
+SmartDimComponentInstallerPolicy::GetInstallerAttributes() const {
+  update_client::InstallerAttributes attrs;
+  // Append a '$' for exact matching.
+  attrs["targetversionprefix"] = expected_version_ + "$";
+  return attrs;
+}
+
+std::vector<std::string> SmartDimComponentInstallerPolicy::GetMimeTypes()
+    const {
+  return std::vector<std::string>();
+}
+
+void RegisterSmartDimComponent(ComponentUpdateService* cus) {
+  if (!base::FeatureList::IsEnabled(chromeos::features::kSmartDimNewMlAgent))
+    return;
+
+  DVLOG(1) << "Registering smart dim component.";
+  const std::string expected_version = kVersion.Get();
+
+  if (expected_version.empty()) {
+    DLOG(ERROR) << "expected_version is empty.";
+    return;
+  }
+
+  auto installer = base::MakeRefCounted<ComponentInstaller>(
+      std::make_unique<SmartDimComponentInstallerPolicy>(expected_version));
+  installer->Register(cus, base::OnceClosure());
+}
+
+}  // namespace component_updater
diff --git a/chrome/browser/component_updater/smart_dim_component_installer.h b/chrome/browser/component_updater/smart_dim_component_installer.h
new file mode 100644
index 0000000..e1c8ea9
--- /dev/null
+++ b/chrome/browser/component_updater/smart_dim_component_installer.h
@@ -0,0 +1,65 @@
+// Copyright 2020 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.
+
+#ifndef CHROME_BROWSER_COMPONENT_UPDATER_SMART_DIM_COMPONENT_INSTALLER_H_
+#define CHROME_BROWSER_COMPONENT_UPDATER_SMART_DIM_COMPONENT_INSTALLER_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/macros.h"
+#include "base/values.h"
+#include "components/component_updater/component_installer.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace component_updater {
+
+class ComponentUpdateService;
+
+class SmartDimComponentInstallerPolicy : public ComponentInstallerPolicy {
+ public:
+  explicit SmartDimComponentInstallerPolicy(std::string expected_version);
+  ~SmartDimComponentInstallerPolicy() override;
+
+ private:
+  // ComponentInstallerPolicy overrides:
+  bool SupportsGroupPolicyEnabledComponentUpdates() const override;
+  bool RequiresNetworkEncryption() const override;
+  update_client::CrxInstaller::Result OnCustomInstall(
+      const base::DictionaryValue& manifest,
+      const base::FilePath& install_dir) override;
+  void OnCustomUninstall() override;
+  bool VerifyInstallation(const base::DictionaryValue& manifest,
+                          const base::FilePath& install_dir) const override;
+  void ComponentReady(const base::Version& version,
+                      const base::FilePath& install_dir,
+                      std::unique_ptr<base::DictionaryValue> manifest) override;
+  base::FilePath GetRelativeInstallDir() const override;
+  void GetHash(std::vector<uint8_t>* hash) const override;
+  std::string GetName() const override;
+  update_client::InstallerAttributes GetInstallerAttributes() const override;
+  std::vector<std::string> GetMimeTypes() const override;
+
+  // This installer requests exact expected_version_ from the server.
+  // Only expected_version_ can pass VerifyInstallation and be fed to
+  // SmartDimMlAgent.
+  std::string expected_version_;
+
+  DISALLOW_COPY_AND_ASSIGN(SmartDimComponentInstallerPolicy);
+};
+
+// Call once during startup to make the component update service aware of
+// the smart dim component.
+void RegisterSmartDimComponent(ComponentUpdateService* cus);
+
+}  // namespace component_updater
+
+#endif  // CHROME_BROWSER_COMPONENT_UPDATER_SMART_DIM_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 8f2fe3f0..f7844f6 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -118,7 +118,6 @@
 
 void ChromeDevToolsManagerDelegate::HandleCommand(
     content::DevToolsAgentHostClientChannel* channel,
-    const std::string& method,
     base::span<const uint8_t> message,
     NotHandledCallback callback) {
   auto it = sessions_.find(channel);
@@ -129,7 +128,7 @@
     NOTREACHED();
     return;
   }
-  it->second->HandleCommand(method, message, std::move(callback));
+  it->second->HandleCommand(message, std::move(callback));
 }
 
 std::string ChromeDevToolsManagerDelegate::GetTargetType(
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
index 0db17bc..d552030 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.h
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
@@ -62,7 +62,6 @@
   // content::DevToolsManagerDelegate implementation.
   void Inspect(content::DevToolsAgentHost* agent_host) override;
   void HandleCommand(content::DevToolsAgentHostClientChannel* channel,
-                     const std::string& method,
                      base::span<const uint8_t> message,
                      NotHandledCallback callback) override;
   std::string GetTargetType(content::WebContents* web_contents) override;
diff --git a/chrome/browser/devtools/chrome_devtools_session.cc b/chrome/browser/devtools/chrome_devtools_session.cc
index 87ab0cea..018463f 100644
--- a/chrome/browser/devtools/chrome_devtools_session.cc
+++ b/chrome/browser/devtools/chrome_devtools_session.cc
@@ -15,6 +15,7 @@
 #include "content/public/browser/devtools_agent_host_client.h"
 #include "content/public/browser/devtools_agent_host_client_channel.h"
 #include "content/public/browser/devtools_manager_delegate.h"
+#include "third_party/inspector_protocol/crdtp/dispatch.h"
 
 #if defined(OS_CHROMEOS)
 #include "chrome/browser/devtools/protocol/window_manager_handler.h"
@@ -49,44 +50,38 @@
 ChromeDevToolsSession::~ChromeDevToolsSession() = default;
 
 void ChromeDevToolsSession::HandleCommand(
-    const std::string& method,
     base::span<const uint8_t> message,
     content::DevToolsManagerDelegate::NotHandledCallback callback) {
-  if (!dispatcher_.canDispatch(method)) {
+  crdtp::Dispatchable dispatchable(crdtp::SpanFrom(message));
+  DCHECK(dispatchable.ok());  // Checked by content::DevToolsSession.
+  crdtp::UberDispatcher::DispatchResult dispatched =
+      dispatcher_.Dispatch(dispatchable);
+  if (!dispatched.MethodFound()) {
     std::move(callback).Run(message);
     return;
   }
-
-  int call_id;
-  std::string unused;
-  std::unique_ptr<protocol::DictionaryValue> value =
-      protocol::DictionaryValue::cast(protocol::Value::parseBinary(
-          reinterpret_cast<const uint8_t*>(message.data()), message.size()));
-  if (!dispatcher_.parseCommand(value.get(), &call_id, &unused))
-    return;
-  pending_commands_[call_id] = std::move(callback);
-  dispatcher_.dispatch(call_id, method, std::move(value),
-                       crdtp::SpanFrom(message));
+  pending_commands_[dispatchable.CallId()] = std::move(callback);
+  dispatched.Run();
 }
 
 // The following methods handle responses or notifications coming from
 // the browser to the client.
-void ChromeDevToolsSession::sendProtocolResponse(
+void ChromeDevToolsSession::SendProtocolResponse(
     int call_id,
     std::unique_ptr<protocol::Serializable> message) {
   pending_commands_.erase(call_id);
   client_channel_->DispatchProtocolMessageToClient(message->Serialize());
 }
 
-void ChromeDevToolsSession::sendProtocolNotification(
+void ChromeDevToolsSession::SendProtocolNotification(
     std::unique_ptr<protocol::Serializable> message) {
   client_channel_->DispatchProtocolMessageToClient(message->Serialize());
 }
 
-void ChromeDevToolsSession::flushProtocolNotifications() {}
+void ChromeDevToolsSession::FlushProtocolNotifications() {}
 
-void ChromeDevToolsSession::fallThrough(int call_id,
-                                        const std::string& method,
+void ChromeDevToolsSession::FallThrough(int call_id,
+                                        crdtp::span<uint8_t> method,
                                         crdtp::span<uint8_t> message) {
   auto callback = std::move(pending_commands_[call_id]);
   pending_commands_.erase(call_id);
diff --git a/chrome/browser/devtools/chrome_devtools_session.h b/chrome/browser/devtools/chrome_devtools_session.h
index 5e654f2..1e67e00 100644
--- a/chrome/browser/devtools/chrome_devtools_session.h
+++ b/chrome/browser/devtools/chrome_devtools_session.h
@@ -32,7 +32,6 @@
   ~ChromeDevToolsSession() override;
 
   void HandleCommand(
-      const std::string& method,
       base::span<const uint8_t> message,
       content::DevToolsManagerDelegate::NotHandledCallback callback);
 
@@ -40,14 +39,14 @@
 
  private:
   // protocol::FrontendChannel:
-  void sendProtocolResponse(
+  void SendProtocolResponse(
       int call_id,
       std::unique_ptr<protocol::Serializable> message) override;
-  void sendProtocolNotification(
+  void SendProtocolNotification(
       std::unique_ptr<protocol::Serializable> message) override;
-  void flushProtocolNotifications() override;
-  void fallThrough(int call_id,
-                   const std::string& method,
+  void FlushProtocolNotifications() override;
+  void FallThrough(int call_id,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> message) override;
 
   base::flat_map<int, content::DevToolsManagerDelegate::NotHandledCallback>
diff --git a/chrome/browser/devtools/protocol/browser_handler.cc b/chrome/browser/devtools/protocol/browser_handler.cc
index c3abe25..3ba3713 100644
--- a/chrome/browser/devtools/protocol/browser_handler.cc
+++ b/chrome/browser/devtools/protocol/browser_handler.cc
@@ -80,10 +80,10 @@
   auto host =
       content::DevToolsAgentHost::GetForId(target_id.fromMaybe(target_id_));
   if (!host)
-    return Response::Error("No target with given id");
+    return Response::ServerError("No target with given id");
   content::WebContents* web_contents = host->GetWebContents();
   if (!web_contents)
-    return Response::Error("No web contents in the target");
+    return Response::ServerError("No web contents in the target");
 
   Browser* browser = nullptr;
   for (auto* b : *BrowserList::GetInstance()) {
@@ -92,12 +92,12 @@
       browser = b;
   }
   if (!browser)
-    return Response::Error("Browser window not found");
+    return Response::ServerError("Browser window not found");
 
   BrowserWindow* window = browser->window();
   *out_window_id = browser->session_id().id();
   *out_bounds = GetBrowserWindowBounds(window);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::GetWindowBounds(
@@ -105,10 +105,10 @@
     std::unique_ptr<protocol::Browser::Bounds>* out_bounds) {
   BrowserWindow* window = GetBrowserWindow(window_id);
   if (!window)
-    return Response::Error("Browser window not found");
+    return Response::ServerError("Browser window not found");
 
   *out_bounds = GetBrowserWindowBounds(window);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::Close() {
@@ -118,7 +118,7 @@
           ChromeDevToolsManagerDelegate::GetInstance()->BrowserCloseRequested();
         chrome::ExitIgnoreUnloadHandlers();
       }));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::SetWindowBounds(
@@ -126,7 +126,7 @@
     std::unique_ptr<protocol::Browser::Bounds> window_bounds) {
   BrowserWindow* window = GetBrowserWindow(window_id);
   if (!window)
-    return Response::Error("Browser window not found");
+    return Response::ServerError("Browser window not found");
   gfx::Rect bounds = window->GetBounds();
   const bool set_bounds = window_bounds->HasLeft() || window_bounds->HasTop() ||
                           window_bounds->HasWidth() ||
@@ -140,14 +140,14 @@
 
   const std::string window_state = window_bounds->GetWindowState("normal");
   if (set_bounds && window_state != "normal") {
-    return Response::Error(
+    return Response::ServerError(
         "The 'minimized', 'maximized' and 'fullscreen' states cannot be "
         "combined with 'left', 'top', 'width' or 'height'");
   }
 
   if (window_state == "fullscreen") {
     if (window->IsMinimized()) {
-      return Response::Error(
+      return Response::ServerError(
           "To make minimized window fullscreen, "
           "restore it to normal state first.");
     }
@@ -155,14 +155,14 @@
         GURL(), EXCLUSIVE_ACCESS_BUBBLE_TYPE_NONE, display::kInvalidDisplayId);
   } else if (window_state == "maximized") {
     if (window->IsMinimized() || window->IsFullscreen()) {
-      return Response::Error(
+      return Response::ServerError(
           "To maximize a minimized or fullscreen "
           "window, restore it to normal state first.");
     }
     window->Maximize();
   } else if (window_state == "minimized") {
     if (window->IsFullscreen()) {
-      return Response::Error(
+      return Response::ServerError(
           "To minimize a fullscreen window, restore it to normal "
           "state first.");
     }
@@ -180,7 +180,7 @@
     NOTREACHED();
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response BrowserHandler::SetDockTile(
@@ -191,5 +191,5 @@
     reps.emplace_back(image.fromJust().bytes(), 1);
   DevToolsDockTile::Update(label.fromMaybe(std::string()),
                            !reps.empty() ? gfx::Image(reps) : gfx::Image());
-  return Response::OK();
+  return Response::Success();
 }
diff --git a/chrome/browser/devtools/protocol/cast_handler.cc b/chrome/browser/devtools/protocol/cast_handler.cc
index 42cd1b4..77d6839 100644
--- a/chrome/browser/devtools/protocol/cast_handler.cc
+++ b/chrome/browser/devtools/protocol/cast_handler.cc
@@ -89,7 +89,7 @@
       ->set_start_presentation_cb(
           base::BindRepeating(&CastHandler::StartPresentation,
                               weak_factory_.GetWeakPtr(), in_sink_name));
-  return Response::OK();
+  return Response::Success();
 }
 
 void CastHandler::StartTabMirroring(
@@ -98,7 +98,7 @@
   EnsureInitialized();
   const media_router::MediaSink::Id& sink_id = GetSinkIdByName(in_sink_name);
   if (sink_id.empty()) {
-    callback->sendFailure(Response::Error("Sink not found"));
+    callback->sendFailure(Response::ServerError("Sink not found"));
     return;
   }
 
@@ -119,19 +119,19 @@
   EnsureInitialized();
   const media_router::MediaSink::Id& sink_id = GetSinkIdByName(in_sink_name);
   if (sink_id.empty())
-    return Response::Error("Sink not found");
+    return Response::ServerError("Sink not found");
   const MediaRoute::Id& route_id = GetRouteIdForSink(sink_id);
   if (route_id.empty())
-    return Response::Error("Route not found");
+    return Response::ServerError("Route not found");
   router_->TerminateRoute(route_id);
   initiated_routes_.erase(route_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response CastHandler::Enable(protocol::Maybe<std::string> in_presentation_url) {
   EnsureInitialized();
   StartObservingForSinks(std::move(in_presentation_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response CastHandler::Disable() {
@@ -140,7 +140,7 @@
   issues_observer_.reset();
   for (const MediaRoute::Id& route_id : initiated_routes_)
     router_->TerminateRoute(route_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 void CastHandler::OnResultsUpdated(
@@ -266,7 +266,7 @@
     initiated_routes_.insert(result.route()->media_route_id());
     callback->sendSuccess();
   } else {
-    callback->sendFailure(Response::Error(result.error()));
+    callback->sendFailure(Response::ServerError(result.error()));
   }
 }
 
diff --git a/chrome/browser/devtools/protocol/cast_handler_unittest.cc b/chrome/browser/devtools/protocol/cast_handler_unittest.cc
index 4b8930f7..c42720b 100644
--- a/chrome/browser/devtools/protocol/cast_handler_unittest.cc
+++ b/chrome/browser/devtools/protocol/cast_handler_unittest.cc
@@ -93,7 +93,7 @@
 
 TEST_F(CastHandlerTest, SetSinkToUse) {
   sinks_observer_->OnSinksUpdated({sink1, sink2}, {});
-  EXPECT_TRUE(handler_->SetSinkToUse(kSinkName1).isSuccess());
+  EXPECT_TRUE(handler_->SetSinkToUse(kSinkName1).IsSuccess());
 
   const std::string presentation_url("https://example.com/");
   content::PresentationRequest request(content::GlobalFrameRoutingId(),
@@ -154,13 +154,12 @@
   sinks_observer_->OnSinksUpdated({sink1, sink2}, {});
   routes_observer_->OnRoutesUpdated({Route1()}, {});
   EXPECT_CALL(*router_, TerminateRoute(kRouteId1));
-  EXPECT_TRUE(handler_->StopCasting(kSinkName1).isSuccess());
+  EXPECT_TRUE(handler_->StopCasting(kSinkName1).IsSuccess());
 }
 
 TEST_F(CastHandlerTest, StopCastingWithInvalidName) {
   sinks_observer_->OnSinksUpdated({sink1, sink2}, {});
   routes_observer_->OnRoutesUpdated({Route1()}, {});
   // Attempting to stop casting to a sink without a route should fail.
-  EXPECT_EQ(protocol::Response::kError,
-            handler_->StopCasting(kSinkName2).status());
+  EXPECT_TRUE(handler_->StopCasting(kSinkName2).IsError());
 }
diff --git a/chrome/browser/devtools/protocol/page_handler.cc b/chrome/browser/devtools/protocol/page_handler.cc
index 7545a66..edbb2de 100644
--- a/chrome/browser/devtools/protocol/page_handler.cc
+++ b/chrome/browser/devtools/protocol/page_handler.cc
@@ -45,9 +45,9 @@
 
 protocol::Response PageHandler::SetAdBlockingEnabled(bool enabled) {
   if (!enabled_)
-    return protocol::Response::Error("Page domain is disabled.");
+    return protocol::Response::ServerError("Page domain is disabled.");
   ToggleAdBlocking(enabled);
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 void PageHandler::GetInstallabilityErrors(
@@ -58,7 +58,7 @@
                      : nullptr;
   if (!manager) {
     callback->sendFailure(
-        protocol::Response::Error("Unable to fetch errors for target"));
+        protocol::Response::ServerError("Unable to fetch errors for target"));
     return;
   }
   manager->GetAllErrors(base::BindOnce(&PageHandler::GotInstallabilityErrors,
@@ -100,7 +100,7 @@
 
   if (!manager) {
     callback->sendFailure(
-        protocol::Response::Error("Unable to fetch icons for target"));
+        protocol::Response::ServerError("Unable to fetch icons for target"));
     return;
   }
 
diff --git a/chrome/browser/devtools/protocol/target_handler.cc b/chrome/browser/devtools/protocol/target_handler.cc
index 6947f16..8760117 100644
--- a/chrome/browser/devtools/protocol/target_handler.cc
+++ b/chrome/browser/devtools/protocol/target_handler.cc
@@ -51,7 +51,7 @@
         locations) {
   remote_locations_.clear();
   if (!locations)
-    return protocol::Response::OK();
+    return protocol::Response::Success();
 
   for (const auto& location : *locations) {
     remote_locations_.insert(
@@ -62,7 +62,7 @@
       ChromeDevToolsManagerDelegate::GetInstance();
   if (delegate)
     delegate->UpdateDeviceDiscovery();
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response TargetHandler::CreateTarget(
@@ -80,7 +80,7 @@
     profile =
         DevToolsBrowserContextManager::GetInstance().GetProfileById(profile_id);
     if (!profile) {
-      return protocol::Response::Error(
+      return protocol::Response::ServerError(
           "Failed to find browser context with id " + profile_id);
     }
   }
@@ -103,7 +103,7 @@
 
   bool explicit_old_window = !new_window.fromMaybe(true);
   if (explicit_old_window && !target_browser) {
-    return protocol::Response::Error(
+    return protocol::Response::ServerError(
         "Failed to open new tab - "
         "no browser is open");
   }
@@ -114,10 +114,10 @@
       create_in_background, target_browser);
   Navigate(&params);
   if (!params.navigated_or_inserted_contents)
-    return protocol::Response::Error("Failed to open a new tab");
+    return protocol::Response::ServerError("Failed to open a new tab");
 
   *out_target_id = content::DevToolsAgentHost::GetOrCreateFor(
                        params.navigated_or_inserted_contents)
                        ->GetId();
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
diff --git a/chrome/browser/devtools/protocol/window_manager_handler.cc b/chrome/browser/devtools/protocol/window_manager_handler.cc
index 3e8fce9c..2c1df6b 100644
--- a/chrome/browser/devtools/protocol/window_manager_handler.cc
+++ b/chrome/browser/devtools/protocol/window_manager_handler.cc
@@ -18,13 +18,13 @@
 protocol::Response WindowManagerHandler::EnterOverviewMode() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   bool success = ash::Shell::Get()->overview_controller()->StartOverview();
-  return success ? protocol::Response::OK()
-                 : protocol::Response::Error("Overview failed");
+  return success ? protocol::Response::Success()
+                 : protocol::Response::ServerError("Overview failed");
 }
 
 protocol::Response WindowManagerHandler::ExitOverviewMode() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   bool success = ash::Shell::Get()->overview_controller()->EndOverview();
-  return success ? protocol::Response::OK()
-                 : protocol::Response::Error("Overview failed");
+  return success ? protocol::Response::Success()
+                 : protocol::Response::ServerError("Overview failed");
 }
diff --git a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
index a8e59d9..64271eb 100644
--- a/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
+++ b/chrome/browser/dom_distiller/dom_distiller_viewer_source_browsertest.cc
@@ -520,7 +520,7 @@
           ->GetDistilledPagePrefs();
 
   // Test theme.
-  distilled_page_prefs->SetTheme(DistilledPagePrefs::THEME_DARK);
+  distilled_page_prefs->SetTheme(mojom::Theme::kDark);
   base::RunLoop().RunUntilIdle();
   ExpectBodyHasThemeAndFont(contents, "dark", "sans-serif");
 
@@ -528,8 +528,7 @@
   EXPECT_EQ(kDarkToolbarThemeColor, contents->GetThemeColor());
 
   // Test font family.
-  distilled_page_prefs->SetFontFamily(
-      DistilledPagePrefs::FONT_FAMILY_MONOSPACE);
+  distilled_page_prefs->SetFontFamily(mojom::FontFamily::kMonospace);
   base::RunLoop().RunUntilIdle();
   ExpectBodyHasThemeAndFont(contents, "dark", "monospace");
 
@@ -571,9 +570,8 @@
 
   // Set preference.
   const double kScale = 1.23;
-  distilled_page_prefs->SetTheme(DistilledPagePrefs::THEME_DARK);
-  distilled_page_prefs->SetFontFamily(
-      DistilledPagePrefs::FONT_FAMILY_MONOSPACE);
+  distilled_page_prefs->SetTheme(mojom::Theme::kDark);
+  distilled_page_prefs->SetFontFamily(mojom::FontFamily::kMonospace);
   distilled_page_prefs->SetFontScaling(kScale);
 
   base::RunLoop().RunUntilIdle();
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index 9d31060a..86e7906c 100644
--- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -410,6 +410,9 @@
       base::FeatureList::IsEnabled(
           chromeos::features::kVirtualKeyboardFloatingResizable)));
   features->AppendString(GenerateFeatureFlag(
+      "assistiveAutoCorrect",
+      base::FeatureList::IsEnabled(chromeos::features::kAssistAutoCorrect)));
+  features->AppendString(GenerateFeatureFlag(
       "nativerulebased", base::FeatureList::IsEnabled(
                              chromeos::features::kNativeRuleBasedTyping)));
 
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 4041f96a..f22640e 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -520,6 +520,49 @@
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegistrationAtStartupTest);
 };
 
+// Observes ServiceWorkerTaskQueue::DidStartWorkerFail.
+class ServiceWorkerStartFailureObserver
+    : public ServiceWorkerTaskQueue::TestObserver {
+ public:
+  explicit ServiceWorkerStartFailureObserver(const ExtensionId& extension_id)
+      : extension_id_(extension_id) {
+    ServiceWorkerTaskQueue::SetObserverForTest(this);
+  }
+  ~ServiceWorkerStartFailureObserver() override {
+    ServiceWorkerTaskQueue::SetObserverForTest(nullptr);
+  }
+
+  ServiceWorkerStartFailureObserver(const ServiceWorkerStartFailureObserver&) =
+      delete;
+  ServiceWorkerStartFailureObserver& operator=(
+      const ServiceWorkerStartFailureObserver&) = delete;
+
+  size_t WaitForDidStartWorkerFailAndGetTaskCount() {
+    if (pending_tasks_count_at_worker_failure_)
+      return *pending_tasks_count_at_worker_failure_;
+
+    run_loop_.Run();
+    return *pending_tasks_count_at_worker_failure_;
+  }
+
+  // ServiceWorkerTaskQueue::TestObserver:
+  void DidStartWorkerFail(const ExtensionId& extension_id,
+                          size_t num_pending_tasks) override {
+    if (extension_id == extension_id_) {
+      pending_tasks_count_at_worker_failure_ = num_pending_tasks;
+      run_loop_.Quit();
+    }
+  }
+
+ private:
+  // Holds number of pending tasks for worker at the time DidStartWorkerFail is
+  // observed.
+  base::Optional<size_t> pending_tasks_count_at_worker_failure_;
+
+  ExtensionId extension_id_;
+  base::RunLoop run_loop_;
+};
+
 // Test extension id at
 // api_test/service_worker/worker_based_background/registration_at_startup/.
 const char ServiceWorkerRegistrationAtStartupTest::kExtensionId[] =
@@ -1581,6 +1624,64 @@
   content::ServiceWorkerContext* context_;
 };
 
+// Observer for an extension service worker to start and stop.
+class TestWorkerObserver : public content::ServiceWorkerContextObserver {
+ public:
+  TestWorkerObserver(content::ServiceWorkerContext* context,
+                     const ExtensionId& extension_id)
+      : context_(context),
+        extension_url_(Extension::GetBaseURLFromExtensionId(extension_id)) {
+    context_->AddObserver(this);
+  }
+  ~TestWorkerObserver() override {
+    if (context_) {
+      context_->RemoveObserver(this);
+    }
+  }
+
+  TestWorkerObserver(const TestWorkerObserver&) = delete;
+  TestWorkerObserver& operator=(const TestWorkerObserver&) = delete;
+
+  void WaitForWorkerStart() {
+    if (running_version_id_.has_value())
+      return;
+    started_run_loop_.Run();
+  }
+
+  void WaitForWorkerStop() {
+    DCHECK(running_version_id_.has_value()) << "Worker hasn't started";
+    stopped_run_loop_.Run();
+  }
+
+ private:
+  // ServiceWorkerContextObserver:
+  void OnVersionStartedRunning(
+      int64_t version_id,
+      const content::ServiceWorkerRunningInfo& running_info) override {
+    if (running_info.scope != extension_url_)
+      return;
+
+    running_version_id_ = version_id;
+    started_run_loop_.Quit();
+  }
+  void OnVersionStoppedRunning(int64_t version_id) override {
+    if (running_version_id_ == version_id)
+      stopped_run_loop_.Quit();
+  }
+  void OnDestruct(content::ServiceWorkerContext* context) override {
+    context_->RemoveObserver(this);
+    context_ = nullptr;
+  }
+
+  base::RunLoop started_run_loop_;
+  base::RunLoop stopped_run_loop_;
+  // Holds version id of an extension worker once OnVersionStartedRunning is
+  // observed.
+  base::Optional<int64_t> running_version_id_;
+  content::ServiceWorkerContext* context_ = nullptr;
+  GURL extension_url_;
+};
+
 IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest,
                        EventsToStoppedWorker) {
   content::StoragePartition* storage_partition =
@@ -1833,6 +1934,79 @@
   EXPECT_EQ(1, observer.GetCompletedCount(extension->url()));
 }
 
+// Tests that a worker that failed to start due to 'install' error, clears its
+// PendingTasks correctly. Also tests that subsequent tasks are properly
+// cleared.
+// Regression test for https://crbug.com/1019161.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest,
+                       WorkerStartFailureClearsPendingTasks) {
+  content::StoragePartition* storage_partition =
+      content::BrowserContext::GetDefaultStoragePartition(browser()->profile());
+  content::ServiceWorkerContext* context =
+      storage_partition->GetServiceWorkerContext();
+
+  const ExtensionId kTestExtensionId("iegclhlplifhodhkoafiokenjoapiobj");
+  // Set up an observer to wait for worker to start and then stop.
+  TestWorkerObserver observer(context, kTestExtensionId);
+
+  TestExtensionDir test_dir;
+  // Key for extension id |kTestExtensionId|.
+  constexpr const char kKey[] =
+      "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjzv7dI7Ygyh67VHE1DdidudpYf8P"
+      "Ffv8iucWvzO+3xpF/Dm5xNo7aQhPNiEaNfHwJQ7lsp4gc+C+4bbaVewBFspTruoSJhZc5uEf"
+      "qxwovJwN+v1/SUFXTXQmQBv6gs0qZB4gBbl4caNQBlqrFwAMNisnu1V6UROna8rOJQ90D7Nv"
+      "7TCwoVPKBfVshpFjdDOTeBg4iLctO3S/06QYqaTDrwVceSyHkVkvzBY6tc6mnYX0RZu78J9i"
+      "L8bdqwfllOhs69cqoHHgrLdI6JdOyiuh6pBP6vxMlzSKWJ3YTNjaQTPwfOYaLMuzdl0v+Ydz"
+      "afIzV9zwe4Xiskk+5JNGt8b2rQIDAQAB";
+
+  test_dir.WriteManifest(base::StringPrintf(
+      R"({
+           "name": "Test Extension",
+           "manifest_version": 2,
+           "version": "0.1",
+           "key": "%s",
+           "permissions": ["tabs"],
+           "background": {"service_worker": "script.js"}
+         })",
+      kKey));
+  constexpr char kScript[] =
+      R"(self.oninstall = function(event) {
+           event.waitUntil(Promise.reject(new Error('foo')));
+         };)";
+  test_dir.WriteFile(FILE_PATH_LITERAL("script.js"), kScript);
+  const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+  ASSERT_TRUE(extension);
+  ASSERT_EQ(kTestExtensionId, extension->id());
+  LazyContextId context_id(browser()->profile(), extension->id(),
+                           extension->url());
+  ServiceWorkerStartFailureObserver worker_start_failure_observer(
+      extension->id());
+
+  // Let the worker start so it rejects 'install' event. This causes the worker
+  // to stop.
+  observer.WaitForWorkerStart();
+  observer.WaitForWorkerStop();
+
+  ServiceWorkerTaskQueue* service_worker_task_queue =
+      ServiceWorkerTaskQueue::Get(browser()->profile());
+  // Adding a pending task to ServiceWorkerTaskQueue will try to start the
+  // worker that failed during installation before. This enables us to ensure
+  // that this pending task is cleared on failure.
+  service_worker_task_queue->AddPendingTask(context_id, base::DoNothing());
+
+  // Since the worker rejects installation, it will fail to start now. Ensure
+  // that the queue sees pending tasks while the error is observed.
+  EXPECT_GT(
+      worker_start_failure_observer.WaitForDidStartWorkerFailAndGetTaskCount(),
+      0u);
+  // Ensure DidStartWorkerFail finished clearing tasks.
+  base::RunLoop().RunUntilIdle();
+
+  // And the task count will be reset to zero afterwards.
+  EXPECT_EQ(0u,
+            service_worker_task_queue->GetNumPendingTasksForTest(context_id));
+}
+
 IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest,
                        ProcessManagerRegistrationOnShutdown) {
   // Note that StopServiceWorkerForScope call below expects the worker to be
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 6e337da..a186425 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -98,11 +98,6 @@
     "expiry_milestone": 82
   },
   {
-    "name": "android-setup-search-engine",
-    "owners": [ "pavely", "wylieb" ],
-    "expiry_milestone": 83
-  },
-  {
     "name": "android-site-settings-ui-refresh",
     "owners": [ "hkamila" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 47544d0..e7c73621 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2169,10 +2169,6 @@
 const char kAndroidAutofillAccessibilityDescription[] =
     "Enable accessibility for autofill popup.";
 
-const char kAndroidSetupSearchEngineName[] = "Android setup search engine";
-const char kAndroidSetupSearchEngineDescription[] =
-    "Enables search engine selection at Android setup.";
-
 const char kAppNotificationStatusMessagingName[] =
     "App notification status messaging";
 const char kAppNotificationStatusMessagingDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index f905ee2..16a04f6 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1253,9 +1253,6 @@
 extern const char kAndroidAutofillAccessibilityName[];
 extern const char kAndroidAutofillAccessibilityDescription[];
 
-extern const char kAndroidSetupSearchEngineName[];
-extern const char kAndroidSetupSearchEngineDescription[];
-
 extern const char kAppNotificationStatusMessagingName[];
 extern const char kAppNotificationStatusMessagingDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 28b9f5a..a3ace436 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -104,7 +104,6 @@
     &kAndroidPayIntegrationV1,
     &kAndroidPayIntegrationV2,
     &kAndroidSearchEngineChoiceNotification,
-    &kAndroidSetupSearchEngine,
     &kAndroidSiteSettingsUIRefresh,
     &kBookmarksShowInFolder,
     &kCastDeviceFilter,
@@ -295,9 +294,6 @@
 const base::Feature kAndroidSearchEngineChoiceNotification{
     "AndroidSearchEngineChoiceNotification", base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kAndroidSetupSearchEngine{"AndroidSetupSearchEngine",
-                                              base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kAndroidSiteSettingsUIRefresh{
     "AndroidSiteSettingsUIRefresh", base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 1534b6dc..a8ab62c 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -21,7 +21,6 @@
 extern const base::Feature kAndroidPayIntegrationV2;
 extern const base::Feature kAndroidPaymentApps;
 extern const base::Feature kAndroidSearchEngineChoiceNotification;
-extern const base::Feature kAndroidSetupSearchEngine;
 extern const base::Feature kAndroidSiteSettingsUIRefresh;
 extern const base::Feature kBackgroundTaskComponentUpdate;
 extern const base::Feature kBookmarksShowInFolder;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
index d14c61c..c832fcc 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -65,6 +65,7 @@
             put(ChromeFeatureList.TAB_GROUPS_ANDROID, false);
             put(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, false);
             put(ChromeFeatureList.DUET_TABSTRIP_INTEGRATION_ANDROID, false);
+            put(ChromeFeatureList.SHARE_BUTTON_IN_TOP_TOOLBAR, false);
             put(ChromeFeatureList.CLOSE_TAB_SUGGESTIONS, false);
             put(ChromeFeatureList.INSTANT_START, false);
             put(ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID, false);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 29b0faa..1ff52e1 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -221,7 +221,6 @@
     public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2";
     public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION =
             "AndroidSearchEngineChoiceNotification";
-    public static final String ANDROID_SETUP_SEARCH_ENGINE = "AndroidSetupSearchEngine";
     public static final String ANDROID_SITE_SETTINGS_UI_REFRESH = "AndroidSiteSettingsUIRefresh";
     public static final String APP_NOTIFICATION_STATUS_MESSAGING = "AppNotificationStatusMessaging";
     public static final String AUTOFILL_ASSISTANT = "AutofillAssistant";
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc
index 06aa402b..85adb56 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -179,6 +179,14 @@
     {"mojo", "NumberOfMojoHandles", MetricSize::kSmall,
      MemoryAllocatorDump::kNameObjectCount, EmitTo::kCountsInUkmOnly,
      &Memory_Experimental::SetNumberOfMojoHandles},
+    {"media/webmediaplayer/audio", "WebMediaPlayer.Audio", MetricSize::kSmall,
+     kSize, EmitTo::kSizeInUmaOnly, nullptr},
+    {"media/webmediaplayer/video", "WebMediaPlayer.Video", MetricSize::kLarge,
+     kSize, EmitTo::kSizeInUmaOnly, nullptr},
+    {"media/webmediaplayer/data_source", "WebMediaPlayer.DataSource",
+     MetricSize::kLarge, kSize, EmitTo::kSizeInUmaOnly, nullptr},
+    {"media/webmediaplayer/demuxer", "WebMediaPlayer.Demuxer",
+     MetricSize::kLarge, kSize, EmitTo::kSizeInUmaOnly, nullptr},
     {"net", "Net", MetricSize::kSmall, kEffectiveSize, EmitTo::kSizeInUkmAndUma,
      &Memory_Experimental::SetNet},
     {"net/url_request_context", "Net.UrlRequestContext", MetricSize::kSmall,
diff --git a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
index d53aaaac..e7a1908 100644
--- a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
+++ b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
@@ -198,4 +198,10 @@
   CheckRect(*impacted[2].FindListKey("new_rect"), 50, 50, 10, 50);   // #c
   CheckRect(*impacted[3].FindListKey("new_rect"), 60, 50, 50, 10);   // #d
   CheckRect(*impacted[4].FindListKey("new_rect"), 110, 50, 40, 30);  // #e
+
+  ASSERT_EQ("DIV id='a'", *impacted[0].FindStringKey("debug_name"));
+  ASSERT_EQ("DIV id='f'", *impacted[1].FindStringKey("debug_name"));
+  ASSERT_EQ("DIV id='c'", *impacted[2].FindStringKey("debug_name"));
+  ASSERT_EQ("DIV id='d'", *impacted[3].FindStringKey("debug_name"));
+  ASSERT_EQ("DIV id='e'", *impacted[4].FindStringKey("debug_name"));
 }
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index b0967fc..2c0e4e3 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -2488,8 +2488,9 @@
 
 // Creates a single frame within the main frame and verifies the intersection
 // with the main frame.
+// TODO(crbug/1062006): Re-enable once chromeos-thinlto build is fixed.
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MainFrameDocumentIntersectionSingleFrame) {
+                       DISABLED_MainFrameDocumentIntersectionSingleFrame) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   auto waiter = CreatePageLoadMetricsTestWaiter();
@@ -2512,8 +2513,9 @@
 
 // Creates a set of nested frames within the main frame and verifies
 // their intersections with the main frame.
+// TODO(crbug/1062006): Re-enable once chromeos-thinlto build is fixed.
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MainFrameDocumentIntersectionSameOrigin) {
+                       DISABLED_MainFrameDocumentIntersectionSameOrigin) {
   EXPECT_TRUE(embedded_test_server()->Start());
 
   auto waiter = CreatePageLoadMetricsTestWaiter();
@@ -2553,8 +2555,9 @@
 
 // Creates a set of nested frames, with a cross origin subframe, within the
 // main frame and verifies their intersections with the main frame.
+// TODO(crbug/1062006): Re-enable once chromeos-thinlto build is fixed.
 IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MainFrameDocumentIntersectionCrossOrigin) {
+                       DISABLED_MainFrameDocumentIntersectionCrossOrigin) {
   EXPECT_TRUE(embedded_test_server()->Start());
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(
@@ -2595,8 +2598,10 @@
 // Creates a set of nested frames, with a cross origin subframe that is out of
 // view within the main frame and verifies their intersections with the main
 // frame.
-IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MainFrameDocumentIntersectionCrossOriginOutOfView) {
+// TODO(crbug/1062006): Re-enable once chromeos-thinlto build is fixed.
+IN_PROC_BROWSER_TEST_F(
+    PageLoadMetricsBrowserTest,
+    DISABLED_MainFrameDocumentIntersectionCrossOriginOutOfView) {
   EXPECT_TRUE(embedded_test_server()->Start());
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(
@@ -2635,8 +2640,11 @@
 // view within the main frame and verifies their intersections with the main
 // frame. The out of view frame is then scrolled back into view and the
 // intersection is verified.
-IN_PROC_BROWSER_TEST_F(PageLoadMetricsBrowserTest,
-                       MainFrameDocumentIntersectionCrossOriginScrolled) {
+//
+// TODO(crbug/1062006): Re-enable once chromeos-thinlto build is fixed.
+IN_PROC_BROWSER_TEST_F(
+    PageLoadMetricsBrowserTest,
+    DISABLED_MainFrameDocumentIntersectionCrossOriginScrolled) {
   EXPECT_TRUE(embedded_test_server()->Start());
   auto waiter = CreatePageLoadMetricsTestWaiter();
   ui_test_utils::NavigateToURL(
diff --git a/chrome/browser/performance_manager/browser_child_process_watcher.cc b/chrome/browser/performance_manager/browser_child_process_watcher.cc
index a3de3a6..bad3577 100644
--- a/chrome/browser/performance_manager/browser_child_process_watcher.cc
+++ b/chrome/browser/performance_manager/browser_child_process_watcher.cc
@@ -33,8 +33,7 @@
   DCHECK(gpu_process_nodes_.empty());
 
   browser_process_node_ =
-      PerformanceManagerImpl::GetInstance()->CreateProcessNode(
-          RenderProcessHostProxy());
+      PerformanceManagerImpl::CreateProcessNode(RenderProcessHostProxy());
   OnProcessLaunched(base::Process::Current(), browser_process_node_.get());
   BrowserChildProcessObserver::Add(this);
 }
@@ -51,15 +50,14 @@
     nodes.push_back(std::move(node.second));
   gpu_process_nodes_.clear();
 
-  PerformanceManagerImpl::GetInstance()->BatchDeleteNodes(std::move(nodes));
+  PerformanceManagerImpl::BatchDeleteNodes(std::move(nodes));
 }
 
 void BrowserChildProcessWatcher::BrowserChildProcessLaunchedAndConnected(
     const content::ChildProcessData& data) {
   if (data.process_type == content::PROCESS_TYPE_GPU) {
     std::unique_ptr<ProcessNodeImpl> gpu_node =
-        PerformanceManagerImpl::GetInstance()->CreateProcessNode(
-            RenderProcessHostProxy());
+        PerformanceManagerImpl::CreateProcessNode(RenderProcessHostProxy());
     OnProcessLaunched(data.GetProcess(), gpu_node.get());
     gpu_process_nodes_[data.id] = std::move(gpu_node);
   }
@@ -74,7 +72,7 @@
     // launch-and-connect notification arrives.
     // See https://crbug.com/942500.
     if (it != gpu_process_nodes_.end()) {
-      PerformanceManagerImpl::GetInstance()->DeleteNode(std::move(it->second));
+      PerformanceManagerImpl::DeleteNode(std::move(it->second));
       gpu_process_nodes_.erase(it);
     }
   }
@@ -101,7 +99,7 @@
   if (base::Contains(gpu_process_nodes_, id)) {
     auto* process_node = gpu_process_nodes_[id].get();
 
-    DCHECK(PerformanceManagerImpl::GetInstance());
+    DCHECK(PerformanceManagerImpl::IsAvailable());
     PerformanceManagerImpl::GetTaskRunner()->PostTask(
         FROM_HERE, base::BindOnce(&ProcessNodeImpl::SetProcessExitStatus,
                                   base::Unretained(process_node), exit_code));
@@ -122,7 +120,7 @@
       process.CreationTime();
 #endif
 
-  DCHECK(PerformanceManagerImpl::GetInstance());
+  DCHECK(PerformanceManagerImpl::IsAvailable());
   PerformanceManagerImpl::GetTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&ProcessNodeImpl::SetProcess,
                                 base::Unretained(process_node),
diff --git a/chrome/browser/performance_manager/graph/page_node_impl_browsertest.cc b/chrome/browser/performance_manager/graph/page_node_impl_browsertest.cc
index 55b7add..e21ba2a 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl_browsertest.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl_browsertest.cc
@@ -204,13 +204,12 @@
     const mojom::InterventionPolicy expected_policy,
     FrameNodeOriginTrialFreezePolicyChangedCounter* ot_change_counter,
     uint32_t expected_ot_change_count) {
-  auto* perf_manager = PerformanceManagerImpl::GetInstance();
-  ASSERT_TRUE(perf_manager);
+  ASSERT_TRUE(PerformanceManagerImpl::IsAvailable());
   for (;;) {
     bool load_complete = false;
     base::RunLoop run_loop;
     auto quit_closure = run_loop.QuitClosure();
-    perf_manager->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting([&](performance_manager::GraphImpl* graph) {
           auto ot_change_count = ot_change_counter->GetCount();
@@ -227,7 +226,7 @@
 
   base::RunLoop run_loop;
   auto quit_closure = run_loop.QuitClosure();
-  perf_manager->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE,
       base::BindLambdaForTesting([&](performance_manager::GraphImpl* graph) {
         auto page_nodes = graph->GetAllPageNodeImpls();
diff --git a/chrome/browser/performance_manager/page_load_tracker_decorator_browsertest.cc b/chrome/browser/performance_manager/page_load_tracker_decorator_browsertest.cc
index 2865fb90..7e92f0a 100644
--- a/chrome/browser/performance_manager/page_load_tracker_decorator_browsertest.cc
+++ b/chrome/browser/performance_manager/page_load_tracker_decorator_browsertest.cc
@@ -26,9 +26,8 @@
   PageIsLoadingObserver(base::WeakPtr<PageNode> page_node,
                         bool desired_is_loading)
       : page_node_(page_node), desired_is_loading_(desired_is_loading) {
-    auto* perf_manager = PerformanceManagerImpl::GetInstance();
-    DCHECK(perf_manager);
-    perf_manager->CallOnGraphImpl(
+    DCHECK(PerformanceManagerImpl::IsAvailable());
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting([&](performance_manager::GraphImpl* graph) {
           EXPECT_TRUE(page_node_);
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc
index d357a14..cb431e5a0 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc
@@ -4,6 +4,12 @@
 
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.h"
 
+#include <memory>
+#include <set>
+#include <string>
+#include <utility>
+#include <vector>
+
 #include "base/auto_reset.h"
 #include "base/callback.h"
 #include "base/run_loop.h"
@@ -93,7 +99,7 @@
 
   void SetUp() override {
     testing::TestWithPerformanceManager::SetUp();
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindOnce(
             [](std::unique_ptr<SiteDataCacheFactory> site_data_cache_factory,
@@ -120,7 +126,7 @@
     base::RunLoop run_loop;
     auto quit_closure = run_loop.QuitClosure();
     auto browser_context_id = profile()->UniqueId();
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting([&](performance_manager::GraphImpl* graph) {
           auto mock_cache =
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc
index ef0600d..079bb5f 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc
@@ -55,7 +55,7 @@
     DCHECK(browser_context->IsOffTheRecord());
     parent_context_id = parent_context->UniqueId();
   }
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE, base::BindOnce(
                      [](SiteDataCacheFactory* factory,
                         const std::string& browser_context_id,
@@ -75,7 +75,7 @@
     content::BrowserContext* browser_context) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(factory);
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE, base::BindOnce(
                      [](SiteDataCacheFactory* factory,
                         const std::string& browser_context_id,
@@ -121,7 +121,7 @@
     const std::string& browser_context_id,
     base::OnceCallback<void(bool)> cb) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE,
       base::BindOnce(
           [](SiteDataCacheFactory* factory,
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory_unittest.cc
index f23f32f..ad317104 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory_unittest.cc
@@ -4,6 +4,9 @@
 
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
@@ -23,7 +26,7 @@
   std::unique_ptr<SiteDataCacheFactory> factory =
       std::make_unique<SiteDataCacheFactory>();
   SiteDataCacheFactory* factory_raw = factory.get();
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE,
       base::BindOnce(
           [](std::unique_ptr<SiteDataCacheFactory> site_data_cache_factory,
@@ -38,7 +41,7 @@
 
   {
     base::RunLoop run_loop;
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindOnce(
             [](SiteDataCacheFactory* factory,
@@ -60,7 +63,7 @@
                                                             &profile);
   {
     base::RunLoop run_loop;
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindOnce(
             [](SiteDataCacheFactory* factory,
diff --git a/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc b/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc
index ecfcb9f..de2b983c 100644
--- a/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc
+++ b/chrome/browser/performance_manager/render_process_host_proxy_unittest.cc
@@ -108,7 +108,7 @@
   // what would happen with a policy message being posted from the graph.
   {
     base::RunLoop run_loop;
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting(
             [&deref_proxy, process_node,
@@ -128,7 +128,7 @@
   // Run the same test but make sure the RPH is gone first.
   {
     base::RunLoop run_loop;
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting([&rph_factory, &deref_proxy, process_node,
                                     host, quit_loop = run_loop.QuitClosure()](
diff --git a/chrome/browser/permissions/chrome_permissions_client.cc b/chrome/browser/permissions/chrome_permissions_client.cc
index 1a530fa..0ed1908 100644
--- a/chrome/browser/permissions/chrome_permissions_client.cc
+++ b/chrome/browser/permissions/chrome_permissions_client.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/permissions/adaptive_quiet_notification_permission_ui_enabler.h"
 #include "chrome/browser/permissions/contextual_notification_permission_ui_selector.h"
 #include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
+#include "chrome/browser/permissions/permission_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/ui_thread_search_terms_data.h"
 #include "chrome/common/url_constants.h"
@@ -56,6 +57,12 @@
       Profile::FromBrowserContext(browser_context));
 }
 
+permissions::PermissionManager* ChromePermissionsClient::GetPermissionManager(
+    content::BrowserContext* browser_context) {
+  return PermissionManagerFactory::GetForProfile(
+      Profile::FromBrowserContext(browser_context));
+}
+
 double ChromePermissionsClient::GetSiteEngagementScore(
     content::BrowserContext* browser_context,
     const GURL& origin) {
diff --git a/chrome/browser/permissions/chrome_permissions_client.h b/chrome/browser/permissions/chrome_permissions_client.h
index 36d158a..76c7cb32 100644
--- a/chrome/browser/permissions/chrome_permissions_client.h
+++ b/chrome/browser/permissions/chrome_permissions_client.h
@@ -18,6 +18,8 @@
       content::BrowserContext* browser_context) override;
   permissions::PermissionDecisionAutoBlocker* GetPermissionDecisionAutoBlocker(
       content::BrowserContext* browser_context) override;
+  permissions::PermissionManager* GetPermissionManager(
+      content::BrowserContext* browser_context) override;
   double GetSiteEngagementScore(content::BrowserContext* browser_context,
                                 const GURL& origin) override;
   void GetUkmSourceId(content::BrowserContext* browser_context,
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index b5129634..06574f3 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -350,7 +350,7 @@
 #endif
 
 #if defined(OS_MACOSX)
-#include "chrome/browser/apps/platform_apps/app_shim_registry_mac.h"
+#include "chrome/browser/apps/app_shim/app_shim_registry_mac.h"
 #include "chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.h"
 #include "chrome/browser/ui/cocoa/confirm_quit.h"
 #endif
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc b/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
index ec7d2c3..93aa3df 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
@@ -86,7 +86,9 @@
   void OnCustomProxyConfigUpdated(
       network::mojom::CustomProxyConfigPtr proxy_config) override {
     config_ = std::move(proxy_config);
-    std::move(update_closure_).Run();
+    if (update_closure_) {
+      std::move(update_closure_).Run();
+    }
   }
   void MarkProxiesAsBad(base::TimeDelta bypass_duration,
                         const net::ProxyList& bad_proxies,
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_params.cc b/chrome/browser/prerender/isolated/isolated_prerender_params.cc
index a59f7b06..07863c8 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_params.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_params.cc
@@ -39,3 +39,10 @@
   }
   return max;
 }
+
+base::TimeDelta IsolatedPrerenderProbeTimeout() {
+  return base::TimeDelta::FromMilliseconds(
+      base::GetFieldTrialParamByFeatureAsInt(
+          features::kIsolatePrerendersMustProbeOrigin, "probe_timeout_ms",
+          10 * 1000 /* 10 seconds */));
+}
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_params.h b/chrome/browser/prerender/isolated/isolated_prerender_params.h
index cc3626e..df38c45 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_params.h
+++ b/chrome/browser/prerender/isolated/isolated_prerender_params.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "base/optional.h"
+#include "base/time/time.h"
 #include "url/gurl.h"
 
 // Returns true if the Isolated Prerender feature is enabled.
@@ -22,4 +23,7 @@
 // field trial return nullopt.
 base::Optional<size_t> IsolatedPrerenderMaximumNumberOfPrefetches();
 
+// The amount of time to allow before timing out an origin probe.
+base::TimeDelta IsolatedPrerenderProbeTimeout();
+
 #endif  // CHROME_BROWSER_PRERENDER_ISOLATED_ISOLATED_PRERENDER_PARAMS_H_
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
index 8c3499d..86ab71bf 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
@@ -176,7 +176,7 @@
         })");
 
   AvailabilityProber::TimeoutPolicy timeout_policy;
-  timeout_policy.base_timeout = base::TimeDelta::FromSeconds(10);
+  timeout_policy.base_timeout = IsolatedPrerenderProbeTimeout();
   AvailabilityProber::RetryPolicy retry_policy;
   retry_policy.max_retries = 0;
 
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.cc b/chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.cc
index 95a0275..f26fa07 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_data_unittest_utils.cc
@@ -104,7 +104,7 @@
       performance_manager::PerformanceManagerImpl::Create(base::DoNothing());
   registry_ = performance_manager::PerformanceManagerRegistry::Create();
 
-  performance_manager_->CallOnGraph(
+  performance_manager::PerformanceManagerImpl::CallOnGraph(
       FROM_HERE, base::BindOnce([](performance_manager::Graph* graph) {
         graph->PassToGraph(FormInteractionTabHelper::CreateGraphObserver());
       }));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index d5eac33..72c226e7 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -51,7 +51,7 @@
   "background/injected_script_loader.js",
   "background/keyboard_handler.js",
   "background/keymaps/key_map.js",
-  "background/language_switching.js",
+  "background/locale_output_helper.js",
   "learn_mode/kbexplorer.js",
   "background/live_regions.js",
   "background/logging/event_stream_logger.js",
@@ -394,8 +394,8 @@
       "background/download_handler_test.js",
       "background/editing_test.js",
       "background/keyboard_handler_test.js",
-      "background/language_switching_test.js",
       "background/live_regions_test.js",
+      "background/locale_output_helper_test.js",
       "background/logging/log_store_test.js",
       "background/output_test.js",
       "background/recovery_strategy_test.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
index def7ecf..d053197e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -2457,7 +2457,6 @@
     <p>start</p>
     <button id="click"></button>
     <script>
-      document.title = 'foo';
       const button = document.getElementById('click');
       button.addEventListener('click', _ => document.title = 'bar');
     </script>
@@ -2476,10 +2475,8 @@
         };
 
         mockFeedback.clearPendingOutput()
-            .call(doCmd('readCurrentTitle'))
-            .expectSpeech(/^foo/)
             .call(clickButtonThenReadCurrentTitle)
-            .expectSpeech(/^bar/)
+            .expectSpeech(/^bar - Chromium*/)
             .replay();
       });
 });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/language_switching.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js
similarity index 83%
rename from chrome/browser/resources/chromeos/accessibility/chromevox/background/language_switching.js
rename to chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js
index f076449..1f86cba 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/language_switching.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js
@@ -3,34 +3,34 @@
 // found in the LICENSE file.
 
 /**
- * @fileoverview Provides language-switching services for ChromeVox, which
- * uses language detection information to automatically change the TTS voice.
+ * @fileoverview Provides locale output services for ChromeVox, which
+ * uses language information to automatically change the TTS voice.
  * Please note: we use the term 'locale' to refer to language codes e.g.
  * 'en-US'. For more information on locales:
  * https://en.wikipedia.org/wiki/Locale_(computer_software)
  */
 
-goog.provide('LanguageSwitching');
+goog.provide('LocaleOutputHelper');
 
 goog.require('StringUtil');
 
-LanguageSwitching = class {
+LocaleOutputHelper = class {
   /** @private */
   constructor() {
     /**
      * @const
      * @private {string}
      */
-    LanguageSwitching.BROWSER_UI_LOCALE_ =
+    LocaleOutputHelper.BROWSER_UI_LOCALE_ =
         chrome.i18n.getUILanguage().toLowerCase();
     /** @private {string} */
-    this.currentLocale_ = LanguageSwitching.BROWSER_UI_LOCALE_ || '';
+    this.currentLocale_ = LocaleOutputHelper.BROWSER_UI_LOCALE_ || '';
     /**
      * Confidence threshold to meet before assigning sub-node language.
      * @const
      * @private {number}
      */
-    LanguageSwitching.PROBABILITY_THRESHOLD_ = 0.9;
+    LocaleOutputHelper.PROBABILITY_THRESHOLD_ = 0.9;
     /**
      * Set to false as default, since sub-node language detection is still
      * experimental.
@@ -58,9 +58,9 @@
   }
 
   /**
-   * Main entry point for language switching logic. Routes arguments to either
-   * |atNodeLevel_| or |atSubNodeLevel_| depending on which kind of language
-   * switching the user has specified.
+   * Main entry point. Routes arguments to either |atNodeLevel_| or
+   * |atSubNodeLevel_| depending on the kind of locale switching the user
+   * has specified.
    * @param {AutomationNode} node
    * @param {string} stringAttribute The string attribute whose value we want
    * to output.
@@ -102,7 +102,7 @@
     const languageAnnotation =
         node.languageAnnotationForStringAttribute(stringAttribute);
     if (!languageAnnotation || languageAnnotation.length === 0) {
-      appendWithLocaleCallback(text, LanguageSwitching.BROWSER_UI_LOCALE_);
+      appendWithLocaleCallback(text, LocaleOutputHelper.BROWSER_UI_LOCALE_);
       return;
     }
 
@@ -158,11 +158,11 @@
       }
     } else {
       // Alert the user that no voice is available for |newLocale|.
-      this.setCurrentLocale_(LanguageSwitching.BROWSER_UI_LOCALE_);
+      this.setCurrentLocale_(LocaleOutputHelper.BROWSER_UI_LOCALE_);
       const displayLanguage =
           chrome.accessibilityPrivate.getDisplayNameForLocale(
               newLocale /* Locale to translate */,
-              LanguageSwitching.BROWSER_UI_LOCALE_ /* Target locale */);
+              LocaleOutputHelper.BROWSER_UI_LOCALE_ /* Target locale */);
       outputString =
           Msgs.getMsg('voice_unavailable_for_language', [displayLanguage]);
     }
@@ -182,16 +182,16 @@
    * @private
    */
   computeNewLocale_(nodeLocale, subNodeLocale, subNodeProbability) {
-    if (subNodeProbability > LanguageSwitching.PROBABILITY_THRESHOLD_) {
+    if (subNodeProbability > LocaleOutputHelper.PROBABILITY_THRESHOLD_) {
       return subNodeLocale;
     }
 
     nodeLocale = nodeLocale.toLowerCase();
-    if (LanguageSwitching.isValidLocale_(nodeLocale)) {
+    if (LocaleOutputHelper.isValidLocale_(nodeLocale)) {
       return nodeLocale;
     }
 
-    return LanguageSwitching.BROWSER_UI_LOCALE_;
+    return LocaleOutputHelper.BROWSER_UI_LOCALE_;
   }
 
   // TODO(akihiroota): http://crbug.com/1061222
@@ -239,7 +239,7 @@
    * @private
    */
   setCurrentLocale_(locale) {
-    if (LanguageSwitching.isValidLocale_(locale)) {
+    if (LocaleOutputHelper.isValidLocale_(locale)) {
       this.currentLocale_ = locale;
     }
   }
@@ -247,27 +247,27 @@
   // =============== Static Methods ==============
 
   /**
-   * Creates a singleton instance of LanguageSwitching.
+   * Creates a singleton instance of LocaleOutputHelper.
    * @private
    */
   static init() {
-    if (LanguageSwitching.instance_ !== undefined) {
+    if (LocaleOutputHelper.instance_ !== undefined) {
       console.error(
-          'LanguageSwitching is a singleton, can only call |init| once');
+          'LocaleOutputHelper is a singleton, can only call |init| once');
       return;
     }
 
-    LanguageSwitching.instance_ = new LanguageSwitching();
+    LocaleOutputHelper.instance_ = new LocaleOutputHelper();
   }
 
   /**
-   * @return {!LanguageSwitching}
+   * @return {!LocaleOutputHelper}
    */
   static get instance() {
-    if (!LanguageSwitching.instance_) {
-      LanguageSwitching.init();
+    if (!LocaleOutputHelper.instance_) {
+      LocaleOutputHelper.init();
     }
-    return LanguageSwitching.instance_;
+    return LocaleOutputHelper.instance_;
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/language_switching_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js
similarity index 75%
rename from chrome/browser/resources/chromeos/accessibility/chromevox/background/language_switching_test.js
rename to chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js
index 51c64f89..390135f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/language_switching_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper_test.js
@@ -7,9 +7,9 @@
 GEN_INCLUDE(['../testing/mock_feedback.js']);
 
 /**
- * Test fixture for ChromeVox LanguageSwitching.
+ * Test fixture for LocaleOutputHelper.
  */
-ChromeVoxLanguageSwitchingTest = class extends ChromeVoxNextE2ETest {
+ChromeVoxLocaleOutputHelperTest = class extends ChromeVoxNextE2ETest {
   /** @override */
   testGenCppIncludes() {
     GEN(`
@@ -87,11 +87,11 @@
 
   /**
    * Calls mock version of chrome.tts.getVoices() to populate
-   * LanguageSwitching's available voice list with a specific set of voices.
+   * LocaleOutputHelper's available voice list with a specific set of voices.
    */
   setAvailableVoices() {
     chrome.tts.getVoices(function(voices) {
-      LanguageSwitching.instance.availableVoices_ = voices;
+      LocaleOutputHelper.instance.availableVoices_ = voices;
     });
   }
 
@@ -203,7 +203,7 @@
 
 
 // Overview:
-// The naming scheme of the language switching tests is as follows:
+// The naming scheme of ChromeVoxLocaleOutputHelperTests tests is as follows:
 // <switching_behavior>_<test_document>_Test.
 // <switching_behavior>: Whether the test is testing node-level or
 // sub-node-level switching. <test_document>: The name of the document the test
@@ -212,206 +212,206 @@
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_MultipleLanguagesLabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.multipleLanguagesLabeledDoc, function() {
         // Turn on language switching.
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage('es', 'español: Hola.');
+            .expectSpeechWithLocale('es', 'español: Hola.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('en', 'English: Hello.');
+            .expectSpeechWithLocale('en', 'English: Hello.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('fr', 'français: Salut.');
+            .expectSpeechWithLocale('fr', 'français: Salut.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('it', 'italiano: Ciao amico.');
+            .expectSpeechWithLocale('it', 'italiano: Ciao amico.');
         mockFeedback.replay();
       });
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_MultipleLanguagesLabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.multipleLanguagesLabeledDoc, function() {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
         // Disable sub-node-level switching.
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage('es', 'español: Hola.');
+            .expectSpeechWithLocale('es', 'español: Hola.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('en', 'English: Hello.');
+            .expectSpeechWithLocale('en', 'English: Hello.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('fr', 'français: Salut.');
+            .expectSpeechWithLocale('fr', 'français: Salut.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('it', 'italiano: Ciao amico.');
+            .expectSpeechWithLocale('it', 'italiano: Ciao amico.');
         mockFeedback.replay();
       });
     });
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_NestedLanguagesLabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.nestedLanguagesLabeledDoc, function() {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         // We should be able to switch languages when each component is labeled
         // with a language.
         mockFeedback
             .call(doCmd('jumpToTop'))
-            // LanguageSwitching.instance_.currentLanguage_ is initialized to
+            // LocaleOutputHelper.instance_.currentLanguage_ is initialized to
             // 'en'. Do not prepend 'English' because language does not switch.
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'In the morning, I sometimes eat breakfast.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'fr', 'français: Dans l\'apres-midi, je dejeune.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'English: Hello it\'s a pleasure to meet you. ');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('fr', 'français: Comment ca va?');
+            .expectSpeechWithLocale('fr', 'français: Comment ca va?');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'English: Switching back to English. ');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('es', 'español: Hola.');
+            .expectSpeechWithLocale('es', 'español: Hola.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('en', 'English: Goodbye.');
+            .expectSpeechWithLocale('en', 'English: Goodbye.');
         mockFeedback.replay();
       });
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_NestedLanguagesLabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.nestedLanguagesLabeledDoc, function() {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
         // Disable sub-node-switching.
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'In the morning, I sometimes eat breakfast.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'fr', 'français: Dans l\'apres-midi, je dejeune.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'English: Hello it\'s a pleasure to meet you. ');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('fr', 'français: Comment ca va?');
+            .expectSpeechWithLocale('fr', 'français: Comment ca va?');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'English: Switching back to English. ');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('es', 'español: Hola.');
+            .expectSpeechWithLocale('es', 'español: Hola.');
         mockFeedback.call(doCmd('nextLine'))
-            .expectSpeechWithLanguage('en', 'English: Goodbye.');
+            .expectSpeechWithLocale('en', 'English: Goodbye.');
         mockFeedback.replay();
       });
     });
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_ButtonAndLinkDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.buttonAndLinkDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         mockFeedback
             .call(doCmd('jumpToTop'))
             // Sub-node language detection is able to label this as 'en' and
             // overwrite the author-provided language of 'es'.
-            // LanguageSwitching.instance_.currentLanguage_ is initialized to
+            // LocaleOutputHelper.instance_.currentLanguage_ is initialized to
             // 'en'. Do not prepend 'English' because language does not switch.
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'This is a paragraph, written in English.')
             .call(doCmd('nextObject'))
             // CLD3 is able to determine, with high confidence, that this is
             // English text.
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'This is a button, written in English.')
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 undefined, 'Button', 'Press Search+Space to activate')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage('es', 'español: Este es un enlace.')
-            .expectSpeechWithLanguage(undefined, 'Link');
+            .expectSpeechWithLocale('es', 'español: Este es un enlace.')
+            .expectSpeechWithLocale(undefined, 'Link');
         mockFeedback.replay();
       });
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_ButtonAndLinkDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.buttonAndLinkDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
         // Disable sub-node-switching.
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         mockFeedback
             .call(doCmd('jumpToTop'))
             // Sub-node language detection is disabled, so we are not able to
             // detect + switch to English on any of these nodes. Instead, we use
             // the author-provided language of 'es'.
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'es', 'español: This is a paragraph, written in English.')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'es', 'This is a button, written in English.')
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 undefined, 'Button', 'Press Search+Space to activate')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage('es', 'Este es un enlace.')
-            .expectSpeechWithLanguage(undefined, 'Link');
+            .expectSpeechWithLocale('es', 'Este es un enlace.')
+            .expectSpeechWithLocale(undefined, 'Link');
         mockFeedback.replay();
       });
     });
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_JapaneseAndEnglishUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(
           this.japaneseAndEnglishUnlabeledDoc, function(root) {
             localStorage['languageSwitching'] = 'true';
             this.setAvailableVoices();
-            LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+            LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
             // We are able to separate out English and Japanese because they use
             // different scripts.
             mockFeedback
                 .call(doCmd('jumpToTop'))
-                // LanguageSwitching.instance_.currentLanguage_ is initialized
+                // LocaleOutputHelper.instance_.currentLanguage_ is initialized
                 // to 'en'. Do not prepend 'English' because language does not
                 // switch.
-                .expectSpeechWithLanguage('en', 'Hello, my name is ')
-                .expectSpeechWithLanguage('ja', '日本語: 太田あきひろ. ')
+                .expectSpeechWithLocale('en', 'Hello, my name is ')
+                .expectSpeechWithLocale('ja', '日本語: 太田あきひろ. ')
                 // Expect 'en-us' because sub-node language of 'en' doesn't come
                 // with high enough probability. We fall back on node-level
                 // detected language, which is 'en-us'.
-                .expectSpeechWithLanguage(
+                .expectSpeechWithLocale(
                     'en-us',
                     'English (United States): It\'s a pleasure to meet you. ')
-                .expectSpeechWithLanguage(
+                .expectSpeechWithLocale(
                     'ja', '日本語: どうぞよろしくお願いします.');
             mockFeedback.replay();
           });
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_JapaneseAndEnglishUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(
@@ -419,7 +419,7 @@
             localStorage['languageSwitching'] = 'true';
             this.setAvailableVoices();
             // Disable sub-node-switching.
-            LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+            LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
             mockFeedback
                 .call(doCmd('jumpToTop'))
                 // Expect the node's contents to be read in one language
@@ -428,7 +428,7 @@
                 // the one in this test, we are falling back on the UI language
                 // of the browser, which is en-US. Please see testGenPreamble
                 // for more details.
-                .expectSpeechWithLanguage(
+                .expectSpeechWithLocale(
                     'en-us',
                     'Hello, my name is 太田あきひろ. It\'s a pleasure to meet' +
                         ' you. どうぞよろしくお願いします.');
@@ -438,41 +438,41 @@
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_EnglishAndKoreanUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.englishAndKoreanUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         // We are able to separate out English and Korean because they use
         // different scripts.
         mockFeedback
             .call(doCmd('jumpToTop'))
-            // LanguageSwitching.instance_.currentLanguage_ is initialized to
+            // LocaleOutputHelper.instance_.currentLanguage_ is initialized to
             // 'en'. Do not prepend 'English' because language does not switch.
-            .expectSpeechWithLanguage('en', 'This text is written in English. ')
-            .expectSpeechWithLanguage('ko', '한국어: 차에 한하여 중임할 수. ')
+            .expectSpeechWithLocale('en', 'This text is written in English. ')
+            .expectSpeechWithLocale('ko', '한국어: 차에 한하여 중임할 수. ')
             // Expect 'en-us' because sub-node language of 'en' doesn't come
             // with high enough probability. We fall back on node-level detected
             // language, which is 'en-us'.
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en', 'English: This text is also written in English.');
         mockFeedback.replay();
       });
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_EnglishAndKoreanUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.englishAndKoreanUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
         // Disable sub-node-switching
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en-us',
                 'This text is written in English. 차에 한하여 중임할 수.' +
                     ' This text is also written in English.');
@@ -482,19 +482,19 @@
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_EnglishAndFrenchUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.englishAndFrenchUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         // Unable to separate out English and French when unlabeled.
         mockFeedback
             .call(doCmd('jumpToTop'))
-            // LanguageSwitching.instance_.currentLanguage_ is initialized to
+            // LocaleOutputHelper.instance_.currentLanguage_ is initialized to
             // 'en'. Do not prepend 'English' because language does not switch.
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en',
                 'This entire object should be read in English, even' +
                     ' the following French passage: salut mon ami! Ca va? Bien, et toi? It\'s hard to' +
@@ -504,15 +504,15 @@
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_EnglishAndFrenchUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.englishAndFrenchUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en',
                 'This entire object should be read in English, even' +
                     ' the following French passage: salut mon ami! Ca va? Bien, et toi? It\'s hard to' +
@@ -523,51 +523,51 @@
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_JapaneseCharacterUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(
           this.japaneseCharacterUnlabeledDoc, function(root) {
             localStorage['languageSwitching'] = 'true';
             this.setAvailableVoices();
-            LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+            LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
             // We are able to detect and switch at the character level if the
             // character is unique to a certain script. In this case, 'ど' only
             // appears in Japanese, and therefore we can confidently switch
             // languages.
             mockFeedback.call(doCmd('jumpToTop'))
-                .expectSpeechWithLanguage('ja', '日本語: ど');
+                .expectSpeechWithLocale('ja', '日本語: ど');
             mockFeedback.replay();
           });
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_JapaneseCharacterUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(
           this.japaneseCharacterUnlabeledDoc, function(root) {
             localStorage['languageSwitching'] = 'true';
             this.setAvailableVoices();
-            LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+            LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
             mockFeedback.call(doCmd('jumpToTop'))
-                .expectSpeechWithLanguage('en-us', 'ど');
+                .expectSpeechWithLocale('en-us', 'ど');
             mockFeedback.replay();
           });
     });
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_JapaneseAndChineseUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.japaneseAndChineseUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         // Unable to separate out Japanese and Chinese if unlabeled.
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'ja',
                 '日本語: 天気はいいですね. 右万諭全中結社原済権人点掲年難出面者会追');
         mockFeedback.replay();
@@ -575,15 +575,15 @@
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_JapaneseAndChineseUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.japaneseAndChineseUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'en-us',
                 '天気はいいですね. 右万諭全中結社原済権人点掲年難出面者会追');
         mockFeedback.replay();
@@ -591,7 +591,7 @@
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_JapaneseAndChineseLabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       // Only difference between doc used in this test and
@@ -606,9 +606,9 @@
           function(root) {
             localStorage['languageSwitching'] = 'true';
             this.setAvailableVoices();
-            LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+            LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
             mockFeedback.call(doCmd('jumpToTop'))
-                .expectSpeechWithLanguage(
+                .expectSpeechWithLocale(
                     'zh',
                     '中文: 天気はいいですね. 右万諭全中結社原済権人点掲年難出面者会追');
             mockFeedback.replay();
@@ -617,16 +617,16 @@
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_JapaneseAndKoreanUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.japaneseAndKoreanUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         // Unable to separate out Japanese and Korean if unlabeled.
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'ko',
                 '한국어: 私は. 법률이 정하는 바에 의하여 대법관이 아닌 법관을 둘 수 있다');
         mockFeedback.replay();
@@ -634,17 +634,17 @@
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_JapaneseAndKoreanUnlabeledDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.japaneseAndKoreanUnlabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = false;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = false;
         // Node-level language detection runs and assigns language of 'ko' to
         // the node.
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'ko',
                 '한국어: 私は. 법률이 정하는 바에 의하여 대법관이 아닌 법관을 둘 수' +
                     ' 있다');
@@ -654,17 +654,17 @@
 
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'SubNodeLevelSwitching_AsturianAndJapaneseDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.asturianAndJapaneseDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance.subNodeSwitchingEnabled_ = true;
+        LocaleOutputHelper.instance.subNodeSwitchingEnabled_ = true;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage('ja', '日本語: ど')
+            .expectSpeechWithLocale('ja', '日本語: ど')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'ast',
                 'asturianu: Pretend that this text is Asturian. Testing' +
                     ' three-letter language code logic.');
@@ -673,17 +673,17 @@
     });
 
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest',
+    'ChromeVoxLocaleOutputHelperTest',
     'NodeLevelSwitching_AsturianAndJapaneseDoc_Test', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.asturianAndJapaneseDoc, function(root) {
         localStorage['languageSwitching'] = 'true';
         this.setAvailableVoices();
-        LanguageSwitching.instance_.sub_node_level_switching_enabled_ = false;
+        LocaleOutputHelper.instance_.sub_node_level_switching_enabled_ = false;
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage('ja', '日本語: ど')
+            .expectSpeechWithLocale('ja', '日本語: ど')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage(
+            .expectSpeechWithLocale(
                 'ast',
                 'asturianu: Pretend that this text is Asturian. Testing' +
                     ' three-letter language code logic.');
@@ -695,55 +695,58 @@
 // This does not need partner tests because no language switching behavior is
 // tested.
 TEST_F(
-    'ChromeVoxLanguageSwitchingTest', 'LanguageSwitchingOffTest', function() {
+    'ChromeVoxLocaleOutputHelperTest', 'LocaleOutputHelperOffTest', function() {
       const mockFeedback = this.createMockFeedback();
       this.runWithLoadedTree(this.multipleLanguagesLabeledDoc, function(root) {
         localStorage['languageSwitching'] = 'false';
         this.setAvailableVoices();
         // Language should not be set if the language switching feature is off.
         mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(undefined, 'Hola.')
+            .expectSpeechWithLocale(undefined, 'Hola.')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage(undefined, 'Hello.')
+            .expectSpeechWithLocale(undefined, 'Hello.')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage(undefined, 'Salut.')
+            .expectSpeechWithLocale(undefined, 'Salut.')
             .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage(undefined, 'Ciao amico.');
+            .expectSpeechWithLocale(undefined, 'Ciao amico.');
         mockFeedback.replay();
       });
     });
 
-TEST_F('ChromeVoxLanguageSwitchingTest', 'DefaultToUILanguageTest', function() {
-  const mockFeedback = this.createMockFeedback();
-  this.runWithLoadedTree(
-      this.japaneseAndInvalidLanguagesLabeledDoc, function(root) {
-        localStorage['languageSwitching'] = 'true';
-        this.setAvailableVoices();
-        LanguageSwitching.instance_.sub_node_level_switching_enabled_ = false;
-        // Default to browser UI language, 'en-us', instead of defaulting to the
-        // language we last switched to.
-        mockFeedback.call(doCmd('jumpToTop'))
-            .expectSpeechWithLanguage(
-                'ja', '日本語: どうぞよろしくお願いします')
-            .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage('en-us', 'English (United States): Test')
-            .call(doCmd('nextObject'))
-            .expectSpeechWithLanguage('en-us', 'Yikes');
-        mockFeedback.replay();
-      });
-});
+TEST_F(
+    'ChromeVoxLocaleOutputHelperTest', 'DefaultToUILanguageTest', function() {
+      const mockFeedback = this.createMockFeedback();
+      this.runWithLoadedTree(
+          this.japaneseAndInvalidLanguagesLabeledDoc, function(root) {
+            localStorage['languageSwitching'] = 'true';
+            this.setAvailableVoices();
+            LocaleOutputHelper.instance_.sub_node_level_switching_enabled_ =
+                false;
+            // Default to browser UI language, 'en-us', instead of defaulting to
+            // the language we last switched to.
+            mockFeedback.call(doCmd('jumpToTop'))
+                .expectSpeechWithLocale(
+                    'ja', '日本語: どうぞよろしくお願いします')
+                .call(doCmd('nextObject'))
+                .expectSpeechWithLocale(
+                    'en-us', 'English (United States): Test')
+                .call(doCmd('nextObject'))
+                .expectSpeechWithLocale('en-us', 'Yikes');
+            mockFeedback.replay();
+          });
+    });
 
-TEST_F('ChromeVoxLanguageSwitchingTest', 'NoAvailableVoicesTest', function() {
+TEST_F('ChromeVoxLocaleOutputHelperTest', 'NoAvailableVoicesTest', function() {
   const mockFeedback = this.createMockFeedback();
   this.runWithLoadedTree(this.vietnameseAndUrduLabeledDoc, function(root) {
     localStorage['languageSwitching'] = 'true';
     this.setAvailableVoices();
-    LanguageSwitching.instance_.sub_node_level_switching_enabled_ = false;
+    LocaleOutputHelper.instance_.sub_node_level_switching_enabled_ = false;
     mockFeedback.call(doCmd('jumpToTop'))
-        .expectSpeechWithLanguage(
+        .expectSpeechWithLocale(
             'en-us', 'No voice available for language: Vietnamese')
         .call(doCmd('nextObject'))
-        .expectSpeechWithLanguage(
+        .expectSpeechWithLocale(
             'en-us', 'No voice available for language: Urdu');
     mockFeedback.replay();
   });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js
index 5857d75..e71cc22 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js
@@ -27,7 +27,7 @@
 goog.require('ValueSelectionSpan');
 goog.require('ValueSpan');
 goog.require('goog.i18n.MessageFormat');
-goog.require('LanguageSwitching');
+goog.require('LocaleOutputHelper');
 goog.require('UserAnnotationHandler');
 
 goog.scope(function() {
@@ -767,7 +767,7 @@
                 buff[buff.length - 1].setSpan(speechProps, 0, 0);
               }
             };
-            LanguageSwitching.instance.assignLocalesAndAppend(
+            LocaleOutputHelper.instance.assignLocalesAndAppend(
                 node, 'name', appendStringWithLocale.bind(this, buff, options));
           } else {
             const nameOrAnnotation =
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table.js b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table.js
index af9ce2b..eb906b7 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table.js
@@ -115,7 +115,9 @@
  * @return {string} Localized display name.
  */
 BrailleTable.getDisplayName = function(table) {
-  const localeName = Msgs.getLocaleDisplayName(table.locale);
+  const localeName = chrome.accessibilityPrivate.getDisplayNameForLocale(
+      table.locale /* locale to be displayed */,
+      chrome.i18n.getUILanguage().toLowerCase() /* locale to localize into */);
   if (!table.grade && !table.variant) {
     return localeName;
   } else if (table.grade && !table.variant) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table_test.js
index 91f82975..cf9ae4191 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/braille/braille_table_test.js
@@ -42,6 +42,9 @@
     expectEquals('Arabic, Grade 1', BrailleTable.getDisplayName(table));
     table = BrailleTable.forId(tables, 'en-UEB-g1');
     expectEquals('English (UEB), Grade 1', BrailleTable.getDisplayName(table));
+    table = BrailleTable.forId(tables, 'en-US-g2');
+    expectEquals(
+        'English (United States), Grade 2', BrailleTable.getDisplayName(table));
   }));
 });
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/msgs.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/msgs.js
index 6b8e3a5c..873cde2 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/msgs.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/msgs.js
@@ -79,27 +79,6 @@
   }
 
   /**
-   * Gets a localized display name for a locale.
-   * NOTE: Only a subset of locale identifiers are supported.  See the
-   * |CHROMEVOX_LOCALE_DICT| message.
-   * @param {string} locale On the form |ll| or |ll_CC|, where |ll| is
-   *     the language code and |CC| the country code.
-   * @return {string} The display name.
-   */
-  static getLocaleDisplayName(locale) {
-    if (!Msgs.localeNameDict_) {
-      Msgs.localeNameDict_ =
-          /** @type {!Object<string>} */ (
-              JSON.parse(Msgs.getMsg('locale_dict')));
-    }
-    const name = Msgs.localeNameDict_[locale];
-    if (!name) {
-      throw Error('Unsupported locale identifier: ' + locale);
-    }
-    return name;
-  }
-
-  /**
    * Applies substitions of the form $N, where N is a number from 1 to 9, to a
    * string. The numbers are one-based indices into |opt_subs|.
    * @param {string} message
@@ -126,14 +105,6 @@
 Msgs.NAMESPACE_ = 'chromevox_';
 
 /**
- * Dictionary of locale names.
- * @type {Object<string>}
- * @private
- */
-Msgs.localeNameDict_ = null;
-
-
-/**
  * Strings that are displayed in the user interface but don't need
  * be translated.
  * @type {Object<string>}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.css b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.css
index c033138..345b91cd 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.css
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.css
@@ -32,8 +32,8 @@
 button:disabled,
 .menu-item.disabled,
 .menu-bar-item.disabled {
-  background-color: grey;
-  color: white;
+  background-color: rgb(60, 64, 67);
+  color: rgb(207, 216, 220);
 }
 
 #menus_button {
@@ -230,7 +230,7 @@
 
 .menu-bar-item.active {
   background-color: rgb(246, 145, 57);
-  color: #fff;
+  color: black;
 }
 
 .menu-container {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
index 199888c6..18b7ffd 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback.js
@@ -220,7 +220,7 @@
    * @param {...(string)} rest One or more utterances to add as expectations.
    * @return {MockFeedback} |this| for chaining
    */
-  expectSpeechWithLanguage(language, ...rest) {
+  expectSpeechWithLocale(language, ...rest) {
     return this.expectSpeechWithProperties.apply(
         this, [{lang: language}].concat(rest));
   }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js
index 23d5773..d994389 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/testing/mock_feedback_test.js
@@ -221,23 +221,23 @@
         speak('This is English', {lang: 'en'});
         speak('This is also English', {lang: 'en'});
       })
-      .expectSpeechWithLanguage('en', 'This is English', 'This is also English')
+      .expectSpeechWithLocale('en', 'This is English', 'This is also English')
       .call(function() {
         speak('Expect French', {lang: 'fr'});
       })
-      .expectSpeechWithLanguage('fr', 'Expect French')
+      .expectSpeechWithLocale('fr', 'Expect French')
       .call(function() {
         speak('Expect Canadian French', {lang: 'fr-ca'});
       })
-      .expectSpeechWithLanguage('fr-ca', 'Expect Canadian French')
+      .expectSpeechWithLocale('fr-ca', 'Expect Canadian French')
       .call(function() {
         speak('Expect empty language', {lang: ''});
       })
-      .expectSpeechWithLanguage('', 'Expect empty language')
+      .expectSpeechWithLocale('', 'Expect empty language')
       .call(function() {
         speak('Expect no language');
       })
-      .expectSpeechWithLanguage(undefined, 'Expect no language')
+      .expectSpeechWithLocale(undefined, 'Expect no language')
       .replay();
   assertTrue(finishCalled);
 });
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_te.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_te.xtb
index e3186a6..c60948e 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_te.xtb
@@ -1139,6 +1139,7 @@
 <translation id="8065607967589909823">ఎంచుకున్నది</translation>
 <translation id="8066678206530322333">బ్యానర్</translation>
 <translation id="8076492880354921740">ట్యాబ్‌లు</translation>
+<translation id="8083115023881784332">ChromeVox ప్రస్తుతం దేనిపైనా దృష్టి కేంద్రీకరించడం లేదు. లాంచర్‌కు వెళ్లడానికి Alt+Shift+L నొక్కండి.</translation>
 <translation id="8091452896542422286">ఖాళీ</translation>
 <translation id="8096975275316362544">పుదీనా మీగడ రంగు</translation>
 <translation id="8098587210054821856">మేఘవర్ణ బూడిద రంగు</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
index fc9394d4..853ea0e 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
+++ b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
@@ -2482,91 +2482,6 @@
   <message desc="Brailled to describe an access key. An access key consists of a single letter. When pressed along with a modifier (usually alt, but depends on platform), a targetted node will be activated. When translating, stick to lower case." name="IDS_CHROMEVOX_ACCESS_KEY_BRL">
     access key:<ph name="key">$1</ph>
   </message>
-  <message desc="A dictionary mapping locale identifiers to their corresponding language names. The format is the following: { ..., 'en_US': 'English (United States)', ...}. Translation only needed for the language and country names (e.g. English (United States)). All other strings must be kept as is." name="IDS_CHROMEVOX_LOCALE_DICT">
-    {"ar": "Arabic",
-    "as": "Assamese",
-    "aw": "Awadhi",
-    "be": "Bengali",
-    "bg": "Bulgarian",
-    "bh": "Bihari",
-    "bo": "Tibetan",
-    "br": "Braj",
-    "ca": "Catalan",
-    "ckb": "Sorani",
-    "cs": "Czech",
-    "cy": "Welsh",
-    "da": "Danish",
-    "de": "German",
-    "de_CH": "German (Switzerland)",
-    "de_DE": "German (Germany)",
-    "dra": "Dravidian",
-    "el": "Greek",
-    "en": "English",
-    "en_CA": "English (Canada)",
-    "en_GB": "English (United Kingdom)",
-    "en_US": "English (United States)",
-    "eo": "Esperanto",
-    "es": "Spanish",
-    "et": "Estonian",
-    "fa": "Persian",
-    "fr": "French",
-    "fr_CA": "French (Canada)",
-    "fr_FR": "French (France)",
-    "fi": "Finnish",
-    "ga": "Irish",
-    "gd": "Gaelic",
-    "gon": "Gondi",
-    "gu": "Gujarati",
-    "he": "Hebrew",
-    "hi": "Hindi",
-    "hr": "Croatian",
-    "hu": "Hungarian",
-    "hy": "Armenian",
-    "is": "Icelandic",
-    "it": "Italian",
-    "iu": "Inuktitut",
-    "ka": "Kannada",
-    "kh": "Khasi",
-    "ko": "Korean",
-    "kok": "Konkani",
-    "kru": "Kurukh",
-    "ks": "Kashmiri",
-    "lt": "Lithuanian",
-    "lv": "Latvian",
-    "mao": "Maori",
-    "ml": "Malayalam",
-    "mt": "Maltese",
-    "mwr": "Marwari",
-    "mn": "Mongolian",
-    "mun": "Munda",
-    "nb": "Norwegian Bokmål",
-    "ne": "Nepali",
-    "nl": "Dutch",
-    "no": "Norwegian",
-    "or": "Oriya",
-    "pi": "Pali",
-    "pl": "Polish",
-    "pt": "Portuguese",
-    "pu": "Punjabi",
-    "ro": "Romanian",
-    "ru": "Russian",
-    "sa": "Sanskrit",
-    "si": "Sindhi",
-    "sin": "Sinhala",
-    "sk": "Slovak",
-    "sl": "Slovenian",
-    "sr": "Serbian",
-    "sv": "Swedish",
-    "ta": "Tamil",
-    "te": "Telugu",
-    "tr": "Turkish",
-    "tsn": "Afrikaans",
-    "uk": "Ukrainian",
-    "ur": "Urdu",
-    "vi": "Vietnamese",
-    "zh": "Chinese",
-    "zh_TW": "Chinese (Traditional Han)"}
-  </message>
   <message desc="The text to speak when the user moves their cursor to the end of a block of editable text, in verbose mode." name="IDS_CHROMEVOX_END_OF_TEXT_VERBOSE">
     End of text
   </message>
diff --git a/chrome/browser/resources/chromeos/camera/.eslintrc.js b/chrome/browser/resources/chromeos/camera/.eslintrc.js
index 63ab819f..2ab2c979 100644
--- a/chrome/browser/resources/chromeos/camera/.eslintrc.js
+++ b/chrome/browser/resources/chromeos/camera/.eslintrc.js
@@ -376,6 +376,7 @@
     // BigInt64Array as a defined type.
     'BigInt64Array': 'readable',
     'chromeosCamera': 'readable',
+    'blink': 'readable',
     'cca': 'readable',  // TODO(inker): remove this after resolving b/141518780.
     'cros': 'readable',
     'webkitRequestFileSystem': 'readable',
diff --git a/chrome/browser/resources/chromeos/camera/BUILD.gn b/chrome/browser/resources/chromeos/camera/BUILD.gn
index 9c8949e..85225e02 100644
--- a/chrome/browser/resources/chromeos/camera/BUILD.gn
+++ b/chrome/browser/resources/chromeos/camera/BUILD.gn
@@ -229,6 +229,8 @@
     "$root_gen_dir/media/capture/video/chromeos/mojom/camera_metadata.mojom-lite.js",
     "$root_gen_dir/media/capture/video/chromeos/mojom/camera_metadata_tags.mojom-lite.js",
     "$root_gen_dir/mojo/public/js/mojo_bindings_lite.js",
+    "$root_gen_dir/mojo/public/mojom/base/time.mojom-lite.js",
+    "$root_gen_dir/third_party/blink/public/mojom/idle/idle_manager.mojom-lite.js",
     "$root_gen_dir/ui/gfx/geometry/mojom/geometry.mojom-lite.js",
     "$root_gen_dir/ui/gfx/range/mojom/range.mojom-lite.js",
   ]
@@ -240,6 +242,7 @@
     "//media/capture/mojom:image_capture_js",
     "//media/capture/video/chromeos/mojom:cros_camera_js",
     "//mojo/public/js:bindings_lite",
+    "//third_party/blink/public/mojom:mojom_platform_js",
     "//ui/gfx/geometry/mojom:mojom_js",
     "//ui/gfx/range/mojom:mojom_js",
   ]
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/BUILD.gn b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/BUILD.gn
index e513bb017..909b9b4 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/BUILD.gn
+++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/BUILD.gn
@@ -9,7 +9,10 @@
 }
 
 js_library("browser_proxy") {
-  deps = [ "..:chrome_util" ]
+  deps = [
+    "..:chrome_util",
+    "../mojo:chrome_helper",
+  ]
   sources = [
     "browser_proxy.js",
     "browser_proxy_interface.js",
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js
index b432b4185..8ede591 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js
@@ -76,13 +76,6 @@
   }
 
   /** @override */
-  addOnLockChangeListener(callback) {
-    chrome.idle.onStateChanged.addListener((newState) => {
-      callback(newState === 'locked');
-    });
-  }
-
-  /** @override */
   isCrashReportingEnabled() {
     return util.promisify(chrome.metricsPrivate.getIsCrashReportingEnabled)();
   }
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js
index 8de3c117..46ab90a3 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js
@@ -68,12 +68,6 @@
   getI18nMessage(name, substitutions = undefined) {}
 
   /**
-   * @param {function(boolean)} callback
-   * @abstract
-   */
-  addOnLockChangeListener(callback) {}
-
-  /**
    * @return {!Promise<boolean>}
    * @abstract
    */
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js
index 000d7cf..c5bfbd14 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js
@@ -95,11 +95,6 @@
   }
 
   /** @override */
-  addOnLockChangeListener(callback) {
-    NOTIMPLEMENTED();
-  }
-
-  /** @override */
   async isCrashReportingEnabled() {
     NOTIMPLEMENTED();
     return false;
diff --git a/chrome/browser/resources/chromeos/camera/src/js/mojo/BUILD.gn b/chrome/browser/resources/chromeos/camera/src/js/mojo/BUILD.gn
index 6526457..b1bdcd32 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/mojo/BUILD.gn
+++ b/chrome/browser/resources/chromeos/camera/src/js/mojo/BUILD.gn
@@ -16,6 +16,7 @@
   deps = [
     "//components/arc/mojom:camera_intent_js_library_for_compile",
     "//components/chromeos_camera/common:camera_app_helper_js_library_for_compile",
+    "//third_party/blink/public/mojom:mojom_platform_js_library_for_compile",
   ]
   externs_list = [ "$externs_path/pending.js" ]
 }
diff --git a/chrome/browser/resources/chromeos/camera/src/js/mojo/chrome_helper.js b/chrome/browser/resources/chromeos/camera/src/js/mojo/chrome_helper.js
index 2654e97..c7cf9dc9 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/mojo/chrome_helper.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/mojo/chrome_helper.js
@@ -125,6 +125,25 @@
   }
 
   /**
+   * Adds listener for screen locked event.
+   * @param {function(boolean)} callback Callback for screen locked status
+   *     changed. Called with the latest status of whether screen is locked.
+   */
+  async addOnLockListener(callback) {
+    const monitorCallbackRouter = new blink.mojom.IdleMonitorCallbackRouter();
+    monitorCallbackRouter.update.addListener((newState) => {
+      callback(newState.screen === blink.mojom.ScreenIdleState.kLocked);
+    });
+
+    const idleManager = blink.mojom.IdleManager.getRemote();
+    // Set a large threshold since we don't care about user idle.
+    const threshold = {microseconds: 86400000000};
+    const {state} = await idleManager.addMonitor(
+        threshold, monitorCallbackRouter.$.bindNewPipeAndPassRemote());
+    callback(state.screen === blink.mojom.ScreenIdleState.kLocked);
+  }
+
+  /**
    * Creates a new instance of ChromeHelper if it is not set. Returns the
    *     exist instance.
    * @return {!ChromeHelper} The singleton instance.
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
index 5904ae13..4ccf0f0c 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
@@ -181,7 +181,7 @@
         .forEach((btn) => btn.addEventListener('click', () => this.endTake_()));
 
     // Monitor the states to stop camera when locked/minimized.
-    browserProxy.addOnLockChangeListener((isLocked) => {
+    ChromeHelper.getInstance().addOnLockListener((isLocked) => {
       this.locked_ = isLocked;
       if (this.locked_) {
         this.start();
diff --git a/chrome/browser/resources/chromeos/camera/src/manifest.json b/chrome/browser/resources/chromeos/camera/src/manifest.json
index d356c357..df1eef1 100644
--- a/chrome/browser/resources/chromeos/camera/src/manifest.json
+++ b/chrome/browser/resources/chromeos/camera/src/manifest.json
@@ -15,7 +15,6 @@
     "audioCapture",
     "storage",
     "unlimitedStorage",
-    "idle",
     "chromeosInfoPrivate",
     "metricsPrivate",
     "fileManagerPrivate",
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_de.xtb b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_de.xtb
index 29416ca..638491f 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings_de.xtb
@@ -31,7 +31,7 @@
 <translation id="3810838688059735925">Videos</translation>
 <translation id="4279490309300973883">Spiegelung</translation>
 <translation id="4329152592498422850">Zum Modus für quadratische Fotos wechseln</translation>
-<translation id="4383571725254449280">Protokolle der Druckleistung</translation>
+<translation id="4383571725254449280">Druckleistungsprotokolle drucken</translation>
 <translation id="4445542136948522167">Fotoaufnahme beenden</translation>
 <translation id="4497569853498380347">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" />) <ph name="MEGAPIXEL" /> Megapixel</translation>
 <translation id="4570032796877367747">Frontkamera</translation>
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html
index 7664f5e..144ab48 100644
--- a/chrome/browser/resources/chromeos/camera/src/views/main.html
+++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -11,6 +11,8 @@
     <link rel="stylesheet" href="../css/main.css">
     <script src="../js/lib/google-analytics-bundle.js"></script>
     <script src="../js/mojo/mojo_bindings_lite.js"></script>
+    <script src="../js/mojo/time.mojom-lite.js"></script>
+    <script src="../js/mojo/idle_manager.mojom-lite.js"></script>
     <script src="../js/mojo/camera_metadata_tags.mojom-lite.js"></script>
     <script src="../js/mojo/camera_metadata.mojom-lite.js"></script>
     <script src="../js/mojo/camera_common.mojom-lite.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/PRESUBMIT.py b/chrome/browser/resources/settings/chromeos/PRESUBMIT.py
new file mode 100644
index 0000000..4783a34
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/PRESUBMIT.py
@@ -0,0 +1,53 @@
+# Copyright 2020 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.
+"""Presubmit script for OS Settings."""
+
+import re
+
+
+def _CheckSemanticColors(input_api, output_api):
+    problems = []
+    for f in input_api.AffectedFiles():
+        exts = ['html', 'css']
+        if not any(f.LocalPath().endswith(ext) for ext in exts):
+            continue
+
+        paper_color_re = re.compile(r'--paper-\w+-\d+')
+        google_refresh_color_re = re.compile(r'--google-\w+-refresh-\d+')
+
+        for line_num, line in f.ChangedContents():
+            # Search for paper-colors.
+            if paper_color_re.search(line):
+                problems.append(line.strip())
+
+            # Search for google-refresh-colors.
+            if google_refresh_color_re.search(line):
+                problems.append(line.strip())
+
+    if not problems:
+        return []
+    return [
+        output_api.PresubmitPromptWarning(
+            'Please avoid using paper-colors and google-refresh-colors on ' +
+            'Chrome OS.\n' + 'Allowed colors are listed in ' +
+            'ui/webui/resources/css/cros_palette.json5.\n' +
+            'See https://crbug.com/1062154 or contact calamity@chromium.org ' +
+            'or ortuno@chromium.org for more information.',
+            items=problems)
+    ]
+
+
+def _CommonChecks(input_api, output_api):
+    """Checks common to both upload and commit."""
+    results = []
+    results.extend(_CheckSemanticColors(input_api, output_api))
+    return results
+
+
+def CheckChangeOnUpload(input_api, output_api):
+    return _CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+    return _CommonChecks(input_api, output_api)
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display_layout.html b/chrome/browser/resources/settings/chromeos/device_page/display_layout.html
index 6d75bc31..042f9af 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/display_layout.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/display_layout.html
@@ -22,8 +22,8 @@
          in getDivStyle_ and getMirrorDivStyle_ */
       .display {
         align-items: center;
-        background: var(--paper-grey-100);
-        color: var(--paper-grey-700);
+        background: var(--google-grey-100);
+        color: var(--google-grey-700);
         cursor: default;
         display: flex;
         font-size: 100%;
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.html b/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.html
index efc4bb44..652f12d9 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/display_overscan_dialog.html
@@ -16,7 +16,7 @@
      }
 
      .instructions {
-       color: var(--paper-grey-600);
+       color: var(--google-grey-600);
        margin-top: 4px;
      }
 
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage.html b/chrome/browser/resources/settings/chromeos/device_page/storage.html
index 0f61a87..b8c4a8f 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/storage.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/storage.html
@@ -141,7 +141,7 @@
       }
 
       button > iron-icon {
-        --iron-icon-fill-color: var(--paper-grey-400);
+        --iron-icon-fill-color: var(--google-grey-400);
         --iron-icon-height: 24px;
         --iron-icon-width: 24px;
       }
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
index 8627b55..2b0c1a71 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
@@ -160,6 +160,7 @@
     ":os_sync_browser_proxy",
     "..:metrics_recorder",
     "../../:router",
+    "../localized_link",
     "//ui/webui/resources/cr_elements/cr_toggle:cr_toggle",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:web_ui_listener_behavior",
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.html b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.html
index e949a6a..7f6dbe3b 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.html
@@ -44,7 +44,7 @@
       }
 
       paper-ripple {
-        color: var(--google-grey-refresh-700);
+        color: var(--google-grey-700);
       }
     </style>
 
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html
index 3738057..f95eafd 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.html
@@ -7,6 +7,7 @@
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="../../settings_shared_css.html">
+<link rel="import" href="../localized_link/localized_link.html">
 <link rel="import" href="../metrics_recorder.html">
 <link rel="import" href="../os_route.html">
 <link rel="import" href="os_sync_browser_proxy.html">
@@ -86,8 +87,11 @@
       </cr-button>
     </div>
 
-    <div id="featureLabel" class="settings-box" aria-hidden="true">
-      Chrome OS sync feature description PLACEHOLDER
+    <div id="featureLabel" class="settings-box">
+      <settings-localized-link class="secondary"
+          localized-string="$i18n{osSyncFeatureLabel}"
+          link-url="$i18n{browserSettingsSyncSetupUrl}">
+      </settings-localized-link>
     </div>
 
     <div class="settings-box">
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_dialog_elements.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_dialog_elements.html
index 1ab71e7..29036d9d 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_dialog_elements.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_add_printer_dialog_elements.html
@@ -12,7 +12,7 @@
     <style include="settings-shared">
       #dialog {
         /* Force a bottom border regardless of scroll state. */
-        --cr-dialog-body-border-bottom: 1px solid var(--paper-grey-300);
+        --cr-dialog-body-border-bottom: 1px solid var(--google-grey-300);
       }
       #dialog [slot=body] {
         padding-inline-end: 0;
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_shared_css.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_shared_css.html
index 59dc298..ce04ade 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_shared_css.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printer_shared_css.html
@@ -80,7 +80,7 @@
         background: none;
         border: none;
         box-sizing: border-box;
-        color: var(--paper-grey-800);
+        color: var(--google-grey-800);
         cursor: pointer;
         font: inherit;
         min-height: 32px;
@@ -90,7 +90,7 @@
       }
 
       .list-item:focus {
-        background-color: var(--paper-grey-300);
+        background-color: var(--google-grey-300);
         outline: none;
       }
 
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.html b/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.html
index 5277968f..b297915 100644
--- a/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.html
+++ b/chrome/browser/resources/settings/chromeos/personalization_page/change_picture.html
@@ -54,7 +54,7 @@
       }
 
       #authorCredit {
-        color: var(--paper-grey-500);
+        color: var(--google-grey-500);
         display: flex;
         flex-direction: column;
         margin-top: 20px;
diff --git a/chrome/browser/resources/settings/lazy_load.js b/chrome/browser/resources/settings/lazy_load.js
index 46e282f..122b696 100644
--- a/chrome/browser/resources/settings/lazy_load.js
+++ b/chrome/browser/resources/settings/lazy_load.js
@@ -17,21 +17,21 @@
 // import './privacy_page/security_page.m.js';
 // import './site_settings/all_sites.m.js';
 import './site_settings/site_data_details_subpage.m.js';
-// import 'site_settings_page/site_settings_page.m.js';
-// import 'site_settings/category_default_setting.m.js';
-// import 'site_settings/category_setting_exceptions.m.js';
-// import 'site_settings/chooser_exception_list.m.js';
-// import 'site_settings/media_picker.m.js';
-// import 'site_settings/pdf_documents.m.js';
-// import 'site_settings/protocol_handlers.m.js';
-// import 'site_settings/site_data.m.js';
-// import 'site_settings/site_details.m.js';
-// import 'site_settings/zoom_levels.m.js';
+// import './site_settings_page/site_settings_page.m.js';
+// import './site_settings/category_default_setting.m.js';
+// import './site_settings/category_setting_exceptions.m.js';
+// import './site_settings/chooser_exception_list.m.js';
+// import './site_settings/media_picker.m.js';
+// import './site_settings/pdf_documents.m.js';
+// import './site_settings/protocol_handlers.m.js';
+// import './site_settings/site_data.m.js';
+// import './site_settings/site_details.m.js';
+// import './site_settings/zoom_levels.m.js';
 
 // <if expr="not chromeos">
-// import 'people_page/manage_profile.m.js';
+import './people_page/manage_profile.m.js';
 // </if>
-// import 'people_page/sync_account_control.m.js';
+// import './people_page/sync_account_control.m.js';
 
 // <if expr="use_nss_certs">
 import 'chrome://resources/cr_components/certificate_manager/certificate_manager.m.js';
@@ -63,6 +63,7 @@
 import './search_engines_page/search_engine_dialog.m.js';
 import './search_engines_page/search_engine_entry.m.js';
 import './site_settings/site_list_entry.m.js';
+import './site_settings/site_list.m.js';
 
 // <if expr="_google_chrome and is_win">
 export {CHROME_CLEANUP_DEFAULT_ITEMS_TO_SHOW} from './chrome_cleanup_page/items_to_remove_list.m.js';
@@ -81,15 +82,18 @@
 export {DownloadsBrowserProxyImpl} from './downloads_page/downloads_browser_proxy.m.js';
 export {kMenuCloseDelay} from './languages_page/languages_page.m.js';
 export {LanguagesBrowserProxyImpl} from './languages_page/languages_browser_proxy.m.js';
-export {ChooserType,ContentSetting,ContentSettingsTypes,SiteSettingSource} from './site_settings/constants.m.js';
+export {ChooserType,ContentSetting,ContentSettingsTypes,SiteSettingSource,SITE_EXCEPTION_WILDCARD} from './site_settings/constants.m.js';
 export {cookieInfo} from './site_settings/cookie_info.m.js';
+export {kControlledByLookup} from './site_settings/site_settings_behavior.m.js';
 export {LocalDataBrowserProxyImpl} from './site_settings/local_data_browser_proxy.m.js';
 export {SiteSettingsPrefsBrowserProxyImpl} from './site_settings/site_settings_prefs_browser_proxy.m.js';
 
 // <if expr="not chromeos">
 export {SystemPageBrowserProxyImpl} from './system_page/system_page_browser_proxy.m.js';
+export {ProfileShortcutStatus, ManageProfileBrowserProxyImpl} from './people_page/manage_profile_browser_proxy.m.js';
 // </if>
 
 // <if expr="chromeos">
+export {AndroidInfoBrowserProxyImpl} from './site_settings/android_info_browser_proxy.m.js';
 export {BlockingRequestManager} from './autofill_page/blocking_request_manager.m.js';
 // </if>
diff --git a/chrome/browser/resources/settings/people_page/BUILD.gn b/chrome/browser/resources/settings/people_page/BUILD.gn
index 90d37f6..f547e89d 100644
--- a/chrome/browser/resources/settings/people_page/BUILD.gn
+++ b/chrome/browser/resources/settings/people_page/BUILD.gn
@@ -166,9 +166,6 @@
   is_polymer3 = true
   deps = [
     ":account_manager_browser_proxy.m",
-
-    #    ":manage_profile.m",
-    #    ":manage_profile_browser_proxy.m",
     ":people_page.m",
     ":profile_info_browser_proxy.m",
     ":signout_dialog.m",
@@ -184,6 +181,8 @@
     deps += [
       ":import_data_browser_proxy.m",
       ":import_data_dialog.m",
+      ":manage_profile.m",
+      ":manage_profile_browser_proxy.m",
     ]
   }
 }
@@ -214,22 +213,28 @@
     ]
     extra_deps = [ ":import_data_dialog_module" ]
   }
-}
 
-js_library("manage_profile.m") {
-  sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/manage_profile.m.js" ]
-  deps = [
-    # TODO: Fill those in.
-  ]
-  extra_deps = [ ":manage_profile_module" ]
-}
+  js_library("manage_profile.m") {
+    sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/manage_profile.m.js" ]
+    deps = [
+      ":manage_profile_browser_proxy.m",
+      ":sync_browser_proxy.m",
+      "..:i18n_setup.m",
+      "..:route.m",
+      "..:router.m",
+      "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    ]
+    extra_deps = [ ":manage_profile_module" ]
+  }
 
-js_library("manage_profile_browser_proxy.m") {
-  sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.m.js" ]
-  deps = [
-    # TODO: Fill those in.
-  ]
-  extra_deps = [ ":modulize" ]
+  js_library("manage_profile_browser_proxy.m") {
+    sources = [ "$root_gen_dir/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.m.js" ]
+    deps = [
+      "//ui/webui/resources/cr_elements/cr_profile_avatar_selector:cr_profile_avatar_selector.m",
+      "//ui/webui/resources/js:cr.m",
+    ]
+    extra_deps = [ ":modulize" ]
+  }
 }
 
 js_library("people_page.m") {
@@ -306,7 +311,6 @@
 
 group("polymer3_elements") {
   public_deps = [
-    ":manage_profile_module",
     ":modulize",
     ":people_page_module",
     ":signout_dialog_module",
@@ -316,7 +320,10 @@
   ]
 
   if (!is_chromeos) {
-    public_deps += [ ":import_data_dialog_module" ]
+    public_deps += [
+      ":import_data_dialog_module",
+      ":manage_profile_module",
+    ]
   }
 }
 
@@ -332,6 +339,14 @@
   js_file = "manage_profile.js"
   html_file = "manage_profile.html"
   html_type = "dom-module"
+  namespace_rewrites = settings_namespace_rewrites
+  auto_imports = settings_auto_imports + [
+                   "chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.html|ManageProfileBrowserProxy,ManageProfileBrowserProxyImpl,ProfileShortcutStatus",
+                   "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncStatus",
+                   "chrome/browser/resources/settings/route.html|routes",
+                   "chrome/browser/resources/settings/router.html|Router,RouteObserverBehavior",
+                   "ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html|AvatarIcon",
+                 ]
 }
 
 polymer_modulizer("people_page") {
@@ -339,7 +354,6 @@
   html_file = "people_page.html"
   html_type = "dom-module"
   ignore_imports = [
-    "chrome/browser/resources/settings/people_page/manage_profile.html",
     "chrome/browser/resources/settings/people_page/sync_controls.html",
     "chrome/browser/resources/settings/people_page/sync_page.html",
   ]
@@ -391,13 +405,15 @@
 js_modulizer("modulize") {
   input_files = [
     "account_manager_browser_proxy.js",
-    "manage_profile_browser_proxy.js",
     "profile_info_browser_proxy.js",
     "sync_browser_proxy.js",
   ]
 
   if (!is_chromeos) {
-    input_files += [ "import_data_browser_proxy.js" ]
+    input_files += [
+      "import_data_browser_proxy.js",
+      "manage_profile_browser_proxy.js",
+    ]
   }
 
   namespace_rewrites = settings_namespace_rewrites
diff --git a/chrome/browser/resources/settings/people_page/manage_profile.html b/chrome/browser/resources/settings/people_page/manage_profile.html
index 8e03e39..de3e3d4 100644
--- a/chrome/browser/resources/settings/people_page/manage_profile.html
+++ b/chrome/browser/resources/settings/people_page/manage_profile.html
@@ -7,6 +7,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/shadow.html">
 <link rel="import" href="../i18n_setup.html">
 <link rel="import" href="manage_profile_browser_proxy.html">
+<link rel="import" href="sync_browser_proxy.html">
 <link rel="import" href="../route.html">
 <link rel="import" href="../router.html">
 <link rel="import" href="../settings_shared_css.html">
@@ -23,7 +24,7 @@
       }
     </style>
     <div class="settings-box first">
-      <cr-input id="name" value="[[profileName]]" pattern=".*\S.*"
+      <cr-input id="name" value="[[profileName]]" pattern="[[pattern_]]"
           on-change="onProfileNameChanged_" on-keydown="onProfileNameKeydown_"
           disabled="[[isProfileNameDisabled_(syncStatus)]]" maxlength="500"
           auto-validate required spellcheck="false">
diff --git a/chrome/browser/resources/settings/people_page/manage_profile.js b/chrome/browser/resources/settings/people_page/manage_profile.js
index 4d7c234..7c3f6a71 100644
--- a/chrome/browser/resources/settings/people_page/manage_profile.js
+++ b/chrome/browser/resources/settings/people_page/manage_profile.js
@@ -55,6 +55,18 @@
      * True if the profile shortcuts feature is enabled.
      */
     isProfileShortcutSettingVisible_: Boolean,
+
+    /**
+     * TODO(dpapad): Move this back to the HTML file when the Polymer2 version
+     * of the code is deleted. Because of "\" being a special character in a JS
+     * string, can't satisfy both Polymer2 and Polymer3 at the same time from
+     * the HTML file.
+     * @private
+     */
+    pattern_: {
+      type: String,
+      value: '.*\\S.*',
+    },
   },
 
   /** @private {?settings.ManageProfileBrowserProxy} */
@@ -84,14 +96,15 @@
       }
       if (loadTimeData.getBoolean('profileShortcutsEnabled')) {
         this.browserProxy_.getProfileShortcutStatus().then(status => {
-          if (status == ProfileShortcutStatus.PROFILE_SHORTCUT_SETTING_HIDDEN) {
+          if (status ==
+              settings.ProfileShortcutStatus.PROFILE_SHORTCUT_SETTING_HIDDEN) {
             this.isProfileShortcutSettingVisible_ = false;
             return;
           }
 
           this.isProfileShortcutSettingVisible_ = true;
           this.hasProfileShortcut_ =
-              status == ProfileShortcutStatus.PROFILE_SHORTCUT_FOUND;
+              status == settings.ProfileShortcutStatus.PROFILE_SHORTCUT_FOUND;
         });
       }
     }
diff --git a/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js b/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js
index 8cb1ba5..fe2c0c3 100644
--- a/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js
+++ b/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.js
@@ -7,20 +7,25 @@
  * the People section to interact with the browser. Chrome Browser only.
  */
 
-/**
- * Contains the possible profile shortcut statuses. These strings must be kept
- * in sync with the C++ Manage Profile handler.
- * @enum {string}
- */
-const ProfileShortcutStatus = {
-  PROFILE_SHORTCUT_SETTING_HIDDEN: 'profileShortcutSettingHidden',
-  PROFILE_SHORTCUT_NOT_FOUND: 'profileShortcutNotFound',
-  PROFILE_SHORTCUT_FOUND: 'profileShortcutFound',
-};
+// clang-format off
+// #import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+// #import {AvatarIcon} from 'chrome://resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.m.js';
+// clang-format on
 
 cr.define('settings', function() {
+  /**
+   * Contains the possible profile shortcut statuses. These strings must be kept
+   * in sync with the C++ Manage Profile handler.
+   * @enum {string}
+   */
+  /* #export */ const ProfileShortcutStatus = {
+    PROFILE_SHORTCUT_SETTING_HIDDEN: 'profileShortcutSettingHidden',
+    PROFILE_SHORTCUT_NOT_FOUND: 'profileShortcutNotFound',
+    PROFILE_SHORTCUT_FOUND: 'profileShortcutFound',
+  };
+
   /** @interface */
-  class ManageProfileBrowserProxy {
+  /* #export */ class ManageProfileBrowserProxy {
     /**
      * Gets the available profile icons to choose from.
      * @return {!Promise<!Array<!AvatarIcon>>}
@@ -46,7 +51,7 @@
 
     /**
      * Returns whether the current profile has a shortcut.
-     * @return {!Promise<ProfileShortcutStatus>}
+     * @return {!Promise<settings.ProfileShortcutStatus>}
      */
     getProfileShortcutStatus() {}
 
@@ -64,7 +69,7 @@
   /**
    * @implements {settings.ManageProfileBrowserProxy}
    */
-  class ManageProfileBrowserProxyImpl {
+  /* #export */ class ManageProfileBrowserProxyImpl {
     /** @override */
     getAvailableIcons() {
       return cr.sendWithPromise('getAvailableIcons');
@@ -107,7 +112,8 @@
 
   // #cr_define_end
   return {
-    ManageProfileBrowserProxy: ManageProfileBrowserProxy,
-    ManageProfileBrowserProxyImpl: ManageProfileBrowserProxyImpl,
+    ManageProfileBrowserProxy,
+    ManageProfileBrowserProxyImpl,
+    ProfileShortcutStatus
   };
 });
diff --git a/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.js b/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.js
index 58576917..10512f4 100644
--- a/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.js
+++ b/chrome/browser/resources/settings/privacy_page/passwords_leak_detection_toggle.js
@@ -88,10 +88,20 @@
    * @private
    */
   getPasswordsLeakDetectionSubLabel_() {
+    let subLabel = this.i18n('passwordsLeakDetectionGeneralDescription');
     if (!this.userSignedIn_ && this.passwordsLeakDetectionAvailable_) {
-      return this.i18n('passwordsLeakDetectionSignedOutEnabledDescription');
+      subLabel +=
+          ' ' +  // Whitespace is a valid sentence separator w.r.t. i18n.
+          this.i18n('passwordsLeakDetectionSignedOutEnabledDescription') +
+          // The string appended on the previous line was added as a standalone
+          // sentence that did not end with a period. Since here we're appending
+          // it to a two-sentence string, with both of those sentences ending
+          // with periods, we must add a period at the end.
+          // TODO(crbug.com/1032584): After the privacy settings redesign, this
+          // string will never appear standalone. Include the period in it.
+          this.i18n('sentenceEnd');
     }
-    return '';
+    return subLabel;
   },
 
   /**
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index 5976a41..8734584 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -135,7 +135,7 @@
               sub-label="$i18n{securityPageDescription}"
               on-click="onSecurityPageClick_"></cr-link-row>
           <cr-link-row id="permissionsLinkRow" start-icon="settings:permissions"
-              class="hr" label="$i18n{permissionsPageTitle}"
+              class="hr" label="$i18n{siteSettings}"
               sub-label="$i18n{permissionsPageDescription}"
               on-click="onPermissionsPageClick_"></cr-link-row>
         </template>
diff --git a/chrome/browser/resources/settings/settings.gni b/chrome/browser/resources/settings/settings.gni
index 1615791..aa1b22f 100644
--- a/chrome/browser/resources/settings/settings.gni
+++ b/chrome/browser/resources/settings/settings.gni
@@ -11,6 +11,8 @@
   "settings.AboutPageBrowserProxy|AboutPageBrowserProxy",
   "settings.AccountManagerBrowserProxy|AccountManagerBrowserProxy",
   "settings.Account|Account",
+  "settings.AndroidInfoBrowserProxy|AndroidInfoBrowserProxy",
+  "settings.AndroidSmsInfo|AndroidSmsInfo",
   "settings.AppearanceBrowserProxy|AppearanceBrowserProxy",
   "settings.AutofillManager|AutofillManager",
   "settings.BlockingRequestManager|BlockingRequestManager",
@@ -33,10 +35,12 @@
   "settings.ImportDataBrowserProxy|ImportDataBrowserProxy",
   "settings.IncompatibleApplicationsBrowserProxy|IncompatibleApplicationsBrowserProxy",
   "settings.IncompatibleApplication|IncompatibleApplication",
+  "settings.INVALID_CATEGORY_SUBTYPE|INVALID_CATEGORY_SUBTYPE",
   "settings.LanguagesBrowserProxy|LanguagesBrowserProxy",
   "settings.LifetimeBrowserProxy|LifetimeBrowserProxy",
   "settings.LocalDataBrowserProxy|LocalDataBrowserProxy",
   "settings.MainPageBehavior|MainPageBehavior",
+  "settings.ManageProfileBrowserProxy|ManageProfileBrowserProxy",
   "settings.MetricsBrowserProxy|MetricsBrowserProxy",
   "settings.MinimumRoutes|MinimumRoutes",
   "settings.OnStartupBrowserProxy|OnStartupBrowserProxy",
@@ -51,6 +55,7 @@
   "settings.PrivacyElementInteractions|PrivacyElementInteractions",
   "settings.ProfileInfoBrowserProxy|ProfileInfoBrowserProxy",
   "settings.ProfileInfo|ProfileInfo",
+  "settings.ProfileShortcutStatus|ProfileShortcutStatus",
   "settings.ResetBrowserProxy|ResetBrowserProxy",
   "settings.Route|Route",
   "settings.routes|routes",
@@ -87,4 +92,5 @@
   "chrome/browser/resources/settings/prefs/prefs_behavior.html|PrefsBehavior",
   "chrome/browser/resources/settings/prefs/prefs_types.html|CrSettingsPrefs",
   "chrome/browser/resources/settings/printing_page/printing_browser_proxy.html|PrintingBrowserProxyImpl",
+  "chrome/browser/resources/settings/site_settings/site_settings_behavior.html|SiteSettingsBehavior",
 ]
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index 8117aae3..ac04ed10 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -752,8 +752,7 @@
                    type="chrome_html" />
         <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_HTML"
                    file="people_page/manage_profile.html"
-                   type="chrome_html"
-                   preprocess="true" />
+                   type="chrome_html" />
         <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_JS"
                    file="people_page/manage_profile.js"
                    type="chrome_html" />
diff --git a/chrome/browser/resources/settings/settings_resources_v3.grdp b/chrome/browser/resources/settings/settings_resources_v3.grdp
index b8e5388e..1852177 100644
--- a/chrome/browser/resources/settings/settings_resources_v3.grdp
+++ b/chrome/browser/resources/settings/settings_resources_v3.grdp
@@ -366,6 +366,14 @@
              file="${root_gen_dir}/chrome/browser/resources/settings/people_page/import_data_browser_proxy.m.js"
              use_base_dir="false"
              type="BINDATA" />
+    <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_M_JS"
+             file="${root_gen_dir}/chrome/browser/resources/settings/people_page/manage_profile.m.js"
+             use_base_dir="false"
+             type="BINDATA" />
+    <include name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_M_JS"
+             file="${root_gen_dir}/chrome/browser/resources/settings/people_page/manage_profile_browser_proxy.m.js"
+             use_base_dir="false"
+             type="BINDATA" />
   </if>
   <if expr="chromeos">
     <include name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_M_JS"
@@ -534,6 +542,16 @@
            file="${root_gen_dir}/chrome/browser/resources/settings/site_favicon.m.js"
            use_base_dir="false"
            type="BINDATA" />
+  <include name="IDR_SETTINGS_SITE_SETTINGS_ADD_SITE_DIALOG_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/add_site_dialog.m.js"
+           use_base_dir="false"
+           type="BINDATA" />
+  <if expr="chromeos">
+    <include name="IDR_SETTINGS_SITE_SETTINGS_ANDROID_INFO_BROWSER_PROXY_M_JS"
+             file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.m.js"
+             use_base_dir="false"
+             type="BINDATA" />
+  </if>
   <include name="IDR_SETTINGS_SITE_SETTINGS_CONSTANTS_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/constants.m.js"
            use_base_dir="false"
@@ -542,6 +560,10 @@
            file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/cookie_info.m.js"
            use_base_dir="false"
            type="BINDATA" />
+  <include name="IDR_SETTINGS_SITE_SETTINGS_EDIT_EXCEPTION_DIALOG_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/edit_exception_dialog.m.js"
+           use_base_dir="false"
+           type="BINDATA" />
   <include name="IDR_SETTINGS_SITE_SETTINGS_LOCAL_DATA_BROWSER_PROXY_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/local_data_browser_proxy.m.js"
            use_base_dir="false"
@@ -550,6 +572,11 @@
            file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_data_details_subpage.m.js"
            use_base_dir="false"
            type="BINDATA" />
+  <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list.m.js"
+           use_base_dir="false"
+           type="BINDATA"
+           preprocess="true" />
   <include name="IDR_SETTINGS_SITE_SETTINGS_SITE_LIST_ENTRY_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/site_settings/site_list_entry.m.js"
            use_base_dir="false"
diff --git a/chrome/browser/resources/settings/site_settings/BUILD.gn b/chrome/browser/resources/settings/site_settings/BUILD.gn
index c34e27d8..0608656 100644
--- a/chrome/browser/resources/settings/site_settings/BUILD.gn
+++ b/chrome/browser/resources/settings/site_settings/BUILD.gn
@@ -298,18 +298,19 @@
 js_type_check("closure_compile_module") {
   is_polymer3 = true
   deps = [
-    #    ":add_site_dialog.m",
+    ":add_site_dialog.m",
+
     #    ":all_sites.m",
     #    ":all_sites_icons.m",
-    #    ":android_info_browser_proxy.m",
+    ":android_info_browser_proxy.m",
+
     #    ":category_default_setting.m",
     #    ":category_setting_exceptions.m",
     #    ":chooser_exception_list.m",
     #    ":chooser_exception_list_entry.m",
     ":constants.m",
     ":cookie_info.m",
-
-    #    ":edit_exception_dialog.m",
+    ":edit_exception_dialog.m",
     ":local_data_browser_proxy.m",
 
     #    ":media_picker.m",
@@ -322,7 +323,7 @@
     #    ":site_details.m",
     #    ":site_details_permission.m",
     #    ":site_entry.m",
-    #    ":site_list.m",
+    ":site_list.m",
     ":site_list_entry.m",
     ":site_settings_behavior.m",
     ":site_settings_prefs_browser_proxy.m",
@@ -335,7 +336,12 @@
 js_library("add_site_dialog.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/add_site_dialog.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":constants.m",
+    ":site_settings_behavior.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
+    "//ui/webui/resources/js:assert.m",
+    "//ui/webui/resources/js:web_ui_listener_behavior.m",
   ]
   extra_deps = [ ":add_site_dialog_module" ]
 }
@@ -358,9 +364,7 @@
 
 js_library("android_info_browser_proxy.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.m.js" ]
-  deps = [
-    # TODO: Fill those in.
-  ]
+  deps = [ "//ui/webui/resources/js:cr.m" ]
   extra_deps = [ ":modulize" ]
 }
 
@@ -410,7 +414,10 @@
 js_library("edit_exception_dialog.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/edit_exception_dialog.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":constants.m",
+    ":site_settings_prefs_browser_proxy.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_elements/cr_dialog:cr_dialog.m",
   ]
   extra_deps = [ ":edit_exception_dialog_module" ]
 }
@@ -505,8 +512,20 @@
 js_library("site_list.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/site_settings/site_list.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":android_info_browser_proxy.m",
+    ":constants.m",
+    ":site_list_entry.m",
+    ":site_settings_behavior.m",
+    ":site_settings_prefs_browser_proxy.m",
+    "//third_party/polymer/v3_0/components-chromium/paper-tooltip:paper-tooltip",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
+    "//ui/webui/resources/js:assert.m",
+    "//ui/webui/resources/js:list_property_update_behavior.m",
+    "//ui/webui/resources/js:web_ui_listener_behavior.m",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
   ]
+  externs_list = [ "$externs_path/settings_private.js" ]
   extra_deps = [ ":site_list_module" ]
 }
 
@@ -593,6 +612,11 @@
   js_file = "add_site_dialog.js"
   html_file = "add_site_dialog.html"
   html_type = "dom-module"
+  auto_imports = settings_auto_imports + [
+                   "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes,SITE_EXCEPTION_WILDCARD",
+                   "ui/webui/resources/html/assert.html|assert",
+                 ]
+  namespace_rewrites = settings_namespace_rewrites
 }
 
 polymer_modulizer("all_sites") {
@@ -641,6 +665,11 @@
   js_file = "edit_exception_dialog.js"
   html_file = "edit_exception_dialog.html"
   html_type = "dom-module"
+  auto_imports = settings_auto_imports + [
+                   "chrome/browser/resources/settings/site_settings/constants.html|SITE_EXCEPTION_WILDCARD",
+                   "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteException,SiteSettingsPrefsBrowserProxy,SiteSettingsPrefsBrowserProxyImpl",
+                 ]
+  namespace_rewrites = settings_namespace_rewrites
 }
 
 polymer_modulizer("media_picker") {
@@ -708,6 +737,13 @@
   js_file = "site_list.js"
   html_file = "site_list.html"
   html_type = "dom-module"
+  auto_imports = settings_auto_imports + [
+                   "chrome/browser/resources/settings/site_settings/android_info_browser_proxy.html|AndroidInfoBrowserProxyImpl,AndroidSmsInfo",
+                   "chrome/browser/resources/settings/site_settings/constants.html|ContentSetting,ContentSettingsTypes,INVALID_CATEGORY_SUBTYPE",
+                   "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|RawSiteException,SiteException,SiteSettingsPrefsBrowserProxyImpl",
+                   "ui/webui/resources/html/assert.html|assert",
+                 ]
+  namespace_rewrites = settings_namespace_rewrites
 }
 
 polymer_modulizer("site_list_entry") {
@@ -718,7 +754,6 @@
                    "chrome/browser/resources/settings/route.html|routes",
                    "chrome/browser/resources/settings/router.html|Router",
                    "chrome/browser/resources/settings/site_settings/constants.html|ChooserType,ContentSettingsTypes,SITE_EXCEPTION_WILDCARD",
-                   "chrome/browser/resources/settings/site_settings/site_settings_behavior.html|SiteSettingsBehavior",
                    "chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.html|SiteException",
                    "ui/webui/resources/html/assert.html|assert",
                  ]
diff --git a/chrome/browser/resources/settings/site_settings/add_site_dialog.html b/chrome/browser/resources/settings/site_settings/add_site_dialog.html
index 6b38253..91892f8 100644
--- a/chrome/browser/resources/settings/site_settings/add_site_dialog.html
+++ b/chrome/browser/resources/settings/site_settings/add_site_dialog.html
@@ -4,6 +4,7 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
+<link rel="import" href="chrome://resources/html/assert.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="../i18n_setup.html">
 <link rel="import" href="../settings_shared_css.html">
diff --git a/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js b/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js
index 42d2834..ea5ccb2 100644
--- a/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js
+++ b/chrome/browser/resources/settings/site_settings/android_info_browser_proxy.js
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js';
+// clang-format on
+
 /**
  * Type definition of AndroidAppsInfo entry. |playStoreEnabled| indicates that
  * Play Store is enabled. |settingsAppAvailable| indicates that Android settings
@@ -22,7 +26,7 @@
    * @typedef {{origin: string,
    *            enabled: boolean}}
    */
-  let AndroidSmsInfo;
+  /* #export */ let AndroidSmsInfo;
 
   /** @interface */
   class AndroidInfoBrowserProxy {
@@ -39,7 +43,7 @@
   /**
    * @implements {settings.AndroidInfoBrowserProxy}
    */
-  class AndroidInfoBrowserProxyImpl {
+  /* #export */ class AndroidInfoBrowserProxyImpl {
     /** @override */
     getAndroidSmsInfo() {
       return cr.sendWithPromise('getAndroidSmsInfo');
diff --git a/chrome/browser/resources/settings/site_settings/constants.js b/chrome/browser/resources/settings/site_settings/constants.js
index 3b03c57b4..c34cdcf 100644
--- a/chrome/browser/resources/settings/site_settings/constants.js
+++ b/chrome/browser/resources/settings/site_settings/constants.js
@@ -115,7 +115,7 @@
    * An invalid subtype value.
    * @type {string}
    */
-  const INVALID_CATEGORY_SUBTYPE = '';
+  /* #export */ const INVALID_CATEGORY_SUBTYPE = '';
 
   /**
    * Contains the record action types logged before M82.
diff --git a/chrome/browser/resources/settings/site_settings/edit_exception_dialog.html b/chrome/browser/resources/settings/site_settings/edit_exception_dialog.html
index 2bc85d2..b2b2076 100644
--- a/chrome/browser/resources/settings/site_settings/edit_exception_dialog.html
+++ b/chrome/browser/resources/settings/site_settings/edit_exception_dialog.html
@@ -4,6 +4,7 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
 <link rel="import" href="../i18n_setup.html">
+<link rel="import" href="constants.html">
 <link rel="import" href="site_settings_prefs_browser_proxy.html">
 
 <dom-module id="settings-edit-exception-dialog">
diff --git a/chrome/browser/resources/settings/site_settings/edit_exception_dialog.js b/chrome/browser/resources/settings/site_settings/edit_exception_dialog.js
index 60dafcb..12933d4 100644
--- a/chrome/browser/resources/settings/site_settings/edit_exception_dialog.js
+++ b/chrome/browser/resources/settings/site_settings/edit_exception_dialog.js
@@ -37,7 +37,7 @@
     },
   },
 
-  /** @private {!settings.SiteSettingsPrefsBrowserProxy} */
+  /** @private {?settings.SiteSettingsPrefsBrowserProxy} */
   browserProxy_: null,
 
   /** @override */
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
index 61c9444..5adda63 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
+++ b/chrome/browser/resources/settings/site_settings/site_settings_behavior.js
@@ -18,7 +18,7 @@
  * TODO(dschuyler): Can they be unified (and this dictionary removed)?
  * @type {!Object}
  */
-const kControlledByLookup = {
+/* #export */ const kControlledByLookup = {
   'extension': chrome.settingsPrivate.ControlledBy.EXTENSION,
   'HostedApp': chrome.settingsPrivate.ControlledBy.EXTENSION,
   'platform_app': chrome.settingsPrivate.ControlledBy.EXTENSION,
diff --git a/chrome/browser/search/ntp_features.cc b/chrome/browser/search/ntp_features.cc
index 6f909ec..9dc056d 100644
--- a/chrome/browser/search/ntp_features.cc
+++ b/chrome/browser/search/ntp_features.cc
@@ -37,6 +37,11 @@
 // below the non-fake input ("realbox").
 const base::Feature kRealbox{"NtpRealbox", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// If enabled, shows Vasco suggestion chips in the NTP below fakebox/realbox
+// despite other config.
+const base::Feature kSearchSuggestChips{"SearchSuggestChips",
+                                        base::FEATURE_DISABLED_BY_DEFAULT};
+
 // If enabled, the WebUI new tab page will load when a new tab is created
 // instead of the local NTP.
 const base::Feature kWebUI{"NtpWebUI", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/search/ntp_features.h b/chrome/browser/search/ntp_features.h
index 0649d56b..5131b407 100644
--- a/chrome/browser/search/ntp_features.h
+++ b/chrome/browser/search/ntp_features.h
@@ -21,6 +21,8 @@
 // Note: only exposed for about:flags. Use IsNtpRealboxEnabled() instead.
 extern const base::Feature kRealbox;
 
+extern const base::Feature kSearchSuggestChips;
+
 // Returns true if either kRealbox or omnibox::kZeroSuggestionsOnNTPRealbox
 // are enabled; or omnibox::kOnFocusSuggestions is enabled and configured to
 // show suggestions of some type in the NTP Realbox.
diff --git a/chrome/browser/search/search_suggest/search_suggest_service.cc b/chrome/browser/search/search_suggest/search_suggest_service.cc
index 655a01f..9cd7bde 100644
--- a/chrome/browser/search/search_suggest/search_suggest_service.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_service.cc
@@ -12,6 +12,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/ntp_features.h"
 #include "chrome/browser/search/search.h"
 #include "chrome/browser/search/search_suggest/search_suggest_loader.h"
 #include "chrome/common/pref_names.h"
@@ -98,6 +99,9 @@
 
 // static
 bool SearchSuggestService::IsEnabled() {
+  if (base::FeatureList::IsEnabled(ntp_features::kSearchSuggestChips))
+    return true;
+
   return !base::FeatureList::IsEnabled(omnibox::kZeroSuggestionsOnNTP) &&
          !base::FeatureList::IsEnabled(omnibox::kZeroSuggestionsOnNTPRealbox) &&
          !(base::FeatureList::IsEnabled(omnibox::kOnFocusSuggestions) &&
diff --git a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
index 892dcd4..5aa849b 100644
--- a/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
+++ b/chrome/browser/search/search_suggest/search_suggest_service_unittest.cc
@@ -10,13 +10,16 @@
 
 #include "base/optional.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "chrome/browser/search/ntp_features.h"
 #include "chrome/browser/search/search_suggest/search_suggest_data.h"
 #include "chrome/browser/search/search_suggest/search_suggest_loader.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/search_test_utils.h"
+#include "components/omnibox/common/omnibox_features.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/signin/public/base/test_signin_client.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
@@ -140,6 +143,83 @@
   std::unique_ptr<SearchSuggestService> service_;
 };
 
+TEST_F(SearchSuggestServiceTest, IsEnabled) {
+  constexpr char kRemoteSendUrl[] = "RemoteSendUrl";
+  constexpr char kRemoteNoUrlLocal[] = "RemoteNoUrl,Local";
+  {
+    // The service is enabled by default.
+    EXPECT_TRUE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Enabling omnibox::kZeroSuggestionsOnNTP disables the service.
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures({omnibox::kZeroSuggestionsOnNTP}, {});
+    EXPECT_FALSE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Enabling omnibox::kZeroSuggestionsOnNTPRealbox disables the service.
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeatures({omnibox::kZeroSuggestionsOnNTPRealbox}, {});
+    EXPECT_FALSE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Enabling omnibox::kOnFocusSuggestions for SERP does not disable the
+    // service.
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> feature_params;
+    // Note: ZPS variant 6 is Search Engine Results Page.
+    feature_params["ZeroSuggestVariant:6:*"] = kRemoteSendUrl;
+    feature_list.InitWithFeaturesAndParameters(
+        {{omnibox::kOnFocusSuggestions, feature_params}}, {});
+    EXPECT_TRUE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Enabling omnibox::kOnFocusSuggestions for NTP Omnibox disables the
+    // service.
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> feature_params;
+    // Note: ZPS variant 7 is NTP with Omnibox as starting focus.
+    feature_params["ZeroSuggestVariant:7:*"] = kRemoteNoUrlLocal;
+    feature_list.InitWithFeaturesAndParameters(
+        {{omnibox::kOnFocusSuggestions, feature_params}}, {});
+    EXPECT_FALSE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Enabling omnibox::kOnFocusSuggestions for NTP Realbox disables the
+    // service.
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> feature_params;
+    // Note: ZPS variant 15 is NTP Realbox as starting focus.
+    feature_params["ZeroSuggestVariant:15:*"] = kRemoteNoUrlLocal;
+    feature_list.InitWithFeaturesAndParameters(
+        {{omnibox::kOnFocusSuggestions, feature_params}}, {});
+    EXPECT_FALSE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Disabling ntp_features::kSearchSuggestChips does not disable the service.
+    base::test::ScopedFeatureList feature_list;
+    feature_list.InitWithFeaturesAndParameters(
+        {}, {ntp_features::kSearchSuggestChips});
+    EXPECT_TRUE(SearchSuggestService::IsEnabled());
+  }
+  {
+    // Enabling ntp_features::kSearchSuggestChips enables the service despite
+    // the other config.
+    base::test::ScopedFeatureList feature_list;
+    std::map<std::string, std::string> feature_params;
+    // Note: ZPS variant 7 is NTP with Omnibox as starting focus.
+    feature_params["ZeroSuggestVariant:7:*"] = kRemoteNoUrlLocal;
+    // Note: ZPS variant 15 is NTP Realbox as starting focus.
+    feature_params["ZeroSuggestVariant:15:*"] = kRemoteNoUrlLocal;
+    feature_list.InitWithFeaturesAndParameters(
+        {{omnibox::kZeroSuggestionsOnNTP, {}},
+         {omnibox::kZeroSuggestionsOnNTPRealbox, {}},
+         {omnibox::kOnFocusSuggestions, feature_params}},
+        {ntp_features::kSearchSuggestChips});
+    EXPECT_FALSE(SearchSuggestService::IsEnabled());
+  }
+}
+
 TEST_F(SearchSuggestServiceTest, NoRefreshOnSignedOutRequest) {
   ASSERT_EQ(base::nullopt, service()->search_suggest_data());
 
diff --git a/chrome/browser/serial/serial_chooser_context.cc b/chrome/browser/serial/serial_chooser_context.cc
index a61b97f..853103c 100644
--- a/chrome/browser/serial/serial_chooser_context.cc
+++ b/chrome/browser/serial/serial_chooser_context.cc
@@ -174,15 +174,54 @@
   return port_manager_.get();
 }
 
+void SerialChooserContext::AddPortObserver(PortObserver* observer) {
+  port_observer_list_.AddObserver(observer);
+}
+
+void SerialChooserContext::RemovePortObserver(PortObserver* observer) {
+  port_observer_list_.RemoveObserver(observer);
+}
+
 void SerialChooserContext::SetPortManagerForTesting(
     mojo::PendingRemote<device::mojom::SerialPortManager> manager) {
   SetUpPortManagerConnection(std::move(manager));
 }
 
+void SerialChooserContext::FlushPortManagerConnectionForTesting() {
+  port_manager_.FlushForTesting();
+}
+
 base::WeakPtr<SerialChooserContext> SerialChooserContext::AsWeakPtr() {
   return weak_factory_.GetWeakPtr();
 }
 
+void SerialChooserContext::OnPortAdded(device::mojom::SerialPortInfoPtr port) {
+  for (auto& observer : port_observer_list_)
+    observer.OnPortAdded(*port);
+}
+
+void SerialChooserContext::OnPortRemoved(
+    device::mojom::SerialPortInfoPtr port) {
+  for (auto& observer : port_observer_list_)
+    observer.OnPortRemoved(*port);
+
+  std::vector<std::pair<url::Origin, url::Origin>> revoked_url_pairs;
+  for (auto& map_entry : ephemeral_ports_) {
+    std::set<base::UnguessableToken>& ports = map_entry.second;
+    if (ports.erase(port->token) > 0)
+      revoked_url_pairs.push_back(map_entry.first);
+  }
+
+  port_info_.erase(port->token);
+
+  for (auto& observer : permission_observer_list_) {
+    observer.OnChooserObjectPermissionChanged(guard_content_settings_type_,
+                                              data_content_settings_type_);
+    for (const auto& url_pair : revoked_url_pairs)
+      observer.OnPermissionRevoked(url_pair.first, url_pair.second);
+  }
+}
+
 void SerialChooserContext::EnsurePortManagerConnection() {
   if (port_manager_)
     return;
@@ -199,9 +238,14 @@
   port_manager_.set_disconnect_handler(
       base::BindOnce(&SerialChooserContext::OnPortManagerConnectionError,
                      base::Unretained(this)));
+
+  port_manager_->SetClient(client_receiver_.BindNewPipeAndPassRemote());
 }
 
 void SerialChooserContext::OnPortManagerConnectionError() {
+  port_manager_.reset();
+  client_receiver_.reset();
+
   port_info_.clear();
 
   std::vector<std::pair<url::Origin, url::Origin>> revoked_origins;
diff --git a/chrome/browser/serial/serial_chooser_context.h b/chrome/browser/serial/serial_chooser_context.h
index 59a57db..a5325bb3 100644
--- a/chrome/browser/serial/serial_chooser_context.h
+++ b/chrome/browser/serial/serial_chooser_context.h
@@ -28,8 +28,16 @@
 class Value;
 }
 
-class SerialChooserContext : public permissions::ChooserContextBase {
+class SerialChooserContext : public permissions::ChooserContextBase,
+                             public device::mojom::SerialPortManagerClient {
  public:
+  class PortObserver : public base::CheckedObserver {
+   public:
+    virtual void OnPortAdded(const device::mojom::SerialPortInfo& port) = 0;
+    virtual void OnPortRemoved(const device::mojom::SerialPortInfo& port) = 0;
+    virtual void OnPortManagerConnectionError() = 0;
+  };
+
   explicit SerialChooserContext(Profile* profile);
   ~SerialChooserContext() override;
 
@@ -59,10 +67,18 @@
 
   device::mojom::SerialPortManager* GetPortManager();
 
+  void AddPortObserver(PortObserver* observer);
+  void RemovePortObserver(PortObserver* observer);
+
   void SetPortManagerForTesting(
       mojo::PendingRemote<device::mojom::SerialPortManager> manager);
+  void FlushPortManagerConnectionForTesting();
   base::WeakPtr<SerialChooserContext> AsWeakPtr();
 
+  // SerialPortManagerClient implementation.
+  void OnPortAdded(device::mojom::SerialPortInfoPtr port) override;
+  void OnPortRemoved(device::mojom::SerialPortInfoPtr port) override;
+
  private:
   void EnsurePortManagerConnection();
   void SetUpPortManagerConnection(
@@ -85,6 +101,8 @@
   std::map<base::UnguessableToken, base::Value> port_info_;
 
   mojo::Remote<device::mojom::SerialPortManager> port_manager_;
+  mojo::Receiver<device::mojom::SerialPortManagerClient> client_receiver_{this};
+  base::ObserverList<PortObserver> port_observer_list_;
 
   base::WeakPtrFactory<SerialChooserContext> weak_factory_{this};
 
diff --git a/chrome/browser/serial/serial_chooser_context_unittest.cc b/chrome/browser/serial/serial_chooser_context_unittest.cc
index 907669a..d083c3cc 100644
--- a/chrome/browser/serial/serial_chooser_context_unittest.cc
+++ b/chrome/browser/serial/serial_chooser_context_unittest.cc
@@ -5,35 +5,76 @@
 #include "chrome/browser/serial/serial_chooser_context.h"
 
 #include "base/run_loop.h"
+#include "base/scoped_observer.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/serial/serial_chooser_context_factory.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/permissions/test/chooser_context_base_mock_permission_observer.h"
 #include "content/public/test/browser_task_environment.h"
+#include "services/device/public/cpp/test/fake_serial_port_manager.h"
 #include "services/device/public/mojom/serial.mojom.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
 
+class MockPortObserver : public SerialChooserContext::PortObserver {
+ public:
+  MockPortObserver() = default;
+  MockPortObserver(MockPortObserver&) = delete;
+  MockPortObserver& operator=(MockPortObserver&) = delete;
+  ~MockPortObserver() override = default;
+
+  MOCK_METHOD1(OnPortAdded, void(const device::mojom::SerialPortInfo&));
+  MOCK_METHOD1(OnPortRemoved, void(const device::mojom::SerialPortInfo&));
+  MOCK_METHOD0(OnPortManagerConnectionError, void());
+};
+
 class SerialChooserContextTest : public testing::Test {
  public:
-  SerialChooserContextTest() = default;
+  SerialChooserContextTest() {
+    mojo::PendingRemote<device::mojom::SerialPortManager> port_manager;
+    port_manager_.AddReceiver(port_manager.InitWithNewPipeAndPassReceiver());
+
+    context_ = SerialChooserContextFactory::GetForProfile(&profile_);
+    context_->SetPortManagerForTesting(std::move(port_manager));
+    scoped_permission_observer_.Add(context_);
+    scoped_port_observer_.Add(context_);
+
+    // Ensure |context_| is ready to receive SerialPortManagerClient messages.
+    context_->FlushPortManagerConnectionForTesting();
+  }
+
   ~SerialChooserContextTest() override = default;
 
-  Profile* profile() { return &profile_; }
-  permissions::MockPermissionObserver& observer() { return mock_observer_; }
+  // Disallow copy and assignment.
+  SerialChooserContextTest(SerialChooserContextTest&) = delete;
+  SerialChooserContextTest& operator=(SerialChooserContextTest&) = delete;
 
-  SerialChooserContext* GetContext(Profile* profile) {
-    auto* context = SerialChooserContextFactory::GetForProfile(profile);
-    context->AddObserver(&mock_observer_);
-    return context;
+  device::FakeSerialPortManager& port_manager() { return port_manager_; }
+  Profile* profile() { return &profile_; }
+  SerialChooserContext* context() { return context_; }
+  permissions::MockPermissionObserver& permission_observer() {
+    return permission_observer_;
   }
+  MockPortObserver& port_observer() { return port_observer_; }
 
  private:
   content::BrowserTaskEnvironment task_environment_;
+  device::FakeSerialPortManager port_manager_;
   TestingProfile profile_;
-  permissions::MockPermissionObserver mock_observer_;
+  SerialChooserContext* context_;
+  permissions::MockPermissionObserver permission_observer_;
+  ScopedObserver<permissions::ChooserContextBase,
+                 permissions::ChooserContextBase::PermissionObserver>
+      scoped_permission_observer_{&permission_observer_};
+  MockPortObserver port_observer_;
+  ScopedObserver<SerialChooserContext,
+                 SerialChooserContext::PortObserver,
+                 &SerialChooserContext::AddPortObserver,
+                 &SerialChooserContext::RemovePortObserver>
+      scoped_port_observer_{&port_observer_};
 };
 
 }  // namespace
@@ -44,22 +85,22 @@
   auto port = device::mojom::SerialPortInfo::New();
   port->token = base::UnguessableToken::Create();
 
-  SerialChooserContext* context = GetContext(profile());
-  EXPECT_FALSE(context->HasPortPermission(origin, origin, *port));
+  EXPECT_FALSE(context()->HasPortPermission(origin, origin, *port));
 
-  EXPECT_CALL(observer(), OnChooserObjectPermissionChanged(
-                              ContentSettingsType::SERIAL_GUARD,
-                              ContentSettingsType::SERIAL_CHOOSER_DATA));
+  EXPECT_CALL(permission_observer(),
+              OnChooserObjectPermissionChanged(
+                  ContentSettingsType::SERIAL_GUARD,
+                  ContentSettingsType::SERIAL_CHOOSER_DATA));
 
-  context->GrantPortPermission(origin, origin, *port);
-  EXPECT_TRUE(context->HasPortPermission(origin, origin, *port));
+  context()->GrantPortPermission(origin, origin, *port);
+  EXPECT_TRUE(context()->HasPortPermission(origin, origin, *port));
 
   std::vector<std::unique_ptr<permissions::ChooserContextBase::Object>>
-      origin_objects = context->GetGrantedObjects(origin, origin);
+      origin_objects = context()->GetGrantedObjects(origin, origin);
   ASSERT_EQ(1u, origin_objects.size());
 
   std::vector<std::unique_ptr<permissions::ChooserContextBase::Object>>
-      objects = context->GetAllGrantedObjects();
+      objects = context()->GetAllGrantedObjects();
   ASSERT_EQ(1u, objects.size());
   EXPECT_EQ(origin.GetURL(), objects[0]->requesting_origin);
   EXPECT_EQ(origin.GetURL(), objects[0]->embedding_origin);
@@ -68,16 +109,52 @@
             objects[0]->source);
   EXPECT_FALSE(objects[0]->incognito);
 
-  EXPECT_CALL(observer(), OnChooserObjectPermissionChanged(
-                              ContentSettingsType::SERIAL_GUARD,
-                              ContentSettingsType::SERIAL_CHOOSER_DATA));
-  EXPECT_CALL(observer(), OnPermissionRevoked(origin, origin));
+  EXPECT_CALL(permission_observer(),
+              OnChooserObjectPermissionChanged(
+                  ContentSettingsType::SERIAL_GUARD,
+                  ContentSettingsType::SERIAL_CHOOSER_DATA));
+  EXPECT_CALL(permission_observer(), OnPermissionRevoked(origin, origin));
 
-  context->RevokeObjectPermission(origin, origin, objects[0]->value);
-  EXPECT_FALSE(context->HasPortPermission(origin, origin, *port));
-  origin_objects = context->GetGrantedObjects(origin, origin);
+  context()->RevokeObjectPermission(origin, origin, objects[0]->value);
+  EXPECT_FALSE(context()->HasPortPermission(origin, origin, *port));
+  origin_objects = context()->GetGrantedObjects(origin, origin);
   EXPECT_EQ(0u, origin_objects.size());
-  objects = context->GetAllGrantedObjects();
+  objects = context()->GetAllGrantedObjects();
+  EXPECT_EQ(0u, objects.size());
+}
+
+TEST_F(SerialChooserContextTest, EphemeralPermissionRevokedOnDisconnect) {
+  const auto origin = url::Origin::Create(GURL("https://google.com"));
+
+  auto port = device::mojom::SerialPortInfo::New();
+  port->token = base::UnguessableToken::Create();
+  port_manager().AddPort(port.Clone());
+
+  context()->GrantPortPermission(origin, origin, *port);
+  EXPECT_TRUE(context()->HasPortPermission(origin, origin, *port));
+
+  EXPECT_CALL(permission_observer(),
+              OnChooserObjectPermissionChanged(
+                  ContentSettingsType::SERIAL_GUARD,
+                  ContentSettingsType::SERIAL_CHOOSER_DATA));
+  EXPECT_CALL(permission_observer(), OnPermissionRevoked(origin, origin));
+
+  port_manager().RemovePort(port->token);
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(port_observer(), OnPortRemoved(testing::_))
+        .WillOnce(
+            testing::Invoke([&](const device::mojom::SerialPortInfo& info) {
+              EXPECT_EQ(port->token, info.token);
+              EXPECT_TRUE(context()->HasPortPermission(origin, origin, info));
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+  EXPECT_FALSE(context()->HasPortPermission(origin, origin, *port));
+  auto origin_objects = context()->GetGrantedObjects(origin, origin);
+  EXPECT_EQ(0u, origin_objects.size());
+  auto objects = context()->GetAllGrantedObjects();
   EXPECT_EQ(0u, objects.size());
 }
 
@@ -87,21 +164,20 @@
   auto port = device::mojom::SerialPortInfo::New();
   port->token = base::UnguessableToken::Create();
 
-  SerialChooserContext* context = GetContext(profile());
-  context->GrantPortPermission(origin, origin, *port);
-  EXPECT_TRUE(context->HasPortPermission(origin, origin, *port));
+  context()->GrantPortPermission(origin, origin, *port);
+  EXPECT_TRUE(context()->HasPortPermission(origin, origin, *port));
 
   auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
   map->SetContentSettingDefaultScope(origin.GetURL(), origin.GetURL(),
                                      ContentSettingsType::SERIAL_GUARD,
                                      std::string(), CONTENT_SETTING_BLOCK);
-  EXPECT_FALSE(context->HasPortPermission(origin, origin, *port));
+  EXPECT_FALSE(context()->HasPortPermission(origin, origin, *port));
 
   std::vector<std::unique_ptr<permissions::ChooserContextBase::Object>>
-      objects = context->GetGrantedObjects(origin, origin);
+      objects = context()->GetGrantedObjects(origin, origin);
   EXPECT_EQ(0u, objects.size());
 
   std::vector<std::unique_ptr<permissions::ChooserContextBase::Object>>
-      all_origin_objects = context->GetAllGrantedObjects();
+      all_origin_objects = context()->GetAllGrantedObjects();
   EXPECT_EQ(0u, all_origin_objects.size());
 }
diff --git a/chrome/browser/settings/BUILD.gn b/chrome/browser/settings/BUILD.gn
index d22b529..6875d22 100644
--- a/chrome/browser/settings/BUILD.gn
+++ b/chrome/browser/settings/BUILD.gn
@@ -26,7 +26,7 @@
     "//chrome/browser/util:java",
     "//third_party/android_deps:android_support_v7_appcompat_java",
     "//third_party/android_deps:androidx_annotation_annotation_java",
-    "//third_party/android_deps:com_android_support_preference_v7_java",
+    "//third_party/android_deps:androidx_preference_preference_java",
 
     # TODO(crbug.com/1017190): Remove the following deps once we stop linting individual targets.
     "//components/browser_ui/styles/android:java_resources",
@@ -39,7 +39,7 @@
   deps = [
     "//chrome/browser/ui/android/strings:ui_strings_grd",
     "//components/browser_ui/styles/android:java_resources",
-    "//third_party/android_deps:com_android_support_preference_v7_java",
+    "//third_party/android_deps:androidx_preference_preference_java",
     "//third_party/android_deps:com_google_android_material_material_java",
     "//ui/android:ui_java_resources",
   ]
diff --git a/chrome/browser/sharing/webrtc/sharing_mojo_service.cc b/chrome/browser/sharing/webrtc/sharing_mojo_service.cc
index 54db880..109dee4 100644
--- a/chrome/browser/sharing/webrtc/sharing_mojo_service.cc
+++ b/chrome/browser/sharing/webrtc/sharing_mojo_service.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/sharing/webrtc/sharing_mojo_service.h"
 
+#include "build/build_config.h"
 #include "content/public/browser/service_process_host.h"
 
 namespace sharing {
@@ -13,7 +14,11 @@
   content::ServiceProcessHost::Launch<mojom::Sharing>(
       remote.InitWithNewPipeAndPassReceiver(),
       content::ServiceProcessHost::Options()
+#if defined(OS_MACOSX)
           .WithSandboxType(service_manager::SandboxType::kUtility)
+#else
+          .WithSandboxType(service_manager::SandboxType::kSharingService)
+#endif
           .WithDisplayName("Sharing Service")
           .Pass());
   return remote;
diff --git a/chrome/browser/shell_integration_linux.cc b/chrome/browser/shell_integration_linux.cc
index 55be2dc..8f8f6b8 100644
--- a/chrome/browser/shell_integration_linux.cc
+++ b/chrome/browser/shell_integration_linux.cc
@@ -12,6 +12,7 @@
 #include <unistd.h>
 
 #include <memory>
+#include <sstream>
 #include <string>
 #include <utility>
 #include <vector>
@@ -32,6 +33,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread.h"
@@ -645,6 +647,43 @@
 #endif
 }
 
+base::FilePath GetMimeTypesRegistrationFilename(
+    const base::FilePath& profile_path,
+    const web_app::AppId& app_id) {
+  DCHECK(!profile_path.empty() && !app_id.empty());
+
+  // Use a prefix to clearly group files created by Chrome.
+  std::string filename = base::StringPrintf(
+      "%s-%s-%s%s", chrome::kBrowserProcessExecutableName, app_id.c_str(),
+      profile_path.BaseName().value().c_str(), ".xml");
+
+  // Replace illegal characters and spaces in |filename|.
+  base::i18n::ReplaceIllegalCharactersInPath(&filename, '_');
+  base::ReplaceChars(filename, " ", "_", &filename);
+
+  return base::FilePath(filename);
+}
+
+std::string GetMimeTypesRegistrationFileContents(
+    const apps::FileHandlers& file_handlers) {
+  std::stringstream ss;
+  ss << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+        "<mime-info "
+        "xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\n";
+
+  for (const auto& file_handler : file_handlers) {
+    for (const auto& accept_entry : file_handler.accept) {
+      ss << "  <mime-type type=\"" << accept_entry.mime_type + "\">\n";
+      for (const auto& file_extension : accept_entry.file_extensions)
+        ss << "    <glob pattern=\"*" << file_extension << "\"/>\n";
+      ss << "  </mime-type>\n";
+    }
+  }
+
+  ss << "</mime-info>\n";
+  return ss.str();
+}
+
 }  // namespace shell_integration_linux
 
 namespace shell_integration {
diff --git a/chrome/browser/shell_integration_linux.h b/chrome/browser/shell_integration_linux.h
index f376ae97..33b1280 100644
--- a/chrome/browser/shell_integration_linux.h
+++ b/chrome/browser/shell_integration_linux.h
@@ -8,7 +8,9 @@
 #include <string>
 
 #include "base/files/file_path.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
 #include "chrome/common/buildflags.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
 #include "url/gurl.h"
 
 #if defined(OS_CHROMEOS)
@@ -90,6 +92,18 @@
 std::string GetDirectoryFileContents(const base::string16& title,
                                      const std::string& icon_name);
 
+// Returns the filename for a .xml file, corresponding to a given |app_id|,
+// which is passed to `xdg-mime` to register one or more custom MIME types in
+// Linux.
+base::FilePath GetMimeTypesRegistrationFilename(
+    const base::FilePath& profile_path,
+    const web_app::AppId& app_id);
+
+// Returns the contents of a .xml file as specified by |file_handlers|, which is
+// passed to `xdg-mime` to register one or more custom MIME types in Linux.
+std::string GetMimeTypesRegistrationFileContents(
+    const apps::FileHandlers& file_handlers);
+
 // Windows that correspond to web apps need to have a deterministic (and
 // different) WMClass than normal chrome windows so the window manager groups
 // them as a separate application.
diff --git a/chrome/browser/shell_integration_linux_unittest.cc b/chrome/browser/shell_integration_linux_unittest.cc
index 71fa1bf..ec7d58a 100644
--- a/chrome/browser/shell_integration_linux_unittest.cc
+++ b/chrome/browser/shell_integration_linux_unittest.cc
@@ -23,7 +23,9 @@
 #include "base/test/scoped_path_override.h"
 #include "build/branding_buildflags.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
 #include "chrome/common/chrome_constants.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -531,6 +533,81 @@
   }
 }
 
+TEST(ShellIntegrationTest, GetMimeTypesRegistrationFilename) {
+  const struct {
+    const char* const profile_path;
+    const char* const app_id;
+    const char* const expected_filename;
+  } test_cases[] = {
+      {"Default", "app-id", "-app-id-Default.xml"},
+      {"Default Profile", "app-id", "-app-id-Default_Profile.xml"},
+      {"foo/Default", "app-id", "-app-id-Default.xml"},
+      {"Default*Profile", "app-id", "-app-id-Default_Profile.xml"}};
+  std::string browser_name(chrome::kBrowserProcessExecutableName);
+
+  for (const auto& test_case : test_cases) {
+    const base::FilePath filename =
+        GetMimeTypesRegistrationFilename(base::FilePath(test_case.profile_path),
+                                         web_app::AppId(test_case.app_id));
+    EXPECT_EQ(browser_name + test_case.expected_filename, filename.value());
+  }
+}
+
+TEST(ShellIntegrationTest, GetMimeTypesRegistrationFileContents) {
+  apps::FileHandlers file_handlers;
+  {
+    apps::FileHandler file_handler;
+    {
+      apps::FileHandler::AcceptEntry accept_entry;
+      accept_entry.mime_type = "application/foo";
+      accept_entry.file_extensions.insert(".foo");
+      file_handler.accept.push_back(accept_entry);
+    }
+    file_handlers.push_back(file_handler);
+  }
+  {
+    apps::FileHandler file_handler;
+    {
+      apps::FileHandler::AcceptEntry accept_entry;
+      accept_entry.mime_type = "application/foobar";
+      accept_entry.file_extensions.insert(".foobar");
+      file_handler.accept.push_back(accept_entry);
+    }
+    file_handlers.push_back(file_handler);
+  }
+  {
+    apps::FileHandler file_handler;
+    {
+      apps::FileHandler::AcceptEntry accept_entry;
+      accept_entry.mime_type = "application/bar";
+      accept_entry.file_extensions.insert(".bar");
+      accept_entry.file_extensions.insert(".baz");
+      file_handler.accept.push_back(accept_entry);
+    }
+    file_handlers.push_back(file_handler);
+  }
+
+  const std::string file_contents =
+      GetMimeTypesRegistrationFileContents(file_handlers);
+  const std::string expected_file_contents =
+      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+      "<mime-info "
+      "xmlns=\"http://www.freedesktop.org/standards/shared-mime-info\">\n"
+      "  <mime-type type=\"application/foo\">\n"
+      "    <glob pattern=\"*.foo\"/>\n"
+      "  </mime-type>\n"
+      "  <mime-type type=\"application/foobar\">\n"
+      "    <glob pattern=\"*.foobar\"/>\n"
+      "  </mime-type>\n"
+      "  <mime-type type=\"application/bar\">\n"
+      "    <glob pattern=\"*.bar\"/>\n"
+      "    <glob pattern=\"*.baz\"/>\n"
+      "  </mime-type>\n"
+      "</mime-info>\n";
+
+  EXPECT_EQ(file_contents, expected_file_contents);
+}
+
 TEST(ShellIntegrationTest, WmClass) {
   base::CommandLine command_line((base::FilePath()));
   EXPECT_EQ("foo", internal::GetProgramClassName(command_line, "foo.desktop"));
diff --git a/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc b/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc
index 0839aca..63a74eb 100644
--- a/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc
+++ b/chrome/browser/tab_contents/form_interaction_tab_helper_unittest.cc
@@ -37,7 +37,7 @@
         performance_manager::PerformanceManagerImpl::Create(base::DoNothing());
     registry_ = performance_manager::PerformanceManagerRegistry::Create();
     performance_manager::testing::CreatePageAggregatorAndPassItToGraph();
-    perf_man_->CallOnGraph(
+    performance_manager::PerformanceManagerImpl::CallOnGraph(
         FROM_HERE, base::BindOnce([](performance_manager::Graph* graph) {
           graph->PassToGraph(FormInteractionTabHelper::CreateGraphObserver());
         }));
diff --git a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
index 9cb8304..1c857a1 100644
--- a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
+++ b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
@@ -47,7 +47,16 @@
   }
 }
 
-PerProfileWorkerTaskTracker::~PerProfileWorkerTaskTracker() = default;
+PerProfileWorkerTaskTracker::~PerProfileWorkerTaskTracker() {
+  // Notify the |worker_task_provider_| for all outstanding tasks that are about
+  // to be deleted.
+  for (const auto& kv : dedicated_worker_tasks_)
+    worker_task_provider_->OnWorkerTaskRemoved(kv.second.get());
+  for (const auto& kv : shared_worker_tasks_)
+    worker_task_provider_->OnWorkerTaskRemoved(kv.second.get());
+  for (const auto& kv : service_worker_tasks_)
+    worker_task_provider_->OnWorkerTaskRemoved(kv.second.get());
+}
 
 void PerProfileWorkerTaskTracker::OnWorkerStarted(
     content::DedicatedWorkerId dedicated_worker_id,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 2fe8e42..bceef21 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -124,10 +124,13 @@
     "native_file_system_dialogs.h",
     "navigation_correction_tab_observer.cc",
     "navigation_correction_tab_observer.h",
+    "page_info/chrome_page_info_ui_delegate.cc",
+    "page_info/chrome_page_info_ui_delegate.h",
     "page_info/page_info.cc",
     "page_info/page_info.h",
     "page_info/page_info_ui.cc",
     "page_info/page_info_ui.h",
+    "page_info/page_info_ui_delegate.h",
     "passwords/account_avatar_fetcher.cc",
     "passwords/account_avatar_fetcher.h",
     "passwords/manage_passwords_state.cc",
@@ -1197,6 +1200,8 @@
       "tabs/tab_group_model.h",
       "tabs/tab_menu_model.cc",
       "tabs/tab_menu_model.h",
+      "tabs/tab_menu_model_factory.cc",
+      "tabs/tab_menu_model_factory.h",
       "tabs/tab_network_state.cc",
       "tabs/tab_network_state.h",
       "tabs/tab_renderer_data.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
index 34a5fc7..7d092beb 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -928,7 +928,7 @@
 <translation id="780301667611848630">না থাক</translation>
 <translation id="7810647596859435254">এর মাধ্যমে খুলুন...</translation>
 <translation id="7821588508402923572">আপনি কত ডেটা সেভ করেছেন তা এখানে দেখা যাবে</translation>
-<translation id="7828557259026017104">আপনার ব্রাউজ করা ওয়েবসাইটের মধ্যে তৈরি হওয়া ফাইলগুলিকে 'কুকি' বলা হয়। সাইট আপনার পছন্দগুলি মনে রাখতে, কুকি ব্যবহার করে। অন্যান্য সাইট 'থার্ড-পার্টি কুকি' তৈরি করে। এই সাইটগুলিতে বিজ্ঞাপন এবং ছবির মতো কিছু কন্টেন্ট থাকে, যেগুলি আপনার ভিজিট করা ওয়েবপেজে আপনি দেখতে পান।</translation>
+<translation id="7828557259026017104">আপনার ব্রাউজ করা ওয়েবসাইটের তৈরি করা ফাইলগুলিকে 'কুকি' বলা হয়। সাইট আপনার পছন্দগুলি মনে রাখতে, কুকি ব্যবহার করে। অন্যান্য সাইট 'থার্ড-পার্টি কুকি' তৈরি করে। এই সাইটগুলিতে বিজ্ঞাপন এবং ছবির মতো কিছু কন্টেন্ট থাকে, যেগুলি আপনার ভিজিট করা ওয়েবপেজে আপনি দেখতে পান।</translation>
 <translation id="783819812427904514">ভিডিওটি আনমিউট করুন</translation>
 <translation id="784934925303690534">সময় সীমা</translation>
 <translation id="7851858861565204677">অন্যান্য ডিভাইস</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
index a6632fd..4dd1efe 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">Lain kali</translation>
 <translation id="7810647596859435254">Buka dengan...</translation>
 <translation id="7821588508402923572">Penghematan data Anda akan terlihat di sini</translation>
-<translation id="7828557259026017104">Cookie adalah file yang dibuat oleh situs yang Anda kunjungi. Situs menggunakannya untuk mengingat preferensi Anda. Cookie pihak ketiga dibuat oleh situs lain. Situs ini memiliki beberapa konten, seperti iklan atau gambar, yang dilihat di halaman yang Anda kunjungi.</translation>
+<translation id="7828557259026017104">Cookie adalah file yang dibuat oleh situs yang Anda kunjungi. Situs menggunakannya untuk mengingat preferensi Anda. Cookie pihak ketiga dibuat oleh situs lain. Situs seperti ini adalah pemilik beberapa konten, misalnya iklan atau gambar, yang terlihat di halaman yang Anda kunjungi.</translation>
 <translation id="783819812427904514">Bunyikan video</translation>
 <translation id="784934925303690534">Rentang waktu</translation>
 <translation id="7851858861565204677">Perangkat lain</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
index 37cbdf7f..7617fd0 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">Nei, takk</translation>
 <translation id="7810647596859435254">Opna með…</translation>
 <translation id="7821588508402923572">Gagnasparnaður birtist hér</translation>
-<translation id="7828557259026017104">Fótspor eru skrár sem myndast á vefsvæðum sem þú heimsækir. Svæði geta notað þau til að muna kjörstillingar þínar. Fótspor frá þriðja aðila eru búin til af öðrum vefsvæðum. Þessi vefsvæði eiga eitthvað af efninu, eins og auglýsingar eða myndir, sem þú sérð á vefsíðunni sem þú heimsækir.</translation>
+<translation id="7828557259026017104">Fótspor eru skrár sem myndast á vefsvæðum sem þú heimsækir. Vefsvæði geta notað þau til að muna kjörstillingarnar þínar. Fótspor frá þriðja aðila eru búin til af öðrum vefsvæðum. Þessi vefsvæði eiga eitthvað af efninu, eins og auglýsingar eða myndir, sem þú sérð á vefsíðunni sem þú heimsækir.</translation>
 <translation id="783819812427904514">Kveikja á mynd</translation>
 <translation id="784934925303690534">Tímabil</translation>
 <translation id="7851858861565204677">Önnur tæki</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
index 828c01e..d5e7960 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">いいえ</translation>
 <translation id="7810647596859435254">アプリで開く…</translation>
 <translation id="7821588508402923572">データ節約量がここに表示されます</translation>
-<translation id="7828557259026017104">Cookie は、アクセスしたサイトによって作成されるファイルで、サイトでの設定を保存するために使用されます。2 つ目の「サードパーティの Cookie」は、他のサイト、つまり現在ウェブページに表示されているコンテンツの一部(広告、画像など)を所有しているサイトによって作成されます。</translation>
+<translation id="7828557259026017104">Cookie は、アクセスしたサイトによって作成されるファイルです。サイトではこのファイルを使用して各ユーザーが行なった設定が記憶されます。2 つ目の「サードパーティの Cookie」は、他のサイト、つまり現在ウェブページに表示されているコンテンツの一部(広告、画像など)を所有しているサイトによって作成されます。</translation>
 <translation id="783819812427904514">動画のミュートを解除</translation>
 <translation id="784934925303690534">期間</translation>
 <translation id="7851858861565204677">他のデバイス</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
index 69cc7196..c84c91a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">Жок, рахмат</translation>
 <translation id="7810647596859435254">Төмөнкү менен ачуу…</translation>
 <translation id="7821588508402923572">Үнөмдөлгөн трафик ушул жерде көрүнөт</translation>
-<translation id="7828557259026017104">Cookie файлдары сиз баш баккан вебсайттар түзгөн файлдар. Сайттар аларды жеке параметрлериңизди эстеп калуу үчүн колдонушат. Биринчи тараптын cookie файлдарын башка сайттар түзөт. Ал сайттарга сиз баш баккан веб-баракчада көрсөтүлгөн жарнамалар жана сүрөттөр сыяктуу айрым мазмун таандык.</translation>
+<translation id="7828557259026017104">Cookie файлдары сиз баш баккан вебсайттар түзгөн файлдар. Сайттар аларды жеке параметрлериңизди эстеп калуу үчүн колдонушат. Үчүнчү тараптын cookie файлдарын башка сайттар түзөт. Ал сайттарга сиз баш баккан веб-баракчада көрсөтүлгөн жарнамалар жана сүрөттөр сыяктуу айрым мазмун таандык.</translation>
 <translation id="783819812427904514">Видеонун үнүн чыгаруу</translation>
 <translation id="784934925303690534">Убакыт аралыгы</translation>
 <translation id="7851858861565204677">Башка түзмөктөр</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
index 8d8e3b81f..0b5697e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">Nie, dziękuję</translation>
 <translation id="7810647596859435254">Otwórz za pomocą…</translation>
 <translation id="7821588508402923572">Tutaj będą widoczne informacje o zaoszczędzonych danych</translation>
-<translation id="7828557259026017104">Pliki cookie są tworzone przez odwiedzane strony. Strony zapisują w nich Twoje ustawienia. Pliki cookie innych firm są tworzone przez inne strony. Na tych stronach znajdują się niektóre treści, np. reklamy i obrazy, które wyświetlają się na odwiedzanej stronie.</translation>
+<translation id="7828557259026017104">Pliki cookie są tworzone przez odwiedzane witryny. Witryny zapisują w nich Twoje ustawienia. Pliki cookie innych firm są tworzone przez inne witryny. W tych witrynach znajdują się niektóre treści, np. reklamy i obrazy, które wyświetlają się na odwiedzanej stronie.</translation>
 <translation id="783819812427904514">Wyłącz wyciszenie filmu</translation>
 <translation id="784934925303690534">Zakres czasu</translation>
 <translation id="7851858861565204677">Inne urządzenia</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
index 50cfd0f..92ba2b5 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -927,7 +927,7 @@
 <translation id="780301667611848630">Não</translation>
 <translation id="7810647596859435254">Abrir com…</translation>
 <translation id="7821588508402923572">Sua economia de dados será exibida aqui</translation>
-<translation id="7828557259026017104">Os cookies são arquivos criados pelos sites que você visita, usados por esses sites para lembrar suas preferências. Os cookies de terceiros são criados por outros sites, que possuem uma parte do conteúdo, como anúncios ou imagens, que você vê na página da Web acessada.</translation>
+<translation id="7828557259026017104">Os cookies são arquivos criados pelos sites que você visita, usados por esses sites para lembrar suas preferências. Os cookies de terceiros são criados por outros sites que possuem uma parte do conteúdo, como anúncios ou imagens, que você vê na página da Web acessada.</translation>
 <translation id="783819812427904514">Ativar som do vídeo</translation>
 <translation id="784934925303690534">Período</translation>
 <translation id="7851858861565204677">Outros dispositivos</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
index 45112f2..114edec 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -290,6 +290,7 @@
 <translation id="3058498974290601450">సెట్టింగ్‌లలో ఎప్పుడైనా మీరు సింక్‌ను ఆన్ చేయవచ్చు</translation>
 <translation id="3060635849835183725">{BOOKMARKS_COUNT,plural, =1{<ph name="BOOKMARKS_COUNT_ONE" /> బుక్‌మార్క్}other{<ph name="BOOKMARKS_COUNT_MANY" /> బుక్‌మార్క్‌లు}}</translation>
 <translation id="3089395242580810162">అజ్ఞాత ట్యాబ్‌లో తెరువు</translation>
+<translation id="3114012059975132928">వీడియో ప్లేయర్</translation>
 <translation id="3123473560110926937">కొన్ని సైట్‌లలో బ్లాక్ చేయబడింది</translation>
 <translation id="3123734510202723619">ప్రకటనలు</translation>
 <translation id="3137521801621304719">అజ్ఞాత మోడ్ నుండి నిష్క్రమించండి</translation>
@@ -357,6 +358,7 @@
 <translation id="3587482841069643663">మొత్తం</translation>
 <translation id="358794129225322306">పలు ఫైల్‌లను ఆటోమేటిక్‌గా డౌన్‌లోడ్ చేయడం కోసం సైట్‌ని అనుమతించండి.</translation>
 <translation id="3590487821116122040">Chrome ముఖ్యమైనదిగా భావించని సైట్ నిల్వ (ఉదా. సేవ్ చేసిన సెట్టింగ్‌లు లేని సైట్‌లు లేదా మీరు తరచుగా సందర్శించని సైట్‌లు)</translation>
+<translation id="3594780231884063836">వీడియోను మ్యూట్ చేయండి</translation>
 <translation id="3596414637720633074">అజ్ఞాతంలో థర్డ్-పార్టీ కుక్కీలను బ్లాక్ చేయి</translation>
 <translation id="3599863153486145794">సైన్ ఇన్ చేసిన అన్ని పరికరాల నుండి చరిత్రను తొలగిస్తుంది. మీ Google ఖాతా <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />లో ఇతర రూపాల్లో ఉన్న బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation>
 <translation id="3600792891314830896">ధ్వనిని ప్లే చేసే సైట్‌లను మ్యూట్ చేస్తుంది</translation>
@@ -611,6 +613,7 @@
 <translation id="5456381639095306749">పేజీని డౌన్‌లోడ్ చేయండి</translation>
 <translation id="548278423535722844">మ్యాప్స్ యాప్‌లో తెరువు</translation>
 <translation id="5487521232677179737">డేటాని తీసివేయి</translation>
+<translation id="5489227211564503167"><ph name="TOTAL_TIME" />లో <ph name="ELAPSED_TIME" /> సమయం గడిచిపోయింది.</translation>
 <translation id="5494752089476963479">అనుచితమైన లేదా తప్పుదారి పట్టించే ప్రకటనలను చూపించే సైట్‌లలో ప్రకటనలను బ్లాక్ చేస్తుంది</translation>
 <translation id="5500777121964041360">మీ స్థానంలో అందుబాటులో ఉండకపోవచ్చు</translation>
 <translation id="5505264765875738116">నోటిఫికేషన్‌లను పంపడానికి సైట్‌లు అడగవు</translation>
@@ -670,6 +673,7 @@
 <translation id="5864419784173784555">మరొక డౌన్‌లోడ్ కోసం వేచి ఉంది…</translation>
 <translation id="5865733239029070421">Googleకు ఆటోమేటిక్‌గా వినియోగ గణాంకాలను, క్రాష్ నివేదికలను పంపుతుంది</translation>
 <translation id="5869522115854928033">సేవ్  చేసిన పాస్‌వర్డ్‌లు</translation>
+<translation id="5876056640971328065">వీడియోను పాజ్ చేయి</translation>
 <translation id="5884076754568147479">టాస్క్‌లు పూర్తి చేయడంలో మీకు సహాయపడటానికి, మీరు అసిస్టెంట్‌ను ఉపయోగించే సైట్‌ల URLలు అలాగే వాటిలోని కంటెంట్‌ను, వీటితో పాటు మీరు అసిస్టెంట్ ద్వారా సమర్పించే సమాచారాన్ని Google పొందుతుంది</translation>
 <translation id="5902828464777634901">కుక్కీలతో సహా ఈ వెబ్‌సైట్ ద్వారా నిల్వ చేయబడిన మొత్తం స్థానిక డేటా తొలగించబడుతుంది.</translation>
 <translation id="5919204609460789179">సింక్‌ను ప్రారంభించడానికి <ph name="PRODUCT_NAME" />ని అప్‌డేట్ చేయండి</translation>
@@ -732,6 +736,7 @@
 <translation id="6381421346744604172">వెబ్‌సైట్‌లు ముదురు రంగులో చేయి</translation>
 <translation id="6388207532828177975">క్లియర్ చేసి, రీసెట్ చేయి</translation>
 <translation id="6395288395575013217">లింక్</translation>
+<translation id="6397616442223433927">తిరిగి ఆన్‌లైన్‌లోకి వచ్చింది</translation>
 <translation id="6404511346730675251">బుక్‌మార్క్‌ను సవరించు</translation>
 <translation id="6406506848690869874">Sync</translation>
 <translation id="6410973561433500075"><ph name="DOMAIN" /> నుండి AR మోడ్‌లోకి ప్రవేశించాలా?</translation>
@@ -800,6 +805,7 @@
 <translation id="6846298663435243399">లోడ్ అవుతోంది...</translation>
 <translation id="6850409657436465440">మీ డౌన్‌లోడ్‌‌ ఇప్పటికీ జరుగుతోంది</translation>
 <translation id="6850830437481525139"><ph name="TAB_COUNT" /> ట్యాబ్‌లు మూసివేయబడ్డాయి</translation>
+<translation id="6864395892908308021">ఈ పరికరం NFCను రీడ్ చేయదు</translation>
 <translation id="6864459304226931083">చిత్రాన్ని డౌన్‌లోడ్ చేయి</translation>
 <translation id="6865313869410766144">స్వీయపూర్తి ఫారమ్ డేటా</translation>
 <translation id="6884306546558072722">ఆఫ్‌లైన్‌లో అన్వేషణను కొనసాగించండి</translation>
@@ -921,6 +927,7 @@
 <translation id="7810647596859435254">దీనితో తెరువు…</translation>
 <translation id="7821588508402923572">మీ డేటా పొదుపులు ఇక్కడ కనిపిస్తాయి</translation>
 <translation id="7828557259026017104">మీరు సందర్శించే వెబ్‌సైట్‌లు రూపొందించిన ఫైల్‌లను కుక్కీలు అంటారు. మీ ప్రాధాన్యతలను గుర్తుంచుకోవడానికి సైట్‌లు వాటిని ఉపయోగిస్తాయి. ఇతర సైట్‌లు రూపొందించిన కుక్కీలను థర్డ్-పార్టీ కుక్కీలు అంటారు. మీరు సందర్శించే వెబ్ పేజీలో మీరు చూసే యాడ్‌లు లేదా ఇమేజ్‌ల లాంటి, కొంత కంటెంట్‌ను ఈ సైట్‌లు స్వంతంగా కలిగి ఉంటాయి.</translation>
+<translation id="783819812427904514">వీడియోను అన్‌మ్యూట్ చేయండి</translation>
 <translation id="784934925303690534">సమయ పరిధి</translation>
 <translation id="7851858861565204677">ఇతర పరికరాలు</translation>
 <translation id="7875915731392087153">ఇమెయిల్‌ను సృష్టించండి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
index 33482c6..5cab7aa 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">ไม่ ขอบคุณ</translation>
 <translation id="7810647596859435254">เปิดด้วย…</translation>
 <translation id="7821588508402923572">การประหยัดอินเทอร์เน็ตของคุณจะแสดงที่นี่</translation>
-<translation id="7828557259026017104">คุกกี้คือไฟล์ที่เว็บไซต์ต่างๆ ที่คุณเข้าชมสร้างขึ้น เว็บไซต์ใช้คุกกี้เพื่อจดจำสิ่งที่คุณต้องการ คุกกี้ของบุคคลที่สามซึ่งเว็บไซต์อื่นๆ เป็นผู้สร้างขึ้น เว็บไซต์เหล่านี้เป็นเจ้าของเนื้อหาบางอย่าง เช่น โฆษณาหรือรูปภาพที่คุณเห็นในหน้าเว็บที่เข้าชม</translation>
+<translation id="7828557259026017104">คุกกี้คือไฟล์ที่เว็บไซต์ต่างๆ ที่คุณเข้าชมสร้างขึ้น เว็บไซต์ใช้คุกกี้เพื่อจดจำข้อมูลการท่องเว็บของคุณ คุกกี้ของบุคคลที่สามซึ่งเว็บไซต์อื่นๆ เป็นผู้สร้างขึ้น เว็บไซต์เหล่านี้เป็นเจ้าของเนื้อหาบางอย่าง เช่น โฆษณาหรือรูปภาพที่คุณเห็นในหน้าเว็บที่เข้าชม</translation>
 <translation id="783819812427904514">เปิดเสียงวิดีโอ</translation>
 <translation id="784934925303690534">ช่วงเวลา</translation>
 <translation id="7851858861565204677">อุปกรณ์อื่นๆ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
index 17ec4d2..71382f8 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -925,7 +925,7 @@
 <translation id="780301667611848630">نہیں شکریہ</translation>
 <translation id="7810647596859435254">اس کے ساتھ کھولیں…</translation>
 <translation id="7821588508402923572">آپ کے ڈیٹا کی بچتیں یہاں دکھائی دیں گی</translation>
-<translation id="7828557259026017104">‏کوکیز ایسی فائلز ہوتی ہیں جنہیں آپ کی ملاحظہ کی جانے والی ویب سائٹس تخلیق کرتی ہیں۔ Sites آپ کی ترجیحات کو یاد رکھنے کیلئے ان کا استعمال کرتی ہیں۔ فریق ثالث کوکیز دیگر سائٹس کے ذریعے تخلیق کی جاتی ہیں۔ یہ سائٹس کچھ مواد کی مالک ہوتی ہیں، جیسے اشتہارات یا تصاویر جنہیں آپ ملاحظہ کی جانے والی ویب صفحہ پر دیکھتے ہیں۔</translation>
+<translation id="7828557259026017104">کوکیز ایسی فائلز ہوتی ہیں جنہیں آپ کی ملاحظہ کی جانے والی ویب سائٹس تخلیق کرتی ہیں۔ سائٹس آپ کی ترجیحات کو یاد رکھنے کیلئے ان کا استعمال کرتی ہیں۔ فریق ثالث کوکیز دیگر سائٹس کے ذریعے تخلیق کی جاتی ہیں۔ یہ سائٹس کچھ مواد کی مالک ہوتی ہیں، جیسے اشتہارات یا تصاویر جنہیں آپ ملاحظہ کی جانے والی ویب صفحہ پر دیکھتے ہیں۔</translation>
 <translation id="783819812427904514">ویڈیو کی آواز چلائیں</translation>
 <translation id="784934925303690534">وقت کی حد</translation>
 <translation id="7851858861565204677">دیگر آلات</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
index 6d0bd54..97ec42e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">Kerak emas</translation>
 <translation id="7810647596859435254">Quyidagi bilan ochish…</translation>
 <translation id="7821588508402923572">Tejalgan trafik shu yerda paydo bo‘ladi</translation>
-<translation id="7828557259026017104">Cookie fayllar saytlarga tashrif buyurilganda yaratiladigan fayllardir. Saytlar ulardan afzalliklaringizni eslab qolishda foydalanadi. Tashqi cookie fayllar boshqa saytlar tomonidan yaratiladi. Bunday saytlarga ochilgan sahifadagi kontent, reklama yoki rasmlar tegishli boʻlishi mumkin.</translation>
+<translation id="7828557259026017104">Cookie fayllar saytlarga tashrif buyurilganda yaratiladigan fayllardir. Saytlar ulardan axborotingizni eslab qolishda foydalanadi. Tashqi cookie fayllar boshqa saytlar tomonidan yaratiladi. Bunday saytlarga ochilgan sahifadagi kontent, reklama yoki rasmlar tegishli boʻlishi mumkin.</translation>
 <translation id="783819812427904514">Video ovozini yoqish</translation>
 <translation id="784934925303690534">Vaqt diapazoni</translation>
 <translation id="7851858861565204677">Boshqa qurilmalar</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
index b2c3028..98bc9a1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -926,7 +926,7 @@
 <translation id="780301667611848630">不用了,谢谢</translation>
 <translation id="7810647596859435254">打开方式…</translation>
 <translation id="7821588508402923572">您的数据流量节省情况将显示在这里</translation>
-<translation id="7828557259026017104">Cookie 是由您访问过的网站创建的文件,供网站用来记住您的偏好;第三方 Cookie 是由其他网站创建而成,这些网站拥有您在所访问网页上看到的部分内容(比如广告或图片)。</translation>
+<translation id="7828557259026017104">Cookie 是由您访问过的网站创建的文件,供网站用来记住您的偏好;第三方 Cookie 是由其他网站创建而成,这些网站是您在所访问网页上看到的部分内容(比如广告或图片)的所有方。</translation>
 <translation id="783819812427904514">将视频取消静音</translation>
 <translation id="784934925303690534">时间范围</translation>
 <translation id="7851858861565204677">来自其他设备的同步</translation>
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc
index a52a7e641..5d1b287 100644
--- a/chrome/browser/ui/app_list/search/omnibox_provider.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/app_list/search/omnibox_result.h"
 #include "components/omnibox/browser/autocomplete_classifier.h"
-#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
 #include "url/gurl.h"
@@ -76,7 +75,10 @@
   SwapResults(&new_results);
 }
 
-void OmniboxProvider::OnResultChanged(bool default_match_changed) {
+void OmniboxProvider::OnResultChanged(AutocompleteController* controller,
+                                      bool default_match_changed) {
+  DCHECK(controller == controller_.get());
+
   // Record the query latency.
   RecordQueryLatencyHistogram();
 
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.h b/chrome/browser/ui/app_list/search/omnibox_provider.h
index c021bbf..a84f66e 100644
--- a/chrome/browser/ui/app_list/search/omnibox_provider.h
+++ b/chrome/browser/ui/app_list/search/omnibox_provider.h
@@ -9,7 +9,7 @@
 
 #include "base/macros.h"
 #include "chrome/browser/ui/app_list/search/search_provider.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
+#include "components/omnibox/browser/autocomplete_controller.h"
 
 class AppListControllerDelegate;
 class AutocompleteController;
@@ -20,7 +20,7 @@
 
 // OmniboxProvider wraps AutocompleteController to provide omnibox results.
 class OmniboxProvider : public SearchProvider,
-                        public AutocompleteControllerDelegate {
+                        public AutocompleteController::Observer {
  public:
   explicit OmniboxProvider(Profile* profile,
                            AppListControllerDelegate* list_controller);
@@ -33,8 +33,9 @@
   // Populates result list from AutocompleteResult.
   void PopulateFromACResult(const AutocompleteResult& result);
 
-  // AutocompleteControllerDelegate overrides:
-  void OnResultChanged(bool default_match_changed) override;
+  // AutocompleteController::Observer overrides:
+  void OnResultChanged(AutocompleteController* controller,
+                       bool default_match_changed) override;
 
   void RecordQueryLatencyHistogram();
 
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
index 0d63a55..f2968e36 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
@@ -54,12 +54,21 @@
     return;
 
   if (old_contents) {
-    std::string app_id = launcher_controller_helper_->GetAppID(old_contents);
+    auto* window = old_contents->GetNativeView();
+
+    // Get the app_id from the existed instance first. If there is no record for
+    // the window, get the app_id from contents. Because when Chrome app open
+    // method is changed from windows to tabs, the app_id could be changed based
+    // on the URL, e.g. google photos, which might cause instance app_id
+    // inconsistent DCHECK error.
+    std::string app_id = proxy_->InstanceRegistry().GetShelfId(window).app_id;
+    if (app_id.empty())
+      app_id = launcher_controller_helper_->GetAppID(old_contents);
+
     // If app_id is empty, we should not set it as inactive because this is
     // Chrome's tab.
     if (!app_id.empty()) {
-      apps::InstanceState state =
-          proxy_->InstanceRegistry().GetState(old_contents->GetNativeView());
+      apps::InstanceState state = proxy_->InstanceRegistry().GetState(window);
       // If the app has been inactive, we don't need to update the instance.
       if ((state & apps::InstanceState::kActive) !=
           apps::InstanceState::kUnknown) {
@@ -71,12 +80,22 @@
   }
 
   if (new_contents) {
+    auto* window = GetWindow(new_contents);
+
+    // Get the app_id from the existed instance first. If there is no record for
+    // the window, get the app_id from contents. Because when Chrome app open
+    // method is changed from windows to tabs, the app_id could be changed based
+    // on the URL, e.g. google photos, which might cause instance app_id
+    // inconsistent DCHECK error.
+    std::string app_id = proxy_->InstanceRegistry().GetShelfId(window).app_id;
+    if (app_id.empty())
+      app_id = GetAppId(new_contents);
+
     // If the app is active, it should be started, running, and visible.
     apps::InstanceState state = static_cast<apps::InstanceState>(
         apps::InstanceState::kStarted | apps::InstanceState::kRunning |
         apps::InstanceState::kActive | apps::InstanceState::kVisible);
-    OnInstances(GetAppId(new_contents), GetWindow(new_contents), std::string(),
-                state);
+    OnInstances(app_id, window, std::string(), state);
   }
 }
 
diff --git a/chrome/browser/ui/ash/tablet_mode_transition_interactive_uitest.cc b/chrome/browser/ui/ash/tablet_mode_transition_interactive_uitest.cc
index f3fa3de..1377a4b 100644
--- a/chrome/browser/ui/ash/tablet_mode_transition_interactive_uitest.cc
+++ b/chrome/browser/ui/ash/tablet_mode_transition_interactive_uitest.cc
@@ -61,7 +61,9 @@
   DISALLOW_COPY_AND_ASSIGN(TabletModeTransitionTest);
 };
 
-IN_PROC_BROWSER_TEST_F(TabletModeTransitionTest, EnterExit) {
+// Flaky possibly due to https://crbug.com/1054489
+// TODO(sammiequon, mukai): re-enable this. See also https://crbug.com/1057868
+IN_PROC_BROWSER_TEST_F(TabletModeTransitionTest, DISABLED_EnterExit) {
   // Activate the first window. The top window is the only window which animates
   // and is the one we should check to see if the tablet animation has finished.
   Browser* browser = BrowserList::GetInstance()->GetLastActive();
diff --git a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc
index 6e2ccd1..b550cd6 100644
--- a/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc
+++ b/chrome/browser/ui/bluetooth/bluetooth_chooser_controller_unittest.cc
@@ -7,32 +7,13 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chooser_controller/mock_chooser_controller_view.h"
 #include "chrome/browser/ui/bluetooth/bluetooth_chooser_controller.h"
 #include "chrome/grit/generated_resources.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 
-namespace {
-
-class MockBluetoothChooserView : public ChooserController::View {
- public:
-  MockBluetoothChooserView() {}
-
-  // ChooserController::View:
-  MOCK_METHOD0(OnOptionsInitialized, void());
-  MOCK_METHOD1(OnOptionAdded, void(size_t index));
-  MOCK_METHOD1(OnOptionRemoved, void(size_t index));
-  MOCK_METHOD1(OnOptionUpdated, void(size_t index));
-  MOCK_METHOD1(OnAdapterEnabledChanged, void(bool enabled));
-  MOCK_METHOD1(OnRefreshStateChanged, void(bool enabled));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockBluetoothChooserView);
-};
-
-}  // namespace
-
 class BluetoothChooserControllerTest : public testing::Test {
  public:
   BluetoothChooserControllerTest()
@@ -51,7 +32,7 @@
   }
 
   BluetoothChooserController bluetooth_chooser_controller_;
-  MockBluetoothChooserView mock_bluetooth_chooser_view_;
+  MockChooserControllerView mock_bluetooth_chooser_view_;
   content::BluetoothChooser::Event last_event_;
   std::string last_device_id_;
 
diff --git a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller_unittest.cc b/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller_unittest.cc
index 54aeae5..e6893fc7 100644
--- a/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller_unittest.cc
+++ b/chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller_unittest.cc
@@ -7,32 +7,13 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chooser_controller/mock_chooser_controller_view.h"
 #include "chrome/browser/ui/bluetooth/bluetooth_scanning_prompt_controller.h"
 #include "chrome/grit/generated_resources.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 
-namespace {
-
-class MockBluetoothScanningPromptView : public ChooserController::View {
- public:
-  MockBluetoothScanningPromptView() {}
-
-  // ChooserController::View:
-  MOCK_METHOD0(OnOptionsInitialized, void());
-  MOCK_METHOD1(OnOptionAdded, void(size_t index));
-  MOCK_METHOD1(OnOptionRemoved, void(size_t index));
-  MOCK_METHOD1(OnOptionUpdated, void(size_t index));
-  MOCK_METHOD1(OnAdapterEnabledChanged, void(bool enabled));
-  MOCK_METHOD1(OnRefreshStateChanged, void(bool enabled));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockBluetoothScanningPromptView);
-};
-
-}  // namespace
-
 class BluetoothScanningPromptControllerTest : public testing::Test {
  public:
   BluetoothScanningPromptControllerTest()
@@ -52,7 +33,7 @@
   }
 
   BluetoothScanningPromptController bluetooth_scanning_prompt_controller_;
-  MockBluetoothScanningPromptView mock_bluetooth_scanning_prompt_view_;
+  MockChooserControllerView mock_bluetooth_scanning_prompt_view_;
   content::BluetoothScanningPrompt::Event last_event_;
 
  private:
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 41c6116..0829ab0 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -89,6 +89,8 @@
 
 namespace {
 
+bool allow_os_settings_in_tab = false;
+
 // Returns true if the specified Browser can open tabs. Not all Browsers support
 // multiple tabs, such as app frames and popups. This function returns false for
 // those types of Browser.
@@ -536,11 +538,9 @@
   }
 #if defined(OS_CHROMEOS)
   if (source_browser) {
-    // If OS Settings is accessed in any means other than explicitly typing the
-    // URL into the URL bar, open OS Settings in its own standalone surface.
+    // Open OS settings in PWA, even when user types in URL bar.
     if (params->url.host() == chrome::kChromeUIOSSettingsHost &&
-        !PageTransitionCoreTypeIs(params->transition,
-                                  ui::PageTransition::PAGE_TRANSITION_TYPED)) {
+        !allow_os_settings_in_tab) {
       chrome::SettingsWindowManager* settings_window_manager =
           chrome::SettingsWindowManager::GetInstance();
       if (!settings_window_manager->IsSettingsBrowser(source_browser)) {
@@ -801,3 +801,7 @@
 
   return IsHostAllowedInIncognito(url);
 }
+
+void SetAllowOsSettingsInTabForTesting(bool is_allowed) {
+  allow_os_settings_in_tab = is_allowed;
+}
diff --git a/chrome/browser/ui/browser_navigator.h b/chrome/browser/ui/browser_navigator.h
index b2fcc42..0790bba7 100644
--- a/chrome/browser/ui/browser_navigator.h
+++ b/chrome/browser/ui/browser_navigator.h
@@ -20,4 +20,8 @@
 bool IsURLAllowedInIncognito(const GURL& url,
                              content::BrowserContext* browser_context);
 
+// Allows browsertests to open OS settings in a tab. Real users can only open
+// settings in a system app.
+void SetAllowOsSettingsInTabForTesting(bool is_allowed);
+
 #endif  // CHROME_BROWSER_UI_BROWSER_NAVIGATOR_H_
diff --git a/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc b/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc
index facda6f..0fb33f9 100644
--- a/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc
+++ b/chrome/browser/ui/browser_navigator_browsertest_chromeos.cc
@@ -38,17 +38,13 @@
 
 using BrowserNavigatorTestChromeOS = BrowserNavigatorTest;
 
-// This test verifies that the OS Settings page isn't opened in the incognito
-// window.
-IN_PROC_BROWSER_TEST_F(BrowserNavigatorTestChromeOS,
-                       Disposition_OSSettings_UseNonIncognitoWindow) {
-  RunUseNonIncognitoWindowTest(GURL(chrome::kChromeUIOSSettingsURL),
-                               ui::PageTransition::PAGE_TRANSITION_TYPED);
-}
-
 // Verifies that the OS settings page opens in a standalone surface when
 // accessed via link or url.
 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTestChromeOS, NavigateToOSSettings) {
+  // By default, browsertests open settings in a browser tab. For this test, we
+  // verify that if this flag is not set, settings opens in the settings app.
+  // This simulates the default case users see.
+  SetAllowOsSettingsInTabForTesting(false);
   // Install the Settings App.
   web_app::WebAppProvider::Get(browser()->profile())
       ->system_web_app_manager()
@@ -63,10 +59,10 @@
   params.transition = ui::PageTransition::PAGE_TRANSITION_TYPED;
   Navigate(&params);
 
-  // Verify that navigating to chrome://os-settings/ via typing causes the
-  // browser itself to navigate to the OS Settings page.
-  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
-  EXPECT_EQ(GURL("chrome://os-settings/"),
+  // Verify that navigating to chrome://os-settings/ via typing does not cause
+  // the browser itself to navigate to the OS Settings page.
+  EXPECT_NE(1u, chrome::GetTotalBrowserCount());
+  EXPECT_NE(GURL("chrome://os-settings/"),
             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
 
   // Navigate to OS Settings page via clicking a link on another page.
diff --git a/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc
new file mode 100644
index 0000000..94a809b
--- /dev/null
+++ b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.cc
@@ -0,0 +1,30 @@
+// Copyright 2020 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.
+
+#include "chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h"
+
+#include "build/build_config.h"
+#include "chrome/browser/permissions/permission_manager_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/pref_names.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+#include "components/permissions/permission_manager.h"
+#include "components/prefs/pref_service.h"
+#include "url/gurl.h"
+
+ChromePageInfoUiDelegate::ChromePageInfoUiDelegate(Profile* profile)
+    : profile_(profile) {}
+
+permissions::PermissionResult ChromePageInfoUiDelegate::GetPermissionStatus(
+    ContentSettingsType type,
+    const GURL& url) {
+  return PermissionManagerFactory::GetForProfile(profile_)->GetPermissionStatus(
+      type, url, url);
+}
+
+#if !defined(OS_ANDROID)
+bool ChromePageInfoUiDelegate::IsBlockAutoPlayEnabled() {
+  return profile_->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled);
+}
+#endif
diff --git a/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h
new file mode 100644
index 0000000..05317cc
--- /dev/null
+++ b/chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h
@@ -0,0 +1,29 @@
+// Copyright 2020 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.
+
+#ifndef CHROME_BROWSER_UI_PAGE_INFO_CHROME_PAGE_INFO_UI_DELEGATE_H_
+#define CHROME_BROWSER_UI_PAGE_INFO_CHROME_PAGE_INFO_UI_DELEGATE_H_
+
+#include "build/build_config.h"
+#include "chrome/browser/ui/page_info/page_info_ui_delegate.h"
+
+class Profile;
+
+class ChromePageInfoUiDelegate : public PageInfoUiDelegate {
+ public:
+  explicit ChromePageInfoUiDelegate(Profile* profile);
+  ~ChromePageInfoUiDelegate() = default;
+
+  // PageInfoUiDelegate implementation
+#if !defined(OS_ANDROID)
+  bool IsBlockAutoPlayEnabled() override;
+#endif
+  permissions::PermissionResult GetPermissionStatus(ContentSettingsType type,
+                                                    const GURL& url) override;
+
+ private:
+  Profile* profile_;
+};
+
+#endif  // CHROME_BROWSER_UI_PAGE_INFO_CHROME_PAGE_INFO_UI_DELEGATE_H_
diff --git a/chrome/browser/ui/page_info/page_info_ui.cc b/chrome/browser/ui/page_info/page_info_ui.cc
index 42c08de6..6cebc288 100644
--- a/chrome/browser/ui/page_info/page_info_ui.cc
+++ b/chrome/browser/ui/page_info/page_info_ui.cc
@@ -12,10 +12,7 @@
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
-#include "chrome/browser/permissions/permission_manager_factory.h"
-#include "chrome/common/chrome_features.h"
-#include "chrome/common/chrome_switches.h"
+#include "chrome/browser/ui/page_info/page_info_ui_delegate.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/permissions/permission_manager.h"
 #include "components/permissions/permission_result.h"
@@ -34,8 +31,6 @@
 #include "chrome/browser/android/android_theme_resources.h"
 #else
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "media/base/media_switches.h"
 #include "ui/gfx/color_palette.h"
@@ -225,8 +220,7 @@
 
 // Gets the actual setting for a ContentSettingType, taking into account what
 // the default setting value is and whether Html5ByDefault is enabled.
-ContentSetting GetEffectiveSetting(Profile* profile,
-                                   ContentSettingsType type,
+ContentSetting GetEffectiveSetting(ContentSettingsType type,
                                    ContentSetting setting,
                                    ContentSetting default_setting) {
   ContentSetting effective_setting = setting;
@@ -388,13 +382,13 @@
 
 // static
 base::string16 PageInfoUI::PermissionActionToUIString(
-    Profile* profile,
+    PageInfoUiDelegate* delegate,
     ContentSettingsType type,
     ContentSetting setting,
     ContentSetting default_setting,
     content_settings::SettingSource source) {
   ContentSetting effective_setting =
-      GetEffectiveSetting(profile, type, setting, default_setting);
+      GetEffectiveSetting(type, setting, default_setting);
   const int* button_text_ids = NULL;
   switch (source) {
     case content_settings::SETTING_SOURCE_USER:
@@ -406,7 +400,7 @@
           // sound default setting is ALLOW, we will return a custom string
           // indicating that Chrome is controlling autoplay and sound
           // automatically.
-          if (profile->GetPrefs()->GetBoolean(prefs::kBlockAutoplayEnabled) &&
+          if (delegate->IsBlockAutoPlayEnabled() &&
               effective_setting == ContentSetting::CONTENT_SETTING_ALLOW) {
             return l10n_util::GetStringUTF16(
                 IDS_PAGE_INFO_BUTTON_TEXT_AUTOMATIC_BY_DEFAULT);
@@ -446,11 +440,11 @@
 
 // static
 base::string16 PageInfoUI::PermissionDecisionReasonToUIString(
-    Profile* profile,
+    PageInfoUiDelegate* delegate,
     const PageInfoUI::PermissionInfo& permission,
     const GURL& url) {
   ContentSetting effective_setting = GetEffectiveSetting(
-      profile, permission.type, permission.setting, permission.default_setting);
+      permission.type, permission.setting, permission.default_setting);
   int message_id = kInvalidResourceID;
   switch (permission.source) {
     case content_settings::SettingSource::SETTING_SOURCE_POLICY:
@@ -466,8 +460,7 @@
   if (permission.setting == CONTENT_SETTING_BLOCK &&
       permissions::PermissionUtil::IsPermission(permission.type)) {
     permissions::PermissionResult permission_result =
-        PermissionManagerFactory::GetForProfile(profile)->GetPermissionStatus(
-            permission.type, url, url);
+        delegate->GetPermissionStatus(permission.type, url);
     switch (permission_result.source) {
       case permissions::PermissionStatusSource::MULTIPLE_DISMISSALS:
         message_id = IDS_PAGE_INFO_PERMISSION_AUTOMATICALLY_BLOCKED;
diff --git a/chrome/browser/ui/page_info/page_info_ui.h b/chrome/browser/ui/page_info/page_info_ui.h
index fa91f22d..4f11b97 100644
--- a/chrome/browser/ui/page_info/page_info_ui.h
+++ b/chrome/browser/ui/page_info/page_info_ui.h
@@ -23,8 +23,8 @@
 #endif
 
 class GURL;
-class Profile;
 class PageInfo;
+class PageInfoUiDelegate;
 
 namespace net {
 class X509Certificate;
@@ -97,7 +97,7 @@
     ContentSetting default_setting;
     // The settings source e.g. user, extensions, policy, ... .
     content_settings::SettingSource source;
-    // Whether the profile is off the record.
+    // Whether we're in incognito mode.
     bool is_incognito;
   };
 
@@ -179,7 +179,7 @@
   // "Blocked by default". If |setting| is default, specify the actual default
   // setting using |default_setting|.
   static base::string16 PermissionActionToUIString(
-      Profile* profile,
+      PageInfoUiDelegate* delegate,
       ContentSettingsType type,
       ContentSetting setting,
       ContentSetting default_setting,
@@ -188,7 +188,7 @@
   // Returns a string indicating whether the permission was blocked via an
   // extension, enterprise policy, or embargo.
   static base::string16 PermissionDecisionReasonToUIString(
-      Profile* profile,
+      PageInfoUiDelegate* delegate,
       const PermissionInfo& permission,
       const GURL& url);
 
diff --git a/chrome/browser/ui/page_info/page_info_ui_delegate.h b/chrome/browser/ui/page_info/page_info_ui_delegate.h
new file mode 100644
index 0000000..7ce69098
--- /dev/null
+++ b/chrome/browser/ui/page_info/page_info_ui_delegate.h
@@ -0,0 +1,24 @@
+// Copyright 2020 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.
+
+#ifndef CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_UI_DELEGATE_H_
+#define CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_UI_DELEGATE_H_
+
+#include "build/build_config.h"
+#include "components/content_settings/core/common/content_settings_types.h"
+#include "components/permissions/permission_result.h"
+#include "url/gurl.h"
+
+class PageInfoUiDelegate {
+ public:
+  ~PageInfoUiDelegate() = default;
+#if !defined(OS_ANDROID)
+  virtual bool IsBlockAutoPlayEnabled() = 0;
+#endif
+  virtual permissions::PermissionResult GetPermissionStatus(
+      ContentSettingsType type,
+      const GURL& url) = 0;
+};
+
+#endif  // CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_UI_DELEGATE_H_
diff --git a/chrome/browser/ui/page_info/page_info_unittest.cc b/chrome/browser/ui/page_info/page_info_unittest.cc
index 48f6bfb..4a1d9ff 100644
--- a/chrome/browser/ui/page_info/page_info_unittest.cc
+++ b/chrome/browser/ui/page_info/page_info_unittest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/infobars/mock_infobar_service.h"
 #include "chrome/browser/ssl/stateful_ssl_host_state_delegate_factory.h"
 #include "chrome/browser/ssl/tls_deprecation_test_utils.h"
+#include "chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h"
 #include "chrome/browser/ui/page_info/page_info_ui.h"
 #include "chrome/browser/usb/usb_chooser_context.h"
 #include "chrome/browser/usb/usb_chooser_context_factory.h"
@@ -1435,14 +1436,16 @@
   }
 
   base::string16 GetDefaultSoundSettingString() {
+    auto delegate = ChromePageInfoUiDelegate(profile());
     return PageInfoUI::PermissionActionToUIString(
-        profile(), ContentSettingsType::SOUND, CONTENT_SETTING_DEFAULT,
+        &delegate, ContentSettingsType::SOUND, CONTENT_SETTING_DEFAULT,
         default_setting_, content_settings::SettingSource::SETTING_SOURCE_USER);
   }
 
   base::string16 GetSoundSettingString(ContentSetting setting) {
+    auto delegate = ChromePageInfoUiDelegate(profile());
     return PageInfoUI::PermissionActionToUIString(
-        profile(), ContentSettingsType::SOUND, setting, default_setting_,
+        &delegate, ContentSettingsType::SOUND, setting, default_setting_,
         content_settings::SettingSource::SETTING_SOURCE_USER);
   }
 
@@ -1530,10 +1533,11 @@
 // This test checks that the string for a permission dropdown that is not the
 // sound setting is unaffected.
 TEST_F(UnifiedAutoplaySoundSettingsPageInfoTest, NotSoundSetting_Noop) {
+  auto delegate = ChromePageInfoUiDelegate(profile());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_PAGE_INFO_BUTTON_TEXT_ALLOWED_BY_DEFAULT),
       PageInfoUI::PermissionActionToUIString(
-          profile(), ContentSettingsType::ADS, CONTENT_SETTING_DEFAULT,
+          &delegate, ContentSettingsType::ADS, CONTENT_SETTING_DEFAULT,
           CONTENT_SETTING_ALLOW,
           content_settings::SettingSource::SETTING_SOURCE_USER));
 }
diff --git a/chrome/browser/ui/page_info/permission_menu_model.cc b/chrome/browser/ui/page_info/permission_menu_model.cc
index d38e05c..af2828d 100644
--- a/chrome/browser/ui/page_info/permission_menu_model.cc
+++ b/chrome/browser/ui/page_info/permission_menu_model.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h"
 #include "chrome/common/chrome_features.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/common/origin_util.h"
@@ -29,8 +30,9 @@
   // The Material UI for site settings uses comboboxes instead of menubuttons,
   // which means the elements of the menu themselves have to be shorter, instead
   // of simply setting a shorter label on the menubutton.
+  auto delegate = ChromePageInfoUiDelegate(profile);
   label = PageInfoUI::PermissionActionToUIString(
-      profile, permission_.type, CONTENT_SETTING_DEFAULT,
+      &delegate, permission_.type, CONTENT_SETTING_DEFAULT,
       permission_.default_setting, permission_.source);
 
   AddCheckItem(CONTENT_SETTING_DEFAULT, label);
@@ -38,14 +40,15 @@
   // Retrieve the string to show for allowing the permission.
   if (ShouldShowAllow(url)) {
     label = PageInfoUI::PermissionActionToUIString(
-        profile, permission_.type, CONTENT_SETTING_ALLOW,
+        &delegate, permission_.type, CONTENT_SETTING_ALLOW,
         permission_.default_setting, permission_.source);
     AddCheckItem(CONTENT_SETTING_ALLOW, label);
   }
 
   // Retrieve the string to show for blocking the permission.
+
   label = PageInfoUI::PermissionActionToUIString(
-      profile, info.type, CONTENT_SETTING_BLOCK, permission_.default_setting,
+      &delegate, info.type, CONTENT_SETTING_BLOCK, permission_.default_setting,
       info.source);
   AddCheckItem(CONTENT_SETTING_BLOCK, label);
 
@@ -53,7 +56,7 @@
   // permission.
   if (ShouldShowAsk(url)) {
     label = PageInfoUI::PermissionActionToUIString(
-        profile, info.type, CONTENT_SETTING_ASK, permission_.default_setting,
+        &delegate, info.type, CONTENT_SETTING_ASK, permission_.default_setting,
         info.source);
     AddCheckItem(CONTENT_SETTING_ASK, label);
   }
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index 41a3dcd..17784e55 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -449,7 +449,10 @@
       ->LogEvent(NTP_BACKGROUND_UPLOAD_CANCEL, base::TimeDelta::FromSeconds(0));
 }
 
-void SearchTabHelper::OnResultChanged(bool default_result_changed) {
+void SearchTabHelper::OnResultChanged(AutocompleteController* controller,
+                                      bool default_result_changed) {
+  DCHECK(controller == autocomplete_controller_.get());
+
   if (!autocomplete_controller_) {
     NOTREACHED();
     return;
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h
index 9e4144d..518e7f10 100644
--- a/chrome/browser/ui/search/search_tab_helper.h
+++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -23,7 +23,7 @@
 #include "chrome/common/search/instant_types.h"
 #include "chrome/common/search/ntp_logging_events.h"
 #include "components/ntp_tiles/ntp_tile_impression.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
+#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/common/omnibox_focus_state.h"
 #include "content/public/browser/reload_type.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -54,7 +54,7 @@
                         public InstantServiceObserver,
                         public SearchIPCRouter::Delegate,
                         public ui::SelectFileDialog::Listener,
-                        public AutocompleteControllerDelegate,
+                        public AutocompleteController::Observer,
                         public OmniboxTabHelper::Observer {
  public:
   ~SearchTabHelper() override;
@@ -164,8 +164,9 @@
                     void* params) override;
   void FileSelectionCanceled(void* params) override;
 
-  // Overridden from AutocompleteControllerDelegate:
-  void OnResultChanged(bool default_match_changed) override;
+  // Overridden from AutocompleteController::Observer:
+  void OnResultChanged(AutocompleteController* controller,
+                       bool default_match_changed) override;
 
   // Overridden from OmniboxTabHelper::Observer:
   void OnOmniboxInputStateChanged() override;
diff --git a/chrome/browser/ui/serial/serial_chooser_controller.cc b/chrome/browser/ui/serial/serial_chooser_controller.cc
index 47563af..43000ebd 100644
--- a/chrome/browser/ui/serial/serial_chooser_controller.cc
+++ b/chrome/browser/ui/serial/serial_chooser_controller.cc
@@ -11,7 +11,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/serial/serial_chooser_context.h"
 #include "chrome/browser/serial/serial_chooser_context_factory.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/web_contents.h"
@@ -39,6 +38,7 @@
 
   chooser_context_->GetPortManager()->GetDevices(base::BindOnce(
       &SerialChooserController::OnGetDevices, weak_factory_.GetWeakPtr()));
+  observer_.Add(chooser_context_.get());
 }
 
 SerialChooserController::~SerialChooserController() {
@@ -110,6 +110,30 @@
   NOTIMPLEMENTED();
 }
 
+void SerialChooserController::OnPortAdded(
+    const device::mojom::SerialPortInfo& port) {
+  ports_.push_back(port.Clone());
+  if (view())
+    view()->OnOptionAdded(ports_.size() - 1);
+}
+
+void SerialChooserController::OnPortRemoved(
+    const device::mojom::SerialPortInfo& port) {
+  const auto it = std::find_if(
+      ports_.begin(), ports_.end(),
+      [&port](const auto& ptr) { return ptr->token == port.token; });
+  if (it != ports_.end()) {
+    const size_t index = it - ports_.begin();
+    ports_.erase(it);
+    if (view())
+      view()->OnOptionRemoved(index);
+  }
+}
+
+void SerialChooserController::OnPortManagerConnectionError() {
+  observer_.RemoveAll();
+}
+
 void SerialChooserController::OnGetDevices(
     std::vector<device::mojom::SerialPortInfoPtr> ports) {
   for (auto& port : ports) {
diff --git a/chrome/browser/ui/serial/serial_chooser_controller.h b/chrome/browser/ui/serial/serial_chooser_controller.h
index 8e3d747..b510cfe 100644
--- a/chrome/browser/ui/serial/serial_chooser_controller.h
+++ b/chrome/browser/ui/serial/serial_chooser_controller.h
@@ -10,8 +10,10 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
+#include "base/scoped_observer.h"
 #include "base/strings/string16.h"
 #include "chrome/browser/chooser_controller/chooser_controller.h"
+#include "chrome/browser/serial/serial_chooser_context.h"
 #include "content/public/browser/serial_chooser.h"
 #include "services/device/public/mojom/serial.mojom-forward.h"
 #include "third_party/blink/public/mojom/serial/serial.mojom.h"
@@ -21,10 +23,10 @@
 class RenderFrameHost;
 }  // namespace content
 
-class SerialChooserContext;
-
 // SerialChooserController provides data for the Serial API permission prompt.
-class SerialChooserController final : public ChooserController {
+class SerialChooserController final
+    : public ChooserController,
+      public SerialChooserContext::PortObserver {
  public:
   SerialChooserController(
       content::RenderFrameHost* render_frame_host,
@@ -43,6 +45,11 @@
   void Close() override;
   void OpenHelpCenterUrl() const override;
 
+  // SerialChooserContext::PortObserver:
+  void OnPortAdded(const device::mojom::SerialPortInfo& port) override;
+  void OnPortRemoved(const device::mojom::SerialPortInfo& port) override;
+  void OnPortManagerConnectionError() override;
+
  private:
   void OnGetDevices(std::vector<device::mojom::SerialPortInfoPtr> ports);
   bool FilterMatchesAny(const device::mojom::SerialPortInfo& port) const;
@@ -53,6 +60,12 @@
   url::Origin embedding_origin_;
 
   base::WeakPtr<SerialChooserContext> chooser_context_;
+  ScopedObserver<SerialChooserContext,
+                 SerialChooserContext::PortObserver,
+                 &SerialChooserContext::AddPortObserver,
+                 &SerialChooserContext::RemovePortObserver>
+      observer_{this};
+
   std::vector<device::mojom::SerialPortInfoPtr> ports_;
 
   base::WeakPtrFactory<SerialChooserController> weak_factory_{this};
diff --git a/chrome/browser/ui/serial/serial_chooser_controller_unittest.cc b/chrome/browser/ui/serial/serial_chooser_controller_unittest.cc
index 36879e6..c7104c2 100644
--- a/chrome/browser/ui/serial/serial_chooser_controller_unittest.cc
+++ b/chrome/browser/ui/serial/serial_chooser_controller_unittest.cc
@@ -4,7 +4,12 @@
 
 #include "chrome/browser/ui/serial/serial_chooser_controller.h"
 
+#include <memory>
+#include <utility>
+
+#include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
+#include "chrome/browser/chooser_controller/mock_chooser_controller_view.h"
 #include "chrome/browser/serial/serial_chooser_context.h"
 #include "chrome/browser/serial/serial_chooser_context_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
@@ -16,6 +21,9 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/serial/serial.mojom.h"
 
+using testing::_;
+using testing::Invoke;
+
 class SerialChooserControllerTest : public ChromeRenderViewHostTestHarness {
  public:
   void SetUp() override {
@@ -27,6 +35,8 @@
         ->SetPortManagerForTesting(std::move(port_manager));
   }
 
+  device::FakeSerialPortManager& port_manager() { return port_manager_; }
+
  private:
   device::FakeSerialPortManager port_manager_;
 };
@@ -54,3 +64,71 @@
   // should be run.
   EXPECT_TRUE(callback_run);
 }
+
+TEST_F(SerialChooserControllerTest, PortsAddedAndRemoved) {
+  std::vector<blink::mojom::SerialPortFilterPtr> filters;
+  auto controller = std::make_unique<SerialChooserController>(
+      main_rfh(), std::move(filters), base::DoNothing());
+
+  MockChooserControllerView view;
+  controller->set_view(&view);
+
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(view, OnOptionsInitialized).WillOnce(Invoke([&] {
+      run_loop.Quit();
+    }));
+    run_loop.Run();
+  }
+  EXPECT_EQ(0u, controller->NumOptions());
+
+  auto port = device::mojom::SerialPortInfo::New();
+  port->token = base::UnguessableToken::Create();
+  port->display_name = "Test Port 1";
+  port->path = base::FilePath(FILE_PATH_LITERAL("/dev/ttyS0"));
+  base::UnguessableToken port1_token = port->token;
+  port_manager().AddPort(std::move(port));
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(view, OnOptionAdded(_)).WillOnce(Invoke([&](size_t index) {
+      EXPECT_EQ(0u, index);
+      run_loop.Quit();
+    }));
+    run_loop.Run();
+  }
+  EXPECT_EQ(1u, controller->NumOptions());
+  EXPECT_EQ(base::ASCIIToUTF16("Test Port 1 (ttyS0)"),
+            controller->GetOption(0));
+
+  port = device::mojom::SerialPortInfo::New();
+  port->token = base::UnguessableToken::Create();
+  port->display_name = "Test Port 2";
+  port->path = base::FilePath(FILE_PATH_LITERAL("/dev/ttyS1"));
+  port_manager().AddPort(std::move(port));
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(view, OnOptionAdded(_)).WillOnce(Invoke([&](size_t index) {
+      EXPECT_EQ(1u, index);
+      run_loop.Quit();
+    }));
+    run_loop.Run();
+  }
+  EXPECT_EQ(2u, controller->NumOptions());
+  EXPECT_EQ(base::ASCIIToUTF16("Test Port 1 (ttyS0)"),
+            controller->GetOption(0));
+  EXPECT_EQ(base::ASCIIToUTF16("Test Port 2 (ttyS1)"),
+            controller->GetOption(1));
+
+  port_manager().RemovePort(port1_token);
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(view, OnOptionRemoved(_)).WillOnce(Invoke([&](size_t index) {
+      EXPECT_EQ(0u, index);
+      run_loop.Quit();
+    }));
+    run_loop.Run();
+  }
+  EXPECT_EQ(1u, controller->NumOptions());
+  EXPECT_EQ(base::ASCIIToUTF16("Test Port 2 (ttyS1)"),
+            controller->GetOption(0));
+}
diff --git a/chrome/browser/ui/tabs/tab_menu_model_factory.cc b/chrome/browser/ui/tabs/tab_menu_model_factory.cc
new file mode 100644
index 0000000..60ee3e9
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_menu_model_factory.cc
@@ -0,0 +1,14 @@
+// Copyright 2020 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.
+
+#include "chrome/browser/ui/tabs/tab_menu_model_factory.h"
+
+#include "chrome/browser/ui/tabs/tab_menu_model.h"
+
+std::unique_ptr<ui::SimpleMenuModel> TabMenuModelFactory::Create(
+    ui::SimpleMenuModel::Delegate* delegate,
+    TabStripModel* tab_strip,
+    int index) {
+  return std::make_unique<TabMenuModel>(delegate, tab_strip, index);
+}
diff --git a/chrome/browser/ui/tabs/tab_menu_model_factory.h b/chrome/browser/ui/tabs/tab_menu_model_factory.h
new file mode 100644
index 0000000..79e09fa
--- /dev/null
+++ b/chrome/browser/ui/tabs/tab_menu_model_factory.h
@@ -0,0 +1,28 @@
+// Copyright 2020 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.
+
+#ifndef CHROME_BROWSER_UI_TABS_TAB_MENU_MODEL_FACTORY_H_
+#define CHROME_BROWSER_UI_TABS_TAB_MENU_MODEL_FACTORY_H_
+
+#include <memory>
+
+#include "ui/base/models/simple_menu_model.h"
+
+class TabStripModel;
+
+// A factory to create menu models for tab menu.
+class TabMenuModelFactory {
+ public:
+  TabMenuModelFactory() = default;
+  TabMenuModelFactory(const TabMenuModelFactory&) = delete;
+  virtual ~TabMenuModelFactory() = default;
+  TabMenuModelFactory& operator=(const TabMenuModelFactory&) = delete;
+
+  virtual std::unique_ptr<ui::SimpleMenuModel> Create(
+      ui::SimpleMenuModel::Delegate* delegate,
+      TabStripModel* tab_strip,
+      int index);
+};
+
+#endif  // CHROME_BROWSER_UI_TABS_TAB_MENU_MODEL_FACTORY_H_
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 90b0af4..0c59cf3 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -500,9 +500,14 @@
   tab_strip_region_view_ =
       top_container_->AddChildView(std::make_unique<TabStripRegionView>());
 
+  std::unique_ptr<TabMenuModelFactory> tab_menu_model_factory;
+  if (browser_->app_controller()) {
+    tab_menu_model_factory =
+        browser_->app_controller()->GetTabMenuModelFactory();
+  }
   // TabStrip takes ownership of the controller.
   auto tabstrip_controller = std::make_unique<BrowserTabStripController>(
-      browser_->tab_strip_model(), this);
+      browser_->tab_strip_model(), this, std::move(tab_menu_model_factory));
   BrowserTabStripController* tabstrip_controller_ptr =
       tabstrip_controller.get();
   tabstrip_ = tab_strip_region_view_->AddChildView(std::make_unique<TabStrip>(
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc
index 813ebba..601268bb 100644
--- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc
+++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.cc
@@ -20,10 +20,6 @@
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/navigation_handle.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/browser/notification_types.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/web_contents.h"
@@ -217,6 +213,14 @@
     UpdateBrowserControlsStateShown(/*animate=*/true);
   }
 
+  void OnFocusChangedInPage(content::FocusedNodeDetails* details) override {
+    // Even if a non-editable node gets focused, if top-chrome is fully shown,
+    // we should also update the browser controls state constraints so that
+    // top-chrome is able to be hidden again.
+    if (details->is_editable_node || shown_ratio_ == 1.f)
+      UpdateBrowserControlsStateShown(/*animate=*/true);
+  }
+
   // PermissionRequestManager::Observer:
   void OnBubbleAdded() override {
     UpdateBrowserControlsStateShown(/*animate=*/true);
@@ -283,9 +287,6 @@
   observed_omni_box_ = browser_view->GetLocationBarView()->omnibox_view();
   observed_omni_box_->AddObserver(this);
 
-  registrar_.Add(this, content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
-                 content::NotificationService::AllSources());
-
   if (ash::TabletMode::Get())
     ash::TabletMode::Get()->AddObserver(this);
 
@@ -510,33 +511,6 @@
   UpdateBrowserControlsStateShown(/*web_contents=*/nullptr, /*animate=*/true);
 }
 
-void TopControlsSlideControllerChromeOS::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
-  // TODO(afakhry): It would be nice to add a WebContentsObserver method that
-  // broadcasts this event.
-  if (type != content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE)
-    return;
-
-  // Make sure this notification is meant for us.
-  content::WebContents* active_contents = browser_view_->GetActiveWebContents();
-  content::RenderViewHost* render_view_host =
-      content::Source<content::RenderViewHost>(source).ptr();
-  if (!active_contents || content::WebContents::FromRenderViewHost(
-                              render_view_host) != active_contents) {
-    return;
-  }
-
-  content::FocusedNodeDetails* node_details =
-      content::Details<content::FocusedNodeDetails>(details).ptr();
-  // If a non-editable node gets focused and top-chrome is fully shown, we
-  // should also update the browser controls state constraints so that
-  // top-chrome is able to be hidden again.
-  if (node_details->is_editable_node || shown_ratio_ == 1.f)
-    UpdateBrowserControlsStateShown(active_contents, /*animate=*/true);
-}
-
 void TopControlsSlideControllerChromeOS::OnDisplayMetricsChanged(
     const display::Display& display,
     uint32_t changed_metrics) {
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h
index 47bbe5e..4d7a8bb 100644
--- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h
+++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos.h
@@ -14,8 +14,6 @@
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/browser/ui/views/frame/top_controls_slide_controller.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
 #include "ui/display/display_observer.h"
 #include "ui/views/view_observer.h"
 
@@ -41,7 +39,6 @@
 class TopControlsSlideControllerChromeOS : public TopControlsSlideController,
                                            public ash::TabletModeObserver,
                                            public TabStripModelObserver,
-                                           public content::NotificationObserver,
                                            public display::DisplayObserver,
                                            public views::ViewObserver {
  public:
@@ -70,11 +67,6 @@
       const TabStripSelectionChange& selection) override;
   void SetTabNeedsAttentionAt(int index, bool attention) override;
 
-  // content::NotificationObserver:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
-
   // display::DisplayObserver:
   void OnDisplayMetricsChanged(const display::Display& display,
                                uint32_t changed_metrics) override;
@@ -191,8 +183,6 @@
                  std::unique_ptr<TopControlsSlideTabObserver>>
       observed_tabs_;
 
-  content::NotificationRegistrar registrar_;
-
   std::unique_ptr<chromeos::AccessibilityStatusSubscription>
       accessibility_status_subscription_;
 
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
index 4d8169d2..3276151 100644
--- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
+++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
@@ -61,25 +61,6 @@
   kDown,
 };
 
-// Using the given |generator| and the start and end points, it generates a
-// gesture scroll sequence with appropriate velocity so that fling gesture
-// scrolls are generated.
-void GenerateGestureFlingScrollSequence(ui::test::EventGenerator* generator,
-                                        const gfx::Point& start_point,
-                                        const gfx::Point& end_point) {
-  DCHECK(generator);
-  generator->GestureScrollSequenceWithCallback(
-      start_point, end_point,
-      generator->CalculateScrollDurationForFlingVelocity(
-          start_point, end_point, 100 /* velocity */, 2 /* steps */),
-      2 /* steps */,
-      base::BindRepeating([](ui::EventType, const gfx::Vector2dF&) {
-        // Give the event a chance to propagate to renderer before sending the
-        // next one.
-        base::RunLoop().RunUntilIdle();
-      }));
-}
-
 // Checks that the translation part of the two given transforms are equal.
 void CompareTranslations(const gfx::Transform& t1, const gfx::Transform& t2) {
   const gfx::Vector2dF t1_translation = t1.To2dTranslation();
@@ -505,6 +486,33 @@
     CompareTranslations(expected_transform, root_view_layer->transform());
   }
 
+  // Using the given |generator| and the start and end points, it generates a
+  // gesture scroll sequence with appropriate velocity so that fling gesture
+  // scrolls are generated.
+  void GenerateGestureFlingScrollSequence(ui::test::EventGenerator* generator,
+                                          const gfx::Point& start_point,
+                                          const gfx::Point& end_point) {
+    DCHECK(generator);
+    content::WebContents* contents = browser_view()->GetActiveWebContents();
+    generator->GestureScrollSequenceWithCallback(
+        start_point, end_point,
+        generator->CalculateScrollDurationForFlingVelocity(
+            start_point, end_point, 100 /* velocity */, 2 /* steps */),
+        2 /* steps */,
+        base::BindRepeating(
+            [](content::WebContents* contents, ui::EventType,
+               const gfx::Vector2dF&) {
+              // Give the event a chance to propagate to renderer before sending
+              // the next one by waiting for at least 2 render frame
+              // submissions.
+              content::RenderFrameSubmissionObserver submission_observer(
+                  contents);
+              while (submission_observer.render_frame_count() < 2)
+                submission_observer.WaitForAnyFrameSubmission();
+            },
+            contents));
+  }
+
   // Generates a gesture fling scroll sequence to scroll the current page in the
   // given |direction|, and waits for and verifies that top-chrome reaches the
   // given |target_state|.
@@ -781,9 +789,8 @@
                                TopChromeShownState::kFullyHidden);
 }
 
-// Disabled for flakes. See http://crbug.com/1049178
 IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest,
-                       DISABLED_TestFocusEditableElements) {
+                       TestFocusEditableElements) {
   ToggleTabletMode();
   ASSERT_TRUE(GetTabletModeEnabled());
   EXPECT_TRUE(top_controls_slide_controller()->IsEnabled());
@@ -794,6 +801,7 @@
   OpenUrlAtIndex(embedded_test_server()->GetURL("/top_controls_scroll.html"),
                  0);
 
+  SCOPED_TRACE("Initial scroll to hide the top controls.");
   ScrollAndExpectTopChromeToBe(ScrollDirection::kDown,
                                TopChromeShownState::kFullyHidden);
 
@@ -822,6 +830,7 @@
 
   // Focus on the editable element in the page and expect that top-chrome will
   // be shown.
+  SCOPED_TRACE("Focus an editable element in the page.");
   TopControlsShownRatioWaiter waiter(top_controls_slide_controller());
   content::WebContents* contents = browser_view()->GetActiveWebContents();
   bool bool_result = false;
@@ -835,18 +844,22 @@
   // Now try scrolling in a way that would normally hide top-chrome, and expect
   // that top-chrome will be forced shown as long as the editable element is
   // focused.
+  SCOPED_TRACE("Attempting a scroll which will not hide the top controls.");
   ScrollAndExpectTopChromeToBe(ScrollDirection::kDown,
                                TopChromeShownState::kFullyShown);
 
   // Now blur the focused editable element. Expect that top-chrome can now be
   // hidden with gesture scrolls.
   bool_result = false;
+  SCOPED_TRACE("Bluring the focus away from the editable element.");
   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
       contents, get_js_function_body(false /* should_focus */), &bool_result));
   EXPECT_TRUE(bool_result);
   // Evaluate an empty sentence to make sure that the event processing is done
   // in the content.
   ignore_result(content::EvalJs(contents, ";"));
+
+  SCOPED_TRACE("Scroll to hide should now work.");
   ScrollAndExpectTopChromeToBe(ScrollDirection::kDown,
                                TopChromeShownState::kFullyHidden);
 }
diff --git a/chrome/browser/ui/views/native_file_system/native_file_system_access_icon_view.cc b/chrome/browser/ui/views/native_file_system/native_file_system_access_icon_view.cc
index 6a67e76..ea10050 100644
--- a/chrome/browser/ui/views/native_file_system/native_file_system_access_icon_view.cc
+++ b/chrome/browser/ui/views/native_file_system/native_file_system_access_icon_view.cc
@@ -43,7 +43,7 @@
       has_write_access_ = false;
     } else {
       url::Origin origin =
-          url::Origin::Create(GetWebContents()->GetLastCommittedURL());
+          GetWebContents()->GetMainFrame()->GetLastCommittedOrigin();
       auto* context =
           NativeFileSystemPermissionContextFactory::GetForProfileIfExists(
               GetWebContents()->GetBrowserContext());
@@ -80,10 +80,9 @@
 }
 
 void NativeFileSystemAccessIconView::OnExecuting(ExecuteSource execute_source) {
-  url::Origin origin =
-      url::Origin::Create(GetWebContents()->GetLastCommittedURL());
-
   auto* web_contents = GetWebContents();
+  url::Origin origin = web_contents->GetMainFrame()->GetLastCommittedOrigin();
+
   auto* context =
       NativeFileSystemPermissionContextFactory::GetForProfileIfExists(
           web_contents->GetBrowserContext());
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc
index 4af5ead..baf7171 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -44,12 +44,6 @@
 #include "ui/aura/window.h"
 #endif
 
-// static
-std::unique_ptr<content::OverlayWindow> content::OverlayWindow::Create(
-    content::PictureInPictureWindowController* controller) {
-  return base::WrapUnique(new OverlayWindowViews(controller));
-}
-
 namespace {
 constexpr gfx::Size kMinWindowSize(260, 146);
 
@@ -100,6 +94,13 @@
              : OverlayWindowViews::WindowQuadrant::kBottomRight;
 }
 
+template <typename T>
+T* AddChildView(std::vector<std::unique_ptr<views::View>>* views,
+                std::unique_ptr<T> child) {
+  views->push_back(std::move(child));
+  return static_cast<T*>(views->back().get());
+}
+
 }  // namespace
 
 // OverlayWindow implementation of NonClientFrameView.
@@ -193,18 +194,19 @@
   DISALLOW_COPY_AND_ASSIGN(OverlayWindowWidgetDelegate);
 };
 
-OverlayWindowViews::OverlayWindowViews(
-    content::PictureInPictureWindowController* controller)
-    : controller_(controller),
-      hide_controls_timer_(
-          FROM_HERE,
-          base::TimeDelta::FromMilliseconds(2500),
-          base::BindRepeating(&OverlayWindowViews::UpdateControlsVisibility,
-                              base::Unretained(this),
-                              false /* is_visible */)) {
+// static
+std::unique_ptr<content::OverlayWindow> OverlayWindowViews::Create(
+    content::PictureInPictureWindowController* controller) {
+  // Can't use make_unique(), which doesn't have access to the private
+  // constructor. It's important that the constructor be private, because it
+  // doesn't initialize the object fully.
+  auto overlay_window = base::WrapUnique(new OverlayWindowViews(controller));
+
   views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
   params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  params.bounds = CalculateAndUpdateWindowBounds();
+  // Just to have any non-empty bounds as required by Init(). The window is
+  // resized to fit the video that is embedded right afterwards, anyway.
+  params.bounds = gfx::Rect(overlay_window->GetMinimumSize());
   params.z_order = ui::ZOrderLevel::kFloatingWindow;
   params.visible_on_all_workspaces = true;
   params.remove_standard_frame = true;
@@ -219,18 +221,32 @@
   // TODO(mukai): allow synchronizing activatability and remove this.
   params.activatable = views::Widget::InitParams::ACTIVATABLE_NO;
 #endif
-
   // Set WidgetDelegate for more control over |widget_|.
-  params.delegate = new OverlayWindowWidgetDelegate(this);
+  params.delegate = new OverlayWindowWidgetDelegate(overlay_window.get());
 
-  Init(std::move(params));
+  overlay_window->Init(std::move(params));
+  overlay_window->OnRootViewReady();
+
+  return overlay_window;
+}
+
+// static
+std::unique_ptr<content::OverlayWindow> content::OverlayWindow::Create(
+    content::PictureInPictureWindowController* controller) {
+  return OverlayWindowViews::Create(controller);
+}
+
+OverlayWindowViews::OverlayWindowViews(
+    content::PictureInPictureWindowController* controller)
+    : controller_(controller),
+      hide_controls_timer_(
+          FROM_HERE,
+          base::TimeDelta::FromMilliseconds(2500),
+          base::BindRepeating(&OverlayWindowViews::UpdateControlsVisibility,
+                              base::Unretained(this),
+                              false /* is_visible */)) {
+  CalculateAndUpdateWindowBounds();
   SetUpViews();
-
-#if defined(OS_CHROMEOS)
-  GetNativeWindow()->SetProperty(ash::kWindowPipTypeKey, true);
-#endif  // defined(OS_CHROMEOS)
-
-  is_initialized_ = true;
 }
 
 OverlayWindowViews::~OverlayWindowViews() = default;
@@ -315,10 +331,6 @@
 }
 
 void OverlayWindowViews::SetUpViews() {
-  GetRootView()->SetPaintToLayer(ui::LAYER_TEXTURED);
-  GetRootView()->layer()->SetName("RootView");
-  GetRootView()->layer()->SetMasksToBounds(true);
-
   // views::View that is displayed when video is hidden. ----------------------
   // Adding an extra pixel to width/height makes sure controls background cover
   // entirely window when platform has fractional scale applied.
@@ -343,23 +355,17 @@
   auto resize_handle_view = std::make_unique<views::ResizeHandleButton>(this);
 #endif
 
-  gfx::Rect larger_window_bounds =
-      gfx::Rect(0, 0, GetBounds().width(), GetBounds().height());
-  larger_window_bounds.Inset(-1, -1);
-  window_background_view->SetBoundsRect(larger_window_bounds);
   window_background_view->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
   window_background_view->layer()->SetName("WindowBackgroundView");
   window_background_view->layer()->SetColor(SK_ColorBLACK);
 
   // view::View that holds the video. -----------------------------------------
   video_view->SetPaintToLayer(ui::LAYER_TEXTURED);
-  video_view->SetSize(GetBounds().size());
   video_view->layer()->SetMasksToBounds(true);
   video_view->layer()->SetFillsBoundsOpaquely(false);
   video_view->layer()->SetName("VideoView");
 
   // views::View that holds the scrim, which appears with the controls. -------
-  controls_scrim_view->SetSize(GetBounds().size());
   controls_scrim_view->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
   controls_scrim_view->layer()->SetName("ControlsScrimView");
   controls_scrim_view->layer()->SetColor(gfx::kGoogleGrey900);
@@ -407,29 +413,44 @@
 
   // Set up view::Views hierarchy. --------------------------------------------
   window_background_view_ =
-      GetContentsView()->AddChildView(std::move(window_background_view));
-  video_view_ = GetContentsView()->AddChildView(std::move(video_view));
+      AddChildView(&view_holder_, std::move(window_background_view));
+  video_view_ = AddChildView(&view_holder_, std::move(video_view));
   controls_scrim_view_ =
-      GetContentsView()->AddChildView(std::move(controls_scrim_view));
+      AddChildView(&view_holder_, std::move(controls_scrim_view));
   close_controls_view_ =
-      GetContentsView()->AddChildView(std::move(close_controls_view));
+      AddChildView(&view_holder_, std::move(close_controls_view));
   back_to_tab_controls_view_ =
-      GetContentsView()->AddChildView(std::move(back_to_tab_controls_view));
+      AddChildView(&view_holder_, std::move(back_to_tab_controls_view));
   previous_track_controls_view_ =
-      GetContentsView()->AddChildView(std::move(previous_track_controls_view));
+      AddChildView(&view_holder_, std::move(previous_track_controls_view));
   play_pause_controls_view_ =
-      GetContentsView()->AddChildView(std::move(play_pause_controls_view));
+      AddChildView(&view_holder_, std::move(play_pause_controls_view));
   next_track_controls_view_ =
-      GetContentsView()->AddChildView(std::move(next_track_controls_view));
+      AddChildView(&view_holder_, std::move(next_track_controls_view));
   skip_ad_controls_view_ =
-      GetContentsView()->AddChildView(std::move(skip_ad_controls_view));
+      AddChildView(&view_holder_, std::move(skip_ad_controls_view));
 #if defined(OS_CHROMEOS)
   resize_handle_view_ =
-      GetContentsView()->AddChildView(std::move(resize_handle_view));
+      AddChildView(&view_holder_, std::move(resize_handle_view));
 #endif
   UpdateControlsVisibility(false);
 }
 
+void OverlayWindowViews::OnRootViewReady() {
+#if defined(OS_CHROMEOS)
+  GetNativeWindow()->SetProperty(ash::kWindowPipTypeKey, true);
+#endif  // defined(OS_CHROMEOS)
+
+  GetRootView()->SetPaintToLayer(ui::LAYER_TEXTURED);
+  GetRootView()->layer()->SetName("RootView");
+  GetRootView()->layer()->SetMasksToBounds(true);
+
+  views::View* const contents_view = GetContentsView();
+  for (std::unique_ptr<views::View>& child : view_holder_)
+    contents_view->AddChildView(std::move(child));
+  view_holder_.clear();
+}
+
 void OverlayWindowViews::UpdateLayerBoundsWithLetterboxing(
     gfx::Size window_size) {
   // This is the case when the window is initially created or the video surface
@@ -667,11 +688,11 @@
 }
 
 bool OverlayWindowViews::IsVisible() {
-  return is_initialized_ ? views::Widget::IsVisible() : false;
+  return views::Widget::IsVisible();
 }
 
 bool OverlayWindowViews::IsVisible() const {
-  return is_initialized_ ? views::Widget::IsVisible() : false;
+  return views::Widget::IsVisible();
 }
 
 bool OverlayWindowViews::IsAlwaysOnTop() {
@@ -745,8 +766,6 @@
   // Controls should be hidden when there is no more focus on the window. This
   // is used for tabbing and touch interactions. For mouse interactions, the
   // window cannot be blurred before the ui::ET_MOUSE_EXITED event is handled.
-  if (!is_initialized_)
-    return;
   UpdateControlsVisibility(false);
 
   views::Widget::OnNativeBlur();
@@ -767,8 +786,6 @@
 void OverlayWindowViews::OnNativeWidgetMove() {
   // Hide the controls when the window is moving. The controls will reappear
   // when the user interacts with the window again.
-  if (!is_initialized_)
-    return;
   UpdateControlsVisibility(false);
 
   // Update the existing |window_bounds_| when the window moves. This allows
@@ -791,8 +808,6 @@
 void OverlayWindowViews::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
   // Hide the controls when the window is being resized. The controls will
   // reappear when the user interacts with the window again.
-  if (!is_initialized_)
-    return;
   UpdateControlsVisibility(false);
 
   // Update the view layers to scale to |new_size|.
@@ -1017,7 +1032,7 @@
 
 gfx::Rect OverlayWindowViews::GetWorkAreaForWindow() const {
   return display::Screen::GetScreen()
-      ->GetDisplayNearestWindow(IsVisible()
+      ->GetDisplayNearestWindow(native_widget()
                                     ? GetNativeWindow()
                                     : controller_->GetInitiatorWebContents()
                                           ->GetTopLevelNativeWindow())
@@ -1028,7 +1043,7 @@
                                             const gfx::Size& window_size) {
   max_size_ = gfx::Size(work_area.width() / 2, work_area.height() / 2);
 
-  if (!IsVisible())
+  if (!native_widget())
     return window_size;
 
   if (window_size.width() <= max_size_.width() &&
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.h b/chrome/browser/ui/views/overlay/overlay_window_views.h
index a34d2197..92542e5 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.h
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.h
@@ -31,8 +31,9 @@
                            public views::ButtonListener,
                            public views::Widget {
  public:
-  explicit OverlayWindowViews(
+  static std::unique_ptr<content::OverlayWindow> Create(
       content::PictureInPictureWindowController* controller);
+
   ~OverlayWindowViews() override;
 
   enum class WindowQuadrant { kBottomLeft, kBottomRight, kTopLeft, kTopRight };
@@ -105,6 +106,9 @@
                           const gfx::Size& window_size);
 
  private:
+  explicit OverlayWindowViews(
+      content::PictureInPictureWindowController* controller);
+
   // Return the work area for the nearest display the widget is on.
   gfx::Rect GetWorkAreaForWindow() const;
 
@@ -117,6 +121,9 @@
   // Set up the views::Views that will be shown on the window.
   void SetUpViews();
 
+  // Finish initialization by performing the steps that require the root View.
+  void OnRootViewReady();
+
   // Update the bounds of the layers on the window. This may introduce
   // letterboxing.
   void UpdateLayerBoundsWithLetterboxing(gfx::Size window_size);
@@ -171,11 +178,6 @@
   // Not owned; |controller_| owns |this|.
   content::PictureInPictureWindowController* controller_;
 
-  // Whether or not the components of the window has been set up. This is used
-  // as a check as some event handlers (e.g. focus) is propogated to the window
-  // before its contents is initialized. This is only set once.
-  bool is_initialized_ = false;
-
   // Whether or not the window has been shown before. This is used to determine
   // sizing and placement. This is different from checking whether the window
   // components has been initialized.
@@ -202,6 +204,11 @@
   // ensuring factors such as aspect ratio is maintained.
   gfx::Size natural_size_;
 
+  // Temporary storage for child Views. Used during the time between
+  // construction and initialization, when the views::View pointer members must
+  // already be initialized, but there is no root view to add them to yet.
+  std::vector<std::unique_ptr<views::View>> view_holder_;
+
   // Views to be shown.
   views::View* window_background_view_ = nullptr;
   views::View* video_view_ = nullptr;
diff --git a/chrome/browser/ui/views/page_info/permission_selector_row.cc b/chrome/browser/ui/views/page_info/permission_selector_row.cc
index b621745..b36361b1 100644
--- a/chrome/browser/ui/views/page_info/permission_selector_row.cc
+++ b/chrome/browser/ui/views/page_info/permission_selector_row.cc
@@ -8,6 +8,7 @@
 #include "base/i18n/rtl.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/ui/page_info/chrome_page_info_ui_delegate.h"
 #include "chrome/browser/ui/page_info/page_info_ui.h"
 #include "chrome/browser/ui/page_info/permission_menu_model.h"
 #include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h"
@@ -185,8 +186,9 @@
   InitializeComboboxView(layout, permission);
 
   // Show the permission decision reason, if it was not the user.
-  base::string16 reason =
-      PageInfoUI::PermissionDecisionReasonToUIString(profile, permission, url);
+  auto delegate = ChromePageInfoUiDelegate(profile);
+  base::string16 reason = PageInfoUI::PermissionDecisionReasonToUIString(
+      &delegate, permission, url);
   if (!reason.empty()) {
     layout->StartRow(1.0, PageInfoBubbleView::kPermissionColumnSetId);
     layout->SkipColumns(1);
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
index 27e14ce5..9d3cb60 100644
--- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
+++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.cc
@@ -5,6 +5,8 @@
 #include "chrome/browser/ui/views/storage/storage_pressure_bubble_view.h"
 
 #include "base/feature_list.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/bubble_anchor_util.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
@@ -22,6 +24,19 @@
 const char kAllSitesContentSettingsUrl[] =
     "chrome://settings/content/all?sort=data-stored";
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class StoragePressureBubbleHistogramValue {
+  kShown = 0,
+  kIgnored = 1,
+  kOpenedAllSites = 2,
+  kMaxValue = kOpenedAllSites,
+};
+
+void RecordBubbleHistogramValue(StoragePressureBubbleHistogramValue value) {
+  base::UmaHistogramEnumeration("Storage.StoragePressure.Bubble", value);
+}
+
 }  // namespace
 
 namespace chrome {
@@ -44,6 +59,8 @@
           ->GetAppMenuButton(),
       gfx::Rect(), browser, std::move(origin));
   views::BubbleDialogDelegateView::CreateBubble(bubble)->Show();
+
+  RecordBubbleHistogramValue(StoragePressureBubbleHistogramValue::kShown);
 }
 
 StoragePressureBubbleView::StoragePressureBubbleView(
@@ -53,7 +70,8 @@
     const url::Origin origin)
     : BubbleDialogDelegateView(anchor_view, views::BubbleBorder::TOP_RIGHT),
       browser_(browser),
-      origin_(std::move(origin)) {
+      origin_(std::move(origin)),
+      ignored_(true) {
   if (!anchor_view) {
     SetAnchorRect(anchor_rect);
     set_parent_window(
@@ -66,6 +84,13 @@
           IDS_SETTINGS_STORAGE_PRESSURE_BUBBLE_VIEW_BUTTON_LABEL));
   DialogDelegate::SetAcceptCallback(base::BindOnce(
       &StoragePressureBubbleView::OnDialogAccepted, base::Unretained(this)));
+  set_close_on_deactivate(false);
+}
+
+StoragePressureBubbleView::~StoragePressureBubbleView() {
+  if (ignored_) {
+    RecordBubbleHistogramValue(StoragePressureBubbleHistogramValue::kIgnored);
+  }
 }
 
 base::string16 StoragePressureBubbleView::GetWindowTitle() const {
@@ -74,6 +99,9 @@
 }
 
 void StoragePressureBubbleView::OnDialogAccepted() {
+  ignored_ = false;
+  RecordBubbleHistogramValue(
+      StoragePressureBubbleHistogramValue::kOpenedAllSites);
   // TODO(ellyjones): What is this doing here? The widget's about to close
   // anyway?
   GetWidget()->Close();
@@ -108,3 +136,7 @@
       margins().width());
   AddChildView(std::move(text_label));
 }
+
+bool StoragePressureBubbleView::ShouldShowCloseButton() const {
+  return true;
+}
diff --git a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
index 90a68b2..60bece84 100644
--- a/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
+++ b/chrome/browser/ui/views/storage/storage_pressure_bubble_view.h
@@ -19,6 +19,7 @@
                             const gfx::Rect& anchor_rect,
                             Browser* browser,
                             const url::Origin origin);
+  ~StoragePressureBubbleView() override;
 
   void OnDialogAccepted();
 
@@ -27,10 +28,13 @@
 
   // views::BubbleDialogDelegateView:
   void Init() override;
+  bool ShouldShowCloseButton() const override;
 
   Browser* const browser_;
-  const GURL all_sites_url_ = GURL("chrome://settings/content/all");
   const url::Origin origin_;
+  // Whether or not the user opened the all sites page from the notification
+  // positive button.
+  bool ignored_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_STORAGE_STORAGE_PRESSURE_BUBBLE_VIEW_H_
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index f3014bdd..142314e 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/views/tabs/browser_tab_strip_controller.h"
 
 #include <limits>
+#include <memory>
 #include <utility>
 
 #include "base/auto_reset.h"
@@ -57,6 +58,7 @@
 #include "ipc/ipc_message.h"
 #include "third_party/metrics_proto/omnibox_event.pb.h"
 #include "ui/base/models/list_selection_model.h"
+#include "ui/base/models/menu_model.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/image/image.h"
 #include "ui/views/controls/menu/menu_runner.h"
@@ -105,7 +107,7 @@
  public:
   TabContextMenuContents(Tab* tab, BrowserTabStripController* controller)
       : tab_(tab), controller_(controller) {
-    model_ = std::make_unique<TabMenuModel>(
+    model_ = controller_->menu_model_factory_->Create(
         this, controller->model_, controller->tabstrip_->GetModelIndexOf(tab));
     menu_runner_ = std::make_unique<views::MenuRunner>(
         model_.get(),
@@ -145,7 +147,7 @@
   }
 
  private:
-  std::unique_ptr<TabMenuModel> model_;
+  std::unique_ptr<ui::SimpleMenuModel> model_;
   std::unique_ptr<views::MenuRunner> menu_runner_;
 
   // The tab we're showing a menu for.
@@ -160,12 +162,19 @@
 ////////////////////////////////////////////////////////////////////////////////
 // BrowserTabStripController, public:
 
-BrowserTabStripController::BrowserTabStripController(TabStripModel* model,
-                                                     BrowserView* browser_view)
+BrowserTabStripController::BrowserTabStripController(
+    TabStripModel* model,
+    BrowserView* browser_view,
+    std::unique_ptr<TabMenuModelFactory> menu_model_factory_override)
     : model_(model),
       tabstrip_(nullptr),
       browser_view_(browser_view),
-      hover_tab_selector_(model) {
+      hover_tab_selector_(model),
+      menu_model_factory_(std::move(menu_model_factory_override)) {
+  if (!menu_model_factory_) {
+    // Use the default one.
+    menu_model_factory_ = std::make_unique<TabMenuModelFactory>();
+  }
   model_->SetTabStripUI(this);
 
   local_pref_registrar_.Init(g_browser_process->local_state());
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
index 52168c5f..1014fad 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -8,15 +8,18 @@
 #include <memory>
 #include <vector>
 
+#include "base/callback_forward.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "chrome/browser/ui/tabs/hover_tab_selector.h"
+#include "chrome/browser/ui/tabs/tab_menu_model_factory.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/tab_groups/tab_group_color.h"
+#include "ui/base/models/simple_menu_model.h"
 
 class Browser;
 class BrowserNonClientFrameView;
@@ -37,7 +40,10 @@
 class BrowserTabStripController : public TabStripController,
                                   public TabStripModelObserver {
  public:
-  BrowserTabStripController(TabStripModel* model, BrowserView* browser_view);
+  BrowserTabStripController(TabStripModel* model,
+                            BrowserView* browser_view,
+                            std::unique_ptr<TabMenuModelFactory>
+                                menu_model_factory_override = nullptr);
   ~BrowserTabStripController() override;
 
   void InitFromModel(TabStrip* tabstrip);
@@ -158,6 +164,8 @@
 
   PrefChangeRegistrar local_pref_registrar_;
 
+  std::unique_ptr<TabMenuModelFactory> menu_model_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(BrowserTabStripController);
 };
 
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc
index 36a3b7c..f9f382c 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 
+#include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/strings/string_piece.h"
 #include "chrome/browser/installable/installable_manager.h"
@@ -16,6 +17,7 @@
 #include "chrome/browser/ui/browser_window_state.h"
 #include "chrome/browser/ui/extensions/hosted_app_browser_controller.h"
 #include "chrome/browser/ui/manifest_web_app_browser_controller.h"
+#include "chrome/browser/ui/tabs/tab_menu_model_factory.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_browser_controller.h"
@@ -25,6 +27,7 @@
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/themes/autogenerated_theme_util.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/security_state/core/security_state.h"
 #include "components/url_formatter/url_formatter.h"
 #include "content/public/browser/navigation_controller.h"
@@ -36,13 +39,46 @@
 #include "extensions/common/constants.h"
 #include "net/base/escape.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/models/simple_menu_model.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/favicon_size.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/image/image_skia.h"
 #include "url/gurl.h"
 
+namespace {
+
+class TerminalTabMenuModel : public ui::SimpleMenuModel {
+ public:
+  explicit TerminalTabMenuModel(ui::SimpleMenuModel::Delegate* delegate)
+      : ui::SimpleMenuModel(delegate) {
+    AddItemWithStringId(TabStripModel::CommandNewTabToRight,
+                        IDS_TAB_CXMENU_NEWTABTORIGHT);
+    AddSeparator(ui::NORMAL_SEPARATOR);
+    AddItemWithStringId(TabStripModel::CommandCloseTab,
+                        IDS_TAB_CXMENU_CLOSETAB);
+    AddItemWithStringId(TabStripModel::CommandCloseOtherTabs,
+                        IDS_TAB_CXMENU_CLOSEOTHERTABS);
+    AddItemWithStringId(TabStripModel::CommandCloseTabsToRight,
+                        IDS_TAB_CXMENU_CLOSETABSTORIGHT);
+  }
+};
+
+class TerminalTabMenuModelFactory : public TabMenuModelFactory {
+ public:
+  std::unique_ptr<ui::SimpleMenuModel> Create(
+      ui::SimpleMenuModel::Delegate* delegate,
+      TabStripModel*,
+      int) override {
+    return std::make_unique<TerminalTabMenuModel>(delegate);
+  }
+};
+
+}  // namespace
+
 namespace web_app {
 
 namespace {
@@ -246,6 +282,15 @@
   return false;
 }
 
+std::unique_ptr<TabMenuModelFactory>
+AppBrowserController::GetTabMenuModelFactory() const {
+  if (system_app_type_ == SystemAppType::TERMINAL) {
+    // TODO(crbug.com/1061822) move terminal specific code out.
+    return std::make_unique<TerminalTabMenuModelFactory>();
+  }
+  return nullptr;
+}
+
 bool AppBrowserController::IsHostedApp() const {
   return false;
 }
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.h b/chrome/browser/ui/web_applications/app_browser_controller.h
index 666f2a88..0f3dd6b 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.h
+++ b/chrome/browser/ui/web_applications/app_browser_controller.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
@@ -16,12 +17,16 @@
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/image/image_skia.h"
 
 class Browser;
 class BrowserThemePack;
 class CustomThemeSupplier;
+class TabMenuModelFactory;
+
+namespace gfx {
+class ImageSkia;
+class Rect;
+}  // namespace gfx
 
 namespace web_app {
 
@@ -117,6 +122,8 @@
   // the lifetime of HostedAppBrowserController).
   virtual bool IsInstalled() const;
 
+  virtual std::unique_ptr<TabMenuModelFactory> GetTabMenuModelFactory() const;
+
   // Updates the custom tab bar's visibility based on whether it should be
   // currently visible or not. If |animate| is set, the change will be
   // animated.
diff --git a/chrome/browser/ui/webui/flags_ui.cc b/chrome/browser/ui/webui/flags_ui.cc
index 6bce6f8..6754133 100644
--- a/chrome/browser/ui/webui/flags_ui.cc
+++ b/chrome/browser/ui/webui/flags_ui.cc
@@ -37,15 +37,21 @@
 #include "ui/base/resource/resource_bundle.h"
 
 #if defined(OS_CHROMEOS)
+#include "base/command_line.h"
 #include "base/system/sys_info.h"
 #include "chrome/browser/chromeos/login/session/user_session_manager.h"
 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/chromeos/settings/owner_flags_storage.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/grit/generated_resources.h"
+#include "chromeos/constants/chromeos_switches.h"
 #include "components/account_id/account_id.h"
+#include "components/infobars/core/simple_alert_infobar_delegate.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/user_manager/user_manager.h"
+#include "components/vector_icons/vector_icons.h"
 #endif
 
 using content::WebContents;
@@ -112,6 +118,17 @@
         new flags_ui::PrefServiceFlagsStorage(profile->GetPrefs()),
         flags_ui::kGeneralAccessFlagsOnly);
   }
+
+  // Show a warning info bar when kSafeMode switch is present.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          chromeos::switches::kSafeMode)) {
+    SimpleAlertInfoBarDelegate::Create(
+        InfoBarService::FromWebContents(flags_ui->web_ui()->GetWebContents()),
+        infobars::InfoBarDelegate::BAD_FLAGS_INFOBAR_DELEGATE,
+        &vector_icons::kWarningIcon,
+        l10n_util::GetStringUTF16(IDS_FLAGS_IGNORED_DUE_TO_CRASHY_CHROME),
+        /*auto_expire=*/false, /*should_animate=*/true);
+  }
 }
 #endif
 
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
index 921082a..c63c7ce9 100644
--- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
+++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
@@ -29,7 +29,6 @@
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/url_database.h"
 #include "components/omnibox/browser/autocomplete_classifier.h"
-#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_provider.h"
 #include "components/omnibox/browser/omnibox_controller_emitter.h"
@@ -205,23 +204,18 @@
   ResetController();
 }
 
-OmniboxPageHandler::~OmniboxPageHandler() {}
+OmniboxPageHandler::~OmniboxPageHandler() = default;
 
-void OmniboxPageHandler::OnResultChanged(bool default_match_changed) {
-  OnOmniboxResultChanged(default_match_changed, controller_.get());
-}
-
-void OmniboxPageHandler::OnOmniboxQuery(AutocompleteController* controller,
-                                        const AutocompleteInput& input) {
+void OmniboxPageHandler::OnStart(AutocompleteController* controller,
+                                 const AutocompleteInput& input) {
   time_omnibox_started_ = base::Time::Now();
   input_ = input;
   page_->HandleNewAutocompleteQuery(controller == controller_.get(),
                                     base::UTF16ToUTF8(input.text()));
 }
 
-void OmniboxPageHandler::OnOmniboxResultChanged(
-    bool default_match_changed,
-    AutocompleteController* controller) {
+void OmniboxPageHandler::OnResultChanged(AutocompleteController* controller,
+                                         bool default_match_changed) {
   mojom::OmniboxResponsePtr response(mojom::OmniboxResponse::New());
   response->cursor_position = input_.cursor_position();
   response->time_since_omnibox_started_ms =
@@ -355,8 +349,7 @@
     input.set_keyword_mode_entry_method(metrics::OmniboxEventProto::TAB);
   input.set_from_omnibox_focus(zero_suggest);
 
-  OnOmniboxQuery(controller_.get(), input);
-  controller_->Start(input_);
+  controller_->Start(input);
 }
 
 void OmniboxPageHandler::ResetController() {
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
index 2270286..2922746b 100644
--- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
+++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.h
@@ -14,7 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "chrome/browser/ui/webui/omnibox/omnibox.mojom.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
+#include "components/omnibox/browser/autocomplete_controller.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/omnibox_controller_emitter.h"
@@ -30,23 +30,19 @@
 // private AutocompleteController. It also listens for updates from the
 // AutocompleteController to OnResultChanged() and passes those results to
 // the OmniboxPage.
-class OmniboxPageHandler : public AutocompleteControllerDelegate,
-                           public mojom::OmniboxPageHandler,
-                           public OmniboxControllerEmitter::Observer {
+class OmniboxPageHandler : public AutocompleteController::Observer,
+                           public mojom::OmniboxPageHandler {
  public:
   // OmniboxPageHandler is deleted when the supplied pipe is destroyed.
   OmniboxPageHandler(Profile* profile,
                      mojo::PendingReceiver<mojom::OmniboxPageHandler> receiver);
   ~OmniboxPageHandler() override;
 
-  // AutocompleteControllerDelegate overrides:
-  void OnResultChanged(bool default_match_changed) override;
-
-  // OmniboxControllerEmitter::Observer overrides:
-  void OnOmniboxQuery(AutocompleteController* controller,
-                      const AutocompleteInput& input) override;
-  void OnOmniboxResultChanged(bool default_match_changed,
-                              AutocompleteController* controller) override;
+  // AutocompleteController::Observer overrides:
+  void OnStart(AutocompleteController* controller,
+               const AutocompleteInput& input) override;
+  void OnResultChanged(AutocompleteController* controller,
+                       bool default_match_changed) override;
 
   // mojom::OmniboxPageHandler overrides:
   void SetClientPage(mojo::PendingRemote<mojom::OmniboxPage> page) override;
@@ -93,7 +89,7 @@
 
   mojo::Receiver<mojom::OmniboxPageHandler> receiver_;
 
-  ScopedObserver<OmniboxControllerEmitter, OmniboxControllerEmitter::Observer>
+  ScopedObserver<OmniboxControllerEmitter, AutocompleteController::Observer>
       observer_;
 
   base::WeakPtrFactory<OmniboxPageHandler> weak_factory_{this};
diff --git a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
index 88f4a24d..1e11b2d 100644
--- a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
+++ b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
@@ -60,6 +60,8 @@
       return "Proxy Resolver";
     case content::SandboxType::kPdfConversion:
       return "PDF Conversion";
+    case content::SandboxType::kSharingService:
+      return "Sharing";
   }
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
index c36f49d5..02f197c 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
@@ -10,6 +10,7 @@
 #include "base/feature_list.h"
 #include "base/i18n/number_formatting.h"
 #include "base/no_destructor.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -591,8 +592,13 @@
        IDS_SETTINGS_WIFI_CONFIGURATIONS_CHECKBOX_LABEL},
       {"osSyncAppsCheckboxLabel", IDS_OS_SETTINGS_SYNC_APPS_CHECKBOX_LABEL},
       {"osSyncTurnOn", IDS_OS_SETTINGS_SYNC_TURN_ON},
+      {"osSyncFeatureLabel", IDS_OS_SETTINGS_SYNC_FEATURE_LABEL},
   };
   AddLocalizedStringsBulk(html_source, kLocalizedStrings);
+
+  html_source->AddString(
+      "browserSettingsSyncSetupUrl",
+      base::StrCat({chrome::kChromeUISettingsURL, chrome::kSyncSetupSubPage}));
 }
 
 void AddCrostiniStrings(content::WebUIDataSource* html_source,
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index b808956..e991f66 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -75,6 +75,7 @@
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/webui/web_ui_util.h"
+#include "ui/strings/grit/ui_strings.h"
 
 #if defined(OS_CHROMEOS)
 #include "ash/public/cpp/ash_switches.h"
@@ -155,6 +156,7 @@
     {"save", IDS_SAVE},
     {"searchResultBubbleText", IDS_SEARCH_RESULT_BUBBLE_TEXT},
     {"searchResultsBubbleText", IDS_SEARCH_RESULTS_BUBBLE_TEXT},
+    {"sentenceEnd", IDS_SENTENCE_END},
     {"settings", IDS_SETTINGS_SETTINGS},
     {"settingsAltPageTitle", IDS_SETTINGS_ALT_PAGE_TITLE},
     {"subpageArrowRoleDescription", IDS_SETTINGS_SUBPAGE_BUTTON},
@@ -821,6 +823,8 @@
        IDS_SETTINGS_PASSWORDS_AUTOSIGNIN_CHECKBOX_DESC},
       {"passwordsLeakDetectionLabel",
        IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_LABEL},
+      {"passwordsLeakDetectionGeneralDescription",
+       IDS_PASSWORD_MANAGER_LEAK_HELP_MESSAGE},
       {"passwordsLeakDetectionSignedOutEnabledDescription",
        IDS_SETTINGS_PASSWORDS_LEAK_DETECTION_SIGNED_OUT_ENABLED_DESC},
       {"savedPasswordsHeading", IDS_SETTINGS_PASSWORDS_SAVED_HEADING},
@@ -1072,6 +1076,7 @@
       {"privacyPageMore", IDS_SETTINGS_PRIVACY_MORE},
       {"doNotTrack", IDS_SETTINGS_ENABLE_DO_NOT_TRACK},
       {"doNotTrackDialogTitle", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TITLE},
+      // TODO(crbug.com/1062607): This string is no longer used. Remove.
       {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS},
       {"permissionsPageDescription", IDS_SETTINGS_PERMISSIONS_DESCRIPTION},
       {"securityPageTitle", IDS_SETTINGS_SECURITY},
diff --git a/chrome/browser/usb/usb_chooser_controller_unittest.cc b/chrome/browser/usb/usb_chooser_controller_unittest.cc
index fb20276..2eba1bea 100644
--- a/chrome/browser/usb/usb_chooser_controller_unittest.cc
+++ b/chrome/browser/usb/usb_chooser_controller_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chooser_controller/mock_chooser_controller_view.h"
 #include "chrome/browser/usb/usb_chooser_context.h"
 #include "chrome/browser/usb/usb_chooser_context_factory.h"
 #include "chrome/browser/usb/usb_chooser_controller.h"
@@ -25,25 +26,7 @@
 #include "url/gurl.h"
 
 namespace {
-
 const char kDefaultTestUrl[] = "https://www.google.com/";
-
-class MockUsbChooserView : public ChooserController::View {
- public:
-  MockUsbChooserView() {}
-
-  // ChooserController::View:
-  MOCK_METHOD1(OnOptionAdded, void(size_t index));
-  MOCK_METHOD1(OnOptionRemoved, void(size_t index));
-  void OnOptionsInitialized() override {}
-  void OnOptionUpdated(size_t index) override {}
-  void OnAdapterEnabledChanged(bool enabled) override {}
-  void OnRefreshStateChanged(bool enabled) override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockUsbChooserView);
-};
-
 }  //  namespace
 
 class UsbChooserControllerTest : public ChromeRenderViewHostTestHarness {
@@ -66,9 +49,9 @@
     UsbChooserContextFactory::GetForProfile(profile())
         ->SetDeviceManagerForTesting(std::move(device_manager));
 
-    usb_chooser_controller_.reset(new UsbChooserController(
-        main_rfh(), std::move(device_filters), std::move(callback)));
-    mock_usb_chooser_view_.reset(new MockUsbChooserView());
+    usb_chooser_controller_ = std::make_unique<UsbChooserController>(
+        main_rfh(), std::move(device_filters), std::move(callback));
+    mock_usb_chooser_view_ = std::make_unique<MockChooserControllerView>();
     usb_chooser_controller_->set_view(mock_usb_chooser_view_.get());
     // Make sure the device::mojom::UsbDeviceManager::SetClient() call has
     // been received.
@@ -85,7 +68,7 @@
 
   device::FakeUsbDeviceManager device_manager_;
   std::unique_ptr<UsbChooserController> usb_chooser_controller_;
-  std::unique_ptr<MockUsbChooserView> mock_usb_chooser_view_;
+  std::unique_ptr<MockChooserControllerView> mock_usb_chooser_view_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(UsbChooserControllerTest);
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
index 2148b3f..0fe8d46 100644
--- a/chrome/browser/vr/BUILD.gn
+++ b/chrome/browser/vr/BUILD.gn
@@ -189,6 +189,7 @@
     "//components/omnibox/browser:vector_icons",
     "//components/url_formatter",
     "//components/vector_icons",
+    "//device/base",
     "//device/vr/buildflags:buildflags",
     "//media",
     "//net",
diff --git a/chrome/browser/vr/test/webxr_vr_browser_test.cc b/chrome/browser/vr/test/webxr_vr_browser_test.cc
index 68f4f0a..8ab621f2 100644
--- a/chrome/browser/vr/test/webxr_vr_browser_test.cc
+++ b/chrome/browser/vr/test/webxr_vr_browser_test.cc
@@ -130,10 +130,10 @@
 
 WebXrVrRuntimelessBrowserTest::WebXrVrRuntimelessBrowserTest() {
 #if BUILDFLAG(ENABLE_WINDOWS_MR)
-  disable_features_.push_back(features::kWindowsMixedReality);
+  disable_features_.push_back(device::features::kWindowsMixedReality);
 #endif
 #if BUILDFLAG(ENABLE_OPENXR)
-  disable_features_.push_back(features::kOpenXR);
+  disable_features_.push_back(device::features::kOpenXR);
 #endif
 }
 
@@ -149,12 +149,12 @@
 #if defined(OS_WIN)
 
 WebXrVrOpenVrBrowserTestBase::WebXrVrOpenVrBrowserTestBase() {
-  enable_features_.push_back(features::kOpenVR);
+  enable_features_.push_back(device::features::kOpenVR);
 #if BUILDFLAG(ENABLE_WINDOWS_MR)
-  disable_features_.push_back(features::kWindowsMixedReality);
+  disable_features_.push_back(device::features::kWindowsMixedReality);
 #endif
 #if BUILDFLAG(ENABLE_OPENXR)
-  disable_features_.push_back(features::kOpenXR);
+  disable_features_.push_back(device::features::kOpenXR);
 #endif
 }
 
@@ -172,7 +172,7 @@
 
 WebXrVrWmrBrowserTestBase::WebXrVrWmrBrowserTestBase() {
 #if BUILDFLAG(ENABLE_OPENXR)
-  disable_features_.push_back(features::kOpenXR);
+  disable_features_.push_back(device::features::kOpenXR);
 #endif
 }
 
@@ -191,9 +191,9 @@
 #if BUILDFLAG(ENABLE_OPENXR)
 
 WebXrVrOpenXrBrowserTestBase::WebXrVrOpenXrBrowserTestBase() {
-  enable_features_.push_back(features::kOpenXR);
+  enable_features_.push_back(device::features::kOpenXR);
 #if BUILDFLAG(ENABLE_WINDOWS_MR)
-  disable_features_.push_back(features::kWindowsMixedReality);
+  disable_features_.push_back(device::features::kWindowsMixedReality);
 #endif
 }
 
diff --git a/chrome/browser/vr/test/webxr_vr_browser_test.h b/chrome/browser/vr/test/webxr_vr_browser_test.h
index cb3bfbc6..b34fdde6 100644
--- a/chrome/browser/vr/test/webxr_vr_browser_test.h
+++ b/chrome/browser/vr/test/webxr_vr_browser_test.h
@@ -10,7 +10,6 @@
 #include "chrome/browser/vr/test/mock_xr_device_hook_base.h"
 #include "chrome/browser/vr/test/webxr_browser_test.h"
 #include "chrome/browser/vr/test/xr_browser_test.h"
-#include "chrome/common/chrome_features.h"
 #include "components/permissions/permission_request_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
diff --git a/chrome/browser/vr/test/xr_browser_test.h b/chrome/browser/vr/test/xr_browser_test.h
index d01366d..b1f340e 100644
--- a/chrome/browser/vr/test/xr_browser_test.h
+++ b/chrome/browser/vr/test/xr_browser_test.h
@@ -15,11 +15,11 @@
 #include "build/build_config.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/vr/test/conditional_skipping.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
+#include "device/base/features.h"
 #include "device/vr/test/test_hook.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
index 4606501..536b9085 100644
--- a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
+++ b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
@@ -18,11 +18,11 @@
 #include "chrome/browser/vr/service/xr_runtime_manager.h"
 #include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/browser/vr/win/vr_browser_renderer_thread_win.h"
-#include "chrome/common/chrome_features.h"
 #include "components/permissions/permission_manager.h"
 #include "components/permissions/permission_result.h"
 #include "content/public/browser/device_service.h"
 #include "content/public/browser/navigation_entry.h"
+#include "device/base/features.h"
 #include "device/vr/buildflags/buildflags.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -34,7 +34,7 @@
 
 base::TimeDelta GetPermissionPromptTimeout(bool first_time) {
 #if BUILDFLAG(ENABLE_WINDOWS_MR)
-  if (base::FeatureList::IsEnabled(features::kWindowsMixedReality) &&
+  if (base::FeatureList::IsEnabled(device::features::kWindowsMixedReality) &&
       first_time)
     return base::TimeDelta::FromSeconds(10);
 #endif
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc
index a0b6ecb1..747af24 100644
--- a/chrome/browser/vr/ui_scene_creator.cc
+++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -72,12 +72,12 @@
 #include "chrome/browser/vr/ui_scene.h"
 #include "chrome/browser/vr/ui_scene_constants.h"
 #include "chrome/browser/vr/vector_icons/vector_icons.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/omnibox/browser/vector_icons.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/elide_url.h"
 #include "components/vector_icons/vector_icons.h"
+#include "device/base/features.h"
 #include "device/vr/buildflags/buildflags.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -1097,7 +1097,7 @@
 
 int GetIndicatorsTimeout() {
 #if BUILDFLAG(ENABLE_WINDOWS_MR)
-  if (base::FeatureList::IsEnabled(features::kWindowsMixedReality))
+  if (base::FeatureList::IsEnabled(device::features::kWindowsMixedReality))
     return kWmrInitialIndicatorsTimeoutSeconds;
 #endif
   return kToastTimeoutSeconds;
diff --git a/chrome/browser/web_applications/components/BUILD.gn b/chrome/browser/web_applications/components/BUILD.gn
index 9510178..dfed617c 100644
--- a/chrome/browser/web_applications/components/BUILD.gn
+++ b/chrome/browser/web_applications/components/BUILD.gn
@@ -164,7 +164,10 @@
 
   if (is_desktop_linux) {
     # Desktop linux, doesn't count ChromeOS.
-    sources += [ "web_app_shortcut_linux_unittest.cc" ]
+    sources += [
+      "web_app_file_handler_registration_linux_unittest.cc",
+      "web_app_shortcut_linux_unittest.cc",
+    ]
   }
 
   deps = [
@@ -194,6 +197,10 @@
 
   sources = [ "web_app_url_loader_browsertest.cc" ]
 
+  if (is_desktop_linux) {
+    sources += [ "web_app_file_handler_registration_linux_browsertest.cc" ]
+  }
+
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
 
   deps = [
diff --git a/chrome/browser/web_applications/components/web_app_file_handler_registration.h b/chrome/browser/web_applications/components/web_app_file_handler_registration.h
index 8fc1250..9700b74 100644
--- a/chrome/browser/web_applications/components/web_app_file_handler_registration.h
+++ b/chrome/browser/web_applications/components/web_app_file_handler_registration.h
@@ -7,11 +7,12 @@
 
 #include <string>
 
+#include "base/callback.h"
+#include "build/build_config.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 
-class Profile;
-
 namespace web_app {
 
 // True if file handlers are managed externally by the operating system, and
@@ -35,6 +36,26 @@
 // If a shim app was required, also removes the shim app.
 void UnregisterFileHandlersWithOs(const AppId& app_id, Profile* profile);
 
+#if defined(OS_LINUX)
+using RegisterMimeTypesOnLinuxCallback =
+    base::OnceCallback<bool(base::FilePath profile_path,
+                            std::string file_contents)>;
+
+// Exposed for testing purposes. Register the set of
+// MIME-type-to-file-extensions mappings corresponding to |file_handlers|. File
+// I/O and a a callout to the Linux shell are performed asynchronously in a
+// |callback|, which is set automatically on the usual install code path.
+void RegisterMimeTypesOnLinux(const AppId& app_id,
+                              Profile* profile,
+                              const apps::FileHandlers& file_handlers,
+                              RegisterMimeTypesOnLinuxCallback callback);
+
+// Override the default |callback| passed to RegisterMimeTypesOnLinux. Used in
+// automated browser tests.
+void SetRegisterMimeTypesOnLinuxCallbackForTesting(
+    RegisterMimeTypesOnLinuxCallback callback);
+#endif
+
 }  // namespace web_app
 
 #endif  // CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_WEB_APP_FILE_HANDLER_REGISTRATION_H_
diff --git a/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc
index 1f058b49..dba2219 100644
--- a/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc
+++ b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux.cc
@@ -6,6 +6,11 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/no_destructor.h"
+#include "chrome/browser/shell_integration_linux.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/app_shortcut_manager.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
@@ -37,6 +42,38 @@
       app_id, base::BindOnce(&OnShortcutInfoReceived));
 }
 
+void OnRegisterMimeTypes(bool registration_succeeded) {
+  if (!registration_succeeded)
+    LOG(ERROR) << "Registering MIME types failed.";
+}
+
+bool DoRegisterMimeTypes(base::FilePath filename, std::string file_contents) {
+  DCHECK(!filename.empty() && !file_contents.empty());
+
+  base::ScopedTempDir temp_dir;
+  if (!temp_dir.CreateUniqueTempDir())
+    return false;
+
+  base::FilePath temp_file_path(temp_dir.GetPath().Append(filename));
+
+  int bytes_written = base::WriteFile(temp_file_path, file_contents.data(),
+                                      file_contents.length());
+  if (bytes_written != static_cast<int>(file_contents.length()))
+    return false;
+
+  std::vector<std::string> argv{"xdg-mime", "install", "--mode", "user",
+                                temp_file_path.value()};
+
+  int exit_code;
+  shell_integration_linux::LaunchXdgUtility(argv, &exit_code);
+  return exit_code == 0;
+}
+
+RegisterMimeTypesOnLinuxCallback& GetRegisterMimeTypesCallbackForTesting() {
+  static base::NoDestructor<RegisterMimeTypesOnLinuxCallback> instance;
+  return *instance;
+}
+
 }  // namespace
 
 bool ShouldRegisterFileHandlersWithOs() {
@@ -47,6 +84,15 @@
                                 const std::string& app_name,
                                 Profile* profile,
                                 const apps::FileHandlers& file_handlers) {
+  if (!file_handlers.empty()) {
+    RegisterMimeTypesOnLinuxCallback callback =
+        GetRegisterMimeTypesCallbackForTesting()
+            ? std::move(GetRegisterMimeTypesCallbackForTesting())
+            : base::BindOnce(&DoRegisterMimeTypes);
+    RegisterMimeTypesOnLinux(app_id, profile, file_handlers,
+                             std::move(callback));
+  }
+
   UpdateFileHandlerRegistrationInOs(app_id, profile);
 }
 
@@ -61,4 +107,29 @@
   UpdateFileHandlerRegistrationInOs(app_id, profile);
 }
 
+void RegisterMimeTypesOnLinux(const AppId& app_id,
+                              Profile* profile,
+                              const apps::FileHandlers& file_handlers,
+                              RegisterMimeTypesOnLinuxCallback callback) {
+  DCHECK(!app_id.empty() && !file_handlers.empty());
+
+  base::FilePath filename =
+      shell_integration_linux::GetMimeTypesRegistrationFilename(
+          profile->GetPath(), app_id);
+  std::string file_contents =
+      shell_integration_linux::GetMimeTypesRegistrationFileContents(
+          file_handlers);
+
+  internals::GetShortcutIOTaskRunner()->PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(std::move(callback), std::move(filename),
+                     std::move(file_contents)),
+      base::BindOnce(&OnRegisterMimeTypes));
+}
+
+void SetRegisterMimeTypesOnLinuxCallbackForTesting(
+    RegisterMimeTypesOnLinuxCallback callback) {
+  GetRegisterMimeTypesCallbackForTesting() = std::move(callback);
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_file_handler_registration_linux_browsertest.cc b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux_browsertest.cc
new file mode 100644
index 0000000..c8fa874
--- /dev/null
+++ b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux_browsertest.cc
@@ -0,0 +1,126 @@
+// Copyright 2020 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.
+
+#include "chrome/browser/web_applications/components/web_app_file_handler_registration.h"
+
+#include <map>
+#include <string>
+
+#include "base/containers/flat_set.h"
+#include "base/files/file_path.h"
+#include "base/optional.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/shell_integration_linux.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
+#include "chrome/browser/web_applications/components/app_registrar.h"
+#include "chrome/browser/web_applications/components/external_install_options.h"
+#include "chrome/browser/web_applications/components/externally_installed_web_app_prefs.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
+#include "chrome/browser/web_applications/components/web_app_provider_base.h"
+#include "chrome/browser/web_applications/test/web_app_test.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "third_party/blink/public/common/features.h"
+#include "url/gurl.h"
+
+namespace web_app {
+
+namespace {
+
+using AcceptMap = std::map<std::string, base::flat_set<std::string>>;
+
+apps::FileHandler GetTestFileHandler(const std::string& action,
+                                     const AcceptMap& accept_map) {
+  apps::FileHandler file_handler;
+  file_handler.action = GURL(action);
+  for (const auto& elem : accept_map) {
+    apps::FileHandler::AcceptEntry accept_entry;
+    accept_entry.mime_type = elem.first;
+    accept_entry.file_extensions.insert(elem.second.begin(), elem.second.end());
+    file_handler.accept.push_back(accept_entry);
+  }
+  return file_handler;
+}
+
+}  // namespace
+
+class WebAppFileHandlerRegistrationLinuxBrowserTest
+    : public InProcessBrowserTest,
+      public ::testing::WithParamInterface<ProviderType> {
+ protected:
+  WebAppFileHandlerRegistrationLinuxBrowserTest() {
+    if (GetParam() == ProviderType::kWebApps) {
+      scoped_feature_list_.InitWithFeatures(
+          {blink::features::kNativeFileSystemAPI,
+           blink::features::kFileHandlingAPI,
+           features::kDesktopPWAsWithoutExtensions},
+          {});
+    } else if (GetParam() == ProviderType::kBookmarkApps) {
+      scoped_feature_list_.InitWithFeatures(
+          {blink::features::kNativeFileSystemAPI,
+           blink::features::kFileHandlingAPI},
+          {features::kDesktopPWAsWithoutExtensions});
+    }
+  }
+
+  AppRegistrar& registrar() {
+    return WebAppProviderBase::GetProviderBase(browser()->profile())
+        ->registrar();
+  }
+
+  void InstallApp(ExternalInstallOptions install_options) {
+    result_code_ = web_app::PendingAppManagerInstall(browser()->profile(),
+                                                     install_options);
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+  base::Optional<InstallResultCode> result_code_;
+};
+
+// Verify that the MIME type registration callback is called and that
+// the caller behaves as expected.
+IN_PROC_BROWSER_TEST_P(WebAppFileHandlerRegistrationLinuxBrowserTest,
+                       RegisterMimeTypesOnLinuxCallbackCalledSuccessfully) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL url(embedded_test_server()->GetURL(
+      "/banners/"
+      "manifest_test_page.html?manifest=manifest_with_file_handlers.json"));
+
+  apps::FileHandlers file_handlers;
+  file_handlers.push_back(GetTestFileHandler(
+      "https://site.api/open-foo",
+      {{"application/foo", {".foo"}}, {"application/foobar", {".foobar"}}}));
+  file_handlers.push_back(GetTestFileHandler(
+      "https://site.api/open-bar", {{"application/bar", {".bar", ".baz"}}}));
+
+  std::string expected_file_contents =
+      shell_integration_linux::GetMimeTypesRegistrationFileContents(
+          file_handlers);
+  bool path_reached = false;
+
+  RegisterMimeTypesOnLinuxCallback callback = base::BindLambdaForTesting(
+      [&expected_file_contents, &path_reached](base::FilePath filename,
+                                               std::string file_contents) {
+        EXPECT_EQ(file_contents, expected_file_contents);
+        path_reached = true;
+        return true;
+      });
+  SetRegisterMimeTypesOnLinuxCallbackForTesting(std::move(callback));
+
+  InstallApp(CreateInstallOptions(url));
+  EXPECT_EQ(InstallResultCode::kSuccessNewInstall, result_code_.value());
+  ASSERT_TRUE(path_reached);
+}
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         WebAppFileHandlerRegistrationLinuxBrowserTest,
+                         ::testing::Values(ProviderType::kBookmarkApps,
+                                           ProviderType::kWebApps),
+                         ProviderTypeParamToString);
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_file_handler_registration_linux_unittest.cc b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux_unittest.cc
new file mode 100644
index 0000000..d70f699
--- /dev/null
+++ b/chrome/browser/web_applications/components/web_app_file_handler_registration_linux_unittest.cc
@@ -0,0 +1,75 @@
+// Copyright 2020 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.
+
+#include "chrome/browser/web_applications/components/web_app_file_handler_registration.h"
+
+#include <map>
+#include <string>
+
+#include "base/containers/flat_set.h"
+#include "base/files/file_path.h"
+#include "base/test/bind_test_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/shell_integration_linux.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
+#include "chrome/browser/web_applications/test/web_app_test.h"
+#include "components/services/app_service/public/cpp/file_handler.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace web_app {
+
+typedef WebAppTest WebAppFileHandlerRegistrationLinuxTest;
+
+namespace {
+
+using AcceptMap = std::map<std::string, base::flat_set<std::string>>;
+
+apps::FileHandler GetTestFileHandler(const std::string& action,
+                                     const AcceptMap& accept_map) {
+  apps::FileHandler file_handler;
+  file_handler.action = GURL(action);
+  for (const auto& elem : accept_map) {
+    apps::FileHandler::AcceptEntry accept_entry;
+    accept_entry.mime_type = elem.first;
+    accept_entry.file_extensions.insert(elem.second.begin(), elem.second.end());
+    file_handler.accept.push_back(accept_entry);
+  }
+  return file_handler;
+}
+
+}  // namespace
+
+TEST_F(WebAppFileHandlerRegistrationLinuxTest,
+       RegisterMimeTypesLocalVariablesAreCorrect) {
+  Profile* test_profile = profile();
+  const AppId& app_id("app-id");
+
+  apps::FileHandlers file_handlers;
+  file_handlers.push_back(GetTestFileHandler(
+      "https://site.api/open-foo",
+      {{"application/foo", {".foo"}}, {"application/foobar", {".foobar"}}}));
+  file_handlers.push_back(GetTestFileHandler(
+      "https://site.api/open-bar", {{"application/bar", {".bar", ".baz"}}}));
+
+  base::FilePath expected_filename =
+      shell_integration_linux::GetMimeTypesRegistrationFilename(
+          test_profile->GetPath(), app_id);
+  std::string expected_file_contents =
+      shell_integration_linux::GetMimeTypesRegistrationFileContents(
+          file_handlers);
+
+  RegisterMimeTypesOnLinuxCallback callback = base::BindLambdaForTesting(
+      [expected_filename, expected_file_contents](base::FilePath filename,
+                                                  std::string file_contents) {
+        EXPECT_EQ(filename, expected_filename);
+        EXPECT_EQ(file_contents, expected_file_contents);
+        return true;
+      });
+
+  RegisterMimeTypesOnLinux(app_id, test_profile, file_handlers,
+                           std::move(callback));
+}
+
+}  // namespace web_app
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 878d937..4e66a253 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -344,31 +344,6 @@
 // Enables Focus Mode which brings up a PWA-like window look.
 const base::Feature kFocusMode{"FocusMode", base::FEATURE_DISABLED_BY_DEFAULT};
 
-#if BUILDFLAG(ENABLE_VR)
-
-#if BUILDFLAG(ENABLE_OCULUS_VR)
-// Controls Oculus support.
-const base::Feature kOculusVR{"OculusVR", base::FEATURE_DISABLED_BY_DEFAULT};
-#endif  // ENABLE_OCULUS_VR
-
-#if BUILDFLAG(ENABLE_OPENVR)
-// Controls OpenVR support.
-const base::Feature kOpenVR{"OpenVR", base::FEATURE_DISABLED_BY_DEFAULT};
-#endif  // ENABLE_OPENVR
-
-#if BUILDFLAG(ENABLE_WINDOWS_MR)
-// Controls Windows Mixed Reality support.
-const base::Feature kWindowsMixedReality{"WindowsMixedReality",
-                                         base::FEATURE_ENABLED_BY_DEFAULT};
-#endif  // ENABLE_WINDOWS_MR
-
-#if BUILDFLAG(ENABLE_OPENXR)
-// Controls OpenXR support.
-const base::Feature kOpenXR{"OpenXR", base::FEATURE_ENABLED_BY_DEFAULT};
-#endif  // ENABLE_OPENXR
-
-#endif  // BUILDFLAG(ENABLE_VR)
-
 #if defined(OS_WIN)
 // Enables using GDI to print text as simply text.
 const base::Feature kGdiTextPrinting{"GdiTextPrinting",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index fd875a66..5fc21f5 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -213,24 +213,6 @@
 extern const base::Feature kVrBrowsingExperimentalFeatures;
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kVrBrowsingExperimentalRendering;
-
-#if BUILDFLAG(ENABLE_OCULUS_VR)
-COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kOculusVR;
-#endif  // ENABLE_OCULUS_VR
-
-#if BUILDFLAG(ENABLE_OPENVR)
-COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kOpenVR;
-#endif  // ENABLE_OPENVR
-
-#if BUILDFLAG(ENABLE_WINDOWS_MR)
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::Feature kWindowsMixedReality;
-#endif  // ENABLE_WINDOWS_MR
-
-#if BUILDFLAG(ENABLE_OPENXR)
-COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kOpenXR;
-#endif  // ENABLE_OPENXR
-
 #endif  // ENABLE_VR
 
 #if defined(OS_WIN)
diff --git a/chrome/installer/setup/archive_patch_helper.cc b/chrome/installer/setup/archive_patch_helper.cc
index fcb9a5f6c..a85771b1 100644
--- a/chrome/installer/setup/archive_patch_helper.cc
+++ b/chrome/installer/setup/archive_patch_helper.cc
@@ -49,12 +49,9 @@
 
   // UnPackArchive takes care of logging.
   base::FilePath output_file;
-  base::Optional<DWORD> error_code;
-  base::Optional<int32_t> ntstatus;
   UnPackStatus unpack_status =
-      UnPackArchive(compressed_archive_, working_directory_, &output_file,
-                    &error_code, &ntstatus);
-  RecordUnPackMetrics(unpack_status, ntstatus, error_code, consumer_);
+      UnPackArchive(compressed_archive_, working_directory_, &output_file);
+  RecordUnPackMetrics(unpack_status, consumer_);
   if (unpack_status != UNPACK_NO_ERROR)
     return false;
 
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 0336b3a3..2ea9e43 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -272,6 +272,25 @@
   // --- Background (>90%) ---
   //   Full archive: 22s (50%ile) / >3m (99%ile)
   //   Archive patch: ~2s (50%ile) / 1.5m - >3m (99%ile)
+  //
+  // The top unpack failure result with 28 days aggregation (>=0.01%)
+  // Setup.Install.LzmaUnPackResult_CompressedChromeArchive
+  // 13.50% DISK_FULL
+  // 0.67% ERROR_NO_SYSTEM_RESOURCES
+  // 0.12% ERROR_IO_DEVICE
+  // 0.05% INVALID_HANDLE
+  // 0.01% INVALID_LEVEL
+  // 0.01% FILE_NOT_FOUND
+  // 0.01% LOCK_VIOLATION
+  // 0.01% ACCESS_DENIED
+  //
+  // Setup.Install.LzmaUnPackResult_ChromeArchivePatch
+  // 0.09% DISK_FULL
+  // 0.01% FILE_NOT_FOUND
+  //
+  // More information can also be found with metrics:
+  // Setup.Install.LzmaUnPackNTSTATUS_CompressedChromeArchive
+  // Setup.Install.LzmaUnPackNTSTATUS_ChromeArchivePatch
   if (!archive_helper->Uncompress(NULL)) {
     *install_status = installer::UNCOMPRESSION_FAILED;
     installer_state.WriteInstallerResult(*install_status,
@@ -813,6 +832,12 @@
       base::FilePath compressed_archive(cmd_line.GetSwitchValuePath(
           installer::switches::kUpdateSetupExe));
       VLOG(1) << "Opening archive " << compressed_archive.value();
+      // The top unpack failure result with 28 days aggregation (>=0.01%)
+      // Setup.Install.LzmaUnPackResult_SetupExePatch
+      // 0.02% PATH_NOT_FOUND
+      //
+      // More information can also be found with metric:
+      // Setup.Install.LzmaUnPackNTSTATUS_SetupExePatch
       if (installer::ArchivePatchHelper::UncompressAndPatch(
               temp_path.GetPath(), compressed_archive, setup_exe,
               cmd_line.GetSwitchValuePath(installer::switches::kNewSetupExe),
@@ -1100,12 +1125,22 @@
   //   <2.7s (50%ile) / 45s (99%ile)
   // --- Background ---
   //   ~14s (50%ile) / >3m (99%ile)
+  //
+  // The top unpack failure result with 28 days aggregation (>=0.01%)
+  // Setup.Install.LzmaUnPackResult_UncompressedChromeArchive
+  // 0.66% DISK_FULL
+  // 0.04% ACCESS_DENIED
+  // 0.01% INVALID_HANDLE
+  // 0.01% ERROR_NO_SYSTEM_RESOURCES
+  // 0.01% PATH_NOT_FOUND
+  // 0.01% ERROR_IO_DEVICE
+  //
+  // More information can also be found with metric:
+  // Setup.Install.LzmaUnPackNTSTATUS_UncompressedChromeArchive
   installer_state.SetStage(UNPACKING);
-  base::Optional<DWORD> error_code;
-  base::Optional<int32_t> ntstatus;
   UnPackStatus unpack_status = UnPackArchive(uncompressed_archive, unpack_path,
-                                             nullptr, &error_code, &ntstatus);
-  RecordUnPackMetrics(unpack_status, ntstatus, error_code,
+                                             /*output_file=*/nullptr);
+  RecordUnPackMetrics(unpack_status,
                       UnPackConsumer::UNCOMPRESSED_CHROME_ARCHIVE);
   if (unpack_status != UNPACK_NO_ERROR) {
     installer_state.WriteInstallerResult(
diff --git a/chrome/installer/setup/setup_util.cc b/chrome/installer/setup/setup_util.cc
index dad6aa47..c9f353a 100644
--- a/chrome/installer/setup/setup_util.cc
+++ b/chrome/installer/setup/setup_util.cc
@@ -185,8 +185,6 @@
 
 }  // namespace
 
-const char kUnPackNTSTATUSMetricsName[] = "Setup.Install.LzmaUnPackNTSTATUS";
-const char kUnPackResultMetricsName[] = "Setup.Install.LzmaUnPackResult";
 const char kUnPackStatusMetricsName[] = "Setup.Install.LzmaUnPackStatus";
 
 int CourgettePatchFiles(const base::FilePath& src,
@@ -606,8 +604,6 @@
 }
 
 void RecordUnPackMetrics(UnPackStatus unpack_status,
-                         base::Optional<int32_t> ntstatus,
-                         base::Optional<DWORD> error_code,
                          UnPackConsumer consumer) {
   std::string consumer_name = "";
 
@@ -629,17 +625,6 @@
   base::UmaHistogramExactLinear(
       std::string(std::string(kUnPackStatusMetricsName) + "_" + consumer_name),
       unpack_status, UNPACK_STATUS_COUNT);
-
-  if (error_code.has_value()) {
-    base::UmaHistogramSparse(
-        std::string(kUnPackResultMetricsName) + "_" + consumer_name,
-        *error_code);
-  }
-  if (ntstatus.has_value()) {
-    base::UmaHistogramSparse(
-        std::string(kUnPackNTSTATUSMetricsName) + "_" + consumer_name,
-        *ntstatus);
-  }
 }
 
 void RegisterEventLogProvider(const base::FilePath& install_directory,
diff --git a/chrome/installer/setup/setup_util.h b/chrome/installer/setup/setup_util.h
index d4e33a9..c389948 100644
--- a/chrome/installer/setup/setup_util.h
+++ b/chrome/installer/setup/setup_util.h
@@ -33,8 +33,6 @@
 class InstallerState;
 class MasterPreferences;
 
-extern const char kUnPackNTSTATUSMetricsName[];
-extern const char kUnPackResultMetricsName[];
 extern const char kUnPackStatusMetricsName[];
 
 // The name of consumers of UnPackArchive which is used to publish metrics.
@@ -123,8 +121,6 @@
 
 // Records UMA metrics for unpack result.
 void RecordUnPackMetrics(UnPackStatus unpack_status,
-                         base::Optional<int32_t> ntstatus,
-                         base::Optional<DWORD> error_code,
                          UnPackConsumer consumer);
 
 // Register Chrome's EventLog message provider dll.
diff --git a/chrome/installer/setup/setup_util_unittest.cc b/chrome/installer/setup/setup_util_unittest.cc
index 79d3027..71bc2a36 100644
--- a/chrome/installer/setup/setup_util_unittest.cc
+++ b/chrome/installer/setup/setup_util_unittest.cc
@@ -258,26 +258,17 @@
   base::HistogramTester histogram_tester;
   std::string unpack_status_metrics_name =
       std::string(installer::kUnPackStatusMetricsName) + "_SetupExePatch";
-  std::string unpack_result_metrics_name =
-      std::string(installer::kUnPackResultMetricsName) + "_SetupExePatch";
-  std::string ntstatus_metrics_name =
-      std::string(installer::kUnPackNTSTATUSMetricsName) + "_SetupExePatch";
   histogram_tester.ExpectTotalCount(unpack_status_metrics_name, 0);
 
-  RecordUnPackMetrics(UnPackStatus::UNPACK_NO_ERROR, base::nullopt,
-                      base::nullopt,
+  RecordUnPackMetrics(UnPackStatus::UNPACK_NO_ERROR,
                       installer::UnPackConsumer::SETUP_EXE_PATCH);
   histogram_tester.ExpectTotalCount(unpack_status_metrics_name, 1);
   histogram_tester.ExpectBucketCount(unpack_status_metrics_name, 0, 1);
 
-  RecordUnPackMetrics(UnPackStatus::UNPACK_EXTRACT_ERROR, 1, 2,
+  RecordUnPackMetrics(UnPackStatus::UNPACK_EXTRACT_ERROR,
                       installer::UnPackConsumer::SETUP_EXE_PATCH);
   histogram_tester.ExpectTotalCount(unpack_status_metrics_name, 2);
   histogram_tester.ExpectBucketCount(unpack_status_metrics_name, 4, 1);
-  histogram_tester.ExpectTotalCount(unpack_result_metrics_name, 1);
-  histogram_tester.ExpectBucketCount(unpack_result_metrics_name, 2, 1);
-  histogram_tester.ExpectTotalCount(ntstatus_metrics_name, 1);
-  histogram_tester.ExpectBucketCount(ntstatus_metrics_name, 1, 1);
 }
 
 namespace {
diff --git a/chrome/installer/test/alternate_version_generator.cc b/chrome/installer/test/alternate_version_generator.cc
index 802ab9a6..b31eb3bc 100644
--- a/chrome/installer/test/alternate_version_generator.cc
+++ b/chrome/installer/test/alternate_version_generator.cc
@@ -648,8 +648,8 @@
 
   // Unpack chrome.packed.7z (static build only).
   if (!chrome_packed_7z.empty()) {
-    if (UnPackArchive(chrome_packed_7z, work_dir.directory(), &chrome_7z,
-                      nullptr, nullptr) != UNPACK_NO_ERROR) {
+    if (UnPackArchive(chrome_packed_7z, work_dir.directory(), &chrome_7z) !=
+        UNPACK_NO_ERROR) {
       LOG(DFATAL) << "Failed unpacking \"" << chrome_packed_7z.value() << "\"";
       return false;
     }
@@ -657,8 +657,8 @@
   DCHECK(!chrome_7z.empty());
 
   // Unpack chrome.7z
-  if (UnPackArchive(chrome_7z, work_dir.directory(), nullptr, nullptr,
-                    nullptr) != UNPACK_NO_ERROR) {
+  if (UnPackArchive(chrome_7z, work_dir.directory(), /*output_file=*/nullptr) !=
+      UNPACK_NO_ERROR) {
     LOG(DFATAL) << "Failed unpacking \"" << chrome_7z.value() << "\"";
     return false;
   }
diff --git a/chrome/installer/util/lzma_util.cc b/chrome/installer/util/lzma_util.cc
index 053db397..f20c13d 100644
--- a/chrome/installer/util/lzma_util.cc
+++ b/chrome/installer/util/lzma_util.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/installer/util/lzma_util.h"
 
+#include <ntstatus.h>
 #include <windows.h>
 
 #include <stddef.h>
@@ -28,6 +29,9 @@
 
 namespace {
 
+// define NTSTATUS to avoid including winternl.h
+using NTSTATUS = LONG;
+
 SRes LzmaReadFile(HANDLE file, void* data, size_t* size) {
   if (*size == 0)
     return SZ_OK;
@@ -112,9 +116,7 @@
 
 UnPackStatus UnPackArchive(const base::FilePath& archive,
                            const base::FilePath& output_dir,
-                           base::FilePath* output_file,
-                           base::Optional<DWORD>* error_code,
-                           base::Optional<int32_t>* ntstatus) {
+                           base::FilePath* output_file) {
   VLOG(1) << "Opening archive " << archive.value();
   LzmaUtilImpl lzma_util;
   UnPackStatus status;
@@ -125,10 +127,15 @@
     if ((status = lzma_util.UnPack(output_dir, output_file)) != UNPACK_NO_ERROR)
       PLOG(ERROR) << "Unable to uncompress archive: " << archive.value();
   }
-  if (error_code)
-    *error_code = lzma_util.GetErrorCode();
-  if (ntstatus)
-    *ntstatus = lzma_util.GetNTSTATUSCode();
+
+  if (status != UNPACK_NO_ERROR) {
+    base::Optional<DWORD> error_code = lzma_util.GetErrorCode();
+    if (error_code.value_or(ERROR_SUCCESS) == ERROR_DISK_FULL)
+      return UNPACK_DISK_FULL;
+    if (error_code.value_or(ERROR_SUCCESS) == ERROR_IO_DEVICE)
+      return UNPACK_IO_DEVICE_ERROR;
+  }
+
   return status;
 }
 
@@ -312,8 +319,25 @@
               << "EXCEPTION_IN_PAGE_ERROR while accessing mapped memory; "
                  "NTSTATUS = "
               << ntstatus;
-          ntstatus_ = ntstatus;
-          return UNPACK_EXTRACT_EXCEPTION;
+          // Return IO_DEVICE_ERROR for all known error except DISK_FULL,
+          // IN_PAGE_ERROR and ACCESS_DENIED.
+          switch (ntstatus) {
+            case STATUS_DEVICE_DATA_ERROR:
+            case STATUS_DEVICE_HARDWARE_ERROR:
+            case STATUS_DEVICE_NOT_CONNECTED:
+            case STATUS_INVALID_DEVICE_REQUEST:
+            case STATUS_INVALID_LEVEL:
+            case STATUS_IO_DEVICE_ERROR:
+            case STATUS_IO_TIMEOUT:
+            case STATUS_NO_SUCH_DEVICE:
+              return UNPACK_IO_DEVICE_ERROR;
+            case STATUS_DISK_FULL:
+              return UNPACK_DISK_FULL;
+            default:
+              // This error indicates an unexpected error. Spikes in this are
+              // worth investigation.
+              return UNPACK_EXTRACT_EXCEPTION;
+          }
         }
       }
 
@@ -373,7 +397,6 @@
 void LzmaUtilImpl::CloseArchive() {
   archive_file_.Close();
   error_code_ = base::nullopt;
-  ntstatus_ = base::nullopt;
 }
 
 bool LzmaUtilImpl::CreateDirectory(const base::FilePath& dir) {
diff --git a/chrome/installer/util/lzma_util.h b/chrome/installer/util/lzma_util.h
index b637545..0444160 100644
--- a/chrome/installer/util/lzma_util.h
+++ b/chrome/installer/util/lzma_util.h
@@ -29,20 +29,18 @@
   // UNPACK_CLOSE_FILE_ERROR = 10, Deprecated.
   UNPACK_ALLOCATE_ERROR = 11,
   UNPACK_CRC_ERROR = 12,
+  UNPACK_DISK_FULL = 13,
+  UNPACK_IO_DEVICE_ERROR = 14,
   UNPACK_STATUS_COUNT,
 };
 
 // Unpacks the contents of |archive| into |output_dir|. |output_file|, if not
 // null, is populated with the name of the last (or only) member extracted from
 // the archive. Returns UNPACK_NO_ERROR on success. Otherwise, returns a status
-// value indicating the operation that failed, populates |error_code| (if not
-// null) with a Windows error code and |ntstatus| with an exception code, if
-// any.
+// value indicating the operation that failed.
 UnPackStatus UnPackArchive(const base::FilePath& archive,
                            const base::FilePath& output_dir,
-                           base::FilePath* output_file,
-                           base::Optional<DWORD>* error_code,
-                           base::Optional<int32_t>* ntstatus);
+                           base::FilePath* output_file);
 
 // A utility class that wraps LZMA SDK library. Prefer UnPackArchive over using
 // this class directly.
@@ -61,10 +59,9 @@
   UnPackStatus UnPack(const base::FilePath& location,
                       base::FilePath* output_file);
 
-  void CloseArchive();
-
   base::Optional<DWORD> GetErrorCode() { return error_code_; }
-  base::Optional<int32_t> GetNTSTATUSCode() { return ntstatus_; }
+
+  void CloseArchive();
 
  protected:
   bool CreateDirectory(const base::FilePath& dir);
@@ -73,8 +70,6 @@
   base::File archive_file_;
   std::set<base::FilePath> directories_created_;
   base::Optional<DWORD> error_code_;
-  // Can't include ntstatus.h as it's conflicted with winnt.h
-  base::Optional<int32_t> ntstatus_;
 
   DISALLOW_COPY_AND_ASSIGN(LzmaUtilImpl);
 };
diff --git a/chrome/installer/util/lzma_util_unittest.cc b/chrome/installer/util/lzma_util_unittest.cc
index a744d3b3..a586c5bf 100644
--- a/chrome/installer/util/lzma_util_unittest.cc
+++ b/chrome/installer/util/lzma_util_unittest.cc
@@ -66,7 +66,6 @@
   EXPECT_EQ(UNPACK_NO_ERROR, lzma_util.OpenArchive(archive));
   base::FilePath unpacked_file;
   EXPECT_EQ(UNPACK_NO_ERROR, lzma_util.UnPack(extract_dir, &unpacked_file));
-  EXPECT_FALSE(lzma_util.GetErrorCode());
 
   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("a.exe")));
   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("a.exe"));
@@ -76,7 +75,6 @@
   EXPECT_EQ(UNPACK_NO_ERROR, lzma_util.UnPack(extract_dir, &unpacked_file));
   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("b.exe")));
   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("b.exe"));
-  EXPECT_FALSE(lzma_util.GetErrorCode());
 
   lzma_util.CloseArchive();
   archive = data_dir_.AppendASCII("invalid_archive.7z");
@@ -106,21 +104,20 @@
   base::FilePath archive = data_dir_.AppendASCII("archive1.7z");
   base::FilePath unpacked_file;
 
-  EXPECT_EQ(UNPACK_NO_ERROR, UnPackArchive(archive, extract_dir, &unpacked_file,
-                                           nullptr, nullptr));
+  EXPECT_EQ(UNPACK_NO_ERROR,
+            UnPackArchive(archive, extract_dir, &unpacked_file));
 
   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("a.exe")));
   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("a.exe"));
 
   archive = data_dir_.AppendASCII("archive2.7z");
-  EXPECT_EQ(UNPACK_NO_ERROR, UnPackArchive(archive, extract_dir, &unpacked_file,
-                                           nullptr, nullptr));
+  EXPECT_EQ(UNPACK_NO_ERROR,
+            UnPackArchive(archive, extract_dir, &unpacked_file));
 
   EXPECT_TRUE(base::PathExists(extract_dir.AppendASCII("b.exe")));
   EXPECT_TRUE(unpacked_file == extract_dir.AppendASCII("b.exe"));
 
   archive = data_dir_.AppendASCII("invalid_archive.7z");
-  EXPECT_EQ(
-      UNPACK_SZAREX_OPEN_ERROR,
-      UnPackArchive(archive, extract_dir, &unpacked_file, nullptr, nullptr));
+  EXPECT_EQ(UNPACK_SZAREX_OPEN_ERROR,
+            UnPackArchive(archive, extract_dir, &unpacked_file));
 }
diff --git a/chrome/services/isolated_xr_device/BUILD.gn b/chrome/services/isolated_xr_device/BUILD.gn
index 5e3335e..d850138a 100644
--- a/chrome/services/isolated_xr_device/BUILD.gn
+++ b/chrome/services/isolated_xr_device/BUILD.gn
@@ -22,7 +22,7 @@
 
   deps = [
     "//base",
-    "//chrome/common",
+    "//device/base",
     "//device/vr:vr",
     "//device/vr/public/mojom",
     "//device/vr/public/mojom:test_mojom",
diff --git a/chrome/services/isolated_xr_device/DEPS b/chrome/services/isolated_xr_device/DEPS
index 4a8d7e8..2b91ccf 100644
--- a/chrome/services/isolated_xr_device/DEPS
+++ b/chrome/services/isolated_xr_device/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+device/base",
   "+device/vr",
   "+mojo/public",
 ]
diff --git a/chrome/services/isolated_xr_device/xr_runtime_provider.cc b/chrome/services/isolated_xr_device/xr_runtime_provider.cc
index 79a5ad87..a26cc69e 100644
--- a/chrome/services/isolated_xr_device/xr_runtime_provider.cc
+++ b/chrome/services/isolated_xr_device/xr_runtime_provider.cc
@@ -8,8 +8,8 @@
 #include "base/command_line.h"
 #include "base/compiler_specific.h"
 #include "base/trace_event/trace_event.h"
-#include "chrome/common/chrome_features.h"
 #include "content/public/common/content_switches.h"
+#include "device/base/features.h"
 #include "device/vr/buildflags/buildflags.h"
 #include "device/vr/vr_device_base.h"
 
@@ -156,7 +156,7 @@
   ALLOW_UNUSED_LOCAL(command_line);
 
 #if BUILDFLAG(ENABLE_OCULUS_VR)
-  if (IsEnabled(command_line, features::kOculusVR,
+  if (IsEnabled(command_line, device::features::kOculusVR,
                 switches::kWebXrRuntimeOculus)) {
     should_check_oculus_ = device::OculusDevice::IsApiAvailable();
     any_runtimes_available |= should_check_oculus_;
@@ -164,7 +164,7 @@
 #endif
 
 #if BUILDFLAG(ENABLE_OPENVR)
-  if (IsEnabled(command_line, features::kOpenVR,
+  if (IsEnabled(command_line, device::features::kOpenVR,
                 switches::kWebXrRuntimeOpenVr)) {
     should_check_openvr_ = device::OpenVRDevice::IsApiAvailable();
     any_runtimes_available |= should_check_openvr_;
@@ -172,7 +172,7 @@
 #endif
 
 #if BUILDFLAG(ENABLE_WINDOWS_MR)
-  if (IsEnabled(command_line, features::kWindowsMixedReality,
+  if (IsEnabled(command_line, device::features::kWindowsMixedReality,
                 switches::kWebXrRuntimeWMR)) {
     wmr_statics_ = device::MixedRealityDeviceStatics::CreateInstance();
     should_check_wmr_ = wmr_statics_->IsApiAvailable();
@@ -181,7 +181,7 @@
 #endif
 
 #if BUILDFLAG(ENABLE_OPENXR)
-  if (IsEnabled(command_line, features::kOpenXR,
+  if (IsEnabled(command_line, device::features::kOpenXR,
                 switches::kWebXrRuntimeOpenXr)) {
     openxr_statics_ = std::make_unique<device::OpenXrStatics>();
     should_check_openxr_ = openxr_statics_->IsApiAvailable();
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 3a01e00..466c66d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4239,6 +4239,8 @@
       "../browser/apps/intent_helper/apps_navigation_throttle_unittest.cc",
       "../browser/apps/intent_helper/intent_picker_auto_display_service_unittest.cc",
       "../browser/apps/intent_helper/page_transition_util_unittest.cc",
+      "../browser/chooser_controller/mock_chooser_controller_view.cc",
+      "../browser/chooser_controller/mock_chooser_controller_view.h",
       "../browser/devtools/devtools_file_system_indexer_unittest.cc",
       "../browser/devtools/devtools_file_watcher_unittest.cc",
       "../browser/devtools/devtools_ui_bindings_unittest.cc",
@@ -4502,7 +4504,7 @@
       "../../tools/json_schema_compiler/test/features_generation_unittest.cc",
       "../browser/apps/app_shim/app_shim_host_mac_unittest.cc",
       "../browser/apps/app_shim/app_shim_manager_mac_unittest.cc",
-      "../browser/apps/platform_apps/app_shim_registry_mac_unittest.cc",
+      "../browser/apps/app_shim/app_shim_registry_mac_unittest.cc",
       "../browser/autocomplete/keyword_extensions_delegate_impl_unittest.cc",
       "../browser/browsing_data/counters/hosted_apps_counter_unittest.cc",
       "../browser/extensions/active_tab_unittest.cc",
@@ -5647,12 +5649,12 @@
   test("interactive_ui_tests") {
     sources = [
       "../browser/about_flags_browsertest.cc",
-      "../browser/apps/app_shim/app_shim_interactive_uitest_mac.mm",
-      "../browser/apps/app_shim/app_shim_quit_interactive_uitest_mac.mm",
       "../browser/apps/guest_view/web_view_interactive_browsertest.cc",
       "../browser/apps/platform_apps/app_browsertest_util.cc",
       "../browser/apps/platform_apps/app_browsertest_util.h",
       "../browser/apps/platform_apps/app_pointer_lock_interactive_uitest.cc",
+      "../browser/apps/platform_apps/app_shim_interactive_uitest_mac.mm",
+      "../browser/apps/platform_apps/app_shim_quit_interactive_uitest_mac.mm",
       "../browser/apps/platform_apps/app_window_interactive_uitest.cc",
       "../browser/apps/platform_apps/app_window_interactive_uitest_base.cc",
       "../browser/apps/platform_apps/app_window_interactive_uitest_base.h",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
index 9f2ae8f..c05b297 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/tab/TabTestUtils.java
@@ -134,4 +134,14 @@
     public static TabWebContentsDelegateAndroid getTabWebContentsDelegate(Tab tab) {
         return ((TabImpl) tab).getTabWebContentsDelegateAndroid();
     }
+
+    /**
+     * Sets whether the tab is showing an error page.  This is reset whenever the tab finishes a
+     * navigation.
+     * @param tab {@link Tab} object.
+     * @param isShowingErrorPage Whether the tab shows an error page.
+     */
+    public static void setIsShowingErrorPage(Tab tab, boolean isShowingErrorPage) {
+        ((TabImpl) tab).setIsShowingErrorPage(isShowingErrorPage);
+    }
 }
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc
index f315d57..3f7e550 100644
--- a/chrome/test/base/in_process_browser_test.cc
+++ b/chrome/test/base/in_process_browser_test.cc
@@ -245,6 +245,10 @@
                                       chrome::kTestUserProfileDir);
     }
   }
+
+  // By default, OS settings are not opened in a browser tab but in settings
+  // app. OS browsertests require OS settings to be opened in a browser tab.
+  SetAllowOsSettingsInTabForTesting(true);
 #endif
 
   SetScreenInstance();
diff --git a/chrome/test/base/ui_test_utils.cc b/chrome/test/base/ui_test_utils.cc
index 4532f395..ceb4c30 100644
--- a/chrome/test/base/ui_test_utils.cc
+++ b/chrome/test/base/ui_test_utils.cc
@@ -206,7 +206,7 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserChangeObserver);
 };
 
-class AutocompleteChangeObserver : public OmniboxControllerEmitter::Observer {
+class AutocompleteChangeObserver : public AutocompleteController::Observer {
  public:
   explicit AutocompleteChangeObserver(Profile* profile) {
     scoped_observer_.Add(
@@ -217,18 +217,16 @@
 
   void Wait() { run_loop_.Run(); }
 
-  // OmniboxControllerEmitter::Observer:
-  void OnOmniboxQuery(AutocompleteController* controller,
-                      const AutocompleteInput& input) override {}
-  void OnOmniboxResultChanged(bool default_match_changed,
-                              AutocompleteController* controller) override {
+  // AutocompleteController::Observer:
+  void OnResultChanged(AutocompleteController* controller,
+                       bool default_match_changed) override {
     if (run_loop_.running())
       run_loop_.Quit();
   }
 
  private:
   base::RunLoop run_loop_;
-  ScopedObserver<OmniboxControllerEmitter, OmniboxControllerEmitter::Observer>
+  ScopedObserver<OmniboxControllerEmitter, AutocompleteController::Observer>
       scoped_observer_{this};
 
   DISALLOW_COPY_AND_ASSIGN(AutocompleteChangeObserver);
diff --git a/chrome/test/data/android/manage_render_test_goldens.py b/chrome/test/data/android/manage_render_test_goldens.py
index 3825829..e4574a7 100755
--- a/chrome/test/data/android/manage_render_test_goldens.py
+++ b/chrome/test/data/android/manage_render_test_goldens.py
@@ -58,7 +58,28 @@
   THREAD_COUNT = 4
 
 
+def is_file_of_interest(f):
+  if not f.endswith('.png'):
+    return False
+  for combo in ALLOWED_DEVICE_SDK_COMBINATIONS:
+    if combo in f:
+      return True
+  return False
+
+
 def download(directory):
+  # If someone removes a SHA1 file, we want to remove the associated PNG file
+  # the next time images are updated.
+  images_to_delete = []
+  for f in os.listdir(directory):
+    if not is_file_of_interest(f):
+      continue
+    sha1_path = os.path.join(directory, f + '.sha1')
+    if not os.path.exists(sha1_path):
+      images_to_delete.append(os.path.join(directory, f))
+  for image_path in images_to_delete:
+    os.remove(image_path)
+
   # Downloading the files can be very spammy, so only show the output if
   # something actually goes wrong.
   try:
@@ -74,14 +95,6 @@
 
 
 def upload(directory):
-  def is_file_of_interest(f):
-    if not f.endswith('.png'):
-      return False
-    for combo in ALLOWED_DEVICE_SDK_COMBINATIONS:
-      if combo in f:
-        return True
-    return False
-
   files_to_upload = []
   for f in os.listdir(directory):
     # Skip any files that we don't care about.
diff --git a/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5-19.png.sha1
deleted file mode 100644
index ca232a6e..0000000
--- a/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5-19.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cd76005fcfcd77eb1f3fab05a27ed66b408af4f2
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5X-23.png.sha1
index 0b3840d1..d69d8dc 100644
--- a/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5X-23.png.sha1
+++ b/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-filled_primary_button.Nexus_5X-23.png.sha1
@@ -1 +1 @@
-6984523085333caedb4d95d0f95210cbce081af9
\ No newline at end of file
+14e90ed2bc6e85b59898587c7b9ce3824def7557
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-title_and_title_icon.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-title_and_title_icon.Nexus_5X-23.png.sha1
index 40b5054..5375aac 100644
--- a/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-title_and_title_icon.Nexus_5X-23.png.sha1
+++ b/chrome/test/data/android/render_tests/ModalDialogViewRenderTest.NightModeEnabled-title_and_title_icon.Nexus_5X-23.png.sha1
@@ -1 +1 @@
-ab9b7cc343922f223821c1c98a48ebf7254352f8
+ab9b7cc343922f223821c1c98a48ebf7254352f8
\ No newline at end of file
diff --git a/chrome/test/data/banners/manifest_with_file_handlers.json b/chrome/test/data/banners/manifest_with_file_handlers.json
new file mode 100644
index 0000000..f95a1495
--- /dev/null
+++ b/chrome/test/data/banners/manifest_with_file_handlers.json
@@ -0,0 +1,54 @@
+{
+  "name": "Manifest with file handlers",
+  "icons": [
+    {
+      "src": "launcher-icon-1x.png",
+      "sizes": "48x48",
+      "type": "image/png"
+    },
+    {
+      "src": "launcher-icon-1-5x.png",
+      "sizes": "72x72",
+      "type": "image/png"
+    },
+    {
+      "src": "launcher-icon-2x.png",
+      "sizes": "96x96",
+      "type": "image/png",
+      "purpose": "any badge"
+    },
+    {
+      "src": "launcher-icon-3x.png",
+      "sizes": "144x144",
+      "type": "image/png"
+    },
+    {
+      "src": "launcher-icon-4x.png",
+      "sizes": "192x192",
+      "type": "image/png"
+    },
+    {
+      "src": "image-512px.png",
+      "sizes": "512x512",
+      "type": "image/png"
+    }
+  ],
+  "start_url": "manifest_test_page.html",
+  "scope": "/",
+  "display": "standalone",
+  "orientation": "landscape",
+  "file_handlers": [
+    {
+      "action": "/open-foo",
+      "accept": {
+        "application/foo": [".foo"],
+        "application/foobar": [".foobar"]
+      }
+    },{
+      "action": "/open-bar",
+      "accept": {
+        "application/bar": [".bar", ".baz"]
+      }
+    }
+  ]
+}
diff --git a/chrome/test/data/pdf/accessibility/whitespace-expected.txt b/chrome/test/data/pdf/accessibility/whitespace-expected.txt
index 8d1c8b6..e69de29 100644
--- a/chrome/test/data/pdf/accessibility/whitespace-expected.txt
+++ b/chrome/test/data/pdf/accessibility/whitespace-expected.txt
@@ -1 +0,0 @@
- 
diff --git a/chrome/test/data/updater/updater_setup_test_dmg.dmg b/chrome/test/data/updater/updater_setup_test_dmg.dmg
index 573e044..1fdf916f 100644
--- a/chrome/test/data/updater/updater_setup_test_dmg.dmg
+++ b/chrome/test/data/updater/updater_setup_test_dmg.dmg
Binary files differ
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index f3f14ca..5abc012 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -256,6 +256,7 @@
     "$root_gen_dir/chrome/test/data/webui/settings/test_metrics_browser_proxy.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/site_data_details_subpage_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/site_list_entry_tests.m.js",
+    "$root_gen_dir/chrome/test/data/webui/settings/site_list_tests.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/sync_test_util.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/test_extension_control_browser_proxy.m.js",
     "$root_gen_dir/chrome/test/data/webui/settings/test_languages_browser_proxy.m.js",
@@ -280,12 +281,15 @@
   if (is_chromeos) {
     data += [
       "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_searchable_drop_down_tests.m.js",
+      "$root_gen_dir/chrome/test/data/webui/settings/site_list_tests_cros.m.js",
       "$root_gen_dir/chrome/test/data/webui/settings/passwords_section_test_cros.m.js",
+      "$root_gen_dir/chrome/test/data/webui/settings/test_android_info_browser_proxy.m.js",
     ]
   } else {
     data += [
       "$root_gen_dir/chrome/test/data/webui/settings/default_browser_browsertest.m.js",
       "$root_gen_dir/chrome/test/data/webui/settings/import_data_dialog_test.m.js",
+      "$root_gen_dir/chrome/test/data/webui/settings/people_page_manage_profile_test.m.js",
       "$root_gen_dir/chrome/test/data/webui/settings/system_page_tests.m.js",
     ]
   }
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn
index 8fba081..1462721 100644
--- a/chrome/test/data/webui/settings/BUILD.gn
+++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -51,6 +51,7 @@
     "settings_ui_tests.js",
     "site_data_details_subpage_tests.js",
     "site_list_entry_tests.js",
+    "site_list_tests.js",
     "site_favicon_test.js",
     "startup_urls_page_test.js",
     "sync_test_util.js",
@@ -75,15 +76,22 @@
     ]
   }
   if (is_chromeos) {
-    input_files += [ "passwords_section_test_cros.js" ]
+    input_files += [
+      "passwords_section_test_cros.js",
+      "site_list_tests_cros.js",
+      "test_android_info_browser_proxy.js",
+    ]
   } else {
     input_files += [
       "default_browser_browsertest.js",
       "import_data_dialog_test.js",
+      "people_page_manage_profile_test.js",
       "system_page_tests.js",
     ]
   }
   namespace_rewrites = settings_namespace_rewrites + test_namespace_rewrites + [
+                         "android_info.TestAndroidInfoBrowserProxy|TestAndroidInfoBrowserProxy",
+                         "android_info.TEST_ANDROID_SMS_ORIGIN|TEST_ANDROID_SMS_ORIGIN",
                          "autofill_test_util.PasswordSectionElementFactory|PasswordSectionElementFactory",
                          "autofill_test_util.PasswordManagerExpectations|PasswordManagerExpectations",
                          "autofill_test_util.AutofillManagerExpectations|AutofillManagerExpectations",
@@ -110,6 +118,8 @@
                          "settings_search.TestSearchEnginesBrowserProxy|TestSearchEnginesBrowserProxy",
                          "sync_test_util.getSyncAllPrefs|getSyncAllPrefs",
                          "sync_test_util.simulateSyncStatus|simulateSyncStatus",
+                         "test_util.createContentSettingTypeToValuePair|createContentSettingTypeToValuePair",
+                         "test_util.createRawSiteException|createRawSiteException",
                          "test_util.createSiteSettingsPrefs|createSiteSettingsPrefs",
                          "test_util.setupPopstateListener|setupPopstateListener",
                        ]
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 0976326e..e5da50d6 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1539,24 +1539,53 @@
     'test_util.js',
     '../test_util.js',
     'test_site_settings_prefs_browser_proxy.js',
-    'test_android_info_browser_proxy.js',
     'site_list_tests.js',
   ]),
 };
 
 // TODO(crbug.com/929455): flaky, fix.
 TEST_F('CrSettingsSiteListTest', 'DISABLED_SiteList', function() {
-  mocha.grep('SiteList').run();
+  runMochaSuite('SiteList');
 });
 
 TEST_F('CrSettingsSiteListTest', 'EditExceptionDialog', function() {
-  mocha.grep('EditExceptionDialog').run();
+  runMochaSuite('EditExceptionDialog');
 });
 
 TEST_F('CrSettingsSiteListTest', 'AddExceptionDialog', function() {
-  mocha.grep('AddExceptionDialog').run();
+  runMochaSuite('AddExceptionDialog');
 });
 
+GEN('#if defined(OS_CHROMEOS)');
+/**
+ * @constructor
+ * @extends {CrSettingsBrowserTest}
+ */
+function CrSettingsSiteListChromeOSTest() {}
+
+CrSettingsSiteListChromeOSTest.prototype = {
+  __proto__: CrSettingsBrowserTest.prototype,
+
+  /** @override */
+  browsePreload: 'chrome://settings/site_settings/site_list.html',
+
+  /** @override */
+  extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
+    '../test_browser_proxy.js',
+    'test_util.js',
+    '../test_util.js',
+    'test_site_settings_prefs_browser_proxy.js',
+    'test_android_info_browser_proxy.js',
+    'site_list_tests_cros.js',
+  ]),
+};
+
+// TODO(crbug.com/929455): flaky, fix.
+TEST_F('CrSettingsSiteListChromeOSTest', 'DISABLED_AndroidSmsInfo', function() {
+  mocha.run();
+});
+GEN('#endif  // defined(OS_CHROMEOS)');
+
 /**
  * @constructor
  * @extends {CrSettingsBrowserTest}
diff --git a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
index 805c3c9..1a2f9cf 100644
--- a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
@@ -171,6 +171,23 @@
 
 GEN('#endif  // defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)');
 
+GEN('#if !defined(OS_CHROMEOS)');
+
+// eslint-disable-next-line no-var
+var CrSettingsPeoplePageManageProfileV3Test =
+    class extends CrSettingsV3BrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/test_loader.html?module=settings/people_page_manage_profile_test.m.js';
+  }
+};
+
+TEST_F('CrSettingsPeoplePageManageProfileV3Test', 'All', function() {
+  mocha.run();
+});
+
+GEN('#endif  // !defined(OS_CHROMEOS)');
+
 // eslint-disable-next-line no-var
 var CrSettingsPrefUtilV3Test = class extends CrSettingsV3BrowserTest {
   /** @override */
@@ -645,3 +662,42 @@
 TEST_F('CrSettingsSiteListEntryV3Test', 'All', function() {
   mocha.run();
 });
+
+// eslint-disable-next-line no-var
+var CrSettingsSiteListV3Test = class extends CrSettingsV3BrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/test_loader.html?module=settings/site_list_tests.m.js';
+  }
+};
+
+// Copied from Polymer 2 test:
+// TODO(crbug.com/929455): flaky, fix.
+TEST_F('CrSettingsSiteListV3Test', 'DISABLED_SiteList', function() {
+  runMochaSuite('SiteList');
+});
+
+TEST_F('CrSettingsSiteListV3Test', 'EditExceptionDialog', function() {
+  runMochaSuite('EditExceptionDialog');
+});
+
+TEST_F('CrSettingsSiteListV3Test', 'AddExceptionDialog', function() {
+  runMochaSuite('AddExceptionDialog');
+});
+
+GEN('#if defined(OS_CHROMEOS)');
+// eslint-disable-next-line no-var
+var CrSettingsSiteListChromeOSV3Test = class extends CrSettingsV3BrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://settings/test_loader.html?module=settings/site_list_tests_cros.m.js';
+  }
+};
+
+// Copied from Polymer 2 test:
+// TODO(crbug.com/929455): flaky, fix.
+TEST_F(
+    'CrSettingsSiteListChromeOSV3Test', 'DISABLED_AndroidSmsInfo', function() {
+      mocha.run();
+    });
+GEN('#endif  // defined(OS_CHROMEOS)');
diff --git a/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js b/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js
index 4b6889a..aca8711 100644
--- a/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js
+++ b/chrome/test/data/webui/settings/passwords_leak_detection_toggle_test.js
@@ -15,6 +15,23 @@
   /** @type {SettingsPersonalizationOptionsElement} */
   let testElement;
 
+  /** @type {String} */
+  let signedInSubLabel;
+
+  /** @type {String} */
+  let signedOutSubLabel;
+
+  suiteSetup(function() {
+    signedInSubLabel =
+        loadTimeData.getString('passwordsLeakDetectionGeneralDescription');
+    signedOutSubLabel =
+        loadTimeData.getString('passwordsLeakDetectionGeneralDescription') +
+        ' ' +
+        loadTimeData.getString(
+            'passwordsLeakDetectionSignedOutEnabledDescription') +
+        loadTimeData.getString('sentenceEnd');
+  });
+
   setup(function() {
     privacyPageBrowserProxy = new TestPrivacyPageBrowserProxy();
     settings.PrivacyPageBrowserProxyImpl.instance_ = privacyPageBrowserProxy;
@@ -63,7 +80,9 @@
 
     assertTrue(testElement.$.passwordsLeakDetectionCheckbox.disabled);
     assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
-    assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    assertEquals(
+        signedInSubLabel,
+        testElement.$.passwordsLeakDetectionCheckbox.subLabel);
   });
 
   test('leakDetectionToggleSignedOutWithTruePref', function() {
@@ -73,8 +92,7 @@
     assertTrue(testElement.$.passwordsLeakDetectionCheckbox.disabled);
     assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
     assertEquals(
-        loadTimeData.getString(
-            'passwordsLeakDetectionSignedOutEnabledDescription'),
+        signedOutSubLabel,
         testElement.$.passwordsLeakDetectionCheckbox.subLabel);
   });
 
@@ -94,7 +112,9 @@
 
       assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
       assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
-      assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+      assertEquals(
+          signedInSubLabel,
+          testElement.$.passwordsLeakDetectionCheckbox.subLabel);
     });
 
     test('leakDetectionToggleSignedInNotSyncingWithTruePref', function() {
@@ -110,7 +130,9 @@
 
       assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
       assertTrue(testElement.$.passwordsLeakDetectionCheckbox.checked);
-      assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+      assertEquals(
+          signedInSubLabel,
+          testElement.$.passwordsLeakDetectionCheckbox.subLabel);
     });
   }
 
@@ -122,7 +144,9 @@
 
     assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
     assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
-    assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    assertEquals(
+        signedInSubLabel,
+        testElement.$.passwordsLeakDetectionCheckbox.subLabel);
   });
 
   test('leakDetectionToggleSignedInAndSyncingWithTruePref', function() {
@@ -131,6 +155,8 @@
 
     assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
     assertTrue(testElement.$.passwordsLeakDetectionCheckbox.checked);
-    assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    assertEquals(
+        signedInSubLabel,
+        testElement.$.passwordsLeakDetectionCheckbox.subLabel);
   });
 });
diff --git a/chrome/test/data/webui/settings/people_page_manage_profile_test.js b/chrome/test/data/webui/settings/people_page_manage_profile_test.js
index cb450fa..30b14038 100644
--- a/chrome/test/data/webui/settings/people_page_manage_profile_test.js
+++ b/chrome/test/data/webui/settings/people_page_manage_profile_test.js
@@ -2,6 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {ManageProfileBrowserProxyImpl, ProfileShortcutStatus} from 'chrome://settings/lazy_load.js';
+// #import {Router, routes} from 'chrome://settings/settings.js';
+// #import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// clang-format on
+
 cr.define('settings_people_page_manage_profile', function() {
   /** @implements {settings.ManageProfileBrowserProxy} */
   class TestManageProfileBrowserProxy extends TestBrowserProxy {
@@ -16,12 +23,12 @@
         'removeProfileShortcut',
       ]);
 
-      /** @private {!ProfileShortcutStatus} */
+      /** @private {!settings.ProfileShortcutStatus} */
       this.profileShortcutStatus_ =
-          ProfileShortcutStatus.PROFILE_SHORTCUT_FOUND;
+          settings.ProfileShortcutStatus.PROFILE_SHORTCUT_FOUND;
     }
 
-    /** @param {!ProfileShortcutStatus} status */
+    /** @param {!settings.ProfileShortcutStatus} status */
     setProfileShortcutStatus(status) {
       this.profileShortcutStatus_ = status;
     }
@@ -120,6 +127,7 @@
       const nameField = manageProfile.$.name;
       assertTrue(!!nameField);
       assertFalse(!!nameField.disabled);
+      assertEquals('.*\\S.*', nameField.pattern);
 
       assertEquals('Initial Fake Name', nameField.value);
 
@@ -224,7 +232,7 @@
     // profile shortcut is found.
     test('ManageProfileShortcutToggle', function() {
       browserProxy.setProfileShortcutStatus(
-          ProfileShortcutStatus.PROFILE_SHORTCUT_NOT_FOUND);
+          settings.ProfileShortcutStatus.PROFILE_SHORTCUT_NOT_FOUND);
 
       settings.Router.getInstance().navigateTo(settings.routes.MANAGE_PROFILE);
       Polymer.dom.flush();
@@ -246,7 +254,7 @@
     // occur in the single profile case.
     test('ManageProfileShortcutSettingHIdden', function() {
       browserProxy.setProfileShortcutStatus(
-          ProfileShortcutStatus.PROFILE_SHORTCUT_SETTING_HIDDEN);
+          settings.ProfileShortcutStatus.PROFILE_SHORTCUT_SETTING_HIDDEN);
 
       settings.Router.getInstance().navigateTo(settings.routes.MANAGE_PROFILE);
       Polymer.dom.flush();
@@ -261,4 +269,5 @@
           });
     });
   });
+  // #cr_define_end
 });
diff --git a/chrome/test/data/webui/settings/site_list_tests.js b/chrome/test/data/webui/settings/site_list_tests.js
index 68359bc2..b483fc98 100644
--- a/chrome/test/data/webui/settings/site_list_tests.js
+++ b/chrome/test/data/webui/settings/site_list_tests.js
@@ -4,6 +4,15 @@
 
 /** @fileoverview Suite of tests for site-list. */
 
+// clang-format off
+// #import {ContentSetting,ContentSettingsTypes,kControlledByLookup,SiteSettingSource,SiteSettingsPrefsBrowserProxyImpl,SITE_EXCEPTION_WILDCARD} from 'chrome://settings/lazy_load.js';
+// #import {createContentSettingTypeToValuePair,createRawSiteException,createSiteSettingsPrefs} from 'chrome://test/settings/test_util.m.js';
+// #import {CrSettingsPrefs,Router} from 'chrome://settings/settings.js';
+// #import {eventToPromise,waitBeforeNextRender} from 'chrome://test/test_util.m.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {TestSiteSettingsPrefsBrowserProxy} from 'chrome://test/settings/test_site_settings_prefs_browser_proxy.m.js';
+// clang-format on
+
 /**
  * An example pref with 2 blocked location items and 2 allowed. This pref
  * is also used for the All Sites category and therefore needs values for
@@ -13,6 +22,12 @@
 let prefsGeolocation;
 
 /**
+ * An example pref that is empty.
+ * @type {SiteSettingsPref}
+ */
+let prefsGeolocationEmpty;
+
+/**
  * An example of prefs controlledBy policy.
  * @type {SiteSettingsPref}
  */
@@ -38,6 +53,12 @@
 let prefsMixedEmbeddingOrigin;
 
 /**
+ * An example pref with native file system write
+ * @type {SiteSettingsPref}
+ */
+let prefsNativeFileSystemWrite;
+
+/**
  * An example pref with multiple categories and multiple allow/block
  * state.
  * @type {SiteSettingsPref}
@@ -75,12 +96,6 @@
 let prefsChromeExtension;
 
 /**
- * An example Javascript pref for android_sms notification setting.
- * @type {SiteSettingsPref}
- */
-let prefsAndroidSms;
-
-/**
  * Creates all the test |SiteSettingsPref|s that are needed for the tests in
  * this file. They are populated after test setup in order to access the
  * |settings| constants required.
@@ -248,16 +263,6 @@
 
   prefsGeolocationEmpty = test_util.createSiteSettingsPrefs([], []);
 
-  prefsAndroidSms = test_util.createSiteSettingsPrefs(
-      [], [test_util.createContentSettingTypeToValuePair(
-              settings.ContentSettingsTypes.NOTIFICATIONS, [
-                // android sms setting.
-                test_util.createRawSiteException(
-                    android_info.TEST_ANDROID_SMS_ORIGIN),
-                // Non android sms setting that should be handled as usual.
-                test_util.createRawSiteException('http://bar.com')
-              ])]);
-
   prefsNativeFileSystemWrite = test_util.createSiteSettingsPrefs(
       [], [test_util.createContentSettingTypeToValuePair(
               settings.ContentSettingsTypes.NATIVE_FILE_SYSTEM_WRITE,
@@ -279,14 +284,13 @@
    */
   let browserProxy = null;
 
-  /**
-   * Mock AndroidInfoBrowserProxy to use during test.
-   * @type {TestAndroidInfoBrowserProxy}
-   */
-  let androidInfoBrowserProxy = null;
-
   suiteSetup(function() {
-    CrSettingsPrefs.setInitialized();
+    // clang-format off
+    /* #ignore */ PolymerTest.importHtml(
+        /* #ignore */ 'chrome://settings/prefs/prefs_types.html').then(() => {
+          CrSettingsPrefs.setInitialized();
+        /* #ignore */ });
+    // clang-format on
   });
 
   suiteTeardown(function() {
@@ -303,11 +307,6 @@
     testElement = document.createElement('site-list');
     testElement.searchFilter = '';
     document.body.appendChild(testElement);
-
-    if (cr.isChromeOS) {
-      androidInfoBrowserProxy = new android_info.TestAndroidInfoBrowserProxy();
-      settings.AndroidInfoBrowserProxyImpl.instance_ = androidInfoBrowserProxy;
-    }
   });
 
   teardown(function() {
@@ -315,13 +314,6 @@
     // The code being tested changes the Route. Reset so that state is not
     // leaked across tests.
     settings.Router.getInstance().resetRouteForTesting();
-
-    if (cr.isChromeOS) {
-      // Reset multidevice enabled flag.
-      loadTimeData.overrideValues({
-        multideviceAllowedByPolicy: false
-      });
-    }
   });
 
   /**
@@ -406,60 +398,6 @@
         });
   });
 
-  if (cr.isChromeOS) {
-    test('update androidSmsInfo', function() {
-      setUpCategory(
-          settings.ContentSettingsTypes.NOTIFICATIONS,
-          settings.ContentSetting.ALLOW, prefsAndroidSms);
-      assertEquals(
-          0, androidInfoBrowserProxy.getCallCount('getAndroidSmsInfo'));
-
-      loadTimeData.overrideValues({multideviceAllowedByPolicy: true});
-      setUpCategory(
-          settings.ContentSettingsTypes.NOTIFICATIONS,
-          settings.ContentSetting.ALLOW, prefsAndroidSms);
-      // Assert 2 calls since the observer observes 2 properties.
-      assertEquals(
-          2, androidInfoBrowserProxy.getCallCount('getAndroidSmsInfo'));
-
-      return androidInfoBrowserProxy.whenCalled('getAndroidSmsInfo')
-          .then(() => browserProxy.whenCalled('getExceptionList'))
-          .then((contentType) => {
-            assertEquals(
-                settings.ContentSettingsTypes.NOTIFICATIONS, contentType);
-            assertEquals(2, testElement.sites.length);
-
-            assertEquals(
-                prefsAndroidSms.exceptions[contentType][0].origin,
-                testElement.sites[0].origin);
-            assertTrue(testElement.sites[0].showAndroidSmsNote);
-
-            assertEquals(
-                prefsAndroidSms.exceptions[contentType][1].origin,
-                testElement.sites[1].origin);
-            assertEquals(undefined, testElement.sites[1].showAndroidSmsNote);
-
-            browserProxy.resetResolver('getExceptionList');
-            return browserProxy.whenCalled('getExceptionList');
-          })
-          .then((contentType) => {
-            assertEquals(
-                settings.ContentSettingsTypes.NOTIFICATIONS, contentType);
-            assertEquals(2, testElement.sites.length);
-
-            assertEquals(
-                prefsAndroidSms.exceptions[contentType][0].origin,
-                testElement.sites[0].origin);
-            assertEquals(undefined, testElement.sites[0].showAndroidSmsNote);
-
-            assertEquals(
-                prefsAndroidSms.exceptions[contentType][1].origin,
-                testElement.sites[1].origin);
-            assertEquals(undefined, testElement.sites[1].showAndroidSmsNote);
-          });
-    });
-  }
-
   test('getExceptionList API used', function() {
     setUpCategory(
         settings.ContentSettingsTypes.GEOLOCATION,
@@ -622,10 +560,6 @@
           Polymer.dom.flush();
           assertEquals(2, list.querySelector('iron-list').items.length);
           assertTrue(hasAnIncognito(list));
-          assertTrue(Array.from(list.querySelectorAll('site-list-entry'))
-                         .some(
-                             entry => entry.$.siteDescription.textContent ==
-                                 'Current incognito session'));
           browserProxy.resetResolver('getExceptionList');
           browserProxy.setIncognito(false);
           return browserProxy.whenCalled('getExceptionList');
@@ -1041,6 +975,9 @@
    */
   let cookieException;
 
+  /** @type {SiteSettingsPrefsBrowserProxy} */
+  let browserProxy;
+
   setup(function() {
     cookieException = {
       category: settings.ContentSettingsTypes.COOKIES,
@@ -1129,6 +1066,9 @@
 suite('AddExceptionDialog', function() {
   /** @type {AddSiteDialogElement} */ let dialog;
 
+  /** @type {SiteSettingsPrefsBrowserProxy} */
+  let browserProxy;
+
   setup(function() {
     populateTestExceptions();
 
diff --git a/chrome/test/data/webui/settings/site_list_tests_cros.js b/chrome/test/data/webui/settings/site_list_tests_cros.js
new file mode 100644
index 0000000..bcd3675c
--- /dev/null
+++ b/chrome/test/data/webui/settings/site_list_tests_cros.js
@@ -0,0 +1,116 @@
+// Copyright 2020 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.
+
+// clang-format off
+// #import {AndroidInfoBrowserProxyImpl,ContentSetting,ContentSettingsTypes,SiteSettingsPrefsBrowserProxyImpl} from 'chrome://settings/lazy_load.js';
+// #import {createContentSettingTypeToValuePair,createRawSiteException,createSiteSettingsPrefs} from 'chrome://test/settings/test_util.m.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {Router} from 'chrome://settings/settings.js';
+// #import {TestAndroidInfoBrowserProxy, TEST_ANDROID_SMS_ORIGIN} from 'chrome://test/settings/test_android_info_browser_proxy.m.js';
+// #import {TestSiteSettingsPrefsBrowserProxy} from 'chrome://test/settings/test_site_settings_prefs_browser_proxy.m.js';
+// clang-format on
+
+suite('SiteListChromeOS', function() {
+  /**
+   * A site list element created before each test.
+   * @type {SiteList}
+   */
+  let testElement;
+
+  /**
+   * The mock proxy object to use during test.
+   * @type {TestSiteSettingsPrefsBrowserProxy}
+   */
+  let browserProxy = null;
+
+  /**
+   * Mock AndroidInfoBrowserProxy to use during test.
+   * @type {TestAndroidInfoBrowserProxy}
+   */
+  let androidInfoBrowserProxy = null;
+
+  /**
+   * An example Javascript pref for android_sms notification setting.
+   * @type {SiteSettingsPref}
+   */
+  let prefsAndroidSms;
+
+  // Initialize a site-list before each test.
+  setup(function() {
+    prefsAndroidSms = test_util.createSiteSettingsPrefs(
+        [], [test_util.createContentSettingTypeToValuePair(
+                settings.ContentSettingsTypes.NOTIFICATIONS, [
+                  // android sms setting.
+                  test_util.createRawSiteException(
+                      android_info.TEST_ANDROID_SMS_ORIGIN),
+                  // Non android sms setting that should be handled as usual.
+                  test_util.createRawSiteException('http://bar.com')
+                ])]);
+
+    browserProxy = new TestSiteSettingsPrefsBrowserProxy();
+    settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy;
+    androidInfoBrowserProxy = new android_info.TestAndroidInfoBrowserProxy();
+    settings.AndroidInfoBrowserProxyImpl.instance_ = androidInfoBrowserProxy;
+
+    PolymerTest.clearBody();
+    testElement = document.createElement('site-list');
+    testElement.searchFilter = '';
+    document.body.appendChild(testElement);
+  });
+
+  teardown(function() {
+    // The code being tested changes the Route. Reset so that state is not
+    // leaked across tests.
+    settings.Router.getInstance().resetRouteForTesting();
+
+    // Reset multidevice enabled flag.
+    loadTimeData.overrideValues({multideviceAllowedByPolicy: false});
+  });
+
+  /** Configures the test element. */
+  function setUpAndroidSmsNotifications() {
+    browserProxy.setPrefs(prefsAndroidSms);
+    testElement.categorySubtype = settings.ContentSetting.ALLOW;
+    // Some route is needed, but the actual route doesn't matter.
+    testElement.currentRoute = {
+      page: 'dummy',
+      section: 'privacy',
+      subpage: ['site-settings', 'site-settings-category-location'],
+    };
+    testElement.category = settings.ContentSettingsTypes.NOTIFICATIONS;
+  }
+
+  test('update androidSmsInfo', function() {
+    setUpAndroidSmsNotifications();
+    assertEquals(0, androidInfoBrowserProxy.getCallCount('getAndroidSmsInfo'));
+
+    loadTimeData.overrideValues({multideviceAllowedByPolicy: true});
+    setUpAndroidSmsNotifications();
+    // Assert 2 calls since the observer observes 2 properties.
+    assertEquals(2, androidInfoBrowserProxy.getCallCount('getAndroidSmsInfo'));
+
+    return Promise
+        .all([
+          androidInfoBrowserProxy.whenCalled('getAndroidSmsInfo'),
+          browserProxy.whenCalled('getExceptionList'),
+        ])
+        .then(results => {
+          const contentType = results[1];
+          Polymer.dom.flush();
+          assertEquals(
+              settings.ContentSettingsTypes.NOTIFICATIONS, contentType);
+          assertEquals(2, testElement.sites.length);
+
+          assertEquals(
+              prefsAndroidSms.exceptions[contentType][0].origin,
+              testElement.sites[0].origin);
+          assertTrue(testElement.sites[0].showAndroidSmsNote);
+
+          assertEquals(
+              prefsAndroidSms.exceptions[contentType][1].origin,
+              testElement.sites[1].origin);
+          assertEquals(undefined, testElement.sites[1].showAndroidSmsNote);
+        });
+  });
+});
diff --git a/chrome/test/data/webui/settings/test_android_info_browser_proxy.js b/chrome/test/data/webui/settings/test_android_info_browser_proxy.js
index 415d541..2c475281 100644
--- a/chrome/test/data/webui/settings/test_android_info_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_android_info_browser_proxy.js
@@ -2,14 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js';
+// clang-format on
+
 cr.define('android_info', function() {
   /**
    * Test value for messages for web permissions origin.
    */
-  const TEST_ANDROID_SMS_ORIGIN = 'http://foo.com';
+  /* #export */ const TEST_ANDROID_SMS_ORIGIN = 'http://foo.com';
 
   /** @implements {settings.AndroidInfoBrowserProxy} */
-  class TestAndroidInfoBrowserProxy extends TestBrowserProxy {
+  /* #export */ class TestAndroidInfoBrowserProxy extends TestBrowserProxy {
     constructor() {
       super([
         'getAndroidSmsInfo',
@@ -24,6 +28,7 @@
     }
   }
 
+  // #cr_define_end
   return {
     TestAndroidInfoBrowserProxy: TestAndroidInfoBrowserProxy,
     TEST_ANDROID_SMS_ORIGIN: TEST_ANDROID_SMS_ORIGIN,
diff --git a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
index 0000628..6d071ab7 100644
--- a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 // clang-format off
+// #import {assert} from 'chrome://resources/js/assert.m.js';
 // #import {ContentSetting} from 'chrome://settings/lazy_load.js';
 // #import {createSiteSettingsPrefs, getContentSettingsTypeFromChooserType} from 'chrome://test/settings/test_util.m.js';
 // #import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js';
diff --git a/chrome/test/data/webui/settings/test_util.js b/chrome/test/data/webui/settings/test_util.js
index c3c4953..7af4f56b3 100644
--- a/chrome/test/data/webui/settings/test_util.js
+++ b/chrome/test/data/webui/settings/test_util.js
@@ -18,7 +18,8 @@
    * @param {Object} value The value to map to |contentType|.
    * @return {Object<setting: settings.ContentSettingsTypes, value: Object>}
    */
-  function createContentSettingTypeToValuePair(contentType, value) {
+  /* #export */ function createContentSettingTypeToValuePair(
+      contentType, value) {
     return {setting: contentType, value: value};
   }
 
@@ -49,7 +50,7 @@
    *     defaults in this function's return value.
    * @return {RawSiteException}
    */
-  function createRawSiteException(origin, override) {
+  /* #export */ function createRawSiteException(origin, override) {
     if (override === undefined) {
       override = {};
     }
diff --git a/chrome/tools/build/mac/FILES.cfg b/chrome/tools/build/mac/FILES.cfg
index 5772191..0aa5c82 100644
--- a/chrome/tools/build/mac/FILES.cfg
+++ b/chrome/tools/build/mac/FILES.cfg
@@ -141,7 +141,7 @@
     'archive': 'updater.zip',
   },
   {
-    'filename': 'chrome/updater/.install.sh',
+    'filename': 'chrome/updater/.install',
     'buildtype': ['official'],
     'archive': 'updater.zip',
   },
diff --git a/chrome/updater/installer_mac.cc b/chrome/updater/installer_mac.cc
index 857e73e14..c163bf3 100644
--- a/chrome/updater/installer_mac.cc
+++ b/chrome/updater/installer_mac.cc
@@ -5,6 +5,7 @@
 #include "chrome/updater/installer.h"
 
 #include "base/logging.h"
+#include "base/strings/strcat.h"
 #include "chrome/updater/mac/installer.h"
 
 namespace updater {
@@ -12,9 +13,12 @@
 int Installer::RunApplicationInstaller(const base::FilePath& app_installer,
                                        const std::string& arguments) {
   DVLOG(1) << "Running application install from DMG";
-  // InstallFromDMG() returns true when it succeeds while callers of
-  // RunApplicationInstaller() expect a return value of 0.
-  return !InstallFromDMG(app_installer, arguments);
+  // InstallFromDMG() returns the exit code of the script. 0 is success and
+  // anything else should be an error.
+  return InstallFromDMG(
+      app_installer,
+      base::StrCat({persisted_data_->GetExistenceCheckerPath(app_id_).value(),
+                    " ", arguments}));
 }
 
 }  // namespace updater
diff --git a/chrome/updater/mac/BUILD.gn b/chrome/updater/mac/BUILD.gn
index 3f38d72..34fefb0 100644
--- a/chrome/updater/mac/BUILD.gn
+++ b/chrome/updater/mac/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/mac/rules.gni")
+import("//build/util/version.gni")
 import("//chrome/updater/branding.gni")
 
 group("mac") {
@@ -102,9 +103,24 @@
   ]
 }
 
-copy("updater_install_script") {
-  sources = [ "setup/.install.sh" ]
-  outputs = [ "$root_build_dir/chrome/updater/.install.sh" ]
+action("updater_install_script") {
+  script = "setup/embed_version.py"
+
+  inputs = [
+    script,
+    "setup/.install.sh",
+  ]
+
+  outputs = [ "$root_out_dir/chrome/updater/.install" ]
+
+  args = [
+    "-i",
+    rebase_path("setup/.install.sh"),
+    "-o",
+    rebase_path(root_out_dir + "/chrome/updater/.install"),
+    "-v",
+    chrome_version_full,
+  ]
 }
 
 source_set("installer_sources") {
diff --git a/chrome/updater/mac/installer.h b/chrome/updater/mac/installer.h
index 7f032bc..533330e 100644
--- a/chrome/updater/mac/installer.h
+++ b/chrome/updater/mac/installer.h
@@ -13,11 +13,27 @@
 
 namespace updater {
 
-// Mounts the DMG specified by |dmg_file_path|. The install script located at
-// "/.install.sh" in the mounted volume is executed, and then the DMG is
-// un-mounted. Returns false if mounting the dmg or executing the script failed.
-bool InstallFromDMG(const base::FilePath& dmg_file_path,
-                    const std::string& arguments);
+enum class InstallErrors {
+  // Failed to mount the DMG.
+  kFailMountDmg = -1,
+
+  // No mount point was created from the DMG, even though mounting succeeded.
+  kNoMountPoint = -2,
+
+  // Failed to find the mounted DMG path, even though mounting succeeded and a
+  // mount point was created.
+  kMountedDmgPathDoesNotExist = -3,
+
+  // Failed to find a path to the install executable.
+  kExecutableFilePathDoesNotExist = -4,
+};
+
+// Mounts the DMG specified by |dmg_file_path|. The install executable located
+// at "/.install" in the mounted volume is executed, and then the DMG is
+// un-mounted. Returns an error code if mounting the DMG or executing the
+// executable failed.
+int InstallFromDMG(const base::FilePath& dmg_file_path,
+                   const std::string& arguments);
 
 }  // namespace updater
 
diff --git a/chrome/updater/mac/installer.mm b/chrome/updater/mac/installer.mm
index 176ae7d..ae7e2a5 100644
--- a/chrome/updater/mac/installer.mm
+++ b/chrome/updater/mac/installer.mm
@@ -93,54 +93,55 @@
   return true;
 }
 
-bool RunScript(const base::FilePath& mounted_dmg_path,
-               const base::FilePath::StringPieceType script_name,
-               const std::string& arguments) {
+int RunExecutable(const base::FilePath& mounted_dmg_path,
+                  const base::FilePath::StringPieceType executable_name,
+                  const std::string& arguments) {
   if (!base::PathExists(mounted_dmg_path)) {
     DLOG(ERROR) << "File path (" << mounted_dmg_path << ") does not exist.";
-    return false;
+    return static_cast<int>(InstallErrors::kMountedDmgPathDoesNotExist);
   }
-  base::FilePath script_file_path = mounted_dmg_path.Append(script_name);
-  if (!base::PathExists(script_file_path)) {
-    DLOG(ERROR) << "Script file path (" << script_file_path
+  base::FilePath executable_file_path =
+      mounted_dmg_path.Append(executable_name);
+  if (!base::PathExists(executable_file_path)) {
+    DLOG(ERROR) << "Executable file path (" << executable_file_path
                 << ") does not exist.";
-    return false;
+    return static_cast<int>(InstallErrors::kExecutableFilePathDoesNotExist);
   }
 
   // TODO(copacitt): Improve the way we parse args for CommandLine object.
   // http://crbug.com/1056818
-  base::CommandLine command(script_file_path);
+  base::CommandLine command(executable_file_path);
+  command.AppendArgPath(mounted_dmg_path);
   if (!arguments.empty()) {
     base::CommandLine::StringVector argv =
         base::SplitString(arguments, base::kWhitespaceASCII,
                           base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-    argv.insert(argv.begin(), script_file_path.value());
+    argv.insert(argv.begin(), mounted_dmg_path.value());
+    argv.insert(argv.begin(), executable_file_path.value());
     command = base::CommandLine(argv);
   }
 
   std::string output;
-  if (!base::GetAppOutput(command, &output)) {
-    DLOG(ERROR) << "Installer script failed.";
-    return false;
-  }
+  int exit_code = 0;
+  base::GetAppOutputWithExitCode(command, &output, &exit_code);
 
-  return true;
+  return exit_code;
 }
 
 }  // namespace
 
-bool InstallFromDMG(const base::FilePath& dmg_file_path,
-                    const std::string& arguments) {
+int InstallFromDMG(const base::FilePath& dmg_file_path,
+                   const std::string& arguments) {
   std::string mount_point;
   if (!MountDMG(dmg_file_path, &mount_point))
-    return false;
+    return static_cast<int>(InstallErrors::kFailMountDmg);
 
   if (mount_point.empty()) {
     DLOG(ERROR) << "No mount point.";
-    return false;
+    return static_cast<int>(InstallErrors::kNoMountPoint);
   }
   const base::FilePath mounted_dmg_path = base::FilePath(mount_point);
-  bool result = RunScript(mounted_dmg_path, ".install.sh", arguments);
+  int result = RunExecutable(mounted_dmg_path, ".install", arguments);
 
   if (!UnmountDMG(mounted_dmg_path))
     DLOG(WARNING) << "Could not unmount the DMG: " << mounted_dmg_path;
diff --git a/chrome/updater/mac/setup/.install.sh b/chrome/updater/mac/setup/.install.sh
index 7c145ba..f2e8545 100755
--- a/chrome/updater/mac/setup/.install.sh
+++ b/chrome/updater/mac/setup/.install.sh
@@ -1,10 +1,693 @@
-#!/bin/sh
+#!/bin/bash -p
 # Copyright 2020 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.
 
-# This script invokes updater_setup
+# usage: install.sh update_dmg_mount_point installed_app_path current_version
+#
+# Called by Omaha v4 to update the installed application with a new version from
+# the dmg.
+#
+# Exit codes:
+#   0   Success!
+#   1   Unknown Failure
+#   2   Could not locate installed app path.
+#   3   DMG mount point is not an absolute path.
+#   4   Path to new .app must be an absolute path.
+#   5   Update app is not using the new version folder layout.
+#   6   Installed app path must be an absolute path to a directory.
+#   7   Installed app's versioned directory is in old format.
+#   8   Installed app's versioned directory is in old format.
+#   9   Installed app's versioned directory is in old format.
+#   10  Making versioned directory for new version failed.
+#   11  Could not remove existing file where versioned directory should be.
+#   12  rsync of versioned directory failed.
+#   13  rsync of app directory failed.
+#   14  We could not determine the new app version.
+#   15  The new app version does not match the update version.
+#   16  This will return a usage message.
 
-SCRIPT_PATH="$(dirname "$0")"
+set -eu
 
-"$SCRIPT_PATH/updater_setup"
+# Set path to /bin, /usr/bin, /sbin, /usr/sbin
+export PATH="/bin:/usr/bin:/sbin:/usr/sbin"
+
+# Environment sanitization.  Clear environment variables that might impact the
+# interpreter's operation.  The |bash -p| invocation on the #! line takes the
+# bite out of BASH_ENV, ENV, and SHELLOPTS (among other features), but
+# clearing them here ensures that they won't impact any shell scripts used as
+# utility programs. SHELLOPTS is read-only and can't be unset, only
+# unexported.
+unset BASH_ENV CDPATH ENV GLOBIGNORE IFS POSIXLY_CORRECT
+export -n SHELLOPTS
+
+set -o pipefail
+shopt -s nullglob
+
+ME="$(basename "${0}")"
+readonly ME
+
+# We will populate this variable with the version of the application bundle
+# it'll be packaged with when the build is run. This allows us to not do a
+# defaults read on Info.plist to find the update_version.
+UPDATE_VERSION=
+readonly UPDATE_VERSION
+
+err() {
+  local error="${1}"
+  local id=": ${$} $(date "+%Y-%m-%d %H:%M:%S %z")"
+  echo "${ME}${id}: ${error}" >& 2
+}
+
+note() {
+  local message="${1}"
+  echo "${ME}: ${$} $(date "+%Y-%m-%d %H:%M:%S %z"): ${message}" >& 1
+}
+
+g_temp_dir=
+cleanup() {
+  local status=${?}
+
+  trap - EXIT
+  trap '' HUP INT QUIT TERM
+
+  if [[ ${status} -ge 128 ]]; then
+    err "Caught signal $((${status} - 128))"
+  fi
+
+  if [[ -n "${g_temp_dir}" ]]; then
+    rm -rf "${g_temp_dir}"
+  fi
+
+  exit ${status}
+}
+
+# Returns 0 (true) if |symlink| exists, is a symbolic link, and appears
+# writable on the basis of its POSIX permissions.  This is used to determine
+# writability like test's -w primary, but -w resolves symbolic links and this
+# function does not.
+is_writable_symlink() {
+  local symlink="${1}"
+
+  local link_mode="$(stat -f %Sp "${symlink}" 2> /dev/null || true)"
+  if [[ -z "${link_mode}" ]] || [[ "${link_mode:0:1}" != "l" ]]; then
+    return 1
+  fi
+
+  local link_user="$(stat -f %u "${symlink}" 2> /dev/null || true)"
+  local link_group="$(stat -f %g "${symlink}" 2> /dev/null || true)"
+  if [[ -z "${link_user}" ]] || [[ -z "${link_group}" ]]; then
+    return 1
+  fi
+
+  # If the users match, check the owner-write bit.
+  if [[ ${EUID} -eq "${link_user}" ]]; then
+    if [[ "${link_mode:2:1}" = "w" ]]; then
+      return 0
+    fi
+    return 1
+  fi
+
+  # If the file's group matches any of the groups that this process is a
+  # member of, check the group-write bit.
+  local group_match=
+  local group
+  for group in "${GROUPS[@]}"; do
+    if [[ "${group}" -eq "${link_group}" ]]; then
+      group_match="y"
+      break
+    fi
+  done
+  if [[ -n "${group_match}" ]]; then
+    if [[ "${link_mode:5:1}" = "w" ]]; then
+      return 0
+    fi
+    return 1
+  fi
+
+  # Check the other-write bit.
+  if [[ "${link_mode:8:1}" = "w" ]]; then
+    return 0
+  fi
+
+  return 1
+}
+
+# If |symlink| exists and is a symbolic link, but is not writable according to
+# is_writable_symlink, this function attempts to replace it with a new
+# writable symbolic link.  If |symlink| does not exist, is not a symbolic
+# link, or is already writable, this function does nothing.  This function
+# always returns 0 (true).
+ensure_writable_symlink() {
+  local symlink="${1}"
+
+  if [[ -L "${symlink}" ]] && ! is_writable_symlink "${symlink}"; then
+    # If ${symlink} refers to a directory, doing this naively might result in
+    # the new link being placed in that directory, instead of replacing the
+    # existing link.  ln -fhs is supposed to handle this case, but it does so
+    # by unlinking (removing) the existing symbolic link before creating a new
+    # one.  That leaves a small window during which the symbolic link is not
+    # present on disk at all.
+    #
+    # To avoid that possibility, a new symbolic link is created in a temporary
+    # location and then swapped into place with mv.  An extra temporary
+    # directory is used to convince mv to replace the symbolic link: again, if
+    # the existing link refers to a directory, "mv newlink oldlink" will
+    # actually leave oldlink alone and place newlink into the directory.
+    # "mv newlink dirname(oldlink)" works as expected, but in order to replace
+    # oldlink, newlink must have the same basename, hence the temporary
+    # directory.
+
+    local target="$(readlink "${symlink}" 2> /dev/null || true)"
+    if [[ -z "${target}" ]]; then
+      return 0
+    fi
+
+    # Error handling strategy: if anything fails, such as the mktemp, ln,
+    # chmod, or mv, ignore the failure and return 0 (success), leaving the
+    # existing state with the non-writable symbolic link intact.  Failures
+    # in this function will be difficult to understand and diagnose, and a
+    # non-writable symbolic link is not necessarily fatal.  If something else
+    # requires a writable symbolic link, allowing it to fail when a symbolic
+    # link is not writable is easier to understand than bailing out of the
+    # script on failure here.
+
+    local symlink_dir="$(dirname "${symlink}")"
+    local temp_link_dir=\
+      "$(mktemp -d "${symlink_dir}/.symlink_temp.XXXXXX" || true)"
+    if [[ -z "${temp_link_dir}" ]]; then
+      return 0
+    fi
+    local temp_link="${temp_link_dir}/$(basename "${symlink}")"
+
+    (ln -fhs "${target}" "${temp_link}" &&
+        chmod -h 755 "${temp_link}" &&
+        mv -f "${temp_link}" "${symlink_dir}/") || true
+    rm -rf "${temp_link_dir}"
+  fi
+
+  return 0
+}
+
+# ensure_writable_symlinks_recursive calls ensure_writable_symlink for every
+# symbolic link in |directory|, recursively.
+#
+# In some very weird and rare cases, it is possible to wind up with a user
+# installation that contains symbolic links that the user does not have write
+# permission over.  More on how that might happen later.
+#
+# If a weird and rare case like this is observed, rsync will exit with an
+# error when attempting to update the times on these symbolic links.  rsync
+# may not be intelligent enough to try creating a new symbolic link in these
+# cases, but this script can be.
+#
+# The problem occurs when an administrative user first drag-installs the
+# application to /Applications, resulting in the program's user being set to
+# the user's own ID.  If, subsequently, a .pkg package is installed over that,
+# the existing directory ownership will be preserved, but file ownership will
+# be changed to whatever is specified by the package, typically root.  This
+# applies to symbolic links as well.  On a subsequent update, rsync will be
+# able to copy the new files into place, because the user still has permission
+# to write to the directories.  If the symbolic link targets are not changing,
+# though, rsync will not replace them, and they will remain owned by root.
+# The user will not have permission to update the time on the symbolic links,
+# resulting in an rsync error.
+ensure_writable_symlinks_recursive() {
+  local directory="${1}"
+
+  # This fix-up is not necessary when running as root, because root will
+  # always be able to write everything needed.
+  if [[ ${EUID} -eq 0 ]]; then
+    return 0
+  fi
+
+  # This step isn't critical.
+  local set_e=
+  if [[ "${-}" =~ e ]]; then
+    set_e="y"
+    set +e
+  fi
+
+  # Use find -print0 with read -d $'\0' to handle even the weirdest paths.
+  local symlink
+  while IFS= read -r -d $'\0' symlink; do
+    ensure_writable_symlink "${symlink}"
+  done < <(find "${directory}" -type l -print0)
+
+  # Go back to how things were.
+  if [[ -n "${set_e}" ]]; then
+    set -e
+  fi
+}
+
+# Runs "defaults read" to obtain the value of a key in a property list. As
+# with "defaults read", an absolute path to a plist is supplied, without the
+# ".plist" extension.
+#
+# As of Mac OS X 10.8, defaults (and NSUserDefaults and CFPreferences)
+# normally communicates with cfprefsd to read and write plists. Changes to a
+# plist file aren't necessarily reflected immediately via this API family when
+# not made through this API family, because cfprefsd may return cached data
+# from a former on-disk version of a plist file instead of reading the current
+# version from disk. The old behavior can be restored by setting the
+# __CFPREFERENCES_AVOID_DAEMON environment variable, although extreme care
+# should be used because portions of the system that use this API family
+# normally and thus use cfprefsd and its cache will become unsynchronized with
+# the on-disk state.
+#
+# This function is provided to set __CFPREFERENCES_AVOID_DAEMON when calling
+# "defaults read" and thus avoid cfprefsd and its on-disk cache, and is
+# intended only to be used to read values from Info.plist files, which are not
+# preferences. The use of "defaults" for this purpose has always been
+# questionable, but there's no better option to interact with plists from
+# shell scripts. Definitely don't use infoplist_read to read preference
+# plists.
+#
+# This function exists because the update process delivers new copies of
+# Info.plist files to the disk behind cfprefsd's back, and if cfprefsd becomes
+# aware of the original version of the file for any reason (such as this
+# script reading values from it via "defaults read"), the new version of the
+# file will not be immediately effective or visible via cfprefsd after the
+# update is applied.
+infoplist_read() {
+  __CFPREFERENCES_AVOID_DAEMON=1 defaults read "${@}"
+}
+
+usage() {
+  echo "usage: ${ME} update_dmg_mount_point installed_app_path current_version"\
+  >& 2
+}
+
+main() {
+  local update_dmg_mount_point="${1}"
+  local installed_app_path="${2}"
+  local old_version_app="${3}"
+
+  # Early steps are critical.  Don't continue past any failure.
+  set -e
+
+  trap cleanup EXIT HUP INT QUIT TERM
+
+  # Figure out where to install.
+  if [[ ! -d "${installed_app_path}" ]]; then
+    err "couldn't locate installed_app_path"
+    exit 2
+  fi
+  note "installed_app_path = ${installed_app_path}"
+  note "old_version_app = ${old_version_app}"
+
+  # The app directory, product name, etc. can all be gotten from the
+  # installed_app_path.
+  readonly APP_DIR="$(basename "${installed_app_path}")"
+  readonly PRODUCT_NAME="${APP_DIR%.*}"
+  readonly FRAMEWORK_NAME="${PRODUCT_NAME} Framework"
+  readonly FRAMEWORK_DIR="${FRAMEWORK_NAME}.framework"
+  readonly CONTENTS_DIR="Contents"
+  readonly APP_PLIST="${CONTENTS_DIR}/Info"
+  readonly VERSIONS_DIR_NEW=\
+"${CONTENTS_DIR}/Frameworks/${FRAMEWORK_DIR}/Versions"
+  readonly APP_VERSION_KEY="CFBundleShortVersionString"
+
+  readonly QUARANTINE_ATTR="com.apple.quarantine"
+
+  # Don't use rsync --archive, because --archive includes --group and --owner,
+  # which copy groups and owners, respectively, from the source, and that is
+  # undesirable in this case (often, this script will have permission to set
+  # those attributes).  --archive also includes --devices and --specials, which
+  # copy files that should never occur in the transfer; --devices only works
+  # when running as root, so for consistency between privileged and unprivileged
+  # operation, this option is omitted as well.  --archive does not include
+  # --ignore-times, which is desirable, as it forces rsync to copy files even
+  # when their sizes and modification times are identical, as their content
+  # still may be different.
+  readonly RSYNC_FLAGS="--ignore-times --links --perms --recursive --times"
+
+  note "update_dmg_mount_point = ${update_dmg_mount_point}"
+
+  if [[ -z "${update_dmg_mount_point}" ]] ||
+     [[ "${update_dmg_mount_point:0:1}" != "/" ]] ||
+     ! [[ -d "${update_dmg_mount_point}" ]]; then
+    err "update_dmg_mount_point must be an absolute path to a directory"
+    usage
+    exit 3
+  fi
+
+  # The update to install.
+
+  # update_app is the path to the new version of the .app.
+  local update_app="${update_dmg_mount_point}/${APP_DIR}"
+  note "update_app = ${update_app}"
+
+  # Make sure that it's an absolute path.
+  if [[ "${update_app:0:1}" != "/" ]]; then
+    err "update_app must be an absolute path"
+    exit 4
+  fi
+
+  if [[ ! -d "${update_app}/${VERSIONS_DIR_NEW}" ]]; then
+    err "update app not using new layout"
+    exit 5
+  fi
+
+  if [[ "${installed_app_path:0:1}" != "/" ]] ||
+     ! [[ -d "${installed_app_path}" ]]; then
+    err "installed_app_path must be an absolute path to a directory"
+    exit 6
+  fi
+
+  # Figure out what the existing installed application is using for its
+  # versioned directory.  This will be used later, to avoid removing the
+  # existing installed version's versioned directory in case anything is still
+  # using it.
+  note "reading install values"
+
+  local installed_app_path_plist="${installed_app_path}/${APP_PLIST}"
+  note "installed_app_path_plist = ${installed_app_path_plist}"
+
+  local installed_versions_dir_new="${installed_app_path}/${VERSIONS_DIR_NEW}"
+  note "installed_versions_dir_new = ${installed_versions_dir_new}"
+
+  local installed_versions_dir="${installed_versions_dir_new}"
+  if [[ ! -d "${installed_versions_dir}" ]]; then
+    err "installed app does not have versioned dir. Might be an old version."
+    exit 7
+  fi
+  note "installed_versions_dir = ${installed_versions_dir}"
+
+  # If the installed application is incredibly old, or in a skeleton bootstrap
+  # installation, old_versioned_dir may not exist.
+  local old_versioned_dir
+  if [[ -n "${old_version_app}" ]]; then
+    if [[ -d "${installed_versions_dir_new}/${old_version_app}" ]]; then
+      old_versioned_dir="${installed_versions_dir_new}/${old_version_app}"
+    else
+      err "installed app does not have versioned dir. Might be an old version."
+      exit 8
+    fi
+  fi
+  note "old_versioned_dir = ${old_versioned_dir}"
+
+  local update_versioned_dir=\
+"${update_app}/${VERSIONS_DIR_NEW}/${UPDATE_VERSION}"
+  if [[ ! -d "${update_versioned_dir}" ]]; then
+    err "Update versioned dir does not have the new layout."
+    exit 9
+  fi
+
+  ensure_writable_symlinks_recursive "${installed_app_path}"
+
+  # By copying to ${installed_app_path}, the existing application name will be
+  # preserved, if the user has renamed the application on disk.  Respecting
+  # the user's changes is friendly.
+
+  # Make sure that ${installed_versions_dir} exists, so that it can receive
+  # the versioned directory.  It may not exist if updating from an older
+  # version that did not use the same versioned layout on disk.  Later, during
+  # the rsync to copy the application directory, the mode bits and timestamp on
+  # ${installed_versions_dir} will be set to conform to whatever is present in
+  # the update.
+  #
+  # ${installed_app_path} is guaranteed to exist at this point, but
+  # ${installed_app_path}/${CONTENTS_DIR} may not if things are severely broken
+  # or if this update is actually an initial installation from an updater
+  # skeleton bootstrap.  The mkdir creates ${installed_app_path}/${CONTENTS_DIR}
+  # if it doesn't exist; its mode bits will be fixed up in a subsequent rsync.
+  note "creating installed_versions_dir"
+  if ! mkdir -p "${installed_versions_dir}"; then
+    err "mkdir of installed_versions_dir failed"
+    exit 10
+  fi
+
+  local new_versioned_dir="${installed_versions_dir}/${UPDATE_VERSION}"
+  note "new_versioned_dir = ${new_versioned_dir}"
+
+  # If there's an entry at ${new_versioned_dir} but it's not a directory
+  # (or it's a symbolic link, whether or not it points to a directory), rsync
+  # won't get rid of it.  It's never correct to have a non-directory in place
+  # of the versioned directory, so toss out whatever's there.
+  if [[ -e "${new_versioned_dir}" ]] &&
+     ([[ -L "${new_versioned_dir}" ]] ||
+      ! [[ -d "${new_versioned_dir}" ]]); then
+    note "removing non-directory in place of versioned directory"
+    rm -f "${new_versioned_dir}" 2> /dev/null || true
+
+    # If the non-directory new_versioned_dir still exists after we attempted to
+    # remove it, just fail early here, before we get to the rsync.
+    if [[ -e "${new_versioned_dir}" ]]; then
+      err "could not remove existing file where versioned directory should be"
+      exit 11
+    fi
+  fi
+
+  # Copy the versioned directory.  The new versioned directory should have a
+  # different name than any existing one, so this won't harm anything already
+  # present in ${installed_versions_dir}, including the versioned directory
+  # being used by any running processes.  If this step is interrupted, there
+  # will be an incomplete versioned directory left behind, but it won't
+  # interfere with anything, and it will be replaced or removed during a future
+  # update attempt.
+  #
+  # In certain cases, same-version updates are distributed to move users
+  # between channels; when this happens, the contents of the versioned
+  # directories are identical and rsync will not render the versioned
+  # directory unusable even for an instant.
+  if [[ -n "${update_versioned_dir}" ]]; then
+    note "rsyncing versioned directory"
+    if ! rsync ${RSYNC_FLAGS} --delete-before "${update_versioned_dir}/" \
+                                              "${new_versioned_dir}"; then
+      err "rsync of versioned directory failed, status ${PIPESTATUS[0]}"
+
+      # If the rsync of a new-layout versioned directory failed, remove it.
+      # The incomplete version would break code signature validation.
+      note "cleaning up new_versioned_dir"
+      rm -rf "${new_versioned_dir}"
+      exit 12
+    fi
+  fi
+
+  # See if the timestamp of what's currently on disk is newer than the
+  # update's outer .app's timestamp.  rsync will copy the update's timestamp
+  # over, but if that timestamp isn't as recent as what's already on disk, the
+  # .app will need to be touched.
+  local needs_touch=
+  if [[ "${installed_app_path}" -nt "${update_app}" ]]; then
+    needs_touch="y"
+  fi
+
+  # Copy the unversioned files into place, leaving everything in
+  # ${installed_versions_dir} alone.  If this step is interrupted, the
+  # application will at least remain in a usable state, although it may not
+  # pass signature validation.  Depending on when this step is interrupted,
+  # the application will either launch the old or the new version.  The
+  # critical point is when the main executable is replaced.  There isn't very
+  # much to copy in this step, because most of the application is in the
+  # versioned directory.  This step only accounts for around 50 files, most of
+  # which are small localized InfoPlist.strings files.  Note that
+  # ${VERSIONS_DIR_NEW} are included to copy their mode bits and timestamps, but
+  # their contents are excluded, having already been installed above. The
+  # ${VERSIONS_DIR_NEW}/Current symbolic link is updated or created in this
+  # step, however.
+  note "rsyncing app directory"
+  if ! rsync ${RSYNC_FLAGS} --delete-after \
+       --include="/${VERSIONS_DIR_NEW}/Current" \
+       --exclude="/${VERSIONS_DIR_NEW}/*" "${update_app}/" \
+       "${installed_app_path}"; then
+    err "rsync of app directory failed, status ${PIPESTATUS[0]}"
+    exit 13
+  fi
+
+  note "rsyncs complete"
+
+  if [[ -n "${g_temp_dir}" ]]; then
+    # The temporary directory, if any, is no longer needed.
+    rm -rf "${g_temp_dir}" 2> /dev/null || true
+    g_temp_dir=
+    note "g_temp_dir = ${g_temp_dir}"
+  fi
+
+  # If necessary, touch the outermost .app so that it appears to the outside
+  # world that something was done to the bundle.  This will cause
+  # LaunchServices to invalidate the information it has cached about the
+  # bundle even if lsregister does not run.  This is not done if rsync already
+  # updated the timestamp to something newer than what had been on disk.  This
+  # is not considered a critical step, and if it fails, this script will not
+  # exit.
+  if [[ -n "${needs_touch}" ]]; then
+    touch -cf "${installed_app_path}" || true
+  fi
+
+  # Read the new values, such as the version.
+  note "reading new values"
+
+  local new_version_app
+  if ! new_version_app="$(infoplist_read "${installed_app_path_plist}" \
+                                         "${APP_VERSION_KEY}")" ||
+     [[ -z "${new_version_app}" ]]; then
+    err "couldn't determine new_version_app"
+    exit 14
+  fi
+
+  local new_versioned_dir="${installed_versions_dir}/${new_version_app}"
+
+  # Make sure that the update was successful by comparing the version found in
+  # the update with the version now on disk.
+  if [[ "${new_version_app}" != "${UPDATE_VERSION}" ]]; then
+    err "new_version_app and UPDATE_VERSION do not match"
+    exit 15
+  fi
+
+  # Notify LaunchServices.  This is not considered a critical step, and
+  # lsregister's exit codes shouldn't be confused with this script's own.
+  # Redirect stdout to /dev/null to suppress the useless "ThrottleProcessIO:
+  # throttling disk i/o" messages that lsregister might print.
+  note "notifying LaunchServices"
+  local coreservices="/System/Library/Frameworks/CoreServices.framework"
+  local launchservices="${coreservices}/Frameworks/LaunchServices.framework"
+  local lsregister="${launchservices}/Support/lsregister"
+  "${lsregister}" -f "${installed_app_path}" > /dev/null || true
+
+  # The remaining steps are not considered critical.
+  set +e
+
+  # Try to clean up old versions that are not in use.  The strategy is to keep
+  # the versioned directory corresponding to the update just applied
+  # (obviously) and the version that was just replaced, and to use ps and lsof
+  # to see if it looks like any processes are currently using any other old
+  # directories.  Directories not in use are removed.  Old versioned
+  # directories that are in use are left alone so as to not interfere with
+  # running processes.  These directories can be cleaned up by this script on
+  # future updates.
+  #
+  # To determine which directories are in use, both ps and lsof are used.
+  # Each approach has limitations.
+  #
+  # The ps check looks for processes within the versioned directory.  Only
+  # helper processes, such as renderers, are within the versioned directory.
+  # Browser processes are not, so the ps check will not find them, and will
+  # assume that a versioned directory is not in use if a browser is open
+  # without any windows.  The ps mechanism can also only detect processes
+  # running on the system that is performing the update.  If network shares
+  # are involved, all bets are off.
+  #
+  # The lsof check looks to see what processes have the framework dylib open.
+  # Browser processes will have their versioned framework dylib open, so this
+  # check is able to catch browsers even if there are no associated helper
+  # processes.  Like the ps check, the lsof check is limited to processes on
+  # the system that is performing the update.  Finally, unless running as
+  # root, the lsof check can only find processes running as the effective user
+  # performing the update.
+  #
+  # These limitations are motivations to additionally preserve the versioned
+  # directory corresponding to the version that was just replaced.
+  note "cleaning up old versioned directories"
+
+  local versioned_dir
+  for versioned_dir in "${installed_versions_dir_new}/"*; do
+    note "versioned_dir = ${versioned_dir}"
+    if [[ "${versioned_dir}" = "${new_versioned_dir}" ]] ||
+       [[ "${versioned_dir}" = "${old_versioned_dir}" ]] ||
+       [[ "${versioned_dir}" = "${installed_versions_dir_new}/Current" ]]; then
+      # This is the versioned directory corresponding to the update that was
+      # just applied or the version that was previously in use.  Leave it
+      # alone.
+      continue
+    fi
+
+    # Look for any processes whose executables are within this versioned
+    # directory.  They'll be helper processes, such as renderers.  Their
+    # existence indicates that this versioned directory is currently in use.
+    local ps_string="${versioned_dir}/"
+
+    # Look for any processes using the framework dylib.  This will catch
+    # browser processes where the ps check will not, but it is limited to
+    # processes running as the effective user.
+    local lsof_file
+    if [[ -e "${versioned_dir}/${FRAMEWORK_DIR}/${FRAMEWORK_NAME}" ]]; then
+      # Old layout.
+      lsof_file="${versioned_dir}/${FRAMEWORK_DIR}/${FRAMEWORK_NAME}"
+    else
+      # New layout.
+      lsof_file="${versioned_dir}/${FRAMEWORK_NAME}"
+    fi
+
+    # ps -e displays all users' processes, -ww causes ps to not truncate
+    # lines, -o comm instructs it to only print the command name, and the =
+    # tells it to not print a header line.
+    # The cut invocation filters the ps output to only have at most the number
+    # of characters in ${ps_string}.  This is done so that grep can look for
+    # an exact match.
+    # grep -F tells grep to look for lines that are exact matches (not regular
+    # expressions), -q tells it to not print any output and just indicate
+    # matches by exit status, and -x tells it that the entire line must match
+    # ${ps_string} exactly, as opposed to matching a substring.  A match
+    # causes grep to exit zero (true).
+    #
+    # lsof will exit nonzero if ${lsof_file} does not exist or is open by any
+    # process.  If the file exists and is open, it will exit zero (true).
+    if (! ps -ewwo comm= | \
+          cut -c "1-${#ps_string}" | \
+          grep -Fqx "${ps_string}") &&
+       (! lsof "${lsof_file}" >& /dev/null); then
+      # It doesn't look like anything is using this versioned directory.  Get
+      # rid of it.
+      note "versioned_dir doesn't appear to be in use, removing"
+      rm -rf "${versioned_dir}"
+    else
+      note "versioned_dir is in use, skipping"
+    fi
+  done
+
+  note "setting permissions"
+
+  local chmod_mode="a+rX,u+w,go-w"
+  if [[ "${installed_app_path:0:14}" = "/Applications/" ]] &&
+    chgrp -Rh admin "${installed_app_path}" 2> /dev/null; then
+    chmod_mode="a+rX,ug+w,o-w"
+  else
+    chown -Rh root:wheel "${installed_app_path}" 2> /dev/null
+  fi
+
+  note "chmod_mode = ${chmod_mode}"
+  chmod -R "${chmod_mode}" "${installed_app_path}" 2> /dev/null
+
+  # On the Mac, or at least on HFS+, symbolic link permissions are significant,
+  # but chmod -R and -h can't be used together.  Do another pass to fix the
+  # permissions on any symbolic links.
+  find "${installed_app_path}" -type l -exec chmod -h "${chmod_mode}" {} + \
+      2> /dev/null
+
+  # If an update is triggered from within the application itself, the update
+  # process inherits the quarantine bit (LSFileQuarantineEnabled).  Any files
+  # or directories created during the update will be quarantined in that case,
+  # which may cause Launch Services to display quarantine UI.  That's bad,
+  # especially if it happens when the outer .app launches a quarantined inner
+  # helper.  If the application is already on the system and is being updated,
+  # then it can be assumed that it should not be quarantined.  Use xattr to
+  # drop the quarantine attribute.
+  #
+  # TODO(mark): Instead of letting the quarantine attribute be set and then
+  # dropping it here, figure out a way to get the update process to run
+  # without LSFileQuarantineEnabled even when triggering an update from within
+  # the application.
+  note "lifting quarantine"
+
+  xattr -d -r "${QUARANTINE_ATTR}" "${installed_app_path}" 2> /dev/null
+
+  # Great success!
+  note "done!"
+
+  trap - EXIT
+
+  return 0
+}
+
+# Check "less than" instead of "not equal to" in case there are changes to pass
+# more arguments.
+if [[ ${#} -lt 3 ]]; then
+  usage
+  echo ${#} >& 1
+  exit 16
+fi
+
+main "${@}"
+exit ${?}
diff --git a/chrome/updater/mac/setup/embed_version.py b/chrome/updater/mac/setup/embed_version.py
new file mode 100644
index 0000000..4b35c1b0
--- /dev/null
+++ b/chrome/updater/mac/setup/embed_version.py
@@ -0,0 +1,54 @@
+# Copyright 2020 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.
+
+import ConfigParser
+import glob
+import optparse
+import os
+import shutil
+import subprocess
+import sys
+
+
+def embed_version(input_file, output_file, version):
+    fin = open(input_file, 'r')
+    fout = open(output_file, 'w')
+    replace_string = 'UPDATE_VERSION=\"' + version + '\"'
+
+    for line in fin:
+        fout.write(line.replace('UPDATE_VERSION=', replace_string))
+
+    fin.close()
+    fout.close()
+
+    os.chmod(output_file, 0755)
+
+
+def parse_options():
+    parser = optparse.OptionParser()
+    parser.add_option('-i', '--input_file', help='Path to the input script.')
+    parser.add_option(
+        '-o',
+        '--output_file',
+        help='Path to where we should output the script')
+    parser.add_option(
+        '-v',
+        '--version',
+        help='Version of the application bundle being built.')
+    options, _ = parser.parse_args()
+
+    if not options.version:
+        parser.error('You must provide a version')
+
+    return options
+
+
+def main(options):
+    embed_version(options.input_file, options.output_file, options.version)
+    return 0
+
+
+if '__main__' == __name__:
+    options = parse_options()
+    sys.exit(main(options))
diff --git a/chrome/updater/mac/setup/setup_unittest.mm b/chrome/updater/mac/setup/setup_unittest.mm
index c626039..2cb36d30 100644
--- a/chrome/updater/mac/setup/setup_unittest.mm
+++ b/chrome/updater/mac/setup/setup_unittest.mm
@@ -4,7 +4,13 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/mac/foundation_util.h"
+#include "base/no_destructor.h"
 #include "base/path_service.h"
+#include "base/process/launch.h"
+#include "base/strings/strcat.h"
+#include "base/strings/sys_string_conversions.h"
 #include "base/test/task_environment.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/updater/mac/installer.h"
@@ -12,35 +18,190 @@
 
 namespace updater_setup {
 
-class ChromeUpdaterMacSetupTest : public ::testing::Test {
- public:
-  ~ChromeUpdaterMacSetupTest() override = default;
-};
+namespace {
 
-TEST_F(ChromeUpdaterMacSetupTest, InstallFromDMG) {
-  // Get the path to the test file.
-  base::FilePath test_data_dir;
-  ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
-  test_data_dir = test_data_dir.Append(FILE_PATH_LITERAL("updater"));
-  ASSERT_TRUE(base::PathExists(test_data_dir));
-  // Get the DMG path and check that it exists.
-  const base::FilePath dmg_file_path =
-      test_data_dir.Append(FILE_PATH_LITERAL("updater_setup_test_dmg.dmg"));
-  ASSERT_TRUE(base::PathExists(dmg_file_path));
-  ASSERT_TRUE(updater::InstallFromDMG(dmg_file_path, ""));
+constexpr char kTestAppNameWithExtension[] = "InstallerTest.app";
+constexpr char kTestAppFrameworkName[] = "InstallerTest Framework.framework";
+constexpr char kTestAppVersion[] = "0";
+constexpr char kTestBundleId[] = "com.install.test";
+constexpr char kTestDirName[] = "InstallerTestDir";
+constexpr char kUpdaterTestDMGName[] = "updater_setup_test_dmg.dmg";
+
+void CreateTestApp(const base::FilePath& test_dir) {
+  // Create file paths for each part of the app we want to create.
+  base::FilePath test_app_path =
+      test_dir.Append(FILE_PATH_LITERAL(kTestAppNameWithExtension));
+  base::FilePath test_app_info_plist_path =
+      test_app_path.Append(FILE_PATH_LITERAL("Contents"))
+          .Append(FILE_PATH_LITERAL("Info.plist"));
+  base::FilePath test_app_frameworks_path =
+      test_app_path.Append(FILE_PATH_LITERAL("Contents"))
+          .Append(FILE_PATH_LITERAL("Frameworks"))
+          .Append(FILE_PATH_LITERAL(kTestAppFrameworkName));
+  base::FilePath test_app_versions_path =
+      test_app_frameworks_path.Append(FILE_PATH_LITERAL("Versions"));
+  base::FilePath test_app_current_path =
+      test_app_versions_path.Append(FILE_PATH_LITERAL("Current"));
+  base::FilePath test_app_versioned_path =
+      test_app_versions_path.Append(FILE_PATH_LITERAL(kTestAppVersion));
+  base::FilePath test_app_versioned_resources_path =
+      test_app_versioned_path.Append(FILE_PATH_LITERAL("Resources"));
+
+  // First create the directory all the way up to Resources. We only need to do
+  // this once because it'll create everything recursively.
+  ASSERT_FALSE(base::PathExists(test_app_versioned_resources_path));
+  ASSERT_TRUE(base::CreateDirectory(test_app_versioned_resources_path));
+
+  // Now we should also create the Current dir to prepare for symlinks.
+  ASSERT_FALSE(base::PathExists(test_app_current_path));
+  ASSERT_TRUE(base::CreateDirectory(test_app_current_path));
+
+  // Now to create some symlinks. We need to create one from versioned directory
+  // to Frameworks, and one from versioned directory to the Current directory.
+  ASSERT_TRUE(base::CreateSymbolicLink(
+      test_app_versioned_resources_path,
+      test_app_current_path.Append(FILE_PATH_LITERAL("Resources"))));
+
+  ASSERT_TRUE(base::CreateSymbolicLink(
+      test_app_versioned_resources_path,
+      test_app_frameworks_path.Append(FILE_PATH_LITERAL("Resources"))));
+
+  // Now to create the info plist.
+  NSDictionary* launchd_plist = @{
+    @"CFBundleShortVersionString" : base::SysUTF8ToNSString(kTestAppVersion),
+    @"CFBundleIdentifier" : base::SysUTF8ToNSString(kTestBundleId)
+  };
+
+  ASSERT_TRUE([launchd_plist
+      writeToURL:base::mac::FilePathToNSURL(test_app_info_plist_path)
+      atomically:YES]);
 }
 
-TEST_F(ChromeUpdaterMacSetupTest, InstallFromDMGWithArgs) {
-  // Get the path to the test file.
-  base::FilePath test_data_dir;
-  ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
-  test_data_dir = test_data_dir.Append(FILE_PATH_LITERAL("updater"));
-  ASSERT_TRUE(base::PathExists(test_data_dir));
-  // Get the DMG path and check that it exists.
+void CreateTestSuiteTestDir(const base::FilePath& test_dir) {
+  // Now lets copy the dmg into the test directory.
+  // Get test data path.
+  base::FilePath test_data_path;
+  ASSERT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_path));
+
+  // Get path to the dmg.
+  base::FilePath dmg_path = test_data_path.Append(FILE_PATH_LITERAL("updater"))
+                                .Append(FILE_PATH_LITERAL(kUpdaterTestDMGName));
+  ASSERT_TRUE(base::PathExists(dmg_path));
+
+  // Copy the dmg over to the test directory.
+  base::FilePath dest_path =
+      test_dir.Append(FILE_PATH_LITERAL(kUpdaterTestDMGName));
+  ASSERT_TRUE(base::CopyFile(dmg_path, dest_path));
+
+  // Now to create a fake test app.
+  CreateTestApp(test_dir);
+}
+
+base::ScopedTempDir& GetTestSuiteScopedTempDir() {
+  static base::NoDestructor<base::ScopedTempDir> test_suite_dir_;
+  return *test_suite_dir_;
+}
+
+const base::FilePath& GetTestSuiteDirPath() {
+  return GetTestSuiteScopedTempDir().GetPath();
+}
+
+}  // namespace
+
+class ChromeUpdaterMacSetupTest : public testing::Test {
+ public:
+  ~ChromeUpdaterMacSetupTest() override = default;
+
+  static void SetUpTestSuite() {
+    // SetUpTestSuite will run a script (install_test_helper.sh), which will set
+    // up all the necessary things for running the mac installer test. This will
+    // include creating dummy *.app to test the update and a sample dmg that
+    // will be used as well.
+    ASSERT_TRUE(GetTestSuiteScopedTempDir().CreateUniqueTempDir());
+    CreateTestSuiteTestDir(GetTestSuiteDirPath());
+  }
+
+  static void TearDownTestSuite() {
+    // TearDownTestSuite will run a script (install_test_helper.sh), to clean up
+    // anything remaining from the test. This will need to be run with an arg
+    // "clean" after the normal args.
+    ASSERT_TRUE(GetTestSuiteScopedTempDir().Delete());
+  }
+
+  void SetUp() override {
+    // Copies the directory created in set up test suite corresponding to each
+    // test case name. This way, we have unique directories that we can set up
+    // and clean up per test.
+    base::FilePath temp_dir;
+    ASSERT_TRUE(base::PathService::Get(base::DIR_TEMP, &temp_dir));
+
+    test_dir_ = temp_dir.Append(
+        FILE_PATH_LITERAL(base::StrCat({kTestDirName, "-",
+                                        ::testing::UnitTest::GetInstance()
+                                            ->current_test_info()
+                                            ->test_case_name()})));
+    ASSERT_TRUE(base::CopyDirectory(GetTestSuiteDirPath(), test_dir_, true));
+  }
+
+  void TearDown() override {
+    ASSERT_TRUE(base::DeleteFileRecursively(test_dir_));
+  }
+
+  base::FilePath GetTestDir() { return test_dir_; }
+
+ private:
+  base::FilePath test_dir_;
+};
+
+TEST_F(ChromeUpdaterMacSetupTest, InstallFromDMGNoArgs) {
+  // Get the path of the dmg based on the test directory path and validate it
+  // exists.
   const base::FilePath dmg_file_path =
-      test_data_dir.Append(FILE_PATH_LITERAL("updater_setup_test_dmg.dmg"));
+      GetTestDir().Append(FILE_PATH_LITERAL(kUpdaterTestDMGName));
   ASSERT_TRUE(base::PathExists(dmg_file_path));
-  ASSERT_TRUE(updater::InstallFromDMG(dmg_file_path, "-arg1 -arg2"));
+  ASSERT_NE(updater::InstallFromDMG(dmg_file_path, ""), 0);
+}
+
+TEST_F(ChromeUpdaterMacSetupTest, InstallFromDMGWithArgsFail) {
+  // Get the path of the dmg based on the test directory path and validate it
+  // exists.
+  const base::FilePath dmg_file_path =
+      GetTestDir().Append(FILE_PATH_LITERAL(kUpdaterTestDMGName));
+  ASSERT_TRUE(base::PathExists(dmg_file_path));
+  ASSERT_NE(updater::InstallFromDMG(dmg_file_path, "arg1 arg2"), 0);
+}
+
+TEST_F(ChromeUpdaterMacSetupTest, InstallFromDMGWithArgsPass) {
+  // Get the path of the dmg based on the test directory path and validate it
+  // exists.
+  const base::FilePath dmg_file_path =
+      GetTestDir().Append(FILE_PATH_LITERAL(kUpdaterTestDMGName));
+  ASSERT_TRUE(base::PathExists(dmg_file_path));
+
+  const base::FilePath installed_app_path =
+      GetTestDir().Append(FILE_PATH_LITERAL(kTestAppNameWithExtension));
+  ASSERT_TRUE(base::PathExists(installed_app_path));
+
+  std::string args =
+      base::StrCat({installed_app_path.value(), " ", kTestAppVersion});
+  ASSERT_EQ(updater::InstallFromDMG(dmg_file_path, args), 0);
+}
+
+TEST_F(ChromeUpdaterMacSetupTest, InstallFromDMGWithExtraneousArgsPass) {
+  // Get the path of the dmg based on the test directory path and validate it
+  // exists.
+  const base::FilePath dmg_file_path =
+      GetTestDir().Append(FILE_PATH_LITERAL(kUpdaterTestDMGName));
+  ASSERT_TRUE(base::PathExists(dmg_file_path));
+
+  // Get the path of the installed app and then validate it exists.
+  const base::FilePath installed_app_path =
+      GetTestDir().Append(FILE_PATH_LITERAL(kTestAppNameWithExtension));
+  ASSERT_TRUE(base::PathExists(installed_app_path));
+
+  std::string args = base::StrCat(
+      {installed_app_path.value(), " ", kTestAppVersion, " arg1 arg2"});
+  ASSERT_EQ(updater::InstallFromDMG(dmg_file_path, args), 0);
 }
 
 }  // namespace updater_setup
diff --git a/chrome/updater/server/win/BUILD.gn b/chrome/updater/server/win/BUILD.gn
index d96da1e..7b6c2f4 100644
--- a/chrome/updater/server/win/BUILD.gn
+++ b/chrome/updater/server/win/BUILD.gn
@@ -6,6 +6,12 @@
 
 midl("updater_idl_idl") {
   sources = [ "updater_idl.idl" ]
+  defines = [
+    "IUPDATER_IID=63B8FFB1-5314-48C9-9C57-93EC8BC6184B",
+    "UPDATER_LIB_UUID=69464FF0-D9EC-4037-A35F-8AE4358106CC",
+    "UPDATER_CLSID=158428A4-6014-4978-83BA-9FAD0DABE791",
+    "UPDATER_SERVICE_UUID=415FD747-D79E-42D7-93AC-1BA6E5FD4E93",
+  ]
 
   writes_tlb = true
 }
diff --git a/chrome/updater/server/win/updater_idl.idl b/chrome/updater/server/win/updater_idl.idl
index 4b7b7d3..4849936 100644
--- a/chrome/updater/server/win/updater_idl.idl
+++ b/chrome/updater/server/win/updater_idl.idl
@@ -31,7 +31,7 @@
 [
   object,
   dual,
-  uuid(63B8FFB1-5314-48C9-9C57-93EC8BC6184B),
+  uuid(IUPDATER_IID),
   helpstring("IUpdater Interface"),
   pointer_default(unique)
 ]
@@ -47,7 +47,7 @@
 };
 
 [
-  uuid(69464FF0-D9EC-4037-A35F-8AE4358106CC),
+  uuid(UPDATER_LIB_UUID),
   version(1.0),
   helpstring("Omaha 4.0 Type Library")
 ]
@@ -57,7 +57,7 @@
   interface IUpdater;
 
   [
-    uuid(158428A4-6014-4978-83BA-9FAD0DABE791),
+    uuid(UPDATER_CLSID),
     helpstring("Updater Class")
   ]
   coclass UpdaterClass
@@ -66,7 +66,7 @@
   }
 
   [
-    uuid(415FD747-D79E-42D7-93AC-1BA6E5FD4E93),
+    uuid(UPDATER_SERVICE_UUID),
     helpstring("Updater Service Class")
   ]
   coclass UpdaterServiceClass
diff --git a/chrome/updater/win/installer/installer.cc b/chrome/updater/win/installer/installer.cc
index de29c9b..dbee734c 100644
--- a/chrome/updater/win/installer/installer.cc
+++ b/chrome/updater/win/installer/installer.cc
@@ -208,8 +208,8 @@
     return ProcessExitResult(COMMAND_STRING_OVERFLOW);
   }
 
-  if (!cmd_line.append(
-          L" --install --enable-logging --vmodule=*/chrome/updater/*=2"))
+  if (!cmd_line.append(L" --install --single-process --enable-logging"
+                       L" --vmodule=*/chrome/updater/*=2"))
     return ProcessExitResult(COMMAND_STRING_OVERFLOW);
 
   return RunProcessAndWait(setup_exe.get(), cmd_line.get());
@@ -426,15 +426,15 @@
   // Unpack the compressed archive to extract the uncompressed archive file.
   UnPackStatus unpack_status =
       UnPackArchive(base::FilePath(compressed_archive.get()), unpack_path,
-                    nullptr, nullptr, nullptr);
+                    /*output_file=*/nullptr);
   if (unpack_status != UNPACK_NO_ERROR)
     return ProcessExitResult(static_cast<DWORD>(installer::UNPACKING_FAILED));
 
   // Unpack the uncompressed archive to extract the updater files.
   base::FilePath uncompressed_archive =
       unpack_path.Append(FILE_PATH_LITERAL("updater.7z"));
-  unpack_status = UnPackArchive(uncompressed_archive, unpack_path, nullptr,
-                                nullptr, nullptr);
+  unpack_status =
+      UnPackArchive(uncompressed_archive, unpack_path, /*output_file=*/nullptr);
   if (unpack_status != UNPACK_NO_ERROR)
     return ProcessExitResult(static_cast<DWORD>(installer::UNPACKING_FAILED));
 
diff --git a/chromecast/media/cma/decoder/cast_audio_decoder.cc b/chromecast/media/cma/decoder/cast_audio_decoder.cc
index a2e44e02..92c04ee 100644
--- a/chromecast/media/cma/decoder/cast_audio_decoder.cc
+++ b/chromecast/media/cma/decoder/cast_audio_decoder.cc
@@ -30,6 +30,7 @@
 #include "media/base/decoder_buffer.h"
 #include "media/base/media_util.h"
 #include "media/base/sample_format.h"
+#include "media/base/status.h"
 #include "media/filters/ffmpeg_audio_decoder.h"
 
 namespace chromecast {
@@ -155,10 +156,10 @@
                                          weak_this_, timestamp));
   }
 
-  void OnInitialized(bool success) {
+  void OnInitialized(::media::Status status) {
     DCHECK(!initialized_);
     initialized_ = true;
-    if (success) {
+    if (status.is_ok()) {
       if (!decode_queue_.empty()) {
         auto& d = decode_queue_.front();
         DecodeNow(std::move(d.first), std::move(d.second));
diff --git a/chromeos/components/quick_answers/quick_answers_consents.cc b/chromeos/components/quick_answers/quick_answers_consents.cc
index 5144d4ff..6f21f72 100644
--- a/chromeos/components/quick_answers/quick_answers_consents.cc
+++ b/chromeos/components/quick_answers/quick_answers_consents.cc
@@ -10,18 +10,12 @@
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
 #include "chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h"
+#include "chromeos/components/quick_answers/utils/quick_answers_metrics.h"
 #include "components/prefs/pref_service.h"
 
 namespace chromeos {
 namespace quick_answers {
 
-namespace {
-
-constexpr int kImpressionCap = 3;
-constexpr int kDurationCap = 8;
-
-}  // namespace
-
 QuickAnswersConsent::QuickAnswersConsent(PrefService* prefs) : prefs_(prefs) {}
 
 QuickAnswersConsent::~QuickAnswersConsent() = default;
@@ -29,16 +23,26 @@
 void QuickAnswersConsent::StartConsent() {
   // Increments impression count.
   IncrementPrefCounter(prefs::kQuickAnswersConsentImpressionCount, 1);
+
+  // Logs consent impression with how many times the user has seen the consent.
+  RecordConsentImpression(GetImpressionCount());
+
   start_time_ = base::TimeTicks::Now();
 }
 
 void QuickAnswersConsent::DismissConsent() {
   RecordImpressionDuration();
+  // Logs consent dismissed with impression count and impression duration.
+  RecordConsentInteraction(ConsentInteractionType::kDismiss,
+                           GetImpressionCount(), GetImpressionDuration());
 }
 
 void QuickAnswersConsent::AcceptConsent(ConsentInteractionType interaction) {
-  // TODO(llin): Use |interaction| for user-consent related logging.
   RecordImpressionDuration();
+  // Logs consent accepted with impression count and impression duration.
+  RecordConsentInteraction(interaction, GetImpressionCount(),
+                           GetImpressionDuration());
+
   // Marks the consent as accepted.
   prefs_->SetBoolean(prefs::kQuickAnswersConsented, true);
 }
@@ -53,15 +57,13 @@
 }
 
 bool QuickAnswersConsent::HasReachedImpressionCap() const {
-  int impression_count =
-      prefs_->GetInteger(prefs::kQuickAnswersConsentImpressionCount);
-  return impression_count + 1 > kImpressionCap;
+  return GetImpressionCount() + 1 > kConsentImpressionCap;
 }
 
 bool QuickAnswersConsent::HasReachedDurationCap() const {
   int duration_secs =
       prefs_->GetInteger(prefs::kQuickAnswersConsentImpressionDuration);
-  return duration_secs >= kDurationCap;
+  return duration_secs >= kConsentDurationCap;
 }
 
 void QuickAnswersConsent::IncrementPrefCounter(const std::string& path,
@@ -70,12 +72,18 @@
 }
 
 void QuickAnswersConsent::RecordImpressionDuration() {
-  DCHECK(!start_time_.is_null());
-
   // Records duration in pref.
-  base::TimeDelta duration = base::TimeTicks::Now() - start_time_;
   IncrementPrefCounter(prefs::kQuickAnswersConsentImpressionDuration,
-                       duration.InSeconds());
+                       GetImpressionDuration().InSeconds());
+}
+
+int QuickAnswersConsent::GetImpressionCount() const {
+  return prefs_->GetInteger(prefs::kQuickAnswersConsentImpressionCount);
+}
+
+base::TimeDelta QuickAnswersConsent::GetImpressionDuration() const {
+  DCHECK(!start_time_.is_null());
+  return base::TimeTicks::Now() - start_time_;
 }
 
 }  // namespace quick_answers
diff --git a/chromeos/components/quick_answers/quick_answers_consents.h b/chromeos/components/quick_answers/quick_answers_consents.h
index aa046eb..7dfaea2 100644
--- a/chromeos/components/quick_answers/quick_answers_consents.h
+++ b/chromeos/components/quick_answers/quick_answers_consents.h
@@ -16,6 +16,11 @@
 
 enum class ConsentInteractionType;
 
+// The consent will appear up to a total of 3 times.
+constexpr int kConsentImpressionCap = 3;
+// The consent will appear until viewed for a cumulative 8 seconds.
+constexpr int kConsentDurationCap = 8;
+
 // Tracks whether quick answers consent should be shown and records impression
 // count and duration when there is a interaction with the consent (shown,
 // accepted and dismissed).
@@ -43,14 +48,20 @@
  private:
   // Whether users have granted the consent.
   bool HasConsented() const;
-  // Whether the consent has been seen by users for |kImpressionCap| times.
+  // Whether the consent has been seen by users for |kConsentImpressionCap|
+  // times.
   bool HasReachedImpressionCap() const;
-  // Whether the consent has been seen by users for |kDurationCap| seconds.
+  // Whether the consent has been seen by users for |kConsentDurationCap|
+  // seconds.
   bool HasReachedDurationCap() const;
   // Increments the perf counter by |count|.
   void IncrementPrefCounter(const std::string& path, int count);
   // Records how long the consent has been seen by the users.
   void RecordImpressionDuration();
+  // Get how many times the consent has been seen by users.
+  int GetImpressionCount() const;
+  // Get how long the consent has been seen by users.
+  base::TimeDelta GetImpressionDuration() const;
 
   PrefService* const prefs_;
 
diff --git a/chromeos/components/quick_answers/utils/quick_answers_metrics.cc b/chromeos/components/quick_answers/utils/quick_answers_metrics.cc
index 30e9be48c..b5e5cc2fd8 100644
--- a/chromeos/components/quick_answers/utils/quick_answers_metrics.cc
+++ b/chromeos/components/quick_answers/utils/quick_answers_metrics.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
+#include "chromeos/components/quick_answers/quick_answers_consents.h"
 
 namespace chromeos {
 namespace quick_answers {
@@ -20,24 +21,39 @@
     "QuickAnswers.SelectedContent.Length";
 const char kDurationSuffix[] = ".Duration";
 
+const char kQuickAnswersConsent[] = "QuickAnswers.Consent";
+const char kQuickAnswersConsentDuration[] = "QuickAnswers.Consent.Duration";
+const char kQuickAnswersConsentImpression[] = "QuickAnswers.Consent.Impression";
+
 std::string ResultTypeToString(ResultType result_type) {
   switch (result_type) {
     case ResultType::kNoResult:
-      return ".NoResult";
+      return "NoResult";
     case ResultType::kKnowledgePanelEntityResult:
-      return ".KnowledgePanelEntity";
+      return "KnowledgePanelEntity";
     case ResultType::kDefinitionResult:
-      return ".Definition";
+      return "Definition";
     case ResultType::kTranslationResult:
-      return ".Translation";
+      return "Translation";
     case ResultType::kUnitConversionResult:
-      return ".UnitConversion";
+      return "UnitConversion";
     default:
       NOTREACHED() << "Invalid ResultType.";
       return ".Unknown";
   }
 }
 
+std::string ConsentInteractionTypeToString(ConsentInteractionType type) {
+  switch (type) {
+    case ConsentInteractionType::kAccept:
+      return "Accept";
+    case ConsentInteractionType::kManageSettings:
+      return "ManageSettings";
+    case ConsentInteractionType::kDismiss:
+      return "Dismiss";
+  }
+}
+
 void RecordTypeAndDuration(const std::string& prefix,
                            ResultType result_type,
                            const base::TimeDelta duration,
@@ -47,7 +63,8 @@
 
   const std::string duration_histogram = prefix + kDurationSuffix;
   const std::string result_type_histogram_name =
-      duration_histogram + ResultTypeToString(result_type);
+      base::StringPrintf("%s.%s", duration_histogram.c_str(),
+                         ResultTypeToString(result_type).c_str());
   // Record sliced by duration and result type.
   if (is_medium_bucketization) {
     base::UmaHistogramMediumTimes(duration_histogram, duration);
@@ -79,5 +96,24 @@
   base::UmaHistogramCounts1000(kQuickAnswerSelectedContentLength, length);
 }
 
+void RecordConsentInteraction(ConsentInteractionType type,
+                              int nth_impression,
+                              const base::TimeDelta duration) {
+  std::string interaction_type = ConsentInteractionTypeToString(type);
+  base::UmaHistogramExactLinear(
+      base::StringPrintf("%s.%s", kQuickAnswersConsentImpression,
+                         interaction_type.c_str()),
+      nth_impression, kConsentImpressionCap);
+  base::UmaHistogramTimes(
+      base::StringPrintf("%s.%s", kQuickAnswersConsentDuration,
+                         interaction_type.c_str()),
+      duration);
+}
+
+void RecordConsentImpression(int nth_impression) {
+  // Record every impression event.
+  base::UmaHistogramExactLinear(kQuickAnswersConsent, nth_impression,
+                                kConsentImpressionCap);
+}
 }  // namespace quick_answers
 }  // namespace chromeos
diff --git a/chromeos/components/quick_answers/utils/quick_answers_metrics.h b/chromeos/components/quick_answers/utils/quick_answers_metrics.h
index 1de8eb8e..5d7fb1fdb 100644
--- a/chromeos/components/quick_answers/utils/quick_answers_metrics.h
+++ b/chromeos/components/quick_answers/utils/quick_answers_metrics.h
@@ -29,6 +29,15 @@
 // Record selected text length to learn about usage pattern.
 void RecordSelectedTextLength(int length);
 
+// Record user interaction with the consent UI with how many times the user has
+// seen the consent and impression duration.
+void RecordConsentInteraction(ConsentInteractionType type,
+                              int nth_impression,
+                              const base::TimeDelta duration);
+
+// Record consent impression with how many times the user has seen the consent.
+void RecordConsentImpression(int nth_impression);
+
 }  // namespace quick_answers
 }  // namespace chromeos
 
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index df74f1d..89e0a1f 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -34,6 +34,10 @@
 const base::Feature kAutoScreenBrightness{"AutoScreenBrightness",
                                           base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Controls whether to enable assistive autocorrect.
+const base::Feature kAssistAutoCorrect{"AssistAutoCorrect",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Controls whether to enable assist personal information.
 const base::Feature kAssistPersonalInfo{"AssistPersonalInfo",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
@@ -95,7 +99,7 @@
 
 // Enables or disables the new WebUI Crostini upgrader.
 const base::Feature kCrostiniWebUIUpgrader{"CrostiniWebUIUpgrader",
-                                           base::FEATURE_ENABLED_BY_DEFAULT};
+                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables or disables using Cryptauth's GetDevicesActivityStatus API.
 const base::Feature kCryptAuthV2DeviceActivityStatus{
@@ -285,6 +289,10 @@
 const base::Feature kShowProgressBarInDemoModeSetup{
     "ShowProgressBarInDemoModeSetup", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Uses experimental component version for smart dim.
+const base::Feature kSmartDimExperimentalComponent{
+    "SmartDimExperimentalComponent", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Uses the smart dim component updater to provide smart dim model and
 // preprocessor configuration.
 const base::Feature kSmartDimNewMlAgent{"SmartDimNewMlAgent",
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index 047dd10..c6971ca 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -24,6 +24,8 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kAutoScreenBrightness;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const base::Feature kAssistAutoCorrect;
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kAssistPersonalInfo;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kAvatarToolbarButton;
@@ -130,6 +132,8 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kShowProgressBarInDemoModeSetup;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
+extern const base::Feature kSmartDimExperimentalComponent;
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kSmartDimNewMlAgent;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kSmartDimModelV3;
diff --git a/chromeos/constants/chromeos_switches.cc b/chromeos/constants/chromeos_switches.cc
index add7294..12d3525 100644
--- a/chromeos/constants/chromeos_switches.cc
+++ b/chromeos/constants/chromeos_switches.cc
@@ -459,6 +459,11 @@
 // The rlz ping delay (in seconds) that overwrites the default value.
 const char kRlzPingDelay[] = "rlz-ping-delay";
 
+// The switch added by session_manager daemon when chrome crashes 3 times or
+// more within the first 60 seconds on start.
+// See BrowserJob::ExportArgv in platform2/login_manager/browser_job.cc.
+const char kSafeMode[] = "safe-mode";
+
 // Password change url for SAML users.
 // TODO(941489): Remove when the bug is fixed.
 const char kSamlPasswordChangeUrl[] = "saml-password-change-url";
diff --git a/chromeos/constants/chromeos_switches.h b/chromeos/constants/chromeos_switches.h
index 3327821..18c6e80 100644
--- a/chromeos/constants/chromeos_switches.h
+++ b/chromeos/constants/chromeos_switches.h
@@ -185,6 +185,7 @@
 extern const char kRedirectLibassistantLogging[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kRegulatoryLabelDir[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kRlzPingDelay[];
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kSafeMode[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kSamlPasswordChangeUrl[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kShelfHoverPreviews[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kShelfHotseat[];
diff --git a/chromeos/network/BUILD.gn b/chromeos/network/BUILD.gn
index 0693593..7c00ccdc 100644
--- a/chromeos/network/BUILD.gn
+++ b/chromeos/network/BUILD.gn
@@ -92,6 +92,7 @@
     "network_handler_callbacks.h",
     "network_ip_config.cc",
     "network_ip_config.h",
+    "network_metadata_observer.h",
     "network_metadata_store.cc",
     "network_metadata_store.h",
     "network_profile.cc",
diff --git a/chromeos/network/network_metadata_observer.h b/chromeos/network/network_metadata_observer.h
new file mode 100644
index 0000000..bad93fe
--- /dev/null
+++ b/chromeos/network/network_metadata_observer.h
@@ -0,0 +1,30 @@
+// Copyright (c) 2020 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.
+
+#ifndef CHROMEOS_NETWORK_NETWORK_METADATA_OBSERVER_H_
+#define CHROMEOS_NETWORK_NETWORK_METADATA_OBSERVER_H_
+
+#include <string>
+
+#include "base/component_export.h"
+#include "base/observer_list_types.h"
+
+namespace chromeos {
+
+// Observer class for events that affect network metadata.  All callbacks are
+// executed after related metadata has been updated.
+class COMPONENT_EXPORT(CHROMEOS_NETWORK) NetworkMetadataObserver
+    : public base::CheckedObserver {
+ public:
+  // Called the first time that a network is successfully connected to.
+  virtual void OnFirstConnectionToNetwork(const std::string& guid) = 0;
+
+ protected:
+  NetworkMetadataObserver() = default;
+  ~NetworkMetadataObserver() override = default;
+};
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_NETWORK_NETWORK_METADATA_OBSERVER_H_
diff --git a/chromeos/network/network_metadata_store.cc b/chromeos/network/network_metadata_store.cc
index 739fa141..f873333 100644
--- a/chromeos/network/network_metadata_store.cc
+++ b/chromeos/network/network_metadata_store.cc
@@ -71,7 +71,16 @@
     return;
   }
 
+  bool is_first_connection =
+      GetLastConnectedTimestamp(network->guid()).is_zero();
+
   UpdateLastConnectedTimestamp(network->guid());
+
+  if (is_first_connection) {
+    for (auto& observer : observers_) {
+      observer.OnFirstConnectionToNetwork(network->guid());
+    }
+  }
 }
 
 void NetworkMetadataStore::OnConfigurationModified(
@@ -196,4 +205,12 @@
   return device_dict->FindPath(GetPath(network_guid, key));
 }
 
+void NetworkMetadataStore::AddObserver(NetworkMetadataObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void NetworkMetadataStore::RemoveObserver(NetworkMetadataObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 }  // namespace chromeos
diff --git a/chromeos/network/network_metadata_store.h b/chromeos/network/network_metadata_store.h
index 930f70c..be54a1e 100644
--- a/chromeos/network/network_metadata_store.h
+++ b/chromeos/network/network_metadata_store.h
@@ -8,9 +8,11 @@
 #include <string>
 
 #include "base/component_export.h"
+#include "base/observer_list.h"
 #include "base/values.h"
 #include "chromeos/network/network_configuration_observer.h"
 #include "chromeos/network/network_connection_observer.h"
+#include "chromeos/network/network_metadata_observer.h"
 
 class PrefService;
 class PrefRegistrySimple;
@@ -66,6 +68,10 @@
   // Networks which were added directly from sync data will return true.
   bool GetIsConfiguredBySync(const std::string& network_guid);
 
+  // Manage observers.
+  void AddObserver(NetworkMetadataObserver* observer);
+  void RemoveObserver(NetworkMetadataObserver* observer);
+
  private:
   void RemoveNetworkFromPref(const std::string& network_guid,
                              PrefService* pref_service);
@@ -76,6 +82,7 @@
   const base::Value* GetPref(const std::string& network_guid,
                              const std::string& key);
 
+  base::ObserverList<NetworkMetadataObserver> observers_;
   NetworkConfigurationHandler* network_configuration_handler_;
   NetworkConnectionHandler* network_connection_handler_;
   NetworkStateHandler* network_state_handler_;
diff --git a/chromeos/network/network_metadata_store_unittest.cc b/chromeos/network/network_metadata_store_unittest.cc
index b2cc443..4252d4e7 100644
--- a/chromeos/network/network_metadata_store_unittest.cc
+++ b/chromeos/network/network_metadata_store_unittest.cc
@@ -12,6 +12,7 @@
 #include "chromeos/network/network_configuration_handler.h"
 #include "chromeos/network/network_connection_handler.h"
 #include "chromeos/network/network_connection_handler_impl.h"
+#include "chromeos/network/network_metadata_observer.h"
 #include "chromeos/network/network_metadata_store.h"
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/network_state_test_helper.h"
@@ -25,6 +26,24 @@
 
 namespace test {
 
+class TestNetworkMetadataObserver : public NetworkMetadataObserver {
+ public:
+  TestNetworkMetadataObserver() = default;
+  ~TestNetworkMetadataObserver() override = default;
+
+  // NetworkConnectionObserver
+  void OnFirstConnectionToNetwork(const std::string& guid) override {
+    connections_.insert(guid);
+  }
+
+  bool HasConnected(const std::string& guid) {
+    return connections_.count(guid) != 0;
+  }
+
+ private:
+  std::set<std::string> connections_;
+};
+
 class NetworkMetadataStoreTest : public ::testing::Test {
  public:
   NetworkMetadataStoreTest() {
@@ -49,11 +68,14 @@
     metadata_store_ = std::make_unique<NetworkMetadataStore>(
         network_configuration_handler_, network_connection_handler_.get(),
         network_state_handler_, user_prefs_.get(), device_prefs_.get());
+    metadata_observer_ = std::make_unique<TestNetworkMetadataObserver>();
+    metadata_store_->AddObserver(metadata_observer_.get());
   }
 
   ~NetworkMetadataStoreTest() override {
     network_state_handler_ = nullptr;
     metadata_store_.reset();
+    metadata_observer_.reset();
     user_prefs_.reset();
     device_prefs_.reset();
     network_configuration_handler_ = nullptr;
@@ -71,6 +93,9 @@
   TestingPrefServiceSimple* device_prefs() { return device_prefs_.get(); }
 
   NetworkMetadataStore* metadata_store() { return metadata_store_.get(); }
+  TestNetworkMetadataObserver* metadata_observer() {
+    return metadata_observer_.get();
+  }
   NetworkConnectionHandler* network_connection_handler() {
     return network_connection_handler_.get();
   }
@@ -87,6 +112,7 @@
   std::unique_ptr<TestingPrefServiceSimple> device_prefs_;
   std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> user_prefs_;
   std::unique_ptr<NetworkMetadataStore> metadata_store_;
+  std::unique_ptr<TestNetworkMetadataObserver> metadata_observer_;
 
   DISALLOW_COPY_AND_ASSIGN(NetworkMetadataStoreTest);
 };
@@ -101,12 +127,14 @@
 TEST_F(NetworkMetadataStoreTest, FirstConnect) {
   std::string service_path = ConfigureService(kConfigWifi0Connectable);
   ASSERT_TRUE(metadata_store()->GetLastConnectedTimestamp(kGuid).is_zero());
+  ASSERT_FALSE(metadata_observer()->HasConnected(kGuid));
   network_connection_handler()->ConnectToNetwork(
       service_path, base::DoNothing(), base::DoNothing(),
       true /* check_error_state */, ConnectCallbackMode::ON_COMPLETED);
   base::RunLoop().RunUntilIdle();
 
   ASSERT_FALSE(metadata_store()->GetLastConnectedTimestamp(kGuid).is_zero());
+  ASSERT_TRUE(metadata_observer()->HasConnected(kGuid));
 }
 
 TEST_F(NetworkMetadataStoreTest, ConfigurationUpdated) {
diff --git a/chromeos/profiles/airmont.afdo.newest.txt b/chromeos/profiles/airmont.afdo.newest.txt
index 642a171..8ed2171 100644
--- a/chromeos/profiles/airmont.afdo.newest.txt
+++ b/chromeos/profiles/airmont.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-airmont-82-4079.0-1584355719-benchmark-82.0.4085.12-r1-redacted.afdo.xz
\ No newline at end of file
+chromeos-chrome-amd64-airmont-82-4079.0-1584355719-benchmark-82.0.4085.13-r1-redacted.afdo.xz
\ No newline at end of file
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index 2d8cc24..2fc5605 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527"><ph name="ENROLLMENT_DOMAIN" /> manages this device and may be able to monitor your activity.</translation>
 <translation id="150962533380566081">Invalid PUK.</translation>
 <translation id="1510238584712386396">Launcher</translation>
+<translation id="159973520823200404">Discover</translation>
 <translation id="1734367976349034509">This device is enterprise managed</translation>
 <translation id="1905710495812624430">Maximum allowed attempts exceeded.</translation>
 <translation id="1930797645656624981">Chrome OS Input Method Service</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb
index 22a43e3..a3760c7 100644
--- a/chromeos/strings/chromeos_strings_it.xtb
+++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527"><ph name="ENROLLMENT_DOMAIN" /> gestisce questo dispositivo e potrebbe essere in grado di monitorare le tue attività.</translation>
 <translation id="150962533380566081">PUK non valido.</translation>
 <translation id="1510238584712386396">Avvio applicazioni</translation>
+<translation id="159973520823200404">Scopri</translation>
 <translation id="1734367976349034509">Questo dispositivo è gestito dall'azienda</translation>
 <translation id="1905710495812624430">Numero massimo di tentativi consentiti superato.</translation>
 <translation id="1930797645656624981">Servizio metodo di immissione di Chrome OS</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb
index 1eb27a0..e6939ce 100644
--- a/chromeos/strings/chromeos_strings_ms.xtb
+++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527"><ph name="ENROLLMENT_DOMAIN" /> mengurus peranti ini dan mungkin dapat memantau aktiviti anda.</translation>
 <translation id="150962533380566081">PUK tidak sah.</translation>
 <translation id="1510238584712386396">Pelancar</translation>
+<translation id="159973520823200404">Discover</translation>
 <translation id="1734367976349034509">Peranti ini diurus perusahaan</translation>
 <translation id="1905710495812624430">Melebihi had maksimum percubaan yang dibenarkan.</translation>
 <translation id="1930797645656624981">Perkhidmatan Kaedah Input OS Chrome</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index 3f1f7b0..7e411b7 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527"><ph name="ENROLLMENT_DOMAIN" /> က ဤကိရိယာကို စီမံခန့်ခွဲပြီး သင်၏ လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်ပါသည်။</translation>
 <translation id="150962533380566081">PUK မမှန်ကန်ပါ။</translation>
 <translation id="1510238584712386396">Launcher</translation>
+<translation id="159973520823200404">Discover</translation>
 <translation id="1734367976349034509">ဤစက်ပစ္စည်းကို အဖွဲ့အစည်းက စီမံခန့်ခွဲထားသည်</translation>
 <translation id="1905710495812624430">အများဆုံးခွင့်ပြုပေးထားသည့် အခေါက်အရေအတွက်ထက် ကျော်လွန်သွားပါပြီ။</translation>
 <translation id="1930797645656624981">Chrome OS လက်ကွက်ဝန်ဆောင်မှု</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb
index 36084201..dc5248b 100644
--- a/chromeos/strings/chromeos_strings_pl.xtb
+++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527">Tym urządzeniem zarządza domena <ph name="ENROLLMENT_DOMAIN" />. Możliwe, że monitoruje ona też Twoją aktywność.</translation>
 <translation id="150962533380566081">Nieprawidłowy PUK.</translation>
 <translation id="1510238584712386396">Menu z aplikacjami</translation>
+<translation id="159973520823200404">Odkrywaj</translation>
 <translation id="1734367976349034509">Tym urządzeniem zarządza firma</translation>
 <translation id="1905710495812624430">Przekroczono maksymalną liczbę prób.</translation>
 <translation id="1930797645656624981">Usługa Metoda wprowadzania Chrome OS</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index dddd6cd9..1b73083 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527">O domínio <ph name="ENROLLMENT_DOMAIN" /> gerencia este dispositivo e pode monitorar sua atividade.</translation>
 <translation id="150962533380566081">PUK inválida.</translation>
 <translation id="1510238584712386396">Iniciador</translation>
+<translation id="159973520823200404">Discover</translation>
 <translation id="1734367976349034509">Este dispositivo é gerenciado por uma empresa</translation>
 <translation id="1905710495812624430">O número máximo de tentativas permitidas foi excedido.</translation>
 <translation id="1930797645656624981">Serviço de método de entrada do Chrome OS</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index 10b02f9..94f4287 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527"><ph name="ENROLLMENT_DOMAIN" /> මෙම උපාංගය කළමනා කරයි, ඔබේ ක්‍රියාකාරකම නිරීක්‍ෂණ කිරීමට හැකි වීමට ඉඩ ඇත.</translation>
 <translation id="150962533380566081">වලංගු නොවන PUK.</translation>
 <translation id="1510238584712386396">දියත්කරණය</translation>
+<translation id="159973520823200404">ගවේෂණය</translation>
 <translation id="1734367976349034509">මෙම උපාංගය ව්‍යවසායීව කළමනාකරණය වේ</translation>
 <translation id="1905710495812624430">ඉඩ දෙන උපරිම උත්සාහයන් ගණන ඉක්මවා ඇත.</translation>
 <translation id="1930797645656624981">Chrome OS ආදාන ක්‍රම සේවය</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index 48735b19..f67cfba 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527"><ph name="ENROLLMENT_DOMAIN" /> spravuje toto zariadenie a môže monitorovať vašu aktivitu.</translation>
 <translation id="150962533380566081">Neplatný kód PUK.</translation>
 <translation id="1510238584712386396">Spúšťač</translation>
+<translation id="159973520823200404">Objaviť</translation>
 <translation id="1734367976349034509">Toto zariadenie je spravované organizáciou</translation>
 <translation id="1905710495812624430">Maximálny počet povolených pokusov bol prekročený.</translation>
 <translation id="1930797645656624981">Služba metódy vstupu systému Chrome OS</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index 57abe49..4b0863c 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -6,6 +6,7 @@
 <translation id="1482734542997480527">Bu qurilma <ph name="ENROLLMENT_DOMAIN" /> domenida boshqariladi va faoliyatingiz kuzatilishi mumkin.</translation>
 <translation id="150962533380566081">PUK kod xato.</translation>
 <translation id="1510238584712386396">Ishga tushirish paneli</translation>
+<translation id="159973520823200404">Discover</translation>
 <translation id="1734367976349034509">Bu korporativ qurilma</translation>
 <translation id="1905710495812624430">Urinishlar soni cheklovdan oshib ketdi.</translation>
 <translation id="1930797645656624981">Chrome OS matn kiritish xizmati</translation>
diff --git a/components/autofill_assistant/browser/devtools/devtools_client.cc b/components/autofill_assistant/browser/devtools/devtools_client.cc
index 43eb019..3c21337 100644
--- a/components/autofill_assistant/browser/devtools/devtools_client.cc
+++ b/components/autofill_assistant/browser/devtools/devtools_client.cc
@@ -104,9 +104,8 @@
   std::string json_message;
   base::JSONWriter::Write(message, &json_message);
 
-  bool success = agent_host_->DispatchProtocolMessage(
+  agent_host_->DispatchProtocolMessage(
       this, base::as_bytes(base::make_span(json_message)));
-  DCHECK(success);
 }
 
 void DevtoolsClient::RegisterEventHandler(
diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_light_tint_list.xml b/components/browser_ui/styles/android/java/res/color/default_icon_color_light_tint_list.xml
index 970e1ecd..31e7807 100644
--- a/components/browser_ui/styles/android/java/res/color/default_icon_color_light_tint_list.xml
+++ b/components/browser_ui/styles/android/java/res/color/default_icon_color_light_tint_list.xml
@@ -8,10 +8,15 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           tools:ignore="UnusedResources">
-    <item android:state_selected="true" android:color="@color/default_icon_color_pressed_light" />
-    <item android:state_focused="true" android:color="@color/default_icon_color_pressed_light" />
-    <item android:state_pressed="true" android:color="@color/default_icon_color_pressed_light" />
-    <item android:state_activated="true" android:color="@color/default_icon_color_pressed_light" />
-    <item android:state_enabled="false" android:color="@color/default_icon_color_disabled_light" />
+    <item android:alpha="@dimen/default_icon_pressed_alpha"
+          android:state_selected="true" android:color="@color/default_icon_color_light" />
+    <item android:alpha="@dimen/default_icon_pressed_alpha"
+          android:state_focused="true" android:color="@color/default_icon_color_light" />
+    <item android:alpha="@dimen/default_icon_pressed_alpha"
+          android:state_pressed="true" android:color="@color/default_icon_color_light" />
+    <item android:alpha="@dimen/default_icon_pressed_alpha"
+          android:state_activated="true" android:color="@color/default_icon_color_light" />
+    <item android:alpha="@dimen/default_disabled_alpha"
+          android:state_enabled="false" android:color="@color/default_icon_color_light" />
     <item android:color="@color/default_icon_color_light" />
 </selector>
diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_light_tint_list.xml b/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_light_tint_list.xml
index c72c92d..f014c28 100644
--- a/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_light_tint_list.xml
+++ b/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_light_tint_list.xml
@@ -5,6 +5,7 @@
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources">
-    <item android:color="@color/default_icon_color_disabled_light" android:state_enabled="false"/>
+    <item android:alpha="@dimen/default_disabled_alpha"
+        android:color="@color/default_icon_color_light" android:state_enabled="false"/>
     <item android:color="@color/default_icon_color_secondary_light" />
 </selector>
diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_tint_list.xml b/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_tint_list.xml
index b8e1170..c81f860 100644
--- a/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_tint_list.xml
+++ b/components/browser_ui/styles/android/java/res/color/default_icon_color_secondary_tint_list.xml
@@ -5,6 +5,7 @@
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources">
-    <item android:color="@color/default_icon_color_disabled" android:state_enabled="false"/>
+    <item android:alpha="@dimen/default_disabled_alpha"
+        android:color="@color/default_icon_color" android:state_enabled="false"/>
     <item android:color="@color/default_icon_color_secondary" />
 </selector>
diff --git a/components/browser_ui/styles/android/java/res/color/default_icon_color_tint_list.xml b/components/browser_ui/styles/android/java/res/color/default_icon_color_tint_list.xml
index 894c95b..6a40143 100644
--- a/components/browser_ui/styles/android/java/res/color/default_icon_color_tint_list.xml
+++ b/components/browser_ui/styles/android/java/res/color/default_icon_color_tint_list.xml
@@ -8,7 +8,8 @@
 <selector xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:tools="http://schemas.android.com/tools"
           tools:ignore="UnusedResources">
-    <item android:state_enabled="false" android:color="@color/default_icon_color_disabled" />
+    <item android:alpha="@dimen/default_disabled_alpha"
+          android:state_enabled="false" android:color="@color/default_icon_color" />
     <item android:state_selected="true" android:color="@color/default_icon_color" />
     <item android:state_focused="true" android:color="@color/default_icon_color" />
     <item android:state_pressed="true" android:color="@color/default_icon_color" />
diff --git a/components/browser_ui/styles/android/java/res/values-night/colors.xml b/components/browser_ui/styles/android/java/res/values-night/colors.xml
index fc5b10a..025a95e 100644
--- a/components/browser_ui/styles/android/java/res/values-night/colors.xml
+++ b/components/browser_ui/styles/android/java/res/values-night/colors.xml
@@ -4,12 +4,12 @@
      found in the LICENSE file. -->
 
 <resources>
-    <color name="light_active_color">@color/control_active_color_dark</color>
+    <color name="light_active_color">@color/default_control_color_active_dark</color>
 
     <!-- Control colors for toggles, checkboxes, radio buttons, list item highlight, and accent.
          Note that these should NOT be used for icon tint. -->
-    <color name="control_normal_color">@color/control_normal_color_dark</color>
-    <color name="control_highlight_color">@color/control_highlight_color_dark</color>
+    <color name="control_normal_color">@color/default_control_color_normal_dark</color>
+    <color name="control_highlight_color">@color/default_control_color_highlight_dark</color>
 
     <color name="text_highlight_color">@color/highlight_color_on_light_text</color>
 </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/colors.xml b/components/browser_ui/styles/android/java/res/values/colors.xml
index d5c640a..c9d7880 100644
--- a/components/browser_ui/styles/android/java/res/values/colors.xml
+++ b/components/browser_ui/styles/android/java/res/values/colors.xml
@@ -5,7 +5,7 @@
 
 <!-- TODO(crbug.com/1017190): Remove the UnusedResources workaround. -->
 <resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="UnusedResources">
-    <color name="light_active_color">@color/control_active_color_light</color>
+    <color name="light_active_color">@color/default_control_color_active_light</color>
 
     <!-- Text colors -->
     <color name="default_primary_color">#F2F2F2</color>
@@ -23,8 +23,8 @@
 
     <!-- Control colors for toggles, checkboxes, ratio buttons, list item highlight, and accent.
      Note that these should NOT be used for icon tint. -->
-    <color name="control_normal_color">@color/control_normal_color_light</color>
+    <color name="control_normal_color">@color/default_control_color_normal_light</color>
     <color name="control_highlight_color" tools:ignore="UnusedResources">
-        @color/control_highlight_color_light
+        @color/default_control_color_highlight_light
     </color>
 </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml
index 71282e6c..77908c1a 100644
--- a/components/browser_ui/styles/android/java/res/values/styles.xml
+++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -90,10 +90,10 @@
 
     <!-- Switch styling for dark theme -->
     <style name="SwitchCompatDark" >
-        <item name="colorAccent">@color/control_active_color_dark</item>
-        <item name="colorControlNormal">@color/control_normal_color_dark</item>
-        <item name="colorControlActivated">@color/control_active_color_dark</item>
-        <item name="colorControlHighlight">@color/control_highlight_color_dark</item>
+        <item name="colorAccent">@color/default_control_color_active_dark</item>
+        <item name="colorControlNormal">@color/default_control_color_normal_dark</item>
+        <item name="colorControlActivated">@color/default_control_color_active_dark</item>
+        <item name="colorControlHighlight">@color/default_control_color_highlight_dark</item>
         <item name="android:colorForeground">@color/modern_grey_100</item>
     </style>
 </resources>
diff --git a/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java b/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java
index 48c43c00..7d4a51a 100644
--- a/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java
+++ b/components/browser_ui/styles/android/java/src/org/chromium/components/browser_ui/styles/ChromeColors.java
@@ -43,7 +43,7 @@
      */
     public static @ColorInt int getPrimaryBackgroundColor(Resources res, boolean forceDarkBgColor) {
         return forceDarkBgColor
-                ? ApiCompatibilityUtils.getColor(res, org.chromium.ui.R.color.dark_primary_color)
+                ? ApiCompatibilityUtils.getColor(res, org.chromium.ui.R.color.default_bg_color_dark)
                 : ApiCompatibilityUtils.getColor(res, org.chromium.ui.R.color.modern_primary_color);
     }
 
diff --git a/components/cronet/android/cronet_library_loader.cc b/components/cronet/android/cronet_library_loader.cc
index a53c211..db4e617 100644
--- a/components/cronet/android/cronet_library_loader.cc
+++ b/components/cronet/android/cronet_library_loader.cc
@@ -184,8 +184,7 @@
 }
 
 // Creates a proxy resolution service appropriate for this platform.
-std::unique_ptr<net::ConfiguredProxyResolutionService>
-CreateProxyResolutionService(
+std::unique_ptr<net::ProxyResolutionService> CreateProxyResolutionService(
     std::unique_ptr<net::ProxyConfigService> proxy_config_service,
     net::NetLog* net_log) {
   // Android provides a local HTTP proxy server that handles proxying when a PAC
diff --git a/components/cronet/android/cronet_url_request_context_adapter.cc b/components/cronet/android/cronet_url_request_context_adapter.cc
index 53f67e5..ad87f3d 100644
--- a/components/cronet/android/cronet_url_request_context_adapter.cc
+++ b/components/cronet/android/cronet_url_request_context_adapter.cc
@@ -52,8 +52,8 @@
 #include "net/log/file_net_log_observer.h"
 #include "net/log/net_log_util.h"
 #include "net/nqe/network_quality_estimator_params.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config_service_android.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/third_party/quiche/src/quic/core/quic_versions.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
diff --git a/components/cronet/cronet_global_state.h b/components/cronet/cronet_global_state.h
index 16c56a4..21822e0 100644
--- a/components/cronet/cronet_global_state.h
+++ b/components/cronet/cronet_global_state.h
@@ -13,7 +13,7 @@
 namespace net {
 class NetLog;
 class ProxyConfigService;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 }  // namespace net
 
 namespace cronet {
@@ -42,8 +42,7 @@
 // Creates a proxy resolution service appropriate for this platform that fetches
 // the system proxy settings. Cronet will call this API only after a prior call
 // to EnsureInitialized() has returned.
-std::unique_ptr<net::ConfiguredProxyResolutionService>
-CreateProxyResolutionService(
+std::unique_ptr<net::ProxyResolutionService> CreateProxyResolutionService(
     std::unique_ptr<net::ProxyConfigService> proxy_config_service,
     net::NetLog* net_log);
 
diff --git a/components/cronet/cronet_global_state_stubs.cc b/components/cronet/cronet_global_state_stubs.cc
index 04123319..06171d4 100644
--- a/components/cronet/cronet_global_state_stubs.cc
+++ b/components/cronet/cronet_global_state_stubs.cc
@@ -65,12 +65,11 @@
       io_task_runner);
 }
 
-std::unique_ptr<net::ConfiguredProxyResolutionService>
-CreateProxyResolutionService(
+std::unique_ptr<net::ProxyResolutionService> CreateProxyResolutionService(
     std::unique_ptr<net::ProxyConfigService> proxy_config_service,
     net::NetLog* net_log) {
   return net::ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
-      std::move(proxy_config_service), net_log);
+      std::move(proxy_config_service), /*quick_check_enabled=*/true, net_log);
 }
 
 std::string CreateDefaultUserAgent(const std::string& partial_user_agent) {
diff --git a/components/cronet/cronet_url_request_context.cc b/components/cronet/cronet_url_request_context.cc
index d4289c94..197f3cf 100644
--- a/components/cronet/cronet_url_request_context.cc
+++ b/components/cronet/cronet_url_request_context.cc
@@ -51,7 +51,7 @@
 #include "net/log/net_log_util.h"
 #include "net/net_buildflags.h"
 #include "net/nqe/network_quality_estimator_params.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/third_party/quiche/src/quic/core/quic_versions.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
diff --git a/components/cronet/ios/cronet_environment.mm b/components/cronet/ios/cronet_environment.mm
index 995e620..3ec7cda 100644
--- a/components/cronet/ios/cronet_environment.mm
+++ b/components/cronet/ios/cronet_environment.mm
@@ -45,7 +45,7 @@
 #include "net/log/net_log.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_util.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/ssl_client_socket.h"
 #include "net/ssl/ssl_key_logger_impl.h"
 #include "net/third_party/quiche/src/quic/core/quic_versions.h"
diff --git a/components/cronet/ios/cronet_global_state_ios.mm b/components/cronet/ios/cronet_global_state_ios.mm
index 84be6ee9..5683a70 100644
--- a/components/cronet/ios/cronet_global_state_ios.mm
+++ b/components/cronet/ios/cronet_global_state_ios.mm
@@ -12,8 +12,8 @@
 #include "ios/web/common/user_agent.h"
 #include "ios/web/public/init/ios_global_state.h"
 #include "ios/web/public/init/ios_global_state_configuration.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -72,8 +72,7 @@
   return nullptr;
 }
 
-std::unique_ptr<net::ConfiguredProxyResolutionService>
-CreateProxyResolutionService(
+std::unique_ptr<net::ProxyResolutionService> CreateProxyResolutionService(
     std::unique_ptr<net::ProxyConfigService> proxy_config_service,
     net::NetLog* net_log) {
   return nullptr;
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
index d3d1648..33d352f 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
@@ -39,7 +39,7 @@
 #include "net/base/network_interfaces.h"
 #include "net/base/proxy_server.h"
 #include "net/nqe/effective_connection_type.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 #if defined(OS_ANDROID)
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service_unittest.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service_unittest.cc
index ec4dde4..c3ca1d26b 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_service_unittest.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_service_unittest.cc
@@ -32,8 +32,8 @@
 #include "components/prefs/testing_pref_service.h"
 #include "content/public/test/browser_task_environment.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_info.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "services/network/test/test_network_connection_tracker.h"
 #include "services/network/test/test_network_quality_tracker.h"
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h
index c8366e9..75a3a9f 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers.h
@@ -13,7 +13,7 @@
 #include "base/time/time.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "services/network/public/mojom/url_response_head.mojom-forward.h"
 #include "url/gurl.h"
 
diff --git a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc
index 62306d8..21fb43b 100644
--- a/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc
+++ b/components/data_reduction_proxy/core/common/data_reduction_proxy_headers_unittest.cc
@@ -18,7 +18,7 @@
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_headers_test_utils.h"
 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_params.h"
 #include "net/http/http_response_headers.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
diff --git a/components/dom_distiller/content/browser/test/test_util.cc b/components/dom_distiller/content/browser/test/test_util.cc
index 236661f..e5166a8 100644
--- a/components/dom_distiller/content/browser/test/test_util.cc
+++ b/components/dom_distiller/content/browser/test/test_util.cc
@@ -78,9 +78,8 @@
 }
 
 std::string FakeDistilledPage::GetPageHtmlWithScripts() {
-  std::string html =
-      GetArticleTemplateHtml(DistilledPagePrefs::THEME_LIGHT,
-                             DistilledPagePrefs::FONT_FAMILY_SANS_SERIF);
+  std::string html = GetArticleTemplateHtml(mojom::Theme::kLight,
+                                            mojom::FontFamily::kSansSerif);
   for (const std::string& file : scripts_) {
     StrAppend(&html, {JsReplace("<script src=$1></script>", file)});
   }
diff --git a/components/dom_distiller/core/BUILD.gn b/components/dom_distiller/core/BUILD.gn
index d70bbd2..d3a5354 100644
--- a/components/dom_distiller/core/BUILD.gn
+++ b/components/dom_distiller/core/BUILD.gn
@@ -59,6 +59,7 @@
   ]
   deps = [
     "//base",
+    "//components/dom_distiller/core/mojom",
     "//components/leveldb_proto",
     "//components/pref_registry",
     "//components/prefs",
diff --git a/components/dom_distiller/core/android/BUILD.gn b/components/dom_distiller/core/android/BUILD.gn
index 4b7a191..32fc361 100644
--- a/components/dom_distiller/core/android/BUILD.gn
+++ b/components/dom_distiller/core/android/BUILD.gn
@@ -8,6 +8,7 @@
   deps = [
     "//base:base_java",
     "//base:jni_java",
+    "//components/dom_distiller/core/mojom:mojom_java",
   ]
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   sources = [
@@ -15,10 +16,4 @@
     "java/src/org/chromium/components/dom_distiller/core/DomDistillerService.java",
     "java/src/org/chromium/components/dom_distiller/core/DomDistillerUrlUtils.java",
   ]
-  srcjar_deps = [ ":jni_enums" ]
-}
-
-java_cpp_enum("jni_enums") {
-  visibility = [ ":*" ]
-  sources = [ "//components/dom_distiller/core/distilled_page_prefs.h" ]
 }
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
index 183d45d..835a9b895f 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
@@ -7,6 +7,8 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
+import org.chromium.dom_distiller.mojom.FontFamily;
+import org.chromium.dom_distiller.mojom.Theme;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -24,8 +26,8 @@
      * Observer interface for observing DistilledPagePrefs changes.
      */
     public interface Observer {
-        void onChangeFontFamily(@FontFamily int font);
-        void onChangeTheme(@Theme int theme);
+        void onChangeFontFamily(int font);
+        void onChangeTheme(int theme);
         void onChangeFontScaling(float scaling);
     }
 
@@ -43,12 +45,14 @@
         }
 
         @CalledByNative("DistilledPagePrefsObserverWrapper")
-        private void onChangeFontFamily(@FontFamily int fontFamily) {
+        private void onChangeFontFamily(int fontFamily) {
+            FontFamily.validate(fontFamily);
             mDistilledPagePrefsObserver.onChangeFontFamily(fontFamily);
         }
 
         @CalledByNative("DistilledPagePrefsObserverWrapper")
-        private void onChangeTheme(@Theme int theme) {
+        private void onChangeTheme(int theme) {
+            Theme.validate(theme);
             mDistilledPagePrefsObserver.onChangeTheme(theme);
         }
 
@@ -100,22 +104,24 @@
         return true;
     }
 
-    public void setFontFamily(@FontFamily int fontFamily) {
+    public void setFontFamily(int fontFamily) {
+        FontFamily.validate(fontFamily);
         DistilledPagePrefsJni.get().setFontFamily(
                 mDistilledPagePrefsAndroid, DistilledPagePrefs.this, fontFamily);
     }
 
-    public @FontFamily int getFontFamily() {
+    public int getFontFamily() {
         return DistilledPagePrefsJni.get().getFontFamily(
                 mDistilledPagePrefsAndroid, DistilledPagePrefs.this);
     }
 
-    public void setTheme(@Theme int theme) {
+    public void setTheme(int theme) {
+        Theme.validate(theme);
         DistilledPagePrefsJni.get().setTheme(
                 mDistilledPagePrefsAndroid, DistilledPagePrefs.this, theme);
     }
 
-    public @Theme int getTheme() {
+    public int getTheme() {
         return DistilledPagePrefsJni.get().getTheme(
                 mDistilledPagePrefsAndroid, DistilledPagePrefs.this);
     }
diff --git a/components/dom_distiller/core/distilled_page_prefs.cc b/components/dom_distiller/core/distilled_page_prefs.cc
index cdec8bb..3e8216fd 100644
--- a/components/dom_distiller/core/distilled_page_prefs.cc
+++ b/components/dom_distiller/core/distilled_page_prefs.cc
@@ -19,16 +19,16 @@
 DistilledPagePrefs::DistilledPagePrefs(PrefService* pref_service)
     : pref_service_(pref_service) {}
 
-DistilledPagePrefs::~DistilledPagePrefs() {}
+DistilledPagePrefs::~DistilledPagePrefs() = default;
 
 // static
 void DistilledPagePrefs::RegisterProfilePrefs(
     user_prefs::PrefRegistrySyncable* registry) {
   registry->RegisterIntegerPref(
-      prefs::kTheme, DistilledPagePrefs::THEME_LIGHT,
+      prefs::kTheme, static_cast<int32_t>(mojom::Theme::kLight),
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterIntegerPref(
-      prefs::kFont, DistilledPagePrefs::FONT_FAMILY_SANS_SERIF,
+      prefs::kFont, static_cast<int32_t>(mojom::FontFamily::kSansSerif),
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterDoublePref(prefs::kFontScale, 1.0);
   registry->RegisterBooleanPref(
@@ -36,43 +36,44 @@
       user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
 }
 
-void DistilledPagePrefs::SetFontFamily(
-    DistilledPagePrefs::FontFamily new_font_family) {
-  pref_service_->SetInteger(prefs::kFont, new_font_family);
+void DistilledPagePrefs::SetFontFamily(mojom::FontFamily new_font_family) {
+  pref_service_->SetInteger(prefs::kFont,
+                            static_cast<int32_t>(new_font_family));
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
       base::BindOnce(&DistilledPagePrefs::NotifyOnChangeFontFamily,
                      weak_ptr_factory_.GetWeakPtr(), new_font_family));
 }
 
-DistilledPagePrefs::FontFamily DistilledPagePrefs::GetFontFamily() {
-  int font_family = pref_service_->GetInteger(prefs::kFont);
-  if (font_family < 0 ||
-      font_family >= DistilledPagePrefs::FONT_FAMILY_NUM_ENTRIES) {
-    // Persisted data was incorrect, trying to clean it up by storing the
-    // default.
-    SetFontFamily(DistilledPagePrefs::FONT_FAMILY_SANS_SERIF);
-    return DistilledPagePrefs::FONT_FAMILY_SANS_SERIF;
-  }
-  return static_cast<FontFamily>(font_family);
+mojom::FontFamily DistilledPagePrefs::GetFontFamily() {
+  auto font_family =
+      static_cast<mojom::FontFamily>(pref_service_->GetInteger(prefs::kFont));
+  if (mojom::IsKnownEnumValue(font_family))
+    return font_family;
+
+  // Persisted data was incorrect, trying to clean it up by storing the
+  // default.
+  SetFontFamily(mojom::FontFamily::kSansSerif);
+  return mojom::FontFamily::kSansSerif;
 }
 
-void DistilledPagePrefs::SetTheme(DistilledPagePrefs::Theme new_theme) {
-  pref_service_->SetInteger(prefs::kTheme, new_theme);
+void DistilledPagePrefs::SetTheme(mojom::Theme new_theme) {
+  pref_service_->SetInteger(prefs::kTheme, static_cast<int32_t>(new_theme));
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(&DistilledPagePrefs::NotifyOnChangeTheme,
                                 weak_ptr_factory_.GetWeakPtr(), new_theme));
 }
 
-DistilledPagePrefs::Theme DistilledPagePrefs::GetTheme() {
-  int theme = pref_service_->GetInteger(prefs::kTheme);
-  if (theme < 0 || theme >= DistilledPagePrefs::THEME_NUM_ENTRIES) {
-    // Persisted data was incorrect, trying to clean it up by storing the
-    // default.
-    SetTheme(DistilledPagePrefs::THEME_LIGHT);
-    return DistilledPagePrefs::THEME_LIGHT;
-  }
-  return static_cast<Theme>(theme);
+mojom::Theme DistilledPagePrefs::GetTheme() {
+  auto theme =
+      static_cast<mojom::Theme>(pref_service_->GetInteger(prefs::kTheme));
+  if (mojom::IsKnownEnumValue(theme))
+    return theme;
+
+  // Persisted data was incorrect, trying to clean it up by storing the
+  // default.
+  SetTheme(mojom::Theme::kLight);
+  return mojom::Theme::kLight;
 }
 
 void DistilledPagePrefs::SetFontScaling(float scaling) {
@@ -102,13 +103,12 @@
 }
 
 void DistilledPagePrefs::NotifyOnChangeFontFamily(
-    DistilledPagePrefs::FontFamily new_font_family) {
+    mojom::FontFamily new_font_family) {
   for (Observer& observer : observers_)
     observer.OnChangeFontFamily(new_font_family);
 }
 
-void DistilledPagePrefs::NotifyOnChangeTheme(
-    DistilledPagePrefs::Theme new_theme) {
+void DistilledPagePrefs::NotifyOnChangeTheme(mojom::Theme new_theme) {
   for (Observer& observer : observers_)
     observer.OnChangeTheme(new_theme);
 }
diff --git a/components/dom_distiller/core/distilled_page_prefs.h b/components/dom_distiller/core/distilled_page_prefs.h
index b5d0eac..c074a139 100644
--- a/components/dom_distiller/core/distilled_page_prefs.h
+++ b/components/dom_distiller/core/distilled_page_prefs.h
@@ -8,6 +8,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
+#include "components/dom_distiller/core/mojom/distilled_page_prefs.mojom.h"
 
 class PrefService;
 
@@ -20,38 +21,10 @@
 // Interface for preferences used for distilled page.
 class DistilledPagePrefs {
  public:
-  // Possible font families for distilled page.
-  // These must be kept in sync with the resource strings in
-  // chrome/android/java/res/values/arrays.xml
-  // Values should start from 0 and can't have gaps.
-  // A Java counterpart will be generated for this enum.
-  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.dom_distiller.core
-  // GENERATED_JAVA_CLASS_NAME_OVERRIDE: FontFamily
-  // GENERATED_JAVA_PREFIX_TO_STRIP: FONT_FAMILY_
-  enum FontFamily {
-    FONT_FAMILY_SANS_SERIF = 0,
-    FONT_FAMILY_SERIF = 1,
-    FONT_FAMILY_MONOSPACE = 2,
-    FONT_FAMILY_NUM_ENTRIES = 3
-  };
-
-  // Possible themes for distilled page.
-  // Values should start from 0 and can't have gaps.
-  // A Java counterpart will be generated for this enum.
-  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.dom_distiller.core
-  // GENERATED_JAVA_CLASS_NAME_OVERRIDE: Theme
-  // GENERATED_JAVA_PREFIX_TO_STRIP: THEME_
-  enum Theme {
-    THEME_LIGHT = 0,
-    THEME_DARK = 1,
-    THEME_SEPIA = 2,
-    THEME_NUM_ENTRIES = 3
-  };
-
   class Observer {
    public:
-    virtual void OnChangeFontFamily(FontFamily font) = 0;
-    virtual void OnChangeTheme(Theme theme) = 0;
+    virtual void OnChangeFontFamily(mojom::FontFamily font) = 0;
+    virtual void OnChangeTheme(mojom::Theme theme) = 0;
     virtual void OnChangeFontScaling(float scaling) = 0;
   };
 
@@ -61,14 +34,14 @@
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
   // Sets the user's preference for the font family of distilled pages.
-  void SetFontFamily(FontFamily new_font);
+  void SetFontFamily(mojom::FontFamily new_font);
   // Returns the user's preference for the font family of distilled pages.
-  FontFamily GetFontFamily();
+  mojom::FontFamily GetFontFamily();
 
   // Sets the user's preference for the theme of distilled pages.
-  void SetTheme(Theme new_theme);
+  void SetTheme(mojom::Theme new_theme);
   // Returns the user's preference for the theme of distilled pages.
-  Theme GetTheme();
+  mojom::Theme GetTheme();
 
   // Sets the user's preference for the font size scaling of distilled pages.
   void SetFontScaling(float scaling);
@@ -80,9 +53,9 @@
 
  private:
   // Notifies all Observers of new font family.
-  void NotifyOnChangeFontFamily(FontFamily font_family);
+  void NotifyOnChangeFontFamily(mojom::FontFamily font_family);
   // Notifies all Observers of new theme.
-  void NotifyOnChangeTheme(Theme theme);
+  void NotifyOnChangeTheme(mojom::Theme theme);
   // Notifies all Observers of new font scaling.
   void NotifyOnChangeFontScaling(float scaling);
 
diff --git a/components/dom_distiller/core/distilled_page_prefs_android.cc b/components/dom_distiller/core/distilled_page_prefs_android.cc
index 7e8556e..238face 100644
--- a/components/dom_distiller/core/distilled_page_prefs_android.cc
+++ b/components/dom_distiller/core/distilled_page_prefs_android.cc
@@ -26,7 +26,7 @@
                                               const JavaParamRef<jobject>& obj,
                                               jint font_family) {
   distilled_page_prefs_->SetFontFamily(
-      static_cast<DistilledPagePrefs::FontFamily>(font_family));
+      static_cast<mojom::FontFamily>(font_family));
 }
 
 jint DistilledPagePrefsAndroid::GetFontFamily(
@@ -38,8 +38,7 @@
 void DistilledPagePrefsAndroid::SetTheme(JNIEnv* env,
                                          const JavaParamRef<jobject>& obj,
                                          jint theme) {
-  distilled_page_prefs_->SetTheme(
-      static_cast<DistilledPagePrefs::Theme>(theme));
+  distilled_page_prefs_->SetTheme(static_cast<mojom::Theme>(theme));
 }
 
 jint DistilledPagePrefsAndroid::GetTheme(JNIEnv* env,
@@ -98,14 +97,13 @@
 }
 
 void DistilledPagePrefsObserverAndroid::OnChangeFontFamily(
-    DistilledPagePrefs::FontFamily new_font_family) {
+    mojom::FontFamily new_font_family) {
   JNIEnv* env = base::android::AttachCurrentThread();
   Java_DistilledPagePrefsObserverWrapper_onChangeFontFamily(
       env, java_ref_, (int)new_font_family);
 }
 
-void DistilledPagePrefsObserverAndroid::OnChangeTheme(
-    DistilledPagePrefs::Theme new_theme) {
+void DistilledPagePrefsObserverAndroid::OnChangeTheme(mojom::Theme new_theme) {
   JNIEnv* env = base::android::AttachCurrentThread();
   Java_DistilledPagePrefsObserverWrapper_onChangeTheme(env, java_ref_,
                                                        (int)new_theme);
diff --git a/components/dom_distiller/core/distilled_page_prefs_android.h b/components/dom_distiller/core/distilled_page_prefs_android.h
index 5c1877e8..8496a1d1 100644
--- a/components/dom_distiller/core/distilled_page_prefs_android.h
+++ b/components/dom_distiller/core/distilled_page_prefs_android.h
@@ -54,9 +54,8 @@
   virtual ~DistilledPagePrefsObserverAndroid();
 
   // DistilledPagePrefs::Observer implementation.
-  void OnChangeFontFamily(
-      DistilledPagePrefs::FontFamily new_font_family) override;
-  void OnChangeTheme(DistilledPagePrefs::Theme new_theme) override;
+  void OnChangeFontFamily(mojom::FontFamily new_font_family) override;
+  void OnChangeTheme(mojom::Theme new_theme) override;
   void OnChangeFontScaling(float scaling) override;
 
   virtual void DestroyObserverAndroid(JNIEnv* env);
diff --git a/components/dom_distiller/core/distilled_page_prefs_unittests.cc b/components/dom_distiller/core/distilled_page_prefs_unittests.cc
index 3c6428b..4ded6480 100644
--- a/components/dom_distiller/core/distilled_page_prefs_unittests.cc
+++ b/components/dom_distiller/core/distilled_page_prefs_unittests.cc
@@ -16,21 +16,19 @@
 class TestingObserver : public DistilledPagePrefs::Observer {
  public:
   TestingObserver()
-      : font_(DistilledPagePrefs::FONT_FAMILY_SANS_SERIF),
-        theme_(DistilledPagePrefs::THEME_LIGHT),
+      : font_(mojom::FontFamily::kSansSerif),
+        theme_(mojom::Theme::kLight),
         scaling_(1.0f) {}
 
-  void OnChangeFontFamily(DistilledPagePrefs::FontFamily new_font) override {
+  void OnChangeFontFamily(mojom::FontFamily new_font) override {
     font_ = new_font;
   }
 
-  DistilledPagePrefs::FontFamily GetFontFamily() { return font_; }
+  mojom::FontFamily GetFontFamily() { return font_; }
 
-  void OnChangeTheme(DistilledPagePrefs::Theme new_theme) override {
-    theme_ = new_theme;
-  }
+  void OnChangeTheme(mojom::Theme new_theme) override { theme_ = new_theme; }
 
-  DistilledPagePrefs::Theme GetTheme() { return theme_; }
+  mojom::Theme GetTheme() { return theme_; }
 
   void OnChangeFontScaling(float new_scaling) override {
     scaling_ = new_scaling;
@@ -39,8 +37,8 @@
   float GetFontScaling() { return scaling_; }
 
  private:
-  DistilledPagePrefs::FontFamily font_;
-  DistilledPagePrefs::Theme theme_;
+  mojom::FontFamily font_;
+  mojom::Theme theme_;
   float scaling_;
 };
 
@@ -65,15 +63,14 @@
   TestingObserver obs;
   distilled_page_prefs_->AddObserver(&obs);
 
-  distilled_page_prefs_->SetFontFamily(
-      DistilledPagePrefs::FONT_FAMILY_MONOSPACE);
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_SANS_SERIF, obs.GetFontFamily());
+  distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kMonospace);
+  EXPECT_EQ(mojom::FontFamily::kSansSerif, obs.GetFontFamily());
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_MONOSPACE, obs.GetFontFamily());
+  EXPECT_EQ(mojom::FontFamily::kMonospace, obs.GetFontFamily());
 
-  distilled_page_prefs_->SetFontFamily(DistilledPagePrefs::FONT_FAMILY_SERIF);
+  distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kSerif);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_SERIF, obs.GetFontFamily());
+  EXPECT_EQ(mojom::FontFamily::kSerif, obs.GetFontFamily());
   distilled_page_prefs_->RemoveObserver(&obs);
 }
 
@@ -83,18 +80,17 @@
   TestingObserver obs2;
   distilled_page_prefs_->AddObserver(&obs2);
 
-  distilled_page_prefs_->SetFontFamily(DistilledPagePrefs::FONT_FAMILY_SERIF);
+  distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kSerif);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_SERIF, obs.GetFontFamily());
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_SERIF, obs2.GetFontFamily());
+  EXPECT_EQ(mojom::FontFamily::kSerif, obs.GetFontFamily());
+  EXPECT_EQ(mojom::FontFamily::kSerif, obs2.GetFontFamily());
 
   distilled_page_prefs_->RemoveObserver(&obs);
 
-  distilled_page_prefs_->SetFontFamily(
-      DistilledPagePrefs::FONT_FAMILY_MONOSPACE);
+  distilled_page_prefs_->SetFontFamily(mojom::FontFamily::kMonospace);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_SERIF, obs.GetFontFamily());
-  EXPECT_EQ(DistilledPagePrefs::FONT_FAMILY_MONOSPACE, obs2.GetFontFamily());
+  EXPECT_EQ(mojom::FontFamily::kSerif, obs.GetFontFamily());
+  EXPECT_EQ(mojom::FontFamily::kMonospace, obs2.GetFontFamily());
 
   distilled_page_prefs_->RemoveObserver(&obs2);
 }
@@ -103,14 +99,14 @@
   TestingObserver obs;
   distilled_page_prefs_->AddObserver(&obs);
 
-  distilled_page_prefs_->SetTheme(DistilledPagePrefs::THEME_SEPIA);
-  EXPECT_EQ(DistilledPagePrefs::THEME_LIGHT, obs.GetTheme());
+  distilled_page_prefs_->SetTheme(mojom::Theme::kSepia);
+  EXPECT_EQ(mojom::Theme::kLight, obs.GetTheme());
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::THEME_SEPIA, obs.GetTheme());
+  EXPECT_EQ(mojom::Theme::kSepia, obs.GetTheme());
 
-  distilled_page_prefs_->SetTheme(DistilledPagePrefs::THEME_DARK);
+  distilled_page_prefs_->SetTheme(mojom::Theme::kDark);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::THEME_DARK, obs.GetTheme());
+  EXPECT_EQ(mojom::Theme::kDark, obs.GetTheme());
 
   distilled_page_prefs_->RemoveObserver(&obs);
 }
@@ -121,17 +117,17 @@
   TestingObserver obs2;
   distilled_page_prefs_->AddObserver(&obs2);
 
-  distilled_page_prefs_->SetTheme(DistilledPagePrefs::THEME_SEPIA);
+  distilled_page_prefs_->SetTheme(mojom::Theme::kSepia);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::THEME_SEPIA, obs.GetTheme());
-  EXPECT_EQ(DistilledPagePrefs::THEME_SEPIA, obs2.GetTheme());
+  EXPECT_EQ(mojom::Theme::kSepia, obs.GetTheme());
+  EXPECT_EQ(mojom::Theme::kSepia, obs2.GetTheme());
 
   distilled_page_prefs_->RemoveObserver(&obs);
 
-  distilled_page_prefs_->SetTheme(DistilledPagePrefs::THEME_LIGHT);
+  distilled_page_prefs_->SetTheme(mojom::Theme::kLight);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(DistilledPagePrefs::THEME_SEPIA, obs.GetTheme());
-  EXPECT_EQ(DistilledPagePrefs::THEME_LIGHT, obs2.GetTheme());
+  EXPECT_EQ(mojom::Theme::kSepia, obs.GetTheme());
+  EXPECT_EQ(mojom::Theme::kLight, obs2.GetTheme());
 
   distilled_page_prefs_->RemoveObserver(&obs2);
 }
diff --git a/components/dom_distiller/core/dom_distiller_request_view_base.cc b/components/dom_distiller/core/dom_distiller_request_view_base.cc
index ad52193..9c82d149 100644
--- a/components/dom_distiller/core/dom_distiller_request_view_base.cc
+++ b/components/dom_distiller/core/dom_distiller_request_view_base.cc
@@ -89,13 +89,12 @@
   }
 }
 
-void DomDistillerRequestViewBase::OnChangeTheme(
-    DistilledPagePrefs::Theme new_theme) {
+void DomDistillerRequestViewBase::OnChangeTheme(mojom::Theme new_theme) {
   SendJavaScript(viewer::GetDistilledPageThemeJs(new_theme));
 }
 
 void DomDistillerRequestViewBase::OnChangeFontFamily(
-    DistilledPagePrefs::FontFamily new_font) {
+    mojom::FontFamily new_font) {
   SendJavaScript(viewer::GetDistilledPageFontFamilyJs(new_font));
 }
 
diff --git a/components/dom_distiller/core/dom_distiller_request_view_base.h b/components/dom_distiller/core/dom_distiller_request_view_base.h
index 308cbd0b..410353d 100644
--- a/components/dom_distiller/core/dom_distiller_request_view_base.h
+++ b/components/dom_distiller/core/dom_distiller_request_view_base.h
@@ -40,9 +40,8 @@
 
  protected:
   // DistilledPagePrefs::Observer implementation:
-  void OnChangeTheme(DistilledPagePrefs::Theme new_theme) override;
-  void OnChangeFontFamily(
-      DistilledPagePrefs::FontFamily new_font_family) override;
+  void OnChangeTheme(mojom::Theme new_theme) override;
+  void OnChangeFontFamily(mojom::FontFamily new_font_family) override;
   void OnChangeFontScaling(float scaling) override;
 
   // Sends JavaScript to the attached Viewer, buffering data if the viewer isn't
diff --git a/components/dom_distiller/core/mojom/BUILD.gn b/components/dom_distiller/core/mojom/BUILD.gn
new file mode 100644
index 0000000..50def774
--- /dev/null
+++ b/components/dom_distiller/core/mojom/BUILD.gn
@@ -0,0 +1,10 @@
+# Copyright 2020 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.
+
+import("//mojo/public/tools/bindings/mojom.gni")
+
+mojom("mojom") {
+  generate_java = true
+  sources = [ "distilled_page_prefs.mojom" ]
+}
diff --git a/components/dom_distiller/core/mojom/OWNERS b/components/dom_distiller/core/mojom/OWNERS
new file mode 100644
index 0000000..08850f4
--- /dev/null
+++ b/components/dom_distiller/core/mojom/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/components/dom_distiller/core/mojom/distilled_page_prefs.mojom b/components/dom_distiller/core/mojom/distilled_page_prefs.mojom
new file mode 100644
index 0000000..8d8a521
--- /dev/null
+++ b/components/dom_distiller/core/mojom/distilled_page_prefs.mojom
@@ -0,0 +1,18 @@
+// Copyright 2020 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.
+
+module dom_distiller.mojom;
+
+enum Theme {
+  kLight = 0,
+  kDark = 1,
+  kSepia = 2,
+};
+
+enum FontFamily {
+  kSansSerif = 0,
+  kSerif = 1,
+  kMonospace = 2,
+};
+
diff --git a/components/dom_distiller/core/viewer.cc b/components/dom_distiller/core/viewer.cc
index bcc0fa4..5deda3a6 100644
--- a/components/dom_distiller/core/viewer.cc
+++ b/components/dom_distiller/core/viewer.cc
@@ -65,37 +65,37 @@
 }
 
 // Maps themes to JS themes.
-const std::string GetJsTheme(DistilledPagePrefs::Theme theme) {
-  if (theme == DistilledPagePrefs::THEME_DARK)
+const std::string GetJsTheme(mojom::Theme theme) {
+  if (theme == mojom::Theme::kDark)
     return kDarkJsTheme;
-  if (theme == DistilledPagePrefs::THEME_SEPIA)
+  if (theme == mojom::Theme::kSepia)
     return kSepiaJsTheme;
   return kLightJsTheme;
 }
 
 // Maps themes to CSS classes.
-const std::string GetThemeCssClass(DistilledPagePrefs::Theme theme) {
-  if (theme == DistilledPagePrefs::THEME_DARK)
+const std::string GetThemeCssClass(mojom::Theme theme) {
+  if (theme == mojom::Theme::kDark)
     return kDarkCssClass;
-  if (theme == DistilledPagePrefs::THEME_SEPIA)
+  if (theme == mojom::Theme::kSepia)
     return kSepiaCssClass;
   return kLightCssClass;
 }
 
 // Maps font families to JS font families.
-const std::string GetJsFontFamily(DistilledPagePrefs::FontFamily font_family) {
-  if (font_family == DistilledPagePrefs::FONT_FAMILY_SERIF)
+const std::string GetJsFontFamily(mojom::FontFamily font_family) {
+  if (font_family == mojom::FontFamily::kSerif)
     return kSerifJsFontFamily;
-  if (font_family == DistilledPagePrefs::FONT_FAMILY_MONOSPACE)
+  if (font_family == mojom::FontFamily::kMonospace)
     return kMonospaceJsFontFamily;
   return kSansSerifJsFontFamily;
 }
 
 // Maps fontFamilies to CSS fontFamily classes.
-const std::string GetFontCssClass(DistilledPagePrefs::FontFamily font_family) {
-  if (font_family == DistilledPagePrefs::FONT_FAMILY_SERIF)
+const std::string GetFontCssClass(mojom::FontFamily font_family) {
+  if (font_family == mojom::FontFamily::kSerif)
     return kSerifCssClass;
-  if (font_family == DistilledPagePrefs::FONT_FAMILY_MONOSPACE)
+  if (font_family == mojom::FontFamily::kMonospace)
     return kMonospaceCssClass;
   return kSansSerifCssClass;
 }
@@ -108,9 +108,8 @@
   }
 }
 
-std::string ReplaceHtmlTemplateValues(
-    const DistilledPagePrefs::Theme theme,
-    const DistilledPagePrefs::FontFamily font_family) {
+std::string ReplaceHtmlTemplateValues(const mojom::Theme theme,
+                                      const mojom::FontFamily font_family) {
   std::string html_template =
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
           IDR_DOM_DISTILLER_VIEWER_HTML);
@@ -200,9 +199,8 @@
   return "showLoadingIndicator(false);";
 }
 
-const std::string GetArticleTemplateHtml(
-    DistilledPagePrefs::Theme theme,
-    DistilledPagePrefs::FontFamily font_family) {
+const std::string GetArticleTemplateHtml(mojom::Theme theme,
+                                         mojom::FontFamily font_family) {
   return ReplaceHtmlTemplateValues(theme, font_family);
 }
 
@@ -276,12 +274,11 @@
   return std::unique_ptr<ViewerHandle>();
 }
 
-const std::string GetDistilledPageThemeJs(DistilledPagePrefs::Theme theme) {
+const std::string GetDistilledPageThemeJs(mojom::Theme theme) {
   return "useTheme('" + GetJsTheme(theme) + "');";
 }
 
-const std::string GetDistilledPageFontFamilyJs(
-    DistilledPagePrefs::FontFamily font_family) {
+const std::string GetDistilledPageFontFamilyJs(mojom::FontFamily font_family) {
   return "useFontFamily('" + GetJsFontFamily(font_family) + "');";
 }
 
diff --git a/components/dom_distiller/core/viewer.h b/components/dom_distiller/core/viewer.h
index 4b6fe34..9cfbff2 100644
--- a/components/dom_distiller/core/viewer.h
+++ b/components/dom_distiller/core/viewer.h
@@ -27,9 +27,8 @@
 // Assembles a platform-specific HTML template page based on the given
 // parameters. Information from the original article has not yet been inserted,
 // so the returned HTML should be safe.
-const std::string GetArticleTemplateHtml(
-    DistilledPagePrefs::Theme theme,
-    DistilledPagePrefs::FontFamily font_family);
+const std::string GetArticleTemplateHtml(mojom::Theme theme,
+                                         mojom::FontFamily font_family);
 
 // Returns the JavaScript to place a full article's HTML on the page. The
 // returned HTML should be considered unsafe, so callers must ensure
@@ -78,11 +77,10 @@
     const gfx::Size& render_view_size);
 
 // Returns JavaScript corresponding to setting the font family.
-const std::string GetDistilledPageFontFamilyJs(
-    DistilledPagePrefs::FontFamily font);
+const std::string GetDistilledPageFontFamilyJs(mojom::FontFamily font);
 
 // Returns JavaScript corresponding to setting a specific theme.
-const std::string GetDistilledPageThemeJs(DistilledPagePrefs::Theme theme);
+const std::string GetDistilledPageThemeJs(mojom::Theme theme);
 
 // Returns JavaScript corresponding to setting the font scaling.
 const std::string GetDistilledPageFontScalingJs(float scaling);
diff --git a/components/dom_distiller/core/viewer_unittest.cc b/components/dom_distiller/core/viewer_unittest.cc
index a03ec3c2..1d86b34 100644
--- a/components/dom_distiller/core/viewer_unittest.cc
+++ b/components/dom_distiller/core/viewer_unittest.cc
@@ -31,7 +31,7 @@
 
 class FakeViewRequestDelegate : public ViewRequestDelegate {
  public:
-  ~FakeViewRequestDelegate() override {}
+  ~FakeViewRequestDelegate() override = default;
   MOCK_METHOD1(OnArticleReady, void(const DistilledArticleProto* proto));
   MOCK_METHOD1(OnArticleUpdated,
                void(ArticleDistillationUpdate article_update));
@@ -39,8 +39,8 @@
 
 class TestDomDistillerService : public DomDistillerServiceInterface {
  public:
-  TestDomDistillerService() {}
-  ~TestDomDistillerService() override {}
+  TestDomDistillerService() = default;
+  ~TestDomDistillerService() override = default;
 
   MOCK_METHOD0(ViewUrlImpl, ViewerHandle*());
   std::unique_ptr<ViewerHandle> ViewUrl(
@@ -123,15 +123,14 @@
   std::string kDarkJs = "useTheme('dark');";
   std::string kSepiaJs = "useTheme('sepia');";
   std::string kLightJs = "useTheme('light');";
-  EXPECT_EQ(kDarkJs.compare(viewer::GetDistilledPageThemeJs(
-                DistilledPagePrefs::THEME_DARK)),
-            0);
-  EXPECT_EQ(kLightJs.compare(viewer::GetDistilledPageThemeJs(
-                DistilledPagePrefs::THEME_LIGHT)),
-            0);
-  EXPECT_EQ(kSepiaJs.compare(viewer::GetDistilledPageThemeJs(
-                DistilledPagePrefs::THEME_SEPIA)),
-            0);
+  EXPECT_EQ(
+      kDarkJs.compare(viewer::GetDistilledPageThemeJs(mojom::Theme::kDark)), 0);
+  EXPECT_EQ(
+      kLightJs.compare(viewer::GetDistilledPageThemeJs(mojom::Theme::kLight)),
+      0);
+  EXPECT_EQ(
+      kSepiaJs.compare(viewer::GetDistilledPageThemeJs(mojom::Theme::kSepia)),
+      0);
 }
 
 TEST_F(DomDistillerViewerTest, TestGetDistilledPageFontFamilyJsOutput) {
@@ -139,13 +138,13 @@
   std::string kMonospaceJsFontFamily = "useFontFamily('monospace');";
   std::string kSansSerifJsFontFamily = "useFontFamily('sans-serif');";
   EXPECT_EQ(kSerifJsFontFamily.compare(viewer::GetDistilledPageFontFamilyJs(
-                DistilledPagePrefs::FONT_FAMILY_SERIF)),
+                mojom::FontFamily::kSerif)),
             0);
   EXPECT_EQ(kMonospaceJsFontFamily.compare(viewer::GetDistilledPageFontFamilyJs(
-                DistilledPagePrefs::FONT_FAMILY_MONOSPACE)),
+                mojom::FontFamily::kMonospace)),
             0);
   EXPECT_EQ(kSansSerifJsFontFamily.compare(viewer::GetDistilledPageFontFamilyJs(
-                DistilledPagePrefs::FONT_FAMILY_SANS_SERIF)),
+                mojom::FontFamily::kSansSerif)),
             0);
 }
 
diff --git a/components/find_in_page/android/BUILD.gn b/components/find_in_page/android/BUILD.gn
index 0904e4db..e07cf34c9 100644
--- a/components/find_in_page/android/BUILD.gn
+++ b/components/find_in_page/android/BUILD.gn
@@ -20,7 +20,6 @@
     ":jni_headers",
     "//base:base_java",
     "//base:jni_java",
-    "//components/embedder_support/android:content_view_java",
     "//content/public/android:content_java",
     "//ui/android:ui_java",
   ]
diff --git a/components/find_in_page/android/DEPS b/components/find_in_page/android/DEPS
index 5cccb3d..acaeac4 100644
--- a/components/find_in_page/android/DEPS
+++ b/components/find_in_page/android/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+components/embedder_support/android",
   "+content/public/android",
   "+ui/android",
 ]
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index e1aa791..f802881 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -82,7 +82,6 @@
     "autocomplete_classifier.h",
     "autocomplete_controller.cc",
     "autocomplete_controller.h",
-    "autocomplete_controller_delegate.h",
     "autocomplete_input.cc",
     "autocomplete_input.h",
     "autocomplete_match.cc",
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index 18b3550b..3b41a30 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -30,7 +30,6 @@
 #include "base/trace_event/memory_usage_estimator.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
 #include "components/omnibox/browser/bookmark_provider.h"
 #include "components/omnibox/browser/builtin_provider.h"
 #include "components/omnibox/browser/clipboard_provider.h"
@@ -208,10 +207,9 @@
 
 AutocompleteController::AutocompleteController(
     std::unique_ptr<AutocompleteProviderClient> provider_client,
-    AutocompleteControllerDelegate* delegate,
+    Observer* observer,
     int provider_types)
-    : delegate_(delegate),
-      provider_client_(std::move(provider_client)),
+    : provider_client_(std::move(provider_client)),
       document_provider_(nullptr),
       history_url_provider_(nullptr),
       keyword_provider_(nullptr),
@@ -224,6 +222,11 @@
       first_query_(true),
       search_service_worker_signal_sent_(false),
       template_url_service_(provider_client_->GetTemplateURLService()) {
+  // TODO(tommycli): We should make a separate AddObserver method on this class
+  // and take |observer| out of the constructor. Tests pass nullptr anyways.
+  if (observer)
+    observers_.AddObserver(observer);
+
   provider_types &= ~OmniboxFieldTrial::GetDisabledProviderTypes();
   if (provider_types & AutocompleteProvider::TYPE_BOOKMARK)
     providers_.push_back(new BookmarkProvider(provider_client_.get()));
@@ -327,6 +330,14 @@
 void AutocompleteController::Start(const AutocompleteInput& input) {
   TRACE_EVENT1("omnibox", "AutocompleteController::Start",
                "text", base::UTF16ToUTF8(input.text()));
+
+  // When input.want_asynchronous_matches() is false, the AutocompleteController
+  // is being used for text classification, which should not notify observers.
+  if (input.want_asynchronous_matches()) {
+    for (Observer& obs : observers_)
+      obs.OnStart(this, input);
+  }
+
   const base::string16 old_input_text(input_.text());
   const bool old_allow_exact_keyword_match = input_.allow_exact_keyword_match();
   const bool old_want_asynchronous_matches = input_.want_asynchronous_matches();
@@ -855,8 +866,8 @@
 }
 
 void AutocompleteController::NotifyChanged(bool notify_default_match) {
-  if (delegate_)
-    delegate_->OnResultChanged(notify_default_match);
+  for (Observer& obs : observers_)
+    obs.OnResultChanged(this, notify_default_match);
   if (done_)
     provider_client_->OnAutocompleteControllerResultReady(this);
 }
diff --git a/components/omnibox/browser/autocomplete_controller.h b/components/omnibox/browser/autocomplete_controller.h
index 7556405..80fdfe2c 100644
--- a/components/omnibox/browser/autocomplete_controller.h
+++ b/components/omnibox/browser/autocomplete_controller.h
@@ -12,6 +12,8 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/observer_list.h"
+#include "base/observer_list_types.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
@@ -23,7 +25,6 @@
 #include "components/omnibox/browser/autocomplete_provider_listener.h"
 #include "components/omnibox/browser/autocomplete_result.h"
 
-class AutocompleteControllerDelegate;
 class DocumentProvider;
 class HistoryURLProvider;
 class KeywordProvider;
@@ -57,15 +58,32 @@
  public:
   typedef std::vector<scoped_refptr<AutocompleteProvider> > Providers;
 
+  class Observer : public base::CheckedObserver {
+   public:
+    // Invoked when the |controller| Start() is called with an |input| that
+    // wants asynchronous matches. This is meant to exclude text classification
+    // requests. The |controller| parameter is only useful for observers that
+    // are observing multiple AutocompleteController instances.
+    virtual void OnStart(AutocompleteController* controller,
+                         const AutocompleteInput& input) {}
+
+    // Invoked when the result set of |controller| changes. If
+    // |default_match_changed| is true, the default match of the result set has
+    // changed. The |controller| parameter is only useful for observers that
+    // are observing multiple AutocompleteController instances.
+    virtual void OnResultChanged(AutocompleteController* controller,
+                                 bool default_match_changed) {}
+  };
+
   // |provider_types| is a bitmap containing AutocompleteProvider::Type values
   // that will (potentially, depending on platform, flags, etc.) be
   // instantiated. |provider_client| is passed to all those providers, and
-  // is used to get access to the template URL service. |delegate| is a
+  // is used to get access to the template URL service. |observer| is a
   // proxy for UI elements which need to be notified when the results get
   // updated.
   AutocompleteController(
       std::unique_ptr<AutocompleteProviderClient> provider_client,
-      AutocompleteControllerDelegate* delegate,
+      Observer* observer,
       int provider_types);
   ~AutocompleteController() override;
 
@@ -76,9 +94,9 @@
   // See AutocompleteInput::AutocompleteInput(...) for more details regarding
   // |input| params.
   //
-  // The controller calls AutocompleteControllerDelegate::OnResultChanged() from
-  // inside this call at least once. If matches are available later on that
-  // result in changing the result set the delegate is notified again. When the
+  // The controller calls AutocompleteController::Observer::OnResultChanged()
+  // from inside this call at least once. If matches are available later on that
+  // result in changing the result set the observers is notified again. When the
   // controller is done the notification AUTOCOMPLETE_CONTROLLER_RESULT_READY is
   // sent.
   void Start(const AutocompleteInput& input);
@@ -214,7 +232,7 @@
   // stats.
   void UpdateAssistedQueryStats(AutocompleteResult* result);
 
-  // Calls AutocompleteControllerDelegate::OnResultChanged() and if done sends
+  // Calls AutocompleteController::Observer::OnResultChanged() and if done sends
   // AUTOCOMPLETE_CONTROLLER_RESULT_READY.
   void NotifyChanged(bool notify_default_match);
 
@@ -242,7 +260,7 @@
       const base::trace_event::MemoryDumpArgs& args,
       base::trace_event::ProcessMemoryDump* process_memory_dump) override;
 
-  AutocompleteControllerDelegate* delegate_;
+  base::ObserverList<Observer> observers_;
 
   // The client passed to the providers.
   std::unique_ptr<AutocompleteProviderClient> provider_client_;
diff --git a/components/omnibox/browser/autocomplete_controller_delegate.h b/components/omnibox/browser/autocomplete_controller_delegate.h
deleted file mode 100644
index ede97d8..0000000
--- a/components/omnibox/browser/autocomplete_controller_delegate.h
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2010 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.
-
-#ifndef COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_CONTROLLER_DELEGATE_H_
-#define COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_CONTROLLER_DELEGATE_H_
-
-class AutocompleteControllerDelegate {
- public:
-  // Invoked when the result set of the AutocompleteController changes. If
-  // |default_match_changed| is true, the default match of the result set has
-  // changed.
-  virtual void OnResultChanged(bool default_match_changed) = 0;
-
- protected:
-  virtual ~AutocompleteControllerDelegate() {}
-};
-
-#endif  // COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_CONTROLLER_DELEGATE_H_
diff --git a/components/omnibox/browser/favicon_cache.cc b/components/omnibox/browser/favicon_cache.cc
index d1c693c..983c3d3 100644
--- a/components/omnibox/browser/favicon_cache.cc
+++ b/components/omnibox/browser/favicon_cache.cc
@@ -50,6 +50,13 @@
                             std::move(on_favicon_fetched));
 }
 
+gfx::Image FaviconCache::GetLargestFaviconForPageUrl(
+    const GURL& page_url,
+    FaviconFetchedCallback on_favicon_fetched) {
+  return GetFaviconInternal({RequestType::RAW_BY_PAGE_URL, page_url},
+                            std::move(on_favicon_fetched));
+}
+
 gfx::Image FaviconCache::GetFaviconForIconUrl(
     const GURL& icon_url,
     FaviconFetchedCallback on_favicon_fetched) {
@@ -91,6 +98,13 @@
         base::BindRepeating(&FaviconCache::OnFaviconFetched,
                             weak_factory_.GetWeakPtr(), request),
         &task_tracker_);
+  } else if (request.type == RequestType::RAW_BY_PAGE_URL) {
+    favicon_service_->GetRawFaviconForPageURL(
+        request.url, {favicon_base::IconType::kFavicon},
+        /*icon_size_in_pixels=*/0, /*fallback_to_host=*/false,
+        base::BindRepeating(&FaviconCache::OnFaviconRawBitmapFetched,
+                            weak_factory_.GetWeakPtr(), request),
+        &task_tracker_);
   } else if (request.type == RequestType::BY_ICON_URL) {
     favicon_service_->GetFaviconImage(
         request.url,
@@ -115,12 +129,31 @@
     return;
   }
 
-  mru_cache_.Put(request, result.image);
+  InvokeRequestCallbackWithFavicon(request, result.image);
+}
+
+void FaviconCache::OnFaviconRawBitmapFetched(
+    const Request& request,
+    const favicon_base::FaviconRawBitmapResult& bitmap_result) {
+  if (!bitmap_result.is_valid()) {
+    responses_without_favicons_.Put(request, true);
+    pending_requests_.erase(request);
+    return;
+  }
+
+  InvokeRequestCallbackWithFavicon(
+      request, gfx::Image::CreateFrom1xPNGBytes(bitmap_result.bitmap_data));
+}
+
+void FaviconCache::InvokeRequestCallbackWithFavicon(const Request& request,
+                                                    const gfx::Image& image) {
+  DCHECK(!image.IsEmpty());
+  mru_cache_.Put(request, image);
 
   auto it = pending_requests_.find(request);
   DCHECK(it != pending_requests_.end());
   for (auto& callback : it->second) {
-    std::move(callback).Run(result.image);
+    std::move(callback).Run(image);
   }
   pending_requests_.erase(it);
 }
diff --git a/components/omnibox/browser/favicon_cache.h b/components/omnibox/browser/favicon_cache.h
index 0bfbd27..9197914 100644
--- a/components/omnibox/browser/favicon_cache.h
+++ b/components/omnibox/browser/favicon_cache.h
@@ -66,8 +66,16 @@
   // Therefore, |on_favicon_fetched| may or may not be called asynchronously
   // later, but will never be called with an empty result. It will also never
   // be called synchronously.
+  //
+  // Note that GetFaviconForPageUrl and GetLargestFaviconForPageUrl should not
+  // be used interchangeably. These methods use the same |page_url| key for
+  // caching favicons and as a result may return favicons with the wrong size if
+  // called with the same |page_url|.
   gfx::Image GetFaviconForPageUrl(const GURL& page_url,
                                   FaviconFetchedCallback on_favicon_fetched);
+  gfx::Image GetLargestFaviconForPageUrl(
+      const GURL& page_url,
+      FaviconFetchedCallback on_favicon_fetched);
   gfx::Image GetFaviconForIconUrl(const GURL& icon_url,
                                   FaviconFetchedCallback on_favicon_fetched);
 
@@ -79,6 +87,7 @@
   enum class RequestType {
     BY_PAGE_URL,
     BY_ICON_URL,
+    RAW_BY_PAGE_URL,
   };
 
   struct Request {
@@ -93,10 +102,17 @@
   gfx::Image GetFaviconInternal(const Request& request,
                                 FaviconFetchedCallback on_favicon_fetched);
 
-  // This is the callback passed to the underyling FaviconService. When this
-  // is called, all the pending requests that match |request| will be called.
+  // These are the callbacks passed to the underlying FaviconService. When these
+  // are called, all the pending requests that match |request| will be called.
   void OnFaviconFetched(const Request& request,
                         const favicon_base::FaviconImageResult& result);
+  void OnFaviconRawBitmapFetched(
+      const Request& request,
+      const favicon_base::FaviconRawBitmapResult& bitmap_result);
+
+  // Invokes all the pending requests that match |request| with |image|.
+  void InvokeRequestCallbackWithFavicon(const Request& request,
+                                        const gfx::Image& image);
 
   // Removes cached favicons and null responses that match |request| from the
   // cache. Subsequent matching requests pull fresh data from FaviconService.
diff --git a/components/omnibox/browser/favicon_cache_unittest.cc b/components/omnibox/browser/favicon_cache_unittest.cc
index 985cb2e9..42df5e0 100644
--- a/components/omnibox/browser/favicon_cache_unittest.cc
+++ b/components/omnibox/browser/favicon_cache_unittest.cc
@@ -30,6 +30,14 @@
   return result;
 }
 
+favicon_base::FaviconRawBitmapResult GetDummyRawFaviconResult() {
+  favicon_base::FaviconRawBitmapResult result;
+
+  result.bitmap_data = GetDummyFaviconResult().image.As1xPNGBytes();
+
+  return result;
+}
+
 void VerifyFetchedFaviconAndCount(int* count, const gfx::Image& favicon) {
   DCHECK(count);
   EXPECT_FALSE(favicon.IsEmpty());
@@ -83,6 +91,39 @@
     }
   }
 
+  void ExpectFaviconServiceForLargestFaviconPageUrlCalls(int a_site_calls,
+                                                         int b_site_calls) {
+    if (a_site_calls > 0) {
+      EXPECT_CALL(favicon_service_,
+                  GetRawFaviconForPageURL(kUrlA, _ /*icon_types */,
+                                          0 /* desired_size_in_pixel */,
+                                          false /* fallback_to_host */,
+                                          _ /* callback */, _ /* tracker */))
+          .Times(a_site_calls)
+          .WillRepeatedly([&](auto, auto, auto, auto,
+                              favicon_base::FaviconRawBitmapCallback callback,
+                              auto) {
+            favicon_service_a_site_raw_favicon_response_ = std::move(callback);
+            return base::CancelableTaskTracker::kBadTaskId;
+          });
+    }
+
+    if (b_site_calls > 0) {
+      EXPECT_CALL(favicon_service_,
+                  GetRawFaviconForPageURL(kUrlB, _ /*icon_types */,
+                                          0 /* desired_size_in_pixel */,
+                                          false /* fallback_to_host */,
+                                          _ /* callback */, _ /* tracker */))
+          .Times(b_site_calls)
+          .WillRepeatedly([&](auto, auto, auto, auto,
+                              favicon_base::FaviconRawBitmapCallback callback,
+                              auto) {
+            favicon_service_b_site_raw_favicon_response_ = std::move(callback);
+            return base::CancelableTaskTracker::kBadTaskId;
+          });
+    }
+  }
+
   void ExpectFaviconServiceForIconUrlCalls(int calls) {
     EXPECT_CALL(favicon_service_,
                 GetFaviconImage(kIconUrl, _ /* callback */, _ /* tracker */))
@@ -91,6 +132,10 @@
 
   favicon_base::FaviconImageCallback favicon_service_a_site_response_;
   favicon_base::FaviconImageCallback favicon_service_b_site_response_;
+  favicon_base::FaviconRawBitmapCallback
+      favicon_service_a_site_raw_favicon_response_;
+  favicon_base::FaviconRawBitmapCallback
+      favicon_service_b_site_raw_favicon_response_;
 
   FaviconCache cache_;
 };
@@ -117,6 +162,29 @@
   EXPECT_EQ(1, response_count);
 }
 
+TEST_F(FaviconCacheTest, Largest) {
+  ExpectFaviconServiceForLargestFaviconPageUrlCalls(1, 0);
+  ExpectFaviconServiceForIconUrlCalls(0);
+
+  int response_count = 0;
+  gfx::Image result = cache_.GetLargestFaviconForPageUrl(
+      kUrlA, base::BindOnce(&VerifyFetchedFaviconAndCount, &response_count));
+
+  // Expect the synchronous result to be empty.
+  EXPECT_TRUE(result.IsEmpty());
+
+  std::move(favicon_service_a_site_raw_favicon_response_)
+      .Run(GetDummyRawFaviconResult());
+
+  // Re-request the same favicon and expect a non-empty result now that the
+  // cache is populated. The above EXPECT_CALL will also verify that the
+  // backing FaviconService is not hit again.
+  result = cache_.GetLargestFaviconForPageUrl(kUrlA, base::BindOnce(&Fail));
+
+  EXPECT_FALSE(result.IsEmpty());
+  EXPECT_EQ(1, response_count);
+}
+
 TEST_F(FaviconCacheTest, GetFaviconForIconUrl) {
   // Verify that the service receives a request by the icon URL.
   ExpectFaviconServiceForPageUrlCalls(0, 0);
diff --git a/components/omnibox/browser/omnibox_controller.cc b/components/omnibox/browser/omnibox_controller.cc
index c2f662e..2deee58 100644
--- a/components/omnibox/browser/omnibox_controller.cc
+++ b/components/omnibox/browser/omnibox_controller.cc
@@ -43,7 +43,10 @@
   autocomplete_controller_->Start(input);
 }
 
-void OmniboxController::OnResultChanged(bool default_match_changed) {
+void OmniboxController::OnResultChanged(AutocompleteController* controller,
+                                        bool default_match_changed) {
+  DCHECK(controller == autocomplete_controller_.get());
+
   if (client_->GetOmniboxControllerEmitter())
     client_->GetOmniboxControllerEmitter()->NotifyOmniboxResultChanged(
         default_match_changed, autocomplete_controller_.get());
diff --git a/components/omnibox/browser/omnibox_controller.h b/components/omnibox/browser/omnibox_controller.h
index 1e1d605..fe4924d 100644
--- a/components/omnibox/browser/omnibox_controller.h
+++ b/components/omnibox/browser/omnibox_controller.h
@@ -11,7 +11,6 @@
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "components/omnibox/browser/autocomplete_controller.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 
 struct AutocompleteMatch;
@@ -29,7 +28,7 @@
 //     this the point of contact between InstantController and OmniboxEditModel.
 //     As the refactor progresses, keep the class comment up to date to
 //     precisely explain what this class is doing.
-class OmniboxController : public AutocompleteControllerDelegate {
+class OmniboxController : public AutocompleteController::Observer {
  public:
   OmniboxController(OmniboxEditModel* omnibox_edit_model,
                     OmniboxClient* client);
@@ -38,8 +37,9 @@
   // The |current_url| field of input is only set for mobile ports.
   void StartAutocomplete(const AutocompleteInput& input) const;
 
-  // AutocompleteControllerDelegate:
-  void OnResultChanged(bool default_match_changed) override;
+  // AutocompleteController::Observer:
+  void OnResultChanged(AutocompleteController* controller,
+                       bool default_match_changed) override;
 
   AutocompleteController* autocomplete_controller() {
     return autocomplete_controller_.get();
diff --git a/components/omnibox/browser/omnibox_controller_emitter.cc b/components/omnibox/browser/omnibox_controller_emitter.cc
index a8f36203..f4fd1497 100644
--- a/components/omnibox/browser/omnibox_controller_emitter.cc
+++ b/components/omnibox/browser/omnibox_controller_emitter.cc
@@ -59,24 +59,26 @@
 }
 #endif  // !defined(OS_IOS)
 
-void OmniboxControllerEmitter::AddObserver(Observer* observer) {
+void OmniboxControllerEmitter::AddObserver(
+    AutocompleteController::Observer* observer) {
   observers_.AddObserver(observer);
 }
 
-void OmniboxControllerEmitter::RemoveObserver(Observer* observer) {
+void OmniboxControllerEmitter::RemoveObserver(
+    AutocompleteController::Observer* observer) {
   observers_.RemoveObserver(observer);
 }
 
 void OmniboxControllerEmitter::NotifyOmniboxQuery(
     AutocompleteController* controller,
     const AutocompleteInput& input) {
-  for (Observer& observer : observers_)
-    observer.OnOmniboxQuery(controller, input);
+  for (auto& observer : observers_)
+    observer.OnStart(controller, input);
 }
 
 void OmniboxControllerEmitter::NotifyOmniboxResultChanged(
     bool default_match_changed,
     AutocompleteController* controller) {
-  for (Observer& observer : observers_)
-    observer.OnOmniboxResultChanged(default_match_changed, controller);
+  for (auto& observer : observers_)
+    observer.OnResultChanged(controller, default_match_changed);
 }
diff --git a/components/omnibox/browser/omnibox_controller_emitter.h b/components/omnibox/browser/omnibox_controller_emitter.h
index 2a7a99a..520676c 100644
--- a/components/omnibox/browser/omnibox_controller_emitter.h
+++ b/components/omnibox/browser/omnibox_controller_emitter.h
@@ -8,7 +8,6 @@
 #include "build/build_config.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/omnibox/browser/autocomplete_controller.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
 
 #if !defined(OS_IOS)
 #include "content/public/browser/browser_context.h"
@@ -18,16 +17,6 @@
 // and notifies observers (chrome://omnibox debug page).
 class OmniboxControllerEmitter : public KeyedService {
  public:
-  class Observer : public base::CheckedObserver {
-   public:
-    // Invoked when new autocomplete queries are made from the omnibox
-    // controller or when those queries' results change.
-    virtual void OnOmniboxQuery(AutocompleteController* controller,
-                                const AutocompleteInput& input) = 0;
-    virtual void OnOmniboxResultChanged(bool default_match_changed,
-                                        AutocompleteController* controller) = 0;
-  };
-
 #if !defined(OS_IOS)
   static OmniboxControllerEmitter* GetForBrowserContext(
       content::BrowserContext* browser_context);
@@ -37,18 +26,21 @@
   ~OmniboxControllerEmitter() override;
 
   // Add/remove observer.
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
+  void AddObserver(AutocompleteController::Observer* observer);
+  void RemoveObserver(AutocompleteController::Observer* observer);
 
   // Notifies registered observers when new autocomplete queries are made from
   // the omnibox controller or when those queries' results change.
+  //
+  // TODO(tommycli): These two methods themselves should be overrides of
+  // AutocompleteController::Observer.
   void NotifyOmniboxQuery(AutocompleteController* controller,
                           const AutocompleteInput& input);
   void NotifyOmniboxResultChanged(bool default_match_changed,
                                   AutocompleteController* controller);
 
  private:
-  base::ObserverList<Observer> observers_;
+  base::ObserverList<AutocompleteController::Observer> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(OmniboxControllerEmitter);
 };
diff --git a/components/omnibox/browser/omnibox_edit_model.h b/components/omnibox/browser/omnibox_edit_model.h
index 862781f1..59322520 100644
--- a/components/omnibox/browser/omnibox_edit_model.h
+++ b/components/omnibox/browser/omnibox_edit_model.h
@@ -14,7 +14,6 @@
 #include "base/strings/string16.h"
 #include "base/time/time.h"
 #include "components/omnibox/browser/autocomplete_controller.h"
-#include "components/omnibox/browser/autocomplete_controller_delegate.h"
 #include "components/omnibox/browser/autocomplete_input.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/omnibox_controller.h"
diff --git a/components/performance_manager/performance_manager_impl.cc b/components/performance_manager/performance_manager_impl.cc
index 1fe47d7..151a20b 100644
--- a/components/performance_manager/performance_manager_impl.cc
+++ b/components/performance_manager/performance_manager_impl.cc
@@ -96,6 +96,7 @@
   GetTaskRunner()->DeleteSoon(FROM_HERE, instance.release());
 }
 
+// static
 std::unique_ptr<FrameNodeImpl> PerformanceManagerImpl::CreateFrameNode(
     ProcessNodeImpl* process_node,
     PageNodeImpl* page_node,
@@ -112,6 +113,7 @@
       browsing_instance_id, site_instance_id);
 }
 
+// static
 std::unique_ptr<PageNodeImpl> PerformanceManagerImpl::CreatePageNode(
     const WebContentsProxy& contents_proxy,
     const std::string& browser_context_id,
@@ -123,12 +125,14 @@
                                       visible_url, is_visible, is_audible);
 }
 
+// static
 std::unique_ptr<ProcessNodeImpl> PerformanceManagerImpl::CreateProcessNode(
     RenderProcessHostProxy proxy) {
   return CreateNodeImpl<ProcessNodeImpl>(
       base::OnceCallback<void(ProcessNodeImpl*)>(), proxy);
 }
 
+// static
 std::unique_ptr<WorkerNodeImpl> PerformanceManagerImpl::CreateWorkerNode(
     const std::string& browser_context_id,
     WorkerNode::WorkerType worker_type,
@@ -139,20 +143,22 @@
       worker_type, process_node, dev_tools_token);
 }
 
+// static
 void PerformanceManagerImpl::DeleteNode(std::unique_ptr<NodeBase> node) {
-  GetTaskRunner()->PostTask(
-      FROM_HERE, base::BindOnce(&PerformanceManagerImpl::DeleteNodeImpl,
-                                base::Unretained(this), node.release()));
+  CallOnGraphImpl(
+      FROM_HERE,
+      base::BindOnce(&PerformanceManagerImpl::DeleteNodeImpl, node.release()));
 }
 
+// static
 void PerformanceManagerImpl::BatchDeleteNodes(
     std::vector<std::unique_ptr<NodeBase>> nodes) {
   // Move the nodes vector to the heap.
   auto nodes_ptr = std::make_unique<std::vector<std::unique_ptr<NodeBase>>>(
       std::move(nodes));
-  GetTaskRunner()->PostTask(
-      FROM_HERE, base::BindOnce(&PerformanceManagerImpl::BatchDeleteNodesImpl,
-                                base::Unretained(this), nodes_ptr.release()));
+  CallOnGraphImpl(FROM_HERE,
+                  base::BindOnce(&PerformanceManagerImpl::BatchDeleteNodesImpl,
+                                 nodes_ptr.release()));
 }
 
 PerformanceManagerImpl::PerformanceManagerImpl() {
@@ -175,6 +181,7 @@
 
 }  // namespace
 
+// static
 template <typename NodeType, typename... Args>
 std::unique_ptr<NodeType> PerformanceManagerImpl::CreateNodeImpl(
     base::OnceCallback<void(NodeType*)> creation_callback,
@@ -188,32 +195,35 @@
   return new_node;
 }
 
-void PerformanceManagerImpl::DeleteNodeImpl(NodeBase* node_ptr) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
+// static
+void PerformanceManagerImpl::DeleteNodeImpl(NodeBase* node_ptr,
+                                            GraphImpl* graph) {
   // Must be done first to avoid leaking |node_ptr|.
   std::unique_ptr<NodeBase> node(node_ptr);
 
-  graph_.RemoveNode(node.get());
+  graph->RemoveNode(node.get());
 }
 
 namespace {
 
-void RemoveFrameAndChildrenFromGraph(FrameNodeImpl* frame_node) {
+void RemoveFrameAndChildrenFromGraph(FrameNodeImpl* frame_node,
+                                     GraphImpl* graph) {
   // Recurse on the first child while there is one.
-  while (!frame_node->child_frame_nodes().empty())
-    RemoveFrameAndChildrenFromGraph(*(frame_node->child_frame_nodes().begin()));
+  while (!frame_node->child_frame_nodes().empty()) {
+    RemoveFrameAndChildrenFromGraph(*(frame_node->child_frame_nodes().begin()),
+                                    graph);
+  }
 
   // Now that all children are deleted, delete this frame.
-  frame_node->graph()->RemoveNode(frame_node);
+  graph->RemoveNode(frame_node);
 }
 
 }  // namespace
 
+// static
 void PerformanceManagerImpl::BatchDeleteNodesImpl(
-    std::vector<std::unique_ptr<NodeBase>>* nodes_ptr) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
+    std::vector<std::unique_ptr<NodeBase>>* nodes_ptr,
+    GraphImpl* graph) {
   // Must be done first to avoid leaking |nodes_ptr|.
   std::unique_ptr<std::vector<std::unique_ptr<NodeBase>>> nodes(nodes_ptr);
 
@@ -225,11 +235,12 @@
         auto* page_node = PageNodeImpl::FromNodeBase(node.get());
 
         // Delete the main frame nodes until no more exist.
-        while (!page_node->main_frame_nodes().empty())
+        while (!page_node->main_frame_nodes().empty()) {
           RemoveFrameAndChildrenFromGraph(
-              *(page_node->main_frame_nodes().begin()));
+              *(page_node->main_frame_nodes().begin()), graph);
+        }
 
-        graph_.RemoveNode(page_node);
+        graph->RemoveNode(page_node);
         break;
       }
       case ProcessNodeImpl::Type(): {
@@ -243,7 +254,7 @@
         break;
       case WorkerNodeImpl::Type(): {
         auto* worker_node = WorkerNodeImpl::FromNodeBase(node.get());
-        graph_.RemoveNode(worker_node);
+        graph->RemoveNode(worker_node);
         break;
       }
       case SystemNodeImpl::Type():
@@ -257,7 +268,7 @@
 
   // Remove the process nodes from the graph.
   for (auto* process_node : process_nodes)
-    graph_.RemoveNode(process_node);
+    graph->RemoveNode(process_node);
 
   // When |nodes| goes out of scope, all nodes are deleted.
 }
diff --git a/components/performance_manager/performance_manager_impl.h b/components/performance_manager/performance_manager_impl.h
index 6aa3791..b69473b 100644
--- a/components/performance_manager/performance_manager_impl.h
+++ b/components/performance_manager/performance_manager_impl.h
@@ -50,7 +50,7 @@
   // only if "IsAvailable" returns true. The return value is returned as an
   // argument to the reply callback.
   template <typename TaskReturnType>
-  void CallOnGraphAndReplyWithResult(
+  static void CallOnGraphAndReplyWithResult(
       const base::Location& from_here,
       base::OnceCallback<TaskReturnType(GraphImpl*)> task,
       base::OnceCallback<void(TaskReturnType)> reply);
@@ -73,7 +73,7 @@
   // May be called from any sequence. If a |creation_callback| is provided it
   // will be run on the performance manager sequence immediately after creating
   // the node.
-  std::unique_ptr<FrameNodeImpl> CreateFrameNode(
+  static std::unique_ptr<FrameNodeImpl> CreateFrameNode(
       ProcessNodeImpl* process_node,
       PageNodeImpl* page_node,
       FrameNodeImpl* parent_frame_node,
@@ -84,15 +84,15 @@
       int32_t site_instance_id,
       FrameNodeCreationCallback creation_callback =
           FrameNodeCreationCallback());
-  std::unique_ptr<PageNodeImpl> CreatePageNode(
+  static std::unique_ptr<PageNodeImpl> CreatePageNode(
       const WebContentsProxy& contents_proxy,
       const std::string& browser_context_id,
       const GURL& visible_url,
       bool is_visible,
       bool is_audible);
-  std::unique_ptr<ProcessNodeImpl> CreateProcessNode(
+  static std::unique_ptr<ProcessNodeImpl> CreateProcessNode(
       RenderProcessHostProxy proxy);
-  std::unique_ptr<WorkerNodeImpl> CreateWorkerNode(
+  static std::unique_ptr<WorkerNodeImpl> CreateWorkerNode(
       const std::string& browser_context_id,
       WorkerNode::WorkerType worker_type,
       ProcessNodeImpl* process_node,
@@ -100,12 +100,12 @@
 
   // Destroys a node returned from the creation functions above.
   // May be called from any sequence.
-  void DeleteNode(std::unique_ptr<NodeBase> node);
+  static void DeleteNode(std::unique_ptr<NodeBase> node);
 
   // Each node in |nodes| must have been returned from one of the creation
   // functions above. This function takes care of removing them from the graph
   // in topological order and destroying them.
-  void BatchDeleteNodes(std::vector<std::unique_ptr<NodeBase>> nodes);
+  static void BatchDeleteNodes(std::vector<std::unique_ptr<NodeBase>> nodes);
 
   // Returns the performance manager TaskRunner.
   // TODO(chrisha): Hide this after the last consumer stops using it!
@@ -113,7 +113,7 @@
 
   // Indicates whether or not the caller is currently running on the PM task
   // runner.
-  bool OnPMTaskRunnerForTesting() const {
+  static bool OnPMTaskRunnerForTesting() {
     return GetTaskRunner()->RunsTasksInCurrentSequence();
   }
 
@@ -123,7 +123,7 @@
   PerformanceManagerImpl();
 
   template <typename NodeType, typename... Args>
-  std::unique_ptr<NodeType> CreateNodeImpl(
+  static std::unique_ptr<NodeType> CreateNodeImpl(
       base::OnceCallback<void(NodeType*)> creation_callback,
       Args&&... constructor_args);
 
@@ -133,8 +133,10 @@
   // Note that this function has similar semantics to
   // SequencedTaskRunner::DeleteSoon(). The node/vector of nodes is passed via a
   // regular pointer so that they are not deleted if the task is not executed.
-  void DeleteNodeImpl(NodeBase* node_ptr);
-  void BatchDeleteNodesImpl(std::vector<std::unique_ptr<NodeBase>>* nodes_ptr);
+  static void DeleteNodeImpl(NodeBase* node_ptr, GraphImpl* graph);
+  static void BatchDeleteNodesImpl(
+      std::vector<std::unique_ptr<NodeBase>>* nodes_ptr,
+      GraphImpl* graph);
 
   void OnStartImpl(GraphImplCallback graph_callback);
   static void RunCallbackWithGraphImpl(GraphImplCallback graph_callback);
@@ -151,6 +153,7 @@
   DISALLOW_COPY_AND_ASSIGN(PerformanceManagerImpl);
 };
 
+// static
 template <typename TaskReturnType>
 void PerformanceManagerImpl::CallOnGraphAndReplyWithResult(
     const base::Location& from_here,
diff --git a/components/performance_manager/performance_manager_impl_unittest.cc b/components/performance_manager/performance_manager_impl_unittest.cc
index 1810374..7799f31 100644
--- a/components/performance_manager/performance_manager_impl_unittest.cc
+++ b/components/performance_manager/performance_manager_impl_unittest.cc
@@ -34,20 +34,13 @@
   }
 
   void TearDown() override {
-    if (performance_manager_) {
-      PerformanceManagerImpl::Destroy(std::move(performance_manager_));
-      // Make sure destruction unregisters the instance.
-      EXPECT_EQ(nullptr, PerformanceManagerImpl::GetInstance());
-    }
+    PerformanceManagerImpl::Destroy(std::move(performance_manager_));
+    // Make sure destruction unregisters the instance.
+    EXPECT_EQ(nullptr, PerformanceManagerImpl::GetInstance());
 
     task_environment_.RunUntilIdle();
   }
 
- protected:
-  PerformanceManagerImpl* performance_manager() {
-    return performance_manager_.get();
-  }
-
  private:
   std::unique_ptr<PerformanceManagerImpl> performance_manager_;
   base::test::TaskEnvironment task_environment_;
@@ -59,58 +52,58 @@
   int next_render_frame_id = 0;
 
   std::unique_ptr<ProcessNodeImpl> process_node =
-      performance_manager()->CreateProcessNode(RenderProcessHostProxy());
+      PerformanceManagerImpl::CreateProcessNode(RenderProcessHostProxy());
   EXPECT_NE(nullptr, process_node.get());
   std::unique_ptr<PageNodeImpl> page_node =
-      performance_manager()->CreatePageNode(WebContentsProxy(), std::string(),
-                                            GURL(), false, false);
+      PerformanceManagerImpl::CreatePageNode(WebContentsProxy(), std::string(),
+                                             GURL(), false, false);
   EXPECT_NE(nullptr, page_node.get());
 
   // Create a node of each type.
   std::unique_ptr<FrameNodeImpl> frame_node =
-      performance_manager()->CreateFrameNode(
+      PerformanceManagerImpl::CreateFrameNode(
           process_node.get(), page_node.get(), nullptr, 0,
           ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0);
   EXPECT_NE(nullptr, frame_node.get());
 
-  performance_manager()->DeleteNode(std::move(frame_node));
-  performance_manager()->DeleteNode(std::move(page_node));
-  performance_manager()->DeleteNode(std::move(process_node));
+  PerformanceManagerImpl::DeleteNode(std::move(frame_node));
+  PerformanceManagerImpl::DeleteNode(std::move(page_node));
+  PerformanceManagerImpl::DeleteNode(std::move(process_node));
 }
 
 TEST_F(PerformanceManagerImplTest, BatchDeleteNodes) {
   int next_render_frame_id = 0;
   // Create a page node and a small hierarchy of frames.
   std::unique_ptr<ProcessNodeImpl> process_node =
-      performance_manager()->CreateProcessNode(RenderProcessHostProxy());
+      PerformanceManagerImpl::CreateProcessNode(RenderProcessHostProxy());
   std::unique_ptr<PageNodeImpl> page_node =
-      performance_manager()->CreatePageNode(WebContentsProxy(), std::string(),
-                                            GURL(), false, false);
+      PerformanceManagerImpl::CreatePageNode(WebContentsProxy(), std::string(),
+                                             GURL(), false, false);
 
   std::unique_ptr<FrameNodeImpl> parent1_frame =
-      performance_manager()->CreateFrameNode(
+      PerformanceManagerImpl::CreateFrameNode(
           process_node.get(), page_node.get(), nullptr, 0,
           ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0);
   std::unique_ptr<FrameNodeImpl> parent2_frame =
-      performance_manager()->CreateFrameNode(
+      PerformanceManagerImpl::CreateFrameNode(
           process_node.get(), page_node.get(), nullptr, 1,
           ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0);
 
   std::unique_ptr<FrameNodeImpl> child1_frame =
-      performance_manager()->CreateFrameNode(
+      PerformanceManagerImpl::CreateFrameNode(
           process_node.get(), page_node.get(), parent1_frame.get(), 2,
           ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0);
   std::unique_ptr<FrameNodeImpl> child2_frame =
-      performance_manager()->CreateFrameNode(
+      PerformanceManagerImpl::CreateFrameNode(
           process_node.get(), page_node.get(), parent2_frame.get(), 3,
           ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0);
 
   std::vector<std::unique_ptr<NodeBase>> nodes;
   for (size_t i = 0; i < 10; ++i) {
-    nodes.push_back(performance_manager()->CreateFrameNode(
+    nodes.push_back(PerformanceManagerImpl::CreateFrameNode(
         process_node.get(), page_node.get(), child1_frame.get(), 0,
         ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0));
-    nodes.push_back(performance_manager()->CreateFrameNode(
+    nodes.push_back(PerformanceManagerImpl::CreateFrameNode(
         process_node.get(), page_node.get(), child1_frame.get(), 1,
         ++next_render_frame_id, base::UnguessableToken::Create(), 0, 0));
   }
@@ -122,43 +115,41 @@
   nodes.push_back(std::move(child1_frame));
   nodes.push_back(std::move(child2_frame));
 
-  performance_manager()->BatchDeleteNodes(std::move(nodes));
+  PerformanceManagerImpl::BatchDeleteNodes(std::move(nodes));
 }
 
 TEST_F(PerformanceManagerImplTest, CallOnGraphImpl) {
   // Create a page node for something to target.
   std::unique_ptr<PageNodeImpl> page_node =
-      performance_manager()->CreatePageNode(WebContentsProxy(), std::string(),
-                                            GURL(), false, false);
+      PerformanceManagerImpl::CreatePageNode(WebContentsProxy(), std::string(),
+                                             GURL(), false, false);
   base::RunLoop run_loop;
   base::OnceClosure quit_closure = run_loop.QuitClosure();
-  EXPECT_FALSE(performance_manager()->OnPMTaskRunnerForTesting());
+  EXPECT_FALSE(PerformanceManagerImpl::OnPMTaskRunnerForTesting());
   PerformanceManagerImpl::GraphImplCallback graph_callback =
       base::BindLambdaForTesting([&](GraphImpl* graph) {
-        EXPECT_TRUE(
-            PerformanceManagerImpl::GetInstance()->OnPMTaskRunnerForTesting());
+        EXPECT_TRUE(PerformanceManagerImpl::OnPMTaskRunnerForTesting());
         EXPECT_EQ(page_node.get()->graph(), graph);
         std::move(quit_closure).Run();
       });
 
-  performance_manager()->CallOnGraphImpl(FROM_HERE, std::move(graph_callback));
+  PerformanceManagerImpl::CallOnGraphImpl(FROM_HERE, std::move(graph_callback));
   run_loop.Run();
 
-  performance_manager()->DeleteNode(std::move(page_node));
+  PerformanceManagerImpl::DeleteNode(std::move(page_node));
 }
 
 TEST_F(PerformanceManagerImplTest, CallOnGraphAndReplyWithResult) {
   // Create a page node for something to target.
   std::unique_ptr<PageNodeImpl> page_node =
-      performance_manager()->CreatePageNode(WebContentsProxy(), std::string(),
-                                            GURL(), false, false);
+      PerformanceManagerImpl::CreatePageNode(WebContentsProxy(), std::string(),
+                                             GURL(), false, false);
   base::RunLoop run_loop;
 
-  EXPECT_FALSE(performance_manager()->OnPMTaskRunnerForTesting());
+  EXPECT_FALSE(PerformanceManagerImpl::OnPMTaskRunnerForTesting());
   base::OnceCallback<int(GraphImpl*)> task =
       base::BindLambdaForTesting([&](GraphImpl* graph) {
-        EXPECT_TRUE(
-            PerformanceManagerImpl::GetInstance()->OnPMTaskRunnerForTesting());
+        EXPECT_TRUE(PerformanceManagerImpl::OnPMTaskRunnerForTesting());
         EXPECT_EQ(page_node.get()->graph(), graph);
         return 1;
       });
@@ -170,11 +161,11 @@
     std::move(run_loop.QuitClosure()).Run();
   });
 
-  performance_manager()->CallOnGraphAndReplyWithResult(
+  PerformanceManagerImpl::CallOnGraphAndReplyWithResult(
       FROM_HERE, std::move(task), std::move(reply));
   run_loop.Run();
 
-  performance_manager()->DeleteNode(std::move(page_node));
+  PerformanceManagerImpl::DeleteNode(std::move(page_node));
 
   EXPECT_TRUE(reply_called);
 }
diff --git a/components/performance_manager/performance_manager_tab_helper.cc b/components/performance_manager/performance_manager_tab_helper.cc
index 89ac8f3c..1444e91d 100644
--- a/components/performance_manager/performance_manager_tab_helper.cc
+++ b/components/performance_manager/performance_manager_tab_helper.cc
@@ -27,9 +27,8 @@
 
 PerformanceManagerTabHelper::PerformanceManagerTabHelper(
     content::WebContents* web_contents)
-    : content::WebContentsObserver(web_contents),
-      performance_manager_(PerformanceManagerImpl::GetInstance()) {
-  page_node_ = performance_manager_->CreatePageNode(
+    : content::WebContentsObserver(web_contents) {
+  page_node_ = PerformanceManagerImpl::CreatePageNode(
       WebContentsProxy(weak_factory_.GetWeakPtr()),
       web_contents->GetBrowserContext()->UniqueId(),
       web_contents->GetVisibleURL(),
@@ -70,7 +69,7 @@
   frames_.clear();
 
   // Delete the page and its entire frame tree from the graph.
-  performance_manager_->BatchDeleteNodes(std::move(nodes));
+  PerformanceManagerImpl::BatchDeleteNodes(std::move(nodes));
 
   if (destruction_observer_) {
     destruction_observer_->OnPerformanceManagerTabHelperDestroying(
@@ -113,20 +112,22 @@
 
   // Create the frame node, and provide a callback that will run in the graph to
   // initialize it.
-  std::unique_ptr<FrameNodeImpl> frame = performance_manager_->CreateFrameNode(
-      process_node, page_node_.get(), parent_frame_node,
-      render_frame_host->GetFrameTreeNodeId(),
-      render_frame_host->GetRoutingID(),
-      render_frame_host->GetDevToolsFrameToken(),
-      site_instance->GetBrowsingInstanceId(), site_instance->GetId(),
-      base::BindOnce(
-          [](const GURL& url, bool is_current, FrameNodeImpl* frame_node) {
-            if (!url.is_empty())
-              frame_node->OnNavigationCommitted(url, /* same_document */ false);
-            frame_node->SetIsCurrent(is_current);
-          },
-          render_frame_host->GetLastCommittedURL(),
-          render_frame_host->IsCurrent()));
+  std::unique_ptr<FrameNodeImpl> frame =
+      PerformanceManagerImpl::CreateFrameNode(
+          process_node, page_node_.get(), parent_frame_node,
+          render_frame_host->GetFrameTreeNodeId(),
+          render_frame_host->GetRoutingID(),
+          render_frame_host->GetDevToolsFrameToken(),
+          site_instance->GetBrowsingInstanceId(), site_instance->GetId(),
+          base::BindOnce(
+              [](const GURL& url, bool is_current, FrameNodeImpl* frame_node) {
+                if (!url.is_empty())
+                  frame_node->OnNavigationCommitted(url,
+                                                    /* same_document */ false);
+                frame_node->SetIsCurrent(is_current);
+              },
+              render_frame_host->GetLastCommittedURL(),
+              render_frame_host->IsCurrent()));
 
   frames_[render_frame_host] = std::move(frame);
 }
@@ -151,7 +152,7 @@
     observer.OnBeforeFrameNodeRemoved(this, frame_node.get());
 
   // Then delete the node.
-  performance_manager_->DeleteNode(std::move(frame_node));
+  PerformanceManagerImpl::DeleteNode(std::move(frame_node));
   frames_.erase(it);
 }
 
diff --git a/components/performance_manager/performance_manager_tab_helper.h b/components/performance_manager/performance_manager_tab_helper.h
index ea4cae2..c968dca 100644
--- a/components/performance_manager/performance_manager_tab_helper.h
+++ b/components/performance_manager/performance_manager_tab_helper.h
@@ -24,7 +24,6 @@
 
 class FrameNodeImpl;
 class PageNodeImpl;
-class PerformanceManagerImpl;
 
 // This tab helper maintains a page node, and its associated tree of frame nodes
 // in the performance manager graph. It also sources a smattering of attributes
@@ -119,8 +118,6 @@
 
   void OnMainFrameNavigation(int64_t navigation_id);
 
-  // The performance manager for this process, if any.
-  PerformanceManagerImpl* const performance_manager_;
   std::unique_ptr<PageNodeImpl> page_node_;
   ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId;
 
diff --git a/components/performance_manager/performance_manager_tab_helper_unittest.cc b/components/performance_manager/performance_manager_tab_helper_unittest.cc
index 587ca3f5..e755836 100644
--- a/components/performance_manager/performance_manager_tab_helper_unittest.cc
+++ b/components/performance_manager/performance_manager_tab_helper_unittest.cc
@@ -5,6 +5,7 @@
 #include "components/performance_manager/performance_manager_tab_helper.h"
 
 #include <set>
+#include <utility>
 
 #include "base/run_loop.h"
 #include "base/stl_util.h"
@@ -63,7 +64,7 @@
 void CallOnGraphSync(PerformanceManagerImpl::GraphImplCallback callback) {
   base::RunLoop run_loop;
 
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE,
       base::BindLambdaForTesting([&run_loop, &callback](GraphImpl* graph) {
         std::move(callback).Run(graph);
@@ -191,7 +192,7 @@
 
   size_t num_hosts = CountAllRenderProcessHosts();
 
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE, base::BindLambdaForTesting([num_hosts](GraphImpl* graph) {
         EXPECT_GE(num_hosts, graph->GetAllProcessNodeImpls().size());
         EXPECT_EQ(0u, graph->GetAllFrameNodeImpls().size());
diff --git a/components/performance_manager/render_process_user_data.cc b/components/performance_manager/render_process_user_data.cc
index 88dafa9..1df2aee 100644
--- a/components/performance_manager/render_process_user_data.cc
+++ b/components/performance_manager/render_process_user_data.cc
@@ -30,12 +30,12 @@
     content::RenderProcessHost* render_process_host)
     : host_(render_process_host) {
   host_->AddObserver(this);
-  process_node_ = PerformanceManagerImpl::GetInstance()->CreateProcessNode(
+  process_node_ = PerformanceManagerImpl::CreateProcessNode(
       RenderProcessHostProxy(host_->GetID()));
 }
 
 RenderProcessUserData::~RenderProcessUserData() {
-  PerformanceManagerImpl::GetInstance()->DeleteNode(std::move(process_node_));
+  PerformanceManagerImpl::DeleteNode(std::move(process_node_));
   host_->RemoveObserver(this);
 
   if (destruction_observer_) {
diff --git a/components/performance_manager/web_contents_proxy_unittest.cc b/components/performance_manager/web_contents_proxy_unittest.cc
index 038e9017..c0969a2 100644
--- a/components/performance_manager/web_contents_proxy_unittest.cc
+++ b/components/performance_manager/web_contents_proxy_unittest.cc
@@ -4,6 +4,9 @@
 
 #include "components/performance_manager/public/web_contents_proxy.h"
 
+#include <memory>
+#include <utility>
+
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
@@ -48,7 +51,7 @@
   // would happen with a policy message being posted from the graph.
   {
     base::RunLoop run_loop;
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting(
             [&deref_proxy, page_node,
@@ -67,7 +70,7 @@
   // dereferencing the proxy.
   {
     base::RunLoop run_loop;
-    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+    PerformanceManagerImpl::CallOnGraphImpl(
         FROM_HERE,
         base::BindLambdaForTesting([&contents, &deref_proxy, page_node,
                                     quit_loop = run_loop.QuitClosure()](
diff --git a/components/performance_manager/worker_watcher.cc b/components/performance_manager/worker_watcher.cc
index bbcc2d0..2b19c5e 100644
--- a/components/performance_manager/worker_watcher.cc
+++ b/components/performance_manager/worker_watcher.cc
@@ -112,7 +112,7 @@
     nodes.push_back(std::move(node.second));
   shared_worker_nodes_.clear();
 
-  PerformanceManagerImpl::GetInstance()->BatchDeleteNodes(std::move(nodes));
+  PerformanceManagerImpl::BatchDeleteNodes(std::move(nodes));
 
   dedicated_worker_service_observer_.RemoveAll();
   shared_worker_service_observer_.RemoveAll();
@@ -124,7 +124,7 @@
     content::GlobalFrameRoutingId ancestor_render_frame_host_id) {
   // TODO(https://crbug.com/993029): Plumb through the URL and the DevTools
   // token.
-  auto worker_node = PerformanceManagerImpl::GetInstance()->CreateWorkerNode(
+  auto worker_node = PerformanceManagerImpl::CreateWorkerNode(
       browser_context_id_, WorkerNode::WorkerType::kDedicated,
       process_node_source_->GetProcessNode(worker_process_id),
       base::UnguessableToken::Create());
@@ -147,7 +147,7 @@
 #if DCHECK_IS_ON()
   DCHECK(!base::Contains(clients_to_remove_, worker_node.get()));
 #endif  // DCHECK_IS_ON()
-  PerformanceManagerImpl::GetInstance()->DeleteNode(std::move(worker_node));
+  PerformanceManagerImpl::DeleteNode(std::move(worker_node));
 
   dedicated_worker_nodes_.erase(it);
 }
@@ -162,7 +162,7 @@
     content::SharedWorkerId shared_worker_id,
     int worker_process_id,
     const base::UnguessableToken& dev_tools_token) {
-  auto worker_node = PerformanceManagerImpl::GetInstance()->CreateWorkerNode(
+  auto worker_node = PerformanceManagerImpl::CreateWorkerNode(
       browser_context_id_, WorkerNode::WorkerType::kShared,
       process_node_source_->GetProcessNode(worker_process_id), dev_tools_token);
   bool inserted =
@@ -180,7 +180,7 @@
 #if DCHECK_IS_ON()
   DCHECK(!base::Contains(clients_to_remove_, worker_node.get()));
 #endif  // DCHECK_IS_ON()
-  PerformanceManagerImpl::GetInstance()->DeleteNode(std::move(worker_node));
+  PerformanceManagerImpl::DeleteNode(std::move(worker_node));
 
   shared_worker_nodes_.erase(it);
 }
diff --git a/components/performance_manager/worker_watcher_unittest.cc b/components/performance_manager/worker_watcher_unittest.cc
index a61452e..681570bf 100644
--- a/components/performance_manager/worker_watcher_unittest.cc
+++ b/components/performance_manager/worker_watcher_unittest.cc
@@ -308,7 +308,7 @@
     std::unique_ptr<ProcessNodeImpl> process_node = std::move(kv.second);
     nodes.push_back(std::move(process_node));
   }
-  PerformanceManagerImpl::GetInstance()->BatchDeleteNodes(std::move(nodes));
+  PerformanceManagerImpl::BatchDeleteNodes(std::move(nodes));
   process_node_map_.clear();
 }
 
@@ -323,8 +323,8 @@
   int render_process_id = GenerateNextId();
 
   // Create the process node and insert it into the map.
-  auto process_node = PerformanceManagerImpl::GetInstance()->CreateProcessNode(
-      RenderProcessHostProxy());
+  auto process_node =
+      PerformanceManagerImpl::CreateProcessNode(RenderProcessHostProxy());
   bool inserted =
       process_node_map_.insert({render_process_id, std::move(process_node)})
           .second;
@@ -376,12 +376,11 @@
 };
 
 TestFrameNodeSource::TestFrameNodeSource()
-    : page_node_(PerformanceManagerImpl::GetInstance()->CreatePageNode(
-          WebContentsProxy(),
-          "page_node_context_id",
-          GURL(),
-          false,
-          false)) {}
+    : page_node_(PerformanceManagerImpl::CreatePageNode(WebContentsProxy(),
+                                                        "page_node_context_id",
+                                                        GURL(),
+                                                        false,
+                                                        false)) {}
 
 TestFrameNodeSource::~TestFrameNodeSource() {
   std::vector<std::unique_ptr<NodeBase>> nodes;
@@ -389,7 +388,7 @@
   nodes.reserve(frame_node_map_.size());
   for (auto& kv : frame_node_map_)
     nodes.push_back(std::move(kv.second));
-  PerformanceManagerImpl::GetInstance()->BatchDeleteNodes(std::move(nodes));
+  PerformanceManagerImpl::BatchDeleteNodes(std::move(nodes));
   frame_node_map_.clear();
 }
 
@@ -427,7 +426,7 @@
   int frame_id = GenerateNextId();
   content::GlobalFrameRoutingId render_frame_host_id(render_process_id,
                                                      frame_id);
-  auto frame_node = PerformanceManagerImpl::GetInstance()->CreateFrameNode(
+  auto frame_node = PerformanceManagerImpl::CreateFrameNode(
       process_node, page_node_.get(), nullptr, 0, frame_id,
       base::UnguessableToken::Null(), 0, 0);
 
@@ -448,7 +447,7 @@
 
   // Notify the subscriber then delete the node.
   InvokeAndRemoveCallback(frame_node);
-  PerformanceManagerImpl::GetInstance()->DeleteNode(std::move(it->second));
+  PerformanceManagerImpl::DeleteNode(std::move(it->second));
 
   frame_node_map_.erase(it);
 }
@@ -482,10 +481,6 @@
       content::DedicatedWorkerId dedicated_worker_id);
   WorkerNodeImpl* GetSharedWorkerNode(content::SharedWorkerId shared_worker_id);
 
-  PerformanceManagerImpl* performance_manager() {
-    return performance_manager_.get();
-  }
-
   TestDedicatedWorkerService* dedicated_worker_service() {
     return &dedicated_worker_service_;
   }
@@ -546,7 +541,7 @@
 void WorkerWatcherTest::CallOnGraphAndWait(
     PerformanceManagerImpl::GraphImplCallback graph_callback) {
   base::RunLoop run_loop;
-  performance_manager_->CallOnGraphImpl(
+  PerformanceManagerImpl::CallOnGraphImpl(
       FROM_HERE,
       base::BindLambdaForTesting(
           [graph_callback = std::move(graph_callback),
diff --git a/components/permissions/permissions_client.h b/components/permissions/permissions_client.h
index 4eec9d25..8d6a6ae 100644
--- a/components/permissions/permissions_client.h
+++ b/components/permissions/permissions_client.h
@@ -35,6 +35,7 @@
 namespace permissions {
 class NotificationPermissionUiSelector;
 class PermissionDecisionAutoBlocker;
+class PermissionManager;
 class PermissionPromptAndroid;
 
 // Interface to be implemented by permissions embedder to access embedder
@@ -60,6 +61,11 @@
   virtual PermissionDecisionAutoBlocker* GetPermissionDecisionAutoBlocker(
       content::BrowserContext* browser_context) = 0;
 
+  // Retrieves the PermissionManager for this context. The returned
+  // pointer has the same lifetime as |browser_context|.
+  virtual PermissionManager* GetPermissionManager(
+      content::BrowserContext* browser_context) = 0;
+
   // Gets the embedder defined engagement score for this |origin|.
   virtual double GetSiteEngagementScore(
       content::BrowserContext* browser_context,
diff --git a/components/permissions/test/test_permissions_client.cc b/components/permissions/test/test_permissions_client.cc
index c90c892..82490e3 100644
--- a/components/permissions/test/test_permissions_client.cc
+++ b/components/permissions/test/test_permissions_client.cc
@@ -37,6 +37,11 @@
   return &autoblocker_;
 }
 
+PermissionManager* TestPermissionsClient::GetPermissionManager(
+    content::BrowserContext* browser_context) {
+  return nullptr;
+}
+
 void TestPermissionsClient::GetUkmSourceId(
     content::BrowserContext* browser_context,
     const content::WebContents* web_contents,
diff --git a/components/permissions/test/test_permissions_client.h b/components/permissions/test/test_permissions_client.h
index bff2260..ff31794 100644
--- a/components/permissions/test/test_permissions_client.h
+++ b/components/permissions/test/test_permissions_client.h
@@ -23,6 +23,8 @@
       content::BrowserContext* browser_context) override;
   PermissionDecisionAutoBlocker* GetPermissionDecisionAutoBlocker(
       content::BrowserContext* browser_context) override;
+  PermissionManager* GetPermissionManager(
+      content::BrowserContext* browser_context) override;
   void GetUkmSourceId(content::BrowserContext* browser_context,
                       const content::WebContents* web_contents,
                       const GURL& requesting_origin,
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 8527f68..69281232 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -1214,6 +1214,11 @@
       Falls die Richtlinie nicht konfiguriert ist, kommt die Standardeinstellung zum Einsatz, bei der die Funktion von verwalteten Nutzern nicht verwendet und von nicht verwalteten Nutzern verwendet werden kann.</translation>
 <translation id="2660846099862559570">Nie Proxy verwenden</translation>
 <translation id="2665422249821137126">Großen Cursor auf der Anmeldeseite aktivieren</translation>
+<translation id="266882888912227087"> Steuert die Benachrichtigung zum automatischen Start der verwalteten Gastsitzung unter <ph name="PRODUCT_OS_NAME" />.
+
+      Ist die Richtlinie auf "true" gesetzt, wird die Benachrichtigung mit der Datenschutzwarnung nach einigen Sekunden geschlossen.
+
+      Ist die Richtlinie auf "false" gesetzt oder nicht konfiguriert, bleibt die Benachrichtigung mit der Datenschutzwarnung angepinnt, bis der Nutzer sie schließt.</translation>
 <translation id="2672012807430078509">Steuerung, durch die NTLM als Authentifizierungsprotokoll für SMB-Bereitstellungen aktiviert wird</translation>
 <translation id="267596348720209223">Gibt die vom Suchanbieter unterstützten Zeichencodierungen an. Codierungen sind Codepage-Namen wie UTF-8, GB2312 und ISO-8859-1. Sie werden in der Reihenfolge durchprobiert, in der sie angegeben werden. Diese Richtlinie ist optional. Ist sie nicht konfiguriert, so kommt der Standardwert UTF-8 zum Einsatz. Diese Richtlinie wird nur umgesetzt, wenn die Richtlinie "DefaultSearchProviderEnabled" aktiviert ist.</translation>
 <translation id="2678503605767349615">Erforderliche geräteübergreifende Clientzertifikate</translation>
@@ -3045,6 +3050,16 @@
 <translation id="5475361623548884387">Drucken aktivieren</translation>
 <translation id="547601067149622666">Werbung auf Websites mit aufdringlichen Werbeanzeigen nicht zulassen</translation>
 <translation id="5483065054530244863">SHA-1-signierte Zertifikate zulassen, die von lokalen Vertrauensankern ausgestellt werden</translation>
+<translation id="5486493714323160905">Wenn diese Einstellung aktiviert ist, verifiziert <ph name="PRODUCT_NAME" /> Serverzertifikate anhand der integrierten Zertifikatsprüfung.
+      Ist sie deaktiviert, verifiziert <ph name="PRODUCT_NAME" /> Serverzertifikate mit der von der Plattform stammenden Legacy-Zertifikatsprüfung.
+      Wenn diese Einstellung nicht konfiguriert ist, wird die integrierte oder die Legacy-Zertifikatsprüfung verwendet.
+
+      Diese Richtlinie wird voraussichtlich in Version 81 von <ph name="PRODUCT_OS_NAME" /> entfernt, wenn auch die Legacy-Zertifikatsprüfung in <ph name="PRODUCT_OS_NAME" /> voraussichtlich nicht mehr unterstützt wird.
+
+      Außerdem wird sie voraussichtlich in Version 83 von <ph name="PRODUCT_NAME" /> für Linux entfernt, wenn auch die Legacy-Zertifikatsprüfung unter Linux voraussichtlich nicht mehr unterstützt wird.
+
+      Voraussichtlich wird sie auch in Version 87 von <ph name="PRODUCT_NAME" /> für Mac OS X entfernt, wenn auch die Legacy-Zertifikatsprüfung unter Mac OS X voraussichtlich nicht mehr unterstützt wird.
+      </translation>
 <translation id="5498045818698736356">Hierdurch wird eine Liste von Web-Apps festgelegt, die automatisch installiert werden, also ohne Interaktion des Nutzers, und die vom Nutzer weder deinstalliert noch deaktiviert werden können.
 
       Jedes Listenelement der Richtlinie ist ein Objekt, das aus der obligatorischen Komponente "url" und den beiden optionalen Komponenten "default_launch_container" und "create_desktop_shortcut" besteht. Unter "url" wird die URL der Web-App angegeben, die installiert werden soll. "launch_container" sollte entweder "window" oder "tab" sein, um festzulegen, wie die Web-App nach der Installation geöffnet wird. Wenn unter Linux und Windows eine Desktopverknüpfung erstellt werden soll, setzen Sie "create_desktop_shortcut" auf "true". Wenn "default_launch_container" weggelassen wird, wird die App standardmäßig in einem Tab geöffnet. Unabhängig vom Wert von "default_launch_container" können Nutzer ändern, in welchem Container die App geöffnet wird. Wird "create_desktop_shortcut" weggelassen, werden keine Desktopverknüpfungen erstellt. In der Richtlinie "<ph name="PINNED_LAUNCHER_APPS_POLICY_NAME" />" wird beschrieben, wie Sie Apps an die Chrome OS-Ablage pinnen können.</translation>
@@ -3261,6 +3276,7 @@
 
           Wenn diese Einstellung nicht festgelegt ist, verwendet <ph name="PRODUCT_NAME" /> einen Standardnamen für die Bibliothek.</translation>
 <translation id="5783009211970309878">Kopf- und Fußzeilen drucken</translation>
+<translation id="5790763087505467169">Benachrichtigungen zum automatischen Start bei verwalteten Gastsitzungen reduzieren</translation>
 <translation id="5806128552675651249">Drucken nur ohne Hintergrundgrafiken zulassen</translation>
 <translation id="5809210507920527553">Legt die Einstellungen für den Linux-Container (Crostini) fest.</translation>
 <translation id="5809728392451418079">Anzeigename für lokale Gerätekonten festlegen</translation>
@@ -3740,6 +3756,9 @@
 <translation id="6689792153960219308">Hardwarestatus senden</translation>
 <translation id="6698632841807204978">Schwarz-Weiß-Druck aktivieren</translation>
 <translation id="6699880231565102694">Zwei-Faktor-Authentifizierung für Remotezugriff-Hosts aktivieren</translation>
+<translation id="6704515759227307131">Diese Richtlinie ist veraltet und wurde durch "AdvancedProtectionAllowed" ersetzt.
+
+      Mit dieser Richtlinie wird festgelegt, ob Nutzer, die am erweiterten Sicherheitsprogramm teilnehmen, ihre heruntergeladenen Dateien für einen Malware-Scan an Google senden können. Wird die Richtlinie auf "true" gesetzt oder nicht konfiguriert, werden Nutzer dazu aufgefordert, ihre heruntergeladenen Dateien für einen Tiefenscan an Google zu senden. Wenn der Nutzer die Option zum Scannen auswählt, wird der Download an Google gesendet. Wird diese Richtlinie auf "false" gesetzt, werden Nutzer nicht dazu aufgefordert, ihre heruntergeladenen Dateien an Google zu senden.</translation>
 <translation id="670597451099978576">Websites automatisch die Berechtigung erteilen, eine Verbindung zu USB-Geräten mit der angegebenen Anbieter-ID und Produkt-ID auf dem Anmeldebildschirm herzustellen.</translation>
 <translation id="6720080634516505446"><ph name="PRODUCT_NAME" /> bietet eine sichere Aktualisierung und Installation von Erweiterungen. Der Inhalt einiger Erweiterungen wird jedoch außerhalb des Chrome Web Store gehostet und kann nur durch unsichere Signatur- oder Hash-Algorithmen wie SHA1 geschützt werden. Wenn diese Richtlinie deaktiviert ist, wird eine Neuinstallation und Aktualisierung solcher Erweiterungen von Chrome nicht erlaubt (bis die Entwickler der Erweiterung diese mit stärkeren Algorithmen neu erstellen). Wenn diese Richtlinie aktiviert ist, ist die Installation und Aktualisierung solcher Erweiterungen zulässig.
 
@@ -3763,6 +3782,7 @@
       Mit dieser Einstellung wird die Einblendung von Begrüßungsseiten konfiguriert, die Nutzern bei der Anmeldung in <ph name="PRODUCT_NAME" /> helfen, auf denen der Browser als Standardbrowser eingerichtet werden kann oder über die Nutzer über Produktfunktionen informiert werden.</translation>
 <translation id="6766216162565713893">Websites dürfen den Nutzer um Zugriff auf ein Bluetooth-Gerät in der Nähe bitten</translation>
 <translation id="6770454900105963262">Informationen zu aktiven Kiosksitzungen senden</translation>
+<translation id="6772045451150098845">Mit dieser Richtlinie wird festgelegt, ob Nutzer, die am erweiterten Sicherheitsprogramm teilnehmen, zusätzliche Funktionen verwenden können. Bei manchen dieser Funktionen werden Daten mit Google geteilt. Nutzer, die die erweiterte Sicherheit verwenden, können beispielsweise ihre heruntergeladenen Dateien für einen Malware-Scan an Google senden. Wird die Richtlinie auf "true" gesetzt oder nicht konfiguriert, können diese Nutzer zusätzliche Funktionen verwenden. Wird die Richtlinie auf "false" gesetzt, stehen ihnen nur die Standardfunktionen für Privatnutzer zur Verfügung.</translation>
 <translation id="6780908086869332493">Ermöglicht Ihnen die Zusammenstellung einer Liste mit URL-Mustern, die Websites angeben, für die auf dem Anmeldebildschirm im Frame, der die SAML-Abfolge hostet, automatisch ein Clientzertifikat ausgewählt wird, wenn die Website ein Zertifikat anfordert. Zum Beispiel kann damit ein geräteübergreifendes Zertifikat konfiguriert werden, das dem SAML-IdP präsentiert wird.
 
       Der Wert muss ein Array von String-JSON-Wörterbüchern sein. Jedes Wörterbuch muss das Format <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" /> haben, wobei <ph name="URL_PATTERN_PLACEHOLDER" /> ein Muster zur Festlegung der Inhalte ist. <ph name="FILTER_PLACEHOLDER" /> schränkt ein, aus welchen Clientzertifikaten der Browser automatisch auswählt. Unabhängig vom Filter werden nur Zertifikate ausgewählt, die mit der Zertifikatanforderung des Servers übereinstimmen. Wenn <ph name="FILTER_PLACEHOLDER" /> das Format <ph name="JSON_DICTIONARY_EXAMPLE" /> hat, werden außerdem nur Clientzertifikate ausgewählt, die über ein Zertifikat mit dem CommonName <ph name="ISSUER_CN_PLACEHOLDER" /> ausgestellt werden. Wenn <ph name="FILTER_PLACEHOLDER" /> das leere Wörterbuch {} ist, wird die Auswahl der Clientzertifikate nicht zusätzlich eingeschränkt.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 5d0d4fb..7f240df 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -72,9 +72,9 @@
 
       Si se establece <ph name="VARIATIONS_ENABLED_OPTION_NAME" /> (valor 0) o no se establece la política, podrán aplicarse todas las variaciones en <ph name="PRODUCT_OS_NAME" />.
 
-      Si se establece <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (valor 1), se permitirá solo la aplicación de las variaciones que se consideren correcciones de estabilidad o seguridad críticas en <ph name="PRODUCT_OS_NAME" />.
+      Si se establece <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (valor 1), solo se permitirá que se apliquen a <ph name="PRODUCT_OS_NAME" /> las variaciones que se consideren correcciones críticas de estabilidad o seguridad.
 
-      Si se establece <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> (valor 2), no podrá aplicarse ninguna variación en el navegador para la pantalla de acceso. Ten en cuenta que no se recomienda este modo porque podría impedir que los desarrolladores de <ph name="PRODUCT_OS_NAME" /> proporcionen correcciones de seguridad críticas de manera oportuna.</translation>
+      Si se establece <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> (valor 2), no podrá aplicarse ninguna variación en el navegador para la pantalla de acceso. Ten en cuenta que no se recomienda este modo porque podría impedir que los desarrolladores de <ph name="PRODUCT_OS_NAME" /> proporcionen correcciones críticas de seguridad de manera oportuna.</translation>
 <translation id="1078643757670228170">Ten en cuenta que esta política es obsoleta y se eliminará en la versión 82 de <ph name="PRODUCT_OS_NAME" />. En su lugar, utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Especifica el período sin intervención del usuario después del cual se apagará la pantalla cuando el dispositivo esté funcionando con CA.
@@ -1204,11 +1204,11 @@
       Si no se establece esta política, los usuarios administrados no podrán usar la configuración predeterminada, pero los usuarios no administrados sí podrán usarla.</translation>
 <translation id="2660846099862559570">Nunca usar un proxy</translation>
 <translation id="2665422249821137126">Habilita el cursor grande en la pantalla de acceso</translation>
-<translation id="266882888912227087"> Controla las notificaciones de lanzamiento automático de la sesión de invitado administrada en <ph name="PRODUCT_OS_NAME" />.
+<translation id="266882888912227087"> Controla las notificaciones de inicio automático de la sesión de invitado administrada en <ph name="PRODUCT_OS_NAME" />.
 
       Si se establece esta política como verdadera, se cerrará la notificación de advertencia de privacidad después de unos segundos.
 
-      Si se establece la política como falsa o no se establece, se fijará la notificación de advertencia de privacidad hasta que el usuario la descarte.</translation>
+      Si se establece esta política como falsa o no se establece, se fijará la notificación de advertencia de privacidad hasta que el usuario la descarte.</translation>
 <translation id="2672012807430078509">Controlar el uso de NTLM como protocolo de autenticación para las activaciones de archivos compartidos SMB</translation>
 <translation id="267596348720209223">Especifica la codificación de caracteres admitida por el proveedor de búsqueda. Las codificaciones son nombres de páginas de códigos, como UTF-8, GB2312 e ISO-8859-1. Se prueban en el orden dado. Esta política es opcional. Si no se configura, se usará el valor predeterminado, que es UTF-8. Esta política solo se respeta si la política "DefaultSearchProviderEnabled" está habilitada.</translation>
 <translation id="2678503605767349615">Certificados de cliente obligatorios en todo el dispositivo</translation>
@@ -3040,7 +3040,7 @@
 <translation id="5483065054530244863">Permitir los certificados firmados con SHA-1 y emitidos por los anclajes de confianza locales</translation>
 <translation id="5486493714323160905">Si se habilita esta configuración, <ph name="PRODUCT_NAME" /> verificará los certificados de servidores mediante el verificador de certificados integrado.
       Si se inhabilita, <ph name="PRODUCT_NAME" /> verificará los certificados de servidores mediante el verificador de certificados heredado que incluye la plataforma.
-      Si no se establece, es posible que se utilice el verificador de certificados integrado o el heredado.
+      Si no se establece, podrán utilizarse el verificador de certificados integrado o el heredado.
 
       Se planea quitar esta política en la versión <ph name="PRODUCT_OS_NAME" /> 81, cuando se quite la compatibilidad con el verificador de certificados heredado de <ph name="PRODUCT_OS_NAME" />.
 
@@ -3269,7 +3269,7 @@
 
           Si no se ofrece ninguna configuración, <ph name="PRODUCT_NAME" /> recurrirá a un nombre de biblioteca predeterminado.</translation>
 <translation id="5783009211970309878">Imprimir encabezados y pies de página</translation>
-<translation id="5790763087505467169">Reducir las notificaciones de lanzamiento automático de la sesión de invitado administrada</translation>
+<translation id="5790763087505467169">Reducir la cantidad de notificaciones de inicio automático de la sesión de invitado administrada</translation>
 <translation id="5806128552675651249">Habilitar la impresión solo sin los gráficos de fondo</translation>
 <translation id="5809210507920527553">Controla la configuración para el contenedor de Linux (Crostini).</translation>
 <translation id="5809728392451418079">Establecer el nombre para mostrar de las cuentas locales del dispositivo</translation>
@@ -3765,7 +3765,7 @@
 <translation id="6699880231565102694">Habilitar autenticación de dos factores para los hosts de acceso remoto.</translation>
 <translation id="6704515759227307131">Esta política es obsoleta y se reemplazó por AdvancedProtectionAllowed.
 
-      Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada pueden enviar sus descargas a Google para comprobar que no incluyan software malicioso. Si se establece como verdadera o no se establece, se les pedirá a los usuarios inscritos que envíen sus archivos a Google para analizarlos en profundidad. Si el usuario selecciona "Analizar", se enviará la descarga a Google. Si se establece como falsa, no se les pedirá a los usuarios que realicen ninguna acción y no se enviarán sus descargas a Google.</translation>
+      Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada pueden enviar sus descargas a Google para comprobar que no incluyan software malicioso. Si se establece como verdadera o no se establece, se les pedirá a los usuarios inscritos que envíen sus archivos a Google para un análisis en profundidad. Si el usuario selecciona "Analizar", se enviará la descarga a Google. Si se establece como falsa, no se les pedirá a los usuarios que realicen ninguna acción y no se enviarán sus descargas a Google.</translation>
 <translation id="670597451099978576">Otorga permiso automáticamente a estos sitios para conectarse a dispositivos USB con los ID de producto y proveedor correspondientes en la pantalla de acceso</translation>
 <translation id="6720080634516505446"><ph name="PRODUCT_NAME" /> garantiza que la instalación y actualización de extensiones sean seguras. Sin embargo, es posible que el contenido de algunas extensiones alojadas fuera de Chrome Web Store solo cuente con la protección de algoritmos de hash y acceso no seguros, como SHA1. Si se inhabilita esta política, Chrome no permitirá la instalación ni la actualización de esas extensiones (hasta que los desarrolladores vuelvan a diseñar la extensión con algoritmos más seguros). Si se habilita, Chrome permitirá la instalación y actualización de las extensiones.
 
@@ -3789,7 +3789,7 @@
       Esta configuración controla la presentación de las páginas de bienvenida que permiten a los usuarios acceder a <ph name="PRODUCT_NAME" />, elegirlo como navegador predeterminado o recibir información sobre funciones de productos.</translation>
 <translation id="6766216162565713893">Permitir que los sitios soliciten permiso al usuario para acceder a un dispositivo Bluetooth cercano</translation>
 <translation id="6770454900105963262">Informar datos sobre las sesiones de kiosco activas</translation>
-<translation id="6772045451150098845">Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada reciben funciones adicionales. Es posible que algunas de estas funciones contemplen el uso compartido de datos con Google (por ejemplo, los usuarios de la Protección avanzada podrán enviar sus descargas a Google para comprobar que no incluyan software malicioso). Si se establece como verdadera o no se establece, los usuarios inscritos recibirán funciones adicionales. Si se establece como falsa, los usuarios de la Protección avanzada solo recibirán las funciones estándar del usuario.</translation>
+<translation id="6772045451150098845">Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada reciben funciones adicionales. Es posible que algunas de estas funciones contemplen el uso compartido de datos con Google (por ejemplo, los usuarios de la Protección avanzada podrán enviar sus descargas a Google para comprobar que no incluyan software malicioso). Si se establece como verdadera o no se establece, los usuarios inscritos recibirán funciones adicionales. Si se establece como falsa, los usuarios de la Protección avanzada solo recibirán las funciones estándar para el consumidor.</translation>
 <translation id="6780908086869332493">Te permite definir una lista de los patrones URL que especifican sitios para los que se selecciona automáticamente un certificado de cliente en la pantalla de acceso, en el marco que aloja el flujo de SAML (si el sitio lo solicita). Por ejemplo, se puede configurar un certificado en todo el dispositivo para presentarlo en el IdP de SAML.
 
       El valor debe ser un conjunto de diccionarios en formato JSON con strings. Cada diccionario debe tener el formato <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, en donde <ph name="URL_PATTERN_PLACEHOLDER" /> es un patrón de configuración de contenido. <ph name="FILTER_PLACEHOLDER" /> restringe los certificados de cliente que el navegador seleccionará automáticamente. Más allá del filtro, solo se seleccionarán los certificados que cumplan con la solicitud de certificado del servidor. Si <ph name="FILTER_PLACEHOLDER" /> tiene el formato <ph name="JSON_DICTIONARY_EXAMPLE" />, solo se seleccionarán de forma adicional los certificados de cliente emitidos por un certificado con el nombre común <ph name="ISSUER_CN_PLACEHOLDER" />. Si <ph name="FILTER_PLACEHOLDER" /> es el diccionario vacío {}, no se aplicarán más restricciones a la selección de certificados de cliente.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 242dd9c..d0c0af1 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -67,11 +67,11 @@
       Si se le asigna el valor "true", se enviará la información sobre la retroiluminación del dispositivo.</translation>
 <translation id="1076271193420500757">Configura esta política para especificar qué variaciones pueden aplicarse a un dispositivo <ph name="PRODUCT_OS_NAME" /> gestionado por una empresa.
 
-      Las variaciones proporcionan un medio para ofrecer modificaciones a <ph name="PRODUCT_OS_NAME" /> sin enviar una nueva versión, ya que permiten habilitar o inhabilitar de forma selectiva las funciones existentes.
+      Con las variaciones puede modificarse <ph name="PRODUCT_OS_NAME" /> sin enviar una nueva versión, ya que permiten habilitar o inhabilitar de forma selectiva las funciones existentes.
 
       Si se establece la opción <ph name="VARIATIONS_ENABLED_OPTION_NAME" /> (valor 0) o no se le asigna ningún valor a la política, se permitirá que se apliquen todas las variaciones a <ph name="PRODUCT_OS_NAME" />.
 
-      Si se establece la opción <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (valor 1), solo se permitirá que se apliquen a <ph name="PRODUCT_OS_NAME" /> las variaciones que se consideren correcciones críticas de seguridad o de estabilidad.
+      Si se establece la opción <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (valor 1), solo se permitirá que se apliquen las variaciones que se consideren correcciones críticas de seguridad o de estabilidad a <ph name="PRODUCT_OS_NAME" />.
 
       Si se establece la opción <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> (valor 2), no se permitirá aplicar ninguna variación al navegador en la pantalla de inicio de sesión. Ten en cuenta que este modo puede evitar que los desarrolladores de <ph name="PRODUCT_OS_NAME" /> proporcionen correcciones críticas de seguridad a su debido tiempo y, por lo tanto, no se recomienda su uso.</translation>
 <translation id="1078643757670228170">Ten en cuenta que esta política está obsoleta y se eliminará de la versión 82 de <ph name="PRODUCT_OS_NAME" />. Utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> en su lugar.
@@ -3007,7 +3007,7 @@
           Si se establece el valor "true" o no se configura la política, el usuario podrá crear y administrar usuarios supervisados.</translation>
 <translation id="5369937289900051171">Solo impresión en color</translation>
 <translation id="5370279767682621504">Habilitar la compatibilidad con HTTP/0.9 en puertos no utilizados de forma predeterminada</translation>
-<translation id="5373065931879562543">Determinar la disponibilidad de variaciones en ChromeOS</translation>
+<translation id="5373065931879562543">Determinar la disponibilidad de variaciones en Chrome OS</translation>
 <translation id="5378985487213287085">Permite establecer si los sitios web pueden mostrar notificaciones de escritorio. Se puede permitir o denegar que se muestren notificaciones de escritorio de forma predeterminada o se puede establecer que los sitios web pidan permiso al usuario cada vez que quieran mostrar notificaciones de escritorio.
 
           Si no se establece esta política, se usará la política AskNotifications y el usuario podrá modificarla.</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 48274933..ad77c57 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -75,7 +75,7 @@
 
       Si vous définissez <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> sur "1", seules les variantes considérées comme des correctifs essentiels de sécurité ou de stabilité peuvent être appliquées à <ph name="PRODUCT_OS_NAME" />.
 
-      Si vous définissez <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> sur "2", aucune variante ne peut être appliquée au navigateur sur l'écran de connexion. Veuillez noter que ce mode n'est pas recommandé, car il est susceptible d'empêcher les développeurs de <ph name="PRODUCT_OS_NAME" /> de fournir des correctifs essentiels de sécurité en temps voulu.</translation>
+      Si vous définissez <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> sur "2", aucune variante ne peut être appliquée au navigateur sur l'écran de connexion. Veuillez noter que ce mode n'est pas recommandé, car il est susceptible d'empêcher les développeurs <ph name="PRODUCT_OS_NAME" /> de fournir des correctifs essentiels de sécurité en temps voulu.</translation>
 <translation id="1078643757670228170">Cette règle étant obsolète, elle sera supprimée dans la version 82 de <ph name="PRODUCT_OS_NAME" />. (Veuillez utiliser la règle <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.)
 
           Elle permet de spécifier le délai d'inactivité de l'utilisateur au terme duquel l'écran est éteint (lorsque l'appareil fonctionne sur secteur).
@@ -343,7 +343,7 @@
 
       Si la règle n'est pas définie, la valeur par défaut "MultiProfileUserBehaviorMustBePrimary'' s'applique aux utilisateurs gérés par l'entreprise et la valeur "MultiProfileUserBehaviorUnrestricted" est utilisée pour les utilisateurs non gérés.</translation>
 <translation id="1465619815762735808">Cliquer pour lire</translation>
-<translation id="1467633031685836974">Cette fonctionnalité autorise les liens hypertexte et les navigations d'URL depuis la barre d'adresse à cibler un fragment de texte spécifique dans une page Web de sorte que, une fois chargée, la page défile jusqu'à ce fragment de texte.
+<translation id="1467633031685836974">Cette fonctionnalité permet aux URL de pointer directement vers un fragment de texte spécifique dans une page Web de sorte que, une fois chargée, la page défile jusqu'à ce fragment de texte.
 
 Si vous activez cette règle ou ne la configurez pas, le défilement des pages Web vers des fragments de texte spécifiques via URL sera activé.
 
@@ -3005,7 +3005,7 @@
           Si elle est associée à la valeur "true" ou si elle n'est pas configurée, cet utilisateur peut créer et gérer des comptes utilisateur supervisés.</translation>
 <translation id="5369937289900051171">Impression couleur seulement</translation>
 <translation id="5370279767682621504">Activer la compatibilité avec HTTP 0.9 sur les ports non utilisés par défaut</translation>
-<translation id="5373065931879562543">Déterminer la disponibilité des variantes de ChromeOS</translation>
+<translation id="5373065931879562543">Déterminer la disponibilité des variantes de Chrome OS</translation>
 <translation id="5378985487213287085">Permet de définir si les sites Web sont autorisés à afficher des notifications sur le bureau. L'affichage des notifications sur le bureau peut être autorisé par défaut, refusé par défaut, ou bien l'utilisateur peut recevoir un message chaque fois qu'un site veut afficher ces notifications. 
 
 Si cette règle n'est pas configurée, le paramètre "AskNotifications" est utilisé et l'utilisateur est en mesure de le modifier.</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 1791679..a2a57052 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -73,7 +73,7 @@
 
       Jika <ph name="CRITICAL_VARIATIONS_ONLY_OPTION_NAME" /> (nilai 1) ditetapkan, hanya variasi yang dianggap sebagai perbaikan keamanan atau stabilitas penting yang akan dapat diterapkan pada <ph name="PRODUCT_OS_NAME" />.
 
-      Jika <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> (nilai 2) ditetapkan, semua variasi tidak dapat diterapkan pada browser di layar login. Perlu diketahui, mode ini tidak direkomendasikan karena berpotensi menyebabkan developer <ph name="PRODUCT_OS_NAME" /> tidak dapat menyediakan perbaikan keamanan penting secara tepat waktu.</translation>
+      Jika <ph name="VARIATIONS_DISABLED_OPTION_NAME" /> (nilai 2) ditetapkan, semua variasi tidak akan dapat diterapkan pada browser di layar login. Perlu diketahui, mode ini tidak direkomendasikan karena berpotensi menyebabkan developer <ph name="PRODUCT_OS_NAME" /> tidak dapat menyediakan perbaikan keamanan penting secara tepat waktu.</translation>
 <translation id="1078643757670228170">Perhatikan bahwa kebijakan ini sudah tidak digunakan lagi dan akan dihapus di <ph name="PRODUCT_OS_NAME" /> versi 82. Sebagai gantinya, gunakan <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Menentukan durasi waktu tanpa input pengguna sebelum layar dinonaktifkan saat menggunakan daya AC.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index f1864cb..db61980 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -1205,9 +1205,9 @@
 <translation id="2665422249821137126">เปิดใช้เคอร์เซอร์ขนาดใหญ่ในหน้าจอการเข้าสู่ระบบ</translation>
 <translation id="266882888912227087"> ควบคุมการแจ้งเตือนการเรียกใช้อัตโนมัติของเซสชันผู้เยี่ยมชมที่มีการจัดการใน <ph name="PRODUCT_OS_NAME" />
 
-      หากตั้งค่านโยบายนี้เป็น "จริง" การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะปิดหลังจากแสดงอยู่ 2-3 วินาที
+      หากตั้งค่านโยบายนี้เป็น "จริง" การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะปิดหลังผ่านไปสักครู่
 
-      หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะตรึงอยู่จนกว่าผู้ใช้จะเป็นผู้ปิดการแจ้งเตือนดังกล่าว</translation>
+      หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะตรึงอยู่จนกว่าผู้ใช้จะปิดการแจ้งเตือนดังกล่าว</translation>
 <translation id="2672012807430078509">ควบคุมการเปิดใช้ NTLM เป็นโปรโตคอลการตรวจสอบสิทธิ์สำหรับการต่อเชื่อม SMB</translation>
 <translation id="267596348720209223">กำหนดการเข้ารหัสตัวอักษรที่สนับสนุนโดยผู้ให้บริการการค้นหา การเข้ารหัสหมายถึงชื่อหน้ารหัสอย่างเช่น UTF-8, GB2312 และ ISO-8859-1 โดยมีการนำมาใช้ตามลำดับที่ให้มา นโยบายนี้เป็นทางเลือก หากไม่ตั้งค่าไว้ จะมีการใช้ค่าเริ่มต้นซึ่งก็คือ UTF-8 นโยบายนี้จะใช้เฉพาะในกรณีที่มีการเปิดใช้งานนโยบาย "DefaultSearchProviderEnabled" เท่านั้น</translation>
 <translation id="2678503605767349615">ต้องมีใบรับรองไคลเอ็นต์ระดับอุปกรณ์</translation>
@@ -3773,7 +3773,7 @@
       การตั้งค่านี้จะควบคุมการนำเสนอหน้าต้อนรับที่ช่วยให้ผู้ใช้ลงชื่อเข้าใช้ <ph name="PRODUCT_NAME" /> เลือกผลิตภัณฑ์นี้เป็นเบราว์เซอร์เริ่มต้น หรือให้ข้อมูลเกี่ยวกับฟีเจอร์ของผลิตภัณฑ์</translation>
 <translation id="6766216162565713893">อนุญาตให้เว็บไซต์ขอสิทธิ์เข้าถึงอุปกรณ์บลูทูธที่อยู่ใกล้เคียงจากผู้ใช้</translation>
 <translation id="6770454900105963262">รายงานข้อมูลเกี่ยวกับเซสชันคีออสก์ที่ใช้งาน</translation>
-<translation id="6772045451150098845">นโยบายนี้ควบคุมว่าผู้ใช้ที่ลงทะเบียนในโปรแกรมการปกป้องขั้นสูงจะได้รับฟีเจอร์เพิ่มเติมหรือไม่ บางฟีเจอร์เหล่านี้อาจมีการแชร์ข้อมูลกับ Google (เช่น ผู้ใช้การปกป้องขั้นสูงจะส่งไฟล์ที่ดาวน์โหลดไปให้ Google สแกนหามัลแวร์ได้) หากตั้งค่าเป็น "จริง" หรือไม่ได้ตั้งค่า ผู้ใช้ที่ลงทะเบียนจะได้รับฟีเจอร์เพิ่มเติม หากตั้งค่าเป็น "เท็จ" ผู้ใช้การปกป้องขั้นสูงจะได้รับเฉพาะฟีเจอร์มาตรฐานสำหรับผู้บริโภค</translation>
+<translation id="6772045451150098845">นโยบายนี้ควบคุมว่าผู้ใช้ที่ลงทะเบียนในโปรแกรมการปกป้องขั้นสูงจะได้รับฟีเจอร์เพิ่มเติมหรือไม่ บางฟีเจอร์เหล่านี้อาจมีการแชร์ข้อมูลกับ Google (เช่น ผู้ใช้การปกป้องขั้นสูงจะส่งไฟล์ที่ดาวน์โหลดไปให้ Google สแกนหามัลแวร์ได้) หากตั้งค่าเป็น "จริง" หรือไม่ได้ตั้งค่า ผู้ใช้ที่ลงทะเบียนจะได้รับฟีเจอร์เพิ่มเติม หากตั้งค่าเป็น "เท็จ" ผู้ใช้การปกป้องขั้นสูงจะได้รับเฉพาะฟีเจอร์มาตรฐานสำหรับผู้ใช้ทั่วไป</translation>
 <translation id="6780908086869332493">ช่วยให้คุณระบุรายการรูปแบบ URL ซึ่งระบุเว็บไซต์ที่มีการเลือกใบรับรองไคลเอ็นต์โดยอัตโนมัติในหน้าจอลงชื่อเข้าใช้ในเฟรมที่โฮสต์ขั้นตอน SAML หากเว็บไซต์นั้นขอใบรับรอง ตัวอย่างการใช้งานคือเพื่อกำหนดค่าใบรับรองสำหรับทั้งอุปกรณ์เพื่อแสดงต่อ SAML IdP
 
       ค่าต้องเป็นอาร์เรย์ของพจนานุกรม JSON ซึ่งมีรูปแบบเป็นสตริง พจนานุกรมแต่ละรายการต้องอยู่ในรูปแบบ <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" /> โดยที่ <ph name="URL_PATTERN_PLACEHOLDER" /> เป็นรูปแบบการตั้งค่าเนื้อหา ส่วน <ph name="FILTER_PLACEHOLDER" /> จะจำกัดใบรับรองไคลเอ็นต์ที่เบราว์เซอร์จะเลือกโดยอัตโนมัติ ระบบจะเลือกเฉพาะใบรับรองที่ตรงกับคำขอใบรับรองของเซิร์ฟเวอร์เท่านั้น โดยไม่คำนึงถึงตัวกรอง หาก <ph name="FILTER_PLACEHOLDER" /> อยู่ในรูปแบบ <ph name="JSON_DICTIONARY_EXAMPLE" /> ระบบจะเลือกเฉพาะใบรับรองไคลเอ็นต์ซึ่งออกโดยใบรับรองที่ใช้ CommonName <ph name="ISSUER_CN_PLACEHOLDER" /> เพิ่มเข้ามา หาก <ph name="FILTER_PLACEHOLDER" /> คือพจนานุกรมเปล่า {} การเลือกใบรับรองไคลเอ็นต์จะไม่มีข้อจำกัดเพิ่มเติม
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 171ad6a..cf54325 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -331,7 +331,7 @@
 
       Politika ayarlanmadan bırakılırsa, varsayılan değer kurumsal olarak yönetilen kullanıcılar için "MultiProfileUserBehaviorMustBePrimary" ve yönetilmeyen kullanıcılar için "MultiProfileUserBehaviorUnrestricted" olur.</translation>
 <translation id="1465619815762735808">Tıklandığında oynat</translation>
-<translation id="1467633031685836974">Bu özellik, köprülerin ve adres çubuğu URL gezinmelerinin web sayfasındaki belirli bir metni hedeflemesine olanak tanıyarak, yüklenmesi tamamlandığında web sayfasını hedeflenen konuma kaydırır.
+<translation id="1467633031685836974">Bu özellik, köprülerin ve URL'lerin web sayfasındaki belirli bir metni hedeflemesine olanak tanıyarak, yüklenmesi tamamlandığında web sayfasını hedeflenen konuma kaydırır.
 
 Bu politikayı etkinleştirir veya yapılandırmazsanız web sayfasını URL yoluyla belirli metin parçalarına kaydırma işlevi etkinleştirilir.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 0cfb04b..32739bc8 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -3306,7 +3306,7 @@
 
           Якщо налаштування не вибрано, <ph name="PRODUCT_NAME" /> використовуватиме назву бібліотеки за умовчанням.</translation>
 <translation id="5783009211970309878">Друкувати верхні й нижні колонтитули</translation>
-<translation id="5790763087505467169">Вимкнути сповіщення про автоматичний запуск керованого сеансу в режимі "Гість"</translation>
+<translation id="5790763087505467169">Зменшити кількість сповіщень про автоматичний запуск керованого сеансу в режимі "Гість"</translation>
 <translation id="5806128552675651249">Дозволити лише друк без фонових зображень</translation>
 <translation id="5809210507920527553">Керує налаштуваннями контейнера Linux (Crostini).</translation>
 <translation id="5809728392451418079">Налаштувати відображуване ім’я для локальних облікових записів у пристрої</translation>
diff --git a/components/printing/browser/printer_capabilities_mac.mm b/components/printing/browser/printer_capabilities_mac.mm
index 238cb5c..f601ddd 100644
--- a/components/printing/browser/printer_capabilities_mac.mm
+++ b/components/printing/browser/printer_capabilities_mac.mm
@@ -89,6 +89,11 @@
     custom_paper_sizes.push_back(
         {base::SysNSStringToUTF8(name), "", size_microns});
   }
+  std::sort(custom_paper_sizes.begin(), custom_paper_sizes.end(),
+            [](const PrinterSemanticCapsAndDefaults::Paper& a,
+               const PrinterSemanticCapsAndDefaults::Paper& b) {
+              return a.display_name < b.display_name;
+            });
 
   return custom_paper_sizes;
 }
diff --git a/components/printing/browser/printer_capabilities_mac_unittest.mm b/components/printing/browser/printer_capabilities_mac_unittest.mm
index 5dfd716d..98c9d14 100644
--- a/components/printing/browser/printer_capabilities_mac_unittest.mm
+++ b/components/printing/browser/printer_capabilities_mac_unittest.mm
@@ -7,6 +7,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/mac/foundation_util.h"
 #include "base/mac/scoped_nsobject.h"
+#include "base/path_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace printing {
@@ -194,4 +195,23 @@
   }
 }
 
+TEST(PrinterCapabilitiesMacTest, SortMacCustomPaperSizes) {
+  base::FilePath unsorted_plist;
+  base::PathService::Get(base::DIR_SOURCE_ROOT, &unsorted_plist);
+  unsorted_plist = unsorted_plist.AppendASCII("components")
+                       .AppendASCII("test")
+                       .AppendASCII("data")
+                       .AppendASCII("printing")
+                       .AppendASCII("unsorted_custompapers.plist");
+
+  auto papers = internal::GetMacCustomPaperSizesFromFile(unsorted_plist);
+  ASSERT_EQ(6u, papers.size());
+  EXPECT_EQ("123", papers[0].display_name);
+  EXPECT_EQ("Another Size", papers[1].display_name);
+  EXPECT_EQ("Custom 11x11", papers[2].display_name);
+  EXPECT_EQ("Size 3", papers[3].display_name);
+  EXPECT_EQ("size 3", papers[4].display_name);
+  EXPECT_EQ("\xC3\xA1nother size", papers[5].display_name);
+}
+
 }  // namespace printing
diff --git a/components/proxy_config/ios/proxy_service_factory.cc b/components/proxy_config/ios/proxy_service_factory.cc
index 5d15d34..4fd69797 100644
--- a/components/proxy_config/ios/proxy_service_factory.cc
+++ b/components/proxy_config/ios/proxy_service_factory.cc
@@ -44,7 +44,7 @@
 }
 
 // static
-std::unique_ptr<net::ConfiguredProxyResolutionService>
+std::unique_ptr<net::ProxyResolutionService>
 ProxyServiceFactory::CreateProxyResolutionService(
     net::NetLog* net_log,
     net::URLRequestContext* context,
@@ -52,10 +52,8 @@
     std::unique_ptr<net::ProxyConfigService> proxy_config_service,
     bool quick_check_enabled) {
   DCHECK_CURRENTLY_ON(web::WebThread::IO);
-  std::unique_ptr<net::ConfiguredProxyResolutionService>
-      proxy_resolution_service(
-          net::ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
-              std::move(proxy_config_service), net_log));
-  proxy_resolution_service->set_quick_check_enabled(quick_check_enabled);
+  std::unique_ptr<net::ProxyResolutionService> proxy_resolution_service(
+      net::ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
+          std::move(proxy_config_service), quick_check_enabled, net_log));
   return proxy_resolution_service;
 }
diff --git a/components/proxy_config/ios/proxy_service_factory.h b/components/proxy_config/ios/proxy_service_factory.h
index a17aafcf..72386df 100644
--- a/components/proxy_config/ios/proxy_service_factory.h
+++ b/components/proxy_config/ios/proxy_service_factory.h
@@ -17,7 +17,7 @@
 class NetLog;
 class NetworkDelegate;
 class ProxyConfigService;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class URLRequestContext;
 }
 
@@ -37,8 +37,8 @@
   static std::unique_ptr<PrefProxyConfigTracker>
   CreatePrefProxyConfigTrackerOfLocalState(PrefService* local_state_prefs);
 
-  // Create a proxy resolution service.
-  static std::unique_ptr<net::ConfiguredProxyResolutionService>
+  // Creates a proxy resolution service.
+  static std::unique_ptr<net::ProxyResolutionService>
   CreateProxyResolutionService(
       net::NetLog* net_log,
       net::URLRequestContext* context,
diff --git a/components/safe_browsing/core/proto/webprotect.proto b/components/safe_browsing/core/proto/webprotect.proto
index 18dd909..7c1e428 100644
--- a/components/safe_browsing/core/proto/webprotect.proto
+++ b/components/safe_browsing/core/proto/webprotect.proto
@@ -60,6 +60,9 @@
 
   // Sha256 digest of file.
   optional string digest = 7;
+
+  // Server-side only field.
+  reserved 8;
 }
 
 // Malware-specific response given back for scanned content.
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb
index a9d1b019..0af33a5 100644
--- a/components/strings/components_strings_af.xtb
+++ b/components/strings/components_strings_af.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Vormveranderinge sal verloor word. Is jy seker jy wil voortgaan?</translation>
 <translation id="4477350412780666475">Volgende snit</translation>
 <translation id="4482953324121162758">Hierdie werf sal nie vertaal word nie.</translation>
-<translation id="4486757593530038591">Wanneer dit aan is, kan werwe nie jou blaai-aktiwiteit op verskillende werwe gebruik om advertensies te personaliseer nie. Kenmerke op sommige werwe kan breek.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Hierdie kenmerke word by verstek gedeaktiveer. Hulle sal nie in toekomstige weergawes van Chrome beskikbaar wees nie.</translation>
 <translation id="4493480324863638523">Ongeldige URL. Moet 'n URL met 'n standaardskema wees, byvoorbeeld, http://example.com of https://example.com.</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 911185a..8d1c439 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -810,7 +810,6 @@
 <translation id="4466881336512663640">የቅጽ ለውጦች ይጠፋሉ። እርግጠኛ ነዎት መቀጠል ይፈልጋሉ?</translation>
 <translation id="4477350412780666475">ቀጣይ ትራክ</translation>
 <translation id="4482953324121162758">ይህ ጣቢያ አይተረጎምም።</translation>
-<translation id="4486757593530038591">ሲበራ ጣቢያዎች ማስታወቂያዎችን ግላዊነት ለማላበስ በተለያዩ ጣቢያዎች ላይ እንቅስቃሴዎን መጠቀም አይችሉም። በአንዳንድ ጣቢያዎች ላይ ያሉ ባህሪያት ሊሰበሩ ይችላሉ።</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">እነዚህ ባህሪዎች በነባሪነት ተሰናክሏል። በወደፊት የChrome ስሪቶች ላይ አይገኙም።</translation>
 <translation id="4493480324863638523">ልክ ያልሆነ ዩአርኤል። ደረጃውን የጠበቀ ቅርጸ አጻጻፍ ያለው ዩአርኤል መሆን አለበት፣ ለምሳሌ፦ http://example.com ወይም https://example.com.</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index 25fbf23a..29fae7a 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">سيتم فقدان تغييرات النموذج. هل تريد فعلاً المتابعة؟</translation>
 <translation id="4477350412780666475">المقطع الصوتي التالي</translation>
 <translation id="4482953324121162758">لن تتم ترجمة هذا الموقع.</translation>
-<translation id="4486757593530038591">عند تفعيل هذا الخيار، لا يمكن للمواقع الإلكترونية استخدام نشاط التصفّح على المواقع الإلكترونية المختلفة لتخصيص الإعلانات. وقد تتوقف الميزات على بعض المواقع الإلكترونية.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">‏يتم إيقاف هذه الميزات تلقائيًا. لن تكون الميزات متاحة في الإصدارات المستقبلية من Chrome.</translation>
 <translation id="4493480324863638523">‏عنوان URL غير صحيح. يجب أن يحتوي عنوان URL على نظام عادي، مثل http://example.com أو https://example.com.</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb
index 40e873f..d56bfeb 100644
--- a/components/strings/components_strings_as.xtb
+++ b/components/strings/components_strings_as.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">ফৰ্মত কৰা সালসলনি নোহোৱা হৈ যাব। আপুনি অব্যাহত ৰাখিবলৈ বিচাৰে বুলি নিশ্চিতনে?</translation>
 <translation id="4477350412780666475">পৰৱৰ্তী ট্ৰেক</translation>
 <translation id="4482953324121162758">এই ছাইটটো অনুবাদ কৰা নহয়।</translation>
-<translation id="4486757593530038591">অন হৈ থকা সময়ত, ছাইটসমূহে আপুনি বেলেগ বেলেগ ছাইটসমূহত কৰা ব্ৰাউজিং কাৰ্যকলাপ বিজ্ঞাপন ব্যক্তিগতকৃত কৰিবলৈ ব্যৱহাৰ কৰিব নোৱাৰে। কিছুমান ছাইটত সুবিধাসমূহ ব্যাহত হ’ব পাৰে।</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">এই সুবিধাসমূহ ডিফ’ল্ট হিচাপে অক্ষম কৰি থোৱা আছে। সেইবোৰ Chromeৰ ভৱিষ্যতৰ সংস্কৰণসমূহৰ বাবে উপলব্ধ নহ’ব।</translation>
 <translation id="4493480324863638523">অমান্য URL। URLটোৰ এটা মানক স্কীম থাকিবই লাগিব, যেনে, http://example.com বা https://example.com।</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb
index 2f3e99d..2f74f93 100644
--- a/components/strings/components_strings_az.xtb
+++ b/components/strings/components_strings_az.xtb
@@ -811,7 +811,6 @@
 <translation id="4466881336512663640">Formaya edilmiş dəyişikliklər silinəcək. Davam etmək istədiyinizə əminsiniz?</translation>
 <translation id="4477350412780666475">Növbəti trek</translation>
 <translation id="4482953324121162758">Bu sayt tərcümə edilməyəcək.</translation>
-<translation id="4486757593530038591">Aktiv olduqda, saytlar reklamları fərdiləşdirmək üçün müxtəlif saytlarda axtarış fəaliyyətinizi istifadə edə bilməz. Bəzi saytlarda funksiyalar dayandırıla bilər.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Bu funksiyalar defolt olaraq deaktiv edilib. Onlar Chrome'un gələcək versiyalarında əlçatan olmayacaq.</translation>
 <translation id="4493480324863638523">Yanlış link. Standart sxemli link olmalıdır, məs., http://example.com və ya https://example.com.</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb
index 5d602a6d..b80a2d9 100644
--- a/components/strings/components_strings_be.xtb
+++ b/components/strings/components_strings_be.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">Змены ў форме будуць страчаны. Вы сапраўды хочаце працягнуць?</translation>
 <translation id="4477350412780666475">Наступны трэк</translation>
 <translation id="4482953324121162758">Гэты сайт не будзе перакладацца.</translation>
-<translation id="4486757593530038591">Калі ўключыць гэту наладу, сайты не змогуць выкарыстоўваць вашы дзеянні ў браўзеры на розных сайтах у мэтах персаналізацыі рэкламы. Функцыі на некаторых сайтах могуць перастаць працаваць.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Пры стандартных наладах гэтыя функцыі выключаны. У наступных версіях Chrome яны будуць недаступныя.</translation>
 <translation id="4493480324863638523">Няправільны URL-адрас. Патрабуецца URL-адрас са стандартнай структурай, напрыклад http://example.com ці https://example.com.</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 3336dad..ca9cbf9 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">Промените във формуляра ще бъдат заличени. Наистина ли искате да продължите?</translation>
 <translation id="4477350412780666475">Следващ запис</translation>
 <translation id="4482953324121162758">Този сайт няма да се превежда.</translation>
-<translation id="4486757593530038591">Когато тази функция е включена, сайтовете не могат да използват активността ви при сърфиране на различните сайтове, за да персонализират рекламите. Функциите в някои сайтове може да не работят правилно.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Тези функции са деактивирани по подразбиране. Те няма да бъдат налице в бъдещите версии на Chrome.</translation>
 <translation id="4493480324863638523">Невалиден URL адрес. Трябва да е URL адрес със стандартна схема, напр. http://example.com или https://example.com.</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index fab71c2..8c63d38 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">ফর্মে করা পরিবর্তনগুলি সেভ হবে না। আপনি কি চালিয়ে যেতে চান?</translation>
 <translation id="4477350412780666475">পরের ট্র্যাক চালান</translation>
 <translation id="4482953324121162758">এই সাইটটি অনুবাদ করা হবে না।</translation>
-<translation id="4486757593530038591">এটি চালু করা থাকলে, আপনার পছন্দমতো বিজ্ঞাপন দেখানোর জন্য কোনও সাইট আপনার অন্যান্য সাইটে করা ব্রাউজিং অ্যাক্টিভিটি ট্র্যাক করতে পারবে না। কিছু কিছু সাইটের ফিচারগুলি কাজ নাও করতে পারে।</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">এই ফিচারগুলি ডিফল্ট হিসেবেই বন্ধ থাকে। Chrome-এর পরবর্তী ভার্সনে এই ফিচারগুলি আর থাকবে না।</translation>
 <translation id="4493480324863638523">ইউআরএলটি সঠিক নয়। অবশ্যই স্ট্যান্ডার্ড স্কিম সহ ইউআরএল হতে হবে, যেমন http://example.com বা https://example.com.</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb
index e5a582d1..07ea38f2 100644
--- a/components/strings/components_strings_bs.xtb
+++ b/components/strings/components_strings_bs.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Izgubit ćete izmjene obrasca Jeste li sigurni da želite nastaviti?</translation>
 <translation id="4477350412780666475">Sljedeća numera</translation>
 <translation id="4482953324121162758">Ova web lokacija neće biti prevedena.</translation>
-<translation id="4486757593530038591">Kada je funkcija uključena, web lokacije neće moći koristiti vašu aktivnost pregledanja na različitim web lokacijama radi prilagođavanja oglasa. Moguće je da će funkcije na nekim web lokacijama prestati s radom.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ove funkcije su onemogućene u zadanim postavkama. Neće biti dostupne u budućim verzijama Chromea.</translation>
 <translation id="4493480324863638523">Nevažeći URL. Mora biti URL sa standardnom šemom, npr. http://example.com ili https://example.com.</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index 7b94b36..79df92cd 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">Es perdran els canvis fets al formulari. Confirmes que vols continuar?</translation>
 <translation id="4477350412780666475">Pista següent</translation>
 <translation id="4482953324121162758">Aquest lloc web no es traduirà.</translation>
-<translation id="4486757593530038591">Quan aquesta opció està activada, els llocs web no poden fer servir la teva activitat de navegació en diferents llocs web per personalitzar els anuncis. Pot ser que les funcions d'alguns llocs web no funcionin.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Aquestes funcions estan desactivades de manera predeterminada. Deixaran d'estar disponibles en versions futures de Chrome.</translation>
 <translation id="4493480324863638523">L'URL no és vàlid. Ha de tenir un esquema estàndard, com ara "http://example.com" o "https://example.com".</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 13050801..913d9d9 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -805,7 +805,6 @@
 <translation id="4466881336512663640">Změny ve formuláři budou ztraceny. Opravdu chcete pokračovat?</translation>
 <translation id="4477350412780666475">Další skladba</translation>
 <translation id="4482953324121162758">Tento web se nebude překládat.</translation>
-<translation id="4486757593530038591">Když je tato možnost zapnutá, weby nemohou používat vaši aktivitu prohlížení na různých webech k personalizaci reklam. Některé weby mohou přestat fungovat.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Tyto funkce jsou ve výchozím nastavení zakázány. V budoucích verzích prohlížeče Chrome nebudou k dispozici.</translation>
 <translation id="4493480324863638523">Neplatná adresa URL. Je třeba použít adresu URL se standardním schématem, např. http://example.com nebo https://example.com.</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 647cf81..94ccde3 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Du mister eventuelle formularændringer. Er du sikker på, at du vil fortsætte?</translation>
 <translation id="4477350412780666475">Næste nummer</translation>
 <translation id="4482953324121162758">Dette website kan ikke oversættes.</translation>
-<translation id="4486757593530038591">Når dette er slået til, kan websites ikke anvende din browseraktivitet på andre websites til at tilpasse annoncer. Funktioner på visse websites virker muligvis ikke.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Disse funktioner er som standard deaktiveret. De vil ikke være tilgængelige i fremtidige versioner af Chrome.</translation>
 <translation id="4493480324863638523">Webadressen er ugyldig. Webadressen skal indeholde et standardskema, f.eks. http://eksempel.dk eller https://eksempel.dk.</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index c74c81846..4b5e3f8 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -808,7 +808,6 @@
 <translation id="4466881336512663640">Änderungen im Formular gehen verloren. Möchten Sie den Vorgang wirklich fortsetzen?</translation>
 <translation id="4477350412780666475">Nächster Titel</translation>
 <translation id="4482953324121162758">Diese Website wird nicht übersetzt.</translation>
-<translation id="4486757593530038591">Wenn die Funktion aktiviert ist, können Websites Ihre Browseraktivitäten auf anderen Websites nicht verwenden, um Werbung zu personalisieren. Einige Websites funktionieren möglicherweise dann nicht mehr richtig.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Diese Funktionen sind standardmäßig deaktiviert. Sie werden in künftigen Versionen von Chrome nicht länger verfügbar sein.</translation>
 <translation id="4493480324863638523">Ungültige URL. Dies muss eine URL mit einem Standardschema sein, z. B. "http://example.com" oder "https://example.com".</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 0d9060d..dd00cd7 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">Οι αλλαγές που πραγματοποιήθηκαν στη φόρμα θα χαθούν. Είστε βέβαιοι ότι θέλετε να συνεχίσετε;</translation>
 <translation id="4477350412780666475">Επόμενο κομμάτι</translation>
 <translation id="4482953324121162758">Αυτός ο ιστότοπος δεν θα μεταφραστεί.</translation>
-<translation id="4486757593530038591">Όταν είναι ενεργοποιημένο, οι ιστότοποι δεν μπορούν να χρησιμοποιήσουν τη δραστηριότητα περιήγησής σας μεταξύ διαφορετικών ιστοτόπων για εξατομίκευση διαφημίσεων. Μπορεί να παρουσιαστούν προβλήματα στις λειτουργίες ορισμένων ιστοτόπων.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Αυτές οι λειτουργίες είναι απενεργοποιημένες από προεπιλογή. Δεν θα είναι διαθέσιμες σε μελλοντικές εκδόσεις του Chrome.</translation>
 <translation id="4493480324863638523">Μη έγκυρο URL. Πρέπει να είναι ένα URL με βασική μορφή, π.χ. http://example.com ή https://example.com.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 8974b7ca..143bd62 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -596,6 +596,7 @@
 <translation id="3587738293690942763">Middle</translation>
 <translation id="3592413004129370115">Italian (Envelope)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Application blocked by your administrator</translation>
 <translation id="3608932978122581043">Feed orientation</translation>
 <translation id="3614103345592970299">Size 2</translation>
 <translation id="361438452008624280">List entry '<ph name="LANGUAGE_ID" />': unknown or unsupported language.</translation>
@@ -811,7 +812,6 @@
 <translation id="4466881336512663640">Form changes will be lost. Are you sure that you want to continue?</translation>
 <translation id="4477350412780666475">Next track</translation>
 <translation id="4482953324121162758">This site will not be translated.</translation>
-<translation id="4486757593530038591">When on, sites can’t use your browsing activity across different sites to personalise ads. Features on some sites may break.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">These features are disabled by default. They will not be available in future versions of Chrome.</translation>
 <translation id="4493480324863638523">Invalid URL. Must be a URL with a standard scheme, e.g. http://example.com or https://example.com.</translation>
@@ -850,6 +850,7 @@
 <translation id="467662567472608290">This server could not prove that it is <ph name="DOMAIN" />; its security certificate contains errors. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> wants to respond to accessibility events</translation>
 <translation id="467809019005607715">Google Slides</translation>
+<translation id="4680804919228900307">You just entered your password on a deceptive site. Chromium recommends checking your saved passwords for <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> and other sites where you use this password now.</translation>
 <translation id="4690462567478992370">Stop using an invalid certificate</translation>
 <translation id="4691835149146451662">Architecture-A (Envelope)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1015,8 +1016,10 @@
 <translation id="5329858041417644019">Your browser is not managed</translation>
 <translation id="5332219387342487447">Delivery Method</translation>
 <translation id="5334013548165032829">Detailed system logs</translation>
+<translation id="5340250774223869109">Application is blocked</translation>
 <translation id="534295439873310000">NFC devices</translation>
 <translation id="5344579389779391559">This page may try to charge you money</translation>
+<translation id="5346336634660260557">Scan the contents of the clipboard, as well as files that you download or upload in Chrome.</translation>
 <translation id="5355557959165512791">You cannot visit <ph name="SITE" /> right now because its certificate has been revoked. Network errors and attacks are usually temporary, so this page will probably work later.</translation>
 <translation id="536296301121032821">Failed to store policy settings</translation>
 <translation id="5371425731340848620">Update card</translation>
@@ -1427,6 +1430,7 @@
 <translation id="7219179957768738017">The connection uses <ph name="SSL_VERSION" />.</translation>
 <translation id="7220786058474068424">Processing</translation>
 <translation id="7221855153210829124">Show notifications</translation>
+<translation id="7229659723041939809">You just entered your password on a deceptive site. Chrome recommends checking your saved passwords for <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> and other sites where you use this password now.</translation>
 <translation id="7233592378249864828">Print confirmation sheet</translation>
 <translation id="7238585580608191973">SHA-256 Fingerprint</translation>
 <translation id="7240120331469437312">Certificate Subject Alternative Name</translation>
@@ -1494,6 +1498,7 @@
 <translation id="7485870689360869515">No data found.</translation>
 <translation id="7495290002932347110">A data breach on a site or app exposed your password. Chrome recommends checking your saved passwords and changing your password on <ph name="ORIGIN" /> now.</translation>
 <translation id="7498234416455752244">Keep editing</translation>
+<translation id="7503664977220660814">You just entered your password on a deceptive site. Chromium recommends checking your saved passwords for <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> and other sites where you use this password now.</translation>
 <translation id="7508255263130623398">Returned policy device ID is empty or doesn't match current device ID</translation>
 <translation id="7508870219247277067">Avocado green</translation>
 <translation id="7511955381719512146">The Wi-Fi that you are using may require you to visit <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
@@ -1569,6 +1574,7 @@
 <translation id="7763386264682878361">Payment Manifest Parser</translation>
 <translation id="7764225426217299476">Add address</translation>
 <translation id="7766518757692125295">Skirt</translation>
+<translation id="7767271804335921384">The application has been blocked by your administrator</translation>
 <translation id="7770259615151589601">Designated-Long</translation>
 <translation id="7773005668374414287">Same order face up</translation>
 <translation id="777702478322588152">Prefecture</translation>
@@ -1589,6 +1595,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">Leave site?</translation>
 <translation id="7865448901209910068">Best speed</translation>
+<translation id="7874263914261512992">You just entered your password on a deceptive site. Chrome recommends checking your saved passwords for <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> and other sites where you use this password now.</translation>
 <translation id="7878562273885520351">Your password may be compromised</translation>
 <translation id="7882421473871500483">Brown</translation>
 <translation id="7887683347370398519">Check your CVC and try again</translation>
@@ -1725,6 +1732,7 @@
 <translation id="8474910779563686872">Show developer details</translation>
 <translation id="8479754468255770962">Staple bottom left</translation>
 <translation id="8483780878231876732">To use cards from your Google Account, sign in to Chrome</translation>
+<translation id="8485393050551136813">You just entered your password on a deceptive site. Chromium recommends checking your saved passwords for <ph name="WEBSITE_1" /> and other sites where you use this password now.</translation>
 <translation id="8488350697529856933">Applies to</translation>
 <translation id="8490137692873530638">Stacker 10</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> took too long to respond.</translation>
@@ -1774,6 +1782,7 @@
 <translation id="87601671197631245">This site uses an outdated security configuration, which may expose your information (for example, passwords, messages or credit cards) when it is sent to this site.</translation>
 <translation id="8761567432415473239">Google Safe Browsing recently <ph name="BEGIN_LINK" />found harmful programs<ph name="END_LINK" /> on <ph name="SITE" />.</translation>
 <translation id="8763927697961133303">USB device</translation>
+<translation id="8774457497170244317">You just entered your password on a deceptive site. Chrome recommends checking your saved passwords for <ph name="WEBSITE_1" /> and other sites where you use this password now.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Redo delete</translation>
 <translation id="8792621596287649091">You could lose access to your <ph name="ORG_NAME" /> account or experience identity theft. Chromium recommends changing your password now.</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index f62b9c4..02cfbd9 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">Se perderán los cambios del formulario. ¿Confirmas que deseas continuar?</translation>
 <translation id="4477350412780666475">Siguiente pista</translation>
 <translation id="4482953324121162758">Este sitio no se traducirá.</translation>
-<translation id="4486757593530038591">Si se activa esta opción, los sitios web no podrán usar tu actividad de navegación en diferentes sitios para personalizar anuncios. Es posible que las características de algunos sitios no funcionen adecuadamente.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Estas funciones están inhabilitadas de forma predeterminada. No estarán disponibles en futuras versiones de Chrome.</translation>
 <translation id="4493480324863638523">La URL no es válida. Debe ser una URL con un esquema estándar, p. ej., http://ejemplo.com o https://ejemplo.com.</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 534e748..4dfaf2e4 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Se perderán los cambios realizados en el formulario. ¿Seguro que quieres continuar?</translation>
 <translation id="4477350412780666475">Pista siguiente</translation>
 <translation id="4482953324121162758">Este sitio web no se traducirá.</translation>
-<translation id="4486757593530038591">Si activas esta opción, los sitios web no podrán utilizar tu actividad de navegación en otros sitios web para personalizar anuncios. Es posible que las funciones de algunos sitios web no funcionen correctamente.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Estas funciones están inhabilitadas de forma predeterminada. No estarán disponibles en futuras versiones de Chrome.</translation>
 <translation id="4493480324863638523">La URL no es válida. Debe ser una URL con una estructura estándar, como "http://example.com" o "https://example.com".</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index 4291fef..4b6b820 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Vormil tehtud muudatused lähevad kaotsi. Kas soovite kindlasti jätkata?</translation>
 <translation id="4477350412780666475">Järgmine lugu</translation>
 <translation id="4482953324121162758">Seda saiti ei tõlgita.</translation>
-<translation id="4486757593530038591">Kui on sisse lülitatud, ei saa saidid reklaamide isikupärastamiseks eri saitidel teie sirvimistegevust kasutada. Mõne saidi funktsioonid ei pruugi töötada.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Need funktsioonid on vaikimisi peatatud. Need ei ole Chrome'i tulevastes versioonides saadaval.</translation>
 <translation id="4493480324863638523">Sobimatu URL. Peab olema standardskeemiga URL, nt http://example.com või https://example.com.</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb
index 7e1cfbcf..efa1b841 100644
--- a/components/strings/components_strings_eu.xtb
+++ b/components/strings/components_strings_eu.xtb
@@ -808,7 +808,6 @@
 <translation id="4466881336512663640">Inprimakiko aldaketak galdu egingo dira. Ziur aurrera egin nahi duzula?</translation>
 <translation id="4477350412780666475">Hurrengo pista</translation>
 <translation id="4482953324121162758">Webgune hau ez da itzuliko.</translation>
-<translation id="4486757593530038591">Aktibatuta badago, webguneek ezingo dituzte erabili zure arakatze-jarduerak webguneetan erakusten zaizkizun iragarkiak pertsonalizatzeko. Baliteke webgune batzuetako eginbideek ez funtzionatzea.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Eginbide hauek modu lehenetsian daude desgaituta. Ez dira egongo erabilgarri Chrome-ren hurrengo bertsioetan.</translation>
 <translation id="4493480324863638523">URLak ez du balio. Eskema estandarreko URLa izan behar du, hala nola "http://adibidea.eus" edo "https://adibidea.eus".</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index bb09ce1..6a78703 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">تغییرات فرم از بین می‌رود. مطمئن هستید می‌خواهید ادامه دهید؟</translation>
 <translation id="4477350412780666475">آهنگ بعدی</translation>
 <translation id="4482953324121162758">این سایت ترجمه نخواهد شد.</translation>
-<translation id="4486757593530038591">وقتی روشن باشد، سایت‌ها نمی‌توانند از فعالیت مرور شما در سایت‌های مختلف برای شخصی‌سازی آگهی استفاده کنند. ویژگی‌ها ممکن است در برخی سایت‌ها کار نکنند.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">‏این ویژگی‌ها به‌طور پیش‌فرض غیرفعال شده‌اند. در نسخه‌های بعدی Chrome در دسترس نخواهند بود.</translation>
 <translation id="4493480324863638523">‏نشانی وب نامعتبر است. باید نشانی وبی با طرحی استاندارد مانند http://example.com یا https://example.com باشد.</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 0bf4c15f..671cbb7 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">Lomakkeen muutokset menetetään. Haluatko varmasti jatkaa?</translation>
 <translation id="4477350412780666475">Seuraava kappale</translation>
 <translation id="4482953324121162758">Tätä sivustoa ei käännetä.</translation>
-<translation id="4486757593530038591">Kun tämä on päällä, sivustot eivät voi hyödyntää selailuhistoriaasi kohdistettuun mainontaan. Joidenkin sivustojen ominaisuudet saattavat lakata toimimasta.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Nämä ominaisuudet ovat oletuksena poissa käytöstä. Ne eivät ole käytettävissä Chromen tulevissa versioissa.</translation>
 <translation id="4493480324863638523">Virheellinen URL-osoite URL-osoitteen on oltava vakiomallien mukainen, esimerkiksi "http://example.com" tai "https://example.com".</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 35c3e3d9..3b51bd36 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -811,7 +811,6 @@
 <translation id="4466881336512663640">Mawawala ang mga pagbabago sa form. Sigurado ka bang gusto mong magpatuloy?</translation>
 <translation id="4477350412780666475">Susunod na Track</translation>
 <translation id="4482953324121162758">Hindi ita-translate ang site na ito.</translation>
-<translation id="4486757593530038591">Kapag naka-on, hindi magagamit ng mga site ang iyong aktibidad sa pag-browse sa iba't ibang site para mag-personalize ng mga ad. Posibleng masira ang mga feature sa ilang site.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Naka-disable bilang default ang mga feature na ito. Hindi magiging available ang mga ito sa mga bersyon ng Chrome sa hinaharap.</translation>
 <translation id="4493480324863638523">Di-wastong URL. Dapat ay isang URL na may karaniwang scheme, hal. http://example.com o https://example.com.</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb
index c2924f40..6f1b8d4 100644
--- a/components/strings/components_strings_fr-CA.xtb
+++ b/components/strings/components_strings_fr-CA.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">Les changements apportés aux formulaires seront perdus. Voulez-vous vraiment continuer?</translation>
 <translation id="4477350412780666475">Chanson suivante</translation>
 <translation id="4482953324121162758">Ce site ne sera pas traduit.</translation>
-<translation id="4486757593530038591">Lorsque cette option est activée, les sites ne peuvent pas utiliser votre activité de navigation sur différents sites afin de personnaliser les annonces. Les fonctionnalités pourraient ne pas fonctionner sur certains sites.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ces fonctionnalités sont désactivées par défaut. Elles ne seront pas proposées dans les prochaines versions de Chrome.</translation>
 <translation id="4493480324863638523">URL incorrecte. Le format de l'URL doit être standard. Par exemple : http://example.com ou https://example.com.</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index 14cffc3..fce8801 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">Les modifications apportées au formulaire seront perdues. Voulez-vous vraiment continuer ?</translation>
 <translation id="4477350412780666475">Titre suivant</translation>
 <translation id="4482953324121162758">Ce site ne sera pas traduit.</translation>
-<translation id="4486757593530038591">Lorsque cette option est activée, les sites ne peuvent pas utiliser votre activité de navigation sur d'autres sites pour personnaliser les annonces. Les fonctionnalités de certains sites peuvent être bloquées.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ces fonctionnalités sont désactivées par défaut. Elles ne seront plus disponibles dans les prochaines versions de Chrome.</translation>
 <translation id="4493480324863638523">URL non valide : vous devez saisir une URL avec un schéma standard, comme http://example.com ou https://example.com.</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb
index b2d30c7..5cb81ac 100644
--- a/components/strings/components_strings_gl.xtb
+++ b/components/strings/components_strings_gl.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">Perderanse os cambios que realizases no formulario. Seguro que queres continuar?</translation>
 <translation id="4477350412780666475">Pista seguinte</translation>
 <translation id="4482953324121162758">Non se traducirá este sitio.</translation>
-<translation id="4486757593530038591">Con esta opción activada, os sitios non poden utilizar a túa actividade de navegación a través de distintos sitios para personalizar os anuncios. As funcións dalgúns sitios poden deixar de funcionar.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Estas funcións están desactivadas de forma predeterminada. Non estarán dispoñibles en versións futuras de Chrome.</translation>
 <translation id="4493480324863638523">O URL non é válido. Debe ser un URL cunha estrutura estándar, como http://example.com ou https://example.com.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index 398773d9..5ed73fe 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">ફોર્મના ફેરફારો ગુમાવશો. શું તમે ખરેખર ચાલુ રાખવા માગો છો?</translation>
 <translation id="4477350412780666475">આગલો ટ્રૅક</translation>
 <translation id="4482953324121162758">આ સાઇટનો અનુવાદ થશે નહીં.</translation>
-<translation id="4486757593530038591">જ્યારે ચાલુ હોય, ત્યારે સાઇટ જાહેરાતોને વ્યક્તિગત બનાવવા માટે બધી અલગ-અલગ સાઇટ પરની તમારી બ્રાઉઝિંગ પ્રવૃત્તિનો ઉપયોગ કરી શકતી નથી. અમુક સાઇટ પરની સુવિધાઓને કદાચ બંધ કરવામાં આવી શકે.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">આ સુવિધાઓને ડિફૉલ્ટ તરીકે બંધ કરેલી છે. આ હવે Chromeના ભાવિ વર્ઝનમાં ઉપલબ્ધ થશે નહીં.</translation>
 <translation id="4493480324863638523">અમાન્ય URL. કોઈ માનક સ્કીમ ધરાવતું URL હોવું આવશ્યક છે, દા.ત. http://example.com અથવા https://example.com.</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 960f04cf..7460d8d 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -811,7 +811,6 @@
 <translation id="4466881336512663640">फ़ॉर्म में किए गए बदलाव हटा दिए जाएँगे. क्या आप वाकई जारी रखना चाहते हैं?</translation>
 <translation id="4477350412780666475">अगला ट्रैक</translation>
 <translation id="4482953324121162758">इस साइट का अनुवाद नहीं किया जाएगा.</translation>
-<translation id="4486757593530038591">इसके चालू होने पर, कोई भी साइट आपकी ब्राउज़िंग गतिविधि की जानकारी का इस्तेमाल, आपकी पसंद को ध्यान में रखकर विज्ञापन दिखाने के लिए नहीं कर पाएगी. शायद कुछ साइटों पर सुविधाएं ठीक से काम न करें.</translation>
 <translation id="4490717597759821841">ए7</translation>
 <translation id="4492519888999857993">ये सुविधाएं डिफ़ॉल्ट रूप से बंद कर दी गई हैं. Chrome के आने वाले वर्शन पर ये सुविधाएं उपलब्ध नहीं होंगी.</translation>
 <translation id="4493480324863638523">यूआरएल गलत है. यूआरएल में सामान्य स्कीम, जैसे कि, http://example.com या https://example.com.ज़रूर होनी चाहिए.</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 4aa9970..013d4ac8 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">Izgubit će se promjene koje ste unijeli u obrazac. Jeste li sigurni da želite nastaviti?</translation>
 <translation id="4477350412780666475">Sljedeća pjesma</translation>
 <translation id="4482953324121162758">Ova web-lokacija neće biti prevedena.</translation>
-<translation id="4486757593530038591">Kad je ta značajka uključena, web-lokacije ne mogu prilagođavati oglase na temelju vaše aktivnosti pregledavanja na različitim web-lokacijama. Značajke na nekim web-lokacijama mogu prestati funkcionirati.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ove su značajke onemogućene prema zadanim postavkama. Neće biti dostupne u budućim verzijama Chromea.</translation>
 <translation id="4493480324863638523">URL nije važeći. URL mora imati standardnu shemu, na primjer http://example.com ili https://example.com.</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 7669baa..eb237d1 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -811,7 +811,6 @@
 <translation id="4466881336512663640">Az űrlapon végzett módosítások elvesznek. Biztosan folytatni szeretné?</translation>
 <translation id="4477350412780666475">Következő szám</translation>
 <translation id="4482953324121162758">Nem fordítjuk le ezt a webhelyet.</translation>
-<translation id="4486757593530038591">Ha be van kapcsolva, a webhelyek nem használhatják fel az Ön különböző webhelyeken végzett böngészési tevékenységeit a hirdetések személyre szabásához. Előfordulhat, hogy bizonyos webhelyek funkciói nem működnek megfelelően.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ezek a funkciók alapértelmezés szerint le vannak tiltva. A Chrome későbbi verzióiban nem állnak majd rendelkezésre.</translation>
 <translation id="4493480324863638523">Érvénytelen URL. Az URL-nek szabványos sémával kell rendelkeznie, például http://example.com vagy https://example.com.</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb
index a6d0759..dac96da3 100644
--- a/components/strings/components_strings_hy.xtb
+++ b/components/strings/components_strings_hy.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Ձևում արված բոլոր փոփոխությունները կկորեն: Շարունակե՞լ։</translation>
 <translation id="4477350412780666475">Հաջորդ կատարումը</translation>
 <translation id="4482953324121162758">Այս կայքը չի թարգմանվի:</translation>
-<translation id="4486757593530038591">Երբ այս կարգավորումը միացված է, կայքերը չեն կարող օգտագործել ձեր այցելությունների պատմությունը՝ գովազդն անհատականացնելու նպատակով։ Որոշ կայքերում գործառույթները կարող են չաշխատել։</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Այս գործառույթներն ըստ կանխադրման անջատված են և հասանելի չեն լինի Chrome-ի հետագա տարբերակներում:</translation>
 <translation id="4493480324863638523">URL-ն անվավեր է: Պետք է լինի ստանդարտ սխեմայով URL, օր.՝ http://example.com կամ https://example.com։</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 22687d6..4c08703 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">Perubahan pada formulir akan hilang. Yakin ingin melanjutkan?</translation>
 <translation id="4477350412780666475">Lagu Berikutnya</translation>
 <translation id="4482953324121162758">Situs ini tidak akan diterjemahkan.</translation>
-<translation id="4486757593530038591">Jika diaktifkan, situs tidak dapat menggunakan aktivitas penjelajahan di situs lain untuk mempersonalisasi iklan. Fitur di beberapa situs mungkin error.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Fitur ini dinonaktifkan secara default. Fitur ini tidak akan tersedia pada versi mendatang Chrome.</translation>
 <translation id="4493480324863638523">URL tidak valid. Harus berupa URL dengan skema standar, misalnya http://example.com atau https://example.com.</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb
index 01d30972..bb729c2 100644
--- a/components/strings/components_strings_is.xtb
+++ b/components/strings/components_strings_is.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">Breytingar á eyðublaði glatast. Viltu örugglega halda áfram?</translation>
 <translation id="4477350412780666475">Næsta lag</translation>
 <translation id="4482953324121162758">Þetta vefsvæði verður ekki þýtt.</translation>
-<translation id="4486757593530038591">Þegar kveikt er á þessu geta vefsvæði ekki notað vafranotkun þína á mismunandi vefsvæðum til að sérsníða auglýsingar. Ekki er víst að allir eiginleikar á öllum vefsvæðum virki.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Sjálfgefið er að slökkva á þessum eiginleikum. Þeir verða ekki tiltækir í síðari útgáfum Chrome.</translation>
 <translation id="4493480324863638523">Ógild vefslóð. Verður að vera vefslóð með hefðbundinni framsetningu, t.d. http://example.com or https://example.com.</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 10eedef..d54e0b7 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -597,6 +597,7 @@
 <translation id="3587738293690942763">Medio</translation>
 <translation id="3592413004129370115">Italian (Envelope)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Applicazione bloccata dal tuo amministratore</translation>
 <translation id="3608932978122581043">Fornisci orientamento</translation>
 <translation id="3614103345592970299">Dimensione 2</translation>
 <translation id="361438452008624280">Voce "<ph name="LANGUAGE_ID" />": lingua sconosciuta o non supportata.</translation>
@@ -812,7 +813,6 @@
 <translation id="4466881336512663640">Le modifiche apportate al modulo andranno perse. Vuoi continuare?</translation>
 <translation id="4477350412780666475">Traccia successiva</translation>
 <translation id="4482953324121162758">Questo sito non verrà tradotto.</translation>
-<translation id="4486757593530038591">Se attivi questa opzione, i siti non possono usare la tua attività di navigazione su diversi siti per personalizzare gli annunci. Le funzionalità su alcuni siti potrebbero non essere disponibili.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Queste funzionalità sono disattivate per impostazione predefinita. Non saranno disponibili nelle future versioni di Chrome.</translation>
 <translation id="4493480324863638523">URL non valido. Deve essere un URL con schema standard, ad esempio http://example.com o https://example.com.</translation>
@@ -852,6 +852,7 @@
 <translation id="467662567472608290">Questo server non è riuscito a dimostrare che si tratta di <ph name="DOMAIN" />; il relativo certificato di sicurezza contiene errori. Il problema potrebbe essere dovuto a un'errata configurazione o a un malintenzionato che intercetta la connessione.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> vuole rispondere agli eventi di accessibilità</translation>
 <translation id="467809019005607715">Presentazioni Google</translation>
+<translation id="4680804919228900307">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di controllare le password salvate per <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> e altri siti su cui utilizzi questa password.</translation>
 <translation id="4690462567478992370">Interrompi l'utilizzo di un certificato non valido</translation>
 <translation id="4691835149146451662">Architecture-A (Envelope)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1017,8 +1018,10 @@
 <translation id="5329858041417644019">Il browser in uso non è gestito</translation>
 <translation id="5332219387342487447">Modalità di spedizione</translation>
 <translation id="5334013548165032829">Log di sistema dettagliati</translation>
+<translation id="5340250774223869109">L'applicazione è bloccata</translation>
 <translation id="534295439873310000">Dispositivi NFC</translation>
 <translation id="5344579389779391559">Questa pagina potrebbe tentare di addebitarti dei costi</translation>
+<translation id="5346336634660260557">Consente di analizzare i contenuti degli appunti e dei file scaricati o caricati in Chrome.</translation>
 <translation id="5355557959165512791">Al momento non puoi visitare il sito <ph name="SITE" /> perché il relativo certificato è stato revocato. In genere gli errori di rete e gli attacchi sono temporanei, pertanto questa pagina potrebbe funzionare più tardi.</translation>
 <translation id="536296301121032821">Archiviazione delle impostazioni criterio non riuscita</translation>
 <translation id="5371425731340848620">Aggiorna carta</translation>
@@ -1428,6 +1431,7 @@
 <translation id="7219179957768738017">La connessione utilizza <ph name="SSL_VERSION" />.</translation>
 <translation id="7220786058474068424">Elaborazione in corso</translation>
 <translation id="7221855153210829124">Mostrare le notifiche</translation>
+<translation id="7229659723041939809">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di controllare le password salvate per <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> e altri siti su cui utilizzi questa password.</translation>
 <translation id="7233592378249864828">Stampa foglio di conferma</translation>
 <translation id="7238585580608191973">Impronta digitale SHA-256</translation>
 <translation id="7240120331469437312">Nome alternativo del soggetto del certificato</translation>
@@ -1495,6 +1499,7 @@
 <translation id="7485870689360869515">Nessun dato trovato.</translation>
 <translation id="7495290002932347110">A causa di una violazione dei dati su un sito o un'app, la tua password è stata esposta. Chrome ti consiglia di controllare le password che hai salvato e di cambiare subito la password su <ph name="ORIGIN" />.</translation>
 <translation id="7498234416455752244">Continua modifica</translation>
+<translation id="7503664977220660814">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di controllare le password salvate per <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e altri siti su cui utilizzi questa password.</translation>
 <translation id="7508255263130623398">L'ID dispositivo della norma restituito è vuoto o non corrisponde all'ID dispositivo corrente</translation>
 <translation id="7508870219247277067">Verde pisello</translation>
 <translation id="7511955381719512146">La rete Wi-Fi in uso potrebbe richiedere la visita della pagina <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
@@ -1570,6 +1575,7 @@
 <translation id="7763386264682878361">Analizzatore sintattico dei file manifest dei pagamenti</translation>
 <translation id="7764225426217299476">Aggiungi indirizzo</translation>
 <translation id="7766518757692125295">Skirt</translation>
+<translation id="7767271804335921384">L'applicazione è stata bloccata dal tuo amministratore</translation>
 <translation id="7770259615151589601">Designated-Long</translation>
 <translation id="7773005668374414287">Stesso ordine a faccia in su</translation>
 <translation id="777702478322588152">Prefettura</translation>
@@ -1590,6 +1596,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">Vuoi uscire dal sito?</translation>
 <translation id="7865448901209910068">Massima velocità</translation>
+<translation id="7874263914261512992">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di controllare le password salvate per <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e altri siti su cui utilizzi questa password.</translation>
 <translation id="7878562273885520351">La tua password potrebbe essere stata compromessa</translation>
 <translation id="7882421473871500483">Marrone</translation>
 <translation id="7887683347370398519">Controlla il tuo codice CVC e riprova</translation>
@@ -1726,6 +1733,7 @@
 <translation id="8474910779563686872">Mostra i dettagli dello sviluppatore</translation>
 <translation id="8479754468255770962">Pinzatura in basso a sinistra</translation>
 <translation id="8483780878231876732">Accedi a Chrome per usare le carte memorizzate nel tuo Account Google</translation>
+<translation id="8485393050551136813">Hai appena inserito la tua password su un sito ingannevole. Chromium ti consiglia di controllare le password salvate per <ph name="WEBSITE_1" /> e altri siti su cui utilizzi questa password.</translation>
 <translation id="8488350697529856933">Si applica a</translation>
 <translation id="8490137692873530638">Fascicolatore 10</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> ha impiegato troppo tempo a rispondere.</translation>
@@ -1775,6 +1783,7 @@
 <translation id="87601671197631245">Le tue informazioni (ad esempio password, messaggi o numeri di carte di credito) inviate a questo sito potrebbero essere a rischio, poiché il sito utilizza una configurazione di sicurezza obsoleta.</translation>
 <translation id="8761567432415473239">La funzione Navigazione sicura di Google <ph name="BEGIN_LINK" />ha trovato di recente programmi dannosi<ph name="END_LINK" /> su <ph name="SITE" />.</translation>
 <translation id="8763927697961133303">Dispositivo USB</translation>
+<translation id="8774457497170244317">Hai appena inserito la tua password su un sito ingannevole. Chrome ti consiglia di controllare le password salvate per <ph name="WEBSITE_1" /> e altri siti su cui utilizzi questa password.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Ripeti eliminazione</translation>
 <translation id="8792621596287649091">Potresti non riuscire più ad accedere al tuo account <ph name="ORG_NAME" /> o subire un furto d'identità. Chromium ti consiglia di cambiare subito la password.</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 3ebb002b..6ca1a14 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">השינויים בטופס יתבטלו. להמשיך?</translation>
 <translation id="4477350412780666475">הטראק הבא</translation>
 <translation id="4482953324121162758">האתר הזה לא יתורגם.</translation>
-<translation id="4486757593530038591">כשהאפשרות מופעלת, אתרים לא יכולים להשתמש בפעילות הגלישה שלך באתרים שונים כדי להציג מודעות בהתאמה אישית. ייתכנו שיבושים בפעולה של תכונות באתרים מסוימים.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">‏התכונות האלה מושבתות כברירת מחדל. הן לא יהיו זמינות בגרסאות עתידיות של Chrome.</translation>
 <translation id="4493480324863638523">‏כתובת URL לא חוקית. הסכימה של כתובת ה-URL צריכה להיות רגילה, כלומר: http://example.com או https://example.com.</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 07a0200..52173da 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">フォームの変更内容は破棄されます。続行してもよろしいですか?</translation>
 <translation id="4477350412780666475">次の曲</translation>
 <translation id="4482953324121162758">このサイトは翻訳されません。</translation>
-<translation id="4486757593530038591">オンにすると、サイトが別のサイトでのあなたの閲覧アクティビティを使用できなくなるため、広告はカスタマイズされません。一部サイトの機能が使用できなくなる可能性もあります。</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">これらの機能はデフォルトで無効になっています。Chrome の今後のバージョンではご利用いただけません。</translation>
 <translation id="4493480324863638523">URL が無効です。標準のスキームを使用した URL を指定してください(例: http://example.com、https://example.com)。</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb
index 1611fcb..4c7feff5 100644
--- a/components/strings/components_strings_ka.xtb
+++ b/components/strings/components_strings_ka.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">ფორმაში შეტანილი ცვლილებები დაიკარგება. ნამდვილად გსურთ გაგრძელება?</translation>
 <translation id="4477350412780666475">შემდეგი ჩანაწერი</translation>
 <translation id="4482953324121162758">ეს გვერდი არ ითარგმნება.</translation>
-<translation id="4486757593530038591">ჩართვის შემთხვევაში ვებსაიტები ვერ გამოიყენებს თქვენი დათვალიერების აქტივობას სხვადასხვა ვებსაიტზე რეკლამის პერსონალიზებისთვის. ზოგიერთი საიტის ფუნქციებმა შეიძლება არასათანადოდ იმუშაოს.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ეს ფუნქციები ნაგულისხმევად გათიშულია. ისინი მიუწვდომელი იქნება Chrome-ის მომდევნო ვერსიებში.</translation>
 <translation id="4493480324863638523">URL არასწორია. URL-ს უნდა ჰქონდეს სტანდარტული სქემა, მაგ. http://example.com ან https://example.com.</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb
index 0e8e4e8..0bdeadb0 100644
--- a/components/strings/components_strings_kk.xtb
+++ b/components/strings/components_strings_kk.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">Үлгідегі өзгерістер жойылады. Шынымен жалғастырғыңыз келе ме?</translation>
 <translation id="4477350412780666475">Келесі аудиотрек</translation>
 <translation id="4482953324121162758">Бұл сайт аударылмайды.</translation>
-<translation id="4486757593530038591">Бұл параметр қосулы кезде, жарнамаларды жеке қажеттіліктерге бейімдеу үшін сайттар браузерді қолдану мәліметін пайдалана алмайды. Кейбір сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Бұл функциялар әдепкісінше өшірілді. Олар Chrome-ның болашақ нұсқаларында жұмыс істемейді.</translation>
 <translation id="4493480324863638523">URL мекенжайы жарамсыз. URL мекенжайы стандартты схемаға сай болуы керек (мысалы, http://example.com немесе https://example.com).</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb
index f9340e39..5695a9d 100644
--- a/components/strings/components_strings_km.xtb
+++ b/components/strings/components_strings_km.xtb
@@ -819,7 +819,6 @@
 <translation id="4466881336512663640">ការផ្លាស់ប្ដូរទម្រង់បែបបទ​នឹង​បាត់បង់។ តើអ្នកប្រាកដថា​ចង់បន្តដែរទេ?</translation>
 <translation id="4477350412780666475">សំនៀង​បន្ទាប់</translation>
 <translation id="4482953324121162758">គេហទំព័រនេះ​នឹង​មិនត្រូវ​បានបកប្រែទេ។</translation>
-<translation id="4486757593530038591">នៅពេលបើក គេហទំព័រ​មិនអាចប្រើ​សកម្មភាព​រុករក​តាមអ៊ីនធឺណិត​របស់អ្នក​នៅលើ​គេហទំព័រ​ផ្សេងៗគ្នា ដើម្បីកំណត់​ការផ្សាយ​ពាណិជ្ជកម្ម​ឱ្យ​ស្របតាម​បុគ្គលបានទេ។ មុខងារ​នៅលើ​គេហទំព័រ​មួយចំនួន​ប្រហែលជា​ដំណើរការ​មិនបាន​ត្រឹមត្រូវទេ។</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">មុខងារទាំងនេះ​ត្រូវបានបិទ​តាមលំនាំដើម។ មុខងារទាំងនេះ​នឹងមិនមាន​នៅក្នុងកំណែ Chrome ក្នុងពេល​អនាគត​ទេ។</translation>
 <translation id="4493480324863638523">URL គ្មានសុពលភាព។ ត្រូវតែជា URL ដែលមានគម្រោងស្តង់ដារ ឧ. http://example.com ឬ https://example.com ។</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index ac581e7f..3b92350 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -805,7 +805,6 @@
 <translation id="4466881336512663640">ಫಾರ್ಮ್‌ನಲ್ಲಿ ಮಾಡಿರುವ ಬದಲಾವಣೆಗಳು ಕಳೆದು ಹೋಗುತ್ತವೆ. ನೀವು ಖಂಡಿತವಾಗಿಯೂ ಮುಂದುವರಿಯಲು ಬಯಸುತ್ತೀರಾ?</translation>
 <translation id="4477350412780666475">ಮುಂದಿನ ಟ್ರ್ಯಾಕ್</translation>
 <translation id="4482953324121162758">ಈ ಸೈಟ್ ಅನುವಾದಕ್ಕೆ ಒಳಪಡುವುದಿಲ್ಲ.</translation>
-<translation id="4486757593530038591">ಆನ್ ಆಗಿರುವಾಗ, ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು, ವಿಭಿನ್ನ ಸೈಟ್‌ಗಳಲ್ಲಿ ನೀವು ನಡೆಸುವ ಬ್ರೌಸಿಂಗ್ ಚಟುವಟಿಕೆಯನ್ನು ಸೈಟ್‌ಗಳು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಕೆಲವು ವೆಬ್‌ಸೈಟ್‌ಗಳಲ್ಲಿನ ವೈಶಿಷ್ಟ್ಯಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ಈ ವೈಶಿಷ್ಟ್ಯಗಳು ಡೀಫಾಲ್ಟ್ ಆಗಿ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿವೆ. Chrome ನ ಭವಿಷ್ಯದ ಆವೃತ್ತಿಗಳಲ್ಲಿ ಅವುಗಳು ಲಭ್ಯವಿರುವುದಿಲ್ಲ.</translation>
 <translation id="4493480324863638523">ಅಮಾನ್ಯ URL. ಪ್ರಮಾಣಿತ ವ್ಯವಸ್ಥೆಯೊಂದಿಗಿನ URL ಆಗಿರಬೇಕು, ಉದಾ. http://example.com or https://example.com.</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index edca65d6..a8686683 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">양식에서 변경한 사항이 삭제됩니다. 계속하시겠습니까?</translation>
 <translation id="4477350412780666475">다음 트랙</translation>
 <translation id="4482953324121162758">이 사이트는 번역되지 않습니다.</translation>
-<translation id="4486757593530038591">사용 설정하면 사이트에서 사용자의 타 사이트 탐색 활동 정보를 이용해 광고를 맞춤설정할 수 없습니다. 일부 사이트에서는 기능이 작동하지 않을 수 있습니다.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">이 기능은 기본적으로 사용 중지되어 있습니다. Chrome의 이후 버전에서는 사용할 수 없습니다.</translation>
 <translation id="4493480324863638523">잘못된 URL입니다. URL에는 표준 스키마가 있어야 합니다(예: http://example.com 또는 https://example.com).</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb
index 7dfa001..ba49126 100644
--- a/components/strings/components_strings_ky.xtb
+++ b/components/strings/components_strings_ky.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">Формага киргизилген өзгөртүүлөр сакталбайт. Чын эле уланткыңыз келеби?</translation>
 <translation id="4477350412780666475">Кийинки трек</translation>
 <translation id="4482953324121162758">Бул сайт которулбайт.</translation>
-<translation id="4486757593530038591">Күйгүзүлсө, сайттар жарнамаларды жекелештирүү үчүн башка сайттардагы серептөө аракеттериңизди колдоно алышпайт. Функциялар айрым сайттарда туура иштебеши мүмкүн.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Бул шарттар демейки катары өчүрүлгөн. Алар Chrome'дун жаңы версияларында колдонулбай калат.</translation>
 <translation id="4493480324863638523">Жараксыз URL. URL дареги стандарттык үлгүдө болушу керек, мис., http://example.com же https://example.com.</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb
index 7d43b7a7..db11bbc5 100644
--- a/components/strings/components_strings_lo.xtb
+++ b/components/strings/components_strings_lo.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">ການປ່ຽນແປງໃນແບບຟອມຈະເສຍໄປ. ທ່ານແນ່ໃຈບໍ່ວ່າທ່ານຕ້ອງການສືບຕໍ່?</translation>
 <translation id="4477350412780666475">ເພງຕໍ່ໄປ</translation>
 <translation id="4482953324121162758">ລະບົບຈະບໍ່ແປເວັບໄຊນີ້.</translation>
-<translation id="4486757593530038591">ເມື່ອເປີດຢູ່, ເວັບໄຊບໍ່ສາມາດໃຊ້ການເຄື່ອນໄຫວທ່ອງເວັບຂອງທ່ານໃນທົ່ວເວັບໄຊຕ່າງໆເພື່ອປັບແຕ່ງໂຄສະນາໃຫ້ເປັນແບບສ່ວນຕົວໄດ້. ຄຸນສົມບັດໃນບາງເວັບໄຊອາດຈະໃຊ້ບໍ່ໄດ້.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ຄຸນສົມບັດນີ້ຖືກປິດນຳໃຊ້ຕາມຄ່າເລີ່ມຕົ້ນ. ພວກມັນຈະບໍ່ມີໃຫ້ນຳໃຊ້ໃນເວີຊັນອະນາຄົດຂອງ Chrome.</translation>
 <translation id="4493480324863638523">URL ໃຊ້ບໍ່ໄດ້. ຕ້ອງແມ່ນ URL ທີ່ມີຮູບແບບມາດຕະຖານ ເຊັ່ນ: http://example.com ຫຼື https://example.com.</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index e669342..9d8283a 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">Formos pakeitimai bus prarasti. Ar tikrai norite tęsti?</translation>
 <translation id="4477350412780666475">Kitas takelis</translation>
 <translation id="4482953324121162758">Ši svetainė nebus verčiama.</translation>
-<translation id="4486757593530038591">Įjungus svetainės negalės naudoti jūsų naršymo veiklos skirtingose svetainėse, kad galėtų suasmeninti skelbimus. Funkcijos gali neveikti tam tikrose svetainėse.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Šios funkcijos išjungtos pagal numatytuosius nustatymus. Jos nebus pasiekiamos būsimų versijų naršyklėje „Chrome“.</translation>
 <translation id="4493480324863638523">Netinkamas URL. Tai turi būti įprastos schemos URL, pvz., http://example.com arba https://example.com.</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index 1c2425fd..40e4b70 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -812,7 +812,6 @@
 <translation id="4466881336512663640">Veidlapas izmaiņas tiks zaudētas. Vai tiešām vēlaties turpināt?</translation>
 <translation id="4477350412780666475">Nākamais ieraksts</translation>
 <translation id="4482953324121162758">Šī vietne netiks tulkota.</translation>
-<translation id="4486757593530038591">Kad ir ieslēgta šī opcija, vietnes nevar izmantot jūsu pārlūkošanas darbības dažādās vietnēs, lai personalizētu reklāmas. Noteiktās vietnēs funkcijas var nedarboties.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Šīs funkcijas ir atspējotas pēc noklusējuma. Turpmākajās Chrome versijās tās nebūs pieejamas.</translation>
 <translation id="4493480324863638523">Nederīgs URL. Vietrādim URL ir jābūt ar standarta shēmu, piemēram, “http://example.com” vai “https://example.com”.</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb
index b46b968..9da9239 100644
--- a/components/strings/components_strings_mk.xtb
+++ b/components/strings/components_strings_mk.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Промените на формуларот ќе се изгубат. Сигурно сакате да продолжите?</translation>
 <translation id="4477350412780666475">Следна песна</translation>
 <translation id="4482953324121162758">Сајтов нема да се преведе.</translation>
-<translation id="4486757593530038591">Кога е вклучено, сајтовите не можат да ја користат вашата активност од прелистувањето на различни сајтови за персонализирање на рекламите. Функциите на некои сајтови може да не функционираат.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Функцииве се стандардно оневозможени. Нема да бидат достапни во идните верзии на Chrome.</translation>
 <translation id="4493480324863638523">Неважечка URL-адреса. Мора да биде URL-адреса со стандардна шема, на пример, http://example.com или https://example.com.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 75bfa4cd9..f10a54d4 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -808,7 +808,6 @@
 <translation id="4466881336512663640">ഫോം മാറ്റങ്ങൾ നഷ്‌ടമാകും. തുടരണമെന്ന് നിങ്ങൾക്ക് തീർച്ചയാണോ?</translation>
 <translation id="4477350412780666475">അടുത്ത ട്രാക്ക്</translation>
 <translation id="4482953324121162758">ഈ സൈറ്റ് വിവർത്തനം ചെയ്യപ്പെടില്ല.</translation>
-<translation id="4486757593530038591">ഓണായിരിക്കുമ്പോൾ, പരസ്യങ്ങൾ വ്യക്തിപരമാക്കാൻ വ്യത്യസ്ത സൈറ്റുകളിലുടനീളമുള്ള നിങ്ങളുടെ ബ്രൗസിംഗ് ആക്റ്റിവിറ്റി ഉപയോഗിക്കാൻ സൈറ്റുകൾക്കാവില്ല. ചില സൈറ്റുകളിലെ ഫീച്ചറുകൾക്ക് പ്രവർത്തനം നടത്താനായേക്കില്ല.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ഈ ഫീച്ചറുകൾ ഡിഫോൾട്ടായി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു. Chrome-ന്റെ ഭാവി പതിപ്പുകളിൽ അവ ലഭ്യമാകില്ല.</translation>
 <translation id="4493480324863638523">URL അസാധുവാണ്. സ്‌റ്റാൻഡേർഡ് സ്‌കീം ഉള്ള URL ആയിരിക്കണം, ഉദാ. http://example.com അല്ലെങ്കിൽ https://example.com.</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb
index cf38981..57f79d3 100644
--- a/components/strings/components_strings_mn.xtb
+++ b/components/strings/components_strings_mn.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">Маягтын өөрчлөлтийг хадгалахгүй. Та үргэлжлүүлэх үү?</translation>
 <translation id="4477350412780666475">Дараагийн бичлэг</translation>
 <translation id="4482953324121162758">Энэ сайтыг орчуулахгүй.</translation>
-<translation id="4486757593530038591">Асаалттай үед сайтууд нь зарыг хувийн болгохын тулд өөр өөр сайт дээрх таны хөтчийн үйл ажиллагааг ашиглах боломжгүй байна. Зарим сайтын онцлогууд ажиллахгүй байж болзошгүй.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Эдгээр онцлогийг өгөгдмөл тохиргоогоор идэвхгүй болгосон. Энэ нь Chrome-н цаашдын хувилбарууд дээр боломжгүй байна.</translation>
 <translation id="4493480324863638523">Энэ URL хүчингүй байна. Энэ нь http://example.com эсвэл https://example.com зэрэг стандарт схемтэй URL байх ёстой.</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 498c9fe..d7c1d62 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -814,7 +814,6 @@
 <translation id="4466881336512663640">फॉर्म बदल गमावतील. तुम्हाला नक्की पुढे सुरू ठेवायचे आहे?</translation>
 <translation id="4477350412780666475">पुढील ट्रॅक</translation>
 <translation id="4482953324121162758">या साइटचे भाषांतर केले जाणार नाही.</translation>
-<translation id="4486757593530038591">सुरू असताना, जाहिराती पर्सनलाइझ करण्यासाठी साइट तुमची ब्राउझिंग ॲक्टिव्हिटी वेगवेगळ्या साइटवर वापरू शकत नाहीत. काही साइटवरील वैशिष्ट्यांमध्ये खंड पडू शकतो.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ही वैशिष्ट्ये बाय डीफॉल्ट बंद केली आहेत. ती Chrome च्या भविष्यातील आवृत्त्यांमध्ये उपलब्ध नसतील.</translation>
 <translation id="4493480324863638523">चुकीची URL. URL चा एक ठरावीक फॉरमॅट असणे आवश्यक आहे, उदा. http://example.com or https://example.com.</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index d819008..bb2b7ec 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -600,6 +600,7 @@
 <translation id="3587738293690942763">Tengah</translation>
 <translation id="3592413004129370115">Itali (Sampul Surat)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Aplikasi disekat oleh pentadbir anda</translation>
 <translation id="3608932978122581043">Orientasi suapan</translation>
 <translation id="3614103345592970299">Saiz 2</translation>
 <translation id="361438452008624280">Masukan senarai "<ph name="LANGUAGE_ID" />": Bahasa tidak diketahui atau bahasa tidak disokong.</translation>
@@ -816,7 +817,6 @@
 <translation id="4466881336512663640">Perubahan borang akan hilang. Adakah anda pasti mahu meneruskan?</translation>
 <translation id="4477350412780666475">Lagu Seterusnya</translation>
 <translation id="4482953324121162758">Tapak ini tidak akan diterjemah.</translation>
-<translation id="4486757593530038591">Apabila kuki dihidupkan, tapak tidak boleh menggunakan aktiviti penyemakan imbas anda di tapak lain untuk memperibadikan iklan. Ciri di sesetengah tapak mungkin rosak.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ciri ini dilumpuhkan secara lalai. Ciri ini tidak akan tersedia pada versi Chrome akan datang.</translation>
 <translation id="4493480324863638523">URL tidak sah. Mestilah URL dengan skema standard, mis http://example.com atau https://example.com.</translation>
@@ -856,6 +856,7 @@
 <translation id="467662567472608290">Pelayan ini tidak dapat membuktikan bahawa domainnya ialah <ph name="DOMAIN" />; sijil keselamatannya mengandungi ralat. Ini mungkin disebabkan oleh kesilapan konfigurasi atau penyerang yang memintas sambungan anda.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> ingin menjawab acara kebolehaksesan</translation>
 <translation id="467809019005607715">Slaid Google</translation>
+<translation id="4680804919228900307">Anda baru sahaja memasukkan kata laluan pada tapak yang menipu. Chromium mengesyorkan penyemakan kata laluan anda yang disimpan untuk <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> dan tapak lain yang menggunakan kata laluan ini sekarang.</translation>
 <translation id="4690462567478992370">Berhenti menggunakan sijil tidak sah</translation>
 <translation id="4691835149146451662">Seni Bina-A (Sampul Surat)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1021,8 +1022,10 @@
 <translation id="5329858041417644019">Penyemak imbas anda tidak diurus</translation>
 <translation id="5332219387342487447">Kaedah Penghantaran</translation>
 <translation id="5334013548165032829">Log sistem terperinci</translation>
+<translation id="5340250774223869109">Aplikasi disekat</translation>
 <translation id="534295439873310000">Peranti NFC</translation>
 <translation id="5344579389779391559">Halaman ini mungkin cuba mengenakan bayaran kepada anda</translation>
+<translation id="5346336634660260557">Imbas kandungan papan keratan serta fail yang anda muat turun atau muat naik dalam Chrome.</translation>
 <translation id="5355557959165512791">Anda tidak boleh melawati <ph name="SITE" /> sekarang kerana sijil tapak ini telah ditarik balik. Ralat dan serangan rangkaian biasanya bersifat sementara. Oleh sebab itu, halaman ini mungkin akan berfungsi semula kemudian.</translation>
 <translation id="536296301121032821">Gagal menyimpan tetapan dasar</translation>
 <translation id="5371425731340848620">Kemas kini kad</translation>
@@ -1433,6 +1436,7 @@
 <translation id="7219179957768738017">Sambungan menggunakan <ph name="SSL_VERSION" />.</translation>
 <translation id="7220786058474068424">Memproses</translation>
 <translation id="7221855153210829124">Tunjukkan pemberitahuan</translation>
+<translation id="7229659723041939809">Anda baru sahaja memasukkan kata laluan pada tapak yang menipu. Chrome mengesyorkan penyemakan kata laluan anda yang disimpan untuk <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> dan tapak lain yang menggunakan kata laluan ini sekarang.</translation>
 <translation id="7233592378249864828">Cetak helaian pengesahan</translation>
 <translation id="7238585580608191973">Cap jari SHA-256</translation>
 <translation id="7240120331469437312">Nama Alternatif Subjek Sijil</translation>
@@ -1500,6 +1504,7 @@
 <translation id="7485870689360869515">Tiada data dijumpai.</translation>
 <translation id="7495290002932347110">Pelanggaran data pada tapak atau apl mendedahkan kata laluan anda. Chrome mengesyorkan anda menyemak kata laluan yang disimpan dan menukar kata laluan anda pada <ph name="ORIGIN" /> sekarang.</translation>
 <translation id="7498234416455752244">Teruskan mengedit</translation>
+<translation id="7503664977220660814">Anda baru sahaja memasukkan kata laluan pada tapak yang menipu. Chromium mengesyorkan penyemakan kata laluan anda yang disimpan untuk <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dan tapak lain yang menggunakan kata laluan ini sekarang.</translation>
 <translation id="7508255263130623398">Id peranti yang dikembalikan kosong atau tidak sepadan dengan id peranti semasa</translation>
 <translation id="7508870219247277067">Hijau Avokado</translation>
 <translation id="7511955381719512146">Wi-Fi yang anda gunakan mungkin memerlukan anda untuk melawat <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
@@ -1575,6 +1580,7 @@
 <translation id="7763386264682878361">Penghurai Manifes Bayaran</translation>
 <translation id="7764225426217299476">Tambahkan alamat</translation>
 <translation id="7766518757692125295">Skirt</translation>
+<translation id="7767271804335921384">Aplikasi ini telah disekat oleh pentadbir anda</translation>
 <translation id="7770259615151589601">Panjang-Ditetapkan</translation>
 <translation id="7773005668374414287">Susunan sama menghadap ke atas</translation>
 <translation id="777702478322588152">Wilayah</translation>
@@ -1595,6 +1601,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">Tinggalkan tapak?</translation>
 <translation id="7865448901209910068">Kelajuan terbaik</translation>
+<translation id="7874263914261512992">Anda baru sahaja memasukkan kata laluan pada tapak yang menipu. Chrome mengesyorkan penyemakan kata laluan anda yang disimpan untuk <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dan tapak lain yang menggunakan kata laluan ini sekarang.</translation>
 <translation id="7878562273885520351">Kata laluan anda mungkin terjejas</translation>
 <translation id="7882421473871500483">Coklat</translation>
 <translation id="7887683347370398519">Semak CVC anda dan cuba lagi</translation>
@@ -1731,6 +1738,7 @@
 <translation id="8474910779563686872">Tunjukkan butiran pembangun</translation>
 <translation id="8479754468255770962">Kokot bawah sebelah kiri</translation>
 <translation id="8483780878231876732">Log masuk ke Chrome untuk menggunakan kad daripada Akaun Google anda</translation>
+<translation id="8485393050551136813">Anda baru sahaja memasukkan kata laluan pada tapak yang menipu. Chromium mengesyorkan penyemakan kata laluan anda yang disimpan untuk <ph name="WEBSITE_1" /> dan tapak lain yang menggunakan kata laluan ini sekarang.</translation>
 <translation id="8488350697529856933">Diguna pakai untuk</translation>
 <translation id="8490137692873530638">Petak 10</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> mengambil masa terlalu lama untuk bertindak balas.</translation>
@@ -1781,6 +1789,7 @@
 <translation id="87601671197631245">Tapak ini menggunakan konfigurasi keselamatan yang sudah lapuk, yang mungkin mendedahkan maklumat anda (contohnya, kata laluan, mesej atau nombor kad kredit) apabila dihantar kepada tapak ini.</translation>
 <translation id="8761567432415473239">Penyemakan Imbas Selamat Google baru-baru ini <ph name="BEGIN_LINK" />menemui atur cara berbahaya<ph name="END_LINK" /> pada <ph name="SITE" />.</translation>
 <translation id="8763927697961133303">Peranti USB</translation>
+<translation id="8774457497170244317">Anda baru sahaja memasukkan kata laluan pada tapak yang menipu. Chrome mengesyorkan penyemakan kata laluan anda yang disimpan untuk <ph name="WEBSITE_1" /> dan tapak lain yang menggunakan kata laluan ini sekarang.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Buat semula pemadaman</translation>
 <translation id="8792621596287649091">Anda boleh kehilangan akses kepada akaun <ph name="ORG_NAME" /> anda atau mengalami kecurian identiti. Chromium mengesyorkan supaya kata laluan anda ditukar sekarang.</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb
index 44de967c..34c008fd 100644
--- a/components/strings/components_strings_my.xtb
+++ b/components/strings/components_strings_my.xtb
@@ -600,6 +600,7 @@
 <translation id="3587738293690942763">အလယ်အလတ်</translation>
 <translation id="3592413004129370115">အီတလီ (စာအိတ်)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />၊ <ph name="DOMAIN" />၊ <ph name="TIME" /></translation>
+<translation id="3603507503523709">သင့်စီမံခန့်ခွဲသူက ပိတ်ထားသည့် အပလီကေးရှင်</translation>
 <translation id="3608932978122581043">ဖိဒ်အနေအထား</translation>
 <translation id="3614103345592970299">အရွယ်အစား ၂</translation>
 <translation id="361438452008624280">"<ph name="LANGUAGE_ID" />" စာရင်းထည့်သွင်းမှု- အမျိုးအမည်မသိ သို့မဟုတ် ပံ့ပိုးမထားသော ဘာသာစကား။</translation>
@@ -815,7 +816,6 @@
 <translation id="4466881336512663640">ပုံစံ အပြောင်းအလဲများကို သိမ်းမည်မဟုတ်ပါ။ ရှေ့ဆက်လိုသည်မှာ သေချာသလား။</translation>
 <translation id="4477350412780666475">နောက်တစ်ပုဒ်</translation>
 <translation id="4482953324121162758">ဤဝဘ်ဆိုက်ကို ဘာသာပြန်မည် မဟုတ်ပါ။</translation>
-<translation id="4486757593530038591">ဖွင့်ထားလျှင် ဝဘ်ဆိုက်များသည် ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့် ပြုလုပ်ရန်အတွက် သင့်ကြည့်ရှုခြင်းများကို မတူညီသည့်ဝဘ်ဆိုက်များအကြား အသုံးပြုနိုင်တော့မည် မဟုတ်ပါ။ အချို့ဝဘ်ဆိုက်များပေါ်ရှိ ဝန်ဆောင်မှုများ ရပ်သွားနိုင်ပါသည်။</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">မူရင်းသတ်မှတ်ချက်အနေနှင့် ဤဝန်ဆောင်မှုများကို ပိတ်ထားပါသည်။ ၎င်းတို့သည် Chrome ၏ လာမည့်ဗားရှင်းများတွင် ပါဝင်တော့မည်မဟုတ်ပါ။</translation>
 <translation id="4493480324863638523">URL မမှန်ကန်ပါ။ URL တွင် စံစနစ်တစ်ခု ရှိရမည်၊ ဥပမာ e.g http://example.com သို့မဟုတ် https://example.com။</translation>
@@ -855,6 +855,7 @@
 <translation id="467662567472608290">ဒီဆာဗာက <ph name="DOMAIN" /> ဖြစ်တာကို သက်သေထူ မပြနိုင်ခဲ့ပါ၊ ၎င်း၏ လုံခြုံရေး လက်မှတ်ထဲမှာ အမှားများ ပါဝင်နေသည်။ ဖွဲ့စည်းစီစဉ်မှု အမှားကြောင့် သို့မဟုတ် တိုက်ခိုက်လိုသူက သင်၏ ချိတ်ဆက်မှုကို ကြားဖြတ်ယူနေ၍ ထိုသို့ ဖြစ်လာနိုင်ခဲ့ပါသည်။</translation>
 <translation id="4677585247300749148"><ph name="URL" /> သည် အများသုံးစွဲနိုင်မှု ဖြစ်ရပ်များကို တုံ့ပြန်လိုပါသည်</translation>
 <translation id="467809019005607715">Google Slides</translation>
+<translation id="4680804919228900307">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ ယခု ဤစကားဝှက်ကို သင်အသုံးပြုထားသည့် <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" />၊ <ph name="WEBSITE_3" /> နှင့် အခြားသောဝဘ်ဆိုက်များအတွက် သင်သိမ်းဆည်းထားသည့် စကားဝှက်များကို စစ်ဆေးရန် Chromium က အကြံပြုသည်။</translation>
 <translation id="4690462567478992370">မမှန်ကန်သည့် လက်မှတ် သုံးမှုကို ရပ်လိုက်ပါ</translation>
 <translation id="4691835149146451662">Architecture-A (စာအိတ်)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1020,8 +1021,10 @@
 <translation id="5329858041417644019">သင်၏ ဘရောင်ဇာကို စီမံခန့်ခွဲမထားပါ</translation>
 <translation id="5332219387342487447">ပစ္စည်းပို့ရန် နည်းလမ်း</translation>
 <translation id="5334013548165032829">အသေးစိတ် စနစ် မှတ်တမ်းများ</translation>
+<translation id="5340250774223869109">အပလီကေးရှင်းကို ပိတ်ထားသည်</translation>
 <translation id="534295439873310000">NFC စက်များ</translation>
 <translation id="5344579389779391559">ဤစာမျက်နှာသည် သင့်ထံမှ ငွေကောက်ခံနိုင်သည်</translation>
+<translation id="5346336634660260557">Chrome တွင် သင်ဒေါင်းလုဒ် သို့မဟုတ် အပ်လုဒ်လုပ်ထားသော ဖိုင်းများအပြင် ကလစ်ဘုတ်ရှိ အကြောင်းအရာများကို စကန်ဖတ်သည်။</translation>
 <translation id="5355557959165512791"><ph name="SITE" /> ၏ အသိအမှတ်ပြုလက်မှတ်ကို ရုပ်သိမ်းထားသောကြောင့် ၎င်းအား လောလောဆယ် ဖွင့်၍မရပါ။ ကွန်ရက်အမှားအယွင်းများနှင့် တိုက်ခိုက်မှုများမှာ ပုံမှန်အားဖြင့် ခဏတာသာ ဖြစ်သည့်အတွက် ဤစာမျက်နှာကို နောက်ပိုင်းတွင် ပြန်ဖွင့်၍ရနိုင်ပါသည်။</translation>
 <translation id="536296301121032821">ပေါ်လစီ ကြိုတင်ချိန်ညှိချက်များအား သိုလှောင်ခြင်း မအောင်မြင်ပါ</translation>
 <translation id="5371425731340848620">ကတ်ကို အပ်ဒိတ်လုပ်ပါ</translation>
@@ -1431,6 +1434,7 @@
 <translation id="7219179957768738017">ချိတ်ဆက်မှုက <ph name="SSL_VERSION" />ကို သုံးသည်။</translation>
 <translation id="7220786058474068424">ဆောင်ရွက်နေသည်</translation>
 <translation id="7221855153210829124">သတိပေးချက်များ ပြရန်</translation>
+<translation id="7229659723041939809">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ ယခု ဤစကားဝှက်ကို သင်အသုံးပြုထားသည့် <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" />၊ <ph name="WEBSITE_3" /> နှင့် အခြားသောဝဘ်ဆိုက်များအတွက် သင်သိမ်းဆည်းထားသည့် စကားဝှက်များကို စစ်ဆေးရန် Chrome က အကြံပြုသည်။</translation>
 <translation id="7233592378249864828">အတည်ပြု စာမျက်နှာကို ပုံနှိပ်ရန်</translation>
 <translation id="7238585580608191973">SHA-256 လက်ဗွေ</translation>
 <translation id="7240120331469437312">လက်မှတ် အကြောင်းအရာ အစားထိုးရေး အမည်</translation>
@@ -1499,6 +1503,7 @@
 <translation id="7485870689360869515">ဒေတာ မတွေ့ရပါ။</translation>
 <translation id="7495290002932347110">ဝဘ်ဆိုက် သို့မဟုတ် အက်ပ်ရှိ ဒေတာပေါက်ကြားမှုက သင့်စကားဝှက်ကို ဖော်ထုတ်ခဲ့ပါသည်။ သိမ်းထားသည့် သင့်စကားဝှက်များကို စစ်ဆေးပြီး <ph name="ORIGIN" /> တွင် သင်၏စကားဝှက်ကို ယခုပြောင်းရန် Chrome က အကြံပြုပါသည်။</translation>
 <translation id="7498234416455752244">ဆက်လက်တည်းဖြတ်ရန်</translation>
+<translation id="7503664977220660814">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ ယခု ဤစကားဝှက်ကို သင်အသုံးပြုထားသည့် <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" /> နှင့် အခြားသောဝဘ်ဆိုက်များအတွက် သင်သိမ်းဆည်းထားသည့် စကားဝှက်များကို စစ်ဆေးရန် Chromium က အကြံပြုသည်။</translation>
 <translation id="7508255263130623398">ပစ္စည်းပြန်ပို့နိုင်သည့် မူဝါဒဆိုင်ရာကိရိယာအိုင်ဒီသည် ကွက်လပ်ဖြစ်နေပါသည် သို့မဟုတ် လက်ရှိကိရိယာအိုင်ဒီနှင့် ကိုက်ညီမှုမရှိပါ</translation>
 <translation id="7508870219247277067">ထောပတ်သီးစိမ်း</translation>
 <translation id="7511955381719512146">သင်အသုံးပြုနေသော Wi-Fi သည် <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />သို့ သင်သွားရောက်ကြည့်ရှုရန် လိုအပ်စေလိမ့်မည်။</translation>
@@ -1574,6 +1579,7 @@
 <translation id="7763386264682878361">ငွေပေးချေမှု မန်နီးဖက်စ်ပါဆာ</translation>
 <translation id="7764225426217299476">လိပ်စာများ ထည့်သွင်းပါ</translation>
 <translation id="7766518757692125295">အနားသတ်</translation>
+<translation id="7767271804335921384">အပလီကေးရှင်းကို သင့်စမံခန့်ခွဲသူက ပိတ်ထားသည်</translation>
 <translation id="7770259615151589601">သတ်မှတ်ထားသော အရှည်</translation>
 <translation id="7773005668374414287">တူညီသည့်အစဉ်ဖြင့် အပေါ်လှန်ထားရန်</translation>
 <translation id="777702478322588152">နယ်​မြေ</translation>
@@ -1594,6 +1600,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">ဝဘ်ဆိုက်မှ ထွက်လိုပါသလား။</translation>
 <translation id="7865448901209910068">အကောင်းဆုံးမြန်နှုန်း</translation>
+<translation id="7874263914261512992">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ ယခု ဤစကားဝှက်ကို သင်အသုံးပြုထားသည့် <ph name="WEBSITE_1" />၊ <ph name="WEBSITE_2" /> နှင့် အခြားသောဝဘ်ဆိုက်များအတွက် သင်သိမ်းဆည်းထားသည့် စကားဝှက်များကို စစ်ဆေးရန် Chrome က အကြံပြုသည်။</translation>
 <translation id="7878562273885520351">သင့်စကားဝှက် အခိုးခံထားရနိုင်သည်</translation>
 <translation id="7882421473871500483">အညို</translation>
 <translation id="7887683347370398519">သင့် CVC အားစစ်ဆေးပြီး ထပ်မံကြိုးစားပါ</translation>
@@ -1730,6 +1737,7 @@
 <translation id="8474910779563686872">ဆော့ဖ်ဝဲအင်ဂျင်နီယာ အသေးစိတ် ပြရန်</translation>
 <translation id="8479754468255770962">ဘယ်ဘက်အောက်ခြေတွင် ချုပ်စက်ဖြင့် ချုပ်ရန်</translation>
 <translation id="8483780878231876732">သင့် Google အကောင့်မှ ကဒ်များကို အသုံးပြုနိုင်ရန် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ</translation>
+<translation id="8485393050551136813">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ ယခု ဤစကားဝှက်ကို သင်အသုံးပြုထားသည့် <ph name="WEBSITE_1" /> နှင့် အခြားသောဝဘ်ဆိုက်များအတွက် သင်သိမ်းဆည်းထားသည့် စကားဝှက်များကို စစ်ဆေးရန် Chromium က အကြံပြုသည်။</translation>
 <translation id="8488350697529856933">သက်ဆိုင်</translation>
 <translation id="8490137692873530638">စီထည့်သည့်ပုံး ၁၀</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> တုံ့ပြန်မှု အလွန်ကြာပါသည်။</translation>
@@ -1779,6 +1787,7 @@
 <translation id="87601671197631245">ဤဝဘ်ဆိုက်သည် လုံခြုံရေး စီစဉ်သတ်မှတ်ချက်အဟောင်းကို အသုံးပြုသည့်အတွက် သင်၏အချက်အလက်များ (ဥပမာ စကားဝှက်များ၊ မက်ဆေ့ဂျ်များ သို့မဟုတ် ခရက်ဒစ်ကတ်များ) ကို ဤဝဘ်ဆိုက်သို့ပို့သည့်အခါ ပေါက်ကြားသွားနိုင်ပါသည်။</translation>
 <translation id="8761567432415473239">Google ဘရောင်ဇာ လုံခြုံရေးက မကြာမီတုန်းက <ph name="BEGIN_LINK" />အန္တရာယ်ရှိသည့် ပရိုဂရမ်များကို <ph name="SITE" /> မှာ ရှာတွေခဲ့သည်<ph name="END_LINK" /></translation>
 <translation id="8763927697961133303">USB ကိရိယာ</translation>
+<translation id="8774457497170244317">လှည့်ဖြားတတ်သော ဝဘ်ဆိုက်တစ်ခုတွင် သင့်စကားဝှက်ကို ထည့်လိုက်ပါသည်။ ယခု ဤစကားဝှက်ကို သင်အသုံးပြုထားသည့် <ph name="WEBSITE_1" /> နှင့် အခြားသောဝဘ်ဆိုက်များအတွက် သင်သိမ်းဆည်းထားသည့် စကားဝှက်များကို စစ်ဆေးရန် Chrome က အကြံပြုသည်။</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;ဖျက်ရန်ကို ပြန်လုပ်ရန်</translation>
 <translation id="8792621596287649091">သင်သည် သင့် <ph name="ORG_NAME" /> အကောင့်ကို အသုံးပြုခွင့် ဆုံးရှုံးနိုင်သည် သို့မဟုတ် အထောက်အထား အခိုးခံရနိုင်သည်။ သင့်စကားဝှက်ကို ယခုပင်ပြောင်းလဲရန် Chromium က အကြံပြုပါသည်။</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb
index 894cacf..d65eacc0 100644
--- a/components/strings/components_strings_ne.xtb
+++ b/components/strings/components_strings_ne.xtb
@@ -808,7 +808,6 @@
 <translation id="4466881336512663640">फारममा गरिएका परिवर्तनहरू हराउने छन्। तपाईंले जारी राख्न खोज्नुभएकै हो?</translation>
 <translation id="4477350412780666475">अर्को ट्र्याक</translation>
 <translation id="4482953324121162758">यो साइटको अनुवाद गरिने छैन।</translation>
-<translation id="4486757593530038591">यो सुविधा सक्रिय हुँदा साइटहरूले तपाईंको क्रियाकलापअनुसार विज्ञापन देखाउने प्रयोजनका लागि विभिन्न साइटमा तपाईंको ब्राउजिङसम्बन्धी क्रियाकलाप प्रयोग गर्न सक्दैनन्। तर कतिपय साइटका सुविधाहरूले काम नगर्न सक्छन्।</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">यी सुविधाहरू पूर्वनिर्धारित रूपमा असक्षम पारिएका छन्। यिनीहरू Chrome का भावी संस्करणमा उपलब्ध हुने छैनन्।</translation>
 <translation id="4493480324863638523">अमान्य URL। अनिवार्य रूपमा मानक योजनाबमोजिमको URL हुनु पर्छ, जस्तै, http://example.com वा https://example.com।</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 599dd80..7ecc60ac 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -804,7 +804,6 @@
 <translation id="4466881336512663640">Hiermee gaan formulierwijzigingen verloren. Weet je zeker dat je wilt doorgaan?</translation>
 <translation id="4477350412780666475">Volgend nummer</translation>
 <translation id="4482953324121162758">Deze site wordt niet vertaald.</translation>
-<translation id="4486757593530038591">Als deze optie is ingeschakeld, kunnen sites je browse-activiteit op verschillende sites niet gebruiken om advertenties te personaliseren. Functies op bepaalde sites werken mogelijk niet meer.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Deze functies zijn standaard uitgeschakeld. Ze zijn niet meer beschikbaar in toekomstige versies van Chrome.</translation>
 <translation id="4493480324863638523">Ongeldige URL. Dit moet een URL met een standaardschema zijn, zoals http://example.com of https://example.com.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index fde837ba..1cc606c 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Endringer i skjemaet går tapt. Er du sikker på at du vil fortsette?</translation>
 <translation id="4477350412780666475">Neste spor</translation>
 <translation id="4482953324121162758">Dette nettstedet oversettes ikke.</translation>
-<translation id="4486757593530038591">Når dette er slått på, kan ikke nettsteder bruke nettleseraktiviteten din på andre nettsteder for å vise deg personlig tilpassede annonser. Det kan hende at funksjoner på enkelte nettsteder slutter å fungere</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Som standard er disse funksjonene avslått. De kommer ikke til å være tilgjengelige i fremtidige versjoner av Chrome.</translation>
 <translation id="4493480324863638523">Ugyldig nettadresse. Dette må være en nettadresse på standardformat, f.eks. http://example.com eller https://example.com.</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb
index 8925be7..47f8dbf 100644
--- a/components/strings/components_strings_or.xtb
+++ b/components/strings/components_strings_or.xtb
@@ -806,7 +806,6 @@
 <translation id="4466881336512663640">ଫର୍ମରେ ହେଉଥିବା ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ରହିବ ନାହିଁ। ଆପଣ କ’ଣ ନିଶ୍ଚିତ ଯେ ଆପଣ ଜାରି ରଖିବାକୁ ଚାହୁଁଛନ୍ତି?</translation>
 <translation id="4477350412780666475">ପରବର୍ତ୍ତୀ ଟ୍ରାକ୍</translation>
 <translation id="4482953324121162758">ଏହି ସାଇଟ୍‌କୁ ଅନୁବାଦ କରାଯିବ ନାହିଁ।</translation>
-<translation id="4486757593530038591">ଚାଲୁ ହେଲେ, ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ବ୍ୟକ୍ତିଗତକୃତ କରିବା ପାଇଁ ବିଭିନ୍ନ ସାଇଟରେ ଆପଣଙ୍କ ବ୍ରାଉଜିଂ କାର୍ଯ୍ୟକଳାପକୁ ସାଇଟଗୁଡ଼ିକ ବ୍ୟବହାର କରିପାରିବ ନାହିଁ। କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ।</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ଏହି ଫିଚର୍‍ଗୁଡ଼ିକ ଡିଫଲ୍ଟ ଭାବେ ଅକ୍ଷମ କରାଯାଇଛି। ସେଗୁଡ଼ିକ Chromiumର ଆଗାମୀ ସଂସ୍କରଣଗୁଡ଼ିକରେ ଉପଲବ୍ଧ ହେବ ନାହିଁ।</translation>
 <translation id="4493480324863638523">ଅବୈଧ URL। URL, ଏକ ମାନାଙ୍କ ସ୍କିମ୍‍ର ହେବା ଉଚିତ୍‍, ଉ.ଦା http://example.com କିମ୍ବା https://example.com.</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb
index 0f9a3928..bce5fc53 100644
--- a/components/strings/components_strings_pa.xtb
+++ b/components/strings/components_strings_pa.xtb
@@ -811,7 +811,6 @@
 <translation id="4466881336512663640">ਫ਼ਾਰਮ ਤਬਦੀਲੀਆਂ ਗੁਆਚ ਜਾਣਗੀਆਂ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਜਾਰੀ ਰੱਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
 <translation id="4477350412780666475">ਅਗਲਾ ਟਰੈਕ</translation>
 <translation id="4482953324121162758">ਇਸ ਸਾਈਟ ਦਾ ਅਨੁਵਾਦ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।</translation>
-<translation id="4486757593530038591">ਚਾਲੂ ਹੋਣ 'ਤੇ, ਸਾਈਟਾਂ ਵੱਖ-ਵੱਖ ਸਾਈਟਾਂ ਵਿਚਲੀ ਤੁਹਾਡੀ ਬ੍ਰਾਊਜ਼ਿੰਗ ਸਰਗਰਮੀ ਦੀ ਵਰਤੋਂ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਲਈ ਨਹੀਂ ਕਰ ਸਕਦੀਆਂ। ਸ਼ਾਇਦ ਕੁਝ ਸਾਈਟਾਂ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ।</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ਇਹ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਤੌਰ 'ਤੇ ਬੰਦ ਹਨ। ਇਹ Chrome ਦੇ ਭਵਿੱਖੀ ਵਰਜਨਾਂ ਵਿੱਚ ਉਪਲਬਧ ਨਹੀਂ ਹੋਣਗੀਆਂ।</translation>
 <translation id="4493480324863638523">ਅਵੈਧ URL ਕਿਸੇ ਮਿਆਰੀ ਸਕੀਮ ਵਾਲਾ URL ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈੇ, ਜਿਵੇਂ ਕਿ http://example.com ਜਾਂ https://example.com</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 7e363db..7dea4d7 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -600,6 +600,7 @@
 <translation id="3587738293690942763">Średni</translation>
 <translation id="3592413004129370115">Italian (koperta)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Aplikacja zablokowana przez administratora</translation>
 <translation id="3608932978122581043">Orientacja podajnika</translation>
 <translation id="3614103345592970299">Rozmiar 2</translation>
 <translation id="361438452008624280">Pozycja listy „<ph name="LANGUAGE_ID" />”: nieznany lub nieobsługiwany język.</translation>
@@ -815,7 +816,6 @@
 <translation id="4466881336512663640">Zmiany w formularzu zostaną utracone. Na pewno chcesz kontynuować?</translation>
 <translation id="4477350412780666475">Następny utwór</translation>
 <translation id="4482953324121162758">Ta strona nie będzie tłumaczona.</translation>
-<translation id="4486757593530038591">Gdy to ustawienie jest włączone, witryny nie mogą wykorzystywać Twojej aktywności związanej z przeglądaniem różnych stron do personalizowania reklam. Funkcje niektórych witryn mogą nie działać prawidłowo.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Te funkcje są domyślnie wyłączone. Nie będą dostępne w kolejnych wersjach Chrome.</translation>
 <translation id="4493480324863638523">Nieprawidłowy URL. URL musi być zgodny ze schematem standardowym, np. http://example.com lub https://example.com</translation>
@@ -855,6 +855,7 @@
 <translation id="467662567472608290">Ten serwer nie mógł udowodnić, że należy do <ph name="DOMAIN" />. Jego certyfikat bezpieczeństwa ma błędy. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> chce odpowiadać na zdarzenia dotyczące ułatwień dostępu</translation>
 <translation id="467809019005607715">Prezentacje Google</translation>
+<translation id="4680804919228900307">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca, by sprawdzić zapisane hasła do witryn <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> i innych stron, na których używasz tego hasła.</translation>
 <translation id="4690462567478992370">Przestań używać nieprawidłowego certyfikatu</translation>
 <translation id="4691835149146451662">Architecture-A (koperta)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1020,8 +1021,10 @@
 <translation id="5329858041417644019">Twoja przeglądarka nie jest zarządzana</translation>
 <translation id="5332219387342487447">Metoda wysyłki</translation>
 <translation id="5334013548165032829">Szczegółowe dzienniki systemowe</translation>
+<translation id="5340250774223869109">Aplikacja jest zablokowana</translation>
 <translation id="534295439873310000">Urządzenia z funkcją NFC</translation>
 <translation id="5344579389779391559">Ta strona może próbować obciążyć Cię płatnością</translation>
+<translation id="5346336634660260557">Skanowanie zawartości schowka oraz plików pobieranych i wysyłanych w Chrome.</translation>
 <translation id="5355557959165512791">Nie możesz teraz otworzyć strony <ph name="SITE" />, bo jej certyfikat został unieważniony. Błędy sieci i ataki są zazwyczaj przejściowe, więc prawdopodobnie strona będzie wkrótce działać.</translation>
 <translation id="536296301121032821">Zapisanie ustawień zasady nie powiodło się</translation>
 <translation id="5371425731340848620">Zaktualizuj dane karty</translation>
@@ -1432,6 +1435,7 @@
 <translation id="7219179957768738017">Połączenie z szyfrowaniem <ph name="SSL_VERSION" />.</translation>
 <translation id="7220786058474068424">Przetwarzanie</translation>
 <translation id="7221855153210829124">Pokazywanie powiadomień</translation>
+<translation id="7229659723041939809">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca, by sprawdzić zapisane hasła do witryn <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> i innych stron, na których używasz tego hasła.</translation>
 <translation id="7233592378249864828">Drukuj arkusz potwierdzenia</translation>
 <translation id="7238585580608191973">Odcisk cyfrowy SHA-256</translation>
 <translation id="7240120331469437312">Alternatywna nazwa podmiotu certyfikatu</translation>
@@ -1499,6 +1503,7 @@
 <translation id="7485870689360869515">Nie znaleziono danych.</translation>
 <translation id="7495290002932347110">Naruszenie bezpieczeństwa danych w jednej z witryn lub aplikacji spowodowało ujawnienie Twojego hasła. Chrome zaleca natychmiastowe sprawdzenie zapisanych haseł i zmianę hasła na <ph name="ORIGIN" />.</translation>
 <translation id="7498234416455752244">Edytuj dalej</translation>
+<translation id="7503664977220660814">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca, by sprawdzić zapisane hasła do witryn <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> oraz innych stron, na których używasz tego hasła.</translation>
 <translation id="7508255263130623398">Zwrócony identyfikator urządzenia dla zasad jest pusty lub nie pasuje do bieżącego identyfikatora urządzenia</translation>
 <translation id="7508870219247277067">Zielony awokado</translation>
 <translation id="7511955381719512146">Sieć Wi-Fi, której używasz, może wymagać otwarcia strony <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
@@ -1574,6 +1579,7 @@
 <translation id="7763386264682878361">Parser pliku manifestu dla płatności</translation>
 <translation id="7764225426217299476">Dodaj adres</translation>
 <translation id="7766518757692125295">Fartuch</translation>
+<translation id="7767271804335921384">Aplikacja została zablokowana przez administratora</translation>
 <translation id="7770259615151589601">Designated-Long</translation>
 <translation id="7773005668374414287">Ta sama kolejność, strona do drukowania skierowana w górę</translation>
 <translation id="777702478322588152">Prefektura</translation>
@@ -1594,6 +1600,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" />: <ph name="FORMATTED_TOTAL_AMOUNT" /> <ph name="CURRENCY_CODE" /></translation>
 <translation id="7862185352068345852">Opuścić stronę?</translation>
 <translation id="7865448901209910068">Optymalna szybkość</translation>
+<translation id="7874263914261512992">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca, by sprawdzić zapisane hasła do witryn <ph name="WEBSITE_1" /> i <ph name="WEBSITE_2" /> oraz innych stron, na których używasz tego hasła.</translation>
 <translation id="7878562273885520351">Ktoś mógł poznać Twoje hasło</translation>
 <translation id="7882421473871500483">Brązowy</translation>
 <translation id="7887683347370398519">Sprawdź kod CVC i spróbuj ponownie</translation>
@@ -1730,6 +1737,7 @@
 <translation id="8474910779563686872">Pokaż informacje dla deweloperów</translation>
 <translation id="8479754468255770962">Zszywka w lewym dolnym rogu</translation>
 <translation id="8483780878231876732">Aby użyć kart z konta Google, zaloguj się w Chrome</translation>
+<translation id="8485393050551136813">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chromium zaleca, by sprawdzić zapisane hasła do witryny <ph name="WEBSITE_1" /> i innych stron, na których używasz tego hasła.</translation>
 <translation id="8488350697529856933">Dotyczy</translation>
 <translation id="8490137692873530638">Układarka 10</translation>
 <translation id="8498891568109133222">Serwer <ph name="HOST_NAME" /> potrzebował zbyt wiele czasu na odpowiedź.</translation>
@@ -1779,6 +1787,7 @@
 <translation id="87601671197631245">Ta strona używa nieaktualnej konfiguracji zabezpieczeń, co oznacza, że Twoje dane (np. hasła, wiadomości i numery kart kredytowych) mogą być zagrożone podczas przesyłania na tę stronę.</translation>
 <translation id="8761567432415473239">Funkcja Bezpieczne przeglądanie Google ostatnio <ph name="BEGIN_LINK" />znalazła szkodliwe<ph name="END_LINK" /> programy na <ph name="SITE" />.</translation>
 <translation id="8763927697961133303">Urządzenie USB</translation>
+<translation id="8774457497170244317">Przed chwilą wpisano hasło na stronie wprowadzającej w błąd. Chrome zaleca, by sprawdzić zapisane hasła do witryny <ph name="WEBSITE_1" /> i innych stron, na których używasz tego hasła.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Ponów usunięcie</translation>
 <translation id="8792621596287649091">Możesz stracić dostęp do swojego konta <ph name="ORG_NAME" /> lub paść ofiarą kradzieży tożsamości. Chromium zaleca natychmiastową zmianę hasła.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index f7daa392..3bc484d4 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -594,6 +594,7 @@
 <translation id="3587738293690942763">Meio</translation>
 <translation id="3592413004129370115">Italian (Envelope)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Aplicativo bloqueado pelo administrador</translation>
 <translation id="3608932978122581043">Fornecer orientação</translation>
 <translation id="3614103345592970299">Tamanho 2</translation>
 <translation id="361438452008624280">Entrada "<ph name="LANGUAGE_ID" />": idioma desconhecido ou não compatível.</translation>
@@ -809,7 +810,6 @@
 <translation id="4466881336512663640">As alterações no formulário serão perdidas. Tem certeza de que quer continuar?</translation>
 <translation id="4477350412780666475">Próxima faixa</translation>
 <translation id="4482953324121162758">Este site não será traduzido.</translation>
-<translation id="4486757593530038591">Quando ativado, os sites não podem usar atividades de navegação entre sites diferentes para personalizar anúncios. Os recursos de alguns sites podem falhar.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Esses recursos são desativados por padrão e não estarão disponíveis em versões futuras do Chrome.</translation>
 <translation id="4493480324863638523">URL inválido. É necessário um URL com um esquema padrão, como http://example.com ou https://example.com.</translation>
@@ -848,6 +848,7 @@
 <translation id="467662567472608290">Este servidor não conseguiu provar que é <ph name="DOMAIN" />. O certificado de segurança contém erros. Isso pode ser causado por uma configuração incorreta ou pela interceptação da sua conexão por um invasor.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> quer responder a eventos de acessibilidade</translation>
 <translation id="467809019005607715">Apresentações Google</translation>
+<translation id="4680804919228900307">Você acabou de digitar sua senha em um site suspeito. O Chromium recomenda que você verifique suas senhas salvas para <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> e outros sites em que você usa essa senha.</translation>
 <translation id="4690462567478992370">Suspender o uso de um certificado inválido</translation>
 <translation id="4691835149146451662">Arch A (Envelope)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1013,8 +1014,10 @@
 <translation id="5329858041417644019">Seu navegador não é gerenciado</translation>
 <translation id="5332219387342487447">Forma de envio</translation>
 <translation id="5334013548165032829">Registros detalhados do sistema</translation>
+<translation id="5340250774223869109">O aplicativo foi bloqueado</translation>
 <translation id="534295439873310000">Dispositivos NFC</translation>
 <translation id="5344579389779391559">Esta página pode tentar cobrar pagamento em dinheiro</translation>
+<translation id="5346336634660260557">Verificar o conteúdo da área de transferência, assim como dos arquivos que você salva ou envia para o Chrome.</translation>
 <translation id="5355557959165512791">Não é possível acessar <ph name="SITE" /> neste momento, porque o certificado dele foi revogado. Como os ataques e erros de rede são geralmente temporários, esta página provavelmente funcionará mais tarde.</translation>
 <translation id="536296301121032821">Falha ao armazenar as configurações da política</translation>
 <translation id="5371425731340848620">Atualizar cartão</translation>
@@ -1425,6 +1428,7 @@
 <translation id="7219179957768738017">A conexão usa a <ph name="SSL_VERSION" />.</translation>
 <translation id="7220786058474068424">Processando</translation>
 <translation id="7221855153210829124">Mostrar notificações</translation>
+<translation id="7229659723041939809">Você acabou de digitar sua senha em um site suspeito. O Chrome recomenda que você verifique suas senhas salvas em <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> e outros sites em que você usa essa senha.</translation>
 <translation id="7233592378249864828">Imprimir página de confirmação</translation>
 <translation id="7238585580608191973">Assinatura digital SHA-256</translation>
 <translation id="7240120331469437312">Nome alternativo do requerente do certificado</translation>
@@ -1492,6 +1496,7 @@
 <translation id="7485870689360869515">Nenhum dado encontrado</translation>
 <translation id="7495290002932347110">Sua senha foi exposta em violação de dados em um site ou app acessado por você. Por recomendação do Chrome, verifique suas senhas salvas e mude-as imediatamente em <ph name="ORIGIN" />.</translation>
 <translation id="7498234416455752244">Continuar editando</translation>
+<translation id="7503664977220660814">Você acabou de digitar sua senha em um site suspeito. O Chromium recomenda que você verifique suas senhas salvas para <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e outros sites em que você usa essa senha.</translation>
 <translation id="7508255263130623398">O código do dispositivo da política retornado está em branco ou não corresponde ao código do dispositivo atual</translation>
 <translation id="7508870219247277067">Verde-abacate</translation>
 <translation id="7511955381719512146">O Wi-Fi que você está usando pode exigir a visita a <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" />.</translation>
@@ -1567,6 +1572,7 @@
 <translation id="7763386264682878361">Analisador de manifesto de pagamento</translation>
 <translation id="7764225426217299476">Adicionar endereço</translation>
 <translation id="7766518757692125295">Skirt</translation>
+<translation id="7767271804335921384">O aplicativo foi bloqueado pelo seu administrador</translation>
 <translation id="7770259615151589601">Envelope DL</translation>
 <translation id="7773005668374414287">Mesma ordem virada para cima</translation>
 <translation id="777702478322588152">Município</translation>
@@ -1587,6 +1593,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">Sair do site?</translation>
 <translation id="7865448901209910068">Melhor velocidade</translation>
+<translation id="7874263914261512992">Você acabou de digitar sua senha em um site suspeito. O Chrome recomenda que você verifique suas senhas salvas em <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e outros sites em que você usa essa senha.</translation>
 <translation id="7878562273885520351">Sua senha pode estar comprometida</translation>
 <translation id="7882421473871500483">Marrom</translation>
 <translation id="7887683347370398519">Verifique seu CVC e tente novamente</translation>
@@ -1723,6 +1730,7 @@
 <translation id="8474910779563686872">Mostrar detalhes do desenvolvedor</translation>
 <translation id="8479754468255770962">Grampo na parte inferior esquerda</translation>
 <translation id="8483780878231876732">Para usar os cards da sua Conta do Google, faça login no Google Chrome</translation>
+<translation id="8485393050551136813">Você acabou de digitar sua senha em um site suspeito. O Chromium recomenda que você verifique suas senhas salvas em <ph name="WEBSITE_1" /> e outros sites em que você usa essa senha.</translation>
 <translation id="8488350697529856933">Aplicável a</translation>
 <translation id="8490137692873530638">Empilhador 10</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> demorou muito para responder.</translation>
@@ -1773,6 +1781,7 @@
 <translation id="87601671197631245">Este site usa uma configuração de segurança desatualizada que pode expor suas informações (como senhas, mensagens ou números de cartão de crédito) quando elas forem enviadas para o site.</translation>
 <translation id="8761567432415473239">Recentemente, a Navegação Segura do Google <ph name="BEGIN_LINK" />encontrou programas nocivos<ph name="END_LINK" /> no site <ph name="SITE" />.</translation>
 <translation id="8763927697961133303">Dispositivo USB</translation>
+<translation id="8774457497170244317">Você acabou de digitar sua senha em um site suspeito. O Chrome recomenda que você verifique suas senhas salvas em <ph name="WEBSITE_1" /> e outros sites em que você usa essa senha.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Refazer excluir</translation>
 <translation id="8792621596287649091">Você pode perder o acesso à sua conta de <ph name="ORG_NAME" /> ou ter sua identidade roubada. O Chromium recomenda que sua senha seja alterada agora.</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 04c916f..58615bc 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">As alterações ao formulário serão perdidas. Tem a certeza de que pretende continuar?</translation>
 <translation id="4477350412780666475">Faixa seguinte</translation>
 <translation id="4482953324121162758">Este site não será traduzido.</translation>
-<translation id="4486757593530038591">Quando ativada, os sites não podem utilizar a sua atividade de navegação em diferentes sites para personalizar anúncios. As funcionalidades em alguns sites podem falhar.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Estas funcionalidades estão desativadas por predefinição. Não estarão disponíveis em versões futuras do Chrome.</translation>
 <translation id="4493480324863638523">URL inválido. Tem de ser um URL com um esquema padrão, por exemplo, http://example.com ou https://example.com.</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index 2675ced0..95a1020 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">Modificările aduse formularului se vor pierde. Sigur dorești să continui?</translation>
 <translation id="4477350412780666475">Melodia următoare</translation>
 <translation id="4482953324121162758">Acest site nu va fi tradus.</translation>
-<translation id="4486757593530038591">Dacă opțiunea este activată, site-urile nu pot folosi activitatea ta de navigare de pe diferite site-uri pentru a personaliza anunțurile. Este posibil ca funcțiile de pe anumite site-uri să fie întrerupte.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Funcțiile sunt dezactivate în mod prestabilit. Acestea nu vor fi disponibile în versiunile Chrome ulterioare.</translation>
 <translation id="4493480324863638523">Adresă URL nevalidă. Trebuie să fie o adresă URL cu schemă standard, de exemplu: http://example.com sau https://example.com.</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index fb740d54..acad9d1 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -808,7 +808,6 @@
 <translation id="4466881336512663640">Внесенные в форму изменения не сохранятся. Продолжить?</translation>
 <translation id="4477350412780666475">Следующий трек</translation>
 <translation id="4482953324121162758">Этот сайт не будет переводиться автоматически.</translation>
-<translation id="4486757593530038591">Когда эта настройка включена, сайты не могут отслеживать ваши действия в браузере для показа персонализированной рекламы. Из-за этого некоторые функции на сайтах могут работать некорректно.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Эти функции отключены по умолчанию. В новых версиях Chrome они станут недоступны.</translation>
 <translation id="4493480324863638523">Недопустимый URL. Укажите URL в стандартном виде, например http://example.com или https://example.com.</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb
index ec20e12..f0c0ae0 100644
--- a/components/strings/components_strings_si.xtb
+++ b/components/strings/components_strings_si.xtb
@@ -595,6 +595,7 @@
 <translation id="3587738293690942763">මැද</translation>
 <translation id="3592413004129370115">Italian (ලියුම් කවරය)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">ඔබේ පරිපාලකයා යෙදුම අවහිර කර ඇත</translation>
 <translation id="3608932978122581043">පෝෂණ දිශානතිය</translation>
 <translation id="3614103345592970299">ප්‍රමාණය 2</translation>
 <translation id="361438452008624280">ලැයිස්තු ඇතුළත් කිරීම "<ph name="LANGUAGE_ID" />": නොදන්නා හෝ සහය නොදැක්වෙන භාෂාව.</translation>
@@ -810,7 +811,6 @@
 <translation id="4466881336512663640">පෝරමයේ වෙනස්කම් අහිමි වෙයි. ඔබට ඉදිරියට යායුතු බව ඔබට තහවුරුද?</translation>
 <translation id="4477350412780666475">ඊළඟ ඛණ්ඩය</translation>
 <translation id="4482953324121162758">මෙම වෙබ් අඩවිය පරිවර්තන නොකෙරේ.</translation>
-<translation id="4486757593530038591">සක්‍රීය වූ විට, දැන්වීම් පුද්ගලායනයට වෙබ් අඩවිවලට විවිධ වෙබ් අඩවි හරහා ඔබේ බ්‍රවුස් කිරීමේ ක්‍රියාකාරකම් භාවිත කළ නොහැක. සමහර වෙබ් අඩවි මත විශේෂාංග කැඩී ගිය හැක.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">මෙම විශේෂාංග පෙරනිමි ලෙස අබල කර ඇත. ඒවා Chrome හි අනාගත අනුවාදවල නොලැබේ.</translation>
 <translation id="4493480324863638523">අවලංගු URL. සම්මත සැලැස්මක් සහිත URL එකක් විය යුතුමයි, උදා: http://example.com හෝ https://example.com.</translation>
@@ -850,6 +850,7 @@
 <translation id="467662567472608290">මෙම සේවාදායකයට එය <ph name="DOMAIN" /> බව සනාථ කිරීමට නොහැකි විය; එහි ආරක්ෂණ සහතිකයේ දෝෂ අඩංගුය. මෙය වැරදි වින්‍යාස කිරීමක් හෝ ප්‍රහාරකයකු ඔබගේ සබැඳුමට බාධා කිරීමක් නිසා විය හැකිය.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> හට ප්‍රවේශ්‍යතා සිදුවීම්වලට ප්‍රතිචාර දැක්වීමට අවශ්‍යයි</translation>
 <translation id="467809019005607715">Google Slides</translation>
+<translation id="4680804919228900307">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" />, සහ ඔබ දැනට මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවි සඳහා ඔබේ සුරැකි මුරපද පරීක්‍ෂා කිරීම නිර්දේශ කරයි.</translation>
 <translation id="4690462567478992370">අවලංගු සහතිකයක් භාවිතය නවත්වන්න</translation>
 <translation id="4691835149146451662">Architecture-A (ලියුම් කවරය)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1015,8 +1016,10 @@
 <translation id="5329858041417644019">ඔබේ බ්‍රවුසරය කළමනා නොකෙරේ</translation>
 <translation id="5332219387342487447">නැව්ගත කිරීමේ ක්‍රමය</translation>
 <translation id="5334013548165032829">විස්තරාත්මක පද්ධති ලොග</translation>
+<translation id="5340250774223869109">යෙදුම අවහිර කර ඇත</translation>
 <translation id="534295439873310000">NFC උපාංග</translation>
 <translation id="5344579389779391559">මෙම පිටුව ඔබේ මුදල මාරු කිරීමට උත්සාහ කළ හැක</translation>
+<translation id="5346336634660260557">පසුරු පුවරුවේ මෙන්ම ඔබ Chrome තුළ බාගන්නා හෝ උඩුගත කරන ගොනුවේ අන්තර්ගත ස්කෑන් කරන්න.</translation>
 <translation id="5355557959165512791">ඔබට මේ දැන් <ph name="SITE" /> වෙත එහි සහතිකය අහෝසි කර ඇති බැවින් පිවිසිය නොහැක. ජාල දෝෂ සහ ප්‍රහාර සාමාන්‍යයෙන් තාවකාලිකය, එනිසා මෙම පිටුව සමහර විට පසුව වැඩ කරනු ඇත.</translation>
 <translation id="536296301121032821">ප්‍රතිපත්ති සැකසුම් ගබඩා කිරීමට අසමත් විය</translation>
 <translation id="5371425731340848620">කාඩ්පත යාවත්කාලීන කරන්න</translation>
@@ -1427,6 +1430,7 @@
 <translation id="7219179957768738017">සම්බන්ධතාවය විසින් <ph name="SSL_VERSION" /> භාවිතා කරයි.</translation>
 <translation id="7220786058474068424">සකසමින්</translation>
 <translation id="7221855153210829124">දැනුම්දීම් පෙන්වන්න</translation>
+<translation id="7229659723041939809">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" />, සහ ඔබ දැනට මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවි සඳහා ඔබේ සුරැකි මුරපද පරීක්‍ෂා කිරීම නිර්දේශ කරයි.</translation>
 <translation id="7233592378249864828">මුද්‍රණ තහවුරු කිරීමේ පත්‍රය</translation>
 <translation id="7238585580608191973">SHA-256 ඇඟිලි සලකුණ</translation>
 <translation id="7240120331469437312">සහතික විෂයේ විකල්ප නම</translation>
@@ -1494,6 +1498,7 @@
 <translation id="7485870689360869515">දත්ත කිසිවක් හමු නොවිනි</translation>
 <translation id="7495290002932347110">අඩවියක හෝ යෙදුමක සිදු වූ දත්ත කඩ කිරීමක් ඔබේ මුරපදය අනාවරණය කර ඇත. Chrome දැන් <ph name="ORIGIN" /> මත ඔබේ සුරැකි මුරපද පරීක්ෂා කිරීම සහ ඔබේ මුරපදය වෙනස් කිරීම නිර්දේශ කරයි.</translation>
 <translation id="7498234416455752244">දිගටම සංස්කරණ කරන්න</translation>
+<translation id="7503664977220660814">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chromium <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, සහ ඔබ දැනට මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවි සඳහා ඔබේ සුරැකි මුරපද පරීක්‍ෂා කිරීම නිර්දේශ කරයි.</translation>
 <translation id="7508255263130623398">ආපසු ලබා දුන් ප්‍රතිපත්ති උපාංග id හිස් හෝ වත්මන් උපාංග id හා නොගැළපෙයි</translation>
 <translation id="7508870219247277067">අලිගැට පේර කොළ</translation>
 <translation id="7511955381719512146">ඔබ භාවිතා කරන Wi-Fi මගින් ඔබ <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> වෙත පිවිසීමට අවශ්‍ය විය හැක.</translation>
@@ -1569,6 +1574,7 @@
 <translation id="7763386264682878361">ගෙවීම් මැනිෆෙස්ට් විග්‍රහක</translation>
 <translation id="7764225426217299476">ලිපිනය එක් කරන්න</translation>
 <translation id="7766518757692125295">සාය</translation>
+<translation id="7767271804335921384">ඔබේ පරිපාලකයා යෙදුම අවහිර කර ඇත</translation>
 <translation id="7770259615151589601">නියම කළ දිග</translation>
 <translation id="7773005668374414287">එකම පිළිවෙළ මුහුණු ඉහළට</translation>
 <translation id="777702478322588152">ප්‍රාන්තය</translation>
@@ -1589,6 +1595,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">අඩවියෙන් ඉවත් වන්න ද?</translation>
 <translation id="7865448901209910068">හොඳම වේගය</translation>
+<translation id="7874263914261512992">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chrome <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, සහ ඔබ දැනට මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවි සඳහා ඔබේ සුරැකි මුරපද පරීක්‍ෂා කිරීම නිර්දේශ කරයි.</translation>
 <translation id="7878562273885520351">ඔබේ මුරපදය අන් සතු වී තිබිය හැකිය</translation>
 <translation id="7882421473871500483">දුඹුරු</translation>
 <translation id="7887683347370398519">ඔබේ CVC පරීක්ෂා කර නැවත උත්සාහ කරන්න</translation>
@@ -1725,6 +1732,7 @@
 <translation id="8474910779563686872">සංවර්ධක විස්තර පෙන්වන්න</translation>
 <translation id="8479754468255770962">පහළ වමර ස්ටේපල් කරන්න</translation>
 <translation id="8483780878231876732">ඔබගේ Google ගිණුමෙන් කාඩ්පත් භාවිත කිරීමට, Chrome වෙත පුරන්න</translation>
+<translation id="8485393050551136813">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chromium <ph name="WEBSITE_1" /> සහ ඔබ දැනට මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවි සඳහා ඔබේ සුරැකි මුරපද පරීක්‍ෂා කිරීම නිර්දේශ කරයි.</translation>
 <translation id="8488350697529856933">අදාළ වනුයේ</translation>
 <translation id="8490137692873530638">අට්ටිය 10</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> ප්‍රතිචාර දැක්වීමට දිගු කාලයක් ගත්තේය.</translation>
@@ -1774,6 +1782,7 @@
 <translation id="87601671197631245">මෙම වෙබ් අඩවිය යල් පැන ගිය ආරක්‍ෂක වින්‍යාසයක් භාවිත කරයි, එමඟින් ඔබේ තොරතුරු (උදාහරණයක් වශයෙන් මුරපද, පණිවුඩ, හෝ ණය කාඩ්පත්) මෙම වෙබ් අඩවියට යවන විට හෙළි කළ හැක.</translation>
 <translation id="8761567432415473239">Google ආරක්ෂිත පිරික්සීම මෑතදී <ph name="SITE" /> මත <ph name="BEGIN_LINK" />දූෂිත ක්‍රමලේඛ සොයා ගත්තේය<ph name="END_LINK" />.</translation>
 <translation id="8763927697961133303">USB උපාංගය</translation>
+<translation id="8774457497170244317">ඔබ මේ දැන් වංචනික අඩවියක ඔබේ මුරපදය ඇතුළු කළා. Chrome <ph name="WEBSITE_1" /> සහ ඔබ දැනට මෙම මුරපදය භාවිත කරන වෙනත් වෙබ් අඩවි සඳහා ඔබේ සුරැකි මුරපද පරීක්‍ෂා කිරීම නිර්දේශ කරයි.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">මැකීම &amp;යළි කරන්න</translation>
 <translation id="8792621596287649091">ඔබට ඔබේ <ph name="ORG_NAME" /> ගිණුමට ප්‍රවේශය අහිමි වීමට හෝ අනන්‍යතා සොරකමක් අත්විඳීමට සිදු විය හැකිය. දැන් ඔබේ මුරපදය වෙනස් කිරීම සඳහා Chromium නිර්දේශ කරයි.</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index 8ce4b12..a17bd4f 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -591,6 +591,7 @@
 <translation id="3587738293690942763">Stred</translation>
 <translation id="3592413004129370115">Italian (obálka)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Aplikácia bola zablokovaná vaším správcom</translation>
 <translation id="3608932978122581043">Orientácia zásobníka</translation>
 <translation id="3614103345592970299">Veľkosť 2</translation>
 <translation id="361438452008624280">Položka zoznamu „<ph name="LANGUAGE_ID" />“: neznámy alebo nepodporovaný jazyk.</translation>
@@ -805,7 +806,6 @@
 <translation id="4466881336512663640">Zmeny formulára sa odstránia. Naozaj chcete pokračovať?</translation>
 <translation id="4477350412780666475">Ďalšia stopa</translation>
 <translation id="4482953324121162758">Tento web nebude preložený.</translation>
-<translation id="4486757593530038591">Keď je táto možnosť zapnutá, weby nemôžu prispôsobovať reklamy na základe vašej aktivity prehliadania na rôznych weboch. Funkcie na niektorých weboch môžu zlyhávať.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Tieto funkcie sú predvolene vypnuté. V budúcich verziách Chromu nebudú k dispozícii.</translation>
 <translation id="4493480324863638523">Neplatná webová adresa. Je nutné použiť webovú adresu so štandardnou schémou, napr. http://example.com alebo https://example.com.</translation>
@@ -844,6 +844,7 @@
 <translation id="467662567472608290">Server nedokáže overiť, či ide o doménu <ph name="DOMAIN" />, jej bezpečnostný certifikát obsahuje chyby. Môže to byť spôsobené nesprávnou konfiguráciou alebo tým, že vaše pripojenie zachytil útočník.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> chce reagovať na udalosti dostupnosti</translation>
 <translation id="467809019005607715">Prezentácie Google</translation>
+<translation id="4680804919228900307">Práve ste zadali svoje heslo na podvodnom webe. Chromium odporúča, aby ste skontrolovali svoje uložené heslá pre <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> a ďalšie weby, na ktorých ho momentálne používate.</translation>
 <translation id="4690462567478992370">Nepoužívať neplatné certifikáty</translation>
 <translation id="4691835149146451662">Architecture-A (obálka)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1009,8 +1010,10 @@
 <translation id="5329858041417644019">Váš prehliadač nie je spravovaný</translation>
 <translation id="5332219387342487447">Spôsob dodania</translation>
 <translation id="5334013548165032829">Podrobné denníky systému</translation>
+<translation id="5340250774223869109">Aplikácia je blokovaná</translation>
 <translation id="534295439873310000">Zariadenia NFC</translation>
 <translation id="5344579389779391559">Táto stránka sa vám môže pokúsiť účtovať poplatky</translation>
+<translation id="5346336634660260557">Naskenujte obsah schránky, ako aj súbory, ktoré sťahujete alebo nahrávate v Chrome.</translation>
 <translation id="5355557959165512791">Web <ph name="SITE" /> momentálne nemôžete navštíviť, pretože tento certifikát bol odvolaný. Chyby siete a útoky sú zvyčajne dočasné, takže by táto stránka mala neskôr pravdepodobne fungovať.</translation>
 <translation id="536296301121032821">Nastavenia pravidla sa nepodarilo uložiť</translation>
 <translation id="5371425731340848620">Aktualizujte si kartu</translation>
@@ -1420,6 +1423,7 @@
 <translation id="7219179957768738017">Spojenie používa protokol <ph name="SSL_VERSION" />.</translation>
 <translation id="7220786058474068424">Spracováva sa</translation>
 <translation id="7221855153210829124">Zobrazovať upozornenia</translation>
+<translation id="7229659723041939809">Práve ste zadali svoje heslo na podvodnom webe. Chrome odporúča, aby ste skontrolovali svoje uložené heslá pre <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> a ďalšie weby, na ktorých ho momentálne používate.</translation>
 <translation id="7233592378249864828">Vytlačiť potvrdzovací hárok</translation>
 <translation id="7238585580608191973">Odtlačok SHA-256</translation>
 <translation id="7240120331469437312">Alternatívny názov subjektu certifikátu</translation>
@@ -1487,6 +1491,7 @@
 <translation id="7485870689360869515">Nenašli sa žiadne údaje.</translation>
 <translation id="7495290002932347110">V rámci webu alebo aplikácie došlo k porušeniu ochrany údajov a vaše heslo bolo prezradené. Chrome odporúča skontrolovať uložené heslá a okamžite zmeniť heslo na webe <ph name="ORIGIN" />.</translation>
 <translation id="7498234416455752244">Pokračovať v úprave</translation>
+<translation id="7503664977220660814">Práve ste zadali svoje heslo na podvodnom webe. Chromium odporúča, aby ste skontrolovali svoje uložené heslá pre <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a ďalšie weby, na ktorých ho momentálne používate.</translation>
 <translation id="7508255263130623398">Identifikátor zariadenia vráteného v rámci záruky je prázdny alebo sa nezhoduje s identifikátorom aktuálneho zariadenia</translation>
 <translation id="7508870219247277067">Žltozelená</translation>
 <translation id="7511955381719512146">Sieť Wi‑Fi, ktorú používate, môže vyžadovať, aby ste navštívili stránku <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /></translation>
@@ -1562,6 +1567,7 @@
 <translation id="7763386264682878361">Analyzátor manifestov platieb</translation>
 <translation id="7764225426217299476">Pridať adresu</translation>
 <translation id="7766518757692125295">Lem</translation>
+<translation id="7767271804335921384">Táto aplikácia bola zablokovaná vaším správcom</translation>
 <translation id="7770259615151589601">Určené – dlhé</translation>
 <translation id="7773005668374414287">V rovnakom poradí lícom nahor</translation>
 <translation id="777702478322588152">Prefektúra</translation>
@@ -1582,6 +1588,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="FORMATTED_TOTAL_AMOUNT" /> <ph name="CURRENCY_CODE" /></translation>
 <translation id="7862185352068345852">Chcete odísť z tohto webu?</translation>
 <translation id="7865448901209910068">Najlepšia rýchlosť</translation>
+<translation id="7874263914261512992">Práve ste zadali svoje heslo na podvodnom webe. Chrome odporúča, aby ste skontrolovali svoje uložené heslá pre <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a ďalšie weby, na ktorých ho momentálne používate.</translation>
 <translation id="7878562273885520351">Vaše heslo mohlo byť napadnuté</translation>
 <translation id="7882421473871500483">Hnedá</translation>
 <translation id="7887683347370398519">Skontrolujte svoj kód CVC a skúste to znova</translation>
@@ -1718,6 +1725,7 @@
 <translation id="8474910779563686872">Zobraziť podrobnosti o vývojárovi</translation>
 <translation id="8479754468255770962">Zošiť spinkou vľavo dole</translation>
 <translation id="8483780878231876732">Ak chcete používať karty z účtu Google, prihláste sa do Chromu</translation>
+<translation id="8485393050551136813">Práve ste zadali svoje heslo na podvodnom webe. Chromium odporúča, aby ste skontrolovali svoje uložené heslá pre <ph name="WEBSITE_1" /> a ďalšie weby, na ktorých ho momentálne používate.</translation>
 <translation id="8488350697529856933">Platí pre</translation>
 <translation id="8490137692873530638">Odkladač č. 10</translation>
 <translation id="8498891568109133222">Web <ph name="HOST_NAME" /> príliš dlho neodpovedal.</translation>
@@ -1768,6 +1776,7 @@
 <translation id="87601671197631245">Tento web používa zastaranú konfiguráciu zabezpečenia, ktorá môže odhaliť vaše informácie (napríklad heslá, správy alebo kreditné karty), keď ich naň odošlete.</translation>
 <translation id="8761567432415473239">Bezpečné prehliadanie Google nedávno <ph name="BEGIN_LINK" />zistilo škodlivé programy<ph name="END_LINK" /> na webe <ph name="SITE" />.</translation>
 <translation id="8763927697961133303">Zariadenie USB</translation>
+<translation id="8774457497170244317">Práve ste zadali svoje heslo na podvodnom webe. Chrome odporúča, aby ste skontrolovali svoje uložené heslá pre <ph name="WEBSITE_1" /> a ďalšie weby, na ktorých ho momentálne používate.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Znova vymazať</translation>
 <translation id="8792621596287649091">Môžete stratiť prístup do účtu <ph name="ORG_NAME" /> alebo vám niekto môže ukradnúť identitu. Chromium odporúča, aby ste si ihneď zmenili heslo.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 50140ea6..2def4241 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Spremembe obrazca bodo izgubljene. Ali ste prepričani, da želite nadaljevati?</translation>
 <translation id="4477350412780666475">Naslednja skladba</translation>
 <translation id="4482953324121162758">To spletno mesto ne bo prevedeno.</translation>
-<translation id="4486757593530038591">Ko je to omogočeno, spletna mesta ne morejo uporabljati vaše dejavnosti brskanja na različnih spletnih mestih za individualno prilagajanje oglasov. Funkcije na nekaterih spletnih mestih morda ne bodo delovale.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Te funkcije so privzeto onemogočene. Ne bodo na voljo v prihodnjih različicah Chroma.</translation>
 <translation id="4493480324863638523">Neveljaven URL. Mora biti URL s standardno shemo, kot je http://primer.com ali https://primer.com.</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb
index 8cc8526..e3fc729 100644
--- a/components/strings/components_strings_sq.xtb
+++ b/components/strings/components_strings_sq.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">Ndryshimet në formular do të humbasin. Je i sigurt se dëshiron të vazhdosh?</translation>
 <translation id="4477350412780666475">Kënga tjetër</translation>
 <translation id="4482953324121162758">Ky sajt nuk do të përkthehet.</translation>
-<translation id="4486757593530038591">Kur është aktive, sajtet nuk mund t'i përdorin të dhënat e shfletimit nëpër sajte të ndryshme për t'i personalizuar reklamat. Veçoritë në disa sajte mund të ndalojnë së funksionuari.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Këto veçori janë të çaktivizuara si parazgjedhje. Ato nuk do të ofrohen në versionet e ardhshme të Chrome.</translation>
 <translation id="4493480324863638523">URL e pavlefshme. Duhet të jetë URL me një skemë standarde, p.sh. http://shembull.com ose https://shembull.com.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index ab1b336a..7353f48 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Промене обрасца се неће сачувати. Желите ли стварно да наставите?</translation>
 <translation id="4477350412780666475">Следећа песма</translation>
 <translation id="4482953324121162758">Овај сајт неће бити преведен.</translation>
-<translation id="4486757593530038591">Када је ово укључено, сајтови не могу да користе ваше активности прегледања на различитим сајтовима за персонализацију огласа. Функције на неким сајтовима могу да престану са радом.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ове функције су подразумевано онемогућене. Оне неће бити доступне у будућим верзијама Chrome-а.</translation>
 <translation id="4493480324863638523">URL је неважећи. URL мора да има стандардну шему, нпр. http://example.com или https://example.com.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index 56bb73b..26f6846a 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Ändringar i formuläret ändras inte. Vill du fortsätta?</translation>
 <translation id="4477350412780666475">Nästa spår</translation>
 <translation id="4482953324121162758">Den här webbplatsen översätts inte.</translation>
-<translation id="4486757593530038591">När detta är aktiverat kan en webbplats inte anpassa annonser utifrån din aktivitet på webben. Funktioner på vissa webbplatser kan sluta fungera.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">De här funktionerna är inaktiverade som standard. I kommande versioner av Chrome kommer de inte längre att vara tillgängliga.</translation>
 <translation id="4493480324863638523">Ogiltig webbadress. Måste vara en webbadress med ett standardprotokoll, t.ex. http://example.com eller https://example.com.</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index 2553167..479f759 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -813,7 +813,6 @@
 <translation id="4466881336512663640">Haitahifadhi mabadiliko uliyofanya kwenye fomu. Je, una uhakika unataka kuendelea?</translation>
 <translation id="4477350412780666475">Wimbo Unaofuata</translation>
 <translation id="4482953324121162758">Haitatafsiri tovuti hii.</translation>
-<translation id="4486757593530038591">Ukiwasha, tovuti haziwezi kutumia shughuli zako za kuvinjari kwenye tovuti tofauti ili kukuonyesha matangazo yanayokufaa zaidi. Huenda vipengele kwenye baadhi ya tovuti vikakosa kufanya kazi.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Vipengele hivi vimezimwa kwa chaguomsingi. Havitapatikana katika matoleo yajayo ya Chrome.</translation>
 <translation id="4493480324863638523">URL si sahihi. Lazima iwe URL yenye mfumo wa kawaida, k.m. http://example.com or https://example.com.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 91200e56..8719d25 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -806,7 +806,6 @@
 <translation id="4466881336512663640">படிவத்தில் செய்த மாற்றங்கள் சேமிக்கப்படாது. நிச்சயமாகத் தொடர விரும்புகிறீர்களா?</translation>
 <translation id="4477350412780666475">அடுத்த டிராக்</translation>
 <translation id="4482953324121162758">இந்தத் தளம் மொழிபெயர்க்கப்படாது.</translation>
-<translation id="4486757593530038591">இயக்கப்பட்டிருக்கும்போது விளம்பரங்களைப் பிரத்தியேகப்படுத்துவதற்காக வெவ்வேறு வலைதளங்களில் நீங்கள் மேற்கொள்ளும் உலாவல் செயல்பாட்டை வலைதளங்களால் பயன்படுத்த முடியாது. சில வலைதளங்களிலுள்ள அம்சங்கள் சிதைவடையலாம்.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">இந்த அம்சங்கள் இயல்பாகவே முடக்கப்பட்டுள்ளன. இனிவரும் Chrome பதிப்புகளில் அவற்றைப் பயன்படுத்த முடியாது.</translation>
 <translation id="4493480324863638523">தவறான URL. URL ஒரு நிலையான வகையில் இருக்க வேண்டும், எ.கா http://example.com or https://example.com.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index cc6f584..e72b199 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">ఫారమ్‌లో చేసిన మార్పులను కోల్పోతారు. మీరు ఖచ్చితంగా కొనసాగాలనుకుంటున్నారా?</translation>
 <translation id="4477350412780666475">తర్వాతి ట్రాక్</translation>
 <translation id="4482953324121162758">ఈ సైట్ అనువదించబడదు.</translation>
-<translation id="4486757593530038591">ఆన్‌లో ఉన్నప్పుడు, వ్యక్తిగతీకరించడానికి సైట్‌లు వేర్వేరు సైట్‌లలోని మీ బ్రౌజింగ్ కార్యకలాపాన్ని ఉపయోగించలేవు. కొన్ని సైట్‌లలోని ఫీచర్‌లు సరిగ్గా పని చేయకపోవచ్చు.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ఈ ఫీచర్‌లు డిఫాల్ట్‌గా నిలిపివేయబడతాయి. Chrome రాబోయే వెర్షన్‌లలో ఇవి అందుబాటులో ఉండవు.</translation>
 <translation id="4493480324863638523">చెల్లని URL. URL తప్పనిసరిగా ఒక ప్రామాణిక స్కీమ్‌ను కలిగి ఉండాలి, ఉదా http://example.com లేదా https://example.com.</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index ed31365..cfeebd7 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -808,7 +808,6 @@
 <translation id="4466881336512663640">การเปลี่ยนแปลงในฟอร์มจะหายไป คุณแน่ใจไหมว่าต้องการดำเนินการต่อ</translation>
 <translation id="4477350412780666475">แทร็กถัดไป</translation>
 <translation id="4482953324121162758">ระบบจะไม่แปลเว็บไซต์นี้</translation>
-<translation id="4486757593530038591">เมื่อเปิดใช้ เว็บไซต์จะใช้กิจกรรมการท่องเว็บตามเว็บไซต์ต่างๆ ของคุณเพื่อปรับโฆษณาตามโปรไฟล์ของผู้ใช้ไม่ได้ ฟีเจอร์ในเว็บไซต์บางแห่งอาจใช้งานไม่ได้</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">ฟีเจอร์เหล่านี้ปิดใช้งานอยู่โดยค่าเริ่มต้น และจะไม่มีให้ใช้งานใน Chrome เวอร์ชันต่อๆ ไป</translation>
 <translation id="4493480324863638523">URL ไม่ถูกต้อง ต้องเป็น URL ที่มีรูปแบบมาตรฐาน เช่น http://example.com หรือ https://example.com</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index c880f64..8871ce1b 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -812,7 +812,6 @@
 <translation id="4466881336512663640">Formda yaptığınız değişiklikler kaybolacak. Devam etmek istediğinizden emin misiniz?</translation>
 <translation id="4477350412780666475">Sonraki Parça</translation>
 <translation id="4482953324121162758">Bu site çevrilmeyecek.</translation>
-<translation id="4486757593530038591">Bu ayar açıkken, siteler reklamları kişiselleştirmek için farklı sitelerde gezinme etkinliğinizi kullanamaz Bazı sitelerdeki özellikler bozulabilir.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Bu özellikler varsayılan olarak devre dışı bırakılmıştır. Chrome'un gelecek sürümlerinde kullanılamayacaktır.</translation>
 <translation id="4493480324863638523">Geçersiz URL. Standart şemaya sahip bir URL olmalıdır. Ör. http://example.com veya https://example.com.</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 5084ade5..88b567f 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">Зміни форми не буде збережено. Продовжити?</translation>
 <translation id="4477350412780666475">Наступна композиція</translation>
 <translation id="4482953324121162758">Цей сайт не перекладатиметься.</translation>
-<translation id="4486757593530038591">Якщо цей параметр увімкнено, сайти не можуть використовувати дані про ваші дії у веб-переглядачі, щоб персоналізувати рекламу. Функції на деяких сайтах можуть не працювати.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Ці функції вимкнено за умовчанням. Вони будуть недоступні в майбутніх версіях Chrome.</translation>
 <translation id="4493480324863638523">Недійсна URL-адреса. Потрібно вказати URL-адресу зі стандартною схемою, як-от http://example.com або https://example.com.</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb
index 107c2ac..4c3395d 100644
--- a/components/strings/components_strings_ur.xtb
+++ b/components/strings/components_strings_ur.xtb
@@ -816,7 +816,6 @@
 <translation id="4466881336512663640">فارم میں کی گئی تبدیلیاں ضائع ہو جائیں گی۔ کیا آپ واقعی جاری رکھنا چاہتے ہیں؟</translation>
 <translation id="4477350412780666475">اگلا ٹریک</translation>
 <translation id="4482953324121162758">اس سائٹ کا ترجمہ نہیں کیا جائے گا۔</translation>
-<translation id="4486757593530038591">آن ہونے پر، اشتہارات کو مختلف سائٹس پر ذاتی نوعیت کا بنانے کے لیے سائٹس آپ کی براؤزنگ کی سرگرمی کا استعمال نہیں کر سکتی ہیں۔ کچھ سائٹس پر خصوصیات میں خلل ہو سکتا ہے۔</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">‏یہ خصوصیات بذریعہ ڈیفالٹ غیر فعال ہیں۔ یہ Chrome کے آئندہ کے ورژنز میں دستیاب نہیں ہوں گی۔</translation>
 <translation id="4493480324863638523">‏غلط URL۔ معیاری اسکیم والا URL ہونا ضروری ہے، جیسے http://example.com یا https://example.com۔</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb
index 8daa8c8c..2358ec0 100644
--- a/components/strings/components_strings_uz.xtb
+++ b/components/strings/components_strings_uz.xtb
@@ -596,6 +596,7 @@
 <translation id="3587738293690942763">Oʻrtacha</translation>
 <translation id="3592413004129370115">Italian (Envelope)</translation>
 <translation id="3600246354004376029"><ph name="TITLE" />, <ph name="DOMAIN" />, <ph name="TIME" /></translation>
+<translation id="3603507503523709">Ilova administrator tomonidan bloklangan</translation>
 <translation id="3608932978122581043">Holatini belgilash</translation>
 <translation id="3614103345592970299">Hajmi: 2</translation>
 <translation id="361438452008624280">“<ph name="LANGUAGE_ID" />” qiymati: Notanish yoki mos kelmaydigan til.</translation>
@@ -810,7 +811,6 @@
 <translation id="4466881336512663640">Toʻldirilgan shakl tozalanadi. Davom ettirilsinmi?</translation>
 <translation id="4477350412780666475">Keyingi trek</translation>
 <translation id="4482953324121162758">Bu sayt tarjima qilinmaydi</translation>
-<translation id="4486757593530038591">Agar yoqilsa, saytlar reklamalarni sizga moslashtirish uchun brauzerdagi faoliyatingizni kuzata olmaydi. Ayrim saytlardagi funksiyalar ishalamay qolishi mumkin.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Standart holatda bu funksiyalar yoqilmagan boʻladi. Ular Chromening keyingi versiyalarida ishlamasligi mumkin.</translation>
 <translation id="4493480324863638523">URL manzil yaroqsiz. URL manzillar standart andozada boʻlishi zarur (masalan: “http://example.com” yoki “https://example.com”).</translation>
@@ -850,6 +850,7 @@
 <translation id="467662567472608290">Bu <ph name="DOMAIN" /> serveri ekanligi tasdiqlanmadi. Uning sertifikati ayni paytda yaroqsiz bo‘lishi mumkin. Balki, server noto‘g‘ri sozlangan yoki kimdir ma’lumotlaringizni o‘g‘rilashga urinayotgan bo‘lishi mumkin.</translation>
 <translation id="4677585247300749148"><ph name="URL" /> maxsus imkoniyatlardan foydalanmoqchi</translation>
 <translation id="467809019005607715">Google Slides</translation>
+<translation id="4680804919228900307">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> va boshqa saytlardagi shu parolingizni tekshirishni tavsiya qiladi.</translation>
 <translation id="4690462567478992370">Yaroqsiz sertifikatdan foydalanishni to‘xtatish</translation>
 <translation id="4691835149146451662">Architecture-A (Envelope)</translation>
 <translation id="4701488924964507374"><ph name="SENTENCE1" /> <ph name="SENTENCE2" /></translation>
@@ -1015,8 +1016,10 @@
 <translation id="5329858041417644019">Brauzeringiz mustaqil rejimda</translation>
 <translation id="5332219387342487447">Yetkazib berish usuli</translation>
 <translation id="5334013548165032829">Batafsil tizim jurnali qaydlari</translation>
+<translation id="5340250774223869109">Ilova bloklandi</translation>
 <translation id="534295439873310000">NFC qurilmalar</translation>
 <translation id="5344579389779391559">Bu sahifa sizdan pul talab qilishi mumkin</translation>
+<translation id="5346336634660260557">Klipbord va Chrome orqali yuklab olinayotgan yoki yuklanayotgan fayllar tarkibini tekshirish.</translation>
 <translation id="5355557959165512791"><ph name="SITE" /> sayti ochilmadi, bu sayt bekor qilingan sertifikatdan foydalanayotgan bo‘lishi mumkin. Bunday xatolik tarmoq xatoligi va saytga hujumlar bo‘layotganda yuz beradi, lekin keyinroq sayt ishlab ketishi mumkin.</translation>
 <translation id="536296301121032821">Tartib-qoida parametrlarini saqlab bo‘lmadi</translation>
 <translation id="5371425731340848620">Kartani yangilash</translation>
@@ -1426,6 +1429,7 @@
 <translation id="7219179957768738017">Bu ulanishda <ph name="SSL_VERSION" /> protokoli ishlatilmoqda.</translation>
 <translation id="7220786058474068424">Amalga oshirilmoqda</translation>
 <translation id="7221855153210829124">Bildirishnomalarni ko‘rsatish</translation>
+<translation id="7229659723041939809">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> va boshqa saytlardagi shu parolingizni tekshirishni tavsiya qiladi.</translation>
 <translation id="7233592378249864828">Bosmani tasdiqlash varagʻi</translation>
 <translation id="7238585580608191973">SHA-256 barmoq izi</translation>
 <translation id="7240120331469437312">Subyekt sertifikatining alternativ nomi</translation>
@@ -1493,6 +1497,7 @@
 <translation id="7485870689360869515">Ma‘lumotlar topilmadi.</translation>
 <translation id="7495290002932347110">Siz ishlatadigan sayt yoki ilovada axborot sizib chiqishi yuz bergan. Chrome hoziroq saqlangan parollaringizni tekshirishni va <ph name="ORIGIN" /> parolingizni yangilashni tavsiya qiladi.</translation>
 <translation id="7498234416455752244">Tahrirlashda davom etish</translation>
+<translation id="7503664977220660814">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> va boshqa saytlardagi shu parolingizni tekshirishni tavsiya qiladi.</translation>
 <translation id="7508255263130623398">Qurilmaning qaytarilgan identifikatori bo‘sh yoki joriy qurilma identifikatoriga mos kelmaydi</translation>
 <translation id="7508870219247277067">Yashil avokado</translation>
 <translation id="7511955381719512146">Siz ulangan Wi-Fi tarmog‘i <ph name="BEGIN_BOLD" /><ph name="LOGIN_URL" /><ph name="END_BOLD" /> sahifaga o‘tishingizni talab qilishi mumkin.</translation>
@@ -1568,6 +1573,7 @@
 <translation id="7763386264682878361">To‘lov manifesti tahlilchisi</translation>
 <translation id="7764225426217299476">Manzil qo‘shish</translation>
 <translation id="7766518757692125295">Yubka</translation>
+<translation id="7767271804335921384">Ilova administrator tomonidan bloklangan</translation>
 <translation id="7770259615151589601">Designated-Long</translation>
 <translation id="7773005668374414287">Bir xil tartibda old tomonida</translation>
 <translation id="777702478322588152">Prefektura</translation>
@@ -1588,6 +1594,7 @@
 <translation id="7855695075675558090"><ph name="TOTAL_LABEL" /> <ph name="CURRENCY_CODE" /> <ph name="FORMATTED_TOTAL_AMOUNT" /></translation>
 <translation id="7862185352068345852">Sayt tark etilsinmi?</translation>
 <translation id="7865448901209910068">Eng tez</translation>
+<translation id="7874263914261512992">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> va boshqa saytlardagi shu parolingizni tekshirishni tavsiya qiladi.</translation>
 <translation id="7878562273885520351">Parolingiz o‘g‘irlangan bo‘lishi mumkin</translation>
 <translation id="7882421473871500483">Jigarrang</translation>
 <translation id="7887683347370398519">CVC-kodni tekshiring va qayta urinib ko‘ring.</translation>
@@ -1724,6 +1731,7 @@
 <translation id="8474910779563686872">Dasturchilar uchun tafsilotlarni chiqarish</translation>
 <translation id="8479754468255770962">Quyi chapdan steplerlash</translation>
 <translation id="8483780878231876732">Google hisobingizga biriktirilgan kartalardan foydalanish uchun Chrome hisobiga kiring.</translation>
+<translation id="8485393050551136813">Hozirgina shubhali saytda parol kiritdingiz. Chromium hoziroq <ph name="WEBSITE_1" /> va boshqa saytlardagi shu parolingizni tekshirishni tavsiya qiladi.</translation>
 <translation id="8488350697529856933">Tatbiq etish obyekti</translation>
 <translation id="8490137692873530638">Taxlovchi 10</translation>
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> saytidan javob vaqti judayam cho‘zilib ketdi.</translation>
@@ -1773,6 +1781,7 @@
 <translation id="87601671197631245">Bu sayt eskirgan xavfsizlik sozlamasidan foydalanadi. maʼlumotlaringiz (masalan, parollar, xabarlar va kredit kartalari) shu saytga yuborilganda ular xavf ostida qolishi mumkin.</translation>
 <translation id="8761567432415473239">Google saytlar xavfsizligini tekshirish tizimi yaqinda <ph name="SITE" /> saytida <ph name="BEGIN_LINK" />zararli dasturlarni topdi<ph name="END_LINK" />.</translation>
 <translation id="8763927697961133303">USB qurilma</translation>
+<translation id="8774457497170244317">Hozirgina shubhali saytda parol kiritdingiz. Chrome hoziroq <ph name="WEBSITE_1" /> va boshqa saytlardagi shu parolingizni tekshirishni tavsiya qiladi.</translation>
 <translation id="877985182522063539">A4</translation>
 <translation id="8790007591277257123">&amp;Qayta o‘chirish</translation>
 <translation id="8792621596287649091"><ph name="ORG_NAME" /> hisobingiz xavf ostida va shaxsiy ma’lumotlaringizni kimdir ko‘rishi mumkin. Parolingizni hoziroq o‘zgartirishni tavsiya etamiz.</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index 84625b25..cb88d30 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -815,7 +815,6 @@
 <translation id="4466881336512663640">Các thay đổi đối với biểu mẫu sẽ bị mất. Bạn có chắc chắn muốn tiếp tục không?</translation>
 <translation id="4477350412780666475">Bản nhạc tiếp theo</translation>
 <translation id="4482953324121162758">Trang web này sẽ không được dịch.</translation>
-<translation id="4486757593530038591">Khi tùy chọn này bật, các trang web không thể dùng hoạt động duyệt web của bạn trên nhiều trang web để điều chỉnh quảng cáo cho phù hợp với bạn. Do đó, các tính năng trên một số trang web có thể hoạt động không đúng cách.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Theo mặc định, những tính năng này sẽ bị tắt. Những tính năng này sẽ không có trên các phiên bản Chrome trong tương lai.</translation>
 <translation id="4493480324863638523">URL không hợp lệ. Phải là URL chứa tên giao thức chuẩn, chẳng hạn như: http://example.com hoặc https://example.com.</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index ef9f717..425a9fd 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -805,7 +805,6 @@
 <translation id="4466881336512663640">对表单所做的更改将会丢失。确定要继续吗?</translation>
 <translation id="4477350412780666475">下一曲</translation>
 <translation id="4482953324121162758">系统不会翻译此网站。</translation>
-<translation id="4486757593530038591">当此设置处于开启状态时,网站无法根据您在各个不同网站上的浏览活动为您展示个性化广告。某些网站上的功能可能会无法正常运作。</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">这些功能默认处于停用状态。后续版本的 Chrome 将不再提供这些功能。</translation>
 <translation id="4493480324863638523">网址无效。必须是采用标准架构的网址,例如“http://example.com”或“https://example.com”。</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb
index 79885236..1850057 100644
--- a/components/strings/components_strings_zh-HK.xtb
+++ b/components/strings/components_strings_zh-HK.xtb
@@ -807,7 +807,6 @@
 <translation id="4466881336512663640">您對表單所作的變更將會遺失。您確定要繼續嗎?</translation>
 <translation id="4477350412780666475">下一首曲目</translation>
 <translation id="4482953324121162758">系統不會翻譯此網站。</translation>
-<translation id="4486757593530038591">開啟此功能時,網站不能使用您在各網站的瀏覽活動放送個人化廣告。有些網站的功能可能會無法正常運作。</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">這些功能預設為停用。日後發佈的 Chrome 版本將不再提供這些功能。</translation>
 <translation id="4493480324863638523">網址無效。必須為有標準配置的網址,例如 http://example.com 或 https://example.com。</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 9d02dfd..2ba8b54 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -809,7 +809,6 @@
 <translation id="4466881336512663640">你對表單所做變更將會遺失。確定要繼續嗎?</translation>
 <translation id="4477350412780666475">下一首曲目</translation>
 <translation id="4482953324121162758">系統不會翻譯這個網站。</translation>
-<translation id="4486757593530038591">開啟這項功能時,網站不會根據你在各網站的瀏覽活動放送個人化廣告。某些網站的功能可能無法正常運作。</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">這些功能預設為停用。日後發布的 Chrome 版本將不再提供這些功能。</translation>
 <translation id="4493480324863638523">網址無效。網址必須採用標準架構,例如 http://example.com 或 https://example.com。</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb
index eb056e4..14706077 100644
--- a/components/strings/components_strings_zu.xtb
+++ b/components/strings/components_strings_zu.xtb
@@ -812,7 +812,6 @@
 <translation id="4466881336512663640">Izinguquko zefomu zizolahleka. Ingabe uqinisekile ukuthi ufuna ukuqhubeka?</translation>
 <translation id="4477350412780666475">Ithrekhi elandelayo</translation>
 <translation id="4482953324121162758">Leli sayithi ngeke lihunyushwe.</translation>
-<translation id="4486757593530038591">Uma kuvuliwe, amasayithi awakwazi ukusebenzisa umsebenzi wokuphequlula kuwo wonke amasayithi ahlukahlukene ukwenza ngezifiso izikhangiso. Izici ezikwamanye amasayithi zingase zinqamuke.</translation>
 <translation id="4490717597759821841">A7</translation>
 <translation id="4492519888999857993">Lezi zici zikhutshazwe ngokuzenzakalela. Ngeke zize zitholakale kuzinguqulo ezizayo ze-Chrome.</translation>
 <translation id="4493480324863638523">I-URLengavumelekile. Kumele kube i-URL ene-schema esijwayelekile, isb. i-http://example.com noma i-https://example.com.</translation>
diff --git a/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_payer_errors.Nexus_5-19.png b/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_payer_errors.Nexus_5-19.png
deleted file mode 100644
index 19ac8365..0000000
--- a/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_payer_errors.Nexus_5-19.png
+++ /dev/null
Binary files differ
diff --git a/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_payer_errors.Nexus_5-19.png.sha1 b/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_payer_errors.Nexus_5-19.png.sha1
new file mode 100644
index 0000000..4d56c99
--- /dev/null
+++ b/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_payer_errors.Nexus_5-19.png.sha1
@@ -0,0 +1 @@
+51ef643a616f4279b88b1a8cbacc63bd9f084595
\ No newline at end of file
diff --git a/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_shipping_address_errors.Nexus_5-19.png b/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_shipping_address_errors.Nexus_5-19.png
deleted file mode 100644
index 66762770..0000000
--- a/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_shipping_address_errors.Nexus_5-19.png
+++ /dev/null
Binary files differ
diff --git a/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_shipping_address_errors.Nexus_5-19.png.sha1 b/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_shipping_address_errors.Nexus_5-19.png.sha1
new file mode 100644
index 0000000..22e8586
--- /dev/null
+++ b/components/test/data/payments/render_tests/PaymentRequestRetryTest.retry_with_shipping_address_errors.Nexus_5-19.png.sha1
@@ -0,0 +1 @@
+ce57dbcd39965d7ba9f419f9fa6fb58201fa30f5
\ No newline at end of file
diff --git a/components/test/data/printing/unsorted_custompapers.plist b/components/test/data/printing/unsorted_custompapers.plist
new file mode 100644
index 0000000..911c37a7
--- /dev/null
+++ b/components/test/data/printing/unsorted_custompapers.plist
Binary files differ
diff --git a/components/ui_devtools/css_agent.cc b/components/ui_devtools/css_agent.cc
index e3c403b3..efdbdf5 100644
--- a/components/ui_devtools/css_agent.cc
+++ b/components/ui_devtools/css_agent.cc
@@ -147,8 +147,8 @@
 }
 
 Response NodeNotFoundError(int node_id) {
-  return Response::Error("Node with id=" + std::to_string(node_id) +
-                         " not found");
+  return Response::ServerError("Node with id=" + base::NumberToString(node_id) +
+                               " not found");
 }
 
 Response ParseProperties(const std::string& style_text,
@@ -158,13 +158,14 @@
       style_text, ":;", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 
   if (tokens.size() < 2 || tokens.size() % 2 != 0)
-    return Response::Error("Need both a property name and value.");
+    return Response::ServerError("Need both a property name and value.");
 
   for (size_t i = 0; i < tokens.size() - 1; i += 2) {
     const std::string& property = tokens.at(i);
     int value;
     if (!base::StringToInt(tokens.at(i + 1), &value)) {
-      return Response::Error("Unable to parse value for property=" + property);
+      return Response::ServerError("Unable to parse value for property=" +
+                                   property);
     }
 
     if (property == kHeight)
@@ -178,9 +179,9 @@
     else if (property == kVisibility)
       *visible = std::max(0, value) == 1;
     else
-      return Response::Error("Unsupported property=" + property);
+      return Response::ServerError("Unsupported property=" + property);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 std::unique_ptr<CSS::CSSStyleSheetHeader> BuildObjectForStyleSheetInfo(
@@ -210,12 +211,12 @@
 
 Response CSSAgent::enable() {
   dom_agent_->AddObserver(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response CSSAgent::disable() {
   dom_agent_->RemoveObserver(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response CSSAgent::getMatchedStylesForNode(
@@ -225,7 +226,7 @@
   if (!ui_element)
     return NodeNotFoundError(node_id);
   *matched_css_rules = BuildMatchedStyles(ui_element);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response CSSAgent::getStyleSheetText(const protocol::String& style_sheet_id,
@@ -236,19 +237,19 @@
       style_sheet_id, "_", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
   if (ids.size() < 2 || !base::StringToInt(ids[0], &node_id) ||
       !base::StringToInt(ids[1], &stylesheet_id))
-    return Response::Error("Invalid stylesheet id");
+    return Response::ServerError("Invalid stylesheet id");
 
   UIElement* ui_element = dom_agent_->GetElementFromNodeId(node_id);
   if (!ui_element)
-    return Response::Error("Node id not found");
+    return Response::ServerError("Node id not found");
 
   auto sources = ui_element->GetSources();
   if (static_cast<int>(sources.size()) <= stylesheet_id)
-    return Response::Error("Stylesheet id not found");
+    return Response::ServerError("Stylesheet id not found");
 
   if (GetSourceCode(sources[stylesheet_id].path_, result))
-    return Response::OK();
-  return Response::Error("Could not read source file");
+    return Response::Success();
+  return Response::ServerError("Could not read source file");
 }
 
 Response CSSAgent::setStyleTexts(
@@ -264,12 +265,12 @@
                           base::SPLIT_WANT_NONEMPTY);
     if (ids.size() < 2 || !base::StringToInt(ids[0], &node_id) ||
         !base::StringToInt(ids[1], &stylesheet_id))
-      return Response::Error("Invalid stylesheet id");
+      return Response::ServerError("Invalid stylesheet id");
 
     UIElement* ui_element = dom_agent_->GetElementFromNodeId(node_id);
 
     if (!ui_element)
-      return Response::Error("Node id not found");
+      return Response::ServerError("Node id not found");
     // Handle setting properties from metadata for View.
     if (ui_element->type() == VIEW)
       ui_element->SetPropertiesFromString(edit->getText());
@@ -281,7 +282,7 @@
 
     Response response(
         ParseProperties(edit->getText(), &updated_bounds, &visible));
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
 
     if (!SetPropertiesForUIElement(ui_element, updated_bounds, visible))
@@ -293,7 +294,7 @@
                                      .properties_));
   }
   *result = std::move(updated_styles);
-  return Response::OK();
+  return Response::Success();
 }
 
 void CSSAgent::OnElementBoundsChanged(UIElement* ui_element) {
diff --git a/components/ui_devtools/css_agent_unittest.cc b/components/ui_devtools/css_agent_unittest.cc
index 64a0b29..3e1e64b0 100644
--- a/components/ui_devtools/css_agent_unittest.cc
+++ b/components/ui_devtools/css_agent_unittest.cc
@@ -110,7 +110,7 @@
     edits->emplace_back(std::move(edit));
     std::unique_ptr<StyleArray> output;
     auto response = css_agent_->setStyleTexts(std::move(edits), &output);
-    return {response.isSuccess(), std::move(output)};
+    return {response.IsSuccess(), std::move(output)};
   }
 
   std::string GetValueForProperty(protocol::CSS::CSSStyle* style,
@@ -134,7 +134,7 @@
     std::string output;
     auto response = css_agent_->getStyleSheetText(
         BuildStylesheetUId(element()->node_id(), 0), &output);
-    return {response.isSuccess(), output};
+    return {response.IsSuccess(), output};
   }
 
   CSSAgent* css_agent() { return css_agent_.get(); }
diff --git a/components/ui_devtools/devtools_base_agent.h b/components/ui_devtools/devtools_base_agent.h
index 7f44cdcc..e3d6f0f 100644
--- a/components/ui_devtools/devtools_base_agent.h
+++ b/components/ui_devtools/devtools_base_agent.h
@@ -38,12 +38,14 @@
 
   // Common methods between all generated Backends, subclasses may
   // choose to override them (but not necessary).
-  protocol::Response enable() override { return protocol::Response::OK(); }
+  protocol::Response enable() override { return protocol::Response::Success(); }
 
-  protocol::Response disable() override { return protocol::Response::OK(); }
+  protocol::Response disable() override {
+    return protocol::Response::Success();
+  }
 
  protected:
-  UiDevToolsBaseAgent() {}
+  UiDevToolsBaseAgent() = default;
   typename DomainMetainfo::FrontendClass* frontend() const {
     return frontend_.get();
   }
diff --git a/components/ui_devtools/devtools_client.cc b/components/ui_devtools/devtools_client.cc
index b37887a8..7754c9c 100644
--- a/components/ui_devtools/devtools_client.cc
+++ b/components/ui_devtools/devtools_client.cc
@@ -5,6 +5,7 @@
 #include "components/ui_devtools/devtools_client.h"
 
 #include "components/ui_devtools/devtools_server.h"
+#include "third_party/inspector_protocol/crdtp/dispatch.h"
 #include "third_party/inspector_protocol/crdtp/json.h"
 
 namespace ui_devtools {
@@ -34,15 +35,25 @@
   std::vector<uint8_t> cbor;
   crdtp::Status status =
       crdtp::json::ConvertJSONToCBOR(crdtp::SpanFrom(json), &cbor);
-  LOG_IF(ERROR, !status.ok()) << status.ToASCIIString();
-
-  int call_id;
-  std::string method;
-  std::unique_ptr<protocol::Value> protocolCommand =
-      protocol::Value::parseBinary(cbor.data(), cbor.size());
-  if (dispatcher_.parseCommand(protocolCommand.get(), &call_id, &method)) {
-    dispatcher_.dispatch(call_id, method, std::move(protocolCommand),
-                         crdtp::SpanFrom(cbor));
+  if (!status.ok()) {
+    dispatcher_.channel()->SendProtocolNotification(
+        crdtp::CreateErrorNotification(
+            crdtp::DispatchResponse::ParseError(status.ToASCIIString())));
+    return;
+  }
+  crdtp::Dispatchable dispatchable(crdtp::SpanFrom(cbor));
+  if (dispatchable.ok()) {
+    dispatcher_.Dispatch(dispatchable).Run();
+    return;
+  }
+  if (dispatchable.HasCallId()) {
+    dispatcher_.channel()->SendProtocolResponse(
+        dispatchable.CallId(),
+        crdtp::CreateErrorResponse(dispatchable.CallId(),
+                                   dispatchable.DispatchError()));
+  } else {
+    dispatcher_.channel()->SendProtocolNotification(
+        crdtp::CreateErrorNotification(dispatchable.DispatchError()));
   }
 }
 
@@ -71,27 +82,27 @@
   std::string json;
   crdtp::Status status = crdtp::json::ConvertCBORToJSON(
       crdtp::SpanFrom(message->Serialize()), &json);
-  LOG_IF(ERROR, !status.ok()) << status.ToASCIIString();
+  DCHECK(status.ok());  // CBOR was generated by Chrome, so we expect it's ok.
   server_->SendOverWebSocket(connection_id_, base::StringPiece(json));
 }
 
-void UiDevToolsClient::sendProtocolResponse(
+void UiDevToolsClient::SendProtocolResponse(
     int callId,
     std::unique_ptr<protocol::Serializable> message) {
   MaybeSendProtocolResponseOrNotification(std::move(message));
 }
 
-void UiDevToolsClient::sendProtocolNotification(
+void UiDevToolsClient::SendProtocolNotification(
     std::unique_ptr<protocol::Serializable> message) {
   MaybeSendProtocolResponseOrNotification(std::move(message));
 }
 
-void UiDevToolsClient::flushProtocolNotifications() {
+void UiDevToolsClient::FlushProtocolNotifications() {
   NOTIMPLEMENTED();
 }
 
-void UiDevToolsClient::fallThrough(int call_id,
-                                   const std::string& method,
+void UiDevToolsClient::FallThrough(int call_id,
+                                   crdtp::span<uint8_t> method,
                                    crdtp::span<uint8_t> message) {
   NOTIMPLEMENTED();
 }
diff --git a/components/ui_devtools/devtools_client.h b/components/ui_devtools/devtools_client.h
index 4a7a1c4..8cbe1977 100644
--- a/components/ui_devtools/devtools_client.h
+++ b/components/ui_devtools/devtools_client.h
@@ -42,14 +42,14 @@
       std::unique_ptr<protocol::Serializable> message);
 
   // protocol::FrontendChannel
-  void sendProtocolResponse(
+  void SendProtocolResponse(
       int callId,
       std::unique_ptr<protocol::Serializable> message) override;
-  void sendProtocolNotification(
+  void SendProtocolNotification(
       std::unique_ptr<protocol::Serializable> message) override;
-  void flushProtocolNotifications() override;
-  void fallThrough(int call_id,
-                   const std::string& method,
+  void FlushProtocolNotifications() override;
+  void FallThrough(int call_id,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> message) override;
 
   std::string name_;
diff --git a/components/ui_devtools/dom_agent.cc b/components/ui_devtools/dom_agent.cc
index 45d967d..71e049cc 100644
--- a/components/ui_devtools/dom_agent.cc
+++ b/components/ui_devtools/dom_agent.cc
@@ -105,21 +105,21 @@
 
 Response DOMAgent::disable() {
   Reset();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DOMAgent::getDocument(std::unique_ptr<Node>* out_root) {
   element_root_->ResetNodeId();
   *out_root = BuildInitialTree();
   is_document_created_ = true;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DOMAgent::pushNodesByBackendIdsToFrontend(
     std::unique_ptr<protocol::Array<int>> backend_node_ids,
     std::unique_ptr<protocol::Array<int>>* result) {
   *result = std::move(backend_node_ids);
-  return Response::OK();
+  return Response::Success();
 }
 
 void DOMAgent::OnUIElementAdded(UIElement* parent, UIElement* child) {
@@ -351,7 +351,7 @@
     int* result_count) {
   Query query_data = PreprocessQuery(whitespace_trimmed_query);
   if (!query_data.query_.length())
-    return Response::OK();
+    return Response::Success();
 
   std::vector<int> result_collector;
   SearchDomTree(query_data, &result_collector);
@@ -360,7 +360,7 @@
   *result_count = result_collector.size();
   search_results_.insert(
       std::make_pair(*search_id, std::move(result_collector)));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DOMAgent::getSearchResults(
@@ -370,21 +370,21 @@
     std::unique_ptr<protocol::Array<int>>* node_ids) {
   SearchResults::iterator it = search_results_.find(search_id);
   if (it == search_results_.end())
-    return Response::Error("No search session with given id found");
+    return Response::ServerError("No search session with given id found");
 
   int size = it->second.size();
   if (from_index < 0 || to_index > size || from_index >= to_index)
-    return Response::Error("Invalid search result range");
+    return Response::ServerError("Invalid search result range");
 
   *node_ids = std::make_unique<protocol::Array<int>>();
   for (int i = from_index; i < to_index; ++i)
     (*node_ids)->emplace_back((it->second)[i]);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DOMAgent::discardSearchResults(const protocol::String& search_id) {
   search_results_.erase(search_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace ui_devtools
diff --git a/components/ui_devtools/overlay_agent.cc b/components/ui_devtools/overlay_agent.cc
index 5cd89fbe..59907c5 100644
--- a/components/ui_devtools/overlay_agent.cc
+++ b/components/ui_devtools/overlay_agent.cc
@@ -16,18 +16,18 @@
     const protocol::String& in_mode,
     protocol::Maybe<protocol::Overlay::HighlightConfig> in_highlightConfig) {
   NOTREACHED();
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response OverlayAgent::highlightNode(
     std::unique_ptr<protocol::Overlay::HighlightConfig> highlight_config,
     protocol::Maybe<int> node_id) {
   NOTREACHED();
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response OverlayAgent::hideHighlight() {
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 }  // namespace ui_devtools
diff --git a/components/ui_devtools/page_agent.cc b/components/ui_devtools/page_agent.cc
index e371211a..ec2c6a9 100644
--- a/components/ui_devtools/page_agent.cc
+++ b/components/ui_devtools/page_agent.cc
@@ -12,7 +12,7 @@
 
 protocol::Response PageAgent::reload(protocol::Maybe<bool> bypass_cache) {
   NOTREACHED();
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 }  // namespace ui_devtools
diff --git a/components/ui_devtools/tracing_agent.cc b/components/ui_devtools/tracing_agent.cc
index 04db40a6..d843d12 100644
--- a/components/ui_devtools/tracing_agent.cc
+++ b/components/ui_devtools/tracing_agent.cc
@@ -351,7 +351,7 @@
     protocol::Maybe<double> buffer_usage_reporting_interval,
     std::unique_ptr<StartCallback> callback) {
   if (g_any_agent_tracing) {
-    callback->sendFailure(Response::Error("Tracing is already started"));
+    callback->sendFailure(Response::ServerError("Tracing is already started"));
     return;
   }
 
@@ -378,10 +378,10 @@
 
 Response TracingAgent::end() {
   if (!perfetto_session_)
-    return Response::Error("Tracing is not started");
+    return Response::ServerError("Tracing is not started");
 
   if (perfetto_session_->HasTracingFailed())
-    return Response::Error("Tracing failed");
+    return Response::ServerError("Tracing failed");
 
   scoped_refptr<DevToolsTraceEndpointProxy> endpoint;
   // Reset the trace data buffer state.
@@ -389,7 +389,7 @@
   endpoint = new DevToolsTraceEndpointProxy(weak_factory_.GetWeakPtr());
   StopTracing(endpoint, tracing::mojom::kChromeTraceEventLabel);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void TracingAgent::StartTracing(std::unique_ptr<StartCallback> callback) {
diff --git a/components/ui_devtools/ui_devtools_unittest_utils.cc b/components/ui_devtools/ui_devtools_unittest_utils.cc
index 5cc43d96..a8012499 100644
--- a/components/ui_devtools/ui_devtools_unittest_utils.cc
+++ b/components/ui_devtools/ui_devtools_unittest_utils.cc
@@ -30,21 +30,14 @@
                     protocol_notification_messages_.end(), message);
 }
 
-namespace {
-std::string SerializeToJSON(std::unique_ptr<protocol::Serializable> message) {
+void FakeFrontendChannel::SendProtocolNotification(
+    std::unique_ptr<protocol::Serializable> message) {
+  EXPECT_TRUE(allow_notifications_);
   std::string json;
   crdtp::Status status = crdtp::json::ConvertCBORToJSON(
       crdtp::SpanFrom(message->Serialize()), &json);
   DCHECK(status.ok()) << status.ToASCIIString();
-  return json;
-}
-}  // namespace
-
-void FakeFrontendChannel::sendProtocolNotification(
-    std::unique_ptr<protocol::Serializable> message) {
-  EXPECT_TRUE(allow_notifications_);
-  protocol_notification_messages_.push_back(
-      SerializeToJSON(std::move(message)));
+  protocol_notification_messages_.push_back(std::move(json));
 }
 
 }  // namespace ui_devtools
diff --git a/components/ui_devtools/ui_devtools_unittest_utils.h b/components/ui_devtools/ui_devtools_unittest_utils.h
index d248ea7..6662768 100644
--- a/components/ui_devtools/ui_devtools_unittest_utils.h
+++ b/components/ui_devtools/ui_devtools_unittest_utils.h
@@ -25,14 +25,14 @@
   }
 
   // FrontendChannel:
-  void sendProtocolResponse(
+  void SendProtocolResponse(
       int callId,
       std::unique_ptr<protocol::Serializable> message) override {}
-  void flushProtocolNotifications() override {}
-  void fallThrough(int call_id,
-                   const std::string& method,
+  void FlushProtocolNotifications() override {}
+  void FallThrough(int call_id,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> message) override {}
-  void sendProtocolNotification(
+  void SendProtocolNotification(
       std::unique_ptr<protocol::Serializable> message) override;
 
  private:
diff --git a/components/ui_devtools/views/overlay_agent_views.cc b/components/ui_devtools/views/overlay_agent_views.cc
index 3554a03..3ab0b536 100644
--- a/components/ui_devtools/views/overlay_agent_views.cc
+++ b/components/ui_devtools/views/overlay_agent_views.cc
@@ -391,7 +391,7 @@
   } else if (in_mode.compare("none") == 0) {
     RemovePreTargetHandler();
   }
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response OverlayAgentViews::highlightNode(
@@ -403,7 +403,7 @@
 protocol::Response OverlayAgentViews::hideHighlight() {
   if (layer_for_highlighting_ && layer_for_highlighting_->visible())
     layer_for_highlighting_->SetVisible(false);
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 void OverlayAgentViews::ShowDistancesInHighlightOverlay(int pinned_id,
@@ -469,10 +469,10 @@
                                                     bool show_size) {
   UIElement* element = dom_agent()->GetElementFromNodeId(node_id);
   if (!element)
-    return protocol::Response::Error("No node found with that id");
+    return protocol::Response::ServerError("No node found with that id");
 
   if (element->type() == UIElementType::ROOT)
-    return protocol::Response::Error("Cannot highlight root node.");
+    return protocol::Response::ServerError("Cannot highlight root node.");
 
   if (!layer_for_highlighting_) {
     layer_for_highlighting_.reset(new ui::Layer(ui::LayerType::LAYER_TEXTURED));
@@ -485,7 +485,7 @@
   show_size_on_canvas_ = show_size;
   layer_for_highlighting_->SetVisible(
       UpdateHighlight(element->GetNodeWindowAndScreenBounds()));
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 void OverlayAgentViews::OnMouseEvent(ui::MouseEvent* event) {
diff --git a/components/ui_devtools/views/page_agent_views.cc b/components/ui_devtools/views/page_agent_views.cc
index 87175a7..3c12aae 100644
--- a/components/ui_devtools/views/page_agent_views.cc
+++ b/components/ui_devtools/views/page_agent_views.cc
@@ -73,12 +73,12 @@
         base::CommandLine::ForCurrentProcess()->argv());
     PaintRectVector(dom_agent_->element_root()->children());
   }
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response PageAgentViews::reload(protocol::Maybe<bool> bypass_cache) {
   if (!bypass_cache.isJust())
-    return protocol::Response::OK();
+    return protocol::Response::Success();
 
   bool shift_pressed = bypass_cache.fromMaybe(false);
 
@@ -98,7 +98,7 @@
     }
     PaintRectVector(dom_agent_->element_root()->children());
   }
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response PageAgentViews::getResourceTree(
@@ -128,7 +128,7 @@
           .setResources(std::move(subresources))
           .build();
   *object = std::move(result);
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response PageAgentViews::getResourceContent(
@@ -139,17 +139,17 @@
   auto split_url = base::SplitStringUsingSubstr(
       in_url, "src/", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
   if (split_url.size() != 2)
-    return protocol::Response::Error("Invalid URL");
+    return protocol::Response::ServerError("Invalid URL");
 
   auto split_path = base::SplitStringUsingSubstr(
       split_url[1], "?l=", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
   if (split_path.size() != 2)
-    return protocol::Response::Error("Invalid URL");
+    return protocol::Response::ServerError("Invalid URL");
 
   if (GetSourceCode(split_path[0], out_content))
-    return protocol::Response::OK();
+    return protocol::Response::Success();
   else
-    return protocol::Response::Error("Could not read source file");
+    return protocol::Response::ServerError("Could not read source file");
 }
 
 bool PageAgentViews::devtools_dismiss_override() {
diff --git a/components/ui_devtools/views/page_agent_views_unittest.cc b/components/ui_devtools/views/page_agent_views_unittest.cc
index b9ebbf3e..bc5b0a1 100644
--- a/components/ui_devtools/views/page_agent_views_unittest.cc
+++ b/components/ui_devtools/views/page_agent_views_unittest.cc
@@ -74,7 +74,7 @@
 
     auto response =
         page_agent()->getResourceContent("1", url_input, &result, &out_bool);
-    return {response.isSuccess(), result};
+    return {response.IsSuccess(), result};
   }
 
  protected:
@@ -151,7 +151,7 @@
 
 TEST_F(PageAgentViewsTest, GetResourceTree) {
   std::unique_ptr<protocol::Page::FrameResourceTree> resource_tree;
-  EXPECT_TRUE(page_agent()->getResourceTree(&resource_tree).isSuccess());
+  EXPECT_TRUE(page_agent()->getResourceTree(&resource_tree).IsSuccess());
 
   protocol::Page::Frame* frame_object = resource_tree->getFrame();
   EXPECT_EQ(frame_object->getId(), "1");
@@ -190,4 +190,4 @@
   EXPECT_EQ(result.second, "");
 }
 
-}  // namespace ui_devtools
\ No newline at end of file
+}  // namespace ui_devtools
diff --git a/components/ui_devtools/viz/BUILD.gn b/components/ui_devtools/viz/BUILD.gn
index 296acf1a..ec2aad1 100644
--- a/components/ui_devtools/viz/BUILD.gn
+++ b/components/ui_devtools/viz/BUILD.gn
@@ -21,6 +21,7 @@
   deps = [
     "//components/ui_devtools",
     "//components/viz/service",
+    "//third_party/inspector_protocol:crdtp",
   ]
 }
 
diff --git a/components/ui_devtools/viz/dom_agent_viz.cc b/components/ui_devtools/viz/dom_agent_viz.cc
index 0431cfc..648045f 100644
--- a/components/ui_devtools/viz/dom_agent_viz.cc
+++ b/components/ui_devtools/viz/dom_agent_viz.cc
@@ -298,7 +298,7 @@
 protocol::Response DOMAgentViz::enable() {
   frame_sink_manager_->AddObserver(this);
   surface_manager_->AddObserver(this);
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response DOMAgentViz::disable() {
diff --git a/components/ui_devtools/viz/overlay_agent_viz.cc b/components/ui_devtools/viz/overlay_agent_viz.cc
index 85e7d62..f57474f5 100644
--- a/components/ui_devtools/viz/overlay_agent_viz.cc
+++ b/components/ui_devtools/viz/overlay_agent_viz.cc
@@ -14,17 +14,17 @@
 protocol::Response OverlayAgentViz::setInspectMode(
     const protocol::String& in_mode,
     protocol::Maybe<protocol::Overlay::HighlightConfig> in_highlightConfig) {
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response OverlayAgentViz::highlightNode(
     std::unique_ptr<protocol::Overlay::HighlightConfig> highlight_config,
     protocol::Maybe<int> node_id) {
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response OverlayAgentViz::hideHighlight() {
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 }  // namespace ui_devtools
diff --git a/content/browser/accessibility/accessibility_auralinux_browsertest.cc b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
index b9cf4dd..81984b0 100644
--- a/content/browser/accessibility/accessibility_auralinux_browsertest.cc
+++ b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
@@ -1662,4 +1662,26 @@
   }
 }
 
+IN_PROC_BROWSER_TEST_F(AccessibilityAuraLinuxBrowserTest,
+                       TestGetIndexInParent) {
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <p>Hello world</p>
+      <p>Another paragraph.</p>
+      <p>Goodbye world.</p>
+      )HTML");
+
+  // Retrieve the AtkObject interface for the document node.
+  AtkObject* document = GetRendererAccessible();
+  ASSERT_TRUE(ATK_IS_COMPONENT(document));
+  EXPECT_EQ(0, atk_object_get_index_in_parent(document));
+
+  int number_of_children = atk_object_get_n_accessible_children(document);
+  for (int i = 0; i < number_of_children; i++) {
+    AtkObject* p = atk_object_ref_accessible_child(document, i);
+    EXPECT_NE(p, nullptr);
+    EXPECT_EQ(i, atk_object_get_index_in_parent(p));
+    g_object_unref(p);
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 63748104..0d6b5f3 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1693,6 +1693,12 @@
 }
 
 int BrowserAccessibility::GetIndexInParent() {
+  if (manager()->GetRoot() == this && PlatformGetParent() == nullptr) {
+    // If it is a root node of WebContent, it doesn't have a parent and a
+    // valid index in parent. So it returns -1 in order to compute its
+    // index at AXPlatformNodeBase.
+    return -1;
+  }
   return node_ ? node_->GetUnignoredIndexInParent() : -1;
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index 45507b9d..3c656cb 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -601,10 +601,16 @@
   if (obj) {
     FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, obj);
     FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, obj);
-    if (obj->GetRole() == ax::mojom::Role::kMenu) {
-      FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPEND, obj);
-      FireUiaAccessibilityEvent(UIA_MenuClosedEventId, obj);
-    }
+  }
+}
+
+void BrowserAccessibilityManagerWin::OnNodeWillBeDeleted(ui::AXTree* tree,
+                                                         ui::AXNode* node) {
+  if (node->data().role == ax::mojom::Role::kMenu) {
+    BrowserAccessibility* obj = GetFromAXNode(node);
+    DCHECK(obj);
+    FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPEND, obj);
+    FireUiaAccessibilityEvent(UIA_MenuClosedEventId, obj);
   }
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.h b/content/browser/accessibility/browser_accessibility_manager_win.h
index 90df050b..8d822f3 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.h
+++ b/content/browser/accessibility/browser_accessibility_manager_win.h
@@ -80,6 +80,7 @@
  protected:
   // AXTreeObserver methods.
   void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override;
+  void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override;
   void OnAtomicUpdateFinished(
       ui::AXTree* tree,
       bool root_changed,
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc
index 04f8b8d..c0a9b04 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -125,7 +125,7 @@
   accessibility_mode_ = ui::AXMode();
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kForceRendererAccessibility)) {
-    accessibility_mode_ = ui::kAXModeComplete;
+    AddAccessibilityModeFlags(ui::kAXModeComplete);
   }
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_unittest.cc b/content/browser/accessibility/browser_accessibility_unittest.cc
index 9cab3f8e..4285700 100644
--- a/content/browser/accessibility/browser_accessibility_unittest.cc
+++ b/content/browser/accessibility/browser_accessibility_unittest.cc
@@ -825,4 +825,33 @@
   EXPECT_EQ("name2", parent_manager->GetRoot()->GetName());
 }
 
+TEST_F(BrowserAccessibilityTest, GetIndexInParent) {
+  ui::AXNodeData root;
+  root.id = 1;
+  root.role = ax::mojom::Role::kRootWebArea;
+  root.child_ids = {2};
+
+  ui::AXNodeData static_text;
+  static_text.id = 2;
+  static_text.SetName("ABC");
+  static_text.role = ax::mojom::Role::kStaticText;
+
+  std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager(
+      BrowserAccessibilityManager::Create(
+          MakeAXTreeUpdate(root, static_text),
+          test_browser_accessibility_delegate_.get(),
+          new BrowserAccessibilityFactory()));
+  ASSERT_NE(nullptr, browser_accessibility_manager.get());
+
+  BrowserAccessibility* root_accessible =
+      browser_accessibility_manager->GetRoot();
+  ASSERT_NE(nullptr, root_accessible);
+  // Should be -1 for kRootWebArea since it doesn't have a calculated index.
+  EXPECT_EQ(-1, root_accessible->GetIndexInParent());
+  BrowserAccessibility* child_accessible = root_accessible->InternalGetChild(0);
+  ASSERT_NE(nullptr, child_accessible);
+  // Returns the index calculated in AXNode.
+  EXPECT_EQ(0, child_accessible->GetIndexInParent());
+}
+
 }  // namespace content
diff --git a/content/browser/accessibility/dump_accessibility_browsertest_base.cc b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
index fb723a1..f6eed610 100644
--- a/content/browser/accessibility/dump_accessibility_browsertest_base.cc
+++ b/content/browser/accessibility/dump_accessibility_browsertest_base.cc
@@ -367,7 +367,6 @@
   }
 
   // Validate against the expectation file.
-  actual_lines.push_back(kMarkEndOfFile);
   bool matches_expectation = test_helper.ValidateAgainstExpectation(
       file_path, expected_file, actual_lines, *expected_lines);
   EXPECT_TRUE(matches_expectation);
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc
index 67d778eb..bd599f8 100644
--- a/content/browser/devtools/devtools_agent_host_impl.cc
+++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -163,13 +163,12 @@
   return true;
 }
 
-bool DevToolsAgentHostImpl::DispatchProtocolMessage(
+void DevToolsAgentHostImpl::DispatchProtocolMessage(
     DevToolsAgentHostClient* client,
     base::span<const uint8_t> message) {
   DevToolsSession* session = SessionByClient(client);
-  if (!session)
-    return false;
-  return session->DispatchProtocolMessage(message);
+  if (session)
+    session->DispatchProtocolMessage(message);
 }
 
 void DevToolsAgentHostImpl::DetachInternal(DevToolsSession* session) {
diff --git a/content/browser/devtools/devtools_agent_host_impl.h b/content/browser/devtools/devtools_agent_host_impl.h
index d626b30..3e8e4a8 100644
--- a/content/browser/devtools/devtools_agent_host_impl.h
+++ b/content/browser/devtools/devtools_agent_host_impl.h
@@ -31,7 +31,7 @@
   // DevToolsAgentHost implementation.
   bool AttachClient(DevToolsAgentHostClient* client) override;
   bool DetachClient(DevToolsAgentHostClient* client) override;
-  bool DispatchProtocolMessage(DevToolsAgentHostClient* client,
+  void DispatchProtocolMessage(DevToolsAgentHostClient* client,
                                base::span<const uint8_t> message) override;
   bool IsAttached() override;
   void InspectElement(RenderFrameHost* frame_host, int x, int y) override;
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc
index f793450..9f8597b 100644
--- a/content/browser/devtools/devtools_session.cc
+++ b/content/browser/devtools/devtools_session.cc
@@ -8,6 +8,8 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/containers/flat_set.h"
+#include "base/debug/stack_trace.h"
 #include "content/browser/devtools/devtools_manager.h"
 #include "content/browser/devtools/protocol/devtools_domain_handler.h"
 #include "content/browser/devtools/protocol/protocol.h"
@@ -16,22 +18,29 @@
 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
 #include "content/public/browser/devtools_manager_delegate.h"
 #include "third_party/inspector_protocol/crdtp/cbor.h"
+#include "third_party/inspector_protocol/crdtp/dispatch.h"
 #include "third_party/inspector_protocol/crdtp/json.h"
 
 namespace content {
 namespace {
-
-bool ShouldSendOnIO(const std::string& method) {
-  // Keep in sync with WebDevToolsAgent::ShouldInterruptForMethod.
-  // TODO(petermarshall): find a way to share this.
-  return method == "Debugger.pause" || method == "Debugger.setBreakpoint" ||
-         method == "Debugger.setBreakpointByUrl" ||
-         method == "Debugger.removeBreakpoint" ||
-         method == "Debugger.setBreakpointsActive" ||
-         method == "Debugger.getStackTrace" ||
-         method == "Performance.getMetrics" || method == "Page.crash" ||
-         method == "Runtime.terminateExecution" ||
-         method == "Emulation.setScriptExecutionDisabled";
+// Keep in sync with WebDevToolsAgent::ShouldInterruptForMethod.
+// TODO(petermarshall): find a way to share this.
+bool ShouldSendOnIO(crdtp::span<uint8_t> method) {
+  static auto* kEntries = new std::vector<crdtp::span<uint8_t>>{
+      crdtp::SpanFrom("Debugger.getStackTrace"),
+      crdtp::SpanFrom("Debugger.pause"),
+      crdtp::SpanFrom("Debugger.removeBreakpoint"),
+      crdtp::SpanFrom("Debugger.setBreakpoint"),
+      crdtp::SpanFrom("Debugger.setBreakpointByUrl"),
+      crdtp::SpanFrom("Debugger.setBreakpointsActive"),
+      crdtp::SpanFrom("Emulation.setScriptExecutionDisabled"),
+      crdtp::SpanFrom("Page.crash"),
+      crdtp::SpanFrom("Performance.getMetrics"),
+      crdtp::SpanFrom("Runtime.terminateExecution"),
+  };
+  DCHECK(std::is_sorted(kEntries->begin(), kEntries->end(), crdtp::SpanLt()));
+  return std::binary_search(kEntries->begin(), kEntries->end(), method,
+                            crdtp::SpanLt());
 }
 
 // Async control commands (such as CSS.enable) are idempotant and can
@@ -43,13 +52,19 @@
 // Ideally all non-control async commands shoulds be listed here but we
 // conservatively start with Runtime domain where the decision is more
 // clear.
-bool TerminateOnCrossProcessNavigation(const std::string& method) {
-  return method == "Runtime.evaluate" || method == "Runtime.awaitPromise" ||
-         method == "Runtime.callFunctionOn" || method == "Runtime.runScript" ||
-         method == "Runtime.terminateExecution";
+bool TerminateOnCrossProcessNavigation(crdtp::span<uint8_t> method) {
+  static auto* kEntries = new std::vector<crdtp::span<uint8_t>>{
+      crdtp::SpanFrom("Runtime.awaitPromise"),
+      crdtp::SpanFrom("Runtime.callFunctionOn"),
+      crdtp::SpanFrom("Runtime.evaluate"),
+      crdtp::SpanFrom("Runtime.runScript"),
+      crdtp::SpanFrom("Runtime.terminateExecution"),
+  };
+  DCHECK(std::is_sorted(kEntries->begin(), kEntries->end(), crdtp::SpanLt()));
+  return std::binary_search(kEntries->begin(), kEntries->end(), method,
+                            crdtp::SpanLt());
 }
 
-const char kMethod[] = "method";
 const char kResumeMethod[] = "Runtime.runIfWaitingForDebugger";
 const char kSessionId[] = "sessionId";
 
@@ -59,10 +74,10 @@
 
 DevToolsSession::PendingMessage::PendingMessage(PendingMessage&&) = default;
 DevToolsSession::PendingMessage::PendingMessage(int call_id,
-                                                const std::string& method,
+                                                crdtp::span<uint8_t> method,
                                                 crdtp::span<uint8_t> payload)
     : call_id(call_id),
-      method(method),
+      method(method.begin(), method.end()),
       payload(payload.begin(), payload.end()) {}
 
 DevToolsSession::PendingMessage::~PendingMessage() = default;
@@ -162,12 +177,13 @@
     for (auto it = pending_messages_.begin(); it != pending_messages_.end();) {
       const PendingMessage& message = *it;
       if (waiting_for_response_.count(message.call_id) &&
-          TerminateOnCrossProcessNavigation(message.method)) {
+          TerminateOnCrossProcessNavigation(crdtp::SpanFrom(message.method))) {
         // Send error to the client and remove the message from pending.
-        auto error = protocol::InternalResponse::createErrorResponse(
-            message.call_id, protocol::DispatchResponse::kServerError,
-            kTargetClosedMessage);
-        sendProtocolResponse(message.call_id, std::move(error));
+        SendProtocolResponse(
+            message.call_id,
+            crdtp::CreateErrorResponse(
+                message.call_id,
+                crdtp::DispatchResponse::ServerError(kTargetClosedMessage)));
         it = pending_messages_.erase(it);
       } else {
         // We'll send or re-send the message in ResumeSendingMessagesToAgent.
@@ -197,93 +213,124 @@
 
 // The client of the devtools session will call this method to send a message
 // to handlers / agents that the session is connected with.
-bool DevToolsSession::DispatchProtocolMessage(
+void DevToolsSession::DispatchProtocolMessage(
     base::span<const uint8_t> message) {
+  if (client_->UsesBinaryProtocol()) {
+    crdtp::Status status =
+        crdtp::cbor::CheckCBORMessage(crdtp::SpanFrom(message));
+    if (!status.ok()) {
+      DispatchProtocolMessageToClient(
+          crdtp::CreateErrorNotification(
+              crdtp::DispatchResponse::ParseError(status.ToASCIIString()))
+              ->Serialize());
+      return;
+    }
+  }
+
   // If the session is in proxy mode, then |message| will be sent to
   // an external session, so it needs to be sent as JSON.
   // TODO(dgozman): revisit the proxy delegate.
-  if (proxy_delegate_) {
-    if (client_->UsesBinaryProtocol()) {
-      DCHECK(crdtp::cbor::IsCBORMessage(crdtp::SpanFrom(message)));
-      std::vector<uint8_t> json;
-      crdtp::Status status =
-          crdtp::json::ConvertCBORToJSON(crdtp::SpanFrom(message), &json);
-      LOG_IF(ERROR, !status.ok()) << status.ToASCIIString();
-      proxy_delegate_->SendMessageToBackend(this, json);
-      return true;
+  if (proxy_delegate_) {                   // External session wants JSON.
+    if (!client_->UsesBinaryProtocol()) {  // Client sent JSON.
+      proxy_delegate_->SendMessageToBackend(this, message);
+      return;
     }
-    proxy_delegate_->SendMessageToBackend(this, message);
-    return true;
+    // External session wants JSON, but client provided CBOR.
+    std::vector<uint8_t> json;
+    crdtp::Status status =
+        crdtp::json::ConvertCBORToJSON(crdtp::SpanFrom(message), &json);
+    if (status.ok()) {
+      proxy_delegate_->SendMessageToBackend(this, json);
+      return;
+    }
+    DispatchProtocolMessageToClient(
+        crdtp::CreateErrorNotification(
+            crdtp::DispatchResponse::ParseError(status.ToASCIIString()))
+            ->Serialize());
+    return;
   }
+  // Before dispatching, convert the message to CBOR if needed.
   std::vector<uint8_t> converted_cbor_message;
-  if (client_->UsesBinaryProtocol()) {
-    // If the client uses the binary protocol, then |message| is already
-    // CBOR (it comes from the client).
-    DCHECK(crdtp::cbor::IsCBORMessage(crdtp::SpanFrom(message)));
-  } else {
+  if (!client_->UsesBinaryProtocol()) {  // Client sent JSON.
     crdtp::Status status = crdtp::json::ConvertJSONToCBOR(
         crdtp::SpanFrom(message), &converted_cbor_message);
-    LOG_IF(ERROR, !status.ok()) << status.ToASCIIString();
+    if (!status.ok()) {
+      DispatchProtocolMessageToClient(
+          crdtp::CreateErrorNotification(
+              crdtp::DispatchResponse::ParseError(status.ToASCIIString()))
+              ->Serialize());
+      return;
+    }
     message = converted_cbor_message;
   }
-  std::unique_ptr<protocol::DictionaryValue> value =
-      protocol::DictionaryValue::cast(
-          protocol::Value::parseBinary(message.data(), message.size()));
+  // At this point |message| is CBOR.
+  crdtp::Dispatchable dispatchable(crdtp::SpanFrom(message));
+  if (!dispatchable.ok()) {
+    DispatchProtocolMessageToClient(
+        (dispatchable.HasCallId()
+             ? crdtp::CreateErrorResponse(dispatchable.CallId(),
+                                          dispatchable.DispatchError())
+             : crdtp::CreateErrorNotification(dispatchable.DispatchError()))
+            ->Serialize());
 
-  std::string session_id;
-  if (!value || !value->getString(kSessionId, &session_id))
-    return DispatchProtocolMessageInternal(message, std::move(value));
-
+    return;
+  }
+  if (dispatchable.SessionId().empty()) {
+    DispatchProtocolMessageInternal(std::move(dispatchable), message);
+    return;
+  }
+  std::string session_id(dispatchable.SessionId().begin(),
+                         dispatchable.SessionId().end());
   auto it = child_sessions_.find(session_id);
   if (it == child_sessions_.end())
-    return false;
+    return;
   DevToolsSession* session = it->second;
   DCHECK(!session->proxy_delegate_);
-  return session->DispatchProtocolMessageInternal(message, std::move(value));
+  session->DispatchProtocolMessageInternal(std::move(dispatchable), message);
 }
 
-bool DevToolsSession::DispatchProtocolMessageInternal(
-    base::span<const uint8_t> message,
-    std::unique_ptr<protocol::DictionaryValue> value) {
-  std::string method;
-  bool has_method = value && value->getString(kMethod, &method);
-  if (!runtime_resume_.is_null() && has_method && method == kResumeMethod)
+void DevToolsSession::DispatchProtocolMessageInternal(
+    crdtp::Dispatchable dispatchable,
+    base::span<const uint8_t> message) {
+  if (!runtime_resume_.is_null() &&
+      crdtp::SpanEquals(crdtp::SpanFrom(kResumeMethod), dispatchable.Method()))
     std::move(runtime_resume_).Run();
 
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
-  if (delegate && has_method) {
-    delegate->HandleCommand(
-        this, method, message,
-        base::BindOnce(&DevToolsSession::HandleCommand,
-                       weak_factory_.GetWeakPtr(), std::move(value)));
+  if (delegate && !dispatchable.Method().empty()) {
+    delegate->HandleCommand(this, message,
+                            base::BindOnce(&DevToolsSession::HandleCommand,
+                                           weak_factory_.GetWeakPtr()));
   } else {
-    HandleCommand(std::move(value), message);
-  }
-  return true;
-}
-
-void DevToolsSession::HandleCommand(
-    std::unique_ptr<protocol::DictionaryValue> value,
-    base::span<const uint8_t> message) {
-  int call_id;
-  std::string method;
-  if (!dispatcher_->parseCommand(value.get(), &call_id, &method))
-    return;
-  if (browser_only_ || dispatcher_->canDispatch(method)) {
-    TRACE_EVENT_WITH_FLOW2("devtools",
-                           "DevToolsSession::HandleCommand in Browser", call_id,
-                           TRACE_EVENT_FLAG_FLOW_OUT, "method", method.c_str(),
-                           "call_id", call_id);
-    dispatcher_->dispatch(call_id, method, std::move(value),
-                          crdtp::SpanFrom(message));
-  } else {
-    fallThrough(call_id, method, crdtp::SpanFrom(message));
+    HandleCommandInternal(std::move(dispatchable), message);
   }
 }
 
-void DevToolsSession::fallThrough(int call_id,
-                                  const std::string& method,
+void DevToolsSession::HandleCommand(base::span<const uint8_t> message) {
+  HandleCommandInternal(crdtp::Dispatchable(crdtp::SpanFrom(message)), message);
+}
+
+void DevToolsSession::HandleCommandInternal(crdtp::Dispatchable dispatchable,
+                                            base::span<const uint8_t> message) {
+  DCHECK(dispatchable.ok());
+  crdtp::UberDispatcher::DispatchResult dispatched =
+      dispatcher_->Dispatch(dispatchable);
+  if (browser_only_ || dispatched.MethodFound()) {
+    TRACE_EVENT_WITH_FLOW2(
+        "devtools", "DevToolsSession::HandleCommand in Browser",
+        dispatchable.CallId(), TRACE_EVENT_FLAG_FLOW_OUT, "method",
+        std::string(dispatchable.Method().begin(), dispatchable.Method().end()),
+        "call_id", dispatchable.CallId());
+    dispatched.Run();
+  } else {
+    FallThrough(dispatchable.CallId(), dispatchable.Method(),
+                crdtp::SpanFrom(message));
+  }
+}
+
+void DevToolsSession::FallThrough(int call_id,
+                                  crdtp::span<uint8_t> method,
                                   crdtp::span<uint8_t> message) {
   // In browser-only mode, we should've handled everything in dispatcher.
   DCHECK(!browser_only_);
@@ -312,7 +359,7 @@
     std::vector<uint8_t> json;
     crdtp::Status status =
         crdtp::json::ConvertCBORToJSON(crdtp::SpanFrom(message), &json);
-    LOG_IF(ERROR, !status.ok()) << status.ToASCIIString();
+    DCHECK(status.ok()) << status.ToASCIIString();
     message = std::move(json);
   }
   client_->DispatchProtocolMessage(agent_host_, message);
@@ -330,7 +377,7 @@
   DCHECK(!browser_only_);
   // We send all messages on the IO channel for workers so that messages like
   // Debugger.pause don't get stuck behind other blocking messages.
-  if (ShouldSendOnIO(message.method) || use_io_session_) {
+  if (ShouldSendOnIO(crdtp::SpanFrom(message.method)) || use_io_session_) {
     if (io_session_) {
       TRACE_EVENT_WITH_FLOW2(
           "devtools", "DevToolsSession::DispatchToAgent on IO", message.call_id,
@@ -371,21 +418,20 @@
 
 // The following methods handle responses or notifications coming from
 // the browser to the client.
-void DevToolsSession::sendProtocolResponse(
+void DevToolsSession::SendProtocolResponse(
     int call_id,
     std::unique_ptr<protocol::Serializable> message) {
   DispatchProtocolMessageToClient(message->Serialize());
   // |this| may be deleted at this point.
 }
 
-void DevToolsSession::sendProtocolNotification(
+void DevToolsSession::SendProtocolNotification(
     std::unique_ptr<protocol::Serializable> message) {
   DispatchProtocolMessageToClient(message->Serialize());
   // |this| may be deleted at this point.
 }
 
-void DevToolsSession::flushProtocolNotifications() {
-}
+void DevToolsSession::FlushProtocolNotifications() {}
 
 // The following methods handle responses or notifications coming from the
 // renderer (blink) to the client. It is important that these messages not be
@@ -452,7 +498,7 @@
   DevToolsAgentHostClient* client = client_;
   DevToolsAgentHostImpl* agent_host = agent_host_;
   agent_host->DetachInternal(this);
-  // |this| is delete here, do not use any fields below.
+  // |this| is deleted here, do not use any fields below.
   client->AgentHostClosed(agent_host);
 }
 
diff --git a/content/browser/devtools/devtools_session.h b/content/browser/devtools/devtools_session.h
index c6676d0..d60aa42f 100644
--- a/content/browser/devtools/devtools_session.h
+++ b/content/browser/devtools/devtools_session.h
@@ -61,7 +61,7 @@
 
   void AttachToAgent(blink::mojom::DevToolsAgent* agent,
                      bool force_using_io_session);
-  bool DispatchProtocolMessage(base::span<const uint8_t> message);
+  void DispatchProtocolMessage(base::span<const uint8_t> message);
   void SuspendSendingMessagesToAgent();
   void ResumeSendingMessagesToAgent();
 
@@ -88,28 +88,28 @@
 
     PendingMessage(PendingMessage&&);
     PendingMessage(int call_id,
-                   const std::string& method,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> payload);
     ~PendingMessage();
   };
 
   void MojoConnectionDestroyed();
   void DispatchToAgent(const PendingMessage& message);
-  void HandleCommand(std::unique_ptr<protocol::DictionaryValue> value,
-                     base::span<const uint8_t> message);
-  bool DispatchProtocolMessageInternal(
-      base::span<const uint8_t> message,
-      std::unique_ptr<protocol::DictionaryValue> value);
+  void HandleCommand(base::span<const uint8_t> message);
+  void HandleCommandInternal(crdtp::Dispatchable dispatchable,
+                             base::span<const uint8_t> message);
+  void DispatchProtocolMessageInternal(crdtp::Dispatchable dispatchable,
+                                       base::span<const uint8_t> message);
 
   // protocol::FrontendChannel implementation.
-  void sendProtocolResponse(
+  void SendProtocolResponse(
       int call_id,
       std::unique_ptr<protocol::Serializable> message) override;
-  void sendProtocolNotification(
+  void SendProtocolNotification(
       std::unique_ptr<protocol::Serializable> message) override;
-  void flushProtocolNotifications() override;
-  void fallThrough(int call_id,
-                   const std::string& method,
+  void FlushProtocolNotifications() override;
+  void FallThrough(int call_id,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> message) override;
 
   // content::DevToolsAgentHostClientChannel implementation.
diff --git a/content/browser/devtools/devtools_url_loader_interceptor.cc b/content/browser/devtools/devtools_url_loader_interceptor.cc
index db2d539..50e5b36 100644
--- a/content/browser/devtools/devtools_url_loader_interceptor.cc
+++ b/content/browser/devtools/devtools_url_loader_interceptor.cc
@@ -193,7 +193,7 @@
 
   void CancelWithError(std::string error) {
     for (auto& cb : callbacks_)
-      cb->sendFailure(Response::Error(error));
+      cb->sendFailure(Response::ServerError(error));
     callbacks_.clear();
   }
 
@@ -793,7 +793,7 @@
     std::unique_ptr<GetResponseBodyCallback> callback) {
   std::string error_reason;
   if (!CanGetResponseBody(&error_reason)) {
-    callback->sendFailure(Response::Error(std::move(error_reason)));
+    callback->sendFailure(Response::ServerError(std::move(error_reason)));
     return;
   }
   if (!body_reader_) {
@@ -809,7 +809,7 @@
     TakeResponseBodyPipeCallback callback) {
   std::string error_reason;
   if (!CanGetResponseBody(&error_reason)) {
-    std::move(callback).Run(Response::Error(std::move(error_reason)),
+    std::move(callback).Run(Response::ServerError(std::move(error_reason)),
                             mojo::ScopedDataPipeConsumerHandle(),
                             base::EmptyString());
     return;
@@ -827,7 +827,7 @@
     std::unique_ptr<ContinueInterceptedRequestCallback> callback) {
   Response response = InnerContinueRequest(std::move(modifications));
   // |this| may be destroyed at this point.
-  if (response.isSuccess())
+  if (response.IsSuccess())
     callback->sendSuccess();
   else
     callback->sendFailure(std::move(response));
@@ -850,14 +850,15 @@
 Response InterceptionJob::InnerContinueRequest(
     std::unique_ptr<Modifications> modifications) {
   if (!waiting_for_resolution_)
-    return Response::Error("Invalid state for continueInterceptedRequest");
+    return Response::ServerError(
+        "Invalid state for continueInterceptedRequest");
   waiting_for_resolution_ = false;
 
   if (state_ == State::kAuthRequired) {
     if (!modifications->auth_challenge_response)
       return Response::InvalidParams("authChallengeResponse required.");
     ProcessAuthResponse(*modifications->auth_challenge_response);
-    return Response::OK();
+    return Response::Success();
   }
   if (modifications->auth_challenge_response)
     return Response::InvalidParams("authChallengeResponse not expected.");
@@ -876,7 +877,7 @@
     }
     client_->OnComplete(status);
     Shutdown();
-    return Response::OK();
+    return Response::Success();
   }
 
   if (modifications->response_headers || modifications->response_body)
@@ -893,7 +894,7 @@
       // TODO(caseq): report error if other modifications are present.
       state_ = State::kRequestSent;
       loader_->FollowRedirect({}, {}, base::nullopt);
-      return Response::OK();
+      return Response::Success();
     }
   }
   if (state_ == State::kRedirectReceived) {
@@ -906,13 +907,13 @@
       headers->AddHeader("location: " + location);
       GURL redirect_url = create_loader_params_->request.url.Resolve(location);
       if (!redirect_url.is_valid())
-        return Response::Error("Invalid modified URL");
+        return Response::ServerError("Invalid modified URL");
       ProcessRedirectByClient(redirect_url);
-      return Response::OK();
+      return Response::Success();
     }
     client_->OnReceiveRedirect(*response_metadata_->redirect_info,
                                std::move(response_metadata_->head));
-    return Response::OK();
+    return Response::Success();
   }
 
   if (body_reader_) {
@@ -921,7 +922,7 @@
 
     // There are read callbacks pending, so let the reader do its job and come
     // back when it's done.
-    return Response::OK();
+    return Response::Success();
   }
 
   if (response_metadata_) {
@@ -936,13 +937,13 @@
     response_metadata_.reset();
     loader_->ResumeReadingBodyFromNet();
     client_receiver_.Resume();
-    return Response::OK();
+    return Response::Success();
   }
 
   DCHECK_EQ(State::kNotStarted, state_);
   ApplyModificationsToRequest(std::move(modifications));
   StartRequest();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InterceptionJob::ApplyModificationsToRequest(
@@ -1066,7 +1067,7 @@
   }
   ProcessSetCookies(*head->headers, std::move(continue_after_cookies_set));
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InterceptionJob::ProcessSetCookies(const net::HttpResponseHeaders& headers,
@@ -1438,7 +1439,7 @@
     DCHECK_EQ(State::kResponseTaken, state_);
     DCHECK(!body_reader_);
     std::move(pending_response_body_pipe_callback_)
-        .Run(Response::OK(), std::move(body),
+        .Run(Response::Success(), std::move(body),
              response_metadata_->head->mime_type);
     return;
   }
diff --git a/content/browser/devtools/protocol/background_service_handler.cc b/content/browser/devtools/protocol/background_service_handler.cc
index 0ca2211b..1775fd1 100644
--- a/content/browser/devtools/protocol/background_service_handler.cc
+++ b/content/browser/devtools/protocol/background_service_handler.cc
@@ -136,7 +136,7 @@
   if (!enabled_services_.empty())
     devtools_context_->RemoveObserver(this);
   enabled_services_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void BackgroundServiceHandler::StartObserving(
@@ -177,13 +177,13 @@
     return Response::InvalidParams("Invalid service name");
 
   if (!enabled_services_.count(service_enum))
-    return Response::OK();
+    return Response::Success();
 
   enabled_services_.erase(service_enum);
   if (enabled_services_.empty())
     devtools_context_->RemoveObserver(this);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void BackgroundServiceHandler::DidGetLoggedEvents(
@@ -216,7 +216,7 @@
     devtools_context_->StopRecording(service_enum);
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BackgroundServiceHandler::ClearEvents(const std::string& service) {
@@ -227,7 +227,7 @@
     return Response::InvalidParams("Invalid service name");
 
   devtools_context_->ClearLoggedBackgroundServiceEvents(service_enum);
-  return Response::OK();
+  return Response::Success();
 }
 
 void BackgroundServiceHandler::OnEventReceived(
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc
index e05367b8..f3b19427 100644
--- a/content/browser/devtools/protocol/browser_handler.cc
+++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -50,7 +50,7 @@
     }
   }
   contexts_with_overridden_permissions_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void BrowserHandler::Wire(UberDispatcher* dispatcher) {
@@ -67,7 +67,7 @@
   *product = GetContentClient()->browser()->GetProduct();
   *user_agent = GetContentClient()->browser()->GetUserAgent();
   *js_version = V8_VERSION_STRING;
-  return Response::OK();
+  return Response::Success();
 }
 
 namespace {
@@ -183,7 +183,7 @@
                                    name);
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response FromProtocolPermissionType(
@@ -239,7 +239,7 @@
   } else {
     return Response::InvalidParams("Unknown permission type: " + type);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response PermissionSettingToPermissionStatus(
@@ -254,7 +254,7 @@
   } else {
     return Response::InvalidParams("Unknown permission setting: " + setting);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace
@@ -274,7 +274,7 @@
     (*out_histograms)->emplace_back(Convert(*h, in_delta.fromMaybe(false)));
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 // static
@@ -284,19 +284,21 @@
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
   if (!delegate)
-    return Response::Error("Browser context management is not supported.");
+    return Response::ServerError(
+        "Browser context management is not supported.");
   if (!browser_context_id.isJust()) {
     *browser_context = delegate->GetDefaultBrowserContext();
     if (*browser_context == nullptr)
-      return Response::Error("Browser context management is not supported.");
-    return Response::OK();
+      return Response::ServerError(
+          "Browser context management is not supported.");
+    return Response::Success();
   }
 
   std::string context_id = browser_context_id.fromJust();
   for (auto* context : delegate->GetBrowserContexts()) {
     if (context->UniqueId() == context_id) {
       *browser_context = context;
-      return Response::OK();
+      return Response::Success();
     }
   }
   return Response::InvalidParams("Failed to find browser context for id " +
@@ -310,19 +312,19 @@
     Maybe<std::string> browser_context_id) {
   BrowserContext* browser_context = nullptr;
   Response response = FindBrowserContext(browser_context_id, &browser_context);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   PermissionType type;
   Response parse_response =
       PermissionDescriptorToPermissionType(std::move(permission), &type);
-  if (!parse_response.isSuccess())
+  if (!parse_response.IsSuccess())
     return parse_response;
 
   blink::mojom::PermissionStatus permission_status;
   Response setting_response =
       PermissionSettingToPermissionStatus(setting, &permission_status);
-  if (!setting_response.isSuccess())
+  if (!setting_response.IsSuccess())
     return setting_response;
 
   PermissionControllerImpl* permission_controller =
@@ -344,7 +346,7 @@
   }
   contexts_with_overridden_permissions_.insert(
       browser_context_id.fromMaybe(std::string()));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::GrantPermissions(
@@ -354,7 +356,7 @@
     Maybe<std::string> browser_context_id) {
   BrowserContext* browser_context = nullptr;
   Response response = FindBrowserContext(browser_context_id, &browser_context);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   std::vector<PermissionType> internal_permissions;
@@ -362,7 +364,7 @@
   for (const protocol::Browser::PermissionType& t : *permissions) {
     PermissionType type;
     Response type_response = FromProtocolPermissionType(t, &type);
-    if (!type_response.isSuccess())
+    if (!type_response.IsSuccess())
       return type_response;
     internal_permissions.push_back(type);
   }
@@ -386,20 +388,20 @@
   }
   contexts_with_overridden_permissions_.insert(
       browser_context_id.fromMaybe(""));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::ResetPermissions(
     Maybe<std::string> browser_context_id) {
   BrowserContext* browser_context = nullptr;
   Response response = FindBrowserContext(browser_context_id, &browser_context);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   PermissionControllerImpl* permission_controller =
       PermissionControllerImpl::FromBrowserContext(browser_context);
   permission_controller->ResetOverridesForDevTools();
   contexts_with_overridden_permissions_.erase(browser_context_id.fromMaybe(""));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::GetHistogram(
@@ -416,7 +418,7 @@
   DCHECK(out_histogram);
   *out_histogram = Convert(*in_histogram, in_delta.fromMaybe(false));
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::GetBrowserCommandLine(
@@ -433,16 +435,16 @@
       (*arguments)->emplace_back(arg);
 #endif
     }
-    return Response::OK();
+    return Response::Success();
   } else {
-    return Response::Error(
+    return Response::ServerError(
         "Command line not returned because --enable-automation not set.");
   }
 }
 
 Response BrowserHandler::Crash() {
   CHECK(false);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::CrashGpuProcess() {
@@ -451,7 +453,7 @@
                              if (host)
                                host->gpu_service()->Crash();
                            }));
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/devtools_domain_handler.cc b/content/browser/devtools/protocol/devtools_domain_handler.cc
index 5290245..e89a12e0a 100644
--- a/content/browser/devtools/protocol/devtools_domain_handler.cc
+++ b/content/browser/devtools/protocol/devtools_domain_handler.cc
@@ -24,7 +24,7 @@
 }
 
 Response DevToolsDomainHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/devtools_mhtml_helper.cc b/content/browser/devtools/protocol/devtools_mhtml_helper.cc
index 7442d71e..102d27a 100644
--- a/content/browser/devtools/protocol/devtools_mhtml_helper.cc
+++ b/content/browser/devtools/protocol/devtools_mhtml_helper.cc
@@ -143,7 +143,7 @@
   if (message.empty())
     callback_->sendFailure(Response::InternalError());
   else
-    callback_->sendFailure(Response::Error(message));
+    callback_->sendFailure(Response::ServerError(message));
 }
 
 void DevToolsMHTMLHelper::ReportSuccess(
diff --git a/content/browser/devtools/protocol/dom_handler.cc b/content/browser/devtools/protocol/dom_handler.cc
index 8d10ae6..dba7b3a1 100644
--- a/content/browser/devtools/protocol/dom_handler.cc
+++ b/content/browser/devtools/protocol/dom_handler.cc
@@ -30,7 +30,7 @@
 }
 
 Response DOMHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DOMHandler::SetFileInputFiles(
@@ -39,7 +39,7 @@
     Maybe<DOM::BackendNodeId> backend_node_id,
     Maybe<String> in_object_id) {
   if (!allow_file_access_)
-    return Response::Error("Not allowed");
+    return Response::ServerError("Not allowed");
   if (host_) {
     for (const std::string& file : *files) {
       ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile(
diff --git a/content/browser/devtools/protocol/emulation_handler.cc b/content/browser/devtools/protocol/emulation_handler.cc
index f7b9bdf..aa6f6f8 100644
--- a/content/browser/devtools/protocol/emulation_handler.cc
+++ b/content/browser/devtools/protocol/emulation_handler.cc
@@ -98,7 +98,7 @@
     device_emulation_enabled_ = false;
     UpdateDeviceEmulationState();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response EmulationHandler::SetGeolocationOverride(
@@ -115,14 +115,14 @@
     geoposition->timestamp = base::Time::Now();
 
     if (!device::ValidateGeoposition(*geoposition))
-      return Response::Error("Invalid geolocation");
+      return Response::ServerError("Invalid geolocation");
 
   } else {
     geoposition->error_code =
         device::mojom::Geoposition::ErrorCode::POSITION_UNAVAILABLE;
   }
   geolocation_context->SetOverride(std::move(geoposition));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response EmulationHandler::ClearGeolocationOverride() {
@@ -131,7 +131,7 @@
 
   auto* geolocation_context = GetWebContents()->GetGeolocationContext();
   geolocation_context->ClearOverride();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response EmulationHandler::SetEmitTouchEventsForMouse(
@@ -140,7 +140,7 @@
   touch_emulation_enabled_ = enabled;
   touch_emulation_configuration_ = configuration.fromMaybe("");
   UpdateTouchEventEmulationState();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response EmulationHandler::CanEmulate(bool* result) {
@@ -154,7 +154,7 @@
       *result = false;
   }
 #endif  // defined(OS_ANDROID)
-  return Response::OK();
+  return Response::Success();
 }
 
 Response EmulationHandler::SetDeviceMetricsOverride(
@@ -175,7 +175,7 @@
   const static int max_orientation_angle = 360;
 
   if (!host_)
-    return Response::Error("Target does not support metrics override");
+    return Response::ServerError("Target does not support metrics override");
 
   if (screen_width.fromMaybe(0) < 0 || screen_height.fromMaybe(0) < 0 ||
       screen_width.fromMaybe(0) > max_size ||
@@ -261,7 +261,7 @@
       size_changed =
           GetWebContents()->SetDeviceEmulationSize(gfx::Size(width, height));
     } else {
-      return Response::Error("Can't find the associated web contents");
+      return Response::ServerError("Can't find the associated web contents");
     }
   }
 
@@ -270,7 +270,7 @@
     // only sent to the client once updates were applied.
     if (size_changed)
       return Response::FallThrough();
-    return Response::OK();
+    return Response::Success();
   }
 
   device_emulation_enabled_ = true;
@@ -281,15 +281,15 @@
   // response is only sent to the client once updates were applied.
   // Unless the renderer has crashed.
   if (GetWebContents() && GetWebContents()->IsCrashed())
-    return Response::OK();
+    return Response::Success();
   return Response::FallThrough();
 }
 
 Response EmulationHandler::ClearDeviceMetricsOverride() {
   if (!device_emulation_enabled_)
-    return Response::OK();
+    return Response::Success();
   if (!host_)
-    return Response::Error("Can't find the associated web contents");
+    return Response::ServerError("Can't find the associated web contents");
   GetWebContents()->ClearDeviceEmulationSize();
   device_emulation_enabled_ = false;
   device_emulation_params_ = blink::WebDeviceEmulationParams();
@@ -298,7 +298,7 @@
   // is only sent to the client once updates were applied.
   // Unless the renderer has crashed.
   if (GetWebContents()->IsCrashed())
-    return Response::OK();
+    return Response::Success();
   return Response::FallThrough();
 }
 
@@ -307,9 +307,9 @@
     return Response::InvalidParams("Width and height must be non-negative");
 
   if (!host_)
-    return Response::Error("Can't find the associated web contents");
+    return Response::ServerError("Can't find the associated web contents");
   GetWebContents()->SetDeviceEmulationSize(gfx::Size(width, height));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response EmulationHandler::SetUserAgentOverride(
diff --git a/content/browser/devtools/protocol/fetch_handler.cc b/content/browser/devtools/protocol/fetch_handler.cc
index 259f7b3..a5af86b 100644
--- a/content/browser/devtools/protocol/fetch_handler.cc
+++ b/content/browser/devtools/protocol/fetch_handler.cc
@@ -61,7 +61,7 @@
   if (!maybe_patterns.isJust()) {
     result->emplace_back("*", base::flat_set<blink::mojom::ResourceType>(),
                          DevToolsURLLoaderInterceptor::REQUEST);
-    return Response::OK();
+    return Response::Success();
   }
   Array<Fetch::RequestPattern>& patterns = *maybe_patterns.fromJust();
   for (const std::unique_ptr<Fetch::RequestPattern>& pattern : patterns) {
@@ -80,7 +80,7 @@
         RequestStageToInterceptorStage(
             pattern->GetRequestStage(Fetch::RequestStageEnum::Request)));
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 bool FetchHandler::MaybeCreateProxyForInterception(
@@ -104,7 +104,7 @@
   }
   std::vector<DevToolsURLLoaderInterceptor::Pattern> interception_patterns;
   Response response = ToInterceptionPatterns(patterns, &interception_patterns);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(response);
     return;
   }
@@ -124,7 +124,7 @@
   interceptor_.reset();
   if (was_enabled)
     update_loader_factories_callback_.Run(base::DoNothing());
-  return Response::OK();
+  return Response::Success();
 }
 
 namespace {
@@ -175,7 +175,7 @@
                                const String& errorReason,
                                std::unique_ptr<FailRequestCallback> callback) {
   if (!interceptor_) {
-    callback->sendFailure(Response::Error("Fetch domain is not enabled"));
+    callback->sendFailure(Response::ServerError("Fetch domain is not enabled"));
     return;
   }
   bool ok = false;
@@ -199,7 +199,7 @@
     Maybe<String> responsePhrase,
     std::unique_ptr<FulfillRequestCallback> callback) {
   if (!interceptor_) {
-    callback->sendFailure(Response::Error("Fetch domain is not enabled"));
+    callback->sendFailure(Response::ServerError("Fetch domain is not enabled"));
     return;
   }
   std::string status_phrase =
@@ -253,7 +253,7 @@
     Maybe<Array<Fetch::HeaderEntry>> headers,
     std::unique_ptr<ContinueRequestCallback> callback) {
   if (!interceptor_) {
-    callback->sendFailure(Response::Error("Fetch domain is not enabled"));
+    callback->sendFailure(Response::ServerError("Fetch domain is not enabled"));
     return;
   }
   std::unique_ptr<DevToolsURLLoaderInterceptor::Modifications::HeadersVector>
@@ -282,7 +282,7 @@
         authChallengeResponse,
     std::unique_ptr<ContinueWithAuthCallback> callback) {
   if (!interceptor_) {
-    callback->sendFailure(Response::Error("Fetch domain is not enabled"));
+    callback->sendFailure(Response::ServerError("Fetch domain is not enabled"));
     return;
   }
   using AuthChallengeResponse =
@@ -337,8 +337,8 @@
     mojo::ScopedDataPipeConsumerHandle pipe,
     const std::string& mime_type) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(response.isSuccess(), pipe.is_valid());
-  if (!response.isSuccess()) {
+  DCHECK_EQ(response.IsSuccess(), pipe.is_valid());
+  if (!response.IsSuccess()) {
     callback->sendFailure(std::move(response));
     return;
   }
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc
index c7a95973..b646147 100644
--- a/content/browser/devtools/protocol/input_handler.cc
+++ b/content/browser/devtools/protocol/input_handler.cc
@@ -245,7 +245,7 @@
   if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
     callback->sendSuccess();
   } else {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         base::StringPrintf("Synthetic pinch failed, result was %d", result)));
   }
 }
@@ -268,7 +268,7 @@
       if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
         callback_->sendSuccess();
       } else {
-        callback_->sendFailure(Response::Error(
+        callback_->sendFailure(Response::ServerError(
             base::StringPrintf("Synthetic tap failed, result was %d", result)));
       }
       callback_.reset();
@@ -288,7 +288,7 @@
   if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
     callback->sendSuccess();
   } else {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         base::StringPrintf("Synthetic scroll failed, result was %d", result)));
   }
 }
@@ -299,7 +299,7 @@
   if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
     callback->sendSuccess();
   } else {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         base::StringPrintf("Action sequence failed, result was %d", result)));
   }
 }
@@ -519,7 +519,7 @@
   ignore_input_events_ = false;
   pointer_ids_.clear();
   touch_points_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InputHandler::DispatchKeyEvent(
@@ -829,7 +829,7 @@
     }
   }
   if (!ok) {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         base::StringPrintf("Exceeded maximum touch points limit of %d",
                            blink::WebTouchEvent::kTouchesLengthCap)));
     return;
@@ -1135,7 +1135,7 @@
   } else {
     host_->GetRenderWidgetHost()->ForwardMouseEvent(*mouse_event);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InputHandler::SetIgnoreInputEvents(bool ignore) {
@@ -1143,7 +1143,7 @@
   WebContents* web_contents = WebContents::FromRenderFrameHost(host_);
   if (web_contents)
     web_contents->SetIgnoreInputEvents(ignore);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InputHandler::SynthesizePinchGesture(
@@ -1258,7 +1258,7 @@
     std::unique_ptr<SynthesizeScrollGestureCallback> callback) {
   RenderWidgetHostViewBase* root_view = GetRootView();
   if (!root_view) {
-    callback->sendFailure(Response::Error("Frame was detached"));
+    callback->sendFailure(Response::ServerError("Frame was detached"));
     return;
   }
 
diff --git a/content/browser/devtools/protocol/inspector_handler.cc b/content/browser/devtools/protocol/inspector_handler.cc
index 31eb6d4..fe3d7fa 100644
--- a/content/browser/devtools/protocol/inspector_handler.cc
+++ b/content/browser/devtools/protocol/inspector_handler.cc
@@ -50,11 +50,11 @@
 Response InspectorHandler::Enable() {
   if (host_ && !host_->IsRenderFrameLive())
     frontend_->TargetCrashed();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/io_handler.cc b/content/browser/devtools/protocol/io_handler.cc
index 7a594e7..8ec26b2 100644
--- a/content/browser/devtools/protocol/io_handler.cc
+++ b/content/browser/devtools/protocol/io_handler.cc
@@ -92,7 +92,7 @@
                              bool base64_encoded,
                              int status) {
   if (status == DevToolsIOContext::Stream::StatusFailure) {
-    callback->sendFailure(Response::Error("Read failed"));
+    callback->sendFailure(Response::ServerError("Read failed"));
     return;
   }
   bool eof = status == DevToolsIOContext::Stream::StatusEOF;
@@ -100,8 +100,9 @@
 }
 
 Response IOHandler::Close(const std::string& handle) {
-  return io_context_->Close(handle) ? Response::OK()
-      : Response::InvalidParams("Invalid stream handle");
+  return io_context_->Close(handle)
+             ? Response::Success()
+             : Response::InvalidParams("Invalid stream handle");
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/memory_handler.cc b/content/browser/devtools/protocol/memory_handler.cc
index d8bc4e5..bdec268 100644
--- a/content/browser/devtools/protocol/memory_handler.cc
+++ b/content/browser/devtools/protocol/memory_handler.cc
@@ -70,13 +70,13 @@
                      .SetSamples(std::move(samples))
                      .SetModules(std::move(modules))
                      .Build();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response MemoryHandler::SetPressureNotificationsSuppressed(
     bool suppressed) {
   base::MemoryPressureListener::SetNotificationsSuppressed(suppressed);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response MemoryHandler::SimulatePressureNotification(
@@ -93,19 +93,20 @@
 
   // Simulate memory pressure notification in the browser process.
   base::MemoryPressureListener::SimulatePressureNotification(parsed_level);
-  return Response::OK();
+  return Response::Success();
 }
 
 void MemoryHandler::PrepareForLeakDetection(
     std::unique_ptr<PrepareForLeakDetectionCallback> callback) {
   if (leak_detection_callback_) {
     callback->sendFailure(
-        Response::Error("Another leak detection in progress"));
+        Response::ServerError("Another leak detection in progress"));
     return;
   }
   RenderProcessHost* process = RenderProcessHost::FromID(process_host_id_);
   if (!process) {
-    callback->sendFailure(Response::Error("No process to detect leaks in"));
+    callback->sendFailure(
+        Response::ServerError("No process to detect leaks in"));
     return;
   }
 
@@ -126,7 +127,7 @@
 
 void MemoryHandler::OnLeakDetectorIsGone() {
   leak_detection_callback_->sendFailure(
-      Response::Error("Failed to run leak detection"));
+      Response::ServerError("Failed to run leak detection"));
   leak_detection_callback_.reset();
   leak_detector_.reset();
 }
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index 3c245d6b..9a1e6a28 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -1307,7 +1307,7 @@
 
 Response NetworkHandler::CanEmulateNetworkConditions(bool* result) {
   *result = true;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response NetworkHandler::EmulateNetworkConditions(
@@ -1807,7 +1807,7 @@
       url_loader_interceptor_.reset();
       update_loader_factories_callback_.Run();
     }
-    return Response::OK();
+    return Response::Success();
   }
 
   std::vector<DevToolsURLLoaderInterceptor::Pattern> interceptor_patterns;
@@ -1839,7 +1839,7 @@
   } else {
     url_loader_interceptor_->SetPatterns(interceptor_patterns, true);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void NetworkHandler::ContinueInterceptedRequest(
@@ -1963,7 +1963,7 @@
                        weak_factory_.GetWeakPtr(), std::move(callback)));
     return;
   }
-  callback->sendFailure(Response::Error(
+  callback->sendFailure(Response::ServerError(
       "Network.takeResponseBodyForInterceptionAsStream is only "
       "currently supported with --enable-features=NetworkService"));
 }
@@ -1974,8 +1974,8 @@
     mojo::ScopedDataPipeConsumerHandle pipe,
     const std::string& mime_type) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(response.isSuccess(), pipe.is_valid());
-  if (!response.isSuccess()) {
+  DCHECK_EQ(response.IsSuccess(), pipe.is_valid());
+  if (!response.IsSuccess()) {
     callback->sendFailure(std::move(response));
     return;
   }
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index 1516029..d669158 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -370,20 +370,20 @@
 Response PageHandler::Crash() {
   WebContents* web_contents = WebContents::FromRenderFrameHost(host_);
   if (!web_contents)
-    return Response::Error("Not attached to a page");
+    return Response::ServerError("Not attached to a page");
   if (web_contents->IsCrashed())
-    return Response::Error("The target has already crashed");
+    return Response::ServerError("The target has already crashed");
   if (host_->frame_tree_node()->navigation_request())
-    return Response::Error("Page has pending navigations, not killing");
+    return Response::ServerError("Page has pending navigations, not killing");
   return Response::FallThrough();
 }
 
 Response PageHandler::Close() {
   WebContentsImpl* web_contents = GetWebContents();
   if (!web_contents)
-    return Response::Error("Not attached to a page");
+    return Response::ServerError("Not attached to a page");
   web_contents->DispatchBeforeUnload(false /* auto_cancel */);
-  return Response::OK();
+  return Response::Success();
 }
 
 void PageHandler::Reload(Maybe<bool> bypassCache,
@@ -442,7 +442,8 @@
                            std::unique_ptr<NavigateCallback> callback) {
   GURL gurl(url);
   if (!gurl.is_valid()) {
-    callback->sendFailure(Response::Error("Cannot navigate to invalid URL"));
+    callback->sendFailure(
+        Response::ServerError("Cannot navigate to invalid URL"));
     return;
   }
 
@@ -497,7 +498,8 @@
   }
 
   if (!frame_tree_node) {
-    callback->sendFailure(Response::Error("No frame with given id found"));
+    callback->sendFailure(
+        Response::ServerError("No frame with given id found"));
     return;
   }
 
@@ -600,7 +602,7 @@
             .SetTransitionType(TransitionTypeName(entry->GetTransitionType()))
             .Build());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response PageHandler::NavigateToHistoryEntry(int entry_id) {
@@ -612,7 +614,7 @@
   for (int i = 0; i != controller.GetEntryCount(); ++i) {
     if (controller.GetEntryAtIndex(i)->GetUniqueID() == entry_id) {
       controller.GoToIndex(i);
-      return Response::OK();
+      return Response::Success();
     }
   }
 
@@ -630,7 +632,7 @@
 
   NavigationController& controller = web_contents->GetController();
   controller.DeleteNavigationEntries(base::BindRepeating(&ReturnTrue));
-  return Response::OK();
+  return Response::Success();
 }
 
 void PageHandler::CaptureSnapshot(
@@ -638,7 +640,7 @@
     std::unique_ptr<CaptureSnapshotCallback> callback) {
   std::string snapshot_format = format.fromMaybe(kMhtml);
   if (snapshot_format != kMhtml) {
-    callback->sendFailure(Response::Error("Unsupported snapshot format"));
+    callback->sendFailure(Response::ServerError("Unsupported snapshot format"));
     return;
   }
   DevToolsMHTMLHelper::Capture(weak_factory_.GetWeakPtr(), std::move(callback));
@@ -658,12 +660,12 @@
   if (clip.isJust()) {
     if (clip.fromJust()->GetWidth() == 0) {
       callback->sendFailure(
-          Response::Error("Cannot take screenshot with 0 width."));
+          Response::ServerError("Cannot take screenshot with 0 width."));
       return;
     }
     if (clip.fromJust()->GetHeight() == 0) {
       callback->sendFailure(
-          Response::Error("Cannot take screenshot with 0 height."));
+          Response::ServerError("Cannot take screenshot with 0 height."));
       return;
     }
   }
@@ -800,7 +802,7 @@
                              Maybe<bool> prefer_css_page_size,
                              Maybe<String> transfer_mode,
                              std::unique_ptr<PrintToPDFCallback> callback) {
-  callback->sendFailure(Response::Error("PrintToPDF is not implemented"));
+  callback->sendFailure(Response::ServerError("PrintToPDF is not implemented"));
   return;
 }
 
@@ -871,7 +873,7 @@
 Response PageHandler::ScreencastFrameAck(int session_id) {
   if (session_id == session_id_)
     --frames_in_flight_;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response PageHandler::HandleJavaScriptDialog(bool accept,
@@ -899,7 +901,7 @@
     }
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response PageHandler::BringToFront() {
@@ -907,7 +909,7 @@
   if (wc) {
     wc->Activate();
     wc->Focus();
-    return Response::OK();
+    return Response::Success();
   }
   return Response::InternalError();
 }
@@ -915,7 +917,7 @@
 Response PageHandler::SetDownloadBehavior(const std::string& behavior,
                                           Maybe<std::string> download_path) {
   if (!allow_set_download_behavior_)
-    return Response::Error("Not allowed");
+    return Response::ServerError("Not allowed");
 
   WebContentsImpl* web_contents = GetWebContents();
   if (!web_contents)
@@ -923,12 +925,12 @@
 
   if (behavior == Page::SetDownloadBehavior::BehaviorEnum::Allow &&
       !download_path.isJust())
-    return Response::Error("downloadPath not provided");
+    return Response::ServerError("downloadPath not provided");
 
   if (behavior == Page::SetDownloadBehavior::BehaviorEnum::Default) {
     DevToolsDownloadManagerHelper::RemoveFromWebContents(web_contents);
     download_manager_delegate_ = nullptr;
-    return Response::OK();
+    return Response::Success();
   }
 
   // Override download manager delegate.
@@ -953,14 +955,14 @@
     download_helper->SetDownloadPath(download_path.fromJust());
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void PageHandler::GetAppManifest(
     std::unique_ptr<GetAppManifestCallback> callback) {
   WebContentsImpl* web_contents = GetWebContents();
   if (!web_contents || !web_contents->GetManifestManagerHost()) {
-    callback->sendFailure(Response::Error("Cannot retrieve manifest"));
+    callback->sendFailure(Response::ServerError("Cannot retrieve manifest"));
     return;
   }
   web_contents->GetManifestManagerHost()->RequestManifestDebugInfo(
@@ -1115,7 +1117,8 @@
   }
 
   if (image.IsEmpty()) {
-    callback->sendFailure(Response::Error("Unable to capture screenshot"));
+    callback->sendFailure(
+        Response::ServerError("Unable to capture screenshot"));
     return;
   }
 
@@ -1171,25 +1174,25 @@
   if (!web_contents)
     return Response::InternalError();
   web_contents->Stop();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response PageHandler::SetWebLifecycleState(const std::string& state) {
   WebContentsImpl* web_contents = GetWebContents();
   if (!web_contents)
-    return Response::Error("Not attached to a page");
+    return Response::ServerError("Not attached to a page");
   if (state == Page::SetWebLifecycleState::StateEnum::Frozen) {
     // TODO(fmeawad): Instead of forcing a visibility change, only allow
     // freezing a page if it was already hidden.
     web_contents->WasHidden();
     web_contents->SetPageFrozen(true);
-    return Response::OK();
+    return Response::Success();
   }
   if (state == Page::SetWebLifecycleState::StateEnum::Active) {
     web_contents->SetPageFrozen(false);
-    return Response::OK();
+    return Response::Success();
   }
-  return Response::Error("Unidentified lifecycle state");
+  return Response::ServerError("Unidentified lifecycle state");
 }
 
 void PageHandler::GetInstallabilityErrors(
diff --git a/content/browser/devtools/protocol/schema_handler.cc b/content/browser/devtools/protocol/schema_handler.cc
index ef3e2d3..cc22104 100644
--- a/content/browser/devtools/protocol/schema_handler.cc
+++ b/content/browser/devtools/protocol/schema_handler.cc
@@ -39,7 +39,7 @@
     (*domains)->emplace_back(
         Schema::Domain::Create().SetName(domain).SetVersion(kVersion).Build());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/security_handler.cc b/content/browser/devtools/protocol/security_handler.cc
index 47a6fb40..51bbd3f9 100644
--- a/content/browser/devtools/protocol/security_handler.cc
+++ b/content/browser/devtools/protocol/security_handler.cc
@@ -242,7 +242,7 @@
   if (host_)
     AttachToRenderFrameHost();
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response SecurityHandler::Disable() {
@@ -250,25 +250,25 @@
   cert_error_override_mode_ = CertErrorOverrideMode::kDisabled;
   WebContentsObserver::Observe(nullptr);
   FlushPendingCertificateErrorNotifications();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response SecurityHandler::HandleCertificateError(int event_id,
                                                  const String& action) {
   if (cert_error_callbacks_.find(event_id) == cert_error_callbacks_.end()) {
-    return Response::Error(
+    return Response::ServerError(
         String("Unknown event id: " + std::to_string(event_id)));
   }
   content::CertificateRequestResultType type =
       content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL;
-  Response response = Response::OK();
+  Response response = Response::Success();
   if (action == Security::CertificateErrorActionEnum::Continue) {
     type = content::CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE;
   } else if (action == Security::CertificateErrorActionEnum::Cancel) {
     type = content::CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL;
   } else {
-    response =
-        Response::Error(String("Unknown Certificate Error Action: " + action));
+    response = Response::ServerError(
+        String("Unknown Certificate Error Action: " + action));
   }
   std::move(cert_error_callbacks_[event_id]).Run(type);
   cert_error_callbacks_.erase(event_id);
@@ -278,26 +278,28 @@
 Response SecurityHandler::SetOverrideCertificateErrors(bool override) {
   if (override) {
     if (!enabled_)
-      return Response::Error("Security domain not enabled");
+      return Response::ServerError("Security domain not enabled");
     if (cert_error_override_mode_ == CertErrorOverrideMode::kIgnoreAll)
-      return Response::Error("Certificate errors are already being ignored.");
+      return Response::ServerError(
+          "Certificate errors are already being ignored.");
     cert_error_override_mode_ = CertErrorOverrideMode::kHandleEvents;
   } else {
     cert_error_override_mode_ = CertErrorOverrideMode::kDisabled;
     FlushPendingCertificateErrorNotifications();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response SecurityHandler::SetIgnoreCertificateErrors(bool ignore) {
   if (ignore) {
     if (cert_error_override_mode_ == CertErrorOverrideMode::kHandleEvents)
-      return Response::Error("Certificate errors are already overridden.");
+      return Response::ServerError(
+          "Certificate errors are already overridden.");
     cert_error_override_mode_ = CertErrorOverrideMode::kIgnoreAll;
   } else {
     cert_error_override_mode_ = CertErrorOverrideMode::kDisabled;
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index be5b54a..2d0ca48 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -103,11 +103,11 @@
 }
 
 Response CreateDomainNotEnabledErrorResponse() {
-  return Response::Error("ServiceWorker domain not enabled");
+  return Response::ServerError("ServiceWorker domain not enabled");
 }
 
 Response CreateContextErrorResponse() {
-  return Response::Error("Could not connect to the context");
+  return Response::ServerError("Could not connect to the context");
 }
 
 Response CreateInvalidVersionIdErrorResponse() {
@@ -213,7 +213,7 @@
 
 Response ServiceWorkerHandler::Enable() {
   if (enabled_)
-    return Response::OK();
+    return Response::Success();
   if (!context_)
     return CreateContextErrorResponse();
   enabled_ = true;
@@ -228,19 +228,19 @@
                           weak_factory_.GetWeakPtr()));
   context_watcher_->Start();
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::Disable() {
   if (!enabled_)
-    return Response::OK();
+    return Response::Success();
   enabled_ = false;
 
   ClearForceUpdate();
   DCHECK(context_watcher_);
   context_watcher_->Stop();
   context_watcher_ = nullptr;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::Unregister(const std::string& scope_url) {
@@ -249,7 +249,7 @@
   if (!context_)
     return CreateContextErrorResponse();
   context_->UnregisterServiceWorker(GURL(scope_url), base::DoNothing());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::StartWorker(const std::string& scope_url) {
@@ -258,7 +258,7 @@
   if (!context_)
     return CreateContextErrorResponse();
   context_->StartServiceWorker(GURL(scope_url), base::DoNothing());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::SkipWaiting(const std::string& scope_url) {
@@ -267,7 +267,7 @@
   if (!context_)
     return CreateContextErrorResponse();
   context_->SkipWaitingWorker(GURL(scope_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::StopWorker(const std::string& version_id) {
@@ -281,7 +281,7 @@
   RunOrPostTaskOnThread(
       FROM_HERE, ServiceWorkerContext::GetCoreThreadId(),
       base::BindOnce(&StopServiceWorkerOnCoreThread, context_, id));
-  return Response::OK();
+  return Response::Success();
 }
 
 void ServiceWorkerHandler::StopAllWorkers(
@@ -305,7 +305,7 @@
   if (!context_)
     return CreateContextErrorResponse();
   context_->UpdateRegistration(GURL(scope_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::InspectWorker(const std::string& version_id) {
@@ -323,7 +323,7 @@
           &GetDevToolsRouteInfoOnCoreThread, context_, id,
           base::BindOnce(&ServiceWorkerHandler::OpenNewDevToolsWindow,
                          weak_factory_.GetWeakPtr())));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::SetForceUpdateOnPageLoad(
@@ -331,7 +331,7 @@
   if (!context_)
     return CreateContextErrorResponse();
   context_->SetForceUpdateOnPageLoad(force_update_on_page_load);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::DeliverPushMessage(
@@ -353,7 +353,7 @@
       std::move(payload),
       base::BindOnce([](blink::mojom::PushDeliveryStatus status) {}));
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::DispatchSyncEvent(
@@ -376,7 +376,7 @@
                         base::BindOnce(&DispatchSyncEventOnCoreThread, context_,
                                        base::WrapRefCounted(sync_context),
                                        GURL(origin), id, tag, last_chance));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response ServiceWorkerHandler::DispatchPeriodicSyncEvent(
@@ -399,7 +399,7 @@
       base::BindOnce(&DispatchPeriodicSyncEventOnCoreThread, context_,
                      base::WrapRefCounted(sync_context), GURL(origin), id,
                      tag));
-  return Response::OK();
+  return Response::Success();
 }
 
 void ServiceWorkerHandler::OpenNewDevToolsWindow(int process_id,
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc
index eabcefc..4d88829 100644
--- a/content/browser/devtools/protocol/storage_handler.cc
+++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -66,7 +66,7 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (code != blink::mojom::QuotaStatusCode::kOk) {
     return callback->sendFailure(
-        Response::Error("Quota information is not available"));
+        Response::ServerError("Quota information is not available"));
   }
 
   auto usageList = std::make_unique<Array<Storage::UsageForType>>();
@@ -268,7 +268,7 @@
 Response StorageHandler::Disable() {
   cache_storage_observer_.reset();
   indexed_db_observer_.reset();
-  return Response::OK();
+  return Response::Success();
 }
 
 void StorageHandler::GetCookies(Maybe<std::string> browser_context_id,
@@ -276,7 +276,7 @@
   StoragePartition* storage_partition = nullptr;
   Response response = StorageHandler::FindStoragePartition(browser_context_id,
                                                            &storage_partition);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(std::move(response));
     return;
   }
@@ -297,7 +297,7 @@
   StoragePartition* storage_partition = nullptr;
   Response response = StorageHandler::FindStoragePartition(browser_context_id,
                                                            &storage_partition);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(std::move(response));
     return;
   }
@@ -322,7 +322,7 @@
   StoragePartition* storage_partition = nullptr;
   Response response = StorageHandler::FindStoragePartition(browser_context_id,
                                                            &storage_partition);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(std::move(response));
     return;
   }
@@ -387,7 +387,7 @@
   GURL origin_url(origin);
   if (!origin_url.is_valid()) {
     return callback->sendFailure(
-        Response::Error(origin + " is not a valid URL"));
+        Response::ServerError(origin + " is not a valid URL"));
   }
 
   storage::QuotaManager* manager = storage_partition_->GetQuotaManager();
@@ -406,7 +406,7 @@
     return Response::InvalidParams(origin + " is not a valid URL");
 
   GetCacheStorageObserver()->TrackOrigin(url::Origin::Create(origin_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response StorageHandler::UntrackCacheStorageForOrigin(
@@ -419,7 +419,7 @@
     return Response::InvalidParams(origin + " is not a valid URL");
 
   GetCacheStorageObserver()->UntrackOrigin(url::Origin::Create(origin_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response StorageHandler::TrackIndexedDBForOrigin(const std::string& origin) {
@@ -431,7 +431,7 @@
     return Response::InvalidParams(origin + " is not a valid URL");
 
   GetIndexedDBObserver()->TrackOrigin(url::Origin::Create(origin_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response StorageHandler::UntrackIndexedDBForOrigin(const std::string& origin) {
@@ -443,7 +443,7 @@
     return Response::InvalidParams(origin + " is not a valid URL");
 
   GetIndexedDBObserver()->UntrackOrigin(url::Origin::Create(origin_url));
-  return Response::OK();
+  return Response::Success();
 }
 
 StorageHandler::CacheStorageObserver*
@@ -498,13 +498,13 @@
   BrowserContext* browser_context = nullptr;
   Response response =
       BrowserHandler::FindBrowserContext(browser_context_id, &browser_context);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   *storage_partition =
       BrowserContext::GetDefaultStoragePartition(browser_context);
   if (!*storage_partition)
     return Response::InternalError();
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/target_handler.cc b/content/browser/devtools/protocol/target_handler.cc
index 350431e6..4614ecae 100644
--- a/content/browser/devtools/protocol/target_handler.cc
+++ b/content/browser/devtools/protocol/target_handler.cc
@@ -548,7 +548,7 @@
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
   if (!delegate)
-    return Response::OK();
+    return Response::Success();
 
   if (dispose_on_detach_context_ids_.size()) {
     for (auto* context : delegate->GetBrowserContexts()) {
@@ -560,7 +560,7 @@
     }
     dispose_on_detach_context_ids_.clear();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void TargetHandler::DidFinishNavigation() {
@@ -672,19 +672,20 @@
     if (it == attached_sessions_.end())
       return Response::InvalidParams("No session with given id");
     *session = it->second.get();
-    return Response::OK();
+    return Response::Success();
   }
   if (target_id.isJust()) {
     for (auto& it : attached_sessions_) {
       if (it.second->IsAttachedTo(target_id.fromJust())) {
         if (*session)
-          return Response::Error("Multiple sessions attached, specify id.");
+          return Response::ServerError(
+              "Multiple sessions attached, specify id.");
         *session = it.second.get();
       }
     }
     if (!*session)
       return Response::InvalidParams("No session for given target id");
-    return Response::OK();
+    return Response::Success();
   }
   return Response::InvalidParams("Session id must be specified");
 }
@@ -693,14 +694,14 @@
 
 Response TargetHandler::SetDiscoverTargets(bool discover) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   if (discover_ == discover)
-    return Response::OK();
+    return Response::Success();
   discover_ = discover;
   UpdateAgentHostObserver();
   if (!discover_)
     reported_hosts_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void TargetHandler::SetAutoAttach(
@@ -720,14 +721,14 @@
 
 Response TargetHandler::SetRemoteLocations(
     std::unique_ptr<protocol::Array<Target::RemoteLocation>>) {
-  return Response::Error("Not supported");
+  return Response::ServerError("Not supported");
 }
 
 Response TargetHandler::AttachToTarget(const std::string& target_id,
                                        Maybe<bool> flatten,
                                        std::string* out_session_id) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   // TODO(dgozman): only allow reported hosts.
   scoped_refptr<DevToolsAgentHost> agent_host =
       DevToolsAgentHost::GetForId(target_id);
@@ -735,30 +736,30 @@
     return Response::InvalidParams("No target with given id found");
   *out_session_id =
       Session::Attach(this, agent_host.get(), false, flatten.fromMaybe(false));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::AttachToBrowserTarget(std::string* out_session_id) {
   if (access_mode_ != AccessMode::kBrowser)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   scoped_refptr<DevToolsAgentHost> agent_host =
       DevToolsAgentHost::CreateForBrowser(
           nullptr, DevToolsAgentHost::CreateServerSocketCallback());
   *out_session_id = Session::Attach(this, agent_host.get(), false, true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::DetachFromTarget(Maybe<std::string> session_id,
                                          Maybe<std::string> target_id) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   Session* session = nullptr;
   Response response =
       FindSession(std::move(session_id), std::move(target_id), &session);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   session->Detach(false);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::SendMessageToTarget(const std::string& message,
@@ -767,22 +768,22 @@
   Session* session = nullptr;
   Response response =
       FindSession(std::move(session_id), std::move(target_id), &session);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (session->flatten_protocol_) {
-    return Response::Error(
+    return Response::ServerError(
         "When using flat protocol, messages are routed to the target "
         "via the sessionId attribute.");
   }
   session->SendMessageToAgentHost(base::as_bytes(base::make_span(message)));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::GetTargetInfo(
     Maybe<std::string> maybe_target_id,
     std::unique_ptr<Target::TargetInfo>* target_info) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   const std::string& target_id =
       maybe_target_id.isJust() ? maybe_target_id.fromJust() : owner_target_id_;
   // TODO(dgozman): only allow reported hosts.
@@ -791,31 +792,31 @@
   if (!agent_host)
     return Response::InvalidParams("No target with given id found");
   *target_info = CreateInfo(agent_host.get());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::ActivateTarget(const std::string& target_id) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   // TODO(dgozman): only allow reported hosts.
   scoped_refptr<DevToolsAgentHost> agent_host(
       DevToolsAgentHost::GetForId(target_id));
   if (!agent_host)
     return Response::InvalidParams("No target with given id found");
   agent_host->Activate();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::CloseTarget(const std::string& target_id,
                                     bool* out_success) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   scoped_refptr<DevToolsAgentHost> agent_host =
       DevToolsAgentHost::GetForId(target_id);
   if (!agent_host)
     return Response::InvalidParams("No target with given id found");
   *out_success = agent_host->Close();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::ExposeDevToolsProtocol(
@@ -829,17 +830,17 @@
     return Response::InvalidParams("No target with given id found");
 
   if (g_browser_to_page_connectors.Get()[agent_host.get()]) {
-    return Response::Error(base::StringPrintf(
+    return Response::ServerError(base::StringPrintf(
         "Target with id %s is already granted remote debugging bindings.",
         target_id.c_str()));
   }
   if (!agent_host->GetWebContents()) {
-    return Response::Error(
+    return Response::ServerError(
         "RemoteDebuggingBinding can be granted only to page targets");
   }
 
   new BrowserToPageConnector(binding_name.fromMaybe("cdp"), agent_host.get());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::CreateTarget(const std::string& url,
@@ -851,27 +852,27 @@
                                      Maybe<bool> background,
                                      std::string* out_target_id) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
   if (!delegate)
-    return Response::Error("Not supported");
+    return Response::ServerError("Not supported");
   scoped_refptr<content::DevToolsAgentHost> agent_host =
       delegate->CreateNewTarget(GURL(url));
   if (!agent_host)
-    return Response::Error("Not supported");
+    return Response::ServerError("Not supported");
   *out_target_id = agent_host->GetId();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::GetTargets(
     std::unique_ptr<protocol::Array<Target::TargetInfo>>* target_infos) {
   if (access_mode_ == AccessMode::kAutoAttachOnly)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   *target_infos = std::make_unique<protocol::Array<Target::TargetInfo>>();
   for (const auto& host : DevToolsAgentHost::GetOrCreateAll())
     (*target_infos)->emplace_back(CreateInfo(host.get()));
-  return Response::OK();
+  return Response::Success();
 }
 
 // -------------- DevToolsAgentHostObserver -----------------
@@ -951,48 +952,50 @@
     Maybe<bool> dispose_on_detach,
     std::string* out_context_id) {
   if (access_mode_ != AccessMode::kBrowser)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
   if (!delegate)
-    return Response::Error("Browser context management is not supported.");
+    return Response::ServerError(
+        "Browser context management is not supported.");
   BrowserContext* context = delegate->CreateBrowserContext();
   if (!context)
-    return Response::Error("Failed to create browser context.");
+    return Response::ServerError("Failed to create browser context.");
   *out_context_id = context->UniqueId();
   if (dispose_on_detach.fromMaybe(false))
     dispose_on_detach_context_ids_.insert(*out_context_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response TargetHandler::GetBrowserContexts(
     std::unique_ptr<protocol::Array<protocol::String>>* browser_context_ids) {
   if (access_mode_ != AccessMode::kBrowser)
-    return Response::Error(kNotAllowedError);
+    return Response::ServerError(kNotAllowedError);
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
   if (!delegate)
-    return Response::Error("Browser context management is not supported.");
+    return Response::ServerError(
+        "Browser context management is not supported.");
   std::vector<content::BrowserContext*> contexts =
       delegate->GetBrowserContexts();
   *browser_context_ids = std::make_unique<protocol::Array<protocol::String>>();
   for (auto* context : contexts)
     (*browser_context_ids)->emplace_back(context->UniqueId());
-  return Response::OK();
+  return Response::Success();
 }
 
 void TargetHandler::DisposeBrowserContext(
     const std::string& context_id,
     std::unique_ptr<DisposeBrowserContextCallback> callback) {
   if (access_mode_ != AccessMode::kBrowser) {
-    callback->sendFailure(Response::Error(kNotAllowedError));
+    callback->sendFailure(Response::ServerError(kNotAllowedError));
     return;
   }
   DevToolsManagerDelegate* delegate =
       DevToolsManager::GetInstance()->delegate();
   if (!delegate) {
     callback->sendFailure(
-        Response::Error("Browser context management is not supported."));
+        Response::ServerError("Browser context management is not supported."));
     return;
   }
   std::vector<content::BrowserContext*> contexts =
@@ -1004,7 +1007,7 @@
                    });
   if (context_it == contexts.end()) {
     callback->sendFailure(
-        Response::Error("Failed to find context with id " + context_id));
+        Response::ServerError("Failed to find context with id " + context_id));
     return;
   }
   dispose_on_detach_context_ids_.erase(context_id);
@@ -1016,7 +1019,7 @@
             if (success)
               callback->sendSuccess();
             else
-              callback->sendFailure(Response::Error(error));
+              callback->sendFailure(Response::ServerError(error));
           },
           std::move(callback)));
 }
diff --git a/content/browser/devtools/protocol/tethering_handler.cc b/content/browser/devtools/protocol/tethering_handler.cc
index 72ef0da..84e16553 100644
--- a/content/browser/devtools/protocol/tethering_handler.cc
+++ b/content/browser/devtools/protocol/tethering_handler.cc
@@ -291,7 +291,7 @@
     base::PostTask(
         FROM_HERE, {BrowserThread::UI},
         base::BindOnce(&BindCallback::sendFailure, std::move(callback),
-                       Response::Error("Port already bound")));
+                       Response::ServerError("Port already bound")));
     return;
   }
 
@@ -303,7 +303,7 @@
     base::PostTask(
         FROM_HERE, {BrowserThread::UI},
         base::BindOnce(&BindCallback::sendFailure, std::move(callback),
-                       Response::Error("Could not bind port")));
+                       Response::ServerError("Could not bind port")));
     return;
   }
 
@@ -386,7 +386,7 @@
 
   if (!Activate()) {
     callback->sendFailure(
-        Response::Error("Tethering is used by another connection"));
+        Response::ServerError("Tethering is used by another connection"));
     return;
   }
 
@@ -400,7 +400,7 @@
     int port, std::unique_ptr<UnbindCallback> callback) {
   if (!Activate()) {
     callback->sendFailure(
-        Response::Error("Tethering is used by another connection"));
+        Response::ServerError("Tethering is used by another connection"));
     return;
   }
 
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc
index a37fc207..ee5335b 100644
--- a/content/browser/devtools/protocol/tracing_handler.cc
+++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -569,7 +569,7 @@
 Response TracingHandler::Disable() {
   if (session_)
     StopTracing(nullptr, "");
-  return Response::OK();
+  return Response::Success();
 }
 
 namespace {
@@ -710,7 +710,7 @@
       transfer_format.fromMaybe("") == Tracing::StreamFormatEnum::Proto;
 
   if (proto_format && !return_as_stream) {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         "Proto format is only supported when using stream transfer mode."));
     return;
   }
@@ -724,7 +724,7 @@
       gzip_compression_ = gzip_compression;
       proto_format_ = proto_format;
     }
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         "Tracing has already been started (possibly in another tab)."));
     return;
   }
@@ -774,7 +774,7 @@
     base::ProcessId gpu_pid) {
   // Check if tracing was stopped in mid-air.
   if (!did_initiate_recording_) {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         "Tracing was stopped before start has been completed."));
     return;
   }
@@ -841,10 +841,10 @@
 
 Response TracingHandler::End() {
   if (!session_)
-    return Response::Error("Tracing is not started");
+    return Response::ServerError("Tracing is not started");
 
   if (session_->HasTracingFailed())
-    return Response::Error("Tracing failed");
+    return Response::ServerError("Tracing failed");
 
   scoped_refptr<TracingController::TraceDataEndpoint> endpoint;
   if (return_as_stream_) {
@@ -864,7 +864,7 @@
     StopTracing(endpoint, tracing::mojom::kChromeTraceEventLabel);
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void TracingHandler::GetCategories(
@@ -878,7 +878,7 @@
 void TracingHandler::OnRecordingEnabled(
     std::unique_ptr<StartCallback> callback) {
   if (!did_initiate_recording_) {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         "Tracing was stopped before start has been completed."));
     return;
   }
@@ -921,7 +921,7 @@
     Maybe<bool> deterministic,
     std::unique_ptr<RequestMemoryDumpCallback> callback) {
   if (!IsTracing()) {
-    callback->sendFailure(Response::Error("Tracing is not started"));
+    callback->sendFailure(Response::ServerError("Tracing is not started"));
     return;
   }
 
@@ -970,9 +970,9 @@
 
 Response TracingHandler::RecordClockSyncMarker(const std::string& sync_id) {
   if (!IsTracing())
-    return Response::Error("Tracing is not started");
+    return Response::ServerError("Tracing is not started");
   TRACE_EVENT_CLOCK_SYNC_RECEIVER(sync_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 void TracingHandler::SetupTimer(double usage_reporting_interval) {
diff --git a/content/browser/devtools/protocol/webauthn_handler.cc b/content/browser/devtools/protocol/webauthn_handler.cc
index ac41849..e8f45ca2 100644
--- a/content/browser/devtools/protocol/webauthn_handler.cc
+++ b/content/browser/devtools/protocol/webauthn_handler.cc
@@ -107,14 +107,14 @@
 
 Response WebAuthnHandler::Enable() {
   if (!frame_host_)
-    return Response::Error(kDevToolsNotAttached);
+    return Response::ServerError(kDevToolsNotAttached);
 
   AuthenticatorEnvironmentImpl::GetInstance()->EnableVirtualAuthenticatorFor(
       frame_host_->frame_tree_node());
   virtual_discovery_factory_ =
       AuthenticatorEnvironmentImpl::GetInstance()->GetVirtualFactoryFor(
           frame_host_->frame_tree_node());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::Disable() {
@@ -123,14 +123,14 @@
         frame_host_->frame_tree_node());
   }
   virtual_discovery_factory_ = nullptr;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::AddVirtualAuthenticator(
     std::unique_ptr<WebAuthn::VirtualAuthenticatorOptions> options,
     String* out_authenticator_id) {
   if (!virtual_discovery_factory_)
-    return Response::Error(kVirtualEnvironmentNotEnabled);
+    return Response::ServerError(kVirtualEnvironmentNotEnabled);
 
   auto transport =
       device::ConvertToFidoTransportProtocol(options->GetTransport());
@@ -154,7 +154,7 @@
       options->GetHasResidentKey(false /* default */),
       options->GetHasUserVerification(false /* default */));
   if (!authenticator)
-    return Response::Error(kErrorCreatingAuthenticator);
+    return Response::ServerError(kErrorCreatingAuthenticator);
 
   authenticator->SetUserPresence(
       options->GetAutomaticPresenceSimulation(true /* default */));
@@ -162,18 +162,18 @@
       options->GetIsUserVerified(false /* default */));
 
   *out_authenticator_id = authenticator->unique_id();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::RemoveVirtualAuthenticator(
     const String& authenticator_id) {
   if (!virtual_discovery_factory_)
-    return Response::Error(kVirtualEnvironmentNotEnabled);
+    return Response::ServerError(kVirtualEnvironmentNotEnabled);
 
   if (!virtual_discovery_factory_->RemoveAuthenticator(authenticator_id))
     return Response::InvalidParams(kAuthenticatorNotFound);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::AddCredential(
@@ -181,7 +181,7 @@
     std::unique_ptr<WebAuthn::Credential> credential) {
   VirtualAuthenticator* authenticator;
   Response response = FindAuthenticator(authenticator_id, &authenticator);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Binary user_handle = credential->GetUserHandle(Binary());
@@ -217,9 +217,9 @@
   }
 
   if (!credential_created)
-    return Response::Error(kCouldNotCreateCredential);
+    return Response::ServerError(kCouldNotCreateCredential);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::GetCredential(
@@ -228,7 +228,7 @@
     std::unique_ptr<WebAuthn::Credential>* out_credential) {
   VirtualAuthenticator* authenticator;
   Response response = FindAuthenticator(authenticator_id, &authenticator);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   auto registration =
@@ -237,7 +237,7 @@
     return Response::InvalidParams(kCredentialNotFound);
 
   *out_credential = BuildCredentialFromRegistration(*registration);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::GetCredentials(
@@ -245,7 +245,7 @@
     std::unique_ptr<Array<WebAuthn::Credential>>* out_credentials) {
   VirtualAuthenticator* authenticator;
   Response response = FindAuthenticator(authenticator_id, &authenticator);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   *out_credentials = std::make_unique<Array<WebAuthn::Credential>>();
@@ -253,41 +253,41 @@
     (*out_credentials)
         ->emplace_back(BuildCredentialFromRegistration(registration));
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::RemoveCredential(const String& authenticator_id,
                                            const Binary& credential_id) {
   VirtualAuthenticator* authenticator;
   Response response = FindAuthenticator(authenticator_id, &authenticator);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   if (!authenticator->RemoveRegistration(CopyBinaryToVector(credential_id)))
     return Response::InvalidParams(kCredentialNotFound);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::ClearCredentials(const String& authenticator_id) {
   VirtualAuthenticator* authenticator;
   Response response = FindAuthenticator(authenticator_id, &authenticator);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   authenticator->ClearRegistrations();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::SetUserVerified(const String& authenticator_id,
                                           bool is_user_verified) {
   VirtualAuthenticator* authenticator;
   Response response = FindAuthenticator(authenticator_id, &authenticator);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   authenticator->set_user_verified(is_user_verified);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response WebAuthnHandler::FindAuthenticator(
@@ -295,13 +295,13 @@
     VirtualAuthenticator** out_authenticator) {
   *out_authenticator = nullptr;
   if (!virtual_discovery_factory_)
-    return Response::Error(kVirtualEnvironmentNotEnabled);
+    return Response::ServerError(kVirtualEnvironmentNotEnabled);
 
   *out_authenticator = virtual_discovery_factory_->GetAuthenticator(id);
   if (!*out_authenticator)
     return Response::InvalidParams(kAuthenticatorNotFound);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/content/browser/devtools/protocol/webauthn_handler_unittest.cc b/content/browser/devtools/protocol/webauthn_handler_unittest.cc
index e00546b..f9d558d 100644
--- a/content/browser/devtools/protocol/webauthn_handler_unittest.cc
+++ b/content/browser/devtools/protocol/webauthn_handler_unittest.cc
@@ -25,14 +25,13 @@
 
 TEST_F(WebAuthnHandlerTest, EnableFailsGracefullyIfNoFrameHostSet) {
   Response response = webauthn_handler()->Enable();
-  EXPECT_EQ(DispatchResponse::Status::kError, response.status());
-  EXPECT_STREQ("The DevTools session is not attached to a frame",
-               response.errorMessage().c_str());
+  EXPECT_EQ(crdtp::DispatchCode::SERVER_ERROR, response.Code());
+  EXPECT_EQ("The DevTools session is not attached to a frame",
+            response.Message());
 }
 
 TEST_F(WebAuthnHandlerTest, DisableGracefullyIfNoFrameHostSet) {
-  Response response = webauthn_handler()->Disable();
-  EXPECT_EQ(DispatchResponse::Status::kSuccess, response.status());
+  EXPECT_TRUE(webauthn_handler()->Disable().IsSuccess());
 }
 
 }  // namespace protocol
diff --git a/content/browser/idle/idle_manager_unittest.cc b/content/browser/idle/idle_manager_unittest.cc
index dc96de1..088732d 100644
--- a/content/browser/idle/idle_manager_unittest.cc
+++ b/content/browser/idle/idle_manager_unittest.cc
@@ -330,7 +330,8 @@
   }
 }
 
-TEST_F(IdleManagerTest, LockingScreenAfterIdle) {
+// Disabled test: https://crbug.com/1062668
+TEST_F(IdleManagerTest, DISABLED_LockingScreenAfterIdle) {
   mojo::Remote<blink::mojom::IdleManager> service_remote;
 
   auto impl = std::make_unique<IdleManager>();
diff --git a/content/browser/loader/navigation_url_loader_impl_unittest.cc b/content/browser/loader/navigation_url_loader_impl_unittest.cc
index c50e2f1..c3e41901 100644
--- a/content/browser/loader/navigation_url_loader_impl_unittest.cc
+++ b/content/browser/loader/navigation_url_loader_impl_unittest.cc
@@ -35,6 +35,7 @@
 #include "content/test/test_navigation_url_loader_delegate.h"
 #include "net/base/load_flags.h"
 #include "net/base/mock_network_change_notifier.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request_context.h"
diff --git a/content/browser/media/media_internals.cc b/content/browser/media/media_internals.cc
index 46f9fbd..c2775b32 100644
--- a/content/browser/media/media_internals.cc
+++ b/content/browser/media/media_internals.cc
@@ -387,13 +387,13 @@
       dict.SetKey("type", std::move(exists.value()));
       break;
     }
-    case media::MediaLogRecord::Type::kMediaError:
+    case media::MediaLogRecord::Type::kMediaStatus:
       dict.SetString("type", "PIPELINE_ERROR");
       break;
   }
 
   // Convert PipelineStatus to human readable string
-  if (event.type == media::MediaLogRecord::Type::kMediaError) {
+  if (event.type == media::MediaLogRecord::Type::kMediaStatus) {
     int status;
     if (!event.params.GetInteger("pipeline_error", &status) ||
         status < static_cast<int>(media::PIPELINE_OK) ||
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
index a2aa216..e2d1281 100644
--- a/content/browser/utility_process_host.cc
+++ b/content/browser/utility_process_host.cc
@@ -92,6 +92,9 @@
         sandbox_type_ == service_manager::SandboxType::kIme ||
 #endif  // OS_CHROMEOS
         sandbox_type_ == service_manager::SandboxType::kAudio ||
+#if !defined(OS_MACOSX)
+        sandbox_type_ == service_manager::SandboxType::kSharingService ||
+#endif
         sandbox_type_ == service_manager::SandboxType::kSoda;
     DCHECK(supported_sandbox_type);
 #endif  // DCHECK_IS_ON()
@@ -173,6 +176,22 @@
       service_manager::SandboxWin::SetJobLevel(
           cmd_line_, sandbox::JOB_UNPROTECTED, 0, policy);
     }
+
+    if (sandbox_type_ == service_manager::SandboxType::kSharingService) {
+      if (service_manager::IsWin32kLockdownEnabled()) {
+        auto result =
+            service_manager::SandboxWin::AddWin32kLockdownPolicy(policy, false);
+        if (result != sandbox::SBOX_ALL_OK)
+          return false;
+      }
+
+      auto delayed_flags = policy->GetDelayedProcessMitigations();
+      delayed_flags |= sandbox::MITIGATION_DYNAMIC_CODE_DISABLE;
+      auto result = policy->SetDelayedProcessMitigations(delayed_flags);
+      if (result != sandbox::SBOX_ALL_OK)
+        return false;
+    }
+
     return true;
   }
 #endif  // OS_WIN
diff --git a/content/browser/utility_process_sandbox_browsertest.cc b/content/browser/utility_process_sandbox_browsertest.cc
index 2098afb..1f025e6 100644
--- a/content/browser/utility_process_sandbox_browsertest.cc
+++ b/content/browser/utility_process_sandbox_browsertest.cc
@@ -101,6 +101,7 @@
       case SandboxType::kCdm:
       case SandboxType::kPpapi:
       case SandboxType::kPrintCompositor:
+      case SandboxType::kSharingService:
       case SandboxType::kUtility: {
         constexpr int kExpectedFullSandboxFlags =
             SandboxLinux::kPIDNS | SandboxLinux::kNetNS |
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index c35edb5..a1461a9 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -334,6 +334,7 @@
            kEnableOnly},
           {"FeaturePolicyForClientHints",
            features::kFeaturePolicyForClientHints, kUseFeatureState},
+          {"FlexNG", blink::features::kFlexNG, kEnableOnly},
           {"FontAccess", blink::features::kFontAccess, kUseFeatureState},
           {"FontSrcLocalMatching", features::kFontSrcLocalMatching,
            kUseFeatureState},
diff --git a/content/common/font_list_mac.mm b/content/common/font_list_mac.mm
index 6b605e97..66693d4 100644
--- a/content/common/font_list_mac.mm
+++ b/content/common/font_list_mac.mm
@@ -5,33 +5,194 @@
 #include "content/common/font_list.h"
 
 #import <Cocoa/Cocoa.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include <CoreText/CoreText.h>
 
 #include <utility>
 
+#include "base/logging.h"
+#include "base/mac/foundation_util.h"
+#include "base/mac/scoped_cftyperef.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/values.h"
 
 namespace content {
 
-std::unique_ptr<base::ListValue> GetFontList_SlowBlocking() {
-  @autoreleasepool {
-    std::unique_ptr<base::ListValue> font_list(new base::ListValue);
-    NSFontManager* fontManager = [[[NSFontManager alloc] init] autorelease];
-    NSMutableDictionary* fonts_dict = [NSMutableDictionary dictionary];
-    NSArray* fonts = [fontManager availableFontFamilies];
+namespace {
 
-    for (NSString* family_name in fonts) {
-      NSString* localized_family_name =
-          [fontManager localizedNameForFamily:family_name face:nil];
-      fonts_dict[family_name] = localized_family_name;
+// Core Text-based localized family name lookup.
+//
+// This class is not thread-safe.
+//
+// This class caches some state for an efficient implementation of
+// [NSFontManager localizedNameForFamily:face:] using the Core Text API.
+class FontFamilyResolver {
+ public:
+  FontFamilyResolver() = default;
+  ~FontFamilyResolver() = default;
+
+  FontFamilyResolver(const FontFamilyResolver&) = delete;
+  FontFamilyResolver& operator=(const FontFamilyResolver&) = delete;
+
+  // Returns a localized font family name for the given family name.
+  base::ScopedCFTypeRef<CFStringRef> CopyLocalizedFamilyName(
+      CFStringRef family_name) {
+    DCHECK(family_name != nullptr);
+
+    CFDictionarySetValue(font_descriptor_attributes_.get(),
+                         kCTFontFamilyNameAttribute, family_name);
+    base::ScopedCFTypeRef<CTFontDescriptorRef> raw_descriptor(
+        CTFontDescriptorCreateWithAttributes(
+            font_descriptor_attributes_.get()));
+
+    base::ScopedCFTypeRef<CFArrayRef> normalized_descriptors(
+        CTFontDescriptorCreateMatchingFontDescriptors(
+            raw_descriptor, mandatory_attributes_.get()));
+    return CopyLocalizedFamilyNameFrom(family_name,
+                                       normalized_descriptors.get());
+  }
+
+  // True if the font should be hidden from Chrome.
+  //
+  // On macOS 10.15, CTFontManagerCopyAvailableFontFamilyNames() filters hidden
+  // fonts. This is not true on older version of macOS that Chrome still
+  // supports. The unittest FontTest.GetFontListDoesNotIncludeHiddenFonts can be
+  // used to determine when it's safe to slim down / remove this function.
+  static bool IsHiddenFontFamily(CFStringRef family_name) {
+    DCHECK_GT(CFStringGetLength(family_name), 0);
+    return CFStringGetCharacterAtIndex(family_name, 0) == '.';
+  }
+
+ private:
+  // Returns the first font descriptor matching the given family name.
+  //
+  // |descriptors| must be an array of CTFontDescriptors whose font family name
+  // attribute is populated.
+  //
+  // Returns null if none of the descriptors match.
+  static base::ScopedCFTypeRef<CTFontDescriptorRef> FindFirstWithFamilyName(
+      CFStringRef family_name,
+      CFArrayRef descriptors) {
+    DCHECK(family_name != nullptr);
+    DCHECK(descriptors != nullptr);
+
+    CFIndex normalized_descriptor_count = CFArrayGetCount(descriptors);
+    for (CFIndex i = 0; i < normalized_descriptor_count; ++i) {
+      CTFontDescriptorRef descriptor =
+          base::mac::CFCastStrict<CTFontDescriptorRef>(
+              CFArrayGetValueAtIndex(descriptors, i));
+
+      base::ScopedCFTypeRef<CFStringRef> descriptor_family_name(
+          base::mac::CFCastStrict<CFStringRef>(CTFontDescriptorCopyAttribute(
+              descriptor, kCTFontFamilyNameAttribute)));
+      if (CFStringCompare(family_name, descriptor_family_name,
+                          /*compareOptions=*/0) == kCFCompareEqualTo) {
+        return base::ScopedCFTypeRef<CTFontDescriptorRef>(
+            descriptor, base::scoped_policy::RETAIN);
+      }
+    }
+    return base::ScopedCFTypeRef<CTFontDescriptorRef>(nullptr);
+  }
+
+  // Returns a localized font family name for the given family name.
+  //
+  // |descriptors| must be an array of CTFontDescriptors representing all
+  // descriptors on the system matching the given family name.
+  //
+  // The given family name is returned as a fallback, if none of the descriptors
+  // match the desired font family name.
+  static base::ScopedCFTypeRef<CFStringRef> CopyLocalizedFamilyNameFrom(
+      CFStringRef family_name,
+      CFArrayRef descriptors) {
+    DCHECK(family_name != nullptr);
+    DCHECK(descriptors != nullptr);
+
+    base::ScopedCFTypeRef<CTFontDescriptorRef> descriptor =
+        FindFirstWithFamilyName(family_name, descriptors);
+    if (descriptor == nullptr) {
+      base::ScopedCFTypeRef<CFStringRef> fallback_return_value(
+          CFStringCreateCopy(nullptr, family_name));
+      DLOG(WARNING) << "Will use non-localized family name for font family: "
+                    << family_name;
+      return fallback_return_value;
     }
 
-    // Sort family names based on localized names.
-    NSArray* sortedFonts = [fonts_dict
+    base::ScopedCFTypeRef<CFStringRef> localized_family_name(
+        base::mac::CFCastStrict<CFStringRef>(
+            CTFontDescriptorCopyLocalizedAttribute(descriptor,
+                                                   kCTFontFamilyNameAttribute,
+                                                   /*language=*/nullptr)));
+    return localized_family_name;
+  }
+
+  // Creates the set stored in |mandatory_attributes_|.
+  static base::ScopedCFTypeRef<CFSetRef> CreateMandatoryAttributes() {
+    CFStringRef set_values[] = {kCTFontFamilyNameAttribute};
+    return base::ScopedCFTypeRef<CFSetRef>(CFSetCreate(
+        kCFAllocatorDefault, reinterpret_cast<const void**>(set_values),
+        base::size(set_values), &kCFTypeSetCallBacks));
+  }
+
+  // Creates the mutable dictionary stored in |font_descriptor_attributes_|.
+  static base::ScopedCFTypeRef<CFMutableDictionaryRef>
+  CreateFontDescriptorAttributes() {
+    return base::ScopedCFTypeRef<CFMutableDictionaryRef>(
+        CFDictionaryCreateMutable(kCFAllocatorDefault, /*capacity=*/1,
+                                  &kCFTypeDictionaryKeyCallBacks,
+                                  &kCFTypeDictionaryValueCallBacks));
+  }
+
+  // Used for all CTFontDescriptorCreateMatchingFontDescriptors() calls.
+  //
+  // Caching this dictionary saves one dictionary creation per lookup.
+  const base::ScopedCFTypeRef<CFSetRef> mandatory_attributes_ =
+      CreateMandatoryAttributes();
+
+  // Used for all CTFontDescriptorCreateMatchingFontDescriptors() calls.
+  //
+  // This dictionary has exactly one key, kCTFontFamilyNameAttribute. The value
+  // associated with the key is overwritten as needed.
+  //
+  // Caching this dictionary saves one dictionary creation per lookup.
+  const base::ScopedCFTypeRef<CFMutableDictionaryRef>
+      font_descriptor_attributes_ = CreateFontDescriptorAttributes();
+};
+
+}  // namespace
+
+std::unique_ptr<base::ListValue> GetFontList_SlowBlocking() {
+  @autoreleasepool {
+    FontFamilyResolver resolver;
+
+    base::ScopedCFTypeRef<CFArrayRef> cf_family_names(
+        CTFontManagerCopyAvailableFontFamilyNames());
+    NSArray* family_names = base::mac::CFToNSCast(cf_family_names.get());
+
+    // Maps localized font family names to non-localized names.
+    NSMutableDictionary* family_name_map = [NSMutableDictionary
+        dictionaryWithCapacity:CFArrayGetCount(cf_family_names)];
+    for (NSString* family_name in family_names) {
+      CFStringRef family_name_cf = base::mac::NSToCFCast(family_name);
+      if (FontFamilyResolver::IsHiddenFontFamily(family_name_cf))
+        continue;
+
+      base::ScopedCFTypeRef<CFStringRef> cf_normalized_family_name =
+          resolver.CopyLocalizedFamilyName(base::mac::NSToCFCast(family_name));
+      family_name_map[base::mac::CFToNSCast(cf_normalized_family_name)] =
+          family_name;
+    }
+
+    // The Apple documentation for CTFontManagerCopyAvailableFontFamilyNames
+    // states that it returns family names sorted for user interface display.
+    // https://developer.apple.com/documentation/coretext/1499494-ctfontmanagercopyavailablefontfa
+    //
+    // This doesn't seem to be the case, at least on macOS 10.15.3.
+    NSArray* sorted_localized_family_names = [family_name_map
         keysSortedByValueUsingSelector:@selector(localizedStandardCompare:)];
 
-    for (NSString* family_name in sortedFonts) {
-      NSString* localized_family_name = fonts_dict[family_name];
+    auto font_list = std::make_unique<base::ListValue>();
+    for (NSString* localized_family_name in sorted_localized_family_names) {
+      NSString* family_name = family_name_map[localized_family_name];
       auto font_item = std::make_unique<base::ListValue>();
       font_item->AppendString(base::SysNSStringToUTF16(family_name));
       font_item->AppendString(base::SysNSStringToUTF16(localized_family_name));
diff --git a/content/common/font_list_unittest.cc b/content/common/font_list_unittest.cc
index 5d2ef4e5..710bf96 100644
--- a/content/common/font_list_unittest.cc
+++ b/content/common/font_list_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/i18n/rtl.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_piece.h"
+#include "base/strings/string_util.h"
 #include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/test/task_environment.h"
@@ -75,3 +76,23 @@
   EXPECT_TRUE(HasFontWithName(*ko_fonts, "Malgun Gothic", "맑은 고딕"));
 }
 #endif  // defined(OS_WIN)
+
+#if defined(OS_MACOSX)
+// On some macOS versions, CTFontManager returns LastResort and/or hidden fonts.
+// Ensure that someone (CTFontManager or our FontList code) filters these fonts
+// on all OS versions that we support.
+TEST(FontList, GetFontListDoesNotIncludeHiddenFonts) {
+  std::unique_ptr<base::ListValue> fonts = content::GetFontList_SlowBlocking();
+
+  for (const auto& font : fonts->GetList()) {
+    const auto& font_names = font.GetList();
+    const std::string& font_id = font_names[0].GetString();
+
+    // The checks are inspired by Gecko's gfxMacPlatformFontList::AddFamily.
+    EXPECT_FALSE(base::LowerCaseEqualsASCII(font_id, "lastresort"))
+        << font_id << " seems to be LastResort, which should be filtered";
+    EXPECT_FALSE(font_id[0] == '.')
+        << font_id << " seems like a hidden font, which should be filtered";
+  }
+}
+#endif  // defined(OS_MACOSX)
diff --git a/content/public/browser/devtools_agent_host.h b/content/public/browser/devtools_agent_host.h
index 027486a..7b9bb9e 100644
--- a/content/public/browser/devtools_agent_host.h
+++ b/content/public/browser/devtools_agent_host.h
@@ -134,8 +134,7 @@
   virtual bool IsAttached() = 0;
 
   // Sends |message| from |client| to the agent.
-  // Returns true if the message is dispatched and handled.
-  virtual bool DispatchProtocolMessage(DevToolsAgentHostClient* client,
+  virtual void DispatchProtocolMessage(DevToolsAgentHostClient* client,
                                        base::span<const uint8_t> message) = 0;
 
   // Starts inspecting element at position (|x|, |y|) in the frame
diff --git a/content/public/browser/devtools_manager_delegate.cc b/content/public/browser/devtools_manager_delegate.cc
index d7c17c6..1bf814bc 100644
--- a/content/public/browser/devtools_manager_delegate.cc
+++ b/content/public/browser/devtools_manager_delegate.cc
@@ -61,7 +61,6 @@
 
 void DevToolsManagerDelegate::HandleCommand(
     DevToolsAgentHostClientChannel* channel,
-    const std::string& method,
     base::span<const uint8_t> message,
     NotHandledCallback callback) {
   std::move(callback).Run(message);
diff --git a/content/public/browser/devtools_manager_delegate.h b/content/public/browser/devtools_manager_delegate.h
index 2db2b48..26b0a393 100644
--- a/content/public/browser/devtools_manager_delegate.h
+++ b/content/public/browser/devtools_manager_delegate.h
@@ -69,7 +69,6 @@
   using NotHandledCallback =
       base::OnceCallback<void(base::span<const uint8_t>)>;
   virtual void HandleCommand(DevToolsAgentHostClientChannel* channel,
-                             const std::string& method,
                              base::span<const uint8_t> message,
                              NotHandledCallback callback);
 
diff --git a/content/public/test/dump_accessibility_test_helper.cc b/content/public/test/dump_accessibility_test_helper.cc
index ac1b83e..1b4aeab 100644
--- a/content/public/test/dump_accessibility_test_helper.cc
+++ b/content/public/test/dump_accessibility_test_helper.cc
@@ -19,9 +19,8 @@
 const char kCommentToken = '#';
 const char kMarkSkipFile[] = "#<skip";
 const char kSignalDiff[] = "*";
-}  // namespace
-
 const char kMarkEndOfFile[] = "<-- End-of-file -->";
+}  // namespace
 
 DumpAccessibilityTestHelper::DumpAccessibilityTestHelper(
     AccessibilityTestExpectationsLocator* test_locator)
@@ -80,10 +79,6 @@
       base::SplitString(expected_contents, "\n", base::KEEP_WHITESPACE,
                         base::SPLIT_WANT_NONEMPTY);
 
-  // Marking the end of the file with a line of text ensures that
-  // file length differences are found.
-  expected_lines.push_back(kMarkEndOfFile);
-
   return expected_lines;
 }
 
@@ -123,6 +118,11 @@
     diff += "------\n";
     diff += base::JoinString(actual_lines, "\n");
     diff += "\n";
+
+    // This is used by rebase_dump_accessibility_tree_test.py to signify
+    // the end of the file when parsing the actual output from remote logs.
+    diff += kMarkEndOfFile;
+    diff += "\n";
     LOG(ERROR) << "Diff:\n" << diff;
   } else {
     LOG(INFO) << "Test output matches expectations.";
@@ -163,6 +163,20 @@
     ++j;
   }
 
+  // Report a failure if there are additional expected lines or
+  // actual lines.
+  if (i < actual_lines_count) {
+    diff_lines.push_back(j);
+  } else {
+    while (j < expected_lines_count) {
+      if (expected_lines[j].size() > 0 &&
+          expected_lines[j][0] != kCommentToken) {
+        diff_lines.push_back(j);
+      }
+      j++;
+    }
+  }
+
   // Actual file has been fully checked.
   return diff_lines;
 }
diff --git a/content/public/test/dump_accessibility_test_helper.h b/content/public/test/dump_accessibility_test_helper.h
index a72b9c3..c4c9763 100644
--- a/content/public/test/dump_accessibility_test_helper.h
+++ b/content/public/test/dump_accessibility_test_helper.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_PUBLIC_TEST_DUMP_ACCESSIBILITY_TEST_HELPER_H_
 #define CONTENT_PUBLIC_TEST_DUMP_ACCESSIBILITY_TEST_HELPER_H_
 
+#include "base/gtest_prod_util.h"
 #include "base/optional.h"
 
 namespace base {
@@ -13,9 +14,6 @@
 
 namespace content {
 
-// Sentinal value to mark end of actual/expected results.
-extern const char kMarkEndOfFile[];
-
 class AccessibilityTestExpectationsLocator;
 
 // A helper class for writing accessibility tree dump tests.
@@ -46,6 +44,8 @@
       const std::vector<std::string>& expected_lines);
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(DumpAccessibilityTestHelperTest, TestDiffLines);
+
   // Utility helper that does a comment-aware equality check.
   // Returns array of lines from expected file which are different.
   static std::vector<int> DiffLines(
diff --git a/content/public/test/dump_accessibility_test_helper_unittest.cc b/content/public/test/dump_accessibility_test_helper_unittest.cc
new file mode 100644
index 0000000..9a20e6f9
--- /dev/null
+++ b/content/public/test/dump_accessibility_test_helper_unittest.cc
@@ -0,0 +1,74 @@
+// Copyright 2020 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.
+
+#include "content/public/test/dump_accessibility_test_helper.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::ElementsAre;
+
+namespace content {
+
+TEST(DumpAccessibilityTestHelperTest, TestDiffLines) {
+  // Files with the same lines should have an empty diff.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines({"broccoli", "turnip"},
+                                                     {"broccoli", "turnip"}),
+              ElementsAre());
+
+  // Empty files should have an empty diff.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines({}, {}), ElementsAre());
+
+  // If one line differs, that line number should be returned as the diff.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines({"broccoli", "turnip"},
+                                                     {"watermelon", "turnip"}),
+              ElementsAre(0));
+
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines({"broccoli", "turnip"},
+                                                     {"broccoli", "rutabaga"}),
+              ElementsAre(1));
+
+  // Multiple lines can differ.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines(
+                  {"broccoli", "turnip", "carrot", "squash"},
+                  {"broccoli", "aspartame", "carrot", "toothbrush"}),
+              ElementsAre(1, 3));
+
+  // Blank lines in the expected file are allowed.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines(
+                  {"", "broccoli", "turnip", "carrot", "", "squash"},
+                  {"broccoli", "turnip", "carrot", "squash"}),
+              ElementsAre());
+
+  // Comments in the expected file are allowed.
+  EXPECT_THAT(
+      DumpAccessibilityTestHelper::DiffLines(
+          {"#Vegetables:", "broccoli", "turnip", "carrot", "", "squash"},
+          {"broccoli", "turnip", "carrot", "squash"}),
+      ElementsAre());
+
+  // Comments or blank lines in the actual file are NOT allowed, that's a diff.
+  EXPECT_THAT(
+      DumpAccessibilityTestHelper::DiffLines(
+          {"broccoli", "turnip", "carrot", "squash"},
+          {"#vegetables", "broccoli", "turnip", "carrot", "", "squash"}),
+      ElementsAre(0, 1, 2, 3, 4));
+
+  // If the expected file has an extra line, that's a diff.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines(
+                  {"broccoli", "turnip", "cow"}, {"broccoli", "turnip"}),
+              ElementsAre(2));
+
+  // If the actual file has an extra line, that's a diff.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines(
+                  {"broccoli", "turnip"}, {"broccoli", "turnip", "horse"}),
+              ElementsAre(2));
+
+  // If the expected file has an extra blank line, that's okay.
+  EXPECT_THAT(DumpAccessibilityTestHelper::DiffLines({"broccoli", "turnip", ""},
+                                                     {"broccoli", "turnip"}),
+              ElementsAre());
+}
+
+}  // namespace content
diff --git a/content/public/test/test_runner_support.h b/content/public/test/test_runner_support.h
deleted file mode 100644
index 9b14c36..0000000
--- a/content/public/test/test_runner_support.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 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.
-
-#ifndef CONTENT_PUBLIC_TEST_TEST_RUNNER_SUPPORT_H_
-#define CONTENT_PUBLIC_TEST_TEST_RUNNER_SUPPORT_H_
-
-#include <string>
-
-namespace blink {
-class WebLocalFrame;
-}
-
-namespace content {
-
-// Returns a frame name that can be used in the output of web tests
-// (the name is derived from the frame's unique name).
-std::string GetFrameNameForWebTests(blink::WebLocalFrame* frame);
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_TEST_TEST_RUNNER_SUPPORT_H_
diff --git a/content/renderer/media/batching_media_log.cc b/content/renderer/media/batching_media_log.cc
index cca2614c..eadbd33 100644
--- a/content/renderer/media/batching_media_log.cc
+++ b/content/renderer/media/batching_media_log.cc
@@ -31,7 +31,7 @@
 // Print an event to the chromium log.
 // TODO(tmathmeyer) replace this with a log-only EventHandler.
 void Log(media::MediaLogRecord* event) {
-  if (event->type == media::MediaLogRecord::Type::kMediaError) {
+  if (event->type == media::MediaLogRecord::Type::kMediaStatus) {
     LOG(ERROR) << "MediaEvent: " << ToJSON(event);
   } else if (event->type == media::MediaLogRecord::Type::kMessage &&
              event->params.HasKey("error")) {
@@ -96,7 +96,7 @@
     switch (event->type) {
       // Hold onto the most recent PIPELINE_ERROR and the first, if any,
       // MEDIA_LOG_ERROR_ENTRY for use in GetErrorMessage().
-      case media::MediaLogRecord::Type::kMediaError:
+      case media::MediaLogRecord::Type::kMediaStatus:
         queued_media_events_.push_back(*event);
         last_pipeline_error_.swap(event);
         break;
@@ -174,9 +174,9 @@
 std::string BatchingMediaLog::MediaEventToMessageString(
     const media::MediaLogRecord& event) {
   switch (event.type) {
-    case media::MediaLogRecord::Type::kMediaError: {
+    case media::MediaLogRecord::Type::kMediaStatus: {
       int error_code = 0;
-      event.params.GetInteger(media::MediaLog::kMediaErrorText, &error_code);
+      event.params.GetInteger(media::MediaLog::kStatusText, &error_code);
       DCHECK_NE(error_code, 0);
       return PipelineStatusToString(
           static_cast<media::PipelineStatus>(error_code));
diff --git a/content/renderer/media/inspector_media_event_handler.cc b/content/renderer/media/inspector_media_event_handler.cc
index 84b43464..d9bffa8 100644
--- a/content/renderer/media/inspector_media_event_handler.cc
+++ b/content/renderer/media/inspector_media_event_handler.cc
@@ -67,7 +67,7 @@
         events.emplace_back(std::move(ev));
         break;
       }
-      case media::MediaLogRecord::Type::kMediaError: {
+      case media::MediaLogRecord::Type::kMediaStatus: {
         // TODO(tmathmeyer) Make a new type in the browser protocol instead
         // of overloading InspectorPlayerEvent.
         blink::InspectorPlayerEvent ev = {
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
index 89f5d93..807a126 100644
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc
+++ b/content/renderer/pepper/pepper_media_stream_video_track_host.cc
@@ -23,6 +23,7 @@
 #include "ppapi/host/host_message_context.h"
 #include "ppapi/proxy/ppapi_messages.h"
 #include "ppapi/shared_impl/media_stream_buffer.h"
+#include "ui/gfx/gpu_memory_buffer.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_source.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
 #include "third_party/libyuv/include/libyuv.h"
@@ -355,6 +356,36 @@
   if (frame->format() == media::PIXEL_FORMAT_I420A)
     frame = media::WrapAsI420VideoFrame(std::move(video_frame));
   PP_VideoFrame_Format ppformat = ToPpapiFormat(frame->format());
+  if (frame->storage_type() == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER) {
+    // NV12 is the only supported GMB pixel format at the moment, and there is
+    // no corresponding PP_VideoFrame_Format. Convert the video frame to I420.
+    DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_NV12);
+    ppformat = PP_VIDEOFRAME_FORMAT_I420;
+    auto* gmb = video_frame->GetGpuMemoryBuffer();
+    if (!gmb->Map()) {
+      DLOG(WARNING) << "Failed to map GpuMemoryBuffer";
+      return;
+    }
+    frame = media::VideoFrame::CreateFrame(
+        media::PIXEL_FORMAT_I420, video_frame->coded_size(),
+        video_frame->visible_rect(), video_frame->natural_size(),
+        video_frame->timestamp());
+    int ret = libyuv::NV12ToI420(
+        static_cast<const uint8_t*>(gmb->memory(0)), gmb->stride(0),
+        static_cast<const uint8_t*>(gmb->memory(1)), gmb->stride(1),
+        frame->data(media::VideoFrame::kYPlane),
+        frame->stride(media::VideoFrame::kYPlane),
+        frame->data(media::VideoFrame::kUPlane),
+        frame->stride(media::VideoFrame::kUPlane),
+        frame->data(media::VideoFrame::kVPlane),
+        frame->stride(media::VideoFrame::kVPlane),
+        video_frame->coded_size().width(), video_frame->coded_size().height());
+    gmb->Unmap();
+    if (ret != 0) {
+      DLOG(WARNING) << "Failed to convert NV12 to I420";
+      return;
+    }
+  }
   if (ppformat == PP_VIDEOFRAME_FORMAT_UNKNOWN)
     return;
 
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
index 48f18297..bdda2f2 100644
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -28,6 +28,7 @@
 #include "media/base/decoder_buffer.h"
 #include "media/base/limits.h"
 #include "media/base/media_util.h"
+#include "media/base/status.h"
 #include "media/base/video_decoder.h"
 #include "media/filters/ffmpeg_video_decoder.h"
 #include "media/filters/vpx_video_decoder.h"
@@ -647,7 +648,7 @@
   void Stop();
 
  private:
-  void OnInitDone(bool success);
+  void OnInitDone(media::Status status);
   void DoDecode();
   void OnDecodeComplete(media::DecodeStatus status);
   void OnOutputComplete(scoped_refptr<media::VideoFrame> frame);
@@ -710,7 +711,7 @@
                           weak_ptr_factory_.GetWeakPtr()),
       base::NullCallback());
 #else
-  OnInitDone(false);
+  OnInitDone(media::StatusCode::kDecoderFailedConfigure));
 #endif  // BUILDFLAG(ENABLE_LIBVPX) || BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
 }
 
@@ -755,8 +756,8 @@
   // This instance is deleted once we exit this scope.
 }
 
-void VideoDecoderShim::DecoderImpl::OnInitDone(bool success) {
-  if (!success) {
+void VideoDecoderShim::DecoderImpl::OnInitDone(media::Status status) {
+  if (!status.is_ok()) {
     main_task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(&VideoDecoderShim::OnInitializeFailed, shim_));
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index 40391b8..01fa265 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -525,6 +525,9 @@
   RenderFrameTestObserver observer(frame());
   gfx::Point viewport_offset(7, -11);
   blink::WebRect viewport_intersection(0, 11, 200, 89);
+
+  // TODO(crbug/1062006): Change to viewport_offset when blink-side changes are
+  // relanded with the chromeos-thinlto fix.
   blink::WebRect mainframe_intersection(0, 0, 200, 140);
   blink::FrameOcclusionState occlusion_state =
       blink::FrameOcclusionState::kUnknown;
@@ -534,8 +537,7 @@
   frame_widget()->OnMessageReceived(set_viewport_intersection_message);
   // Setting a new frame intersection in a local frame triggers the render frame
   // observer call.
-  EXPECT_EQ(observer.last_intersection_rect(),
-            blink::WebRect(7, -11, 200, 140));
+  EXPECT_EQ(observer.last_intersection_rect(), blink::WebRect(0, 0, 200, 140));
 }
 
 // Used to annotate the source of an interface request.
diff --git a/content/shell/renderer/web_test/web_test_render_frame_observer.cc b/content/shell/renderer/web_test/web_test_render_frame_observer.cc
index 6ffb2e6..fff4da8 100644
--- a/content/shell/renderer/web_test/web_test_render_frame_observer.cc
+++ b/content/shell/renderer/web_test/web_test_render_frame_observer.cc
@@ -46,20 +46,12 @@
                  blink::scheduler::GetSingleThreadTaskRunnerForTesting());
 }
 
-void WebTestRenderFrameObserver::ReadyToCommitNavigation(
-    blink::WebDocumentLoader* document_loader) {
-  if (!render_frame()->IsMainFrame())
-    return;
-  focus_on_next_commit_ = true;
-}
-
 void WebTestRenderFrameObserver::DidCommitProvisionalLoad(
     bool is_same_document_navigation,
     ui::PageTransition transition) {
   if (!render_frame()->IsMainFrame())
     return;
-  if (focus_on_next_commit_) {
-    focus_on_next_commit_ = false;
+  if (!is_same_document_navigation) {
     render_frame()->GetRenderView()->GetWebView()->SetFocusedFrame(
         render_frame()->GetWebFrame());
   }
@@ -67,12 +59,6 @@
       ->DidCommitNavigationInMainFrame();
 }
 
-void WebTestRenderFrameObserver::DidFailProvisionalLoad() {
-  if (!render_frame()->IsMainFrame())
-    return;
-  focus_on_next_commit_ = false;
-}
-
 void WebTestRenderFrameObserver::OnDestruct() {
   delete this;
 }
diff --git a/content/shell/renderer/web_test/web_test_render_frame_observer.h b/content/shell/renderer/web_test/web_test_render_frame_observer.h
index 112b6173..13ee84b8 100644
--- a/content/shell/renderer/web_test/web_test_render_frame_observer.h
+++ b/content/shell/renderer/web_test/web_test_render_frame_observer.h
@@ -19,13 +19,14 @@
   explicit WebTestRenderFrameObserver(RenderFrame* render_frame);
   ~WebTestRenderFrameObserver() override;
 
+  WebTestRenderFrameObserver(const WebTestRenderFrameObserver&) = delete;
+  WebTestRenderFrameObserver& operator=(const WebTestRenderFrameObserver&) =
+      delete;
+
  private:
   // RenderFrameObserver implementation.
-  void ReadyToCommitNavigation(
-      blink::WebDocumentLoader* document_loader) override;
   void DidCommitProvisionalLoad(bool is_same_document_navigation,
                                 ui::PageTransition transition) override;
-  void DidFailProvisionalLoad() override;
   void OnDestruct() override;
 
   // mojom::BlinkTestControl implementation.
@@ -46,8 +47,6 @@
       mojo::PendingAssociatedReceiver<mojom::BlinkTestControl> receiver);
 
   mojo::AssociatedReceiver<mojom::BlinkTestControl> receiver_{this};
-  bool focus_on_next_commit_ = false;
-  DISALLOW_COPY_AND_ASSIGN(WebTestRenderFrameObserver);
 };
 
 }  // namespace content
diff --git a/content/shell/test_runner/BUILD.gn b/content/shell/test_runner/BUILD.gn
index fcce08a..aaff5a4 100644
--- a/content/shell/test_runner/BUILD.gn
+++ b/content/shell/test_runner/BUILD.gn
@@ -99,7 +99,6 @@
     "//content/shell:client_hints_util",
     "//content/shell:web_test_switches",
     "//content/shell:web_test_utils",
-    "//content/test:test_runner_support",
     "//device/base/synchronization",
     "//device/gamepad/public/cpp:shared_with_blink",
     "//device/gamepad/public/mojom",
diff --git a/content/shell/test_runner/layout_dump.cc b/content/shell/test_runner/layout_dump.cc
index 6c0277b9..ce571a4 100644
--- a/content/shell/test_runner/layout_dump.cc
+++ b/content/shell/test_runner/layout_dump.cc
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
-#include "content/public/test/test_runner_support.h"
+#include "content/shell/test_runner/web_frame_test_proxy.h"
 #include "third_party/blink/public/platform/web_size.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/web/web_document.h"
@@ -30,7 +30,8 @@
   // Add header for all but the main frame. Skip empty frames.
   if (frame->Parent() && !frame->GetDocument().DocumentElement().IsNull()) {
     result.append("\n--------\nFrame: '");
-    result.append(content::GetFrameNameForWebTests(frame));
+    auto* frame_proxy = static_cast<WebFrameTestProxy*>(frame->Client());
+    result.append(frame_proxy->GetFrameNameForWebTests());
     result.append("'\n--------\n");
   }
 
@@ -42,8 +43,9 @@
   WebSize offset = frame->GetScrollOffset();
   if (offset.width > 0 || offset.height > 0) {
     if (frame->Parent()) {
-      result = std::string("frame '") +
-               content::GetFrameNameForWebTests(frame) + "' ";
+      auto* frame_proxy = static_cast<WebFrameTestProxy*>(frame->Client());
+      result = std::string("frame '") + frame_proxy->GetFrameNameForWebTests() +
+               "' ";
     }
     base::StringAppendF(&result, "scrolled to %d,%d\n", offset.width,
                         offset.height);
diff --git a/content/shell/test_runner/spell_check_client.h b/content/shell/test_runner/spell_check_client.h
index b513caa..3935b82 100644
--- a/content/shell/test_runner/spell_check_client.h
+++ b/content/shell/test_runner/spell_check_client.h
@@ -60,7 +60,7 @@
   // Tests related to spell checking should enable it manually.
   bool enabled_ = false;
 
-  // The mock spellchecker used in checkSpelling().
+  // The mock spellchecker used in CheckSpelling().
   MockSpellCheck spell_check_;
 
   blink::WebString last_requested_text_check_string_;
diff --git a/content/shell/test_runner/web_frame_test_client.cc b/content/shell/test_runner/web_frame_test_client.cc
index 66608f7..23525ef 100644
--- a/content/shell/test_runner/web_frame_test_client.cc
+++ b/content/shell/test_runner/web_frame_test_client.cc
@@ -12,7 +12,6 @@
 #include "base/strings/stringprintf.h"
 #include "content/public/common/referrer.h"
 #include "content/public/renderer/render_frame.h"
-#include "content/public/test/test_runner_support.h"
 #include "content/shell/test_runner/accessibility_controller.h"
 #include "content/shell/test_runner/event_sender.h"
 #include "content/shell/test_runner/mock_screen_orientation_client.h"
@@ -142,7 +141,8 @@
 std::string WebFrameTestClient::PrintFrameDescription(
     WebTestDelegate* delegate,
     blink::WebLocalFrame* frame) {
-  std::string name = content::GetFrameNameForWebTests(frame);
+  auto* frame_proxy = static_cast<WebFrameTestProxy*>(frame->Client());
+  std::string name = frame_proxy->GetFrameNameForWebTests();
   if (frame == frame->View()->MainFrame()) {
     DCHECK(name.empty());
     return "main frame";
diff --git a/content/shell/test_runner/web_frame_test_proxy.cc b/content/shell/test_runner/web_frame_test_proxy.cc
index 052bd78e..76ac4480 100644
--- a/content/shell/test_runner/web_frame_test_proxy.cc
+++ b/content/shell/test_runner/web_frame_test_proxy.cc
@@ -4,6 +4,7 @@
 
 #include "content/shell/test_runner/web_frame_test_proxy.h"
 
+#include "content/common/unique_name_helper.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "content/shell/test_runner/test_interfaces.h"
 #include "content/shell/test_runner/test_runner.h"
@@ -130,6 +131,10 @@
   new TestRenderFrameObserver(this, view_proxy_for_frame);  // deletes itself.
 }
 
+std::string WebFrameTestProxy::GetFrameNameForWebTests() {
+  return content::UniqueNameHelper::ExtractStableNameForTesting(unique_name());
+}
+
 void WebFrameTestProxy::UpdateAllLifecyclePhasesAndCompositeForTesting() {
   if (!IsLocalRoot())
     return;
diff --git a/content/shell/test_runner/web_frame_test_proxy.h b/content/shell/test_runner/web_frame_test_proxy.h
index 06914e20..2825020 100644
--- a/content/shell/test_runner/web_frame_test_proxy.h
+++ b/content/shell/test_runner/web_frame_test_proxy.h
@@ -38,6 +38,10 @@
   void Initialize(WebTestInterfaces* interfaces,
                   content::RenderViewImpl* render_view_for_frame);
 
+  // Returns a frame name that can be used in the output of web tests
+  // (the name is derived from the frame's unique name).
+  std::string GetFrameNameForWebTests();
+
   // RenderFrameImpl overrides.
   void UpdateAllLifecyclePhasesAndCompositeForTesting() override;
 
diff --git a/content/shell/test_runner/web_widget_test_proxy.cc b/content/shell/test_runner/web_widget_test_proxy.cc
index 5ad8aa4..4bfba441 100644
--- a/content/shell/test_runner/web_widget_test_proxy.cc
+++ b/content/shell/test_runner/web_widget_test_proxy.cc
@@ -202,8 +202,8 @@
     // Web tests can use a nested message loop to pump frames while inside a
     // frame, but the compositor does not support this. In this case, we only
     // run blink's lifecycle updates.
-    BeginMainFrame(base::TimeTicks::Now());
-    UpdateVisualState();
+    GetWebWidget()->UpdateAllLifecyclePhases(
+        blink::DocumentUpdateReason::kTest);
     return;
   }
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 548ce84..dfdd4b2 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -775,27 +775,6 @@
   ]
 }
 
-static_library("test_runner_support") {
-  testonly = true
-
-  # See comment at the top of //content/BUILD.gn for why this is disabled in
-  # component builds.
-  if (is_component_build) {
-    check_includes = false
-  }
-
-  sources = [
-    "../public/test/test_runner_support.h",
-    "test_runner_support.cc",
-  ]
-
-  deps = [
-    "//content/public/renderer",
-    "//content/renderer:for_content_tests",
-    "//third_party/blink/public:blink",
-  ]
-}
-
 static_library("blink_test_browser_support") {
   testonly = true
 
@@ -1937,6 +1916,7 @@
     "../public/common/url_utils_unittest.cc",
     "../public/test/browser_task_environment_unittest.cc",
     "../public/test/devtools_permission_overrides_unittest.cc",
+    "../public/test/dump_accessibility_test_helper_unittest.cc",
     "../public/test/no_renderer_crashes_assertion_unittest.cc",
     "../public/test/permission_type_unittest.cc",
     "../public/test/referrer_unittest.cc",
diff --git a/content/test/data/accessibility/event/aria-combo-box-collapse-expected-uia-win7.txt b/content/test/data/accessibility/event/aria-combo-box-collapse-expected-uia-win7.txt
index b665a9a..3a52630 100644
--- a/content/test/data/accessibility/event/aria-combo-box-collapse-expected-uia-win7.txt
+++ b/content/test/data/accessibility/event/aria-combo-box-collapse-expected-uia-win7.txt
@@ -3,4 +3,3 @@
 AutomationFocusChanged on role=combobox
 AutomationFocusChanged on role=option, name=Orange
 ExpandCollapseExpandCollapseState changed on role=combobox
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/aria-combo-box-expand-expected-uia-win7.txt b/content/test/data/accessibility/event/aria-combo-box-expand-expected-uia-win7.txt
index 5d77f3e..a0f69f6 100644
--- a/content/test/data/accessibility/event/aria-combo-box-expand-expected-uia-win7.txt
+++ b/content/test/data/accessibility/event/aria-combo-box-expand-expected-uia-win7.txt
@@ -5,4 +5,3 @@
 AutomationFocusChanged on role=option, name=Apple
 ExpandCollapseExpandCollapseState changed on role=combobox
 SelectionItem_ElementSelected on role=option, name=Apple
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/aria-combo-box-next-expected-uia-win7.txt b/content/test/data/accessibility/event/aria-combo-box-next-expected-uia-win7.txt
index 649cf09..4de7a25 100644
--- a/content/test/data/accessibility/event/aria-combo-box-next-expected-uia-win7.txt
+++ b/content/test/data/accessibility/event/aria-combo-box-next-expected-uia-win7.txt
@@ -11,4 +11,3 @@
 AutomationFocusChanged on role=option, name=Banana
 AutomationFocusChanged on role=option, name=Orange
 SelectionItem_ElementSelected on role=option, name=Banana
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/listbox-next-expected-uia-win7.txt b/content/test/data/accessibility/event/listbox-next-expected-uia-win7.txt
index ab7a250..e1b717ba 100644
--- a/content/test/data/accessibility/event/listbox-next-expected-uia-win7.txt
+++ b/content/test/data/accessibility/event/listbox-next-expected-uia-win7.txt
@@ -4,4 +4,3 @@
 AutomationFocusChanged on role=option, name=Orange
 AutomationFocusChanged on role=option, name=Orange
 SelectionItem_ElementSelected on role=option, name=Orange
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt b/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
index 9fcb8ce..70d5b54 100644
--- a/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
@@ -2,4 +2,3 @@
 === Start Continuation ===
 AXSelectedChildrenChanged on AXMenu
 AXValueChanged on AXPopUpButton
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt b/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt
index 90ceb35..3b9c78b 100644
--- a/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-expected-uia-win.txt
@@ -4,4 +4,3 @@
 AriaProperties changed on role=listitem, name=Apple
 SelectionItem_ElementRemovedFromSelection on role=listitem, name=Apple
 ValueValue changed on role=combobox
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-uia-win7.txt b/content/test/data/accessibility/event/menulist-collapse-expected-uia-win7.txt
index 22a595f..5309132 100644
--- a/content/test/data/accessibility/event/menulist-collapse-expected-uia-win7.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-expected-uia-win7.txt
@@ -5,4 +5,3 @@
 AutomationFocusChanged on role=combobox
 SelectionItem_ElementRemovedFromSelection on role=listitem, name=Apple
 ValueValue changed on role=combobox
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-win.txt b/content/test/data/accessibility/event/menulist-collapse-expected-win.txt
index 6903d28..95d8e9f 100644
--- a/content/test/data/accessibility/event/menulist-collapse-expected-win.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-expected-win.txt
@@ -4,4 +4,3 @@
 EVENT_OBJECT_SELECTIONWITHIN on role=ROLE_SYSTEM_LIST INVISIBLE SetSize=3
 EVENT_OBJECT_STATECHANGE on <option> role=ROLE_SYSTEM_LISTITEM name="Apple" INVISIBLE,FOCUSABLE,SELECTABLE PosInSet=1 SetSize=3
 EVENT_OBJECT_VALUECHANGE on <select> role=ROLE_SYSTEM_COMBOBOX FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP SetSize=3
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-auralinux.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-auralinux.txt
index a7ef68a..0873baf 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-auralinux.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-auralinux.txt
@@ -5,4 +5,3 @@
 === Start Continuation ===
 SELECTION-CHANGED role=ROLE_MENU name='(null)' ENABLED,SENSITIVE
 STATE-CHANGE:SELECTED:TRUE role=ROLE_MENU_ITEM name='Orange' ENABLED,FOCUSABLE,SELECTABLE,SELECTED,SENSITIVE,SHOWING,VISIBLE
-<-- End-of-file -->
\ No newline at end of file
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
index 9f95856..06a8f66 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
@@ -2,4 +2,3 @@
 === Start Continuation ===
 AXSelectedChildrenChanged on AXMenu
 AXValueChanged on AXPopUpButton AXValue="Orange"
-<-- End-of-file -->
\ No newline at end of file
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt
index b12bee8..c7276f4 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win.txt
@@ -5,4 +5,3 @@
 AriaProperties changed on role=listitem, name=Orange
 SelectionItem_ElementSelected on role=listitem, name=Orange
 ValueValue changed on role=combobox
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win7.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win7.txt
index b7aa066b..5b89bc5 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win7.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-uia-win7.txt
@@ -6,4 +6,3 @@
 AutomationFocusChanged on role=combobox
 SelectionItem_ElementSelected on role=listitem, name=Orange
 ValueValue changed on role=combobox
-<-- End-of-file -->
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt
index d7e2c78..5a62756a 100644
--- a/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt
+++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-win.txt
@@ -5,4 +5,3 @@
 EVENT_OBJECT_STATECHANGE on <option> role=ROLE_SYSTEM_LISTITEM name="Apple" INVISIBLE,FOCUSABLE,SELECTABLE PosInSet=1 SetSize=3
 EVENT_OBJECT_STATECHANGE on <option> role=ROLE_SYSTEM_LISTITEM name="Orange" SELECTED,FOCUSABLE,SELECTABLE PosInSet=2 SetSize=3
 EVENT_OBJECT_VALUECHANGE on <select> role=ROLE_SYSTEM_COMBOBOX value="Orange" FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP SetSize=3
-<-- End-of-file -->
diff --git a/content/test/data/android/authenticator.html b/content/test/data/android/authenticator.html
index ed454752..96a0f0c 100644
--- a/content/test/data/android/authenticator.html
+++ b/content/test/data/android/authenticator.html
@@ -90,7 +90,7 @@
                         if (r == false) {
                             window.document.title = 'Success';
                         } else {
-                            window.document.title = 'Fail';
+                            window.document.title = 'Fail: expected response to be false, got ' + r + ' instead';
                         }
                     })
                     .catch(e => {
diff --git a/content/test/test_runner_support.cc b/content/test/test_runner_support.cc
deleted file mode 100644
index 2aee6b56..0000000
--- a/content/test/test_runner_support.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 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.
-
-#include "content/public/test/test_runner_support.h"
-
-#include "content/common/unique_name_helper.h"
-#include "content/renderer/render_frame_impl.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-
-namespace content {
-
-std::string GetFrameNameForWebTests(blink::WebLocalFrame* frame) {
-  std::string unique_name = RenderFrameImpl::FromWebFrame(frame)->unique_name();
-  return UniqueNameHelper::ExtractStableNameForTesting(unique_name);
-}
-
-}  // namespace content
diff --git a/device/base/features.cc b/device/base/features.cc
index 17544cca..e3dae0d 100644
--- a/device/base/features.cc
+++ b/device/base/features.cc
@@ -28,5 +28,26 @@
 #endif
 };
 #endif  // BUILDFLAG(ENABLE_VR)
+namespace features {
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+// Controls WebXR support for the Oculus Runtime.
+const base::Feature kOculusVR{"OculusVR", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // ENABLE_OCULUS_VR
 
+#if BUILDFLAG(ENABLE_OPENVR)
+// Controls WebXR support for the OpenVR Runtime.
+const base::Feature kOpenVR{"OpenVR", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // ENABLE_OPENVR
+
+#if BUILDFLAG(ENABLE_OPENXR)
+// Controls WebXR support for the OpenXR Runtime.
+const base::Feature kOpenXR{"OpenXR", base::FEATURE_ENABLED_BY_DEFAULT};
+#endif  // ENABLE_OPENXR
+
+#if BUILDFLAG(ENABLE_WINDOWS_MR)
+// Controls WebXR support for the Windows Mixed Reality Runtime.
+const base::Feature kWindowsMixedReality{"WindowsMixedReality",
+                                         base::FEATURE_ENABLED_BY_DEFAULT};
+#endif  // ENABLE_WINDOWS_MR
+}  // namespace features
 }  // namespace device
diff --git a/device/base/features.h b/device/base/features.h
index 42fd824..be3d3c91 100644
--- a/device/base/features.h
+++ b/device/base/features.h
@@ -21,6 +21,22 @@
 DEVICE_BASE_EXPORT extern const base::Feature kWebXrOrientationSensorDevice;
 #endif  // BUILDFLAG(ENABLE_VR)
 
+// New features should be added to the device::features namespace.
+
+namespace features {
+#if BUILDFLAG(ENABLE_OCULUS_VR)
+DEVICE_BASE_EXPORT extern const base::Feature kOculusVR;
+#endif  // ENABLE_OCULUS_VR
+#if BUILDFLAG(ENABLE_OPENVR)
+DEVICE_BASE_EXPORT extern const base::Feature kOpenVR;
+#endif  // ENABLE_OPENVR
+#if BUILDFLAG(ENABLE_OPENXR)
+DEVICE_BASE_EXPORT extern const base::Feature kOpenXR;
+#endif  // ENABLE_OPENXR
+#if BUILDFLAG(ENABLE_WINDOWS_MR)
+DEVICE_BASE_EXPORT extern const base::Feature kWindowsMixedReality;
+#endif  // ENABLE_WINDOWS_MR
+}  // namespace features
 }  // namespace device
 
 #endif  // DEVICE_BASE_FEATURES_H_
diff --git a/device/fido/attestation_object.cc b/device/fido/attestation_object.cc
index 0bd40b7..dde84162 100644
--- a/device/fido/attestation_object.cc
+++ b/device/fido/attestation_object.cc
@@ -9,10 +9,48 @@
 #include "components/cbor/values.h"
 #include "components/cbor/writer.h"
 #include "device/fido/attestation_statement.h"
+#include "device/fido/authenticator_data.h"
 #include "device/fido/fido_constants.h"
+#include "device/fido/opaque_attestation_statement.h"
 
 namespace device {
 
+// static
+base::Optional<AttestationObject> AttestationObject::Parse(
+    const cbor::Value& value) {
+  if (!value.is_map()) {
+    return base::nullopt;
+  }
+  const cbor::Value::MapValue& map = value.GetMap();
+
+  const auto& format_it = map.find(cbor::Value(kFormatKey));
+  if (format_it == map.end() || !format_it->second.is_string()) {
+    return base::nullopt;
+  }
+  const std::string& fmt = format_it->second.GetString();
+
+  const auto& att_stmt_it = map.find(cbor::Value(kAttestationStatementKey));
+  if (att_stmt_it == map.end() || !att_stmt_it->second.is_map()) {
+    return base::nullopt;
+  }
+  std::unique_ptr<AttestationStatement> attestation_statement =
+      std::make_unique<OpaqueAttestationStatement>(
+          fmt, cbor::Value(att_stmt_it->second.GetMap()));
+
+  const auto& auth_data_it = map.find(cbor::Value(kAuthDataKey));
+  if (auth_data_it == map.end() || !auth_data_it->second.is_bytestring()) {
+    return base::nullopt;
+  }
+  base::Optional<AuthenticatorData> authenticator_data =
+      AuthenticatorData::DecodeAuthenticatorData(
+          auth_data_it->second.GetBytestring());
+  if (!authenticator_data) {
+    return base::nullopt;
+  }
+  return AttestationObject(std::move(*authenticator_data),
+                           std::move(attestation_statement));
+}
+
 AttestationObject::AttestationObject(
     AuthenticatorData data,
     std::unique_ptr<AttestationStatement> statement)
diff --git a/device/fido/attestation_object.h b/device/fido/attestation_object.h
index b89b8a1..591d581 100644
--- a/device/fido/attestation_object.h
+++ b/device/fido/attestation_object.h
@@ -25,13 +25,12 @@
 // https://www.w3.org/TR/2017/WD-webauthn-20170505/#cred-attestation.
 class COMPONENT_EXPORT(DEVICE_FIDO) AttestationObject {
  public:
+  static base::Optional<AttestationObject> Parse(const cbor::Value& value);
+
   AttestationObject(AuthenticatorData data,
                     std::unique_ptr<AttestationStatement> statement);
-
-  // Moveable.
   AttestationObject(AttestationObject&& other);
   AttestationObject& operator=(AttestationObject&& other);
-
   ~AttestationObject();
 
   std::vector<uint8_t> GetCredentialId() const;
diff --git a/device/fido/ctap_get_assertion_request.cc b/device/fido/ctap_get_assertion_request.cc
index 7d60cab..f34010f 100644
--- a/device/fido/ctap_get_assertion_request.cc
+++ b/device/fido/ctap_get_assertion_request.cc
@@ -15,6 +15,121 @@
 
 namespace device {
 
+namespace {
+bool IsGetAssertionOptionMapFormatCorrect(
+    const cbor::Value::MapValue& option_map) {
+  return std::all_of(
+      option_map.begin(), option_map.end(), [](const auto& param) {
+        return param.first.is_string() &&
+               (param.first.GetString() == kUserPresenceMapKey ||
+                param.first.GetString() == kUserVerificationMapKey) &&
+               param.second.is_bool();
+      });
+}
+
+bool AreGetAssertionRequestMapKeysCorrect(
+    const cbor::Value::MapValue& request_map) {
+  return std::all_of(
+      request_map.begin(), request_map.end(), [](const auto& param) {
+        return (param.first.is_integer() && 1u <= param.first.GetInteger() &&
+                param.first.GetInteger() <= 7u);
+      });
+}
+}  // namespace
+
+// static
+base::Optional<CtapGetAssertionRequest> CtapGetAssertionRequest::Parse(
+    const cbor::Value::MapValue& request_map) {
+  if (!AreGetAssertionRequestMapKeysCorrect(request_map))
+    return base::nullopt;
+
+  const auto rp_id_it = request_map.find(cbor::Value(1));
+  if (rp_id_it == request_map.end() || !rp_id_it->second.is_string())
+    return base::nullopt;
+
+  const auto client_data_hash_it = request_map.find(cbor::Value(2));
+  if (client_data_hash_it == request_map.end() ||
+      !client_data_hash_it->second.is_bytestring() ||
+      client_data_hash_it->second.GetBytestring().size() !=
+          kClientDataHashLength) {
+    return base::nullopt;
+  }
+  base::span<const uint8_t, kClientDataHashLength> client_data_hash(
+      client_data_hash_it->second.GetBytestring().data(),
+      kClientDataHashLength);
+
+  CtapGetAssertionRequest request(rp_id_it->second.GetString(),
+                                  /*client_data_json=*/std::string());
+  request.client_data_hash = fido_parsing_utils::Materialize(client_data_hash);
+
+  const auto allow_list_it = request_map.find(cbor::Value(3));
+  if (allow_list_it != request_map.end()) {
+    if (!allow_list_it->second.is_array())
+      return base::nullopt;
+
+    const auto& credential_descriptors = allow_list_it->second.GetArray();
+    if (credential_descriptors.empty())
+      return base::nullopt;
+
+    std::vector<PublicKeyCredentialDescriptor> allow_list;
+    for (const auto& credential_descriptor : credential_descriptors) {
+      auto allowed_credential =
+          PublicKeyCredentialDescriptor::CreateFromCBORValue(
+              credential_descriptor);
+      if (!allowed_credential)
+        return base::nullopt;
+
+      allow_list.push_back(std::move(*allowed_credential));
+    }
+    request.allow_list = std::move(allow_list);
+  }
+
+  const auto option_it = request_map.find(cbor::Value(5));
+  if (option_it != request_map.end()) {
+    if (!option_it->second.is_map())
+      return base::nullopt;
+
+    const auto& option_map = option_it->second.GetMap();
+    if (!IsGetAssertionOptionMapFormatCorrect(option_map))
+      return base::nullopt;
+
+    const auto user_presence_option =
+        option_map.find(cbor::Value(kUserPresenceMapKey));
+    if (user_presence_option != option_map.end()) {
+      request.user_presence_required = user_presence_option->second.GetBool();
+    }
+
+    const auto uv_option =
+        option_map.find(cbor::Value(kUserVerificationMapKey));
+    if (uv_option != option_map.end()) {
+      request.user_verification =
+          uv_option->second.GetBool()
+              ? UserVerificationRequirement::kRequired
+              : UserVerificationRequirement::kDiscouraged;
+    }
+  }
+
+  const auto pin_auth_it = request_map.find(cbor::Value(6));
+  if (pin_auth_it != request_map.end()) {
+    if (!pin_auth_it->second.is_bytestring())
+      return base::nullopt;
+
+    request.pin_auth = pin_auth_it->second.GetBytestring();
+  }
+
+  const auto pin_protocol_it = request_map.find(cbor::Value(7));
+  if (pin_protocol_it != request_map.end()) {
+    if (!pin_protocol_it->second.is_unsigned() ||
+        pin_protocol_it->second.GetUnsigned() >
+            std::numeric_limits<uint8_t>::max()) {
+      return base::nullopt;
+    }
+    request.pin_protocol = pin_protocol_it->second.GetUnsigned();
+  }
+
+  return request;
+}
+
 CtapGetAssertionRequest::CtapGetAssertionRequest(
     std::string in_rp_id,
     std::string in_client_data_json)
diff --git a/device/fido/ctap_get_assertion_request.h b/device/fido/ctap_get_assertion_request.h
index c369b63..94c1f5d1 100644
--- a/device/fido/ctap_get_assertion_request.h
+++ b/device/fido/ctap_get_assertion_request.h
@@ -33,6 +33,13 @@
  public:
   using ClientDataHash = std::array<uint8_t, kClientDataHashLength>;
 
+  // Decodes a CTAP2 authenticatorGetAssertion request message. The request's
+  // |client_data_json| will be empty and |client_data_hash| will be set.
+  //
+  // A |uv| bit of 0 is mapped to UserVerificationRequirement::kDiscouraged.
+  static base::Optional<CtapGetAssertionRequest> Parse(
+      const cbor::Value::MapValue& request_map);
+
   CtapGetAssertionRequest(std::string rp_id, std::string client_data_json);
   CtapGetAssertionRequest(const CtapGetAssertionRequest& that);
   CtapGetAssertionRequest(CtapGetAssertionRequest&& that);
@@ -59,8 +66,7 @@
   bool is_u2f_only = false;
 };
 
-struct CtapGetNextAssertionRequest {
-};
+struct CtapGetNextAssertionRequest {};
 
 // Serializes GetAssertion request parameter into CBOR encoded map with
 // integer keys and CBOR encoded values as defined by the CTAP spec.
diff --git a/device/fido/ctap_make_credential_request.cc b/device/fido/ctap_make_credential_request.cc
index 5eb87512..4fb4832c 100644
--- a/device/fido/ctap_make_credential_request.cc
+++ b/device/fido/ctap_make_credential_request.cc
@@ -15,6 +15,183 @@
 
 namespace device {
 
+namespace {
+bool IsMakeCredentialOptionMapFormatCorrect(
+    const cbor::Value::MapValue& option_map) {
+  return std::all_of(
+      option_map.begin(), option_map.end(), [](const auto& param) {
+        return param.first.is_string() &&
+               (param.first.GetString() == kResidentKeyMapKey ||
+                param.first.GetString() == kUserVerificationMapKey) &&
+               param.second.is_bool();
+      });
+}
+
+bool AreMakeCredentialRequestMapKeysCorrect(
+    const cbor::Value::MapValue& request_map) {
+  return std::all_of(
+      request_map.begin(), request_map.end(), [](const auto& param) {
+        return (param.first.is_integer() && 1u <= param.first.GetInteger() &&
+                param.first.GetInteger() <= 9u);
+      });
+}
+
+}  // namespace
+
+// static
+base::Optional<CtapMakeCredentialRequest> CtapMakeCredentialRequest::Parse(
+    const cbor::Value::MapValue& request_map) {
+  if (!AreMakeCredentialRequestMapKeysCorrect(request_map))
+    return base::nullopt;
+
+  const auto client_data_hash_it = request_map.find(cbor::Value(1));
+  if (client_data_hash_it == request_map.end() ||
+      !client_data_hash_it->second.is_bytestring() ||
+      client_data_hash_it->second.GetBytestring().size() !=
+          kClientDataHashLength) {
+    return base::nullopt;
+  }
+  base::span<const uint8_t, kClientDataHashLength> client_data_hash(
+      client_data_hash_it->second.GetBytestring().data(),
+      kClientDataHashLength);
+
+  const auto rp_entity_it = request_map.find(cbor::Value(2));
+  if (rp_entity_it == request_map.end() || !rp_entity_it->second.is_map())
+    return base::nullopt;
+
+  auto rp_entity =
+      PublicKeyCredentialRpEntity::CreateFromCBORValue(rp_entity_it->second);
+  if (!rp_entity)
+    return base::nullopt;
+
+  const auto user_entity_it = request_map.find(cbor::Value(3));
+  if (user_entity_it == request_map.end() || !user_entity_it->second.is_map())
+    return base::nullopt;
+
+  auto user_entity = PublicKeyCredentialUserEntity::CreateFromCBORValue(
+      user_entity_it->second);
+  if (!user_entity)
+    return base::nullopt;
+
+  const auto credential_params_it = request_map.find(cbor::Value(4));
+  if (credential_params_it == request_map.end())
+    return base::nullopt;
+
+  auto credential_params = PublicKeyCredentialParams::CreateFromCBORValue(
+      credential_params_it->second);
+  if (!credential_params)
+    return base::nullopt;
+
+  CtapMakeCredentialRequest request(
+      /*client_data_json=*/std::string(), std::move(*rp_entity),
+      std::move(*user_entity), std::move(*credential_params));
+  request.client_data_hash = fido_parsing_utils::Materialize(client_data_hash);
+
+  const auto exclude_list_it = request_map.find(cbor::Value(5));
+  if (exclude_list_it != request_map.end()) {
+    if (!exclude_list_it->second.is_array())
+      return base::nullopt;
+
+    const auto& credential_descriptors = exclude_list_it->second.GetArray();
+    std::vector<PublicKeyCredentialDescriptor> exclude_list;
+    for (const auto& credential_descriptor : credential_descriptors) {
+      auto excluded_credential =
+          PublicKeyCredentialDescriptor::CreateFromCBORValue(
+              credential_descriptor);
+      if (!excluded_credential)
+        return base::nullopt;
+
+      exclude_list.push_back(std::move(*excluded_credential));
+    }
+    request.exclude_list = std::move(exclude_list);
+  }
+
+  const auto extensions_it = request_map.find(cbor::Value(6));
+  if (extensions_it != request_map.end()) {
+    if (!extensions_it->second.is_map()) {
+      return base::nullopt;
+    }
+
+    const auto& extensions = extensions_it->second.GetMap();
+    const auto hmac_secret_it =
+        extensions.find(cbor::Value(kExtensionHmacSecret));
+    if (hmac_secret_it != extensions.end()) {
+      if (!hmac_secret_it->second.is_bool()) {
+        return base::nullopt;
+      }
+      request.hmac_secret = hmac_secret_it->second.GetBool();
+    }
+
+    const auto cred_protect_it =
+        extensions.find(cbor::Value(device::kExtensionCredProtect));
+    if (cred_protect_it != extensions.end()) {
+      if (!cred_protect_it->second.is_unsigned()) {
+        return base::nullopt;
+      }
+      switch (cred_protect_it->second.GetUnsigned()) {
+        case 1:
+          // Default behaviour.
+          break;
+        case 2:
+          request.cred_protect =
+              std::make_pair(device::CredProtect::kUVOrCredIDRequired, false);
+          break;
+        case 3:
+          request.cred_protect =
+              std::make_pair(device::CredProtect::kUVRequired, false);
+          break;
+        default:
+          return base::nullopt;
+      }
+    }
+  }
+
+  const auto option_it = request_map.find(cbor::Value(7));
+  if (option_it != request_map.end()) {
+    if (!option_it->second.is_map())
+      return base::nullopt;
+
+    const auto& option_map = option_it->second.GetMap();
+    if (!IsMakeCredentialOptionMapFormatCorrect(option_map))
+      return base::nullopt;
+
+    const auto resident_key_option =
+        option_map.find(cbor::Value(kResidentKeyMapKey));
+    if (resident_key_option != option_map.end()) {
+      request.resident_key_required = resident_key_option->second.GetBool();
+    }
+
+    const auto uv_option =
+        option_map.find(cbor::Value(kUserVerificationMapKey));
+    if (uv_option != option_map.end()) {
+      request.user_verification =
+          uv_option->second.GetBool()
+              ? UserVerificationRequirement::kRequired
+              : UserVerificationRequirement::kDiscouraged;
+    }
+  }
+
+  const auto pin_auth_it = request_map.find(cbor::Value(8));
+  if (pin_auth_it != request_map.end()) {
+    if (!pin_auth_it->second.is_bytestring())
+      return base::nullopt;
+
+    request.pin_auth = pin_auth_it->second.GetBytestring();
+  }
+
+  const auto pin_protocol_it = request_map.find(cbor::Value(9));
+  if (pin_protocol_it != request_map.end()) {
+    if (!pin_protocol_it->second.is_unsigned() ||
+        pin_protocol_it->second.GetUnsigned() >
+            std::numeric_limits<uint8_t>::max()) {
+      return base::nullopt;
+    }
+    request.pin_protocol = pin_protocol_it->second.GetUnsigned();
+  }
+
+  return request;
+}
+
 CtapMakeCredentialRequest::CtapMakeCredentialRequest(
     std::string in_client_data_json,
     PublicKeyCredentialRpEntity in_rp,
diff --git a/device/fido/ctap_make_credential_request.h b/device/fido/ctap_make_credential_request.h
index 37e59b8..c4416e3 100644
--- a/device/fido/ctap_make_credential_request.h
+++ b/device/fido/ctap_make_credential_request.h
@@ -34,6 +34,11 @@
  public:
   using ClientDataHash = std::array<uint8_t, kClientDataHashLength>;
 
+  // Decodes a CTAP2 authenticatorMakeCredential request message. The request's
+  // |client_data_json| will be empty and |client_data_hash| will be set.
+  static base::Optional<CtapMakeCredentialRequest> Parse(
+      const cbor::Value::MapValue& request_map);
+
   CtapMakeCredentialRequest(
       std::string client_data_json,
       PublicKeyCredentialRpEntity rp,
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc
index e770254..eb8095e7 100644
--- a/device/fido/virtual_ctap2_device.cc
+++ b/device/fido/virtual_ctap2_device.cc
@@ -143,46 +143,6 @@
   return AsCTAPStyleCBORBytes(make_credential_response);
 }
 
-bool IsMakeCredentialOptionMapFormatCorrect(
-    const cbor::Value::MapValue& option_map) {
-  return std::all_of(
-      option_map.begin(), option_map.end(), [](const auto& param) {
-        return param.first.is_string() &&
-               (param.first.GetString() == kResidentKeyMapKey ||
-                param.first.GetString() == kUserVerificationMapKey) &&
-               param.second.is_bool();
-      });
-}
-
-bool AreMakeCredentialRequestMapKeysCorrect(
-    const cbor::Value::MapValue& request_map) {
-  return std::all_of(
-      request_map.begin(), request_map.end(), [](const auto& param) {
-        return (param.first.is_integer() && 1u <= param.first.GetInteger() &&
-                param.first.GetInteger() <= 9u);
-      });
-}
-
-bool IsGetAssertionOptionMapFormatCorrect(
-    const cbor::Value::MapValue& option_map) {
-  return std::all_of(
-      option_map.begin(), option_map.end(), [](const auto& param) {
-        return param.first.is_string() &&
-               (param.first.GetString() == kUserPresenceMapKey ||
-                param.first.GetString() == kUserVerificationMapKey) &&
-               param.second.is_bool();
-      });
-}
-
-bool AreGetAssertionRequestMapKeysCorrect(
-    const cbor::Value::MapValue& request_map) {
-  return std::all_of(
-      request_map.begin(), request_map.end(), [](const auto& param) {
-        return (param.first.is_integer() && 1u <= param.first.GetInteger() &&
-                param.first.GetInteger() <= 7u);
-      });
-}
-
 base::Optional<std::vector<uint8_t>> GetPINBytestring(
     const cbor::Value::MapValue& request,
     pin::RequestKey key) {
@@ -720,22 +680,19 @@
     return CtapDeviceResponseCode::kCtap2ErrOther;
   }
 
-  auto request_and_hash =
-      ParseCtapMakeCredentialRequest(cbor_request->GetMap());
-  if (!request_and_hash) {
+  auto opt_request = CtapMakeCredentialRequest::Parse(cbor_request->GetMap());
+  if (!opt_request) {
     DLOG(ERROR) << "Incorrectly formatted MakeCredential request.";
     return CtapDeviceResponseCode::kCtap2ErrOther;
   }
-  CtapMakeCredentialRequest request = std::get<0>(*request_and_hash);
-  CtapMakeCredentialRequest::ClientDataHash client_data_hash =
-      std::get<1>(*request_and_hash);
+  CtapMakeCredentialRequest request = std::move(*opt_request);
   const AuthenticatorSupportedOptions& options = device_info_->options;
 
   bool user_verified;
   const base::Optional<CtapDeviceResponseCode> uv_error = CheckUserVerification(
       true /* is makeCredential */, options, request.pin_auth,
-      request.pin_protocol, mutable_state()->pin_token, client_data_hash,
-      request.user_verification, &user_verified);
+      request.pin_protocol, mutable_state()->pin_token,
+      request.client_data_hash, request.user_verification, &user_verified);
   if (uv_error != CtapDeviceResponseCode::kSuccess) {
     return uv_error;
   }
@@ -834,7 +791,7 @@
                                       ConstructECPublicKey(public_key)),
       std::move(extensions));
   auto sign_buffer =
-      ConstructSignatureBuffer(authenticator_data, client_data_hash);
+      ConstructSignatureBuffer(authenticator_data, request.client_data_hash);
 
   // Sign with attestation key.
   // Note: Non-deterministic, you need to mock this out if you rely on
@@ -904,21 +861,19 @@
   }
 
   const auto& request_map = cbor_request->GetMap();
-  auto request_and_hash = ParseCtapGetAssertionRequest(request_map);
-  if (!request_and_hash) {
+  auto opt_request = CtapGetAssertionRequest::Parse(request_map);
+  if (!opt_request) {
     DLOG(ERROR) << "Incorrectly formatted GetAssertion request.";
     return CtapDeviceResponseCode::kCtap2ErrOther;
   }
-  CtapGetAssertionRequest request = std::get<0>(*request_and_hash);
-  CtapGetAssertionRequest::ClientDataHash client_data_hash =
-      std::get<1>(*request_and_hash);
+  CtapGetAssertionRequest request = std::move(*opt_request);
   const AuthenticatorSupportedOptions& options = device_info_->options;
 
   bool user_verified;
   const base::Optional<CtapDeviceResponseCode> uv_error = CheckUserVerification(
       false /* not makeCredential */, options, request.pin_auth,
-      request.pin_protocol, mutable_state()->pin_token, client_data_hash,
-      request.user_verification, &user_verified);
+      request.pin_protocol, mutable_state()->pin_token,
+      request.client_data_hash, request.user_verification, &user_verified);
   if (uv_error != CtapDeviceResponseCode::kSuccess) {
     return uv_error;
   }
@@ -1044,7 +999,7 @@
         std::move(opt_attested_cred_data),
         extensions ? base::make_optional(extensions->Clone()) : base::nullopt);
     auto signature_buffer =
-        ConstructSignatureBuffer(authenticator_data, client_data_hash);
+        ConstructSignatureBuffer(authenticator_data, request.client_data_hash);
 
     std::vector<uint8_t> signature;
     status = Sign(private_key, std::move(signature_buffer), &signature);
@@ -1849,236 +1804,4 @@
                            std::move(attested_credential_data),
                            std::move(extensions));
 }
-
-base::Optional<std::pair<CtapMakeCredentialRequest,
-                         CtapMakeCredentialRequest::ClientDataHash>>
-ParseCtapMakeCredentialRequest(const cbor::Value::MapValue& request_map) {
-  if (!AreMakeCredentialRequestMapKeysCorrect(request_map))
-    return base::nullopt;
-
-  const auto client_data_hash_it = request_map.find(cbor::Value(1));
-  if (client_data_hash_it == request_map.end() ||
-      !client_data_hash_it->second.is_bytestring())
-    return base::nullopt;
-
-  const auto client_data_hash =
-      base::make_span(client_data_hash_it->second.GetBytestring())
-          .subspan<0, kClientDataHashLength>();
-
-  const auto rp_entity_it = request_map.find(cbor::Value(2));
-  if (rp_entity_it == request_map.end() || !rp_entity_it->second.is_map())
-    return base::nullopt;
-
-  auto rp_entity =
-      PublicKeyCredentialRpEntity::CreateFromCBORValue(rp_entity_it->second);
-  if (!rp_entity)
-    return base::nullopt;
-
-  const auto user_entity_it = request_map.find(cbor::Value(3));
-  if (user_entity_it == request_map.end() || !user_entity_it->second.is_map())
-    return base::nullopt;
-
-  auto user_entity = PublicKeyCredentialUserEntity::CreateFromCBORValue(
-      user_entity_it->second);
-  if (!user_entity)
-    return base::nullopt;
-
-  const auto credential_params_it = request_map.find(cbor::Value(4));
-  if (credential_params_it == request_map.end())
-    return base::nullopt;
-
-  auto credential_params = PublicKeyCredentialParams::CreateFromCBORValue(
-      credential_params_it->second);
-  if (!credential_params)
-    return base::nullopt;
-
-  CtapMakeCredentialRequest request(
-      std::string() /* client_data_json */, std::move(*rp_entity),
-      std::move(*user_entity), std::move(*credential_params));
-
-  const auto exclude_list_it = request_map.find(cbor::Value(5));
-  if (exclude_list_it != request_map.end()) {
-    if (!exclude_list_it->second.is_array())
-      return base::nullopt;
-
-    const auto& credential_descriptors = exclude_list_it->second.GetArray();
-    std::vector<PublicKeyCredentialDescriptor> exclude_list;
-    for (const auto& credential_descriptor : credential_descriptors) {
-      auto excluded_credential =
-          PublicKeyCredentialDescriptor::CreateFromCBORValue(
-              credential_descriptor);
-      if (!excluded_credential)
-        return base::nullopt;
-
-      exclude_list.push_back(std::move(*excluded_credential));
-    }
-    request.exclude_list = std::move(exclude_list);
-  }
-
-  const auto extensions_it = request_map.find(cbor::Value(6));
-  if (extensions_it != request_map.end()) {
-    if (!extensions_it->second.is_map()) {
-      return base::nullopt;
-    }
-
-    const auto& extensions = extensions_it->second.GetMap();
-    const auto hmac_secret_it =
-        extensions.find(cbor::Value(kExtensionHmacSecret));
-    if (hmac_secret_it != extensions.end()) {
-      if (!hmac_secret_it->second.is_bool()) {
-        return base::nullopt;
-      }
-      request.hmac_secret = hmac_secret_it->second.GetBool();
-    }
-
-    const auto cred_protect_it =
-        extensions.find(cbor::Value(device::kExtensionCredProtect));
-    if (cred_protect_it != extensions.end()) {
-      if (!cred_protect_it->second.is_unsigned()) {
-        return base::nullopt;
-      }
-      switch (cred_protect_it->second.GetUnsigned()) {
-        case 1:
-          // Default behaviour.
-          break;
-        case 2:
-          request.cred_protect =
-              std::make_pair(device::CredProtect::kUVOrCredIDRequired, false);
-          break;
-        case 3:
-          request.cred_protect =
-              std::make_pair(device::CredProtect::kUVRequired, false);
-          break;
-        default:
-          return base::nullopt;
-      }
-    }
-  }
-
-  const auto option_it = request_map.find(cbor::Value(7));
-  if (option_it != request_map.end()) {
-    if (!option_it->second.is_map())
-      return base::nullopt;
-
-    const auto& option_map = option_it->second.GetMap();
-    if (!IsMakeCredentialOptionMapFormatCorrect(option_map))
-      return base::nullopt;
-
-    const auto resident_key_option =
-        option_map.find(cbor::Value(kResidentKeyMapKey));
-    if (resident_key_option != option_map.end())
-      request.resident_key_required = resident_key_option->second.GetBool();
-
-    const auto uv_option =
-        option_map.find(cbor::Value(kUserVerificationMapKey));
-    if (uv_option != option_map.end())
-      request.user_verification =
-          uv_option->second.GetBool()
-              ? UserVerificationRequirement::kRequired
-              : UserVerificationRequirement::kDiscouraged;
-  }
-
-  const auto pin_auth_it = request_map.find(cbor::Value(8));
-  if (pin_auth_it != request_map.end()) {
-    if (!pin_auth_it->second.is_bytestring())
-      return base::nullopt;
-    request.pin_auth = pin_auth_it->second.GetBytestring();
-  }
-
-  const auto pin_protocol_it = request_map.find(cbor::Value(9));
-  if (pin_protocol_it != request_map.end()) {
-    if (!pin_protocol_it->second.is_unsigned() ||
-        pin_protocol_it->second.GetUnsigned() >
-            std::numeric_limits<uint8_t>::max())
-      return base::nullopt;
-    request.pin_protocol = pin_protocol_it->second.GetUnsigned();
-  }
-
-  return std::make_pair(std::move(request),
-                        fido_parsing_utils::Materialize(client_data_hash));
-}
-
-base::Optional<
-    std::pair<CtapGetAssertionRequest, CtapGetAssertionRequest::ClientDataHash>>
-ParseCtapGetAssertionRequest(const cbor::Value::MapValue& request_map) {
-  if (!AreGetAssertionRequestMapKeysCorrect(request_map))
-    return base::nullopt;
-
-  const auto rp_id_it = request_map.find(cbor::Value(1));
-  if (rp_id_it == request_map.end() || !rp_id_it->second.is_string())
-    return base::nullopt;
-
-  const auto client_data_hash_it = request_map.find(cbor::Value(2));
-  if (client_data_hash_it == request_map.end() ||
-      !client_data_hash_it->second.is_bytestring())
-    return base::nullopt;
-
-  const auto client_data_hash =
-      base::make_span(client_data_hash_it->second.GetBytestring())
-          .subspan<0, kClientDataHashLength>();
-
-  CtapGetAssertionRequest request(rp_id_it->second.GetString(),
-                                  std::string() /* client_data_json */);
-
-  const auto allow_list_it = request_map.find(cbor::Value(3));
-  if (allow_list_it != request_map.end()) {
-    if (!allow_list_it->second.is_array())
-      return base::nullopt;
-
-    const auto& credential_descriptors = allow_list_it->second.GetArray();
-    std::vector<PublicKeyCredentialDescriptor> allow_list;
-    for (const auto& credential_descriptor : credential_descriptors) {
-      auto allowed_credential =
-          PublicKeyCredentialDescriptor::CreateFromCBORValue(
-              credential_descriptor);
-      if (!allowed_credential)
-        return base::nullopt;
-
-      allow_list.push_back(std::move(*allowed_credential));
-    }
-    request.allow_list = std::move(allow_list);
-  }
-
-  const auto option_it = request_map.find(cbor::Value(5));
-  if (option_it != request_map.end()) {
-    if (!option_it->second.is_map())
-      return base::nullopt;
-
-    const auto& option_map = option_it->second.GetMap();
-    if (!IsGetAssertionOptionMapFormatCorrect(option_map))
-      return base::nullopt;
-
-    const auto user_presence_option =
-        option_map.find(cbor::Value(kUserPresenceMapKey));
-    if (user_presence_option != option_map.end())
-      request.user_presence_required = user_presence_option->second.GetBool();
-
-    const auto uv_option =
-        option_map.find(cbor::Value(kUserVerificationMapKey));
-    if (uv_option != option_map.end())
-      request.user_verification = uv_option->second.GetBool()
-                                      ? UserVerificationRequirement::kRequired
-                                      : UserVerificationRequirement::kPreferred;
-  }
-
-  const auto pin_auth_it = request_map.find(cbor::Value(6));
-  if (pin_auth_it != request_map.end()) {
-    if (!pin_auth_it->second.is_bytestring())
-      return base::nullopt;
-    request.pin_auth = pin_auth_it->second.GetBytestring();
-  }
-
-  const auto pin_protocol_it = request_map.find(cbor::Value(7));
-  if (pin_protocol_it != request_map.end()) {
-    if (!pin_protocol_it->second.is_unsigned() ||
-        pin_protocol_it->second.GetUnsigned() >
-            std::numeric_limits<uint8_t>::max())
-      return base::nullopt;
-    request.pin_protocol = pin_protocol_it->second.GetUnsigned();
-  }
-
-  return std::make_pair(std::move(request),
-                        fido_parsing_utils::Materialize(client_data_hash));
-}
-
 }  // namespace device
diff --git a/device/fido/virtual_ctap2_device.h b/device/fido/virtual_ctap2_device.h
index 624140b..8eabebb 100644
--- a/device/fido/virtual_ctap2_device.h
+++ b/device/fido/virtual_ctap2_device.h
@@ -177,22 +177,6 @@
   DISALLOW_COPY_AND_ASSIGN(VirtualCtap2Device);
 };
 
-// Decodes a CBOR-encoded CTAP2 authenticatorMakeCredential request message. The
-// request's client_data_json() value will be empty, and the hashed client data
-// is returned separately.
-COMPONENT_EXPORT(DEVICE_FIDO)
-base::Optional<std::pair<CtapMakeCredentialRequest,
-                         CtapMakeCredentialRequest::ClientDataHash>>
-ParseCtapMakeCredentialRequest(const cbor::Value::MapValue& request_map);
-
-// Decodes a CBOR-encoded CTAP2 authenticatorGetAssertion request message. The
-// request's client_data_json() value will be empty, and the hashed client data
-// is returned separately.
-COMPONENT_EXPORT(DEVICE_FIDO)
-base::Optional<
-    std::pair<CtapGetAssertionRequest, CtapGetAssertionRequest::ClientDataHash>>
-ParseCtapGetAssertionRequest(const cbor::Value::MapValue& request_map);
-
 }  // namespace device
 
 #endif  // DEVICE_FIDO_VIRTUAL_CTAP2_DEVICE_H_
diff --git a/device/fido/virtual_ctap2_device_unittest.cc b/device/fido/virtual_ctap2_device_unittest.cc
index e03c244..85c09055 100644
--- a/device/fido/virtual_ctap2_device_unittest.cc
+++ b/device/fido/virtual_ctap2_device_unittest.cc
@@ -58,36 +58,35 @@
       base::make_span(test_data::kCtapMakeCredentialRequest).subspan(1));
   ASSERT_TRUE(cbor_request);
   ASSERT_TRUE(cbor_request->is_map());
-  const auto request_and_hash =
-      ParseCtapMakeCredentialRequest(cbor_request->GetMap());
-  ASSERT_TRUE(request_and_hash);
-  auto request = std::get<0>(*request_and_hash);
-  auto client_data_hash = std::get<1>(*request_and_hash);
-  EXPECT_THAT(client_data_hash,
+  const base::Optional<CtapMakeCredentialRequest> request =
+      CtapMakeCredentialRequest::Parse(cbor_request->GetMap());
+  ASSERT_TRUE(request);
+  EXPECT_THAT(request->client_data_hash,
               ::testing::ElementsAreArray(test_data::kClientDataHash));
-  EXPECT_EQ(test_data::kRelyingPartyId, request.rp.id);
-  EXPECT_EQ("Acme", request.rp.name);
-  EXPECT_THAT(request.user.id, ::testing::ElementsAreArray(test_data::kUserId));
-  ASSERT_TRUE(request.user.name);
-  EXPECT_EQ("johnpsmith@example.com", *request.user.name);
-  ASSERT_TRUE(request.user.display_name);
-  EXPECT_EQ("John P. Smith", *request.user.display_name);
-  ASSERT_TRUE(request.user.icon_url);
+  EXPECT_EQ(test_data::kRelyingPartyId, request->rp.id);
+  EXPECT_EQ("Acme", request->rp.name);
+  EXPECT_THAT(request->user.id,
+              ::testing::ElementsAreArray(test_data::kUserId));
+  ASSERT_TRUE(request->user.name);
+  EXPECT_EQ("johnpsmith@example.com", *request->user.name);
+  ASSERT_TRUE(request->user.display_name);
+  EXPECT_EQ("John P. Smith", *request->user.display_name);
+  ASSERT_TRUE(request->user.icon_url);
   EXPECT_EQ("https://pics.acme.com/00/p/aBjjjpqPb.png",
-            request.user.icon_url->spec());
+            request->user.icon_url->spec());
   ASSERT_EQ(2u,
-            request.public_key_credential_params.public_key_credential_params()
+            request->public_key_credential_params.public_key_credential_params()
                 .size());
   EXPECT_EQ(-7,
-            request.public_key_credential_params.public_key_credential_params()
+            request->public_key_credential_params.public_key_credential_params()
                 .at(0)
                 .algorithm);
   EXPECT_EQ(257,
-            request.public_key_credential_params.public_key_credential_params()
+            request->public_key_credential_params.public_key_credential_params()
                 .at(1)
                 .algorithm);
-  EXPECT_EQ(UserVerificationRequirement::kRequired, request.user_verification);
-  EXPECT_TRUE(request.resident_key_required);
+  EXPECT_EQ(UserVerificationRequirement::kRequired, request->user_verification);
+  EXPECT_TRUE(request->resident_key_required);
 }
 
 TEST_F(VirtualCtap2DeviceTest, ParseGetAssertionRequestForVirtualCtapKey) {
@@ -111,20 +110,18 @@
   ASSERT_TRUE(cbor_request);
   ASSERT_TRUE(cbor_request->is_map());
 
-  auto request_and_hash = ParseCtapGetAssertionRequest(cbor_request->GetMap());
-  ASSERT_TRUE(request_and_hash);
-  auto request = std::get<0>(*request_and_hash);
-  auto client_data_hash = std::get<1>(*request_and_hash);
-  EXPECT_THAT(client_data_hash,
+  const base::Optional<CtapGetAssertionRequest> request =
+      CtapGetAssertionRequest::Parse(cbor_request->GetMap());
+  EXPECT_THAT(request->client_data_hash,
               ::testing::ElementsAreArray(test_data::kClientDataHash));
-  EXPECT_EQ(test_data::kRelyingPartyId, request.rp_id);
-  EXPECT_EQ(UserVerificationRequirement::kRequired, request.user_verification);
-  EXPECT_FALSE(request.user_presence_required);
-  ASSERT_EQ(2u, request.allow_list.size());
+  EXPECT_EQ(test_data::kRelyingPartyId, request->rp_id);
+  EXPECT_EQ(UserVerificationRequirement::kRequired, request->user_verification);
+  EXPECT_FALSE(request->user_presence_required);
+  ASSERT_EQ(2u, request->allow_list.size());
 
-  EXPECT_THAT(request.allow_list.at(0).id(),
+  EXPECT_THAT(request->allow_list.at(0).id(),
               ::testing::ElementsAreArray(kAllowedCredentialOne));
-  EXPECT_THAT(request.allow_list.at(1).id(),
+  EXPECT_THAT(request->allow_list.at(1).id(),
               ::testing::ElementsAreArray(kAllowedCredentialTwo));
 }
 
diff --git a/docs/cipd.md b/docs/cipd.md
index ed6f65a7..ff29c4b 100644
--- a/docs/cipd.md
+++ b/docs/cipd.md
@@ -1,10 +1,20 @@
 # CIPD for chromium dependencies
 
-This document outlines how to use [CIPD][1] for managing binary dependencies in
-chromium.
-
 [TOC]
 
+## What is CIPD?
+* CIPD stands for "Chrome Infrastructure Package Deployment".
+* Its code and docs [live within the luci-go project][CIPD].
+* Chromium uses CIPD to avoid checking large binary files into git, which git
+  does not handle well.
+* gclient supports CIPD packages in the same way as git repositories. They are
+  specified in [DEPS] and updated via `gclient sync`.
+* You can [browse Chromium's CIPD repository][browse] online.
+
+[CIPD]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/README.md
+[DEPS]: /DEPS
+[browse]: https://chrome-infra-packages.appspot.com/p/chromium
+
 ## Adding a new CIPD dependency
 
 ### 1. Set up a new directory for your dependency
@@ -26,7 +36,9 @@
       README.chromium
 ```
 
-For more on third-party dependencies, see [adding_to_third_party.md][2].
+For more on third-party dependencies, see [adding_to_third_party.md].
+
+[adding_to_third_party.md]: /docs/adding_to_third_party.md
 
 ### 2. Acquire whatever you want to package
 
@@ -122,6 +134,8 @@
 > but it is recommended. Doing so has benefits for visibility and ease of
 > future updates.
 
+[the code]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/client/cipd/builder/pkgdef.go
+
 ### 4. Create your CIPD package
 
 To actually create your package, you'll need:
@@ -204,7 +218,7 @@
 ...
 ```
 
-By default, [cria/project-chromium-cipd-owners][4] own all CIPD packages
+By default, [cria/project-chromium-cipd-owners][cria] own all CIPD packages
 under `chromium/`. If you're adding a package, talk to one of them.
 
 To obtain write access to a new package, ask an owner to run:
@@ -213,6 +227,8 @@
 $ cipd acl-edit chromium/third_party/sample_cipd_dep -owner user:email@address.com
 ```
 
+[cria]: https://chrome-infra-auth.appspot.com/auth/groups/project-chromium-cipd-owners
+
 ## Troubleshooting
 
  - **A file maintained by CIPD is missing, and gclient sync doesn't recreate it.**
@@ -225,8 +241,3 @@
 
 Note that there is a [bug](https://crbug.com/794764) on file to add a mode to CIPD
 that is not so trusting of its own cache.
-
-[1]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/
-[2]: /docs/adding_to_third_party.md
-[3]: https://chromium.googlesource.com/infra/luci/luci-go/+/master/cipd/client/cipd/builder/pkgdef.go
-[4]: https://chrome-infra-auth.appspot.com/auth/groups/project-chromium-cipd-owners
diff --git a/docs/updater/installer_api_mac.md b/docs/updater/installer_api_mac.md
new file mode 100644
index 0000000..828a316
--- /dev/null
+++ b/docs/updater/installer_api_mac.md
@@ -0,0 +1,47 @@
+# Mac Installer API
+This document briefly goes over the installer API for the updater on macOS.
+
+## Design
+The Installer API is the integration between the app installer and the updater,
+and is platform specific. The main functionality for doing the updates in the
+new updater will be an update executable (.install). The update executable will
+be invoked by the updater when there is an update available.
+
+The Installer API will be called through `Installer::RunApplicationInstaller()`,
+which takes `const base::FilePath&` for the path to the installer and
+`const std::string& arguments` for any arguments. This will then call
+`InstallFromDMG()`, which takes the same parameters. `InstallFromDMG()` then
+executes `.install` with the correct arguments.
+
+## .install
+
+### Usage
+The installer DMG will have the .install executable in the root of the volume
+and the new application embedded within.
+
+Currently the install executable takes just three arguments - an absolute path
+to the DMG, an absolute path to the currently installed app, and the version of
+the currently installed app. `Installer::RunApplicationInstaller()`, will append
+the existence checker path (path to the installed app) and the version from the
+registration into the args.
+
+For example, `Google Chrome.dmg`, will contain `Google Chrome.app` and
+`.install` executable. Here is an example of what `InstallFromDMG()` will run:
+
+i.e.
+```
+./.install "/Volumes/Google Chrome.dmg" "/Applications/Google Chrome.app" \
+"81.0.416.0"
+```
+
+### Exit Codes
+The current constraint for exit codes for the `.install` executable is that 0 is
+a successful update, and every other value is an error of some kind. For
+documentation on the existing exit codes for the implemented .install
+executable, please refer to `//chrome/updater/mac/setup/.install.sh`.
+
+### Non-executable Error Codes
+When executing `InstallFromDMG()`, there can also be cases in which the
+Installer API fails before the install executable is executed. These are
+translated from the enum `updater::InstallErrors`. Please refer to
+`//chrome/updater/mac/install.h` for documentation on these error codes.
diff --git a/extensions/browser/api/serial/serial_apitest.cc b/extensions/browser/api/serial/serial_apitest.cc
index 313f8af..5f91494 100644
--- a/extensions/browser/api/serial/serial_apitest.cc
+++ b/extensions/browser/api/serial/serial_apitest.cc
@@ -297,6 +297,11 @@
 
  private:
   // device::mojom::SerialPortManager methods:
+  void SetClient(mojo::PendingRemote<device::mojom::SerialPortManagerClient>
+                     remote) override {
+    NOTIMPLEMENTED();
+  }
+
   void GetDevices(GetDevicesCallback callback) override {
     std::vector<device::mojom::SerialPortInfoPtr> ports;
     for (const auto& port : ports_)
diff --git a/extensions/browser/service_worker_task_queue.cc b/extensions/browser/service_worker_task_queue.cc
index 50424ec8..802b2d4 100644
--- a/extensions/browser/service_worker_task_queue.cc
+++ b/extensions/browser/service_worker_task_queue.cc
@@ -225,8 +225,17 @@
     return;
   }
 
-  // TODO(lazyboy): Handle failure cases.
-  DCHECK(false) << "DidStartWorkerFail: " << context_id.first.extension_id();
+  WorkerState* worker_state = GetWorkerState(context_id);
+  DCHECK(worker_state);
+  if (g_test_observer) {
+    g_test_observer->DidStartWorkerFail(context_id.first.extension_id(),
+                                        worker_state->pending_tasks_.size());
+  }
+  worker_state->pending_tasks_.clear();
+  // TODO(https://crbug/1062936): Needs more thought: extension would be in
+  // perma-broken state after this as the registration wouldn't be stored if
+  // this happens.
+  LOG(ERROR) << "DidStartWorkerFail " << context_id.first.extension_id();
 }
 
 void ServiceWorkerTaskQueue::DidInitializeServiceWorkerContext(
@@ -585,6 +594,16 @@
   return iter->second;
 }
 
+size_t ServiceWorkerTaskQueue::GetNumPendingTasksForTest(
+    const LazyContextId& lazy_context_id) {
+  auto current_sequence = GetCurrentSequence(lazy_context_id.extension_id());
+  if (!current_sequence)
+    return 0u;
+  const SequencedContextId context_id(lazy_context_id, *current_sequence);
+  WorkerState* worker_state = GetWorkerState(context_id);
+  return worker_state ? worker_state->pending_tasks_.size() : 0u;
+}
+
 ServiceWorkerTaskQueue::WorkerState* ServiceWorkerTaskQueue::GetWorkerState(
     const SequencedContextId& context_id) {
   auto worker_iter = worker_state_map_.find(context_id);
diff --git a/extensions/browser/service_worker_task_queue.h b/extensions/browser/service_worker_task_queue.h
index c7a0260..a01d946 100644
--- a/extensions/browser/service_worker_task_queue.h
+++ b/extensions/browser/service_worker_task_queue.h
@@ -130,7 +130,9 @@
     // |will_register_service_worker| is true if a Service Worker will be
     // registered.
     virtual void OnActivateExtension(const ExtensionId& extension_id,
-                                     bool will_register_service_worker) = 0;
+                                     bool will_register_service_worker) {}
+    virtual void DidStartWorkerFail(const ExtensionId& extension_id,
+                                    size_t num_pending_tasks) {}
 
    private:
     DISALLOW_COPY_AND_ASSIGN(TestObserver);
@@ -138,6 +140,8 @@
 
   static void SetObserverForTest(TestObserver* observer);
 
+  size_t GetNumPendingTasksForTest(const LazyContextId& lazy_context_id);
+
  private:
   using SequencedContextId = std::pair<LazyContextId, ActivationSequence>;
 
diff --git a/extensions/browser/service_worker_task_queue_factory.cc b/extensions/browser/service_worker_task_queue_factory.cc
index b62d2c1..29ff874 100644
--- a/extensions/browser/service_worker_task_queue_factory.cc
+++ b/extensions/browser/service_worker_task_queue_factory.cc
@@ -6,6 +6,7 @@
 
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "extensions/browser/extension_registry_factory.h"
+#include "extensions/browser/process_manager_factory.h"
 #include "extensions/browser/service_worker_task_queue.h"
 
 using content::BrowserContext;
@@ -28,6 +29,7 @@
           "ServiceWorkerTaskQueue",
           BrowserContextDependencyManager::GetInstance()) {
   DependsOn(ExtensionRegistryFactory::GetInstance());
+  DependsOn(ProcessManagerFactory::GetInstance());
 }
 
 ServiceWorkerTaskQueueFactory::~ServiceWorkerTaskQueueFactory() {}
diff --git a/fuchsia/base/BUILD.gn b/fuchsia/base/BUILD.gn
index 2191bdde..69994a8 100644
--- a/fuchsia/base/BUILD.gn
+++ b/fuchsia/base/BUILD.gn
@@ -67,13 +67,17 @@
 
 source_set("legacymetrics") {
   sources = [
+    "legacymetrics_client.cc",
+    "legacymetrics_client.h",
     "legacymetrics_histogram_flattener.cc",
     "legacymetrics_histogram_flattener.h",
     "legacymetrics_user_event_recorder.cc",
     "legacymetrics_user_event_recorder.h",
   ]
+  public = [ "legacymetrics_client.h" ]
   deps = [ "//base" ]
   public_deps = [ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.legacymetrics" ]
+  friend = [ ":*" ]
 }
 
 # Used to propagate release-qualified package names to integration test code.
@@ -118,6 +122,7 @@
 test("cr_fuchsia_base_unittests") {
   sources = [
     "agent_impl_unittests.cc",
+    "legacymetrics_client_unittest.cc",
     "legacymetrics_histogram_flattener_unittest.cc",
     "legacymetrics_user_event_recorder_unittest.cc",
   ]
diff --git a/fuchsia/base/legacymetrics_client.cc b/fuchsia/base/legacymetrics_client.cc
new file mode 100644
index 0000000..5ce0539
--- /dev/null
+++ b/fuchsia/base/legacymetrics_client.cc
@@ -0,0 +1,106 @@
+// Copyright 2020 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.
+
+#include "fuchsia/base/legacymetrics_client.h"
+
+#include <lib/fit/function.h>
+#include <lib/sys/cpp/component_context.h>
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/fuchsia/default_context.h"
+#include "base/fuchsia/fuchsia_logging.h"
+#include "base/logging.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "fuchsia/base/legacymetrics_histogram_flattener.h"
+
+namespace cr_fuchsia {
+
+LegacyMetricsClient::LegacyMetricsClient() = default;
+
+LegacyMetricsClient::~LegacyMetricsClient() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+void LegacyMetricsClient::Start(base::TimeDelta report_interval) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_GT(report_interval, base::TimeDelta::FromSeconds(0));
+  DCHECK(!metrics_recorder_) << "Start() called more than once.";
+
+  report_interval_ = report_interval;
+  metrics_recorder_ = base::fuchsia::ComponentContextForCurrentProcess()
+                          ->svc()
+                          ->Connect<fuchsia::legacymetrics::MetricsRecorder>();
+  metrics_recorder_.set_error_handler(fit::bind_member(
+      this, &LegacyMetricsClient::OnMetricsRecorderDisconnected));
+  user_events_recorder_ = std::make_unique<LegacyMetricsUserActionRecorder>();
+  ScheduleNextReport();
+}
+
+void LegacyMetricsClient::SetReportAdditionalMetricsCallback(
+    ReportAdditionalMetricsCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!metrics_recorder_)
+      << "SetReportAdditionalMetricsCallback() must be called before Start().";
+  DCHECK(!report_additional_callback_);
+  DCHECK(callback);
+
+  report_additional_callback_ = std::move(callback);
+}
+
+void LegacyMetricsClient::ScheduleNextReport() {
+  DVLOG(1) << "Scheduling next report in " << report_interval_.InSeconds()
+           << "seconds.";
+  timer_.Start(FROM_HERE, report_interval_, this, &LegacyMetricsClient::Report);
+}
+
+void LegacyMetricsClient::Report() {
+  DCHECK(metrics_recorder_);
+  DVLOG(1) << __func__ << "called.";
+
+  std::vector<fuchsia::legacymetrics::Event> events;
+
+  // Add events from the additional metrics callback, if set.
+  if (report_additional_callback_)
+    report_additional_callback_.Run(&events);
+
+  // Include histograms.
+  for (auto& histogram : GetLegacyMetricsDeltas()) {
+    fuchsia::legacymetrics::Event histogram_event;
+    histogram_event.set_histogram(std::move(histogram));
+    events.push_back(std::move(histogram_event));
+  }
+
+  // Include user events.
+  if (user_events_recorder_->HasEvents()) {
+    for (auto& event : user_events_recorder_->TakeEvents()) {
+      fuchsia::legacymetrics::Event user_event;
+      user_event.set_user_action_event(std::move(event));
+      events.push_back(std::move(user_event));
+    }
+  }
+
+  if (events.empty()) {
+    ScheduleNextReport();
+    return;
+  }
+
+  metrics_recorder_->Record(std::move(events), [this]() {
+    VLOG(1) << "Report finished.";
+    ScheduleNextReport();
+  });
+}
+
+void LegacyMetricsClient::OnMetricsRecorderDisconnected(zx_status_t status) {
+  ZX_LOG_IF(ERROR, status != ZX_ERR_PEER_CLOSED, status)
+      << "MetricsRecorder connection lost.";
+
+  // Stop recording & reporting user events.
+  user_events_recorder_.reset();
+  timer_.AbandonAndStop();
+}
+
+}  // namespace cr_fuchsia
diff --git a/fuchsia/base/legacymetrics_client.h b/fuchsia/base/legacymetrics_client.h
new file mode 100644
index 0000000..1d0dc332
--- /dev/null
+++ b/fuchsia/base/legacymetrics_client.h
@@ -0,0 +1,64 @@
+// Copyright 2020 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.
+
+#ifndef FUCHSIA_BASE_LEGACYMETRICS_CLIENT_H_
+#define FUCHSIA_BASE_LEGACYMETRICS_CLIENT_H_
+
+#include <fuchsia/legacymetrics/cpp/fidl.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
+#include "base/timer/timer.h"
+#include "fuchsia/base/legacymetrics_user_event_recorder.h"
+
+namespace cr_fuchsia {
+
+// Used to report events & histogram data to the
+// fuchsia.legacymetrics.MetricsRecorder service.
+// LegacyMetricsClient must be Start()ed on an IO-capable sequence.
+// Cannot be used in conjunction with other metrics reporting services.
+// Must be constructed, used, and destroyed on the same sequence.
+class LegacyMetricsClient {
+ public:
+  using ReportAdditionalMetricsCallback = base::RepeatingCallback<void(
+      std::vector<fuchsia::legacymetrics::Event>*)>;
+
+  LegacyMetricsClient();
+
+  ~LegacyMetricsClient();
+
+  explicit LegacyMetricsClient(const LegacyMetricsClient&) = delete;
+  LegacyMetricsClient& operator=(const LegacyMetricsClient&) = delete;
+
+  // Starts buffering data and schedules metric reporting after every
+  // |report_interval|.
+  void Start(base::TimeDelta report_interval);
+
+  // Sets a |callback| to be invoked just prior to reporting, allowing users to
+  // report additional custom metrics.
+  // Must be called before Start().
+  void SetReportAdditionalMetricsCallback(
+      ReportAdditionalMetricsCallback callback);
+
+ private:
+  void ScheduleNextReport();
+  void Report();
+  void OnMetricsRecorderDisconnected(zx_status_t status);
+
+  base::TimeDelta report_interval_;
+  ReportAdditionalMetricsCallback report_additional_callback_;
+  std::unique_ptr<LegacyMetricsUserActionRecorder> user_events_recorder_;
+
+  fuchsia::legacymetrics::MetricsRecorderPtr metrics_recorder_;
+  base::RetainingOneShotTimer timer_;
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace cr_fuchsia
+
+#endif  // FUCHSIA_BASE_LEGACYMETRICS_CLIENT_H_
diff --git a/fuchsia/base/legacymetrics_client_unittest.cc b/fuchsia/base/legacymetrics_client_unittest.cc
new file mode 100644
index 0000000..49ecb3c
--- /dev/null
+++ b/fuchsia/base/legacymetrics_client_unittest.cc
@@ -0,0 +1,188 @@
+// Copyright 2020 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.
+
+#include <fuchsia/legacymetrics/cpp/fidl.h>
+#include <fuchsia/legacymetrics/cpp/fidl_test_base.h>
+#include <string>
+#include <utility>
+
+#include "base/fuchsia/scoped_service_binding.h"
+#include "base/fuchsia/test_component_context_for_process.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/test/task_environment.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "fuchsia/base/legacymetrics_client.h"
+#include "fuchsia/base/legacymetrics_histogram_flattener.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace cr_fuchsia {
+namespace {
+
+constexpr base::TimeDelta kReportInterval = base::TimeDelta::FromMinutes(1);
+
+class TestMetricsRecorder
+    : public fuchsia::legacymetrics::testing::MetricsRecorder_TestBase {
+ public:
+  TestMetricsRecorder() = default;
+  ~TestMetricsRecorder() override = default;
+
+  bool IsRecordInFlight() const { return ack_callback_.has_value(); }
+
+  std::vector<fuchsia::legacymetrics::Event> WaitForEvents() {
+    if (recorded_events_.empty()) {
+      base::RunLoop run_loop;
+      on_record_cb_ = run_loop.QuitClosure();
+      run_loop.Run();
+    }
+    return std::move(recorded_events_);
+  }
+
+  void DropAck() { ack_callback_ = base::nullopt; }
+
+  void SendAck() {
+    (*ack_callback_)();
+    ack_callback_ = base::nullopt;
+  }
+
+  // fuchsia::legacymetrics::MetricsRecorder implementation.
+  void Record(std::vector<fuchsia::legacymetrics::Event> events,
+              RecordCallback callback) override {
+    recorded_events_ = std::move(events);
+    ack_callback_ = std::move(callback);
+
+    if (on_record_cb_)
+      std::move(on_record_cb_).Run();
+  }
+
+  void NotImplemented_(const std::string& name) override { FAIL() << name; }
+
+ private:
+  std::vector<fuchsia::legacymetrics::Event> recorded_events_;
+  base::OnceClosure on_record_cb_;
+  base::Optional<RecordCallback> ack_callback_;
+};
+
+class LegacyMetricsClientTest : public testing::Test {
+ public:
+  LegacyMetricsClientTest()
+      : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME,
+                          base::test::TaskEnvironment::MainThreadType::IO) {}
+  ~LegacyMetricsClientTest() override = default;
+
+  void SetUp() override {
+    service_binding_ = std::make_unique<base::fuchsia::ScopedServiceBinding<
+        fuchsia::legacymetrics::MetricsRecorder>>(
+        test_context_.additional_services(), &test_recorder_);
+    base::SetRecordActionTaskRunner(base::ThreadTaskRunnerHandle::Get());
+
+    // Flush any dirty histograms from previous test runs in this process.
+    GetLegacyMetricsDeltas();
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  base::TestComponentContextForProcess test_context_;
+  TestMetricsRecorder test_recorder_;
+  std::unique_ptr<base::fuchsia::ScopedServiceBinding<
+      fuchsia::legacymetrics::MetricsRecorder>>
+      service_binding_;
+  LegacyMetricsClient client_;
+};
+
+TEST_F(LegacyMetricsClientTest, ReportIntervalBoundary) {
+  client_.Start(kReportInterval);
+
+  task_environment_.FastForwardBy(kReportInterval -
+                                  base::TimeDelta::FromSeconds(1));
+  EXPECT_FALSE(test_recorder_.IsRecordInFlight());
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(1));
+  EXPECT_TRUE(test_recorder_.IsRecordInFlight());
+}
+
+void PopulateAdditionalEvents(
+    std::vector<fuchsia::legacymetrics::Event>* events) {
+  fuchsia::legacymetrics::ImplementationDefinedEvent impl_event;
+  impl_event.set_name("baz");
+
+  fuchsia::legacymetrics::Event event;
+  event.set_impl_defined_event(std::move(impl_event));
+
+  events->emplace_back(std::move(event));
+}
+
+TEST_F(LegacyMetricsClientTest, AllTypes) {
+  client_.SetReportAdditionalMetricsCallback(
+      base::BindRepeating(&PopulateAdditionalEvents));
+  client_.Start(kReportInterval);
+
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  base::RecordComputedAction("bar");
+
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_TRUE(test_recorder_.IsRecordInFlight());
+
+  auto events = test_recorder_.WaitForEvents();
+  EXPECT_EQ(3u, events.size());
+  EXPECT_EQ("baz", events[0].impl_defined_event().name());
+  EXPECT_EQ("foo", events[1].histogram().name());
+  EXPECT_EQ("bar", events[2].user_action_event().name());
+}
+
+TEST_F(LegacyMetricsClientTest, ReportSkippedNoEvents) {
+  client_.Start(kReportInterval);
+
+  // Verify that Record() is not invoked if there is no data to report.
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_FALSE(test_recorder_.IsRecordInFlight());
+
+  // Add some events and allow the interval to lapse. Verify that the data is
+  // reported.
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_TRUE(test_recorder_.IsRecordInFlight());
+  test_recorder_.SendAck();
+
+  // Verify that Record() is skipped again for no-data.
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_FALSE(test_recorder_.IsRecordInFlight());
+}
+
+TEST_F(LegacyMetricsClientTest, MultipleReports) {
+  client_.Start(kReportInterval);
+
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_TRUE(test_recorder_.IsRecordInFlight());
+  test_recorder_.SendAck();
+  EXPECT_FALSE(test_recorder_.IsRecordInFlight());
+
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_TRUE(test_recorder_.IsRecordInFlight());
+  test_recorder_.SendAck();
+}
+
+TEST_F(LegacyMetricsClientTest, NoReportIfNeverAcked) {
+  client_.Start(kReportInterval);
+
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_TRUE(test_recorder_.IsRecordInFlight());
+  test_recorder_.DropAck();
+  EXPECT_FALSE(test_recorder_.IsRecordInFlight());
+
+  UMA_HISTOGRAM_COUNTS_1M("foo", 20);
+  task_environment_.FastForwardBy(kReportInterval);
+  EXPECT_FALSE(test_recorder_.IsRecordInFlight());
+}
+
+TEST_F(LegacyMetricsClientTest, MetricsChannelDisconnected) {
+  client_.Start(kReportInterval);
+  service_binding_.reset();
+  task_environment_.FastForwardBy(kReportInterval);
+}
+
+}  // namespace
+}  // namespace cr_fuchsia
diff --git a/fuchsia/base/legacymetrics_histogram_flattener_unittest.cc b/fuchsia/base/legacymetrics_histogram_flattener_unittest.cc
index d034712..ad4bfc5 100644
--- a/fuchsia/base/legacymetrics_histogram_flattener_unittest.cc
+++ b/fuchsia/base/legacymetrics_histogram_flattener_unittest.cc
@@ -38,6 +38,11 @@
  public:
   LegacyMetricsHistogramFlattenerTest() = default;
   ~LegacyMetricsHistogramFlattenerTest() override = default;
+
+  void SetUp() override {
+    // Flush all histogram deltas from prior tests executed in this process.
+    GetLegacyMetricsDeltas();
+  }
 };
 
 TEST_F(LegacyMetricsHistogramFlattenerTest, NoHistogramData) {
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index 53aa559..f9951c0 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3571,14 +3571,37 @@
     {
       "id": 336,
       "cr_bugs": [625785],
-      "description": "Hardware overlays caused crash spike on certain AMD GPUs",
+      "description": "DXVA video decoder crashes on some AMD GPUs",
       "os": {
         "type": "win"
       },
       "vendor_id": "0x1002",
       "device_id": ["0x15d8", "0x15dd"],
+      "exceptions": [
+        {
+          "driver_version": {
+            "op": "between",
+            "value": "26.20.11030.2",
+            "value2": "26.20.11999.99999"
+          },
+          "driver_version": {
+            "op": "between",
+            "value": "26.20.12020.15",
+            "value2": "26.20.12999.99999"
+          },
+          "driver_version": {
+            "op": "between",
+            "value": "26.20.13001.27002",
+            "value2": "26.20.13999.99999"
+          },
+          "driver_version": {
+            "op": ">=",
+            "value": "26.20.14001.7001"
+          }
+        }
+      ],
       "features": [
-        "disable_direct_composition_video_overlays"
+        "disable_dxva_video_decoder"
       ]
     }
   ]
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt
index 2898f28..54637af 100644
--- a/gpu/config/gpu_workaround_list.txt
+++ b/gpu/config/gpu_workaround_list.txt
@@ -26,6 +26,7 @@
 disable_discard_framebuffer
 disable_dual_source_blending_support
 disable_dxgi_zero_copy_video
+disable_dxva_video_decoder
 disable_es3_gl_context
 disable_es3_gl_context_for_testing
 disable_ext_draw_buffers
diff --git a/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc b/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
index 2577d45..af1f64e 100644
--- a/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
+++ b/gpu/ipc/service/image_decode_accelerator_stub_unittest.cc
@@ -1010,15 +1010,10 @@
   base::CheckedNumeric<uint64_t> safe_expected_total_transfer_cache_size =
       GetExpectedTotalMippedSizeForPlanarImage(decode_entry);
   ASSERT_TRUE(safe_expected_total_transfer_cache_size.IsValid());
-  // In a background memory dump, we have double counting: Skia will also count
-  // the size of the mipped textures.
-  base::CheckedNumeric<uint64_t> safe_expected_total_skia_gpu_resources_size =
-      safe_expected_total_transfer_cache_size + kSkiaBufferObjectSize;
-  ASSERT_TRUE(safe_expected_total_skia_gpu_resources_size.IsValid());
   ExpectProcessMemoryDump(
       base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND,
       safe_expected_total_transfer_cache_size.ValueOrDie(),
-      safe_expected_total_skia_gpu_resources_size.ValueOrDie(),
+      kSkiaBufferObjectSize,
       safe_expected_total_transfer_cache_size
           .ValueOrDie() /* expected_avg_image_size */);
 }
@@ -1049,19 +1044,13 @@
   decode_entry->EnsureMips();
   ASSERT_EQ(gfx::NumberOfPlanesForLinearBufferFormat(GetParam()),
             decode_entry->plane_images().size());
-  // In a background memory dump, we have double counting: Skia will also count
-  // the size of the mipped textures.
-  base::CheckedNumeric<uint64_t> safe_expected_total_skia_gpu_resources_size =
-      GetExpectedTotalMippedSizeForPlanarImage(decode_entry) +
-      kSkiaBufferObjectSize;
-  ASSERT_TRUE(safe_expected_total_skia_gpu_resources_size.IsValid());
   // For a deferred mip request, the transfer cache doesn't update its size
   // computation, so it reports memory as if no mips had been generated.
   ExpectProcessMemoryDump(
       base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND,
       base::strict_cast<uint64_t>(
           kDecodedBufferByteSize) /* expected_total_transfer_cache_size */,
-      safe_expected_total_skia_gpu_resources_size.ValueOrDie(),
+      kSkiaBufferObjectSize,
       base::strict_cast<uint64_t>(
           kDecodedBufferByteSize) /* expected_avg_image_size */);
 }
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.cc b/headless/lib/browser/headless_devtools_manager_delegate.cc
index 42ab267b..a16c512 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.cc
+++ b/headless/lib/browser/headless_devtools_manager_delegate.cc
@@ -25,12 +25,11 @@
 
 void HeadlessDevToolsManagerDelegate::HandleCommand(
     content::DevToolsAgentHostClientChannel* channel,
-    const std::string& method,
     base::span<const uint8_t> message,
     NotHandledCallback callback) {
   auto it = sessions_.find(channel);
   DCHECK(it != sessions_.end());
-  it->second->HandleCommand(method, message, std::move(callback));
+  it->second->HandleCommand(message, std::move(callback));
 }
 
 scoped_refptr<content::DevToolsAgentHost>
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.h b/headless/lib/browser/headless_devtools_manager_delegate.h
index 9abe4dc..313536c 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.h
+++ b/headless/lib/browser/headless_devtools_manager_delegate.h
@@ -30,7 +30,6 @@
 
   // DevToolsManagerDelegate implementation:
   void HandleCommand(content::DevToolsAgentHostClientChannel* channel,
-                     const std::string& method,
                      base::span<const uint8_t> message,
                      NotHandledCallback callback) override;
   scoped_refptr<content::DevToolsAgentHost> CreateNewTarget(
diff --git a/headless/lib/browser/headless_request_context_manager.cc b/headless/lib/browser/headless_request_context_manager.cc
index 646b0f0..100144c 100644
--- a/headless/lib/browser/headless_request_context_manager.cc
+++ b/headless/lib/browser/headless_request_context_manager.cc
@@ -17,6 +17,7 @@
 #include "headless/lib/browser/headless_browser_context_options.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "net/http/http_auth_preferences.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "services/network/network_service.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/network_service.mojom.h"
diff --git a/headless/lib/browser/protocol/browser_handler.cc b/headless/lib/browser/protocol/browser_handler.cc
index 2fc5cf9fc..b120279 100644
--- a/headless/lib/browser/protocol/browser_handler.cc
+++ b/headless/lib/browser/protocol/browser_handler.cc
@@ -42,7 +42,7 @@
 }
 
 Response BrowserHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::GetWindowForTarget(
@@ -53,12 +53,12 @@
       browser_->GetWebContentsForDevToolsAgentHostId(
           target_id.fromMaybe(target_id_)));
   if (!web_contents)
-    return Response::Error("No web contents for the given target id");
+    return Response::ServerError("No web contents for the given target id");
 
   auto result = std::make_unique<base::DictionaryValue>();
   *out_window_id = web_contents->window_id();
   *out_bounds = CreateBrowserBounds(web_contents);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::GetWindowBounds(
@@ -67,16 +67,16 @@
   HeadlessWebContentsImpl* web_contents =
       browser_->GetWebContentsForWindowId(window_id);
   if (!web_contents)
-    return Response::Error("Browser window not found");
+    return Response::ServerError("Browser window not found");
   *out_bounds = CreateBrowserBounds(web_contents);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::Close() {
   base::PostTask(
       FROM_HERE, {content::BrowserThread::UI},
       base::BindOnce(&HeadlessBrowserImpl::Shutdown, browser_->GetWeakPtr()));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response BrowserHandler::SetWindowBounds(
@@ -85,7 +85,7 @@
   HeadlessWebContentsImpl* web_contents =
       browser_->GetWebContentsForWindowId(window_id);
   if (!web_contents)
-    return Response::Error("Browser window not found");
+    return Response::ServerError("Browser window not found");
 
   gfx::Rect bounds = web_contents->web_contents()->GetContainerBounds();
   const bool set_bounds = window_bounds->HasLeft() || window_bounds->HasTop() ||
@@ -100,25 +100,25 @@
 
   const std::string window_state = window_bounds->GetWindowState("normal");
   if (set_bounds && window_state != "normal") {
-    return Response::Error(
+    return Response::ServerError(
         "The 'minimized', 'maximized' and 'fullscreen' states cannot be "
         "combined with 'left', 'top', 'width' or 'height'");
   }
 
   if (set_bounds && web_contents->window_state() != "normal") {
-    return Response::Error(
+    return Response::ServerError(
         "To resize minimized/maximized/fullscreen window, restore it to normal "
         "state first.");
   }
 
   web_contents->set_window_state(window_state);
   web_contents->SetBounds(bounds);
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response BrowserHandler::SetDockTile(Maybe<std::string> label,
                                                Maybe<protocol::Binary> image) {
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace protocol
diff --git a/headless/lib/browser/protocol/headless_devtools_session.cc b/headless/lib/browser/protocol/headless_devtools_session.cc
index 9eb7448d..7b5e00c2 100644
--- a/headless/lib/browser/protocol/headless_devtools_session.cc
+++ b/headless/lib/browser/protocol/headless_devtools_session.cc
@@ -13,6 +13,7 @@
 #include "headless/lib/browser/protocol/page_handler.h"
 #include "headless/lib/browser/protocol/target_handler.h"
 #include "third_party/inspector_protocol/crdtp/cbor.h"
+#include "third_party/inspector_protocol/crdtp/dispatch.h"
 #include "third_party/inspector_protocol/crdtp/json.h"
 
 namespace headless {
@@ -42,23 +43,24 @@
 }
 
 void HeadlessDevToolsSession::HandleCommand(
-    const std::string& method,
     base::span<const uint8_t> message,
     content::DevToolsManagerDelegate::NotHandledCallback callback) {
-  if (!browser_ || !dispatcher_.canDispatch(method)) {
+  if (!browser_) {
     std::move(callback).Run(message);
     return;
   }
-  int call_id;
-  std::string unused;
-  std::unique_ptr<protocol::DictionaryValue> value =
-      protocol::DictionaryValue::cast(Value::parseBinary(
-          reinterpret_cast<const uint8_t*>(message.data()), message.size()));
-  if (!dispatcher_.parseCommand(value.get(), &call_id, &unused))
+  crdtp::Dispatchable dispatchable(crdtp::SpanFrom(message));
+  // content::DevToolsSession receives this message first, so we may
+  // assume it's ok.
+  DCHECK(dispatchable.ok());
+  crdtp::UberDispatcher::DispatchResult dispatched =
+      dispatcher_.Dispatch(dispatchable);
+  if (!dispatched.MethodFound()) {
+    std::move(callback).Run(message);
     return;
-  pending_commands_[call_id] = std::move(callback);
-  dispatcher_.dispatch(call_id, method, std::move(value),
-                       crdtp::SpanFrom(message));
+  }
+  pending_commands_[dispatchable.CallId()] = std::move(callback);
+  dispatched.Run();
 }
 
 void HeadlessDevToolsSession::AddHandler(
@@ -70,7 +72,7 @@
 // The following methods handle responses or notifications coming from
 // the browser to the client.
 
-void HeadlessDevToolsSession::sendProtocolResponse(
+void HeadlessDevToolsSession::SendProtocolResponse(
     int call_id,
     std::unique_ptr<Serializable> message) {
   pending_commands_.erase(call_id);
@@ -78,15 +80,15 @@
   client_channel_->DispatchProtocolMessageToClient(message->Serialize());
 }
 
-void HeadlessDevToolsSession::sendProtocolNotification(
+void HeadlessDevToolsSession::SendProtocolNotification(
     std::unique_ptr<Serializable> message) {
   client_channel_->DispatchProtocolMessageToClient(message->Serialize());
 }
 
-void HeadlessDevToolsSession::flushProtocolNotifications() {}
+void HeadlessDevToolsSession::FlushProtocolNotifications() {}
 
-void HeadlessDevToolsSession::fallThrough(int call_id,
-                                          const std::string& method,
+void HeadlessDevToolsSession::FallThrough(int call_id,
+                                          crdtp::span<uint8_t> method,
                                           crdtp::span<uint8_t> message) {
   auto callback = std::move(pending_commands_[call_id]);
   pending_commands_.erase(call_id);
diff --git a/headless/lib/browser/protocol/headless_devtools_session.h b/headless/lib/browser/protocol/headless_devtools_session.h
index e9e8cde..db7c9da3 100644
--- a/headless/lib/browser/protocol/headless_devtools_session.h
+++ b/headless/lib/browser/protocol/headless_devtools_session.h
@@ -29,7 +29,6 @@
   ~HeadlessDevToolsSession() override;
 
   void HandleCommand(
-      const std::string& method,
       base::span<const uint8_t> message,
       content::DevToolsManagerDelegate::NotHandledCallback callback);
 
@@ -37,12 +36,12 @@
   void AddHandler(std::unique_ptr<DomainHandler> handler);
 
   // FrontendChannel:
-  void sendProtocolResponse(int call_id,
+  void SendProtocolResponse(int call_id,
                             std::unique_ptr<Serializable> message) override;
-  void sendProtocolNotification(std::unique_ptr<Serializable> message) override;
-  void flushProtocolNotifications() override;
-  void fallThrough(int call_id,
-                   const std::string& method,
+  void SendProtocolNotification(std::unique_ptr<Serializable> message) override;
+  void FlushProtocolNotifications() override;
+  void FallThrough(int call_id,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> message) override;
 
   base::WeakPtr<HeadlessBrowserImpl> browser_;
diff --git a/headless/lib/browser/protocol/headless_handler.cc b/headless/lib/browser/protocol/headless_handler.cc
index 8948de2..b37fca1 100644
--- a/headless/lib/browser/protocol/headless_handler.cc
+++ b/headless/lib/browser/protocol/headless_handler.cc
@@ -58,7 +58,7 @@
     std::unique_ptr<SkBitmap> bitmap,
     std::string error_message) {
   if (!error_message.empty()) {
-    callback->sendFailure(Response::Error(std::move(error_message)));
+    callback->sendFailure(Response::ServerError(std::move(error_message)));
     return;
   }
   if (!bitmap || bitmap->drawsNothing()) {
@@ -84,11 +84,11 @@
 Response HeadlessHandler::Enable() {
   if (frontend_)
     frontend_->NeedsBeginFramesChanged(true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response HeadlessHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 void HeadlessHandler::BeginFrame(Maybe<double> in_frame_time_ticks,
@@ -99,7 +99,7 @@
   HeadlessWebContentsImpl* headless_contents =
       HeadlessWebContentsImpl::From(browser_, web_contents_);
   if (!headless_contents->begin_frame_control_enabled()) {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         "Command is only supported if BeginFrameControl is enabled."));
     return;
   }
@@ -107,9 +107,9 @@
   if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
           ::switches::kRunAllCompositorStagesBeforeDraw)) {
     callback->sendFailure(
-        Response::Error("Command is only supported with "
-                        "--run-all-compositor-stages-before-draw, see "
-                        "https://goo.gl/3zHXhB for more info."));
+        Response::ServerError("Command is only supported with "
+                              "--run-all-compositor-stages-before-draw, see "
+                              "https://goo.gl/3zHXhB for more info."));
     return;
   }
 
diff --git a/headless/lib/browser/protocol/page_handler.cc b/headless/lib/browser/protocol/page_handler.cc
index 4ccb3c76..96cb11f 100644
--- a/headless/lib/browser/protocol/page_handler.cc
+++ b/headless/lib/browser/protocol/page_handler.cc
@@ -37,7 +37,7 @@
 }
 
 Response PageHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 void PageHandler::PrintToPDF(Maybe<bool> landscape,
@@ -138,7 +138,7 @@
           base::BindOnce(&PageHandler::PDFCreated, weak_factory_.GetWeakPtr(),
                          return_as_stream, std::move(callback)));
 #else
-  callback->sendFailure(Response::Error("Printing is not enabled"));
+  callback->sendFailure(Response::ServerError("Printing is not enabled"));
   return;
 #endif  // BUILDFLAG(ENABLE_PRINTING)
 }
@@ -151,7 +151,7 @@
     scoped_refptr<base::RefCountedMemory> data) {
   std::unique_ptr<base::DictionaryValue> response;
   if (print_result != HeadlessPrintManager::PRINT_SUCCESS) {
-    callback->sendFailure(Response::Error(
+    callback->sendFailure(Response::ServerError(
         HeadlessPrintManager::PrintResultToString(print_result)));
     return;
   }
diff --git a/headless/lib/browser/protocol/target_handler.cc b/headless/lib/browser/protocol/target_handler.cc
index 6cb9e7a8..fbff74e4 100644
--- a/headless/lib/browser/protocol/target_handler.cc
+++ b/headless/lib/browser/protocol/target_handler.cc
@@ -23,7 +23,7 @@
 }
 
 Response TargetHandler::Disable() {
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::CreateTarget(const std::string& url,
@@ -35,8 +35,10 @@
                                      Maybe<bool> background,
                                      std::string* out_target_id) {
 #if defined(OS_MACOSX)
-  if (enable_begin_frame_control.fromMaybe(false))
-    return Response::Error("BeginFrameControl is not supported on MacOS yet");
+  if (enable_begin_frame_control.fromMaybe(false)) {
+    return Response::ServerError(
+        "BeginFrameControl is not supported on MacOS yet");
+  }
 #endif
 
   HeadlessBrowserContext* context;
@@ -47,7 +49,7 @@
   } else {
     context = browser_->GetDefaultBrowserContext();
     if (!context) {
-      return Response::Error(
+      return Response::ServerError(
           "You specified no |browserContextId|, but "
           "there is no default browser context set on "
           "HeadlessBrowser");
@@ -65,7 +67,7 @@
           .Build());
 
   *out_target_id = web_contents_impl->GetDevToolsAgentHostId();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response TargetHandler::CloseTarget(const std::string& target_id,
@@ -77,7 +79,7 @@
     web_contents->Close();
     *out_success = true;
   }
-  return Response::OK();
+  return Response::Success();
 }
 }  // namespace protocol
 }  // namespace headless
diff --git a/headless/public/headless_browser_context.h b/headless/public/headless_browser_context.h
index e454ce3..22fa9db 100644
--- a/headless/public/headless_browser_context.h
+++ b/headless/public/headless_browser_context.h
@@ -17,7 +17,7 @@
 #include "content/public/common/web_preferences.h"
 #include "headless/public/headless_export.h"
 #include "headless/public/headless_web_contents.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 
 namespace base {
 class FilePath;
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star
index 18b638a2..330dfcc 100644
--- a/infra/config/buckets/try.star
+++ b/infra/config/buckets/try.star
@@ -443,10 +443,6 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-layout-tests-fragment-paint',
-)
-
-try_.chromium_linux_builder(
     name = 'linux_mojo',
 )
 
diff --git a/infra/config/consoles/luci.chromium.try.star b/infra/config/consoles/luci.chromium.try.star
index dd4be7e..47ed823 100644
--- a/infra/config/consoles/luci.chromium.try.star
+++ b/infra/config/consoles/luci.chromium.try.star
@@ -129,7 +129,6 @@
         'try/linux_chromium_ubsan_rel_ng',
         'try/linux_layout_tests_composite_after_paint',
         'try/linux-layout-tests-fragment-item',
-        'try/linux-layout-tests-fragment-paint',
         'try/linux_layout_tests_layout_ng_disabled',
         'try/linux_mojo',
         'try/linux_mojo_chromeos',
diff --git a/infra/config/consoles/tryserver.chromium.linux.star b/infra/config/consoles/tryserver.chromium.linux.star
index d8a8cfd..f0c768b8 100644
--- a/infra/config/consoles/tryserver.chromium.linux.star
+++ b/infra/config/consoles/tryserver.chromium.linux.star
@@ -53,7 +53,6 @@
         'try/linux_chromium_ubsan_rel_ng',
         'try/linux_layout_tests_composite_after_paint',
         'try/linux-layout-tests-fragment-item',
-        'try/linux-layout-tests-fragment-paint',
         'try/linux_layout_tests_layout_ng_disabled',
         'try/linux_mojo',
         'try/linux_mojo_chromeos',
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index 4f58c6e..e184691 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -766,10 +766,6 @@
         includable_only: true
       >
       builders: <
-        name: "chromium/try/linux-layout-tests-fragment-paint"
-        includable_only: true
-      >
-      builders: <
         name: "chromium/try/linux-libfuzzer-asan-rel"
       >
       builders: <
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 2199a57..3a188e0 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -17911,35 +17911,6 @@
       >
     >
     builders: <
-      name: "linux-layout-tests-fragment-paint"
-      swarming_host: "chromium-swarm.appspot.com"
-      swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-16.04"
-      dimensions: "ssd:0"
-      recipe: <
-        name: "chromium_trybot"
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/master"
-        properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}"
-        properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}"
-        properties_j: "mastername:\"tryserver.chromium.linux\""
-      >
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      caches: <
-        name: "win_toolchain"
-        path: "win_toolchain"
-      >
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage: <
-        value: 5
-      >
-    >
-    builders: <
       name: "linux-libfuzzer-asan-rel"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 2b975170..785a4043 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -10285,9 +10285,6 @@
     name: "buildbucket/luci.chromium.try/linux-layout-tests-fragment-item"
   >
   builders: <
-    name: "buildbucket/luci.chromium.try/linux-layout-tests-fragment-paint"
-  >
-  builders: <
     name: "buildbucket/luci.chromium.try/linux_layout_tests_layout_ng_disabled"
   >
   builders: <
@@ -13726,9 +13723,6 @@
     name: "buildbucket/luci.chromium.try/linux-layout-tests-fragment-item"
   >
   builders: <
-    name: "buildbucket/luci.chromium.try/linux-layout-tests-fragment-paint"
-  >
-  builders: <
     name: "buildbucket/luci.chromium.try/linux_layout_tests_layout_ng_disabled"
   >
   builders: <
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index ecd42c2..85b06d6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -603,6 +603,7 @@
 <translation id="9223358826628549784">క్రాష్ నివేదిక పంపబడింది.</translation>
 <translation id="952704832371081537">రద్దు చేయి</translation>
 <translation id="988141524645182168">ఇతర పరికరాలు</translation>
+<translation id="989697783705943787">సైట్ భద్రత</translation>
 <translation id="989988560359834682">చిరునామాను సవరించు</translation>
 <translation id="994757059139821576">కథనం సూచనలు</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h
index 826c1ea..36c1c5e8 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h
+++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.h
@@ -43,7 +43,7 @@
 class HttpServerProperties;
 class HttpTransactionFactory;
 class ProxyConfigService;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class ReportSender;
 class SystemCookieStore;
 class TransportSecurityPersister;
@@ -172,7 +172,7 @@
   void ShutdownOnUIThread(
       std::unique_ptr<IOSChromeURLRequestContextGetterVector> context_getters);
 
-  net::ConfiguredProxyResolutionService* proxy_resolution_service() const {
+  net::ProxyResolutionService* proxy_resolution_service() const {
     return proxy_resolution_service_.get();
   }
 
@@ -240,7 +240,7 @@
 
   BooleanPrefMember enable_metrics_;
 
-  mutable std::unique_ptr<net::ConfiguredProxyResolutionService>
+  mutable std::unique_ptr<net::ProxyResolutionService>
       proxy_resolution_service_;
   mutable std::unique_ptr<net::TransportSecurityState>
       transport_security_state_;
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
index 8e753e2..3b0fc8cd 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
+++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
@@ -54,9 +54,9 @@
 #include "net/http/http_util.h"
 #include "net/http/transport_security_persister.h"
 #include "net/nqe/network_quality_estimator.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/pac_file_fetcher_impl.h"
 #include "net/proxy_resolution/proxy_config_service_fixed.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/url_request/report_sender.h"
 #include "net/url_request/url_request.h"
diff --git a/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm b/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
index 2814e11..4399729a 100644
--- a/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
+++ b/ios/chrome/browser/interstitials/ios_chrome_controller_client.mm
@@ -41,7 +41,9 @@
 }
 
 void IOSChromeControllerClient::GoBack() {
-  web_state_->GetNavigationManager()->GoBack();
+  if (CanGoBack()) {
+    web_state_->GetNavigationManager()->GoBack();
+  }
 }
 
 bool IOSChromeControllerClient::CanGoBack() {
diff --git a/ios/chrome/browser/ui/overlays/overlay_presentation_context_view_controller.h b/ios/chrome/browser/ui/overlays/overlay_presentation_context_view_controller.h
index 8a1b02e8..e6e2a73 100644
--- a/ios/chrome/browser/ui/overlays/overlay_presentation_context_view_controller.h
+++ b/ios/chrome/browser/ui/overlays/overlay_presentation_context_view_controller.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_OVERLAY_PRESENTATION_CONTEXT_VIEW_CONTROLLER_H_
 #define IOS_CHROME_BROWSER_UI_OVERLAYS_OVERLAY_PRESENTATION_CONTEXT_VIEW_CONTROLLER_H_
 
-#import <UIKIt/UIKit.h>
+#import <UIKit/UIKit.h>
 
 // View controller that manages the presentation context upon which overlay UI
 // is presented.
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb
index 97743f0..a7d1f16 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="af">
 <translation id="3378542047369517508">Kry toegang tot al die wagwoorde wat jy in Chrome stoor. In enige program. Enige tyd.</translation>
 <translation id="3660601625129812825">Vul Chrome-wagwoorde outomaties in</translation>
-<translation id="3674842644261144671">Jy het onlangs by jou Google-rekening afgemeld, wat jou gesinkroniseerde wagwoorde verwyder het. Meld by Chrome aan en skakel sinkronisering aan om hulle hier te sien.</translation>
 <translation id="5313485577007399362">Aktiveer outovul …</translation>
 <translation id="6494101196118320406">Geen Chrome-wagwoorde nie</translation>
-<translation id="7743962897580607860">Stoor sommige wagwoorde in Chrome om te begin. Meld by Chrome aan en skakel sinkronisering aan om jou wagwoord hier te sien as jy reeds wagwoorde in jou Google-rekening geberg het.</translation>
 <translation id="7870350829250847712">Geen Chrome-wagwoorde nie</translation>
 <translation id="9087836967653912639">Kanselleer</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb
index 9fc38cb..b2261d9 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="am">
 <translation id="3378542047369517508">በChrome ውስጥ ያስቀመጧቸው የሁሉም ይለፍ ቃላት መዳረሻ ያግኙ። በማንኛውም መተግበሪያ ውስጥ። በማንኛውም ጊዜ።</translation>
 <translation id="3660601625129812825">የChrome ይለፍ ቃላትን በራስ-ሙላ</translation>
-<translation id="3674842644261144671">በቅርቡ ከGoogle መለያዎ ወጥተዋል፣ ይህም የሰመሩ ይለፍ ቃላትዎን አስወግዶታል። እነሱን እዚህ ለማየት በመለያ ወደ Chrome ይግቡና ስምረትን ያብሩ።</translation>
 <translation id="5313485577007399362">ራስ-ሙላን ያንቁ...</translation>
 <translation id="6494101196118320406">የChrome ይለፍ ቃላት የሉም</translation>
-<translation id="7743962897580607860">ለመጀመር በChrome ውስጥ አንዳንድ የይለፍ ቃላትን ያስቀምጡ። በGoogle መለያዎ ላይ አስቀድመው የተመጡ የይለፍ ቃላት ካለዎት እነሱን እዚይ ለማየት ወደ Chrome ይግቡና ስምረትን ያብሩ።</translation>
 <translation id="7870350829250847712">የChrome ይለፍ ቃላት የሉም</translation>
 <translation id="9087836967653912639">ይቅር</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
index 22664fc4..f761a45e 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ar.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ar">
 <translation id="3378542047369517508">‏الحصول على إذن بالوصول إلى جميع كلمات المرور المحفوظة في Chrome في أي تطبيق، وفي أي وقت</translation>
 <translation id="3660601625129812825">‏الملء التلقائي لكلمات المرور في Chrome</translation>
-<translation id="3674842644261144671">‏تم تسجيل الخروج من حسابك على Google مؤخرًا، ما تسبب في إزالة كلمات المرور المتزامنة. يُرجى تسجيل الدخول إلى Chrome وتفعيل المزامنة لعرضها هنا.</translation>
 <translation id="5313485577007399362">تفعيل الملء التلقائي...</translation>
 <translation id="6494101196118320406">‏ما مِن كلمات مرور في Chrome</translation>
-<translation id="7743962897580607860">‏للبدء، عليك حفظ بعض كلمات المرور في Chrome. في حال سبق وأن خزّنت كلمات المرور في حسابك على Google، سجِّل الدخول إلى Chrome وفعِّل المزامنة لعرضها هنا.</translation>
 <translation id="7870350829250847712">‏ما مِن كلمات مرور في Chrome</translation>
 <translation id="9087836967653912639">إلغاء</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb
index 7ca7aa6..bdf2db7 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="as">
 <translation id="3378542047369517508">আপুনি Chromeত ছেভ কৰা সকলো পাছৱৰ্ডৰ এক্সেছ পাওক। যিকোনো এপতে। যিকোনো সময়তে।</translation>
 <translation id="3660601625129812825">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা Chromeৰ পাছৱৰ্ডসমূহ</translation>
-<translation id="3674842644261144671">আপুনি শেহতীয়াকৈ নিজৰ Google একাউণ্টৰ পৰা ছাইন আউট কৰিছে, যাৰ ফলত আপোনাৰ ছিংক কৰা পাছৱৰ্ডসমূহ আঁতৰাই পেলোৱা হৈছে। সেইবোৰ ইয়াত দেখা পাবলৈ Chromeত ছাইন ইন কৰক আৰু ছিংক অন কৰক।</translation>
 <translation id="5313485577007399362">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা সুবিধাটো সক্ষম কৰক...</translation>
 <translation id="6494101196118320406">কোনো Chrome পাছৱৰ্ড নাই</translation>
-<translation id="7743962897580607860">আৰম্ভ কৰিবলৈ Chromeত কিছুমান পাছৱৰ্ড ছেভ কৰক। যদি ইতিমধ্যে আপোনাৰ Google একাউণ্টত ছেভ কৰি থোৱা পাছৱৰ্ড আছে, সেইবোৰ ইয়াত দেখা পাবলৈ Chromeত ছাইন ইন কৰক আৰু ছিংক অন কৰক।</translation>
 <translation id="7870350829250847712">কোনো Chrome পাছৱৰ্ড নাই</translation>
 <translation id="9087836967653912639">বাতিল কৰক</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb
index 21934b9..db2e1bf 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="az">
 <translation id="3378542047369517508">Chrome'da saxladığınız bütün parollara giriş əldə edin. İstənilən tətbiqdə. İstənilən vaxt.</translation>
 <translation id="3660601625129812825">Chrome Parollarını Avtomatik Doldurun</translation>
-<translation id="3674842644261144671">Bu yaxınlarda Google hesabınızdan çıxmısınız və nəticədə sinxronlaşmış parollarınız silinib. Chrome'a daxil olun və sinxronlaşmanı aktiv edərək onları burada görün.</translation>
 <translation id="5313485577007399362">Avtomatik doldurmanı aktivləşdirin...</translation>
 <translation id="6494101196118320406">Chrome Parolu Yoxdur</translation>
-<translation id="7743962897580607860">Başlamaq üçün bəzi parolları Chrome'da yadda saxlayın. Hazırda Google hesabınızda saxlanmış parollarınız varsa, Chrome'a daxil olun və sinxronlaşmanı aktiv edərək onları burada görün.</translation>
 <translation id="7870350829250847712">Chrome Parolu Yoxdur</translation>
 <translation id="9087836967653912639">Ləğv edin</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb
index a24cb60..717f5070 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="be">
 <translation id="3378542047369517508">Доступ да ўсіх пароляў, захаваных у браўзеры Chrome, – у любой праграме, у любы час.</translation>
 <translation id="3660601625129812825">Уключыце функцыю аўтазапаўнення для пароляў Chrome</translation>
-<translation id="3674842644261144671">Вы нядаўна выйшлі са свайго Уліковага запісу Google, і таму вашы сінхранізаваныя паролі перасталі паказвацца. Каб зноў пабачыць іх тут, увайдзіце ў Chrome і ўключыце сінхранізацыю.</translation>
 <translation id="5313485577007399362">Уключыць Аўтазапаўненне...</translation>
 <translation id="6494101196118320406">Няма пароляў Chrome</translation>
-<translation id="7743962897580607860">Для пачатку захавайце некалькі пароляў у Chrome. Калі ў вашым Уліковым запісе Google ужо ёсць захаваныя паролі, то, каб убачыць іх тут, увайдзіце ў Chrome і ўключыце сінхранізацыю.</translation>
 <translation id="7870350829250847712">Няма пароляў Chrome</translation>
 <translation id="9087836967653912639">Скасаваць</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb
index bd538cc4..377bda3 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="bg">
 <translation id="3378542047369517508">Получете достъп до всички пароли, които запазвате в Chrome. Във всяко приложение и по всяко време.</translation>
 <translation id="3660601625129812825">Автоматично попълване на пароли в Chrome</translation>
-<translation id="3674842644261144671">Наскоро излязохте от профила си в Google, при което синхронизираните ви пароли бяха премахнати. За да ги видите тук, влезте в профила си в Chrome и включете синхронизирането.</translation>
 <translation id="5313485577007399362">Активиране на автоматичното попълване...</translation>
 <translation id="6494101196118320406">Няма пароли в Chrome</translation>
-<translation id="7743962897580607860">За да започнете, запазете пароли в Chrome. Ако в профила ви в Google вече има запазени пароли, влезте в профила си в Chrome и включете синхронизирането, за да ги видите тук.</translation>
 <translation id="7870350829250847712">Няма пароли в Chrome</translation>
 <translation id="9087836967653912639">Отказ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb
index 3f698a53..d2e1d21 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bn.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="bn">
 <translation id="3378542047369517508">Chrome-এ আপনার সেভ করা সব পাসওয়ার্ড অ্যাক্সেস করুন। যেকোনও অ্যাপে। যেকোনও সময়।</translation>
 <translation id="3660601625129812825">Chrome-এর অটোফিল পাসওয়ার্ড</translation>
-<translation id="3674842644261144671">আপনি সম্প্রতি নিজের Google অ্যাকাউন্ট থেকে সাইন-আউট করেছিলেন, যার ফলে আপনার সিঙ্ক করা পাসওয়ার্ডটি অ্যাকাউন্ট থেকে সরে গেছে। Chrome-এ সাইন-ইন করুন এবং সিঙ্ক চালু করে নিজের পাসওয়ার্ড এখানে পেয়ে যান।</translation>
 <translation id="5313485577007399362">অটোফিল চালু করুন...</translation>
 <translation id="6494101196118320406">Chrome-এ কোনও পাসওয়ার্ড নেই</translation>
-<translation id="7743962897580607860">শুরু করার জন্য Chrome-এ কিছু পাসওয়ার্ড সেভ করুন। যদি আপনার Google অ্যাকাউন্টে আগে থেকেই পাসওয়ার্ড সেভ করা থাকে, Chrome-এ সাইন-ইন করুন এবং সিঙ্ক চালু করে সেই পাসওয়ার্ডগুলি সেখানে দেখুন।</translation>
 <translation id="7870350829250847712">Chrome-এ কোনও পাসওয়ার্ড নেই</translation>
 <translation id="9087836967653912639">বাতিল করুন</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb
index e502bd6..7e971d2 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="bs">
 <translation id="3378542047369517508">Dobijte pristup svim lozinkama koje sačuvate u Chromeu. U bilo kojoj aplikaciji. Bilo kada.</translation>
 <translation id="3660601625129812825">Automatsko popunjavanje lozinki u Chromeu</translation>
-<translation id="3674842644261144671">Nedavno ste se odjavili sa svog Google računa, čime ste uklonili sinhronizirane lozinke. Prijavite se na Chrome i uključite sinhronizaciju da se lozinke prikažu ovdje.</translation>
 <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation>
 <translation id="6494101196118320406">Nema Chrome lozinki</translation>
-<translation id="7743962897580607860">Sačuvajte lozinke u Chromeu da započnete. Ako ste već pohranili lozinke na svom Google računu, prijavite se na Chrome i uključite sinhronizaciju da se lozinke prikažu ovdje.</translation>
 <translation id="7870350829250847712">Nema Chrome lozinki</translation>
 <translation id="9087836967653912639">Otkaži</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb
index 0ccc7b7..d2e19364d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ca">
 <translation id="3378542047369517508">Obtén accés a totes les contrasenyes que desis a Chrome. En qualsevol aplicació. En qualsevol moment.</translation>
 <translation id="3660601625129812825">Autocompleta les contrasenyes de Chrome</translation>
-<translation id="3674842644261144671">Fa poc has tancat la sessió del teu Compte de Google. Amb aquesta acció, s'han suprimit les contrasenyes sincronitzades. Inicia la sessió a Chrome i activa la sincronització perquè es mostrin aquí.</translation>
 <translation id="5313485577007399362">Activa Autocompletar...</translation>
 <translation id="6494101196118320406">No hi ha cap contrasenya de Chrome</translation>
-<translation id="7743962897580607860">Desa alguna contrasenya a Chrome per començar. Si ja tens contrasenyes desades al Compte de Google, inicia la sessió a Chrome i activa la sincronització perquè es mostrin aquí.</translation>
 <translation id="7870350829250847712">No hi ha cap contrasenya de Chrome</translation>
 <translation id="9087836967653912639">Cancel·la</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb
index 64af79a..091763e 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_cs.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="cs">
 <translation id="3378542047369517508">Získejte přístup ke všem heslům, která si uložíte do Chromu. V jakékoli aplikaci. Kdykoli.</translation>
 <translation id="3660601625129812825">Automatické vyplňování hesel Chromu</translation>
-<translation id="3674842644261144671">Nedávno jste se odhlásili z účtu Google a vaše synchronizovaná hesla přitom byla odstraněna. Chcete-li je zde zobrazit, přihlaste se do Chromu a zapněte synchronizaci.</translation>
 <translation id="5313485577007399362">Aktivovat Automatické vyplňování…</translation>
 <translation id="6494101196118320406">V Chromu nemáte žádná hesla</translation>
-<translation id="7743962897580607860">Chcete-li začít, uložte si v Chromu nějaká hesla. Pokud už máte hesla v účtu Google uložená, zobrazíte je zde tak, že se přihlásíte do Chromu a zapnete synchronizaci.</translation>
 <translation id="7870350829250847712">V Chromu nemáte žádná hesla</translation>
 <translation id="9087836967653912639">Zrušit</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb
index f28ea0e..8b07cee 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="da">
 <translation id="3378542047369517508">Få adgang til alle de adgangskoder, du har gemt i Chrome. I enhver app og til enhver tid.</translation>
 <translation id="3660601625129812825">Udfyld Chrome-adgangskoder automatisk</translation>
-<translation id="3674842644261144671">Du loggede for nylig ud af din Google-konto, hvilket har medført, at dine synkroniserede adgangskoder er blevet fjernet. Log ind i Chrome, og aktivér synkronisering for at se dem her.</translation>
 <translation id="5313485577007399362">Aktivér autofyld...</translation>
 <translation id="6494101196118320406">Ingen Chrome-adgangskoder</translation>
-<translation id="7743962897580607860">Gem nogle adgangskoder i Chrome for at komme i gang. Hvis du allerede har gemt adgangskoder på din Google-konto, kan du logge ind i Chrome og aktivere synkronisering for at se dem her.</translation>
 <translation id="7870350829250847712">Ingen Chrome-adgangskoder</translation>
 <translation id="9087836967653912639">Annuller</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb
index 89a0d540..0d5a3c5d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_de.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="de">
 <translation id="3378542047369517508">Sie erhalten Zugriff auf alle Passwörter, die Sie in Chrome speichern. In jeder App, jederzeit.</translation>
 <translation id="3660601625129812825">Chrome-Passwörter automatisch ausfüllen</translation>
-<translation id="3674842644261144671">Sie haben sich kürzlich von Ihrem Google-Konto abgemeldet, wodurch Ihre synchronisierten Passwörter entfernt wurden. Melden Sie sich in Chrome an und aktivieren Sie die Synchronisierung, damit sie wieder angezeigt werden.</translation>
 <translation id="5313485577007399362">"Autom. ausfüllen" aktivieren…</translation>
 <translation id="6494101196118320406">Keine Chrome-Passwörter</translation>
-<translation id="7743962897580607860">Sobald Sie Passwörter in Chrome gespeichert haben, werden sie hier angezeigt. Wenn in Ihrem Google-Konto bereits Passwörter gespeichert sind, melden Sie sich in Chrome an und aktivieren Sie die Synchronisierung, um sie zu sehen.</translation>
 <translation id="7870350829250847712">Keine Chrome-Passwörter</translation>
 <translation id="9087836967653912639">Abbrechen</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb
index 3ae344d..ca322e6 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="el">
 <translation id="3378542047369517508">Αποκτήστε πρόσβαση σε όλους τους κωδικούς πρόσβασης που αποθηκεύετε στο Chrome. Σε οποιαδήποτε εφαρμογή ανά πάσα στιγμή.</translation>
 <translation id="3660601625129812825">Κωδικοί πρόσβασης αυτόματης συμπλήρωσης Chrome</translation>
-<translation id="3674842644261144671">Κατά την πρόσφατη αποσύνδεσή σας από τον Λογαριασμό σας Google, καταργήθηκαν οι συγχρονισμένοι κωδικοί πρόσβασης. Συνδεθείτε στο Chrome και ενεργοποιήστε τον συγχρονισμό για να εμφανιστούν εδώ.</translation>
 <translation id="5313485577007399362">Ενεργοποίηση Αυτόματης συμπλήρωσης…</translation>
 <translation id="6494101196118320406">Δεν υπάρχουν κωδικοί πρόσβασης Chrome</translation>
-<translation id="7743962897580607860">Αποθηκεύστε ορισμένους κωδικούς πρόσβασης στο Chrome για να ξεκινήσετε. Εάν έχετε αποθηκεύσει ήδη κωδικούς πρόσβασης στον Λογαριασμό σας Google, συνδεθείτε στο Chrome και ενεργοποιήστε τον συγχρονισμό για να εμφανιστούν εδώ.</translation>
 <translation id="7870350829250847712">Δεν υπάρχουν κωδικοί πρόσβασης Chrome</translation>
 <translation id="9087836967653912639">Ακύρωση</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb
index a9e4317a..7419fd8 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="en-GB">
 <translation id="3378542047369517508">Get access to all of the passwords that you save in Chrome. In any app. At any time.</translation>
 <translation id="3660601625129812825">Auto-fill Chrome passwords</translation>
-<translation id="3674842644261144671">You recently signed out of your Google account, which removed your synced passwords. Sign in to Chrome and turn on sync to see them here.</translation>
 <translation id="5313485577007399362">Enable auto-fill…</translation>
 <translation id="6494101196118320406">No Chrome Passwords</translation>
-<translation id="7743962897580607860">Save some passwords in Chrome to get started. If you already have passwords stored in your Google account, sign in to Chrome and turn on sync to see them here.</translation>
 <translation id="7870350829250847712">No Chrome Passwords</translation>
 <translation id="9087836967653912639">Cancel</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb
index c7763c4..b083741 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="es-419">
 <translation id="3378542047369517508">Accede a todas las contraseñas que guardas en Chrome, desde cualquier app y en cualquier momento.</translation>
 <translation id="3660601625129812825">Autocompletar las contraseñas de Chrome</translation>
-<translation id="3674842644261144671">Se quitaron las contraseñas sincronizadas porque hace poco saliste de tu Cuenta de Google. Para verlas aquí, accede a tu cuenta en Chrome y activa la sincronización.</translation>
 <translation id="5313485577007399362">Habilitar Autocompletar…</translation>
 <translation id="6494101196118320406">No hay contraseñas en Chrome</translation>
-<translation id="7743962897580607860">Guarda algunas contraseñas en Chrome para comenzar. Si ya tienes contraseñas almacenadas en tu Cuenta de Google, accede en Chrome y activa la sincronización. Las verás aquí.</translation>
 <translation id="7870350829250847712">No hay contraseñas en Chrome</translation>
 <translation id="9087836967653912639">Cancelar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb
index eefb4af4..5b610f7 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="es">
 <translation id="3378542047369517508">Accede a todas las contraseñas que hayas guardado en Chrome. Desde cualquier aplicación y en cualquier momento.</translation>
 <translation id="3660601625129812825">Permite el autorelleno de contraseñas de Chrome</translation>
-<translation id="3674842644261144671">Has cerrado sesión recientemente en tu cuenta de Google y por ello se han quitado tus contraseñas sincronizadas. Inicia sesión en Chrome y activa la sincronización para verlas aquí.</translation>
 <translation id="5313485577007399362">Habilitar Autorrelleno...</translation>
 <translation id="6494101196118320406">No hay contraseñas de Chrome</translation>
-<translation id="7743962897580607860">Guarda alguna contraseña en Chrome para empezar. Si ya tienes contraseñas almacenadas en tu cuenta de Google, inicia sesión en Chrome y activa la sincronización para verlas aquí.</translation>
 <translation id="7870350829250847712">No hay contraseñas de Chrome</translation>
 <translation id="9087836967653912639">Cancelar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb
index 1f77068a..635c7bba 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="et">
 <translation id="3378542047369517508">Hankige juurdepääs kõigile paroolidele, mille Chrome'is salvestate. Igas rakenduses, igal ajal.</translation>
 <translation id="3660601625129812825">Chrome'i paroolide automaatne täitmine</translation>
-<translation id="3674842644261144671">Logisite hiljuti oma Google'i kontolt välja ja teie sünkroonitud paroolid eemaldati. Logige Chrome'i sisse ja lülitage sünkroonimine nende siin nägemiseks sisse.</translation>
 <translation id="5313485577007399362">Automaatse täitmise lubamine …</translation>
 <translation id="6494101196118320406">Chrome'i paroole pole</translation>
-<translation id="7743962897580607860">Alustamiseks salvestage mõned paroolid Chrome'i. Kui olete paroolid juba oma Google'i kontole salvestanud, logige Chrome'i sisse ja lülitage sünkroonimine nende siin nägemiseks sisse.</translation>
 <translation id="7870350829250847712">Chrome'i paroole pole</translation>
 <translation id="9087836967653912639">Tühista</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
index 4da9239..cc88717 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_eu.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="eu">
 <translation id="3378542047369517508">Atzitu Chrome-n gordeta dauzkazun pasahitz guztiak. Edozein aplikaziotatik, edonoiz.</translation>
 <translation id="3660601625129812825">Bete automatikoki Chrome-ko pasahitzak</translation>
-<translation id="3674842644261144671">Duela gutxi amaitu duzu Google-ko kontuko saioa, eta, ondorioz, sinkronizatutako pasahitzak kendu egin dira. Haiek ikusteko, hasi saioa Chrome-n eta aktibatu sinkronizazioa.</translation>
 <translation id="5313485577007399362">Gaitu betetze automatikoa...</translation>
 <translation id="6494101196118320406">Ez dago pasahitzik Chrome-n</translation>
-<translation id="7743962897580607860">Erabiltzen hasteko, gorde pasahitz batzuk Chrome-n. Google-ko kontuan gordeta badauzkazu pasahitzak dagoeneko, hasi saioa Chrome-n eta aktibatu sinkronizazioa haiek hemen ikusteko.</translation>
 <translation id="7870350829250847712">Ez dago pasahitzik Chrome-n</translation>
 <translation id="9087836967653912639">Utzi</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb
index 5a58231..60c6cfa 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="fa">
 <translation id="3378542047369517508">‏به همه گذرواژه‌هایی که در Chrome ذخیره می‌کنید دسترسی داشته باشید. در هر برنامه‌ای. هرزمانی.</translation>
 <translation id="3660601625129812825">‏تکمیل خودکار گذرواژه‌های Chrome</translation>
-<translation id="3674842644261144671">‏به‌تازگی از سیستم حساب Google خود خارج شده‌اید، که این کار باعث حذف شدن گذرواژه‌های همگام‌سازی‌شده‌تان شده است. به سیستم Chrome وارد شوید و همگام‌سازی را روشن کنید تا گذرواژه‌ها را اینجا ببینید.</translation>
 <translation id="5313485577007399362">فعال کردن «تکمیل خودکار»…</translation>
 <translation id="6494101196118320406">‏گذرواژه‌ای در Chrome نیست</translation>
-<translation id="7743962897580607860">‏برای شروع، چند گذرواژه در Chrome ذخیره کنید. اگر قبلاً در حساب Google خودْ گذرواژه ذخیره کرده‌اید، به سیستم Chrome وارد شوید و همگام‌سازی را روشن کنید تا گذرواژه‌ها را اینجا ببینید.</translation>
 <translation id="7870350829250847712">‏گذرواژه‌ای در Chrome نیست</translation>
 <translation id="9087836967653912639">لغو</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb
index 58fdf33..c902b03 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fi.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="fi">
 <translation id="3378542047369517508">Saat kaikki Chromessa tallentamasi salasanat käyttöön. Kaikissa sovelluksissa. Milloin tahansa.</translation>
 <translation id="3660601625129812825">Chromen automaattisen täytön salasanat</translation>
-<translation id="3674842644261144671">Kirjauduit äskettäin ulos Google-tililtäsi. Tämä poisti synkronoidut salasanasi. Kirjaudu sisään Chromeen ja ota synkronointi käyttöön nähdäksesi ne täällä.</translation>
 <translation id="5313485577007399362">Ota automaattinen täyttö käyttöön…</translation>
 <translation id="6494101196118320406">Ei Chrome-salasanoja</translation>
-<translation id="7743962897580607860">Aloita tallentamalla salasanoja Chromeen. Jos olet tallentanut salasanoja Google-tilillesi, kirjaudu sisään Chromeen ja ota synkronointi käyttöön nähdäksesi ne täällä.</translation>
 <translation id="7870350829250847712">Ei Chrome-salasanoja</translation>
 <translation id="9087836967653912639">Peruuta</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb
index c794ba6..e1bb4f6 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="fil">
 <translation id="3378542047369517508">Magkaroon ng access sa lahat ng password na sine-save mo sa Chrome. Sa anumang app. Anumang oras.</translation>
 <translation id="3660601625129812825">I-autoFill ang Mga Password sa Chrome</translation>
-<translation id="3674842644261144671">Nag-sign out ka kamakailan sa iyong Google account, na dahilan kaya naalis ang mga naka-sync mong password. Mag-sign in sa Chrome at i-on ang pag-sync para makita ang mga ito rito.</translation>
 <translation id="5313485577007399362">I-enable ang AutoFill...</translation>
 <translation id="6494101196118320406">Walang Password sa Chrome</translation>
-<translation id="7743962897580607860">Mag-save ng ilang password sa Chrome para magsimula. Kung mayroon ka nang mga password na naka-store sa iyong Google account, mag-sign in sa Chrome at i-on ang pag-sync para makita ang mga ito rito.</translation>
 <translation id="7870350829250847712">Walang Password sa Chrome</translation>
 <translation id="9087836967653912639">Kanselahin</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb
index 5025e43..6104623 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr-CA.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="fr-CA">
 <translation id="3378542047369517508">Obtenez l'accès à tous les mots de passe que vous enregistrez dans Chrome. Dans toutes les applications. En tout temps.</translation>
 <translation id="3660601625129812825">Remplir automatiquement les mots de passe de Chrome</translation>
-<translation id="3674842644261144671">Vous vous êtes récemment déconnecté de votre compte Google, ce qui a entraîné la suppression de vos mots de passe synchronisés. Connectez-vous à Chrome et activez la synchronisation pour les afficher ici.</translation>
 <translation id="5313485577007399362">Activer le remplissage automatique</translation>
 <translation id="6494101196118320406">Aucun mot de passe Chrome</translation>
-<translation id="7743962897580607860">Enregistrez quelques mots de passe dans Chrome pour commencer. Si vous avez déjà stocké des mots de passe dans votre compte Google, connectez-vous à Chrome et activez la synchronisation pour les afficher ici.</translation>
 <translation id="7870350829250847712">Aucun mot de passe Chrome</translation>
 <translation id="9087836967653912639">Annuler</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb
index d555890..0802f0ef 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="fr">
 <translation id="3378542047369517508">Accédez à tous les mots de passe que vous enregistrez dans Chrome, à tout moment et quelle que soit l'application.</translation>
 <translation id="3660601625129812825">Remplir automatiquement les mots de passe Chrome</translation>
-<translation id="3674842644261144671">Vous vous êtes récemment déconnecté de votre compte Google, ce qui a entraîné la suppression de vos mots de passe synchronisés. Connectez-vous à Chrome et activez la synchronisation pour les afficher ici.</translation>
 <translation id="5313485577007399362">Activer la saisie automatique…</translation>
 <translation id="6494101196118320406">Aucun mot de passe Chrome</translation>
-<translation id="7743962897580607860">Pour commencer, enregistrez des mots de passe dans Chrome. Si vous avez déjà stocké des mots de passe dans votre compte Google, connectez-vous à Chrome et activez la synchronisation pour les afficher ici.</translation>
 <translation id="7870350829250847712">Aucun mot de passe Chrome</translation>
 <translation id="9087836967653912639">Annuler</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
index 1e86469..771b6b30 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gl.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="gl">
 <translation id="3378542047369517508">Accede desde calquera aplicación e en calquera momento a todos os contrasinais gardados en Chrome.</translation>
 <translation id="3660601625129812825">Autocompletar os contrasinais de Chrome</translation>
-<translation id="3674842644261144671">Pechaches sesión recentemente na túa conta de Google, polo que se quitaron os contrasinais sincronizados. Inicia sesión en Chrome e activa a sincronización para velos aquí.</translation>
 <translation id="5313485577007399362">Activar autocompletar…</translation>
 <translation id="6494101196118320406">Non hai ningún contrasinal de Chrome</translation>
-<translation id="7743962897580607860">Para comezar, garda algúns contrasinais en Chrome. Se xa tes contrasinais almacenados na túa conta de Google, inicia sesión en Chrome e activa a sincronización para velos aquí.</translation>
 <translation id="7870350829250847712">Non hai ningún contrasinal de Chrome</translation>
 <translation id="9087836967653912639">Cancelar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb
index ae4ff48a3..e1e4695 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="gu">
 <translation id="3378542047369517508">તમે Chromeમાં સાચવો તે બધા પાસવર્ડનો ઍક્સેસ મેળવો. કોઈપણ ઍપમાં. કોઈપણ સમયે.</translation>
 <translation id="3660601625129812825">Chromeના પાસવર્ડ ઑટોમૅટિક રીતે ભરાય</translation>
-<translation id="3674842644261144671">તમે તાજેતરમાં તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થયા હતા, જેને કારણે તમારા સિંક કરેલા પાસવર્ડ નીકળી ગયા છે. Chromeમાં સાઇન ઇન કરો અને તેને અહીં જોવા માટે સિંકની સુવિધા ચાલુ કરો.</translation>
 <translation id="5313485577007399362">ઑટોમૅટિક રીતે ભરાવાનું ચાલુ કરો…</translation>
 <translation id="6494101196118320406">Chromeમાં કોઈ પાસવર્ડ નથી</translation>
-<translation id="7743962897580607860">શરૂ કરવા માટે, Chromeમાં થોડા પાસવર્ડ સાચવો. જો તમે પહેલેથી તમારા Google એકાઉન્ટમાં પાસવર્ડ સ્ટોર કર્યા હોય, તો Chromeમાં સાઇન ઇન કરો અને તેને અહીં જોવા માટે સિંકની સુવિધા ચાલુ કરો.</translation>
 <translation id="7870350829250847712">Chromeમાં કોઈ પાસવર્ડ નથી</translation>
 <translation id="9087836967653912639">રદ કરો</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb
index 0af125c..73abac3 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="hi">
 <translation id="3378542047369517508">Chrome में सेव किए गए अपने सभी पासवर्ड का ऐक्सेस पाएं. किसी भी ऐप्लिकेशन में. किसी भी समय.</translation>
 <translation id="3660601625129812825">Chrome पासवर्ड ऑटोमैटिक तरीके से भरें</translation>
-<translation id="3674842644261144671">आपने अभी-अभी Google खाते से साइन आउट किया है. इससे आपके सिंक किए गए पासवर्ड हट गए हैं. अपने सिंक किए गए पासवर्ड देखने के लिए, Chrome में साइन इन करके सिंक चालू करें.</translation>
 <translation id="5313485577007399362">ऑटोमैटिक भरने की सुविधा चालू करें...</translation>
 <translation id="6494101196118320406">कोई भी Chrome पासवर्ड नहीं है</translation>
-<translation id="7743962897580607860">शुरू करने के लिए, Chrome में कुछ पासवर्ड सेव करें. अगर आपने पहले से ही अपने Google खाते में पासवर्ड सेव कर रखें हैं, तो उन्हें देखने के लिए, Chrome में साइन इन करके सिंक चालू करें.</translation>
 <translation id="7870350829250847712">कोई भी Chrome पासवर्ड नहीं है</translation>
 <translation id="9087836967653912639">रद्द करें</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb
index ee0dc09..0e7d4d02c 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="hr">
 <translation id="3378542047369517508">Pristupajte svim zaporkama koje spremate u Chromeu. U bilo kojoj aplikaciji. U bilo kojem trenutku.</translation>
 <translation id="3660601625129812825">Automatsko popunjavanje zaporki u Chromeu</translation>
-<translation id="3674842644261144671">Nedavno ste se odjavili sa svojeg Google računa, čime su uklonjene vaše sinkronizirane zaporke. Prijavite se u Chrome i uključite sinkronizaciju kako biste ih tamo vidjeli.</translation>
 <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation>
 <translation id="6494101196118320406">Nema zaporki za Chrome</translation>
-<translation id="7743962897580607860">Spremite neke zaporke u Chromeu kako biste počeli. Ako na svojem Google računu već imate spremljene zaporke, prijavite se u Chrome i uključite sinkronizaciju kako biste ih vidjeli tamo.</translation>
 <translation id="7870350829250847712">Nema zaporki za Chrome</translation>
 <translation id="9087836967653912639">Otkaži</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb
index 4431504f..19c9e54 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="hu">
 <translation id="3378542047369517508">Hozzáférhet a Chrome böngészőben mentett összes jelszavához. Bármelyik alkalmazásban, bármikor.</translation>
 <translation id="3660601625129812825">Chrome-jelszavak automatikus kitöltése</translation>
-<translation id="3674842644261144671">Nemrég kijelentkezett Google-fiókjából, amivel eltávolította a szinkronizált jelszavait. Ha szeretné látni itt a jelszavakat, jelentkezzen be a Chrome-ba, és kapcsolja be a szinkronizálást.</translation>
 <translation id="5313485577007399362">Automatikus kitöltés engedélyezése…</translation>
 <translation id="6494101196118320406">Nincsenek Chrome-jelszavak</translation>
-<translation id="7743962897580607860">A kezdéshez mentsen el néhány jelszót a Chrome-ban. Ha Google-fiókjában már vannak mentett jelszavak, jelentkezzen be a Chrome-ba, és kapcsolja be a szinkronizálást, hogy a jelszavak láthatók legyenek itt.</translation>
 <translation id="7870350829250847712">Nincsenek Chrome-jelszavak</translation>
 <translation id="9087836967653912639">Mégse</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
index f6710b3..34065e4f2 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="hy">
 <translation id="3378542047369517508">Դուք կկարողանաք օգտագործել Chrome-ում պահված բոլոր գաղտնաբառերը՝ ցանկացած ժամանակ, ցանկացած հավելվածում։</translation>
 <translation id="3660601625129812825">Chrome-ի գաղտնաբառերի ինքնալրացում</translation>
-<translation id="3674842644261144671">Դուք վերջերս դուրս եք եկել ձեր Google հաշվից, ինչի արդյունքում ձեր համաժամացված գաղտնաբառերը հեռացվել են։ Մուտք գործեք Chrome և միացրեք համաժամացումը՝ դրանք այստեղ տեսնելու համար։</translation>
 <translation id="5313485577007399362">Միացնել ինքնալրացնումը</translation>
 <translation id="6494101196118320406">Chrome-ի գաղտնաբառեր չկան</translation>
-<translation id="7743962897580607860">Սկսելու համար Chrome-ում մի քանի գաղտնաբառ պահեք։ Եթե ձեր Google հաշվում արդեն պահած գաղտնաբառեր ունեք, մուտք գործեք Chrome և միացրեք համաժամացումը՝ դրանք այստեղ տեսնելու համար։</translation>
 <translation id="7870350829250847712">Chrome-ի գաղտնաբառեր չկան</translation>
 <translation id="9087836967653912639">Չեղարկել</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb
index 6c32b27..da6d94b1 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="id">
 <translation id="3378542047369517508">Dapatkan akses ke semua sandi yang Anda simpan di Chrome. Di aplikasi apa saja. Kapan saja.</translation>
 <translation id="3660601625129812825">Isi Otomatis Sandi Chrome</translation>
-<translation id="3674842644261144671">Anda baru saja logout dari Akun Google, yang mengakibatkan sandi yang disinkronkan terhapus. Login ke Chrome dan aktifkan sinkronisasi untuk melihatnya di sini.</translation>
 <translation id="5313485577007399362">Aktifkan Isi Otomatis...</translation>
 <translation id="6494101196118320406">Tidak Ada Sandi Chrome</translation>
-<translation id="7743962897580607860">Simpan sandi di Chrome untuk memulai. Jika Anda telah menyimpan sandi di Akun Google, login ke Chrome dan aktifkan sinkronisasi untuk melihatnya di sini.</translation>
 <translation id="7870350829250847712">Tidak Ada Sandi Chrome</translation>
 <translation id="9087836967653912639">Batal</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb
index f2ce586..f1d92f2 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="is">
 <translation id="3378542047369517508">Fáðu aðgang að öllum aðgangsorðum sem þú vistar í Chrome. Í hvaða forriti sem er. Hvenær sem er.</translation>
 <translation id="3660601625129812825">Sjálfvirk útfylling aðgangsorða í Chrome</translation>
-<translation id="3674842644261144671">Þú skráðir þig nýlega út af Google reikningnum þínum og þá voru samstillt aðgangsorð fjarlægð. Skráðu þig inn í Chrome og kveiktu á samstillingu til að sjá þau hér.</translation>
 <translation id="5313485577007399362">Kveikja á sjálfvirkri útfyllingu...</translation>
 <translation id="6494101196118320406">Engin aðgangsorð í Chrome</translation>
-<translation id="7743962897580607860">Vistaðu aðgangsorð í Chrome til að hefjast handa. Ef aðgangsorð eru nú þegar vistuð á Google reikningnum þínum skaltu skrá þig inn í Chrome og kveikja á samstillingu til að sjá þau hér.</translation>
 <translation id="7870350829250847712">Engin aðgangsorð í Chrome</translation>
 <translation id="9087836967653912639">Hætta</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb
index a93a0a9..8fac4dba 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="it">
 <translation id="3378542047369517508">Accedi a tutte le password che salvi in Chrome, in qualsiasi app e in qualsiasi momento.</translation>
 <translation id="3660601625129812825">Usa Riempimento automatico per password di Chrome</translation>
-<translation id="3674842644261144671">Di recente hai scollegato il tuo Account Google, pertanto sono state rimosse le tue password sincronizzate. Accedi a Chrome e attiva la sincronizzazione per vederle nel browser.</translation>
 <translation id="5313485577007399362">Attiva Riempimento automatico…</translation>
 <translation id="6494101196118320406">Nessuna password di Chrome</translation>
-<translation id="7743962897580607860">Per iniziare salva alcune password in Chrome. Se hai già memorizzato delle password nel tuo Account Google, accedi a Chrome e attiva la sincronizzazione per vederle nel browser.</translation>
 <translation id="7870350829250847712">Nessuna password di Chrome</translation>
 <translation id="9087836967653912639">Annulla</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb
index 41aa4ad..71320ae5 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="iw">
 <translation id="3378542047369517508">‏גישה לכל הסיסמאות ששמרת ב-Chrome. בכל האפליקציות, ללא הגבלה.</translation>
 <translation id="3660601625129812825">‏מילוי אוטומטי של סיסמאות ב-Chrome</translation>
-<translation id="3674842644261144671">‏לאחרונה יצאת מחשבון Google. פעולה זו הסירה את הסיסמאות המסונכרנות שלך. כדי להציג את הסיסמאות כאן, עליך להיכנס אל Chrome ולהפעיל את הסנכרון.</translation>
 <translation id="5313485577007399362">הפעלת המילוי האוטומטי…</translation>
 <translation id="6494101196118320406">‏אין סיסמאות של Chrome</translation>
-<translation id="7743962897580607860">‏כדי להתחיל, צריך לשמור מספר סיסמאות ב-Chrome. אם כבר אחסנת סיסמאות בחשבון Google שלך, עליך להיכנס אל Chrome ולהפעיל את הסנכרון כדי להציג אותן כאן.</translation>
 <translation id="7870350829250847712">‏אין סיסמאות של Chrome</translation>
 <translation id="9087836967653912639">ביטול</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb
index 91d9972..f50cc8d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ja">
 <translation id="3378542047369517508">Chrome で保存したすべてのパスワードにはいつでもどのアプリからでもアクセスできます。</translation>
 <translation id="3660601625129812825">Chrome のパスワード自動入力</translation>
-<translation id="3674842644261144671">最近 Google アカウントからログアウトしたため、同期していたパスワードが削除されました。Chrome にログインして同期をオンにすると、ここにパスワードが表示されます。</translation>
 <translation id="5313485577007399362">自動入力を有効にする...</translation>
 <translation id="6494101196118320406">Chrome パスワードはありません</translation>
-<translation id="7743962897580607860">開始するには Chrome でパスワードを保存してください。Google アカウントにパスワードをすでに保存している場合は、Chrome にログインして同期をオンにすると、パスワードがここに表示されます。</translation>
 <translation id="7870350829250847712">Chrome パスワードはありません</translation>
 <translation id="9087836967653912639">キャンセル</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
index 7ecd38f..58f17ff 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ka">
 <translation id="3378542047369517508">იქონიეთ წვდომა თქვენ მიერ Chrome-ში შენახულ ყველა პაროლზე. ნებისმიერი აპიდან, ნებისმიერ დროს.</translation>
 <translation id="3660601625129812825">Chrome-ის პაროლების ავტომატური შევსება</translation>
-<translation id="3674842644261144671">ახლახან თქვენი Google ანგარიშიდან გამოხვედით, რამაც სინქრონიზებული პაროლების ამოშლა გამოიწვია. მათ აქ სანახავად შედით Chrome-ში და ჩართეთ სინქრონიზაცია.</translation>
 <translation id="5313485577007399362">ავტომატური შევსების ჩართვა...</translation>
 <translation id="6494101196118320406">Chrome-ის პაროლები არ არის</translation>
-<translation id="7743962897580607860">დასაწყისისთვის შეინახეთ პაროლები Chrome-ში. თუ Google ანგარიშში პაროლები უკვე შენახული გაქვთ, მათ აქ სანახავად შედით Chrome-ში და ჩართეთ სინქრონიზაცია.</translation>
 <translation id="7870350829250847712">Chrome-ის პაროლები არ არის</translation>
 <translation id="9087836967653912639">გაუქმება</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb
index 95759504..a02d2e4 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="kk">
 <translation id="3378542047369517508">Chrome браузерінде сақталған барлық құпия сөзді пайдаланыңыз. Оларды кез келген қолданбада және уақытта пайдалана аласыз.</translation>
 <translation id="3660601625129812825">Chrome құпия сөздерін автотолтыру</translation>
-<translation id="3674842644261144671">Google есептік жазбасынан жақында шығып кеткендіктен, синхрондалған құпия сөздеріңіз өшірілді. Оларды осында көру үшін Chrome есептік жазбасына кіріп, синхрондауды іске қосыңыз.</translation>
 <translation id="5313485577007399362">Автотолтыруды қосу...</translation>
 <translation id="6494101196118320406">Chrome құпия сөздері жоқ</translation>
-<translation id="7743962897580607860">Бастау үшін Chrome браузерінде кейбір құпия сөздерді сақтаңыз. Google есептік жазбаңызда сақталған құпия сөздер болса, оларды көру үшін Chrome браузеріне кіріп, синхрондауды іске қосыңыз.</translation>
 <translation id="7870350829250847712">Chrome құпия сөздері жоқ</translation>
 <translation id="9087836967653912639">Бас тарту</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb
index 5c7baa4c..0ba553fe 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="km">
 <translation id="3378542047369517508">មានសិទ្ធិ​ចូលប្រើ​ពាក្យសម្ងាត់​ទាំងអស់ ដែលអ្នក​រក្សាទុក​នៅក្នុង Chrome។ គ្រប់​កម្មវិធី និង​គ្រប់ពេលវេលា។</translation>
 <translation id="3660601625129812825">បំពេញ​ពាក្យសម្ងាត់ Chrome ដោយ​ស្វ័យប្រវត្តិ</translation>
-<translation id="3674842644261144671">កាលពីពេលថ្មីៗនេះ អ្នកបានចេញពីគណនី Google របស់អ្នក​ ដែលបានលុបពាក្យសម្ងាត់ដែលអ្នកបានធ្វើសមកាលកម្ម។ សូមចូល Chrome រួចបើកសមកាលកម្ម ដើម្បីមើលពាក្យសម្ងាត់ទាំងនោះនៅទីនេះ។</translation>
 <translation id="5313485577007399362">បើក​ការបំពេញ​ស្វ័យប្រវត្តិ...</translation>
 <translation id="6494101196118320406">គ្មានពាក្យសម្ងាត់ Chrome ទេ</translation>
-<translation id="7743962897580607860">រក្សាទុកពាក្យសម្ងាត់មួយចំនួននៅក្នុង Chrome ដើម្បីចាប់ផ្ដើម។ ប្រសិនបើអ្នកបានរក្សាទុកពាក្យសម្ងាត់នៅក្នុងគណនី Google របស់អ្នករួចហើយ សូមចូល Chrome រួចបើកសមកាលកម្ម ដើម្បីមើលពាក្យសម្ងាត់ទាំងនោះនៅទីនេះ។</translation>
 <translation id="7870350829250847712">គ្មានពាក្យសម្ងាត់ Chrome ទេ</translation>
 <translation id="9087836967653912639">បោះបង់</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb
index 045d5a6..e94c662 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="kn">
 <translation id="3378542047369517508">Chrome ನಲ್ಲಿ ನೀವು ಉಳಿಸುವ ಎಲ್ಲಾ ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ. ಯಾವುದೇ ಆ್ಯಪ್‌ನಲ್ಲಿ, ಯಾವಾಗ ಬೇಕಾದರೂ.</translation>
 <translation id="3660601625129812825">ಸ್ವಯಂ ಭರ್ತಿ Chrome ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
-<translation id="3674842644261144671">ನಿಮ್ಮ ಸಿಂಕ್ ಮಾಡಿದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಕಾರಣವಾದ ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ನೀವು ಇತ್ತೀಚೆಗೆ ಸೈನ್ ಔಟ್ ಆಗಿದ್ದೀರಿ. Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ ಮತ್ತು ಆ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಇಲ್ಲಿ ನೋಡಲು ಸಿಂಕ್ ಆನ್ ಮಾಡಿ.</translation>
 <translation id="5313485577007399362">ಸ್ವಯಂ ಭರ್ತಿ ಸಕ್ರಿಯಗೊಳಿಸಿ...</translation>
 <translation id="6494101196118320406">ಯಾವುದೇ Chrome ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಲ್ಲ</translation>
-<translation id="7743962897580607860">ಪ್ರಾರಂಭಿಸಲು, Chrome ನಲ್ಲಿ ಕೆಲವು ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಉಳಿಸಿ. ನೀವು ಈಗಾಗಲೇ ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಿದ್ದರೆ, ಅವುಗಳನ್ನು ಇಲ್ಲಿ ನೋಡಲು Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ ಹಾಗೂ ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ.</translation>
 <translation id="7870350829250847712">ಯಾವುದೇ Chrome ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಲ್ಲ</translation>
 <translation id="9087836967653912639">ರದ್ದುಗೊಳಿಸಿ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb
index ffd64f2..dafb408 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ko">
 <translation id="3378542047369517508">Chrome에 저장한 모든 비밀번호에 언제든지, 어떤 앱에서든 액세스할 수 있습니다.</translation>
 <translation id="3660601625129812825">Chrome 비밀번호 자동 완성</translation>
-<translation id="3674842644261144671">최근 Google 계정에서 로그아웃했기 때문에 동기화된 비밀번호가 삭제되었습니다. Chrome에 로그인한 다음 동기화를 사용 설정하면 여기에 비밀번호가 표시됩니다.</translation>
 <translation id="5313485577007399362">자동 완성 사용...</translation>
 <translation id="6494101196118320406">Chrome 비밀번호 없음</translation>
-<translation id="7743962897580607860">Chrome에 비밀번호를 저장하여 시작해 보세요. 이미 Google 계정에 저장된 비밀번호가 있다면 Chrome에 로그인하고 동기화를 사용 설정하면 여기에 표시됩니다.</translation>
 <translation id="7870350829250847712">Chrome 비밀번호 없음</translation>
 <translation id="9087836967653912639">취소</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb
index 57398dd6..5956477 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ky">
 <translation id="3378542047369517508">Chrome'до сакталган бардык сырсөздөрдү колдонуу мүмкүнчүлүгүн алыңыз. Бардык колдонмолордо. Ар дайым.</translation>
 <translation id="3660601625129812825">Chrome сырсөздөрүн автоматтык түрдө толтуруңүз</translation>
-<translation id="3674842644261144671">Жакында Google аккаунтуңуздан чыгып кеткениңизден улам, шайкештирилген сырсөздөрүңүз өчүрүлдү. Chrome'го кирип, аларды бул жерде көрүү үчүн шайкештирүүнү күйгүзүңүз.</translation>
 <translation id="5313485577007399362">Автоматтык түрдө толтурууну иштетүү...</translation>
 <translation id="6494101196118320406">Chrome сырсөздөрү жок</translation>
-<translation id="7743962897580607860">Баштоо үчүн айрым сырсөздөрдү Chrome'до сактаңыз. Эгер Google аккаунтуңузга сакталган сырсөздөрүңүз болсо, Chrome'го кирип, аларды бул жерде көрүү үчүн шайкештирүүнү күйгүзүңүз.</translation>
 <translation id="7870350829250847712">Chrome сырсөздөрү жок</translation>
 <translation id="9087836967653912639">Жокко чыгаруу</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb
index 671f690..7064d62 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="lo">
 <translation id="3378542047369517508">ຮັບສິດເຂົ້າເຖິງລະຫັດຜ່ານທັງໝົດທີ່ທ່ານບັນທຶກໄວ້ໃນ Chrome. ໃນແອັບໃດໆກໍໄດ້. ໃນທຸກເວລາ.</translation>
 <translation id="3660601625129812825">ລະຫັດຜ່ານການຕື່ມຂໍ້ມູນອັດຕະໂນມັດໃນ Chrome</translation>
-<translation id="3674842644261144671">ທ່ານໄດ້ອອກຈາກລະບົບບັນຊີ Google ຂອງທ່ານເມື່ອບໍ່ດົນນີ້, ເຊິ່ງໄດ້ລຶບລະຫັດຜ່ານທີ່ຊິ້ງຂໍ້ມູນຂອງທ່ານອອກແລ້ວ. ເຂົ້າສູ່ລະບົບ Chrome ແລະ ເປີດການຊິ້ງຂໍ້ມູນເພື່ອເຫັນພວກມັນຢູ່ບ່ອນນີ້.</translation>
 <translation id="5313485577007399362">ເປີດການນຳໃຊ້ການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ...</translation>
 <translation id="6494101196118320406">ບໍ່ມີລະຫັດຜ່ານ Chrome</translation>
-<translation id="7743962897580607860">ບັນທຶກບາງລະຫັດຜ່ານໄວ້ໃນ Chrome ເພື່ອເລີ່ມຕົ້ນ. ຖ້າທ່ານມີລະຫັດຜ່ານທີ່ເກັບໄວ້ໃນບັນຊີ Google ຂອງທ່ານ, ກະລຸນາເຂົ້າສູ່ລະບົບ Chrome ແລ້ວເປີດການຊິ້ງຂໍ້ມູນເພື່ອເຫັນພວກມັນຢູ່ບ່ອນນີ້.</translation>
 <translation id="7870350829250847712">ບໍ່ມີລະຫັດຜ່ານ Chrome</translation>
 <translation id="9087836967653912639">ຍົກເລີກ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb
index 07af744..e80fdd0 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="lt">
 <translation id="3378542047369517508">Gaukite prieigą prie visų naršyklėje „Chrome“ išsaugotų slaptažodžių. Bet kurioje programoje. Bet kuriuo metu.</translation>
 <translation id="3660601625129812825">Automatinis „Chrome“ slaptažodžių pildymas</translation>
-<translation id="3674842644261144671">Neseniai atsijungėte nuo „Google“ paskyros, iš kurios pašalinti jūsų sinchronizuoti slaptažodžiai. Prisijunkite prie „Chrome“ ir įjunkite sinchronizavimą, kad galėtumėte juos peržiūrėti čia.</translation>
 <translation id="5313485577007399362">Įgalinti automatinį pildymą...</translation>
 <translation id="6494101196118320406">„Chrome“ slaptažodžių nėra</translation>
-<translation id="7743962897580607860">Išsaugokite kai kuriuos slaptažodžius naršyklėje „Chrome“, kad galėtumėte pradėti. Jei „Google“ paskyroje jau turite išsaugotų slaptažodžių, prisijunkite prie „Chrome“ ir įjunkite sinchronizavimą, kad galėtumėte juos peržiūrėti.</translation>
 <translation id="7870350829250847712">„Chrome“ slaptažodžių nėra</translation>
 <translation id="9087836967653912639">Atšaukti</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
index f3476bf1..b101dea 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lv.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="lv">
 <translation id="3378542047369517508">Varēsiet jebkurā laikā piekļūt visām savām pārlūkā Chrome saglabātajām parolēm jebkurā lietotnē.</translation>
 <translation id="3660601625129812825">Chrome paroļu automātiskā aizpilde</translation>
-<translation id="3674842644261144671">Nesen jūs izrakstījāties no sava Google konta un tādējādi noņēmāt sinhronizētās paroles. Pierakstieties pārlūkprogrammā Chrome un ieslēdziet sinhronizāciju, lai skatītu paroles šeit.</translation>
 <translation id="5313485577007399362">Iespējot automātisko aizpildi...</translation>
 <translation id="6494101196118320406">Nav Chrome paroļu</translation>
-<translation id="7743962897580607860">Lai sāktu darbu, saglabājiet dažas paroles pārlūkprogrammā Chrome. Ja esat jau saglabājis paroles savā Google kontā, pierakstieties pārlūkprogrammā Chrome un ieslēdziet sinhronizāciju, lai skatītu paroles šeit.</translation>
 <translation id="7870350829250847712">Nav Chrome paroļu</translation>
 <translation id="9087836967653912639">Atcelt</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb
index f75be94..ed8463a 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="mk">
 <translation id="3378542047369517508">Добијте пристап до сите лозинки што ги зачувувате во Chrome. Во секоја апликација. Во секое време.</translation>
 <translation id="3660601625129812825">Автоматско пополнување лозинки на Chrome</translation>
-<translation id="3674842644261144671">Неодамна се одјавивте од вашата сметка на Google, а тоа ги отстрани вашите синхронизирани лозинки. Најавете се на Chrome и вклучете синхронизација за да ги видите тука.</translation>
 <translation id="5313485577007399362">Овозможи автоматско пополнување…</translation>
 <translation id="6494101196118320406">Нема лозинки за Chrome</translation>
-<translation id="7743962897580607860">Зачувајте некои лозинки во Chrome за да започнете. Ако веќе имате лозинки складирани во сметката на Google, најавете се на Chrome и вклучете синхронизација за да ги видите тука.</translation>
 <translation id="7870350829250847712">Нема лозинки за Chrome</translation>
 <translation id="9087836967653912639">Откажи</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb
index 1d2dcca1..c6f0d83 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ml">
 <translation id="3378542047369517508">നിങ്ങൾ Chrome-ൽ സംരക്ഷിക്കുന്ന എല്ലാ പാസ്‌വേഡുകളിലേക്കും ആക്‌സസ് നേടുക. ഏത് ആപ്പിലും. ഏതുസമയത്തും.</translation>
 <translation id="3660601625129812825">Chrome പാസ്‌വേഡുകൾ സ്വയമേവ പൂരിപ്പിക്കൽ</translation>
-<translation id="3674842644261144671">സമന്വയിപ്പിച്ച പാസ്‌വേഡുകൾ നീക്കം ചെയ്‌ത Google അക്കൗണ്ടിൽ നിന്ന് നിങ്ങൾ അടുത്തിടെ സൈൻ ഔട്ട് ചെയ്‌തു. Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്‌ത് അവ ഇവിടെ കാണാൻ സമന്വയിപ്പിക്കൽ ഓണാക്കുക.</translation>
 <translation id="5313485577007399362">സ്വയമേവ പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക...</translation>
 <translation id="6494101196118320406">Chrome പാസ്‌വേഡുകളൊന്നുമില്ല</translation>
-<translation id="7743962897580607860">ആരംഭിക്കുന്നതിന് Chrome-ൽ ചില പാസ്‌വേഡുകൾ സംരക്ഷിക്കുക. നിങ്ങളുടെ Google അക്കൗണ്ടിൽ നിലവിൽ പാസ്‌വേഡുകൾ‌ സംഭരിച്ചിട്ടുണ്ടെങ്കിൽ‌, Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്‌ത് അവ ഇവിടെ കാണാൻ സമന്വയിപ്പിക്കൽ ഓണാക്കുക.</translation>
 <translation id="7870350829250847712">Chrome പാസ്‌വേഡുകളൊന്നുമില്ല</translation>
 <translation id="9087836967653912639">റദ്ദാക്കുക</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb
index 86b3725..eb25e8d1 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="mn">
 <translation id="3378542047369517508">Chrome-д хадгалсан бүх нууц үгэндээ хандаарай. Дурын апп дээр. Хүссэн үедээ.</translation>
 <translation id="3660601625129812825">Chrome-н нууц үгийг автоматаар бөглөх</translation>
-<translation id="3674842644261144671">Та саяхан Google бүртгэлээсээ гарсан тул таны синк хийсэн нууц үгсийг хассан. Тэднийг энд харахын тулд Chrome-д нэвтэрч, синк хийхийг асаана уу.</translation>
 <translation id="5313485577007399362">Автоматаар бөглөх хэсгийг идэвхжүүлэх...</translation>
 <translation id="6494101196118320406">Chrome-н нууц үг байхгүй</translation>
-<translation id="7743962897580607860">Эхлүүлэхийн тул Chrome-д зарим нууц үгээ хадгална уу. Хэрэв танд Google бүртгэлдээ хадгалсан нууц үгс хэдийн байгаа бол тэднийг энд харахын тулд Chrome-д нэвтэрч, синк хийхийг асаана уу.</translation>
 <translation id="7870350829250847712">Chrome-н нууц үг байхгүй</translation>
 <translation id="9087836967653912639">Цуцлах</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb
index e45b5c5..2fdb5e5e 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mr.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="mr">
 <translation id="3378542047369517508">तुम्ही Chrome मध्ये सेव्ह करत असलेल्या पासवर्डचा अ‍ॅक्सेस मिळवा. कोणत्याही अ‍ॅपमध्ये. कोणत्याही वेळी.</translation>
 <translation id="3660601625129812825">ऑटोफिल Chrome पासवर्ड</translation>
-<translation id="3674842644261144671">तुम्ही नुकतेच तुमच्या Google खात्यामधून साइन आउट केले, ज्यामुळे तुमचे सिंक केलेले पासवर्ड काढले गेले. ते येथे पाहण्यासाठी Chrome मध्ये साइन इन करा आणि सिंक सुरू करा.</translation>
 <translation id="5313485577007399362">ऑटोफिल सुरू करा...</translation>
 <translation id="6494101196118320406">Chrome पासवर्ड नाहीत</translation>
-<translation id="7743962897580607860">सुरुवात करण्यासाठी Chrome मध्ये काही पासवर्ड सेव्ह करा. तुमच्याकडे आधीच तुमच्या Google खात्यामध्ये स्टोअर केलेले पासवर्ड असल्यास, Chrome मध्ये साइन इन करा आणि ते येथे पाहण्यासाठी सिंक सुरू करा.</translation>
 <translation id="7870350829250847712">Chrome पासवर्ड नाहीत</translation>
 <translation id="9087836967653912639">रद्द करा</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb
index 364c191..e56152d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ms">
 <translation id="3378542047369517508">Dapatkan akses kepada semua kata laluan yang anda simpan dalam Chrome. Dalam mana-mana apl. Pada bila-bila masa.</translation>
 <translation id="3660601625129812825">Autolengkap Kata Laluan Chrome</translation>
-<translation id="3674842644261144671">Baru-baru ini anda telah log keluar daripada akaun Google anda dan itu telah menyebabkan kata laluan anda yang disegerakkan dialih keluar. Log masuk ke Chrome dan hidupkan penyegerakan untuk melihat kata laluan anda di sini.</translation>
 <translation id="5313485577007399362">Dayakan Autolengkap...</translation>
 <translation id="6494101196118320406">Tiada Kata Laluan Chrome</translation>
-<translation id="7743962897580607860">Simpan beberapa kata laluan dalam Chrome untuk bermula. Jika anda pernah menyimpan kata laluan dalam akaun Google anda, log masuk ke Chrome dan hidupkan penyegerakan untuk melihat kata laluan tersebut di sini.</translation>
 <translation id="7870350829250847712">Tiada Kata Laluan Chrome</translation>
 <translation id="9087836967653912639">Batal</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb
index 138bdb9e..83579fd6 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="my">
 <translation id="3378542047369517508">Chrome တွင် သင်သိမ်းထားသော စကားဝှက်အားလုံးကို ကြည့်ခွင့်ရယူပါ။ နှစ်သက်ရာအက်ပ်တွင်။ အချိန်မရွေး။</translation>
 <translation id="3660601625129812825">Chrome စကားဝှက်များ အော်တိုဖြည့်ခြင်း</translation>
-<translation id="3674842644261144671">သင့် Google အကောင့်မှ လတ်တလော ထွက်ထားပါသည်၊ ၎င်းက သင်စင့်ခ်လုပ်ထားသော စကားဝှက်များကို ဖယ်ရှားလိုက်သည်။ ၎င်းတို့ကို ဤနေရာတွင်မြင်ရရန် Chrome သို့ လက်မှတ်ထိုးဝင်ပြီး စင့်ခ်လုပ်ခြင်းကို ဖွင့်ပါ။</translation>
 <translation id="5313485577007399362">အော်တိုဖြည့် ဖွင့်ရန်...</translation>
 <translation id="6494101196118320406">Chrome စကားဝှက်များ မရှိပါ</translation>
-<translation id="7743962897580607860">စတင်ရန်အတွက် Chrome တွင် စကားဝှက်အချို့ကို သိမ်းပါ။ သင့် Google အကောင့်တွင် စကားဝှက်များ သိမ်းပြီးပါက ၎င်းတို့ကို ဤနေရာတွင်မြင်ရရန် Chrome သို့ လက်မှတ်ထိုးဝင်ပြီး စင့်ခ်လုပ်ခြင်းကို ဖွင့်ပါ။</translation>
 <translation id="7870350829250847712">Chrome စကားဝှက်များ မရှိပါ</translation>
 <translation id="9087836967653912639">ပယ်ရန်</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb
index b471592..1312572 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ne.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ne">
 <translation id="3378542047369517508">तपाईंले Chrome मा सुरक्षित गर्ने सबै पासवर्डहरूमाथि पहुँच राख्नुहोस्। जुनसुकै अनुप्रयोगमा। जुनसुकै बेला।</translation>
 <translation id="3660601625129812825">Chrome का पासवर्डहरू स्वतः भर्नुहोस्</translation>
-<translation id="3674842644261144671">तपाईंले हालसालै आफ्नो Google खाताबाट साइन आउट गर्नुभएको हुनाले तपाईंका सिंक गरिएका पासवर्डहरू हटाइए। आफ्ना सिंक गरिएका पासवर्डहरू यहाँ फेला पार्न Chrome मा साइन इन गरी सिंक गर्ने सुविधा सक्रिय गर्नुहोस्।</translation>
 <translation id="5313485577007399362">स्वतः भरण सुविधा सक्षम पार्नुहोस्...</translation>
 <translation id="6494101196118320406">Chrome मा कुनै पनि पासवर्ड छैन</translation>
-<translation id="7743962897580607860">सुरु गर्न Chrome मा केही पासवर्डहरू सुरक्षित गर्नुहोस्। तपाईंले आफ्नो Google खातामा पासवर्डहरू सुरक्षित गरिसक्नुभएको छ भने ती पासवर्ड यहाँ फेला पार्न Chrome मा साइन इन गरी सिंक गर्नुहोस्।</translation>
 <translation id="7870350829250847712">Chrome मा कुनै पनि पासवर्ड छैन</translation>
 <translation id="9087836967653912639">रद्द गर्नुहोस्</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb
index 57233f4..ffc1591 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="nl">
 <translation id="3378542047369517508">Krijg toegang tot alle wachtwoorden die je in Chrome hebt opgeslagen, in elke app en op elk moment.</translation>
 <translation id="3660601625129812825">Chrome-wachtwoorden automatisch aanvullen</translation>
-<translation id="3674842644261144671">Je bent onlangs uitgelogd van je Google-account. Hierdoor zijn je gesynchroniseerde wachtwoorden verwijderd. Log in bij Chrome en schakel synchronisatie in om de wachtwoorden hier weer te geven.</translation>
 <translation id="5313485577007399362">Automatisch aanvullen inschakelen…</translation>
 <translation id="6494101196118320406">Geen Chrome-wachtwoorden</translation>
-<translation id="7743962897580607860">Sla eerst een aantal wachtwoorden op in Chrome. Als je al wachtwoorden hebt opgeslagen in je Google-account, log je in bij Chrome en schakel je synchronisatie in om de wachtwoorden hier weer te geven.</translation>
 <translation id="7870350829250847712">Geen Chrome-wachtwoorden</translation>
 <translation id="9087836967653912639">Annuleren</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb
index 14c1845..04611e2 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_no.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="no">
 <translation id="3378542047369517508">Få tilgang til alle passordene du lagrer i Chrome. I alle apper. Når som helst.</translation>
 <translation id="3660601625129812825">Autofyll Chrome-passord</translation>
-<translation id="3674842644261144671">Du har nylig logget av Google-kontoen din, så de synkroniserte passordene dine er fjernet. Logg på Chrome og slå på synkronisering for å se dem her.</translation>
 <translation id="5313485577007399362">Aktiver Autofyll</translation>
 <translation id="6494101196118320406">Ingen Chrome-passord</translation>
-<translation id="7743962897580607860">Lagre noen passord i Chrome for å komme i gang. Hvis du allerede har lagrede passord i Google-kontoen din, logger du på Chrome og slår på synkronisering for å se dem her.</translation>
 <translation id="7870350829250847712">Ingen Chrome-passord</translation>
 <translation id="9087836967653912639">Avbryt</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb
index 2af5001..dd1e9d4 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_or.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="or">
 <translation id="3378542047369517508">ଆପଣ Chromeରେ ସେଭ୍ କରିଥିବା ସମସ୍ତ ପାସୱାର୍ଡକୁ ଆକ୍ସେସ୍ ପାଆନ୍ତୁ। ଯେ କୌଣସି ଆପରେ। ଯେ କୌଣସି ସମୟରେ।</translation>
 <translation id="3660601625129812825">AutoFill Chrome ପାସୱାର୍ଡ</translation>
-<translation id="3674842644261144671">ଆପଣ ବର୍ତ୍ତମାନ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରୁ ସାଇନ୍ ଆଉଟ୍ କରିଛନ୍ତି, ଯାହା ଆପଣଙ୍କ ସିଙ୍କ୍ ହୋଇଥିବା ପାସୱାର୍ଡଗୁଡ଼ିକୁ କାଢ଼ିଦେଇଛି। Chromeରେ ସାଇନ୍ ଇନ୍ କରି ସେଗୁଡ଼ିକୁ ଏଠାରେ ଦେଖିବାକୁ ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ।</translation>
 <translation id="5313485577007399362">AutoFill ସକ୍ଷମ କରନ୍ତୁ...</translation>
 <translation id="6494101196118320406">କୌଣସି Chrome ପାସୱାର୍ଡ ନାହିଁ</translation>
-<translation id="7743962897580607860">ଆରମ୍ଭ କରିବାକୁ Chromeରେ କିଛି ପାସୱାର୍ଡଗୁଡ଼ିକୁ ସେଭ୍ କରନ୍ତୁ। ଯଦି ପୂର୍ବରୁ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ପାସୱାର୍ଡଗୁଡ଼ିକ ଷ୍ଟୋର୍ କରାଯାଇଛି, ତେବେ Chromeରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ ଏବଂ ସେଗୁଡ଼ିକୁ ଏଠାରେ ଦେଖିବାକୁ ସିଙ୍କ୍ ଚାଲୁ କରନ୍ତୁ।</translation>
 <translation id="7870350829250847712">କୌଣସି Chrome ପାସୱାର୍ଡ ନାହିଁ</translation>
 <translation id="9087836967653912639">ବାତିଲ୍ କରନ୍ତୁ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb
index 8dbf6dc..38a1dc5b 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="pa">
 <translation id="3378542047369517508">Chrome ਵਿੱਚ ਆਪਣੇ ਰੱਖਿਅਤ ਕੀਤੇ ਸਾਰੇ ਪਾਸਵਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ। ਕਿਸੇ ਵੀ ਐਪ ਵਿੱਚ। ਕਿਸੇ ਵੀ ਵੇਲੇ।</translation>
 <translation id="3660601625129812825">ਆਟੋਫਿਲ Chrome ਪਾਸਵਰਡ</translation>
-<translation id="3674842644261144671">ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚੋਂ ਸਾਈਨ-ਆਊਟ ਕੀਤਾ ਹੈ, ਜਿਸ ਕਰਕੇ ਤੁਹਾਡੇ ਸਮਕਾਲੀਕਰਨ ਕੀਤੇ ਪਾਸਵਰਡ ਹਟ ਗਏ ਹਨ। Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਇੱਥੇ ਦੇਖਣ ਲਈ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ।</translation>
 <translation id="5313485577007399362">ਆਟੋਫਿਲ ਨੂੰ ਚਾਲੂ ਕਰੋ...</translation>
 <translation id="6494101196118320406">ਕੋਈ Chrome ਪਾਸਵਰਡ ਨਹੀਂ</translation>
-<translation id="7743962897580607860">ਸ਼ੁਰੂ ਕਰਨ ਲਈ Chrome ਵਿੱਚ ਕੁਝ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰੋ। ਜੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਪਾਸਵਰਡ ਸਟੋਰ ਕੀਤੇ ਹੋਏ ਹਨ, ਤਾਂ Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਇੱਥੇ ਦੇਖਣ ਲਈ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ।</translation>
 <translation id="7870350829250847712">ਕੋਈ Chrome ਪਾਸਵਰਡ ਨਹੀਂ</translation>
 <translation id="9087836967653912639">ਰੱਦ ਕਰੋ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb
index 057a114..c4826c7 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="pl">
 <translation id="3378542047369517508">Korzystaj ze wszystkich haseł zapisanych w Chrome – w dowolnej aplikacji i w dowolnym momencie.</translation>
 <translation id="3660601625129812825">Wypełniaj hasła w Chrome</translation>
-<translation id="3674842644261144671">Niedawno nastąpiło wylogowanie z konta Google, dlatego Twoje zsynchronizowane hasła zostały usunięte. Aby je tu zobaczyć, zaloguj się w Chrome i włącz synchronizację.</translation>
 <translation id="5313485577007399362">Włącz Wypełnianie…</translation>
 <translation id="6494101196118320406">Brak haseł w Chrome</translation>
-<translation id="7743962897580607860">Na początek zapisz w Chrome jakieś hasła. Jeśli masz już zapisane hasła na koncie Google, zaloguj się w Chrome i włącz synchronizację, by je tu zobaczyć.</translation>
 <translation id="7870350829250847712">Brak haseł w Chrome</translation>
 <translation id="9087836967653912639">Anuluj</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb
index a28a4d0..735216f 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="pt-BR">
 <translation id="3378542047369517508">Tenha acesso a todas as senhas que você salvou no Chrome. Em qualquer app, sempre que quiser.</translation>
 <translation id="3660601625129812825">Preenchimento automático de senhas do Chrome</translation>
-<translation id="3674842644261144671">Você saiu da Conta do Google recentemente, por isso suas senhas sincronizadas foram removidas. Faça login no Chrome e ative a sincronização para vê-las aqui.</translation>
 <translation id="5313485577007399362">Ativar o preenchimento automático…</translation>
 <translation id="6494101196118320406">Não há nenhuma senha no Chrome</translation>
-<translation id="7743962897580607860">Salve algumas senhas no Chrome para começar. Se você já tiver senhas armazenadas na Conta do Google, faça login no Chrome e ative a sincronização para vê-las aqui.</translation>
 <translation id="7870350829250847712">Não há nenhuma senha no Chrome</translation>
 <translation id="9087836967653912639">Cancelar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb
index 5244fb39..69d415c 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="pt-PT">
 <translation id="3378542047369517508">Obtenha acesso a todas as palavras-passe que guardar no Chrome. Em qualquer app. Em qualquer altura.</translation>
 <translation id="3660601625129812825">Preenchimento automático de palavras-passe do Chrome</translation>
-<translation id="3674842644261144671">Recentemente, terminou sessão na sua Conta Google, o que removeu as suas palavras-passe sincronizadas. Inicie sessão no Chrome e ative a sincronização para as ver aqui.</translation>
 <translation id="5313485577007399362">Ativar preenchimento automático…</translation>
 <translation id="6494101196118320406">Sem palavras-passe do Chrome</translation>
-<translation id="7743962897580607860">Guarde algumas palavras-passe no Chrome para começar. Se já tiver palavras-passe armazenadas na sua Conta Google, inicie sessão no Chrome e ative a sincronização para as ver aqui.</translation>
 <translation id="7870350829250847712">Sem palavras-passe do Chrome</translation>
 <translation id="9087836967653912639">Cancelar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb
index 21b9dc7..0e4c45e 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ro">
 <translation id="3378542047369517508">Obține acces la toate parolele pe care le salvezi în Chrome. În orice aplicație. Oricând.</translation>
 <translation id="3660601625129812825">Completează automat parolele Chrome</translation>
-<translation id="3674842644261144671">Deoarece te-ai deconectat recent de la contul Google, au fost eliminate parolele sincronizate. Conectează-te la Chrome și activează sincronizarea ca să le vezi aici.</translation>
 <translation id="5313485577007399362">Activează completarea automată...</translation>
 <translation id="6494101196118320406">Nu există parole în Chrome</translation>
-<translation id="7743962897580607860">Pentru început, salvează câteva parole în Chrome. Dacă ai stocat deja parole în contul Google, conectează-te la Chrome și activează sincronizarea ca să le vezi aici.</translation>
 <translation id="7870350829250847712">Nu există parole în Chrome</translation>
 <translation id="9087836967653912639">Anulează</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb
index bf222c6..a9d57f1 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ru.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ru">
 <translation id="3378542047369517508">Вы сможете использовать сохраненные в Chrome пароли в любом приложении.</translation>
 <translation id="3660601625129812825">Автозаполнение паролей Chrome</translation>
-<translation id="3674842644261144671">Вы недавно вышли из своего аккаунта Google, в результате чего ваши синхронизированные пароли были удалены. Чтобы они появились здесь, войдите в Chrome и включите синхронизацию.</translation>
 <translation id="5313485577007399362">Включить автозаполнение</translation>
 <translation id="6494101196118320406">Нет паролей Chrome</translation>
-<translation id="7743962897580607860">Для начала сохраните несколько паролей в Chrome. В вашем аккаунте Google уже есть сохраненные пароли? Чтобы они появились здесь, войдите в Chrome и включите синхронизацию.</translation>
 <translation id="7870350829250847712">Нет паролей Chrome</translation>
 <translation id="9087836967653912639">Отмена</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb
index d0a3d74..0935123 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="si">
 <translation id="3378542047369517508">ඔබ Chrome තුළ සුරකින සියලුම මුරපද වෙත ප්‍රවේශය ලබා ගන්න. ඕනෑම යෙදුමක් තුළ. ඕනෑම වේලාවක.</translation>
 <translation id="3660601625129812825">AutoFill Chrome මුරපද</translation>
-<translation id="3674842644261144671">ඔබ මෑත දී ඔබේ Google ගිණුමෙන් වැරුණා, එය ඔබේ සමමුහූර්ත කළ මුරපද ඉවත් කළා. ඒවා මෙහි බැලීමට Chrome වෙත පුරනය වී සමමුහූර්තය සක්‍රීය කරන්න.</translation>
 <translation id="5313485577007399362">AutoFill සබල කරන්න...</translation>
 <translation id="6494101196118320406">Chrome මුරපද නැත</translation>
-<translation id="7743962897580607860">පටන් ගැනීමට Chrome තුළ සමහර මුරපද සුරකින්න. ඔබ දැනටමත් ඔබේ Google ගිණුම තුළ මුරපද ගබඩා කර ඇති නම්, ඒවා මෙහි බැලීමට Chrome වෙත පුරනය වී සමමුහූර්තකය සක්‍රීය කරන්න.</translation>
 <translation id="7870350829250847712">Chrome මුරපද නැත</translation>
 <translation id="9087836967653912639">අවලංගු කරන්න</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb
index 068ad05..c239345d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="sk">
 <translation id="3378542047369517508">Získajte prístup k všetkým heslám, ktoré ste si uložili v Chrome. V ľubovoľnej aplikácii a hocikedy.</translation>
 <translation id="3660601625129812825">Automatické dopĺňanie hesiel Chromu</translation>
-<translation id="3674842644261144671">Nedávno ste sa odhlásili zo svojho účtu Google, čím ste odstránili synchronizované heslá. Ak si ich tu chcete zobraziť, prihláste sa do Chromu a zapnite synchronizáciu.</translation>
 <translation id="5313485577007399362">Povoliť automatické dopĺňanie…</translation>
 <translation id="6494101196118320406">Žiadne heslá Chromu</translation>
-<translation id="7743962897580607860">Začnite uložením niekoľkých hesiel v Chrome. Ak už máte heslá uložené v účte Google, prihláste sa do Chromu a zapnite synchronizáciu, aby sa vám tu zobrazili.</translation>
 <translation id="7870350829250847712">Žiadne heslá Chromu</translation>
 <translation id="9087836967653912639">Zrušiť</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb
index 115a81e7..d7f7cfb9 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="sl">
 <translation id="3378542047369517508">Imejte dostop do vseh gesel, ki jih shranite v Chromu. V kateri koli aplikaciji. Kadar koli.</translation>
 <translation id="3660601625129812825">Samodejno izpolnjevanje gesel v Chromu</translation>
-<translation id="3674842644261144671">Nedavno ste se odjavili iz računa Google, s čimer so bila odstranjena sinhronizirana gesla. Prijavite se v Chrome, če želite vklopiti sinhronizacijo in si jih ogledati tam.</translation>
 <translation id="5313485577007399362">Omogoči samodejno izpolnjevanje …</translation>
 <translation id="6494101196118320406">Ni gesel v Chromu</translation>
-<translation id="7743962897580607860">Shranite nekatera gesla v Chromu, če želite začeti. Če imate v računu Google že shranjena gesla, se prijavite v Chrome in vklopite sinhronizacijo, če si jih želite ogledati tam.</translation>
 <translation id="7870350829250847712">Ni gesel v Chromu</translation>
 <translation id="9087836967653912639">Prekliči</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
index ad8c664..6c75fb4 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="sq">
 <translation id="3378542047369517508">Merr qasjen te të gjitha fjalëkalimet që ruan në Chrome. Në çdo aplikacion. Në çdo kohë.</translation>
 <translation id="3660601625129812825">Plotëso automatikisht fjalëkalimet e Chrome</translation>
-<translation id="3674842644261144671">Ke dalë së fundi nga llogaria jote e Google, gjë që ka hequr fjalëkalimet e tua të sinkronizuara. Identifikohu në Chrome dhe aktivizo sinkronizimin për t'i parë këtu.</translation>
 <translation id="5313485577007399362">Aktivizo plotësimin automatik...</translation>
 <translation id="6494101196118320406">Nuk ka asnjë fjalëkalim të Chrome</translation>
-<translation id="7743962897580607860">Ruaj disa fjalëkalime në Chrome që të fillosh. Nëse ke tashmë fjalëkalime të ruajtura në "Llogarinë tënde të Google", identifikohu në Chrome dhe aktivizo sinkronizimin për t'i parë ato këtu.</translation>
 <translation id="7870350829250847712">Nuk ka asnjë fjalëkalim të Chrome</translation>
 <translation id="9087836967653912639">Anulo</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb
index 24d891fa..b3518f2 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="sr">
 <translation id="3378542047369517508">Добијте приступ свим лозинкама које чувате у Chrome-у. У било којој апликацији. У било ком тренутку.</translation>
 <translation id="3660601625129812825">Аутоматско попуњавање лозинки за Chrome</translation>
-<translation id="3674842644261144671">Недавно сте се одјавили са Google налога, чиме су уклоњене синхронизоване лозинке. Пријавите се у Chrome и укључите синхронизацију да бисте их видели овде.</translation>
 <translation id="5313485577007399362">Омогући аутоматско попуњавање...</translation>
 <translation id="6494101196118320406">Нема лозинки за Chrome</translation>
-<translation id="7743962897580607860">Сачувајте неке лозинке у Chrome-у да бисте започели. Ако сте већ сачували лозинке на Google налогу, пријавите се у Chrome и укључите синхронизацију да би се приказале овде.</translation>
 <translation id="7870350829250847712">Нема лозинки за Chrome</translation>
 <translation id="9087836967653912639">Откажи</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb
index 9b21533..b80dd7d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sv.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="sv">
 <translation id="3378542047369517508">Få tillgång till alla lösenord du har sparat i Chrome – när som helst, i vilken app som helst.</translation>
 <translation id="3660601625129812825">Autofyll lösenord i Chrome</translation>
-<translation id="3674842644261144671">Du har nyligen loggat ut från Google-kontot. Samtidigt togs dina synkroniserade lösenord bort. Logga in i Chrome och aktivera synkronisering för att se dem här.</translation>
 <translation id="5313485577007399362">Aktivera Autofyll …</translation>
 <translation id="6494101196118320406">Inga lösenord i Chrome</translation>
-<translation id="7743962897580607860">Spara några lösenord i Chrome för att komma igång. Om du redan har sparat lösenord i Google-kontot loggar du in i Chrome och aktiverar synkronisering för att se dem här.</translation>
 <translation id="7870350829250847712">Inga lösenord i Chrome</translation>
 <translation id="9087836967653912639">Avbryt</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb
index 6d11e4b..343e174 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="sw">
 <translation id="3378542047369517508">Pata uwezo wa kufikia manenosiri yote unayohifadhi kwenye Chrome. Kwenye programu yoyote. Wakati wowote.</translation>
 <translation id="3660601625129812825">Jaza Kiotomatiki Manenosiri ya Chrome</translation>
-<translation id="3674842644261144671">Uliondoka kwenye akaunti yako ya Google hivi majuzi, hatua ambayo iliondoa manenosiri yako yaliyosawazishwa. Ingia katika akaunti ya Chrome na uwashe kipengele cha kusawazisha ili uyaone hapa.</translation>
 <translation id="5313485577007399362">Washa Kipengele cha Kujaza Kiotomatiki...</translation>
 <translation id="6494101196118320406">Hamna Manenosiri ya Chrome</translation>
-<translation id="7743962897580607860">Hifadhi baadhi ya manenosiri kwenye Chrome ili uanze. Iwapo tayari umehifadhi manenosiri kwenye akaunti yako ya Google, ingia katika akaunti ya Chrome na uwashe kipengele cha kusawazisha ili uyaone hapa.</translation>
 <translation id="7870350829250847712">Hamna Manenosiri ya Chrome</translation>
 <translation id="9087836967653912639">Ghairi</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb
index 5b89fd1c..55b43eaa 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ta">
 <translation id="3378542047369517508">Chromeமில் சேமிக்கப்பட்டுள்ள எல்லாக் கடவுச்சொற்களுக்கும் அணுகலைப் பெறுங்கள். எந்த ஆப்ஸிலும். எந்த நேரத்திலும்.</translation>
 <translation id="3660601625129812825">Chrome கடவுச்சொற்களைத் தன்னிரப்பு</translation>
-<translation id="3674842644261144671">சமீபத்தில் Google கணக்கில் இருந்து வெளியேறியதால் நீங்கள் ஒத்திசைத்த கடவுச்சொற்கள் அகற்றப்பட்டன. அவற்றை இங்குப் பார்க்க Chromeமில் உள்நுழைந்து ஒத்திசைவை இயக்கவும்.</translation>
 <translation id="5313485577007399362">தன்னிரப்பியை இயக்கு...</translation>
 <translation id="6494101196118320406">Chrome கடவுச்சொற்கள் எதுவும் இல்லை</translation>
-<translation id="7743962897580607860">தொடங்க, சில கடவுச்சொற்களை Chromeமில் சேமிக்கவும். உங்கள் Google கணக்கில் ஏற்கெனவே கடவுச்சொற்களைச் சேமித்து வைத்துள்ளீர்கள் எனில் அவற்றை இங்குப் பார்ப்பதற்கு Chromeமில் உள்நுழைந்து ஒத்திசைவை இயக்கவும்.</translation>
 <translation id="7870350829250847712">Chrome கடவுச்சொற்கள் எதுவும் இல்லை</translation>
 <translation id="9087836967653912639">ரத்துசெய்</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb
index ad8c8d0..67b11954 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="te">
 <translation id="3378542047369517508">మీరు Chromeలో సేవ్ చేసే అన్ని పాస్‌వర్డ్‌లకు యాక్సెస్ పొందండి. ఏదైనా యాప్‌లో, ఎప్పుడైనా పొందండి.</translation>
 <translation id="3660601625129812825">Chrome పాస్‌వర్డ్‌లను ఆటోఫిల్ చేయండి</translation>
-<translation id="3674842644261144671">ఇటీవల మీ Google ఖాతా నుండి మీరు సైన్ అవుట్ చేశారు కాబట్టి, సింక్ అయిన మీ పాస్‌వర్డ్‌లు తీసివేయబడ్డాయి. వాటిని ఇక్కడ చూడటానికి Chromeకు సైన్ ఇన్ చేసి, సింక్‌ను ఆన్ చేయండి.</translation>
 <translation id="5313485577007399362">ఆటోఫిల్‌ను ఎనేబుల్ చేయి...</translation>
 <translation id="6494101196118320406">Chrome పాస్‌వర్డ్‌లు లేవు</translation>
-<translation id="7743962897580607860">ప్రారంభించడానికి కొన్ని పాస్‌వర్డ్‌లను Chromeలో సేవ్ చేయండి. మీ Google ఖాతాలో పాస్‌వర్డ్‌లు ఏవైనా ఇదివరకే స్టోర్ అయి ఉంటే, వాటిని ఇక్కడ చూడటానికి Chromeకు సైన్ ఇన్ చేసి, సింక్‌ను ఆన్ చేయండి.</translation>
 <translation id="7870350829250847712">Chrome పాస్‌వర్డ్‌లు లేవు</translation>
 <translation id="9087836967653912639">రద్దు చేయి</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb
index e601e8ad4..eefa617 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="th">
 <translation id="3378542047369517508">เข้าถึงรหัสผ่านทั้งหมดที่คุณบันทึกไว้ใน Chrome ได้ทุกเมื่อจากทุกๆ แอป</translation>
 <translation id="3660601625129812825">ป้อนรหัสผ่านของ Chrome โดยอัตโนมัติ</translation>
-<translation id="3674842644261144671">คุณเพิ่งออกจากระบบบัญชี Google ระบบจึงนำรหัสผ่านที่ซิงค์ออก ลงชื่อเข้าใช้ Chrome แล้วเปิดการซิงค์เพื่อดูรหัสผ่านที่นี่</translation>
 <translation id="5313485577007399362">เปิดใช้การป้อนข้อความอัตโนมัติ...</translation>
 <translation id="6494101196118320406">ไม่มีรหัสผ่านของ Chrome</translation>
-<translation id="7743962897580607860">บันทึกรหัสผ่านใน Chrome เพื่อเริ่มต้นใช้งาน หากคุณมีรหัสผ่านที่จัดเก็บไว้ในบัญชี Google อยู่แล้ว ให้ลงชื่อเข้าใช้ Chrome แล้วเปิดการซิงค์เพื่อดูรหัสผ่านที่นี่</translation>
 <translation id="7870350829250847712">ไม่มีรหัสผ่านของ Chrome</translation>
 <translation id="9087836967653912639">ยกเลิก</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb
index 8f97f23f..2fee64c 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_tr.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="tr">
 <translation id="3378542047369517508">Chrome'da kaydettiğiniz tüm şifrelere erişim elde edin. Tüm uygulamalarda. Her zaman.</translation>
 <translation id="3660601625129812825">Otomatik Doldurma Chrome Şifreleri</translation>
-<translation id="3674842644261144671">Kısa süre önce Google hesabınızın oturumunu kapattığınızdan senkronize edilen şifreleriniz kaldırıldı. Chrome'da oturum açıp senkronizasyonu etkinleştirerek söz konusu şifreleri burada görebilirsiniz.</translation>
 <translation id="5313485577007399362">Otomatik Doldurmayı Etkinleştir...</translation>
 <translation id="6494101196118320406">Chrome Şifresi Yok</translation>
-<translation id="7743962897580607860">Başlamak için Chrome'a birkaç şifre kaydedin. Halihazırda Google hesabınızda kayıtlı şifreleriniz varsa Chrome'da oturum açıp senkronizasyonu etkinleştirerek onları burada görebilirsiniz.</translation>
 <translation id="7870350829250847712">Chrome Şifresi Yok</translation>
 <translation id="9087836967653912639">İptal</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb
index ac5677d..cab7d2d 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="uk">
 <translation id="3378542047369517508">Доступ до всіх паролів, які ви зберегли в Chrome. У будь-якому додатку. Будь-коли.</translation>
 <translation id="3660601625129812825">Aвтоматично заповнювати паролі в Chrome</translation>
-<translation id="3674842644261144671">Нещодавно ви вийшли з облікового запису Google, через що ваші синхронізовані паролі було видалено. Увійдіть у Chrome і ввімкніть синхронізацію, щоб бачити їх тут.</translation>
 <translation id="5313485577007399362">Увімкнути автозаповнення…</translation>
 <translation id="6494101196118320406">Немає паролів Chrome</translation>
-<translation id="7743962897580607860">Щоб почати, збережіть кілька паролів у Chrome. Якщо ви вже зберігаєте паролі в обліковому записі Google, увійдіть у Chrome і ввімкніть синхронізацію, щоб побачити їх тут.</translation>
 <translation id="7870350829250847712">Немає паролів Chrome</translation>
 <translation id="9087836967653912639">Скасувати</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb
index 2c8c3b4b..59b18d2 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ur.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="ur">
 <translation id="3378542047369517508">‏Chrome میں محفوظ سبھی پاس ورڈز تک رسائی حاصل کریں۔ کسی بھی ایپ میں۔ کسی بھی وقت۔</translation>
 <translation id="3660601625129812825">‏آٹو فل Chrome پاس ورڈز</translation>
-<translation id="3674842644261144671">‏آپ حال میں ہی اپنے Google اکاؤنٹ سے سائن آؤٹ ہوئے ہیں جس سے آپ کے سنک کردہ پاس ورڈز ہٹ گئے۔ Chrome میں سائن ان کریں اور انہیں یہاں دیکھنے کے لیے سنک کو آن کریں۔</translation>
 <translation id="5313485577007399362">آٹو فل فعال کریں...</translation>
 <translation id="6494101196118320406">‏کوئی Chrome پاس ورڈز نہیں</translation>
-<translation id="7743962897580607860">‏شروع کرنے کے لیے کچھ پاس ورڈز کو Chrome میں محفوظ کریں۔ اگر آپ کے پاس Google اکاؤنٹ میں پہلے سے ہی پاسورڈز اسٹور ہیں، تو Chrome میں سائن ان کریں اور انہیں یہاں دیکھنے کے لیے سنک کو آن کریں۔</translation>
 <translation id="7870350829250847712">‏کوئی Chrome پاس ورڈز نہیں</translation>
 <translation id="9087836967653912639">منسوخ کریں</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb
index e0ec8bfc..9adb2e3 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="uz">
 <translation id="3378542047369517508">Chromeda saqlangan parollaringizdan istalgan joyda foydalaning. Istalgan ilovada, istalgan vaqtda.</translation>
 <translation id="3660601625129812825">Chrome parollarning avtomatik kiritilishi</translation>
-<translation id="3674842644261144671">Yaqinda Google hisobingizdan chiqib ketdingiz va sinxronlangan parollaringiz olib tashlandi. Chrome hisobingizga kiring va sinxronizatsiyani yoqib, ularni shu yerda koʻrishingiz mumkin.</translation>
 <translation id="5313485577007399362">Avtomatik kiritish funksiyasini yoqish...</translation>
 <translation id="6494101196118320406">Hech qanday Chrome paroli topilmadi</translation>
-<translation id="7743962897580607860">Ishni boshlash uchun Chrome ichiga bir-ikkita parolni saqlang. Agar allaqachon Google hisobingizda parollar saqlangan boʻlsa, Chrome hisobingizga kiring va sinxronizatsiyani yoqib, ularni shu yerda koʻrishingiz mumkin.</translation>
 <translation id="7870350829250847712">Hech qanday Chrome paroli topilmadi</translation>
 <translation id="9087836967653912639">Bekor qilish</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
index be85c7a..b2706994 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="vi">
 <translation id="3378542047369517508">Có quyền sử dụng tất cả các mật khẩu mà bạn lưu trên Chrome trong mọi ứng dụng, bất cứ lúc nào.</translation>
 <translation id="3660601625129812825">Tự động điền mật khẩu Chrome</translation>
-<translation id="3674842644261144671">Gần đây, bạn đã đăng xuất khỏi Tài khoản Google của mình nên các mật khẩu mà bạn đồng bộ hóa đã bị xóa. Hãy đăng nhập vào Chrome rồi bật tính năng đồng bộ hóa để xem các mật khẩu đó tại đây.</translation>
 <translation id="5313485577007399362">Bật tính năng Tự động điền...</translation>
 <translation id="6494101196118320406">Không có mật khẩu Chrome</translation>
-<translation id="7743962897580607860">Lưu một số mật khẩu trong Chrome để bắt đầu. Nếu bạn đã lưu các mật khẩu trong Tài khoản Google của mình, hãy đăng nhập vào Chrome rồi bật tính năng đồng bộ hóa để xem các mật khẩu đó tại đây.</translation>
 <translation id="7870350829250847712">Không có mật khẩu Chrome</translation>
 <translation id="9087836967653912639">Hủy</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb
index f22977e..2efdf57 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="zh-CN">
 <translation id="3378542047369517508">获取您在 Chrome 中保存的所有密码。不限应用。不限时间。</translation>
 <translation id="3660601625129812825">自动填充 Chrome 中存储的密码</translation>
-<translation id="3674842644261144671">您最近退出过自己的 Google 帐号,导致系统移除了您的已同步密码。您只需登录 Chrome 并开启同步功能,便可在此处看到那些密码。</translation>
 <translation id="5313485577007399362">启用自动填充…</translation>
 <translation id="6494101196118320406">您未在 Chrome 中存储任何密码</translation>
-<translation id="7743962897580607860">您需要在 Chrome 中保存一些密码,才能开始使用。如果您已将一些密码存储到自己的 Google 帐号中,请登录 Chrome 并开启同步功能,然后您便可在此处看到那些密码了。</translation>
 <translation id="7870350829250847712">您未在 Chrome 中存储任何密码</translation>
 <translation id="9087836967653912639">取消</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb
index 30046f5..707e012db 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-HK.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="zh-HK">
 <translation id="3378542047369517508">隨時存取在 Chrome 中儲存的所有密碼,且在任何應用程式中都能存取。</translation>
 <translation id="3660601625129812825">自動填入 Chrome 密碼</translation>
-<translation id="3674842644261144671">您最近登出了 Google 帳戶,因此已同步處理的密碼已被移除。請登入 Chrome 並開啟同步功能,密碼便會在這裡顯示。</translation>
 <translation id="5313485577007399362">啟用自動填入功能…</translation>
 <translation id="6494101196118320406">沒有 Chrome 密碼</translation>
-<translation id="7743962897580607860">在 Chrome 中儲存一些密碼即可開始使用。如果您已在 Google 帳戶中儲存密碼,請登入 Chrome 並啟用同步功能,密碼便會在這裡顯示。</translation>
 <translation id="7870350829250847712">沒有 Chrome 密碼</translation>
 <translation id="9087836967653912639">取消</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
index f0f08873..8dcc0a6a 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-TW.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="zh-TW">
 <translation id="3378542047369517508">隨時都能使用自己儲存在 Chrome 中的所有密碼 (適用於任何應用程式)。</translation>
 <translation id="3660601625129812825">自動填入 Chrome 密碼</translation>
-<translation id="3674842644261144671">你最近登出了 Google 帳戶,因此已同步處理的密碼遭到移除。請登入 Chrome 並啟用同步功能,即可在這裡查看密碼。</translation>
 <translation id="5313485577007399362">啟用自動填入功能…</translation>
 <translation id="6494101196118320406">沒有任何 Chrome 密碼</translation>
-<translation id="7743962897580607860">在 Chrome 中儲存一些密碼即可開始使用。如果你已在 Google 帳戶中儲存密碼,請登入 Chrome 並啟用同步功能,即可在這裡查看密碼。</translation>
 <translation id="7870350829250847712">沒有任何 Chrome 密碼</translation>
 <translation id="9087836967653912639">取消</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb
index 0f092b5..23e7d0de 100644
--- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb
+++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb
@@ -3,10 +3,8 @@
 <translationbundle lang="zu">
 <translation id="3378542047369517508">Thola ukufinyelela kuwo wonke amaphasiwedi owalondoloze ku-Chrome. Kunoma iluphi uhlelo lokusebenza. Noma kunini.</translation>
 <translation id="3660601625129812825">Gcwalisa Ngokuzenzakalela Amaphasiwedi e-Chrome</translation>
-<translation id="3674842644261144671">Usanda kuphuma ngemvume ku-akhawunti yakho ye-Google, okususe amaphasiwedi akho avunyelanisiwe. Ngena ngemvume ku-Chrome bese uvula ukuvumelanisa ukuwabona lapha.</translation>
 <translation id="5313485577007399362">Nika amandla Ukugcwalisa Ngokuzenzakalela...</translation>
 <translation id="6494101196118320406">Awekho amaphasiwedi we-Chrome</translation>
-<translation id="7743962897580607860">Londoloza amanye amaphasiwedi ku-Chrome ukuqalisa. Uma usunawo kakade amaphasiwedi agcinwe ku-akhawunti yakho ye-Google, ngena ngemvume ku-Chrome bese uvula ukuvumelanisa ukuwabona lapha.</translation>
 <translation id="7870350829250847712">Awekho amaphasiwedi we-Chrome</translation>
 <translation id="9087836967653912639">Khansela</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/components/io_thread/ios_io_thread.h b/ios/components/io_thread/ios_io_thread.h
index 8f25f129..e8097ac 100644
--- a/ios/components/io_thread/ios_io_thread.h
+++ b/ios/components/io_thread/ios_io_thread.h
@@ -41,7 +41,7 @@
 class NetLog;
 class NetworkDelegate;
 class ProxyConfigService;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class SSLConfigService;
 class TransportSecurityState;
 class URLRequestContext;
@@ -107,7 +107,7 @@
     std::unique_ptr<net::HttpAuthPreferences> http_auth_preferences;
     std::unique_ptr<net::HttpAuthHandlerFactory> http_auth_handler_factory;
     std::unique_ptr<net::HttpServerProperties> http_server_properties;
-    std::unique_ptr<net::ConfiguredProxyResolutionService>
+    std::unique_ptr<net::ProxyResolutionService>
         system_proxy_resolution_service;
     std::unique_ptr<net::QuicContext> quic_context;
     std::unique_ptr<net::HttpNetworkSession> system_http_network_session;
diff --git a/ios/components/io_thread/ios_io_thread.mm b/ios/components/io_thread/ios_io_thread.mm
index 49870f5d..30ef862 100644
--- a/ios/components/io_thread/ios_io_thread.mm
+++ b/ios/components/io_thread/ios_io_thread.mm
@@ -54,9 +54,9 @@
 #include "net/http/http_server_properties.h"
 #include "net/log/net_log.h"
 #include "net/log/net_log_event_type.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/pac_file_fetcher_impl.h"
 #include "net/proxy_resolution/proxy_config_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/socket/tcp_client_socket.h"
 #include "net/spdy/spdy_session.h"
diff --git a/ios/web/shell/shell_url_request_context_getter.mm b/ios/web/shell/shell_url_request_context_getter.mm
index 5952752..c7a02d2 100644
--- a/ios/web/shell/shell_url_request_context_getter.mm
+++ b/ios/web/shell/shell_url_request_context_getter.mm
@@ -82,7 +82,8 @@
                                                            user_agent));
     storage_->set_proxy_resolution_service(
         net::ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
-            std::move(proxy_config_service_), url_request_context_->net_log()));
+            std::move(proxy_config_service_), /*quick_check_enabled=*/true,
+            url_request_context_->net_log()));
     storage_->set_ssl_config_service(
         std::make_unique<net::SSLConfigServiceDefaults>());
     storage_->set_cert_verifier(
diff --git a/ios/web_view/internal/web_view_url_request_context_getter.mm b/ios/web_view/internal/web_view_url_request_context_getter.mm
index c74147d..a782c371 100644
--- a/ios/web_view/internal/web_view_url_request_context_getter.mm
+++ b/ios/web_view/internal/web_view_url_request_context_getter.mm
@@ -91,7 +91,8 @@
                                                            user_agent));
     storage_->set_proxy_resolution_service(
         net::ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
-            std::move(proxy_config_service_), url_request_context_->net_log()));
+            std::move(proxy_config_service_), /*quick_check_enabled=*/true,
+            url_request_context_->net_log()));
     storage_->set_ssl_config_service(
         std::make_unique<net::SSLConfigServiceDefaults>());
     storage_->set_cert_verifier(
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index fb2132d..b1791a0a 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -269,6 +269,7 @@
     "sinc_resampler.h",
     "status.cc",
     "status.h",
+    "status_codes.cc",
     "status_codes.h",
     "stream_parser.cc",
     "stream_parser.h",
diff --git a/media/base/audio_decoder.h b/media/base/audio_decoder.h
index 39a893bd..23bf7ae 100644
--- a/media/base/audio_decoder.h
+++ b/media/base/audio_decoder.h
@@ -16,6 +16,7 @@
 #include "media/base/decoder_buffer.h"
 #include "media/base/media_export.h"
 #include "media/base/pipeline_status.h"
+#include "media/base/status.h"
 #include "media/base/waiting.h"
 
 namespace media {
@@ -26,7 +27,7 @@
 class MEDIA_EXPORT AudioDecoder {
  public:
   // Callback for VideoDecoder initialization.
-  using InitCB = base::OnceCallback<void(bool success)>;
+  using InitCB = base::OnceCallback<void(Status)>;
 
   // Callback for AudioDecoder to return a decoded frame whenever it becomes
   // available. Only non-EOS frames should be returned via this callback.
diff --git a/media/base/fallback_video_decoder.cc b/media/base/fallback_video_decoder.cc
index 07b047e..a4796c2 100644
--- a/media/base/fallback_video_decoder.cc
+++ b/media/base/fallback_video_decoder.cc
@@ -48,11 +48,11 @@
                                               InitCB init_cb,
                                               const OutputCB& output_cb,
                                               const WaitingCB& waiting_cb,
-                                              bool success) {
+                                              Status status) {
   // The preferred decoder was successfully initialized.
-  if (success) {
+  if (status.is_ok()) {
     selected_decoder_ = preferred_decoder_.get();
-    std::move(init_cb).Run(true);
+    std::move(init_cb).Run(OkStatus());
     return;
   }
 
diff --git a/media/base/fallback_video_decoder.h b/media/base/fallback_video_decoder.h
index c0833ad..98c06c8 100644
--- a/media/base/fallback_video_decoder.h
+++ b/media/base/fallback_video_decoder.h
@@ -43,7 +43,7 @@
                           InitCB init_cb,
                           const OutputCB& output_cb,
                           const WaitingCB& waiting_cb,
-                          bool success);
+                          Status status);
 
   std::unique_ptr<media::VideoDecoder> preferred_decoder_;
   std::unique_ptr<media::VideoDecoder> fallback_decoder_;
diff --git a/media/base/fallback_video_decoder_unittest.cc b/media/base/fallback_video_decoder_unittest.cc
index 418de4b..ecf80f3 100644
--- a/media/base/fallback_video_decoder_unittest.cc
+++ b/media/base/fallback_video_decoder_unittest.cc
@@ -42,13 +42,15 @@
 
     if (is_fallback && !preferred_should_succeed) {
       EXPECT_CALL(*result, Initialize_(_, _, _, _, _, _))
-          .WillOnce(RunOnceCallback<3>(true));
+          .WillOnce(RunOnceCallback<3>(OkStatus()));
     }
 
     if (!is_fallback) {
       preferred_decoder_ = result;
       EXPECT_CALL(*result, Initialize_(_, _, _, _, _, _))
-          .WillOnce(RunOnceCallback<3>(preferred_should_succeed));
+          .WillOnce(RunOnceCallback<3>(preferred_should_succeed
+                                           ? OkStatus()
+                                           : StatusCode::kCodeOnlyForTesting));
     } else {
       backup_decoder_ = result;
     }
@@ -63,7 +65,7 @@
 
     fallback_decoder_->Initialize(
         video_decoder_config_, false, nullptr,
-        base::BindOnce([](bool success) { EXPECT_TRUE(success); }),
+        base::BindOnce([](Status status) { EXPECT_TRUE(status.is_ok()); }),
         base::DoNothing(), base::DoNothing());
   }
 
@@ -123,16 +125,16 @@
   Initialize(PreferredShouldSucceed());
 
   // If we succeedd the first time, it should still be alive.
-  if (PreferredShouldSucceed()) {
+  if (PreferredShouldSucceed()) {  // fail initialization
     EXPECT_CALL(*preferred_decoder_, Initialize_(_, _, _, _, _, _))
-        .WillOnce(RunOnceCallback<3>(false));  // fail initialization
+        .WillOnce(RunOnceCallback<3>(StatusCode::kCodeOnlyForTesting));
   }
   EXPECT_CALL(*backup_decoder_, Initialize_(_, _, _, _, _, _))
-      .WillOnce(RunOnceCallback<3>(true));
+      .WillOnce(RunOnceCallback<3>(OkStatus()));
 
   fallback_decoder_->Initialize(
       video_decoder_config_, false, nullptr,
-      base::BindOnce([](bool success) { EXPECT_TRUE(success); }),
+      base::BindOnce([](Status status) { EXPECT_TRUE(status.is_ok()); }),
       base::DoNothing(), base::DoNothing());
 }
 
@@ -148,16 +150,16 @@
   // If we succeedd the first time, it should still be alive.
   if (PreferredShouldSucceed()) {
     EXPECT_CALL(*preferred_decoder_, Initialize_(_, _, _, _, _, _))
-        .WillOnce(RunOnceCallback<3>(true));  // pass initialization
+        .WillOnce(RunOnceCallback<3>(OkStatus()));  // pass initialization
   } else {
     // Otherwise, preferred was deleted, and we only backup still exists.
     EXPECT_CALL(*backup_decoder_, Initialize_(_, _, _, _, _, _))
-        .WillOnce(RunOnceCallback<3>(true));
+        .WillOnce(RunOnceCallback<3>(OkStatus()));
   }
 
   fallback_decoder_->Initialize(
       video_decoder_config_, false, nullptr,
-      base::BindOnce([](bool success) { EXPECT_TRUE(success); }),
+      base::BindOnce([](Status status) { EXPECT_TRUE(status.is_ok()); }),
       base::DoNothing(), base::DoNothing());
 }
 
diff --git a/media/base/media_log.cc b/media/base/media_log.cc
index 7c251e0..babef2ba 100644
--- a/media/base/media_log.cc
+++ b/media/base/media_log.cc
@@ -15,7 +15,7 @@
 namespace media {
 
 const char MediaLog::kEventKey[] = "event";
-const char MediaLog::kMediaErrorText[] = "pipeline_error";
+const char MediaLog::kStatusText[] = "pipeline_error";
 
 // A count of all MediaLogs created in the current process. Used to generate
 // unique IDs.
@@ -60,8 +60,8 @@
 
 void MediaLog::NotifyError(PipelineStatus status) {
   std::unique_ptr<MediaLogRecord> record(
-      CreateRecord(MediaLogRecord::Type::kMediaError));
-  record->params.SetIntPath(MediaLog::kMediaErrorText, status);
+      CreateRecord(MediaLogRecord::Type::kMediaStatus));
+  record->params.SetIntPath(MediaLog::kStatusText, status);
   AddLogRecord(std::move(record));
 }
 
diff --git a/media/base/media_log.h b/media/base/media_log.h
index ebd59b50..9571816 100644
--- a/media/base/media_log.h
+++ b/media/base/media_log.h
@@ -42,7 +42,7 @@
 class MEDIA_EXPORT MediaLog {
  public:
   static const char kEventKey[];
-  static const char kMediaErrorText[];
+  static const char kStatusText[];
 
   // Constructor is protected, see below.
   virtual ~MediaLog();
@@ -78,7 +78,7 @@
     AddLogRecord(std::move(record));
   }
 
-  // TODO(tmathmeyer) replace with MediaError when that's ready.
+  // TODO(tmathmeyer) replace with Status when that's ready.
   void NotifyError(PipelineStatus status);
 
   // Notify the media log that the player is destroyed. Some implementations
@@ -91,7 +91,7 @@
   // Note: The base class definition only produces empty messages. See
   // RenderMediaLog for where this method is meaningful.
   // Inheritors should override GetErrorMessageLocked().
-  // TODO(tmathmeyer) Use a MediaError when that is ready.
+  // TODO(tmathmeyer) Use a media::Status when that is ready.
   std::string GetErrorMessage();
 
   // Getter for |id_|. Used by MojoMediaLogService to construct MediaLogRecords
diff --git a/media/base/media_log_record.h b/media/base/media_log_record.h
index 904279e2..76822114 100644
--- a/media/base/media_log_record.h
+++ b/media/base/media_log_record.h
@@ -37,10 +37,10 @@
     // See media/base/media_log_events.h for info.
     kMediaEventTriggered,
 
-    // TODO(tmathmeyer) use MediaError eventually instead of PipelineStatus
-    kMediaError,
+    // TODO(tmathmeyer) use media::Status eventually instead of PipelineStatus
+    kMediaStatus,
 
-    kMaxValue = kMediaError,
+    kMaxValue = kMediaStatus,
   };
 
   int32_t id;
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index a877447..bc7f518a 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -573,6 +573,10 @@
 const base::Feature kMediaFoundationVideoCapture{
     "MediaFoundationVideoCapture", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enables VP8 decode acceleration for Windows.
+const base::Feature MEDIA_EXPORT kMediaFoundationVP8Decoding{
+    "MediaFoundationVP8Decoding", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables DirectShow GetPhotoState implementation
 // Created to act as a kill switch by disabling it, in the case of the
 // resurgence of https://crbug.com/722038
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 2d163b2..41ecdd4 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -196,6 +196,7 @@
 MEDIA_EXPORT extern const base::Feature kDelayCopyNV12Textures;
 MEDIA_EXPORT extern const base::Feature kMediaFoundationH264Encoding;
 MEDIA_EXPORT extern const base::Feature kMediaFoundationVideoCapture;
+MEDIA_EXPORT extern const base::Feature kMediaFoundationVP8Decoding;
 MEDIA_EXPORT extern const base::Feature kDirectShowGetPhotoState;
 #endif  // defined(OS_WIN)
 
diff --git a/media/base/mock_media_log.cc b/media/base/mock_media_log.cc
index 920a09d..3ae29f6 100644
--- a/media/base/mock_media_log.cc
+++ b/media/base/mock_media_log.cc
@@ -22,10 +22,10 @@
   // event for figuring out media pipeline failures, and just reporting
   // pipeline status as numeric code is not very helpful/user-friendly.
   int error_code = 0;
-  if (event.type == MediaLogRecord::Type::kMediaError &&
-      event.params.GetInteger(media::MediaLog::kMediaErrorText, &error_code)) {
+  if (event.type == MediaLogRecord::Type::kMediaStatus &&
+      event.params.GetInteger(media::MediaLog::kStatusText, &error_code)) {
     PipelineStatus status = static_cast<PipelineStatus>(error_code);
-    return std::string(media::MediaLog::kMediaErrorText) + " " +
+    return std::string(media::MediaLog::kStatusText) + " " +
            PipelineStatusToString(status);
   }
 
diff --git a/media/base/status.h b/media/base/status.h
index 322ec45..c06635b 100644
--- a/media/base/status.h
+++ b/media/base/status.h
@@ -40,12 +40,12 @@
 // successful returns.
 class MEDIA_EXPORT Status {
  public:
-  // Default constructor can be used for Status::Ok();
+  // Default constructor can be used for OkStatus();
   Status();
 
   // Constructor to create a new Status from a numeric code & message.
   // These are immutable; if you'd like to change them, then you likely should
-  // create a new Status. {} or Status::Ok() should be used to create a
+  // create a new Status. {} or OkStatus() should be used to create a
   // success status.
   // NOTE: This should never be given a location parameter when called - It is
   // defaulted in order to grab the caller location.
@@ -136,7 +136,6 @@
   friend struct internal::MediaSerializer<Status>;
 
   // Allow mojo-serialization
-  friend struct std::allocator<Status>;
   friend struct mojo::StructTraits<media::mojom::StatusDataView, Status>;
 
   // A null internals is an implicit OK.
@@ -148,14 +147,6 @@
 // if they are added.
 MEDIA_EXPORT Status OkStatus();
 
-// We need this two step macro to allow calling with no extra args - in a single
-// step macro we would have no way of removing the trailing comma after the
-// code.
-#define STATUS(CODE_TRUNC, ...) \
-  STATUS_INTERNAL(::media::StatusCode::CODE_TRUNC, ##__VA_ARGS__)
-
-#define STATUS_INTERNAL(...) ::media::Status(__VA_ARGS__)
-
 // Helper class to allow returning a |T| or a Status.  Typical usage:
 //
 // ErrorOr<std::unique_ptr<MyObject>> FactoryFn() {
diff --git a/media/base/status_codes.cc b/media/base/status_codes.cc
new file mode 100644
index 0000000..2aba1c20
--- /dev/null
+++ b/media/base/status_codes.cc
@@ -0,0 +1,15 @@
+// Copyright 2020 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.
+
+#include "media/base/status_codes.h"
+
+namespace media {
+
+// TODO(tmathmeyer) consider a way to get the names, since we don't have
+// the easy c++20 way yet.
+std::ostream& operator<<(std::ostream& os, const StatusCode& code) {
+  return os << std::hex << static_cast<StatusCodeType>(code);
+}
+
+}  // namespace media
diff --git a/media/base/status_codes.h b/media/base/status_codes.h
index 7a274fc..ccac030 100644
--- a/media/base/status_codes.h
+++ b/media/base/status_codes.h
@@ -5,10 +5,18 @@
 #ifndef MEDIA_BASE_STATUS_CODES_H_
 #define MEDIA_BASE_STATUS_CODES_H_
 
+#include <cstdint>
+#include <limits>
+#include <ostream>
+
+#include "media/base/media_export.h"
+
 namespace media {
 
-// NOTE: These numbers are still subject to change.  Do not use for things like
-// UMA yet!
+using StatusCodeType = int32_t;
+// TODO(tmathmeyer, liberato, xhwang) These numbers are not yet finalized:
+// DO NOT use them for reporting statistics, and DO NOT report them to any
+// user-facing feature, including media log.
 
 // Codes are grouped with a bitmask:
 // 0xFFFFFFFF
@@ -16,7 +24,7 @@
 //     │ └─ group code
 //     └─ reserved for now
 // 256 groups is more than anyone will ever need on a computer.
-enum class StatusCode : int32_t {
+enum class StatusCode : StatusCodeType {
   kOk = 0,
 
   // Decoder Errors: 0x01
@@ -24,21 +32,50 @@
   kDecoderFailedDecode = 0x00000102,
   kDecoderUnsupportedProfile = 0x00000103,
   kDecoderUnsupportedCodec = 0x00000104,
+  kDecoderUnsupportedConfig = 0x00000105,
+  kEncryptedContentUnsupported = 0x00000106,
+  kClearContentUnsupported = 0x00000107,
+  kDecoderMissingCdmForEncryptedContent = 0x00000108,
+  kDecoderFailedConfigure = 0x00000109,
+  kDecoderCantChangeCodec = 0x0000010A,
+  kDecoderFailedCreation = 0x0000010B,
+  kInitializationUnspecifiedFailure = 0x0000010C,
 
   // Windows Errors: 0x02
   kWindowsWrappedHresult = 0x00000201,
   kWindowsApiNotAvailible = 0x00000202,
 
   // D3D11VideoDecoder Errors: 0x03
-  kCannotMakeContextCurrent = 0x00000301,
-  kCouldNotPostTexture = 0x00000302,
-  kCouldNotPostAcquireStream = 0x00000303,
+  kCantMakeContextCurrent = 0x00000301,
+  kCantPostTexture = 0x00000302,
+  kCantPostAcquireStream = 0x00000303,
 
-  // Reserved errors
-  kCodeOnlyForTesting = std::numeric_limits<int32_t>::max(),
+  // MojoDecoder Errors: 0x04
+  kMojoDecoderNoWrappedDecoder = 0x00000401,
+  kMojoDecoderStoppedBeforeInitDone = 0x00000402,
+  kMojoDecoderUnsupported = 0x00000403,
+  kMojoDecoderNoConnection = 0x00000404,
+  kMojoDecoderDeletedWithoutInitialization = 0x00000405,
+
+  // Chromeos Errors: 0x05
+  kChromeOSVideoDecoderNoDecoders = 0x00000501,
+  kV4l2NoDevice = 0x00000502,
+  kV4l2FailedToStopStreamQueue = 0x00000503,
+  kV4l2NoDecoder = 0x00000504,
+  kV4l2FailedFileCapabilitiesCheck = 0x00000505,
+  kV4l2FailedResourceAllocation = 0x00000506,
+  kV4l2BadFormat = 0x00000507,
+  kVaapiReinitializedDuringDecode = 0x00000508,
+  kVaapiFailedAcceleratorCreation = 0x00000509,
+
+  // Special codes
+  kGenericErrorPleaseRemove = 0x99999999,
+  kCodeOnlyForTesting = std::numeric_limits<StatusCodeType>::max(),
   kMaxValue = kCodeOnlyForTesting,
 };
 
+MEDIA_EXPORT std::ostream& operator<<(std::ostream& os, const StatusCode& code);
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_STATUS_CODES_H_
diff --git a/media/base/status_unittest.cc b/media/base/status_unittest.cc
index fa0cf3c..b9e6604c 100644
--- a/media/base/status_unittest.cc
+++ b/media/base/status_unittest.cc
@@ -38,7 +38,9 @@
  public:
   Status DontFail() { return OkStatus(); }
 
-  Status FailEasily() { return STATUS(kCodeOnlyForTesting, "Message"); }
+  Status FailEasily() {
+    return Status(StatusCode::kCodeOnlyForTesting, "Message");
+  }
 
   Status FailRecursively(unsigned int count) {
     if (!count) {
@@ -92,7 +94,7 @@
   ASSERT_EQ(stack[0].DictSize(), 2ul);  // line and file
 
   // This is a bit fragile, since it's dependent on the file layout.
-  ASSERT_EQ(stack[0].FindIntPath("line").value_or(-1), 41);
+  ASSERT_EQ(stack[0].FindIntPath("line").value_or(-1), 42);
   ASSERT_THAT(*stack[0].FindStringPath("file"),
               HasSubstr("status_unittest.cc"));
 }
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index 3ab765b6..1dc9995 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -19,6 +19,7 @@
 #include "media/base/media_log.h"
 #include "media/base/pipeline_status.h"
 #include "media/base/sample_format.h"
+#include "media/base/status.h"
 #include "media/base/video_decoder_config.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/gfx/geometry/size.h"
@@ -199,6 +200,20 @@
 std::unique_ptr<::testing::StrictMock<MockDemuxerStream>>
 CreateMockDemuxerStream(DemuxerStream::Type type, bool encrypted);
 
+// Compares two media::Status by StatusCode only.
+MATCHER_P(SameStatusCode, status, "") {
+  return arg.code() == status.code();
+}
+
+// Compares two an |arg| Status to a StatusCode provided
+MATCHER_P(HasStatusCode, statusCode, "") {
+  return arg.code() == statusCode;
+}
+
+MATCHER(IsOkStatus, "") {
+  return arg.is_ok();
+}
+
 // Compares two {Audio|Video}DecoderConfigs
 MATCHER_P(DecoderConfigEq, config, "") {
   return arg.Matches(config);
diff --git a/media/base/video_decoder.h b/media/base/video_decoder.h
index 52753e8..bbb0b11 100644
--- a/media/base/video_decoder.h
+++ b/media/base/video_decoder.h
@@ -13,6 +13,7 @@
 #include "media/base/decode_status.h"
 #include "media/base/media_export.h"
 #include "media/base/pipeline_status.h"
+#include "media/base/status.h"
 #include "media/base/waiting.h"
 #include "ui/gfx/geometry/size.h"
 
@@ -26,7 +27,7 @@
 class MEDIA_EXPORT VideoDecoder {
  public:
   // Callback for VideoDecoder initialization.
-  using InitCB = base::OnceCallback<void(bool success)>;
+  using InitCB = base::OnceCallback<void(Status status)>;
 
   // Callback for VideoDecoder to return a decoded frame whenever it becomes
   // available. Only non-EOS frames should be returned via this callback.
diff --git a/media/base/video_thumbnail_decoder.cc b/media/base/video_thumbnail_decoder.cc
index 86bc0fc8..130813a 100644
--- a/media/base/video_thumbnail_decoder.cc
+++ b/media/base/video_thumbnail_decoder.cc
@@ -36,8 +36,8 @@
       base::DoNothing());
 }
 
-void VideoThumbnailDecoder::OnVideoDecoderInitialized(bool success) {
-  if (!success) {
+void VideoThumbnailDecoder::OnVideoDecoderInitialized(Status status) {
+  if (!status.is_ok()) {
     NotifyComplete(nullptr);
     return;
   }
diff --git a/media/base/video_thumbnail_decoder.h b/media/base/video_thumbnail_decoder.h
index 363006f..69f0c4f 100644
--- a/media/base/video_thumbnail_decoder.h
+++ b/media/base/video_thumbnail_decoder.h
@@ -38,7 +38,7 @@
   void Start(VideoFrameCallback video_frame_callback);
 
  private:
-  void OnVideoDecoderInitialized(bool success);
+  void OnVideoDecoderInitialized(Status status);
   void OnVideoBufferDecoded(DecodeStatus status);
   void OnEosBufferDecoded(DecodeStatus status);
 
diff --git a/media/base/video_thumbnail_decoder_unittest.cc b/media/base/video_thumbnail_decoder_unittest.cc
index 57550ae1..93e3433 100644
--- a/media/base/video_thumbnail_decoder_unittest.cc
+++ b/media/base/video_thumbnail_decoder_unittest.cc
@@ -85,8 +85,8 @@
 TEST_F(VideoThumbnailDecoderTest, Success) {
   auto expected_frame = CreateFrame();
   EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
-      .WillOnce(
-          DoAll(RunOnceCallback<3>(true), RunCallback<4>(expected_frame)));
+      .WillOnce(DoAll(RunOnceCallback<3>(OkStatus()),
+                      RunCallback<4>(expected_frame)));
   EXPECT_CALL(*mock_video_decoder(), Decode_(_, _))
       .Times(2)
       .WillRepeatedly(RunOnceCallback<1>(DecodeStatus::OK));
@@ -99,7 +99,7 @@
 TEST_F(VideoThumbnailDecoderTest, InitializationFailed) {
   auto expected_frame = CreateFrame();
   EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
-      .WillOnce(RunOnceCallback<3>(false));
+      .WillOnce(RunOnceCallback<3>(StatusCode::kCodeOnlyForTesting));
 
   Start();
   EXPECT_FALSE(frame());
@@ -109,7 +109,7 @@
 TEST_F(VideoThumbnailDecoderTest, DecodingFailed) {
   auto expected_frame = CreateFrame();
   EXPECT_CALL(*mock_video_decoder(), Initialize_(_, _, _, _, _, _))
-      .WillOnce(RunOnceCallback<3>(true));
+      .WillOnce(RunOnceCallback<3>(OkStatus()));
   EXPECT_CALL(*mock_video_decoder(), Decode_(_, _))
       .WillOnce(RunOnceCallback<1>(DecodeStatus::DECODE_ERROR));
 
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index e4c520de..993bcb7 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -272,7 +272,7 @@
   if (bytes <= 0)
     return;
   auto full_name =
-      base::StringPrintf("media/webmediaplayer/player_%d/%s", id, name);
+      base::StringPrintf("media/webmediaplayer/%s/player_%d", name, id);
   auto* dump = pmd->CreateAllocatorDump(full_name);
 
   dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
@@ -3212,23 +3212,6 @@
   const int64_t delta = current_memory_usage - last_reported_memory_usage_;
   last_reported_memory_usage_ = current_memory_usage;
   adjust_allocated_memory_cb_.Run(delta);
-
-  if (HasAudio()) {
-    UMA_HISTOGRAM_MEMORY_KB("Media.WebMediaPlayerImpl.Memory.Audio",
-                            stats.audio_memory_usage / 1024);
-  }
-  if (HasVideo()) {
-    UMA_HISTOGRAM_MEMORY_KB("Media.WebMediaPlayerImpl.Memory.Video",
-                            video_memory_usage / 1024);
-  }
-  if (data_source_) {
-    UMA_HISTOGRAM_MEMORY_KB("Media.WebMediaPlayerImpl.Memory.DataSource",
-                            data_source_memory_usage / 1024);
-  }
-  if (demuxer_) {
-    UMA_HISTOGRAM_MEMORY_KB("Media.WebMediaPlayerImpl.Memory.Demuxer",
-                            demuxer_memory_usage / 1024);
-  }
 }
 
 void WebMediaPlayerImpl::OnMainThreadMemoryDump(
@@ -3237,13 +3220,13 @@
   const PipelineStatistics stats = GetPipelineStatistics();
 
   bool suspended = pipeline_controller_->IsPipelineSuspended();
-  auto parent_dump_name =
+  auto state_node_name =
       base::StringPrintf("media/webmediaplayer/player_%d", id);
   auto player_state =
       base::StringPrintf("Paused: %d Ended: %d ReadyState: %d Suspended: %d",
                          paused_, ended_, GetReadyState(), suspended);
-  auto* parent_dump = pmd->CreateAllocatorDump(parent_dump_name);
-  parent_dump->AddString("player_state", "", player_state);
+  auto* state_node = pmd->CreateAllocatorDump(state_node_name);
+  state_node->AddString("player_state", "", player_state);
 
   CreateAllocation(pmd, id, "audio", stats.audio_memory_usage);
   CreateAllocation(pmd, id, "video", stats.video_memory_usage);
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index 40930131..1b49182 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -2092,7 +2092,7 @@
 
         for (const char* name : allocations) {
           auto it = dumps.find(base::StringPrintf(
-              "media/webmediaplayer/player_%d/%s", ctx->id, name));
+              "media/webmediaplayer/%s/player_%d", name, ctx->id));
           ASSERT_NE(dumps.end(), it) << name;
           ASSERT_GT(it->second->GetSizeInternal(), 0u) << name;
         }
diff --git a/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc
index 1d75154..769d8ba 100644
--- a/media/cast/sender/h264_vt_encoder_unittest.cc
+++ b/media/cast/sender/h264_vt_encoder_unittest.cc
@@ -60,8 +60,8 @@
 // See comment in end2end_unittest.cc for details on this value.
 const double kVideoAcceptedPSNR = 38.0;
 
-void SaveDecoderInitResult(bool* out_result, bool in_result) {
-  *out_result = in_result;
+void SaveDecoderInitResult(bool* out_result, ::media::Status in_result) {
+  *out_result = in_result.is_ok();
 }
 
 void SaveOperationalStatus(OperationalStatus* out_status,
diff --git a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
index b27399b9..35a9c0d 100644
--- a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
+++ b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
@@ -177,7 +177,7 @@
   ~VideoDecoderAdapter() final = default;
 
   // CdmVideoDecoder implementation.
-  bool Initialize(const cdm::VideoDecoderConfig_3& config) final {
+  Status Initialize(const cdm::VideoDecoderConfig_3& config) final {
     auto clear_config = ToClearMediaVideoDecoderConfig(config);
     DVLOG(1) << __func__ << ": " << clear_config.AsHumanReadableString();
     DCHECK(!last_init_result_.has_value());
@@ -195,7 +195,7 @@
         /* waiting_cb = */ base::DoNothing());
     run_loop.Run();
 
-    auto result = last_init_result_.value();
+    auto result = std::move(last_init_result_.value());
     last_init_result_.reset();
 
     return result;
@@ -251,10 +251,10 @@
   }
 
  private:
-  void OnInitialized(base::OnceClosure quit_closure, bool success) {
-    DVLOG(1) << __func__ << " success = " << success;
+  void OnInitialized(base::OnceClosure quit_closure, Status status) {
+    DVLOG(1) << __func__ << " success = " << status.is_ok();
     DCHECK(!last_init_result_.has_value());
-    last_init_result_ = success;
+    last_init_result_ = std::move(status);
     std::move(quit_closure).Run();
   }
 
@@ -283,7 +283,7 @@
 
   // Results of |video_decoder_| operations. Set iff the callback of the
   // operation has been called.
-  base::Optional<bool> last_init_result_;
+  base::Optional<Status> last_init_result_;
   base::Optional<DecodeStatus> last_decode_status_;
 
   // Queue of decoded video frames.
diff --git a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h
index efba0a0..7346d330 100644
--- a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h
+++ b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.h
@@ -11,6 +11,7 @@
 
 #include "base/memory/ref_counted.h"
 #include "media/base/decoder_buffer.h"
+#include "media/base/status.h"
 #include "media/cdm/api/content_decryption_module.h"
 
 namespace media {
@@ -22,7 +23,7 @@
   using CdmVideoFrame = cdm::VideoFrame_2;
 
   virtual ~CdmVideoDecoder() {}
-  virtual bool Initialize(const cdm::VideoDecoderConfig_3& config) = 0;
+  virtual Status Initialize(const cdm::VideoDecoderConfig_3& config) = 0;
   virtual void Deinitialize() = 0;
   virtual void Reset() = 0;
   virtual cdm::Status Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc b/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc
index 0d253ed..4d3c278 100644
--- a/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc
+++ b/media/cdm/library_cdm/clear_key_cdm/clear_key_cdm.cc
@@ -677,7 +677,7 @@
       return cdm::kInitializationError;
   }
 
-  if (!video_decoder_->Initialize(video_decoder_config))
+  if (!video_decoder_->Initialize(video_decoder_config).is_ok())
     return cdm::kInitializationError;
 
   return cdm::kSuccess;
diff --git a/media/filters/android/media_codec_audio_decoder.cc b/media/filters/android/media_codec_audio_decoder.cc
index c88bcab..5b704bc5 100644
--- a/media/filters/android/media_codec_audio_decoder.cc
+++ b/media/filters/android/media_codec_audio_decoder.cc
@@ -18,6 +18,7 @@
 #include "media/base/audio_timestamp_helper.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/cdm_context.h"
+#include "media/base/status.h"
 #include "media/base/timestamp_constants.h"
 #include "media/formats/ac3/ac3_util.h"
 
@@ -87,7 +88,8 @@
 
   if (state_ == STATE_ERROR) {
     DVLOG(1) << "Decoder is in error state.";
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
@@ -99,7 +101,8 @@
       config.codec() == kCodecOpus || is_passthrough_;
   if (!is_codec_supported) {
     DVLOG(1) << "Unsuported codec " << GetCodecName(config.codec());
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderUnsupportedCodec);
     return;
   }
 
@@ -118,7 +121,8 @@
       LOG(ERROR) << "The stream is encrypted but there is no CdmContext or "
                     "MediaCryptoContext is not supported";
       SetState(STATE_ERROR);
-      BindToCurrentLoop(std::move(init_cb)).Run(false);
+      BindToCurrentLoop(std::move(init_cb))
+          .Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
       return;
     }
 
@@ -130,12 +134,13 @@
   }
 
   if (!CreateMediaCodecLoop()) {
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
   SetState(STATE_READY);
-  BindToCurrentLoop(std::move(init_cb)).Run(true);
+  BindToCurrentLoop(std::move(init_cb)).Run(OkStatus());
 }
 
 bool MediaCodecAudioDecoder::CreateMediaCodecLoop() {
@@ -270,7 +275,7 @@
   if (media_crypto->is_null()) {
     LOG(ERROR) << "MediaCrypto is not available, can't play encrypted stream.";
     SetState(STATE_UNINITIALIZED);
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
@@ -283,12 +288,12 @@
   // After receiving |media_crypto_| we can configure MediaCodec.
   if (!CreateMediaCodecLoop()) {
     SetState(STATE_UNINITIALIZED);
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
   SetState(STATE_READY);
-  std::move(init_cb).Run(true);
+  std::move(init_cb).Run(OkStatus());
 }
 
 bool MediaCodecAudioDecoder::IsAnyInputPending() const {
diff --git a/media/filters/audio_decoder_stream_unittest.cc b/media/filters/audio_decoder_stream_unittest.cc
index 2a96da1..57c78f80 100644
--- a/media/filters/audio_decoder_stream_unittest.cc
+++ b/media/filters/audio_decoder_stream_unittest.cc
@@ -98,8 +98,8 @@
   std::vector<std::unique_ptr<AudioDecoder>> CreateMockAudioDecoder() {
     auto decoder = std::make_unique<MockAudioDecoder>();
     EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
-        .WillOnce(
-            DoAll(SaveArg<3>(&decoder_output_cb_), RunOnceCallback<2>(true)));
+        .WillOnce(DoAll(SaveArg<3>(&decoder_output_cb_),
+                        RunOnceCallback<2>(OkStatus())));
     decoder_ = decoder.get();
 
     std::vector<std::unique_ptr<AudioDecoder>> result;
@@ -108,7 +108,7 @@
   }
 
   void OnAudioBufferReadDone(base::OnceClosure closure,
-                             AudioDecoderStream::Status status,
+                             AudioDecoderStream::ReadStatus status,
                              scoped_refptr<AudioBuffer> audio_buffer) {
     std::move(closure).Run();
   }
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc
index 49ae5b8..d46d4c6 100644
--- a/media/filters/audio_decoder_unittest.cc
+++ b/media/filters/audio_decoder_unittest.cc
@@ -247,7 +247,12 @@
   void InitializeDecoderWithResult(const AudioDecoderConfig& config,
                                    bool success) {
     decoder_->Initialize(
-        config, nullptr, NewExpectedBoolCB(success),
+        config, nullptr,
+        base::BindOnce(
+            [](bool success, Status status) {
+              EXPECT_EQ(status.is_ok(), success);
+            },
+            success),
         base::Bind(&AudioDecoderTest::OnDecoderOutput, base::Unretained(this)),
         base::DoNothing());
     base::RunLoop().RunUntilIdle();
diff --git a/media/filters/dav1d_video_decoder.cc b/media/filters/dav1d_video_decoder.cc
index 27a40dde..22a9ab8 100644
--- a/media/filters/dav1d_video_decoder.cc
+++ b/media/filters/dav1d_video_decoder.cc
@@ -155,8 +155,15 @@
 
   InitCB bound_init_cb = bind_callbacks_ ? BindToCurrentLoop(std::move(init_cb))
                                          : std::move(init_cb);
-  if (config.is_encrypted() || config.codec() != kCodecAV1) {
-    std::move(bound_init_cb).Run(false);
+  if (config.is_encrypted()) {
+    std::move(bound_init_cb).Run(StatusCode::kEncryptedContentUnsupported);
+    return;
+  }
+
+  if (config.codec() != kCodecAV1) {
+    std::move(bound_init_cb)
+        .Run(Status(StatusCode::kDecoderUnsupportedCodec)
+                 .WithData("codec", config.codec()));
     return;
   }
 
@@ -213,15 +220,16 @@
   // Set a maximum frame size limit to avoid OOM'ing fuzzers.
   s.frame_size_limit = limits::kMaxCanvas;
 
+  // TODO(tmathmeyer) write the dav1d error into the data for the media error.
   if (dav1d_open(&dav1d_decoder_, &s) < 0) {
-    std::move(bound_init_cb).Run(false);
+    std::move(bound_init_cb).Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
   config_ = config;
   state_ = DecoderState::kNormal;
   output_cb_ = output_cb;
-  std::move(bound_init_cb).Run(true);
+  std::move(bound_init_cb).Run(OkStatus());
 }
 
 void Dav1dVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/dav1d_video_decoder_unittest.cc b/media/filters/dav1d_video_decoder_unittest.cc
index 188f7c2..bfe9fc8 100644
--- a/media/filters/dav1d_video_decoder_unittest.cc
+++ b/media/filters/dav1d_video_decoder_unittest.cc
@@ -51,7 +51,12 @@
                                       bool success) {
     decoder_->Initialize(
         config, true,  // Use low delay so we get 1 frame out for each frame in.
-        nullptr, NewExpectedBoolCB(success),
+        nullptr,
+        base::BindOnce(
+            [](bool success, Status status) {
+              EXPECT_EQ(status.is_ok(), success);
+            },
+            success),
         base::BindRepeating(&Dav1dVideoDecoderTest::FrameReady,
                             base::Unretained(this)),
         base::NullCallback());
diff --git a/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc
index baed077..78d20de 100644
--- a/media/filters/decoder_selector.cc
+++ b/media/filters/decoder_selector.cc
@@ -159,12 +159,12 @@
 }
 
 template <DemuxerStream::Type StreamType>
-void DecoderSelector<StreamType>::OnDecoderInitializeDone(bool success) {
+void DecoderSelector<StreamType>::OnDecoderInitializeDone(Status status) {
   DVLOG(2) << __func__ << ": " << decoder_->GetDisplayName()
-           << " success=" << success;
+           << " success=" << std::hex << status.code();
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  if (!success) {
+  if (!status.is_ok()) {
     // Try the next decoder on the list.
     decoder_.reset();
     InitializeDecoder();
diff --git a/media/filters/decoder_selector.h b/media/filters/decoder_selector.h
index 5ff713c..b7e4326 100644
--- a/media/filters/decoder_selector.h
+++ b/media/filters/decoder_selector.h
@@ -93,7 +93,7 @@
 
  private:
   void InitializeDecoder();
-  void OnDecoderInitializeDone(bool success);
+  void OnDecoderInitializeDone(Status status);
   void ReturnNullDecoder();
   void InitializeDecryptingDemuxerStream();
   void OnDecryptingDemuxerStreamInitializeDone(PipelineStatus status);
diff --git a/media/filters/decoder_selector_unittest.cc b/media/filters/decoder_selector_unittest.cc
index 092b57bc..cd94e12d 100644
--- a/media/filters/decoder_selector_unittest.cc
+++ b/media/filters/decoder_selector_unittest.cc
@@ -52,16 +52,16 @@
   kAlwaysSucceed,
 };
 
-bool IsConfigSupported(DecoderCapability capability, bool is_encrypted) {
+Status IsConfigSupported(DecoderCapability capability, bool is_encrypted) {
   switch (capability) {
     case kAlwaysFail:
-      return false;
+      return StatusCode::kCodeOnlyForTesting;
     case kClearOnly:
-      return !is_encrypted;
+      return is_encrypted ? StatusCode::kCodeOnlyForTesting : OkStatus();
     case kEncryptedOnly:
-      return is_encrypted;
+      return is_encrypted ? OkStatus() : StatusCode::kCodeOnlyForTesting;
     case kAlwaysSucceed:
-      return true;
+      return OkStatus();
   }
 }
 
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc
index d2c6884..ae43bb4 100644
--- a/media/filters/decoder_stream.cc
+++ b/media/filters/decoder_stream.cc
@@ -79,7 +79,8 @@
 }
 
 template <DemuxerStream::Type StreamType>
-const char* GetStatusString(typename DecoderStream<StreamType>::Status status) {
+const char* GetStatusString(
+    typename DecoderStream<StreamType>::ReadStatus status) {
   switch (status) {
     case DecoderStream<StreamType>::OK:
       return "okay";
@@ -420,7 +421,7 @@
 }
 
 template <DemuxerStream::Type StreamType>
-void DecoderStream<StreamType>::SatisfyRead(Status status,
+void DecoderStream<StreamType>::SatisfyRead(ReadStatus status,
                                             scoped_refptr<Output> output) {
   DCHECK(read_cb_);
   TRACE_EVENT_ASYNC_END1("media", GetReadTraceString<StreamType>(), this,
@@ -835,8 +836,8 @@
 }
 
 template <DemuxerStream::Type StreamType>
-void DecoderStream<StreamType>::OnDecoderReinitialized(bool success) {
-  FUNCTION_DVLOG(2) << ": success = " << success;
+void DecoderStream<StreamType>::OnDecoderReinitialized(Status status) {
+  FUNCTION_DVLOG(2) << ": success = " << status.is_ok();
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK_EQ(state_, STATE_REINITIALIZING_DECODER);
 
@@ -846,7 +847,7 @@
   // Also, Reset() can be called during pending ReinitializeDecoder().
   // This function needs to handle them all!
 
-  if (!success) {
+  if (!status.is_ok()) {
     // Reinitialization failed. Try to fall back to one of the remaining
     // decoders. This will consume at least one decoder so doing it more than
     // once is safe.
diff --git a/media/filters/decoder_stream.h b/media/filters/decoder_stream.h
index 7bc002c0..a29bbf08 100644
--- a/media/filters/decoder_stream.h
+++ b/media/filters/decoder_stream.h
@@ -45,7 +45,7 @@
   using Output = typename StreamTraits::OutputType;
   using DecoderConfig = typename StreamTraits::DecoderConfigType;
 
-  enum Status {
+  enum ReadStatus {
     OK,                    // Everything went as planned.
     ABORTED,               // Read aborted due to Reset() during pending read.
     DEMUXER_READ_ABORTED,  // Demuxer returned aborted read.
@@ -60,7 +60,7 @@
   using InitCB = base::OnceCallback<void(bool success)>;
 
   // Indicates completion of a DecoderStream read.
-  using ReadCB = base::OnceCallback<void(Status, scoped_refptr<Output>)>;
+  using ReadCB = base::OnceCallback<void(ReadStatus, scoped_refptr<Output>)>;
 
   DecoderStream(std::unique_ptr<DecoderStreamTraits<StreamType>> traits,
                 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
@@ -175,7 +175,7 @@
       std::unique_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream);
 
   // Satisfy pending |read_cb_| with |status| and |output|.
-  void SatisfyRead(Status status, scoped_refptr<Output> output);
+  void SatisfyRead(ReadStatus status, scoped_refptr<Output> output);
 
   // Decodes |buffer| and returns the result via OnDecodeOutputReady().
   // Saves |buffer| into |pending_buffers_| if appropriate.
@@ -207,7 +207,7 @@
   void ReinitializeDecoder();
 
   // Callback for Decoder reinitialization.
-  void OnDecoderReinitialized(bool success);
+  void OnDecoderReinitialized(Status status);
 
   void CompleteDecoderReinitialization(bool success);
 
diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc
index 175b8b3..cbc4645 100644
--- a/media/filters/decrypting_audio_decoder.cc
+++ b/media/filters/decrypting_audio_decoder.cc
@@ -57,12 +57,12 @@
   if (!cdm_context) {
     // Once we have a CDM context, one should always be present.
     DCHECK(!support_clear_content_);
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
   if (!config.is_encrypted() && !support_clear_content_) {
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kClearContentUnsupported);
     return;
   }
 
@@ -79,7 +79,7 @@
   // TODO(xhwang): We should be able to DCHECK config.IsValidConfig().
   if (!config.IsValidConfig()) {
     DLOG(ERROR) << "Invalid audio stream config.";
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kDecoderUnsupportedCodec);
     return;
   }
 
@@ -88,7 +88,7 @@
   if (state_ == kUninitialized) {
     if (!cdm_context->GetDecryptor()) {
       DVLOG(1) << __func__ << ": no decryptor";
-      std::move(init_cb_).Run(false);
+      std::move(init_cb_).Run(StatusCode::kDecoderFailedConfigure);
       return;
     }
 
@@ -172,11 +172,11 @@
 
   if (decryptor_) {
     decryptor_->DeinitializeDecoder(Decryptor::kAudio);
-    decryptor_ = NULL;
+    decryptor_ = nullptr;
   }
   pending_buffer_to_decode_.reset();
   if (init_cb_)
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kDecoderInitializeNeverCompleted);
   if (decode_cb_)
     std::move(decode_cb_).Run(DecodeStatus::ABORTED);
   if (reset_cb_)
@@ -200,8 +200,8 @@
 
   if (!success) {
     DVLOG(1) << __func__ << ": failed to init audio decoder on decryptor";
-    std::move(init_cb_).Run(false);
-    decryptor_ = NULL;
+    std::move(init_cb_).Run(StatusCode::kDecoderInitializeNeverCompleted);
+    decryptor_ = nullptr;
     state_ = kError;
     return;
   }
@@ -215,7 +215,7 @@
                              &DecryptingAudioDecoder::OnKeyAdded, weak_this_)));
 
   state_ = kIdle;
-  std::move(init_cb_).Run(true);
+  std::move(init_cb_).Run(OkStatus());
 }
 
 void DecryptingAudioDecoder::DecodePendingBuffer() {
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index 8a485929..c364c73 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -83,7 +83,12 @@
         kNoTimestamp);
     decoded_frame_list_.push_back(decoded_frame_);
 
-    decoder_->Initialize(config, cdm_context_.get(), NewExpectedBoolCB(success),
+    decoder_->Initialize(config, cdm_context_.get(),
+                         base::BindOnce(
+                             [](bool success, Status status) {
+                               EXPECT_EQ(status.is_ok(), success);
+                             },
+                             success),
                          base::Bind(&DecryptingAudioDecoderTest::FrameReady,
                                     base::Unretained(this)),
                          base::Bind(&DecryptingAudioDecoderTest::OnWaiting,
@@ -121,12 +126,13 @@
         .WillOnce(RunOnceCallback<1>(true));
     EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
         .WillOnce(SaveArg<1>(&key_added_cb_));
-    decoder_->Initialize(new_config, cdm_context_.get(),
-                         NewExpectedBoolCB(true),
-                         base::Bind(&DecryptingAudioDecoderTest::FrameReady,
-                                    base::Unretained(this)),
-                         base::Bind(&DecryptingAudioDecoderTest::OnWaiting,
-                                    base::Unretained(this)));
+    decoder_->Initialize(
+        new_config, cdm_context_.get(),
+        base::BindOnce([](Status status) { EXPECT_TRUE(status.is_ok()); }),
+        base::Bind(&DecryptingAudioDecoderTest::FrameReady,
+                   base::Unretained(this)),
+        base::Bind(&DecryptingAudioDecoderTest::OnWaiting,
+                   base::Unretained(this)));
   }
 
   // Decode |buffer| and expect DecodeDone to get called with |status|.
diff --git a/media/filters/decrypting_video_decoder.cc b/media/filters/decrypting_video_decoder.cc
index e9a9327..7719bcf9 100644
--- a/media/filters/decrypting_video_decoder.cc
+++ b/media/filters/decrypting_video_decoder.cc
@@ -50,12 +50,12 @@
   if (!cdm_context) {
     // Once we have a CDM context, one should always be present.
     DCHECK(!support_clear_content_);
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
   if (!config.is_encrypted() && !support_clear_content_) {
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kClearContentUnsupported);
     return;
   }
 
@@ -73,7 +73,7 @@
   if (state_ == kUninitialized) {
     if (!cdm_context->GetDecryptor()) {
       DVLOG(1) << __func__ << ": no decryptor";
-      std::move(init_cb_).Run(false);
+      std::move(init_cb_).Run(StatusCode::kDecoderFailedConfigure);
       return;
     }
 
@@ -164,11 +164,11 @@
 
   if (decryptor_) {
     decryptor_->DeinitializeDecoder(Decryptor::kVideo);
-    decryptor_ = NULL;
+    decryptor_ = nullptr;
   }
   pending_buffer_to_decode_.reset();
   if (init_cb_)
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kDecoderInitializeNeverCompleted);
   if (decode_cb_)
     std::move(decode_cb_).Run(DecodeStatus::ABORTED);
   if (reset_cb_)
@@ -185,8 +185,8 @@
 
   if (!success) {
     DVLOG(1) << __func__ << ": failed to init video decoder on decryptor";
-    std::move(init_cb_).Run(false);
-    decryptor_ = NULL;
+    std::move(init_cb_).Run(StatusCode::kDecoderInitializeNeverCompleted);
+    decryptor_ = nullptr;
     state_ = kError;
     return;
   }
@@ -197,7 +197,7 @@
 
   // Success!
   state_ = kIdle;
-  std::move(init_cb_).Run(true);
+  std::move(init_cb_).Run(OkStatus());
 }
 
 void DecryptingVideoDecoder::DecodePendingBuffer() {
@@ -241,7 +241,7 @@
     return;
   }
 
-  DCHECK_EQ(status == Decryptor::kSuccess, frame.get() != NULL);
+  DCHECK_EQ(status == Decryptor::kSuccess, frame.get() != nullptr);
 
   if (status == Decryptor::kError) {
     DVLOG(2) << "DeliverFrame() - kError";
diff --git a/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc
index d855bd5..df6cabff 100644
--- a/media/filters/decrypting_video_decoder_unittest.cc
+++ b/media/filters/decrypting_video_decoder_unittest.cc
@@ -79,7 +79,11 @@
   void InitializeAndExpectResult(const VideoDecoderConfig& config,
                                  bool success) {
     decoder_->Initialize(config, false, cdm_context_.get(),
-                         NewExpectedBoolCB(success),
+                         base::BindOnce(
+                             [](bool success, Status status) {
+                               EXPECT_EQ(status.is_ok(), success);
+                             },
+                             success),
                          base::Bind(&DecryptingVideoDecoderTest::FrameReady,
                                     base::Unretained(this)),
                          base::Bind(&DecryptingVideoDecoderTest::OnWaiting,
diff --git a/media/filters/fake_video_decoder.cc b/media/filters/fake_video_decoder.cc
index c7fc9f754..144394e 100644
--- a/media/filters/fake_video_decoder.cc
+++ b/media/filters/fake_video_decoder.cc
@@ -83,18 +83,18 @@
   if (config.is_encrypted() && (!supports_encrypted_config_ || !cdm_context)) {
     DVLOG(1) << "Encrypted config not supported.";
     state_ = STATE_NORMAL;
-    init_cb_.RunOrHold(false);
+    init_cb_.RunOrHold(StatusCode::kEncryptedContentUnsupported);
     return;
   }
 
   if (fail_to_initialize_) {
     DVLOG(1) << decoder_name_ << ": Initialization failed.";
     state_ = STATE_ERROR;
-    init_cb_.RunOrHold(false);
+    init_cb_.RunOrHold(StatusCode::kDecoderInitializeNeverCompleted);
   } else {
     DVLOG(1) << decoder_name_ << ": Initialization succeeded.";
     state_ = STATE_NORMAL;
-    init_cb_.RunOrHold(true);
+    init_cb_.RunOrHold(OkStatus());
   }
 }
 
diff --git a/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc
index 0b74a00..0a40d6a 100644
--- a/media/filters/fake_video_decoder_unittest.cc
+++ b/media/filters/fake_video_decoder_unittest.cc
@@ -54,7 +54,12 @@
   void InitializeWithConfigAndExpectResult(const VideoDecoderConfig& config,
                                            bool success) {
     decoder_->Initialize(
-        config, false, nullptr, NewExpectedBoolCB(success),
+        config, false, nullptr,
+        base::BindOnce(
+            [](bool success, Status status) {
+              EXPECT_EQ(status.is_ok(), success);
+            },
+            success),
         base::Bind(&FakeVideoDecoderTest::FrameReady, base::Unretained(this)),
         base::NullCallback());
     base::RunLoop().RunUntilIdle();
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
index 9a5c883..ffc00dc 100644
--- a/media/filters/ffmpeg_audio_decoder.cc
+++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -77,16 +77,25 @@
 
   InitCB bound_init_cb = BindToCurrentLoop(std::move(init_cb));
 
-  if (config.is_encrypted() ||
-      // TODO(dalecurtis): Remove this if ffmpeg ever gets xHE-AAC support.
-      config.profile() == AudioCodecProfile::kXHE_AAC) {
-    std::move(bound_init_cb).Run(false);
+  if (config.is_encrypted()) {
+    std::move(bound_init_cb)
+        .Run(Status(StatusCode::kEncryptedContentUnsupported,
+                    "FFmpegAudioDecoder does not support encrypted content"));
+    return;
+  }
+
+  // TODO(dalecurtis): Remove this if ffmpeg ever gets xHE-AAC support.
+  if (config.profile() == AudioCodecProfile::kXHE_AAC) {
+    std::move(bound_init_cb)
+        .Run(Status(StatusCode::kDecoderUnsupportedProfile)
+                 .WithData("decoder", "FFmpegAudioDecoder")
+                 .WithData("profile", config.profile()));
     return;
   }
 
   if (!ConfigureDecoder(config)) {
     av_sample_format_ = 0;
-    std::move(bound_init_cb).Run(false);
+    std::move(bound_init_cb).Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
@@ -94,7 +103,7 @@
   config_ = config;
   output_cb_ = BindToCurrentLoop(output_cb);
   state_ = kNormal;
-  std::move(bound_init_cb).Run(true);
+  std::move(bound_init_cb).Run(OkStatus());
 }
 
 void FFmpegAudioDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc
index 1f2df510..c56e681 100644
--- a/media/filters/ffmpeg_video_decoder.cc
+++ b/media/filters/ffmpeg_video_decoder.cc
@@ -214,12 +214,12 @@
   InitCB bound_init_cb = BindToCurrentLoop(std::move(init_cb));
 
   if (config.is_encrypted()) {
-    std::move(bound_init_cb).Run(false);
+    std::move(bound_init_cb).Run(StatusCode::kEncryptedContentUnsupported);
     return;
   }
 
   if (!ConfigureDecoder(config, low_delay)) {
-    std::move(bound_init_cb).Run(false);
+    std::move(bound_init_cb).Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
@@ -227,7 +227,7 @@
   config_ = config;
   output_cb_ = output_cb;
   state_ = kNormal;
-  std::move(bound_init_cb).Run(true);
+  std::move(bound_init_cb).Run(OkStatus());
 }
 
 void FFmpegVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc
index 5fdf779ea..4eee572d 100644
--- a/media/filters/ffmpeg_video_decoder_unittest.cc
+++ b/media/filters/ffmpeg_video_decoder_unittest.cc
@@ -75,7 +75,12 @@
   void InitializeWithConfigWithResult(const VideoDecoderConfig& config,
                                       bool success) {
     decoder_->Initialize(
-        config, false, nullptr, NewExpectedBoolCB(success),
+        config, false, nullptr,
+        base::BindOnce(
+            [](bool success, Status status) {
+              EXPECT_EQ(status.is_ok(), success);
+            },
+            success),
         base::Bind(&FFmpegVideoDecoderTest::FrameReady, base::Unretained(this)),
         base::NullCallback());
     base::RunLoop().RunUntilIdle();
diff --git a/media/filters/fuchsia/fuchsia_video_decoder.cc b/media/filters/fuchsia/fuchsia_video_decoder.cc
index 863e797c..8c3647f 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder.cc
@@ -360,7 +360,7 @@
   bool have_decryptor = decryptor_ != nullptr;
   if (decoder_ && current_codec_ == config.codec() &&
       have_decryptor == config.is_encrypted()) {
-    std::move(done_callback).Run(true);
+    std::move(done_callback).Run(OkStatus());
     return;
   }
 
@@ -369,7 +369,8 @@
 
   // Initialize decryptor for encrypted streams.
   if (config.is_encrypted() && !InitializeDecryptor(cdm_context)) {
-    std::move(done_callback).Run(false);
+    std::move(done_callback)
+        .Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
@@ -398,7 +399,7 @@
       break;
 
     default:
-      std::move(done_callback).Run(false);
+      std::move(done_callback).Run(StatusCode::kDecoderUnsupportedCodec);
       return;
   }
 
@@ -449,7 +450,7 @@
 
   current_codec_ = config.codec();
 
-  std::move(done_callback).Run(true);
+  std::move(done_callback).Run(OkStatus());
 }
 
 void FuchsiaVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
index 1bb2612..bc293b3 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
@@ -201,8 +201,8 @@
     decoder_->Initialize(
         config, true, /*cdm_context=*/nullptr,
         base::BindRepeating(
-            [](bool* init_cb_result, base::RunLoop* run_loop, bool result) {
-              *init_cb_result = result;
+            [](bool* init_cb_result, base::RunLoop* run_loop, Status status) {
+              *init_cb_result = status.is_ok();
               run_loop->Quit();
             },
             &init_cb_result, &run_loop),
diff --git a/media/filters/offloading_video_decoder_unittest.cc b/media/filters/offloading_video_decoder_unittest.cc
index 3cef311c9..925bd7c0 100644
--- a/media/filters/offloading_video_decoder_unittest.cc
+++ b/media/filters/offloading_video_decoder_unittest.cc
@@ -80,8 +80,12 @@
   VideoDecoder::InitCB ExpectInitCB(bool success) {
     EXPECT_CALL(*this, InitDone(success))
         .WillOnce(VerifyOn(task_env_.GetMainThreadTaskRunner()));
-    return base::BindOnce(&OffloadingVideoDecoderTest::InitDone,
-                          base::Unretained(this));
+    return base::BindOnce(
+        [](base::OnceCallback<void(bool)> cb, Status status) {
+          std::move(cb).Run(status.is_ok());
+        },
+        base::BindOnce(&OffloadingVideoDecoderTest::InitDone,
+                       base::Unretained(this)));
   }
 
   VideoDecoder::OutputCB ExpectOutputCB() {
@@ -118,7 +122,8 @@
     VideoDecoder::OutputCB output_cb;
     EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
         .WillOnce(DoAll(VerifyOn(task_env_.GetMainThreadTaskRunner()),
-                        RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
+                        RunOnceCallback<3>(OkStatus()),
+                        SaveArg<4>(&output_cb)));
     offloading_decoder_->Initialize(config, false, nullptr, ExpectInitCB(true),
                                     ExpectOutputCB(), base::NullCallback());
     task_env_.RunUntilIdle();
@@ -159,7 +164,8 @@
                                     ExpectOutputCB(), base::NullCallback());
     EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
         .WillOnce(DoAll(VerifyNotOn(task_env_.GetMainThreadTaskRunner()),
-                        RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
+                        RunOnceCallback<3>(OkStatus()),
+                        SaveArg<4>(&output_cb)));
     task_env_.RunUntilIdle();
 
     // When offloading decodes should be parallelized.
@@ -243,7 +249,7 @@
       .WillOnce(VerifyNotOn(task_env_.GetMainThreadTaskRunner()));
   EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
       .WillOnce(DoAll(VerifyOn(task_env_.GetMainThreadTaskRunner()),
-                      RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
+                      RunOnceCallback<3>(OkStatus()), SaveArg<4>(&output_cb)));
   task_env_.RunUntilIdle();
 }
 
@@ -270,7 +276,7 @@
       base::NullCallback());
   EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
       .WillOnce(DoAll(VerifyNotOn(task_env_.GetMainThreadTaskRunner()),
-                      RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
+                      RunOnceCallback<3>(OkStatus()), SaveArg<4>(&output_cb)));
   task_env_.RunUntilIdle();
 
   // When offloading decodes should be parallelized.
@@ -321,7 +327,7 @@
       base::NullCallback());
   EXPECT_CALL(*decoder_, Initialize_(_, false, nullptr, _, _, _))
       .WillOnce(DoAll(VerifyNotOn(task_env_.GetMainThreadTaskRunner()),
-                      RunOnceCallback<3>(true), SaveArg<4>(&output_cb)));
+                      RunOnceCallback<3>(OkStatus()), SaveArg<4>(&output_cb)));
   task_env_.RunUntilIdle();
 
   // When offloading decodes should be parallelized.
diff --git a/media/filters/video_decoder_stream_unittest.cc b/media/filters/video_decoder_stream_unittest.cc
index abd89199..b5c02cf 100644
--- a/media/filters/video_decoder_stream_unittest.cc
+++ b/media/filters/video_decoder_stream_unittest.cc
@@ -316,7 +316,7 @@
   }
 
   // Callback for VideoDecoderStream::Read().
-  void FrameReady(VideoDecoderStream::Status status,
+  void FrameReady(VideoDecoderStream::ReadStatus status,
                   scoped_refptr<VideoFrame> frame) {
     DCHECK(pending_read_);
     frame_read_ = frame;
@@ -507,7 +507,7 @@
   bool pending_stop_;
   int num_decoded_bytes_unreported_;
   scoped_refptr<VideoFrame> frame_read_;
-  VideoDecoderStream::Status last_read_status_;
+  VideoDecoderStream::ReadStatus last_read_status_;
 
   // Decryptor has no key to decrypt a frame.
   bool has_no_key_;
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc
index 650e7475..cbe195d 100644
--- a/media/filters/vpx_video_decoder.cc
+++ b/media/filters/vpx_video_decoder.cc
@@ -126,8 +126,13 @@
 
   InitCB bound_init_cb = bind_callbacks_ ? BindToCurrentLoop(std::move(init_cb))
                                          : std::move(init_cb);
-  if (config.is_encrypted() || !ConfigureDecoder(config)) {
-    std::move(bound_init_cb).Run(false);
+  if (config.is_encrypted()) {
+    std::move(bound_init_cb).Run(StatusCode::kEncryptedContentUnsupported);
+    return;
+  }
+
+  if (!ConfigureDecoder(config)) {
+    std::move(bound_init_cb).Run(StatusCode::kDecoderFailedConfigure);
     return;
   }
 
@@ -135,7 +140,7 @@
   config_ = config;
   state_ = kNormal;
   output_cb_ = output_cb;
-  std::move(bound_init_cb).Run(true);
+  std::move(bound_init_cb).Run(OkStatus());
 }
 
 void VpxVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/filters/vpx_video_decoder_fuzzertest.cc b/media/filters/vpx_video_decoder_fuzzertest.cc
index 4bf71c19..c66304e 100644
--- a/media/filters/vpx_video_decoder_fuzzertest.cc
+++ b/media/filters/vpx_video_decoder_fuzzertest.cc
@@ -37,8 +37,8 @@
 
 void OnInitDone(const base::Closure& quit_closure,
                 bool* success_dest,
-                bool success) {
-  *success_dest = success;
+                media::Status status) {
+  *success_dest = status.is_ok();
   quit_closure.Run();
 }
 
diff --git a/media/filters/vpx_video_decoder_unittest.cc b/media/filters/vpx_video_decoder_unittest.cc
index ece3528b..b1d19c3b 100644
--- a/media/filters/vpx_video_decoder_unittest.cc
+++ b/media/filters/vpx_video_decoder_unittest.cc
@@ -39,7 +39,12 @@
   void InitializeWithConfigWithResult(const VideoDecoderConfig& config,
                                       bool success) {
     decoder_->Initialize(
-        config, false, nullptr, NewExpectedBoolCB(success),
+        config, false, nullptr,
+        base::BindOnce(
+            [](bool success, Status status) {
+              EXPECT_EQ(status.is_ok(), success);
+            },
+            success),
         base::Bind(&VpxVideoDecoderTest::FrameReady, base::Unretained(this)),
         base::NullCallback());
     base::RunLoop().RunUntilIdle();
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index dab0fd84..be94066 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -208,6 +208,7 @@
     ]
     public_deps += [ "//media/base/win:media_foundation_util" ]
     deps += [
+      "//media/parsers",
       "//third_party/angle:includes",
       "//ui/display",
     ]
diff --git a/media/gpu/android/media_codec_video_decoder.cc b/media/gpu/android/media_codec_video_decoder.cc
index a4769361..6e12751 100644
--- a/media/gpu/android/media_codec_video_decoder.cc
+++ b/media/gpu/android/media_codec_video_decoder.cc
@@ -25,6 +25,7 @@
 #include "media/base/media_log.h"
 #include "media/base/media_switches.h"
 #include "media/base/scoped_async_trace.h"
+#include "media/base/status.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_decoder_config.h"
 #include "media/base/video_frame.h"
@@ -293,7 +294,8 @@
     MEDIA_LOG(INFO, media_log_) << "Video configuration is not valid: "
                                 << config.AsHumanReadableString();
     DVLOG(1) << "Invalid configuration.";
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderUnsupportedConfig);
     return;
   }
 
@@ -307,7 +309,8 @@
     DVLOG(1) << "Unsupported configuration.";
     MEDIA_LOG(INFO, media_log_) << "Video configuration is not valid: "
                                 << config.AsHumanReadableString();
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderUnsupportedConfig);
     return;
   }
 
@@ -317,7 +320,8 @@
     MEDIA_LOG(INFO, media_log_) << "Cannot change codec during re-init: "
                                 << decoder_config_.AsHumanReadableString()
                                 << " -> " << config.AsHumanReadableString();
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderCantChangeCodec);
     return;
   }
   decoder_config_ = config;
@@ -345,12 +349,13 @@
   if (config.is_encrypted() && media_crypto_.is_null()) {
     DVLOG(1) << "No MediaCrypto to handle encrypted config";
     MEDIA_LOG(INFO, media_log_) << "No MediaCrypto to handle encrypted config";
-    BindToCurrentLoop(std::move(init_cb)).Run(false);
+    BindToCurrentLoop(std::move(init_cb))
+        .Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
   // Do the rest of the initialization lazily on the first decode.
-  BindToCurrentLoop(std::move(init_cb)).Run(true);
+  BindToCurrentLoop(std::move(init_cb)).Run(OkStatus());
 
   const int width = config.coded_size().width();
   // On re-init, reallocate the codec if the size has changed too much.
@@ -402,14 +407,14 @@
     if (decoder_config_.is_encrypted()) {
       LOG(ERROR) << "MediaCrypto is not available";
       EnterTerminalState(State::kError, "MediaCrypto is not available");
-      std::move(init_cb).Run(false);
+      std::move(init_cb).Run(StatusCode::kDecoderMissingCdmForEncryptedContent);
       return;
     }
 
     // MediaCrypto is not available, but the stream is clear. So we can still
     // play the current stream. But if we switch to an encrypted stream playback
     // will fail.
-    std::move(init_cb).Run(true);
+    std::move(init_cb).Run(OkStatus());
     return;
   }
 
@@ -434,7 +439,7 @@
           : SurfaceChooserHelper::SecureSurfaceMode::kRequested);
 
   // Signal success, and create the codec lazily on the first decode.
-  std::move(init_cb).Run(true);
+  std::move(init_cb).Run(OkStatus());
 }
 
 void MediaCodecVideoDecoder::OnKeyAdded() {
diff --git a/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc
index 461fff7f..61d4c13f 100644
--- a/media/gpu/android/media_codec_video_decoder_unittest.cc
+++ b/media/gpu/android/media_codec_video_decoder_unittest.cc
@@ -189,7 +189,9 @@
     if (!mcvd_)
       CreateMcvd();
     bool result = false;
-    auto init_cb = [](bool* result_out, bool result) { *result_out = result; };
+    auto init_cb = [](bool* result_out, Status result) {
+      *result_out = result.is_ok();
+    };
     mcvd_->Initialize(
         config, false, cdm_.get(), base::BindOnce(init_cb, &result),
         base::BindRepeating(&OutputCb, &most_recent_frame_), base::DoNothing());
diff --git a/media/gpu/chromeos/vd_video_decode_accelerator.cc b/media/gpu/chromeos/vd_video_decode_accelerator.cc
index a883b5e..9373a3d2 100644
--- a/media/gpu/chromeos/vd_video_decode_accelerator.cc
+++ b/media/gpu/chromeos/vd_video_decode_accelerator.cc
@@ -160,12 +160,12 @@
   return true;
 }
 
-void VdVideoDecodeAccelerator::OnInitializeDone(bool success) {
-  DVLOGF(3) << "success: " << success;
+void VdVideoDecodeAccelerator::OnInitializeDone(Status status) {
+  DVLOGF(3) << "success: " << status.is_ok();
   DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_);
   DCHECK(client_);
 
-  client_->NotifyInitializationComplete(success);
+  client_->NotifyInitializationComplete(status);
 }
 
 void VdVideoDecodeAccelerator::Decode(BitstreamBuffer bitstream_buffer) {
diff --git a/media/gpu/chromeos/vd_video_decode_accelerator.h b/media/gpu/chromeos/vd_video_decode_accelerator.h
index 0ec8e5f..9b9481c 100644
--- a/media/gpu/chromeos/vd_video_decode_accelerator.h
+++ b/media/gpu/chromeos/vd_video_decode_accelerator.h
@@ -15,6 +15,7 @@
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
 #include "base/time/time.h"
+#include "media/base/status.h"
 #include "media/base/video_decoder.h"
 #include "media/gpu/chromeos/dmabuf_video_frame_pool.h"
 #include "media/gpu/chromeos/fourcc.h"
@@ -95,7 +96,7 @@
       scoped_refptr<base::SequencedTaskRunner> task_runner);
 
   // Callback methods of |vd_|.
-  void OnInitializeDone(bool success);
+  void OnInitializeDone(Status status);
   void OnDecodeDone(int32_t bitstream_buffer_id, DecodeStatus status);
   void OnFrameReady(scoped_refptr<VideoFrame> frame);
   void OnFlushDone(DecodeStatus status);
diff --git a/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc
index 9370ea46..5ebd3ca 100644
--- a/media/gpu/chromeos/video_decoder_pipeline.cc
+++ b/media/gpu/chromeos/video_decoder_pipeline.cc
@@ -192,17 +192,17 @@
 
   if (!config.IsValidConfig()) {
     VLOGF(1) << "config is not valid";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kDecoderUnsupportedConfig);
     return;
   }
   if (config.is_encrypted()) {
     VLOGF(1) << "Encrypted streams are not supported for this VD";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kEncryptedContentUnsupported);
     return;
   }
   if (cdm_context) {
     VLOGF(1) << "cdm_context is not supported.";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kEncryptedContentUnsupported);
     return;
   }
 
@@ -226,7 +226,8 @@
       get_create_vd_functions_cb_.Run(used_create_vd_func_);
 
   if (!decoder_) {
-    CreateAndInitializeVD(std::move(create_vd_funcs), config);
+    CreateAndInitializeVD(std::move(create_vd_funcs), config,
+                          StatusCode::kChromeOSVideoDecoderNoDecoders);
   } else {
     decoder_->Initialize(
         config,
@@ -234,7 +235,8 @@
         // another decoder instance by trying available VD creation functions
         // again. See |OnInitializeDone| for detail.
         base::BindOnce(&VideoDecoderPipeline::OnInitializeDone,
-                       decoder_weak_this_, std::move(create_vd_funcs), config),
+                       decoder_weak_this_, std::move(create_vd_funcs), config,
+                       StatusCode::kChromeOSVideoDecoderNoDecoders),
         base::BindRepeating(&VideoDecoderPipeline::OnFrameDecoded,
                             decoder_weak_this_));
   }
@@ -242,7 +244,8 @@
 
 void VideoDecoderPipeline::CreateAndInitializeVD(
     base::queue<VideoDecoderPipeline::CreateVDFunc> create_vd_funcs,
-    VideoDecoderConfig config) {
+    VideoDecoderConfig config,
+    ::media::Status parent_error) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_);
   DCHECK(init_cb_);
   DCHECK(!decoder_);
@@ -251,8 +254,8 @@
 
   if (create_vd_funcs.empty()) {
     DVLOGF(2) << "No available video decoder.";
-    client_task_runner_->PostTask(FROM_HERE,
-                                  base::BindOnce(std::move(init_cb_), false));
+    client_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(std::move(init_cb_), parent_error));
     return;
   }
 
@@ -262,13 +265,16 @@
   if (!decoder_) {
     DVLOGF(2) << "Failed to create VideoDecoder.";
     used_create_vd_func_ = nullptr;
-    return CreateAndInitializeVD(std::move(create_vd_funcs), config);
+    return CreateAndInitializeVD(
+        std::move(create_vd_funcs), config,
+        std::move(parent_error).AddCause(StatusCode::kDecoderFailedCreation));
   }
 
   decoder_->Initialize(
       config,
       base::BindOnce(&VideoDecoderPipeline::OnInitializeDone,
-                     decoder_weak_this_, std::move(create_vd_funcs), config),
+                     decoder_weak_this_, std::move(create_vd_funcs), config,
+                     std::move(parent_error)),
       base::BindRepeating(&VideoDecoderPipeline::OnFrameDecoded,
                           decoder_weak_this_));
 }
@@ -276,22 +282,26 @@
 void VideoDecoderPipeline::OnInitializeDone(
     base::queue<VideoDecoderPipeline::CreateVDFunc> create_vd_funcs,
     VideoDecoderConfig config,
-    bool success) {
+    ::media::Status parent_error,
+    ::media::Status status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_);
   DCHECK(init_cb_);
-  DVLOGF(4) << "Initialization " << (success ? "success." : "failure.");
+  DVLOGF(4) << "Initialization status = " << status.code();
 
-  if (success) {
+  if (status.is_ok()) {
     DVLOGF(2) << "Initialize VD successfully.";
-    client_task_runner_->PostTask(FROM_HERE,
-                                  base::BindOnce(std::move(init_cb_), true));
+    // TODO(tmathmeyer) consider logging the causes of |parent_error| as they
+    // might have infor about why other decoders failed.
+    client_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(std::move(init_cb_), OkStatus()));
     return;
   }
 
   DVLOGF(3) << "Reset VD, try the next create function.";
   decoder_ = nullptr;
   used_create_vd_func_ = nullptr;
-  CreateAndInitializeVD(std::move(create_vd_funcs), config);
+  CreateAndInitializeVD(std::move(create_vd_funcs), config,
+                        std::move(parent_error).AddCause(std::move(status)));
 }
 
 void VideoDecoderPipeline::Reset(base::OnceClosure closure) {
diff --git a/media/gpu/chromeos/video_decoder_pipeline.h b/media/gpu/chromeos/video_decoder_pipeline.h
index f30f6b0..396055e 100644
--- a/media/gpu/chromeos/video_decoder_pipeline.h
+++ b/media/gpu/chromeos/video_decoder_pipeline.h
@@ -42,7 +42,7 @@
 // Note: All methods and callbacks should be called on the same sequence.
 class MEDIA_GPU_EXPORT DecoderInterface {
  public:
-  using InitCB = base::OnceCallback<void(bool success)>;
+  using InitCB = base::OnceCallback<void(::media::Status status)>;
   // TODO(crbug.com/998413): Replace VideoFrame to GpuMemoryBuffer-based
   // instance.
   using OutputCB = base::RepeatingCallback<void(scoped_refptr<VideoFrame>)>;
@@ -194,10 +194,12 @@
   void DecodeTask(scoped_refptr<DecoderBuffer> buffer, DecodeCB decode_cb);
 
   void CreateAndInitializeVD(base::queue<CreateVDFunc> create_vd_funcs,
-                             VideoDecoderConfig config);
+                             VideoDecoderConfig config,
+                             ::media::Status parent_error);
   void OnInitializeDone(base::queue<CreateVDFunc> create_vd_funcs,
                         VideoDecoderConfig config,
-                        bool success);
+                        ::media::Status parent_error,
+                        ::media::Status success);
 
   void OnDecodeDone(bool eos_buffer, DecodeCB decode_cb, DecodeStatus status);
   void OnResetDone();
diff --git a/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc
index f9ee0a9..464c106 100644
--- a/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc
+++ b/media/gpu/ipc/client/gpu_video_decode_accelerator_host.cc
@@ -213,10 +213,12 @@
   }
 }
 
+// TODO(tmathmeyer) This needs to accept a Status at some point
 void GpuVideoDecodeAcceleratorHost::OnInitializationComplete(bool success) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (client_)
-    client_->NotifyInitializationComplete(success);
+    client_->NotifyInitializationComplete(
+        success ? OkStatus() : StatusCode::kInitializationUnspecifiedFailure);
 }
 
 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed(
diff --git a/media/gpu/ipc/service/gpu_video_decode_accelerator.cc b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
index aab498b5..0fd65d3 100644
--- a/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
+++ b/media/gpu/ipc/service/gpu_video_decode_accelerator.cc
@@ -226,9 +226,10 @@
   return handled;
 }
 
-void GpuVideoDecodeAccelerator::NotifyInitializationComplete(bool success) {
+void GpuVideoDecodeAccelerator::NotifyInitializationComplete(Status status) {
+  // TODO(tmathmeyer) convert the IPC send to a Status.
   if (!Send(new AcceleratedVideoDecoderHostMsg_InitializationComplete(
-          host_route_id_, success)))
+          host_route_id_, status.is_ok())))
     DLOG(ERROR)
         << "Send(AcceleratedVideoDecoderHostMsg_InitializationComplete) failed";
 }
diff --git a/media/gpu/ipc/service/gpu_video_decode_accelerator.h b/media/gpu/ipc/service/gpu_video_decode_accelerator.h
index 786d6a8..26a48ee 100644
--- a/media/gpu/ipc/service/gpu_video_decode_accelerator.h
+++ b/media/gpu/ipc/service/gpu_video_decode_accelerator.h
@@ -58,7 +58,7 @@
   bool OnMessageReceived(const IPC::Message& message) override;
 
   // VideoDecodeAccelerator::Client implementation.
-  void NotifyInitializationComplete(bool success) override;
+  void NotifyInitializationComplete(Status status) override;
   void ProvidePictureBuffers(uint32_t requested_num_of_buffers,
                              VideoPixelFormat format,
                              uint32_t textures_per_buffer,
diff --git a/media/gpu/ipc/service/vda_video_decoder.cc b/media/gpu/ipc/service/vda_video_decoder.cc
index 0e9f6d3..5dbc521 100644
--- a/media/gpu/ipc/service/vda_video_decoder.cc
+++ b/media/gpu/ipc/service/vda_video_decoder.cc
@@ -222,8 +222,10 @@
   DCHECK(decode_cbs_.empty());
 
   if (has_error_) {
-    parent_task_runner_->PostTask(FROM_HERE,
-                                  base::BindOnce(std::move(init_cb), false));
+    // TODO(tmathmeyer) generic error, please remove.
+    parent_task_runner_->PostTask(
+        FROM_HERE, base::BindOnce(std::move(init_cb),
+                                  StatusCode::kGenericErrorPleaseRemove));
     return;
   }
 
@@ -295,7 +297,7 @@
     } else {
       parent_task_runner_->PostTask(
           FROM_HERE, base::BindOnce(&VdaVideoDecoder::InitializeDone,
-                                    parent_weak_this_, true));
+                                    parent_weak_this_, OkStatus()));
     }
     return;
   }
@@ -330,8 +332,9 @@
     command_buffer_helper_ = std::move(create_command_buffer_helper_cb_).Run();
     if (!command_buffer_helper_) {
       parent_task_runner_->PostTask(
-          FROM_HERE, base::BindOnce(&VdaVideoDecoder::InitializeDone,
-                                    parent_weak_this_, false));
+          FROM_HERE,
+          base::BindOnce(&VdaVideoDecoder::InitializeDone, parent_weak_this_,
+                         StatusCode::kDecoderInitializeNeverCompleted));
       return;
     }
 
@@ -360,8 +363,9 @@
                                            media_log_.get(), vda_config);
   if (!vda_) {
     parent_task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&VdaVideoDecoder::InitializeDone,
-                                  parent_weak_this_, false));
+        FROM_HERE,
+        base::BindOnce(&VdaVideoDecoder::InitializeDone, parent_weak_this_,
+                       StatusCode::kDecoderInitializeNeverCompleted));
     return;
   }
 
@@ -375,24 +379,24 @@
 
   parent_task_runner_->PostTask(FROM_HERE,
                                 base::BindOnce(&VdaVideoDecoder::InitializeDone,
-                                               parent_weak_this_, true));
+                                               parent_weak_this_, OkStatus()));
 }
 
-void VdaVideoDecoder::InitializeDone(bool status) {
-  DVLOG(1) << __func__ << "(" << status << ")";
+void VdaVideoDecoder::InitializeDone(Status status) {
+  DVLOG(1) << __func__ << " success = (" << status.code() << ")";
   DCHECK(parent_task_runner_->BelongsToCurrentThread());
 
   if (has_error_)
     return;
 
-  if (!status) {
+  if (!status.is_ok()) {
     // TODO(sandersd): This adds an unnecessary PostTask().
     EnterErrorState();
     return;
   }
 
   reinitializing_ = false;
-  std::move(init_cb_).Run(true);
+  std::move(init_cb_).Run(std::move(status));
 }
 
 void VdaVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -488,8 +492,8 @@
   return 4;
 }
 
-void VdaVideoDecoder::NotifyInitializationComplete(bool success) {
-  DVLOG(2) << __func__ << "(" << success << ")";
+void VdaVideoDecoder::NotifyInitializationComplete(Status status) {
+  DVLOG(2) << __func__ << "(" << status.code() << ")";
   DCHECK(gpu_task_runner_->BelongsToCurrentThread());
   DCHECK(vda_initialized_);
 
@@ -816,7 +820,7 @@
     std::move(reset_cb_).Run();
 
   if (weak_this && init_cb_)
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 }  // namespace media
diff --git a/media/gpu/ipc/service/vda_video_decoder.h b/media/gpu/ipc/service/vda_video_decoder.h
index faea3bf..07f475b 100644
--- a/media/gpu/ipc/service/vda_video_decoder.h
+++ b/media/gpu/ipc/service/vda_video_decoder.h
@@ -120,7 +120,7 @@
 
  private:
   // media::VideoDecodeAccelerator::Client implementation.
-  void NotifyInitializationComplete(bool success) override;
+  void NotifyInitializationComplete(Status status) override;
   void ProvidePictureBuffers(uint32_t requested_num_of_buffers,
                              VideoPixelFormat format,
                              uint32_t textures_per_buffer,
@@ -137,7 +137,7 @@
   void DestroyOnGpuThread();
   void InitializeOnGpuThread();
   void ReinitializeOnGpuThread();
-  void InitializeDone(bool status);
+  void InitializeDone(Status status);
   void DecodeOnGpuThread(scoped_refptr<DecoderBuffer> buffer,
                          int32_t bitstream_id);
   void DismissPictureBufferOnParentThread(int32_t picture_buffer_id);
diff --git a/media/gpu/ipc/service/vda_video_decoder_unittest.cc b/media/gpu/ipc/service/vda_video_decoder_unittest.cc
index 8926dda7..0bbf1b3 100644
--- a/media/gpu/ipc/service/vda_video_decoder_unittest.cc
+++ b/media/gpu/ipc/service/vda_video_decoder_unittest.cc
@@ -21,6 +21,7 @@
 #include "media/base/media_util.h"
 #include "media/base/mock_media_log.h"
 #include "media/base/simple_sync_token_client.h"
+#include "media/base/test_helpers.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_transformation.h"
@@ -139,7 +140,7 @@
     EXPECT_CALL(*vda_, Initialize(_, vdavd_.get())).WillOnce(Return(true));
     EXPECT_CALL(*vda_, TryToSetupDecodeOnSeparateThread(_, _))
         .WillOnce(Return(GetParam()));
-    EXPECT_CALL(init_cb_, Run(true));
+    EXPECT_CALL(init_cb_, Run(IsOkStatus()));
     InitializeWithConfig(VideoDecoderConfig(
         kCodecVP9, VP9PROFILE_PROFILE0,
         VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace::REC709(),
@@ -323,7 +324,8 @@
       VideoColorSpace::REC601(), kNoTransformation, gfx::Size(320, 240),
       gfx::Rect(320, 240), gfx::Size(320, 240), EmptyExtraData(),
       EncryptionScheme::kUnencrypted));
-  EXPECT_CALL(init_cb_, Run(false));
+  EXPECT_CALL(init_cb_,
+              Run(HasStatusCode(StatusCode::kDecoderInitializeNeverCompleted)));
   RunUntilIdle();
 }
 
@@ -333,7 +335,8 @@
       VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace::REC709(),
       kNoTransformation, gfx::Size(1920, 1088), gfx::Rect(1920, 1080),
       gfx::Size(1920, 1080), EmptyExtraData(), EncryptionScheme::kUnencrypted));
-  EXPECT_CALL(init_cb_, Run(false));
+  EXPECT_CALL(init_cb_,
+              Run(HasStatusCode(StatusCode::kDecoderInitializeNeverCompleted)));
   RunUntilIdle();
 }
 
@@ -344,7 +347,8 @@
       VideoColorSpace::REC709(), kNoTransformation, gfx::Size(1920, 1088),
       gfx::Rect(1920, 1080), gfx::Size(1920, 1080), EmptyExtraData(),
       EncryptionScheme::kUnencrypted));
-  EXPECT_CALL(init_cb_, Run(false));
+  EXPECT_CALL(init_cb_,
+              Run(HasStatusCode(StatusCode::kDecoderInitializeNeverCompleted)));
   RunUntilIdle();
 }
 
@@ -427,7 +431,7 @@
       VideoColorSpace::REC709(), kNoTransformation, gfx::Size(640, 480),
       gfx::Rect(640, 480), gfx::Size(1280, 480), EmptyExtraData(),
       EncryptionScheme::kUnencrypted));
-  EXPECT_CALL(init_cb_, Run(true));
+  EXPECT_CALL(init_cb_, Run(IsOkStatus()));
   RunUntilIdle();
 
   // Assign a picture buffer that has size 1920x1088.
diff --git a/media/gpu/test/video.cc b/media/gpu/test/video.cc
index 6364c14..70c33bb 100644
--- a/media/gpu/test/video.cc
+++ b/media/gpu/test/video.cc
@@ -378,16 +378,18 @@
   }
 
   // Setup the VP9 decoder.
+  media::Status init_result;
   VpxVideoDecoder decoder(
       media::OffloadableVideoDecoder::OffloadState::kOffloaded);
-  media::VideoDecoder::InitCB init_cb = base::BindOnce(
-      [](bool* success, bool init_success) { *success = init_success; },
-      success);
+  media::VideoDecoder::InitCB init_cb =
+      base::BindOnce([](media::Status* save_to,
+                        media::Status save_from) { *save_to = save_from; },
+                     &init_result);
   decoder.Initialize(
       config, false, nullptr, std::move(init_cb),
       base::BindRepeating(&Video::OnFrameDecoded, decompressed_data),
       base::NullCallback());
-  if (!*success) {
+  if (!init_result.is_ok()) {
     done->Signal();
     return;
   }
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc
index 9185742..d09d9dd 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.cc
+++ b/media/gpu/test/video_player/test_vda_video_decoder.cc
@@ -113,7 +113,7 @@
 
   if (!decoder_factory) {
     ASSERT_TRUE(decoder_) << "Failed to create VideoDecodeAccelerator factory";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kCodeOnlyForTesting);
     return;
   }
 
@@ -145,21 +145,21 @@
 
   if (!decoder_) {
     ASSERT_TRUE(decoder_) << "Failed to create VideoDecodeAccelerator factory";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kCodeOnlyForTesting);
     return;
   }
 
   if (!vda_config.is_deferred_initialization_allowed)
-    std::move(init_cb).Run(true);
+    std::move(init_cb).Run(OkStatus());
   else
     init_cb_ = std::move(init_cb);
 }
 
-void TestVDAVideoDecoder::NotifyInitializationComplete(bool success) {
+void TestVDAVideoDecoder::NotifyInitializationComplete(Status status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(vda_wrapper_sequence_checker_);
   DCHECK(init_cb_);
 
-  std::move(init_cb_).Run(success);
+  std::move(init_cb_).Run(status);
 }
 
 void TestVDAVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.h b/media/gpu/test/video_player/test_vda_video_decoder.h
index 716d117..c7ffc0e1 100644
--- a/media/gpu/test/video_player/test_vda_video_decoder.h
+++ b/media/gpu/test/video_player/test_vda_video_decoder.h
@@ -62,7 +62,7 @@
   void Destroy() override;
 
   // media::VideoDecodeAccelerator::Client implementation
-  void NotifyInitializationComplete(bool success) override;
+  void NotifyInitializationComplete(Status status) override;
   void ProvidePictureBuffers(uint32_t requested_num_of_buffers,
                              VideoPixelFormat format,
                              uint32_t textures_per_buffer,
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc
index 7029278..4c29e17 100644
--- a/media/gpu/test/video_player/video_decoder_client.cc
+++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -234,7 +234,7 @@
 
   VideoDecoder::InitCB init_cb = base::BindOnce(
       CallbackThunk<decltype(&VideoDecoderClient::DecoderInitializedTask),
-                    bool>,
+                    Status>,
       weak_this_, decoder_client_thread_.task_runner(),
       &VideoDecoderClient::DecoderInitializedTask);
   VideoDecoder::OutputCB output_cb = base::BindRepeating(
@@ -360,11 +360,11 @@
   FireEvent(VideoPlayerEvent::kResetting);
 }
 
-void VideoDecoderClient::DecoderInitializedTask(bool status) {
+void VideoDecoderClient::DecoderInitializedTask(Status status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
   DCHECK(decoder_client_state_ == VideoDecoderClientState::kUninitialized ||
          decoder_client_state_ == VideoDecoderClientState::kIdle);
-  ASSERT_TRUE(status) << "Initializing decoder failed";
+  ASSERT_TRUE(status.is_ok()) << "Initializing decoder failed";
 
   decoder_client_state_ = VideoDecoderClientState::kIdle;
   FireEvent(VideoPlayerEvent::kInitialized);
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h
index b1c1423..232205c8 100644
--- a/media/gpu/test/video_player/video_decoder_client.h
+++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -148,7 +148,7 @@
   // The below functions are callbacks provided to the video decoder. They are
   // all executed on the |decoder_client_thread_|.
   // Called by the decoder when initialization has completed.
-  void DecoderInitializedTask(bool status);
+  void DecoderInitializedTask(Status status);
   // Called by the decoder when a fragment has been decoded.
   void DecodeDoneTask(media::DecodeStatus status);
   // Called by the decoder when a video frame is ready.
diff --git a/media/gpu/v4l2/v4l2_slice_video_decoder.cc b/media/gpu/v4l2/v4l2_slice_video_decoder.cc
index 7e1debb..d549fd7 100644
--- a/media/gpu/v4l2/v4l2_slice_video_decoder.cc
+++ b/media/gpu/v4l2/v4l2_slice_video_decoder.cc
@@ -117,7 +117,7 @@
   // Reset V4L2 device and queue if reinitializing decoder.
   if (state_ != State::kUninitialized) {
     if (!StopStreamV4L2Queue()) {
-      std::move(init_cb).Run(false);
+      std::move(init_cb).Run(StatusCode::kV4l2FailedToStopStreamQueue);
       return;
     }
 
@@ -129,7 +129,7 @@
     device_ = V4L2Device::Create();
     if (!device_) {
       VLOGF(1) << "Failed to create V4L2 device.";
-      std::move(init_cb).Run(false);
+      std::move(init_cb).Run(StatusCode::kV4l2NoDevice);
       return;
     }
 
@@ -147,7 +147,7 @@
       !device_->Open(V4L2Device::Type::kDecoder, input_format_fourcc)) {
     VLOGF(1) << "Failed to open device for profile: " << profile
              << " fourcc: " << FourccToString(input_format_fourcc);
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kV4l2NoDecoder);
     return;
   }
 
@@ -157,7 +157,7 @@
       (caps.capabilities & kCapsRequired) != kCapsRequired) {
     VLOGF(1) << "ioctl() failed: VIDIOC_QUERYCAP, "
              << "caps check failed: 0x" << std::hex << caps.capabilities;
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kV4l2FailedFileCapabilitiesCheck);
     return;
   }
 
@@ -168,7 +168,7 @@
   output_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
   if (!input_queue_ || !output_queue_) {
     VLOGF(1) << "Failed to create V4L2 queue.";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kV4l2FailedResourceAllocation);
     return;
   }
 
@@ -176,27 +176,27 @@
   backend_ = std::make_unique<V4L2StatelessVideoDecoderBackend>(
       this, device_, profile, decoder_task_runner_);
   if (!backend_->Initialize()) {
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kV4l2FailedResourceAllocation);
     return;
   }
 
   // Setup input format.
   if (!SetupInputFormat(input_format_fourcc)) {
     VLOGF(1) << "Failed to setup input format.";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kV4l2BadFormat);
     return;
   }
 
   if (input_queue_->AllocateBuffers(kNumInputBuffers, V4L2_MEMORY_MMAP) == 0) {
     VLOGF(1) << "Failed to allocate input buffer.";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kV4l2FailedResourceAllocation);
     return;
   }
 
   // Call init_cb
   output_cb_ = output_cb;
   SetState(State::kDecoding);
-  std::move(init_cb).Run(true);
+  std::move(init_cb).Run(::media::OkStatus());
 }
 
 bool V4L2SliceVideoDecoder::SetupInputFormat(uint32_t input_format_fourcc) {
diff --git a/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc
index 49c53d2..05427a7 100644
--- a/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc
+++ b/media/gpu/vaapi/h264_vaapi_video_decoder_delegate.cc
@@ -15,7 +15,7 @@
 
 namespace media {
 
-using Status = H264Decoder::H264Accelerator::Status;
+using DecodeStatus = H264Decoder::H264Accelerator::Status;
 
 namespace {
 
@@ -58,7 +58,7 @@
   va_pic->flags = VA_PICTURE_H264_INVALID;
 }
 
-Status H264VaapiVideoDecoderDelegate::SubmitFrameMetadata(
+DecodeStatus H264VaapiVideoDecoderDelegate::SubmitFrameMetadata(
     const H264SPS* sps,
     const H264PPS* pps,
     const H264DPB& dpb,
@@ -137,7 +137,7 @@
   pic_param.num_ref_frames = sps->max_num_ref_frames;
 
   if (!vaapi_wrapper_->SubmitBuffer(VAPictureParameterBufferType, &pic_param))
-    return Status::kFail;
+    return DecodeStatus::kFail;
 
   VAIQMatrixBufferH264 iq_matrix_buf;
   memset(&iq_matrix_buf, 0, sizeof(iq_matrix_buf));
@@ -169,11 +169,11 @@
   }
 
   return vaapi_wrapper_->SubmitBuffer(VAIQMatrixBufferType, &iq_matrix_buf)
-             ? Status::kOk
-             : Status::kFail;
+             ? DecodeStatus::kOk
+             : DecodeStatus::kFail;
 }
 
-Status H264VaapiVideoDecoderDelegate::SubmitSlice(
+DecodeStatus H264VaapiVideoDecoderDelegate::SubmitSlice(
     const H264PPS* pps,
     const H264SliceHeader* slice_hdr,
     const H264Picture::Vector& ref_pic_list0,
@@ -272,20 +272,20 @@
   }
 
   if (!vaapi_wrapper_->SubmitBuffer(VASliceParameterBufferType, &slice_param))
-    return Status::kFail;
+    return DecodeStatus::kFail;
 
   return vaapi_wrapper_->SubmitBuffer(VASliceDataBufferType, size, data)
-             ? Status::kOk
-             : Status::kFail;
+             ? DecodeStatus::kOk
+             : DecodeStatus::kFail;
 }
 
-Status H264VaapiVideoDecoderDelegate::SubmitDecode(
+DecodeStatus H264VaapiVideoDecoderDelegate::SubmitDecode(
     scoped_refptr<H264Picture> pic) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   const bool success = vaapi_wrapper_->ExecuteAndDestroyPendingBuffers(
       pic->AsVaapiH264Picture()->va_surface()->id());
-  return success ? Status::kOk : Status::kFail;
+  return success ? DecodeStatus::kOk : DecodeStatus::kFail;
 }
 
 bool H264VaapiVideoDecoderDelegate::OutputPicture(
diff --git a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
index 069778d..d546f6b 100644
--- a/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
+++ b/media/gpu/vaapi/vaapi_video_decode_accelerator_unittest.cc
@@ -365,7 +365,7 @@
   }
 
   // VideoDecodeAccelerator::Client methods.
-  MOCK_METHOD1(NotifyInitializationComplete, void(bool));
+  MOCK_METHOD1(NotifyInitializationComplete, void(Status));
   MOCK_METHOD5(
       ProvidePictureBuffers,
       void(uint32_t, VideoPixelFormat, uint32_t, const gfx::Size&, uint32_t));
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index 48f1504..ed2944a 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -110,7 +110,7 @@
   if (current_decode_task_ || !decode_task_queue_.empty()) {
     LOG(ERROR)
         << "Don't call Initialize() while there are pending decode tasks";
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kVaapiReinitializedDuringDecode);
     return;
   }
 
@@ -135,14 +135,14 @@
   if (!vaapi_wrapper_.get()) {
     VLOGF(1) << "Failed initializing VAAPI for profile "
              << GetProfileName(profile);
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kDecoderUnsupportedProfile);
     return;
   }
 
   profile_ = profile;
   color_space_ = config.color_space_info();
   if (!CreateAcceleratedVideoDecoder()) {
-    std::move(init_cb).Run(false);
+    std::move(init_cb).Run(StatusCode::kVaapiFailedAcceleratorCreation);
     return;
   }
 
@@ -156,7 +156,7 @@
   SetState(State::kWaitingForInput);
 
   // Notify client initialization was successful.
-  std::move(init_cb).Run(true);
+  std::move(init_cb).Run(OkStatus());
 }
 
 void VaapiVideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index a7ae7390..520e9153 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -1055,7 +1055,7 @@
   void Flush();
 
  private:
-  void InitializeCB(bool success);
+  void InitializeCB(Status status);
   void DecodeDone(DecodeStatus status);
   void FlushDone(DecodeStatus status);
   void VerifyOutputFrame(scoped_refptr<VideoFrame> output_frame);
@@ -1143,10 +1143,10 @@
       base::NullCallback());
 }
 
-void VideoFrameQualityValidator::InitializeCB(bool success) {
+void VideoFrameQualityValidator::InitializeCB(Status status) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  if (success) {
+  if (status.is_ok()) {
     decoder_state_ = INITIALIZED;
     Decode();
   } else {
diff --git a/media/gpu/windows/d3d11_texture_wrapper.cc b/media/gpu/windows/d3d11_texture_wrapper.cc
index 6c6bdea..e777c3c 100644
--- a/media/gpu/windows/d3d11_texture_wrapper.cc
+++ b/media/gpu/windows/d3d11_texture_wrapper.cc
@@ -232,7 +232,7 @@
     ComD3D11Texture2D texture,
     size_t array_slice) {
   if (!helper_ || !helper_->MakeContextCurrent())
-    return Status(StatusCode::kCannotMakeContextCurrent);
+    return Status(StatusCode::kCantMakeContextCurrent);
 
   // Notify |gl_image_| that it has a new texture.
   gl_image_->SetTexture(texture, array_slice);
@@ -248,11 +248,11 @@
   if (!eglStreamPostD3DTextureANGLE(egl_display, stream_,
                                     static_cast<void*>(texture.Get()),
                                     frame_attributes)) {
-    return Status(StatusCode::kCouldNotPostTexture);
+    return Status(StatusCode::kCantPostTexture);
   }
 
   if (!eglStreamConsumerAcquireKHR(egl_display, stream_))
-    return Status(StatusCode::kCouldNotPostAcquireStream);
+    return Status(StatusCode::kCantPostAcquireStream);
 
   return OkStatus();
 }
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc
index 030a5f8c..12dc110 100644
--- a/media/gpu/windows/d3d11_video_decoder.cc
+++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -465,7 +465,7 @@
   }
 
   state_ = State::kRunning;
-  std::move(init_cb_).Run(true);
+  std::move(init_cb_).Run(OkStatus());
 }
 
 void D3D11VideoDecoder::Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -808,14 +808,20 @@
   }
 }
 
+// TODO(tmathmeyer) eventually have this take a Status and pass it through
+// to each of the callbacks.
 void D3D11VideoDecoder::NotifyError(const char* reason) {
   TRACE_EVENT0("gpu", "D3D11VideoDecoder::NotifyError");
   state_ = State::kError;
   DLOG(ERROR) << reason;
+
+  // TODO(tmathmeyer) - Remove this after plumbing Status through the
+  // decode_cb and input_buffer_queue cb's.
   MEDIA_LOG(ERROR, media_log_) << reason;
 
   if (init_cb_)
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(
+        Status(StatusCode::kDecoderInitializeNeverCompleted, reason));
 
   current_buffer_ = nullptr;
   if (current_decode_cb_)
@@ -912,14 +918,15 @@
   std::vector<SupportedVideoDecoderConfig> configs;
   // VP9 has no default resolutions since it may not even be supported.
   ResolutionPair max_h264_resolutions(gfx::Size(1920, 1088), gfx::Size());
+  ResolutionPair max_vp8_resolutions;
   ResolutionPair max_vp9_profile0_resolutions;
   ResolutionPair max_vp9_profile2_resolutions;
   const gfx::Size min_resolution(64, 64);
 
   GetResolutionsForDecoders(
       {D3D11_DECODER_PROFILE_H264_VLD_NOFGT}, d3d11_device, gpu_workarounds,
-      &max_h264_resolutions, &max_vp9_profile0_resolutions,
-      &max_vp9_profile2_resolutions);
+      &max_h264_resolutions, &max_vp8_resolutions,
+      &max_vp9_profile0_resolutions, &max_vp9_profile2_resolutions);
 
   if (max_h264_resolutions.first.width() > 0) {
     // Push H264 configs, except HIGH10.
@@ -960,6 +967,8 @@
         false));                            // require_encrypted
   }
 
+  // TODO(liberato): Fill this in for VP8.
+
   if (max_vp9_profile0_resolutions.first.width()) {
     // landscape
     configs.push_back(SupportedVideoDecoderConfig(
diff --git a/media/gpu/windows/d3d11_video_decoder_unittest.cc b/media/gpu/windows/d3d11_video_decoder_unittest.cc
index 4941e930..1eb5815 100644
--- a/media/gpu/windows/d3d11_video_decoder_unittest.cc
+++ b/media/gpu/windows/d3d11_video_decoder_unittest.cc
@@ -55,11 +55,6 @@
 
 class D3D11VideoDecoderTest : public ::testing::Test {
  public:
-  enum InitExpectation {
-    kExpectFailure = false,
-    kExpectSuccess = true,
-  };
-
   const std::pair<uint16_t, uint16_t> LegacyIntelGPU = {0x8086, 0x102};
   const std::pair<uint16_t, uint16_t> RecentIntelGPU = {0x8086, 0x100};
   const std::pair<uint16_t, uint16_t> LegacyAMDGPU = {0x1022, 0x130f};
@@ -211,24 +206,30 @@
   }
 
   void InitializeDecoder(const VideoDecoderConfig& config,
-                         InitExpectation expectation) {
+                         StatusCode expectation = StatusCode::kOk) {
     const bool low_delay = false;
     CdmContext* cdm_context = nullptr;
 
-    if (expectation == kExpectSuccess) {
+    if (expectation == StatusCode::kOk) {
       EXPECT_CALL(*this, MockInitCB(_)).Times(0);
       EXPECT_CALL(*impl_, MockInitialize());
     } else {
-      EXPECT_CALL(*this, MockInitCB(false));
+      EXPECT_CALL(*this, MockInitCB(_)).Times(1);
     }
-    decoder_->Initialize(config, low_delay, cdm_context,
-                         base::BindRepeating(&D3D11VideoDecoderTest::MockInitCB,
-                                             base::Unretained(this)),
-                         base::DoNothing(), base::DoNothing());
+    decoder_->Initialize(
+        config, low_delay, cdm_context,
+        base::BindRepeating(&D3D11VideoDecoderTest::CheckExpectedStatus,
+                            base::Unretained(this), expectation),
+        base::DoNothing(), base::DoNothing());
     base::RunLoop().RunUntilIdle();
   }
 
-  MOCK_METHOD1(MockInitCB, void(bool));
+  void CheckExpectedStatus(Status expected, Status actual) {
+    ASSERT_EQ(expected.code(), actual.code());
+    MockInitCB(actual);
+  }
+
+  MOCK_METHOD1(MockInitCB, void(Status));
 
   base::test::TaskEnvironment env_;
 
@@ -262,9 +263,10 @@
   CreateDecoder();
   // We don't support vp9 on windows 7 and below.
   if (base::win::GetVersion() <= base::win::Version::WIN7) {
-    InitializeDecoder(configuration, kExpectFailure);
+    InitializeDecoder(configuration,
+                      StatusCode::kDecoderInitializeNeverCompleted);
   } else {
-    InitializeDecoder(configuration, kExpectSuccess);
+    InitializeDecoder(configuration);
   }
 }
 
@@ -275,7 +277,8 @@
 
   EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0);
   CreateDecoder();
-  InitializeDecoder(configuration, kExpectFailure);
+  InitializeDecoder(configuration,
+                    StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithGPUWorkaroundDisableVPX) {
@@ -285,7 +288,8 @@
 
   EnableDecoder(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0);
   CreateDecoder();
-  InitializeDecoder(configuration, kExpectFailure);
+  InitializeDecoder(configuration,
+                    StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportVP9WithoutDecoderEnabled) {
@@ -295,7 +299,8 @@
   // Enable a non-VP9 decoder.
   EnableDecoder(D3D11_DECODER_PROFILE_H264_VLD_NOFGT);  // Paranoia, not VP9.
   CreateDecoder();
-  InitializeDecoder(configuration, kExpectFailure);
+  InitializeDecoder(configuration,
+                    StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportsH264HIGH10Profile) {
@@ -304,7 +309,7 @@
   VideoDecoderConfig high10 = TestVideoConfig::NormalCodecProfile(
       kCodecH264, H264PROFILE_HIGH10PROFILE);
 
-  InitializeDecoder(high10, kExpectFailure);
+  InitializeDecoder(high10, StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, SupportsH264WithAutodetectedConfig) {
@@ -313,7 +318,7 @@
   VideoDecoderConfig normal =
       TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN);
 
-  InitializeDecoder(normal, kExpectSuccess);
+  InitializeDecoder(normal);
   // TODO(liberato): Check |last_video_decoder_desc_| for sanity.
 }
 
@@ -331,7 +336,7 @@
   VideoDecoderConfig normal =
       TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN);
 
-  InitializeDecoder(normal, kExpectFailure);
+  InitializeDecoder(normal, StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportEncryptionWithoutFlag) {
@@ -341,7 +346,8 @@
   encrypted_config.SetIsEncrypted(true);
 
   DisableFeature(kHardwareSecureDecryption);
-  InitializeDecoder(encrypted_config, kExpectFailure);
+  InitializeDecoder(encrypted_config,
+                    StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportZeroCopyPreference) {
@@ -349,7 +355,7 @@
   CreateDecoder();
   InitializeDecoder(
       TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN),
-      kExpectFailure);
+      StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportZeroCopyWorkaround) {
@@ -357,7 +363,7 @@
   CreateDecoder();
   InitializeDecoder(
       TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN),
-      kExpectFailure);
+      StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, IgnoreWorkaroundsIgnoresWorkaround) {
@@ -367,8 +373,7 @@
   gpu_workarounds_.disable_d3d11_video_decoder = true;
   CreateDecoder();
   InitializeDecoder(
-      TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN),
-      kExpectSuccess);
+      TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN));
 }
 
 TEST_F(D3D11VideoDecoderTest, WorkaroundTurnsOffDecoder) {
@@ -377,7 +382,7 @@
   CreateDecoder();
   InitializeDecoder(
       TestVideoConfig::NormalCodecProfile(kCodecH264, H264PROFILE_MAIN),
-      kExpectFailure);
+      StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DoesNotSupportEncryptionWithFlagOn11_0) {
@@ -388,7 +393,8 @@
   // 11.1 version, except for the D3D11 version.
 
   EnableFeature(kHardwareSecureDecryption);
-  InitializeDecoder(encrypted_config, kExpectFailure);
+  InitializeDecoder(encrypted_config,
+                    StatusCode::kDecoderInitializeNeverCompleted);
 }
 
 TEST_F(D3D11VideoDecoderTest, DISABLED_SupportsEncryptionWithFlagOn11_1) {
@@ -400,7 +406,7 @@
   ON_CALL(*mock_d3d11_device_.Get(), GetFeatureLevel)
       .WillByDefault(Return(D3D_FEATURE_LEVEL_11_1));
   EnableFeature(kHardwareSecureDecryption);
-  InitializeDecoder(encrypted_config, kExpectSuccess);
+  InitializeDecoder(encrypted_config);
 }
 
 // TODO(xhwang): Add tests to cover kWaitingForNewKey and kWaitingForReset.
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.cc b/media/gpu/windows/dxva_video_decode_accelerator_win.cc
index 38049f7..30fc6d3 100644
--- a/media/gpu/windows/dxva_video_decode_accelerator_win.cc
+++ b/media/gpu/windows/dxva_video_decode_accelerator_win.cc
@@ -52,6 +52,7 @@
 #include "media/gpu/windows/d3d11_video_device_format_support.h"
 #include "media/gpu/windows/dxva_picture_buffer_win.h"
 #include "media/gpu/windows/supported_profile_helpers.h"
+#include "media/parsers/vp8_parser.h"
 #include "media/video/h264_parser.h"
 #include "media/video/video_decode_accelerator.h"
 #include "third_party/angle/include/EGL/egl.h"
@@ -68,7 +69,14 @@
 
 namespace {
 
-const wchar_t kMSVP9DecoderDLLName[] = L"MSVP9DEC.dll";
+// Note: Despite the name this is for both vp8 and vp9 decoding.
+const wchar_t kMSVPxDecoderDLLName[] = L"MSVP9DEC.dll";
+
+const CLSID MEDIASUBTYPE_VP80 = {
+    0x30385056,
+    0x0000,
+    0x0010,
+    {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
 
 const CLSID MEDIASUBTYPE_VP90 = {
     0x30395056,
@@ -154,8 +162,8 @@
 namespace media {
 
 static const VideoCodecProfile kSupportedProfiles[] = {
-    H264PROFILE_BASELINE, H264PROFILE_MAIN, H264PROFILE_HIGH,
-    VP9PROFILE_PROFILE0, VP9PROFILE_PROFILE2};
+    H264PROFILE_BASELINE, H264PROFILE_MAIN,    H264PROFILE_HIGH,
+    VP8PROFILE_ANY,       VP9PROFILE_PROFILE0, VP9PROFILE_PROFILE2};
 
 CreateDXGIDeviceManager
     DXVAVideoDecodeAccelerator::create_dxgi_device_manager_ = NULL;
@@ -465,11 +473,8 @@
 
   VideoColorSpace current_color_space(
       const VideoColorSpace& container_color_space) const override {
-    // For VP9, container color spaces override video stream color spaces.
-    if (container_color_space.IsSpecified()) {
-      return container_color_space;
-    }
-    return color_space_;
+    return container_color_space.IsSpecified() ? container_color_space
+                                               : color_space_;
   }
 
  private:
@@ -480,6 +485,65 @@
   Vp9Parser parser_;
 };
 
+// Doesn't actually detect config changes, only stream metadata.
+class VP8ConfigChangeDetector : public ConfigChangeDetector {
+ public:
+  VP8ConfigChangeDetector() = default;
+  ~VP8ConfigChangeDetector() override = default;
+
+  // Detects stream configuration changes.
+  // Returns false on failure.
+  bool DetectConfig(const uint8_t* stream, unsigned int size) override {
+    Vp8FrameHeader fhdr;
+    if (!parser_.ParseFrame(stream, size, &fhdr))
+      return false;
+
+    if (fhdr.IsKeyframe() && fhdr.is_full_range) {
+      // VP8 has no color space information, only the range. We will always
+      // prefer the config color space if set, but indicate JPEG when the full
+      // range flag is set on the frame header.
+      color_space_ = VideoColorSpace::JPEG();
+    }
+
+    // Does VP8 need a separate visible rect?
+    gfx::Size new_size(fhdr.width, fhdr.height);
+    if (!size_.IsEmpty() && !pending_config_changed_ && !config_changed_ &&
+        size_ != new_size) {
+      pending_config_changed_ = true;
+      DVLOG(1) << "Configuration changed from " << size_.ToString() << " to "
+               << new_size.ToString();
+    }
+    size_ = new_size;
+
+    // Resolution changes can happen on any frame technically, so wait for a
+    // keyframe before signaling the config change.
+    if (fhdr.IsKeyframe() && pending_config_changed_) {
+      config_changed_ = true;
+      pending_config_changed_ = false;
+    }
+    if (pending_config_changed_)
+      DVLOG(3) << "Deferring config change until next keyframe...";
+    return true;
+  }
+
+  gfx::Rect current_visible_rect(
+      const gfx::Rect& container_visible_rect) const override {
+    return size_.IsEmpty() ? container_visible_rect : gfx::Rect(size_);
+  }
+
+  VideoColorSpace current_color_space(
+      const VideoColorSpace& container_color_space) const override {
+    return container_color_space.IsSpecified() ? container_color_space
+                                               : color_space_;
+  }
+
+ private:
+  gfx::Size size_;
+  bool pending_config_changed_ = false;
+  VideoColorSpace color_space_;
+  Vp8Parser parser_;
+};
+
 DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo(
     int32_t buffer_id,
     Microsoft::WRL::ComPtr<IMFSample> sample,
@@ -585,7 +649,7 @@
       break;
     }
   }
-  RETURN_ON_FAILURE(profile_supported, "Unsupported h.264 or vp9 profile",
+  RETURN_ON_FAILURE(profile_supported, "Unsupported h.264, vp8, or vp9 profile",
                     false);
 
   if (config.profile == VP9PROFILE_PROFILE2 ||
@@ -672,9 +736,11 @@
       "Send MFT_MESSAGE_NOTIFY_START_OF_STREAM notification failed", false);
 
   if (codec_ == kCodecH264)
-    config_change_detector_.reset(new H264ConfigChangeDetector);
+    config_change_detector_.reset(new H264ConfigChangeDetector());
+  if (codec_ == kCodecVP8)
+    config_change_detector_.reset(new VP8ConfigChangeDetector());
   if (codec_ == kCodecVP9)
-    config_change_detector_.reset(new VP9ConfigChangeDetector);
+    config_change_detector_.reset(new VP9ConfigChangeDetector());
 
   SetState(kNormal);
 
@@ -1260,21 +1326,24 @@
   // 1920 x 1088. We use 1088 to account for 16x16 macroblocks.
   ResolutionPair max_h264_resolutions(gfx::Size(1920, 1088), gfx::Size());
 
-  // VP9 has no default resolutions since it may not even be supported.
+  // VP8/VP9 has no default resolutions since it may not even be supported.
+  ResolutionPair max_vp8_resolutions;
   ResolutionPair max_vp9_profile0_resolutions;
   ResolutionPair max_vp9_profile2_resolutions;
 
-  GetResolutionsForDecoders(
-      {DXVA2_ModeH264_E, DXVA2_Intel_ModeH264_E},
-      gl::QueryD3D11DeviceObjectFromANGLE(), workarounds, &max_h264_resolutions,
-      &max_vp9_profile0_resolutions, &max_vp9_profile2_resolutions);
+  GetResolutionsForDecoders({DXVA2_ModeH264_E, DXVA2_Intel_ModeH264_E},
+                            gl::QueryD3D11DeviceObjectFromANGLE(), workarounds,
+                            &max_h264_resolutions, &max_vp8_resolutions,
+                            &max_vp9_profile0_resolutions,
+                            &max_vp9_profile2_resolutions);
 
   for (const auto& supported_profile : kSupportedProfiles) {
     const bool is_h264 = supported_profile >= H264PROFILE_MIN &&
                          supported_profile <= H264PROFILE_MAX;
     const bool is_vp9 = supported_profile >= VP9PROFILE_MIN &&
                         supported_profile <= VP9PROFILE_MAX;
-    DCHECK(is_h264 || is_vp9);
+    const bool is_vp8 = supported_profile == VP8PROFILE_ANY;
+    DCHECK(is_h264 || is_vp9 || is_vp8);
 
     ResolutionPair max_resolutions;
     if (is_h264) {
@@ -1283,10 +1352,12 @@
       max_resolutions = max_vp9_profile0_resolutions;
     } else if (supported_profile == VP9PROFILE_PROFILE2) {
       max_resolutions = max_vp9_profile2_resolutions;
+    } else if (is_vp8) {
+      max_resolutions = max_vp8_resolutions;
     }
 
-    // Skip adding VP9 profiles if it's not supported or disabled.
-    if (is_vp9 && max_resolutions.first.IsEmpty())
+    // Skip adding VPx profiles if it's not supported or disabled.
+    if ((is_vp9 || is_vp8) && max_resolutions.first.IsEmpty())
       continue;
 
     // Windows Media Foundation H.264 decoding does not support decoding videos
@@ -1371,13 +1442,14 @@
     codec_ = kCodecH264;
     clsid = __uuidof(CMSH264DecoderMFT);
   } else if (enable_accelerated_vpx_decode_ &&
-             (profile >= VP9PROFILE_PROFILE0 &&
-              profile <= VP9PROFILE_PROFILE3)) {
-    codec_ = kCodecVP9;
+             ((profile >= VP9PROFILE_PROFILE0 &&
+               profile <= VP9PROFILE_PROFILE3) ||
+              profile == VP8PROFILE_ANY)) {
+    codec_ = profile == VP8PROFILE_ANY ? kCodecVP8 : kCodecVP9;
     clsid = CLSID_MSVPxDecoder;
-    decoder_dll = ::LoadLibrary(kMSVP9DecoderDLLName);
+    decoder_dll = ::LoadLibrary(kMSVPxDecoderDLLName);
     if (decoder_dll)
-      using_ms_vp9_mft_ = true;
+      using_ms_vpx_mft_ = true;
   }
 
   if (!decoder_dll) {
@@ -1561,13 +1633,15 @@
     hr = media_type->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_H264);
   } else if (codec_ == kCodecVP9) {
     hr = media_type->SetGUID(MF_MT_SUBTYPE, MEDIASUBTYPE_VP90);
+  } else if (codec_ == kCodecVP8) {
+    hr = media_type->SetGUID(MF_MT_SUBTYPE, MEDIASUBTYPE_VP80);
   } else {
     NOTREACHED();
     RETURN_ON_FAILURE(false, "Unsupported codec on input media type.", false);
   }
   RETURN_ON_HR_FAILURE(hr, "Failed to set subtype", false);
 
-  if (using_ms_vp9_mft_) {
+  if (using_ms_vpx_mft_) {
     hr = MFSetAttributeSize(media_type.Get(), MF_MT_FRAME_SIZE,
                             config_.initial_expected_coded_size.width(),
                             config_.initial_expected_coded_size.height());
diff --git a/media/gpu/windows/dxva_video_decode_accelerator_win.h b/media/gpu/windows/dxva_video_decode_accelerator_win.h
index 7135919..4377744 100644
--- a/media/gpu/windows/dxva_video_decode_accelerator_win.h
+++ b/media/gpu/windows/dxva_video_decode_accelerator_win.h
@@ -574,8 +574,8 @@
   // H/W decoding.
   bool use_dx11_;
 
-  // True when using Microsoft's VP9 HMFT for decoding.
-  bool using_ms_vp9_mft_ = false;
+  // True when using Microsoft's VPx HMFT for decoding.
+  bool using_ms_vpx_mft_ = false;
 
   // True if we should use DXGI keyed mutexes to synchronize between the two
   // contexts.
diff --git a/media/gpu/windows/supported_profile_helpers.cc b/media/gpu/windows/supported_profile_helpers.cc
index 2732a38..5004c57 100644
--- a/media/gpu/windows/supported_profile_helpers.cc
+++ b/media/gpu/windows/supported_profile_helpers.cc
@@ -9,10 +9,12 @@
 #include <memory>
 #include <utility>
 
+#include "base/feature_list.h"
 #include "base/trace_event/trace_event.h"
 #include "base/win/windows_version.h"
 #include "build/build_config.h"
 #include "gpu/config/gpu_driver_bug_workarounds.h"
+#include "media/base/media_switches.h"
 
 #if !defined(OS_WIN)
 #error This file should only be built on Windows.
@@ -189,8 +191,8 @@
                         }));
 
   for (const auto& res : resolutions_to_test) {
-    if (!media::IsResolutionSupportedForDevice(res, decoder_guid, video_device,
-                                               format)) {
+    if (!IsResolutionSupportedForDevice(res, decoder_guid, video_device,
+                                        format)) {
       break;
     }
     result.first = res;
@@ -199,8 +201,8 @@
   // The max supported portrait resolution should be just be a w/h flip of the
   // max supported landscape resolution.
   gfx::Size flipped(result.first.height(), result.first.width());
-  if (media::IsResolutionSupportedForDevice(flipped, decoder_guid, video_device,
-                                            format)) {
+  if (IsResolutionSupportedForDevice(flipped, decoder_guid, video_device,
+                                     format)) {
     result.second = flipped;
   }
 
@@ -213,45 +215,56 @@
                                ComD3D11Device device,
                                const gpu::GpuDriverBugWorkarounds& workarounds,
                                ResolutionPair* h264_resolutions,
+                               ResolutionPair* vp8_resolutions,
                                ResolutionPair* vp9_0_resolutions,
                                ResolutionPair* vp9_2_resolutions) {
   TRACE_EVENT0("gpu,startup", "GetResolutionsForDecoders");
-  if (base::win::GetVersion() > base::win::Version::WIN7) {
-    // To detect if a driver supports the desired resolutions, we try and create
-    // a DXVA decoder instance for that resolution and profile. If that succeeds
-    // we assume that the driver supports decoding for that resolution.
-    // Legacy AMD drivers with UVD3 or earlier and some Intel GPU's crash while
-    // creating surfaces larger than 1920 x 1088.
-    if (device && !IsLegacyGPU(device.Get())) {
-      ComD3D11VideoDevice video_device;
-      if (SUCCEEDED(device.As(&video_device))) {
-        *h264_resolutions = GetMaxResolutionsForGUIDs(
-            h264_resolutions->first, video_device.Get(), h264_guids,
-            {gfx::Size(2560, 1440), gfx::Size(3840, 2160),
-             gfx::Size(4096, 2160), gfx::Size(4096, 2304)});
+  if (base::win::GetVersion() <= base::win::Version::WIN7)
+    return;
 
-        if (!workarounds.disable_accelerated_vpx_decode) {
-          *vp9_0_resolutions = GetMaxResolutionsForGUIDs(
-              vp9_0_resolutions->first, video_device.Get(),
-              {D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0},
-              {gfx::Size(4096, 2160), gfx::Size(4096, 2304),
-               gfx::Size(7680, 4320), gfx::Size(8192, 4320),
-               gfx::Size(8192, 8192)});
+  // To detect if a driver supports the desired resolutions, we try and create
+  // a DXVA decoder instance for that resolution and profile. If that succeeds
+  // we assume that the driver supports decoding for that resolution.
+  // Legacy AMD drivers with UVD3 or earlier and some Intel GPU's crash while
+  // creating surfaces larger than 1920 x 1088.
+  if (!device || IsLegacyGPU(device.Get()))
+    return;
 
-          // RS3 has issues with VP9.2 decoding. See https://crbug.com/937108.
-          if (base::win::GetVersion() != base::win::Version::WIN10_RS3) {
-            *vp9_2_resolutions = GetMaxResolutionsForGUIDs(
-                vp9_2_resolutions->first, video_device.Get(),
-                {D3D11_DECODER_PROFILE_VP9_VLD_10BIT_PROFILE2},
-                {gfx::Size(4096, 2160), gfx::Size(4096, 2304),
-                 gfx::Size(7680, 4320), gfx::Size(8192, 4320),
-                 gfx::Size(8192, 8192)},
-                DXGI_FORMAT_P010);
-          }
-        }
-      }
-    }
+  ComD3D11VideoDevice video_device;
+  if (FAILED(device.As(&video_device)))
+    return;
+
+  *h264_resolutions = GetMaxResolutionsForGUIDs(
+      h264_resolutions->first, video_device.Get(), h264_guids,
+      {gfx::Size(2560, 1440), gfx::Size(3840, 2160), gfx::Size(4096, 2160),
+       gfx::Size(4096, 2304)});
+
+  if (workarounds.disable_accelerated_vpx_decode)
+    return;
+
+  if (base::FeatureList::IsEnabled(kMediaFoundationVP8Decoding)) {
+    *vp8_resolutions = GetMaxResolutionsForGUIDs(
+        vp8_resolutions->first, video_device.Get(),
+        {D3D11_DECODER_PROFILE_VP8_VLD},
+        {gfx::Size(4096, 2160), gfx::Size(4096, 2304)});
   }
+
+  *vp9_0_resolutions = GetMaxResolutionsForGUIDs(
+      vp9_0_resolutions->first, video_device.Get(),
+      {D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0},
+      {gfx::Size(4096, 2160), gfx::Size(4096, 2304), gfx::Size(7680, 4320),
+       gfx::Size(8192, 4320), gfx::Size(8192, 8192)});
+
+  // RS3 has issues with VP9.2 decoding. See https://crbug.com/937108.
+  if (base::win::GetVersion() == base::win::Version::WIN10_RS3)
+    return;
+
+  *vp9_2_resolutions = GetMaxResolutionsForGUIDs(
+      vp9_2_resolutions->first, video_device.Get(),
+      {D3D11_DECODER_PROFILE_VP9_VLD_10BIT_PROFILE2},
+      {gfx::Size(4096, 2160), gfx::Size(4096, 2304), gfx::Size(7680, 4320),
+       gfx::Size(8192, 4320), gfx::Size(8192, 8192)},
+      DXGI_FORMAT_P010);
 }
 
 }  // namespace media
diff --git a/media/gpu/windows/supported_profile_helpers.h b/media/gpu/windows/supported_profile_helpers.h
index 168b68a8..1834f0ba 100644
--- a/media/gpu/windows/supported_profile_helpers.h
+++ b/media/gpu/windows/supported_profile_helpers.h
@@ -37,11 +37,13 @@
     const std::vector<gfx::Size>& resolutions_to_test,
     DXGI_FORMAT format = DXGI_FORMAT_NV12);
 
+// TODO(dalecurtis): This function should be changed to use return values.
 MEDIA_GPU_EXPORT
 void GetResolutionsForDecoders(std::vector<GUID> h264_guids,
                                ComD3D11Device device,
                                const gpu::GpuDriverBugWorkarounds& workarounds,
                                ResolutionPair* h264_resolutions,
+                               ResolutionPair* vp8_resolutions,
                                ResolutionPair* vp9_0_resolutions,
                                ResolutionPair* vp9_2_resolutions);
 
diff --git a/media/gpu/windows/supported_profile_helpers_unittest.cc b/media/gpu/windows/supported_profile_helpers_unittest.cc
index 206871a8..67aeb7d 100644
--- a/media/gpu/windows/supported_profile_helpers_unittest.cc
+++ b/media/gpu/windows/supported_profile_helpers_unittest.cc
@@ -10,7 +10,9 @@
 #include <map>
 #include <utility>
 
+#include "base/test/scoped_feature_list.h"
 #include "base/win/windows_version.h"
+#include "media/base/media_switches.h"
 #include "media/base/test_helpers.h"
 #include "media/base/win/d3d11_mocks.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -137,13 +139,15 @@
 
   ResolutionPair h264_res_expected = {{1, 2}, {3, 4}};
   ResolutionPair h264_res = {{1, 2}, {3, 4}};
+  ResolutionPair vp8_res;
   ResolutionPair vp9_0_res;
   ResolutionPair vp9_2_res;
   GetResolutionsForDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT}, nullptr,
-                            gpu_workarounds_, &h264_res, &vp9_0_res,
+                            gpu_workarounds_, &h264_res, &vp8_res, &vp9_0_res,
                             &vp9_2_res);
 
   ASSERT_EQ(h264_res, h264_res_expected);
+  ASSERT_EQ(vp8_res, zero);
   ASSERT_EQ(vp9_0_res, zero);
   ASSERT_EQ(vp9_0_res, zero);
 }
@@ -155,13 +159,15 @@
 
   ResolutionPair h264_res_expected = {{1, 2}, {3, 4}};
   ResolutionPair h264_res = {{1, 2}, {3, 4}};
+  ResolutionPair vp8_res;
   ResolutionPair vp9_0_res;
   ResolutionPair vp9_2_res;
   GetResolutionsForDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT},
                             mock_d3d11_device_, gpu_workarounds_, &h264_res,
-                            &vp9_0_res, &vp9_2_res);
+                            &vp8_res, &vp9_0_res, &vp9_2_res);
 
   ASSERT_EQ(h264_res, h264_res_expected);
+  ASSERT_EQ(vp8_res, zero);
   ASSERT_EQ(vp9_2_res, zero);
   ASSERT_EQ(vp9_0_res, zero);
 }
@@ -173,14 +179,42 @@
   EnableDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT});
 
   ResolutionPair h264_res;
+  ResolutionPair vp8_res;
   ResolutionPair vp9_0_res;
   ResolutionPair vp9_2_res;
   GetResolutionsForDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT},
                             mock_d3d11_device_, gpu_workarounds_, &h264_res,
-                            &vp9_0_res, &vp9_2_res);
+                            &vp8_res, &vp9_0_res, &vp9_2_res);
 
   ASSERT_EQ(h264_res, tall4k);
 
+  ASSERT_EQ(vp8_res, zero);
+  ASSERT_EQ(vp9_0_res, zero);
+  ASSERT_EQ(vp9_2_res, zero);
+}
+
+TEST_F(SupportedResolutionResolverTest, VP8_Supports4k) {
+  DONT_RUN_ON_WIN_7();
+
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kMediaFoundationVP8Decoding);
+
+  EnableDecoders(
+      {D3D11_DECODER_PROFILE_H264_VLD_NOFGT, D3D11_DECODER_PROFILE_VP8_VLD});
+  SetMaxResolutionForGUID(D3D11_DECODER_PROFILE_VP8_VLD, {4096, 4096});
+
+  ResolutionPair h264_res;
+  ResolutionPair vp8_res;
+  ResolutionPair vp9_0_res;
+  ResolutionPair vp9_2_res;
+  GetResolutionsForDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT},
+                            mock_d3d11_device_, gpu_workarounds_, &h264_res,
+                            &vp8_res, &vp9_0_res, &vp9_2_res);
+
+  ASSERT_EQ(h264_res, tall4k);
+
+  ASSERT_EQ(vp8_res, tall4k);
+
   ASSERT_EQ(vp9_0_res, zero);
 
   ASSERT_EQ(vp9_2_res, zero);
@@ -194,14 +228,17 @@
   SetMaxResolutionForGUID(D3D11_DECODER_PROFILE_VP9_VLD_PROFILE0, {8192, 8192});
 
   ResolutionPair h264_res;
+  ResolutionPair vp8_res;
   ResolutionPair vp9_0_res;
   ResolutionPair vp9_2_res;
   GetResolutionsForDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT},
                             mock_d3d11_device_, gpu_workarounds_, &h264_res,
-                            &vp9_0_res, &vp9_2_res);
+                            &vp8_res, &vp9_0_res, &vp9_2_res);
 
   ASSERT_EQ(h264_res, tall4k);
 
+  ASSERT_EQ(vp8_res, zero);
+
   ASSERT_EQ(vp9_0_res, eightKsquare);
 
   ASSERT_EQ(vp9_2_res, zero);
@@ -218,14 +255,17 @@
                           {8192, 8192});
 
   ResolutionPair h264_res;
+  ResolutionPair vp8_res;
   ResolutionPair vp9_0_res;
   ResolutionPair vp9_2_res;
   GetResolutionsForDecoders({D3D11_DECODER_PROFILE_H264_VLD_NOFGT},
                             mock_d3d11_device_, gpu_workarounds_, &h264_res,
-                            &vp9_0_res, &vp9_2_res);
+                            &vp8_res, &vp9_0_res, &vp9_2_res);
 
   ASSERT_EQ(h264_res, tall4k);
 
+  ASSERT_EQ(vp8_res, zero);
+
   ASSERT_EQ(vp9_0_res, eightKsquare);
 
   ASSERT_EQ(vp9_2_res, eightKsquare);
diff --git a/media/mojo/clients/mojo_audio_decoder.cc b/media/mojo/clients/mojo_audio_decoder.cc
index ba3c743..855b0bb 100644
--- a/media/mojo/clients/mojo_audio_decoder.cc
+++ b/media/mojo/clients/mojo_audio_decoder.cc
@@ -41,6 +41,11 @@
   return true;
 }
 
+void MojoAudioDecoder::FailInit(InitCB init_cb, Status err) {
+  task_runner_->PostTask(FROM_HERE,
+                         base::BindOnce(std::move(init_cb), std::move(err)));
+}
+
 void MojoAudioDecoder::Initialize(const AudioDecoderConfig& config,
                                   CdmContext* cdm_context,
                                   InitCB init_cb,
@@ -55,8 +60,7 @@
   // This could happen during reinitialization.
   if (!remote_decoder_.is_connected()) {
     DVLOG(1) << __func__ << ": Connection error happened.";
-    task_runner_->PostTask(FROM_HERE,
-                           base::BindOnce(std::move(init_cb), false));
+    FailInit(std::move(init_cb), StatusCode::kMojoDecoderNoConnection);
     return;
   }
 
@@ -67,8 +71,8 @@
 
   if (config.is_encrypted() && CdmContext::kInvalidCdmId == cdm_id) {
     DVLOG(1) << __func__ << ": Invalid CdmContext.";
-    task_runner_->PostTask(FROM_HERE,
-                           base::BindOnce(std::move(init_cb), false));
+    FailInit(std::move(init_cb),
+             StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
@@ -172,7 +176,7 @@
   DCHECK(!remote_decoder_.is_connected());
 
   if (init_cb_) {
-    std::move(init_cb_).Run(false);
+    FailInit(std::move(init_cb_), StatusCode::kMojoDecoderNoConnection);
     return;
   }
 
@@ -182,14 +186,14 @@
     std::move(reset_cb_).Run();
 }
 
-void MojoAudioDecoder::OnInitialized(bool success,
+void MojoAudioDecoder::OnInitialized(const Status& status,
                                      bool needs_bitstream_conversion) {
-  DVLOG(1) << __func__ << ": success:" << success;
+  DVLOG(1) << __func__ << ": success:" << status.is_ok();
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   needs_bitstream_conversion_ = needs_bitstream_conversion;
 
-  if (success && !mojo_decoder_buffer_writer_) {
+  if (status.is_ok() && !mojo_decoder_buffer_writer_) {
     mojo::ScopedDataPipeConsumerHandle remote_consumer_handle;
     mojo_decoder_buffer_writer_ = MojoDecoderBufferWriter::Create(
         writer_capacity_, &remote_consumer_handle);
@@ -198,7 +202,7 @@
     remote_decoder_->SetDataSource(std::move(remote_consumer_handle));
   }
 
-  std::move(init_cb_).Run(success);
+  std::move(init_cb_).Run(std::move(status));
 }
 
 void MojoAudioDecoder::OnDecodeStatus(DecodeStatus status) {
diff --git a/media/mojo/clients/mojo_audio_decoder.h b/media/mojo/clients/mojo_audio_decoder.h
index 0fbe21b..dfbeb0d 100644
--- a/media/mojo/clients/mojo_audio_decoder.h
+++ b/media/mojo/clients/mojo_audio_decoder.h
@@ -58,8 +58,11 @@
   // Callback for connection error on |remote_decoder_|.
   void OnConnectionError();
 
+  // Fail an initialization with a Status.
+  void FailInit(InitCB init_cb, Status err);
+
   // Called when |remote_decoder_| finished initialization.
-  void OnInitialized(bool success, bool needs_bitstream_conversion);
+  void OnInitialized(const Status& status, bool needs_bitstream_conversion);
 
   // Called when |remote_decoder_| accepted or rejected DecoderBuffer.
   void OnDecodeStatus(DecodeStatus decode_status);
diff --git a/media/mojo/clients/mojo_audio_decoder_unittest.cc b/media/mojo/clients/mojo_audio_decoder_unittest.cc
index c406f26..5720977 100644
--- a/media/mojo/clients/mojo_audio_decoder_unittest.cc
+++ b/media/mojo/clients/mojo_audio_decoder_unittest.cc
@@ -82,7 +82,7 @@
   }
 
   // Completion callbacks.
-  MOCK_METHOD1(OnInitialized, void(bool));
+  MOCK_METHOD1(OnInitialized, void(Status));
   MOCK_METHOD1(OnOutput, void(scoped_refptr<AudioBuffer>));
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
   MOCK_METHOD1(OnDecoded, void(DecodeStatus));
@@ -117,7 +117,7 @@
 
     EXPECT_CALL(*mock_audio_decoder_, Initialize_(_, _, _, _, _))
         .WillRepeatedly(DoAll(SaveArg<3>(&output_cb_), SaveArg<4>(&waiting_cb_),
-                              RunOnceCallback<2>(true)));
+                              RunOnceCallback<2>(OkStatus())));
     EXPECT_CALL(*mock_audio_decoder_, Decode(_, _))
         .WillRepeatedly(
             DoAll(InvokeWithoutArgs(this, &MojoAudioDecoderTest::ReturnOutput),
@@ -135,9 +135,9 @@
     mojo_audio_decoder_->set_writer_capacity_for_testing(capacity);
   }
 
-  void InitializeAndExpect(bool success) {
-    DVLOG(1) << __func__ << ": success=" << success;
-    EXPECT_CALL(*this, OnInitialized(success))
+  void InitializeAndExpect(Status status) {
+    DVLOG(1) << __func__ << ": success=" << status.code();
+    EXPECT_CALL(*this, OnInitialized(SameStatusCode(status)))
         .WillOnce(InvokeWithoutArgs(this, &MojoAudioDecoderTest::QuitLoop));
 
     AudioDecoderConfig audio_config(kCodecVorbis, kSampleFormat, kChannelLayout,
@@ -156,7 +156,7 @@
     RunLoop();
   }
 
-  void Initialize() { InitializeAndExpect(true); }
+  void Initialize() { InitializeAndExpect(OkStatus()); }
 
   void Decode() {
     scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(100));
diff --git a/media/mojo/clients/mojo_video_decoder.cc b/media/mojo/clients/mojo_video_decoder.cc
index 670d1a5..cc5d5aa 100644
--- a/media/mojo/clients/mojo_video_decoder.cc
+++ b/media/mojo/clients/mojo_video_decoder.cc
@@ -137,6 +137,11 @@
   return "MojoVideoDecoder";
 }
 
+void MojoVideoDecoder::FailInit(InitCB init_cb, Status err) {
+  task_runner_->PostTask(FROM_HERE,
+                         base::BindOnce(std::move(init_cb), std::move(err)));
+}
+
 void MojoVideoDecoder::Initialize(const VideoDecoderConfig& config,
                                   bool low_delay,
                                   CdmContext* cdm_context,
@@ -150,8 +155,7 @@
   if (gpu_factories_ && gpu_factories_->IsDecoderConfigSupported(
                             video_decoder_implementation_, config) ==
                             GpuVideoAcceleratorFactories::Supported::kFalse) {
-    task_runner_->PostTask(FROM_HERE,
-                           base::BindOnce(std::move(init_cb), false));
+    FailInit(std::move(init_cb), StatusCode::kDecoderUnsupportedConfig);
     return;
   }
 
@@ -165,8 +169,8 @@
   // is passed for reinitialization.
   if (config.is_encrypted() && CdmContext::kInvalidCdmId == cdm_id) {
     DVLOG(1) << __func__ << ": Invalid CdmContext.";
-    task_runner_->PostTask(FROM_HERE,
-                           base::BindOnce(std::move(init_cb), false));
+    FailInit(std::move(init_cb),
+             StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
@@ -176,8 +180,7 @@
   }
 
   if (has_connection_error_) {
-    task_runner_->PostTask(FROM_HERE,
-                           base::BindOnce(std::move(init_cb), false));
+    FailInit(std::move(init_cb), StatusCode::kMojoDecoderNoConnection);
     return;
   }
 
@@ -192,12 +195,12 @@
                      base::Unretained(this)));
 }
 
-void MojoVideoDecoder::OnInitializeDone(bool status,
+void MojoVideoDecoder::OnInitializeDone(const Status& status,
                                         bool needs_bitstream_conversion,
                                         int32_t max_decode_requests) {
-  DVLOG(1) << __func__ << ": status = " << status;
+  DVLOG(1) << __func__ << ": status = " << std::hex << status.code();
   DCHECK(task_runner_->BelongsToCurrentThread());
-  initialized_ = status;
+  initialized_ = status.is_ok();
   needs_bitstream_conversion_ = needs_bitstream_conversion;
   max_decode_requests_ = max_decode_requests;
   std::move(init_cb_).Run(status);
@@ -427,7 +430,8 @@
   base::WeakPtr<MojoVideoDecoder> weak_this = weak_this_;
 
   if (init_cb_)
-    std::move(init_cb_).Run(false);
+    std::move(init_cb_).Run(StatusCode::kMojoDecoderStoppedBeforeInitDone);
+
   if (!weak_this)
     return;
 
diff --git a/media/mojo/clients/mojo_video_decoder.h b/media/mojo/clients/mojo_video_decoder.h
index 752ace2..449b60a 100644
--- a/media/mojo/clients/mojo_video_decoder.h
+++ b/media/mojo/clients/mojo_video_decoder.h
@@ -9,6 +9,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "media/base/status.h"
 #include "media/base/video_decoder.h"
 #include "media/base/video_frame.h"
 #include "media/mojo/clients/mojo_media_log_service.h"
@@ -83,7 +84,8 @@
   }
 
  private:
-  void OnInitializeDone(bool status,
+  void FailInit(InitCB init_cb, Status err);
+  void OnInitializeDone(const Status& status,
                         bool needs_bitstream_conversion,
                         int32_t max_decode_requests);
   void OnDecodeDone(uint64_t decode_id, DecodeStatus status);
diff --git a/media/mojo/mojom/audio_decoder.mojom b/media/mojo/mojom/audio_decoder.mojom
index 73b6ac0..2224ce6 100644
--- a/media/mojo/mojom/audio_decoder.mojom
+++ b/media/mojo/mojom/audio_decoder.mojom
@@ -18,7 +18,7 @@
   // with whether the initialization succeeded, and whether the pipeline needs
   // bitstream conversion.
   Initialize(AudioDecoderConfig config, int32 cdm_id)
-    => (bool success, bool needs_bitstream_conversion);
+    => (Status success, bool needs_bitstream_conversion);
 
   // Establishes data connection. Should be called before Decode().
   SetDataSource(handle<data_pipe_consumer> receive_pipe);
diff --git a/media/mojo/mojom/video_decoder.mojom b/media/mojo/mojom/video_decoder.mojom
index 2fdaddd2..87ddcf71 100644
--- a/media/mojo/mojom/video_decoder.mojom
+++ b/media/mojo/mojom/video_decoder.mojom
@@ -125,7 +125,7 @@
   // |cdm_id| must refer to a valid CDM if |config.is_encrypted()|.  It is not
   // used for unencrypted streams.
   Initialize(VideoDecoderConfig config, bool low_delay, int32 cdm_id) =>
-      (bool success, bool needs_bitstream_conversion,
+      (Status status, bool needs_bitstream_conversion,
        int32 max_decode_requests);
 
   // Request decoding of exactly one frame or an EOS buffer. This must not be
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc
index de74d39e..5074b435 100644
--- a/media/mojo/services/gpu_mojo_media_client.cc
+++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -156,13 +156,16 @@
 #if defined(OS_WIN)
   // Start with the configurations supported by D3D11VideoDecoder.
   // VdaVideoDecoder is still used as a fallback.
-  if (!d3d11_supported_configs_) {
-    d3d11_supported_configs_ =
-        D3D11VideoDecoder::GetSupportedVideoDecoderConfigs(
-            gpu_preferences_, gpu_workarounds_, GetD3D11DeviceCallback());
+
+  if (base::FeatureList::IsEnabled(kD3D11VideoDecoder)) {
+    if (!d3d11_supported_configs_) {
+      d3d11_supported_configs_ =
+          D3D11VideoDecoder::GetSupportedVideoDecoderConfigs(
+              gpu_preferences_, gpu_workarounds_, GetD3D11DeviceCallback());
+    }
+    supported_config_map[VideoDecoderImplementation::kAlternate] =
+        *d3d11_supported_configs_;
   }
-  supported_config_map[VideoDecoderImplementation::kAlternate] =
-      *d3d11_supported_configs_;
 
 #elif BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION)
   if (IsNewAcceleratedVideoDecoderUsed(gpu_preferences_)) {
@@ -176,6 +179,14 @@
   }
 #endif
 
+#if defined(OS_WIN)
+  if (gpu_workarounds_.disable_dxva_video_decoder) {
+    // If DXVA isn't supported, then return without any supported configs for
+    // the |kDefault| decoder.
+    return supported_config_map;
+  }
+#endif  // defined(OS_WIN)
+
   auto& default_configs =
       supported_config_map[VideoDecoderImplementation::kDefault];
 
@@ -269,6 +280,11 @@
       }
 
 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_LINUX)
+#if defined(OS_WIN)
+      // Don't instantiate the DXVA decoder if it's not supported.
+      if (gpu_workarounds_.disable_dxva_video_decoder)
+        return nullptr;
+#endif  // defined(OS_WIN)
       video_decoder = VdaVideoDecoder::Create(
           task_runner, gpu_task_runner_, media_log->Clone(), target_color_space,
           gpu_preferences_, gpu_workarounds_,
diff --git a/media/mojo/services/mojo_audio_decoder_service.cc b/media/mojo/services/mojo_audio_decoder_service.cc
index 16a42f2f..12fcc28 100644
--- a/media/mojo/services/mojo_audio_decoder_service.cc
+++ b/media/mojo/services/mojo_audio_decoder_service.cc
@@ -52,7 +52,8 @@
 
   if (config.is_encrypted() && !cdm_context) {
     DVLOG(1) << "CdmContext for " << cdm_id << " not found for encrypted audio";
-    OnInitialized(std::move(callback), false);
+    OnInitialized(std::move(callback),
+                  StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
@@ -90,17 +91,18 @@
 }
 
 void MojoAudioDecoderService::OnInitialized(InitializeCallback callback,
-                                            bool success) {
-  DVLOG(1) << __func__ << " success:" << success;
+                                            Status status) {
+  DVLOG(1) << __func__ << " success:" << status.is_ok();
 
-  if (!success) {
+  if (!status.is_ok()) {
     cdm_context_ref_.reset();
     // Do not call decoder_->NeedsBitstreamConversion() if init failed.
-    std::move(callback).Run(false, false);
+    std::move(callback).Run(std::move(status), false);
     return;
   }
 
-  std::move(callback).Run(success, decoder_->NeedsBitstreamConversion());
+  std::move(callback).Run(std::move(status),
+                          decoder_->NeedsBitstreamConversion());
 }
 
 // The following methods are needed so that we can bind them with a weak pointer
diff --git a/media/mojo/services/mojo_audio_decoder_service.h b/media/mojo/services/mojo_audio_decoder_service.h
index 872f9f7..709b2ab 100644
--- a/media/mojo/services/mojo_audio_decoder_service.h
+++ b/media/mojo/services/mojo_audio_decoder_service.h
@@ -45,7 +45,7 @@
 
  private:
   // Called by |decoder_| upon finishing initialization.
-  void OnInitialized(InitializeCallback callback, bool success);
+  void OnInitialized(InitializeCallback callback, Status status);
 
   // Called by |mojo_decoder_buffer_reader_| when read is finished.
   void OnReadDone(DecodeCallback callback, scoped_refptr<DecoderBuffer> buffer);
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc
index 84a98ad..e3efb74 100644
--- a/media/mojo/services/mojo_video_decoder_service.cc
+++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -99,8 +99,12 @@
 MojoVideoDecoderService::~MojoVideoDecoderService() {
   DVLOG(1) << __func__;
 
-  if (init_cb_)
-    OnDecoderInitialized(false);
+  if (init_cb_) {
+    OnDecoderInitialized(
+        Status(StatusCode::kMojoDecoderDeletedWithoutInitialization)
+            .WithData("decoder", "MojoVideoDecoder"));
+  }
+
   if (reset_cb_)
     OnDecoderReset();
 
@@ -172,7 +176,7 @@
   init_cb_ = std::move(callback);
 
   if (!decoder_) {
-    OnDecoderInitialized(false);
+    OnDecoderInitialized(StatusCode::kMojoDecoderNoWrappedDecoder);
     return;
   }
 
@@ -191,7 +195,7 @@
 
   if (config.is_encrypted() && !cdm_context) {
     DVLOG(1) << "CdmContext for " << cdm_id << " not found for encrypted video";
-    OnDecoderInitialized(false);
+    OnDecoderInitialized(StatusCode::kDecoderMissingCdmForEncryptedContent);
     return;
   }
 
@@ -254,19 +258,19 @@
       base::BindOnce(&MojoVideoDecoderService::OnReaderFlushed, weak_this_));
 }
 
-void MojoVideoDecoderService::OnDecoderInitialized(bool success) {
+void MojoVideoDecoderService::OnDecoderInitialized(Status status) {
   DVLOG(1) << __func__;
-  DCHECK(!success || decoder_);
+  DCHECK(!status.is_ok() || decoder_);
   DCHECK(init_cb_);
   TRACE_EVENT_ASYNC_END1("media", kInitializeTraceName, this, "success",
-                         success);
+                         status.code());
 
-  if (!success)
+  if (!status.is_ok())
     cdm_context_ref_.reset();
 
   std::move(init_cb_).Run(
-      success, success ? decoder_->NeedsBitstreamConversion() : false,
-      success ? decoder_->GetMaxDecodeRequests() : 1);
+      status, status.is_ok() ? decoder_->NeedsBitstreamConversion() : false,
+      status.is_ok() ? decoder_->GetMaxDecodeRequests() : 1);
 }
 
 void MojoVideoDecoderService::OnReaderRead(
diff --git a/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h
index fb9180f2..f7f9749 100644
--- a/media/mojo/services/mojo_video_decoder_service.h
+++ b/media/mojo/services/mojo_video_decoder_service.h
@@ -67,7 +67,7 @@
   // running mojom::VideoDecoder callbacks after connection error happens and
   // |this| is deleted. It's not safe to run the callbacks after a connection
   // error.
-  void OnDecoderInitialized(bool success);
+  void OnDecoderInitialized(Status status);
   void OnReaderRead(DecodeCallback callback,
                     std::unique_ptr<ScopedDecodeTrace> trace_event,
                     scoped_refptr<DecoderBuffer> buffer);
diff --git a/media/mojo/test/mojo_video_decoder_integration_test.cc b/media/mojo/test/mojo_video_decoder_integration_test.cc
index 2395b0c..6f8c6e3 100644
--- a/media/mojo/test/mojo_video_decoder_integration_test.cc
+++ b/media/mojo/test/mojo_video_decoder_integration_test.cc
@@ -244,9 +244,10 @@
   bool Initialize() {
     CreateClient();
 
-    EXPECT_CALL(*decoder_, DoInitialize(_)).WillOnce(RunOnceCallback<0>(true));
+    EXPECT_CALL(*decoder_, DoInitialize(_))
+        .WillOnce(RunOnceCallback<0>(OkStatus()));
 
-    bool result = false;
+    Status result = OkStatus();
     StrictMock<base::MockCallback<VideoDecoder::InitCB>> init_cb;
     EXPECT_CALL(init_cb, Run(_)).WillOnce(SaveArg<0>(&result));
 
@@ -254,7 +255,7 @@
                         init_cb.Get(), output_cb_.Get(), waiting_cb_.Get());
     RunUntilIdle();
 
-    return result;
+    return result.is_ok();
   }
 
   DecodeStatus Decode(scoped_refptr<DecoderBuffer> buffer,
@@ -390,7 +391,8 @@
   CreateClient();
 
   StrictMock<base::MockCallback<VideoDecoder::InitCB>> init_cb;
-  EXPECT_CALL(init_cb, Run(false));
+  EXPECT_CALL(init_cb,
+              Run(HasStatusCode(StatusCode::kMojoDecoderNoWrappedDecoder)));
 
   // Clear |decoder_| so that Initialize() should fail.
   decoder_.reset();
@@ -403,7 +405,9 @@
   CreateClient();
 
   StrictMock<base::MockCallback<VideoDecoder::InitCB>> init_cb;
-  EXPECT_CALL(init_cb, Run(false));
+  EXPECT_CALL(
+      init_cb,
+      Run(HasStatusCode(StatusCode::kDecoderMissingCdmForEncryptedContent)));
 
   // CdmContext* (3rd parameter) is not provided but the VideoDecoderConfig
   // specifies encrypted video, so Initialize() should fail.
diff --git a/media/parsers/vp8_parser.cc b/media/parsers/vp8_parser.cc
index 04345b5..b38e3048 100644
--- a/media/parsers/vp8_parser.cc
+++ b/media/parsers/vp8_parser.cc
@@ -139,6 +139,9 @@
     unsigned int data;
     BD_READ_UNSIGNED_OR_RETURN(1, &data);  // color_space
     BD_READ_UNSIGNED_OR_RETURN(1, &data);  // clamping_type
+    fhdr->is_full_range = data == 1;
+  } else {
+    fhdr->is_full_range = false;
   }
 
   if (!ParseSegmentationHeader(keyframe))
diff --git a/media/parsers/vp8_parser.h b/media/parsers/vp8_parser.h
index 11585bc..546addc 100644
--- a/media/parsers/vp8_parser.h
+++ b/media/parsers/vp8_parser.h
@@ -161,6 +161,9 @@
   uint8_t bool_dec_range;
   uint8_t bool_dec_value;
   uint8_t bool_dec_count;
+
+  // Color range information.
+  bool is_full_range;
 };
 
 // A parser for raw VP8 streams as specified in RFC 6386.
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc
index 497ddb1..12a1def 100644
--- a/media/renderers/audio_renderer_impl.cc
+++ b/media/renderers/audio_renderer_impl.cc
@@ -721,7 +721,7 @@
   play_delay_cb_for_testing_ = std::move(cb);
 }
 
-void AudioRendererImpl::DecodedAudioReady(AudioDecoderStream::Status status,
+void AudioRendererImpl::DecodedAudioReady(AudioDecoderStream::ReadStatus status,
                                           scoped_refptr<AudioBuffer> buffer) {
   DVLOG(2) << __func__ << "(" << status << ")";
   DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h
index 480373b..35a6846 100644
--- a/media/renderers/audio_renderer_impl.h
+++ b/media/renderers/audio_renderer_impl.h
@@ -133,7 +133,7 @@
                             OutputDeviceInfo output_device_info);
 
   // Callback from the audio decoder delivering decoded audio samples.
-  void DecodedAudioReady(AudioDecoderStream::Status status,
+  void DecodedAudioReady(AudioDecoderStream::ReadStatus status,
                          scoped_refptr<AudioBuffer> buffer);
 
   // Handles buffers that come out of decoder (MSE: after passing through
diff --git a/media/renderers/audio_renderer_impl_unittest.cc b/media/renderers/audio_renderer_impl_unittest.cc
index 03f3eea..32dd842 100644
--- a/media/renderers/audio_renderer_impl_unittest.cc
+++ b/media/renderers/audio_renderer_impl_unittest.cc
@@ -89,7 +89,10 @@
     if (!enter_pending_decoder_init_) {
       EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
           .WillOnce(DoAll(SaveArg<3>(&output_cb_),
-                          RunOnceCallback<2>(expected_init_result_)));
+                          RunOnceCallback<2>(
+                              expected_init_result_
+                                  ? OkStatus()
+                                  : Status(StatusCode::kCodeOnlyForTesting))));
     } else {
       EXPECT_CALL(*decoder, Initialize_(_, _, _, _, _))
           .WillOnce(EnterPendingDecoderInitStateAction(this));
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
index 631ff2f..e703824 100644
--- a/media/renderers/video_renderer_impl.cc
+++ b/media/renderers/video_renderer_impl.cc
@@ -487,7 +487,7 @@
   }
 }
 
-void VideoRendererImpl::FrameReady(VideoDecoderStream::Status status,
+void VideoRendererImpl::FrameReady(VideoDecoderStream::ReadStatus status,
                                    scoped_refptr<VideoFrame> frame) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   base::AutoLock auto_lock(lock_);
diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h
index fe9a6fa..bfb3d5e 100644
--- a/media/renderers/video_renderer_impl.h
+++ b/media/renderers/video_renderer_impl.h
@@ -107,7 +107,7 @@
 
   // Callback for |video_decoder_stream_| to deliver decoded video frames and
   // report video decoding status.
-  void FrameReady(VideoDecoderStream::Status status,
+  void FrameReady(VideoDecoderStream::ReadStatus status,
                   scoped_refptr<VideoFrame> frame);
 
   // Helper method for enqueueing a frame to |alogorithm_|.
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc
index 5e5778de..8eeb090 100644
--- a/media/renderers/video_renderer_impl_unittest.cc
+++ b/media/renderers/video_renderer_impl_unittest.cc
@@ -66,8 +66,11 @@
     std::vector<std::unique_ptr<VideoDecoder>> decoders;
     decoders.push_back(base::WrapUnique(decoder_));
     ON_CALL(*decoder_, Initialize_(_, _, _, _, _, _))
-        .WillByDefault(DoAll(SaveArg<4>(&output_cb_),
-                             RunOnceCallback<3>(expect_init_success_)));
+        .WillByDefault(DoAll(
+            SaveArg<4>(&output_cb_),
+            RunOnceCallback<3>(expect_init_success_
+                                   ? OkStatus()
+                                   : Status(StatusCode::kCodeOnlyForTesting))));
     // Monitor decodes from the decoder.
     ON_CALL(*decoder_, Decode_(_, _))
         .WillByDefault(Invoke(this, &VideoRendererImplTest::DecodeRequested));
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc
index b88eb86..9b37fe6c 100644
--- a/media/test/pipeline_integration_test.cc
+++ b/media/test/pipeline_integration_test.cc
@@ -357,7 +357,7 @@
                   InitCB init_cb,
                   const OutputCB& output_cb,
                   const WaitingCB& waiting_cb) override {
-    std::move(init_cb).Run(true);
+    std::move(init_cb).Run(OkStatus());
   }
   void Decode(scoped_refptr<DecoderBuffer> buffer,
               DecodeCB decode_cb) override {
diff --git a/media/video/video_decode_accelerator.cc b/media/video/video_decode_accelerator.cc
index 58f6665..ef50d17 100644
--- a/media/video/video_decode_accelerator.cc
+++ b/media/video/video_decode_accelerator.cc
@@ -25,7 +25,7 @@
 }
 
 void VideoDecodeAccelerator::Client::NotifyInitializationComplete(
-    bool success) {
+    Status status) {
   NOTREACHED() << "By default deferred initialization is not supported.";
 }
 
diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h
index 262600a..bc43ae05 100644
--- a/media/video/video_decode_accelerator.h
+++ b/media/video/video_decode_accelerator.h
@@ -19,6 +19,7 @@
 #include "media/base/decoder_buffer.h"
 #include "media/base/encryption_scheme.h"
 #include "media/base/overlay_info.h"
+#include "media/base/status.h"
 #include "media/base/video_decoder_config.h"
 #include "media/video/picture.h"
 #include "ui/gfx/color_space.h"
@@ -200,7 +201,7 @@
     // call to VDA::Initialize returns true.
     // The default implementation is a NOTREACHED, since deferred initialization
     // is not supported by default.
-    virtual void NotifyInitializationComplete(bool success);
+    virtual void NotifyInitializationComplete(Status status);
 
     // Callback to tell client how many and what size of buffers to provide.
     // Note that the actual count provided through AssignPictureBuffers() can be
diff --git a/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl b/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
index b2ca3ea..92469710 100644
--- a/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl
@@ -140,7 +140,17 @@
 {%-     endfor %}
 {%-   else %}
 {%-     for packed_field in byte.packed_fields %}
-    val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_snippet}};
+{%-       if packed_field.min_version > 0 %}
+    if (version >= {{packed_field.min_version}}) {
+      val.{{packed_field.field.name}} =
+          decoder.{{packed_field.field.kind|decode_snippet}};
+    } else {
+      val.{{packed_field.field.name}} = null;
+    }
+{%-       else %}
+    val.{{packed_field.field.name}} =
+        decoder.{{packed_field.field.kind|decode_snippet}};
+{%-       endif %}
 {%-     endfor %}
 {%-   endif %}
 {%-   if byte.is_padding %}
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 85b74c2..7877cf7 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -844,6 +844,7 @@
       "proxy_resolution/proxy_resolution_request.h",
       "proxy_resolution/proxy_resolution_request_impl.cc",
       "proxy_resolution/proxy_resolution_request_impl.h",
+      "proxy_resolution/proxy_resolution_service.h",
       "proxy_resolution/proxy_resolve_dns_operation.h",
       "proxy_resolution/proxy_resolver.h",
       "proxy_resolution/proxy_resolver_error_observer.h",
diff --git a/net/base/proxy_delegate.h b/net/base/proxy_delegate.h
index 5ab89be..6f68a442 100644
--- a/net/base/proxy_delegate.h
+++ b/net/base/proxy_delegate.h
@@ -30,8 +30,8 @@
   // Called as the proxy is being resolved for |url| for a |method| request.
   // The caller may pass an empty string to get method agnostic resoulution.
   // Allows the delegate to override the proxy resolution decision made by
-  // ConfiguredProxyResolutionService. The delegate may override the decision by
-  // modifying the ProxyInfo |result|.
+  // ProxyResolutionService. The delegate may override the decision by modifying
+  // the ProxyInfo |result|.
   virtual void OnResolveProxy(const GURL& url,
                               const std::string& method,
                               const ProxyRetryInfoMap& proxy_retry_info,
diff --git a/net/base/proxy_server.h b/net/base/proxy_server.h
index be24a0b5..0709674 100644
--- a/net/base/proxy_server.h
+++ b/net/base/proxy_server.h
@@ -26,7 +26,7 @@
  public:
   // The type of proxy. These are defined as bit flags so they can be ORed
   // together to pass as the |scheme_bit_field| argument to
-  // ConfiguredProxyResolutionService::RemoveProxiesWithoutScheme().
+  // ProxyList::RemoveProxiesWithoutScheme().
   enum Scheme {
     SCHEME_INVALID = 1 << 0,
     SCHEME_DIRECT  = 1 << 1,
diff --git a/net/cert_net/cert_net_fetcher_url_request_unittest.cc b/net/cert_net/cert_net_fetcher_url_request_unittest.cc
index 13c6df91..c8e091e 100644
--- a/net/cert_net/cert_net_fetcher_url_request_unittest.cc
+++ b/net/cert_net/cert_net_fetcher_url_request_unittest.cc
@@ -19,6 +19,7 @@
 #include "net/cert/multi_log_ct_verifier.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_server_properties.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/gtest_util.h"
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc
index f7d2032..f8c98061 100644
--- a/net/cookies/canonical_cookie.cc
+++ b/net/cookies/canonical_cookie.cc
@@ -1063,8 +1063,8 @@
         &out, {"WARN_SAMESITE_LAX_METHOD_UNSAFE_CROSS_SCHEME_INSECURE_URL, "});
   if (HasWarningReason(WARN_SAMESITE_LAX_CROSS_SCHEME_INSECURE_URL))
     base::StrAppend(&out, {"WARN_SAMESITE_LAX_CROSS_SCHEME_INSECURE_URL, "});
-  if (HasWarningReason(WARN_SAMESITE_UNSPECIFIED_LAX_ALLOW_UNSAFE))
-    base::StrAppend(&out, {"WARN_SAMESITE_UNSPECIFIED_LAX_ALLOW_UNSAFE, "});
+  if (HasWarningReason(WARN_SAMESITE_STRICT_CROSS_SCHEME_INSECURE_URL))
+    base::StrAppend(&out, {"WARN_SAMESITE_STRICT_CROSS_SCHEME_INSECURE_URL, "});
 
   // Strip trailing comma and space.
   out.erase(out.end() - 2, out.end());
diff --git a/net/http/http_network_layer.h b/net/http/http_network_layer.h
index 956e0f4..1b949badc 100644
--- a/net/http/http_network_layer.h
+++ b/net/http/http_network_layer.h
@@ -24,8 +24,8 @@
                                     public base::PowerObserver {
  public:
   // Construct a HttpNetworkLayer with an existing HttpNetworkSession which
-  // contains a valid ConfiguredProxyResolutionService. The HttpNetworkLayer
-  // must be destroyed before |session|.
+  // contains a valid ProxyResolutionService. The HttpNetworkLayer must be
+  // destroyed before |session|.
   explicit HttpNetworkLayer(HttpNetworkSession* session);
   ~HttpNetworkLayer() override;
 
diff --git a/net/http/http_network_layer_unittest.cc b/net/http/http_network_layer_unittest.cc
index 2a6350be..7e45ccb 100644
--- a/net/http/http_network_layer_unittest.cc
+++ b/net/http/http_network_layer_unittest.cc
@@ -271,7 +271,7 @@
   std::unique_ptr<TransportSecurityState> transport_security_state_;
   MultiLogCTVerifier ct_verifier_;
   DefaultCTPolicyEnforcer ct_policy_enforcer_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<SSLConfigService> ssl_config_service_;
   QuicContext quic_context_;
   std::unique_ptr<HttpNetworkSession> network_session_;
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 321b65d..f786046 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -24,7 +24,7 @@
 #include "net/http/http_response_body_drainer.h"
 #include "net/http/http_stream_factory.h"
 #include "net/http/url_security_manager.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/quic/platform/impl/quic_chromium_clock.h"
 #include "net/quic/quic_crypto_client_stream_factory.h"
 #include "net/quic/quic_stream_factory.h"
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index 306ede0..92530037 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -64,7 +64,7 @@
 #endif
 class NetworkQualityEstimator;
 class ProxyDelegate;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class ProxyServer;
 class QuicCryptoClientStreamFactory;
 #if BUILDFLAG(ENABLE_REPORTING)
@@ -158,7 +158,7 @@
     TransportSecurityState* transport_security_state;
     CTVerifier* cert_transparency_verifier;
     CTPolicyEnforcer* ct_policy_enforcer;
-    ConfiguredProxyResolutionService* proxy_resolution_service;
+    ProxyResolutionService* proxy_resolution_service;
     ProxyDelegate* proxy_delegate;
     const HttpUserAgentSettings* http_user_agent_settings;
     SSLConfigService* ssl_config_service;
@@ -201,7 +201,7 @@
                                   const ProxyServer& proxy_server);
 
   CertVerifier* cert_verifier() { return cert_verifier_; }
-  ConfiguredProxyResolutionService* proxy_resolution_service() {
+  ProxyResolutionService* proxy_resolution_service() {
     return proxy_resolution_service_;
   }
   SSLConfigService* ssl_config_service() { return ssl_config_service_; }
@@ -296,7 +296,7 @@
   ReportingService* const reporting_service_;
   NetworkErrorLoggingService* const network_error_logging_service_;
 #endif
-  ConfiguredProxyResolutionService* const proxy_resolution_service_;
+  ProxyResolutionService* const proxy_resolution_service_;
   SSLConfigService* const ssl_config_service_;
 
   HttpAuthCache http_auth_cache_;
diff --git a/net/http/http_network_session_peer.cc b/net/http/http_network_session_peer.cc
index f2bfc74e..c9440d6 100644
--- a/net/http/http_network_session_peer.cc
+++ b/net/http/http_network_session_peer.cc
@@ -4,7 +4,7 @@
 
 #include "net/http/http_network_session_peer.h"
 
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/client_socket_pool_manager.h"
 #include "net/socket/transport_client_socket_pool.h"
 
diff --git a/net/http/http_network_transaction.h b/net/http/http_network_transaction.h
index 9ae38bc..c35c065 100644
--- a/net/http/http_network_transaction.h
+++ b/net/http/http_network_transaction.h
@@ -30,7 +30,7 @@
 #include "net/http/http_transaction.h"
 #include "net/log/net_log_with_source.h"
 #include "net/net_buildflags.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/connection_attempts.h"
 #include "net/ssl/ssl_config_service.h"
 #include "net/websockets/websocket_handshake_stream_base.h"
diff --git a/net/http/http_response_body_drainer_unittest.cc b/net/http/http_response_body_drainer_unittest.cc
index 73735b27..fbe81ff7 100644
--- a/net/http/http_response_body_drainer_unittest.cc
+++ b/net/http/http_response_body_drainer_unittest.cc
@@ -255,7 +255,7 @@
     return new HttpNetworkSession(HttpNetworkSession::Params(), context);
   }
 
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<SSLConfigService> ssl_config_service_;
   std::unique_ptr<HttpServerProperties> http_server_properties_;
   MockCertVerifier cert_verifier_;
diff --git a/net/http/http_stream_factory_job.h b/net/http/http_stream_factory_job.h
index b116272..7ab4e17 100644
--- a/net/http/http_stream_factory_job.h
+++ b/net/http/http_stream_factory_job.h
@@ -23,7 +23,7 @@
 #include "net/http/http_request_info.h"
 #include "net/http/http_stream_factory.h"
 #include "net/http/http_stream_request.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/quic/quic_stream_factory.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/client_socket_pool.h"
diff --git a/net/http/http_stream_factory_job_controller_unittest.cc b/net/http/http_stream_factory_job_controller_unittest.cc
index d4102db3..1dfc39f5 100644
--- a/net/http/http_stream_factory_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_job_controller_unittest.cc
@@ -233,10 +233,9 @@
       session_deps_.socket_factory->AddSocketDataProvider(tcp_data_.get());
 
     if (use_alternative_proxy_) {
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service =
-              ConfiguredProxyResolutionService::CreateFixedFromPacResult(
-                  "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
+          ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+              "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
       session_deps_.proxy_resolution_service =
           std::move(proxy_resolution_service);
     }
@@ -460,8 +459,8 @@
     : public HttpStreamFactoryJobControllerTest,
       public ::testing::WithParamInterface<::testing::tuple<bool, int>> {
  public:
-  void Initialize(std::unique_ptr<ConfiguredProxyResolutionService>
-                      proxy_resolution_service) {
+  void Initialize(
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
     session_deps_.proxy_resolution_service =
         std::move(proxy_resolution_service);
     session_ = std::make_unique<HttpNetworkSession>(
@@ -705,7 +704,7 @@
 TEST_F(JobControllerReconsiderProxyAfterErrorTest,
        SecondMainJobIsStartedAfterAltProxyServerJobFailed) {
   // Configure the proxies and initialize the test.
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           "HTTPS myproxy.org:443; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
 
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc
index 652ba0f..116154f 100644
--- a/net/http/http_stream_factory_unittest.cc
+++ b/net/http/http_stream_factory_unittest.cc
@@ -832,9 +832,8 @@
 
 // Tests that a bad QUIC proxy is added to the list of bad proxies.
 TEST_F(HttpStreamFactoryTest, QuicProxyMarkedAsBad) {
-  for (size_t i = 0; i < base::size(quic_proxy_test_mock_errors); ++i) {
-    std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service;
-    proxy_resolution_service =
+  for (int quic_proxy_test_mock_error : quic_proxy_test_mock_errors) {
+    std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
         ConfiguredProxyResolutionService::CreateFixedFromPacResult(
             "QUIC bad:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
 
@@ -869,7 +868,7 @@
 
     StaticSocketDataProvider socket_data1;
     socket_data1.set_connect_data(
-        MockConnect(ASYNC, quic_proxy_test_mock_errors[i]));
+        MockConnect(ASYNC, quic_proxy_test_mock_error));
     socket_factory.AddSocketDataProvider(&socket_data1);
 
     // Second connection attempt succeeds.
@@ -898,11 +897,11 @@
     // proxy_resolution_service as bad.
     const ProxyRetryInfoMap& retry_info =
         session->proxy_resolution_service()->proxy_retry_info();
-    EXPECT_EQ(1u, retry_info.size()) << quic_proxy_test_mock_errors[i];
+    EXPECT_EQ(1u, retry_info.size()) << quic_proxy_test_mock_error;
     EXPECT_TRUE(waiter.used_proxy_info().is_direct());
 
     auto iter = retry_info.find("quic://bad:99");
-    EXPECT_TRUE(iter != retry_info.end()) << quic_proxy_test_mock_errors[i];
+    EXPECT_TRUE(iter != retry_info.end()) << quic_proxy_test_mock_error;
   }
 }
 
@@ -977,7 +976,7 @@
     HttpNetworkSession::Params* session_params,
     HttpNetworkSession::Context* session_context,
     MockClientSocketFactory* socket_factory,
-    ConfiguredProxyResolutionService* proxy_resolution_service,
+    ProxyResolutionService* proxy_resolution_service,
     TestProxyDelegate* test_proxy_delegate,
     HttpServerProperties* http_server_properties,
     MockCertVerifier* cert_verifier,
@@ -1025,11 +1024,10 @@
       HttpNetworkSession::Params session_params;
       HttpNetworkSession::Context session_context;
       MockClientSocketFactory socket_factory;
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service =
-              ConfiguredProxyResolutionService::CreateFixedFromPacResult(
-                  "HTTPS badproxy:99; HTTPS badfallbackproxy:98; DIRECT",
-                  TRAFFIC_ANNOTATION_FOR_TESTS);
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
+          ConfiguredProxyResolutionService::CreateFixedFromPacResult(
+              "HTTPS badproxy:99; HTTPS badfallbackproxy:98; DIRECT",
+              TRAFFIC_ANNOTATION_FOR_TESTS);
       TestProxyDelegate test_proxy_delegate;
       HttpServerProperties http_server_properties;
       MockCertVerifier cert_verifier;
@@ -1143,7 +1141,7 @@
     HttpNetworkSession::Params session_params;
     HttpNetworkSession::Context session_context;
     MockClientSocketFactory socket_factory;
-    std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+    std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
         ConfiguredProxyResolutionService::CreateFixedFromPacResult(
             "HTTPS badproxy:99; DIRECT", TRAFFIC_ANNOTATION_FOR_TESTS);
     TestProxyDelegate test_proxy_delegate;
@@ -1869,7 +1867,7 @@
   auto session_deps = std::make_unique<SpdySessionDependencies>(
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS));
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
 
@@ -1939,7 +1937,7 @@
   auto session_deps = std::make_unique<SpdySessionDependencies>(
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS));
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           "HTTPS myproxy.org:443", TRAFFIC_ANNOTATION_FOR_TESTS);
 
@@ -2324,7 +2322,7 @@
   MultiLogCTVerifier ct_verifier_;
   DefaultCTPolicyEnforcer ct_policy_enforcer_;
   MockHostResolver host_resolver_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<SSLConfigServiceDefaults> ssl_config_service_;
   HttpNetworkSession::Params params_;
 };
@@ -3393,7 +3391,7 @@
   QuicContext quic_context_;
 
  private:
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_ =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_ =
       ConfiguredProxyResolutionService::CreateDirect();
   SSLConfigServiceDefaults ssl_config_service_;
   MockClientSocketFactory socket_factory_;
diff --git a/net/log/net_log_util.cc b/net/log/net_log_util.cc
index 4fab6f6e..8ead980 100644
--- a/net/log/net_log_util.cc
+++ b/net/log/net_log_util.cc
@@ -32,8 +32,8 @@
 #include "net/log/net_log_event_type.h"
 #include "net/log/net_log_values.h"
 #include "net/log/net_log_with_source.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_retry_info.h"
 #include "net/socket/ssl_client_socket.h"
 #include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
@@ -89,19 +89,6 @@
 #undef NET_ERROR
 };
 
-const char* NetInfoSourceToString(NetInfoSource source) {
-  switch (source) {
-#define NET_INFO_SOURCE(label, string, value) \
-  case NET_INFO_##label:                      \
-    return string;
-#include "net/base/net_info_source_list.h"
-#undef NET_INFO_SOURCE
-    case NET_INFO_ALL_SOURCES:
-      return "All";
-  }
-  return "?";
-}
-
 // Returns the disk cache backend for |context| if there is one, or NULL.
 // Despite the name, can return an in memory "disk cache".
 disk_cache::Backend* GetDiskCacheBackend(URLRequestContext* context) {
@@ -134,6 +121,19 @@
 
 }  // namespace
 
+const char* NetInfoSourceToString(NetInfoSource source) {
+  switch (source) {
+#define NET_INFO_SOURCE(label, string, value) \
+  case NET_INFO_##label:                      \
+    return string;
+#include "net/base/net_info_source_list.h"
+#undef NET_INFO_SOURCE
+    case NET_INFO_ALL_SOURCES:
+      return "All";
+  }
+  return "?";
+}
+
 std::unique_ptr<base::DictionaryValue> GetNetConstants() {
   std::unique_ptr<base::DictionaryValue> constants_dict(
       new base::DictionaryValue());
@@ -318,49 +318,8 @@
   // May only be called on the context's thread.
   context->AssertCalledOnValidThread();
 
-  std::unique_ptr<base::DictionaryValue> net_info_dict(
-      new base::DictionaryValue());
-
-  // TODO(mmenke):  The code for most of these sources should probably be moved
-  // into the sources themselves.
-  if (info_sources & NET_INFO_PROXY_SETTINGS) {
-    ConfiguredProxyResolutionService* proxy_resolution_service =
-        context->proxy_resolution_service();
-
-    std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
-    if (proxy_resolution_service->fetched_config())
-      dict->SetKey(
-          "original",
-          proxy_resolution_service->fetched_config()->value().ToValue());
-    if (proxy_resolution_service->config())
-      dict->SetKey("effective",
-                   proxy_resolution_service->config()->value().ToValue());
-
-    net_info_dict->Set(NetInfoSourceToString(NET_INFO_PROXY_SETTINGS),
-                       std::move(dict));
-  }
-
-  if (info_sources & NET_INFO_BAD_PROXIES) {
-    const ProxyRetryInfoMap& bad_proxies_map =
-        context->proxy_resolution_service()->proxy_retry_info();
-
-    auto list = std::make_unique<base::ListValue>();
-
-    for (auto it = bad_proxies_map.begin(); it != bad_proxies_map.end(); ++it) {
-      const std::string& proxy_uri = it->first;
-      const ProxyRetryInfo& retry_info = it->second;
-
-      auto dict = std::make_unique<base::DictionaryValue>();
-      dict->SetString("proxy_uri", proxy_uri);
-      dict->SetString("bad_until",
-                      NetLog::TickCountToString(retry_info.bad_until));
-
-      list->Append(std::move(dict));
-    }
-
-    net_info_dict->Set(NetInfoSourceToString(NET_INFO_BAD_PROXIES),
-                       std::move(list));
-  }
+  std::unique_ptr<base::DictionaryValue> net_info_dict =
+      context->proxy_resolution_service()->GetProxyNetLogValues(info_sources);
 
   if (info_sources & NET_INFO_HOST_RESOLVER) {
     HostResolver* host_resolver = context->host_resolver();
diff --git a/net/log/net_log_util.h b/net/log/net_log_util.h
index 9558def..62c3dd0 100644
--- a/net/log/net_log_util.h
+++ b/net/log/net_log_util.h
@@ -30,6 +30,9 @@
 
 // Utility methods for creating NetLog dumps.
 
+// Returns a friendly string to use for a given NetInfoSource in the net log.
+NET_EXPORT const char* NetInfoSourceToString(NetInfoSource source);
+
 // Create a dictionary containing a legend for net/ constants.
 NET_EXPORT std::unique_ptr<base::DictionaryValue> GetNetConstants();
 
diff --git a/net/proxy_resolution/configured_proxy_resolution_service.cc b/net/proxy_resolution/configured_proxy_resolution_service.cc
index 575238d2..55f1c84 100644
--- a/net/proxy_resolution/configured_proxy_resolution_service.cc
+++ b/net/proxy_resolution/configured_proxy_resolution_service.cc
@@ -19,7 +19,6 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "net/base/net_errors.h"
@@ -29,6 +28,7 @@
 #include "net/log/net_log.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_event_type.h"
+#include "net/log/net_log_util.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/dhcp_pac_file_fetcher.h"
 #include "net/proxy_resolution/multi_threaded_proxy_resolver.h"
@@ -868,6 +868,7 @@
 std::unique_ptr<ConfiguredProxyResolutionService>
 ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
     std::unique_ptr<ProxyConfigService> proxy_config_service,
+    bool quick_check_enabled,
     NetLog* net_log) {
   DCHECK(proxy_config_service);
 
@@ -876,10 +877,14 @@
     return CreateWithoutProxyResolver(std::move(proxy_config_service), net_log);
   }
 
-  return std::make_unique<ConfiguredProxyResolutionService>(
-      std::move(proxy_config_service),
-      std::make_unique<ProxyResolverFactoryForSystem>(kDefaultNumPacThreads),
-      net_log);
+  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+      std::make_unique<ConfiguredProxyResolutionService>(
+          std::move(proxy_config_service),
+          std::make_unique<ProxyResolverFactoryForSystem>(
+              kDefaultNumPacThreads),
+          net_log);
+  proxy_resolution_service->set_quick_check_enabled(quick_check_enabled);
+  return proxy_resolution_service;
 }
 
 // static
@@ -899,7 +904,8 @@
   // TODO(eroman): This isn't quite right, won't work if |pc| specifies
   //               a PAC script.
   return CreateUsingSystemProxyResolver(
-      std::make_unique<ProxyConfigServiceFixed>(pc), nullptr);
+      std::make_unique<ProxyConfigServiceFixed>(pc),
+      /*quick_check_enabled=*/true, nullptr);
 }
 
 // static
@@ -1302,14 +1308,10 @@
 void ConfiguredProxyResolutionService::SetProxyDelegate(
     ProxyDelegate* delegate) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK(!proxy_delegate_ || !delegate);
   proxy_delegate_ = delegate;
 }
 
-void ConfiguredProxyResolutionService::AssertNoProxyDelegate() const {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(!proxy_delegate_);
-}
-
 void ConfiguredProxyResolutionService::OnShutdown() {
   // Order here does not matter for correctness. |init_proxy_resolver_| is first
   // because shutting it down also cancels its requests using the fetcher.
@@ -1321,6 +1323,15 @@
     dhcp_pac_file_fetcher_->OnShutdown();
 }
 
+const ProxyRetryInfoMap& ConfiguredProxyResolutionService::proxy_retry_info()
+    const {
+  return proxy_retry_info_;
+}
+
+void ConfiguredProxyResolutionService::ClearBadProxiesCache() {
+  proxy_retry_info_.clear();
+}
+
 PacFileFetcher* ConfiguredProxyResolutionService::GetPacFileFetcher() const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   return pac_file_fetcher_.get();
@@ -1365,6 +1376,50 @@
   ApplyProxyConfigIfAvailable();
 }
 
+std::unique_ptr<base::DictionaryValue>
+ConfiguredProxyResolutionService::GetProxyNetLogValues(int info_sources) {
+  std::unique_ptr<base::DictionaryValue> net_info_dict(
+      new base::DictionaryValue());
+
+  if (info_sources & NET_INFO_PROXY_SETTINGS) {
+    std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
+    if (fetched_config_)
+      dict->SetKey("original", fetched_config_->value().ToValue());
+    if (config_)
+      dict->SetKey("effective", config_->value().ToValue());
+
+    net_info_dict->Set(NetInfoSourceToString(NET_INFO_PROXY_SETTINGS),
+                       std::move(dict));
+  }
+
+  if (info_sources & NET_INFO_BAD_PROXIES) {
+    auto list = std::make_unique<base::ListValue>();
+
+    for (auto& it : proxy_retry_info_) {
+      const std::string& proxy_uri = it.first;
+      const ProxyRetryInfo& retry_info = it.second;
+
+      auto dict = std::make_unique<base::DictionaryValue>();
+      dict->SetString("proxy_uri", proxy_uri);
+      dict->SetString("bad_until",
+                      NetLog::TickCountToString(retry_info.bad_until));
+
+      list->Append(std::move(dict));
+    }
+
+    net_info_dict->Set(NetInfoSourceToString(NET_INFO_BAD_PROXIES),
+                       std::move(list));
+  }
+
+  return net_info_dict;
+}
+
+bool ConfiguredProxyResolutionService::CastToConfiguredProxyResolutionService(
+    ConfiguredProxyResolutionService** configured_proxy_resolution_service) {
+  *configured_proxy_resolution_service = this;
+  return true;
+}
+
 // static
 std::unique_ptr<ProxyConfigService>
 ConfiguredProxyResolutionService::CreateSystemProxyConfigService(
diff --git a/net/proxy_resolution/configured_proxy_resolution_service.h b/net/proxy_resolution/configured_proxy_resolution_service.h
index 1cd7354..7d4edc9 100644
--- a/net/proxy_resolution/configured_proxy_resolution_service.h
+++ b/net/proxy_resolution/configured_proxy_resolution_service.h
@@ -22,13 +22,14 @@
 #include "net/base/load_states.h"
 #include "net/base/net_export.h"
 #include "net/base/network_change_notifier.h"
-#include "net/base/proxy_server.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/proxy_config_service.h"
 #include "net/proxy_resolution/proxy_config_with_annotation.h"
 #include "net/proxy_resolution/proxy_info.h"
 #include "net/proxy_resolution/proxy_resolution_request.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_resolver.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
 
 class GURL;
@@ -49,10 +50,14 @@
 struct PacFileDataWithSource;
 
 // This class can be used to resolve the proxy server to use when loading a
-// HTTP(S) URL.  It uses the given ProxyResolver to handle the actual proxy
-// resolution.  See ProxyResolverV8 for example.
+// HTTP(S) URL.  It uses the given ProxyResolver to evaluate a PAC file, which
+// the ConfiguredProxyResolutionService then uses to resolve a proxy.  All proxy
+// resolution in this class is based on first getting proxy configurations (ex:
+// a PAC URL) from some source and then using these configurations to attempt to
+// resolve that proxy.
 class NET_EXPORT ConfiguredProxyResolutionService
-    : public NetworkChangeNotifier::IPAddressObserver,
+    : public ProxyResolutionService,
+      public NetworkChangeNotifier::IPAddressObserver,
       public NetworkChangeNotifier::DNSObserver,
       public ProxyConfigService::Observer {
  public:
@@ -106,19 +111,7 @@
 
   ~ConfiguredProxyResolutionService() override;
 
-  // Determines the appropriate proxy for |url| for a |method| request and
-  // stores the result in |results|. If |method| is empty, the caller can expect
-  // method independent resolution.
-  //
-  // Returns ERR_IO_PENDING if the proxy information could not be provided
-  // synchronously, to indicate that the result will be available when the
-  // callback is run.  The callback is run on the thread that calls
-  // ResolveProxy.
-  //
-  // The caller is responsible for ensuring that |results| and |callback|
-  // remain valid until the callback is run or until |request| is cancelled,
-  // which occurs when the unique pointer to it is deleted (by leaving scope or
-  // otherwise).  |request| must not be nullptr.
+  // ProxyResolutionService
   //
   // We use the three possible proxy access types in the following order,
   // doing fallback if one doesn't work.  See "pac_script_decider.h"
@@ -126,34 +119,23 @@
   //   1.  WPAD auto-detection
   //   2.  PAC URL
   //   3.  named proxy
-  //
-  // Profiling information for the request is saved to |net_log| if non-nullptr.
   int ResolveProxy(const GURL& url,
                    const std::string& method,
                    const NetworkIsolationKey& network_isolation_key,
                    ProxyInfo* results,
                    CompletionOnceCallback callback,
                    std::unique_ptr<ProxyResolutionRequest>* request,
-                   const NetLogWithSource& net_log);
+                   const NetLogWithSource& net_log) override;
 
-  // Explicitly trigger proxy fallback for the given |results| by updating our
-  // list of bad proxies to include the first entry of |results|, and,
-  // additional bad proxies (can be none). Will retry after |retry_delay| if
-  // positive, and will use the default proxy retry duration otherwise. Proxies
-  // marked as bad will not be retried until |retry_delay| has passed. Returns
-  // true if there will be at least one proxy remaining in the list after
-  // fallback and false otherwise. This method should be used to add proxies to
-  // the bad proxy list only for reasons other than a network error.
+  // ProxyResolutionService
   bool MarkProxiesAsBadUntil(
       const ProxyInfo& results,
       base::TimeDelta retry_delay,
       const std::vector<ProxyServer>& additional_bad_proxies,
-      const NetLogWithSource& net_log);
+      const NetLogWithSource& net_log) override;
 
-  // Called to report that the last proxy connection succeeded.  If |proxy_info|
-  // has a non empty proxy_retry_info map, the proxies that have been tried (and
-  // failed) for this request will be marked as bad.
-  void ReportSuccess(const ProxyInfo& proxy_info);
+  // ProxyResolutionService
+  void ReportSuccess(const ProxyInfo& proxy_info) override;
 
   // Sets the PacFileFetcher and DhcpPacFileFetcher dependencies. This
   // is needed if the ProxyResolver is of type ProxyResolverWithoutFetch.
@@ -162,21 +144,11 @@
       std::unique_ptr<DhcpPacFileFetcher> dhcp_pac_file_fetcher);
   PacFileFetcher* GetPacFileFetcher() const;
 
-  // Associates a delegate that with this ConfiguredProxyResolutionService.
-  // |delegate| must outlive |this|.
-  // TODO(eroman): Specify this as a dependency at construction time rather
-  //               than making it a mutable property.
-  void SetProxyDelegate(ProxyDelegate* delegate);
+  // ProxyResolutionService
+  void SetProxyDelegate(ProxyDelegate* delegate) override;
 
-  // In builds with DCHECKs enabled, asserts that there isn't already a
-  // delegate associated with |this|.
-  void AssertNoProxyDelegate() const;
-
-  // Cancels all network requests, and prevents the service from creating new
-  // ones.  Must be called before the URLRequestContext the
-  // ConfiguredProxyResolutionService was created with is torn down, if it's
-  // torn down before th ConfiguredProxyResolutionService itself.
-  void OnShutdown();
+  // ProxyResolutionService
+  void OnShutdown() override;
 
   // Returns the last configuration fetched from ProxyConfigService.
   const base::Optional<ProxyConfigWithAnnotation>& fetched_config() const {
@@ -188,25 +160,33 @@
     return config_;
   }
 
-  // Returns the map of proxies which have been marked as "bad".
-  const ProxyRetryInfoMap& proxy_retry_info() const {
-    return proxy_retry_info_;
-  }
+  // ProxyResolutionService
+  const ProxyRetryInfoMap& proxy_retry_info() const override;
 
-  // Clears the list of bad proxy servers that has been cached.
-  void ClearBadProxiesCache() { proxy_retry_info_.clear(); }
+  // ProxyResolutionService
+  void ClearBadProxiesCache() override;
 
   // Forces refetching the proxy configuration, and applying it.
   // This re-does everything from fetching the system configuration,
   // to downloading and testing the PAC files.
   void ForceReloadProxyConfig();
 
+  // ProxyResolutionService
+  std::unique_ptr<base::DictionaryValue> GetProxyNetLogValues(
+      int info_sources) override;
+
+  // ProxyResolutionService
+  bool CastToConfiguredProxyResolutionService(
+      ConfiguredProxyResolutionService** configured_proxy_resolution_service)
+      override WARN_UNUSED_RESULT;
+
   // Same as CreateProxyResolutionServiceUsingV8ProxyResolver, except it uses
   // system libraries for evaluating the PAC script if available, otherwise
   // skips proxy autoconfig.
   static std::unique_ptr<ConfiguredProxyResolutionService>
   CreateUsingSystemProxyResolver(
       std::unique_ptr<ProxyConfigService> proxy_config_service,
+      bool quick_check_enabled,
       NetLog* net_log);
 
   // Creates a ConfiguredProxyResolutionService without support for proxy
diff --git a/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc b/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
index 05e75a6..d5c60af 100644
--- a/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
+++ b/net/proxy_resolution/pac_file_fetcher_impl_unittest.cc
@@ -35,6 +35,7 @@
 #include "net/http/http_transaction_factory.h"
 #include "net/http/transport_security_state.h"
 #include "net/net_buildflags.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/socket/client_socket_pool_manager.h"
 #include "net/socket/transport_client_socket_pool.h"
diff --git a/net/proxy_resolution/proxy_resolution_request_impl.h b/net/proxy_resolution/proxy_resolution_request_impl.h
index 5420a2ba3..0c77a1d 100644
--- a/net/proxy_resolution/proxy_resolution_request_impl.h
+++ b/net/proxy_resolution/proxy_resolution_request_impl.h
@@ -22,6 +22,12 @@
 class ProxyInfo;
 class ConfiguredProxyResolutionService;
 
+// ProxyResolutionRequestImpl is the concrete implementation of
+// ProxyResolutionRequest used by ConfiguredProxyResolutionService. Manages a
+// single asynchronous proxy resolution request.
+//
+// TODO(https://crbug.com/1032820): Rename this to
+// ConfiguredProxyResolutionRequestImpl.
 class ProxyResolutionRequestImpl final : public ProxyResolutionRequest {
  public:
   ProxyResolutionRequestImpl(ConfiguredProxyResolutionService* service,
diff --git a/net/proxy_resolution/proxy_resolution_service.h b/net/proxy_resolution/proxy_resolution_service.h
new file mode 100644
index 0000000..4a49fc8
--- /dev/null
+++ b/net/proxy_resolution/proxy_resolution_service.h
@@ -0,0 +1,122 @@
+// Copyright 2020 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.
+
+#ifndef NET_PROXY_RESOLUTION_PROXY_RESOLUTION_SERVICE_H_
+#define NET_PROXY_RESOLUTION_PROXY_RESOLUTION_SERVICE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/compiler_specific.h"
+#include "base/time/time.h"
+#include "net/base/completion_once_callback.h"
+#include "net/base/net_export.h"
+#include "net/base/network_isolation_key.h"
+#include "net/base/proxy_server.h"
+#include "net/log/net_log_with_source.h"
+#include "net/proxy_resolution/proxy_info.h"
+#include "url/gurl.h"
+
+namespace base {
+class DictionaryValue;
+}  // namespace base
+
+namespace net {
+
+class ConfiguredProxyResolutionService;
+class ProxyDelegate;
+class ProxyResolutionRequest;
+
+// This is a generic interface that is used to decide which proxy server(s) to
+// use for a particular URL request. The typical consumer of the
+// ProxyResolutionService does not need to know how we decide on the right proxy
+// for that network request.
+class NET_EXPORT ProxyResolutionService {
+ public:
+  virtual ~ProxyResolutionService() = default;
+
+  // Determines the appropriate proxy for |url| for a |method| request and
+  // stores the result in |results|. If |method| is empty, the caller can expect
+  // method independent resolution.
+  //
+  // Returns ERR_IO_PENDING if the proxy information could not be provided
+  // synchronously, to indicate that the result will be available when the
+  // callback is run.  The callback is run on the thread that calls
+  // ResolveProxy.
+  //
+  // The caller is responsible for ensuring that |results| and |callback|
+  // remain valid until the callback is run or until |request| is cancelled,
+  // which occurs when the unique pointer to it is deleted (by leaving scope or
+  // otherwise).  |request| must not be nullptr.
+  //
+  // Profiling information for the request is saved to |net_log| if non-nullptr.
+  virtual int ResolveProxy(const GURL& url,
+                           const std::string& method,
+                           const NetworkIsolationKey& network_isolation_key,
+                           ProxyInfo* results,
+                           CompletionOnceCallback callback,
+                           std::unique_ptr<ProxyResolutionRequest>* request,
+                           const NetLogWithSource& net_log) = 0;
+
+  // Called to report that the last proxy connection succeeded.  If |proxy_info|
+  // has a non empty proxy_retry_info map, the proxies that have been tried (and
+  // failed) for this request will be marked as bad.
+  virtual void ReportSuccess(const ProxyInfo& proxy_info) = 0;
+
+  // Associates a delegate with this ProxyResolutionService. |delegate|
+  // must outlive |this|.
+  // TODO(eroman): Specify this as a dependency at construction time rather
+  //               than making it a mutable property.
+  virtual void SetProxyDelegate(ProxyDelegate* delegate) = 0;
+
+  // Cancels all network requests, and prevents the service from creating new
+  // ones.  Must be called before the URLRequestContext the
+  // ProxyResolutionService was created with is torn down, if it's torn down
+  // before the ProxyResolutionService itself.
+  virtual void OnShutdown() = 0;
+
+  // Explicitly trigger proxy fallback for the given |results| by updating our
+  // list of bad proxies to include the first entry of |results|, and,
+  // additional bad proxies (can be none). Will retry after |retry_delay| if
+  // positive, and will use the default proxy retry duration otherwise. Proxies
+  // marked as bad will not be retried until |retry_delay| has passed. Returns
+  // true if there will be at least one proxy remaining in the list after
+  // fallback and false otherwise. This method should be used to add proxies to
+  // the bad proxy list only for reasons other than a network error.
+  virtual bool MarkProxiesAsBadUntil(
+      const ProxyInfo& results,
+      base::TimeDelta retry_delay,
+      const std::vector<ProxyServer>& additional_bad_proxies,
+      const NetLogWithSource& net_log) = 0;
+
+  // Clears the list of bad proxy servers that has been cached.
+  virtual void ClearBadProxiesCache() = 0;
+
+  // Returns the map of proxies which have been marked as "bad".
+  virtual const ProxyRetryInfoMap& proxy_retry_info() const = 0;
+
+  // Returns proxy related debug information to be included in the NetLog. The
+  // data should be appropriate for any capture mode. |info_sources| is a bit
+  // field of NET_INFO_SOURCE.
+  virtual std::unique_ptr<base::DictionaryValue> GetProxyNetLogValues(
+      int info_sources) = 0;
+
+  // Returns true if |this| is an instance of ConfiguredProxyResolutionService
+  // and assigns |this| to the out parameter. Otherwise returns false and sets
+  // |*configured_proxy_resolution_service| to nullptr.
+  //
+  // In general, consumers of the ProxyResolutionService should exclusively
+  // interact with the general ProxyResolutionService. In some isolated
+  // instances, a consumer may specifically need to interact with an underlying
+  // implementation. For example, one might need to fetch the set of proxy
+  // configurations determined by the proxy, something which not all
+  // implementations of the ProxyResolutionService would have an answer for.
+  virtual bool CastToConfiguredProxyResolutionService(
+      ConfiguredProxyResolutionService** configured_proxy_resolution_service)
+      WARN_UNUSED_RESULT = 0;
+};
+
+}  // namespace net
+
+#endif  // NET_PROXY_RESOLUTION_PROXY_RESOLUTION_SERVICE_H_
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index 4f669ee..3fbb7b39 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -584,13 +584,6 @@
     TestCompletionCallback callback;
     session_->CryptoConnect(callback.callback());
     EXPECT_TRUE(session_->IsEncryptionEstablished());
-    if (VersionUsesHttp3(version_.transport_version)) {
-      // Let the stream id manager know that the fake handshake is done and
-      // outgoing streams can be created.
-      quic::test::QuicSessionPeer::v99_streamid_manager(
-          static_cast<quic::QuicSession*>(session_.get()))
-          ->OnConfigNegotiated();
-    }
   }
 
   void ConfirmHandshake() {
@@ -2527,6 +2520,8 @@
   SetRequest("GET", "/", DEFAULT_PRIORITY);
   Initialize();
 
+  ConfirmHandshake();
+
   BidirectionalStreamRequestInfo request;
   request.method = "GET";
   request.url = GURL("http://www.google.com/");
diff --git a/net/quic/quic_end_to_end_unittest.cc b/net/quic/quic_end_to_end_unittest.cc
index 5f94046..de027561 100644
--- a/net/quic/quic_end_to_end_unittest.cc
+++ b/net/quic/quic_end_to_end_unittest.cc
@@ -221,7 +221,7 @@
   std::unique_ptr<CTVerifier> cert_transparency_verifier_;
   DefaultCTPolicyEnforcer ct_policy_enforcer_;
   std::unique_ptr<SSLConfigServiceDefaults> ssl_config_service_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
   HttpServerProperties http_server_properties_;
   HttpNetworkSession::Params session_params_;
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 05ca1d5..811a12da 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -381,3 +381,8 @@
 QUIC_FLAG(bool,
           FLAGS_quic_reloadable_flag_quic_create_incoming_stream_bug,
           false)
+
+// If true, quic::BandwidthSampler will start in application limited phase.
+QUIC_FLAG(bool,
+          FLAGS_quic_reloadable_flag_quic_bw_sampler_app_limited_starting_value,
+          false)
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index eaa40de..2b1f8df 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -1015,7 +1015,7 @@
   DefaultCTPolicyEnforcer ct_policy_enforcer_;
   TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
   std::unique_ptr<SSLConfigServiceDefaults> ssl_config_service_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
   std::unique_ptr<HttpServerProperties> http_server_properties_;
   HttpNetworkSession::Params session_params_;
@@ -7639,7 +7639,7 @@
   DefaultCTPolicyEnforcer ct_policy_enforcer_;
   TestSocketPerformanceWatcherFactory test_socket_performance_watcher_factory_;
   std::unique_ptr<SSLConfigServiceDefaults> ssl_config_service_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<HttpAuthHandlerFactory> auth_handler_factory_;
   HttpServerProperties http_server_properties_;
   RecordingBoundTestNetLog net_log_;
diff --git a/net/quic/quic_transport_end_to_end_test.cc b/net/quic/quic_transport_end_to_end_test.cc
index 2fe3d0e86..7f8c35f4a 100644
--- a/net/quic/quic_transport_end_to_end_test.cc
+++ b/net/quic/quic_transport_end_to_end_test.cc
@@ -9,6 +9,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/cert/mock_cert_verifier.h"
 #include "net/dns/mock_host_resolver.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/test/test_data_directory.h"
 #include "net/test/test_with_task_environment.h"
 #include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h"
diff --git a/net/socket/ssl_connect_job_unittest.cc b/net/socket/ssl_connect_job_unittest.cc
index bfda413..0d6d834 100644
--- a/net/socket/ssl_connect_job_unittest.cc
+++ b/net/socket/ssl_connect_job_unittest.cc
@@ -173,8 +173,7 @@
   TransportSecurityState transport_security_state_;
   MultiLogCTVerifier ct_verifier_;
   DefaultCTPolicyEnforcer ct_policy_enforcer_;
-  const std::unique_ptr<ConfiguredProxyResolutionService>
-      proxy_resolution_service_;
+  const std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   const std::unique_ptr<SSLConfigService> ssl_config_service_;
   const std::unique_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
   HttpServerProperties http_server_properties_;
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index b4687129..d7d14a6 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -34,6 +34,7 @@
 #include "net/http/transport_security_state.h"
 #include "net/log/net_log_with_source.h"
 #include "net/log/test_net_log.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/connect_job.h"
 #include "net/socket/socket_tag.h"
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 380839bd2..86e73f84 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -45,6 +45,7 @@
 #include "net/log/net_log_with_source.h"
 #include "net/log/test_net_log.h"
 #include "net/log/test_net_log_util.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/socket/next_proto.h"
 #include "net/socket/socket_tag.h"
 #include "net/spdy/buffered_spdy_framer.h"
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc
index f146b0a..addad6599 100644
--- a/net/spdy/spdy_test_util_common.cc
+++ b/net/spdy/spdy_test_util_common.cc
@@ -26,6 +26,7 @@
 #include "net/http/http_network_transaction.h"
 #include "net/http/http_proxy_connect_job.h"
 #include "net/log/net_log_with_source.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/next_proto.h"
@@ -322,7 +323,7 @@
           ConfiguredProxyResolutionService::CreateDirect()) {}
 
 SpdySessionDependencies::SpdySessionDependencies(
-    std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service)
+    std::unique_ptr<ProxyResolutionService> proxy_resolution_service)
     : host_resolver(std::make_unique<MockCachingHostResolver>()),
       cert_verifier(std::make_unique<MockCertVerifier>()),
       transport_security_state(std::make_unique<TransportSecurityState>()),
diff --git a/net/spdy/spdy_test_util_common.h b/net/spdy/spdy_test_util_common.h
index a897313..a9c7b0e3 100644
--- a/net/spdy/spdy_test_util_common.h
+++ b/net/spdy/spdy_test_util_common.h
@@ -29,7 +29,7 @@
 #include "net/http/http_response_info.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/transport_security_state.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/socket_test_util.h"
 #include "net/spdy/spdy_session.h"
 #include "net/spdy/spdy_session_pool.h"
@@ -182,8 +182,7 @@
 
   // Custom proxy service dependency.
   explicit SpdySessionDependencies(
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service);
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service);
 
   ~SpdySessionDependencies();
 
@@ -213,7 +212,7 @@
   std::unique_ptr<TransportSecurityState> transport_security_state;
   std::unique_ptr<CTVerifier> cert_transparency_verifier;
   std::unique_ptr<CTPolicyEnforcer> ct_policy_enforcer;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service;
   std::unique_ptr<HttpUserAgentSettings> http_user_agent_settings;
   std::unique_ptr<SSLConfigService> ssl_config_service;
   std::unique_ptr<MockClientSocketFactory> socket_factory;
diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc
index 671179fd..18b6568 100644
--- a/net/url_request/url_fetcher_impl_unittest.cc
+++ b/net/url_request/url_fetcher_impl_unittest.cc
@@ -40,6 +40,7 @@
 #include "net/base/upload_file_element_reader.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_response_headers.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/gtest_util.h"
 #include "net/test/test_with_task_environment.h"
@@ -187,9 +188,9 @@
  public:
   // All requests for |hanging_domain| will hang on host resolution until the
   // mock_resolver()->ResolveAllPending() is called.
-  FetcherTestURLRequestContext(const std::string& hanging_domain,
-                               std::unique_ptr<ConfiguredProxyResolutionService>
-                                   proxy_resolution_service)
+  FetcherTestURLRequestContext(
+      const std::string& hanging_domain,
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service)
       : TestURLRequestContext(true), mock_resolver_(new MockHostResolver()) {
     mock_resolver_->set_ondemand_mode(true);
     mock_resolver_->rules()->AddRule(hanging_domain, "127.0.0.1");
@@ -309,8 +310,7 @@
   }
 
   void set_proxy_resolution_service(
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service) {
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
     DCHECK(proxy_resolution_service);
     proxy_resolution_service_ = std::move(proxy_resolution_service);
   }
@@ -329,7 +329,7 @@
   const std::string hanging_domain_;
 
   // May be null.
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
 
   std::unique_ptr<FetcherTestURLRequestContext> context_;
   bool shutting_down_;
@@ -507,7 +507,7 @@
   const net::ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
                                       test_server_->host_port_pair());
 
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           proxy_server.ToPacString(), TRAFFIC_ANNOTATION_FOR_TESTS);
   context_getter->set_proxy_resolution_service(
diff --git a/net/url_request/url_request_context.h b/net/url_request/url_request_context.h
index c628196..f2bfa71 100644
--- a/net/url_request/url_request_context.h
+++ b/net/url_request/url_request_context.h
@@ -46,7 +46,7 @@
 class NetworkDelegate;
 class NetworkQualityEstimator;
 class ProxyDelegate;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class QuicContext;
 class SSLConfigService;
 class URLRequest;
@@ -133,11 +133,11 @@
   }
 
   // Get the proxy service for this context.
-  ConfiguredProxyResolutionService* proxy_resolution_service() const {
+  ProxyResolutionService* proxy_resolution_service() const {
     return proxy_resolution_service_;
   }
   void set_proxy_resolution_service(
-      ConfiguredProxyResolutionService* proxy_resolution_service) {
+      ProxyResolutionService* proxy_resolution_service) {
     proxy_resolution_service_ = proxy_resolution_service;
   }
 
@@ -314,7 +314,7 @@
   HostResolver* host_resolver_;
   CertVerifier* cert_verifier_;
   HttpAuthHandlerFactory* http_auth_handler_factory_;
-  ConfiguredProxyResolutionService* proxy_resolution_service_;
+  ProxyResolutionService* proxy_resolution_service_;
   ProxyDelegate* proxy_delegate_;
   SSLConfigService* ssl_config_service_;
   NetworkDelegate* network_delegate_;
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 7c969521..2e255cb 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -37,6 +37,7 @@
 #include "net/log/net_log.h"
 #include "net/net_buildflags.h"
 #include "net/nqe/network_quality_estimator.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/quic/quic_stream_factory.h"
 #include "net/ssl/ssl_config_service_defaults.h"
@@ -498,10 +499,18 @@
         std::move(proxy_config_service_), context.get(),
         context->host_resolver(), context->network_delegate(),
         context->net_log());
-    proxy_resolution_service_->set_quick_check_enabled(
-        pac_quick_check_enabled_);
+
+    // Although CreateProxyResolutionService() tries its best to set the PAC
+    // quick check flag, it may be overridden by a child class. We should make
+    // sure we set that value here if applicable.
+    ConfiguredProxyResolutionService* configured_proxy_resolution_service =
+        nullptr;
+    if (proxy_resolution_service_->CastToConfiguredProxyResolutionService(
+            &configured_proxy_resolution_service))
+      configured_proxy_resolution_service->set_quick_check_enabled(
+          pac_quick_check_enabled_);
   }
-  ConfiguredProxyResolutionService* proxy_resolution_service =
+  ProxyResolutionService* proxy_resolution_service =
       proxy_resolution_service_.get();
   storage->set_proxy_resolution_service(std::move(proxy_resolution_service_));
 
@@ -537,7 +546,6 @@
 #endif  // BUILDFLAG(ENABLE_REPORTING)
 
   if (proxy_delegate_) {
-    proxy_resolution_service->AssertNoProxyDelegate();
     proxy_resolution_service->SetProxyDelegate(proxy_delegate_.get());
     storage->set_proxy_delegate(std::move(proxy_delegate_));
   }
@@ -620,7 +628,7 @@
   return std::move(context);
 }
 
-std::unique_ptr<ConfiguredProxyResolutionService>
+std::unique_ptr<ProxyResolutionService>
 URLRequestContextBuilder::CreateProxyResolutionService(
     std::unique_ptr<ProxyConfigService> proxy_config_service,
     URLRequestContext* url_request_context,
@@ -628,7 +636,7 @@
     NetworkDelegate* network_delegate,
     NetLog* net_log) {
   return ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
-      std::move(proxy_config_service), net_log);
+      std::move(proxy_config_service), pac_quick_check_enabled_, net_log);
 }
 
 }  // namespace net
diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h
index b51a9e2..f3ab423 100644
--- a/net/url_request/url_request_context_builder.h
+++ b/net/url_request/url_request_context_builder.h
@@ -36,8 +36,8 @@
 #include "net/dns/host_resolver.h"
 #include "net/http/http_network_session.h"
 #include "net/net_buildflags.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/ssl/ssl_config_service.h"
 #include "net/third_party/quiche/src/quic/core/quic_packets.h"
 #include "net/url_request/url_request_job_factory.h"
@@ -171,8 +171,7 @@
   // resolution). Subclasses may override CreateProxyResolutionService for
   // different default behavior.
   void set_proxy_resolution_service(
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service) {
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
     proxy_resolution_service_ = std::move(proxy_resolution_service);
   }
 
@@ -318,12 +317,11 @@
   std::unique_ptr<URLRequestContext> Build();
 
  protected:
-  // Lets subclasses override ConfiguredProxyResolutionService creation, using a
-  // ConfiguredProxyResolutionService that uses the URLRequestContext itself to
-  // get PAC scripts. When this method is invoked, the URLRequestContext is not
-  // yet ready to service requests.
-  virtual std::unique_ptr<ConfiguredProxyResolutionService>
-  CreateProxyResolutionService(
+  // Lets subclasses override ProxyResolutionService creation, using a
+  // ProxyResolutionService that uses the URLRequestContext itself to get PAC
+  // scripts. When this method is invoked, the URLRequestContext is not yet
+  // ready to service requests.
+  virtual std::unique_ptr<ProxyResolutionService> CreateProxyResolutionService(
       std::unique_ptr<ProxyConfigService> proxy_config_service,
       URLRequestContext* url_request_context,
       HostResolver* host_resolver,
@@ -359,7 +357,7 @@
   HostResolver::Factory* host_resolver_factory_ = nullptr;
   std::unique_ptr<ProxyConfigService> proxy_config_service_;
   bool pac_quick_check_enabled_ = true;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<SSLConfigService> ssl_config_service_;
   std::unique_ptr<NetworkDelegate> network_delegate_;
   std::unique_ptr<ProxyDelegate> proxy_delegate_;
diff --git a/net/url_request/url_request_context_builder_unittest.cc b/net/url_request/url_request_context_builder_unittest.cc
index d1ab79b..bb98fa9 100644
--- a/net/url_request/url_request_context_builder_unittest.cc
+++ b/net/url_request/url_request_context_builder_unittest.cc
@@ -18,6 +18,7 @@
 #include "net/http/http_auth_handler.h"
 #include "net/http/http_auth_handler_factory.h"
 #include "net/log/net_log_with_source.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/ssl/ssl_info.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/gtest_util.h"
diff --git a/net/url_request/url_request_context_storage.cc b/net/url_request/url_request_context_storage.cc
index b75bf2f..258c570 100644
--- a/net/url_request/url_request_context_storage.cc
+++ b/net/url_request/url_request_context_storage.cc
@@ -18,7 +18,7 @@
 #include "net/http/http_auth_handler_factory.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/http_transaction_factory.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_job_factory.h"
@@ -74,8 +74,7 @@
 }
 
 void URLRequestContextStorage::set_proxy_resolution_service(
-    std::unique_ptr<ConfiguredProxyResolutionService>
-        proxy_resolution_service) {
+    std::unique_ptr<ProxyResolutionService> proxy_resolution_service) {
   context_->set_proxy_resolution_service(proxy_resolution_service.get());
   proxy_resolution_service_ = std::move(proxy_resolution_service);
 }
diff --git a/net/url_request/url_request_context_storage.h b/net/url_request/url_request_context_storage.h
index 434e62e..bda9e88 100644
--- a/net/url_request/url_request_context_storage.h
+++ b/net/url_request/url_request_context_storage.h
@@ -28,7 +28,7 @@
 class HttpUserAgentSettings;
 class NetworkDelegate;
 class ProxyDelegate;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class QuicContext;
 class SSLConfigService;
 class TransportSecurityState;
@@ -62,8 +62,7 @@
   void set_proxy_delegate(std::unique_ptr<ProxyDelegate> proxy_delegate);
   void set_network_delegate(std::unique_ptr<NetworkDelegate> network_delegate);
   void set_proxy_resolution_service(
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service);
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service);
   void set_ssl_config_service(
       std::unique_ptr<SSLConfigService> ssl_config_service);
   void set_http_server_properties(
@@ -116,7 +115,7 @@
   std::unique_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
   std::unique_ptr<ProxyDelegate> proxy_delegate_;
   std::unique_ptr<NetworkDelegate> network_delegate_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<SSLConfigService> ssl_config_service_;
   std::unique_ptr<HttpServerProperties> http_server_properties_;
   std::unique_ptr<HttpUserAgentSettings> http_user_agent_settings_;
diff --git a/net/url_request/url_request_ftp_job.h b/net/url_request/url_request_ftp_job.h
index af812301..b796f69 100644
--- a/net/url_request/url_request_ftp_job.h
+++ b/net/url_request/url_request_ftp_job.h
@@ -15,8 +15,8 @@
 #include "net/base/net_export.h"
 #include "net/ftp/ftp_request_info.h"
 #include "net/ftp/ftp_transaction.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_info.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/url_request/url_request_job.h"
 
 namespace net {
@@ -80,7 +80,7 @@
 
   void LogFtpStartResult(FTPStartResult result);
 
-  ConfiguredProxyResolutionService* proxy_resolution_service_;
+  ProxyResolutionService* proxy_resolution_service_;
   ProxyInfo proxy_info_;
   std::unique_ptr<ProxyResolutionRequest> proxy_resolve_request_;
 
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 131fd13..2e9a51d 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -63,8 +63,8 @@
 #include "net/log/net_log_values.h"
 #include "net/log/net_log_with_source.h"
 #include "net/nqe/network_quality_estimator.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_info.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_retry_info.h"
 #include "net/ssl/ssl_cert_request_info.h"
 #include "net/ssl/ssl_config_service.h"
diff --git a/net/url_request/url_request_http_job_unittest.cc b/net/url_request/url_request_http_job_unittest.cc
index d599f38..566a2fc 100644
--- a/net/url_request/url_request_http_job_unittest.cc
+++ b/net/url_request/url_request_http_job_unittest.cc
@@ -32,6 +32,7 @@
 #include "net/log/test_net_log.h"
 #include "net/log/test_net_log_util.h"
 #include "net/net_buildflags.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/socket/next_proto.h"
 #include "net/socket/socket_test_util.h"
 #include "net/test/cert_test_util.h"
@@ -193,8 +194,7 @@
 class URLRequestHttpJobWithProxy : public WithTaskEnvironment {
  public:
   explicit URLRequestHttpJobWithProxy(
-      std::unique_ptr<ConfiguredProxyResolutionService>
-          proxy_resolution_service)
+      std::unique_ptr<ProxyResolutionService> proxy_resolution_service)
       : proxy_resolution_service_(std::move(proxy_resolution_service)),
         context_(new TestURLRequestContext(true)) {
     context_->set_client_socket_factory(&socket_factory_);
@@ -205,7 +205,7 @@
 
   MockClientSocketFactory socket_factory_;
   TestNetworkDelegate network_delegate_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   std::unique_ptr<TestURLRequestContext> context_;
 
  private:
@@ -254,7 +254,7 @@
   const ProxyServer proxy_server =
       ProxyServer::FromURI("http://origin.net:80", ProxyServer::SCHEME_HTTP);
 
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           proxy_server.ToPacString(), TRAFFIC_ANNOTATION_FOR_TESTS);
 
@@ -295,7 +295,7 @@
 
   // Connection to |proxy_server| would fail. Request should be fetched over
   // DIRECT.
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service =
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service =
       ConfiguredProxyResolutionService::CreateFixedFromPacResult(
           proxy_server.ToPacString() + "; " +
               ProxyServer::Direct().ToPacString(),
diff --git a/net/url_request/url_request_test_util.cc b/net/url_request/url_request_test_util.cc
index 9e6041d4..bca298e 100644
--- a/net/url_request/url_request_test_util.cc
+++ b/net/url_request/url_request_test_util.cc
@@ -23,6 +23,7 @@
 #include "net/http/http_response_headers.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/transport_security_state.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_retry_info.h"
 #include "net/quic/quic_context.h"
 #include "net/url_request/static_http_user_agent_settings.h"
diff --git a/net/url_request/url_request_test_util.h b/net/url_request/url_request_test_util.h
index 587304e9..537e706 100644
--- a/net/url_request/url_request_test_util.h
+++ b/net/url_request/url_request_test_util.h
@@ -37,7 +37,6 @@
 #include "net/http/http_network_layer.h"
 #include "net/http/http_network_session.h"
 #include "net/http/http_request_headers.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/ssl/ssl_config_service_defaults.h"
 #include "net/url_request/redirect_info.h"
 #include "net/url_request/url_request.h"
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index fd0d2b3..b7c0425 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -11267,7 +11267,7 @@
   }
 
  private:
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
 };
 
 // Check that FTP is not supported over an HTTP proxy.
diff --git a/net/websockets/websocket_end_to_end_test.cc b/net/websockets/websocket_end_to_end_test.cc
index 170e1bf..86e2580 100644
--- a/net/websockets/websocket_end_to_end_test.cc
+++ b/net/websockets/websocket_end_to_end_test.cc
@@ -335,7 +335,7 @@
   ASSERT_TRUE(ws_server.BlockUntilStarted());
   std::string proxy_config =
       "https=" + proxy_server.host_port_pair().ToString();
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service(
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
       ConfiguredProxyResolutionService::CreateFixed(
           proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS));
   ASSERT_TRUE(proxy_resolution_service);
@@ -370,7 +370,7 @@
   // TODO(https://crbug.com/901896): Don't rely on proxying localhost.
   proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
 
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service(
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
       ConfiguredProxyResolutionService::CreateFixed(ProxyConfigWithAnnotation(
           proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS)));
   ASSERT_TRUE(proxy_resolution_service);
@@ -397,7 +397,7 @@
   // TODO(https://crbug.com/901896): Don't rely on proxying localhost.
   proxy_config.proxy_rules().bypass_rules.AddRulesToSubtractImplicit();
 
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service(
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
       ConfiguredProxyResolutionService::CreateFixed(ProxyConfigWithAnnotation(
           proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS)));
   context_.set_proxy_resolution_service(proxy_resolution_service.get());
@@ -463,9 +463,10 @@
   proxy_config.set_pac_mandatory(true);
   auto proxy_config_service = std::make_unique<ProxyConfigServiceFixed>(
       ProxyConfigWithAnnotation(proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS));
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service(
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
       ConfiguredProxyResolutionService::CreateUsingSystemProxyResolver(
-          std::move(proxy_config_service), NetLog::Get()));
+          std::move(proxy_config_service), /*quick_check_enabled=*/true,
+          NetLog::Get()));
   ASSERT_EQ(ws_server.host_port_pair().host(), "127.0.0.1");
   context_.set_proxy_resolution_service(proxy_resolution_service.get());
   InitialiseContext();
diff --git a/net/websockets/websocket_stream_test.cc b/net/websockets/websocket_stream_test.cc
index f8ebd56..a393229 100644
--- a/net/websockets/websocket_stream_test.cc
+++ b/net/websockets/websocket_stream_test.cc
@@ -26,7 +26,7 @@
 #include "net/base/url_util.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/socket_test_util.h"
 #include "net/spdy/spdy_test_util_common.h"
diff --git a/net/websockets/websocket_test_util.h b/net/websockets/websocket_test_util.h
index 90b482c8..8ccc09f 100644
--- a/net/websockets/websocket_test_util.h
+++ b/net/websockets/websocket_test_util.h
@@ -33,7 +33,7 @@
 
 class MockClientSocketFactory;
 class WebSocketBasicHandshakeStream;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class SequencedSocketData;
 class IPEndPoint;
 struct SSLSocketDataProvider;
@@ -172,7 +172,7 @@
   WebSocketMockClientSocketFactoryMaker maker_;
   TestURLRequestContext url_request_context_;
   TestNetworkDelegate network_delegate_;
-  std::unique_ptr<ConfiguredProxyResolutionService> proxy_resolution_service_;
+  std::unique_ptr<ProxyResolutionService> proxy_resolution_service_;
   bool url_request_context_initialized_;
 
   DISALLOW_COPY_AND_ASSIGN(WebSocketTestURLRequestContextHost);
diff --git a/remoting/base/url_request_context_getter.cc b/remoting/base/url_request_context_getter.cc
index 0cef607b..13cfb01 100644
--- a/remoting/base/url_request_context_getter.cc
+++ b/remoting/base/url_request_context_getter.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/single_thread_task_runner.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config_service.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
diff --git a/remoting/ios/app/remoting_ios_tmpl.gni b/remoting/ios/app/remoting_ios_tmpl.gni
index 0ff412d..c6af1d3 100644
--- a/remoting/ios/app/remoting_ios_tmpl.gni
+++ b/remoting/ios/app/remoting_ios_tmpl.gni
@@ -92,7 +92,7 @@
       "CoreVideo.framework",
       "GLKit.framework",
       "OpenGLES.framework",
-      "Webkit.framework",
+      "WebKit.framework",
       "SafariServices.framework",
       "SystemConfiguration.framework",
     ]
diff --git a/services/device/public/cpp/test/fake_serial_port_manager.cc b/services/device/public/cpp/test/fake_serial_port_manager.cc
index fc6c1903..f9d1f50 100644
--- a/services/device/public/cpp/test/fake_serial_port_manager.cc
+++ b/services/device/public/cpp/test/fake_serial_port_manager.cc
@@ -97,6 +97,24 @@
 void FakeSerialPortManager::AddPort(mojom::SerialPortInfoPtr port) {
   base::UnguessableToken token = port->token;
   ports_[token] = std::move(port);
+
+  for (auto& client : clients_)
+    client->OnPortAdded(ports_[token]->Clone());
+}
+
+void FakeSerialPortManager::RemovePort(base::UnguessableToken token) {
+  auto it = ports_.find(token);
+  DCHECK(it != ports_.end());
+  mojom::SerialPortInfoPtr info = std::move(it->second);
+  ports_.erase(it);
+
+  for (auto& client : clients_)
+    client->OnPortRemoved(info.Clone());
+}
+
+void FakeSerialPortManager::SetClient(
+    mojo::PendingRemote<mojom::SerialPortManagerClient> client) {
+  clients_.Add(std::move(client));
 }
 
 void FakeSerialPortManager::GetDevices(GetDevicesCallback callback) {
diff --git a/services/device/public/cpp/test/fake_serial_port_manager.h b/services/device/public/cpp/test/fake_serial_port_manager.h
index 39729b8..57288cd 100644
--- a/services/device/public/cpp/test/fake_serial_port_manager.h
+++ b/services/device/public/cpp/test/fake_serial_port_manager.h
@@ -12,6 +12,7 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/public/mojom/serial.mojom.h"
 
 namespace device {
@@ -23,8 +24,11 @@
 
   void AddReceiver(mojo::PendingReceiver<mojom::SerialPortManager> receiver);
   void AddPort(mojom::SerialPortInfoPtr port);
+  void RemovePort(base::UnguessableToken token);
 
   // mojom::SerialPortManager
+  void SetClient(
+      mojo::PendingRemote<mojom::SerialPortManagerClient> client) override;
   void GetDevices(GetDevicesCallback callback) override;
   void GetPort(
       const base::UnguessableToken& token,
@@ -34,6 +38,7 @@
  private:
   std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
   mojo::ReceiverSet<mojom::SerialPortManager> receivers_;
+  mojo::RemoteSet<mojom::SerialPortManagerClient> clients_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeSerialPortManager);
 };
diff --git a/services/device/public/mojom/serial.mojom b/services/device/public/mojom/serial.mojom
index 0bd0288..b4a0891 100644
--- a/services/device/public/mojom/serial.mojom
+++ b/services/device/public/mojom/serial.mojom
@@ -92,6 +92,11 @@
 
 // Discovers and enumerates serial devices available to the host.
 interface SerialPortManager {
+  // Associates an interface the port manager can used to notify the client of
+  // events such as the addition or removal of serial ports from the host.
+  SetClient(pending_remote<SerialPortManagerClient> client);
+
+  // Returns the list of serial ports currently available on the host.
   GetDevices() => (array<SerialPortInfo> devices);
 
   // Creates a SerialPort instance attached to the port represented by |token|.
@@ -102,6 +107,15 @@
           pending_remote<SerialPortConnectionWatcher>? watcher);
 };
 
+// Client interface for SerialPortManager.
+interface SerialPortManagerClient {
+  // This message indicates that a port has been added to the host.
+  OnPortAdded(SerialPortInfo port_info);
+
+  // This message indicates that a port has been removed from the host.
+  OnPortRemoved(SerialPortInfo port_info);
+};
+
 // Performs asynchronous I/O on serial devices.
 interface SerialPort {
   // Initiates an Open of the device then returns result.
diff --git a/services/device/serial/fake_serial_device_enumerator.cc b/services/device/serial/fake_serial_device_enumerator.cc
index 2507d8e..8cf60995 100644
--- a/services/device/serial/fake_serial_device_enumerator.cc
+++ b/services/device/serial/fake_serial_device_enumerator.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "base/stl_util.h"
 
 namespace device {
 
@@ -14,23 +13,20 @@
 
 FakeSerialEnumerator::~FakeSerialEnumerator() = default;
 
-bool FakeSerialEnumerator::AddDevicePath(const base::FilePath& path) {
-  if (base::Contains(device_paths_, path))
-    return false;
-
-  device_paths_.push_back(path);
-  return true;
+void FakeSerialEnumerator::AddDevicePath(const base::FilePath& path) {
+  auto port = mojom::SerialPortInfo::New();
+  port->token = base::UnguessableToken::Create();
+  port->path = path;
+  paths_[path] = port->token;
+  AddPort(std::move(port));
 }
 
-std::vector<mojom::SerialPortInfoPtr> FakeSerialEnumerator::GetDevices() {
-  std::vector<device::mojom::SerialPortInfoPtr> devices;
-  for (const auto& path : device_paths_) {
-    auto device = device::mojom::SerialPortInfo::New();
-    device->token = GetTokenFromPath(path);
-    device->path = path;
-    devices.push_back(std::move(device));
-  }
-  return devices;
+void FakeSerialEnumerator::RemoveDevicePath(const base::FilePath& path) {
+  auto it = paths_.find(path);
+  DCHECK(it != paths_.end());
+  base::UnguessableToken token = it->second;
+  paths_.erase(it);
+  RemovePort(token);
 }
 
 }  // namespace device
diff --git a/services/device/serial/fake_serial_device_enumerator.h b/services/device/serial/fake_serial_device_enumerator.h
index f0dfcee..234c6b6 100644
--- a/services/device/serial/fake_serial_device_enumerator.h
+++ b/services/device/serial/fake_serial_device_enumerator.h
@@ -5,7 +5,7 @@
 #ifndef SERVICES_DEVICE_SERIAL_FAKE_SERIAL_DEVICE_ENUMERATOR_H_
 #define SERVICES_DEVICE_SERIAL_FAKE_SERIAL_DEVICE_ENUMERATOR_H_
 
-#include <vector>
+#include <map>
 
 #include "base/files/file_path.h"
 #include "base/macros.h"
@@ -18,12 +18,12 @@
   FakeSerialEnumerator();
   ~FakeSerialEnumerator() override;
 
-  bool AddDevicePath(const base::FilePath& path);
-
-  std::vector<mojom::SerialPortInfoPtr> GetDevices() override;
+  void AddDevicePath(const base::FilePath& path);
+  void RemoveDevicePath(const base::FilePath& path);
 
  private:
-  std::vector<base::FilePath> device_paths_;
+  std::map<base::FilePath, base::UnguessableToken> paths_;
+
   DISALLOW_COPY_AND_ASSIGN(FakeSerialEnumerator);
 };
 
diff --git a/services/device/serial/serial_device_enumerator.cc b/services/device/serial/serial_device_enumerator.cc
index dc13a1a..781df17 100644
--- a/services/device/serial/serial_device_enumerator.cc
+++ b/services/device/serial/serial_device_enumerator.cc
@@ -37,25 +37,58 @@
 
 SerialDeviceEnumerator::~SerialDeviceEnumerator() = default;
 
-base::Optional<base::FilePath> SerialDeviceEnumerator::GetPathFromToken(
-    const base::UnguessableToken& token) {
-  auto it = token_path_map_.find(token);
-  if (it == token_path_map_.end())
-    return base::nullopt;
+std::vector<mojom::SerialPortInfoPtr> SerialDeviceEnumerator::GetDevices() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  return it->second;
+  std::vector<mojom::SerialPortInfoPtr> ports;
+  ports.reserve(ports_.size());
+  for (const auto& map_entry : ports_)
+    ports.push_back(map_entry.second->Clone());
+  return ports;
 }
 
-const base::UnguessableToken& SerialDeviceEnumerator::GetTokenFromPath(
-    const base::FilePath& path) {
-  for (const auto& pair : token_path_map_) {
-    if (pair.second == path)
-      return pair.first;
-  }
-  // A new serial path.
-  return token_path_map_
-      .insert(std::make_pair(base::UnguessableToken::Create(), path))
-      .first->first;
+void SerialDeviceEnumerator::AddObserver(Observer* observer) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  observer_list_.AddObserver(observer);
+}
+
+void SerialDeviceEnumerator::RemoveObserver(Observer* observer) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  observer_list_.RemoveObserver(observer);
+}
+
+base::Optional<base::FilePath> SerialDeviceEnumerator::GetPathFromToken(
+    const base::UnguessableToken& token) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto it = ports_.find(token);
+  if (it == ports_.end())
+    return base::nullopt;
+
+  return it->second->path;
+}
+
+void SerialDeviceEnumerator::AddPort(mojom::SerialPortInfoPtr port) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  base::UnguessableToken token = port->token;
+  auto result = ports_.insert(std::make_pair(token, std::move(port)));
+  DCHECK(result.second);  // |ports_| should not already contain |token|.
+
+  for (auto& observer : observer_list_)
+    observer.OnPortAdded(*result.first->second);
+}
+
+void SerialDeviceEnumerator::RemovePort(base::UnguessableToken token) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto it = ports_.find(token);
+  DCHECK(it != ports_.end());
+  mojom::SerialPortInfoPtr port = std::move(it->second);
+  ports_.erase(it);
+
+  for (auto& observer : observer_list_)
+    observer.OnPortRemoved(*port);
 }
 
 }  // namespace device
diff --git a/services/device/serial/serial_device_enumerator.h b/services/device/serial/serial_device_enumerator.h
index 95bc547..5a0ef07c 100644
--- a/services/device/serial/serial_device_enumerator.h
+++ b/services/device/serial/serial_device_enumerator.h
@@ -9,7 +9,10 @@
 #include <memory>
 #include <vector>
 
+#include "base/observer_list.h"
 #include "base/optional.h"
+#include "base/sequence_checker.h"
+#include "base/unguessable_token.h"
 #include "services/device/public/mojom/serial.mojom.h"
 #include "services/device/serial/serial_io_handler.h"
 
@@ -22,7 +25,11 @@
 // Discovers and enumerates serial devices available to the host.
 class SerialDeviceEnumerator {
  public:
-  using TokenPathMap = std::map<base::UnguessableToken, base::FilePath>;
+  class Observer : public base::CheckedObserver {
+   public:
+    virtual void OnPortAdded(const mojom::SerialPortInfo& port) = 0;
+    virtual void OnPortRemoved(const mojom::SerialPortInfo& port) = 0;
+  };
 
   static std::unique_ptr<SerialDeviceEnumerator> Create(
       scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner);
@@ -30,16 +37,25 @@
   SerialDeviceEnumerator();
   virtual ~SerialDeviceEnumerator();
 
-  virtual std::vector<mojom::SerialPortInfoPtr> GetDevices() = 0;
+  std::vector<mojom::SerialPortInfoPtr> GetDevices();
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
 
   virtual base::Optional<base::FilePath> GetPathFromToken(
       const base::UnguessableToken& token);
 
  protected:
-  const base::UnguessableToken& GetTokenFromPath(const base::FilePath& path);
+  // These helper methods take care of managing |ports_| and notifying
+  // observers. |port|s passed to AddPort() must be unique and the |token|
+  // passed to RemovePort() must have previously been added.
+  void AddPort(mojom::SerialPortInfoPtr port);
+  void RemovePort(base::UnguessableToken token);
+
+  SEQUENCE_CHECKER(sequence_checker_);
 
  private:
-  TokenPathMap token_path_map_;
+  std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
+  base::ObserverList<Observer> observer_list_;
 };
 
 }  // namespace device
diff --git a/services/device/serial/serial_device_enumerator_linux.cc b/services/device/serial/serial_device_enumerator_linux.cc
index c8f4dbc..8a5115d 100644
--- a/services/device/serial/serial_device_enumerator_linux.cc
+++ b/services/device/serial/serial_device_enumerator_linux.cc
@@ -44,23 +44,6 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-std::vector<mojom::SerialPortInfoPtr>
-SerialDeviceEnumeratorLinux::GetDevices() {
-  std::vector<mojom::SerialPortInfoPtr> ports;
-  ports.reserve(ports_.size());
-  for (const auto& map_entry : ports_)
-    ports.push_back(map_entry.second->Clone());
-  return ports;
-}
-
-base::Optional<base::FilePath> SerialDeviceEnumeratorLinux::GetPathFromToken(
-    const base::UnguessableToken& token) {
-  auto it = ports_.find(token);
-  if (it == ports_.end())
-    return base::nullopt;
-  return it->second->path;
-}
-
 void SerialDeviceEnumeratorLinux::OnDeviceAdded(ScopedUdevDevicePtr device) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
@@ -111,9 +94,10 @@
   auto it = paths_.find(syspath);
   if (it == paths_.end())
     return;
+  base::UnguessableToken token = it->second;
 
-  ports_.erase(it->second);
   paths_.erase(it);
+  RemovePort(token);
 }
 
 void SerialDeviceEnumeratorLinux::CreatePort(ScopedUdevDevicePtr device,
@@ -146,8 +130,8 @@
   if (product_name)
     info->display_name.emplace(product_name);
 
-  ports_.insert(std::make_pair(token, std::move(info)));
   paths_.insert(std::make_pair(syspath, token));
+  AddPort(std::move(info));
 }
 
 }  // namespace device
diff --git a/services/device/serial/serial_device_enumerator_linux.h b/services/device/serial/serial_device_enumerator_linux.h
index a171afdc2..16ea381 100644
--- a/services/device/serial/serial_device_enumerator_linux.h
+++ b/services/device/serial/serial_device_enumerator_linux.h
@@ -10,10 +10,7 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/sequence_checker.h"
-#include "base/unguessable_token.h"
 #include "device/udev_linux/udev_watcher.h"
-#include "services/device/public/mojom/serial.mojom.h"
 #include "services/device/serial/serial_device_enumerator.h"
 
 namespace device {
@@ -25,11 +22,6 @@
   SerialDeviceEnumeratorLinux();
   ~SerialDeviceEnumeratorLinux() override;
 
-  // SerialDeviceEnumerator
-  std::vector<mojom::SerialPortInfoPtr> GetDevices() override;
-  base::Optional<base::FilePath> GetPathFromToken(
-      const base::UnguessableToken& token) override;
-
   // UdevWatcher::Observer
   void OnDeviceAdded(ScopedUdevDevicePtr device) override;
   void OnDeviceChanged(ScopedUdevDevicePtr device) override;
@@ -39,11 +31,8 @@
   void CreatePort(ScopedUdevDevicePtr device, const std::string& syspath);
 
   std::unique_ptr<UdevWatcher> watcher_;
-  std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
   std::map<std::string, base::UnguessableToken> paths_;
 
-  SEQUENCE_CHECKER(sequence_checker_);
-
   DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorLinux);
 };
 
diff --git a/services/device/serial/serial_device_enumerator_mac.cc b/services/device/serial/serial_device_enumerator_mac.cc
index ffcdb2b..8d950297 100644
--- a/services/device/serial/serial_device_enumerator_mac.cc
+++ b/services/device/serial/serial_device_enumerator_mac.cc
@@ -137,23 +137,7 @@
   RemoveDevices();
 }
 
-SerialDeviceEnumeratorMac::~SerialDeviceEnumeratorMac() {}
-
-std::vector<mojom::SerialPortInfoPtr> SerialDeviceEnumeratorMac::GetDevices() {
-  std::vector<mojom::SerialPortInfoPtr> ports;
-  ports.reserve(ports_.size());
-  for (const auto& map_entry : ports_)
-    ports.push_back(map_entry.second->Clone());
-  return ports;
-}
-
-base::Optional<base::FilePath> SerialDeviceEnumeratorMac::GetPathFromToken(
-    const base::UnguessableToken& token) {
-  auto it = ports_.find(token);
-  if (it == ports_.end())
-    return base::nullopt;
-  return it->second->path;
-}
+SerialDeviceEnumeratorMac::~SerialDeviceEnumeratorMac() = default;
 
 // static
 void SerialDeviceEnumeratorMac::FirstMatchCallback(void* context,
@@ -211,8 +195,9 @@
       mojom::SerialPortInfoPtr dialin_info = callout_info.Clone();
       dialin_info->path = base::FilePath(dialin_device);
       dialin_info->token = token;
-      ports_.insert(std::make_pair(token, std::move(dialin_info)));
+
       entries_[entry_id].first = token;
+      AddPort(std::move(dialin_info));
     }
 
     std::string callout_device;
@@ -221,8 +206,9 @@
       auto token = base::UnguessableToken::Create();
       callout_info->path = base::FilePath(callout_device);
       callout_info->token = token;
-      ports_.insert(std::make_pair(token, std::move(callout_info)));
+
       entries_[entry_id].second = token;
+      AddPort(std::move(callout_info));
     }
   }
 }
@@ -241,11 +227,14 @@
     if (it == entries_.end())
       continue;
 
-    if (it->second.first)
-      ports_.erase(it->second.first);
-    if (it->second.second)
-      ports_.erase(it->second.second);
+    std::pair<base::UnguessableToken, base::UnguessableToken> tokens =
+        it->second;
     entries_.erase(it);
+
+    if (tokens.first)
+      RemovePort(tokens.first);
+    if (tokens.second)
+      RemovePort(tokens.second);
   }
 }
 
diff --git a/services/device/serial/serial_device_enumerator_mac.h b/services/device/serial/serial_device_enumerator_mac.h
index 608d6ea9..79b6e55b 100644
--- a/services/device/serial/serial_device_enumerator_mac.h
+++ b/services/device/serial/serial_device_enumerator_mac.h
@@ -9,6 +9,7 @@
 
 #include <map>
 #include <string>
+#include <utility>
 
 #include "base/mac/scoped_ionotificationportref.h"
 #include "base/mac/scoped_ioobject.h"
@@ -25,11 +26,6 @@
   SerialDeviceEnumeratorMac();
   ~SerialDeviceEnumeratorMac() override;
 
-  // SerialDeviceEnumerator
-  std::vector<mojom::SerialPortInfoPtr> GetDevices() override;
-  base::Optional<base::FilePath> GetPathFromToken(
-      const base::UnguessableToken& token) override;
-
  private:
   static void FirstMatchCallback(void* context, io_iterator_t iterator);
   static void TerminatedCallback(void* context, io_iterator_t iterator);
@@ -37,7 +33,6 @@
   void AddDevices();
   void RemoveDevices();
 
-  std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
   // Each IORegistry entry potentially creates two serial ports for the dialin
   // and callout device nodes.
   std::map<uint64_t, std::pair<base::UnguessableToken, base::UnguessableToken>>
@@ -47,8 +42,6 @@
   base::mac::ScopedIOObject<io_iterator_t> devices_added_iterator_;
   base::mac::ScopedIOObject<io_iterator_t> devices_removed_iterator_;
 
-  SEQUENCE_CHECKER(sequence_checker_);
-
   DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorMac);
 };
 
diff --git a/services/device/serial/serial_device_enumerator_win.cc b/services/device/serial/serial_device_enumerator_win.cc
index 83c6253..cecf66c 100644
--- a/services/device/serial/serial_device_enumerator_win.cc
+++ b/services/device/serial/serial_device_enumerator_win.cc
@@ -178,22 +178,6 @@
   return FixUpPortName(com_port);
 }
 
-std::vector<mojom::SerialPortInfoPtr> SerialDeviceEnumeratorWin::GetDevices() {
-  std::vector<mojom::SerialPortInfoPtr> ports;
-  ports.reserve(ports_.size());
-  for (const auto& map_entry : ports_)
-    ports.push_back(map_entry.second->Clone());
-  return ports;
-}
-
-base::Optional<base::FilePath> SerialDeviceEnumeratorWin::GetPathFromToken(
-    const base::UnguessableToken& token) {
-  auto it = ports_.find(token);
-  if (it == ports_.end())
-    return base::nullopt;
-  return it->second->path;
-}
-
 void SerialDeviceEnumeratorWin::OnPathAdded(const base::string16& device_path) {
   ScopedDevInfo dev_info(SetupDiCreateDeviceInfoList(nullptr, nullptr));
   if (!dev_info.is_valid())
@@ -245,8 +229,10 @@
   if (it == paths_.end())
     return;
 
-  ports_.erase(it->second);
+  base::UnguessableToken token = it->second;
+
   paths_.erase(it);
+  RemovePort(token);
 }
 
 void SerialDeviceEnumeratorWin::DoInitialEnumeration() {
@@ -305,8 +291,8 @@
     }
   }
 
-  ports_[token] = std::move(info);
   paths_.insert(std::make_pair(*path, token));
+  AddPort(std::move(info));
 }
 
 }  // namespace device
diff --git a/services/device/serial/serial_device_enumerator_win.h b/services/device/serial/serial_device_enumerator_win.h
index e38e35df..553a73df 100644
--- a/services/device/serial/serial_device_enumerator_win.h
+++ b/services/device/serial/serial_device_enumerator_win.h
@@ -11,6 +11,9 @@
 #include "device/base/device_monitor_win.h"
 #include "services/device/serial/serial_device_enumerator.h"
 
+typedef void* HDEVINFO;
+typedef struct _SP_DEVINFO_DATA SP_DEVINFO_DATA;
+
 namespace device {
 
 // Discovers and enumerates serial devices available to the host.
@@ -26,11 +29,6 @@
   static base::Optional<base::FilePath> GetPath(
       const std::string& friendly_name);
 
-  // SerialDeviceEnumerator
-  std::vector<mojom::SerialPortInfoPtr> GetDevices() override;
-  base::Optional<base::FilePath> GetPathFromToken(
-      const base::UnguessableToken& token) override;
-
   void OnPathAdded(const base::string16& device_path);
   void OnPathRemoved(const base::string16& device_path);
 
@@ -40,7 +38,6 @@
   void DoInitialEnumeration();
   void EnumeratePort(HDEVINFO dev_info, SP_DEVINFO_DATA* dev_info_data);
 
-  std::map<base::UnguessableToken, mojom::SerialPortInfoPtr> ports_;
   std::map<base::FilePath, base::UnguessableToken> paths_;
 
   std::unique_ptr<UiThreadHelper, base::OnTaskRunnerDeleter> helper_;
diff --git a/services/device/serial/serial_port_manager_impl.cc b/services/device/serial/serial_port_manager_impl.cc
index 54be83a0b..d519b7eb 100644
--- a/services/device/serial/serial_port_manager_impl.cc
+++ b/services/device/serial/serial_port_manager_impl.cc
@@ -32,11 +32,19 @@
     std::unique_ptr<SerialDeviceEnumerator> fake_enumerator) {
   DCHECK(fake_enumerator);
   enumerator_ = std::move(fake_enumerator);
+  observed_enumerator_.Add(enumerator_.get());
+}
+
+void SerialPortManagerImpl::SetClient(
+    mojo::PendingRemote<mojom::SerialPortManagerClient> client) {
+  clients_.Add(std::move(client));
 }
 
 void SerialPortManagerImpl::GetDevices(GetDevicesCallback callback) {
-  if (!enumerator_)
+  if (!enumerator_) {
     enumerator_ = SerialDeviceEnumerator::Create(ui_task_runner_);
+    observed_enumerator_.Add(enumerator_.get());
+  }
   std::move(callback).Run(enumerator_->GetDevices());
 }
 
@@ -44,8 +52,10 @@
     const base::UnguessableToken& token,
     mojo::PendingReceiver<mojom::SerialPort> receiver,
     mojo::PendingRemote<mojom::SerialPortConnectionWatcher> watcher) {
-  if (!enumerator_)
+  if (!enumerator_) {
     enumerator_ = SerialDeviceEnumerator::Create(ui_task_runner_);
+    observed_enumerator_.Add(enumerator_.get());
+  }
   base::Optional<base::FilePath> path = enumerator_->GetPathFromToken(token);
   if (path) {
     io_task_runner_->PostTask(
@@ -55,4 +65,14 @@
   }
 }
 
+void SerialPortManagerImpl::OnPortAdded(const mojom::SerialPortInfo& port) {
+  for (auto& client : clients_)
+    client->OnPortAdded(port.Clone());
+}
+
+void SerialPortManagerImpl::OnPortRemoved(const mojom::SerialPortInfo& port) {
+  for (auto& client : clients_)
+    client->OnPortRemoved(port.Clone());
+}
+
 }  // namespace device
diff --git a/services/device/serial/serial_port_manager_impl.h b/services/device/serial/serial_port_manager_impl.h
index 8ee8c98..9d162a2 100644
--- a/services/device/serial/serial_port_manager_impl.h
+++ b/services/device/serial/serial_port_manager_impl.h
@@ -9,10 +9,13 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
+#include "base/scoped_observer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote_set.h"
 #include "services/device/public/mojom/serial.mojom.h"
+#include "services/device/serial/serial_device_enumerator.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -21,12 +24,11 @@
 
 namespace device {
 
-class SerialDeviceEnumerator;
-
 // TODO(leonhsl): Merge this class with SerialDeviceEnumerator if/once
 // SerialDeviceEnumerator is exposed only via the Device Service.
 // crbug.com/748505
-class SerialPortManagerImpl : public mojom::SerialPortManager {
+class SerialPortManagerImpl : public mojom::SerialPortManager,
+                              public SerialDeviceEnumerator::Observer {
  public:
   SerialPortManagerImpl(
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
@@ -39,18 +41,27 @@
 
  private:
   // mojom::SerialPortManager methods:
+  void SetClient(
+      mojo::PendingRemote<mojom::SerialPortManagerClient> client) override;
   void GetDevices(GetDevicesCallback callback) override;
   void GetPort(
       const base::UnguessableToken& token,
       mojo::PendingReceiver<mojom::SerialPort> receiver,
       mojo::PendingRemote<mojom::SerialPortConnectionWatcher> watcher) override;
 
+  // SerialDeviceEnumerator::Observer methods:
+  void OnPortAdded(const mojom::SerialPortInfo& port) override;
+  void OnPortRemoved(const mojom::SerialPortInfo& port) override;
+
   std::unique_ptr<SerialDeviceEnumerator> enumerator_;
+  ScopedObserver<SerialDeviceEnumerator, SerialDeviceEnumerator::Observer>
+      observed_enumerator_{this};
 
   scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
 
   mojo::ReceiverSet<SerialPortManager> receivers_;
+  mojo::RemoteSet<mojom::SerialPortManagerClient> clients_;
 
   DISALLOW_COPY_AND_ASSIGN(SerialPortManagerImpl);
 };
diff --git a/services/device/serial/serial_port_manager_impl_unittest.cc b/services/device/serial/serial_port_manager_impl_unittest.cc
index 5facd54..8fe4141 100644
--- a/services/device/serial/serial_port_manager_impl_unittest.cc
+++ b/services/device/serial/serial_port_manager_impl_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/macros.h"
 #include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
-#include "base/test/task_environment.h"
 #include "base/threading/thread.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -22,8 +21,12 @@
 #include "services/device/device_service_test_base.h"
 #include "services/device/public/mojom/serial.mojom.h"
 #include "services/device/serial/fake_serial_device_enumerator.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using testing::_;
+using testing::Invoke;
+
 namespace device {
 
 namespace {
@@ -31,37 +34,54 @@
 const base::FilePath kFakeDevicePath1(FILE_PATH_LITERAL("/dev/fakeserialmojo"));
 const base::FilePath kFakeDevicePath2(FILE_PATH_LITERAL("\\\\COM800\\"));
 
-void CreateAndBindOnBlockableRunner(
-    mojo::PendingReceiver<mojom::SerialPortManager> receiver,
-    scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
-  auto manager = std::make_unique<SerialPortManagerImpl>(
-      std::move(io_task_runner), std::move(ui_task_runner));
-  auto fake_enumerator = std::make_unique<FakeSerialEnumerator>();
-  fake_enumerator->AddDevicePath(kFakeDevicePath1);
-  fake_enumerator->AddDevicePath(kFakeDevicePath2);
-  manager->SetSerialEnumeratorForTesting(std::move(fake_enumerator));
-  mojo::MakeSelfOwnedReceiver(std::move(manager), std::move(receiver));
-}
+class MockSerialPortManagerClient : public mojom::SerialPortManagerClient {
+ public:
+  MockSerialPortManagerClient() = default;
+  MockSerialPortManagerClient(const MockSerialPortManagerClient&) = delete;
+  MockSerialPortManagerClient& operator=(const MockSerialPortManagerClient&) =
+      delete;
+  ~MockSerialPortManagerClient() override = default;
+
+  mojo::PendingRemote<mojom::SerialPortManagerClient>
+  BindNewPipeAndPassRemote() {
+    return receiver_.BindNewPipeAndPassRemote();
+  }
+
+  // mojom::SerialPortManagerClient
+  MOCK_METHOD1(OnPortAdded, void(mojom::SerialPortInfoPtr));
+  MOCK_METHOD1(OnPortRemoved, void(mojom::SerialPortInfoPtr));
+
+ private:
+  mojo::Receiver<mojom::SerialPortManagerClient> receiver_{this};
+};
 
 }  // namespace
 
 class SerialPortManagerImplTest : public DeviceServiceTestBase {
  public:
-  SerialPortManagerImplTest() = default;
+  SerialPortManagerImplTest() {
+    auto enumerator = std::make_unique<FakeSerialEnumerator>();
+    enumerator_ = enumerator.get();
+    enumerator_->AddDevicePath(kFakeDevicePath1);
+    enumerator_->AddDevicePath(kFakeDevicePath2);
+
+    manager_ = std::make_unique<SerialPortManagerImpl>(
+        io_task_runner_, base::ThreadTaskRunnerHandle::Get());
+    manager_->SetSerialEnumeratorForTesting(std::move(enumerator));
+  }
+
   ~SerialPortManagerImplTest() override = default;
 
  protected:
-  void SetUp() override { DeviceServiceTestBase::SetUp(); }
+  FakeSerialEnumerator* enumerator_;
 
-  void BindSerialPortManager(
-      mojo::PendingReceiver<mojom::SerialPortManager> receiver) {
-    file_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(&CreateAndBindOnBlockableRunner, std::move(receiver),
-                       io_task_runner_, base::ThreadTaskRunnerHandle::Get()));
+  void Bind(mojo::PendingReceiver<mojom::SerialPortManager> receiver) {
+    manager_->Bind(std::move(receiver));
   }
 
+ private:
+  std::unique_ptr<SerialPortManagerImpl> manager_;
+
   DISALLOW_COPY_AND_ASSIGN(SerialPortManagerImplTest);
 };
 
@@ -92,7 +112,7 @@
 
 TEST_F(SerialPortManagerImplTest, GetDevices) {
   mojo::Remote<mojom::SerialPortManager> port_manager;
-  BindSerialPortManager(port_manager.BindNewPipeAndPassReceiver());
+  Bind(port_manager.BindNewPipeAndPassReceiver());
   const std::set<base::FilePath> expected_paths = {kFakeDevicePath1,
                                                    kFakeDevicePath2};
 
@@ -109,9 +129,58 @@
   loop.Run();
 }
 
+TEST_F(SerialPortManagerImplTest, PortRemovedAndAdded) {
+  mojo::Remote<mojom::SerialPortManager> port_manager;
+  Bind(port_manager.BindNewPipeAndPassReceiver());
+
+  MockSerialPortManagerClient client;
+  port_manager->SetClient(client.BindNewPipeAndPassRemote());
+
+  base::UnguessableToken port1_token;
+  {
+    base::RunLoop run_loop;
+    port_manager->GetDevices(base::BindLambdaForTesting(
+        [&](std::vector<mojom::SerialPortInfoPtr> results) {
+          for (const auto& port : results) {
+            if (port->path == kFakeDevicePath1) {
+              port1_token = port->token;
+              break;
+            }
+          }
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+  ASSERT_FALSE(port1_token.is_empty());
+
+  enumerator_->RemoveDevicePath(kFakeDevicePath1);
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(client, OnPortRemoved(_))
+        .WillOnce(Invoke([&](mojom::SerialPortInfoPtr port) {
+          EXPECT_EQ(port1_token, port->token);
+          EXPECT_EQ(kFakeDevicePath1, port->path);
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+
+  enumerator_->AddDevicePath(kFakeDevicePath1);
+  {
+    base::RunLoop run_loop;
+    EXPECT_CALL(client, OnPortAdded(_))
+        .WillOnce(Invoke([&](mojom::SerialPortInfoPtr port) {
+          EXPECT_NE(port1_token, port->token);
+          EXPECT_EQ(kFakeDevicePath1, port->path);
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+}
+
 TEST_F(SerialPortManagerImplTest, GetPort) {
   mojo::Remote<mojom::SerialPortManager> port_manager;
-  BindSerialPortManager(port_manager.BindNewPipeAndPassReceiver());
+  Bind(port_manager.BindNewPipeAndPassReceiver());
 
   base::RunLoop loop;
   port_manager->GetDevices(base::BindLambdaForTesting(
diff --git a/services/network/cors/cors_url_loader_factory_unittest.cc b/services/network/cors/cors_url_loader_factory_unittest.cc
index d9a468b4..a31fd61 100644
--- a/services/network/cors/cors_url_loader_factory_unittest.cc
+++ b/services/network/cors/cors_url_loader_factory_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request_context.h"
 #include "net/url_request/url_request_context_builder.h"
diff --git a/services/network/cors/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc
index d1865a2..0e027c82 100644
--- a/services/network/cors/cors_url_loader_unittest.cc
+++ b/services/network/cors/cors_url_loader_unittest.cc
@@ -23,6 +23,7 @@
 #include "mojo/public/cpp/bindings/message.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_context.h"
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 059dea47..a40020a 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -62,6 +62,7 @@
 #include "net/http/http_request_headers.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/http_transaction_factory.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_config.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "net/url_request/report_sender.h"
@@ -1138,7 +1139,18 @@
 
 void NetworkContext::ForceReloadProxyConfig(
     ForceReloadProxyConfigCallback callback) {
-  url_request_context()->proxy_resolution_service()->ForceReloadProxyConfig();
+  net::ConfiguredProxyResolutionService* configured_proxy_resolution_service =
+      nullptr;
+  if (url_request_context()
+          ->proxy_resolution_service()
+          ->CastToConfiguredProxyResolutionService(
+              &configured_proxy_resolution_service)) {
+    configured_proxy_resolution_service->ForceReloadProxyConfig();
+  } else {
+    LOG(WARNING)
+        << "NetworkContext::ForceReloadProxyConfig() had no effect, as the "
+           "underlying ProxyResolutionService does not support that concept.";
+  }
   std::move(callback).Run();
 }
 
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index d77d2b0..840df89 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -2338,8 +2338,11 @@
     std::unique_ptr<NetworkContext> network_context =
         CreateContextWithParams(std::move(context_params));
 
-    net::ConfiguredProxyResolutionService* proxy_resolution_service =
-        network_context->url_request_context()->proxy_resolution_service();
+    net::ConfiguredProxyResolutionService* proxy_resolution_service = nullptr;
+    ASSERT_TRUE(network_context->url_request_context()
+                    ->proxy_resolution_service()
+                    ->CastToConfiguredProxyResolutionService(
+                        &proxy_resolution_service));
     // Need to do proxy resolutions before can check the ProxyConfig, as the
     // ProxyService doesn't start updating its config until it's first used.
     // This also gives some test coverage of LookUpProxyForURL.
@@ -2406,8 +2409,11 @@
   std::unique_ptr<NetworkContext> network_context =
       CreateContextWithParams(std::move(context_params));
 
-  net::ConfiguredProxyResolutionService* proxy_resolution_service =
-      network_context->url_request_context()->proxy_resolution_service();
+  net::ConfiguredProxyResolutionService* proxy_resolution_service = nullptr;
+  ASSERT_TRUE(
+      network_context->url_request_context()
+          ->proxy_resolution_service()
+          ->CastToConfiguredProxyResolutionService(&proxy_resolution_service));
   // Kick the ConfiguredProxyResolutionService into action, as it doesn't start
   // updating its config until it's first used.
   proxy_resolution_service->ForceReloadProxyConfig();
@@ -2424,8 +2430,11 @@
   std::unique_ptr<NetworkContext> network_context =
       CreateContextWithParams(std::move(context_params));
 
-  net::ConfiguredProxyResolutionService* proxy_resolution_service =
-      network_context->url_request_context()->proxy_resolution_service();
+  net::ConfiguredProxyResolutionService* proxy_resolution_service = nullptr;
+  ASSERT_TRUE(
+      network_context->url_request_context()
+          ->proxy_resolution_service()
+          ->CastToConfiguredProxyResolutionService(&proxy_resolution_service));
   EXPECT_FALSE(proxy_resolution_service->config());
   EXPECT_FALSE(proxy_resolution_service->fetched_config());
 
@@ -2563,25 +2572,34 @@
   // Check the default value.
   std::unique_ptr<NetworkContext> network_context =
       CreateContextWithParams(CreateContextParams());
-  EXPECT_TRUE(network_context->url_request_context()
-                  ->proxy_resolution_service()
-                  ->quick_check_enabled_for_testing());
+  net::ConfiguredProxyResolutionService* proxy_resolution_service = nullptr;
+  ASSERT_TRUE(
+      network_context->url_request_context()
+          ->proxy_resolution_service()
+          ->CastToConfiguredProxyResolutionService(&proxy_resolution_service));
+  EXPECT_TRUE(proxy_resolution_service->quick_check_enabled_for_testing());
 
   // Explicitly enable.
   mojom::NetworkContextParamsPtr context_params = CreateContextParams();
   context_params->pac_quick_check_enabled = true;
   network_context = CreateContextWithParams(std::move(context_params));
-  EXPECT_TRUE(network_context->url_request_context()
-                  ->proxy_resolution_service()
-                  ->quick_check_enabled_for_testing());
+  proxy_resolution_service = nullptr;
+  ASSERT_TRUE(
+      network_context->url_request_context()
+          ->proxy_resolution_service()
+          ->CastToConfiguredProxyResolutionService(&proxy_resolution_service));
+  EXPECT_TRUE(proxy_resolution_service->quick_check_enabled_for_testing());
 
   // Explicitly disable.
   context_params = CreateContextParams();
   context_params->pac_quick_check_enabled = false;
   network_context = CreateContextWithParams(std::move(context_params));
-  EXPECT_FALSE(network_context->url_request_context()
-                   ->proxy_resolution_service()
-                   ->quick_check_enabled_for_testing());
+  proxy_resolution_service = nullptr;
+  ASSERT_TRUE(
+      network_context->url_request_context()
+          ->proxy_resolution_service()
+          ->CastToConfiguredProxyResolutionService(&proxy_resolution_service));
+  EXPECT_FALSE(proxy_resolution_service->quick_check_enabled_for_testing());
 }
 
 net::IPEndPoint GetLocalHostWithAnyPort() {
@@ -4512,7 +4530,7 @@
   std::unique_ptr<NetworkContext> network_context =
       CreateContextWithParams(CreateContextParams());
 
-  net::ConfiguredProxyResolutionService* proxy_resolution_service =
+  net::ProxyResolutionService* proxy_resolution_service =
       network_context->url_request_context()->proxy_resolution_service();
 
   // Very starting conditions: zero bad proxies.
diff --git a/services/network/network_service_proxy_delegate.cc b/services/network/network_service_proxy_delegate.cc
index c1664fe4c..ffe1147 100644
--- a/services/network/network_service_proxy_delegate.cc
+++ b/services/network/network_service_proxy_delegate.cc
@@ -6,8 +6,8 @@
 #include "net/base/url_util.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_util.h"
-#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/proxy_info.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "services/network/url_loader.h"
 #include "url/url_constants.h"
 
@@ -251,8 +251,7 @@
   // Synthesize a suitable |ProxyInfo| to add the proxies to the
   // |ProxyRetryInfoMap| of the proxy service.
   //
-  // TODO(eroman): Support this more directly on
-  // ConfiguredProxyResolutionService.
+  // TODO(eroman): Support this more directly on ProxyResolutionService.
   net::ProxyList proxy_list;
   for (const auto& bad_proxy : bad_proxies)
     proxy_list.AddProxyServer(bad_proxy);
diff --git a/services/network/network_service_proxy_delegate.h b/services/network/network_service_proxy_delegate.h
index f1a11b0..c1eadfd 100644
--- a/services/network/network_service_proxy_delegate.h
+++ b/services/network/network_service_proxy_delegate.h
@@ -15,7 +15,7 @@
 
 namespace net {
 class HttpRequestHeaders;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class URLRequest;
 }  // namespace net
 
@@ -35,7 +35,7 @@
   ~NetworkServiceProxyDelegate() override;
 
   void SetProxyResolutionService(
-      net::ConfiguredProxyResolutionService* proxy_resolution_service) {
+      net::ProxyResolutionService* proxy_resolution_service) {
     proxy_resolution_service_ = proxy_resolution_service;
   }
 
@@ -100,7 +100,7 @@
   // the request.
   std::deque<mojom::CustomProxyConfigPtr> previous_proxy_configs_;
 
-  net::ConfiguredProxyResolutionService* proxy_resolution_service_ = nullptr;
+  net::ProxyResolutionService* proxy_resolution_service_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(NetworkServiceProxyDelegate);
 };
diff --git a/services/network/proxy_resolving_client_socket.h b/services/network/proxy_resolving_client_socket.h
index 1ad2224c..07271b5 100644
--- a/services/network/proxy_resolving_client_socket.h
+++ b/services/network/proxy_resolving_client_socket.h
@@ -19,6 +19,7 @@
 #include "net/base/net_errors.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/proxy_info.h"
+#include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/connect_job.h"
 #include "net/socket/next_proto.h"
 #include "net/socket/stream_socket.h"
@@ -46,10 +47,9 @@
   // where a connection will be established to. The full URL will be only used
   // for proxy resolution. Caller doesn't need to explicitly sanitize the url,
   // any sensitive data (like embedded usernames and passwords), and local data
-  // (i.e. reference fragment) will be sanitized by
-  // net::ConfiguredProxyResolutionService::ResolveProxyHelper() before the url
-  // is disclosed to the proxy. If |use_tls|, this will try to do a tls connect
-  // instead of a regular tcp connect. |network_session| and
+  // (i.e. reference fragment) will be sanitized by net::ProxyResolutionService
+  // before the url is disclosed to the PAC script. If |use_tls|, this will try
+  // to do a tls connect instead of a regular tcp connect. |network_session| and
   // |common_connect_job_params| must outlive |this|.
   ProxyResolvingClientSocket(
       net::HttpNetworkSession* network_session,
diff --git a/services/network/proxy_service_mojo.h b/services/network/proxy_service_mojo.h
index c93ec63..866098b 100644
--- a/services/network/proxy_service_mojo.h
+++ b/services/network/proxy_service_mojo.h
@@ -13,12 +13,12 @@
 #include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
 
 namespace net {
+class ConfiguredProxyResolutionService;
 class HostResolver;
 class NetLog;
 class NetworkDelegate;
 class ProxyConfigService;
 class PacFileFetcher;
-class ConfiguredProxyResolutionService;
 }  // namespace net
 
 namespace network {
@@ -36,6 +36,9 @@
 // |host_resolver| points to the host resolving dependency the PAC script
 // should use for any DNS queries. It must remain valid throughout the
 // lifetime of the ConfiguredProxyResolutionService.
+//
+// TODO(https://crbug.com/1032820): Rename this to
+// CreateConfiguredProxyResolutionServiceUsingMojoFactory.
 COMPONENT_EXPORT(NETWORK_SERVICE)
 std::unique_ptr<net::ConfiguredProxyResolutionService>
 CreateProxyResolutionServiceUsingMojoFactory(
diff --git a/services/network/proxy_service_mojo_unittest.cc b/services/network/proxy_service_mojo_unittest.cc
index f7e2b39..56b3887 100644
--- a/services/network/proxy_service_mojo_unittest.cc
+++ b/services/network/proxy_service_mojo_unittest.cc
@@ -90,8 +90,8 @@
 void CheckCapturedNetLogEntries(const std::vector<net::NetLogEntry>& entries) {
   ASSERT_GT(entries.size(), 2u);
   size_t i = 0;
-  // ConfiguredProxyResolutionService records its own NetLog entries, so skip
-  // forward until the expected event type.
+  // ProxyResolutionService records its own NetLog entries, so skip forward
+  // until the expected event type.
   while (i < entries.size() &&
          entries[i].type != net::NetLogEventType::PAC_JAVASCRIPT_ALERT) {
     i++;
diff --git a/services/network/tls_client_socket_unittest.cc b/services/network/tls_client_socket_unittest.cc
index 2b5c46c..610ee82 100644
--- a/services/network/tls_client_socket_unittest.cc
+++ b/services/network/tls_client_socket_unittest.cc
@@ -20,6 +20,7 @@
 #include "net/base/completion_once_callback.h"
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/socket/server_socket.h"
 #include "net/socket/socket_test_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -299,8 +300,7 @@
   // SSLInfo obtained from UpgradeToTLS.
   base::Optional<net::SSLInfo> ssl_info_;
 
-  std::unique_ptr<net::ConfiguredProxyResolutionService>
-      proxy_resolution_service_;
+  std::unique_ptr<net::ProxyResolutionService> proxy_resolution_service_;
   net::TestURLRequestContext url_request_context_;
   net::MockClientSocketFactory mock_client_socket_factory_;
   std::unique_ptr<SocketFactory> factory_;
diff --git a/services/network/trust_tokens/BUILD.gn b/services/network/trust_tokens/BUILD.gn
index 52947c7..37894ac5 100644
--- a/services/network/trust_tokens/BUILD.gn
+++ b/services/network/trust_tokens/BUILD.gn
@@ -31,6 +31,8 @@
     "trust_token_request_canonicalizer.cc",
     "trust_token_request_canonicalizer.h",
     "trust_token_request_helper.h",
+    "trust_token_request_issuance_helper.cc",
+    "trust_token_request_issuance_helper.h",
     "trust_token_request_signing_helper.cc",
     "trust_token_request_signing_helper.h",
     "trust_token_store.cc",
@@ -84,6 +86,7 @@
     "trust_token_key_commitment_parser_unittest.cc",
     "trust_token_persister_unittest.cc",
     "trust_token_request_canonicalizer_unittest.cc",
+    "trust_token_request_issuance_helper_unittest.cc",
     "trust_token_request_signing_helper_unittest.cc",
     "trust_token_store_unittest.cc",
     "types_unittest.cc",
diff --git a/services/network/trust_tokens/trust_token_parameterization.h b/services/network/trust_tokens/trust_token_parameterization.h
index 6a721ab..ecf790e 100644
--- a/services/network/trust_tokens/trust_token_parameterization.h
+++ b/services/network/trust_tokens/trust_token_parameterization.h
@@ -56,6 +56,14 @@
 // tokens issued by a given issuer reveals one bit of identifying information).
 constexpr int kTrustTokenPerToplevelMaxNumberOfAssociatedIssuers = 2;
 
+// The default Trust Tokens batch size (i.e., number of tokens to request from
+// an issuer), used when issuers do not themselves provide batch sizes.
+constexpr int kDefaultTrustTokenIssuanceBatchSize = 100;
+
+// The maximum Trust Tokens batch size (i.e., number of tokens to request from
+// an issuer).
+constexpr int kMaximumTrustTokenIssuanceBatchSize = 100;
+
 }  // namespace network
 
 #endif  // SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_PARAMETERIZATION_H_
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper.cc b/services/network/trust_tokens/trust_token_request_issuance_helper.cc
new file mode 100644
index 0000000..baa4fe6
--- /dev/null
+++ b/services/network/trust_tokens/trust_token_request_issuance_helper.cc
@@ -0,0 +1,173 @@
+// Copyright 2020 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.
+
+#include "services/network/trust_tokens/trust_token_request_issuance_helper.h"
+
+#include <utility>
+
+#include "base/callback.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_response_headers.h"
+#include "net/url_request/url_request.h"
+#include "services/network/public/cpp/is_potentially_trustworthy.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+#include "services/network/trust_tokens/proto/public.pb.h"
+#include "services/network/trust_tokens/trust_token_http_headers.h"
+#include "services/network/trust_tokens/trust_token_key_commitment_result.h"
+#include "services/network/trust_tokens/trust_token_parameterization.h"
+#include "services/network/trust_tokens/trust_token_store.h"
+#include "services/network/trust_tokens/types.h"
+#include "url/url_constants.h"
+
+namespace network {
+
+TrustTokenRequestIssuanceHelper::TrustTokenRequestIssuanceHelper(
+    const url::Origin& top_level_origin,
+    TrustTokenStore* token_store,
+    std::unique_ptr<KeyCommitmentGetter> key_commitment_getter,
+    std::unique_ptr<Cryptographer> cryptographer)
+    : top_level_origin_(top_level_origin),
+      token_store_(token_store),
+      key_commitment_getter_(std::move(key_commitment_getter)),
+      cryptographer_(std::move(cryptographer)) {
+  DCHECK(top_level_origin.scheme() == url::kHttpsScheme ||
+         (top_level_origin.scheme() == url::kHttpScheme &&
+          IsOriginPotentiallyTrustworthy(top_level_origin)))
+      << top_level_origin;
+
+  DCHECK(token_store_);
+  DCHECK(key_commitment_getter_);
+  DCHECK(cryptographer_);
+}
+
+TrustTokenRequestIssuanceHelper::~TrustTokenRequestIssuanceHelper() = default;
+
+TrustTokenRequestIssuanceHelper::Cryptographer::UnblindedTokens::
+    UnblindedTokens() = default;
+TrustTokenRequestIssuanceHelper::Cryptographer::UnblindedTokens::
+    ~UnblindedTokens() = default;
+
+void TrustTokenRequestIssuanceHelper::Begin(
+    net::URLRequest* request,
+    base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) {
+  DCHECK(request->url().SchemeIsHTTPOrHTTPS() &&
+         IsUrlPotentiallyTrustworthy(request->url()))
+      << request->url();
+  DCHECK(request->initiator() &&
+             request->initiator()->scheme() == url::kHttpsScheme ||
+         (request->initiator()->scheme() == url::kHttpScheme &&
+          IsOriginPotentiallyTrustworthy(*request->initiator())))
+      << (request->initiator() ? request->initiator()->Serialize()
+                               : "(missing)");
+
+  issuer_ = url::Origin::Create(request->url());
+  if (!token_store_->SetAssociation(issuer_, top_level_origin_)) {
+    std::move(done).Run(mojom::TrustTokenOperationStatus::kResourceExhausted);
+    return;
+  }
+
+  if (token_store_->CountTokens(issuer_) == kTrustTokenPerIssuerTokenCapacity) {
+    std::move(done).Run(mojom::TrustTokenOperationStatus::kResourceExhausted);
+    return;
+  }
+
+  key_commitment_getter_->Get(
+      top_level_origin_,
+      base::BindOnce(&TrustTokenRequestIssuanceHelper::OnGotKeyCommitment,
+                     weak_ptr_factory_.GetWeakPtr(), request, std::move(done)));
+}
+
+void TrustTokenRequestIssuanceHelper::OnGotKeyCommitment(
+    net::URLRequest* request,
+    base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done,
+    std::unique_ptr<TrustTokenKeyCommitmentResult> commitment_result) {
+  if (!commitment_result) {
+    std::move(done).Run(mojom::TrustTokenOperationStatus::kFailedPrecondition);
+    return;
+  }
+
+  int batch_size = commitment_result->batch_size
+                       ? std::min(*commitment_result->batch_size,
+                                  kMaximumTrustTokenIssuanceBatchSize)
+                       : kDefaultTrustTokenIssuanceBatchSize;
+  token_store_->SetBatchSize(issuer_, batch_size);
+
+  std::vector<TrustTokenKeyCommitment> commitments_to_store;
+
+  for (TrustTokenKeyCommitmentResult::Key& key : commitment_result->keys) {
+    if (!cryptographer_->AddKey(key.body)) {
+      std::move(done).Run(
+          mojom::TrustTokenOperationStatus::kFailedPrecondition);
+      return;
+    }
+
+    TrustTokenKeyCommitment to_store;
+    to_store.set_key(std::move(key.body));
+    to_store.set_expiry(internal::TimeToString(key.expiry));
+    commitments_to_store.emplace_back(std::move(to_store));
+  }
+
+  token_store_->SetKeyCommitmentsAndPruneStaleState(
+      issuer_, std::move(commitments_to_store));
+
+  base::Optional<std::string> maybe_blinded_tokens =
+      cryptographer_->BeginIssuance(batch_size);
+
+  if (!maybe_blinded_tokens) {
+    std::move(done).Run(mojom::TrustTokenOperationStatus::kInternalError);
+    return;
+  }
+  request->SetExtraRequestHeaderByName(kTrustTokensSecTrustTokenHeader,
+                                       std::move(*maybe_blinded_tokens),
+                                       /*overwrite=*/true);
+
+  // We don't want cache reads, because the highest priority is to execute the
+  // protocol operation by sending the server the Trust Tokens request header
+  // and getting the corresponding response header, but we want cache writes
+  // in case subsequent requests are made to the same URL in non-trust-token
+  // settings.
+  request->SetLoadFlags(request->load_flags() | net::LOAD_BYPASS_CACHE);
+
+  std::move(done).Run(mojom::TrustTokenOperationStatus::kOk);
+}
+
+mojom::TrustTokenOperationStatus TrustTokenRequestIssuanceHelper::Finalize(
+    mojom::URLResponseHead* response) {
+  DCHECK(response);
+
+  // A response headers object should be present on all responses for
+  // https-scheme requests (which Trust Tokens requests are).
+  DCHECK(response->headers);
+
+  std::string header_value;
+
+  // EnumerateHeader(|iter|=nullptr) asks for the first instance of the header,
+  // if any.
+  if (!response->headers->EnumerateHeader(
+          /*iter=*/nullptr, kTrustTokensSecTrustTokenHeader, &header_value)) {
+    return mojom::TrustTokenOperationStatus::kBadResponse;
+  }
+
+  response->headers->RemoveHeader(kTrustTokensSecTrustTokenHeader);
+
+  std::unique_ptr<Cryptographer::UnblindedTokens> maybe_tokens =
+      cryptographer_->ConfirmIssuance(header_value);
+
+  if (!maybe_tokens) {
+    // The response was rejected by the underlying cryptographic library as
+    // malformed or otherwise invalid.
+    return mojom::TrustTokenOperationStatus::kBadResponse;
+  }
+
+  if (!token_store_->AddTokens(issuer_, base::make_span(maybe_tokens->tokens),
+                               maybe_tokens->body_of_verifying_key)) {
+    // This can fail when, during the course of the issuance, the issuer's keys
+    // were updated, making the tokens dead on arrival.
+    return mojom::TrustTokenOperationStatus::kBadResponse;
+  }
+
+  return mojom::TrustTokenOperationStatus::kOk;
+}
+
+}  // namespace network
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper.h b/services/network/trust_tokens/trust_token_request_issuance_helper.h
new file mode 100644
index 0000000..f5d7c9b1
--- /dev/null
+++ b/services/network/trust_tokens/trust_token_request_issuance_helper.h
@@ -0,0 +1,179 @@
+// Copyright 2020 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.
+
+#ifndef SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_REQUEST_ISSUANCE_HELPER_H_
+#define SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_REQUEST_ISSUANCE_HELPER_H_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/memory/weak_ptr.h"
+#include "base/strings/string_piece_forward.h"
+#include "services/network/public/mojom/trust_tokens.mojom-shared.h"
+#include "services/network/trust_tokens/proto/public.pb.h"
+#include "services/network/trust_tokens/trust_token_key_commitment_result.h"
+#include "services/network/trust_tokens/trust_token_request_helper.h"
+#include "url/origin.h"
+
+namespace net {
+class URLRequest;
+}  // namespace net
+
+namespace network {
+class TrustTokenStore;
+
+namespace mojom {
+class URLResponseHead;
+}  // namespace mojom
+
+// Class TrustTokenRequestIssuanceHelper handles a single trust token issuance
+// operation (https://github.com/wicg/trust-token-api): it generates blinded,
+// unsigned tokens using an underlying cryptographic library, asks a token
+// issuer to sign the tokens, verifies the result, and unblinds and stores the
+// tokens. The normal case involves a total of two network requests: one to get
+// an up-to-date view of a key set the issuer provides for verifying its
+// signatures, and another to send blinded tokens to the issuer.
+class TrustTokenRequestIssuanceHelper : public TrustTokenRequestHelper {
+ public:
+  // Class KeyCommitmentGetter fetches key commitments asynchronously. These are
+  // used for precondition checking before issuance, and for validating
+  // received tokens in issuance responses.
+  class KeyCommitmentGetter {
+   public:
+    virtual ~KeyCommitmentGetter() = default;
+    virtual void Get(
+        const url::Origin& origin,
+        base::OnceCallback<void(std::unique_ptr<TrustTokenKeyCommitmentResult>)>
+            on_done) = 0;
+  };
+
+  // Class Cryptographer executes the underlying cryptographic
+  // operations required for issuance. The API is intended to correspond closely
+  // to the BoringSSL API.
+  class Cryptographer {
+   public:
+    virtual ~Cryptographer() = default;
+    // Stores a Trust Tokens issuance verification key for subsequent use
+    // verifying signed tokens in |ConfirmIssuance|. May be called multiple
+    // times to add multiple keys permissible for use during this issuance.
+    // (Typically, an issuer will have around three simultaneously active public
+    // keys.)
+    //
+    // Returns true on success and false if the key is malformed or an internal
+    // error occurred in the underlying cryptographic library.
+    virtual bool AddKey(base::StringPiece key) = 0;
+
+    // Returns a base64-encoded string representing |num_tokens| many
+    // blinded, unsigned trust tokens, or nullopt on error.
+    virtual base::Optional<std::string> BeginIssuance(size_t num_tokens) = 0;
+
+    struct UnblindedTokens {
+      UnblindedTokens();
+      ~UnblindedTokens();
+
+      std::vector<std::string> tokens;
+      // The verification key that led to the tokens' successful verification.
+      // This will be associated with the tokens in persistent storage and,
+      // subsequently, used to determine whether the tokens are still alive.
+      std::string body_of_verifying_key;
+    };
+
+    // Given a base64-encoded issuance response header, attempts to unblind
+    // the tokens represented by the header using the keys previously added by
+    // AddKey. If successful, returns a vector of tokens (as bytestrings), along
+    // with the key (from the issuer's key commitment registry) that
+    // successfully validated the signed tokens. Otherwise, returns nullptr.
+    virtual std::unique_ptr<UnblindedTokens> ConfirmIssuance(
+        base::StringPiece response_header) = 0;
+  };
+
+  // Creates a new issuance helper.
+  //
+  // - |top_level_origin| is the top-level origin of the request subsequently
+  //   passed to Begin; |top_level_origin|'s scheme must be both (1) HTTP or
+  //   HTTPS and (2) "potentially trustworthy". This precondition is slightly
+  //   involved because there are two needs:
+  //   1. HTTP or HTTPS so that the scheme serializes in a sensible manner in
+  //      order to serve as a key for persisting state.
+  //   2. potentially trustworthy origin to satisfy Web security requirements.
+  // - |token_store| will be responsible for storing underlying Trust Tokens
+  // state. It must outlive this object.
+  // - |key_commitment_getter| and |cryptographer| are delegates that
+  // help execute the protocol; see their class comments.
+  //
+  // REQUIRES: |token_store|, |key_commitment_getter|, and |cryptographer| must
+  // be non-null.
+  TrustTokenRequestIssuanceHelper(
+      const url::Origin& top_level_origin,
+      TrustTokenStore* token_store,
+      std::unique_ptr<KeyCommitmentGetter> key_commitment_getter,
+      std::unique_ptr<Cryptographer> cryptographer);
+  ~TrustTokenRequestIssuanceHelper() override;
+
+  // Executes the outbound part of a Trust Tokens issuance operation,
+  // interpreting |request|'s URL's origin as the token issuer origin;
+  // 1. Checks preconditions (see "Returns" below); if unsuccessful, fails
+  // 2. Executes a Trust Tokens key commitment request against the issuer; if
+  //    unsuccessful, fails
+  // 3. In a request header, adds a number of signed, unblinded tokens equal to
+  //    the lesser of:
+  //    * the issuer's configured batch size
+  //    * a fixed limit on maximum number of tokens to send per request (see
+  //      trust_token_parameterization.h).
+  //
+  // Returns:
+  // * kOk on success
+  // * kInternalError if generating blinded, unsigned tokens fails (this is a
+  //   cryptographic operation not depending on protocol state)
+  // * kResourceExhausted if there is no space to store more tokens
+  //   corresponding to this issuer, or if the top-level origin provided to this
+  //   object's constructor has already reached its number-of-issuers limit
+  // * kFailedPrecondition if preconditions fail, including receiving a
+  //   malformed or otherwise invalid key commitmetment record from the issuer
+  //
+  // |request|'s initiator, and its destination URL's origin, must be both (1)
+  // HTTP or HTTPS and (2) "potentially trustworthy" in the sense of
+  // network::IsOriginPotentiallyTrustworthy. (See the justification in the
+  // constructor's comment.)
+  void Begin(
+      net::URLRequest* request,
+      base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done) override;
+
+  // Performs the second half of Trust Token issuance's client side,
+  // corresponding to the "To process an issuance response" section in the
+  // normative pseudocode:
+  // 1. Checks |response| for an issuance response header.
+  // 2. If the header is present, strips it from the response and passes its
+  // value to an underlying cryptographic library, which parses and validates
+  // the header and splits it into a number of signed, unblinded tokens.
+  //
+  // If both of these steps are successful, stores the tokens in |token_store_|
+  // and returns kOk. Otherwise, returns kBadResponse.
+  mojom::TrustTokenOperationStatus Finalize(
+      mojom::URLResponseHead* response) override;
+
+ private:
+  // Continuation of |Begin| after asynchronous key commitment fetching
+  // concludes.
+  //
+  // |request| and |done| are |Begin|'s parameters, passed on to the
+  // continuation; |commitment_result| is the result of the key commitment
+  // fetch.
+  void OnGotKeyCommitment(
+      net::URLRequest* request,
+      base::OnceCallback<void(mojom::TrustTokenOperationStatus)> done,
+      std::unique_ptr<TrustTokenKeyCommitmentResult> commitment_result);
+
+  url::Origin issuer_;
+  const url::Origin top_level_origin_;
+  TrustTokenStore* const token_store_;
+  const std::unique_ptr<KeyCommitmentGetter> key_commitment_getter_;
+  const std::unique_ptr<Cryptographer> cryptographer_;
+  base::WeakPtrFactory<TrustTokenRequestIssuanceHelper> weak_ptr_factory_{this};
+};
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_TRUST_TOKENS_TRUST_TOKEN_REQUEST_ISSUANCE_HELPER_H_
diff --git a/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc b/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc
new file mode 100644
index 0000000..8916c1e
--- /dev/null
+++ b/services/network/trust_tokens/trust_token_request_issuance_helper_unittest.cc
@@ -0,0 +1,601 @@
+// Copyright 2020 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.
+
+#include "services/network/trust_tokens/trust_token_request_issuance_helper.h"
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/test/task_environment.h"
+#include "net/base/load_flags.h"
+#include "net/base/request_priority.h"
+#include "net/http/http_response_headers.h"
+#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "net/url_request/url_request.h"
+#include "net/url_request/url_request_test_util.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
+#include "services/network/trust_tokens/proto/public.pb.h"
+#include "services/network/trust_tokens/trust_token_http_headers.h"
+#include "services/network/trust_tokens/trust_token_key_commitment_result.h"
+#include "services/network/trust_tokens/trust_token_parameterization.h"
+#include "services/network/trust_tokens/trust_token_store.h"
+#include "services/network/trust_tokens/trust_token_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace network {
+
+namespace {
+
+using ::testing::_;
+using ::testing::ByMove;
+using ::testing::ElementsAre;
+using ::testing::Property;
+using ::testing::Return;
+using ::testing::ReturnNull;
+
+using TrustTokenRequestIssuanceHelperTest = TrustTokenRequestHelperTest;
+using UnblindedTokens =
+    TrustTokenRequestIssuanceHelper::Cryptographer::UnblindedTokens;
+
+// FixedKeyCommitmentGetter returns the provided commitment result when
+// |Get| is called by the tested code.
+class FixedKeyCommitmentGetter
+    : public TrustTokenRequestIssuanceHelper::KeyCommitmentGetter {
+ public:
+  explicit FixedKeyCommitmentGetter(
+      std::unique_ptr<TrustTokenKeyCommitmentResult> result = nullptr)
+      : result_(std::move(result)) {}
+  void Get(
+      const url::Origin& origin,
+      base::OnceCallback<void(std::unique_ptr<TrustTokenKeyCommitmentResult>)>
+          on_done) override {
+    std::move(on_done).Run(std::move(result_));
+  }
+
+ private:
+  std::unique_ptr<TrustTokenKeyCommitmentResult> result_;
+};
+
+// MockCryptographer mocks out the cryptographic operations underlying Trust
+// Tokens issuance.
+class MockCryptographer
+    : public TrustTokenRequestIssuanceHelper::Cryptographer {
+ public:
+  MOCK_METHOD1(AddKey, bool(base::StringPiece key));
+  MOCK_METHOD1(BeginIssuance, base::Optional<std::string>(size_t num_tokens));
+  MOCK_METHOD1(
+      ConfirmIssuance,
+      std::unique_ptr<UnblindedTokens>(base::StringPiece response_header));
+};
+
+}  // namespace
+
+// Check that issuance fails if it would result in too many issuers being
+// configured for the issuance top-level origin.
+TEST_F(TrustTokenRequestIssuanceHelperTest, RejectsIfTooManyIssuers) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto issuer = url::Origin::Create(GURL("https://issuer.com/"));
+  auto toplevel = url::Origin::Create(GURL("https://toplevel.com/"));
+
+  // Associate the toplevel with the cap's worth of issuers different from
+  // |issuer|. (The cap is guaranteed to be quite small because of privacy
+  // requirements of the Trust Tokens protocol.)
+  for (int i = 0; i < kTrustTokenPerToplevelMaxNumberOfAssociatedIssuers; ++i) {
+    ASSERT_TRUE(store->SetAssociation(
+        url::Origin::Create(
+            GURL(base::StringPrintf("https://issuer%d.com/", i))),
+        toplevel));
+  }
+
+  TrustTokenRequestIssuanceHelper helper(
+      toplevel, store.get(), std::make_unique<FixedKeyCommitmentGetter>(),
+      std::make_unique<MockCryptographer>());
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(issuer);
+  EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kResourceExhausted);
+}
+
+// Check that issuance fails if the number of tokens stored for the issuer is
+// already at capacity.
+TEST_F(TrustTokenRequestIssuanceHelperTest, RejectsIfAtCapacity) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto issuer = url::Origin::Create(GURL("https://issuer.com/"));
+
+  // In order to add tokens, add a key commitment with a default (empty) key.
+  store->SetKeyCommitmentsAndPruneStaleState(
+      issuer, std::vector<TrustTokenKeyCommitment>(1));
+  // Fill up the store with tokens; issuance should fail the tokens for |issuer|
+  // are at capacity.
+  ASSERT_TRUE(store->AddTokens(
+      issuer, std::vector<std::string>(kTrustTokenPerIssuerTokenCapacity),
+      /*issuing_key=*/""));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::make_unique<FixedKeyCommitmentGetter>(),
+      std::make_unique<MockCryptographer>());
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(issuer);
+  EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kResourceExhausted);
+}
+
+// Check that issuance fails if its key commitment request fails.
+TEST_F(TrustTokenRequestIssuanceHelperTest, RejectsIfKeyCommitmentFails) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  // Providing a FixedKeyCommitmentGetter without a key commitment will
+  // return nullptr, denoting that the key commitment fetch failed.
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::make_unique<FixedKeyCommitmentGetter>(),
+      std::make_unique<MockCryptographer>());
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kFailedPrecondition);
+}
+
+// Reject if one of the keys in the commitment is malformed.
+TEST_F(TrustTokenRequestIssuanceHelperTest, RejectsIfAddingKeyFails) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(false));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kFailedPrecondition);
+}
+
+// Reject if there's an error getting blinded, unsigned tokens from BoringSSL.
+TEST_F(TrustTokenRequestIssuanceHelperTest,
+       RejectsIfGettingBlindedTokensFails) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  // Return nullopt, denoting an error, when the issuance helper requests
+  // blinded, unsigned tokens.
+  EXPECT_CALL(*cryptographer, BeginIssuance(_)).WillOnce(Return(base::nullopt));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  // This is an internal error because creating blinded tokens is a
+  // cryptographic operation not dependent on the inputs provided by the client
+  // or the protocol state.
+  EXPECT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kInternalError);
+}
+
+// Check that the issuance helper sets the Sec-Trust-Token header on the
+// outgoing request.
+TEST_F(TrustTokenRequestIssuanceHelperTest, SetsRequestHeader) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  // The result of providing blinded, unsigned tokens should be the exact value
+  // of the Sec-Trust-Token header attached to the request.
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  std::string attached_header;
+  EXPECT_TRUE(request->extra_request_headers().GetHeader(
+      kTrustTokensSecTrustTokenHeader, &attached_header));
+  EXPECT_EQ(attached_header, "this string contains some blinded tokens");
+}
+
+// Check that the issuance helper sets the LOAD_BYPASS_CACHE flag on the
+// outgoing request.
+TEST_F(TrustTokenRequestIssuanceHelperTest, SetsLoadFlag) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  // The result of providing blinded, unsigned tokens should be the exact value
+  // of the Sec-Trust-Token header attached to the request.
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+  EXPECT_TRUE(request->load_flags() & net::LOAD_BYPASS_CACHE);
+}
+
+// Check that the issuance helper rejects responses lacking the Sec-Trust-Token
+// response header.
+TEST_F(TrustTokenRequestIssuanceHelperTest, RejectsIfResponseOmitsHeader) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  auto response_head = mojom::URLResponseHead::New();
+  response_head->headers =
+      net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n");
+  EXPECT_EQ(helper.Finalize(response_head.get()),
+            mojom::TrustTokenOperationStatus::kBadResponse);
+}
+
+// Check that the issuance helper handles an issuance response rejected by the
+// underlying cryptographic library.
+TEST_F(TrustTokenRequestIssuanceHelperTest, RejectsIfResponseIsUnusable) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+  // Fail the "confirm issuance" step of validating the server's response
+  // within the underlying cryptographic library.
+  EXPECT_CALL(*cryptographer, ConfirmIssuance(_)).WillOnce(ReturnNull());
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  auto response_head = mojom::URLResponseHead::New();
+  response_head->headers =
+      net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n");
+  response_head->headers->AddHeader(base::StringPrintf(
+      "%s: %s", kTrustTokensSecTrustTokenHeader,
+      "response from issuer (this value will be ignored, since "
+      "Cryptographer::ConfirmResponse is mocked out)"));
+  EXPECT_EQ(helper.Finalize(response_head.get()),
+            mojom::TrustTokenOperationStatus::kBadResponse);
+
+  // Verify that Finalize correctly stripped the response header.
+  EXPECT_FALSE(
+      response_head->headers->HasHeader(kTrustTokensSecTrustTokenHeader));
+}
+
+// Check that the issuance helper handles the case where storing retrieved
+// tokens fails because the corresponding verification key has been rotated out
+// while the issuance request and response were in flight.
+TEST_F(TrustTokenRequestIssuanceHelperTest,
+       RejectsWhenVerificationKeyRotatesOutDuringExecution) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+  EXPECT_CALL(*cryptographer, ConfirmIssuance(_))
+      .WillOnce(Return(ByMove(std::make_unique<UnblindedTokens>())));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  // Remove the key from the token store. As a consequence, because the tokens
+  // received during issuance are associated with this key, adding them to the
+  // store should fail.
+  store->SetKeyCommitmentsAndPruneStaleState(
+      url::Origin::Create(GURL("https://issuer.com/")),
+      std::vector<TrustTokenKeyCommitment>());
+
+  auto response_head = mojom::URLResponseHead::New();
+  response_head->headers =
+      net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n");
+  response_head->headers->AddHeader(base::StringPrintf(
+      "%s: %s", kTrustTokensSecTrustTokenHeader,
+      "response from issuer (this value will be ignored, since "
+      "Cryptographer::ConfirmResponse is mocked out)"));
+  EXPECT_EQ(helper.Finalize(response_head.get()),
+            mojom::TrustTokenOperationStatus::kBadResponse);
+}
+
+// Check that, when preconditions are met and the underlying cryptographic steps
+// successfully complete, the begin/finalize methods succeed.
+TEST_F(TrustTokenRequestIssuanceHelperTest, Success) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+  EXPECT_CALL(*cryptographer, ConfirmIssuance(_))
+      .WillOnce(Return(ByMove(std::make_unique<UnblindedTokens>())));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  auto response_head = mojom::URLResponseHead::New();
+  response_head->headers =
+      net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n");
+  response_head->headers->AddHeader(base::StringPrintf(
+      "%s: %s", kTrustTokensSecTrustTokenHeader,
+      "response from issuer (this value will be ignored, since "
+      "Cryptographer::ConfirmResponse is mocked out)"));
+  EXPECT_EQ(helper.Finalize(response_head.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  // Verify that Finalize correctly stripped the response header.
+  EXPECT_FALSE(
+      response_head->headers->HasHeader(kTrustTokensSecTrustTokenHeader));
+}
+
+// Check that a successful Begin call associates the issuer with the issuance
+// toplevel origin.
+TEST_F(TrustTokenRequestIssuanceHelperTest, AssociatesIssuerWithToplevel) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  // After the operation has successfully begun, the issuer and the toplevel
+  // should be associated.
+  EXPECT_TRUE(
+      store->IsAssociated(url::Origin::Create(GURL("https://issuer.com/")),
+                          url::Origin::Create(GURL("https://toplevel.com/"))));
+}
+
+// Check that a successful Begin call stores the batch size obtained from the
+// key commitment registry in the trust token store.
+TEST_F(TrustTokenRequestIssuanceHelperTest, StoresBatchSize) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(TrustTokenKeyCommitmentResult::Key());
+  key_commitment_result->batch_size = 10;
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  // After the operation has successfully begun, the issuer and the toplevel
+  // should be associated.
+  EXPECT_EQ(store->BatchSize(url::Origin::Create(GURL("https://issuer.com/"))),
+            10);
+}
+
+// Check that a successful Begin call stores the keys obtained from the key
+// commitment registry in the trust token store.
+TEST_F(TrustTokenRequestIssuanceHelperTest, StoresObtainedKeys) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(
+      TrustTokenKeyCommitmentResult::Key{.body = "key"});
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  // After the operation has successfully begun, the keys from the key
+  // commitment query should have been stored in the trust token store.
+  EXPECT_THAT(
+      store->KeyCommitments(url::Origin::Create(GURL("https://issuer.com/"))),
+      ElementsAre(Property(&TrustTokenKeyCommitment::key, "key")));
+}
+
+// Check that a successful end-to-end Begin/Finalize flow stores the obtained
+// trust tokens in the trust token store.
+TEST_F(TrustTokenRequestIssuanceHelperTest, StoresObtainedTokens) {
+  std::unique_ptr<TrustTokenStore> store = TrustTokenStore::CreateInMemory();
+
+  auto key_commitment_result =
+      std::make_unique<TrustTokenKeyCommitmentResult>();
+  key_commitment_result->keys.push_back(
+      TrustTokenKeyCommitmentResult::Key{.body = "key"});
+  auto getter = std::make_unique<FixedKeyCommitmentGetter>(
+      std::move(key_commitment_result));
+
+  // Have the Trust Tokens issuance conclude by the underlying cryptographic
+  // library returning one signed, unblinded token associated with the same
+  // returned from te key commitment.
+  auto unblinded_tokens = std::make_unique<UnblindedTokens>();
+  unblinded_tokens->body_of_verifying_key = "key";
+  unblinded_tokens->tokens.push_back("a signed, unblinded token");
+
+  auto cryptographer = std::make_unique<MockCryptographer>();
+  EXPECT_CALL(*cryptographer, AddKey(_)).WillOnce(Return(true));
+  EXPECT_CALL(*cryptographer, BeginIssuance(_))
+      .WillOnce(
+          Return(std::string("this string contains some blinded tokens")));
+  EXPECT_CALL(*cryptographer, ConfirmIssuance(_))
+      .WillOnce(Return(ByMove(std::move((unblinded_tokens)))));
+
+  TrustTokenRequestIssuanceHelper helper(
+      url::Origin::Create(GURL("https://toplevel.com/")), store.get(),
+      std::move(getter), std::move(cryptographer));
+
+  auto request = MakeURLRequest("https://issuer.com/");
+  request->set_initiator(url::Origin::Create(GURL("https://issuer.com/")));
+
+  ASSERT_EQ(ExecuteBeginOperationAndWaitForResult(&helper, request.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  auto response_head = mojom::URLResponseHead::New();
+  response_head->headers =
+      net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n");
+  response_head->headers->AddHeader(base::StringPrintf(
+      "%s: %s", kTrustTokensSecTrustTokenHeader,
+      "response from issuer (this value will be ignored, since "
+      "Cryptographer::ConfirmResponse is mocked out)"));
+  EXPECT_EQ(helper.Finalize(response_head.get()),
+            mojom::TrustTokenOperationStatus::kOk);
+
+  // After the operation has successfully finished, the trust tokens parsed from
+  // the server response should be in the store.
+  auto match_all_keys =
+      base::BindRepeating([](const std::string&) { return true; });
+  EXPECT_THAT(
+      store->RetrieveMatchingTokens(
+          url::Origin::Create(GURL("https://issuer.com/")),
+          std::move(match_all_keys)),
+      ElementsAre(Property(&TrustToken::body, "a signed, unblinded token")));
+}
+}  // namespace network
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index e0068024..109d497 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -47,6 +47,7 @@
 #include "net/cookies/cookie_util.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_response_info.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/ssl/client_cert_identity_test_util.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/embedded_test_server/controllable_http_response.h"
diff --git a/services/network/url_request_context_builder_mojo.cc b/services/network/url_request_context_builder_mojo.cc
index 9f31651..a9e8dec 100644
--- a/services/network/url_request_context_builder_mojo.cc
+++ b/services/network/url_request_context_builder_mojo.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "build/build_config.h"
+#include "net/proxy_resolution/configured_proxy_resolution_service.h"
 #include "net/proxy_resolution/pac_file_fetcher_impl.h"
 #include "net/proxy_resolution/proxy_config_service.h"
 #include "services/network/network_context.h"
@@ -50,7 +51,7 @@
 #endif
 }
 
-std::unique_ptr<net::ConfiguredProxyResolutionService>
+std::unique_ptr<net::ProxyResolutionService>
 URLRequestContextBuilderMojo::CreateProxyResolutionService(
     std::unique_ptr<net::ProxyConfigService> proxy_config_service,
     net::URLRequestContext* url_request_context,
diff --git a/services/network/url_request_context_builder_mojo.h b/services/network/url_request_context_builder_mojo.h
index bf403c9af..15ee45e 100644
--- a/services/network/url_request_context_builder_mojo.h
+++ b/services/network/url_request_context_builder_mojo.h
@@ -21,19 +21,20 @@
 #endif  // defined(OS_CHROMEOS)
 
 namespace net {
+class DhcpPacFileFetcher;
 class HostResolver;
 class NetLog;
 class NetworkDelegate;
-class ConfiguredProxyResolutionService;
+class ProxyResolutionService;
 class URLRequestContext;
 }  // namespace net
 
 namespace network {
 // Specialization of URLRequestContextBuilder that can create a
-// ConfiguredProxyResolutionService that uses a Mojo ProxyResolver. The consumer
-// is responsible for providing the proxy_resolver::mojom::ProxyResolverFactory.
-// If a ConfiguredProxyResolutionService is set directly via the
-// URLRequestContextBuilder API, it will be used instead.
+// ProxyResolutionService that uses a Mojo ProxyResolver. The consumer is
+// responsible for providing the proxy_resolver::mojom::ProxyResolverFactory.
+// If a ProxyResolutionService is set directly via the URLRequestContextBuilder
+// API, it will be used instead.
 class COMPONENT_EXPORT(NETWORK_SERVICE) URLRequestContextBuilderMojo
     : public net::URLRequestContextBuilder {
  public:
@@ -53,8 +54,7 @@
 #endif  // defined(OS_CHROMEOS)
 
  private:
-  std::unique_ptr<net::ConfiguredProxyResolutionService>
-  CreateProxyResolutionService(
+  std::unique_ptr<net::ProxyResolutionService> CreateProxyResolutionService(
       std::unique_ptr<net::ProxyConfigService> proxy_config_service,
       net::URLRequestContext* url_request_context,
       net::HostResolver* host_resolver,
diff --git a/services/service_manager/embedder/BUILD.gn b/services/service_manager/embedder/BUILD.gn
index 0dac8b6..b125e59 100644
--- a/services/service_manager/embedder/BUILD.gn
+++ b/services/service_manager/embedder/BUILD.gn
@@ -37,7 +37,6 @@
       "//base:base_static",
       "//base:i18n",
       "//base/allocator:buildflags",
-      "//components/crash/core/common",
       "//components/tracing:startup_tracing",
     ]
 
diff --git a/services/service_manager/embedder/DEPS b/services/service_manager/embedder/DEPS
index 89b3f92..74636dad 100644
--- a/services/service_manager/embedder/DEPS
+++ b/services/service_manager/embedder/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+components/crash/core/common/crash_key.h",
   "+components/tracing/common",
   "+ui/base",
 ]
diff --git a/services/service_manager/embedder/main.cc b/services/service_manager/embedder/main.cc
index d704e971..1b713d5 100644
--- a/services/service_manager/embedder/main.cc
+++ b/services/service_manager/embedder/main.cc
@@ -27,7 +27,6 @@
 #include "base/trace_event/trace_config.h"
 #include "base/trace_event/trace_log.h"
 #include "build/build_config.h"
-#include "components/crash/core/common/crash_key.h"
 #include "components/tracing/common/trace_to_console.h"
 #include "components/tracing/common/tracing_switches.h"
 #include "mojo/core/embedder/configuration.h"
@@ -389,8 +388,6 @@
     // sandboxed process. The defines below must be in sync with the
     // implementation of mojo::NodeController::CreateSharedBuffer().
 #if !defined(OS_MACOSX) && !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA)
-    // TODO(dcheng): Remove this after debugging crashes in cloud print service.
-    const char* shmem_hooks_result = "";
     // TODO(dcheng): The separate check for |is_broker_process| should not be
     // required, but avoid changing the behavior of IsUnsandboxedSandboxType()
     // for now.
@@ -399,11 +396,9 @@
             service_manager::SandboxTypeFromCommandLine(command_line))) {
       // Unsandboxed processes don't need shared memory brokering... because
       // they're not sandboxed.
-      shmem_hooks_result = "not set";
     } else if (mojo_config.force_direct_shared_memory_allocation) {
       // Don't bother with hooks if direct shared memory allocation has been
       // requested.
-      shmem_hooks_result = "direct requested";
     } else {
       // Otherwise, this is a sandboxed process that will need brokering to
       // allocate shared memory.
@@ -411,35 +406,7 @@
           &mojo::CreateReadOnlySharedMemoryRegion,
           &mojo::CreateUnsafeSharedMemoryRegion,
           &mojo::CreateWritableSharedMemoryRegion);
-      shmem_hooks_result = "installed";
     }
-
-    static crash_reporter::CrashKeyString<32> has_process_type_key(
-        "shmem_hooks_has_process_type");
-    has_process_type_key.Set(
-        command_line.HasSwitch(switches::kProcessType) ? "true" : "false");
-
-    static crash_reporter::CrashKeyString<32> process_type_key(
-        "shmem_hooks_process_type");
-    std::string shmem_process_type =
-        command_line.GetSwitchValueASCII(switches::kProcessType);
-    process_type_key.Set(shmem_process_type);
-
-    static crash_reporter::CrashKeyString<32> is_process_broker_key(
-        "shmem_hooks_is_broker");
-    is_process_broker_key.Set(mojo_config.is_broker_process ? "true" : "false");
-
-    static crash_reporter::CrashKeyString<32> is_unsandboxed_process_key(
-        "shmem_hooks_is_unsandboxed");
-    is_unsandboxed_process_key.Set(
-        service_manager::IsUnsandboxedSandboxType(
-            service_manager::SandboxTypeFromCommandLine(command_line))
-            ? "true"
-            : "false");
-
-    static crash_reporter::CrashKeyString<32> shmem_hooks_result_key(
-        "shmem_hooks_result");
-    shmem_hooks_result_key.Set(shmem_hooks_result);
 #endif  // !defined(OS_MACOSX) && !defined(OS_NACL_SFI) && !defined(OS_FUCHSIA)
 
 #if defined(OS_WIN)
diff --git a/services/service_manager/sandbox/BUILD.gn b/services/service_manager/sandbox/BUILD.gn
index 26ce8af..e361e2b 100644
--- a/services/service_manager/sandbox/BUILD.gn
+++ b/services/service_manager/sandbox/BUILD.gn
@@ -50,6 +50,8 @@
       "linux/bpf_print_compositor_policy_linux.h",
       "linux/bpf_renderer_policy_linux.cc",
       "linux/bpf_renderer_policy_linux.h",
+      "linux/bpf_sharing_service_policy_linux.cc",
+      "linux/bpf_sharing_service_policy_linux.h",
       "linux/bpf_soda_policy_linux.cc",
       "linux/bpf_soda_policy_linux.h",
       "linux/bpf_utility_policy_linux.cc",
diff --git a/services/service_manager/sandbox/linux/bpf_cros_amd_gpu_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_cros_amd_gpu_policy_linux.cc
index 321ea4a..286277da 100644
--- a/services/service_manager/sandbox/linux/bpf_cros_amd_gpu_policy_linux.cc
+++ b/services/service_manager/sandbox/linux/bpf_cros_amd_gpu_policy_linux.cc
@@ -5,6 +5,7 @@
 #include "services/service_manager/sandbox/linux/bpf_cros_amd_gpu_policy_linux.h"
 
 #include <fcntl.h>
+#include <linux/kcmp.h>
 #include <sys/socket.h>
 
 // Some arch's (arm64 for instance) unistd.h don't pull in symbols used here
@@ -17,6 +18,7 @@
 #include "sandbox/linux/bpf_dsl/bpf_dsl.h"
 #include "sandbox/linux/system_headers/linux_syscalls.h"
 
+using sandbox::bpf_dsl::AllOf;
 using sandbox::bpf_dsl::Allow;
 using sandbox::bpf_dsl::Arg;
 using sandbox::bpf_dsl::Error;
@@ -48,6 +50,17 @@
       return If(domain == AF_UNIX, Allow()).Else(Error(EPERM));
     }
 #endif
+    case __NR_kcmp: {
+      const Arg<int> pid1(0);
+      const Arg<int> pid2(1);
+      const Arg<int> type(2);
+      const int policy_pid = GetPolicyPid();
+      // Only allowed when comparing file handles for the calling thread.
+      return If(AllOf(pid1 == policy_pid, pid2 == policy_pid,
+                      type == KCMP_FILE),
+                Allow())
+          .Else(Error(EPERM));
+    }
     default:
       // Default to the generic GPU policy.
       return GpuProcessPolicy::EvaluateSyscall(sysno);
diff --git a/services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.cc b/services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.cc
new file mode 100644
index 0000000..483c1c6
--- /dev/null
+++ b/services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.cc
@@ -0,0 +1,45 @@
+// Copyright 2020 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.
+
+#include "services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.h"
+
+#include <errno.h>
+
+#include "build/build_config.h"
+#include "sandbox/linux/bpf_dsl/bpf_dsl.h"
+#include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h"
+#include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h"
+#include "sandbox/linux/system_headers/linux_syscalls.h"
+#include "services/service_manager/sandbox/linux/sandbox_linux.h"
+
+using sandbox::SyscallSets;
+using sandbox::bpf_dsl::Allow;
+using sandbox::bpf_dsl::Error;
+using sandbox::bpf_dsl::ResultExpr;
+
+namespace service_manager {
+
+ResultExpr SharingServiceProcessPolicy::EvaluateSyscall(int sysno) const {
+  switch (sysno) {
+    case __NR_ioctl:
+      return sandbox::RestrictIoctl();
+      // Allow the system calls below.
+#if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \
+    defined(__aarch64__)
+    case __NR_getrlimit:
+#endif
+#if defined(__i386__) || defined(__arm__)
+    case __NR_ugetrlimit:
+#endif
+    case __NR_mremap:  // https://crbug.com/546204
+    case __NR_pwrite64:
+    case __NR_times:
+      return Allow();
+    default:
+      // Default on the content baseline policy.
+      return BPFBasePolicy::EvaluateSyscall(sysno);
+  }
+}
+
+}  // namespace service_manager
diff --git a/services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.h b/services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.h
new file mode 100644
index 0000000..4b62254
--- /dev/null
+++ b/services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.h
@@ -0,0 +1,29 @@
+// Copyright 2020 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.
+
+#ifndef SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SHARING_SERVICE_POLICY_LINUX_H_
+#define SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_SHARING_SERVICE_POLICY_LINUX_H_
+
+#include "base/macros.h"
+#include "services/service_manager/sandbox/linux/bpf_base_policy_linux.h"
+
+namespace service_manager {
+
+// This policy can be used by the Sharing service to host WebRTC.
+class SharingServiceProcessPolicy : public BPFBasePolicy {
+ public:
+  SharingServiceProcessPolicy() = default;
+  ~SharingServiceProcessPolicy() override = default;
+
+  sandbox::bpf_dsl::ResultExpr EvaluateSyscall(
+      int system_call_number) const override;
+
+  SharingServiceProcessPolicy(const SharingServiceProcessPolicy&) = delete;
+  SharingServiceProcessPolicy& operator=(const SharingServiceProcessPolicy&) =
+      delete;
+};
+
+}  // namespace service_manager
+
+#endif  // SERVICES_SERVICE_MANAGER_SANDBOX_LINUX_BPF_UTILITY_POLICY_LINUX_H_
diff --git a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
index fd240c5b..d03e486 100644
--- a/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
+++ b/services/service_manager/sandbox/linux/sandbox_seccomp_bpf_linux.cc
@@ -43,6 +43,7 @@
 #include "services/service_manager/sandbox/linux/bpf_ppapi_policy_linux.h"
 #include "services/service_manager/sandbox/linux/bpf_print_compositor_policy_linux.h"
 #include "services/service_manager/sandbox/linux/bpf_renderer_policy_linux.h"
+#include "services/service_manager/sandbox/linux/bpf_sharing_service_policy_linux.h"
 #include "services/service_manager/sandbox/linux/bpf_soda_policy_linux.h"
 #include "services/service_manager/sandbox/linux/bpf_utility_policy_linux.h"
 
@@ -173,6 +174,8 @@
       return std::make_unique<NetworkProcessPolicy>();
     case SandboxType::kAudio:
       return std::make_unique<AudioProcessPolicy>();
+    case SandboxType::kSharingService:
+      return std::make_unique<SharingServiceProcessPolicy>();
     case SandboxType::kSoda:
       return std::make_unique<SodaProcessPolicy>();
 #if defined(OS_CHROMEOS)
@@ -222,6 +225,7 @@
     case SandboxType::kIme:
 #endif  // defined(OS_CHROMEOS)
     case SandboxType::kAudio:
+    case SandboxType::kSharingService:
     case SandboxType::kSoda:
     case SandboxType::kNetwork:
     case SandboxType::kUtility:
diff --git a/services/service_manager/sandbox/sandbox_type.cc b/services/service_manager/sandbox/sandbox_type.cc
index 8bb1f08..3161630 100644
--- a/services/service_manager/sandbox/sandbox_type.cc
+++ b/services/service_manager/sandbox/sandbox_type.cc
@@ -19,7 +19,6 @@
 #if defined(OS_WIN)
     case SandboxType::kNoSandboxAndElevatedPrivileges:
       return true;
-
     case SandboxType::kXrCompositing:
       return !base::FeatureList::IsEnabled(
           service_manager::features::kXRSandbox);
@@ -52,6 +51,9 @@
 #if defined(OS_CHROMEOS)
     case SandboxType::kIme:
 #endif
+#if !defined(OS_MACOSX)
+    case SandboxType::kSharingService:
+#endif
     case SandboxType::kSoda:
       return false;
   }
@@ -99,6 +101,9 @@
 #if defined(OS_CHROMEOS)
     case SandboxType::kIme:
 #endif  // defined(OS_CHROMEOS)
+#if !defined(OS_MACOSX)
+    case SandboxType::kSharingService:
+#endif
     case SandboxType::kSoda:
       DCHECK(command_line->GetSwitchValueASCII(switches::kProcessType) ==
              switches::kUtilityProcess);
@@ -175,6 +180,10 @@
       return switches::kUtilitySandbox;
     case SandboxType::kAudio:
       return switches::kAudioSandbox;
+#if !defined(OS_MACOSX)
+    case SandboxType::kSharingService:
+      return switches::kSharingServiceSandbox;
+#endif
     case SandboxType::kSoda:
       return switches::kSodaSandbox;
 #if defined(OS_WIN)
diff --git a/services/service_manager/sandbox/sandbox_type.h b/services/service_manager/sandbox/sandbox_type.h
index 78fd014..f8ee0c1 100644
--- a/services/service_manager/sandbox/sandbox_type.h
+++ b/services/service_manager/sandbox/sandbox_type.h
@@ -74,6 +74,11 @@
   kIme,
 #endif  // defined(OS_CHROMEOS)
 
+#if !defined(OS_MACOSX)
+  // Hosts WebRTC for Sharing Service, uses kUtility on OS_MACOSX.
+  kSharingService,
+#endif
+
   // The Speech On-Device API service process.
   kSoda,
 
diff --git a/services/service_manager/sandbox/switches.cc b/services/service_manager/sandbox/switches.cc
index f034f862..e20a0da 100644
--- a/services/service_manager/sandbox/switches.cc
+++ b/services/service_manager/sandbox/switches.cc
@@ -28,6 +28,7 @@
 const char kCdmSandbox[] = "cdm";
 const char kPrintCompositorSandbox[] = "print_compositor";
 const char kAudioSandbox[] = "audio";
+const char kSharingServiceSandbox[] = "sharing_service";
 const char kSodaSandbox[] = "soda";
 
 #if defined(OS_WIN)
diff --git a/services/service_manager/sandbox/switches.h b/services/service_manager/sandbox/switches.h
index a76337ae..65165e8 100644
--- a/services/service_manager/sandbox/switches.h
+++ b/services/service_manager/sandbox/switches.h
@@ -27,6 +27,7 @@
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kCdmSandbox[];
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kPrintCompositorSandbox[];
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kAudioSandbox[];
+SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSharingServiceSandbox[];
 SERVICE_MANAGER_SANDBOX_EXPORT extern const char kSodaSandbox[];
 
 #if defined(OS_WIN)
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json
index 1c86099..f0bfa27 100644
--- a/testing/buildbot/chromium.ci.json
+++ b/testing/buildbot/chromium.ci.json
@@ -5,6 +5,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -161,8 +163,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -536,8 +539,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -911,8 +915,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1177,8 +1182,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1463,8 +1469,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1520,8 +1527,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1921,8 +1929,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -5581,6 +5590,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -6087,6 +6098,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -6559,6 +6572,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -7699,6 +7714,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -8800,6 +8817,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -38862,8 +38881,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -39485,8 +39505,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -40089,8 +40110,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -40713,8 +40735,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -58889,8 +58912,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -59500,8 +59524,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -60221,8 +60246,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -60870,8 +60896,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -61411,8 +61438,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -61919,8 +61947,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -62614,8 +62643,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -63419,8 +63449,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -86006,8 +86037,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -86235,8 +86267,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -86513,8 +86546,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -86751,8 +86785,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -87007,8 +87042,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -87197,8 +87233,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -87694,8 +87731,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -128112,8 +128150,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -128823,10 +128862,364 @@
     ]
   },
   "Win10 FYI x64 Exp Release (Intel HD 630)": {
+    "gtest_tests": [
+      {
+        "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "angle_end2end_tests",
+        "test_target": "//third_party/angle/src/tests:angle_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_gles1_conformance_tests",
+        "test_target": "//third_party/angle/src/tests:angle_gles1_conformance_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_target": "//third_party/angle/src/tests:angle_unittests"
+      },
+      {
+        "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_white_box_tests",
+        "test_target": "//third_party/angle/src/tests:angle_white_box_tests"
+      },
+      {
+        "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "tab_capture_end2end_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "browser_tests",
+        "test_target": "//chrome/test:browser_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_target": "//gpu:gl_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_unittests",
+        "test_target": "//ui/gl:gl_unittests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gles2_conform_test",
+        "test_target": "//gpu/gles2_conform_support:gles2_conform_test"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
+          "--use-angle=d3d9"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gles2_conform_d3d9_test",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gles2_conform_test",
+        "test_target": "//gpu/gles2_conform_support:gles2_conform_test"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
+          "--use-angle=gl",
+          "--disable-gpu-sandbox"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gles2_conform_gl_test",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gles2_conform_test",
+        "test_target": "//gpu/gles2_conform_support:gles2_conform_test"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gpu_unittests",
+        "test_target": "//gpu:gpu_unittests"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "swiftshader_unittests",
+        "test_target": "//third_party/swiftshader/tests/GLESUnitTests:swiftshader_unittests"
+      },
+      {
+        "args": [
+          "--ignore-runtime-requirements=*"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "xr_browser_tests",
+        "test_target": "//chrome/test:xr_browser_tests"
+      }
+    ],
     "isolated_scripts": [
       {
         "args": [
-          "noop_sleep",
+          "--gtest-benchmark-name=angle_perftests",
+          "-v",
+          "--one-frame-only"
+        ],
+        "isolate_name": "angle_perftests",
+        "merge": {
+          "args": [
+            "--smoke-test-mode"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "angle_perftests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//chrome/test:angle_perftests"
+      },
+      {
+        "args": [
+          "context_lost",
           "--show-stdout",
           "--browser=release_x64",
           "--passthrough",
@@ -128838,14 +129231,14 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "noop_sleep_tests",
+        "name": "context_lost_tests",
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "intel-hd-630-win10-stable",
+              "gpu": "8086:5912-26.20.100.7870",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu.template"
             }
@@ -128854,6 +129247,540 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         }
+      },
+      {
+        "args": [
+          "depth_capture",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "depth_capture_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "gpu_process",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gpu_process_launch_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "hardware_accelerated_feature",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "hardware_accelerated_feature_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "info_collection",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--expected-vendor-id",
+          "8086",
+          "--expected-device-id",
+          "5912"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "info_collection_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "maps",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
+          "${buildername}"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "maps_pixel_test",
+        "precommit_args": [
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
+          "${buildername}"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "pixel_skia_gold_test",
+        "precommit_args": [
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "power",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "power_measurement_test",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "../../tools/perf/run_benchmark",
+          "--benchmarks=rendering.desktop",
+          "--browser=release_x64"
+        ],
+        "isolate_name": "rendering_representative_perf_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "rendering_representative_perf_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//chrome/test:rendering_representative_perf_tests"
+      },
+      {
+        "args": [
+          "screenshot_sync",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "screenshot_sync_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "trace_test",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "trace_test",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu",
+          "--webgl-conformance-version=2.0.1",
+          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl2_conformance_gl_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--webgl-conformance-version=2.0.1",
+          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl2_conformance_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_d3d9_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_gl_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_vulkan_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
       }
     ]
   },
@@ -129588,8 +130515,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -130479,8 +131407,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -131401,8 +132330,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -132236,8 +133166,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -134324,8 +135255,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -145931,8 +146863,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -146112,8 +147045,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -146762,8 +147696,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -147506,8 +148441,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -148576,8 +149512,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 17de2b3..7ccd9d9 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -5,6 +5,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -161,8 +163,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -536,8 +539,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -911,8 +915,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1177,8 +1182,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1463,8 +1469,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1520,8 +1527,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -1921,8 +1929,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -2389,6 +2398,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -2895,6 +2906,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -3367,6 +3380,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -4507,6 +4522,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -5608,6 +5625,8 @@
     "gtest_tests": [
       {
         "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -7950,8 +7969,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -8573,8 +8593,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -9177,8 +9198,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -9801,8 +9823,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -11641,8 +11664,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -12252,8 +12276,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -12973,8 +12998,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -13622,8 +13648,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -14163,8 +14190,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -14671,8 +14699,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -15366,8 +15395,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -16171,8 +16201,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -16761,8 +16792,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -16990,8 +17022,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
           "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests",
           "--no-xvfb"
         ],
         "merge": {
@@ -17268,8 +17301,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -17506,8 +17540,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -17762,8 +17797,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -17952,8 +17988,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -18449,8 +18486,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -19177,8 +19215,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -19888,10 +19927,364 @@
     ]
   },
   "Win10 FYI x64 Exp Release (Intel HD 630)": {
+    "gtest_tests": [
+      {
+        "args": [
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 4
+        },
+        "test": "angle_end2end_tests",
+        "test_target": "//third_party/angle/src/tests:angle_end2end_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_gles1_conformance_tests",
+        "test_target": "//third_party/angle/src/tests:angle_gles1_conformance_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
+          "--test-launcher-retry-limit=0"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_unittests",
+        "test_target": "//third_party/angle/src/tests:angle_unittests"
+      },
+      {
+        "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "angle_white_box_tests",
+        "test_target": "//third_party/angle/src/tests:angle_white_box_tests"
+      },
+      {
+        "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "tab_capture_end2end_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "browser_tests",
+        "test_target": "//chrome/test:browser_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_tests",
+        "test_target": "//gpu:gl_tests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gl_unittests",
+        "test_target": "//ui/gl:gl_unittests"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gles2_conform_test",
+        "test_target": "//gpu/gles2_conform_support:gles2_conform_test"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
+          "--use-angle=d3d9"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gles2_conform_d3d9_test",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gles2_conform_test",
+        "test_target": "//gpu/gles2_conform_support:gles2_conform_test"
+      },
+      {
+        "args": [
+          "--use-gpu-in-tests",
+          "--use-angle=gl",
+          "--disable-gpu-sandbox"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "gles2_conform_gl_test",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gles2_conform_test",
+        "test_target": "//gpu/gles2_conform_support:gles2_conform_test"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "gpu_unittests",
+        "test_target": "//gpu:gpu_unittests"
+      },
+      {
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "swiftshader_unittests",
+        "test_target": "//third_party/swiftshader/tests/GLESUnitTests:swiftshader_unittests"
+      },
+      {
+        "args": [
+          "--ignore-runtime-requirements=*"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "xr_browser_tests",
+        "test_target": "//chrome/test:xr_browser_tests"
+      }
+    ],
     "isolated_scripts": [
       {
         "args": [
-          "noop_sleep",
+          "--gtest-benchmark-name=angle_perftests",
+          "-v",
+          "--one-frame-only"
+        ],
+        "isolate_name": "angle_perftests",
+        "merge": {
+          "args": [
+            "--smoke-test-mode"
+          ],
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "angle_perftests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//chrome/test:angle_perftests"
+      },
+      {
+        "args": [
+          "context_lost",
           "--show-stdout",
           "--browser=release_x64",
           "--passthrough",
@@ -19903,14 +20296,14 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "noop_sleep_tests",
+        "name": "context_lost_tests",
         "should_retry_with_patch": false,
         "swarming": {
           "can_use_on_swarming_builders": true,
           "containment_type": "AUTO",
           "dimension_sets": [
             {
-              "gpu": "intel-hd-630-win10-stable",
+              "gpu": "8086:5912-26.20.100.7870",
               "os": "Windows-10",
               "pool": "chromium.tests.gpu.template"
             }
@@ -19919,6 +20312,540 @@
           "idempotent": false,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         }
+      },
+      {
+        "args": [
+          "depth_capture",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "depth_capture_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "gpu_process",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "gpu_process_launch_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "hardware_accelerated_feature",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "hardware_accelerated_feature_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "info_collection",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--expected-vendor-id",
+          "8086",
+          "--expected-device-id",
+          "5912"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "info_collection_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "maps",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
+          "${buildername}"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "maps_pixel_test",
+        "precommit_args": [
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test",
+          "--build-revision",
+          "${got_revision}",
+          "--test-machine-name",
+          "${buildername}"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "pixel_skia_gold_test",
+        "precommit_args": [
+          "--review-patch-issue",
+          "${patch_issue}",
+          "--review-patch-set",
+          "${patch_set}",
+          "--buildbucket-build-id",
+          "${buildbucket_build_id}"
+        ],
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "power",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "power_measurement_test",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "../../tools/perf/run_benchmark",
+          "--benchmarks=rendering.desktop",
+          "--browser=release_x64"
+        ],
+        "isolate_name": "rendering_representative_perf_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "rendering_representative_perf_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_target": "//chrome/test:rendering_representative_perf_tests"
+      },
+      {
+        "args": [
+          "screenshot_sync",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc",
+          "--dont-restore-color-profile-after-test"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "screenshot_sync_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "trace_test",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "trace_test",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu",
+          "--webgl-conformance-version=2.0.1",
+          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl2_conformance_gl_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--webgl-conformance-version=2.0.1",
+          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl2_conformance_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 20
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_d3d9_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_gl_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu",
+          "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
+      },
+      {
+        "args": [
+          "webgl_conformance",
+          "--show-stdout",
+          "--browser=release_x64",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "webgl_conformance_vulkan_passthrough_tests",
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-26.20.100.7870",
+              "os": "Windows-10",
+              "pool": "chromium.tests.gpu.template"
+            }
+          ],
+          "expiration": 21600,
+          "idempotent": false,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        }
       }
     ]
   },
@@ -20653,8 +21580,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -21544,8 +22472,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -22466,8 +23395,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -23301,8 +24231,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -25389,8 +26320,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -26559,8 +27491,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -26740,8 +27673,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -27390,8 +28324,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -28134,8 +29069,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
@@ -29204,8 +30140,9 @@
     "gtest_tests": [
       {
         "args": [
-          "--use-gpu-in-tests",
-          "--test-launcher-retry-limit=0"
+          "--test-launcher-retry-limit=0",
+          "--test-launcher-batch-limit=256",
+          "--use-gpu-in-tests"
         ],
         "merge": {
           "args": [],
diff --git a/testing/buildbot/chromium.try.json b/testing/buildbot/chromium.try.json
index ad1b1e3..fe664f8 100644
--- a/testing/buildbot/chromium.try.json
+++ b/testing/buildbot/chromium.try.json
@@ -217,39 +217,6 @@
       }
     ]
   },
-  "linux-layout-tests-fragment-paint": {
-    "additional_compile_targets": [
-      "blink_tests"
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "--num-retries=3",
-          "--additional-driver-flag=--enable-blink-features=LayoutNGFragmentPaint"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_target": "//:blink_web_tests"
-      }
-    ]
-  },
   "mac-rel": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index cc6d858..e50ed57 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -663,17 +663,15 @@
       },
     },
   },
-  # TODO(https://crbug.com/1053803): Re-add once the machines are upgraded to
-  # the newer driver version.
-  # 'win10_intel_hd_630_experimental': {
-  #   'swarming': {
-  #     'dimensions': {
-  #       'gpu': '8086:5912-26.20.100.7323',
-  #       'os': 'Windows-10',
-  #       'pool': 'chromium.tests.gpu.template',
-  #     },
-  #   },
-  # },
+  'win10_intel_hd_630_experimental': {
+    'swarming': {
+      'dimensions': {
+        'gpu': '8086:5912-26.20.100.7870',
+        'os': 'Windows-10',
+        'pool': 'chromium.tests.gpu.template',
+      },
+    },
+  },
   'win10_intel_hd_630_stable': {
     'swarming': {
       'dimensions': {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 5ccd7d79..85f5b46 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -330,11 +330,6 @@
           '--additional-driver-flag=--enable-blink-features=LayoutNGFragmentItem',
         ],
       },
-      'linux-layout-tests-fragment-paint': {
-        'args': [
-          '--additional-driver-flag=--enable-blink-features=LayoutNGFragmentPaint',
-        ],
-      },
       'mac-rel': {
         'swarming': {
           'dimension_sets': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 5ac815b..b20ee2d 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -1672,9 +1672,12 @@
       'angle_end2end_tests': {
         'desktop_args': [
           '--use-gpu-in-tests',
+        ],
+        'args': [
           # ANGLE test retries deliberately disabled to prevent flakiness.
           # http://crbug.com/669196
-          '--test-launcher-retry-limit=0'
+          '--test-launcher-retry-limit=0',
+          '--test-launcher-batch-limit=256',
         ],
         'linux_args': ['--no-xvfb'],
         'should_retry_with_patch': False,
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json
index 8117b3a..57523d3 100644
--- a/testing/buildbot/tryserver.chromium.linux.json
+++ b/testing/buildbot/tryserver.chromium.linux.json
@@ -33,38 +33,5 @@
         "test_target": "//:blink_web_tests"
       }
     ]
-  },
-  "linux-layout-tests-fragment-paint": {
-    "additional_compile_targets": [
-      "blink_tests"
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "--num-retries=3",
-          "--additional-driver-flag=--enable-blink-features=LayoutNGFragmentPaint"
-        ],
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_target": "//:blink_web_tests"
-      }
-    ]
   }
 }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 835c011..ac48ee0 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -3438,15 +3438,12 @@
         'browser_config': 'release_x64',
         'mixins': [
           'limited_capacity_bot',
-          'win10_intel_hd_630_stable',
+          'win10_intel_hd_630_experimental',
         ],
         'test_suites': {
-          'gpu_telemetry_tests': 'gpu_noop_sleep_telemetry_test',
-          # TODO(https://crbug.com/1053803): Re-enable tests once the machines
-          # are updated  to the target driver version.
-          # 'gtest_tests': 'gpu_fyi_win_gtests',
-          # 'isolated_scripts': 'gpu_angle_and_desktop_representative_perf_fyi_isolated_scripts',
-          # 'gpu_telemetry_tests': 'gpu_fyi_win_intel_release_telemetry_tests',
+          'gtest_tests': 'gpu_fyi_win_gtests',
+          'isolated_scripts': 'gpu_angle_and_desktop_representative_perf_fyi_isolated_scripts',
+          'gpu_telemetry_tests': 'gpu_fyi_win_intel_release_telemetry_tests',
         },
       },
       'Win10 FYI x64 Exp Release (NVIDIA)': {
@@ -4922,17 +4919,6 @@
           'isolated_scripts': 'chromium_webkit_isolated_scripts',
         },
       },
-      'linux-layout-tests-fragment-paint': {
-        'additional_compile_targets': [
-          'blink_tests',
-        ],
-        'mixins': [
-          'linux-xenial',
-        ],
-        'test_suites': {
-          'isolated_scripts': 'chromium_webkit_isolated_scripts',
-        },
-      },
     },
   },
   {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 22dfa24..b9b19684 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5449,6 +5449,21 @@
             ]
         }
     ],
+    "TabGroupsAndroid": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "TabGroupsAndroid"
+                    ]
+                }
+            ]
+        }
+    ],
     "TabGroupsDragAndDrop": [
         {
             "platforms": [
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn
index fe2fd48f..0b59c45 100644
--- a/third_party/android_deps/BUILD.gn
+++ b/third_party/android_deps/BUILD.gn
@@ -36,59 +36,11 @@
   ]
 }
 
-java_group("android_arch_core_common_java") {
-  deps = [ ":androidx_arch_core_core_common_java" ]
-  input_jars_paths = [ "libs/android_arch_core_common/common-1.1.1.jar" ]
-}
-
-java_group("android_arch_core_runtime_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_arch_core_core_runtime_java",
-  ]
-  input_jars_paths =
-      [ "${target_out_dir}/android_arch_core_runtime_java_orig/classes.jar" ]
-}
-
 java_group("android_arch_lifecycle_common_java") {
   deps = [ ":androidx_lifecycle_lifecycle_common_java" ]
   input_jars_paths = [ "libs/android_arch_lifecycle_common/common-1.1.1.jar" ]
 }
 
-java_group("android_arch_lifecycle_common_java8_java") {
-  deps = [ ":androidx_lifecycle_lifecycle_common_java8_java" ]
-  input_jars_paths =
-      [ "libs/android_arch_lifecycle_common_java8/common-java8-1.1.1.jar" ]
-}
-
-java_group("android_arch_lifecycle_livedata_core_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_lifecycle_lifecycle_livedata_core_java",
-  ]
-  input_jars_paths = [ "${target_out_dir}/android_arch_lifecycle_livedata_core_java_orig/classes.jar" ]
-}
-
-java_group("android_arch_lifecycle_livedata_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_lifecycle_lifecycle_livedata_java",
-  ]
-  input_jars_paths = [
-    "${target_out_dir}/android_arch_lifecycle_livedata_java_orig/classes.jar",
-  ]
-}
-
-java_group("android_arch_lifecycle_runtime_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_lifecycle_lifecycle_runtime_java",
-  ]
-  input_jars_paths = [
-    "${target_out_dir}/android_arch_lifecycle_runtime_java_orig/classes.jar",
-  ]
-}
-
 java_group("android_arch_lifecycle_viewmodel_java") {
   deps = [
     ":${target_name}_orig__unpack_aar",
@@ -200,24 +152,6 @@
   ]
 }
 
-java_group("com_android_support_preference_v14_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_legacy_legacy_preference_v14_java",
-  ]
-  input_jars_paths = [ "${target_out_dir}/com_android_support_preference_v14_java_orig/classes.jar" ]
-}
-
-java_group("com_android_support_preference_v7_java") {
-  deps = [
-    ":${target_name}_orig__unpack_aar",
-    ":androidx_preference_preference_java",
-  ]
-  input_jars_paths = [
-    "${target_out_dir}/com_android_support_preference_v7_java_orig/classes.jar",
-  ]
-}
-
 java_group("com_android_support_recyclerview_v7_java") {
   deps = [
     ":${target_name}_orig__unpack_aar",
@@ -309,14 +243,10 @@
 
 # The dependencies below are used by chromecast internal.
 java_group("android_support_v7_preference_java") {
-  deps = [ ":com_android_support_preference_v7_java" ]
-  input_jars_paths = [
-    "${target_out_dir}/com_android_support_preference_v7_java_orig/classes.jar",
-  ]
+  deps = [ ":androidx_preference_preference_java" ]
 }
 java_group("android_support_v14_preference_java") {
-  deps = [ ":com_android_support_preference_v14_java" ]
-  input_jars_paths = [ "${target_out_dir}/com_android_support_preference_v14_java_orig/classes.jar" ]
+  deps = [ ":androidx_legacy_legacy_preference_v14_java" ]
 }
 java_group("android_support_v17_leanback_java") {
   deps = [ ":androidx_leanback_leanback_java" ]
@@ -355,7 +285,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-java_prebuilt("android_arch_lifecycle_common_java8_java_orig") {
+java_prebuilt("android_arch_lifecycle_common_java8_java") {
   jar_path = "libs/android_arch_lifecycle_common_java8/common-java8-1.1.1.jar"
   output_name = "android_arch_lifecycle_common_java8"
   supports_android = true
@@ -367,12 +297,12 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("android_arch_lifecycle_runtime_java_orig") {
+android_aar_prebuilt("android_arch_lifecycle_runtime_java") {
   aar_path = "libs/android_arch_lifecycle_runtime/runtime-1.1.1.aar"
   info_path =
       "libs/android_arch_lifecycle_runtime/android_arch_lifecycle_runtime.info"
   deps = [
-    ":android_arch_core_common_java_orig",
+    ":android_arch_core_common_java",
     ":android_arch_lifecycle_common_java_orig",
     ":com_android_support_support_annotations_java_orig",
   ]
@@ -981,8 +911,8 @@
     ":com_android_support_appcompat_v7_java_orig",
     ":com_android_support_collections_java_orig",
     ":com_android_support_leanback_v17_java",
-    ":com_android_support_preference_v14_java_orig",
-    ":com_android_support_preference_v7_java_orig",
+    ":com_android_support_preference_v14_java",
+    ":com_android_support_preference_v7_java",
     ":com_android_support_recyclerview_v7_java_orig",
   ]
   skip_jetify = true
@@ -990,7 +920,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("com_android_support_preference_v7_java_orig") {
+android_aar_prebuilt("com_android_support_preference_v7_java") {
   aar_path = "libs/com_android_support_preference_v7/preference-v7-28.0.0.aar"
   info_path = "libs/com_android_support_preference_v7/com_android_support_preference_v7.info"
   deps = [
@@ -1037,7 +967,7 @@
   aar_path = "libs/com_android_support_support_compat/support-compat-28.0.0.aar"
   info_path = "libs/com_android_support_support_compat/com_android_support_support_compat.info"
   deps = [
-    ":android_arch_lifecycle_runtime_java_orig",
+    ":android_arch_lifecycle_runtime_java",
     ":com_android_support_collections_java_orig",
     ":com_android_support_support_annotations_java_orig",
     ":com_android_support_versionedparcelable_java_orig",
@@ -1067,7 +997,7 @@
     ":com_android_support_customview_java",
     ":com_android_support_drawerlayout_java_orig",
     ":com_android_support_interpolator_java_orig",
-    ":com_android_support_slidingpanelayout_java_orig",
+    ":com_android_support_slidingpanelayout_java",
     ":com_android_support_support_annotations_java_orig",
     ":com_android_support_support_compat_java_orig",
     ":com_android_support_support_core_utils_java_orig",
@@ -1082,10 +1012,10 @@
   aar_path = "libs/com_android_support_support_core_utils/support-core-utils-28.0.0.aar"
   info_path = "libs/com_android_support_support_core_utils/com_android_support_support_core_utils.info"
   deps = [
-    ":com_android_support_documentfile_java_orig",
+    ":com_android_support_documentfile_java",
     ":com_android_support_loader_java_orig",
     ":com_android_support_localbroadcastmanager_java_orig",
-    ":com_android_support_print_java_orig",
+    ":com_android_support_print_java",
     ":com_android_support_support_annotations_java_orig",
     ":com_android_support_support_compat_java_orig",
   ]
@@ -1601,7 +1531,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-java_prebuilt("android_arch_core_common_java_orig") {
+java_prebuilt("android_arch_core_common_java") {
   jar_path = "libs/android_arch_core_common/common-1.1.1.jar"
   output_name = "android_arch_core_common"
   supports_android = true
@@ -1614,7 +1544,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("android_arch_core_runtime_java_orig") {
+android_aar_prebuilt("android_arch_core_runtime_java") {
   aar_path = "libs/android_arch_core_runtime/runtime-1.1.1.aar"
   info_path = "libs/android_arch_core_runtime/android_arch_core_runtime.info"
 
@@ -1622,14 +1552,14 @@
   # //third_party/android_deps/build.gradle.
   visibility = [ ":*" ]
   deps = [
-    ":android_arch_core_common_java_orig",
+    ":android_arch_core_common_java",
     ":com_android_support_support_annotations_java_orig",
   ]
   skip_jetify = true
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("android_arch_lifecycle_livedata_java_orig") {
+android_aar_prebuilt("android_arch_lifecycle_livedata_java") {
   aar_path = "libs/android_arch_lifecycle_livedata/livedata-1.1.1.aar"
   info_path = "libs/android_arch_lifecycle_livedata/android_arch_lifecycle_livedata.info"
 
@@ -1637,15 +1567,15 @@
   # //third_party/android_deps/build.gradle.
   visibility = [ ":*" ]
   deps = [
-    ":android_arch_core_common_java_orig",
-    ":android_arch_core_runtime_java_orig",
-    ":android_arch_lifecycle_livedata_core_java_orig",
+    ":android_arch_core_common_java",
+    ":android_arch_core_runtime_java",
+    ":android_arch_lifecycle_livedata_core_java",
   ]
   skip_jetify = true
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("android_arch_lifecycle_livedata_core_java_orig") {
+android_aar_prebuilt("android_arch_lifecycle_livedata_core_java") {
   aar_path = "libs/android_arch_lifecycle_livedata_core/livedata-core-1.1.1.aar"
   info_path = "libs/android_arch_lifecycle_livedata_core/android_arch_lifecycle_livedata_core.info"
 
@@ -1653,8 +1583,8 @@
   # //third_party/android_deps/build.gradle.
   visibility = [ ":*" ]
   deps = [
-    ":android_arch_core_common_java_orig",
-    ":android_arch_core_runtime_java_orig",
+    ":android_arch_core_common_java",
+    ":android_arch_core_runtime_java",
     ":android_arch_lifecycle_common_java_orig",
   ]
   skip_jetify = true
@@ -1964,7 +1894,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("com_android_support_documentfile_java_orig") {
+android_aar_prebuilt("com_android_support_documentfile_java") {
   aar_path = "libs/com_android_support_documentfile/documentfile-28.0.0.aar"
   info_path = "libs/com_android_support_documentfile/com_android_support_documentfile.info"
 
@@ -2002,7 +1932,7 @@
   # //third_party/android_deps/build.gradle.
   visibility = [ ":*" ]
   deps = [
-    ":android_arch_lifecycle_livedata_java_orig",
+    ":android_arch_lifecycle_livedata_java",
     ":android_arch_lifecycle_viewmodel_java_orig",
     ":com_android_support_support_annotations_java_orig",
     ":com_android_support_support_compat_java_orig",
@@ -2027,7 +1957,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("com_android_support_preference_v14_java_orig") {
+android_aar_prebuilt("com_android_support_preference_v14_java") {
   aar_path = "libs/com_android_support_preference_v14/preference-v14-28.0.0.aar"
   info_path = "libs/com_android_support_preference_v14/com_android_support_preference_v14.info"
 
@@ -2035,12 +1965,12 @@
   # //third_party/android_deps/build.gradle.
   visibility = [ ":*" ]
   skip_jetify = true
-  deps = [ ":com_android_support_preference_v7_java_orig" ]
+  deps = [ ":com_android_support_preference_v7_java" ]
   jar_excluded_patterns = [ "androidx/preference/R*" ]
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("com_android_support_print_java_orig") {
+android_aar_prebuilt("com_android_support_print_java") {
   aar_path = "libs/com_android_support_print/print-28.0.0.aar"
   info_path = "libs/com_android_support_print/com_android_support_print.info"
 
@@ -2052,7 +1982,7 @@
 }
 
 # This is generated, do not edit. Update BuildConfigGenerator.groovy instead.
-android_aar_prebuilt("com_android_support_slidingpanelayout_java_orig") {
+android_aar_prebuilt("com_android_support_slidingpanelayout_java") {
   aar_path =
       "libs/com_android_support_slidingpanelayout/slidingpanelayout-28.0.0.aar"
   info_path = "libs/com_android_support_slidingpanelayout/com_android_support_slidingpanelayout.info"
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index e1567d4..617bd73 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -494,5 +494,7 @@
 const base::FeatureParam<int> kFontPreloadingDelaysRenderingParam{
     &kFontPreloadingDelaysRendering, "delay-in-ms", 100};
 
+const base::Feature kFlexNG{"FlexNG", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace blink
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index ef858de..81bf1ff 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -162,6 +162,8 @@
 BLINK_COMMON_EXPORT extern const base::FeatureParam<int>
     kFontPreloadingDelaysRenderingParam;
 
+BLINK_COMMON_EXPORT extern const base::Feature kFlexNG;
+
 }  // namespace features
 }  // namespace blink
 
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 7b71841..c45fb31 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -2852,14 +2852,10 @@
       # Vision deficiency to emulate.
       enum type
         none
-        achromatomaly
         achromatopsia
         blurredVision
-        deuteranomaly
         deuteranopia
-        protanomaly
         protanopia
-        tritanomaly
         tritanopia
 
   # Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
diff --git a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
index d20d24c..81457a2 100644
--- a/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
+++ b/third_party/blink/renderer/bindings/core/v8/local_window_proxy.cc
@@ -174,22 +174,8 @@
       (world_->IsIsolatedWorld() &&
        IsolatedWorldCSP::Get().HasContentSecurityPolicy(world_->GetWorldId()));
   if (evaluate_csp_for_eval) {
-    // Check that there is a document that can be used to get the
-    // ContentSecurityPolicy;
-    // TODO(clamy): Remove this DumpWithoutCrashing once
-    // https://crbug.com/1037776 is fixed.
-    if (!GetFrame()->GetDocument())
-      base::debug::DumpWithoutCrashing();
-
     ContentSecurityPolicy* csp =
         GetFrame()->GetDocument()->GetContentSecurityPolicyForWorld();
-
-    // Check that the ContentSecurityPolicy returned is not null.
-    // TODO(clamy): Remove this DumpWithoutCrashing once
-    // https://crbug.com/1037776 is fixed.
-    if (!csp)
-      base::debug::DumpWithoutCrashing();
-
     context->AllowCodeGenerationFromStrings(!csp->ShouldCheckEval());
     context->SetErrorMessageForCodeGenerationFromStrings(
         V8String(GetIsolate(), csp->EvalDisabledErrorMessage()));
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
index ebe135d..5c1dc4b5 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
+++ b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
@@ -226,6 +226,9 @@
     case kNoControlPart:
       value_id_ = CSSValueID::kNone;
       break;
+    case kAutoPart:
+      value_id_ = CSSValueID::kAuto;
+      break;
     case kCheckboxPart:
       value_id_ = CSSValueID::kCheckbox;
       break;
@@ -305,8 +308,10 @@
 inline ControlPart CSSIdentifierValue::ConvertTo() const {
   if (value_id_ == CSSValueID::kNone)
     return kNoControlPart;
+  if (value_id_ == CSSValueID::kAuto)
+    return kAutoPart;
   return ControlPart(static_cast<int>(value_id_) -
-                     static_cast<int>(CSSValueID::kCheckbox) + 1);
+                     static_cast<int>(CSSValueID::kCheckbox) + kCheckboxPart);
 }
 
 template <>
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index bc3fd8e..faf3e61 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -796,7 +796,7 @@
     case CSSPropertyID::kWebkitAppearance:
       return (value_id >= CSSValueID::kCheckbox &&
               value_id <= CSSValueID::kTextarea) ||
-             value_id == CSSValueID::kNone;
+             value_id == CSSValueID::kNone || value_id == CSSValueID::kAuto;
     case CSSPropertyID::kBackfaceVisibility:
       return value_id == CSSValueID::kVisible ||
              value_id == CSSValueID::kHidden;
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index b136374..3c1518e 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -639,6 +639,12 @@
       style.SetDisplayLayoutCustomParentName(
           layout_parent_style.DisplayLayoutCustomName());
     }
+
+    bool is_in_main_frame = element && element->GetDocument().IsInMainFrame();
+    // The root element of the main frame has no backdrop, so don't allow
+    // it to have a backdrop filter either.
+    if (is_document_element && is_in_main_frame && style.HasBackdropFilter())
+      style.MutableBackdropFilter().clear();
   } else {
     AdjustStyleForFirstLetter(style);
   }
diff --git a/third_party/blink/renderer/core/css/vision_deficiency.cc b/third_party/blink/renderer/core/css/vision_deficiency.cc
index 5ff98d95..3e8e5250 100644
--- a/third_party/blink/renderer/core/css/vision_deficiency.cc
+++ b/third_party/blink/renderer/core/css/vision_deficiency.cc
@@ -24,14 +24,6 @@
 AtomicString CreateVisionDeficiencyFilterUrl(
     VisionDeficiency vision_deficiency) {
   switch (vision_deficiency) {
-    case VisionDeficiency::kAchromatomaly:
-      return CreateFilterDataUrl(
-          "<feColorMatrix values=\""
-          "0.618 0.320 0.062 0.000 0.000 "
-          "0.163 0.775 0.062 0.000 0.000 "
-          "0.163 0.320 0.516 0.000 0.000 "
-          "0.000 0.000 0.000 1.000 0.000 "
-          "\"/>");
     case VisionDeficiency::kAchromatopsia:
       return CreateFilterDataUrl(
           "<feColorMatrix values=\""
@@ -42,14 +34,6 @@
           "\"/>");
     case VisionDeficiency::kBlurredVision:
       return CreateFilterDataUrl("<feGaussianBlur stdDeviation=\"2\"/>");
-    case VisionDeficiency::kDeuteranomaly:
-      return CreateFilterDataUrl(
-          "<feColorMatrix values=\""
-          "0.800 0.200 0.000 0.000 0.000 "
-          "0.258 0.742 0.000 0.000 0.000 "
-          "0.000 0.142 0.858 0.000 0.000 "
-          "0.000 0.000 0.000 1.000 0.000 "
-          "\"/>");
     case VisionDeficiency::kDeuteranopia:
       return CreateFilterDataUrl(
           "<feColorMatrix values=\""
@@ -58,14 +42,6 @@
           "0.000 0.300 0.700 0.000 0.000 "
           "0.000 0.000 0.000 1.000 0.000 "
           "\"/>");
-    case VisionDeficiency::kProtanomaly:
-      return CreateFilterDataUrl(
-          "<feColorMatrix values=\""
-          "0.817 0.183 0.000 0.000 0.000 "
-          "0.333 0.667 0.000 0.000 0.000 "
-          "0.000 0.125 0.875 0.000 0.000 "
-          "0.000 0.000 0.000 1.000 0.000 "
-          "\"/>");
     case VisionDeficiency::kProtanopia:
       return CreateFilterDataUrl(
           "<feColorMatrix values=\""
@@ -74,14 +50,6 @@
           "0.000 0.242 0.758 0.000 0.000 "
           "0.000 0.000 0.000 1.000 0.000 "
           "\"/>");
-    case VisionDeficiency::kTritanomaly:
-      return CreateFilterDataUrl(
-          "<feColorMatrix values=\""
-          "0.967 0.033 0.000 0.000 0.000 "
-          "0.000 0.733 0.267 0.000 0.000 "
-          "0.000 0.183 0.817 0.000 0.000 "
-          "0.000 0.000 0.000 1.000 0.000 "
-          "\"/>");
     case VisionDeficiency::kTritanopia:
       return CreateFilterDataUrl(
           "<feColorMatrix values=\""
diff --git a/third_party/blink/renderer/core/css/vision_deficiency.h b/third_party/blink/renderer/core/css/vision_deficiency.h
index b91d422..84d7075 100644
--- a/third_party/blink/renderer/core/css/vision_deficiency.h
+++ b/third_party/blink/renderer/core/css/vision_deficiency.h
@@ -11,14 +11,10 @@
 
 enum class VisionDeficiency {
   kNoVisionDeficiency,
-  kAchromatomaly,
   kAchromatopsia,
   kBlurredVision,
-  kDeuteranomaly,
   kDeuteranopia,
-  kProtanomaly,
   kProtanopia,
-  kTritanomaly,
   kTritanopia,
 };
 
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc
index 32f3704b..72c89da 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -13082,7 +13082,7 @@
   ASSERT_TRUE(widget);
   gfx::Point viewport_offset(7, -11);
   WebRect viewport_intersection(0, 11, 200, 89);
-  WebRect mainframe_intersection(7, -11, 200, 140);
+  WebRect mainframe_intersection(0, 0, 200, 140);
   FrameOcclusionState occlusion_state = FrameOcclusionState::kUnknown;
   widget->SetRemoteViewportIntersection(
       {viewport_offset, viewport_intersection, mainframe_intersection,
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
index 3358578d..1bb81cb 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
@@ -614,15 +614,8 @@
 
 String ContentSecurityPolicy::EvalDisabledErrorMessage() const {
   for (const auto& policy : policies_) {
-    // Check that the policy is non-null.
-    // TODO(clamy): Remove this DumpWithoutCrashing once
-    // https://crbug.com/1037776 is fixed.
-    if (!policy)
-      base::debug::DumpWithoutCrashing();
-
-    if (policy->ShouldDisableEval()) {
+    if (policy->ShouldDisableEval())
       return policy->EvalDisabledErrorMessage();
-    }
   }
   return String();
 }
diff --git a/third_party/blink/renderer/core/frame/frame_view.cc b/third_party/blink/renderer/core/frame/frame_view.cc
index 38e4322..1855e03 100644
--- a/third_party/blink/renderer/core/frame/frame_view.cc
+++ b/third_party/blink/renderer/core/frame/frame_view.cc
@@ -159,8 +159,20 @@
       }
     }
 
-    mainframe_document_intersection =
-        EnclosingIntRect(geometry.UnclippedIntersectionRect());
+    PhysicalRect mainframe_intersection_rect;
+    if (!geometry.UnclippedIntersectionRect().IsEmpty()) {
+      mainframe_intersection_rect = PhysicalRect::EnclosingRect(
+          matrix.ProjectQuad(FloatRect(geometry.UnclippedIntersectionRect()))
+              .BoundingBox());
+
+      if (mainframe_intersection_rect.IsEmpty()) {
+        mainframe_document_intersection = IntRect(
+            FlooredIntPoint(mainframe_intersection_rect.offset), IntSize());
+      } else {
+        mainframe_document_intersection =
+            EnclosingIntRect(mainframe_intersection_rect);
+      }
+    }
   } else if (occlusion_state == FrameOcclusionState::kGuaranteedNotOccluded) {
     // If the parent LocalFrameView is throttled and out-of-date, then we can't
     // get any useful information.
@@ -172,11 +184,6 @@
        WebRect(), occlusion_state, frame.GetMainFrameViewportSize(),
        frame.GetMainFrameScrollOffset(), can_skip_sticky_frame_tracking});
 
-  if (ShouldReportMainFrameIntersection()) {
-    GetFrame().Client()->OnMainFrameDocumentIntersectionChanged(
-        mainframe_document_intersection);
-  }
-
   UpdateFrameVisibility(!viewport_intersection.IsEmpty());
 
   // We don't throttle 0x0 or display:none iframes, because in practice they are
diff --git a/third_party/blink/renderer/core/frame/frame_view.h b/third_party/blink/renderer/core/frame/frame_view.h
index 0ab1d06..73d183d22 100644
--- a/third_party/blink/renderer/core/frame/frame_view.h
+++ b/third_party/blink/renderer/core/frame/frame_view.h
@@ -57,7 +57,6 @@
   bool RectInParentIsStable(const base::TimeTicks& timestamp) const;
 
  protected:
-  virtual bool ShouldReportMainFrameIntersection() const { return false; }
   virtual bool NeedsViewportOffset() const { return false; }
   virtual void SetViewportIntersection(
       const ViewportIntersectionState& intersection_state) = 0;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index b5028bd..08a7d6d6 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1490,14 +1490,8 @@
   // Notify the render frame observers when the main frame intersection changes.
   if (intersection_state_.main_frame_document_intersection !=
       intersection_state.main_frame_document_intersection) {
-    // Put the main frame document intersection in the coordinate system of the
-    // viewport.
-    IntRect offset_main_frame_intersection =
-        intersection_state.main_frame_document_intersection;
-    offset_main_frame_intersection.MoveBy(
-        IntPoint(intersection_state.viewport_offset));
     Client()->OnMainFrameDocumentIntersectionChanged(
-        offset_main_frame_intersection);
+        intersection_state.main_frame_document_intersection);
   }
 
   bool can_skip_sticky_frame_tracking =
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 444b51f..96256e9 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -3685,6 +3685,12 @@
   }
 }
 
+void LocalFrameView::SetViewportIntersection(
+    const ViewportIntersectionState& intersection_state) {
+  GetFrame().Client()->OnMainFrameDocumentIntersectionChanged(
+      intersection_state.main_frame_document_intersection);
+}
+
 PhysicalOffset LocalFrameView::ViewportToFrame(
     const PhysicalOffset& point_in_viewport) const {
   PhysicalOffset point_in_root_frame = PhysicalOffset::FromFloatPointRound(
@@ -4395,22 +4401,11 @@
   // This is the top-level frame, so no mapping necessary.
   if (frame_->IsMainFrame())
     return true;
-  bool result;
-  if (apply_overflow_clip) {
-    result = rect.InclusiveIntersect(
-        PhysicalRect(frame_->RemoteViewportIntersection()));
-    if (result)
-      rect.Move(PhysicalOffset(GetFrame().RemoteViewportOffset()));
-  } else {
-    // If we are not applying the overflow clip, the mapping should be in the
-    // remote viewport's coordinate system. Map rect to the remote viewport's
-    // coordinate system prior to intersecting.
-    // RemoteMainFrameDocumentIntersection is in the remote viewport's
-    // coordinate system.
+  bool result = rect.InclusiveIntersect(PhysicalRect(
+      apply_overflow_clip ? frame_->RemoteViewportIntersection()
+                          : frame_->RemoteMainFrameDocumentIntersection()));
+  if (result)
     rect.Move(PhysicalOffset(GetFrame().RemoteViewportOffset()));
-    result = rect.InclusiveIntersect(
-        PhysicalRect(frame_->RemoteMainFrameDocumentIntersection()));
-  }
   return result;
 }
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index 6068d82..179a55a 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -687,13 +687,12 @@
   void UnregisterFromLifecycleNotifications(LifecycleNotificationObserver*);
 
  protected:
-  bool ShouldReportMainFrameIntersection() const override { return true; }
   void FrameRectsChanged(const IntRect&) override;
   void SelfVisibleChanged() override;
   void ParentVisibleChanged() override;
   void NotifyFrameRectsChangedIfNeeded();
   void SetViewportIntersection(
-      const ViewportIntersectionState& intersection_state) override {}
+      const ViewportIntersectionState& intersection_state) override;
   void VisibilityForThrottlingChanged() override;
   bool LifecycleUpdatesThrottled() const override {
     return lifecycle_updates_throttled_;
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
index 0d52ef9..df8a0b2 100644
--- a/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
+++ b/third_party/blink/renderer/core/html/forms/color_chooser_popup_ui_controller.cc
@@ -136,6 +136,8 @@
       "<!DOCTYPE html><head><meta charset='UTF-8'><style>\n", data);
   data->Append(ChooserResourceLoader::GetPickerCommonStyleSheet());
   data->Append(ChooserResourceLoader::GetColorSuggestionPickerStyleSheet());
+  if (features::IsFormControlsRefreshEnabled())
+    data->Append(ChooserResourceLoader::GetColorPickerStyleSheet());
   PagePopupClient::AddString(
       "</style></head><body>\n"
       "<div id='main'>Loading...</div><script>\n"
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.cc b/third_party/blink/renderer/core/inspector/devtools_session.cc
index e35e192..7286135 100644
--- a/third_party/blink/renderer/core/inspector/devtools_session.cc
+++ b/third_party/blink/renderer/core/inspector/devtools_session.cc
@@ -25,6 +25,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_utf8_adaptor.h"
 #include "third_party/inspector_protocol/crdtp/cbor.h"
+#include "third_party/inspector_protocol/crdtp/dispatch.h"
 #include "third_party/inspector_protocol/crdtp/json.h"
 
 namespace blink {
@@ -182,10 +183,6 @@
   agent_->client_->DebuggerTaskFinished();
 }
 
-void DevToolsSession::FlushProtocolNotifications() {
-  flushProtocolNotifications();
-}
-
 void DevToolsSession::DispatchProtocolCommand(
     int call_id,
     const String& method,
@@ -202,7 +199,6 @@
     base::span<const uint8_t> data) {
   DCHECK(crdtp::cbor::IsCBORMessage(
       crdtp::span<uint8_t>(data.data(), data.size())));
-
   TRACE_EVENT_WITH_FLOW1(
       "devtools", "DevToolsSession::DispatchProtocolCommandImpl", call_id,
       TRACE_EVENT_FLAG_FLOW_OUT | TRACE_EVENT_FLAG_FLOW_IN, "call_id", call_id);
@@ -226,11 +222,10 @@
     v8_session_->dispatchProtocolMessage(
         v8_inspector::StringView(data.data(), data.size()));
   } else {
-    std::unique_ptr<protocol::Value> value =
-        protocol::Value::parseBinary(data.data(), data.size());
-    // Don't pass protocol message further - there is no passthrough.
-    inspector_backend_dispatcher_->dispatch(call_id, method, std::move(value),
-                                            crdtp::span<uint8_t>());
+    crdtp::Dispatchable dispatchable(crdtp::SpanFrom(data));
+    // This message has already been checked by content::DevToolsSession.
+    DCHECK(dispatchable.ok());
+    inspector_backend_dispatcher_->Dispatch(dispatchable).Run();
   }
   agent_->client_->DebuggerTaskFinished();
 }
@@ -271,14 +266,14 @@
   }
 }
 
-void DevToolsSession::sendProtocolResponse(
+void DevToolsSession::SendProtocolResponse(
     int call_id,
     std::unique_ptr<protocol::Serializable> message) {
   SendProtocolResponse(call_id, message->Serialize());
 }
 
-void DevToolsSession::fallThrough(int call_id,
-                                  const String& method,
+void DevToolsSession::FallThrough(int call_id,
+                                  crdtp::span<uint8_t> method,
                                   crdtp::span<uint8_t> message) {
   // There's no other layer to handle the command.
   NOTREACHED();
@@ -309,7 +304,7 @@
                                          call_id, session_state_.TakeUpdates());
 }
 
-void DevToolsSession::sendProtocolNotification(
+void DevToolsSession::SendProtocolNotification(
     std::unique_ptr<protocol::Serializable> notification) {
   if (IsDetached())
     return;
@@ -332,6 +327,10 @@
 }
 
 void DevToolsSession::flushProtocolNotifications() {
+  FlushProtocolNotifications();
+}
+
+void DevToolsSession::FlushProtocolNotifications() {
   if (IsDetached())
     return;
   for (wtf_size_t i = 0; i < agents_.size(); i++)
diff --git a/third_party/blink/renderer/core/inspector/devtools_session.h b/third_party/blink/renderer/core/inspector/devtools_session.h
index 544d10ca..74e9153 100644
--- a/third_party/blink/renderer/core/inspector/devtools_session.h
+++ b/third_party/blink/renderer/core/inspector/devtools_session.h
@@ -53,9 +53,11 @@
 
   void Append(InspectorAgent*);
   void Detach();
-  void FlushProtocolNotifications();
   void Trace(Visitor*);
 
+  // protocol::FrontendChannel implementation.
+  void FlushProtocolNotifications() override;
+
   // Core probes.
   void DidStartProvisionalLoad(LocalFrame*);
   void DidFailProvisionalLoad(LocalFrame*);
@@ -75,15 +77,14 @@
                                    base::span<const uint8_t> message);
 
   // protocol::FrontendChannel implementation.
-  void sendProtocolResponse(
+  void SendProtocolResponse(
       int call_id,
       std::unique_ptr<protocol::Serializable> message) override;
-  void sendProtocolNotification(
+  void SendProtocolNotification(
       std::unique_ptr<protocol::Serializable> message) override;
-  void fallThrough(int call_id,
-                   const String& method,
+  void FallThrough(int call_id,
+                   crdtp::span<uint8_t> method,
                    crdtp::span<uint8_t> message) override;
-  void flushProtocolNotifications() override;
 
   // v8_inspector::V8Inspector::Channel implementation.
   void sendResponse(
@@ -91,6 +92,7 @@
       std::unique_ptr<v8_inspector::StringBuffer> message) override;
   void sendNotification(
       std::unique_ptr<v8_inspector::StringBuffer> message) override;
+  void flushProtocolNotifications() override;
 
   bool IsDetached();
   void SendProtocolResponse(int call_id, std::vector<uint8_t> message);
diff --git a/third_party/blink/renderer/core/inspector/dom_editor.cc b/third_party/blink/renderer/core/inspector/dom_editor.cc
index 8479a19..a7951fa 100644
--- a/third_party/blink/renderer/core/inspector/dom_editor.cc
+++ b/third_party/blink/renderer/core/inspector/dom_editor.cc
@@ -457,9 +457,10 @@
                                    exception_state.CodeAs<DOMExceptionCode>()) +
                                    " "
                              : g_empty_string;
-    return Response::Error(name_prefix + exception_state.Message());
+    String msg = name_prefix + exception_state.Message();
+    return Response::ServerError(msg.Utf8());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DOMEditor::InsertBefore(ContainerNode* parent_node,
diff --git a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
index 2bc24e9..786c300 100644
--- a/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_animation_agent.cc
@@ -75,7 +75,7 @@
 Response InspectorAnimationAgent::enable() {
   enabled_.Set(true);
   instrumenting_agents_->AddInspectorAnimationAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::disable() {
@@ -87,7 +87,7 @@
   id_to_animation_.clear();
   id_to_animation_clone_.clear();
   cleared_animations_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorAnimationAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) {
@@ -205,21 +205,21 @@
 
 Response InspectorAnimationAgent::getPlaybackRate(double* playback_rate) {
   *playback_rate = ReferenceTimeline().PlaybackRate();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::setPlaybackRate(double playback_rate) {
   for (LocalFrame* frame : *inspected_frames_)
     frame->GetDocument()->Timeline().SetPlaybackRate(playback_rate);
   playback_rate_.Set(playback_rate);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::getCurrentTime(const String& id,
                                                  double* current_time) {
   blink::Animation* animation = nullptr;
   Response response = AssertAnimation(id, animation);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (id_to_animation_clone_.at(id))
     animation = id_to_animation_clone_.at(id);
@@ -235,7 +235,7 @@
                             animation->startTime().value_or(Timing::NullValue())
                       : Timing::NullValue();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::setPaused(
@@ -244,11 +244,11 @@
   for (const String& animation_id : *animation_ids) {
     blink::Animation* animation = nullptr;
     Response response = AssertAnimation(animation_id, animation);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
     blink::Animation* clone = AnimationClone(animation);
     if (!clone)
-      return Response::Error("Failed to clone detached animation");
+      return Response::ServerError("Failed to clone detached animation");
     if (paused && !clone->Paused()) {
       // Ensure we restore a current time if the animation is limited.
       double current_time = 0;
@@ -268,7 +268,7 @@
       clone->Unpause();
     }
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 blink::Animation* InspectorAnimationAgent::AnimationClone(
@@ -324,16 +324,16 @@
   for (const String& animation_id : *animation_ids) {
     blink::Animation* animation = nullptr;
     Response response = AssertAnimation(animation_id, animation);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
     blink::Animation* clone = AnimationClone(animation);
     if (!clone)
-      return Response::Error("Failed to clone a detached animation.");
+      return Response::ServerError("Failed to clone a detached animation.");
     if (!clone->Paused())
       clone->play();
     clone->setCurrentTime(current_time, false);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::releaseAnimations(
@@ -349,7 +349,7 @@
     id_to_animation_.erase(animation_id);
     cleared_animations_.insert(animation_id);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::setTiming(const String& animation_id,
@@ -357,7 +357,7 @@
                                             double delay) {
   blink::Animation* animation = nullptr;
   Response response = AssertAnimation(animation_id, animation);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   animation = AnimationClone(animation);
@@ -369,7 +369,7 @@
   timing->setDuration(unrestricted_duration);
   timing->setDelay(delay);
   animation->effect()->updateTiming(timing, exception_state);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAnimationAgent::resolveAnimation(
@@ -378,7 +378,7 @@
         result) {
   blink::Animation* animation = nullptr;
   Response response = AssertAnimation(animation_id, animation);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (id_to_animation_clone_.at(animation_id))
     animation = id_to_animation_clone_.at(animation_id);
@@ -389,7 +389,7 @@
   ScriptState* script_state =
       frame ? ToScriptStateForMainWorld(frame) : nullptr;
   if (!script_state)
-    return Response::Error("Element not associated with a document.");
+    return Response::ServerError("Element not associated with a document.");
 
   ScriptState::Scope scope(script_state);
   static const char kAnimationObjectGroup[] = "animation";
@@ -402,8 +402,8 @@
       ToV8InspectorStringView(kAnimationObjectGroup),
       false /* generatePreview */);
   if (!*result)
-    return Response::Error("Element not associated with a document.");
-  return Response::OK();
+    return Response::ServerError("Element not associated with a document.");
+  return Response::Success();
 }
 
 String InspectorAnimationAgent::CreateCSSId(blink::Animation& animation) {
@@ -500,8 +500,8 @@
                                                   blink::Animation*& result) {
   result = id_to_animation_.at(id);
   if (!result)
-    return Response::Error("Could not find animation with given id");
-  return Response::OK();
+    return Response::ServerError("Could not find animation with given id");
+  return Response::Success();
 }
 
 DocumentTimeline& InspectorAnimationAgent::ReferenceTimeline() {
diff --git a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
index 05b06fd..500adae 100644
--- a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
@@ -57,13 +57,13 @@
 Response InspectorApplicationCacheAgent::enable() {
   if (!enabled_.Get())
     InnerEnable();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorApplicationCacheAgent::disable() {
   enabled_.Clear();
   instrumenting_agents_->RemoveInspectorApplicationCacheAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorApplicationCacheAgent::UpdateApplicationCacheStatus(
@@ -115,7 +115,7 @@
       (*result)->emplace_back(std::move(value));
     }
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorApplicationCacheAgent::AssertFrameWithDocumentLoader(
@@ -124,12 +124,12 @@
   LocalFrame* frame =
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   if (!frame)
-    return Response::Error("No frame for given id found");
+    return Response::ServerError("No frame for given id found");
 
   result = frame->Loader().GetDocumentLoader();
   if (!result)
-    return Response::Error("No documentLoader for given frame found");
-  return Response::OK();
+    return Response::ServerError("No documentLoader for given frame found");
+  return Response::Success();
 }
 
 Response InspectorApplicationCacheAgent::getManifestForFrame(
@@ -137,13 +137,13 @@
     String* manifest_url) {
   DocumentLoader* document_loader = nullptr;
   Response response = AssertFrameWithDocumentLoader(frame_id, document_loader);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   ApplicationCacheHost::CacheInfo info =
       document_loader->GetApplicationCacheHost()->ApplicationCacheInfo();
   *manifest_url = info.manifest_.GetString();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorApplicationCacheAgent::getApplicationCacheForFrame(
@@ -152,7 +152,7 @@
         application_cache) {
   DocumentLoader* document_loader = nullptr;
   Response response = AssertFrameWithDocumentLoader(frame_id, document_loader);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   ApplicationCacheHostForFrame* host =
@@ -163,7 +163,7 @@
   host->FillResourceList(&resources);
 
   *application_cache = BuildObjectForApplicationCache(resources, info);
-  return Response::OK();
+  return Response::Success();
 }
 
 std::unique_ptr<protocol::ApplicationCache::ApplicationCache>
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc b/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
index ac82ee6..e3409811 100644
--- a/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_audits_agent.cc
@@ -106,20 +106,20 @@
   bool is_base64_encoded;
   Response response =
       network_agent_->GetResponseBody(request_id, &body, &is_base64_encoded);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Vector<char> base64_decoded_buffer;
   if (!is_base64_encoded || !Base64Decode(body, base64_decoded_buffer) ||
       base64_decoded_buffer.size() == 0) {
-    return Response::Error("Failed to decode original image");
+    return Response::ServerError("Failed to decode original image");
   }
 
   Vector<unsigned char> encoded_image;
   if (!EncodeAsImage(base64_decoded_buffer.data(), base64_decoded_buffer.size(),
                      encoding, quality.fromMaybe(kDefaultEncodeQuality),
                      &encoded_image)) {
-    return Response::Error("Could not encode image with given settings");
+    return Response::ServerError("Could not encode image with given settings");
   }
 
   *out_original_size = static_cast<int>(base64_decoded_buffer.size());
@@ -128,27 +128,27 @@
   if (!size_only.fromMaybe(false)) {
     *out_body = protocol::Binary::fromVector(std::move(encoded_image));
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAuditsAgent::enable() {
   if (enabled_.Get()) {
-    return Response::OK();
+    return Response::Success();
   }
 
   enabled_.Set(true);
   InnerEnable();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorAuditsAgent::disable() {
   if (!enabled_.Get()) {
-    return Response::OK();
+    return Response::Success();
   }
 
   enabled_.Clear();
   instrumenting_agents_->RemoveInspectorAuditsAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorAuditsAgent::Restore() {
diff --git a/third_party/blink/renderer/core/inspector/inspector_base_agent.h b/third_party/blink/renderer/core/inspector/inspector_base_agent.h
index 348eec9..fb5e6fb 100644
--- a/third_party/blink/renderer/core/inspector/inspector_base_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_base_agent.h
@@ -76,7 +76,9 @@
     agent_state_.InitFrom(session_state);
   }
 
-  protocol::Response disable() override { return protocol::Response::OK(); }
+  protocol::Response disable() override {
+    return protocol::Response::Success();
+  }
 
   void Dispose() override {
     disable();
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
index fba71be..b7637ea 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -712,7 +712,7 @@
 void InspectorCSSAgent::enable(std::unique_ptr<EnableCallback> prp_callback) {
   if (!dom_agent_->Enabled()) {
     prp_callback->sendFailure(
-        Response::Error("DOM agent needs to be enabled first."));
+        Response::ServerError("DOM agent needs to be enabled first."));
     return;
   }
   enable_requested_.Set(true);
@@ -747,7 +747,7 @@
   resource_content_loader_->Cancel(resource_content_loader_client_id_);
   coverage_enabled_.Set(false);
   SetCoverageEnabled(false);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorCSSAgent::DidCommitLoadForLocalFrame(LocalFrame* frame) {
@@ -908,7 +908,7 @@
         CollectMediaQueriesFromRule(rule, medias->get());
     }
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::getMatchedStylesForNode(
@@ -923,12 +923,12 @@
     Maybe<protocol::Array<protocol::CSS::CSSKeyframesRule>>*
         css_keyframes_rules) {
   Response response = AssertEnabled();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Element* element = nullptr;
   response = dom_agent_->AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Element* original_element = element;
@@ -936,13 +936,13 @@
   if (element_pseudo_id) {
     element = element->ParentOrShadowHostElement();
     if (!element)
-      return Response::Error("Pseudo element has no parent");
+      return Response::ServerError("Pseudo element has no parent");
   }
 
   Document* owner_document = element->ownerDocument();
   // A non-active document has no styles.
   if (!owner_document->IsActive())
-    return Response::Error("Document is not active");
+    return Response::ServerError("Document is not active");
 
   // FIXME: It's really gross for the inspector to reach in and access
   // StyleResolver directly here. We need to provide the Inspector better APIs
@@ -959,7 +959,7 @@
 
   // Pseudo elements.
   if (element_pseudo_id)
-    return Response::OK();
+    return Response::Success();
 
   InspectorStyleSheetForInlineStyle* inline_style_sheet =
       AsInspectorStyleSheet(element);
@@ -1014,7 +1014,7 @@
   }
 
   *css_keyframes_rules = AnimationsForNode(element);
-  return Response::OK();
+  return Response::Success();
 }
 
 template <class CSSRuleCollection>
@@ -1101,21 +1101,21 @@
     Maybe<protocol::CSS::CSSStyle>* inline_style,
     Maybe<protocol::CSS::CSSStyle>* attributes_style) {
   Response response = AssertEnabled();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   Element* element = nullptr;
   response = dom_agent_->AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   InspectorStyleSheetForInlineStyle* style_sheet =
       AsInspectorStyleSheet(element);
   if (!style_sheet)
-    return Response::Error("Element is not a style sheet");
+    return Response::ServerError("Element is not a style sheet");
 
   *inline_style = style_sheet->BuildObjectForStyle(element->style());
   *attributes_style = BuildObjectForAttributesStyle(element);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::getComputedStyleForNode(
@@ -1123,11 +1123,11 @@
     std::unique_ptr<protocol::Array<protocol::CSS::CSSComputedStyleProperty>>*
         style) {
   Response response = AssertEnabled();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   Node* node = nullptr;
   response = dom_agent_->AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   auto* computed_style_info =
@@ -1153,7 +1153,7 @@
                                .setValue(it.value->CssText())
                                .build());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorCSSAgent::CollectPlatformFontsForLayoutObject(
@@ -1218,11 +1218,11 @@
     std::unique_ptr<protocol::Array<protocol::CSS::PlatformFontUsage>>*
         platform_fonts) {
   Response response = AssertEnabled();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   Node* node = nullptr;
   response = dom_agent_->AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   HashCountedSet<std::pair<int, String>> font_stats;
@@ -1245,7 +1245,7 @@
                            .setGlyphCount(font.value)
                            .build());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::getStyleSheetText(const String& style_sheet_id,
@@ -1253,11 +1253,11 @@
   InspectorStyleSheetBase* inspector_style_sheet = nullptr;
   Response response =
       AssertStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   inspector_style_sheet->GetText(result);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::collectClassNames(
@@ -1266,10 +1266,10 @@
   InspectorStyleSheet* inspector_style_sheet = nullptr;
   Response response =
       AssertInspectorStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   *class_names = inspector_style_sheet->CollectClassNames();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::setStyleSheetText(
@@ -1280,7 +1280,7 @@
   InspectorStyleSheetBase* inspector_style_sheet = nullptr;
   Response response =
       AssertStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -1288,25 +1288,33 @@
                                      inspector_style_sheet, text),
                                  exception_state);
   response = InspectorDOMAgent::ToResponse(exception_state);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (!inspector_style_sheet->SourceMapURL().IsEmpty())
     *source_map_url = inspector_style_sheet->SourceMapURL();
-  return Response::OK();
+  return Response::Success();
 }
 
 static Response JsonRangeToSourceRange(
     InspectorStyleSheetBase* inspector_style_sheet,
     protocol::CSS::SourceRange* range,
     SourceRange* source_range) {
-  if (range->getStartLine() < 0)
-    return Response::Error("range.startLine must be a non-negative integer");
-  if (range->getStartColumn() < 0)
-    return Response::Error("range.startColumn must be a non-negative integer");
-  if (range->getEndLine() < 0)
-    return Response::Error("range.endLine must be a non-negative integer");
-  if (range->getEndColumn() < 0)
-    return Response::Error("range.endColumn must be a non-negative integer");
+  if (range->getStartLine() < 0) {
+    return Response::ServerError(
+        "range.startLine must be a non-negative integer");
+  }
+  if (range->getStartColumn() < 0) {
+    return Response::ServerError(
+        "range.startColumn must be a non-negative integer");
+  }
+  if (range->getEndLine() < 0) {
+    return Response::ServerError(
+        "range.endLine must be a non-negative integer");
+  }
+  if (range->getEndColumn() < 0) {
+    return Response::ServerError(
+        "range.endColumn must be a non-negative integer");
+  }
 
   unsigned start_offset = 0;
   unsigned end_offset = 0;
@@ -1316,13 +1324,13 @@
       inspector_style_sheet->LineNumberAndColumnToOffset(
           range->getEndLine(), range->getEndColumn(), &end_offset);
   if (!success)
-    return Response::Error("Specified range is out of bounds");
+    return Response::ServerError("Specified range is out of bounds");
 
   if (start_offset > end_offset)
-    return Response::Error("Range start must not succeed its end");
+    return Response::ServerError("Range start must not succeed its end");
   source_range->start = start_offset;
   source_range->end = end_offset;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::setRuleSelector(
@@ -1334,12 +1342,12 @@
   InspectorStyleSheet* inspector_style_sheet = nullptr;
   Response response =
       AssertInspectorStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   SourceRange selector_range;
   response = JsonRangeToSourceRange(inspector_style_sheet, range.get(),
                                     &selector_range);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -1351,8 +1359,10 @@
     CSSStyleRule* rule = InspectorCSSAgent::AsCSSStyleRule(action->TakeRule());
     InspectorStyleSheet* inspector_style_sheet =
         InspectorStyleSheetForRule(rule);
-    if (!inspector_style_sheet)
-      return Response::Error("Failed to get inspector style sheet for rule.");
+    if (!inspector_style_sheet) {
+      return Response::ServerError(
+          "Failed to get inspector style sheet for rule.");
+    }
     *result = inspector_style_sheet->BuildObjectForSelectorList(rule);
   }
   return InspectorDOMAgent::ToResponse(exception_state);
@@ -1367,12 +1377,12 @@
   InspectorStyleSheet* inspector_style_sheet = nullptr;
   Response response =
       AssertInspectorStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   SourceRange key_range;
   response =
       JsonRangeToSourceRange(inspector_style_sheet, range.get(), &key_range);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -1384,9 +1394,10 @@
     auto* rule = To<CSSKeyframeRule>(action->TakeRule());
     InspectorStyleSheet* inspector_style_sheet =
         BindStyleSheet(rule->parentStyleSheet());
-    if (!inspector_style_sheet)
-      return Response::Error("Failed to get inspector style sheet for rule.");
-
+    if (!inspector_style_sheet) {
+      return Response::ServerError(
+          "Failed to get inspector style sheet for rule.");
+    }
     CSSRuleSourceData* source_data =
         inspector_style_sheet->SourceDataForRule(rule);
     *result = protocol::CSS::Value::create()
@@ -1403,22 +1414,23 @@
     HeapVector<Member<StyleSheetAction>>* actions) {
   size_t n = edits->size();
   if (n == 0)
-    return Response::Error("Edits should not be empty");
+    return Response::ServerError("Edits should not be empty");
 
   for (size_t i = 0; i < n; ++i) {
     protocol::CSS::StyleDeclarationEdit* edit = (*edits)[i].get();
     InspectorStyleSheetBase* inspector_style_sheet = nullptr;
     Response response =
         AssertStyleSheetForId(edit->getStyleSheetId(), inspector_style_sheet);
-    if (!response.isSuccess()) {
-      return Response::Error(String::Format(
-          "StyleSheet not found for edit #%zu of %zu", i + 1, n));
+    if (!response.IsSuccess()) {
+      return Response::ServerError(
+          String::Format("StyleSheet not found for edit #%zu of %zu", i + 1, n)
+              .Utf8());
     }
 
     SourceRange range;
     response =
         JsonRangeToSourceRange(inspector_style_sheet, edit->getRange(), &range);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
 
     if (inspector_style_sheet->IsInlineStyle()) {
@@ -1437,7 +1449,7 @@
       actions->push_back(action);
     }
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::setStyleTexts(
@@ -1446,7 +1458,7 @@
   FrontendOperationScope scope;
   HeapVector<Member<StyleSheetAction>> actions;
   Response response = MultipleStyleTextsActions(std::move(edits), &actions);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -1464,9 +1476,9 @@
         revert->Undo(undo_exception_state);
         DCHECK(!undo_exception_state.HadException());
       }
-      return Response::Error(
-          String::Format("Failed applying edit #%d: ", i) +
-          InspectorDOMAgent::ToResponse(exception_state).errorMessage());
+      return Response::ServerError(
+          String::Format("Failed applying edit #%d: ", i).Utf8() +
+          InspectorDOMAgent::ToResponse(exception_state).Message());
     }
     serialized_styles->emplace_back(action->TakeSerializedStyle());
   }
@@ -1476,7 +1488,7 @@
     dom_agent_->History()->AppendPerformedAction(action);
   }
   *result = std::move(serialized_styles);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::SetStyleText(
@@ -1493,7 +1505,7 @@
     bool success = dom_agent_->History()->Perform(action, exception_state);
     if (success) {
       result = inline_style_sheet->InlineStyle();
-      return Response::OK();
+      return Response::Success();
     }
   } else {
     ModifyRuleAction* action = MakeGarbageCollected<ModifyRuleAction>(
@@ -1504,11 +1516,11 @@
       CSSRule* rule = action->TakeRule();
       if (auto* style_rule = DynamicTo<CSSStyleRule>(rule)) {
         result = style_rule->style();
-        return Response::OK();
+        return Response::Success();
       }
       if (auto* keyframe_rule = DynamicTo<CSSKeyframeRule>(rule)) {
         result = keyframe_rule->style();
-        return Response::OK();
+        return Response::Success();
       }
     }
   }
@@ -1524,12 +1536,12 @@
   InspectorStyleSheet* inspector_style_sheet = nullptr;
   Response response =
       AssertInspectorStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   SourceRange text_range;
   response =
       JsonRangeToSourceRange(inspector_style_sheet, range.get(), &text_range);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -1555,20 +1567,20 @@
   LocalFrame* frame =
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   if (!frame)
-    return Response::Error("Frame not found");
+    return Response::ServerError("Frame not found");
 
   Document* document = frame->GetDocument();
   if (!document)
-    return Response::Error("Frame does not have a document");
+    return Response::ServerError("Frame does not have a document");
 
   InspectorStyleSheet* inspector_style_sheet = ViaInspectorStyleSheet(document);
   if (!inspector_style_sheet)
-    return Response::Error("No target stylesheet found");
+    return Response::ServerError("No target stylesheet found");
 
   UpdateActiveStyleSheets(document);
 
   *out_style_sheet_id = inspector_style_sheet->Id();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::addRule(
@@ -1580,12 +1592,12 @@
   InspectorStyleSheet* inspector_style_sheet = nullptr;
   Response response =
       AssertInspectorStyleSheetForId(style_sheet_id, inspector_style_sheet);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   SourceRange rule_location;
   response = JsonRangeToSourceRange(inspector_style_sheet, location.get(),
                                     &rule_location);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -1597,18 +1609,18 @@
 
   CSSStyleRule* rule = action->TakeRule();
   *result = BuildObjectForRule(rule);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::forcePseudoState(
     int node_id,
     std::unique_ptr<protocol::Array<String>> forced_pseudo_classes) {
   Response response = AssertEnabled();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   Element* element = nullptr;
   response = dom_agent_->AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   unsigned forced_pseudo_state =
@@ -1619,7 +1631,7 @@
       it == node_id_to_forced_pseudo_state_.end() ? 0 : it->value;
   bool need_style_recalc = forced_pseudo_state != current_forced_pseudo_state;
   if (!need_style_recalc)
-    return Response::OK();
+    return Response::Success();
 
   if (forced_pseudo_state)
     node_id_to_forced_pseudo_state_.Set(node_id, forced_pseudo_state);
@@ -1627,7 +1639,7 @@
     node_id_to_forced_pseudo_state_.erase(node_id);
   element->ownerDocument()->GetStyleEngine().MarkAllElementsForStyleRecalc(
       StyleChangeReasonForTracing::Create(style_change_reason::kInspector));
-  return Response::OK();
+  return Response::Success();
 }
 
 std::unique_ptr<protocol::CSS::CSSMedia> InspectorCSSAgent::BuildMediaObject(
@@ -1932,22 +1944,22 @@
 }
 
 Response InspectorCSSAgent::AssertEnabled() {
-  return enable_completed_ ? Response::OK()
-                           : Response::Error("CSS agent was not enabled");
+  return enable_completed_ ? Response::Success()
+                           : Response::ServerError("CSS agent was not enabled");
 }
 
 Response InspectorCSSAgent::AssertInspectorStyleSheetForId(
     const String& style_sheet_id,
     InspectorStyleSheet*& result) {
   Response response = AssertEnabled();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   IdToInspectorStyleSheet::iterator it =
       id_to_inspector_style_sheet_.find(style_sheet_id);
   if (it == id_to_inspector_style_sheet_.end())
-    return Response::Error("No style sheet with given id found");
+    return Response::ServerError("No style sheet with given id found");
   result = it->value.Get();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::AssertStyleSheetForId(
@@ -1956,16 +1968,16 @@
   InspectorStyleSheet* style_sheet = nullptr;
   Response response =
       AssertInspectorStyleSheetForId(style_sheet_id, style_sheet);
-  if (response.isSuccess()) {
+  if (response.IsSuccess()) {
     result = style_sheet;
     return response;
   }
   IdToInspectorStyleSheetForInlineStyle::iterator it =
       id_to_inspector_style_sheet_for_inline_style_.find(style_sheet_id);
   if (it == id_to_inspector_style_sheet_for_inline_style_.end())
-    return Response::Error("No style sheet with given id found");
+    return Response::ServerError("No style sheet with given id found");
   result = it->value.Get();
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::CSS::StyleSheetOrigin InspectorCSSAgent::DetectOrigin(
@@ -2201,18 +2213,20 @@
     const String& value) {
   Element* element = nullptr;
   Response response = dom_agent_->AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (element->GetPseudoId())
-    return Response::Error("Elements is pseudo");
+    return Response::ServerError("Elements is pseudo");
 
-  if (!element->ownerDocument()->IsActive())
-    return Response::Error("Can't edit a node from a non-active document");
+  if (!element->ownerDocument()->IsActive()) {
+    return Response::ServerError(
+        "Can't edit a node from a non-active document");
+  }
 
   CSSPropertyID property =
       cssPropertyID(element->GetExecutionContext(), property_name);
   if (!isValidCSSPropertyID(property))
-    return Response::Error("Invalid property name");
+    return Response::ServerError("Invalid property name");
 
   CSSPropertyID property_id =
       cssPropertyID(element->GetExecutionContext(), property_name);
@@ -2220,7 +2234,7 @@
   CSSStyleDeclaration* style =
       FindEffectiveDeclaration(property_class, MatchingStyles(element));
   if (!style)
-    return Response::Error("Can't find a style to edit");
+    return Response::ServerError("Can't find a style to edit");
 
   bool force_important = false;
   InspectorStyleSheetBase* inspector_style_sheet = nullptr;
@@ -2239,7 +2253,7 @@
   }
 
   if (!source_data)
-    return Response::Error("Can't find a source to edit");
+    return Response::ServerError("Can't find a source to edit");
 
   Vector<StylePropertyShorthand, 4> shorthands;
   getMatchingShorthandsForLonghand(property_id, &shorthands);
@@ -2311,7 +2325,7 @@
     Maybe<String>* computed_font_weight) {
   Element* element = nullptr;
   Response response = dom_agent_->AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Vector<Color> bgcolors;
@@ -2330,7 +2344,7 @@
     *computed_font_size = fs;
   if (!fw.IsEmpty())
     *computed_font_weight = fw;
-  return Response::OK();
+  return Response::Success();
 }
 
 // static
@@ -2407,7 +2421,7 @@
     document->UpdateStyleAndLayoutTree();
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorCSSAgent::stopRuleUsageTracking(
@@ -2424,7 +2438,7 @@
     std::unique_ptr<protocol::Array<protocol::CSS::RuleUsage>>* result,
     double* out_timestamp) {
   if (!tracker_)
-    return Response::Error("CSS rule usage tracking is not enabled");
+    return Response::ServerError("CSS rule usage tracking is not enabled");
 
   StyleRuleUsageTracker::RuleListByStyleSheet coverage_delta =
       tracker_->TakeDelta();
@@ -2458,7 +2472,7 @@
     }
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorCSSAgent::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
index 7a2e12b..ce49bb8 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -155,9 +155,10 @@
                                    exception_state.CodeAs<DOMExceptionCode>()) +
                                    " "
                              : g_empty_string;
-    return Response::Error(name_prefix + exception_state.Message());
+    String msg = name_prefix + exception_state.Message();
+    return Response::ServerError(msg.Utf8());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::DOM::PseudoType InspectorDOMAgent::ProtocolPseudoElementType(
@@ -351,8 +352,8 @@
 Response InspectorDOMAgent::AssertNode(int node_id, Node*& node) {
   node = NodeForId(node_id);
   if (!node)
-    return Response::Error("Could not find node with given id");
-  return Response::OK();
+    return Response::ServerError("Could not find node with given id");
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::AssertNode(
@@ -365,27 +366,27 @@
 
   if (backend_node_id.isJust()) {
     node = DOMNodeIds::NodeForId(backend_node_id.fromJust());
-    return !node ? Response::Error("No node found for given backend id")
-                 : Response::OK();
+    return !node ? Response::ServerError("No node found for given backend id")
+                 : Response::Success();
   }
 
   if (object_id.isJust())
     return NodeForRemoteObjectId(object_id.fromJust(), node);
 
-  return Response::Error(
+  return Response::ServerError(
       "Either nodeId, backendNodeId or objectId must be specified");
 }
 
 Response InspectorDOMAgent::AssertElement(int node_id, Element*& element) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   element = DynamicTo<Element>(node);
   if (!element)
-    return Response::Error("Node is not an Element");
-  return Response::OK();
+    return Response::ServerError("Node is not an Element");
+  return Response::Success();
 }
 
 // static
@@ -404,45 +405,49 @@
 
 Response InspectorDOMAgent::AssertEditableNode(int node_id, Node*& node) {
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   if (node->IsInShadowTree()) {
     if (IsA<ShadowRoot>(node))
-      return Response::Error("Cannot edit shadow roots");
-    if (UserAgentShadowRoot(node))
-      return Response::Error("Cannot edit nodes from user-agent shadow trees");
+      return Response::ServerError("Cannot edit shadow roots");
+    if (UserAgentShadowRoot(node)) {
+      return Response::ServerError(
+          "Cannot edit nodes from user-agent shadow trees");
+    }
   }
 
   if (node->IsPseudoElement())
-    return Response::Error("Cannot edit pseudo elements");
-  return Response::OK();
+    return Response::ServerError("Cannot edit pseudo elements");
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::AssertEditableChildNode(Element* parent_element,
                                                     int node_id,
                                                     Node*& node) {
   Response response = AssertEditableNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
-  if (node->parentNode() != parent_element)
-    return Response::Error("Anchor node must be child of the target element");
-  return Response::OK();
+  if (node->parentNode() != parent_element) {
+    return Response::ServerError(
+        "Anchor node must be child of the target element");
+  }
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::AssertEditableElement(int node_id,
                                                   Element*& element) {
   Response response = AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
-
-  if (element->IsInShadowTree() && UserAgentShadowRoot(element))
-    return Response::Error("Cannot edit elements from user-agent shadow trees");
-
+  if (element->IsInShadowTree() && UserAgentShadowRoot(element)) {
+    return Response::ServerError(
+        "Cannot edit elements from user-agent shadow trees");
+  }
   if (element->IsPseudoElement())
-    return Response::Error("Cannot edit pseudo elements");
+    return Response::ServerError("Cannot edit pseudo elements");
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDOMAgent::EnableAndReset() {
@@ -456,18 +461,18 @@
 Response InspectorDOMAgent::enable() {
   if (!enabled_.Get())
     EnableAndReset();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::disable() {
   if (!enabled_.Get())
-    return Response::Error("DOM agent hasn't been enabled");
+    return Response::ServerError("DOM agent hasn't been enabled");
   enabled_.Clear();
   instrumenting_agents_->RemoveInspectorDOMAgent(this);
   history_.Clear();
   dom_editor_.Clear();
   SetDocument(nullptr);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getDocument(
@@ -478,7 +483,7 @@
   enable();
 
   if (!document_)
-    return Response::Error("Document is not available");
+    return Response::ServerError("Document is not available");
 
   DiscardFrontendBindings();
 
@@ -489,7 +494,7 @@
   *root = BuildObjectForNode(document_.Get(), sanitized_depth,
                              pierce.fromMaybe(false),
                              document_node_to_id_map_.Get());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getFlattenedDocument(
@@ -497,10 +502,10 @@
     Maybe<bool> pierce,
     std::unique_ptr<protocol::Array<protocol::DOM::Node>>* nodes) {
   if (!enabled_.Get())
-    return Response::Error("DOM agent hasn't been enabled");
+    return Response::ServerError("DOM agent hasn't been enabled");
 
   if (!document_)
-    return Response::Error("Document is not available");
+    return Response::ServerError("Document is not available");
 
   DiscardFrontendBindings();
 
@@ -512,7 +517,7 @@
   (*nodes)->emplace_back(BuildObjectForNode(
       document_.Get(), sanitized_depth, pierce.fromMaybe(false),
       document_node_to_id_map_.Get(), nodes->get()));
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDOMAgent::PushChildNodesToFrontend(int node_id,
@@ -578,7 +583,7 @@
   auto* parent_element = DynamicTo<Element>(parent_node);
   if (!parent_element && !parent_node->IsDocumentNode() &&
       !parent_node->IsDocumentFragment())
-    return Response::Error("No suitable node with given id found");
+    return Response::ServerError("No suitable node with given id found");
 
   for (Node* node = parent_node; node;
        node = FlatTreeTraversal::Next(*node, parent_node)) {
@@ -592,7 +597,7 @@
   }
   for (const String& class_name : unique_names)
     (*class_names)->emplace_back(class_name);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::requestChildNodes(
@@ -601,7 +606,7 @@
     Maybe<bool> maybe_taverse_frames) {
   int sanitized_depth = depth.fromMaybe(1);
   if (sanitized_depth == 0 || sanitized_depth < -1) {
-    return Response::Error(
+    return Response::ServerError(
         "Please provide a positive integer as a depth or -1 for entire "
         "subtree");
   }
@@ -610,7 +615,7 @@
 
   PushChildNodesToFrontend(node_id, sanitized_depth,
                            maybe_taverse_frames.fromMaybe(false));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::querySelector(int node_id,
@@ -619,21 +624,21 @@
   *element_id = 0;
   Node* node = nullptr;
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   auto* container_node = DynamicTo<ContainerNode>(node);
   if (!container_node)
-    return Response::Error("Not a container node");
+    return Response::ServerError("Not a container node");
 
   DummyExceptionStateForTesting exception_state;
   Element* element =
       container_node->QuerySelector(AtomicString(selectors), exception_state);
   if (exception_state.HadException())
-    return Response::Error("DOM Error while querying");
+    return Response::ServerError("DOM Error while querying");
 
   if (element)
     *element_id = PushNodePathToFrontend(element);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::querySelectorAll(
@@ -642,23 +647,23 @@
     std::unique_ptr<protocol::Array<int>>* result) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   auto* container_node = DynamicTo<ContainerNode>(node);
   if (!container_node)
-    return Response::Error("Not a container node");
+    return Response::ServerError("Not a container node");
 
   DummyExceptionStateForTesting exception_state;
   StaticElementList* elements = container_node->QuerySelectorAll(
       AtomicString(selectors), exception_state);
   if (exception_state.HadException())
-    return Response::Error("DOM Error while querying");
+    return Response::ServerError("DOM Error while querying");
 
   *result = std::make_unique<protocol::Array<int>>();
 
   for (unsigned i = 0; i < elements->length(); ++i)
     (*result)->emplace_back(PushNodePathToFrontend(elements->item(i)));
-  return Response::OK();
+  return Response::Success();
 }
 
 int InspectorDOMAgent::PushNodePathToFrontend(Node* node_to_push,
@@ -729,7 +734,7 @@
                                               const String& value) {
   Element* element = nullptr;
   Response response = AssertEditableElement(element_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   return dom_editor_->SetAttribute(element, name, value);
 }
@@ -739,7 +744,7 @@
                                                 Maybe<String> name) {
   Element* element = nullptr;
   Response response = AssertEditableElement(element_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   String markup = "<span " + text + "></span>";
@@ -761,7 +766,7 @@
 
   Element* parsed_element = DynamicTo<Element>(fragment->firstChild());
   if (!parsed_element)
-    return Response::Error("Could not parse value as attributes");
+    return Response::ServerError("Could not parse value as attributes");
 
   String case_adjusted_name = should_ignore_case
                                   ? name.fromMaybe("").DeprecatedLower()
@@ -781,7 +786,7 @@
         name.isJust() && attribute_name == case_adjusted_name;
     Response response =
         dom_editor_->SetAttribute(element, attribute_name, attribute.Value());
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
 
@@ -789,14 +794,14 @@
       !name.fromJust().StripWhiteSpace().IsEmpty()) {
     return dom_editor_->RemoveAttribute(element, case_adjusted_name);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::removeAttribute(int element_id,
                                             const String& name) {
   Element* element = nullptr;
   Response response = AssertEditableElement(element_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   return dom_editor_->RemoveAttribute(element, name);
@@ -805,12 +810,12 @@
 Response InspectorDOMAgent::removeNode(int node_id) {
   Node* node = nullptr;
   Response response = AssertEditableNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   ContainerNode* parent_node = node->parentNode();
   if (!parent_node)
-    return Response::Error("Cannot remove detached node");
+    return Response::ServerError("Cannot remove detached node");
 
   return dom_editor_->RemoveChild(parent_node, node);
 }
@@ -822,7 +827,7 @@
 
   Element* old_element = nullptr;
   Response response = AssertElement(node_id, old_element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -838,7 +843,7 @@
   for (Node* child = old_element->firstChild(); child;
        child = old_element->firstChild()) {
     response = dom_editor_->InsertBefore(new_elem, child, nullptr);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
 
@@ -846,16 +851,16 @@
   ContainerNode* parent = old_element->parentNode();
   response =
       dom_editor_->InsertBefore(parent, new_elem, old_element->nextSibling());
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   response = dom_editor_->RemoveChild(parent, old_element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   *new_id = PushNodePathToFrontend(new_elem);
   if (children_requested_.Contains(node_id))
     PushChildNodesToFrontend(*new_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getOuterHTML(Maybe<int> node_id,
@@ -864,11 +869,11 @@
                                          WTF::String* outer_html) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   *outer_html = CreateMarkup(node);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::setOuterHTML(int node_id,
@@ -877,28 +882,28 @@
     DCHECK(document_);
     DOMPatchSupport dom_patch_support(dom_editor_.Get(), *document_.Get());
     dom_patch_support.PatchDocument(outer_html);
-    return Response::OK();
+    return Response::Success();
   }
 
   Node* node = nullptr;
   Response response = AssertEditableNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Document* document =
       IsA<Document>(node) ? To<Document>(node) : node->ownerDocument();
   if (!document ||
       (!IsA<HTMLDocument>(document) && !IsA<XMLDocument>(document)))
-    return Response::Error("Not an HTML/XML document");
+    return Response::ServerError("Not an HTML/XML document");
 
   Node* new_node = nullptr;
   response = dom_editor_->SetOuterHTML(node, outer_html, &new_node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   if (!new_node) {
     // The only child node has been deleted.
-    return Response::OK();
+    return Response::Success();
   }
 
   int new_id = PushNodePathToFrontend(new_node);
@@ -906,17 +911,17 @@
   bool children_requested = children_requested_.Contains(node_id);
   if (children_requested)
     PushChildNodesToFrontend(new_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::setNodeValue(int node_id, const String& value) {
   Node* node = nullptr;
   Response response = AssertEditableNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   if (node->getNodeType() != Node::kTextNode)
-    return Response::Error("Can only set value of text nodes");
+    return Response::ServerError("Can only set value of text nodes");
 
   return dom_editor_->ReplaceWholeText(To<Text>(node), value);
 }
@@ -958,7 +963,7 @@
     String* search_id,
     int* result_count) {
   if (!enabled_.Get())
-    return Response::Error("DOM agent is not enabled");
+    return Response::ServerError("DOM agent is not enabled");
 
   // FIXME: Few things are missing here:
   // 1) Search works with node granularity - number of matches within node is
@@ -1100,7 +1105,7 @@
     results_it->push_back(result);
 
   *result_count = results_it->size();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getSearchResults(
@@ -1110,21 +1115,21 @@
     std::unique_ptr<protocol::Array<int>>* node_ids) {
   SearchResults::iterator it = search_results_.find(search_id);
   if (it == search_results_.end())
-    return Response::Error("No search session with given id found");
+    return Response::ServerError("No search session with given id found");
 
   int size = it->value.size();
   if (from_index < 0 || to_index > size || from_index >= to_index)
-    return Response::Error("Invalid search result range");
+    return Response::ServerError("Invalid search result range");
 
   *node_ids = std::make_unique<protocol::Array<int>>();
   for (int i = from_index; i < to_index; ++i)
     (*node_ids)->emplace_back(PushNodePathToFrontend((it->value)[i].Get()));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::discardSearchResults(const String& search_id) {
   search_results_.erase(search_id);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::NodeForRemoteObjectId(const String& object_id,
@@ -1135,15 +1140,15 @@
   std::unique_ptr<v8_inspector::StringBuffer> error;
   if (!v8_session_->unwrapObject(&error, ToV8InspectorStringView(object_id),
                                  &value, &context, nullptr))
-    return Response::Error(ToCoreString(std::move(error)));
+    return Response::ServerError(ToCoreString(std::move(error)).Utf8());
   if (!V8Node::HasInstance(value, isolate_))
-    return Response::Error("Object id doesn't reference a Node");
+    return Response::ServerError("Object id doesn't reference a Node");
   node = V8Node::ToImpl(v8::Local<v8::Object>::Cast(value));
   if (!node) {
-    return Response::Error(
+    return Response::ServerError(
         "Couldn't convert object with given objectId to Node");
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::copyTo(int node_id,
@@ -1152,33 +1157,33 @@
                                    int* new_node_id) {
   Node* node = nullptr;
   Response response = AssertEditableNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Element* target_element = nullptr;
   response = AssertEditableElement(target_element_id, target_element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Node* anchor_node = nullptr;
   if (anchor_node_id.isJust() && anchor_node_id.fromJust()) {
     response = AssertEditableChildNode(target_element,
                                        anchor_node_id.fromJust(), anchor_node);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
 
   // The clone is deep by default.
   Node* cloned_node = node->cloneNode(true);
   if (!cloned_node)
-    return Response::Error("Failed to clone node");
+    return Response::ServerError("Failed to clone node");
   response =
       dom_editor_->InsertBefore(target_element, cloned_node, anchor_node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   *new_node_id = PushNodePathToFrontend(cloned_node);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::moveTo(int node_id,
@@ -1187,18 +1192,20 @@
                                    int* new_node_id) {
   Node* node = nullptr;
   Response response = AssertEditableNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Element* target_element = nullptr;
   response = AssertEditableElement(target_element_id, target_element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Node* current = target_element;
   while (current) {
-    if (current == node)
-      return Response::Error("Unable to move node into self or descendant");
+    if (current == node) {
+      return Response::ServerError(
+          "Unable to move node into self or descendant");
+    }
     current = current->parentNode();
   }
 
@@ -1206,21 +1213,21 @@
   if (anchor_node_id.isJust() && anchor_node_id.fromJust()) {
     response = AssertEditableChildNode(target_element,
                                        anchor_node_id.fromJust(), anchor_node);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
 
   response = dom_editor_->InsertBefore(target_element, node, anchor_node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   *new_node_id = PushNodePathToFrontend(node);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::undo() {
   if (!enabled_.Get())
-    return Response::Error("DOM agent is not enabled");
+    return Response::ServerError("DOM agent is not enabled");
   DummyExceptionStateForTesting exception_state;
   history_->Undo(exception_state);
   return InspectorDOMAgent::ToResponse(exception_state);
@@ -1228,7 +1235,7 @@
 
 Response InspectorDOMAgent::redo() {
   if (!enabled_.Get())
-    return Response::Error("DOM agent is not enabled");
+    return Response::ServerError("DOM agent is not enabled");
   DummyExceptionStateForTesting exception_state;
   history_->Redo(exception_state);
   return InspectorDOMAgent::ToResponse(exception_state);
@@ -1236,7 +1243,7 @@
 
 Response InspectorDOMAgent::markUndoableState() {
   history_->MarkUndoableState();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::focus(Maybe<int> node_id,
@@ -1244,16 +1251,16 @@
                                   Maybe<String> object_id) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   auto* element = DynamicTo<Element>(node);
   if (!element)
-    return Response::Error("Node is not an Element");
+    return Response::ServerError("Node is not an Element");
   element->GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kInspector);
   if (!element->IsFocusable())
-    return Response::Error("Element is not focusable");
+    return Response::ServerError("Element is not focusable");
   element->focus();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::setFileInputFiles(
@@ -1263,24 +1270,24 @@
     Maybe<String> object_id) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   auto* html_input_element = DynamicTo<HTMLInputElement>(node);
   if (!html_input_element ||
       html_input_element->type() != input_type_names::kFile)
-    return Response::Error("Node is not a file input element");
+    return Response::ServerError("Node is not a file input element");
 
   Vector<String> paths;
   for (const String& file : *files)
     paths.push_back(file);
   To<HTMLInputElement>(node)->SetFilesFromPaths(paths);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::setNodeStackTracesEnabled(bool enable) {
   capture_node_stack_traces_.Set(enable);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getNodeStackTraces(
@@ -1289,7 +1296,7 @@
         creation) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   InspectorSourceLocation* creation_inspector_source_location =
@@ -1299,7 +1306,7 @@
         creation_inspector_source_location->GetSourceLocation();
     *creation = source_location.BuildInspectorObject();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getBoxModel(
@@ -1309,13 +1316,13 @@
     std::unique_ptr<protocol::DOM::BoxModel>* model) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   bool result = InspectorHighlight::GetBoxModel(node, model, true);
   if (!result)
-    return Response::Error("Could not compute box model.");
-  return Response::OK();
+    return Response::ServerError("Could not compute box model.");
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getContentQuads(
@@ -1325,12 +1332,12 @@
     std::unique_ptr<protocol::Array<protocol::Array<double>>>* quads) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   bool result = InspectorHighlight::GetContentQuads(node, quads);
   if (!result)
-    return Response::Error("Could not compute content quads.");
-  return Response::OK();
+    return Response::ServerError("Could not compute content quads.");
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getNodeForLocation(
@@ -1362,7 +1369,7 @@
   while (node && node->getNodeType() == Node::kTextNode)
     node = node->parentNode();
   if (!node)
-    return Response::Error("No node found at given location");
+    return Response::ServerError("No node found at given location");
   *backend_node_id = IdentifiersFactory::IntIdForNode(node);
   LocalFrame* frame = node->GetDocument().GetFrame();
   *frame_id = IdentifiersFactory::FrameId(frame);
@@ -1370,7 +1377,7 @@
       document_node_to_id_map_->Contains(document_)) {
     *node_id = PushNodePathToFrontend(node);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::resolveNode(
@@ -1383,8 +1390,10 @@
   String object_group_name = object_group.fromMaybe("");
   Node* node = nullptr;
 
-  if (node_id.isJust() == backend_node_id.isJust())
-    return Response::Error("Either nodeId or backendNodeId must be specified.");
+  if (node_id.isJust() == backend_node_id.isJust()) {
+    return Response::ServerError(
+        "Either nodeId or backendNodeId must be specified.");
+  }
 
   if (node_id.isJust())
     node = NodeForId(node_id.fromJust());
@@ -1392,14 +1401,14 @@
     node = DOMNodeIds::NodeForId(backend_node_id.fromJust());
 
   if (!node)
-    return Response::Error("No node with given id found");
+    return Response::ServerError("No node with given id found");
   *result = ResolveNode(v8_session_, node, object_group_name,
                         std::move(execution_context_id));
   if (!*result) {
-    return Response::Error(
+    return Response::ServerError(
         "Node with given id does not belong to the document");
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getAttributes(
@@ -1407,20 +1416,20 @@
     std::unique_ptr<protocol::Array<String>>* result) {
   Element* element = nullptr;
   Response response = AssertElement(node_id, element);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   *result = BuildArrayForElementAttributes(element);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::requestNode(const String& object_id, int* node_id) {
   Node* node = nullptr;
   Response response = NodeForRemoteObjectId(object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   *node_id = PushNodePathToFrontend(node);
-  return Response::OK();
+  return Response::Success();
 }
 
 // static
@@ -2185,19 +2194,19 @@
 Response InspectorDOMAgent::pushNodeByPathToFrontend(const String& path,
                                                      int* node_id) {
   if (!enabled_.Get())
-    return Response::Error("DOM agent is not enabled");
+    return Response::ServerError("DOM agent is not enabled");
   if (Node* node = NodeForPath(path))
     *node_id = PushNodePathToFrontend(node);
   else
-    return Response::Error("No node with given path found");
-  return Response::OK();
+    return Response::ServerError("No node with given path found");
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::pushNodesByBackendIdsToFrontend(
     std::unique_ptr<protocol::Array<int>> backend_node_ids,
     std::unique_ptr<protocol::Array<int>>* result) {
   if (!document_ || !document_node_to_id_map_->Contains(document_))
-    return Response::Error("Document needs to be requested first");
+    return Response::ServerError("Document needs to be requested first");
 
   *result = std::make_unique<protocol::Array<int>>();
   for (int id : *backend_node_ids) {
@@ -2208,7 +2217,7 @@
     else
       (*result)->emplace_back(0);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 class InspectableNode final
@@ -2228,10 +2237,10 @@
 Response InspectorDOMAgent::setInspectedNode(int node_id) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   v8_session_->addInspectedObject(std::make_unique<InspectableNode>(node));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getRelayoutBoundary(
@@ -2239,11 +2248,11 @@
     int* relayout_boundary_node_id) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   LayoutObject* layout_object = node->GetLayoutObject();
   if (!layout_object) {
-    return Response::Error(
+    return Response::ServerError(
         "No layout object for node, perhaps orphan or hidden node");
   }
   while (layout_object && !layout_object->IsDocumentElement() &&
@@ -2252,7 +2261,7 @@
   Node* result_node =
       layout_object ? layout_object->GeneratingNode() : node->ownerDocument();
   *relayout_boundary_node_id = PushNodePathToFrontend(result_node);
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response InspectorDOMAgent::describeNode(
@@ -2264,13 +2273,13 @@
     std::unique_ptr<protocol::DOM::Node>* result) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (!node)
-    return Response::Error("Node not found");
+    return Response::ServerError("Node not found");
   *result = BuildObjectForNode(node, depth.fromMaybe(0),
                                pierce.fromMaybe(false), nullptr, nullptr);
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response InspectorDOMAgent::scrollIntoViewIfNeeded(
@@ -2280,15 +2289,15 @@
     protocol::Maybe<protocol::DOM::Rect> rect) {
   Node* node = nullptr;
   Response response = AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   node->GetDocument().EnsurePaintLocationDataValidForNode(
       node, DocumentUpdateReason::kInspector);
   if (!node->isConnected())
-    return Response::Error("Node is detached from document");
+    return Response::ServerError("Node is detached from document");
   LayoutObject* layout_object = node->GetLayoutObject();
   if (!layout_object)
-    return Response::Error("Node does not have a layout object");
+    return Response::ServerError("Node does not have a layout object");
   PhysicalRect rect_to_scroll = PhysicalRect::EnclosingRect(
       layout_object->AbsoluteBoundingBoxFloatRect());
   if (rect.isJust()) {
@@ -2307,7 +2316,7 @@
           true /* make_visible_in_visual_viewport */,
           mojom::blink::ScrollBehavior::kInstant,
           true /* is_for_scroll_sequence */, false /* zoom_into_rect */));
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response InspectorDOMAgent::getFrameOwner(
@@ -2329,10 +2338,10 @@
     }
   }
   if (!frame)
-    return Response::Error("Frame with the given id was not found.");
+    return Response::ServerError("Frame with the given id was not found.");
   auto* frame_owner = DynamicTo<HTMLFrameOwnerElement>(frame->Owner());
   if (!frame_owner) {
-    return Response::Error(
+    return Response::ServerError(
         "Frame with the given id does not belong to the target.");
   }
 
@@ -2342,7 +2351,7 @@
       document_node_to_id_map_->Contains(document_)) {
     *node_id = PushNodePathToFrontend(frame_owner);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMAgent::getFileInfo(const String& object_id, String* path) {
@@ -2352,18 +2361,18 @@
   std::unique_ptr<v8_inspector::StringBuffer> error;
   if (!v8_session_->unwrapObject(&error, ToV8InspectorStringView(object_id),
                                  &value, &context, nullptr))
-    return Response::Error(ToCoreString(std::move(error)));
+    return Response::ServerError(ToCoreString(std::move(error)).Utf8());
 
   if (!V8File::HasInstance(value, isolate_))
-    return Response::Error("Object id doesn't reference a File");
+    return Response::ServerError("Object id doesn't reference a File");
   File* file = V8File::ToImpl(v8::Local<v8::Object>::Cast(value));
   if (!file) {
-    return Response::Error(
+    return Response::ServerError(
         "Couldn't convert object with given objectId to File");
   }
 
   *path = file->GetPath();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDOMAgent::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
index fedd422..1889e2e 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
@@ -224,7 +224,7 @@
   SetEnabled(false);
   dom_breakpoints_.clear();
   agent_state_.ClearAllFields();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDOMDebuggerAgent::Restore() {
@@ -248,11 +248,11 @@
 Response InspectorDOMDebuggerAgent::SetBreakpoint(const String& event_name,
                                                   const String& target_name) {
   if (event_name.IsEmpty())
-    return Response::Error("Event name is empty");
+    return Response::ServerError("Event name is empty");
   event_listener_breakpoints_.Set(
       EventListenerBreakpointKey(event_name, target_name), true);
   DidAddBreakpoint();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMDebuggerAgent::removeEventListenerBreakpoint(
@@ -272,11 +272,11 @@
     const String& event_name,
     const String& target_name) {
   if (event_name.IsEmpty())
-    return Response::Error("Event name is empty");
+    return Response::ServerError("Event name is empty");
   event_listener_breakpoints_.Clear(
       EventListenerBreakpointKey(event_name, target_name));
   DidRemoveBreakpoint();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDOMDebuggerAgent::DidInvalidateStyleAttr(Node* node) {
@@ -316,17 +316,18 @@
 static Response DomTypeForName(const String& type_string, int& type) {
   if (type_string == "subtree-modified") {
     type = SubtreeModified;
-    return Response::OK();
+    return Response::Success();
   }
   if (type_string == "attribute-modified") {
     type = AttributeModified;
-    return Response::OK();
+    return Response::Success();
   }
   if (type_string == "node-removed") {
     type = NodeRemoved;
-    return Response::OK();
+    return Response::Success();
   }
-  return Response::Error(String("Unknown DOM breakpoint type: " + type_string));
+  return Response::ServerError(
+      String("Unknown DOM breakpoint type: " + type_string).Utf8());
 }
 
 static String DomTypeName(int type) {
@@ -348,12 +349,12 @@
     const String& type_string) {
   Node* node = nullptr;
   Response response = dom_agent_->AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   int type = -1;
   response = DomTypeForName(type_string, type);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   uint32_t root_bit = 1 << type;
@@ -364,7 +365,7 @@
       UpdateSubtreeBreakpoints(child, root_bit, true);
   }
   DidAddBreakpoint();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMDebuggerAgent::removeDOMBreakpoint(
@@ -372,12 +373,12 @@
     const String& type_string) {
   Node* node = nullptr;
   Response response = dom_agent_->AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   int type = -1;
   response = DomTypeForName(type_string, type);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   uint32_t root_bit = 1 << type;
@@ -394,7 +395,7 @@
       UpdateSubtreeBreakpoints(child, root_bit, false);
   }
   DidRemoveBreakpoint();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMDebuggerAgent::getEventListeners(
@@ -410,7 +411,7 @@
   std::unique_ptr<v8_inspector::StringBuffer> object_group;
   if (!v8_session_->unwrapObject(&error, ToV8InspectorStringView(object_id),
                                  &object, &context, &object_group)) {
-    return Response::Error(ToCoreString(std::move(error)));
+    return Response::ServerError(ToCoreString(std::move(error)).Utf8());
   }
   v8::Context::Scope scope(context);
   V8EventListenerInfoList event_information;
@@ -419,7 +420,7 @@
       pierce.fromMaybe(false), &event_information);
   *listeners_array = BuildObjectsForEventListeners(event_information, context,
                                                    object_group->string());
-  return Response::OK();
+  return Response::Success();
 }
 
 std::unique_ptr<protocol::Array<protocol::DOMDebugger::EventListener>>
@@ -692,7 +693,7 @@
   else
     xhr_breakpoints_.Set(url, true);
   DidAddBreakpoint();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMDebuggerAgent::removeXHRBreakpoint(const String& url) {
@@ -701,7 +702,7 @@
   else
     xhr_breakpoints_.Clear(url);
   DidRemoveBreakpoint();
-  return Response::OK();
+  return Response::Success();
 }
 
 // Returns the breakpoint url if a match is found, or WTF::String().
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
index 0e6779c..85e99a9 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
@@ -207,16 +207,16 @@
 Response InspectorDOMSnapshotAgent::enable() {
   if (!enabled_.Get())
     EnableAndReset();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMSnapshotAgent::disable() {
   if (!enabled_.Get())
-    return Response::Error("DOM snapshot agent hasn't been enabled.");
+    return Response::ServerError("DOM snapshot agent hasn't been enabled.");
   enabled_.Clear();
   origin_url_map_.reset();
   instrumenting_agents_->RemoveInspectorDOMSnapshotAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMSnapshotAgent::getSnapshot(
@@ -231,7 +231,7 @@
         computed_styles) {
   Document* document = inspected_frames_->Root()->GetDocument();
   if (!document)
-    return Response::Error("Document is not available");
+    return Response::ServerError("Document is not available");
   LegacyDOMSnapshotAgent legacySupport(dom_debugger_agent_,
                                        origin_url_map_.get());
   return legacySupport.GetSnapshot(
@@ -253,7 +253,7 @@
 
   auto* main_window = inspected_frames_->Root()->DomWindow();
   if (!main_window)
-    return Response::Error("Document is not available");
+    return Response::ServerError("Document is not available");
 
   strings_ = std::make_unique<protocol::Array<String>>();
   documents_ = std::make_unique<
@@ -293,7 +293,7 @@
   string_table_.clear();
   document_order_map_.clear();
   documents_.reset();
-  return Response::OK();
+  return Response::Success();
 }
 
 int InspectorDOMSnapshotAgent::AddString(const String& string) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
index 70efd14..39b3efb 100644
--- a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
@@ -160,7 +160,7 @@
   if (!locale_override_.Get().IsEmpty())
     setLocaleOverride(String());
   if (!web_local_frame_)
-    return Response::OK();
+    return Response::Success();
   setScriptExecutionDisabled(false);
   setScrollbarsHidden(false);
   setDocumentCookieDisabled(false);
@@ -176,12 +176,12 @@
   setCPUThrottlingRate(1);
   setFocusEmulationEnabled(false);
   setDefaultBackgroundColorOverride(Maybe<protocol::DOM::RGBA>());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorEmulationAgent::resetPageScaleFactor() {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   GetWebViewImpl()->ResetScaleStateImmediately();
   return response;
@@ -189,7 +189,7 @@
 
 Response InspectorEmulationAgent::setPageScaleFactor(double page_scale_factor) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   GetWebViewImpl()->SetPageScaleFactor(static_cast<float>(page_scale_factor));
   return response;
@@ -197,7 +197,7 @@
 
 Response InspectorEmulationAgent::setScriptExecutionDisabled(bool value) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (script_execution_disabled_.Get() == value)
     return response;
@@ -208,7 +208,7 @@
 
 Response InspectorEmulationAgent::setScrollbarsHidden(bool hidden) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (scrollbars_hidden_.Get() == hidden)
     return response;
@@ -219,7 +219,7 @@
 
 Response InspectorEmulationAgent::setDocumentCookieDisabled(bool disabled) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (document_cookie_disabled_.Get() == disabled)
     return response;
@@ -232,13 +232,14 @@
     bool enabled,
     protocol::Maybe<int> max_touch_points) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   int max_points = max_touch_points.fromMaybe(1);
   if (max_points < 1 || max_points > WebTouchEvent::kTouchesLengthCap) {
-    return Response::InvalidParams("Touch points must be between 1 and " +
-                                   String::Number(static_cast<uint16_t>(
-                                       WebTouchEvent::kTouchesLengthCap)));
+    String msg =
+        "Touch points must be between 1 and " +
+        String::Number(static_cast<uint16_t>(WebTouchEvent::kTouchesLengthCap));
+    return Response::InvalidParams(msg.Utf8());
   }
   touch_event_emulation_enabled_.Set(enabled);
   max_touch_points_.Set(max_points);
@@ -251,7 +252,7 @@
     Maybe<String> media,
     Maybe<protocol::Array<protocol::Emulation::MediaFeature>> features) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (media.isJust()) {
     auto mediaValue = media.takeJust();
@@ -282,7 +283,7 @@
 Response InspectorEmulationAgent::setEmulatedVisionDeficiency(
     const String& type) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   VisionDeficiency vision_deficiency;
@@ -290,22 +291,14 @@
       protocol::Emulation::SetEmulatedVisionDeficiency::TypeEnum;
   if (type == TypeEnum::None)
     vision_deficiency = VisionDeficiency::kNoVisionDeficiency;
-  else if (type == TypeEnum::Achromatomaly)
-    vision_deficiency = VisionDeficiency::kAchromatomaly;
   else if (type == TypeEnum::Achromatopsia)
     vision_deficiency = VisionDeficiency::kAchromatopsia;
   else if (type == TypeEnum::BlurredVision)
     vision_deficiency = VisionDeficiency::kBlurredVision;
-  else if (type == TypeEnum::Deuteranomaly)
-    vision_deficiency = VisionDeficiency::kDeuteranomaly;
   else if (type == TypeEnum::Deuteranopia)
     vision_deficiency = VisionDeficiency::kDeuteranopia;
-  else if (type == TypeEnum::Protanomaly)
-    vision_deficiency = VisionDeficiency::kProtanomaly;
   else if (type == TypeEnum::Protanopia)
     vision_deficiency = VisionDeficiency::kProtanopia;
-  else if (type == TypeEnum::Tritanomaly)
-    vision_deficiency = VisionDeficiency::kTritanomaly;
   else if (type == TypeEnum::Tritanopia)
     vision_deficiency = VisionDeficiency::kTritanopia;
   else
@@ -318,7 +311,7 @@
 
 Response InspectorEmulationAgent::setCPUThrottlingRate(double rate) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   scheduler::ThreadCPUThrottler::GetInstance()->SetThrottlingRate(rate);
   return response;
@@ -326,7 +319,7 @@
 
 Response InspectorEmulationAgent::setFocusEmulationEnabled(bool enabled) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   emulate_focus_.Set(enabled);
   GetWebViewImpl()->GetPage()->GetFocusController().SetFocusEmulationEnabled(
@@ -342,7 +335,7 @@
     protocol::Maybe<double> initial_virtual_time,
     double* virtual_time_ticks_base_ms) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   virtual_time_policy_.Set(policy);
 
@@ -463,7 +456,7 @@
 Response InspectorEmulationAgent::setNavigatorOverrides(
     const String& platform) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   navigator_platform_override_.Set(platform);
   GetWebViewImpl()->GetPage()->GetSettings().SetNavigatorPlatformOverride(
@@ -490,13 +483,13 @@
 Response InspectorEmulationAgent::setDefaultBackgroundColorOverride(
     Maybe<protocol::DOM::RGBA> color) {
   Response response = AssertPage();
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (!color.isJust()) {
     // Clear the override and state.
     GetWebViewImpl()->ClearBaseBackgroundColorOverride();
     default_background_color_override_rgba_.Clear();
-    return Response::OK();
+    return Response::Success();
   }
 
   blink::protocol::DOM::RGBA* rgba = color.fromJust();
@@ -505,7 +498,7 @@
   int alpha = static_cast<int>(lroundf(255.0f * rgba->getA(1.0f)));
   GetWebViewImpl()->SetBaseBackgroundColorOverride(
       Color(rgba->getR(), rgba->getG(), rgba->getB(), alpha).Rgb());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorEmulationAgent::setDeviceMetricsOverride(
@@ -547,7 +540,7 @@
     GetWebViewImpl()->GetPage()->GetSettings().SetNavigatorPlatformOverride(
         navigator_platform_override_.Get());
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorEmulationAgent::setLocaleOverride(
@@ -555,14 +548,15 @@
   // Only allow resetting overrides set by the same agent.
   if (locale_override_.Get().IsEmpty() &&
       LocaleController::instance().has_locale_override()) {
-    return Response::Error("Another locale override is already in effect");
+    return Response::ServerError(
+        "Another locale override is already in effect");
   }
   String locale = maybe_locale.fromMaybe(String());
   String error = LocaleController::instance().SetLocaleOverride(locale);
   if (!error.IsEmpty())
-    return Response::Error(error);
+    return Response::ServerError(error.Utf8());
   locale_override_.Set(locale);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorEmulationAgent::setTimezoneOverride(
@@ -572,14 +566,15 @@
     timezone_override_ = TimeZoneController::SetTimeZoneOverride(timezone_id);
     if (!timezone_override_) {
       return TimeZoneController::HasTimeZoneOverride()
-                 ? Response::Error("Timezone override is already in effect")
+                 ? Response::ServerError(
+                       "Timezone override is already in effect")
                  : Response::InvalidParams("Invalid timezone id");
     }
   }
 
   timezone_id_override_.Set(timezone_id);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorEmulationAgent::ApplyAcceptLanguageOverride(String* accept_lang) {
@@ -605,7 +600,7 @@
     return Response::InvalidParams(
         "Can only enable virtual time for pages, not workers");
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorEmulationAgent::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_io_agent.cc b/third_party/blink/renderer/core/inspector/inspector_io_agent.cc
index dc913e6..3094072 100644
--- a/third_party/blink/renderer/core/inspector/inspector_io_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_io_agent.cc
@@ -25,19 +25,19 @@
   std::unique_ptr<v8_inspector::StringBuffer> error;
   if (!v8_session_->unwrapObject(&error, ToV8InspectorStringView(object_id),
                                  &value, &context, nullptr))
-    return Response::Error(ToCoreString(std::move(error)));
+    return Response::ServerError(ToCoreString(std::move(error)).Utf8());
 
   if (!V8Blob::HasInstance(value, isolate_))
-    return Response::Error("Object id doesn't reference a Blob");
+    return Response::ServerError("Object id doesn't reference a Blob");
 
   Blob* blob = V8Blob::ToImpl(v8::Local<v8::Object>::Cast(value));
   if (!blob) {
-    return Response::Error(
+    return Response::ServerError(
         "Couldn't convert object with given objectId to Blob");
   }
 
   *uuid = blob->Uuid();
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
index cc54cc5c..684f612 100644
--- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
@@ -276,7 +276,7 @@
   instrumenting_agents_->AddInspectorLayerTreeAgent(this);
   Document* document = inspected_frames_->Root()->GetDocument();
   if (!document)
-    return Response::Error("The root frame doesn't have document");
+    return Response::ServerError("The root frame doesn't have document");
 
   inspected_frames_->Root()->View()->UpdateAllLifecyclePhases(
       DocumentUpdateReason::kInspector);
@@ -284,13 +284,13 @@
   LayerTreePainted();
   LayerTreeDidChange();
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::disable() {
   instrumenting_agents_->RemoveInspectorLayerTreeAgent(this);
   snapshot_by_id_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorLayerTreeAgent::LayerTreeDidChange() {
@@ -365,12 +365,12 @@
   bool ok;
   int id = layer_id.ToInt(&ok);
   if (!ok)
-    return Response::Error("Invalid layer id");
+    return Response::ServerError("Invalid layer id");
 
   result = FindLayerById(RootLayer(), id);
   if (!result)
-    return Response::Error("No layer matching given id found");
-  return Response::OK();
+    return Response::ServerError("No layer matching given id found");
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::compositingReasons(
@@ -379,7 +379,7 @@
     std::unique_ptr<Array<String>>* compositing_reason_ids) {
   const cc::Layer* layer = nullptr;
   Response response = LayerById(layer_id, layer);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   *compositing_reasons = std::make_unique<protocol::Array<String>>();
   *compositing_reason_ids = std::make_unique<protocol::Array<String>>();
@@ -394,7 +394,7 @@
     }
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::makeSnapshot(const String& layer_id,
@@ -408,7 +408,7 @@
                                                       ->GetDocument()
                                                       ->Lifecycle()
                                                       .LifecyclePostponed())
-    return Response::Error("Layer does not draw content");
+    return Response::ServerError("Layer does not draw content");
 
   inspected_frames_->Root()->View()->UpdateAllLifecyclePhases(
       DocumentUpdateReason::kInspector);
@@ -417,29 +417,29 @@
 
   const cc::Layer* layer = nullptr;
   Response response = LayerById(layer_id, layer);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   if (!layer->DrawsContent())
-    return Response::Error("Layer does not draw content");
+    return Response::ServerError("Layer does not draw content");
 
   auto picture = layer->GetPicture();
   if (!picture)
-    return Response::Error("Layer does not produce picture");
+    return Response::ServerError("Layer does not produce picture");
 
   auto snapshot = base::MakeRefCounted<PictureSnapshot>(std::move(picture));
   *snapshot_id = String::Number(++last_snapshot_id_);
   bool new_entry = snapshot_by_id_.insert(*snapshot_id, snapshot).is_new_entry;
   DCHECK(new_entry);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::loadSnapshot(
     std::unique_ptr<Array<protocol::LayerTree::PictureTile>> tiles,
     String* snapshot_id) {
   if (tiles->empty())
-    return Response::Error("Invalid argument, no tiles provided");
+    return Response::ServerError("Invalid argument, no tiles provided");
   if (tiles->size() > UINT_MAX)
-    return Response::Error("Invalid argument, too many tiles provided");
+    return Response::ServerError("Invalid argument, too many tiles provided");
   wtf_size_t tiles_length = static_cast<wtf_size_t>(tiles->size());
   Vector<scoped_refptr<PictureSnapshot::TilePictureStream>> decoded_tiles;
   decoded_tiles.Grow(tiles_length);
@@ -454,22 +454,22 @@
   scoped_refptr<PictureSnapshot> snapshot =
       PictureSnapshot::Load(decoded_tiles);
   if (!snapshot)
-    return Response::Error("Invalid snapshot format");
+    return Response::ServerError("Invalid snapshot format");
   if (snapshot->IsEmpty())
-    return Response::Error("Empty snapshot");
+    return Response::ServerError("Empty snapshot");
 
   *snapshot_id = String::Number(++last_snapshot_id_);
   bool new_entry = snapshot_by_id_.insert(*snapshot_id, snapshot).is_new_entry;
   DCHECK(new_entry);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::releaseSnapshot(const String& snapshot_id) {
   SnapshotById::iterator it = snapshot_by_id_.find(snapshot_id);
   if (it == snapshot_by_id_.end())
-    return Response::Error("Snapshot not found");
+    return Response::ServerError("Snapshot not found");
   snapshot_by_id_.erase(it);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::GetSnapshotById(
@@ -477,9 +477,9 @@
     const PictureSnapshot*& result) {
   SnapshotById::iterator it = snapshot_by_id_.find(snapshot_id);
   if (it == snapshot_by_id_.end())
-    return Response::Error("Snapshot not found");
+    return Response::ServerError("Snapshot not found");
   result = it->value.get();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::replaySnapshot(const String& snapshot_id,
@@ -489,14 +489,14 @@
                                                  String* data_url) {
   const PictureSnapshot* snapshot = nullptr;
   Response response = GetSnapshotById(snapshot_id, snapshot);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   auto png_data = snapshot->Replay(from_step.fromMaybe(0), to_step.fromMaybe(0),
                                    scale.fromMaybe(1.0));
   if (png_data.IsEmpty())
-    return Response::Error("Image encoding failed");
+    return Response::ServerError("Image encoding failed");
   *data_url = "data:image/png;base64," + Base64Encode(png_data);
-  return Response::OK();
+  return Response::Success();
 }
 
 static void ParseRect(protocol::DOM::Rect* object, FloatRect* rect) {
@@ -512,7 +512,7 @@
     std::unique_ptr<protocol::Array<protocol::Array<double>>>* out_timings) {
   const PictureSnapshot* snapshot = nullptr;
   Response response = GetSnapshotById(snapshot_id, snapshot);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   FloatRect rect;
   if (clip_rect.isJust())
@@ -528,7 +528,7 @@
       out_row->emplace_back(delta.InSecondsF());
     (*out_timings)->emplace_back(std::move(out_row));
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLayerTreeAgent::snapshotCommandLog(
@@ -536,7 +536,7 @@
     std::unique_ptr<Array<protocol::DictionaryValue>>* command_log) {
   const PictureSnapshot* snapshot = nullptr;
   Response response = GetSnapshotById(snapshot_id, snapshot);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   protocol::ErrorSupport errors;
   const String& json = snapshot->SnapshotCommandLog()->ToJSONString();
@@ -557,9 +557,8 @@
                                                              &errors);
   auto err = errors.Errors();
   if (err.empty())
-    return Response::OK();
-  return Response::Error(
-      protocol::StringUtil::fromUTF8(err.data(), err.size()));
+    return Response::Success();
+  return Response::ServerError(std::string(err.begin(), err.end()));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
index bf5fada..e3429abb 100644
--- a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
@@ -183,24 +183,24 @@
 
 Response InspectorLogAgent::enable() {
   if (enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(true);
   InnerEnable();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLogAgent::disable() {
   if (!enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Clear();
   stopViolationsReport();
   instrumenting_agents_->RemoveInspectorLogAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLogAgent::clear() {
   storage_->Clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 static PerformanceMonitor::Violation ParseViolation(const String& name) {
@@ -224,9 +224,11 @@
 Response InspectorLogAgent::startViolationsReport(
     std::unique_ptr<protocol::Array<ViolationSetting>> settings) {
   if (!enabled_.Get())
-    return Response::Error("Log is not enabled");
-  if (!performance_monitor_)
-    return Response::Error("Violations are not supported for this target");
+    return Response::ServerError("Log is not enabled");
+  if (!performance_monitor_) {
+    return Response::ServerError(
+        "Violations are not supported for this target");
+  }
   performance_monitor_->UnsubscribeAll(this);
   violation_thresholds_.Clear();
   for (const std::unique_ptr<ViolationSetting>& setting : *settings) {
@@ -239,15 +241,17 @@
         violation, base::TimeDelta::FromMillisecondsD(threshold), this);
     violation_thresholds_.Set(name, threshold);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorLogAgent::stopViolationsReport() {
   violation_thresholds_.Clear();
-  if (!performance_monitor_)
-    return Response::Error("Violations are not supported for this target");
+  if (!performance_monitor_) {
+    return Response::ServerError(
+        "Violations are not supported for this target");
+  }
   performance_monitor_->UnsubscribeAll(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorLogAgent::ReportLongLayout(base::TimeDelta duration) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_media_agent.cc b/third_party/blink/renderer/core/inspector/inspector_media_agent.cc
index 54fb5bca..16a634f9 100644
--- a/third_party/blink/renderer/core/inspector/inspector_media_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_media_agent.cc
@@ -72,18 +72,18 @@
 
 protocol::Response InspectorMediaAgent::enable() {
   if (enabled_.Get())
-    return protocol::Response::OK();
+    return protocol::Response::Success();
   enabled_.Set(true);
   RegisterAgent();
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 protocol::Response InspectorMediaAgent::disable() {
   if (!enabled_.Get())
-    return protocol::Response::OK();
+    return protocol::Response::Success();
   enabled_.Clear();
   instrumenting_agents_->RemoveInspectorMediaAgent(this);
-  return protocol::Response::OK();
+  return protocol::Response::Success();
 }
 
 void InspectorMediaAgent::PlayerPropertiesChanged(
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
index 06e9e07..b7bbd98 100644
--- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
@@ -63,7 +63,7 @@
   *nodes = InstanceCounters::CounterValue(InstanceCounters::kNodeCounter);
   *js_event_listeners =
       InstanceCounters::CounterValue(InstanceCounters::kJSEventListenerCounter);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorMemoryAgent::forciblyPurgeJavaScriptMemory() {
@@ -78,7 +78,7 @@
   }
   V8PerIsolateData::MainThreadIsolate()->MemoryPressureNotification(
       v8::MemoryPressureLevel::kCritical);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorMemoryAgent::Trace(Visitor* visitor) {
@@ -98,33 +98,33 @@
   int interval =
       in_sampling_interval.fromMaybe(kDefaultNativeMemorySamplingInterval);
   if (interval <= 0)
-    return Response::Error("Invalid sampling rate.");
+    return Response::ServerError("Invalid sampling rate.");
   base::SamplingHeapProfiler::Get()->SetSamplingInterval(interval);
   sampling_profile_interval_.Set(interval);
   if (in_suppressRandomness.fromMaybe(false))
     base::PoissonAllocationSampler::Get()->SuppressRandomnessForTest(true);
   profile_id_ = base::SamplingHeapProfiler::Get()->Start();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorMemoryAgent::stopSampling() {
   if (sampling_profile_interval_.Get() == 0)
-    return Response::Error("Sampling profiler is not started.");
+    return Response::ServerError("Sampling profiler is not started.");
   base::SamplingHeapProfiler::Get()->Stop();
   sampling_profile_interval_.Clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorMemoryAgent::getAllTimeSamplingProfile(
     std::unique_ptr<protocol::Memory::SamplingProfile>* out_profile) {
   *out_profile = GetSamplingProfileById(0);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorMemoryAgent::getSamplingProfile(
     std::unique_ptr<protocol::Memory::SamplingProfile>* out_profile) {
   *out_profile = GetSamplingProfileById(profile_id_);
-  return Response::OK();
+  return Response::Success();
 }
 
 std::unique_ptr<protocol::Memory::SamplingProfile>
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
index c2eed3a..79887e2f 100644
--- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -221,7 +221,7 @@
     std::unique_ptr<GetResponseBodyCallback> callback,
     scoped_refptr<SharedBuffer> raw_data) {
   if (!raw_data) {
-    callback->sendFailure(Response::Error("Couldn't read BLOB"));
+    callback->sendFailure(Response::ServerError("Couldn't read BLOB"));
     return;
   }
   String result;
@@ -230,7 +230,7 @@
           raw_data, mime_type, text_encoding_name, &result, &base64_encoded)) {
     callback->sendSuccess(result, base64_encoded);
   } else {
-    callback->sendFailure(Response::Error("Couldn't encode data"));
+    callback->sendFailure(Response::ServerError("Couldn't encode data"));
   }
 }
 
@@ -1385,7 +1385,7 @@
       resource_buffer_size.fromMaybe(kDefaultResourceBufferSize));
   max_post_data_size_.Set(max_post_data_size.fromMaybe(0));
   Enable();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorNetworkAgent::Enable() {
@@ -1404,7 +1404,7 @@
   instrumenting_agents_->RemoveInspectorNetworkAgent(this);
   agent_state_.ClearAllFields();
   resources_data_->Clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::setExtraHTTPHeaders(
@@ -1417,7 +1417,7 @@
     if (entry.second && entry.second->asString(&value))
       extra_request_headers_.Set(entry.first, value);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 bool InspectorNetworkAgent::CanGetResponseBodyBlob(const String& request_id) {
@@ -1464,7 +1464,7 @@
   String content;
   bool base64_encoded;
   Response response = GetResponseBody(request_id, &content, &base64_encoded);
-  if (response.isSuccess()) {
+  if (response.IsSuccess()) {
     callback->sendSuccess(content, base64_encoded);
   } else {
     callback->sendFailure(response);
@@ -1476,7 +1476,7 @@
   blocked_urls_.Clear();
   for (const String& url : *urls)
     blocked_urls_.Set(url, true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::replayXHR(const String& request_id) {
@@ -1485,12 +1485,12 @@
   XHRReplayData* xhr_replay_data = resources_data_->XhrReplayData(request_id);
   auto* data = resources_data_->Data(request_id);
   if (!xhr_replay_data || !data)
-    return Response::Error("Given id does not correspond to XHR");
+    return Response::ServerError("Given id does not correspond to XHR");
 
   ExecutionContext* execution_context = xhr_replay_data->GetExecutionContext();
   if (!execution_context || execution_context->IsContextDestroyed()) {
     resources_data_->SetXHRReplayData(request_id, nullptr);
-    return Response::Error("Document is already detached");
+    return Response::ServerError("Document is already detached");
   }
 
   XMLHttpRequest* xhr = XMLHttpRequest::Create(execution_context);
@@ -1509,17 +1509,17 @@
                                  IGNORE_EXCEPTION_FOR_TESTING);
 
   replay_xhrs_.insert(xhr);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::canClearBrowserCache(bool* result) {
   *result = true;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::canClearBrowserCookies(bool* result) {
   *result = true;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::emulateNetworkConditions(
@@ -1529,13 +1529,13 @@
     double upload_throughput,
     Maybe<String> connection_type) {
   if (!IsMainThread())
-    return Response::Error("Not supported");
+    return Response::ServerError("Not supported");
 
   WebConnectionType type = kWebConnectionTypeUnknown;
   if (connection_type.isJust()) {
     type = ToWebConnectionType(connection_type.fromJust());
     if (type == kWebConnectionTypeUnknown)
-      return Response::Error("Unknown connection type");
+      return Response::ServerError("Unknown connection type");
   }
   // TODO(dgozman): networkStateNotifier is per-process. It would be nice to
   // have per-frame override instead.
@@ -1546,7 +1546,7 @@
   } else {
     GetNetworkStateNotifier().ClearOverride();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::setCacheDisabled(bool cache_disabled) {
@@ -1556,18 +1556,18 @@
   cache_disabled_.Set(cache_disabled);
   if (cache_disabled && IsMainThread())
     GetMemoryCache()->EvictResources();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::setBypassServiceWorker(bool bypass) {
   bypass_service_worker_.Set(bypass);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::setDataSizeLimitsForTest(int max_total,
                                                          int max_resource) {
   resources_data_->SetResourcesDataSizeLimits(max_total, max_resource);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorNetworkAgent::getCertificate(
@@ -1586,10 +1586,10 @@
             ->emplace_back(
                 Base64Encode(base::as_bytes(base::make_span(cert.Latin1()))));
       }
-      return Response::OK();
+      return Response::Success();
     }
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorNetworkAgent::DidCommitLoad(LocalFrame* frame,
@@ -1627,17 +1627,18 @@
   NetworkResourcesData::ResourceData const* resource_data =
       resources_data_->Data(request_id);
   if (!resource_data) {
-    return Response::Error("No resource with given identifier found");
+    return Response::ServerError("No resource with given identifier found");
   }
 
   if (resource_data->HasContent()) {
     *content = resource_data->Content();
     *base64_encoded = resource_data->Base64Encoded();
-    return Response::OK();
+    return Response::Success();
   }
 
   if (resource_data->IsContentEvicted()) {
-    return Response::Error("Request content was evicted from inspector cache");
+    return Response::ServerError(
+        "Request content was evicted from inspector cache");
   }
 
   if (resource_data->Buffer() && !resource_data->TextEncodingName().IsNull()) {
@@ -1645,16 +1646,17 @@
         resource_data->Buffer(), resource_data->MimeType(),
         resource_data->TextEncodingName(), content, base64_encoded);
     DCHECK(success);
-    return Response::OK();
+    return Response::Success();
   }
 
   if (resource_data->CachedResource() &&
       InspectorPageAgent::CachedResourceContent(resource_data->CachedResource(),
                                                 content, base64_encoded)) {
-    return Response::OK();
+    return Response::Success();
   }
 
-  return Response::Error("No data found for resource with given identifier");
+  return Response::ServerError(
+      "No data found for resource with given identifier");
 }
 
 Response InspectorNetworkAgent::searchInResponseBody(
@@ -1668,7 +1670,7 @@
   String content;
   bool base64_encoded;
   Response response = GetResponseBody(request_id, &content, &base64_encoded);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   auto results = v8_session_->searchInTextByLines(
@@ -1677,7 +1679,7 @@
   *matches = std::make_unique<
       protocol::Array<v8_inspector::protocol::Debugger::API::SearchMatch>>(
       std::move(results));
-  return Response::OK();
+  return Response::Success();
 }
 
 bool InspectorNetworkAgent::FetchResourceContent(Document* document,
@@ -1767,13 +1769,13 @@
       resources_data_->Data(request_id);
   if (!resource_data) {
     callback->sendFailure(
-        Response::Error("No resource with given id was found"));
+        Response::ServerError("No resource with given id was found"));
     return;
   }
   scoped_refptr<EncodedFormData> post_data = resource_data->PostData();
   if (!post_data || post_data->IsEmpty()) {
     callback->sendFailure(
-        Response::Error("No post data available for the request"));
+        Response::ServerError("No post data available for the request"));
     return;
   }
   ExecutionContext* context = GetTargetExecutionContext();
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index bca3b4f..ab44f6d 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -380,7 +380,7 @@
 
 Response InspectorOverlayAgent::enable() {
   if (!dom_agent_->Enabled())
-    return Response::Error("DOM should be enabled first");
+    return Response::ServerError("DOM should be enabled first");
   enabled_.Set(true);
   if (backend_node_id_to_inspect_) {
     GetFrontend()->inspectNodeRequested(
@@ -388,7 +388,7 @@
   }
   backend_node_id_to_inspect_ = 0;
   SetNeedsUnbufferedInput(true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::disable() {
@@ -417,20 +417,20 @@
   frame_resource_name_ = 0;
   PickTheRightTool();
   SetNeedsUnbufferedInput(false);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowAdHighlights(bool show) {
   show_ad_highlights_.Set(show);
   frame_impl_->ViewImpl()->GetPage()->GetSettings().SetHighlightAds(show);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowDebugBorders(bool show) {
   show_debug_borders_.Set(show);
   if (show) {
     Response response = CompositingEnabled();
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
   WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget();
@@ -445,14 +445,14 @@
       debug_state.show_debug_borders.reset();
     widget_impl->SetLayerTreeDebugState(debug_state);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowFPSCounter(bool show) {
   show_fps_counter_.Set(show);
   if (show) {
     Response response = CompositingEnabled();
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
   WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget();
@@ -464,14 +464,14 @@
     debug_state.show_fps_counter = show;
     widget_impl->SetLayerTreeDebugState(debug_state);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowPaintRects(bool show) {
   show_paint_rects_.Set(show);
   if (show) {
     Response response = CompositingEnabled();
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
   WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget();
@@ -485,14 +485,14 @@
   }
   if (!show && frame_impl_->GetFrameView())
     frame_impl_->GetFrameView()->Invalidate();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowLayoutShiftRegions(bool show) {
   show_layout_shift_regions_.Set(show);
   if (show) {
     Response response = CompositingEnabled();
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
   WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget();
@@ -507,14 +507,14 @@
 
   if (!show && frame_impl_->GetFrameView())
     frame_impl_->GetFrameView()->Invalidate();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowScrollBottleneckRects(bool show) {
   show_scroll_bottleneck_rects_.Set(show);
   if (show) {
     Response response = CompositingEnabled();
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
   WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget();
@@ -530,14 +530,14 @@
     widget_impl->SetLayerTreeDebugState(debug_state);
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowHitTestBorders(bool show) {
   show_hit_test_borders_.Set(show);
   if (show) {
     Response response = CompositingEnabled();
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
   }
   WebFrameWidget* widget = frame_impl_->LocalRoot()->FrameWidget();
@@ -549,19 +549,19 @@
     debug_state.show_hit_test_borders = show;
     widget_impl->SetLayerTreeDebugState(debug_state);
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setShowViewportSizeOnResize(bool show) {
   show_size_on_resize_.Set(show);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::setPausedInDebuggerMessage(
     Maybe<String> message) {
   paused_in_debugger_message_.Set(message.fromMaybe(String()));
   PickTheRightTool();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::highlightRect(
@@ -576,7 +576,7 @@
   SetInspectTool(MakeGarbageCollected<QuadHighlightTool>(
       std::move(quad), InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr)),
       InspectorDOMAgent::ParseColor(outline_color.fromMaybe(nullptr))));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::highlightQuad(
@@ -585,11 +585,11 @@
     Maybe<protocol::DOM::RGBA> outline_color) {
   std::unique_ptr<FloatQuad> quad = std::make_unique<FloatQuad>();
   if (!ParseQuad(std::move(quad_array), quad.get()))
-    return Response::Error("Invalid Quad format");
+    return Response::ServerError("Invalid Quad format");
   SetInspectTool(MakeGarbageCollected<QuadHighlightTool>(
       std::move(quad), InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr)),
       InspectorDOMAgent::ParseColor(outline_color.fromMaybe(nullptr))));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::highlightNode(
@@ -602,18 +602,18 @@
   Node* node = nullptr;
   Response response =
       dom_agent_->AssertNode(node_id, backend_node_id, object_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   std::unique_ptr<InspectorHighlightConfig> highlight_config;
   response = HighlightConfigFromInspectorObject(
       std::move(highlight_inspector_object), &highlight_config);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   SetInspectTool(MakeGarbageCollected<NodeHighlightTool>(
       node, selector_list.fromMaybe(String()), std::move(highlight_config)));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::highlightFrame(
@@ -624,7 +624,7 @@
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   // FIXME: Inspector doesn't currently work cross process.
   if (!frame)
-    return Response::Error("Invalid frame id");
+    return Response::ServerError("Invalid frame id");
   if (frame->DeprecatedLocalOwner()) {
     std::unique_ptr<InspectorHighlightConfig> highlight_config =
         std::make_unique<InspectorHighlightConfig>();
@@ -639,13 +639,13 @@
   } else {
     PickTheRightTool();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::hideHighlight() {
   if (inspect_tool_ && inspect_tool_->HideOnHideHighlight())
     PickTheRightTool();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorOverlayAgent::getHighlightObjectForTest(
@@ -655,7 +655,7 @@
     std::unique_ptr<protocol::DictionaryValue>* result) {
   Node* node = nullptr;
   Response response = dom_agent_->AssertNode(node_id, node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   bool is_locked_ancestor = false;
 
@@ -674,7 +674,7 @@
                                include_distance.fromMaybe(false),
                                is_locked_ancestor);
   *result = highlight.AsProtocolValue();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorOverlayAgent::UpdatePrePaint() {
@@ -1083,8 +1083,8 @@
                           ->GetPage()
                           ->GetSettings()
                           .GetAcceleratedCompositingEnabled())
-    return Response::Error("Compositing mode is not supported");
-  return Response::OK();
+    return Response::ServerError("Compositing mode is not supported");
+  return Response::Success();
 }
 
 bool InspectorOverlayAgent::InSomeInspectMode() {
@@ -1119,8 +1119,8 @@
       mode != protocol::Overlay::InspectModeEnum::SearchForUAShadowDOM &&
       mode != protocol::Overlay::InspectModeEnum::CaptureAreaScreenshot &&
       mode != protocol::Overlay::InspectModeEnum::ShowDistances) {
-    return Response::Error(
-        String("Unknown mode \"" + mode + "\" was provided."));
+    return Response::ServerError(
+        String("Unknown mode \"" + mode + "\" was provided.").Utf8());
   }
 
   std::vector<uint8_t> serialized_config;
@@ -1130,13 +1130,13 @@
   std::unique_ptr<InspectorHighlightConfig> config;
   Response response = HighlightConfigFromInspectorObject(
       std::move(highlight_inspector_object), &config);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   inspect_mode_.Set(mode);
   inspect_mode_protocol_config_.Set(serialized_config);
 
   PickTheRightTool();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorOverlayAgent::PickTheRightTool() {
@@ -1196,13 +1196,13 @@
     Maybe<protocol::Overlay::HighlightConfig> highlight_inspector_object,
     std::unique_ptr<InspectorHighlightConfig>* out_config) {
   if (!highlight_inspector_object.isJust()) {
-    return Response::Error(
+    return Response::ServerError(
         "Internal error: highlight configuration parameter is missing");
   }
   protocol::Overlay::HighlightConfig* config =
       highlight_inspector_object.fromJust();
   *out_config = InspectorOverlayAgent::ToHighlightConfig(config);
-  return Response::OK();
+  return Response::Success();
 }
 
 // static
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
index 7e3eef08..1ff765e 100644
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -522,7 +522,7 @@
 Response InspectorPageAgent::enable() {
   enabled_.Set(true);
   instrumenting_agents_->AddInspectorPageAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::disable() {
@@ -535,7 +535,7 @@
 
   stopScreencast();
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::addScriptToEvaluateOnNewDocument(
@@ -555,16 +555,16 @@
 
   scripts_to_evaluate_on_load_.Set(*identifier, source);
   worlds_to_evaluate_on_load_.Set(*identifier, world_name.fromMaybe(""));
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::removeScriptToEvaluateOnNewDocument(
     const String& identifier) {
   if (scripts_to_evaluate_on_load_.Get(identifier).IsNull())
-    return Response::Error("Script not found");
+    return Response::ServerError("Script not found");
   scripts_to_evaluate_on_load_.Clear(identifier);
   worlds_to_evaluate_on_load_.Clear(identifier);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::addScriptToEvaluateOnLoad(const String& source,
@@ -581,7 +581,7 @@
 Response InspectorPageAgent::setLifecycleEventsEnabled(bool enabled) {
   lifecycle_events_enabled_.Set(enabled);
   if (!enabled)
-    return Response::OK();
+    return Response::Success();
 
   for (LocalFrame* frame : *inspected_frames_) {
     Document* document = frame->GetDocument();
@@ -624,11 +624,11 @@
     }
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::setAdBlockingEnabled(bool enable) {
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::reload(
@@ -637,11 +637,11 @@
   pending_script_to_evaluate_on_load_once_ =
       optional_script_to_evaluate_on_load.fromMaybe("");
   v8_session_->setSkipAllPauses(true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::stopLoading() {
-  return Response::OK();
+  return Response::Success();
 }
 
 static void CachedResourcesForDocument(Document* document,
@@ -697,13 +697,13 @@
 Response InspectorPageAgent::getResourceTree(
     std::unique_ptr<protocol::Page::FrameResourceTree>* object) {
   *object = BuildObjectForResourceTree(inspected_frames_->Root());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::getFrameTree(
     std::unique_ptr<protocol::Page::FrameTree>* object) {
   *object = BuildObjectForFrameTree(inspected_frames_->Root());
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorPageAgent::GetResourceContentAfterResourcesContentLoaded(
@@ -713,17 +713,19 @@
   LocalFrame* frame =
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   if (!frame) {
-    callback->sendFailure(Response::Error("No frame for given id found"));
+    callback->sendFailure(Response::ServerError("No frame for given id found"));
     return;
   }
   String content;
   bool base64_encoded;
   if (InspectorPageAgent::CachedResourceContent(
           CachedResource(frame, KURL(url), inspector_resource_content_loader_),
-          &content, &base64_encoded))
+          &content, &base64_encoded)) {
     callback->sendSuccess(content, base64_encoded);
-  else
-    callback->sendFailure(Response::Error("No resource with given URL found"));
+  } else {
+    callback->sendFailure(
+        Response::ServerError("No resource with given URL found"));
+  }
 }
 
 void InspectorPageAgent::getResourceContent(
@@ -731,7 +733,7 @@
     const String& url,
     std::unique_ptr<GetResourceContentCallback> callback) {
   if (!enabled_.Get()) {
-    callback->sendFailure(Response::Error("Agent is not enabled."));
+    callback->sendFailure(Response::ServerError("Agent is not enabled."));
     return;
   }
   inspector_resource_content_loader_->EnsureResourcesContentLoaded(
@@ -752,7 +754,7 @@
   LocalFrame* frame =
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   if (!frame) {
-    callback->sendFailure(Response::Error("No frame for given id found"));
+    callback->sendFailure(Response::ServerError("No frame for given id found"));
     return;
   }
   String content;
@@ -760,7 +762,8 @@
   if (!InspectorPageAgent::CachedResourceContent(
           CachedResource(frame, KURL(url), inspector_resource_content_loader_),
           &content, &base64_encoded)) {
-    callback->sendFailure(Response::Error("No resource with given URL found"));
+    callback->sendFailure(
+        Response::ServerError("No resource with given URL found"));
     return;
   }
 
@@ -781,7 +784,7 @@
     Maybe<bool> optional_is_regex,
     std::unique_ptr<SearchInResourceCallback> callback) {
   if (!enabled_.Get()) {
-    callback->sendFailure(Response::Error("Agent is not enabled."));
+    callback->sendFailure(Response::ServerError("Agent is not enabled."));
     return;
   }
   inspector_resource_content_loader_->EnsureResourcesContentLoaded(
@@ -797,7 +800,7 @@
   LocalFrame* frame = inspected_frames_->Root();
   frame->GetSettings()->SetBypassCSP(enabled);
   bypass_csp_enabled_.Set(enabled);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::setDocumentContent(const String& frame_id,
@@ -805,13 +808,13 @@
   LocalFrame* frame =
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   if (!frame)
-    return Response::Error("No frame for given id found");
+    return Response::ServerError("No frame for given id found");
 
   Document* document = frame->GetDocument();
   if (!document)
-    return Response::Error("No Document instance to set HTML for");
+    return Response::ServerError("No Document instance to set HTML for");
   document->SetContent(html);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorPageAgent::DidNavigateWithinDocument(LocalFrame* frame) {
@@ -1159,12 +1162,12 @@
                                              Maybe<int> max_height,
                                              Maybe<int> every_nth_frame) {
   screencast_enabled_.Set(true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::stopScreencast() {
   screencast_enabled_.Set(false);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::getLayoutMetrics(
@@ -1221,7 +1224,7 @@
                              .setScale(scale)
                              .setZoom(page_zoom_factor)
                              .build();
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response InspectorPageAgent::createIsolatedWorld(
@@ -1232,19 +1235,19 @@
   LocalFrame* frame =
       IdentifiersFactory::FrameById(inspected_frames_, frame_id);
   if (!frame)
-    return Response::Error("No frame for given id found");
+    return Response::ServerError("No frame for given id found");
 
   scoped_refptr<DOMWrapperWorld> world = EnsureDOMWrapperWorld(
       frame, world_name.fromMaybe(""), grant_universal_access.fromMaybe(false));
   if (!world)
-    return Response::Error("Could not create isolated world");
+    return Response::ServerError("Could not create isolated world");
 
   LocalWindowProxy* isolated_world_window_proxy =
       frame->GetScriptController().WindowProxy(*world);
   v8::HandleScope handle_scope(V8PerIsolateData::MainThreadIsolate());
   *execution_context_id = v8_inspector::V8ContextInfo::executionContextId(
       isolated_world_window_proxy->ContextIfInitialized());
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::setFontFamilies(
@@ -1286,7 +1289,7 @@
     settings->NotifyGenericFontFamilyChange();
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::setFontSizes(
@@ -1304,7 +1307,7 @@
     }
   }
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorPageAgent::ConsumeCompilationCache(
@@ -1366,28 +1369,28 @@
 
 Response InspectorPageAgent::setProduceCompilationCache(bool enabled) {
   produce_compilation_cache_.Set(enabled);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::addCompilationCache(const String& url,
                                                  const protocol::Binary& data) {
   compilation_cache_.Set(url, data);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::clearCompilationCache() {
   compilation_cache_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::waitForDebugger() {
   client_->WaitForDebugger();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::setInterceptFileChooserDialog(bool enabled) {
   intercept_file_chooser_ = enabled;
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorPageAgent::generateTestReport(const String& message,
@@ -1402,7 +1405,7 @@
   // Send the test report to any ReportingObservers.
   ReportingContext::From(window)->QueueReport(report);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorPageAgent::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc b/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc
index b6c37a4..cff050c 100644
--- a/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_performance_agent.cc
@@ -68,29 +68,29 @@
   String time_domain = optional_time_domain.fromMaybe(TimeDomain::TimeTicks);
   if (enabled_.Get()) {
     if (!HasTimeDomain(time_domain)) {
-      return Response::Error(
+      return Response::ServerError(
           "Cannot change time domain while performance metrics collection is "
           "enabled.");
     }
-    return Response::OK();
+    return Response::Success();
   }
 
   Response response = InnerSetTimeDomain(time_domain);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   enabled_.Set(true);
   InnerEnable();
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response InspectorPerformanceAgent::disable() {
   if (!enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Clear();
   instrumenting_agents_->RemoveInspectorPerformanceAgent(this);
   Thread::Current()->RemoveTaskTimeObserver(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 namespace {
@@ -107,7 +107,7 @@
 // TODO(crbug.com/1056306): remove this redundant API.
 Response InspectorPerformanceAgent::setTimeDomain(const String& time_domain) {
   if (enabled_.Get()) {
-    return Response::Error(
+    return Response::ServerError(
         "Cannot set time domain while performance metrics collection"
         " is enabled.");
   }
@@ -141,18 +141,20 @@
 
   if (time_domain == TimeDomain::TimeTicks) {
     use_thread_ticks_.Clear();
-    return Response::OK();
+    return Response::Success();
   }
 
   if (time_domain == TimeDomain::ThreadTicks) {
-    if (!base::ThreadTicks::IsSupported())
-      return Response::Error("Thread time is not supported on this platform.");
+    if (!base::ThreadTicks::IsSupported()) {
+      return Response::ServerError(
+          "Thread time is not supported on this platform.");
+    }
     base::ThreadTicks::WaitUntilInitialized();
     use_thread_ticks_.Set(true);
-    return Response::OK();
+    return Response::Success();
   }
 
-  return Response::Error("Invalid time domain specification.");
+  return Response::ServerError("Invalid time domain specification.");
 }
 
 Response InspectorPerformanceAgent::getMetrics(
@@ -161,7 +163,7 @@
   if (!enabled_.Get()) {
     *out_result =
         std::make_unique<protocol::Array<protocol::Performance::Metric>>();
-    return Response::OK();
+    return Response::Success();
   }
 
   auto result =
@@ -248,7 +250,7 @@
   }
 
   *out_result = std::move(result);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorPerformanceAgent::ConsoleTimeStamp(const String& title) {
diff --git a/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.cc b/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.cc
index dbc44a0..8970aaf50 100644
--- a/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.cc
+++ b/third_party/blink/renderer/core/inspector/legacy_dom_snapshot_agent.cc
@@ -145,7 +145,7 @@
   computed_styles_map_.reset();
   css_property_filter_.reset();
   paint_order_map_.reset();
-  return Response::OK();
+  return Response::Success();
 }
 
 int LegacyDOMSnapshotAgent::VisitNode(Node* node,
diff --git a/third_party/blink/renderer/core/inspector/v8_inspector_string.h b/third_party/blink/renderer/core/inspector/v8_inspector_string.h
index 70624ff..e72d470 100644
--- a/third_party/blink/renderer/core/inspector/v8_inspector_string.h
+++ b/third_party/blink/renderer/core/inspector/v8_inspector_string.h
@@ -39,18 +39,6 @@
   STATIC_ONLY(StringUtil);
 
  public:
-  static String substring(const String& s, size_t pos, size_t len) {
-    return s.Substring(static_cast<wtf_size_t>(pos),
-                       static_cast<wtf_size_t>(len));
-  }
-  static size_t find(const String& s, const char* needle) {
-    return s.Find(needle);
-  }
-  static size_t find(const String& s, const String& needle) {
-    return s.Find(needle);
-  }
-  static const size_t kNotFound = WTF::kNotFound;
-
   static String fromUTF8(const uint8_t* data, size_t length) {
     return String::FromUTF8(reinterpret_cast<const char*>(data), length);
   }
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
index 7527e93..586abe8f 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.cc
@@ -335,6 +335,9 @@
               .Inverse();
       intersection_rect_ = PhysicalRect::EnclosingRect(
           matrix.ProjectQuad(FloatRect(intersection_rect_)).BoundingBox());
+      unclipped_intersection_rect_ = PhysicalRect::EnclosingRect(
+          matrix.ProjectQuad(FloatRect(unclipped_intersection_rect_))
+              .BoundingBox());
       // intersection_rect_ is in the coordinate system of the implicit root;
       // map it down the to absolute coordinates for the target's document.
     } else {
@@ -345,6 +348,10 @@
           root_geometry.root_to_document_transform
               .MapQuad(FloatQuad(FloatRect(intersection_rect_)))
               .BoundingBox());
+      unclipped_intersection_rect_ = PhysicalRect::EnclosingRect(
+          root_geometry.root_to_document_transform
+              .MapQuad(FloatQuad(FloatRect(unclipped_intersection_rect_)))
+              .BoundingBox());
     }
   } else {
     intersection_rect_ = PhysicalRect();
diff --git a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
index 854c98c..35e33f4 100644
--- a/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
+++ b/third_party/blink/renderer/core/intersection_observer/intersection_geometry.h
@@ -100,9 +100,6 @@
 
   PhysicalRect TargetRect() const { return target_rect_; }
   PhysicalRect IntersectionRect() const { return intersection_rect_; }
-
-  // The intersection rect without applying viewport clipping in the coordinate
-  // system of the root's viewport.
   PhysicalRect UnclippedIntersectionRect() const {
     return unclipped_intersection_rect_;
   }
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc
index 723cd13..c17f250 100644
--- a/third_party/blink/renderer/core/layout/layout_block.cc
+++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -1457,11 +1457,8 @@
 }
 
 DISABLE_CFI_PERF
-void LayoutBlock::ComputePreferredLogicalWidths() {
-  DCHECK(IntrinsicLogicalWidthsDirty());
-
-  min_preferred_logical_width_ = LayoutUnit();
-  max_preferred_logical_width_ = LayoutUnit();
+MinMaxSizes LayoutBlock::PreferredLogicalWidths() const {
+  MinMaxSizes sizes;
 
   // FIXME: The isFixed() calls here should probably be checking for isSpecified
   // since you should be able to use percentage, calc or viewport relative
@@ -1471,48 +1468,31 @@
       style_to_use.LogicalWidth().Value() >= 0 &&
       !(IsFlexItemCommon() && Parent()->StyleRef().IsDeprecatedWebkitBox() &&
         !style_to_use.LogicalWidth().IntValue())) {
-    min_preferred_logical_width_ = max_preferred_logical_width_ =
-        AdjustBorderBoxLogicalWidthForBoxSizing(
-            LayoutUnit(style_to_use.LogicalWidth().Value()));
+    sizes = AdjustBorderBoxLogicalWidthForBoxSizing(
+        LayoutUnit(style_to_use.LogicalWidth().Value()));
   } else {
-    MinMaxSizes sizes = ComputeIntrinsicLogicalWidths();
-    min_preferred_logical_width_ = sizes.min_size;
-    max_preferred_logical_width_ = sizes.max_size;
+    sizes = IntrinsicLogicalWidths();
   }
 
   if (style_to_use.LogicalMaxWidth().IsFixed()) {
-    max_preferred_logical_width_ =
-        std::min(max_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     LayoutUnit(style_to_use.LogicalMaxWidth().Value())));
-    min_preferred_logical_width_ =
-        std::min(min_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     LayoutUnit(style_to_use.LogicalMaxWidth().Value())));
+    sizes.Constrain(AdjustBorderBoxLogicalWidthForBoxSizing(
+        LayoutUnit(style_to_use.LogicalMaxWidth().Value())));
   }
 
   if (style_to_use.LogicalMinWidth().IsFixed() &&
       style_to_use.LogicalMinWidth().Value() > 0) {
-    max_preferred_logical_width_ =
-        std::max(max_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     LayoutUnit(style_to_use.LogicalMinWidth().Value())));
-    min_preferred_logical_width_ =
-        std::max(min_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     LayoutUnit(style_to_use.LogicalMinWidth().Value())));
+    sizes.Encompass(AdjustBorderBoxLogicalWidthForBoxSizing(
+        LayoutUnit(style_to_use.LogicalMinWidth().Value())));
   }
 
   // Table layout uses integers, ceil the preferred widths to ensure that they
   // can contain the contents.
   if (IsTableCell()) {
-    min_preferred_logical_width_ =
-        LayoutUnit(min_preferred_logical_width_.Ceil());
-    max_preferred_logical_width_ =
-        LayoutUnit(max_preferred_logical_width_.Ceil());
+    sizes.min_size = LayoutUnit(sizes.min_size.Ceil());
+    sizes.max_size = LayoutUnit(sizes.max_size.Ceil());
   }
 
-  ClearIntrinsicLogicalWidthsDirty();
+  return sizes;
 }
 
 void LayoutBlock::ComputeBlockPreferredLogicalWidths(
diff --git a/third_party/blink/renderer/core/layout/layout_block.h b/third_party/blink/renderer/core/layout/layout_block.h
index 2fdf8406..68f1621 100644
--- a/third_party/blink/renderer/core/layout/layout_block.h
+++ b/third_party/blink/renderer/core/layout/layout_block.h
@@ -399,6 +399,7 @@
   virtual void PaintChildren(const PaintInfo&,
                              const PhysicalOffset& paint_offset) const;
   void UpdateAfterLayout() override;
+  MinMaxSizes PreferredLogicalWidths() const override;
 
  protected:
   virtual void AdjustInlineDirectionLineBounds(
@@ -407,7 +408,6 @@
       LayoutUnit& /* logicalWidth */) const {}
 
   MinMaxSizes ComputeIntrinsicLogicalWidths() const override;
-  void ComputePreferredLogicalWidths() override;
   void ComputeChildPreferredLogicalWidths(
       LayoutObject& child,
       LayoutUnit& min_preferred_logical_width,
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 52d0bae..69ad9cf 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -116,7 +116,8 @@
   LayoutSize previous_size;
   LayoutUnit intrinsic_content_logical_height;
   LayoutRectOutsets margin_box_outsets;
-  LayoutUnit preferred_logical_width[2];
+  MinMaxSizes intrinsic_logical_widths;
+  LayoutUnit intrinsic_logical_widths_percentage_resolution_block_size;
   void* pointers[4];
   Persistent<void*> rare_data;
   Vector<scoped_refptr<const NGLayoutResult>, 1> layout_results;
@@ -254,8 +255,8 @@
 LayoutBox::LayoutBox(ContainerNode* node)
     : LayoutBoxModelObject(node),
       intrinsic_content_logical_height_(-1),
-      min_preferred_logical_width_(-1),
-      max_preferred_logical_width_(-1),
+      intrinsic_logical_widths_percentage_resolution_block_size_(
+          LayoutUnit::Min()),
       inline_box_wrapper_(nullptr) {
   SetIsBox();
   if (blink::IsA<HTMLLegendElement>(node))
@@ -1488,22 +1489,23 @@
   return does_intersect;
 }
 
-MinMaxSizes LayoutBox::ComputeIntrinsicLogicalWidths() const {
-  return PreferredLogicalWidths();
+MinMaxSizes LayoutBox::PreferredLogicalWidths() const {
+  NOTREACHED();
+  return MinMaxSizes();
 }
 
-DISABLE_CFI_PERF
-MinMaxSizes LayoutBox::PreferredLogicalWidths() const {
-  if (IntrinsicLogicalWidthsDirty()) {
-#if DCHECK_IS_ON()
-    SetLayoutNeededForbiddenScope layout_forbidden_scope(
-        const_cast<LayoutBox&>(*this));
-#endif
-    const_cast<LayoutBox*>(this)->ComputePreferredLogicalWidths();
-    DCHECK(!IntrinsicLogicalWidthsDirty());
-  }
+void LayoutBox::UpdateCachedIntrinsicLogicalWidthsIfNeeded() {
+  if (!IntrinsicLogicalWidthsDirty())
+    return;
 
-  return {min_preferred_logical_width_, max_preferred_logical_width_};
+#if DCHECK_IS_ON()
+  SetLayoutNeededForbiddenScope layout_forbidden_scope(*this);
+#endif
+
+  intrinsic_logical_widths_ = ComputeIntrinsicLogicalWidths();
+  intrinsic_logical_widths_percentage_resolution_block_size_ =
+      LayoutUnit::Min();
+  ClearIntrinsicLogicalWidthsDirty();
 }
 
 LayoutUnit LayoutBox::OverrideLogicalWidth() const {
@@ -3127,10 +3129,10 @@
 
       // Since all this takes place during actual layout, instead of being part
       // of min/max the width calculation machinery, we need to enter said
-      // machinery here, to make sure that what was dirtied is actualy
+      // machinery here, to make sure that what was dirtied is actually
       // recalculated. Leaving things dirty would mean that any subsequent
       // dirtying of descendants would fail.
-      ComputePreferredLogicalWidths();
+      UpdateCachedIntrinsicLogicalWidthsIfNeeded();
     }
   }
 
@@ -3340,7 +3342,7 @@
                     FillAvailableMeasure(available_logical_width));
   }
 
-  MinMaxSizes sizes = ComputeIntrinsicLogicalWidths();
+  MinMaxSizes sizes = IntrinsicLogicalWidths();
 
   if (logical_width_length.IsMinContent())
     return sizes.min_size;
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index a3fe509..2302119c 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -801,6 +801,10 @@
                    const PhysicalOffset& accumulated_offset,
                    HitTestAction) override;
 
+  // This function calculates the preferred widths for an object.
+  //
+  // See INTRINSIC SIZES / PREFERRED LOGICAL WIDTHS in layout_object.h for more
+  // details about those widths.
   MinMaxSizes PreferredLogicalWidths() const override;
 
   LayoutUnit OverrideLogicalHeight() const;
@@ -1578,33 +1582,8 @@
                : PhysicalRect(PhysicalOffset(), PreviousSize());
   }
 
-  // This function calculates the preferred widths for an object.
-  //
-  // This function is only expected to be called if
-  // the boolean preferredLogicalWidthsDirty is true. It also MUST clear the
-  // boolean before returning.
-  //
-  // See INTRINSIC SIZES / PREFERRED LOGICAL WIDTHS in layout_object.h for more
-  // details about those widths.
-  //
-  // This function is public only for use by LayoutNG. Other callers should go
-  // through PreferredLogicalWidths.
-  virtual void ComputePreferredLogicalWidths() {
-    ClearIntrinsicLogicalWidthsDirty();
-  }
-
-  // LayoutNG can use this function to update our cache of preferred logical
-  // widths when the layout object is managed by NG. Should not be called by
-  // regular code.
-  // Also clears the "dirty" flag for preferred widths.
-  void SetPreferredLogicalWidthsFromNG(MinMaxSizes sizes) {
-    min_preferred_logical_width_ = sizes.min_size;
-    max_preferred_logical_width_ = sizes.max_size;
-    ClearIntrinsicLogicalWidthsDirty();
-  }
-
-  // Calculates the intrinsic(https://drafts.csswg.org/css-sizing-3/#intrinsic)
-  // logical widths for this layout box.
+  // Calculates the intrinsic logical widths for this layout box.
+  // https://drafts.csswg.org/css-sizing-3/#intrinsic
   //
   // intrinsicWidth is defined as:
   //     intrinsic size of content (with our border and padding) +
@@ -1615,7 +1594,41 @@
   //     Note: fixedWidth includes border and padding and scrollbarWidth.
   //
   // This is public only for use by LayoutNG. Do not call this elsewhere.
-  virtual MinMaxSizes ComputeIntrinsicLogicalWidths() const;
+  virtual MinMaxSizes ComputeIntrinsicLogicalWidths() const = 0;
+
+  // Returns the (maybe cached) intrinsic logical widths for this layout box.
+  MinMaxSizes IntrinsicLogicalWidths() const {
+    const_cast<LayoutBox*>(this)->UpdateCachedIntrinsicLogicalWidthsIfNeeded();
+    return intrinsic_logical_widths_;
+  }
+
+  // If |IntrinsicLogicalWidthsDirty()| is true, recalculates the intrinsic
+  // logical widths.
+  void UpdateCachedIntrinsicLogicalWidthsIfNeeded();
+
+  // LayoutNG can use this function to update our cache of intrinsic logical
+  // widths when the layout object is managed by NG. Should not be called by
+  // regular code.
+  //
+  // Also clears the "dirty" flag for the intrinsic logical widths.
+  void SetIntrinsicLogicalWidthsFromNG(
+      const MinMaxSizes& sizes,
+      LayoutUnit intrinsic_logical_widths_percentage_resolution_block_size) {
+    intrinsic_logical_widths_ = sizes;
+    intrinsic_logical_widths_percentage_resolution_block_size_ =
+        intrinsic_logical_widths_percentage_resolution_block_size;
+
+    ClearIntrinsicLogicalWidthsDirty();
+  }
+
+  // Returns what %-resolution-block-size was used in the intrinsic logical
+  // widths phase.
+  //
+  // For non-LayoutNG code this is always LayoutUnit::Min(), and should not be
+  // used for caching purposes.
+  LayoutUnit IntrinsicLogicalWidthsPercentageResolutionBlockSize() const {
+    return intrinsic_logical_widths_percentage_resolution_block_size_;
+  }
 
   // Make it public.
   using LayoutObject::BackgroundIsKnownToBeObscured;
@@ -1858,16 +1871,8 @@
   mutable LayoutUnit intrinsic_content_logical_height_;
 
  protected:
-  // The logical width of the element if it were to break its lines at every
-  // possible opportunity.
-  //
-  // See LayoutObject::PreferredLogicalWidths() for more details.
-  LayoutUnit min_preferred_logical_width_;
-
-  // The logical width of the element if it never breaks any lines at all.
-  //
-  // See LayoutObject::PreferredLogicalWidths() for more details.
-  LayoutUnit max_preferred_logical_width_;
+  MinMaxSizes intrinsic_logical_widths_;
+  LayoutUnit intrinsic_logical_widths_percentage_resolution_block_size_;
 
   // LayoutBoxUtils is used for the LayoutNG code querying protected methods on
   // this class, e.g. determining the static-position of OOF elements.
diff --git a/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc b/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc
index 7ce9127..e44c695 100644
--- a/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc
+++ b/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.cc
@@ -211,13 +211,8 @@
           .Round()));
 }
 
-void LayoutCustomScrollbarPart::ComputePreferredLogicalWidths() {
-  if (!IntrinsicLogicalWidthsDirty())
-    return;
-
-  min_preferred_logical_width_ = max_preferred_logical_width_ = LayoutUnit();
-
-  ClearIntrinsicLogicalWidthsDirty();
+MinMaxSizes LayoutCustomScrollbarPart::PreferredLogicalWidths() const {
+  return MinMaxSizes();
 }
 
 void LayoutCustomScrollbarPart::StyleWillChange(
diff --git a/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.h b/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.h
index c684866..dd1f0ca 100644
--- a/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.h
+++ b/third_party/blink/renderer/core/layout/layout_custom_scrollbar_part.h
@@ -83,7 +83,7 @@
  private:
   LayoutCustomScrollbarPart(ScrollableArea*, CustomScrollbar*, ScrollbarPart);
 
-  void ComputePreferredLogicalWidths() override;
+  MinMaxSizes PreferredLogicalWidths() const override;
 
   // Have all padding getters return 0. The important point here is to avoid
   // resolving percents against the containing block, since scroll bar corners
diff --git a/third_party/blink/renderer/core/layout/layout_fieldset.cc b/third_party/blink/renderer/core/layout/layout_fieldset.cc
index 82cc985..7fba1ae5 100644
--- a/third_party/blink/renderer/core/layout/layout_fieldset.cc
+++ b/third_party/blink/renderer/core/layout/layout_fieldset.cc
@@ -32,11 +32,11 @@
 
 LayoutFieldset::LayoutFieldset(Element* element) : LayoutBlockFlow(element) {}
 
-void LayoutFieldset::ComputePreferredLogicalWidths() {
-  LayoutBlockFlow::ComputePreferredLogicalWidths();
+MinMaxSizes LayoutFieldset::PreferredLogicalWidths() const {
+  MinMaxSizes sizes = LayoutBlockFlow::PreferredLogicalWidths();
   // Size-contained elements don't consider their contents for preferred sizing.
   if (ShouldApplySizeContainment())
-    return;
+    return sizes;
 
   if (LayoutBox* legend = FindInFlowLegend()) {
     int legend_min_width = legend->PreferredLogicalWidths().min_size.ToInt();
@@ -50,10 +50,11 @@
     if (legend_margin_right.IsFixed())
       legend_min_width += legend_margin_right.Value();
 
-    min_preferred_logical_width_ =
-        max(min_preferred_logical_width_,
-            legend_min_width + BorderAndPaddingWidth());
+    sizes.min_size =
+        max(sizes.min_size, legend_min_width + BorderAndPaddingWidth());
   }
+
+  return sizes;
 }
 
 LayoutObject* LayoutFieldset::LayoutSpecialExcludedChild(bool relayout_children,
diff --git a/third_party/blink/renderer/core/layout/layout_fieldset.h b/third_party/blink/renderer/core/layout/layout_fieldset.h
index 63b37548..e5edff1 100644
--- a/third_party/blink/renderer/core/layout/layout_fieldset.h
+++ b/third_party/blink/renderer/core/layout/layout_fieldset.h
@@ -49,7 +49,7 @@
   LayoutObject* LayoutSpecialExcludedChild(bool relayout_children,
                                            SubtreeLayoutScope&) override;
 
-  void ComputePreferredLogicalWidths() override;
+  MinMaxSizes PreferredLogicalWidths() const override;
 
   void PaintBoxDecorationBackground(
       const PaintInfo&,
diff --git a/third_party/blink/renderer/core/layout/layout_frame_set.cc b/third_party/blink/renderer/core/layout/layout_frame_set.cc
index 9bcaf32..fc00cf0c 100644
--- a/third_party/blink/renderer/core/layout/layout_frame_set.cc
+++ b/third_party/blink/renderer/core/layout/layout_frame_set.cc
@@ -65,12 +65,6 @@
   FrameSetPainter(*this).Paint(paint_info);
 }
 
-void LayoutFrameSet::ComputePreferredLogicalWidths() {
-  min_preferred_logical_width_ = LayoutUnit();
-  max_preferred_logical_width_ = LayoutUnit();
-  ClearIntrinsicLogicalWidthsDirty();
-}
-
 void LayoutFrameSet::GridAxis::Resize(int size) {
   sizes_.resize(size);
   deltas_.resize(size);
diff --git a/third_party/blink/renderer/core/layout/layout_frame_set.h b/third_party/blink/renderer/core/layout/layout_frame_set.h
index 2fc5276..6c9aae4 100644
--- a/third_party/blink/renderer/core/layout/layout_frame_set.h
+++ b/third_party/blink/renderer/core/layout/layout_frame_set.h
@@ -132,7 +132,13 @@
 
   void UpdateLayout() override;
   void Paint(const PaintInfo&) const override;
-  void ComputePreferredLogicalWidths() override;
+
+  MinMaxSizes PreferredLogicalWidths() const override { return MinMaxSizes(); }
+  MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
+    NOTREACHED();
+    return MinMaxSizes();
+  }
+
   bool IsChildAllowed(LayoutObject*, const ComputedStyle&) const override;
   CursorDirective GetCursor(const PhysicalOffset&, ui::Cursor&) const override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index b039428..f7dcb12 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -1081,7 +1081,7 @@
           accumulated_offset + item.OffsetInContainerBlock();
       if (NGBoxFragmentPainter(cursor, item, *box_fragment)
               .NodeAtPoint(result, hit_test_location, child_offset,
-                           hit_test_action))
+                           accumulated_offset, hit_test_action))
         return true;
     }
     return false;
diff --git a/third_party/blink/renderer/core/layout/layout_list_marker.cc b/third_party/blink/renderer/core/layout/layout_list_marker.cc
index 0bdf9c7..0425425 100644
--- a/third_party/blink/renderer/core/layout/layout_list_marker.cc
+++ b/third_party/blink/renderer/core/layout/layout_list_marker.cc
@@ -230,6 +230,7 @@
 }
 
 MinMaxSizes LayoutListMarker::ComputeIntrinsicLogicalWidths() const {
+  DCHECK(IntrinsicLogicalWidthsDirty());
   const_cast<LayoutListMarker*>(this)->UpdateContent();
 
   MinMaxSizes sizes;
@@ -256,12 +257,8 @@
   return sizes;
 }
 
-void LayoutListMarker::ComputePreferredLogicalWidths() {
-  DCHECK(IntrinsicLogicalWidthsDirty());
-  MinMaxSizes sizes = ComputeIntrinsicLogicalWidths();
-  min_preferred_logical_width_ = sizes.min_size;
-  max_preferred_logical_width_ = sizes.max_size;
-  ClearIntrinsicLogicalWidthsDirty();
+MinMaxSizes LayoutListMarker::PreferredLogicalWidths() const {
+  return IntrinsicLogicalWidths();
 }
 
 LayoutUnit LayoutListMarker::WidthOfSymbol(const ComputedStyle& style) {
diff --git a/third_party/blink/renderer/core/layout/layout_list_marker.h b/third_party/blink/renderer/core/layout/layout_list_marker.h
index 4056eb7..1fee564 100644
--- a/third_party/blink/renderer/core/layout/layout_list_marker.h
+++ b/third_party/blink/renderer/core/layout/layout_list_marker.h
@@ -79,7 +79,7 @@
 
  private:
   MinMaxSizes ComputeIntrinsicLogicalWidths() const override;
-  void ComputePreferredLogicalWidths() override;
+  MinMaxSizes PreferredLogicalWidths() const override;
 
   void Paint(const PaintInfo&) const override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
index a97d180a..2c6e4fc 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.cc
@@ -1332,7 +1332,7 @@
   }
 }
 
-void LayoutMultiColumnFlowThread::ComputePreferredLogicalWidths() {
+MinMaxSizes LayoutMultiColumnFlowThread::PreferredLogicalWidths() const {
   // The min/max intrinsic widths calculated really tell how much space elements
   // need when laid out inside the columns. In order to eventually end up with
   // the desired column width, we need to convert them to values pertaining to
@@ -1343,28 +1343,22 @@
       multicol_style->HasAutoColumnCount() ? 1 : multicol_style->ColumnCount());
   LayoutUnit gap_extra((column_count - 1) *
                        ColumnGap(*multicol_style, LayoutUnit()));
+  MinMaxSizes sizes;
 
   if (flow->HasOverrideIntrinsicContentLogicalWidth()) {
-    min_preferred_logical_width_ = max_preferred_logical_width_ =
-        flow->OverrideIntrinsicContentLogicalWidth();
-    ClearIntrinsicLogicalWidthsDirty();
+    sizes = flow->OverrideIntrinsicContentLogicalWidth();
   } else if (flow->ShouldApplySizeContainment()) {
-    min_preferred_logical_width_ = max_preferred_logical_width_ = LayoutUnit();
-    ClearIntrinsicLogicalWidthsDirty();
+    sizes = LayoutUnit();
   } else {
-    // Calculate and set new min_preferred_logical_width_ and
-    // max_preferred_logical_width_.
-    LayoutFlowThread::ComputePreferredLogicalWidths();
+    sizes = LayoutFlowThread::PreferredLogicalWidths();
   }
 
   LayoutUnit column_width;
   if (multicol_style->HasAutoColumnWidth()) {
-    min_preferred_logical_width_ =
-        min_preferred_logical_width_ * column_count + gap_extra;
+    sizes.min_size = sizes.min_size * column_count + gap_extra;
   } else {
     column_width = LayoutUnit(multicol_style->ColumnWidth());
-    min_preferred_logical_width_ =
-        std::min(min_preferred_logical_width_, column_width);
+    sizes.min_size = std::min(sizes.min_size, column_width);
   }
   // Note that if column-count is auto here, we should resolve it to calculate
   // the maximum intrinsic width, instead of pretending that it's 1. The only
@@ -1372,9 +1366,9 @@
   // appropriate time or place for layout. The good news is that if height is
   // unconstrained and there are no explicit breaks, the resolved column-count
   // really should be 1.
-  max_preferred_logical_width_ =
-      std::max(max_preferred_logical_width_, column_width) * column_count +
-      gap_extra;
+  sizes.max_size =
+      std::max(sizes.max_size, column_width) * column_count + gap_extra;
+  return sizes;
 }
 
 void LayoutMultiColumnFlowThread::ComputeLogicalHeight(
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h
index e051887..e09739b 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h
@@ -317,7 +317,7 @@
       StyleDifference,
       const ComputedStyle& old_style) override;
   void ToggleSpannersInSubtree(LayoutBox*);
-  void ComputePreferredLogicalWidths() override;
+  MinMaxSizes PreferredLogicalWidths() const override;
   void ComputeLogicalHeight(LayoutUnit logical_height,
                             LayoutUnit logical_top,
                             LogicalExtentComputedValues&) const final;
diff --git a/third_party/blink/renderer/core/layout/layout_multi_column_spanner_placeholder.h b/third_party/blink/renderer/core/layout/layout_multi_column_spanner_placeholder.h
index 79ea673..a2575a39 100644
--- a/third_party/blink/renderer/core/layout/layout_multi_column_spanner_placeholder.h
+++ b/third_party/blink/renderer/core/layout/layout_multi_column_spanner_placeholder.h
@@ -74,6 +74,11 @@
  private:
   LayoutMultiColumnSpannerPlaceholder(LayoutBox*);
 
+  MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
+    NOTREACHED();
+    return MinMaxSizes();
+  }
+
   // The actual column-span:all layoutObject inside the flow thread.
   LayoutBox* layout_object_in_flow_thread_;
 };
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc
index 9d5ec09..2348987 100644
--- a/third_party/blink/renderer/core/layout/layout_replaced.cc
+++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -899,8 +899,8 @@
   return sizes;
 }
 
-void LayoutReplaced::ComputePreferredLogicalWidths() {
-  DCHECK(IntrinsicLogicalWidthsDirty());
+MinMaxSizes LayoutReplaced::PreferredLogicalWidths() const {
+  MinMaxSizes sizes;
 
   // We cannot resolve some logical width here (i.e. percent, fill-available or
   // fit-content) as the available logical width may not be set on our
@@ -908,48 +908,30 @@
   const Length& logical_width = StyleRef().LogicalWidth();
   if (logical_width.IsPercentOrCalc() || logical_width.IsFillAvailable() ||
       logical_width.IsFitContent()) {
-    MinMaxSizes sizes = ComputeIntrinsicLogicalWidths();
+    sizes = IntrinsicLogicalWidths();
     sizes -= BorderAndPaddingLogicalWidth();
-    min_preferred_logical_width_ = sizes.min_size;
-    max_preferred_logical_width_ = sizes.max_size;
   } else {
-    min_preferred_logical_width_ = max_preferred_logical_width_ =
-        ComputeReplacedLogicalWidth(kComputePreferred);
+    sizes = ComputeReplacedLogicalWidth(kComputePreferred);
   }
 
   const ComputedStyle& style_to_use = StyleRef();
   if (style_to_use.LogicalWidth().IsPercentOrCalc() ||
       style_to_use.LogicalMaxWidth().IsPercentOrCalc())
-    min_preferred_logical_width_ = LayoutUnit();
+    sizes.min_size = LayoutUnit();
 
   if (style_to_use.LogicalMinWidth().IsFixed() &&
       style_to_use.LogicalMinWidth().Value() > 0) {
-    max_preferred_logical_width_ =
-        std::max(max_preferred_logical_width_,
-                 AdjustContentBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMinWidth().Value()));
-    min_preferred_logical_width_ =
-        std::max(min_preferred_logical_width_,
-                 AdjustContentBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMinWidth().Value()));
+    sizes.Encompass(AdjustContentBoxLogicalWidthForBoxSizing(
+        style_to_use.LogicalMinWidth().Value()));
   }
 
   if (style_to_use.LogicalMaxWidth().IsFixed()) {
-    max_preferred_logical_width_ =
-        std::min(max_preferred_logical_width_,
-                 AdjustContentBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMaxWidth().Value()));
-    min_preferred_logical_width_ =
-        std::min(min_preferred_logical_width_,
-                 AdjustContentBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMaxWidth().Value()));
+    sizes.Constrain(AdjustContentBoxLogicalWidthForBoxSizing(
+        style_to_use.LogicalMaxWidth().Value()));
   }
 
-  LayoutUnit border_and_padding = BorderAndPaddingLogicalWidth();
-  min_preferred_logical_width_ += border_and_padding;
-  max_preferred_logical_width_ += border_and_padding;
-
-  ClearIntrinsicLogicalWidthsDirty();
+  sizes += BorderAndPaddingLogicalWidth();
+  return sizes;
 }
 
 static std::pair<LayoutUnit, LayoutUnit> SelectionTopAndBottom(
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.h b/third_party/blink/renderer/core/layout/layout_replaced.h
index 8fc5c57..d501a40 100644
--- a/third_party/blink/renderer/core/layout/layout_replaced.h
+++ b/third_party/blink/renderer/core/layout/layout_replaced.h
@@ -158,7 +158,7 @@
   }
 
  private:
-  void ComputePreferredLogicalWidths() final;
+  MinMaxSizes PreferredLogicalWidths() const final;
 
   void ComputeIntrinsicSizingInfoForReplacedContent(IntrinsicSizingInfo&) const;
   FloatSize ConstrainIntrinsicSizeToMinMax(const IntrinsicSizingInfo&) const;
diff --git a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
index 234de55..20ab99f7 100644
--- a/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
+++ b/third_party/blink/renderer/core/layout/layout_shift_tracker.cc
@@ -219,14 +219,9 @@
   region_.AddRect(visible_old_rect);
   region_.AddRect(visible_new_rect);
 
-  bool should_trace_nodes;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(
-      TRACE_DISABLED_BY_DEFAULT("layout_shift.debug"), &should_trace_nodes);
-  if (should_trace_nodes) {
-    if (Node* node = source.GetNode()) {
-      MaybeRecordAttribution(
-          {DOMNodeIds::IdForNode(node), visible_old_rect, visible_new_rect});
-    }
+  if (Node* node = source.GetNode()) {
+    MaybeRecordAttribution(
+        {DOMNodeIds::IdForNode(node), visible_old_rect, visible_new_rect});
   }
 }
 
@@ -501,12 +496,20 @@
   if (!*it)
     return;
 
+  bool should_include_names;
+  TRACE_EVENT_CATEGORY_GROUP_ENABLED(
+      TRACE_DISABLED_BY_DEFAULT("layout_shift.debug"), &should_include_names);
+
   value.BeginArray("impacted_nodes");
   while (it != attributions_.end() && it->node_id != kInvalidDOMNodeId) {
     value.BeginDictionary();
     value.SetInteger("node_id", it->node_id);
     RectToTracedValue(it->old_visual_rect, value, "old_rect");
     RectToTracedValue(it->new_visual_rect, value, "new_rect");
+    if (should_include_names) {
+      Node* node = DOMNodeIds::NodeForId(it->node_id);
+      value.SetString("debug_name", node ? node->DebugName() : "");
+    }
     value.EndDictionary();
     it++;
   }
diff --git a/third_party/blink/renderer/core/layout/layout_table.cc b/third_party/blink/renderer/core/layout/layout_table.cc
index c42018d..2b41ff4 100644
--- a/third_party/blink/renderer/core/layout/layout_table.cc
+++ b/third_party/blink/renderer/core/layout/layout_table.cc
@@ -310,11 +310,10 @@
 void LayoutTable::UpdateLogicalWidth() {
   RecalcSectionsIfNeeded();
 
-  // Recalculate preferred logical widths now, rather than relying on them being
-  // lazily recalculated, via PreferredLogicalWidths() further below. We might
-  // not even get there.
-  if (IntrinsicLogicalWidthsDirty())
-    ComputePreferredLogicalWidths();
+  // Recalculate the intrinsic logical widths now, rather than relying on them
+  // being lazily recalculated, via PreferredLogicalWidths() further below. We
+  // might not even get there.
+  UpdateCachedIntrinsicLogicalWidthsIfNeeded();
 
   if (IsFlexItemIncludingDeprecatedAndNG() || IsGridItem()) {
     // TODO(jfernandez): Investigate whether the grid layout algorithm provides
@@ -1105,24 +1104,16 @@
   return sizes;
 }
 
-void LayoutTable::ComputePreferredLogicalWidths() {
-  DCHECK(IntrinsicLogicalWidthsDirty());
-
-  MinMaxSizes sizes = ComputeIntrinsicLogicalWidths();
+MinMaxSizes LayoutTable::PreferredLogicalWidths() const {
+  MinMaxSizes sizes = IntrinsicLogicalWidths();
 
   table_layout_->ApplyPreferredLogicalWidthQuirks(sizes.min_size,
                                                   sizes.max_size);
-  min_preferred_logical_width_ = sizes.min_size;
-  max_preferred_logical_width_ = sizes.max_size;
 
   for (const auto* caption : captions_) {
     LayoutUnit min_preferred_logical_width =
         caption->PreferredLogicalWidths().min_size;
-    min_preferred_logical_width_ =
-        std::max(min_preferred_logical_width_, min_preferred_logical_width);
-    // Note: using captions' min-width is intentional here:
-    max_preferred_logical_width_ =
-        std::max(max_preferred_logical_width_, min_preferred_logical_width);
+    sizes.Encompass(min_preferred_logical_width);
   }
 
   const ComputedStyle& style_to_use = StyleRef();
@@ -1130,14 +1121,8 @@
   // able to use percentage or calc values for min-width.
   if (style_to_use.LogicalMinWidth().IsFixed() &&
       style_to_use.LogicalMinWidth().Value() > 0) {
-    max_preferred_logical_width_ =
-        std::max(max_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMinWidth().Value()));
-    min_preferred_logical_width_ =
-        std::max(min_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMinWidth().Value()));
+    sizes.Encompass(AdjustBorderBoxLogicalWidthForBoxSizing(
+        style_to_use.LogicalMinWidth().Value()));
   }
 
   // FIXME: This should probably be checking for isSpecified since you should be
@@ -1145,10 +1130,9 @@
   if (style_to_use.LogicalMaxWidth().IsFixed()) {
     // We don't constrain m_minPreferredLogicalWidth as the table should be at
     // least the size of its min-content, regardless of 'max-width'.
-    max_preferred_logical_width_ =
-        std::min(max_preferred_logical_width_,
-                 AdjustBorderBoxLogicalWidthForBoxSizing(
-                     style_to_use.LogicalMaxWidth().Value()));
+    sizes.max_size =
+        std::min(sizes.max_size, AdjustBorderBoxLogicalWidthForBoxSizing(
+                                     style_to_use.LogicalMaxWidth().Value()));
   }
 
   // 2 cases need this:
@@ -1157,13 +1141,8 @@
   // 2. We buggily calculate min > max for some tables with colspans and
   //    percent widths. See fast/table/spans-min-greater-than-max-crash.html and
   //    http://crbug.com/857185
-  max_preferred_logical_width_ =
-      std::max(min_preferred_logical_width_, max_preferred_logical_width_);
-
-  // FIXME: We should be adding borderAndPaddingLogicalWidth here, but
-  // m_tableLayout->computePreferredLogicalWidths already does, so a bunch of
-  // tests break doing this naively.
-  ClearIntrinsicLogicalWidthsDirty();
+  sizes.max_size = std::max(sizes.min_size, sizes.max_size);
+  return sizes;
 }
 
 LayoutTableSection* LayoutTable::TopNonEmptySection() const {
diff --git a/third_party/blink/renderer/core/layout/layout_table.h b/third_party/blink/renderer/core/layout/layout_table.h
index f5742df..53978ca 100644
--- a/third_party/blink/renderer/core/layout/layout_table.h
+++ b/third_party/blink/renderer/core/layout/layout_table.h
@@ -460,7 +460,7 @@
                    const PhysicalOffset& paint_offset) const override;
   void UpdateLayout() override;
   MinMaxSizes ComputeIntrinsicLogicalWidths() const override;
-  void ComputePreferredLogicalWidths() override;
+  MinMaxSizes PreferredLogicalWidths() const override;
   bool NodeAtPoint(HitTestResult&,
                    const HitTestLocation&,
                    const PhysicalOffset& accumulated_offset,
diff --git a/third_party/blink/renderer/core/layout/layout_table_cell.cc b/third_party/blink/renderer/core/layout/layout_table_cell.cc
index e888d6b..7d04131 100644
--- a/third_party/blink/renderer/core/layout/layout_table_cell.cc
+++ b/third_party/blink/renderer/core/layout/layout_table_cell.cc
@@ -175,7 +175,7 @@
   return Length::Fixed(col_width_sum);
 }
 
-void LayoutTableCell::ComputePreferredLogicalWidths() {
+MinMaxSizes LayoutTableCell::PreferredLogicalWidths() const {
   // The child cells rely on the grids up in the sections to do their
   // computePreferredLogicalWidths work.  Normally the sections are set up
   // early, as table cells are added, but relayout can cause the cells to be
@@ -187,13 +187,14 @@
   // notional height on the cell, such as can happen when a percent sized image
   // scales up its width to match the available height. Setting a zero override
   // height prevents this from happening.
+  auto* mutable_this = const_cast<LayoutTableCell*>(this);
   LayoutUnit logical_height =
       HasOverrideLogicalHeight() ? OverrideLogicalHeight() : LayoutUnit(-1);
   if (logical_height > -1)
-    SetOverrideLogicalHeight(LayoutUnit());
-  LayoutBlockFlow::ComputePreferredLogicalWidths();
+    mutable_this->SetOverrideLogicalHeight(LayoutUnit());
+  MinMaxSizes sizes = LayoutBlockFlow::PreferredLogicalWidths();
   if (logical_height > -1)
-    SetOverrideLogicalHeight(logical_height);
+    mutable_this->SetOverrideLogicalHeight(logical_height);
 
   if (GetNode() && StyleRef().AutoWrap()) {
     // See if nowrap was set.
@@ -205,10 +206,11 @@
       // set on the cell. Even so, it is a WinIE/Moz trait to make the minwidth
       // of the cell into the fixed width. They do this even in strict mode, so
       // do not make this a quirk. Affected the top of hiptop.com.
-      min_preferred_logical_width_ =
-          std::max(LayoutUnit(w.Value()), min_preferred_logical_width_);
+      sizes.min_size = std::max(sizes.min_size, LayoutUnit(w.Value()));
     }
   }
+
+  return sizes;
 }
 
 void LayoutTableCell::ComputeIntrinsicPadding(int collapsed_height,
diff --git a/third_party/blink/renderer/core/layout/layout_table_cell.h b/third_party/blink/renderer/core/layout/layout_table_cell.h
index cd9a057..b2f2dd19 100644
--- a/third_party/blink/renderer/core/layout/layout_table_cell.h
+++ b/third_party/blink/renderer/core/layout/layout_table_cell.h
@@ -363,9 +363,10 @@
 
   // LayoutNGTableCellInterface implementation end.
 
+  MinMaxSizes PreferredLogicalWidths() const override;
+
  protected:
   void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override;
-  void ComputePreferredLogicalWidths() override;
 
   void InvalidatePaint(const PaintInvalidatorContext&) const override;
 
diff --git a/third_party/blink/renderer/core/layout/layout_table_col.h b/third_party/blink/renderer/core/layout/layout_table_col.h
index 4b9738d..cd905f20 100644
--- a/third_party/blink/renderer/core/layout/layout_table_col.h
+++ b/third_party/blink/renderer/core/layout/layout_table_col.h
@@ -86,7 +86,15 @@
     return type == kLayoutObjectLayoutTableCol || LayoutBox::IsOfType(type);
   }
   void UpdateFromElement() override;
-  void ComputePreferredLogicalWidths() override { NOTREACHED(); }
+
+  MinMaxSizes PreferredLogicalWidths() const override {
+    NOTREACHED();
+    return MinMaxSizes();
+  }
+  MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
+    NOTREACHED();
+    return MinMaxSizes();
+  }
 
   void InsertedIntoTree() override;
   void WillBeRemovedFromTree() override;
diff --git a/third_party/blink/renderer/core/layout/layout_table_row.h b/third_party/blink/renderer/core/layout/layout_table_row.h
index eace3a55..82feffc 100644
--- a/third_party/blink/renderer/core/layout/layout_table_row.h
+++ b/third_party/blink/renderer/core/layout/layout_table_row.h
@@ -151,6 +151,11 @@
   // LayoutNGTableRowInterface methods end.
 
  private:
+  MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
+    NOTREACHED();
+    return MinMaxSizes();
+  }
+
   void ComputeVisualOverflow();
   void AddLayoutOverflowFromCell(const LayoutTableCell*);
   void AddVisualOverflowFromCell(const LayoutTableCell*);
diff --git a/third_party/blink/renderer/core/layout/layout_table_section.h b/third_party/blink/renderer/core/layout/layout_table_section.h
index 35f7e7d..2e3495c 100644
--- a/third_party/blink/renderer/core/layout/layout_table_section.h
+++ b/third_party/blink/renderer/core/layout/layout_table_section.h
@@ -336,6 +336,11 @@
                    HitTestAction) override;
 
  private:
+  MinMaxSizes ComputeIntrinsicLogicalWidths() const final {
+    NOTREACHED();
+    return MinMaxSizes();
+  }
+
   void ComputeVisualOverflowFromDescendants();
 
   bool IsOfType(LayoutObjectType type) const override {
diff --git a/third_party/blink/renderer/core/layout/layout_theme.cc b/third_party/blink/renderer/core/layout/layout_theme.cc
index 4564225..29e2c87 100644
--- a/third_party/blink/renderer/core/layout/layout_theme.cc
+++ b/third_party/blink/renderer/core/layout/layout_theme.cc
@@ -182,6 +182,7 @@
 
     // Aliases of 'auto'.
     // https://drafts.csswg.org/css-ui-4/#typedef-appearance-compat-auto
+    case kAutoPart:
     case kCheckboxPart:
     case kRadioPart:
     case kPushButtonPart:
@@ -258,6 +259,7 @@
   ControlPart part = AdjustAppearanceWithAuthorStyle(
       AdjustAppearanceWithElementType(style, e), style);
   style.SetEffectiveAppearance(part);
+  DCHECK_NE(part, kAutoPart);
   if (part == kNoControlPart)
     return;
 
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc
index 3ab305b..65ecfe4 100644
--- a/third_party/blink/renderer/core/layout/layout_view.cc
+++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -111,9 +111,6 @@
   // init LayoutObject attributes
   SetInline(false);
 
-  min_preferred_logical_width_ = LayoutUnit();
-  max_preferred_logical_width_ = LayoutUnit();
-
   SetIntrinsicLogicalWidthsDirty(kMarkOnlyThis);
 
   SetPositionState(EPosition::kAbsolute);  // to 0,0 :)
@@ -313,8 +310,7 @@
     SetPageLogicalHeight(LayoutUnit());
 
   if (PageLogicalHeight() && ShouldUsePrintingLayout()) {
-    min_preferred_logical_width_ = max_preferred_logical_width_ =
-        LogicalWidth();
+    intrinsic_logical_widths_ = LogicalWidth();
     if (!fragmentation_context_) {
       fragmentation_context_ =
           std::make_unique<ViewFragmentationContext>(*this);
diff --git a/third_party/blink/renderer/core/layout/layout_view_test.cc b/third_party/blink/renderer/core/layout/layout_view_test.cc
index c291310a..94dbb303 100644
--- a/third_party/blink/renderer/core/layout/layout_view_test.cc
+++ b/third_party/blink/renderer/core/layout/layout_view_test.cc
@@ -74,11 +74,11 @@
                               public RenderingTest {
  public:
   LayoutViewHitTestTest()
-      : ScopedLayoutNGForTest(LayoutNG()),
+      : ScopedLayoutNGForTest(GetParam().layout_ng),
         RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()) {}
 
  protected:
-  bool LayoutNG() { return GetParam().layout_ng; }
+  bool LayoutNG() { return RuntimeEnabledFeatures::LayoutNGEnabled(); }
   bool IsAndroidOrWindowsEditingBehavior() {
     // TODO(crbug.com/971414): For now LayoutNG always uses Android/Windows
     // behavior for ShouldMoveCaretToHorizontalBoundaryWhenPastTopOrBottom().
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
index 1752a68..f2fcfb9 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.cc
@@ -736,7 +736,8 @@
   }
   const NGFragmentItem* container = CurrentItem();
   DCHECK(container);
-  DCHECK_EQ(container->Type(), NGFragmentItem::kLine);
+  DCHECK(container->Type() == NGFragmentItem::kLine ||
+         container->Type() == NGFragmentItem::kBox);
   const ComputedStyle& container_style = container->Style();
   const WritingMode writing_mode = container_style.GetWritingMode();
   const TextDirection direction = container_style.Direction();
@@ -802,6 +803,8 @@
     if (const PositionWithAffinity child_position =
             descendants.PositionForPointInChild(point, *closest_child_after))
       return child_position;
+    // TODO(yosin): we should do like "closest_child_before" once we have a
+    // case.
   }
 
   if (closest_child_before) {
@@ -809,6 +812,11 @@
     if (const PositionWithAffinity child_position =
             descendants.PositionForPointInChild(point, *closest_child_before))
       return child_position;
+    if (closest_child_before->BoxFragment()) {
+      // LayoutViewHitTest.HitTestHorizontal "Top-right corner (outside) of div"
+      // reach here.
+      return descendants.PositionForPointInInlineBox(point);
+    }
   }
 
   return PositionWithAffinity();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index 190d0ab..9c5ba6af 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -299,6 +299,31 @@
     input->override_block_size = space.AvailableSize().block_size;
 }
 
+bool CanUseCachedIntrinsicInlineSizes(const MinMaxSizesInput& input,
+                                      const LayoutBox& box) {
+  // Obviously can't use the cache if our intrinsic logical widths are dirty.
+  if (box.IntrinsicLogicalWidthsDirty())
+    return false;
+
+  // We don't store the float inline sizes for comparison, always skip the
+  // cache in this case.
+  if (input.float_left_inline_size || input.float_right_inline_size)
+    return false;
+
+  // Check if we have any percentage inline padding.
+  const auto& style = box.StyleRef();
+  if (style.MayHavePadding() && (style.PaddingStart().IsPercentOrCalc() ||
+                                 style.PaddingEnd().IsPercentOrCalc()))
+    return false;
+
+  // Check if the %-block-size matches.
+  if (input.percentage_resolution_block_size !=
+      box.IntrinsicLogicalWidthsPercentageResolutionBlockSize())
+    return false;
+
+  return true;
+}
+
 }  // namespace
 
 scoped_refptr<const NGLayoutResult> NGBlockNode::Layout(
@@ -634,6 +659,11 @@
   bool is_orthogonal_flow_root =
       !IsParallelWritingMode(container_writing_mode, Style().GetWritingMode());
 
+  if (CanUseCachedIntrinsicInlineSizes(input, *box_))
+    return box_->IntrinsicLogicalWidths();
+
+  box_->SetIntrinsicLogicalWidthsDirty();
+
   MinMaxSizes sizes;
   // If we're orthogonal, we have to run layout to compute the sizes. However,
   // if we're outside of layout, we can't do that. This can happen on Mac.
@@ -680,6 +710,8 @@
                            input_type_names::kFile)) &&
              Style().LogicalWidth().IsPercentOrCalc())
       maybe_sizes->min_size = LayoutUnit();
+    box_->SetIntrinsicLogicalWidthsFromNG(
+        *maybe_sizes, input.percentage_resolution_block_size);
     return *maybe_sizes;
   }
 
@@ -721,7 +753,13 @@
     needs_size_reset = true;
   }
 
-  MinMaxSizes sizes = box_->ComputeIntrinsicLogicalWidths();
+  // Tables don't calculate their min/max content contribution the same way as
+  // other layout nodes. This is because width/min-width/etc have a different
+  // meaning for tables.
+  //
+  // Due to this the min/max content contribution is their min/max content size.
+  MinMaxSizes sizes = box_->IsTable() ? box_->PreferredLogicalWidths()
+                                      : box_->IntrinsicLogicalWidths();
 
   if (needs_size_reset)
     box_->ClearOverrideContainingBlockContentSize();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
index bc1f274..2c9194f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
@@ -89,17 +89,12 @@
   // contents, with the conjecture being that legend is part of the contents.
   // Thus, only do this adjustment if we do not contain size.
   if (!Node().ShouldApplySizeContainment()) {
-    LayoutUnit minimum_border_box_block_size;
-    if (legend_needs_layout_) {
-      minimum_border_box_block_size =
-          borders_with_legend_.BlockSum() + padding_.BlockSum();
-    }
     // Similar to how we add the consumed block size to the intrinsic
     // block size when calculating border_box_size_.block_size, we also need to
     // do so when the fieldset is adjusted to encompass the legend.
     border_box_size_.block_size =
         std::max(border_box_size_.block_size,
-                 minimum_border_box_block_size + consumed_block_size);
+                 minimum_border_box_block_size_ + consumed_block_size);
   }
 
   // TODO(almaher): end border and padding may overflow the parent
@@ -150,10 +145,10 @@
   }
 
   NGBlockNode legend = Node().GetRenderedLegend();
-  legend_needs_layout_ =
+  bool legend_needs_layout =
       legend && (legend_break_token || !IsResumingLayout(BreakToken()));
 
-  if (legend_needs_layout_) {
+  if (legend_needs_layout) {
     // TODO(almaher): Handle all break status cases.
     NGBreakStatus break_status = LayoutLegend(legend, legend_break_token);
     DCHECK_EQ(break_status, NGBreakStatus::kContinue);
@@ -161,6 +156,20 @@
 
   borders_with_legend_ = borders_;
   borders_with_legend_.block_start = block_start_padding_edge_;
+
+  // The legend may eat from the available content box block size. If the
+  // border_box_size_ is expanded to encompass the legend, then update the
+  // border_box_size_ here, as well, to ensure the fieldset content gets the
+  // correct size.
+  if (!Node().ShouldApplySizeContainment() && legend_needs_layout) {
+    minimum_border_box_block_size_ =
+        borders_with_legend_.BlockSum() + padding_.BlockSum();
+    if (border_box_size_.block_size != kIndefiniteSize) {
+      border_box_size_.block_size =
+          std::max(border_box_size_.block_size, minimum_border_box_block_size_);
+    }
+  }
+
   LogicalSize adjusted_padding_box_size =
       ShrinkAvailableSize(border_box_size_, borders_with_legend_);
   if ((IsResumingLayout(content_break_token.get())) ||
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
index df39233..c7bdd7e9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
@@ -65,13 +65,14 @@
   LayoutUnit intrinsic_block_size_;
   LogicalSize border_box_size_;
 
+  // The legend may eat from the available content box block size. This
+  // represents the minimum block size needed by the border box to encompass
+  // the legend.
+  LayoutUnit minimum_border_box_block_size_;
+
   // If true, this indicates the block_start_padding_edge_ had changed from its
   // initial value during the current layout pass.
   bool block_start_padding_edge_adjusted_ = false;
-
-  // If true, this indicates that either the entire legend or part of the
-  // legend needs to be laid out during the current layout pass.
-  bool legend_needs_layout_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
index 17315363..9da018f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
@@ -350,7 +350,7 @@
   offset:unplaced size:1000x53
     offset:0,0 size:126x53
       offset:13,0 size:30x30
-      offset:3,30 size:120x0
+      offset:3,30 size:120x20
         offset:10,10 size:100x200
 )DUMP";
   EXPECT_EQ(expectation, dump);
@@ -445,6 +445,46 @@
   EXPECT_EQ(expectation, dump);
 }
 
+// This test makes sure that the fieldset content handles fieldset padding
+// when the fieldset is expanded to encompass the legend.
+TEST_F(NGFieldsetLayoutAlgorithmTest, FieldsetPaddingWithLegend) {
+  SetBodyInnerHTML(R"HTML(
+      <style>
+        #fieldset {
+          border:none; margin:0; padding:10px; width: 150px; height: 100px;
+        }
+        #legend {
+          padding:0px; margin:0; width: 50px; height: 120px;
+        }
+        #child {
+          width: 100px; height: 40px;
+        }
+      </style>
+      <fieldset id="fieldset">
+        <legend id="legend"></legend>
+        <div id="child"></div>
+      </fieldset>
+  )HTML");
+
+  NGBlockNode node(ToLayoutBox(GetLayoutObjectByElementId("fieldset")));
+  NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
+      WritingMode::kHorizontalTb, TextDirection::kLtr,
+      LogicalSize(LayoutUnit(1000), kIndefiniteSize), false,
+      node.CreatesNewFormattingContext());
+
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
+      NGBaseLayoutAlgorithmTest::RunFieldsetLayoutAlgorithm(node, space);
+
+  String dump = DumpFragmentTree(fragment.get());
+  String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
+  offset:unplaced size:170x140
+    offset:10,0 size:50x120
+    offset:0,120 size:170x20
+      offset:10,10 size:100x40
+)DUMP";
+  EXPECT_EQ(expectation, dump);
+}
+
 TEST_F(NGFieldsetLayoutAlgorithmTest, MinMax) {
   SetBodyInnerHTML(R"HTML(
     <style>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
index a5287ac..e8396601 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -313,26 +313,17 @@
   const ComputedStyle& child_style = child.Style();
   WritingMode parent_writing_mode = parent_style.GetWritingMode();
   WritingMode child_writing_mode = child_style.GetWritingMode();
-  LayoutBox* box = child.GetLayoutBox();
-
-  if (box->NeedsPreferredWidthsRecalculation()) {
-    // Some objects (when there's an intrinsic ratio) have their min/max inline
-    // size affected by the block size of their container. We don't really know
-    // whether the containing block of this child did change or is going to
-    // change size. However, this is our only opportunity to make sure that it
-    // gets its min/max widths calculated.
-    box->SetIntrinsicLogicalWidthsDirty();
-  }
 
   if (IsParallelWritingMode(parent_writing_mode, child_writing_mode)) {
-    if (!box->IntrinsicLogicalWidthsDirty()) {
-      return box->PreferredLogicalWidths();
-    }
     // Tables are special; even if a width is specified, they may end up being
     // sized different. So we just always let the table code handle this.
+    if (child.IsTable())
+      return child.ComputeMinMaxSizes(parent_writing_mode, input, nullptr);
+
     // Replaced elements may size themselves using aspect ratios and block
     // sizes, so we pass that on as well.
-    if (box->IsTable() || box->IsLayoutReplaced()) {
+    if (child.IsReplaced()) {
+      LayoutBox* box = child.GetLayoutBox();
       bool needs_size_reset = false;
       if (!box->HasOverrideContainingBlockContentLogicalHeight()) {
         box->SetOverrideContainingBlockContentLogicalHeight(
@@ -371,40 +362,8 @@
   NGBoxStrut border_padding =
       ComputeBorders(space, child_style) + ComputePadding(space, child_style);
 
-  MinMaxSizes sizes = ComputeMinAndMaxContentContribution(
-      parent_writing_mode, child_style, border_padding, min_max_sizes);
-  if (IsParallelWritingMode(parent_writing_mode, child_writing_mode))
-    box->SetPreferredLogicalWidthsFromNG(sizes);
-  return sizes;
-}
-
-MinMaxSizes ComputeMinAndMaxContentSizeForOutOfFlow(
-    const NGConstraintSpace& constraint_space,
-    NGLayoutInputNode node,
-    const NGBoxStrut& border_padding,
-    const MinMaxSizesInput& input) {
-  LayoutBox* box = node.GetLayoutBox();
-  // If we've already populated the legacy preferred logical widths cache for
-  // this node at the bottom of this function, use those cached results here.
-  // Or, if we're working on a table, use the legacy preferred widths code
-  // instead of ComputeMinAndMaxContentContribution below because
-  // ComputeMinAndMaxContentContribution assumes that if an element has a
-  // specified size, that's its final size, which tables don't follow.
-  if ((!box->IntrinsicLogicalWidthsDirty() &&
-       !box->NeedsPreferredWidthsRecalculation()) ||
-      box->IsTable()) {
-    return box->PreferredLogicalWidths();
-  }
-
-  // Compute the intrinsic sizes without regard to the specified sizes.
-  MinMaxSizes result = node.ComputeMinMaxSizes(node.Style().GetWritingMode(),
-                                               input, &constraint_space);
-  // Apply the specified min, main, max sizes.
-  MinMaxSizes contribution = ComputeMinAndMaxContentContribution(
-      node.Style().GetWritingMode(), node.Style(), border_padding, result);
-  // Cache these computed values.
-  box->SetPreferredLogicalWidthsFromNG(contribution);
-  return result;
+  return ComputeMinAndMaxContentContribution(parent_writing_mode, child_style,
+                                             border_padding, min_max_sizes);
 }
 
 LayoutUnit ComputeInlineSizeForFragment(
@@ -420,55 +379,23 @@
   if (logical_width.IsAuto() && space.IsShrinkToFit())
     logical_width = Length::FitContent();
 
-  LayoutBox* box = node.GetLayoutBox();
-  // If we have usable cached min/max intrinsic sizes, use those if we can. They
-  // will normally also be constrained to {min,max}-inline-size, but not if
-  // percentages are involved. In such cases we'll have to calculate and apply
-  // the constraints on our own. We also need to discard the cached values if
-  // the box has certain properties (e.g. percentage padding) that cause the
-  // cached values to be affected by extrinsic sizing.
-  if (!box->IntrinsicLogicalWidthsDirty() && !override_min_max_sizes_for_test &&
-      !style.LogicalMinWidth().IsPercentOrCalc() &&
-      !style.LogicalMaxWidth().IsPercentOrCalc() &&
-      !box->NeedsPreferredWidthsRecalculation()) {
-    if (logical_width.IsFitContent()) {
-      // This is not as easy as {min, max}.ShrinkToFit() because we also need
-      // to subtract inline margins from the available size. The code in
-      // ResolveMainInlineLength knows how to handle that, just call that.
+  auto MinMaxSizesFunc = [&]() -> MinMaxSizes {
+    if (override_min_max_sizes_for_test)
+      return *override_min_max_sizes_for_test;
 
-      base::Optional<MinMaxSizes> min_max_sizes = box->PreferredLogicalWidths();
-      return ResolveMainInlineLength(space, style, border_padding,
-                                     min_max_sizes, logical_width);
-    }
-    if (logical_width.IsMinContent())
-      return box->PreferredLogicalWidths().min_size;
-    if (logical_width.IsMaxContent())
-      return box->PreferredLogicalWidths().max_size;
-  }
-
-  base::Optional<MinMaxSizes> min_max_sizes;
-  if (NeedMinMaxSize(space, style)) {
-    if (override_min_max_sizes_for_test) {
-      min_max_sizes = *override_min_max_sizes_for_test;
-    } else {
-      min_max_sizes = node.ComputeMinMaxSizes(
-          space.GetWritingMode(),
-          MinMaxSizesInput(space.PercentageResolutionBlockSize()), &space);
-      // Cache these computed values
-      MinMaxSizes contribution = ComputeMinAndMaxContentContribution(
-          style.GetWritingMode(), style, border_padding, min_max_sizes);
-      box->SetPreferredLogicalWidthsFromNG(contribution);
-    }
-  }
+    return node.ComputeMinMaxSizes(
+        space.GetWritingMode(),
+        MinMaxSizesInput(space.PercentageResolutionBlockSize()), &space);
+  };
 
   LayoutUnit extent = ResolveMainInlineLength(space, style, border_padding,
-                                              min_max_sizes, logical_width);
+                                              MinMaxSizesFunc, logical_width);
 
   LayoutUnit max = ResolveMaxInlineLength(
-      space, style, border_padding, min_max_sizes, style.LogicalMaxWidth(),
+      space, style, border_padding, MinMaxSizesFunc, style.LogicalMaxWidth(),
       LengthResolvePhase::kLayout);
   LayoutUnit min = ResolveMinInlineLength(
-      space, style, border_padding, min_max_sizes, style.LogicalMinWidth(),
+      space, style, border_padding, MinMaxSizesFunc, style.LogicalMinWidth(),
       LengthResolvePhase::kLayout);
   return ConstrainByMinMax(extent, min, max);
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
index c8a639af..2c63e72 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
@@ -41,15 +41,6 @@
          style.LogicalMaxWidth().IsIntrinsic();
 }
 
-// Whether the caller needs to compute min-content and max-content sizes to
-// pass them to ResolveMainInlineLength / ComputeInlineSizeForFragment.
-// If this function returns false, it is safe to pass an empty
-// MinMaxSizes struct to those functions.
-inline bool NeedMinMaxSize(const NGConstraintSpace& constraint_space,
-                           const ComputedStyle& style) {
-  return constraint_space.IsShrinkToFit() || NeedMinMaxSize(style);
-}
-
 // Like NeedMinMaxSize, but for use when calling
 // ComputeMinAndMaxContentContribution.
 // Because content contributions are commonly needed by a block's parent,
@@ -306,15 +297,6 @@
     NGLayoutInputNode child,
     const MinMaxSizesInput&);
 
-// Computes the min/max-content size for an out-of-flow positioned node and
-// returns it, using the cache where possible. ALways computes it in the writing
-// mode of the node itself.
-MinMaxSizes ComputeMinAndMaxContentSizeForOutOfFlow(
-    const NGConstraintSpace&,
-    NGLayoutInputNode,
-    const NGBoxStrut& border_padding,
-    const MinMaxSizesInput&);
-
 // Returns inline size of the node's border box by resolving the computed value
 // in style.logicalWidth (Length) to a layout unit, adding border and padding,
 // then constraining the result by the resolved min logical width and max
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index a5a32c50..24643c07 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -528,8 +528,8 @@
       // Since out-of-flow positioning sets up a constraint space with fixed
       // inline-size, the regular layout code (|NGBlockNode::Layout()|) cannot
       // re-layout if it discovers that a scrollbar was added or removed. Handle
-      // that situation here. The assumption is that if preferred logical widths
-      // are dirty after layout, AND its inline-size depends on preferred
+      // that situation here. The assumption is that if intrinsic logical widths
+      // are dirty after layout, AND its inline-size depends on the intrinsic
       // logical widths, it means that scrollbars appeared or disappeared. We
       // have the same logic in legacy layout in
       // |LayoutBlockFlow::UpdateBlockLayout()|.
@@ -585,12 +585,11 @@
 
   if (AbsoluteNeedsChildInlineSize(candidate_style) ||
       NeedMinMaxSize(candidate_style) || should_be_considered_as_replaced) {
-    // This is a new formatting context, so whatever happened on the outside
-    // doesn't concern us.
-    MinMaxSizesInput input(
-        container_content_size_in_candidate_writing_mode.block_size);
-    min_max_sizes = ComputeMinAndMaxContentSizeForOutOfFlow(
-        candidate_constraint_space, node, border_padding, input);
+    min_max_sizes = node.ComputeMinMaxSizes(
+        candidate_writing_mode,
+        MinMaxSizesInput(
+            container_content_size_in_candidate_writing_mode.block_size),
+        &candidate_constraint_space);
   }
 
   base::Optional<LogicalSize> replaced_size;
diff --git a/third_party/blink/renderer/core/layout/svg/svg_resources.cc b/third_party/blink/renderer/core/layout/svg/svg_resources.cc
index f5c61b6..4d1cc23 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_resources.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_resources.cc
@@ -58,6 +58,14 @@
 
 FloatRect SVGResources::ReferenceBoxForEffects(
     const LayoutObject& layout_object) {
+  // For SVG foreign objects, remove the position part of the bounding box. The
+  // position is already baked into the transform, and we don't want to re-apply
+  // the offset when, e.g., using "objectBoundingBox" for clipPathUnits.
+  if (layout_object.IsSVGForeignObject()) {
+    FloatRect rect = layout_object.ObjectBoundingBox();
+    return FloatRect(FloatPoint::Zero(), rect.Size());
+  }
+
   // Text "sub-elements" (<tspan>, <textpath>, <a>) should use the entire
   // <text>s object bounding box rather then their own.
   // https://svgwg.org/svg2-draft/text.html#ObjectBoundingBoxUnitsTextObjects
@@ -434,9 +442,7 @@
 }
 
 void SVGResources::SetClipper(LayoutSVGResourceClipper* clipper) {
-  if (!clipper)
-    return;
-
+  DCHECK(clipper);
   DCHECK_EQ(clipper->ResourceType(), kClipperResourceType);
 
   if (!clipper_filter_masker_data_)
@@ -446,9 +452,7 @@
 }
 
 void SVGResources::SetFilter(LayoutSVGResourceFilter* filter) {
-  if (!filter)
-    return;
-
+  DCHECK(filter);
   DCHECK_EQ(filter->ResourceType(), kFilterResourceType);
 
   if (!clipper_filter_masker_data_)
@@ -458,9 +462,7 @@
 }
 
 void SVGResources::SetMarkerStart(LayoutSVGResourceMarker* marker_start) {
-  if (!marker_start)
-    return;
-
+  DCHECK(marker_start);
   DCHECK_EQ(marker_start->ResourceType(), kMarkerResourceType);
 
   if (!marker_data_)
@@ -470,9 +472,7 @@
 }
 
 void SVGResources::SetMarkerMid(LayoutSVGResourceMarker* marker_mid) {
-  if (!marker_mid)
-    return;
-
+  DCHECK(marker_mid);
   DCHECK_EQ(marker_mid->ResourceType(), kMarkerResourceType);
 
   if (!marker_data_)
@@ -482,9 +482,7 @@
 }
 
 void SVGResources::SetMarkerEnd(LayoutSVGResourceMarker* marker_end) {
-  if (!marker_end)
-    return;
-
+  DCHECK(marker_end);
   DCHECK_EQ(marker_end->ResourceType(), kMarkerResourceType);
 
   if (!marker_data_)
@@ -494,9 +492,7 @@
 }
 
 void SVGResources::SetMasker(LayoutSVGResourceMasker* masker) {
-  if (!masker)
-    return;
-
+  DCHECK(masker);
   DCHECK_EQ(masker->ResourceType(), kMaskerResourceType);
 
   if (!clipper_filter_masker_data_)
@@ -506,8 +502,7 @@
 }
 
 void SVGResources::SetFill(LayoutSVGResourcePaintServer* fill) {
-  if (!fill)
-    return;
+  DCHECK(fill);
 
   if (!fill_stroke_data_)
     fill_stroke_data_ = std::make_unique<FillStrokeData>();
@@ -516,8 +511,7 @@
 }
 
 void SVGResources::SetStroke(LayoutSVGResourcePaintServer* stroke) {
-  if (!stroke)
-    return;
+  DCHECK(stroke);
 
   if (!fill_stroke_data_)
     fill_stroke_data_ = std::make_unique<FillStrokeData>();
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
index 41967f4..af0e7a86e 100644
--- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
+++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -39,7 +39,6 @@
 #include "third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h"
 #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h"
 #include "third_party/blink/renderer/core/html/html_iframe_element.h"
-#include "third_party/blink/renderer/core/html/html_image_element.h"
 #include "third_party/blink/renderer/core/html/media/html_media_element.h"
 #include "third_party/blink/renderer/core/html/media/html_video_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
@@ -48,12 +47,10 @@
 #include "third_party/blink/renderer/core/layout/layout_embedded_content.h"
 #include "third_party/blink/renderer/core/layout/layout_embedded_object.h"
 #include "third_party/blink/renderer/core/layout/layout_html_canvas.h"
-#include "third_party/blink/renderer/core/layout/layout_image.h"
 #include "third_party/blink/renderer/core/layout/layout_inline.h"
 #include "third_party/blink/renderer/core/layout/layout_shift_tracker.h"
 #include "third_party/blink/renderer/core/layout/layout_video.h"
 #include "third_party/blink/renderer/core/layout/layout_view.h"
-#include "third_party/blink/renderer/core/loader/resource/image_resource_content.h"
 #include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h"
@@ -72,7 +69,6 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
 #include "third_party/blink/renderer/platform/geometry/length_functions.h"
-#include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
 #include "third_party/blink/renderer/platform/graphics/compositor_filter_operations.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
 #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h"
@@ -444,14 +440,6 @@
 
   UpdateBackgroundColor();
 
-  if (layout_object.IsImage()) {
-    if (IsDirectlyCompositedImage()) {
-      UpdateImageContents();
-    } else if (graphics_layer_->HasContentsLayer()) {
-      graphics_layer_->SetContentsToImage(nullptr, Image::kUnspecifiedDecode);
-    }
-  }
-
   if (layout_object.IsLayoutEmbeddedContent()) {
     if (WebPluginContainerImpl* plugin = GetPluginContainer(layout_object)) {
       graphics_layer_->SetContentsToCcLayer(
@@ -1533,9 +1521,6 @@
   if (CompositedBounds().IsEmpty())
     return false;
 
-  if (GetLayoutObject().IsImage() && IsDirectlyCompositedImage())
-    return false;
-
   LayoutObject& layout_object = GetLayoutObject();
   // FIXME: we could optimize cases where the image, video or canvas is known to
   // fill the border box entirely, and set background color on the layer in that
@@ -1584,43 +1569,7 @@
   return PaintsChildren();
 }
 
-// An image can be directly composited if it's the sole content of the layer,
-// and has no box decorations or clipping that require painting. Direct
-// compositing saves a backing store.
-bool CompositedLayerMapping::IsDirectlyCompositedImage() const {
-  DCHECK(GetLayoutObject().IsImage());
-
-  LayoutImage& image_layout_object = ToLayoutImage(GetLayoutObject());
-
-  if (owning_layer_.HasBoxDecorationsOrBackground() ||
-      image_layout_object.HasClip() || image_layout_object.HasClipPath() ||
-      image_layout_object.HasObjectFit())
-    return false;
-
-  if (ImageResourceContent* cached_image = image_layout_object.CachedImage()) {
-    if (!cached_image->HasImage())
-      return false;
-
-    if (!IsA<BitmapImage>(cached_image->GetImage()))
-      return false;
-
-    UseCounter::Count(GetLayoutObject().GetDocument(),
-                      WebFeature::kDirectlyCompositedImage);
-    return true;
-  }
-
-  return false;
-}
-
 void CompositedLayerMapping::ContentChanged(ContentChangeType change_type) {
-  if ((change_type == kImageChanged) && GetLayoutObject().IsImage() &&
-      IsDirectlyCompositedImage()) {
-    SetNeedsGraphicsLayerUpdate(kGraphicsLayerUpdateLocal);
-    Compositor()->SetNeedsCompositingUpdate(
-        kCompositingUpdateAfterGeometryChange);
-    return;
-  }
-
   if (change_type == kCanvasChanged &&
       IsTextureLayerCanvas(GetLayoutObject())) {
     graphics_layer_->SetContentsNeedsDisplay();
@@ -1628,49 +1577,6 @@
   }
 }
 
-void CompositedLayerMapping::UpdateImageContents() {
-  DCHECK_EQ(owning_layer_.Compositor()->Lifecycle().GetState(),
-            DocumentLifecycle::kInCompositingUpdate);
-
-  DCHECK(GetLayoutObject().IsImage());
-  LayoutImage& image_layout_object = ToLayoutImage(GetLayoutObject());
-
-  ImageResourceContent* cached_image = image_layout_object.CachedImage();
-  if (!cached_image)
-    return;
-
-  Image* image = cached_image->GetImage();
-  if (!image)
-    return;
-
-  auto* html_image_element =
-      DynamicTo<HTMLImageElement>(image_layout_object.GetNode());
-  Image::ImageDecodingMode decode_mode =
-      html_image_element ? html_image_element->GetDecodingModeForPainting(
-                               image->paint_image_id())
-                         : Image::kUnspecifiedDecode;
-
-  // This is a no-op if the layer doesn't have an inner layer for the image.
-  graphics_layer_->SetContentsToImage(
-      image, decode_mode,
-      LayoutObject::ShouldRespectImageOrientation(&image_layout_object));
-
-  graphics_layer_->SetFilterQuality(
-      GetLayoutObject().StyleRef().ImageRendering() ==
-              EImageRendering::kPixelated
-          ? kNone_SkFilterQuality
-          : kLow_SkFilterQuality);
-
-  // Prevent double-drawing: https://bugs.webkit.org/show_bug.cgi?id=58632
-  UpdateDrawsContentAndPaintsHitTest();
-
-  // Image animation is "lazy", in that it automatically stops unless someone is
-  // drawing the image. So we have to kick the animation each time; this has the
-  // downside that the image will keep animating, even if its layer is not
-  // visible.
-  image->StartAnimation();
-}
-
 FloatPoint3D CompositedLayerMapping::ComputeTransformOrigin(
     const IntRect& border_box) const {
   const ComputedStyle& style = GetLayoutObject().StyleRef();
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
index 7a055a2..937cf1f 100644
--- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
+++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
@@ -371,10 +371,6 @@
   // Returns true if this layer has content that needs to be displayed by
   // painting into the backing store.
   bool ContainsPaintedContent() const;
-  // Returns true if the Layer just contains an image that we can composite
-  // directly.
-  bool IsDirectlyCompositedImage() const;
-  void UpdateImageContents();
 
   Color LayoutObjectBackgroundColor() const;
   void UpdateBackgroundColor();
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index f55446f..2e812b7 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -1659,6 +1659,16 @@
   return NodeAtPoint(hit_test, physical_offset);
 }
 
+bool NGBoxFragmentPainter::NodeAtPoint(HitTestResult& result,
+                                       const HitTestLocation& hit_test_location,
+                                       const PhysicalOffset& physical_offset,
+                                       const PhysicalOffset& inline_root_offset,
+                                       HitTestAction action) {
+  HitTestContext hit_test(action, hit_test_location, inline_root_offset,
+                          &result);
+  return NodeAtPoint(hit_test, physical_offset);
+}
+
 bool NGBoxFragmentPainter::NodeAtPoint(const HitTestContext& hit_test,
                                        const PhysicalOffset& physical_offset) {
   const NGPhysicalBoxFragment& fragment = PhysicalFragment();
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
index bdc9417..4d1401bc 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.h
@@ -60,6 +60,11 @@
                    const HitTestLocation& hit_test_location,
                    const PhysicalOffset& physical_offset,
                    HitTestAction);
+  bool NodeAtPoint(HitTestResult&,
+                   const HitTestLocation& hit_test_location,
+                   const PhysicalOffset& physical_offset,
+                   const PhysicalOffset& inline_root_offset,
+                   HitTestAction);
 
   bool HitTestAllPhases(HitTestResult&,
                         const HitTestLocation&,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 344439c..a973389 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -1059,9 +1059,17 @@
     PostPlatformNotification(obj, event_type, event_from);
 
     if (event_type == ax::mojom::Event::kChildrenChanged &&
-        obj->CachedParentObject() &&
-        obj->LastKnownIsIgnoredValue() != obj->AccessibilityIsIgnored())
-      ChildrenChanged(obj->CachedParentObject());
+        obj->CachedParentObject()) {
+      const bool was_ignored = obj->LastKnownIsIgnoredValue();
+      const bool was_ignored_but_included_in_tree =
+          obj->LastKnownIsIgnoredButIncludedInTreeValue();
+      bool is_ignored_changed =
+          was_ignored != obj->AccessibilityIsIgnored() ||
+          was_ignored_but_included_in_tree !=
+              obj->AccessibilityIsIgnoredButIncludedInTree();
+      if (is_ignored_changed)
+        ChildrenChanged(obj->CachedParentObject());
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
index 231310b..7e0c653 100644
--- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
+++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -523,7 +523,7 @@
   Node* dom_node = nullptr;
   Response response =
       dom_agent_->AssertNode(dom_node_id, backend_node_id, object_id, dom_node);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   Document& document = dom_node->GetDocument();
@@ -532,7 +532,7 @@
       document.Lifecycle());
   LocalFrame* local_frame = document.GetFrame();
   if (!local_frame)
-    return Response::Error("Frame is detached.");
+    return Response::ServerError("Frame is detached.");
   AXContext ax_context(document);
   auto& cache = To<AXObjectCacheImpl>(ax_context.GetAXObjectCache());
 
@@ -542,7 +542,7 @@
     (*nodes)->emplace_back(BuildObjectForIgnoredNode(
         dom_node, inspected_ax_object, fetch_relatives.fromMaybe(true), *nodes,
         cache));
-    return Response::OK();
+    return Response::Success();
   } else {
     (*nodes)->emplace_back(
         BuildProtocolAXObject(*inspected_ax_object, inspected_ax_object,
@@ -550,16 +550,16 @@
   }
 
   if (!inspected_ax_object)
-    return Response::OK();
+    return Response::Success();
 
   AXObject* parent = inspected_ax_object->ParentObjectUnignored();
   if (!parent)
-    return Response::OK();
+    return Response::Success();
 
   if (fetch_relatives.fromMaybe(true))
     AddAncestors(*parent, inspected_ax_object, *nodes, cache);
 
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorAccessibilityAgent::AddAncestors(
@@ -718,7 +718,7 @@
     std::unique_ptr<protocol::Array<AXNode>>* nodes) {
   Document* document = inspected_frames_->Root()->GetDocument();
   if (!document)
-    return Response::Error("No document.");
+    return Response::ServerError("No document.");
   if (document->View()->NeedsLayout() || document->NeedsLayoutTreeUpdate())
     document->UpdateStyleAndLayout(DocumentUpdateReason::kInspector);
   *nodes = std::make_unique<protocol::Array<protocol::Accessibility::AXNode>>();
@@ -743,7 +743,7 @@
     node->setChildIds(std::move(child_ids));
     (*nodes)->emplace_back(std::move(node));
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorAccessibilityAgent::FillCoreProperties(
@@ -853,12 +853,12 @@
 protocol::Response InspectorAccessibilityAgent::enable() {
   if (!enabled_.Get())
     EnableAndReset();
-  return Response::OK();
+  return Response::Success();
 }
 
 protocol::Response InspectorAccessibilityAgent::disable() {
   if (!enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(false);
   context_ = nullptr;
   LocalFrame* frame = inspected_frames_->Root();
@@ -867,7 +867,7 @@
   it->value.erase(this);
   if (it->value.IsEmpty())
     EnabledAgents().erase(frame);
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorAccessibilityAgent::Restore() {
diff --git a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
index 27a318a..a1d2353 100644
--- a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
+++ b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
@@ -79,26 +79,28 @@
                               String* cache_name) {
   wtf_size_t pipe = id.find('|');
   if (pipe == WTF::kNotFound)
-    return ProtocolResponse::Error("Invalid cache id.");
+    return ProtocolResponse::ServerError("Invalid cache id.");
   *security_origin = id.Substring(0, pipe);
   *cache_name = id.Substring(pipe + 1);
-  return ProtocolResponse::OK();
+  return ProtocolResponse::Success();
 }
 
 ProtocolResponse GetExecutionContext(InspectedFrames* frames,
                                      const String& security_origin,
                                      ExecutionContext** context) {
   LocalFrame* frame = frames->FrameWithSecurityOrigin(security_origin);
-  if (!frame)
-    return ProtocolResponse::Error("No frame with origin " + security_origin);
+  if (!frame) {
+    String msg = "No frame with origin " + security_origin;
+    return ProtocolResponse::ServerError(msg.Utf8());
+  }
 
   blink::Document* document = frame->GetDocument();
   if (!document)
-    return ProtocolResponse::Error("No execution context found");
+    return ProtocolResponse::ServerError("No execution context found");
 
   *context = document->ToExecutionContext();
 
-  return ProtocolResponse::OK();
+  return ProtocolResponse::Success();
 }
 
 ProtocolResponse AssertCacheStorage(
@@ -111,14 +113,14 @@
 
   // Cache Storage API is restricted to trustworthy origins.
   if (!sec_origin->IsPotentiallyTrustworthy()) {
-    return ProtocolResponse::Error(
-        sec_origin->IsPotentiallyTrustworthyErrorMessage());
+    return ProtocolResponse::ServerError(
+        sec_origin->IsPotentiallyTrustworthyErrorMessage().Utf8());
   }
 
   ExecutionContext* context = nullptr;
   ProtocolResponse response =
       GetExecutionContext(frames, security_origin, &context);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   auto it = caches->find(security_origin);
@@ -133,7 +135,7 @@
     *result = it->value.get();
   }
 
-  return ProtocolResponse::OK();
+  return ProtocolResponse::Success();
 }
 
 ProtocolResponse AssertCacheStorageAndNameForId(
@@ -145,7 +147,7 @@
   String security_origin;
   ProtocolResponse response =
       ParseCacheId(cache_id, &security_origin, cache_name);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   return AssertCacheStorage(security_origin, frames, caches, result);
 }
@@ -351,9 +353,11 @@
   }
 
   void SendFailure(const mojom::blink::CacheStorageError& error) {
-    callback_->sendFailure(ProtocolResponse::Error(String::Format(
-        "Error requesting responses for cache %s : %s",
-        params_.cache_name.Latin1().c_str(), CacheStorageErrorString(error))));
+    callback_->sendFailure(ProtocolResponse::ServerError(
+        String::Format("Error requesting responses for cache %s : %s",
+                       params_.cache_name.Latin1().c_str(),
+                       CacheStorageErrorString(error))
+            .Utf8()));
   }
 
   std::unique_ptr<Array<Header>> SerializeHeaders(
@@ -403,11 +407,12 @@
                std::unique_ptr<GetCacheKeysForRequestData> self,
                mojom::blink::CacheKeysResultPtr result) {
               if (result->is_status()) {
-                self->callback_->sendFailure(
-                    ProtocolResponse::Error(String::Format(
+                self->callback_->sendFailure(ProtocolResponse::ServerError(
+                    String::Format(
                         "Error requesting requests for cache %s: %s",
                         params.cache_name.Latin1().c_str(),
-                        CacheStorageErrorString(result->get_status()))));
+                        CacheStorageErrorString(result->get_status()))
+                        .Utf8()));
               } else {
                 if (result->get_keys().IsEmpty()) {
                   auto array = std::make_unique<protocol::Array<DataEntry>>();
@@ -454,8 +459,10 @@
   }
 
   void DidFail(FileErrorCode error) override {
-    callback_->sendFailure(ProtocolResponse::Error(String::Format(
-        "Unable to read the cached response, error code: %d", error)));
+    callback_->sendFailure(ProtocolResponse::ServerError(
+        String::Format("Unable to read the cached response, error code: %d",
+                       error)
+            .Utf8()));
     dispose();
   }
 
@@ -525,7 +532,7 @@
 
   ProtocolResponse response =
       AssertCacheStorage(security_origin, frames_, &caches_, &cache_storage);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(response);
     return;
   }
@@ -565,7 +572,7 @@
   mojom::blink::CacheStorage* cache_storage = nullptr;
   ProtocolResponse response = AssertCacheStorageAndNameForId(
       cache_id, frames_, &cache_name, &caches_, &cache_storage);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(response);
     return;
   }
@@ -582,10 +589,11 @@
              std::unique_ptr<RequestEntriesCallback> callback,
              mojom::blink::OpenResultPtr result) {
             if (result->is_status()) {
-              callback->sendFailure(ProtocolResponse::Error(String::Format(
-                  "Error requesting cache %s: %s",
-                  params.cache_name.Latin1().c_str(),
-                  CacheStorageErrorString(result->get_status()))));
+              callback->sendFailure(ProtocolResponse::ServerError(
+                  String::Format("Error requesting cache %s: %s",
+                                 params.cache_name.Latin1().c_str(),
+                                 CacheStorageErrorString(result->get_status()))
+                      .Utf8()));
             } else {
               auto request = std::make_unique<GetCacheKeysForRequestData>(
                   params, std::move(result->get_cache()), std::move(callback));
@@ -608,7 +616,7 @@
   mojom::blink::CacheStorage* cache_storage = nullptr;
   ProtocolResponse response = AssertCacheStorageAndNameForId(
       cache_id, frames_, &cache_name, &caches_, &cache_storage);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(response);
     return;
   }
@@ -620,9 +628,10 @@
             if (error == mojom::blink::CacheStorageError::kSuccess) {
               callback->sendSuccess();
             } else {
-              callback->sendFailure(ProtocolResponse::Error(
+              callback->sendFailure(ProtocolResponse::ServerError(
                   String::Format("Error requesting cache names: %s",
-                                 CacheStorageErrorString(error))));
+                                 CacheStorageErrorString(error))
+                      .Utf8()));
             }
           },
           std::move(callback)));
@@ -641,7 +650,7 @@
   mojom::blink::CacheStorage* cache_storage = nullptr;
   ProtocolResponse response = AssertCacheStorageAndNameForId(
       cache_id, frames_, &cache_name, &caches_, &cache_storage);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(response);
     return;
   }
@@ -652,9 +661,11 @@
              std::unique_ptr<DeleteEntryCallback> callback,
              mojom::blink::OpenResultPtr result) {
             if (result->is_status()) {
-              callback->sendFailure(ProtocolResponse::Error(String::Format(
-                  "Error requesting cache %s: %s", cache_name.Latin1().c_str(),
-                  CacheStorageErrorString(result->get_status()))));
+              callback->sendFailure(ProtocolResponse::ServerError(
+                  String::Format("Error requesting cache %s: %s",
+                                 cache_name.Latin1().c_str(),
+                                 CacheStorageErrorString(result->get_status()))
+                      .Utf8()));
             } else {
               Vector<mojom::blink::BatchOperationPtr> batch_operations;
               batch_operations.push_back(mojom::blink::BatchOperation::New());
@@ -677,10 +688,11 @@
                          mojom::blink::CacheStorageVerboseErrorPtr error) {
                         if (error->value !=
                             mojom::blink::CacheStorageError::kSuccess) {
-                          callback->sendFailure(
-                              ProtocolResponse::Error(String::Format(
+                          callback->sendFailure(ProtocolResponse::ServerError(
+                              String::Format(
                                   "Error deleting cache entry: %s",
-                                  CacheStorageErrorString(error->value))));
+                                  CacheStorageErrorString(error->value))
+                                  .Utf8()));
                         } else {
                           callback->sendSuccess();
                         }
@@ -706,7 +718,7 @@
   mojom::blink::CacheStorage* cache_storage = nullptr;
   ProtocolResponse response = AssertCacheStorageAndNameForId(
       cache_id, frames_, &cache_name, &caches_, &cache_storage);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     callback->sendFailure(response);
     return;
   }
@@ -729,9 +741,10 @@
           [](std::unique_ptr<RequestCachedResponseCallback> callback,
              mojom::blink::MatchResultPtr result) {
             if (result->is_status()) {
-              callback->sendFailure(ProtocolResponse::Error(String::Format(
-                  "Unable to read cached response: %s",
-                  CacheStorageErrorString(result->get_status()))));
+              callback->sendFailure(ProtocolResponse::ServerError(
+                  String::Format("Unable to read cached response: %s",
+                                 CacheStorageErrorString(result->get_status()))
+                      .Utf8()));
             } else {
               std::unique_ptr<protocol::DictionaryValue> headers =
                   protocol::DictionaryValue::create();
diff --git a/third_party/blink/renderer/modules/device_orientation/device_orientation_inspector_agent.cc b/third_party/blink/renderer/modules/device_orientation/device_orientation_inspector_agent.cc
index 02e287e..2c95993 100644
--- a/third_party/blink/renderer/modules/device_orientation/device_orientation_inspector_agent.cc
+++ b/third_party/blink/renderer/modules/device_orientation/device_orientation_inspector_agent.cc
@@ -51,7 +51,7 @@
         DeviceOrientationData::Create(alpha, beta, gamma, false));
   }
   sensor_agent_->SetOrientationSensorOverride(alpha, beta, gamma);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response DeviceOrientationInspectorAgent::clearDeviceOrientationOverride() {
@@ -63,7 +63,7 @@
   if (Controller())
     Controller()->ClearOverride();
   sensor_agent_->Disable();
-  return Response::OK();
+  return Response::Success();
 }
 
 void DeviceOrientationInspectorAgent::Restore() {
diff --git a/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h b/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h
index e621cb5d..c5f32ae 100644
--- a/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h
+++ b/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h
@@ -37,6 +37,10 @@
   void Start(blink::GamepadListener* listener);
   void Stop();
 
+  GamepadSharedMemoryReader(const GamepadSharedMemoryReader&) = delete;
+  GamepadSharedMemoryReader& operator=(const GamepadSharedMemoryReader&) =
+      delete;
+
  protected:
   void SendStartMessage();
   void SendStopMessage();
@@ -59,8 +63,6 @@
   mojo::Receiver<device::mojom::blink::GamepadObserver> receiver_{this};
   mojo::Remote<device::mojom::blink::GamepadMonitor> gamepad_monitor_remote_;
   blink::GamepadListener* listener_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(GamepadSharedMemoryReader);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
index cac5d40..6c8b3f0 100644
--- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
+++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -101,13 +101,13 @@
 Response AssertIDBFactory(Document* document, IDBFactory*& result) {
   LocalDOMWindow* dom_window = document->domWindow();
   if (!dom_window)
-    return Response::Error("No IndexedDB factory for given frame found");
+    return Response::ServerError("No IndexedDB factory for given frame found");
   IDBFactory* idb_factory = GlobalIndexedDB::indexedDB(*dom_window);
 
   if (!idb_factory)
-    return Response::Error("No IndexedDB factory for given frame found");
+    return Response::ServerError("No IndexedDB factory for given frame found");
   result = idb_factory;
-  return Response::OK();
+  return Response::Success();
 }
 
 class GetDatabaseNamesCallback final : public NativeEventListener {
@@ -121,7 +121,8 @@
 
   void Invoke(ExecutionContext*, Event* event) override {
     if (event->type() != event_type_names::kSuccess) {
-      request_callback_->sendFailure(Response::Error("Unexpected event type."));
+      request_callback_->sendFailure(
+          Response::ServerError("Unexpected event type."));
       return;
     }
 
@@ -129,7 +130,7 @@
     IDBAny* request_result = idb_request->ResultAsAny();
     if (request_result->GetType() != IDBAny::kDOMStringListType) {
       request_callback_->sendFailure(
-          Response::Error("Unexpected result type."));
+          Response::ServerError("Unexpected result type."));
       return;
     }
 
@@ -156,7 +157,7 @@
   void Invoke(ExecutionContext*, Event* event) override {
     if (event->type() != event_type_names::kSuccess) {
       request_callback_->sendFailure(
-          Response::Error("Failed to delete database."));
+          Response::ServerError("Failed to delete database."));
       return;
     }
     request_callback_->sendSuccess();
@@ -182,12 +183,12 @@
   void Start(LocalFrame* frame, const String& database_name) {
     Document* document = frame ? frame->GetDocument() : nullptr;
     if (!document) {
-      SendFailure(Response::Error(kNoDocumentError));
+      SendFailure(Response::ServerError(kNoDocumentError));
       return;
     }
     IDBFactory* idb_factory = nullptr;
     Response response = AssertIDBFactory(document, idb_factory);
-    if (!response.isSuccess()) {
+    if (!response.IsSuccess()) {
       SendFailure(response);
       return;
     }
@@ -216,7 +217,7 @@
     IDBOpenDBRequest* idb_open_db_request =
         idb_factory->open(script_state, database_name, exception_state);
     if (exception_state.HadException()) {
-      SendFailure(Response::Error("Could not open database."));
+      SendFailure(Response::ServerError("Could not open database."));
       return;
     }
     idb_open_db_request->addEventListener(event_type_names::kUpgradeneeded,
@@ -250,7 +251,7 @@
   void Invoke(ExecutionContext* context, Event* event) override {
     if (event->type() != event_type_names::kSuccess) {
       executable_with_database_->GetRequestCallback()->sendFailure(
-          Response::Error("Unexpected event type."));
+          Response::ServerError("Unexpected event type."));
       return;
     }
 
@@ -259,7 +260,7 @@
     IDBAny* request_result = idb_open_db_request->ResultAsAny();
     if (request_result->GetType() != IDBAny::kIDBDatabaseType) {
       executable_with_database_->GetRequestCallback()->sendFailure(
-          Response::Error("Unexpected result type."));
+          Response::ServerError("Unexpected result type."));
       return;
     }
 
@@ -297,7 +298,7 @@
   void Invoke(ExecutionContext* context, Event* event) override {
     if (event->type() != event_type_names::kUpgradeneeded) {
       executable_with_database_->GetRequestCallback()->sendFailure(
-          Response::Error("Unexpected event type."));
+          Response::ServerError("Unexpected event type."));
       return;
     }
 
@@ -309,7 +310,7 @@
     NonThrowableExceptionState exception_state;
     idb_open_db_request->transaction()->abort(exception_state);
     executable_with_database_->GetRequestCallback()->sendFailure(
-        Response::Error("Aborted upgrade."));
+        Response::ServerError("Aborted upgrade."));
   }
 
  private:
@@ -537,7 +538,8 @@
 
   void Invoke(ExecutionContext*, Event* event) override {
     if (event->type() != event_type_names::kSuccess) {
-      request_callback_->sendFailure(Response::Error("Unexpected event type."));
+      request_callback_->sendFailure(
+          Response::ServerError("Unexpected event type."));
       return;
     }
 
@@ -549,7 +551,7 @@
     }
     if (request_result->GetType() != IDBAny::kIDBCursorWithValueType) {
       request_callback_->sendFailure(
-          Response::Error("Unexpected result type."));
+          Response::ServerError("Unexpected result type."));
       return;
     }
 
@@ -560,7 +562,7 @@
       idb_cursor->advance(skip_count_, exception_state);
       if (exception_state.HadException()) {
         request_callback_->sendFailure(
-            Response::Error("Could not advance cursor."));
+            Response::ServerError("Could not advance cursor."));
       }
       skip_count_ = 0;
       return;
@@ -578,7 +580,7 @@
                          exception_state);
     if (exception_state.HadException()) {
       request_callback_->sendFailure(
-          Response::Error("Could not continue cursor."));
+          Response::ServerError("Could not continue cursor."));
       return;
     }
 
@@ -644,14 +646,14 @@
         TransactionForDatabase(script_state, idb_database, object_store_name_);
     if (!idb_transaction) {
       request_callback_->sendFailure(
-          Response::Error("Could not get transaction"));
+          Response::ServerError("Could not get transaction"));
       return;
     }
     IDBObjectStore* idb_object_store =
         ObjectStoreForTransaction(idb_transaction, object_store_name_);
     if (!idb_object_store) {
       request_callback_->sendFailure(
-          Response::Error("Could not get object store"));
+          Response::ServerError("Could not get object store"));
       return;
     }
 
@@ -659,7 +661,8 @@
     if (!index_name_.IsEmpty()) {
       IDBIndex* idb_index = IndexForObjectStore(idb_object_store, index_name_);
       if (!idb_index) {
-        request_callback_->sendFailure(Response::Error("Could not get index"));
+        request_callback_->sendFailure(
+            Response::ServerError("Could not get index"));
         return;
       }
 
@@ -729,14 +732,14 @@
 
 Response InspectorIndexedDBAgent::enable() {
   enabled_.Set(true);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorIndexedDBAgent::disable() {
   enabled_.Clear();
   v8_session_->releaseObjectGroup(
       ToV8InspectorStringView(kIndexedDBObjectGroup));
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorIndexedDBAgent::requestDatabaseNames(
@@ -746,12 +749,12 @@
       inspected_frames_->FrameWithSecurityOrigin(security_origin);
   Document* document = frame ? frame->GetDocument() : nullptr;
   if (!document) {
-    request_callback->sendFailure(Response::Error(kNoDocumentError));
+    request_callback->sendFailure(Response::ServerError(kNoDocumentError));
     return;
   }
   IDBFactory* idb_factory = nullptr;
   Response response = AssertIDBFactory(document, idb_factory);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     request_callback->sendFailure(response);
     return;
   }
@@ -767,7 +770,7 @@
       idb_factory->GetDatabaseNames(script_state, exception_state);
   if (exception_state.HadException()) {
     request_callback->sendFailure(
-        Response::Error("Could not obtain database names."));
+        Response::ServerError("Could not obtain database names."));
     return;
   }
   idb_request->addEventListener(
@@ -802,7 +805,8 @@
       key_range.isJust() ? IdbKeyRangeFromKeyRange(key_range.fromJust())
                          : nullptr;
   if (key_range.isJust() && !idb_key_range) {
-    request_callback->sendFailure(Response::Error("Can not parse key range."));
+    request_callback->sendFailure(
+        Response::ServerError("Can not parse key range."));
     return;
   }
 
@@ -857,7 +861,7 @@
 
   void NotifySubtaskDone(const String& error) {
     if (!error.IsNull()) {
-      request_callback_->sendFailure(Response::Error(error));
+      request_callback_->sendFailure(Response::ServerError(error.Utf8()));
       return;
     }
     if (--subtask_pending_ == 0) {
@@ -881,14 +885,14 @@
                                indexed_db_names::kReadonly);
     if (!idb_transaction) {
       request_callback_->sendFailure(
-          Response::Error("Could not get transaction"));
+          Response::ServerError("Could not get transaction"));
       return;
     }
     IDBObjectStore* idb_object_store =
         ObjectStoreForTransaction(idb_transaction, object_store_name_);
     if (!idb_object_store) {
       request_callback_->sendFailure(
-          Response::Error("Could not get object store"));
+          Response::ServerError("Could not get object store"));
       return;
     }
 
@@ -901,9 +905,10 @@
     DCHECK(!exception_state.HadException());
     if (exception_state.HadException()) {
       ExceptionCode ec = exception_state.Code();
-      request_callback_->sendFailure(Response::Error(
+      request_callback_->sendFailure(Response::ServerError(
           String::Format("Could not count entries in object store '%s': %d",
-                         object_store_name_.Utf8().c_str(), ec)));
+                         object_store_name_.Latin1().c_str(), ec)
+              .Utf8()));
       return;
     }
     GetMetadataListener* listener_get_entries_count =
@@ -964,7 +969,7 @@
   void Invoke(ExecutionContext*, Event* event) override {
     if (event->type() != event_type_names::kSuccess) {
       request_callback_->sendFailure(
-          Response::Error("Failed to delete specified entries"));
+          Response::ServerError("Failed to delete specified entries"));
       return;
     }
 
@@ -1000,14 +1005,14 @@
                                indexed_db_names::kReadwrite);
     if (!idb_transaction) {
       request_callback_->sendFailure(
-          Response::Error("Could not get transaction"));
+          Response::ServerError("Could not get transaction"));
       return;
     }
     IDBObjectStore* idb_object_store =
         ObjectStoreForTransaction(idb_transaction, object_store_name_);
     if (!idb_object_store) {
       request_callback_->sendFailure(
-          Response::Error("Could not get object store"));
+          Response::ServerError("Could not get object store"));
       return;
     }
 
@@ -1038,7 +1043,8 @@
     std::unique_ptr<DeleteObjectStoreEntriesCallback> request_callback) {
   IDBKeyRange* idb_key_range = IdbKeyRangeFromKeyRange(key_range.get());
   if (!idb_key_range) {
-    request_callback->sendFailure(Response::Error("Can not parse key range"));
+    request_callback->sendFailure(
+        Response::ServerError("Can not parse key range"));
     return;
   }
   scoped_refptr<DeleteObjectStoreEntries> delete_object_store_entries =
@@ -1058,7 +1064,8 @@
 
   void Invoke(ExecutionContext*, Event* event) override {
     if (event->type() != event_type_names::kComplete) {
-      request_callback_->sendFailure(Response::Error("Unexpected event type."));
+      request_callback_->sendFailure(
+          Response::ServerError("Unexpected event type."));
       return;
     }
 
@@ -1090,14 +1097,14 @@
                                indexed_db_names::kReadwrite);
     if (!idb_transaction) {
       request_callback_->sendFailure(
-          Response::Error("Could not get transaction"));
+          Response::ServerError("Could not get transaction"));
       return;
     }
     IDBObjectStore* idb_object_store =
         ObjectStoreForTransaction(idb_transaction, object_store_name_);
     if (!idb_object_store) {
       request_callback_->sendFailure(
-          Response::Error("Could not get object store"));
+          Response::ServerError("Could not get object store"));
       return;
     }
 
@@ -1106,9 +1113,10 @@
     DCHECK(!exception_state.HadException());
     if (exception_state.HadException()) {
       ExceptionCode ec = exception_state.Code();
-      request_callback_->sendFailure(Response::Error(
+      request_callback_->sendFailure(Response::ServerError(
           String::Format("Could not clear object store '%s': %d",
-                         object_store_name_.Utf8().c_str(), ec)));
+                         object_store_name_.Latin1().c_str(), ec)
+              .Utf8()));
       return;
     }
     idb_transaction->addEventListener(
@@ -1147,12 +1155,12 @@
       inspected_frames_->FrameWithSecurityOrigin(security_origin);
   Document* document = frame ? frame->GetDocument() : nullptr;
   if (!document) {
-    request_callback->sendFailure(Response::Error(kNoDocumentError));
+    request_callback->sendFailure(Response::ServerError(kNoDocumentError));
     return;
   }
   IDBFactory* idb_factory = nullptr;
   Response response = AssertIDBFactory(document, idb_factory);
-  if (!response.isSuccess()) {
+  if (!response.IsSuccess()) {
     request_callback->sendFailure(response);
     return;
   }
@@ -1168,7 +1176,7 @@
       script_state, database_name, exception_state);
   if (exception_state.HadException()) {
     request_callback->sendFailure(
-        Response::Error("Could not delete database."));
+        Response::ServerError("Could not delete database."));
     return;
   }
   idb_request->addEventListener(
diff --git a/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc b/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc
index 1a3a3d9..39eda8d2 100644
--- a/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc
+++ b/third_party/blink/renderer/modules/storage/inspector_dom_storage_agent.cc
@@ -49,14 +49,15 @@
 
 static Response ToResponse(ExceptionState& exception_state) {
   if (!exception_state.HadException())
-    return Response::OK();
+    return Response::Success();
 
   String name_prefix = IsDOMExceptionCode(exception_state.Code())
                            ? DOMException::GetErrorName(
                                  exception_state.CodeAs<DOMExceptionCode>()) +
                                  " "
                            : g_empty_string;
-  return Response::Error(name_prefix + exception_state.Message());
+  String msg = name_prefix + exception_state.Message();
+  return Response::ServerError(msg.Utf8());
 }
 
 InspectorDOMStorageAgent::InspectorDOMStorageAgent(
@@ -86,15 +87,15 @@
 
 Response InspectorDOMStorageAgent::enable() {
   if (enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(true);
   InnerEnable();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMStorageAgent::disable() {
   if (!enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(false);
   StorageController::GetInstance()->RemoveLocalStorageInspectorStorageAgent(
       this);
@@ -102,20 +103,20 @@
       StorageNamespace::From(inspected_frames_->Root()->GetPage());
   if (ns)
     ns->RemoveInspectorStorageAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMStorageAgent::clear(
     std::unique_ptr<protocol::DOMStorage::StorageId> storage_id) {
   StorageArea* storage_area = nullptr;
   Response response = FindStorageArea(std::move(storage_id), storage_area);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
   DummyExceptionStateForTesting exception_state;
   storage_area->clear(exception_state);
   if (exception_state.HadException())
-    return Response::Error("Could not clear the storage");
-  return Response::OK();
+    return Response::ServerError("Could not clear the storage");
+  return Response::Success();
 }
 
 Response InspectorDOMStorageAgent::getDOMStorageItems(
@@ -123,7 +124,7 @@
     std::unique_ptr<protocol::Array<protocol::Array<String>>>* items) {
   StorageArea* storage_area = nullptr;
   Response response = FindStorageArea(std::move(storage_id), storage_area);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   auto storage_items =
@@ -133,11 +134,11 @@
   for (unsigned i = 0; i < storage_area->length(exception_state); ++i) {
     String name(storage_area->key(i, exception_state));
     response = ToResponse(exception_state);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
     String value(storage_area->getItem(name, exception_state));
     response = ToResponse(exception_state);
-    if (!response.isSuccess())
+    if (!response.IsSuccess())
       return response;
     auto entry = std::make_unique<protocol::Array<String>>();
     entry->emplace_back(name);
@@ -145,7 +146,7 @@
     storage_items->emplace_back(std::move(entry));
   }
   *items = std::move(storage_items);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDOMStorageAgent::setDOMStorageItem(
@@ -154,7 +155,7 @@
     const String& value) {
   StorageArea* storage_area = nullptr;
   Response response = FindStorageArea(std::move(storage_id), storage_area);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -167,7 +168,7 @@
     const String& key) {
   StorageArea* storage_area = nullptr;
   Response response = FindStorageArea(std::move(storage_id), storage_area);
-  if (!response.isSuccess())
+  if (!response.IsSuccess())
     return response;
 
   DummyExceptionStateForTesting exception_state;
@@ -214,26 +215,31 @@
   bool is_local_storage = storage_id->getIsLocalStorage();
   LocalFrame* frame =
       inspected_frames_->FrameWithSecurityOrigin(security_origin);
-  if (!frame)
-    return Response::Error("Frame not found for the given security origin");
-
+  if (!frame) {
+    return Response::ServerError(
+        "Frame not found for the given security origin");
+  }
   if (is_local_storage) {
-    if (!frame->GetDocument()->GetSecurityOrigin()->CanAccessLocalStorage())
-      return Response::Error("Security origin cannot access local storage");
+    if (!frame->GetDocument()->GetSecurityOrigin()->CanAccessLocalStorage()) {
+      return Response::ServerError(
+          "Security origin cannot access local storage");
+    }
     storage_area = StorageArea::CreateForInspectorAgent(
         frame,
         StorageController::GetInstance()->GetLocalStorageArea(
             frame->GetDocument()->GetSecurityOrigin()),
         StorageArea::StorageType::kLocalStorage);
-    return Response::OK();
+    return Response::Success();
   }
 
-  if (!frame->GetDocument()->GetSecurityOrigin()->CanAccessSessionStorage())
-    return Response::Error("Security origin cannot access session storage");
+  if (!frame->GetDocument()->GetSecurityOrigin()->CanAccessSessionStorage()) {
+    return Response::ServerError(
+        "Security origin cannot access session storage");
+  }
   StorageNamespace* session_namespace =
       StorageNamespace::From(frame->GetPage());
   if (!session_namespace)
-    return Response::Error("SessionStorage is not supported");
+    return Response::ServerError("SessionStorage is not supported");
   DCHECK(session_namespace->IsSessionStorage());
 
   storage_area = StorageArea::CreateForInspectorAgent(
@@ -241,7 +247,7 @@
       session_namespace->GetCachedArea(
           frame->GetDocument()->GetSecurityOrigin()),
       StorageArea::StorageType::kSessionStorage);
-  return Response::OK();
+  return Response::Success();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
index 719d682..8d008c2 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -178,6 +178,12 @@
   DCHECK_EQ(resume_resolvers_.size(), 0u);
 }
 
+void BaseAudioContext::Dispose() {
+  // BaseAudioContext is going away, so remove the context from the orphan
+  // handlers.
+  GetDeferredTaskHandler().ClearContextFromOrphanHandlers();
+}
+
 void BaseAudioContext::ContextLifecycleStateChanged(
     mojom::FrameLifecycleState state) {
   // Don't need to do anything for an offline context.
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
index 206c2dd..4a253013 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h
@@ -96,6 +96,7 @@
       public InspectorHelperMixin {
   USING_GARBAGE_COLLECTED_MIXIN(BaseAudioContext);
   DEFINE_WRAPPERTYPEINFO();
+  USING_PRE_FINALIZER(BaseAudioContext, Dispose);
 
  public:
   // The state of an audio context.  On creation, the state is Suspended. The
@@ -115,6 +116,8 @@
     return dest ? dest->GetAudioDestinationHandler().IsInitialized() : false;
   }
 
+  void Dispose();
+
   // Document notification
   void ContextLifecycleStateChanged(mojom::FrameLifecycleState) override;
   void ContextDestroyed() override;
diff --git a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc
index 00bfc7b..09e88ac 100644
--- a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc
+++ b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.cc
@@ -302,10 +302,7 @@
 }
 
 void DeferredTaskHandler::ContextWillBeDestroyed() {
-  for (auto& handler : rendering_orphan_handlers_)
-    handler->ClearContext();
-  for (auto& handler : deletable_orphan_handlers_)
-    handler->ClearContext();
+  ClearContextFromOrphanHandlers();
   ClearHandlersToBeDeleted();
   // Some handlers might live because of their cross thread tasks.
 }
@@ -374,6 +371,19 @@
   active_source_handlers_.clear();
 }
 
+void DeferredTaskHandler::ClearContextFromOrphanHandlers() {
+  DCHECK(IsMainThread());
+
+  // |rendering_orphan_handlers_| and |deletable_orphan_handlers_| can
+  // be modified on the audio thread.
+  GraphAutoLocker locker(*this);
+
+  for (auto& handler : rendering_orphan_handlers_)
+    handler->ClearContext();
+  for (auto& handler : deletable_orphan_handlers_)
+    handler->ClearContext();
+}
+
 void DeferredTaskHandler::SetAudioThreadToCurrentThread() {
   DCHECK(!IsMainThread());
   audio_thread_.store(CurrentThread(), std::memory_order_relaxed);
diff --git a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h
index 49cbf69..0530c7f 100644
--- a/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h
+++ b/third_party/blink/renderer/modules/webaudio/deferred_task_handler.h
@@ -111,6 +111,9 @@
   void RequestToDeleteHandlersOnMainThread();
   void ClearHandlersToBeDeleted();
 
+  // Clear the context from the rendering and deletable orphan handlers.
+  void ClearContextFromOrphanHandlers();
+
   bool AcceptsTailProcessing() const { return accepts_tail_processing_; }
   void StopAcceptingTailProcessing() { accepts_tail_processing_ = false; }
 
diff --git a/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc b/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc
index 8587ce7e..5d679a8 100644
--- a/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc
+++ b/third_party/blink/renderer/modules/webaudio/inspector_web_audio_agent.cc
@@ -74,20 +74,20 @@
 
 Response InspectorWebAudioAgent::enable() {
   if (enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(true);
   AudioGraphTracer* graph_tracer = AudioGraphTracer::FromPage(page_);
   graph_tracer->SetInspectorAgent(this);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorWebAudioAgent::disable() {
   if (!enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Clear();
   AudioGraphTracer* graph_tracer = AudioGraphTracer::FromPage(page_);
   graph_tracer->SetInspectorAgent(nullptr);
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorWebAudioAgent::getRealtimeData(
@@ -95,14 +95,14 @@
     std::unique_ptr<ContextRealtimeData>* out_data) {
   auto* const graph_tracer = AudioGraphTracer::FromPage(page_);
   if (!enabled_.Get())
-    return Response::Error("Enable agent first.");
+    return Response::ServerError("Enable agent first.");
 
   BaseAudioContext* context = graph_tracer->GetContextById(contextId);
   if (!context)
-    return Response::Error("Cannot find BaseAudioContext with such id.");
+    return Response::ServerError("Cannot find BaseAudioContext with such id.");
 
   if (!context->HasRealtimeConstraint()) {
-    return Response::Error(
+    return Response::ServerError(
         "ContextRealtimeData is only avaliable for an AudioContext.");
   }
 
@@ -115,7 +115,7 @@
           .setCallbackIntervalMean(metric.mean_callback_interval)
           .setCallbackIntervalVariance(metric.variance_callback_interval)
           .build();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorWebAudioAgent::DidCreateBaseAudioContext(
diff --git a/third_party/blink/renderer/modules/webcodecs/DEPS b/third_party/blink/renderer/modules/webcodecs/DEPS
index 851b8a0..21f825ca 100644
--- a/third_party/blink/renderer/modules/webcodecs/DEPS
+++ b/third_party/blink/renderer/modules/webcodecs/DEPS
@@ -3,6 +3,7 @@
     "+media/base/media_util.h",
     "+media/base/video_decoder.h",
     "+media/base/video_frame.h",
+    "+media/base/status.h",
     "+ui/gfx/geometry/rect.h",
     "+ui/gfx/geometry/size.h",
 ]
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
index 94971c3..a7abd61 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.cc
@@ -206,11 +206,13 @@
   return writable_;
 }
 
-void VideoDecoder::OnInitializeDone(bool success) {
+void VideoDecoder::OnInitializeDone(media::Status status) {
   DVLOG(3) << __func__;
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!success) {
+  if (!status.is_ok()) {
+    // TODO(tmathmeyer) this drops the media error - should we consider logging
+    // it or converting it to the DOMException type somehow?
     configure_resolver_.Release()->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kNotSupportedError, "Codec initialization failed."));
     HandleError();
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder.h b/third_party/blink/renderer/modules/webcodecs/video_decoder.h
index 8609c42..ae46749 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_decoder.h
+++ b/third_party/blink/renderer/modules/webcodecs/video_decoder.h
@@ -9,6 +9,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
+#include "media/base/status.h"
 #include "media/base/video_decoder.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -55,7 +56,7 @@
   void HandleError();
 
   // Called by |decoder_|.
-  void OnInitializeDone(bool success);
+  void OnInitializeDone(media::Status status);
   void OnDecodeDone(media::DecodeStatus);
   void OnOutput(scoped_refptr<media::VideoFrame>);
 
diff --git a/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc b/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
index e5ceef6..8f15d753 100644
--- a/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
+++ b/third_party/blink/renderer/modules/webdatabase/inspector_database_agent.cc
@@ -235,20 +235,20 @@
 
 Response InspectorDatabaseAgent::enable() {
   if (enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(true);
   InnerEnable();
-  return Response::OK();
+  return Response::Success();
 }
 
 Response InspectorDatabaseAgent::disable() {
   if (!enabled_.Get())
-    return Response::OK();
+    return Response::Success();
   enabled_.Set(false);
   if (DatabaseClient* client = DatabaseClient::FromPage(page_))
     client->SetInspectorAgent(nullptr);
   resources_.clear();
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDatabaseAgent::Restore() {
@@ -260,7 +260,7 @@
     const String& database_id,
     std::unique_ptr<protocol::Array<String>>* names) {
   if (!enabled_.Get())
-    return Response::Error("Database agent is not enabled");
+    return Response::ServerError("Database agent is not enabled");
 
   blink::Database* database = DatabaseForId(database_id);
   if (database) {
@@ -270,7 +270,7 @@
   } else {
     *names = std::make_unique<protocol::Array<String>>();
   }
-  return Response::OK();
+  return Response::Success();
 }
 
 void InspectorDatabaseAgent::executeSQL(
@@ -282,13 +282,13 @@
 
   if (!enabled_.Get()) {
     request_callback->sendFailure(
-        Response::Error("Database agent is not enabled"));
+        Response::ServerError("Database agent is not enabled"));
     return;
   }
 
   blink::Database* database = DatabaseForId(database_id);
   if (!database) {
-    request_callback->sendFailure(Response::Error("Database not found"));
+    request_callback->sendFailure(Response::ServerError("Database not found"));
     return;
   }
 
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index ffe76258..01944dab 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -2236,7 +2236,6 @@
     "graphics/graphics_layer_test.cc",
     "graphics/image_decoding_store_test.cc",
     "graphics/image_frame_generator_test.cc",
-    "graphics/image_layer_chromium_test.cc",
     "graphics/paint_worklet_paint_dispatcher_test.cc",
     "graphics/test/fake_canvas_resource_host.h",
     "graphics/test/fake_gles2_interface.h",
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
index 81da985a..54a6b78e 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -33,7 +33,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/trace_event/traced_value.h"
 #include "cc/layers/layer.h"
-#include "cc/layers/picture_image_layer.h"
 #include "cc/layers/picture_layer.h"
 #include "cc/paint/display_item_list.h"
 #include "third_party/blink/public/platform/platform.h"
@@ -43,7 +42,6 @@
 #include "third_party/blink/renderer/platform/geometry/geometry_as_json.h"
 #include "third_party/blink/renderer/platform/geometry/layout_rect.h"
 #include "third_party/blink/renderer/platform/geometry/region.h"
-#include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
 #include "third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.h"
 #include "third_party/blink/renderer/platform/graphics/compositor_filter_operations.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_context.h"
@@ -74,7 +72,6 @@
       contents_visible_(true),
       hit_testable_(false),
       needs_check_raster_invalidation_(false),
-      contents_layer_is_picture_image_layer_(false),
       painted_(false),
       painting_phase_(kGraphicsLayerPaintAllWithOverflowClip),
       parent_(nullptr),
@@ -427,10 +424,6 @@
     return;
 
   IntSize contents_size = contents_rect_.Size();
-  if (contents_layer_is_picture_image_layer_) {
-    if (!contents_size.IsEmpty() && !image_size_.IsEmpty())
-      contents_size = image_size_;
-  }
   contents_layer_->SetBounds(gfx::Size(contents_size));
 }
 
@@ -439,7 +432,6 @@
     bool prevent_contents_opaque_changes) {
   DCHECK_NE(contents_layer, layer_);
   SetContentsTo(std::move(contents_layer), prevent_contents_opaque_changes);
-  contents_layer_is_picture_image_layer_ = false;
 }
 
 void GraphicsLayer::SetContentsTo(scoped_refptr<cc::Layer> layer,
@@ -639,70 +631,10 @@
   client_.GraphicsLayersDidChange();
 }
 
-void GraphicsLayer::SetContentsToImage(
-    Image* image,
-    Image::ImageDecodingMode decode_mode,
-    RespectImageOrientationEnum respect_image_orientation) {
-  PaintImage paint_image;
-  if (image)
-    paint_image = image->PaintImageForCurrentFrame();
-
-  ImageOrientation image_orientation = kOriginTopLeft;
-  SkMatrix matrix;
-  auto* bitmap_image = DynamicTo<BitmapImage>(image);
-  if (paint_image && bitmap_image &&
-      respect_image_orientation == kRespectImageOrientation) {
-    image_orientation = bitmap_image->CurrentFrameOrientation();
-    image_size_ = IntSize(paint_image.width(), paint_image.height());
-    if (image_orientation.UsesWidthAsHeight())
-      image_size_ = image_size_.TransposedSize();
-    auto affine =
-        image_orientation.TransformFromDefault(FloatSize(image_size_));
-    auto transform = affine.ToTransformationMatrix();
-    matrix = SkMatrix(TransformationMatrix::ToSkMatrix44(transform));
-  } else if (paint_image) {
-    matrix = SkMatrix::I();
-    image_size_ = IntSize(paint_image.width(), paint_image.height());
-  } else {
-    matrix = SkMatrix::I();
-    image_size_ = IntSize();
-  }
-
-  scoped_refptr<cc::PictureImageLayer> image_layer;
-  if (paint_image) {
-    paint_image =
-        PaintImageBuilder::WithCopy(std::move(paint_image))
-            .set_decoding_mode(Image::ToPaintImageDecodingMode(decode_mode))
-            .TakePaintImage();
-    if (!contents_layer_is_picture_image_layer_) {
-      image_layer = cc::PictureImageLayer::Create();
-      contents_layer_is_picture_image_layer_ = true;
-    } else {
-      image_layer = static_cast<cc::PictureImageLayer*>(contents_layer_.get());
-    }
-    image_layer->SetImage(std::move(paint_image), matrix,
-                          image_orientation.UsesWidthAsHeight());
-    // Image layers can not be marked as opaque due to crbug.com/870857.
-    image_layer->SetContentsOpaque(false);
-  } else {
-    contents_layer_is_picture_image_layer_ = false;
-  }
-
-  SetContentsTo(std::move(image_layer),
-                /* prevent_contents_opaque_changes=*/true);
-}
-
 cc::PictureLayer* GraphicsLayer::CcLayer() const {
   return layer_.get();
 }
 
-void GraphicsLayer::SetFilterQuality(SkFilterQuality filter_quality) {
-  if (contents_layer_is_picture_image_layer_) {
-    static_cast<cc::PictureImageLayer*>(contents_layer_.get())
-        ->SetNearestNeighbor(filter_quality == kNone_SkFilterQuality);
-  }
-}
-
 void GraphicsLayer::SetPaintingPhase(GraphicsLayerPaintingPhase phase) {
   if (painting_phase_ == phase)
     return;
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h
index 14ed1bad1..fa98836 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer.h
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -63,7 +63,6 @@
 
 namespace blink {
 
-class Image;
 class PaintController;
 class RasterInvalidationTracking;
 class RasterInvalidator;
@@ -170,11 +169,6 @@
   // Set that the position/size of the contents (image or video).
   void SetContentsRect(const IntRect&);
 
-  // Layer contents
-  void SetContentsToImage(
-      Image*,
-      Image::ImageDecodingMode decode_mode,
-      RespectImageOrientationEnum = kRespectImageOrientation);
   // If |prevent_contents_opaque_changes| is set to true, then calls to
   // SetContentsOpaque() will not be passed on to |contents_layer|. Use when
   // the client wants to have control of the opaqueness of |contents_layer|
@@ -301,7 +295,6 @@
   bool contents_visible_ : 1;
   bool hit_testable_ : 1;
   bool needs_check_raster_invalidation_ : 1;
-  bool contents_layer_is_picture_image_layer_ : 1;
 
   bool painted_ : 1;
 
diff --git a/third_party/blink/renderer/platform/graphics/image_layer_chromium_test.cc b/third_party/blink/renderer/platform/graphics/image_layer_chromium_test.cc
deleted file mode 100644
index bd11e25..0000000
--- a/third_party/blink/renderer/platform/graphics/image_layer_chromium_test.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2011 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1.  Redistributions of source code must retain the above copyright
- *     notice, this list of conditions and the following disclaimer.
- * 2.  Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the
- *     documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- */
-
-#include "third_party/blink/renderer/platform/graphics/image.h"
-
-#include <memory>
-
-#include "cc/layers/picture_layer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
-#include "third_party/blink/renderer/platform/testing/fake_graphics_layer.h"
-#include "third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h"
-#include "third_party/skia/include/core/SkImage.h"
-#include "third_party/skia/include/core/SkSurface.h"
-
-namespace blink {
-
-namespace {
-
-class TestImage : public Image {
- public:
-  static scoped_refptr<TestImage> Create(const IntSize& size, bool opaque) {
-    return base::AdoptRef(new TestImage(size, opaque));
-  }
-
-  bool CurrentFrameKnownToBeOpaque() override { return image_->isOpaque(); }
-
-  IntSize Size() const override { return size_; }
-
-  void DestroyDecodedData() override {
-    // Image pure virtual stub.
-  }
-
-  void Draw(cc::PaintCanvas*,
-            const PaintFlags&,
-            const FloatRect&,
-            const FloatRect&,
-            RespectImageOrientationEnum,
-            ImageClampingMode,
-            ImageDecodingMode) override {
-    // Image pure virtual stub.
-  }
-
-  PaintImage PaintImageForCurrentFrame() override {
-    return CreatePaintImageBuilder()
-        .set_image(image_, PaintImage::GetNextContentId())
-        .TakePaintImage();
-  }
-
- private:
-  TestImage(IntSize size, bool opaque) : Image(nullptr), size_(size) {
-    sk_sp<SkSurface> surface = CreateSkSurface(size, opaque);
-    if (!surface)
-      return;
-
-    surface->getCanvas()->clear(SK_ColorTRANSPARENT);
-    image_ = surface->makeImageSnapshot();
-  }
-
-  static sk_sp<SkSurface> CreateSkSurface(IntSize size, bool opaque) {
-    return SkSurface::MakeRaster(SkImageInfo::MakeN32(
-        size.Width(), size.Height(),
-        opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType));
-  }
-
-  IntSize size_;
-  sk_sp<SkImage> image_;
-};
-
-}  // anonymous namespace
-
-TEST(ImageLayerChromiumTest, imageLayerContentReset) {
-  FakeGraphicsLayerClient client;
-  std::unique_ptr<FakeGraphicsLayer> graphics_layer =
-      std::make_unique<FakeGraphicsLayer>(client);
-  ASSERT_TRUE(graphics_layer.get());
-
-  ASSERT_FALSE(graphics_layer->HasContentsLayer());
-  ASSERT_FALSE(graphics_layer->ContentsLayer());
-
-  bool opaque = false;
-  scoped_refptr<Image> image = TestImage::Create(IntSize(100, 100), opaque);
-  ASSERT_TRUE(image.get());
-
-  graphics_layer->SetContentsToImage(image.get(), Image::kUnspecifiedDecode);
-  ASSERT_TRUE(graphics_layer->HasContentsLayer());
-  ASSERT_TRUE(graphics_layer->ContentsLayer());
-
-  graphics_layer->SetContentsToImage(nullptr, Image::kUnspecifiedDecode);
-  ASSERT_FALSE(graphics_layer->HasContentsLayer());
-  ASSERT_FALSE(graphics_layer->ContentsLayer());
-}
-
-TEST(ImageLayerChromiumTest, opaqueImages) {
-  FakeGraphicsLayerClient client;
-  std::unique_ptr<FakeGraphicsLayer> graphics_layer =
-      std::make_unique<FakeGraphicsLayer>(client);
-  ASSERT_TRUE(graphics_layer.get());
-
-  bool opaque = true;
-  scoped_refptr<Image> opaque_image =
-      TestImage::Create(IntSize(100, 100), opaque);
-  ASSERT_TRUE(opaque_image.get());
-  scoped_refptr<Image> non_opaque_image =
-      TestImage::Create(IntSize(100, 100), !opaque);
-  ASSERT_TRUE(non_opaque_image.get());
-
-  ASSERT_FALSE(graphics_layer->ContentsLayer());
-
-  graphics_layer->SetContentsToImage(opaque_image.get(),
-                                     Image::kUnspecifiedDecode);
-  // This would normally have contents_opaque set but due to crbug.com/870857,
-  // we cannot set image layers as having contents_opaque.
-  ASSERT_FALSE(graphics_layer->ContentsLayer()->contents_opaque());
-
-  graphics_layer->SetContentsToImage(non_opaque_image.get(),
-                                     Image::kUnspecifiedDecode);
-  ASSERT_FALSE(graphics_layer->ContentsLayer()->contents_opaque());
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
index d2a6086c..f3fe44c 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
@@ -388,9 +388,16 @@
 
   media::VideoDecoder::OutputCB output_cb = ConvertToBaseRepeatingCallback(
       CrossThreadBindRepeating(&RTCVideoDecoderAdapter::OnOutput, weak_this_));
-  video_decoder_->Initialize(config, low_delay, cdm_context,
-                             ConvertToBaseOnceCallback(std::move(init_cb)),
-                             output_cb, base::DoNothing());
+  video_decoder_->Initialize(
+      config, low_delay, cdm_context,
+      base::BindOnce(&RTCVideoDecoderAdapter::OnInitializeDone, weak_this_,
+                     ConvertToBaseOnceCallback(std::move(init_cb))),
+      output_cb, base::DoNothing());
+}
+
+void RTCVideoDecoderAdapter::OnInitializeDone(base::OnceCallback<void(bool)> cb,
+                                              media::Status status) {
+  std::move(cb).Run(status.is_ok());
 }
 
 void RTCVideoDecoderAdapter::DecodeOnMediaThread() {
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.h b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.h
index de30ebf..6efb668 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.h
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.h
@@ -14,6 +14,7 @@
 #include "base/sequence_checker.h"
 #include "base/synchronization/lock.h"
 #include "media/base/decode_status.h"
+#include "media/base/status.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_decoder.h"
 #include "media/base/video_decoder_config.h"
@@ -99,6 +100,8 @@
   bool InitializeSync(const media::VideoDecoderConfig& config);
   void InitializeOnMediaThread(const media::VideoDecoderConfig& config,
                                InitCB init_cb);
+  void OnInitializeDone(base::OnceCallback<void(bool)> cb,
+                        media::Status status);
   void DecodeOnMediaThread();
   void OnDecodeDone(media::DecodeStatus status);
   void OnOutput(scoped_refptr<media::VideoFrame> frame);
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter_test.cc
index 213daa3..37becc9a 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter_test.cc
@@ -162,8 +162,12 @@
 
   bool CreateAndInitialize(bool init_cb_result = true) {
     EXPECT_CALL(*video_decoder_, Initialize_(_, _, _, _, _, _))
-        .WillOnce(DoAll(SaveArg<0>(&vda_config_), SaveArg<4>(&output_cb_),
-                        base::test::RunOnceCallback<3>(init_cb_result)));
+        .WillOnce(DoAll(
+            SaveArg<0>(&vda_config_), SaveArg<4>(&output_cb_),
+            base::test::RunOnceCallback<3>(
+                init_cb_result
+                    ? media::OkStatus()
+                    : media::Status(media::StatusCode::kCodeOnlyForTesting))));
     rtc_video_decoder_adapter_ =
         RTCVideoDecoderAdapter::Create(&gpu_factories_, sdp_format_);
     return !!rtc_video_decoder_adapter_;
@@ -363,7 +367,7 @@
   // First Decode() should cause a reinitialize as new color space is given.
   EXPECT_CALL(*video_decoder_, Initialize_(_, _, _, _, _, _))
       .WillOnce(DoAll(SaveArg<0>(&vda_config_),
-                      base::test::RunOnceCallback<3>(true)));
+                      base::test::RunOnceCallback<3>(media::OkStatus())));
   webrtc::EncodedImage first_input_image = GetEncodedImageWithColorSpace(0);
   ASSERT_EQ(rtc_video_decoder_adapter_->Decode(first_input_image, false, 0),
             WEBRTC_VIDEO_CODEC_OK);
@@ -395,7 +399,8 @@
 
   // Set Initialize() to fail.
   EXPECT_CALL(*video_decoder_, Initialize_(_, _, _, _, _, _))
-      .WillOnce(base::test::RunOnceCallback<3>(false));
+      .WillOnce(base::test::RunOnceCallback<3>(
+          media::Status(media::StatusCode::kCodeOnlyForTesting)));
   ASSERT_EQ(rtc_video_decoder_adapter_->Decode(input_image, false, 0),
             WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
 }
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 0fce8c2..8af00e0 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -894,7 +894,8 @@
       // provides a convenient way for testing legacy layout code path in blink
       // unit tests.
       name: "LayoutNG",
-      implied_by: ["LayoutNGBlockFragmentation", "LayoutNGFieldset", "LayoutNGFlexBox", "LayoutNGFragmentItem", "LayoutNGLineCache", "EditingNG", "BidiCaretAffinity", "LayoutNGTable", "LayoutNGFragmentTraversal"],
+      // Keep this list in sync with the one in LayoutNGFlexBox below.
+      implied_by: ["LayoutNGBlockFragmentation", "LayoutNGFieldset", "LayoutNGFragmentItem", "LayoutNGLineCache", "EditingNG", "BidiCaretAffinity", "LayoutNGTable", "LayoutNGFragmentTraversal"],
       status: "stable",
     },
     {
@@ -905,6 +906,8 @@
     },
     {
       name: "LayoutNGFlexBox",
+      implied_by: ["LayoutNGBlockFragmentation", "LayoutNGFieldset", "LayoutNGFragmentItem", "LayoutNGLineCache", "EditingNG", "BidiCaretAffinity", "LayoutNGTable", "LayoutNGFragmentTraversal"],
+      status: "experimental",
     },
     {
       name: "LayoutNGFragmentItem",
diff --git a/third_party/blink/renderer/platform/theme_types.h b/third_party/blink/renderer/platform/theme_types.h
index 76f20d1e..b5ed8c14 100644
--- a/third_party/blink/renderer/platform/theme_types.h
+++ b/third_party/blink/renderer/platform/theme_types.h
@@ -45,8 +45,10 @@
 typedef unsigned ControlStates;
 
 // Must follow css_value_keywords.json5 order
+// kAutoPart is never returned by ComputedStyle::EffectiveAppearance()
 enum ControlPart {
   kNoControlPart,
+  kAutoPart,
   kCheckboxPart,
   kRadioPart,
   kPushButtonPart,
diff --git a/third_party/blink/web_tests/FlagExpectations/composite-after-paint b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
index a5641ac..ccf92b4 100644
--- a/third_party/blink/web_tests/FlagExpectations/composite-after-paint
+++ b/third_party/blink/web_tests/FlagExpectations/composite-after-paint
@@ -160,11 +160,3 @@
 
 compositing/gestures/gesture-tapHighlight-composited-img.html [ Pass Failure ]
 http/tests/images/image-decode-in-frame.html [ Pass Failure ]
-
-# Paint Timing failures
-crbug.com/1063079 external/wpt/paint-timing/fcp-only/fcp-opacity-descendant.html [ Pass Failure ]
-crbug.com/1063079 virtual/paint-timing/external/wpt/paint-timing/fcp-only/fcp-opacity-descendant.html [ Pass Failure ]
-crbug.com/1063079 external/wpt/paint-timing/fcp-only/fcp-opacity.html [ Pass Failure ]
-crbug.com/1063079 virtual/paint-timing/external/wpt/paint-timing/fcp-only/fcp-opacity.html [ Pass Failure ]
-crbug.com/1063079 external/wpt/paint-timing/fcp-only/fcp-pseudo-element-opacity.html [ Pass Failure ]
-crbug.com/1063079 virtual/paint-timing/external/wpt/paint-timing/fcp-only/fcp-pseudo-element-opacity.html [ Pass Failure ]
\ No newline at end of file
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index e01b02ee..b88936d 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -100,6 +100,10 @@
 crbug.com/591099 external/wpt/css/css-sizing/clone-nowrap-intrinsic-size-bidi.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-non-replaced-005.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-002.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-004.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-006.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/whitespace-and-break.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-sizing/ortho-writing-mode-001.html [ Failure ]
 
diff --git a/third_party/blink/web_tests/MSANExpectations b/third_party/blink/web_tests/MSANExpectations
index 85b9887..3075e11 100644
--- a/third_party/blink/web_tests/MSANExpectations
+++ b/third_party/blink/web_tests/MSANExpectations
@@ -161,7 +161,8 @@
 crbug.com/856601 [ Linux ] external/wpt/subresource-integrity/idlharness.window.html [ Skip ]
 crbug.com/856601 [ Linux ] external/wpt/svg/idlharness.window.html [ Skip ]
 crbug.com/856601 [ Linux ] external/wpt/touch-events/idlharness.window.html [ Skip ]
-crbug.com/856601 [ Linux ] external/wpt/wake-lock/idlharness.https.any.html [ Skip ]
+crbug.com/856601 [ Linux ] external/wpt/wake-lock/idlharness.https.window.html [ Skip ]
+crbug.com/856601 [ Linux ] external/wpt/wake-lock/idlharness-worker.https.window.html [ Skip ]
 crbug.com/856601 [ Linux ] external/wpt/webstorage/idlharness.window.html [ Skip ]
 crbug.com/856601 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/idlharness.https.window.html [ Skip ]
@@ -229,7 +230,6 @@
 crbug.com/856601 [ Linux ] external/wpt/fetch/api/idl.any.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/fetch/cors-rfc1918/idlharness.tentative.any.html [ Skip ]
 crbug.com/856601 [ Linux ] external/wpt/secure-contexts/idlharness.any.sharedworker.html [ Skip ]
-crbug.com/856601 [ Linux ] external/wpt/wake-lock/idlharness.https.window.html [ Skip ]
 crbug.com/856601 [ Linux ] external/wpt/BackgroundSync/interfaces.https.any.worker.html [ Pass Timeout ]
 crbug.com/856601 [ Linux ] external/wpt/animation-worklet/idlharness.any.worker.html [ Skip ]
 crbug.com/856601 [ Linux ] external/wpt/fullscreen/idlharness.window.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 3d9cd62..4a1f3c5 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -541,8 +541,6 @@
 crbug.com/417223 external/wpt/css/css-position/position-relative-table-tr-left.html [ Failure ]
 crbug.com/417223 external/wpt/css/css-position/position-relative-table-tr-top-absolute-child.html [ Failure ]
 crbug.com/417223 external/wpt/css/css-position/position-relative-table-tr-top.html [ Failure ]
-crbug.com/845235 external/wpt/css/css-position/position-absolute-center-001.tentative.html [ Failure ]
-crbug.com/845235 external/wpt/css/css-position/position-absolute-center-002.tentative.html [ Failure ]
 
 crbug.com/1008951 external/wpt/css/css-text-decor/text-decoration-subelements-002.html [ Failure ]
 crbug.com/1008951 external/wpt/css/css-text-decor/text-decoration-subelements-003.html [ Failure ]
@@ -792,10 +790,7 @@
 
 # [css-flexbox]
 
-crbug.com/591099 external/wpt/css/css-flexbox/flexbox_align-items-stretch-3.html [ Failure ]
 crbug.com/1003506 external/wpt/css/css-flexbox/percentage-heights-007.html [ Failure ]
-crbug.com/1025630 [ Mac ] external/wpt/css/css-flexbox/select-element-zero-height-001.html [ Failure ]
-crbug.com/1025630 [ Mac ] external/wpt/css/css-flexbox/select-element-zero-height-002.html [ Failure ]
 crbug.com/762679 external/wpt/css/css-flexbox/flexbox-gap-position-absolute.html [ Failure ]
 crbug.com/762679 external/wpt/css/css-flexbox/gap-001-lr.html [ Failure ]
 crbug.com/762679 external/wpt/css/css-flexbox/gap-001-ltr.html [ Failure ]
@@ -1516,7 +1511,9 @@
 virtual/layout_ng_fragment_traversal/external/wpt/css/CSS2/text/* [ Skip ]
 
 # Flexbox in NG
-#
+
+crbug.com/1060408 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/flex-abspos-staticpos-fallback-justify-content-001.html [ Failure ]
+
 # Fail in NG flex, pass in legacy flex.
 crbug.com/845235 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/quirks-auto-block-size-with-percentage-item.html [ Pass Failure ]
 crbug.com/846557 [ Mac ] virtual/layout_ng_flex_box/css3/flexbox/button.html [ Failure ]
@@ -1598,8 +1595,6 @@
 crbug.com/807497 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Failure ]
 crbug.com/898186 virtual/layout_ng_flex_box/external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Pass Failure ]
 crbug.com/1003506 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/percentage-heights-007.html [ Failure ]
-crbug.com/1025630 [ Mac ] virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/select-element-zero-height-001.html [ Failure ]
-crbug.com/1025630 [ Mac ] virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/select-element-zero-height-002.html [ Failure ]
 crbug.com/782948 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/table-as-item-fixed-min-width.html [ Failure ]
 crbug.com/782948 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/table-as-item-wide-content.html [ Failure ]
 crbug.com/762679 virtual/layout_ng_flex_box/external/wpt/css/css-flexbox/gap-001-lr.html [ Failure ]
@@ -2551,9 +2546,6 @@
 crbug.com/782948 external/wpt/css/css-flexbox/table-as-item-fixed-min-width.html [ Failure ]
 crbug.com/782948 external/wpt/css/css-flexbox/table-as-item-wide-content.html [ Failure ]
 
-# Requires support for hit-testing based on flex order.
-crbug.com/844505 external/wpt/css/css-flexbox/hittest-overlapping-order.html [ Failure ]
-
 crbug.com/807497 external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Failure ]
 crbug.com/467127 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure ]
 crbug.com/467127 external/wpt/css/css-flexbox/getcomputedstyle/flexbox_computedstyle_flex-basis-0percent.html [ Failure ]
@@ -2996,9 +2988,6 @@
 crbug.com/626703 [ Linux ] external/wpt/css/css-text/line-break/line-break-normal-015.xht [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-text/line-break/line-break-normal-015.xht [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-text/line-break/line-break-normal-015.xht [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/cssom/CSSStyleSheet-constructable-disallow-import.tentative.html [ Timeout ]
-crbug.com/626703 [ Mac ] external/wpt/css/cssom/CSSStyleSheet-constructable-disallow-import.tentative.html [ Timeout ]
-crbug.com/626703 [ Win ] external/wpt/css/cssom/CSSStyleSheet-constructable-disallow-import.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac10.10 ] external/wpt/css/css-layout-api/auto-block-size/absolute.https.html [ Failure ]
 crbug.com/626703 [ Mac10.11 ] external/wpt/css/css-layout-api/auto-block-size/absolute.https.html [ Failure ]
 crbug.com/626703 [ Mac10.10 ] external/wpt/css/css-layout-api/edges/all.https.html [ Failure ]
@@ -3133,9 +3122,6 @@
 crbug.com/626703 [ Win ] external/wpt/offscreen-canvas/text/2d.text.measure.baselines.worker.html [ Timeout ]
 crbug.com/626703 [ Win7 ] external/wpt/pointerevents/pointerevent_touch-action-pan-left-css_touch.html [ Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/quirks/percentage-height-quirk-excludes-flex-grid-001.html [ Failure ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/screen-capture/getdisplaymedia.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac10.14 ] external/wpt/screen-capture/getdisplaymedia.https.html [ Failure Timeout ]
 crbug.com/626703 [ Retina ] external/wpt/screen-capture/getdisplaymedia.https.html [ Timeout ]
@@ -3277,7 +3263,6 @@
 crbug.com/967018 external/wpt/html/semantics/scripting-1/the-script-element/css-module/css-module-worker-test.html [ Failure ]
 crbug.com/967018 external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Failure ]
 crbug.com/967018 virtual/web-components-v0-disabled/external/wpt/html/semantics/scripting-1/the-script-element/css-module/utf8.tentative.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-ui/webkit-appearance-auto-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-writing-modes/text-combine-upright-digits-004-manual.html [ Skip ]
 crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/json-module/parse-error.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/preload/onload-event.html [ Failure Timeout ]
@@ -4185,6 +4170,11 @@
 
 crbug.com/666993 [ Debug ] external/wpt/requestidlecallback/callback-idle-periods.html [ Pass Timeout ]
 
+# Doesn't match the new spec
+crbug.com/1055943 [ Linux ] external/wpt/css/cssom/CSSStyleSheet-constructable-disallow-import.tentative.html [ Timeout ]
+crbug.com/1055943 [ Mac ] external/wpt/css/cssom/CSSStyleSheet-constructable-disallow-import.tentative.html [ Timeout ]
+crbug.com/1055943 [ Win ] external/wpt/css/cssom/CSSStyleSheet-constructable-disallow-import.tentative.html [ Timeout ]
+
 # Crashes with DCHECK enabled, but not on normal Release builds.
 crbug.com/809935 external/wpt/css/css-fonts/variations/font-style-interpolation.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-ui/text-overflow-011.html [ Failure Crash Pass ]
@@ -5583,9 +5573,18 @@
 crbug.com/915352 [ Mac10.11 ] virtual/threaded/external/wpt/animation-worklet/worklet-animation-with-scroll-timeline-and-display-none.https.html [ Pass Failure ]
 
 # Paint Timing failures
+crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-opacity-descendant.html [ Pass Failure ]
+crbug.com/1062984 virtual/paint-timing/external/wpt/paint-timing/fcp-only/fcp-opacity-descendant.html [ Pass Failure ]
+crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-opacity.html [ Pass Failure ]
+crbug.com/1062984 virtual/paint-timing/external/wpt/paint-timing/fcp-only/fcp-opacity.html [ Pass Failure ]
+crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-pseudo-element-opacity.html [ Pass Failure ]
+crbug.com/1062984 external/wpt/paint-timing/border-image.html [ Pass Failure ]
 crbug.com/1062984 virtual/paint-timing/external/wpt/paint-timing/border-image.html [ Pass Failure ]
+crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-video-poster.html [ Pass Failure ]
 crbug.com/1062984 virtual/paint-timing/external/wpt/paint-timing/fcp-only/fcp-video-poster.html [ Pass Failure ]
+crbug.com/1062984 external/wpt/paint-timing/replaced-content-image.html [ Pass Failure ]
 crbug.com/1062984 virtual/paint-timing/external/wpt/paint-timing/replaced-content-image.html [ Pass Failure ]
+crbug.com/1062984 external/wpt/paint-timing/mask-image.html [ Pass Failure ]
 crbug.com/1062984 virtual/paint-timing/external/wpt/paint-timing/mask-image.html [ Pass Failure ]
 
 # Sheriff 2019-03-01
diff --git a/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt b/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt
index cea8b71..8000ed6 100644
--- a/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt
+++ b/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt
@@ -11,12 +11,6 @@
     {
       "name": "LayoutImage IMG class='composited'",
       "bounds": [256, 256],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='composited'",
-      "bounds": [256, 256],
       "transform": 1
     }
   ],
diff --git a/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png b/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png
index 548882a9..7c4963b 100644
--- a/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png
+++ b/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
index 7256bf5a..33da06e 100644
--- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
+++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
@@ -27,12 +27,6 @@
     {
       "name": "LayoutImage IMG class='accelerated'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated'",
-      "bounds": [160, 90],
       "transform": 1
     },
     {
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
index bc6eb64..7f5274f 100644
--- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
+++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
@@ -21,12 +21,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 1
     },
     {
@@ -51,12 +45,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 2
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 2
     },
     {
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt
index 8aac105a..b0cf695 100644
--- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt
+++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt
@@ -14,12 +14,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 1
     },
     {
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt
index e558265..a56abd9 100644
--- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt
+++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt
@@ -24,12 +24,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 1
     }
   ],
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-001.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-001.html
new file mode 100644
index 0000000..1128ffa1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-001.html
@@ -0,0 +1,14 @@
+<!-- quirks mode -->
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test checks that a dynamic change in the height of an element calculates the intrinsic min/max size correctly when a replaced element is present."/>
+<p style="margin-top: 1em;">Test passes if there is a filled green square.</p>
+<div id="target" style="float: left; background: green;">
+  <div>
+    <canvas width="1" height="1" style="height: 100%;"></canvas>
+  </div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-002.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-002.html
new file mode 100644
index 0000000..f062b8a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-002.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test checks that a dynamic change in the height of an element calculates the intrinsic min/max size correctly when a replaced element is present."/>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="float: left; background: green;">
+  <span>
+    <div style="height: 100%;">
+      <canvas width="1" height="1" style="height: 100%;"></canvas>
+    </div>
+  </span>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-003.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-003.html
new file mode 100644
index 0000000..ef8832a4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-003.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test checks that a dynamic change in the height of an element calculates the intrinsic min/max size correctly when a replaced element is present."/>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="float: left; background: green;">
+  <div style="height: 100%;">
+    <canvas width="1" height="1" style="height: 100%;"></canvas>
+  </div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-004.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-004.html
new file mode 100644
index 0000000..b0c452b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-004.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test checks that a dynamic change in the height of an element calculates the intrinsic min/max size correctly when a replaced element is present."/>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="float: left; background: green;">
+  <div style="width: fit-content; height: 100%;">
+    <canvas width="1" height="1" style="height: 100%;"></canvas>
+  </div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-005.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-005.html
new file mode 100644
index 0000000..87a7a9b9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-005.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test checks that a dynamic change in the height of an element calculates the intrinsic min/max size correctly when a replaced element is present."/>
+<p>Test passes if there is a filled green square.</p>
+<div style="position: relative; width: 100px; height: 100px;">
+  <div id="target" style="position: absolute; top:0; background: green;">
+    <canvas width="1" height="1" style="height: 100%;"></canvas>
+  </div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.bottom = '0px';
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-006.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-006.html
new file mode 100644
index 0000000..8ccd3a0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/intrinsic-percent-replaced-dynamic-006.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/css-sizing-3/#intrinsic">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="This test checks that a dynamic change in the height of an element calculates the intrinsic min/max size correctly when a replaced element is present."/>
+<p>Test passes if there is a filled green square.</p>
+<div id="target" style="float: left; background: green;">
+  <div style="width: 100%; height: 100%;">
+    <canvas width="1" height="1" style="height: 100%;"></canvas>
+  </div>
+</div>
+<script>
+  document.body.offsetTop;
+  document.getElementById('target').style.height = '100px';
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-cssom-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-cssom-001-expected.txt
index e7ed53b..30c70bbd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-cssom-001-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/appearance-cssom-001-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-Found 342 tests; 169 PASS, 173 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 342 tests; 170 PASS, 172 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS -webkit-appearance: none
-FAIL -webkit-appearance: auto assert_equals: style.WebkitAppearance (uppercase W) expected "auto" but got ""
+PASS -webkit-appearance: auto
 PASS -webkit-appearance: button
 PASS -webkit-appearance: checkbox
 PASS -webkit-appearance: listbox
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-root-element-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-root-element-ref.html
new file mode 100644
index 0000000..c92741df
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-root-element-ref.html
@@ -0,0 +1,11 @@
+<!doctype HTML>
+<meta charset="utf-8">
+<title>backdrop-filter: no effect on the root element</title>
+<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<style>
+  html {
+    background: green;
+  }
+</style>
+Test
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-root-element.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-root-element.html
new file mode 100644
index 0000000..890e6ae5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-root-element.html
@@ -0,0 +1,13 @@
+<!doctype HTML>
+<meta charset="utf-8">
+<title>backdrop-filter: no effect on the root element</title>
+<link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
+<link rel="help" href="https://drafts.fxtf.org/filter-effects-2/#BackdropFilterProperty">
+<link rel="match"  href="backdrop-filter-root-element-ref.html">
+<style>
+  html {
+    background: green;
+    backdrop-filter: invert(1);
+  }
+</style>
+Test
diff --git a/third_party/blink/web_tests/external/wpt/remote-playback/idlharness.window.js b/third_party/blink/web_tests/external/wpt/remote-playback/idlharness.window.js
index ba40f19..458bfd0 100644
--- a/third_party/blink/web_tests/external/wpt/remote-playback/idlharness.window.js
+++ b/third_party/blink/web_tests/external/wpt/remote-playback/idlharness.window.js
@@ -1,6 +1,7 @@
 // META: script=/resources/WebIDLParser.js
 // META: script=/resources/idlharness.js
 // META: script=/common/media.js
+// META: timeout=long
 
 'use strict';
 
diff --git a/third_party/blink/web_tests/external/wpt/svg/extensibility/foreignObject/foreign-object-with-position-under-clip-path.html b/third_party/blink/web_tests/external/wpt/svg/extensibility/foreignObject/foreign-object-with-position-under-clip-path.html
new file mode 100644
index 0000000..a6d34bf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/extensibility/foreignObject/foreign-object-with-position-under-clip-path.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<title>Test: x & y on foreignObject don't transform a clipPath with clipPathUnits="objectBoundingBox"</title>
+<link rel="help" href="https://svgwg.org/svg2-draft/single-page.html#embedded-ForeignObjectElement">
+<link rel="match" href="foreign-object-size-ref.html">
+<svg>
+  <defs>
+    <clipPath id="clip" clipPathUnits="objectBoundingBox">
+      <rect width="1" height="0.5" />
+    </clipPath>
+  </defs>
+  <g transform="translate(-50 -50)">
+    <foreignObject x="50" y="50" width="100" height="200" clip-path="url(#clip)">
+      <html xmlns="http://www.w3.org/1999/xhtml">
+      <body>
+        <div style="background: green; height: 100px;"></div>
+        <div style="background: red; height: 100px;"></div>
+      </body>
+      </html>
+    </foreignObject>
+  </g>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window-expected.txt b/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window-expected.txt
index f4a01221..26e968a 100644
--- a/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window-expected.txt
@@ -1,10 +1,127 @@
 This is a testharness.js-based test.
-FAIL idl_test setup promise_test: Unhandled rejection with value: "Document includes GlobalEventHandlers, but Document is undefined."
+Found 123 tests; 113 PASS, 10 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
 PASS idl_test validation
 PASS Partial interface mixin GlobalEventHandlers: original interface mixin defined
 PASS Partial interface mixin GlobalEventHandlers: member names are unique
 PASS Partial interface UIEvent: member names are unique
+PASS Partial interface Document: member names are unique
+PASS Partial interface Document[2]: member names are unique
 PASS Partial interface Window: member names are unique
-PASS Partial interface Window[2]: member names are unique
+PASS Document includes GlobalEventHandlers: member names are unique
+PASS Document includes DocumentAndElementEventHandlers: member names are unique
+PASS Document includes NonElementParentNode: member names are unique
+PASS Document includes ParentNode: member names are unique
+PASS Document includes XPathEvaluatorBase: member names are unique
+PASS HTMLElement includes GlobalEventHandlers: member names are unique
+PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique
+PASS HTMLElement includes ElementContentEditable: member names are unique
+PASS HTMLElement includes HTMLOrSVGElement: member names are unique
+PASS Window includes GlobalEventHandlers: member names are unique
+PASS Window includes WindowEventHandlers: member names are unique
+PASS Window includes WindowOrWorkerGlobalScope: member names are unique
+PASS Window includes AnimationFrameProvider: member names are unique
+PASS Window includes WindowSessionStorage: member names are unique
+PASS Window includes WindowLocalStorage: member names are unique
+PASS Element includes ParentNode: member names are unique
+PASS Element includes NonDocumentTypeChildNode: member names are unique
+PASS Element includes ChildNode: member names are unique
+PASS Element includes Slotable: member names are unique
+PASS Touch interface: existence and properties of interface object
+PASS Touch interface object length
+PASS Touch interface object name
+PASS Touch interface: existence and properties of interface prototype object
+PASS Touch interface: existence and properties of interface prototype object's "constructor" property
+PASS Touch interface: existence and properties of interface prototype object's @@unscopables property
+PASS Touch interface: attribute identifier
+PASS Touch interface: attribute target
+PASS Touch interface: attribute screenX
+PASS Touch interface: attribute screenY
+PASS Touch interface: attribute clientX
+PASS Touch interface: attribute clientY
+PASS Touch interface: attribute pageX
+PASS Touch interface: attribute pageY
+PASS Touch interface: attribute radiusX
+PASS Touch interface: attribute radiusY
+PASS Touch interface: attribute rotationAngle
+PASS Touch interface: attribute force
+FAIL Touch interface: attribute altitudeAngle assert_true: The prototype object must have a property "altitudeAngle" expected true got false
+FAIL Touch interface: attribute azimuthAngle assert_true: The prototype object must have a property "azimuthAngle" expected true got false
+FAIL Touch interface: attribute touchType assert_true: The prototype object must have a property "touchType" expected true got false
+PASS Touch must be primary interface of new Touch({identifier: 1, target: document})
+PASS Stringification of new Touch({identifier: 1, target: document})
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "identifier" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "target" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "screenX" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "screenY" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "clientX" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "clientY" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "pageX" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "pageY" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "radiusX" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "radiusY" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "rotationAngle" with the proper type
+PASS Touch interface: new Touch({identifier: 1, target: document}) must inherit property "force" with the proper type
+FAIL Touch interface: new Touch({identifier: 1, target: document}) must inherit property "altitudeAngle" with the proper type assert_inherits: property "altitudeAngle" not found in prototype chain
+FAIL Touch interface: new Touch({identifier: 1, target: document}) must inherit property "azimuthAngle" with the proper type assert_inherits: property "azimuthAngle" not found in prototype chain
+FAIL Touch interface: new Touch({identifier: 1, target: document}) must inherit property "touchType" with the proper type assert_inherits: property "touchType" not found in prototype chain
+PASS TouchList interface: existence and properties of interface object
+PASS TouchList interface object length
+PASS TouchList interface object name
+PASS TouchList interface: existence and properties of interface prototype object
+PASS TouchList interface: existence and properties of interface prototype object's "constructor" property
+PASS TouchList interface: existence and properties of interface prototype object's @@unscopables property
+PASS TouchList interface: attribute length
+PASS TouchList interface: operation item(unsigned long)
+PASS TouchEvent interface: existence and properties of interface object
+PASS TouchEvent interface object length
+PASS TouchEvent interface object name
+PASS TouchEvent interface: existence and properties of interface prototype object
+PASS TouchEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS TouchEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS TouchEvent interface: attribute touches
+PASS TouchEvent interface: attribute targetTouches
+PASS TouchEvent interface: attribute changedTouches
+PASS TouchEvent interface: attribute altKey
+PASS TouchEvent interface: attribute metaKey
+PASS TouchEvent interface: attribute ctrlKey
+PASS TouchEvent interface: attribute shiftKey
+PASS TouchEvent must be primary interface of new TouchEvent("name")
+PASS Stringification of new TouchEvent("name")
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "touches" with the proper type
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "targetTouches" with the proper type
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "changedTouches" with the proper type
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "altKey" with the proper type
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "metaKey" with the proper type
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "ctrlKey" with the proper type
+PASS TouchEvent interface: new TouchEvent("name") must inherit property "shiftKey" with the proper type
+PASS HTMLElement interface: attribute ontouchstart
+PASS HTMLElement interface: attribute ontouchend
+PASS HTMLElement interface: attribute ontouchmove
+PASS HTMLElement interface: attribute ontouchcancel
+PASS Window interface: attribute ontouchstart
+PASS Window interface: attribute ontouchend
+PASS Window interface: attribute ontouchmove
+PASS Window interface: attribute ontouchcancel
+FAIL GlobalEventHandlers interface: window must inherit property "ontouchstart" with the proper type assert_inherits: property "ontouchstart" found on object expected in prototype chain
+FAIL GlobalEventHandlers interface: window must inherit property "ontouchend" with the proper type assert_inherits: property "ontouchend" found on object expected in prototype chain
+FAIL GlobalEventHandlers interface: window must inherit property "ontouchmove" with the proper type assert_inherits: property "ontouchmove" found on object expected in prototype chain
+FAIL GlobalEventHandlers interface: window must inherit property "ontouchcancel" with the proper type assert_inherits: property "ontouchcancel" found on object expected in prototype chain
+PASS GlobalEventHandlers interface: document must inherit property "ontouchstart" with the proper type
+PASS GlobalEventHandlers interface: document must inherit property "ontouchend" with the proper type
+PASS GlobalEventHandlers interface: document must inherit property "ontouchmove" with the proper type
+PASS GlobalEventHandlers interface: document must inherit property "ontouchcancel" with the proper type
+PASS GlobalEventHandlers interface: document.body must inherit property "ontouchstart" with the proper type
+PASS GlobalEventHandlers interface: document.body must inherit property "ontouchend" with the proper type
+PASS GlobalEventHandlers interface: document.body must inherit property "ontouchmove" with the proper type
+PASS GlobalEventHandlers interface: document.body must inherit property "ontouchcancel" with the proper type
+PASS Document interface: attribute ontouchstart
+PASS Document interface: attribute ontouchend
+PASS Document interface: attribute ontouchmove
+PASS Document interface: attribute ontouchcancel
+PASS Document interface: document must inherit property "ontouchstart" with the proper type
+PASS Document interface: document must inherit property "ontouchend" with the proper type
+PASS Document interface: document must inherit property "ontouchmove" with the proper type
+PASS Document interface: document must inherit property "ontouchcancel" with the proper type
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window.js b/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window.js
index f88c9aa..8857328 100644
--- a/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window.js
+++ b/third_party/blink/web_tests/external/wpt/touch-events/idlharness.window.js
@@ -7,7 +7,7 @@
 
 idl_test(
   ['touch-events'],
-  ['uievents', 'dom', 'html'],
+  ['uievents', 'html', 'dom'],
   idl_array => {
     idl_array.add_objects({
       Document: ['document'],
diff --git a/third_party/blink/web_tests/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html b/third_party/blink/web_tests/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html
deleted file mode 100644
index 34b91bc0f..0000000
--- a/third_party/blink/web_tests/fast/scrolling/middle-click-autoscroll-latching-clicked-node.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../../resources/gesture-util.js"></script>
-
-<style>
-  #container {
-    width:500px;
-    height:100px;
-    overflow:auto;
-    border:2px solid red;
-    padding:0px;
-  }
-  #spacer {
-    height:200px;
-  }
-</style>
-
-<ol>
-  <li>Middle-click inside the &lt;div&gt; with the red border below to activate autoscroll.</li>
-  <li>First, move the mouse such that you scroll the &lt;div&gt; in unavailable scroll direction and then in scrollable direction.</li>
-  <li>If bug repros, it won't scroll in available direction.</li>
-</ol>
-<div id="container">
-  <div id="spacer"></div>
-</div>
-
-<script>
-
-window.onload = async function()
-{
-    const container = document.getElementById("container");
-    const leftButton = 0;
-    const middleButton = 1;
-
-    promise_test (async (t) => {
-      await waitForCompositorCommit();
-      await mouseClickOn(container.offsetLeft + 10, container.offsetTop + 10, middleButton);
-      //Move mouse in unavailable direction first.
-      await mouseMoveTo(container.offsetLeft + (container.offsetWidth/2), container.offsetTop + 10);
-      //Move mouse in available direction to scroll the content.
-      await mouseMoveTo(container.offsetLeft + (container.offsetWidth/2), container.offsetTop + container.offsetHeight);
-
-      await waitFor(() => {
-        return container.scrollTop === container.scrollHeight - container.clientHeight;
-      }, "Failed to scroll container with middle-click autoscroll.");
-    }, "Container scrolled in available direction.");
-}
-</script>
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/color-matching/image-color-matching-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/color-matching/image-color-matching-expected.png
deleted file mode 100644
index e6fa227..0000000
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/color-matching/image-color-matching-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/masks/mask-of-clipped-layer-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/masks/mask-of-clipped-layer-expected.png
new file mode 100644
index 0000000..548882a9
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/masks/mask-of-clipped-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/visibility/visibility-image-layers-expected.png
deleted file mode 100644
index d515bc0..0000000
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/visibility/visibility-image-layers-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/color-profile-image-canvas-pattern-expected.png
new file mode 100644
index 0000000..7f17d0f
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/color-profile-image-canvas-pattern-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-canvas-expected.png
new file mode 100644
index 0000000..4b949f6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-canvas-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-image-expected.png
new file mode 100644
index 0000000..4b949f6
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/yuv-decode-eligible/color-profile-layer-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/yuv-decode-eligible/color-profile-layer-expected.png
deleted file mode 100644
index 2a70653..0000000
--- a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/yuv-decode-eligible/color-profile-layer-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt
index a482b37..4492d200a 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt
@@ -23,15 +23,9 @@
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 3
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 4
-    },
-    {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
       "position": [785, 0],
       "bounds": [15, 600],
@@ -66,17 +60,6 @@
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 4,
-      "parent": 3,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
@@ -86,7 +69,7 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [785, 1942],
+      "bounds": [785, 1670],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
@@ -99,31 +82,19 @@
     {
       "name": "LayoutImage IMG class='hidden composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 2
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'",
-      "bounds": [184, 124],
-      "transform": 3
-    },
-    {
       "name": "LayoutBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 153],
       "drawsContent": false,
-      "transform": 4
+      "transform": 3
     },
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 5
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 6
+      "transform": 4
     },
     {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
@@ -154,17 +125,6 @@
     },
     {
       "id": 3,
-      "parent": 2,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 4,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -173,25 +133,14 @@
       ]
     },
     {
-      "id": 5,
-      "parent": 4,
+      "id": 4,
+      "parent": 3,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 6,
-      "parent": 5,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
@@ -201,7 +150,7 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [785, 3769],
+      "bounds": [785, 2953],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
@@ -214,48 +163,30 @@
     {
       "name": "LayoutImage IMG class='hidden composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 2
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'",
-      "bounds": [184, 124],
-      "transform": 3
-    },
-    {
       "name": "LayoutBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 153],
-      "transform": 4
+      "transform": 3
     },
     {
       "name": "LayoutImage IMG class='composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 5
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='composited box'",
-      "bounds": [184, 124],
-      "transform": 6
+      "transform": 4
     },
     {
       "name": "LayoutBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 153],
       "drawsContent": false,
-      "transform": 7
+      "transform": 5
     },
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 8
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 9
+      "transform": 6
     },
     {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
@@ -286,17 +217,6 @@
     },
     {
       "id": 3,
-      "parent": 2,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 4,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -305,8 +225,8 @@
       ]
     },
     {
-      "id": 5,
-      "parent": 4,
+      "id": 4,
+      "parent": 3,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -315,18 +235,7 @@
       ]
     },
     {
-      "id": 6,
-      "parent": 5,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 7,
+      "id": 5,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -335,25 +244,14 @@
       ]
     },
     {
-      "id": 8,
-      "parent": 7,
+      "id": 6,
+      "parent": 5,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 9,
-      "parent": 8,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
index 8fffeac..d5508ac 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
@@ -27,12 +27,6 @@
     {
       "name": "LayoutImage IMG class='accelerated'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated'",
-      "bounds": [160, 90],
       "transform": 1
     },
     {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
index f406914..43a44070 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
@@ -21,12 +21,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 1
     },
     {
@@ -51,12 +45,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 2
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 2
     },
     {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt
index 4fc57e2..d913169 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt
@@ -14,12 +14,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 1
     },
     {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt
index 43f1206..d255674 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt
@@ -24,12 +24,6 @@
     {
       "name": "LayoutImage IMG class='accelerated blended'",
       "bounds": [160, 90],
-      "drawsContent": false,
-      "transform": 1
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'",
-      "bounds": [160, 90],
       "transform": 1
     }
   ],
diff --git a/third_party/blink/web_tests/http/tests/devtools/report-protocol-errors-expected.txt b/third_party/blink/web_tests/http/tests/devtools/report-protocol-errors-expected.txt
index a361760..5d21d66 100644
--- a/third_party/blink/web_tests/http/tests/devtools/report-protocol-errors-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/report-protocol-errors-expected.txt
@@ -3,7 +3,7 @@
 {
     error : {
         code : -32700
-        message : "Message must be a valid JSON"
+        message : "JSON: invalid token at position 0"
     }
 }
 -------------------------------------------------------
diff --git a/third_party/blink/web_tests/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/images/directly-composited-image-orientation-expected.png
new file mode 100644
index 0000000..30dbc6ed
--- /dev/null
+++ b/third_party/blink/web_tests/images/directly-composited-image-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/images/directly-composited-image-orientation.html b/third_party/blink/web_tests/images/directly-composited-image-orientation.html
new file mode 100644
index 0000000..f90e49b
--- /dev/null
+++ b/third_party/blink/web_tests/images/directly-composited-image-orientation.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Images Module Level 3: image-orientation: from-image with will-change: transform and no border. Blink treats this as 'directly composited' and rasterizes the image at its intrinsic size</title>
+<style>
+    body {
+        overflow: hidden;
+        image-orientation: from-image;
+    }
+    img {
+        will-change: transform;
+    }
+    .orientation-normal {
+        width:50px;
+        height:25px;
+    }
+    .orientation-swapped {
+        width:25px;
+        height:50px;
+    }
+    div {
+        display: inline-block;
+        width: 100px;
+        vertical-align: top;
+    }
+</style>
+</head>
+<body>
+    <!-- The images should rotate respecting their EXIF orientation because
+       image-orientation: from-image is specified. -->
+    <div>
+        <img class="orientation-normal"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-normal"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-normal"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-normal"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-swapped"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-swapped"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-swapped"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-swapped"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg"/>
+
+    </div>
+    <div>
+        <img class="orientation-normal"
+             src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-9-u.jpg"/>
+
+    </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency-expected.txt b/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency-expected.txt
index 27a9a05..6547710 100644
--- a/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency-expected.txt
+++ b/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency-expected.txt
@@ -1,26 +1,18 @@
 Tests that vision deficiencies can be emulated.
 <p>Emulating "none":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAFRJREFUWIXt18ENACAMw8DA5N0chnCQePgGiKz+ujI5aZru3K6uPWAgZSBlIGUgZSBlIGUgZSBlILWS030iyr6/oIGUgZSBlIGUgZSBlIGUgZSB1AXNwwVLtuf+dAAAAABJRU5ErkJggg==">
-<p>Emulating "achromatomaly":
-<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAGFJREFUWIXt10ENwCAUBFFAATbQxBErtVNdyAARs016mCdgM/m3X8capwTtdybnSouufcBAykDKQMpAykDKQMpAykDKQKr2/kR/krTfX9BAykDKQMpAykDKQMpAykDKQOoCayUFlTeCp/sAAAAASUVORK5CYII=">
 <p>Emulating "achromatopsia":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAFpJREFUWIXt10ENADEMxMD2eARR2IfQFYS3Uh8eACsrv+zu/lfQzCTn1hddu8BAykDKQMpAykDKQMpAykDKQGpXVfQnSXv+ggZSBlIGUgZSBlIGUgZSBlIGUgcPVwX7L3bHewAAAABJRU5ErkJggg==">
 <p>Emulating "blurredVision":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAehJREFUWIXtl81u4jAURo8TN7RpASXqohKLvsG89DzXLJFm1ZZCyb89i5tAWtAQYlfqIp90FWEl1yfX186H4tdvy3wN8Qvc7CGoQVnA8n8psAqMhiqGfQrbFWye4X0FWSrjRst9qAv5zkuzWEPyBx7+QrQDXbZwAwBRUEdQPsDuSYbKOeQJFAtQZhTUZ8C7F4FbrGG2EUBlhgHaQACLhQzlCURbCAtZicOLjqueAN7spXK3G5i9jQCcyfz5TlokLI9tMp6rBxjUkjQsBU4X1wEC1GUPrOn18KUcQwCV4WwM6kF6z1hvVfsMeJA9E5d07hk/lesUeMv0TZoAXTUBumoCdFXvHFRf4pKuvX+cNDbgJIDBn7qT8AusMRqaSKKO2rmvdDPd80aDDb1CaqpY/Fy+FKZRdmspOaq4B9pV0xUwS8VsAkRLN8OapWJYmxmYEB/9qXlfCUue+LH8WQplfKyiozSbZ3nr7bb1dM0AuB6kCWVZy7nAfTxCdS9jHjaNVDBLxKh2Nl0NBOwmN1qcdRVDed/7s+ReQcXtqyWor1ja0xSHpe5OBKPbHnTfKIqwsIddqxgJ2F39n4cK1bREri5YHa+2/9s5q/UM6FdfvsU/Tz/ezUyArpoAXTUBumoCdNUE6KoJ0FX/AAow6PKlz4YvAAAAAElFTkSuQmCC">
 <p>Emulating "none":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAFRJREFUWIXt18ENACAMw8DA5N0chnCQePgGiKz+ujI5aZru3K6uPWAgZSBlIGUgZSBlIGUgZSBlILWS030iyr6/oIGUgZSBlIGUgZSBlIGUgZSB1AXNwwVLtuf+dAAAAABJRU5ErkJggg==">
-<p>Emulating "deuteranomaly":
-<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAGFJREFUWIXt1zENwDAQBMG3IaQ0uWAzHGNwHxoOiL1IKXYAnFbffRv3dSromSs5Vz269gEDKQMpAykDKQMpAykDKQMpA6lWtaM/SdrvL2ggZSBlIGUgZSBlIGUgZSBlIPUCZwcGA/y3590AAAAASUVORK5CYII=">
 <p>Emulating "deuteranopia":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAF9JREFUWIXt17ENwCAQBMGHYohdqKuhEsduBorYQyLYKeC0+uzbM8aqoO9/k3PVo2sHGEgZSBlIGUgZSBlIGUgZSBlItaoZ/UnSrr+ggZSBlIGUgZSBlIGUgZSBlIHUBmSnBbHzufJtAAAAAElFTkSuQmCC">
 <p>Emulating "none":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAFRJREFUWIXt18ENACAMw8DA5N0chnCQePgGiKz+ujI5aZru3K6uPWAgZSBlIGUgZSBlIGUgZSBlILWS030iyr6/oIGUgZSBlIGUgZSBlIGUgZSB1AXNwwVLtuf+dAAAAABJRU5ErkJggg==">
-<p>Emulating "protanomaly":
-<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAGFJREFUWIXt1zENwDAQBMG3EaQzsqA0GENwHRQOiL1IKXYAnFbffRv3dSromSs5Vz269gEDKQMpAykDKQMpAykDKQMpA6lWtaM/SdrvL2ggZSBlIGUgZSBlIGUgZSBlIPUC9+8GC+XyxMUAAAAASUVORK5CYII=">
 <p>Emulating "protanopia":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAF9JREFUWIXt10ENwCAQBdEFI5VBahcnnEhVURHzm/QwT8DPZG/bxn2dCnr2TM5Vj659wEDKQMpAykDKQMpAykDKQMpAqlWt6E+S9vsLGkgZSBlIGUgZSBlIGUgZSBlIvZuvBc8DKP+1AAAAAElFTkSuQmCC">
-<p>Emulating "tritanomaly":
-<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAFxJREFUWIXt18EJACEQBEEVczA78zQhoxA0iJ6De3QFMDT729rnuCXo7JWcKy269gEDKQMpAykDKQMpAykDKQMpA6me/iHSfn9BAykDKQMpAykDKQMpAykDKQOpB4zjBwAkamC5AAAAAElFTkSuQmCC">
 <p>Emulating "tritanopia":
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAF5JREFUWIXt17ENwCAQBEGwEC0RuQBaoP8qnJgi9pAIdgo4rT772sf7l6BvzeRceaJrBxhIGUgZSBlIGUgZSBlIGUgZSLX0D5F2/QUNpAykDKQMpAykDKQMpAykDKQ2h2YFBXR3unwAAAAASUVORK5CYII=">
 <p>Emulating "tritanopia":
@@ -35,6 +27,26 @@
   "code": -32602,
   "message": "Unknown vision deficiency type"
 }
+<p>Emulating "achromatomaly":
+{
+  "code": -32602,
+  "message": "Unknown vision deficiency type"
+}
+<p>Emulating "deuteranomaly":
+{
+  "code": -32602,
+  "message": "Unknown vision deficiency type"
+}
+<p>Emulating "protanomaly":
+{
+  "code": -32602,
+  "message": "Unknown vision deficiency type"
+}
+<p>Emulating "tritanomaly":
+{
+  "code": -32602,
+  "message": "Unknown vision deficiency type"
+}
 <p>Navigating&mldr;
 <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAAAF5JREFUWIXt17ENwCAQBEGwEC0RuQBaoP8qnJgi9pAIdgo4rT772sf7l6BvzeRceaJrBxhIGUgZSBlIGUgZSBlIGUgZSLX0D5F2/QUNpAykDKQMpAykDKQMpAykDKQ2h2YFBXR3unwAAAAASUVORK5CYII=">
 <p>Emulating "achromatopsia":
diff --git a/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency.js b/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency.js
index 63e1f7e..ee705a87 100644
--- a/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency.js
+++ b/third_party/blink/web_tests/inspector-protocol/emulation/set-vision-deficiency.js
@@ -33,22 +33,23 @@
   }
 
   await setEmulatedVisionDeficiency('none');
-  await setEmulatedVisionDeficiency('achromatomaly');
   await setEmulatedVisionDeficiency('achromatopsia');
   await setEmulatedVisionDeficiency('blurredVision');
   await setEmulatedVisionDeficiency('none');
-  await setEmulatedVisionDeficiency('deuteranomaly');
   await setEmulatedVisionDeficiency('deuteranopia');
   await setEmulatedVisionDeficiency('none');
-  await setEmulatedVisionDeficiency('protanomaly');
   await setEmulatedVisionDeficiency('protanopia');
-  await setEmulatedVisionDeficiency('tritanomaly');
   await setEmulatedVisionDeficiency('tritanopia');
   // Test setting the already-active vision deficiency.
   await setEmulatedVisionDeficiency('tritanopia');
   // Test setting unknown vision deficiencies.
   await setEmulatedVisionDeficiency('some-invalid-deficiency');
   await setEmulatedVisionDeficiency('');
+  // Test setting no-longer-supported vision deficiencies.
+  await setEmulatedVisionDeficiency('achromatomaly');
+  await setEmulatedVisionDeficiency('deuteranomaly');
+  await setEmulatedVisionDeficiency('protanomaly');
+  await setEmulatedVisionDeficiency('tritanomaly');
 
   testRunner.log(`<p>Navigating&mldr;`);
   await session.navigate('../resources/vision-deficiency.html');
diff --git a/third_party/blink/web_tests/inspector-protocol/target/target-send-message-expected.txt b/third_party/blink/web_tests/inspector-protocol/target/target-send-message-expected.txt
index 0f46d44..19b287b8 100644
--- a/third_party/blink/web_tests/inspector-protocol/target/target-send-message-expected.txt
+++ b/third_party/blink/web_tests/inspector-protocol/target/target-send-message-expected.txt
@@ -1,8 +1,8 @@
 Tests sendMessage with invalid message.
 JSON syntax error..
-{"error":{"code":-32700,"message":"Message must be a valid JSON"}}
+{"error":{"code":-32700,"message":"JSON: string literal expected at position 57"}}
 JSON with primitive value..
-{"error":{"code":-32700,"message":"Message must be a valid JSON"}}
+{"error":{"code":-32600,"message":"Message must be an object"}}
 JSON without method property..
 {"error":{"code":-32600,"message":"Message must have integer 'id' property"}}
 JSON without id property..
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-of-clipped-layer-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-of-clipped-layer-expected.png
new file mode 100644
index 0000000..2b0a7fa
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-of-clipped-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
new file mode 100644
index 0000000..6d12442
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt
index 275e9ede..07fd6568 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt
@@ -23,15 +23,9 @@
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 3
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 4
-    },
-    {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
       "position": [785, 0],
       "bounds": [15, 600],
@@ -66,17 +60,6 @@
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 4,
-      "parent": 3,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
@@ -86,7 +69,7 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [785, 1861],
+      "bounds": [785, 1606],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
@@ -99,31 +82,19 @@
     {
       "name": "LayoutImage IMG class='hidden composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 2
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'",
-      "bounds": [184, 124],
-      "transform": 3
-    },
-    {
       "name": "LayoutNGBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 152],
       "drawsContent": false,
-      "transform": 4
+      "transform": 3
     },
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 5
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 6
+      "transform": 4
     },
     {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
@@ -154,17 +125,6 @@
     },
     {
       "id": 3,
-      "parent": 2,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 4,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -173,25 +133,14 @@
       ]
     },
     {
-      "id": 5,
-      "parent": 4,
+      "id": 4,
+      "parent": 3,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 6,
-      "parent": 5,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
@@ -201,7 +150,7 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [785, 3575],
+      "bounds": [785, 2810],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
@@ -214,48 +163,30 @@
     {
       "name": "LayoutImage IMG class='hidden composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 2
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'",
-      "bounds": [184, 124],
-      "transform": 3
-    },
-    {
       "name": "LayoutNGBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 152],
-      "transform": 4
+      "transform": 3
     },
     {
       "name": "LayoutImage IMG class='composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 5
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='composited box'",
-      "bounds": [184, 124],
-      "transform": 6
+      "transform": 4
     },
     {
       "name": "LayoutNGBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 152],
       "drawsContent": false,
-      "transform": 7
+      "transform": 5
     },
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 8
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 9
+      "transform": 6
     },
     {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
@@ -286,17 +217,6 @@
     },
     {
       "id": 3,
-      "parent": 2,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 4,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -305,8 +225,8 @@
       ]
     },
     {
-      "id": 5,
-      "parent": 4,
+      "id": 4,
+      "parent": 3,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -315,18 +235,7 @@
       ]
     },
     {
-      "id": 6,
-      "parent": 5,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 7,
+      "id": 5,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -335,25 +244,14 @@
       ]
     },
     {
-      "id": 8,
-      "parent": 7,
+      "id": 6,
+      "parent": 5,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 9,
-      "parent": 8,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png
index fdb7f4e..dacc12e 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/mac/images/directly-composited-image-orientation-expected.png
new file mode 100644
index 0000000..42e14476
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/images/directly-composited-image-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
new file mode 100644
index 0000000..b349b6a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt
index 5965410..53da943 100644
--- a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt
+++ b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt
@@ -23,15 +23,9 @@
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 3
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 4
-    },
-    {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
       "position": [785, 0],
       "bounds": [15, 600],
@@ -66,17 +60,6 @@
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 4,
-      "parent": 3,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
@@ -86,7 +69,7 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [785, 1942],
+      "bounds": [785, 1670],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
@@ -99,31 +82,19 @@
     {
       "name": "LayoutImage IMG class='hidden composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 2
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'",
-      "bounds": [184, 124],
-      "transform": 3
-    },
-    {
       "name": "LayoutNGBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 153],
       "drawsContent": false,
-      "transform": 4
+      "transform": 3
     },
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 5
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 6
+      "transform": 4
     },
     {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
@@ -154,17 +125,6 @@
     },
     {
       "id": 3,
-      "parent": 2,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 4,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -173,25 +133,14 @@
       ]
     },
     {
-      "id": 5,
-      "parent": 4,
+      "id": 4,
+      "parent": 3,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 6,
-      "parent": 5,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
@@ -201,7 +150,7 @@
   "layers": [
     {
       "name": "Scrolling Contents Layer",
-      "bounds": [785, 3769],
+      "bounds": [785, 2953],
       "contentsOpaque": true,
       "backgroundColor": "#FFFFFF"
     },
@@ -214,48 +163,30 @@
     {
       "name": "LayoutImage IMG class='hidden composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
       "transform": 2
     },
     {
-      "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'",
-      "bounds": [184, 124],
-      "transform": 3
-    },
-    {
       "name": "LayoutNGBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 153],
-      "transform": 4
+      "transform": 3
     },
     {
       "name": "LayoutImage IMG class='composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 5
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='composited box'",
-      "bounds": [184, 124],
-      "transform": 6
+      "transform": 4
     },
     {
       "name": "LayoutNGBlockFlow DIV class='composited hidden container'",
       "position": [-4, -4],
       "bounds": [757, 153],
       "drawsContent": false,
-      "transform": 7
+      "transform": 5
     },
     {
       "name": "LayoutImage IMG class='visible composited box'",
       "bounds": [100, 100],
-      "drawsContent": false,
-      "transform": 8
-    },
-    {
-      "name": "ContentsLayer for LayoutImage IMG class='visible composited box'",
-      "bounds": [184, 124],
-      "transform": 9
+      "transform": 6
     },
     {
       "name": "ContentsLayer for Vertical Scrollbar Layer",
@@ -286,17 +217,6 @@
     },
     {
       "id": 3,
-      "parent": 2,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 4,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -305,8 +225,8 @@
       ]
     },
     {
-      "id": 5,
-      "parent": 4,
+      "id": 4,
+      "parent": 3,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -315,18 +235,7 @@
       ]
     },
     {
-      "id": 6,
-      "parent": 5,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
-    },
-    {
-      "id": 7,
+      "id": 5,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
@@ -335,25 +244,14 @@
       ]
     },
     {
-      "id": 8,
-      "parent": 7,
+      "id": 6,
+      "parent": 5,
       "transform": [
         [1, 0, 0, 0],
         [0, 1, 0, 0],
         [0, 0, 1, 0],
         [20, 20, 0, 1]
       ]
-    },
-    {
-      "id": 9,
-      "parent": 8,
-      "transform": [
-        [0.54347825050354, 0, 0, 0],
-        [0, 0.806451618671417, 0, 0],
-        [0, 0, 1, 0],
-        [0, 0, 0, 1]
-      ],
-      "origin": [0, 0]
     }
   ]
 }
diff --git a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png
index faf8d51..37d4daf 100644
--- a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
new file mode 100644
index 0000000..a0bf16f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/composite-after-paint/compositing/masks/mask-of-clipped-layer-expected.png b/third_party/blink/web_tests/virtual/composite-after-paint/compositing/masks/mask-of-clipped-layer-expected.png
new file mode 100644
index 0000000..548882a9
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/composite-after-paint/compositing/masks/mask-of-clipped-layer-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-from-color-suggestion-picker-expected.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-from-color-suggestion-picker-expected.html
new file mode 100644
index 0000000..24006b23
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-from-color-suggestion-picker-expected.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+testRunner.waitUntilDone();
+</script>
+<script src='../../../fast/forms/resources/picker-common.js'></script>
+</head>
+<body>
+<input type='color' id='color' style="visibility: hidden;">
+<script>
+openPicker(document.getElementById('color'), () => testRunner.notifyDone(), () => testRunner.notifyDone());
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-from-color-suggestion-picker.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-from-color-suggestion-picker.html
new file mode 100644
index 0000000..77aecbf9
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-from-color-suggestion-picker.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+testRunner.waitUntilDone();
+</script>
+<script src='../../../fast/forms/resources/picker-common.js'></script>
+<link rel="match" href="color-picker-from-color-suggestion-picker-expected.html">
+</head>
+<body>
+<input type='color' id='color' list='gray' style="visibility: hidden;">
+<datalist id='gray'>
+    <option>#ffffff</option>
+    <option>#eeeeee</option>
+    <option>#dddddd</option>
+    <option>#cccccc</option>
+    <option>#bbbbbb</option>
+    <option>#aaaaaa</option>
+    <option>#999999</option>
+    <option>#888888</option>
+    <option>#777777</option>
+    <option>#666666</option>
+    <option>#555555</option>
+    <option>#444444</option>
+    <option>#333333</option>
+    <option>#222222</option>
+    <option>#111111</option>
+    <option>#000000</option>
+</datalist>
+<script>
+openPicker(document.getElementById('color'), openPickerSuccessfulCallback, () => testRunner.notifyDone());
+
+function openPickerSuccessfulCallback() {
+  popupWindow.focus();
+  const popupDocument = popupWindow.document;
+  const otherColor = popupDocument.querySelector('.other-color');
+  const otherColorRect = otherColor.getBoundingClientRect();
+  // Click the Other color button.
+  eventSender.mouseMoveTo(otherColorRect.left + (otherColorRect.width / 2), otherColorRect.top + (otherColorRect.height / 2));
+  eventSender.mouseDown();
+  eventSender.mouseUp();
+  popupWindow.focus();
+  testRunner.notifyDone();
+}
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
new file mode 100644
index 0000000..6d12442
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png
Binary files differ
diff --git a/third_party/inspector_protocol/BUILD.gn b/third_party/inspector_protocol/BUILD.gn
index dacb16f7..4546b13a 100644
--- a/third_party/inspector_protocol/BUILD.gn
+++ b/third_party/inspector_protocol/BUILD.gn
@@ -8,9 +8,13 @@
   sources = [
     "crdtp/cbor.cc",
     "crdtp/cbor.h",
+    "crdtp/dispatch.cc",
+    "crdtp/dispatch.h",
     "crdtp/error_support.cc",
     "crdtp/error_support.h",
     "crdtp/export.h",
+    "crdtp/find_by_first.h",
+    "crdtp/frontend_channel.h",
     "crdtp/glue.h",
     "crdtp/json.cc",
     "crdtp/json.h",
@@ -18,6 +22,7 @@
     "crdtp/serializable.cc",
     "crdtp/serializable.h",
     "crdtp/serializer_traits.h",
+    "crdtp/span.cc",
     "crdtp/span.h",
     "crdtp/status.cc",
     "crdtp/status.h",
@@ -47,7 +52,9 @@
   testonly = true
   sources = [
     "crdtp/cbor_test.cc",
+    "crdtp/dispatch_test.cc",
     "crdtp/error_support_test.cc",
+    "crdtp/find_by_first_test.cc",
     "crdtp/glue_test.cc",
     "crdtp/json_test.cc",
     "crdtp/serializable_test.cc",
diff --git a/third_party/inspector_protocol/README.chromium b/third_party/inspector_protocol/README.chromium
index 70c1dd2..6de2e8b 100644
--- a/third_party/inspector_protocol/README.chromium
+++ b/third_party/inspector_protocol/README.chromium
@@ -2,7 +2,7 @@
 Short Name: inspector_protocol
 URL: https://chromium.googlesource.com/deps/inspector_protocol/
 Version: 0
-Revision: 81ef742ba3587767fc08652d299df9e9b7051407
+Revision: c69cdc36200992d21a17bf4e5c2f3a95b8860ddf
 License: BSD
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/inspector_protocol/code_generator.py b/third_party/inspector_protocol/code_generator.py
index 77d13ef..92207b9 100755
--- a/third_party/inspector_protocol/code_generator.py
+++ b/third_party/inspector_protocol/code_generator.py
@@ -658,19 +658,16 @@
       "Values_h.template",
       "Object_h.template",
       "ValueConversions_h.template",
-      "DispatcherBase_h.template",
     ]
 
     protocol_cpp_templates = [
       "Protocol_cpp.template",
       "Values_cpp.template",
       "Object_cpp.template",
-      "DispatcherBase_cpp.template",
     ]
 
     forward_h_templates = [
       "Forward_h.template",
-      "FrontendChannel_h.template",
     ]
 
     base_string_adapter_h_templates = [
diff --git a/third_party/inspector_protocol/crdtp/dispatch.cc b/third_party/inspector_protocol/crdtp/dispatch.cc
new file mode 100644
index 0000000..598fd36
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/dispatch.cc
@@ -0,0 +1,576 @@
+// Copyright 2020 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.
+
+#include "dispatch.h"
+
+#include <cassert>
+#include "cbor.h"
+#include "error_support.h"
+#include "find_by_first.h"
+#include "frontend_channel.h"
+
+namespace crdtp {
+// =============================================================================
+// DispatchResponse - Error status and chaining / fall through
+// =============================================================================
+
+// static
+DispatchResponse DispatchResponse::Success() {
+  DispatchResponse result;
+  result.code_ = DispatchCode::SUCCESS;
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::FallThrough() {
+  DispatchResponse result;
+  result.code_ = DispatchCode::FALL_THROUGH;
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::ParseError(std::string message) {
+  DispatchResponse result;
+  result.code_ = DispatchCode::PARSE_ERROR;
+  result.message_ = std::move(message);
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::InvalidRequest(std::string message) {
+  DispatchResponse result;
+  result.code_ = DispatchCode::INVALID_REQUEST;
+  result.message_ = std::move(message);
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::MethodNotFound(std::string message) {
+  DispatchResponse result;
+  result.code_ = DispatchCode::METHOD_NOT_FOUND;
+  result.message_ = std::move(message);
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::InvalidParams(std::string message) {
+  DispatchResponse result;
+  result.code_ = DispatchCode::INVALID_PARAMS;
+  result.message_ = std::move(message);
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::InternalError() {
+  DispatchResponse result;
+  result.code_ = DispatchCode::INTERNAL_ERROR;
+  result.message_ = "Internal error";
+  return result;
+}
+
+// static
+DispatchResponse DispatchResponse::ServerError(std::string message) {
+  DispatchResponse result;
+  result.code_ = DispatchCode::SERVER_ERROR;
+  result.message_ = std::move(message);
+  return result;
+}
+
+// =============================================================================
+// Dispatchable - a shallow parser for CBOR encoded DevTools messages
+// =============================================================================
+namespace {
+constexpr size_t kEncodedEnvelopeHeaderSize = 1 + 1 + sizeof(uint32_t);
+}  // namespace
+
+Dispatchable::Dispatchable(span<uint8_t> serialized) : serialized_(serialized) {
+  Status s = cbor::CheckCBORMessage(serialized);
+  if (!s.ok()) {
+    status_ = {Error::MESSAGE_MUST_BE_AN_OBJECT, s.pos};
+    return;
+  }
+  cbor::CBORTokenizer tokenizer(serialized);
+  if (tokenizer.TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) {
+    status_ = tokenizer.Status();
+    return;
+  }
+
+  // We checked for the envelope start byte above, so the tokenizer
+  // must agree here, since it's not an error.
+  assert(tokenizer.TokenTag() == cbor::CBORTokenTag::ENVELOPE);
+
+  // Before we enter the envelope, we save the position that we
+  // expect to see after we're done parsing the envelope contents.
+  // This way we can compare and produce an error if the contents
+  // didn't fit exactly into the envelope length.
+  const size_t pos_past_envelope = tokenizer.Status().pos +
+                                   kEncodedEnvelopeHeaderSize +
+                                   tokenizer.GetEnvelopeContents().size();
+  tokenizer.EnterEnvelope();
+  if (tokenizer.TokenTag() == cbor::CBORTokenTag::ERROR_VALUE) {
+    status_ = tokenizer.Status();
+    return;
+  }
+  if (tokenizer.TokenTag() != cbor::CBORTokenTag::MAP_START) {
+    status_ = {Error::MESSAGE_MUST_BE_AN_OBJECT, tokenizer.Status().pos};
+    return;
+  }
+  assert(tokenizer.TokenTag() == cbor::CBORTokenTag::MAP_START);
+  tokenizer.Next();  // Now we should be pointed at the map key.
+  while (tokenizer.TokenTag() != cbor::CBORTokenTag::STOP) {
+    switch (tokenizer.TokenTag()) {
+      case cbor::CBORTokenTag::DONE:
+        status_ =
+            Status{Error::CBOR_UNEXPECTED_EOF_IN_MAP, tokenizer.Status().pos};
+        return;
+      case cbor::CBORTokenTag::ERROR_VALUE:
+        status_ = tokenizer.Status();
+        return;
+      case cbor::CBORTokenTag::STRING8:
+        if (!MaybeParseProperty(&tokenizer))
+          return;
+        break;
+      default:
+        // We require the top-level keys to be UTF8 (US-ASCII in practice).
+        status_ = Status{Error::CBOR_INVALID_MAP_KEY, tokenizer.Status().pos};
+        return;
+    }
+  }
+  tokenizer.Next();
+  if (!has_call_id_) {
+    status_ = Status{Error::MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY,
+                     tokenizer.Status().pos};
+    return;
+  }
+  if (method_.empty()) {
+    status_ = Status{Error::MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY,
+                     tokenizer.Status().pos};
+    return;
+  }
+  // The contents of the envelope parsed OK, now check that we're at
+  // the expected position.
+  if (pos_past_envelope != tokenizer.Status().pos) {
+    status_ = Status{Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH,
+                     tokenizer.Status().pos};
+    return;
+  }
+  if (tokenizer.TokenTag() != cbor::CBORTokenTag::DONE) {
+    status_ = Status{Error::CBOR_TRAILING_JUNK, tokenizer.Status().pos};
+    return;
+  }
+}
+
+bool Dispatchable::ok() const {
+  return status_.ok();
+}
+
+DispatchResponse Dispatchable::DispatchError() const {
+  // TODO(johannes): Replace with DCHECK / similar?
+  if (status_.ok())
+    return DispatchResponse::Success();
+
+  if (status_.IsMessageError())
+    return DispatchResponse::InvalidRequest(status_.Message());
+  return DispatchResponse::ParseError(status_.ToASCIIString());
+}
+
+bool Dispatchable::MaybeParseProperty(cbor::CBORTokenizer* tokenizer) {
+  span<uint8_t> property_name = tokenizer->GetString8();
+  if (SpanEquals(SpanFrom("id"), property_name))
+    return MaybeParseCallId(tokenizer);
+  if (SpanEquals(SpanFrom("method"), property_name))
+    return MaybeParseMethod(tokenizer);
+  if (SpanEquals(SpanFrom("params"), property_name))
+    return MaybeParseParams(tokenizer);
+  if (SpanEquals(SpanFrom("sessionId"), property_name))
+    return MaybeParseSessionId(tokenizer);
+  status_ =
+      Status{Error::MESSAGE_HAS_UNKNOWN_PROPERTY, tokenizer->Status().pos};
+  return false;
+}
+
+bool Dispatchable::MaybeParseCallId(cbor::CBORTokenizer* tokenizer) {
+  if (has_call_id_) {
+    status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos};
+    return false;
+  }
+  tokenizer->Next();
+  if (tokenizer->TokenTag() != cbor::CBORTokenTag::INT32) {
+    status_ = Status{Error::MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY,
+                     tokenizer->Status().pos};
+    return false;
+  }
+  call_id_ = tokenizer->GetInt32();
+  has_call_id_ = true;
+  tokenizer->Next();
+  return true;
+}
+
+bool Dispatchable::MaybeParseMethod(cbor::CBORTokenizer* tokenizer) {
+  if (!method_.empty()) {
+    status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos};
+    return false;
+  }
+  tokenizer->Next();
+  if (tokenizer->TokenTag() != cbor::CBORTokenTag::STRING8) {
+    status_ = Status{Error::MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY,
+                     tokenizer->Status().pos};
+    return false;
+  }
+  method_ = tokenizer->GetString8();
+  tokenizer->Next();
+  return true;
+}
+
+bool Dispatchable::MaybeParseParams(cbor::CBORTokenizer* tokenizer) {
+  if (params_seen_) {
+    status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos};
+    return false;
+  }
+  params_seen_ = true;
+  tokenizer->Next();
+  if (tokenizer->TokenTag() == cbor::CBORTokenTag::NULL_VALUE) {
+    tokenizer->Next();
+    return true;
+  }
+  if (tokenizer->TokenTag() != cbor::CBORTokenTag::ENVELOPE) {
+    status_ = Status{Error::MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY,
+                     tokenizer->Status().pos};
+    return false;
+  }
+  params_ = tokenizer->GetEnvelope();
+  tokenizer->Next();
+  return true;
+}
+
+bool Dispatchable::MaybeParseSessionId(cbor::CBORTokenizer* tokenizer) {
+  if (!session_id_.empty()) {
+    status_ = Status{Error::CBOR_DUPLICATE_MAP_KEY, tokenizer->Status().pos};
+    return false;
+  }
+  tokenizer->Next();
+  if (tokenizer->TokenTag() != cbor::CBORTokenTag::STRING8) {
+    status_ = Status{Error::MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY,
+                     tokenizer->Status().pos};
+    return false;
+  }
+  session_id_ = tokenizer->GetString8();
+  tokenizer->Next();
+  return true;
+}
+
+namespace {
+class ProtocolError : public Serializable {
+ public:
+  explicit ProtocolError(DispatchResponse dispatch_response)
+      : dispatch_response_(std::move(dispatch_response)) {}
+
+  void AppendSerialized(std::vector<uint8_t>* out) const override {
+    Status status;
+    std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(out, &status);
+    encoder->HandleMapBegin();
+    if (has_call_id_) {
+      encoder->HandleString8(SpanFrom("id"));
+      encoder->HandleInt32(call_id_);
+    }
+    encoder->HandleString8(SpanFrom("error"));
+    encoder->HandleMapBegin();
+    encoder->HandleString8(SpanFrom("code"));
+    encoder->HandleInt32(static_cast<int32_t>(dispatch_response_.Code()));
+    encoder->HandleString8(SpanFrom("message"));
+    encoder->HandleString8(SpanFrom(dispatch_response_.Message()));
+    if (!data_.empty()) {
+      encoder->HandleString8(SpanFrom("data"));
+      encoder->HandleString8(SpanFrom(data_));
+    }
+    encoder->HandleMapEnd();
+    encoder->HandleMapEnd();
+    assert(status.ok());
+  }
+
+  void SetCallId(int call_id) {
+    has_call_id_ = true;
+    call_id_ = call_id;
+  }
+  void SetData(std::string data) { data_ = std::move(data); }
+
+ private:
+  const DispatchResponse dispatch_response_;
+  std::string data_;
+  int call_id_ = 0;
+  bool has_call_id_ = false;
+};
+}  // namespace
+
+// =============================================================================
+// Helpers for creating protocol cresponses and notifications.
+// =============================================================================
+
+std::unique_ptr<Serializable> CreateErrorResponse(
+    int call_id,
+    DispatchResponse dispatch_response,
+    const ErrorSupport* errors) {
+  auto protocol_error =
+      std::make_unique<ProtocolError>(std::move(dispatch_response));
+  protocol_error->SetCallId(call_id);
+  if (errors && !errors->Errors().empty()) {
+    protocol_error->SetData(
+        std::string(errors->Errors().begin(), errors->Errors().end()));
+  }
+  return protocol_error;
+}
+
+std::unique_ptr<Serializable> CreateErrorNotification(
+    DispatchResponse dispatch_response) {
+  return std::make_unique<ProtocolError>(std::move(dispatch_response));
+}
+
+namespace {
+class Response : public Serializable {
+ public:
+  Response(int call_id, std::unique_ptr<Serializable> params)
+      : call_id_(call_id), params_(std::move(params)) {}
+
+  void AppendSerialized(std::vector<uint8_t>* out) const override {
+    Status status;
+    std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(out, &status);
+    encoder->HandleMapBegin();
+    encoder->HandleString8(SpanFrom("id"));
+    encoder->HandleInt32(call_id_);
+    encoder->HandleString8(SpanFrom("result"));
+    if (params_) {
+      params_->AppendSerialized(out);
+    } else {
+      encoder->HandleMapBegin();
+      encoder->HandleMapEnd();
+    }
+    encoder->HandleMapEnd();
+    assert(status.ok());
+  }
+
+ private:
+  const int call_id_;
+  std::unique_ptr<Serializable> params_;
+};
+
+class Notification : public Serializable {
+ public:
+  Notification(const char* method, std::unique_ptr<Serializable> params)
+      : method_(method), params_(std::move(params)) {}
+
+  void AppendSerialized(std::vector<uint8_t>* out) const override {
+    Status status;
+    std::unique_ptr<ParserHandler> encoder = cbor::NewCBOREncoder(out, &status);
+    encoder->HandleMapBegin();
+    encoder->HandleString8(SpanFrom("method"));
+    encoder->HandleString8(SpanFrom(method_));
+    encoder->HandleString8(SpanFrom("params"));
+    if (params_) {
+      params_->AppendSerialized(out);
+    } else {
+      encoder->HandleMapBegin();
+      encoder->HandleMapEnd();
+    }
+    encoder->HandleMapEnd();
+    assert(status.ok());
+  }
+
+ private:
+  const char* method_;
+  std::unique_ptr<Serializable> params_;
+};
+}  // namespace
+
+std::unique_ptr<Serializable> CreateResponse(
+    int call_id,
+    std::unique_ptr<Serializable> params) {
+  return std::make_unique<Response>(call_id, std::move(params));
+}
+
+std::unique_ptr<Serializable> CreateNotification(
+    const char* method,
+    std::unique_ptr<Serializable> params) {
+  return std::make_unique<Notification>(method, std::move(params));
+}
+
+// =============================================================================
+// DomainDispatcher - Dispatching betwen protocol methods within a domain.
+// =============================================================================
+DomainDispatcher::WeakPtr::WeakPtr(DomainDispatcher* dispatcher)
+    : dispatcher_(dispatcher) {}
+
+DomainDispatcher::WeakPtr::~WeakPtr() {
+  if (dispatcher_)
+    dispatcher_->weak_ptrs_.erase(this);
+}
+
+DomainDispatcher::Callback::~Callback() = default;
+
+void DomainDispatcher::Callback::dispose() {
+  backend_impl_ = nullptr;
+}
+
+DomainDispatcher::Callback::Callback(
+    std::unique_ptr<DomainDispatcher::WeakPtr> backend_impl,
+    int call_id,
+    span<uint8_t> method,
+    span<uint8_t> message)
+    : backend_impl_(std::move(backend_impl)),
+      call_id_(call_id),
+      method_(method),
+      message_(message.begin(), message.end()) {}
+
+void DomainDispatcher::Callback::sendIfActive(
+    std::unique_ptr<Serializable> partialMessage,
+    const DispatchResponse& response) {
+  if (!backend_impl_ || !backend_impl_->get())
+    return;
+  backend_impl_->get()->sendResponse(call_id_, response,
+                                     std::move(partialMessage));
+  backend_impl_ = nullptr;
+}
+
+void DomainDispatcher::Callback::fallThroughIfActive() {
+  if (!backend_impl_ || !backend_impl_->get())
+    return;
+  backend_impl_->get()->channel()->FallThrough(call_id_, method_,
+                                               SpanFrom(message_));
+  backend_impl_ = nullptr;
+}
+
+DomainDispatcher::DomainDispatcher(FrontendChannel* frontendChannel)
+    : frontend_channel_(frontendChannel) {}
+
+DomainDispatcher::~DomainDispatcher() {
+  clearFrontend();
+}
+
+void DomainDispatcher::sendResponse(int call_id,
+                                    const DispatchResponse& response,
+                                    std::unique_ptr<Serializable> result) {
+  if (!frontend_channel_)
+    return;
+  std::unique_ptr<Serializable> serializable;
+  if (response.IsError()) {
+    serializable = CreateErrorResponse(call_id, response);
+  } else {
+    serializable = CreateResponse(call_id, std::move(result));
+  }
+  frontend_channel_->SendProtocolResponse(call_id, std::move(serializable));
+}
+
+bool DomainDispatcher::MaybeReportInvalidParams(
+    const Dispatchable& dispatchable,
+    const ErrorSupport& errors) {
+  if (errors.Errors().empty())
+    return false;
+  if (frontend_channel_) {
+    frontend_channel_->SendProtocolResponse(
+        dispatchable.CallId(),
+        CreateErrorResponse(
+            dispatchable.CallId(),
+            DispatchResponse::InvalidParams("Invalid parameters"), &errors));
+  }
+  return true;
+}
+
+void DomainDispatcher::clearFrontend() {
+  frontend_channel_ = nullptr;
+  for (auto& weak : weak_ptrs_)
+    weak->dispose();
+  weak_ptrs_.clear();
+}
+
+std::unique_ptr<DomainDispatcher::WeakPtr> DomainDispatcher::weakPtr() {
+  auto weak = std::make_unique<DomainDispatcher::WeakPtr>(this);
+  weak_ptrs_.insert(weak.get());
+  return weak;
+}
+
+// =============================================================================
+// UberDispatcher - dispatches between domains (backends).
+// =============================================================================
+UberDispatcher::DispatchResult::DispatchResult(bool method_found,
+                                               std::function<void()> runnable)
+    : method_found_(method_found), runnable_(runnable) {}
+
+void UberDispatcher::DispatchResult::Run() {
+  if (!runnable_)
+    return;
+  runnable_();
+  runnable_ = nullptr;
+}
+
+UberDispatcher::UberDispatcher(FrontendChannel* frontend_channel)
+    : frontend_channel_(frontend_channel) {
+  assert(frontend_channel);
+}
+
+UberDispatcher::~UberDispatcher() = default;
+
+constexpr size_t kNotFound = std::numeric_limits<size_t>::max();
+
+namespace {
+size_t DotIdx(span<uint8_t> method) {
+  const void* p = memchr(method.data(), '.', method.size());
+  return p ? reinterpret_cast<const uint8_t*>(p) - method.data() : kNotFound;
+}
+}  // namespace
+
+UberDispatcher::DispatchResult UberDispatcher::Dispatch(
+    const Dispatchable& dispatchable) const {
+  span<uint8_t> method = FindByFirst(redirects_, dispatchable.Method(),
+                                     /*default_value=*/dispatchable.Method());
+  size_t dot_idx = DotIdx(method);
+  if (dot_idx != kNotFound) {
+    span<uint8_t> domain = method.subspan(0, dot_idx);
+    span<uint8_t> command = method.subspan(dot_idx + 1);
+    DomainDispatcher* dispatcher = FindByFirst(dispatchers_, domain);
+    if (dispatcher) {
+      std::function<void(const Dispatchable&)> dispatched =
+          dispatcher->Dispatch(command);
+      if (dispatched) {
+        return DispatchResult(
+            true, [dispatchable, dispatched = std::move(dispatched)]() {
+              dispatched(dispatchable);
+            });
+      }
+    }
+  }
+  return DispatchResult(false, [this, dispatchable]() {
+    frontend_channel_->SendProtocolResponse(
+        dispatchable.CallId(),
+        CreateErrorResponse(dispatchable.CallId(),
+                            DispatchResponse::MethodNotFound(
+                                "'" +
+                                std::string(dispatchable.Method().begin(),
+                                            dispatchable.Method().end()) +
+                                "' wasn't found")));
+  });
+}
+
+template <typename T>
+struct FirstLessThan {
+  bool operator()(const std::pair<span<uint8_t>, T>& left,
+                  const std::pair<span<uint8_t>, T>& right) {
+    return SpanLessThan(left.first, right.first);
+  }
+};
+
+void UberDispatcher::WireBackend(
+    span<uint8_t> domain,
+    const std::vector<std::pair<span<uint8_t>, span<uint8_t>>>&
+        sorted_redirects,
+    std::unique_ptr<DomainDispatcher> dispatcher) {
+  auto it = redirects_.insert(redirects_.end(), sorted_redirects.begin(),
+                              sorted_redirects.end());
+  std::inplace_merge(redirects_.begin(), it, redirects_.end(),
+                     FirstLessThan<span<uint8_t>>());
+  auto jt = dispatchers_.insert(dispatchers_.end(),
+                                std::make_pair(domain, std::move(dispatcher)));
+  std::inplace_merge(dispatchers_.begin(), jt, dispatchers_.end(),
+                     FirstLessThan<std::unique_ptr<DomainDispatcher>>());
+}
+
+}  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/dispatch.h b/third_party/inspector_protocol/crdtp/dispatch.h
new file mode 100644
index 0000000..2de889a
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/dispatch.h
@@ -0,0 +1,311 @@
+// Copyright 2020 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.
+
+#ifndef CRDTP_DISPATCH_H_
+#define CRDTP_DISPATCH_H_
+
+#include <cassert>
+#include <cstdint>
+#include <functional>
+#include <string>
+#include <unordered_set>
+#include "export.h"
+#include "serializable.h"
+#include "span.h"
+#include "status.h"
+
+namespace crdtp {
+class FrontendChannel;
+class ErrorSupport;
+namespace cbor {
+class CBORTokenizer;
+}  // namespace cbor
+
+// =============================================================================
+// DispatchResponse - Error status and chaining / fall through
+// =============================================================================
+enum class DispatchCode {
+  SUCCESS = 1,
+  FALL_THROUGH = 2,
+  // For historical reasons, these error codes correspond to commonly used
+  // XMLRPC codes (e.g. see METHOD_NOT_FOUND in
+  // https://github.com/python/cpython/blob/master/Lib/xmlrpc/client.py).
+  PARSE_ERROR = -32700,
+  INVALID_REQUEST = -32600,
+  METHOD_NOT_FOUND = -32601,
+  INVALID_PARAMS = -32602,
+  INTERNAL_ERROR = -32603,
+  SERVER_ERROR = -32000,
+};
+
+// Information returned by command handlers. Usually returned after command
+// execution attempts.
+class CRDTP_EXPORT DispatchResponse {
+ public:
+  const std::string& Message() const { return message_; }
+
+  DispatchCode Code() const { return code_; }
+
+  bool IsSuccess() const { return code_ == DispatchCode::SUCCESS; }
+  bool IsFallThrough() const { return code_ == DispatchCode::FALL_THROUGH; }
+  bool IsError() const { return code_ < DispatchCode::SUCCESS; }
+
+  static DispatchResponse Success();
+  static DispatchResponse FallThrough();
+
+  // Indicates that a message could not be parsed. E.g., malformed JSON.
+  static DispatchResponse ParseError(std::string message);
+
+  // Indicates that a request is lacking required top-level properties
+  // ('id', 'method'), has top-level properties of the wrong type, or has
+  // unknown top-level properties.
+  static DispatchResponse InvalidRequest(std::string message);
+
+  // Indicates that a protocol method such as "Page.bringToFront" could not be
+  // dispatched because it's not known to the (domain) dispatcher.
+  static DispatchResponse MethodNotFound(std::string message);
+
+  // Indicates that the params sent to a domain handler are invalid.
+  static DispatchResponse InvalidParams(std::string message);
+
+  // Used for application level errors, e.g. within protocol agents.
+  static DispatchResponse InternalError();
+
+  // Used for application level errors, e.g. within protocol agents.
+  static DispatchResponse ServerError(std::string message);
+
+ private:
+  DispatchResponse() = default;
+  DispatchCode code_;
+  std::string message_;
+};
+
+// =============================================================================
+// Dispatchable - a shallow parser for CBOR encoded DevTools messages
+// =============================================================================
+
+// This parser extracts only the known top-level fields from a CBOR encoded map;
+// method, id, sessionId, and params.
+class CRDTP_EXPORT Dispatchable {
+ public:
+  // This constructor parses the |serialized| message. If successful,
+  // |ok()| will yield |true|, and |Method()|, |SessionId()|, |CallId()|,
+  // |Params()| can be used to access, the extracted contents. Otherwise,
+  // |ok()| will yield |false|, and |DispatchError()| can be
+  // used to send a response or notification to the client.
+  explicit Dispatchable(span<uint8_t> serialized);
+
+  // The serialized message that we just parsed.
+  span<uint8_t> Serialized() const { return serialized_; }
+
+  // Yields true if parsing was successful. This is cheaper than calling
+  // ::DispatchError().
+  bool ok() const;
+
+  // If !ok(), returns a DispatchResponse with appropriate code and error
+  // which can be sent to the client as a response or notification.
+  DispatchResponse DispatchError() const;
+
+  // Top level field: the command to be executed, fully qualified by
+  // domain. E.g. "Page.createIsolatedWorld".
+  span<uint8_t> Method() const { return method_; }
+  // Used to identify protocol connections attached to a specific
+  // target. See Target.attachToTarget, Target.setAutoAttach.
+  span<uint8_t> SessionId() const { return session_id_; }
+  // The call id, a sequence number that's used in responses to indicate
+  // the request to which the response belongs.
+  int32_t CallId() const { return call_id_; }
+  bool HasCallId() const { return has_call_id_; }
+  // The payload of the request in CBOR format. The |Dispatchable| parser does
+  // not parse into this; it only provides access to its raw contents here.
+  span<uint8_t> Params() const { return params_; }
+
+ private:
+  bool MaybeParseProperty(cbor::CBORTokenizer* tokenizer);
+  bool MaybeParseCallId(cbor::CBORTokenizer* tokenizer);
+  bool MaybeParseMethod(cbor::CBORTokenizer* tokenizer);
+  bool MaybeParseParams(cbor::CBORTokenizer* tokenizer);
+  bool MaybeParseSessionId(cbor::CBORTokenizer* tokenizer);
+
+  span<uint8_t> serialized_;
+
+  Status status_;
+
+  bool has_call_id_ = false;
+  int32_t call_id_;
+  span<uint8_t> method_;
+  bool params_seen_ = false;
+  span<uint8_t> params_;
+  span<uint8_t> session_id_;
+};
+
+// =============================================================================
+// Helpers for creating protocol cresponses and notifications.
+// =============================================================================
+
+// The resulting notifications can be sent to a protocol client,
+// usually via a FrontendChannel (see frontend_channel.h).
+
+CRDTP_EXPORT std::unique_ptr<Serializable> CreateErrorResponse(
+    int callId,
+    DispatchResponse dispatch_response,
+    const ErrorSupport* errors = nullptr);
+
+CRDTP_EXPORT std::unique_ptr<Serializable> CreateErrorNotification(
+    DispatchResponse dispatch_response);
+
+CRDTP_EXPORT std::unique_ptr<Serializable> CreateResponse(
+    int callId,
+    std::unique_ptr<Serializable> params);
+
+CRDTP_EXPORT std::unique_ptr<Serializable> CreateNotification(
+    const char* method,
+    std::unique_ptr<Serializable> params = nullptr);
+
+// =============================================================================
+// DomainDispatcher - Dispatching betwen protocol methods within a domain.
+// =============================================================================
+
+// This class is subclassed by |DomainDispatcherImpl|, which we generate per
+// DevTools domain. It contains routines called from the generated code,
+// e.g. ::MaybeReportInvalidParams, which are optimized for small code size.
+// The most important method is ::Dispatch, which implements method dispatch
+// by command name lookup.
+class CRDTP_EXPORT DomainDispatcher {
+ public:
+  class CRDTP_EXPORT WeakPtr {
+   public:
+    explicit WeakPtr(DomainDispatcher*);
+    ~WeakPtr();
+    DomainDispatcher* get() { return dispatcher_; }
+    void dispose() { dispatcher_ = nullptr; }
+
+   private:
+    DomainDispatcher* dispatcher_;
+  };
+
+  class CRDTP_EXPORT Callback {
+   public:
+    virtual ~Callback();
+    void dispose();
+
+   protected:
+    // |method| must point at static storage (a C++ string literal in practice).
+    Callback(std::unique_ptr<WeakPtr> backend_impl,
+             int call_id,
+             span<uint8_t> method,
+             span<uint8_t> message);
+
+    void sendIfActive(std::unique_ptr<Serializable> partialMessage,
+                      const DispatchResponse& response);
+    void fallThroughIfActive();
+
+   private:
+    std::unique_ptr<WeakPtr> backend_impl_;
+    int call_id_;
+    // Subclasses of this class are instantiated from generated code which
+    // passes a string literal for the method name to the constructor. So the
+    // storage for |method| is the binary of the running process.
+    span<uint8_t> method_;
+    std::vector<uint8_t> message_;
+  };
+
+  explicit DomainDispatcher(FrontendChannel*);
+  virtual ~DomainDispatcher();
+
+  // Given a |command_name| without domain qualification, looks up the
+  // corresponding method. If the method is not found, returns nullptr.
+  // Otherwise, Returns a closure that will parse the provided
+  // Dispatchable.params() to a protocol object and execute the
+  // apprpropriate method. If the parsing fails it will issue an
+  // error response on the frontend channel, otherwise it will execute the
+  // command.
+  virtual std::function<void(const Dispatchable&)> Dispatch(
+      span<uint8_t> command_name) = 0;
+
+  // Sends a response to the client via the channel.
+  void sendResponse(int call_id,
+                    const DispatchResponse&,
+                    std::unique_ptr<Serializable> result = nullptr);
+
+  // Returns true if |errors| contains errors *and* reports these errors
+  // as a response on the frontend channel. Called from generated code,
+  // optimized for code size of the callee.
+  bool MaybeReportInvalidParams(const Dispatchable& dispatchable,
+                                const ErrorSupport& errors);
+
+  FrontendChannel* channel() { return frontend_channel_; }
+
+  void clearFrontend();
+
+  std::unique_ptr<WeakPtr> weakPtr();
+
+ private:
+  FrontendChannel* frontend_channel_;
+  std::unordered_set<WeakPtr*> weak_ptrs_;
+};
+
+// =============================================================================
+// UberDispatcher - dispatches between domains (backends).
+// =============================================================================
+class CRDTP_EXPORT UberDispatcher {
+ public:
+  // Return type for ::Dispatch.
+  class CRDTP_EXPORT DispatchResult {
+   public:
+    DispatchResult(bool method_found, std::function<void()> runnable);
+
+    // Indicates whether the method was found, that is, it could be dispatched
+    // to a backend registered with this dispatcher.
+    bool MethodFound() const { return method_found_; }
+
+    // Runs the dispatched result. This will send the appropriate error
+    // responses if the method wasn't found or if something went wrong during
+    // parameter parsing.
+    void Run();
+
+   private:
+    bool method_found_;
+    std::function<void()> runnable_;
+  };
+
+  // |frontend_hannel| can't be nullptr.
+  explicit UberDispatcher(FrontendChannel* frontend_channel);
+  virtual ~UberDispatcher();
+
+  // Dispatches the provided |dispatchable| considering all redirects and domain
+  // handlers registered with this uber dispatcher. Also see |DispatchResult|.
+  // |dispatchable.ok()| must hold - callers must check this separately and
+  // deal with errors.
+  DispatchResult Dispatch(const Dispatchable& dispatchable) const;
+
+  // Invoked from generated code for wiring domain backends; that is,
+  // connecting domain handlers to an uber dispatcher.
+  // See <domain-namespace>::Dispatcher::Wire(UberDispatcher*,Backend*).
+  FrontendChannel* channel() const {
+    assert(frontend_channel_);
+    return frontend_channel_;
+  }
+
+  // Invoked from generated code for wiring domain backends; that is,
+  // connecting domain handlers to an uber dispatcher.
+  // See <domain-namespace>::Dispatcher::Wire(UberDispatcher*,Backend*).
+  void WireBackend(span<uint8_t> domain,
+                   const std::vector<std::pair<span<uint8_t>, span<uint8_t>>>&,
+                   std::unique_ptr<DomainDispatcher> dispatcher);
+
+ private:
+  DomainDispatcher* findDispatcher(span<uint8_t> method);
+  FrontendChannel* const frontend_channel_;
+  // Pairs of ascii strings of the form ("Domain1.method1","Domain2.method2")
+  // indicating that the first element of each pair redirects to the second.
+  // Sorted by first element.
+  std::vector<std::pair<span<uint8_t>, span<uint8_t>>> redirects_;
+  // Domain dispatcher instances, sorted by their domain name.
+  std::vector<std::pair<span<uint8_t>, std::unique_ptr<DomainDispatcher>>>
+      dispatchers_;
+};
+}  // namespace crdtp
+
+#endif  // CRDTP_DISPATCH_H_
diff --git a/third_party/inspector_protocol/crdtp/dispatch_test.cc b/third_party/inspector_protocol/crdtp/dispatch_test.cc
new file mode 100644
index 0000000..d0c36df
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/dispatch_test.cc
@@ -0,0 +1,445 @@
+// Copyright 2020 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.
+
+#include <vector>
+
+#include "cbor.h"
+#include "dispatch.h"
+#include "error_support.h"
+#include "frontend_channel.h"
+#include "json.h"
+#include "test_platform.h"
+
+namespace crdtp {
+// =============================================================================
+// DispatchResponse - Error status and chaining / fall through
+// =============================================================================
+TEST(DispatchResponseTest, OK) {
+  EXPECT_EQ(DispatchCode::SUCCESS, DispatchResponse::Success().Code());
+  EXPECT_TRUE(DispatchResponse::Success().IsSuccess());
+}
+
+TEST(DispatchResponseTest, ServerError) {
+  DispatchResponse error = DispatchResponse::ServerError("Oops!");
+  EXPECT_FALSE(error.IsSuccess());
+  EXPECT_EQ(DispatchCode::SERVER_ERROR, error.Code());
+  EXPECT_EQ("Oops!", error.Message());
+}
+
+TEST(DispatchResponseTest, InternalError) {
+  DispatchResponse error = DispatchResponse::InternalError();
+  EXPECT_FALSE(error.IsSuccess());
+  EXPECT_EQ(DispatchCode::INTERNAL_ERROR, error.Code());
+  EXPECT_EQ("Internal error", error.Message());
+}
+
+TEST(DispatchResponseTest, InvalidParams) {
+  DispatchResponse error = DispatchResponse::InvalidParams("too cool");
+  EXPECT_FALSE(error.IsSuccess());
+  EXPECT_EQ(DispatchCode::INVALID_PARAMS, error.Code());
+  EXPECT_EQ("too cool", error.Message());
+}
+
+TEST(DispatchResponseTest, FallThrough) {
+  DispatchResponse error = DispatchResponse::FallThrough();
+  EXPECT_FALSE(error.IsSuccess());
+  EXPECT_TRUE(error.IsFallThrough());
+  EXPECT_EQ(DispatchCode::FALL_THROUGH, error.Code());
+}
+
+// =============================================================================
+// Dispatchable - a shallow parser for CBOR encoded DevTools messages
+// =============================================================================
+TEST(DispatchableTest, MessageMustBeAnObject) {
+  // Provide no input whatsoever.
+  span<uint8_t> empty_span;
+  Dispatchable empty(empty_span);
+  EXPECT_FALSE(empty.ok());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, empty.DispatchError().Code());
+  EXPECT_EQ("Message must be an object", empty.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageMustHaveIntegerIdProperty) {
+  // Construct an empty map inside of an envelope.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom("{}"), &cbor).ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_FALSE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ("Message must have integer 'id' property",
+            dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageMustHaveIntegerIdProperty_IncorrectType) {
+  // This time we set the id property, but fail to make it an int32.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(
+      json::ConvertJSONToCBOR(SpanFrom("{\"id\":\"foo\"}"), &cbor).ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_FALSE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ("Message must have integer 'id' property",
+            dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageMustHaveStringMethodProperty) {
+  // This time we set the id property, but not the method property.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom("{\"id\":42}"), &cbor).ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_TRUE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ("Message must have string 'method' property",
+            dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageMustHaveStringMethodProperty_IncorrectType) {
+  // This time we set the method property, but fail to make it a string.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(
+      json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"method\":42}"), &cbor)
+          .ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_TRUE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ("Message must have string 'method' property",
+            dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageMayHaveStringSessionIdProperty) {
+  // This time, the session id is an int but it should be a string. Method and
+  // call id are present.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(json::ConvertJSONToCBOR(
+                  SpanFrom("{\"id\":42,\"method\":\"Foo.executeBar\","
+                           "\"sessionId\":42"  // int32 is wrong type
+                           "}"),
+                  &cbor)
+                  .ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_TRUE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ("Message may have string 'sessionId' property",
+            dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageMayHaveObjectParamsProperty) {
+  // This time, we fail to use the correct type for the params property.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(json::ConvertJSONToCBOR(
+                  SpanFrom("{\"id\":42,\"method\":\"Foo.executeBar\","
+                           "\"params\":42"  // int32 is wrong type
+                           "}"),
+                  &cbor)
+                  .ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_TRUE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ("Message may have object 'params' property",
+            dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, MessageWithUnknownProperty) {
+  // This time we set the 'unknown' property, so we are told what's allowed.
+  std::vector<uint8_t> cbor;
+  ASSERT_TRUE(
+      json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"unknown\":42}"), &cbor)
+          .ok());
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_TRUE(dispatchable.HasCallId());
+  EXPECT_EQ(DispatchCode::INVALID_REQUEST, dispatchable.DispatchError().Code());
+  EXPECT_EQ(
+      "Message has property other than 'id', 'method', 'sessionId', 'params'",
+      dispatchable.DispatchError().Message());
+}
+
+TEST(DispatchableTest, DuplicateMapKey) {
+  for (const std::string& json :
+       {"{\"id\":42,\"id\":42}", "{\"params\":null,\"params\":null}",
+        "{\"method\":\"foo\",\"method\":\"foo\"}",
+        "{\"sessionId\":\"42\",\"sessionId\":\"42\"}"}) {
+    SCOPED_TRACE("json = " + json);
+    std::vector<uint8_t> cbor;
+    ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom(json), &cbor).ok());
+    Dispatchable dispatchable(SpanFrom(cbor));
+    EXPECT_FALSE(dispatchable.ok());
+    EXPECT_EQ(DispatchCode::PARSE_ERROR, dispatchable.DispatchError().Code());
+    EXPECT_THAT(dispatchable.DispatchError().Message(),
+                testing::StartsWith("CBOR: duplicate map key at position "));
+  }
+}
+
+TEST(DispatchableTest, ValidMessageParsesOK_NoParams) {
+  for (const std::string& json :
+       {"{\"id\":42,\"method\":\"Foo.executeBar\",\"sessionId\":"
+        "\"f421ssvaz4\"}",
+        "{\"id\":42,\"method\":\"Foo.executeBar\",\"sessionId\":\"f421ssvaz4\","
+        "\"params\":null}"}) {
+    SCOPED_TRACE("json = " + json);
+    std::vector<uint8_t> cbor;
+    ASSERT_TRUE(json::ConvertJSONToCBOR(SpanFrom(json), &cbor).ok());
+    Dispatchable dispatchable(SpanFrom(cbor));
+    EXPECT_TRUE(dispatchable.ok());
+    EXPECT_TRUE(dispatchable.HasCallId());
+    EXPECT_EQ(42, dispatchable.CallId());
+    EXPECT_EQ("Foo.executeBar", std::string(dispatchable.Method().begin(),
+                                            dispatchable.Method().end()));
+    EXPECT_EQ("f421ssvaz4", std::string(dispatchable.SessionId().begin(),
+                                        dispatchable.SessionId().end()));
+    EXPECT_TRUE(dispatchable.Params().empty());
+  }
+}
+
+TEST(DispatchableTest, ValidMessageParsesOK_WithParams) {
+  std::vector<uint8_t> cbor;
+  cbor::EnvelopeEncoder envelope;
+  envelope.EncodeStart(&cbor);
+  cbor.push_back(cbor::EncodeIndefiniteLengthMapStart());
+  cbor::EncodeString8(SpanFrom("id"), &cbor);
+  cbor::EncodeInt32(42, &cbor);
+  cbor::EncodeString8(SpanFrom("method"), &cbor);
+  cbor::EncodeString8(SpanFrom("Foo.executeBar"), &cbor);
+  cbor::EncodeString8(SpanFrom("params"), &cbor);
+  cbor::EnvelopeEncoder params_envelope;
+  params_envelope.EncodeStart(&cbor);
+  // The |Dispatchable| class does not parse into the "params" envelope,
+  // so we can stick anything into there for the purpose of this test.
+  // For convenience, we use a String8.
+  cbor::EncodeString8(SpanFrom("params payload"), &cbor);
+  params_envelope.EncodeStop(&cbor);
+  cbor::EncodeString8(SpanFrom("sessionId"), &cbor);
+  cbor::EncodeString8(SpanFrom("f421ssvaz4"), &cbor);
+  cbor.push_back(cbor::EncodeStop());
+  envelope.EncodeStop(&cbor);
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_TRUE(dispatchable.ok());
+  EXPECT_TRUE(dispatchable.HasCallId());
+  EXPECT_EQ(42, dispatchable.CallId());
+  EXPECT_EQ("Foo.executeBar", std::string(dispatchable.Method().begin(),
+                                          dispatchable.Method().end()));
+  EXPECT_EQ("f421ssvaz4", std::string(dispatchable.SessionId().begin(),
+                                      dispatchable.SessionId().end()));
+  cbor::CBORTokenizer params_tokenizer(dispatchable.Params());
+  ASSERT_EQ(cbor::CBORTokenTag::ENVELOPE, params_tokenizer.TokenTag());
+  params_tokenizer.EnterEnvelope();
+  ASSERT_EQ(cbor::CBORTokenTag::STRING8, params_tokenizer.TokenTag());
+  EXPECT_EQ("params payload", std::string(params_tokenizer.GetString8().begin(),
+                                          params_tokenizer.GetString8().end()));
+}
+
+TEST(DispatchableTest, FaultyCBORTrailingJunk) {
+  // In addition to the higher level parsing errors, we also catch CBOR
+  // structural corruption. E.g., in this case, the message would be
+  // OK but has some extra trailing bytes.
+  std::vector<uint8_t> cbor;
+  cbor::EnvelopeEncoder envelope;
+  envelope.EncodeStart(&cbor);
+  cbor.push_back(cbor::EncodeIndefiniteLengthMapStart());
+  cbor::EncodeString8(SpanFrom("id"), &cbor);
+  cbor::EncodeInt32(42, &cbor);
+  cbor::EncodeString8(SpanFrom("method"), &cbor);
+  cbor::EncodeString8(SpanFrom("Foo.executeBar"), &cbor);
+  cbor::EncodeString8(SpanFrom("sessionId"), &cbor);
+  cbor::EncodeString8(SpanFrom("f421ssvaz4"), &cbor);
+  cbor.push_back(cbor::EncodeStop());
+  envelope.EncodeStop(&cbor);
+  size_t trailing_junk_pos = cbor.size();
+  cbor.push_back('t');
+  cbor.push_back('r');
+  cbor.push_back('a');
+  cbor.push_back('i');
+  cbor.push_back('l');
+  Dispatchable dispatchable(SpanFrom(cbor));
+  EXPECT_FALSE(dispatchable.ok());
+  EXPECT_EQ(DispatchCode::PARSE_ERROR, dispatchable.DispatchError().Code());
+  EXPECT_EQ(56u, trailing_junk_pos);
+  EXPECT_EQ("CBOR: trailing junk at position 56",
+            dispatchable.DispatchError().Message());
+}
+
+// =============================================================================
+// Helpers for creating protocol cresponses and notifications.
+// =============================================================================
+TEST(CreateErrorResponseTest, SmokeTest) {
+  ErrorSupport errors;
+  errors.Push();
+  errors.SetName("foo");
+  errors.Push();
+  errors.SetName("bar");
+  errors.AddError("expected a string");
+  errors.SetName("baz");
+  errors.AddError("expected a surprise");
+  auto serializable = CreateErrorResponse(
+      42, DispatchResponse::InvalidParams("invalid params message"), &errors);
+  std::string json;
+  auto status =
+      json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json);
+  ASSERT_TRUE(status.ok());
+  EXPECT_EQ(
+      "{\"id\":42,\"error\":"
+      "{\"code\":-32602,"
+      "\"message\":\"invalid params message\","
+      "\"data\":\"foo.bar: expected a string; "
+      "foo.baz: expected a surprise\"}}",
+      json);
+}
+
+TEST(CreateErrorNotificationTest, SmokeTest) {
+  auto serializable =
+      CreateErrorNotification(DispatchResponse::InvalidRequest("oops!"));
+  std::string json;
+  auto status =
+      json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json);
+  ASSERT_TRUE(status.ok());
+  EXPECT_EQ("{\"error\":{\"code\":-32600,\"message\":\"oops!\"}}", json);
+}
+
+TEST(CreateResponseTest, SmokeTest) {
+  auto serializable = CreateResponse(42, nullptr);
+  std::string json;
+  auto status =
+      json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json);
+  ASSERT_TRUE(status.ok());
+  EXPECT_EQ("{\"id\":42,\"result\":{}}", json);
+}
+
+TEST(CreateNotificationTest, SmokeTest) {
+  auto serializable = CreateNotification("Foo.bar");
+  std::string json;
+  auto status =
+      json::ConvertCBORToJSON(SpanFrom(serializable->Serialize()), &json);
+  ASSERT_TRUE(status.ok());
+  EXPECT_EQ("{\"method\":\"Foo.bar\",\"params\":{}}", json);
+}
+
+// =============================================================================
+// UberDispatcher - dispatches between domains (backends).
+// =============================================================================
+class TestChannel : public FrontendChannel {
+ public:
+  std::string JSON() const {
+    std::string json;
+    json::ConvertCBORToJSON(SpanFrom(cbor_), &json);
+    return json;
+  }
+
+ private:
+  void SendProtocolResponse(int call_id,
+                            std::unique_ptr<Serializable> message) override {
+    cbor_ = message->Serialize();
+  }
+
+  void SendProtocolNotification(
+      std::unique_ptr<Serializable> message) override {
+    cbor_ = message->Serialize();
+  }
+
+  void FallThrough(int call_id,
+                   span<uint8_t> method,
+                   span<uint8_t> message) override {}
+
+  void FlushProtocolNotifications() override {}
+
+  std::vector<uint8_t> cbor_;
+};
+
+TEST(UberDispatcherTest, MethodNotFound) {
+  // No domain dispatchers are registered, so unsuprisingly, we'll get a method
+  // not found error and can see that DispatchResult::MethodFound() yields
+  // false.
+  TestChannel channel;
+  UberDispatcher dispatcher(&channel);
+  std::vector<uint8_t> message;
+  json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"method\":\"Foo.bar\"}"),
+                          &message);
+  Dispatchable dispatchable(SpanFrom(message));
+  ASSERT_TRUE(dispatchable.ok());
+  UberDispatcher::DispatchResult dispatched = dispatcher.Dispatch(dispatchable);
+  EXPECT_FALSE(dispatched.MethodFound());
+  dispatched.Run();
+  EXPECT_EQ(
+      "{\"id\":42,\"error\":"
+      "{\"code\":-32601,\"message\":\"'Foo.bar' wasn't found\"}}",
+      channel.JSON());
+}
+
+// A domain dispatcher which captured dispatched and executed commands in fields
+// for testing.
+class TestDomain : public DomainDispatcher {
+ public:
+  explicit TestDomain(FrontendChannel* channel) : DomainDispatcher(channel) {}
+
+  std::function<void(const Dispatchable&)> Dispatch(
+      span<uint8_t> command_name) override {
+    dispatched_commands_.push_back(
+        std::string(command_name.begin(), command_name.end()));
+    return [this](const Dispatchable& dispatchable) {
+      executed_commands_.push_back(dispatchable.CallId());
+    };
+  }
+
+  // Command names of the dispatched commands.
+  std::vector<std::string> DispatchedCommands() const {
+    return dispatched_commands_;
+  }
+
+  // Call ids of the executed commands.
+  std::vector<int32_t> ExecutedCommands() const { return executed_commands_; }
+
+ private:
+  std::vector<std::string> dispatched_commands_;
+  std::vector<int32_t> executed_commands_;
+};
+
+TEST(UberDispatcherTest, DispatchingToDomainWithRedirects) {
+  // This time, we register two domain dispatchers (Foo and Bar) and issue one
+  // command 'Foo.execute' which executes on Foo and one command 'Foo.redirect'
+  // which executes as 'Bar.redirected'.
+  TestChannel channel;
+  UberDispatcher dispatcher(&channel);
+  auto foo_dispatcher = std::make_unique<TestDomain>(&channel);
+  TestDomain* foo = foo_dispatcher.get();
+  auto bar_dispatcher = std::make_unique<TestDomain>(&channel);
+  TestDomain* bar = bar_dispatcher.get();
+
+  dispatcher.WireBackend(
+      SpanFrom("Foo"), {{SpanFrom("Foo.redirect"), SpanFrom("Bar.redirected")}},
+      std::move(foo_dispatcher));
+  dispatcher.WireBackend(SpanFrom("Bar"), {}, std::move(bar_dispatcher));
+
+  {
+    std::vector<uint8_t> message;
+    json::ConvertJSONToCBOR(SpanFrom("{\"id\":42,\"method\":\"Foo.execute\"}"),
+                            &message);
+    Dispatchable dispatchable(SpanFrom(message));
+    ASSERT_TRUE(dispatchable.ok());
+    UberDispatcher::DispatchResult dispatched =
+        dispatcher.Dispatch(dispatchable);
+    EXPECT_TRUE(dispatched.MethodFound());
+    dispatched.Run();
+  }
+  {
+    std::vector<uint8_t> message;
+    json::ConvertJSONToCBOR(SpanFrom("{\"id\":43,\"method\":\"Foo.redirect\"}"),
+                            &message);
+    Dispatchable dispatchable(SpanFrom(message));
+    ASSERT_TRUE(dispatchable.ok());
+    UberDispatcher::DispatchResult dispatched =
+        dispatcher.Dispatch(dispatchable);
+    EXPECT_TRUE(dispatched.MethodFound());
+    dispatched.Run();
+  }
+  EXPECT_THAT(foo->DispatchedCommands(), testing::ElementsAre("execute"));
+  EXPECT_THAT(foo->ExecutedCommands(), testing::ElementsAre(42));
+  EXPECT_THAT(bar->DispatchedCommands(), testing::ElementsAre("redirected"));
+  EXPECT_THAT(bar->ExecutedCommands(), testing::ElementsAre(43));
+}
+}  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/error_support.h b/third_party/inspector_protocol/crdtp/error_support.h
index ddeb5deb..989dc9c 100644
--- a/third_party/inspector_protocol/crdtp/error_support.h
+++ b/third_party/inspector_protocol/crdtp/error_support.h
@@ -7,6 +7,7 @@
 
 #include <cstdint>
 #include <string>
+#include <vector>
 #include "export.h"
 #include "span.h"
 
diff --git a/third_party/inspector_protocol/crdtp/find_by_first.h b/third_party/inspector_protocol/crdtp/find_by_first.h
new file mode 100644
index 0000000..836ac60e
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/find_by_first.h
@@ -0,0 +1,58 @@
+// Copyright 2020 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.
+
+#ifndef CRDTP_FIND_BY_FIRST_H_
+#define CRDTP_FIND_BY_FIRST_H_
+
+#include <algorithm>
+#include <cstdint>
+#include <memory>
+#include <vector>
+
+#include "export.h"
+#include "span.h"
+
+namespace crdtp {
+// =============================================================================
+// FindByFirst - Retrieval from a sorted vector that's keyed by span<uint8_t>.
+// =============================================================================
+
+// Given a vector of pairs sorted by the first element of each pair, find
+// the corresponding value given a key to be compared to the first element.
+// Together with std::inplace_merge and pre-sorting or std::sort, this can
+// be used to implement a minimalistic equivalent of Chromium's flat_map.
+
+// In this variant, the template parameter |T| is a value type and a
+// |default_value| is provided.
+template <typename T>
+T FindByFirst(const std::vector<std::pair<span<uint8_t>, T>>& sorted_by_first,
+              span<uint8_t> key,
+              T default_value) {
+  auto it = std::lower_bound(
+      sorted_by_first.begin(), sorted_by_first.end(), key,
+      [](const std::pair<span<uint8_t>, T>& left, span<uint8_t> right) {
+        return SpanLessThan(left.first, right);
+      });
+  return (it != sorted_by_first.end() && SpanEquals(it->first, key))
+             ? it->second
+             : default_value;
+}
+
+// In this variant, the template parameter |T| is a class or struct that's
+// instantiated in std::unique_ptr, and we return either a T* or a nullptr.
+template <typename T>
+T* FindByFirst(const std::vector<std::pair<span<uint8_t>, std::unique_ptr<T>>>&
+                   sorted_by_first,
+               span<uint8_t> key) {
+  auto it = std::lower_bound(
+      sorted_by_first.begin(), sorted_by_first.end(), key,
+      [](const std::pair<span<uint8_t>, std::unique_ptr<T>>& left,
+         span<uint8_t> right) { return SpanLessThan(left.first, right); });
+  return (it != sorted_by_first.end() && SpanEquals(it->first, key))
+             ? it->second.get()
+             : nullptr;
+}
+}  // namespace crdtp
+
+#endif  // CRDTP_FIND_BY_FIRST_H_
diff --git a/third_party/inspector_protocol/crdtp/find_by_first_test.cc b/third_party/inspector_protocol/crdtp/find_by_first_test.cc
new file mode 100644
index 0000000..8e00b3e
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/find_by_first_test.cc
@@ -0,0 +1,76 @@
+// Copyright 2020 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.
+
+#include <string>
+
+#include "find_by_first.h"
+#include "test_platform.h"
+
+namespace crdtp {
+// =============================================================================
+// FindByFirst - Efficient retrieval from a sorted vector.
+// =============================================================================
+TEST(FindByFirst, SpanBySpan) {
+  std::vector<std::pair<span<uint8_t>, span<uint8_t>>> sorted_span_by_span = {
+      {SpanFrom("foo1"), SpanFrom("bar1")},
+      {SpanFrom("foo2"), SpanFrom("bar2")},
+      {SpanFrom("foo3"), SpanFrom("bar3")},
+  };
+  {
+    auto result = FindByFirst(sorted_span_by_span, SpanFrom("foo1"),
+                              SpanFrom("not_found"));
+    EXPECT_EQ("bar1", std::string(result.begin(), result.end()));
+  }
+  {
+    auto result = FindByFirst(sorted_span_by_span, SpanFrom("foo3"),
+                              SpanFrom("not_found"));
+    EXPECT_EQ("bar3", std::string(result.begin(), result.end()));
+  }
+  {
+    auto result = FindByFirst(sorted_span_by_span, SpanFrom("baz"),
+                              SpanFrom("not_found"));
+    EXPECT_EQ("not_found", std::string(result.begin(), result.end()));
+  }
+}
+
+namespace {
+class TestObject {
+ public:
+  explicit TestObject(const std::string& message) : message_(message) {}
+
+  const std::string& message() const { return message_; }
+
+ private:
+  std::string message_;
+};
+}  // namespace
+
+TEST(FindByFirst, ObjectBySpan) {
+  std::vector<std::pair<span<uint8_t>, std::unique_ptr<TestObject>>>
+      sorted_object_by_span;
+  sorted_object_by_span.push_back(
+      std::make_pair(SpanFrom("foo1"), std::make_unique<TestObject>("bar1")));
+  sorted_object_by_span.push_back(
+      std::make_pair(SpanFrom("foo2"), std::make_unique<TestObject>("bar2")));
+  sorted_object_by_span.push_back(
+      std::make_pair(SpanFrom("foo3"), std::make_unique<TestObject>("bar3")));
+  {
+    TestObject* result =
+        FindByFirst<TestObject>(sorted_object_by_span, SpanFrom("foo1"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ("bar1", result->message());
+  }
+  {
+    TestObject* result =
+        FindByFirst<TestObject>(sorted_object_by_span, SpanFrom("foo3"));
+    ASSERT_TRUE(result);
+    ASSERT_EQ("bar3", result->message());
+  }
+  {
+    TestObject* result =
+        FindByFirst<TestObject>(sorted_object_by_span, SpanFrom("baz"));
+    ASSERT_FALSE(result);
+  }
+}
+}  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/frontend_channel.h b/third_party/inspector_protocol/crdtp/frontend_channel.h
new file mode 100644
index 0000000..143eeb4
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/frontend_channel.h
@@ -0,0 +1,47 @@
+// Copyright 2020 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.
+
+#ifndef CRDTP_FRONTEND_CHANNEL_H_
+#define CRDTP_FRONTEND_CHANNEL_H_
+
+#include <cstdint>
+#include <memory>
+#include "export.h"
+#include "serializable.h"
+#include "span.h"
+
+namespace crdtp {
+// =============================================================================
+// FrontendChannel - For sending notifications and responses to protocol clients
+// =============================================================================
+class CRDTP_EXPORT FrontendChannel {
+ public:
+  virtual ~FrontendChannel() = default;
+
+  // Sends protocol responses and notifications. The |call_id| parameter is
+  // seemingly redundant because it's also included in the message, but
+  // responses may be sent from an untrusted source to a trusted process (e.g.
+  // from Chromium's renderer (blink) to the browser process), which needs
+  // to be able to match the response to an earlier request without parsing the
+  // messsage.
+  virtual void SendProtocolResponse(int call_id,
+                                    std::unique_ptr<Serializable> message) = 0;
+  virtual void SendProtocolNotification(
+      std::unique_ptr<Serializable> message) = 0;
+
+  // FallThrough indicates that |message| should be handled in another layer.
+  // Usually this means the layer responding to the message didn't handle it,
+  // but in some cases messages are handled by multiple layers (e.g. both
+  // the embedder and the content layer in Chromium).
+  virtual void FallThrough(int call_id,
+                           span<uint8_t> method,
+                           span<uint8_t> message) = 0;
+
+  // Session implementations may queue notifications for performance or
+  // other considerations; this is a hook for domain handlers to manually flush.
+  virtual void FlushProtocolNotifications() = 0;
+};
+}  // namespace crdtp
+
+#endif  // CRDTP_FRONTEND_CHANNEL_H_
diff --git a/third_party/inspector_protocol/crdtp/json.h b/third_party/inspector_protocol/crdtp/json.h
index e3790301..50309af 100644
--- a/third_party/inspector_protocol/crdtp/json.h
+++ b/third_party/inspector_protocol/crdtp/json.h
@@ -6,6 +6,7 @@
 #define CRDTP_JSON_H_
 
 #include <memory>
+#include <vector>
 #include "export.h"
 #include "parser_handler.h"
 
diff --git a/third_party/inspector_protocol/crdtp/serializable.cc b/third_party/inspector_protocol/crdtp/serializable.cc
index 6a60faf..cb894656 100644
--- a/third_party/inspector_protocol/crdtp/serializable.cc
+++ b/third_party/inspector_protocol/crdtp/serializable.cc
@@ -14,4 +14,23 @@
   AppendSerialized(&out);
   return out;
 }
+
+namespace {
+class PreSerialized : public Serializable {
+ public:
+  explicit PreSerialized(std::vector<uint8_t> bytes) : bytes_(bytes) {}
+
+  void AppendSerialized(std::vector<uint8_t>* out) const override {
+    out->insert(out->end(), bytes_.begin(), bytes_.end());
+  }
+
+ private:
+  std::vector<uint8_t> bytes_;
+};
+}  // namespace
+
+// static
+std::unique_ptr<Serializable> Serializable::From(std::vector<uint8_t> bytes) {
+  return std::make_unique<PreSerialized>(std::move(bytes));
+}
 }  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/serializable.h b/third_party/inspector_protocol/crdtp/serializable.h
index d65e4ba3..3b180b5 100644
--- a/third_party/inspector_protocol/crdtp/serializable.h
+++ b/third_party/inspector_protocol/crdtp/serializable.h
@@ -6,6 +6,7 @@
 #define CRDTP_SERIALIZABLE_H_
 
 #include <cstdint>
+#include <memory>
 #include <vector>
 #include "export.h"
 
@@ -13,7 +14,6 @@
 // =============================================================================
 // Serializable - An object to be emitted as a sequence of bytes.
 // =============================================================================
-
 class CRDTP_EXPORT Serializable {
  public:
   // Convenience: Invokes |AppendSerialized| on an empty vector.
@@ -22,6 +22,10 @@
   virtual void AppendSerialized(std::vector<uint8_t>* out) const = 0;
 
   virtual ~Serializable() = default;
+
+  // Wraps a vector of |bytes| into a Serializable for situations in which we
+  // eagerly serialize a structure.
+  static std::unique_ptr<Serializable> From(std::vector<uint8_t> bytes);
 };
 }  // namespace crdtp
 
diff --git a/third_party/inspector_protocol/crdtp/span.cc b/third_party/inspector_protocol/crdtp/span.cc
new file mode 100644
index 0000000..05443e0e
--- /dev/null
+++ b/third_party/inspector_protocol/crdtp/span.cc
@@ -0,0 +1,24 @@
+// Copyright 2020 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.
+
+#include "span.h"
+
+#include <algorithm>
+
+namespace crdtp {
+
+bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept {
+  auto min_size = std::min(x.size(), y.size());
+  const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size);
+  return (r < 0) || (r == 0 && x.size() < y.size());
+}
+
+bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept {
+  auto len = x.size();
+  if (len != y.size())
+    return false;
+  return x.data() == y.data() || len == 0 ||
+         std::memcmp(x.data(), y.data(), len) == 0;
+}
+}  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/span.h b/third_party/inspector_protocol/crdtp/span.h
index 4e20fcb..965a7847 100644
--- a/third_party/inspector_protocol/crdtp/span.h
+++ b/third_party/inspector_protocol/crdtp/span.h
@@ -5,11 +5,11 @@
 #ifndef CRDTP_SPAN_H_
 #define CRDTP_SPAN_H_
 
-#include <algorithm>
 #include <cstdint>
 #include <cstring>
 #include <string>
-#include <vector>
+
+#include "export.h"
 
 namespace crdtp {
 // =============================================================================
@@ -76,19 +76,15 @@
 
 // Less than / equality comparison functions for sorting / searching for byte
 // spans. These are similar to absl::string_view's < and == operators.
-constexpr inline bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept {
-  auto min_size = std::min(x.size(), y.size());
-  const int r = min_size == 0 ? 0 : memcmp(x.data(), y.data(), min_size);
-  return (r < 0) || (r == 0 && x.size() < y.size());
-}
+CRDTP_EXPORT bool SpanLessThan(span<uint8_t> x, span<uint8_t> y) noexcept;
 
-constexpr inline bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept {
-  auto len = x.size();
-  if (len != y.size())
-    return false;
-  return x.data() == y.data() || len == 0 ||
-         std::memcmp(x.data(), y.data(), len) == 0;
-}
+CRDTP_EXPORT bool SpanEquals(span<uint8_t> x, span<uint8_t> y) noexcept;
+
+struct SpanLt {
+  bool operator()(span<uint8_t> l, span<uint8_t> r) const {
+    return SpanLessThan(l, r);
+  }
+};
 }  // namespace crdtp
 
 #endif  // CRDTP_SPAN_H_
diff --git a/third_party/inspector_protocol/crdtp/span_test.cc b/third_party/inspector_protocol/crdtp/span_test.cc
index 0dfefa03..13c7ea4 100644
--- a/third_party/inspector_protocol/crdtp/span_test.cc
+++ b/third_party/inspector_protocol/crdtp/span_test.cc
@@ -4,7 +4,6 @@
 
 #include <cstdlib>
 #include <string>
-#include <unordered_map>
 
 #include "span.h"
 #include "test_platform.h"
@@ -13,7 +12,6 @@
 // =============================================================================
 // span - sequence of bytes
 // =============================================================================
-
 template <typename T>
 class SpanTest : public ::testing::Test {};
 
@@ -108,41 +106,4 @@
   EXPECT_FALSE(SpanLessThan(SpanFrom(msg), SpanFrom(lesser_msg)));
   EXPECT_FALSE(SpanEquals(SpanFrom(msg), SpanFrom(lesser_msg)));
 }
-
-// TODO(johannes): The following shows how the span can be used in an
-// std::unordered_map as a key. Once we have a production usage, we'll move
-// SpanHash, SpanEq, SpanHasher into the header.
-
-// A simple hash code, inspired by http://stackoverflow.com/q/1646807.
-constexpr inline size_t SpanHash(span<uint8_t> s) noexcept {
-  size_t hash = 17;
-  for (uint8_t c : s)
-    hash = 31 * hash + c;
-  return hash;
-}
-
-// Structs for making std::unordered_map with std::span<uint8_t> keys.
-struct SpanEq {
-  constexpr inline bool operator()(span<uint8_t> l, span<uint8_t> r) const {
-    return SpanEquals(l, r);
-  }
-};
-
-struct SpanHasher {
-  constexpr inline size_t operator()(span<uint8_t> s) const {
-    return SpanHash(s);
-  }
-};
-
-TEST(SpanHasherAndSpanEq, SpanAsKeyInUnorderedMap) {
-  // A very simple smoke test for unordered_map, storing three key/value pairs.
-  std::unordered_map<span<uint8_t>, int32_t, SpanHasher, SpanEq> a_map;
-  a_map[SpanFrom("foo")] = 1;
-  a_map[SpanFrom("bar")] = 2;
-  a_map[SpanFrom("baz")] = 3;
-  EXPECT_EQ(3u, a_map.size());
-  EXPECT_EQ(1, a_map[SpanFrom("foo")]);
-  EXPECT_EQ(2, a_map[SpanFrom("bar")]);
-  EXPECT_EQ(3, a_map[SpanFrom("baz")]);
-}
 }  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/status.cc b/third_party/inspector_protocol/crdtp/status.cc
index 3d8cfecb..f2d3f52 100644
--- a/third_party/inspector_protocol/crdtp/status.cc
+++ b/third_party/inspector_protocol/crdtp/status.cc
@@ -9,100 +9,118 @@
 // Status and Error codes
 // =============================================================================
 
-std::string Status::ToASCIIString() const {
+std::string Status::Message() const {
   switch (error) {
     case Error::OK:
       return "OK";
     case Error::JSON_PARSER_UNPROCESSED_INPUT_REMAINS:
-      return ToASCIIString("JSON: unprocessed input remains");
+      return "JSON: unprocessed input remains";
     case Error::JSON_PARSER_STACK_LIMIT_EXCEEDED:
-      return ToASCIIString("JSON: stack limit exceeded");
+      return "JSON: stack limit exceeded";
     case Error::JSON_PARSER_NO_INPUT:
-      return ToASCIIString("JSON: no input");
+      return "JSON: no input";
     case Error::JSON_PARSER_INVALID_TOKEN:
-      return ToASCIIString("JSON: invalid token");
+      return "JSON: invalid token";
     case Error::JSON_PARSER_INVALID_NUMBER:
-      return ToASCIIString("JSON: invalid number");
+      return "JSON: invalid number";
     case Error::JSON_PARSER_INVALID_STRING:
-      return ToASCIIString("JSON: invalid string");
+      return "JSON: invalid string";
     case Error::JSON_PARSER_UNEXPECTED_ARRAY_END:
-      return ToASCIIString("JSON: unexpected array end");
+      return "JSON: unexpected array end";
     case Error::JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED:
-      return ToASCIIString("JSON: comma or array end expected");
+      return "JSON: comma or array end expected";
     case Error::JSON_PARSER_STRING_LITERAL_EXPECTED:
-      return ToASCIIString("JSON: string literal expected");
+      return "JSON: string literal expected";
     case Error::JSON_PARSER_COLON_EXPECTED:
-      return ToASCIIString("JSON: colon expected");
+      return "JSON: colon expected";
     case Error::JSON_PARSER_UNEXPECTED_MAP_END:
-      return ToASCIIString("JSON: unexpected map end");
+      return "JSON: unexpected map end";
     case Error::JSON_PARSER_COMMA_OR_MAP_END_EXPECTED:
-      return ToASCIIString("JSON: comma or map end expected");
+      return "JSON: comma or map end expected";
     case Error::JSON_PARSER_VALUE_EXPECTED:
-      return ToASCIIString("JSON: value expected");
+      return "JSON: value expected";
 
     case Error::CBOR_INVALID_INT32:
-      return ToASCIIString("CBOR: invalid int32");
+      return "CBOR: invalid int32";
     case Error::CBOR_INVALID_DOUBLE:
-      return ToASCIIString("CBOR: invalid double");
+      return "CBOR: invalid double";
     case Error::CBOR_INVALID_ENVELOPE:
-      return ToASCIIString("CBOR: invalid envelope");
+      return "CBOR: invalid envelope";
     case Error::CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH:
-      return ToASCIIString("CBOR: envelope contents length mismatch");
+      return "CBOR: envelope contents length mismatch";
     case Error::CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE:
-      return ToASCIIString("CBOR: map or array expected in envelope");
+      return "CBOR: map or array expected in envelope";
     case Error::CBOR_INVALID_STRING8:
-      return ToASCIIString("CBOR: invalid string8");
+      return "CBOR: invalid string8";
     case Error::CBOR_INVALID_STRING16:
-      return ToASCIIString("CBOR: invalid string16");
+      return "CBOR: invalid string16";
     case Error::CBOR_INVALID_BINARY:
-      return ToASCIIString("CBOR: invalid binary");
+      return "CBOR: invalid binary";
     case Error::CBOR_UNSUPPORTED_VALUE:
-      return ToASCIIString("CBOR: unsupported value");
+      return "CBOR: unsupported value";
     case Error::CBOR_NO_INPUT:
-      return ToASCIIString("CBOR: no input");
+      return "CBOR: no input";
     case Error::CBOR_INVALID_START_BYTE:
-      return ToASCIIString("CBOR: invalid start byte");
+      return "CBOR: invalid start byte";
     case Error::CBOR_UNEXPECTED_EOF_EXPECTED_VALUE:
-      return ToASCIIString("CBOR: unexpected eof expected value");
+      return "CBOR: unexpected eof expected value";
     case Error::CBOR_UNEXPECTED_EOF_IN_ARRAY:
-      return ToASCIIString("CBOR: unexpected eof in array");
+      return "CBOR: unexpected eof in array";
     case Error::CBOR_UNEXPECTED_EOF_IN_MAP:
-      return ToASCIIString("CBOR: unexpected eof in map");
+      return "CBOR: unexpected eof in map";
     case Error::CBOR_INVALID_MAP_KEY:
-      return ToASCIIString("CBOR: invalid map key");
+      return "CBOR: invalid map key";
+    case Error::CBOR_DUPLICATE_MAP_KEY:
+      return "CBOR: duplicate map key";
     case Error::CBOR_STACK_LIMIT_EXCEEDED:
-      return ToASCIIString("CBOR: stack limit exceeded");
+      return "CBOR: stack limit exceeded";
     case Error::CBOR_TRAILING_JUNK:
-      return ToASCIIString("CBOR: trailing junk");
+      return "CBOR: trailing junk";
     case Error::CBOR_MAP_START_EXPECTED:
-      return ToASCIIString("CBOR: map start expected");
+      return "CBOR: map start expected";
     case Error::CBOR_MAP_STOP_EXPECTED:
-      return ToASCIIString("CBOR: map stop expected");
+      return "CBOR: map stop expected";
     case Error::CBOR_ARRAY_START_EXPECTED:
-      return ToASCIIString("CBOR: array start expected");
+      return "CBOR: array start expected";
     case Error::CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED:
-      return ToASCIIString("CBOR: envelope size limit exceeded");
+      return "CBOR: envelope size limit exceeded";
+
+    case Error::MESSAGE_MUST_BE_AN_OBJECT:
+      return "Message must be an object";
+    case Error::MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY:
+      return "Message must have integer 'id' property";
+    case Error::MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY:
+      return "Message must have string 'method' property";
+    case Error::MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY:
+      return "Message may have string 'sessionId' property";
+    case Error::MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY:
+      return "Message may have object 'params' property";
+    case Error::MESSAGE_HAS_UNKNOWN_PROPERTY:
+      return "Message has property other than "
+             "'id', 'method', 'sessionId', 'params'";
 
     case Error::BINDINGS_MANDATORY_FIELD_MISSING:
-      return ToASCIIString("BINDINGS: mandatory field missing");
+      return "BINDINGS: mandatory field missing";
     case Error::BINDINGS_BOOL_VALUE_EXPECTED:
-      return ToASCIIString("BINDINGS: bool value expected");
+      return "BINDINGS: bool value expected";
     case Error::BINDINGS_INT32_VALUE_EXPECTED:
-      return ToASCIIString("BINDINGS: int32 value expected");
+      return "BINDINGS: int32 value expected";
     case Error::BINDINGS_DOUBLE_VALUE_EXPECTED:
-      return ToASCIIString("BINDINGS: double value expected");
+      return "BINDINGS: double value expected";
     case Error::BINDINGS_STRING_VALUE_EXPECTED:
-      return ToASCIIString("BINDINGS: string value expected");
+      return "BINDINGS: string value expected";
     case Error::BINDINGS_STRING8_VALUE_EXPECTED:
-      return ToASCIIString("BINDINGS: string8 value expected");
+      return "BINDINGS: string8 value expected";
     case Error::BINDINGS_BINARY_VALUE_EXPECTED:
-      return ToASCIIString("BINDINGS: binary value expected");
+      return "BINDINGS: binary value expected";
   }
   // Some compilers can't figure out that we can't get here.
   return "INVALID ERROR CODE";
 }
 
-std::string Status::ToASCIIString(const char* msg) const {
-  return std::string(msg) + " at position " + std::to_string(pos);
+std::string Status::ToASCIIString() const {
+  if (ok())
+    return "OK";
+  return Message() + " at position " + std::to_string(pos);
 }
 }  // namespace crdtp
diff --git a/third_party/inspector_protocol/crdtp/status.h b/third_party/inspector_protocol/crdtp/status.h
index e65a1f2..dc6c2e6 100644
--- a/third_party/inspector_protocol/crdtp/status.h
+++ b/third_party/inspector_protocol/crdtp/status.h
@@ -18,7 +18,9 @@
 
 enum class Error {
   OK = 0,
-  // JSON parsing errors - json_parser.{h,cc}.
+
+  // JSON parsing errors; checked when parsing / converting from JSON.
+  // See json.{h,cc}.
   JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
   JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
   JSON_PARSER_NO_INPUT = 0x03,
@@ -33,6 +35,7 @@
   JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c,
   JSON_PARSER_VALUE_EXPECTED = 0x0d,
 
+  // CBOR parsing errors; checked when parsing / converting from CBOR.
   CBOR_INVALID_INT32 = 0x0e,
   CBOR_INVALID_DOUBLE = 0x0f,
   CBOR_INVALID_ENVELOPE = 0x10,
@@ -48,20 +51,31 @@
   CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x1a,
   CBOR_UNEXPECTED_EOF_IN_MAP = 0x1b,
   CBOR_INVALID_MAP_KEY = 0x1c,
-  CBOR_STACK_LIMIT_EXCEEDED = 0x1d,
-  CBOR_TRAILING_JUNK = 0x1e,
-  CBOR_MAP_START_EXPECTED = 0x1f,
-  CBOR_MAP_STOP_EXPECTED = 0x20,
-  CBOR_ARRAY_START_EXPECTED = 0x21,
-  CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED = 0x22,
+  CBOR_DUPLICATE_MAP_KEY = 0x1d,
+  CBOR_STACK_LIMIT_EXCEEDED = 0x1e,
+  CBOR_TRAILING_JUNK = 0x1f,
+  CBOR_MAP_START_EXPECTED = 0x20,
+  CBOR_MAP_STOP_EXPECTED = 0x21,
+  CBOR_ARRAY_START_EXPECTED = 0x22,
+  CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED = 0x23,
 
-  BINDINGS_MANDATORY_FIELD_MISSING = 0x23,
-  BINDINGS_BOOL_VALUE_EXPECTED = 0x24,
-  BINDINGS_INT32_VALUE_EXPECTED = 0x25,
-  BINDINGS_DOUBLE_VALUE_EXPECTED = 0x26,
-  BINDINGS_STRING_VALUE_EXPECTED = 0x27,
-  BINDINGS_STRING8_VALUE_EXPECTED = 0x28,
-  BINDINGS_BINARY_VALUE_EXPECTED = 0x29,
+  // Message errors are constraints we place on protocol messages coming
+  // from a protocol client; these are checked in crdtp::Dispatchable
+  // (see dispatch.h) as it performs a shallow parse.
+  MESSAGE_MUST_BE_AN_OBJECT = 0x24,
+  MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY = 0x25,
+  MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY = 0x26,
+  MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY = 0x27,
+  MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY = 0x28,
+  MESSAGE_HAS_UNKNOWN_PROPERTY = 0x29,
+
+  BINDINGS_MANDATORY_FIELD_MISSING = 0x30,
+  BINDINGS_BOOL_VALUE_EXPECTED = 0x31,
+  BINDINGS_INT32_VALUE_EXPECTED = 0x32,
+  BINDINGS_DOUBLE_VALUE_EXPECTED = 0x33,
+  BINDINGS_STRING_VALUE_EXPECTED = 0x34,
+  BINDINGS_STRING8_VALUE_EXPECTED = 0x35,
+  BINDINGS_BINARY_VALUE_EXPECTED = 0x36,
 };
 
 // A status value with position that can be copied. The default status
@@ -76,12 +90,18 @@
   Status(Error error, size_t pos) : error(error), pos(pos) {}
   Status() = default;
 
-  // Returns a 7 bit US-ASCII string, either "OK" or an error message
-  // that includes the position.
-  std::string ToASCIIString() const;
+  bool IsMessageError() const {
+    return error >= Error::MESSAGE_MUST_BE_AN_OBJECT &&
+           error <= Error::MESSAGE_HAS_UNKNOWN_PROPERTY;
+  }
 
- private:
-  std::string ToASCIIString(const char* msg) const;
+  // Returns 7 bit US-ASCII string, either "OK" or an error message without
+  // position.
+  std::string Message() const;
+
+  // Returns a 7 bit US-ASCII string, either "OK" or an error message that
+  // includes the position.
+  std::string ToASCIIString() const;
 };
 }  // namespace crdtp
 
diff --git a/third_party/inspector_protocol/inspector_protocol.gni b/third_party/inspector_protocol/inspector_protocol.gni
index fa7cb41..f482384 100644
--- a/third_party/inspector_protocol/inspector_protocol.gni
+++ b/third_party/inspector_protocol/inspector_protocol.gni
@@ -33,10 +33,7 @@
       invoker.config_file,
       "$inspector_protocol_dir/lib/base_string_adapter_cc.template",
       "$inspector_protocol_dir/lib/base_string_adapter_h.template",
-      "$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
-      "$inspector_protocol_dir/lib/DispatcherBase_h.template",
       "$inspector_protocol_dir/lib/Forward_h.template",
-      "$inspector_protocol_dir/lib/FrontendChannel_h.template",
       "$inspector_protocol_dir/lib/Object_cpp.template",
       "$inspector_protocol_dir/lib/Object_h.template",
       "$inspector_protocol_dir/lib/Protocol_cpp.template",
@@ -56,6 +53,7 @@
       "--jinja_dir",
       rebase_path("//third_party/", root_build_dir),  # jinja is in chromium's
                                                       # third_party
+
       "--output_base",
       rebase_path(invoker.out_dir, root_build_dir),
       "--config",
diff --git a/third_party/inspector_protocol/lib/DispatcherBase_cpp.template b/third_party/inspector_protocol/lib/DispatcherBase_cpp.template
deleted file mode 100644
index eb0746c..0000000
--- a/third_party/inspector_protocol/lib/DispatcherBase_cpp.template
+++ /dev/null
@@ -1,357 +0,0 @@
-// This file is generated by DispatcherBase_cpp.template.
-
-// 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.
-
-//#include "DispatcherBase.h"
-//#include "Parser.h"
-
-{% for namespace in config.protocol.namespace %}
-namespace {{namespace}} {
-{% endfor %}
-
-// static
-DispatchResponse DispatchResponse::OK()
-{
-    DispatchResponse result;
-    result.m_status = kSuccess;
-    result.m_errorCode = kParseError;
-    return result;
-}
-
-// static
-DispatchResponse DispatchResponse::Error(const String& error)
-{
-    DispatchResponse result;
-    result.m_status = kError;
-    result.m_errorCode = kServerError;
-    result.m_errorMessage = error;
-    return result;
-}
-
-// static
-DispatchResponse DispatchResponse::InternalError()
-{
-    DispatchResponse result;
-    result.m_status = kError;
-    result.m_errorCode = kInternalError;
-    result.m_errorMessage = "Internal error";
-    return result;
-}
-
-// static
-DispatchResponse DispatchResponse::InvalidParams(const String& error)
-{
-    DispatchResponse result;
-    result.m_status = kError;
-    result.m_errorCode = kInvalidParams;
-    result.m_errorMessage = error;
-    return result;
-}
-
-// static
-DispatchResponse DispatchResponse::FallThrough()
-{
-    DispatchResponse result;
-    result.m_status = kFallThrough;
-    result.m_errorCode = kParseError;
-    return result;
-}
-
-// static
-const char DispatcherBase::kInvalidParamsString[] = "Invalid parameters";
-
-DispatcherBase::WeakPtr::WeakPtr(DispatcherBase* dispatcher) : m_dispatcher(dispatcher) { }
-
-DispatcherBase::WeakPtr::~WeakPtr()
-{
-    if (m_dispatcher)
-        m_dispatcher->m_weakPtrs.erase(this);
-}
-
-DispatcherBase::Callback::Callback(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message)
-    : m_backendImpl(std::move(backendImpl))
-    , m_callId(callId)
-    , m_method(method)
-    , m_message(message.begin(), message.end()) { }
-
-DispatcherBase::Callback::~Callback() = default;
-
-void DispatcherBase::Callback::dispose()
-{
-    m_backendImpl = nullptr;
-}
-
-void DispatcherBase::Callback::sendIfActive(std::unique_ptr<protocol::DictionaryValue> partialMessage, const DispatchResponse& response)
-{
-    if (!m_backendImpl || !m_backendImpl->get())
-        return;
-    m_backendImpl->get()->sendResponse(m_callId, response, std::move(partialMessage));
-    m_backendImpl = nullptr;
-}
-
-void DispatcherBase::Callback::fallThroughIfActive()
-{
-    if (!m_backendImpl || !m_backendImpl->get())
-        return;
-    m_backendImpl->get()->channel()->fallThrough(m_callId, m_method, {{config.crdtp.namespace}}::SpanFrom(m_message));
-    m_backendImpl = nullptr;
-}
-
-DispatcherBase::DispatcherBase(FrontendChannel* frontendChannel)
-    : m_frontendChannel(frontendChannel) { }
-
-DispatcherBase::~DispatcherBase()
-{
-    clearFrontend();
-}
-
-void DispatcherBase::sendResponse(int callId, const DispatchResponse& response, std::unique_ptr<protocol::DictionaryValue> result)
-{
-    if (!m_frontendChannel)
-        return;
-    if (response.status() == DispatchResponse::kError) {
-        reportProtocolError(callId, response.errorCode(), response.errorMessage(), nullptr);
-        return;
-    }
-    m_frontendChannel->sendProtocolResponse(callId, InternalResponse::createResponse(callId, std::move(result)));
-}
-
-void DispatcherBase::sendResponse(int callId, const DispatchResponse& response)
-{
-    sendResponse(callId, response, DictionaryValue::create());
-}
-
-namespace {
-
-class ProtocolError : public Serializable {
-public:
-    static std::unique_ptr<ProtocolError> createErrorResponse(int callId, DispatchResponse::ErrorCode code, const String& errorMessage, ErrorSupport* errors)
-    {
-        std::unique_ptr<ProtocolError> protocolError(new ProtocolError(code, errorMessage));
-        protocolError->m_callId = callId;
-        protocolError->m_hasCallId = true;
-        if (errors && !errors->Errors().empty()) {
-            protocolError->m_data =
-                StringUtil::fromUTF8(errors->Errors().data(), errors->Errors().size());
-        }
-        return protocolError;
-    }
-
-    static std::unique_ptr<ProtocolError> createErrorNotification(DispatchResponse::ErrorCode code, const String& errorMessage)
-    {
-        return std::unique_ptr<ProtocolError>(new ProtocolError(code, errorMessage));
-    }
-
-    void AppendSerialized(std::vector<uint8_t>* out) const override
-    {
-        toDictionary()->AppendSerialized(out);
-    }
-
-    ~ProtocolError() override {}
-
-private:
-    ProtocolError(DispatchResponse::ErrorCode code, const String& errorMessage)
-        : m_code(code)
-        , m_errorMessage(errorMessage)
-    {
-    }
-
-    std::unique_ptr<DictionaryValue> toDictionary() const {
-        std::unique_ptr<protocol::DictionaryValue> error = DictionaryValue::create();
-        error->setInteger("code", m_code);
-        error->setString("message", m_errorMessage);
-        if (m_data.length())
-            error->setString("data", m_data);
-        std::unique_ptr<protocol::DictionaryValue> message = DictionaryValue::create();
-        message->setObject("error", std::move(error));
-        if (m_hasCallId)
-            message->setInteger("id", m_callId);
-        return message;
-    }
-
-    DispatchResponse::ErrorCode m_code;
-    String m_errorMessage;
-    String m_data;
-    int m_callId = 0;
-    bool m_hasCallId = false;
-};
-
-} // namespace
-
-static void reportProtocolErrorTo(FrontendChannel* frontendChannel, int callId, DispatchResponse::ErrorCode code, const String& errorMessage, ErrorSupport* errors)
-{
-    if (frontendChannel)
-        frontendChannel->sendProtocolResponse(callId, ProtocolError::createErrorResponse(callId, code, errorMessage, errors));
-}
-
-static void reportProtocolErrorTo(FrontendChannel* frontendChannel, DispatchResponse::ErrorCode code, const String& errorMessage)
-{
-    if (frontendChannel)
-        frontendChannel->sendProtocolNotification(ProtocolError::createErrorNotification(code, errorMessage));
-}
-
-void DispatcherBase::reportProtocolError(int callId, DispatchResponse::ErrorCode code, const String& errorMessage, ErrorSupport* errors)
-{
-    reportProtocolErrorTo(m_frontendChannel, callId, code, errorMessage, errors);
-}
-
-void DispatcherBase::clearFrontend()
-{
-    m_frontendChannel = nullptr;
-    for (auto& weak : m_weakPtrs)
-        weak->dispose();
-    m_weakPtrs.clear();
-}
-
-std::unique_ptr<DispatcherBase::WeakPtr> DispatcherBase::weakPtr()
-{
-    std::unique_ptr<DispatcherBase::WeakPtr> weak(new DispatcherBase::WeakPtr(this));
-    m_weakPtrs.insert(weak.get());
-    return weak;
-}
-
-UberDispatcher::UberDispatcher(FrontendChannel* frontendChannel)
-    : m_frontendChannel(frontendChannel) { }
-
-void UberDispatcher::registerBackend(const String& name, std::unique_ptr<protocol::DispatcherBase> dispatcher)
-{
-    m_dispatchers[name] = std::move(dispatcher);
-}
-
-void UberDispatcher::setupRedirects(const std::unordered_map<String, String>& redirects)
-{
-    for (const auto& pair : redirects)
-        m_redirects[pair.first] = pair.second;
-}
-
-bool UberDispatcher::parseCommand(Value* parsedMessage, int* outCallId, String* outMethod) {
-    if (!parsedMessage) {
-        reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kParseError, "Message must be a valid JSON");
-        return false;
-    }
-    protocol::DictionaryValue* messageObject = DictionaryValue::cast(parsedMessage);
-    if (!messageObject) {
-        reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kInvalidRequest, "Message must be an object");
-        return false;
-    }
-
-    int callId = 0;
-    protocol::Value* callIdValue = messageObject->get("id");
-    bool success = callIdValue && callIdValue->asInteger(&callId);
-    if (!success) {
-        reportProtocolErrorTo(m_frontendChannel, DispatchResponse::kInvalidRequest, "Message must have integer 'id' property");
-        return false;
-    }
-    if (outCallId)
-      *outCallId = callId;
-
-    protocol::Value* methodValue = messageObject->get("method");
-    String method;
-    success = methodValue && methodValue->asString(&method);
-    if (!success) {
-        reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kInvalidRequest, "Message must have string 'method' property", nullptr);
-        return false;
-    }
-    if (outMethod)
-      *outMethod = method;
-    return true;
-}
-
-protocol::DispatcherBase* UberDispatcher::findDispatcher(const String& method) {
-    size_t dotIndex = StringUtil::find(method, ".");
-    if (dotIndex == StringUtil::kNotFound)
-        return nullptr;
-    String domain = StringUtil::substring(method, 0, dotIndex);
-    auto it = m_dispatchers.find(domain);
-    if (it == m_dispatchers.end())
-        return nullptr;
-    if (!it->second->canDispatch(method))
-        return nullptr;
-    return it->second.get();
-}
-
-bool UberDispatcher::canDispatch(const String& in_method)
-{
-    String method = in_method;
-    auto redirectIt = m_redirects.find(method);
-    if (redirectIt != m_redirects.end())
-        method = redirectIt->second;
-    return !!findDispatcher(method);
-}
-
-void UberDispatcher::dispatch(int callId, const String& in_method, std::unique_ptr<Value> parsedMessage, {{config.crdtp.namespace}}::span<uint8_t> rawMessage)
-{
-    String method = in_method;
-    auto redirectIt = m_redirects.find(method);
-    if (redirectIt != m_redirects.end())
-        method = redirectIt->second;
-    protocol::DispatcherBase* dispatcher = findDispatcher(method);
-    if (!dispatcher) {
-        reportProtocolErrorTo(m_frontendChannel, callId, DispatchResponse::kMethodNotFound, "'" + method + "' wasn't found", nullptr);
-        return;
-    }
-    std::unique_ptr<protocol::DictionaryValue> messageObject = DictionaryValue::cast(std::move(parsedMessage));
-    dispatcher->dispatch(callId, method, rawMessage, std::move(messageObject));
-}
-
-UberDispatcher::~UberDispatcher() = default;
-
-// static
-std::unique_ptr<Serializable> InternalResponse::createResponse(int callId, std::unique_ptr<Serializable> params)
-{
-    return std::unique_ptr<Serializable>(new InternalResponse(callId, nullptr, std::move(params)));
-}
-
-// static
-std::unique_ptr<Serializable> InternalResponse::createNotification(const char* method, std::unique_ptr<Serializable> params)
-{
-    return std::unique_ptr<Serializable>(new InternalResponse(0, method, std::move(params)));
-}
-
-// static
-std::unique_ptr<Serializable> InternalResponse::createErrorResponse(int callId, DispatchResponse::ErrorCode code, const String& message)
-{
-    return ProtocolError::createErrorResponse(callId, code, message, nullptr);
-}
-
-void InternalResponse::AppendSerialized(std::vector<uint8_t>* out) const
-{
-    using {{config.crdtp.namespace}}::cbor::NewCBOREncoder;
-    using {{config.crdtp.namespace}}::ParserHandler;
-    using {{config.crdtp.namespace}}::Status;
-    using {{config.crdtp.namespace}}::SpanFrom;
-
-    Status status;
-    std::unique_ptr<ParserHandler> encoder = NewCBOREncoder(out, &status);
-    encoder->HandleMapBegin();
-    if (m_method) {
-        encoder->HandleString8(SpanFrom("method"));
-        encoder->HandleString8(SpanFrom(m_method));
-        encoder->HandleString8(SpanFrom("params"));
-    } else {
-        encoder->HandleString8(SpanFrom("id"));
-        encoder->HandleInt32(m_callId);
-        encoder->HandleString8(SpanFrom("result"));
-    }
-    if (m_params) {
-        m_params->AppendSerialized(out);
-    } else {
-        encoder->HandleMapBegin();
-        encoder->HandleMapEnd();
-    }
-    encoder->HandleMapEnd();
-    DCHECK(status.ok());
-}
-
-InternalResponse::InternalResponse(int callId, const char* method, std::unique_ptr<Serializable> params)
-    : m_callId(callId)
-    , m_method(method)
-    , m_params(params ? std::move(params) : nullptr)
-{
-}
-
-{% for namespace in config.protocol.namespace %}
-} // namespace {{namespace}}
-{% endfor %}
diff --git a/third_party/inspector_protocol/lib/DispatcherBase_h.template b/third_party/inspector_protocol/lib/DispatcherBase_h.template
deleted file mode 100644
index 03f5c26..0000000
--- a/third_party/inspector_protocol/lib/DispatcherBase_h.template
+++ /dev/null
@@ -1,153 +0,0 @@
-// This file is generated by DispatcherBase_h.template.
-
-// 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.
-
-#ifndef {{"_".join(config.protocol.namespace)}}_DispatcherBase_h
-#define {{"_".join(config.protocol.namespace)}}_DispatcherBase_h
-
-//#include "Forward.h"
-//#include "ErrorSupport.h"
-//#include "Values.h"
-
-#include "{{config.crdtp.dir}}/span.h"
-
-{% for namespace in config.protocol.namespace %}
-namespace {{namespace}} {
-{% endfor %}
-
-class WeakPtr;
-
-class {{config.lib.export_macro}} DispatchResponse {
-public:
-    enum Status {
-        kSuccess = 0,
-        kError = 1,
-        kFallThrough = 2,
-    };
-
-    // For historical reasons, these error codes correspond to commonly used
-    // XMLRPC codes (e.g. see METHOD_NOT_FOUND in
-    // https://github.com/python/cpython/blob/master/Lib/xmlrpc/client.py).
-    enum ErrorCode {
-        kParseError = -32700,
-        kInvalidRequest = -32600,
-        kMethodNotFound = -32601,
-        kInvalidParams = -32602,
-        kInternalError = -32603,
-        kServerError = -32000,
-    };
-
-    Status status() const { return m_status; }
-    const String& errorMessage() const { return m_errorMessage; }
-    ErrorCode errorCode() const { return m_errorCode; }
-    bool isSuccess() const { return m_status == kSuccess; }
-
-    static DispatchResponse OK();
-    static DispatchResponse Error(const String&);
-    static DispatchResponse InternalError();
-    static DispatchResponse InvalidParams(const String&);
-    static DispatchResponse FallThrough();
-
-private:
-    Status m_status;
-    String m_errorMessage;
-    ErrorCode m_errorCode;
-};
-
-class {{config.lib.export_macro}} DispatcherBase {
-    PROTOCOL_DISALLOW_COPY(DispatcherBase);
-public:
-    static const char kInvalidParamsString[];
-    class {{config.lib.export_macro}} WeakPtr {
-    public:
-        explicit WeakPtr(DispatcherBase*);
-        ~WeakPtr();
-        DispatcherBase* get() { return m_dispatcher; }
-        void dispose() { m_dispatcher = nullptr; }
-
-    private:
-        DispatcherBase* m_dispatcher;
-    };
-
-    class {{config.lib.export_macro}} Callback {
-    public:
-        Callback(std::unique_ptr<WeakPtr> backendImpl, int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message);
-        virtual ~Callback();
-        void dispose();
-
-    protected:
-        void sendIfActive(std::unique_ptr<protocol::DictionaryValue> partialMessage, const DispatchResponse& response);
-        void fallThroughIfActive();
-
-    private:
-        std::unique_ptr<WeakPtr> m_backendImpl;
-        int m_callId;
-        String m_method;
-        std::vector<uint8_t> m_message;
-    };
-
-    explicit DispatcherBase(FrontendChannel*);
-    virtual ~DispatcherBase();
-
-    virtual bool canDispatch(const String& method) = 0;
-    virtual void dispatch(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> rawMessage, std::unique_ptr<protocol::DictionaryValue> messageObject) = 0;
-    FrontendChannel* channel() { return m_frontendChannel; }
-
-    void sendResponse(int callId, const DispatchResponse&, std::unique_ptr<protocol::DictionaryValue> result);
-    void sendResponse(int callId, const DispatchResponse&);
-
-    void reportProtocolError(int callId, DispatchResponse::ErrorCode, const String& errorMessage, ErrorSupport* errors);
-    void clearFrontend();
-
-    std::unique_ptr<WeakPtr> weakPtr();
-
-private:
-    FrontendChannel* m_frontendChannel;
-    std::unordered_set<WeakPtr*> m_weakPtrs;
-};
-
-class {{config.lib.export_macro}} UberDispatcher {
-    PROTOCOL_DISALLOW_COPY(UberDispatcher);
-public:
-    explicit UberDispatcher(FrontendChannel*);
-    void registerBackend(const String& name, std::unique_ptr<protocol::DispatcherBase>);
-    void setupRedirects(const std::unordered_map<String, String>&);
-    bool parseCommand(Value* message, int* callId, String* method);
-    bool canDispatch(const String& method);
-    void dispatch(int callId, const String& method, std::unique_ptr<Value> message, {{config.crdtp.namespace}}::span<uint8_t> rawMessage);
-    FrontendChannel* channel() { return m_frontendChannel; }
-    virtual ~UberDispatcher();
-
-private:
-    protocol::DispatcherBase* findDispatcher(const String& method);
-    FrontendChannel* m_frontendChannel;
-    std::unordered_map<String, String> m_redirects;
-    std::unordered_map<String, std::unique_ptr<protocol::DispatcherBase>> m_dispatchers;
-};
-
-class InternalResponse : public Serializable {
-    PROTOCOL_DISALLOW_COPY(InternalResponse);
-public:
-    static std::unique_ptr<Serializable> createResponse(int callId, std::unique_ptr<Serializable> params);
-    static std::unique_ptr<Serializable> createNotification(const char* method, std::unique_ptr<Serializable> params = nullptr);
-    static std::unique_ptr<Serializable> createErrorResponse(int callId, DispatchResponse::ErrorCode code, const String& message);
-
-    void AppendSerialized(std::vector<uint8_t>* out) const override;
-
-    ~InternalResponse() override {}
-
-private:
-    InternalResponse(int callId, const char* method, std::unique_ptr<Serializable> params);
-
-    int m_callId;
-    const char* m_method = nullptr;
-    std::unique_ptr<Serializable> m_params;
-};
-
-{% for namespace in config.protocol.namespace %}
-} // namespace {{namespace}}
-{% endfor %}
-
-#endif // !defined({{"_".join(config.protocol.namespace)}}_DispatcherBase_h)
diff --git a/third_party/inspector_protocol/lib/Forward_h.template b/third_party/inspector_protocol/lib/Forward_h.template
index ec469bbe..e2eef30 100644
--- a/third_party/inspector_protocol/lib/Forward_h.template
+++ b/third_party/inspector_protocol/lib/Forward_h.template
@@ -19,6 +19,8 @@
 #include <unordered_set>
 
 #include "{{config.crdtp.dir}}/error_support.h"
+#include "{{config.crdtp.dir}}/dispatch.h"
+#include "{{config.crdtp.dir}}/frontend_channel.h"
 #include "{{config.crdtp.dir}}/glue.h"
 
 {% for namespace in config.protocol.namespace %}
@@ -26,15 +28,18 @@
 {% endfor %}
 
 class DictionaryValue;
-class DispatchResponse;
+using DispatchResponse = {{config.crdtp.namespace}}::DispatchResponse;
 using ErrorSupport = {{config.crdtp.namespace}}::ErrorSupport;
+using Serializable = {{config.crdtp.namespace}}::Serializable;
+using FrontendChannel = {{config.crdtp.namespace}}::FrontendChannel;
+using DomainDispatcher = {{config.crdtp.namespace}}::DomainDispatcher;
+using UberDispatcher = {{config.crdtp.namespace}}::UberDispatcher;
 class FundamentalValue;
 class ListValue;
 class Object;
 using Response = DispatchResponse;
 class SerializedValue;
 class StringValue;
-class UberDispatcher;
 class Value;
 
 namespace detail {
diff --git a/third_party/inspector_protocol/lib/FrontendChannel_h.template b/third_party/inspector_protocol/lib/FrontendChannel_h.template
deleted file mode 100644
index b677ecdd..0000000
--- a/third_party/inspector_protocol/lib/FrontendChannel_h.template
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is generated by FrontendChannel_h.template.
-
-// 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.
-
-#ifndef {{"_".join(config.protocol.namespace)}}_FrontendChannel_h
-#define {{"_".join(config.protocol.namespace)}}_FrontendChannel_h
-
-#include "{{config.crdtp.dir}}/serializable.h"
-#include "{{config.crdtp.dir}}/span.h"
-
-{% for namespace in config.protocol.namespace %}
-namespace {{namespace}} {
-{% endfor %}
-
-using {{config.crdtp.namespace}}::Serializable;
-
-class {{config.lib.export_macro}} FrontendChannel {
-public:
-    virtual ~FrontendChannel() { }
-    virtual void sendProtocolResponse(int callId, std::unique_ptr<Serializable> message) = 0;
-    virtual void sendProtocolNotification(std::unique_ptr<Serializable> message) = 0;
-
-    virtual void fallThrough(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message) = 0;
-    virtual void flushProtocolNotifications() = 0;
-};
-
-{% for namespace in config.protocol.namespace %}
-} // namespace {{namespace}}
-{% endfor %}
-
-#endif // !defined({{"_".join(config.protocol.namespace)}}_FrontendChannel_h)
diff --git a/third_party/inspector_protocol/lib/base_string_adapter_h.template b/third_party/inspector_protocol/lib/base_string_adapter_h.template
index 0dae60d..ff40aba 100644
--- a/third_party/inspector_protocol/lib/base_string_adapter_h.template
+++ b/third_party/inspector_protocol/lib/base_string_adapter_h.template
@@ -34,17 +34,6 @@
 
 class {{config.lib.export_macro}} StringUtil {
  public:
-  static String substring(const String& s, unsigned pos, unsigned len) {
-    return s.substr(pos, len);
-  }
-  static size_t find(const String& s, const char* needle) {
-    return s.find(needle);
-  }
-  static size_t find(const String& s, const String& needle) {
-    return s.find(needle);
-  }
-  static const size_t kNotFound = static_cast<size_t>(-1);
-
   static String fromUTF8(const uint8_t* data, size_t length) {
     return std::string(reinterpret_cast<const char*>(data), length);
   }
diff --git a/third_party/inspector_protocol/roll.py b/third_party/inspector_protocol/roll.py
index 38ec495..1e26ee3 100755
--- a/third_party/inspector_protocol/roll.py
+++ b/third_party/inspector_protocol/roll.py
@@ -22,10 +22,16 @@
     'crdtp/cbor.cc',
     'crdtp/cbor.h',
     'crdtp/cbor_test.cc',
+    'crdtp/dispatch.h',
+    'crdtp/dispatch.cc',
+    'crdtp/dispatch_test.cc',
     'crdtp/error_support.h',
     'crdtp/error_support.cc',
     'crdtp/error_support_test.cc',
     'crdtp/export.h',
+    'crdtp/find_by_first.h',
+    'crdtp/find_by_first_test.cc',
+    'crdtp/frontend_channel.h',
     'crdtp/glue.h',
     'crdtp/glue_test.cc',
     'crdtp/json.cc',
@@ -39,6 +45,7 @@
     'crdtp/serializer_traits.h',
     'crdtp/serializer_traits_test.cc',
     'crdtp/span.h',
+    'crdtp/span.cc',
     'crdtp/span_test.cc',
     'crdtp/status.cc',
     'crdtp/status.h',
diff --git a/third_party/inspector_protocol/templates/TypeBuilder_cpp.template b/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
index 2d99494b..f0a3d3c 100644
--- a/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
+++ b/third_party/inspector_protocol/templates/TypeBuilder_cpp.template
@@ -9,7 +9,9 @@
 #include {{format_include(config.protocol.package, "Protocol")}}
 
 #include "{{config.crdtp.dir}}/cbor.h"
+#include "{{config.crdtp.dir}}/find_by_first.h"
 #include "{{config.crdtp.dir}}/serializer_traits.h"
+#include "{{config.crdtp.dir}}/span.h"
 
 {% for namespace in config.protocol.namespace %}
 namespace {{namespace}} {
@@ -169,7 +171,7 @@
       {%- endif %} {{parameter.name}}{%- if not loop.last -%}, {% endif -%}
     {% endfor -%})
 {
-    if (!m_frontendChannel)
+    if (!frontend_channel_)
         return;
       {% if event.parameters %}
     std::unique_ptr<{{event.name | to_title_case}}Notification> messageData = {{event.name | to_title_case}}Notification::{{"create" | to_method_case}}()
@@ -185,69 +187,79 @@
         messageData->{{"set" | to_method_case}}{{parameter.name | to_title_case}}(std::move({{parameter.name}}).takeJust());
           {% endif %}
         {% endfor %}
-    m_frontendChannel->sendProtocolNotification(InternalResponse::createNotification("{{domain.domain}}.{{event.name}}", std::move(messageData)));
+    frontend_channel_->SendProtocolNotification({{config.crdtp.namespace}}::CreateNotification("{{domain.domain}}.{{event.name}}", std::move(messageData)));
       {% else %}
-    m_frontendChannel->sendProtocolNotification(InternalResponse::createNotification("{{domain.domain}}.{{event.name}}"));
+    frontend_channel_->SendProtocolNotification({{config.crdtp.namespace}}::CreateNotification("{{domain.domain}}.{{event.name}}"));
       {% endif %}
 }
   {% endfor %}
 
 void Frontend::flush()
 {
-    m_frontendChannel->flushProtocolNotifications();
+    frontend_channel_->FlushProtocolNotifications();
 }
 
 void Frontend::sendRawNotification(std::unique_ptr<Serializable> notification)
 {
-    m_frontendChannel->sendProtocolNotification(std::move(notification));
+    frontend_channel_->SendProtocolNotification(std::move(notification));
 }
 
 // --------------------- Dispatcher.
 
-class DispatcherImpl : public protocol::DispatcherBase {
+class DomainDispatcherImpl : public protocol::DomainDispatcher {
 public:
-    DispatcherImpl(FrontendChannel* frontendChannel, Backend* backend)
-        : DispatcherBase(frontendChannel)
-        , m_backend(backend) {
-  {% for command in domain.commands %}
-    {% if "redirect" in command %}
-      m_redirects["{{domain.domain}}.{{command.name}}"] = "{{command.redirect}}.{{command.name}}";
-      {% continue %}
-    {% endif %}
-    {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %}
-        m_dispatchMap["{{domain.domain}}.{{command.name}}"] = &DispatcherImpl::{{command.name}};
-  {% endfor %}
-    }
-    ~DispatcherImpl() override { }
-    bool canDispatch(const String& method) override;
-    void dispatch(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message, std::unique_ptr<protocol::DictionaryValue> messageObject) override;
-    std::unordered_map<String, String>& redirects() { return m_redirects; }
+    DomainDispatcherImpl(FrontendChannel* frontendChannel, Backend* backend)
+        : DomainDispatcher(frontendChannel)
+        , m_backend(backend) {}
+    ~DomainDispatcherImpl() override { }
 
-protected:
-    using CallHandler = void (DispatcherImpl::*)(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message, std::unique_ptr<DictionaryValue> messageObject, ErrorSupport* errors);
-    using DispatchMap = std::unordered_map<String, CallHandler>;
-    DispatchMap m_dispatchMap;
-    std::unordered_map<String, String> m_redirects;
+    using CallHandler = void (DomainDispatcherImpl::*)(const {{config.crdtp.namespace}}::Dispatchable& dispatchable, DictionaryValue* params, ErrorSupport* errors);
+
+    std::function<void(const {{config.crdtp.namespace}}::Dispatchable&)> Dispatch({{config.crdtp.namespace}}::span<uint8_t> command_name) override;
 
   {% for command in domain.commands %}
     {% if "redirect" in command %}{% continue %}{% endif %}
     {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %}
-    void {{command.name}}(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message, std::unique_ptr<DictionaryValue> requestMessageObject, ErrorSupport*);
+    void {{command.name}}(const {{config.crdtp.namespace}}::Dispatchable& dispatchable, DictionaryValue* params, ErrorSupport* errors);
   {% endfor %}
-
+ protected:
     Backend* m_backend;
 };
 
-bool DispatcherImpl::canDispatch(const String& method) {
-    return m_dispatchMap.find(method) != m_dispatchMap.end();
+namespace {
+// This helper method with a static map of command methods (instance methods
+// of DomainDispatcherImpl declared just above) by their name is used immediately below,
+// in the DomainDispatcherImpl::Dispatch method.
+DomainDispatcherImpl::CallHandler CommandByName({{config.crdtp.namespace}}::span<uint8_t> command_name) {
+  static auto* commands = [](){
+    auto* commands = new std::vector<std::pair<{{config.crdtp.namespace}}::span<uint8_t>,
+                              DomainDispatcherImpl::CallHandler>>{
+      {% for command in domain.commands|sort(attribute="name",case_sensitive=True) %}
+        {% if "redirect" in command %}{% continue %}{% endif %}
+        {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %}
+    {
+          {{config.crdtp.namespace}}::SpanFrom("{{command.name}}"),
+          &DomainDispatcherImpl::{{command.name}}
+    },
+      {% endfor %}
+    };
+    return commands;
+  }();
+  return {{config.crdtp.namespace}}::FindByFirst<DomainDispatcherImpl::CallHandler>(*commands, command_name, nullptr);
 }
+}  // namespace
 
-void DispatcherImpl::dispatch(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message, std::unique_ptr<protocol::DictionaryValue> messageObject)
-{
-    std::unordered_map<String, CallHandler>::iterator it = m_dispatchMap.find(method);
-    DCHECK(it != m_dispatchMap.end());
-    protocol::ErrorSupport errors;
-    (this->*(it->second))(callId, method, message, std::move(messageObject), &errors);
+std::function<void(const {{config.crdtp.namespace}}::Dispatchable&)> DomainDispatcherImpl::Dispatch({{config.crdtp.namespace}}::span<uint8_t> command_name) {
+  CallHandler handler = CommandByName(command_name);
+  if (!handler) return nullptr;
+  return [this, handler](const {{config.crdtp.namespace}}::Dispatchable& dispatchable){
+    std::unique_ptr<DictionaryValue> params =
+        DictionaryValue::cast(protocol::Value::parseBinary(dispatchable.Params().data(),
+        dispatchable.Params().size()));
+    ErrorSupport errors;
+    errors.Push();
+    (this->*handler)(dispatchable, params.get(), &errors);
+  };
 }
 
   {% for command in domain.commands %}
@@ -256,10 +268,11 @@
     {% if not protocol.generate_command(domain.domain, command.name) %}{% continue %}{% endif %}
     {% if protocol.is_async_command(domain.domain, command.name) %}
 
-class {{command_name_title}}CallbackImpl : public Backend::{{command_name_title}}Callback, public DispatcherBase::Callback {
+class {{command_name_title}}CallbackImpl : public Backend::{{command_name_title}}Callback, public DomainDispatcher::Callback {
 public:
-    {{command_name_title}}CallbackImpl(std::unique_ptr<DispatcherBase::WeakPtr> backendImpl, int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message)
-        : DispatcherBase::Callback(std::move(backendImpl), callId, method, message) { }
+    {{command_name_title}}CallbackImpl(std::unique_ptr<DomainDispatcher::WeakPtr> backendImpl, int callId, {{config.crdtp.namespace}}::span<uint8_t> message)
+        : DomainDispatcher::Callback(std::move(backendImpl), callId,
+{{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}.{{command.name}}"), message) { }
 
     void sendSuccess(
       {%- for parameter in command.returns -%}
@@ -271,16 +284,16 @@
         {%- if not loop.last -%}, {% endif -%}
       {%- endfor -%}) override
     {
-        std::unique_ptr<protocol::DictionaryValue> resultObject = DictionaryValue::create();
-          {% for parameter in command.returns %}
-            {% if "optional" in parameter %}
-        if ({{parameter.name}}.isJust())
-            resultObject->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue({{parameter.name}}.fromJust()));
-           {% else %}
-        resultObject->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue({{protocol.resolve_type(parameter).to_raw_type % parameter.name}}));
-            {% endif %}
-          {% endfor %}
-        sendIfActive(std::move(resultObject), DispatchResponse::OK());
+        std::vector<uint8_t> result_buffer;
+        {{config.crdtp.namespace}}::cbor::EnvelopeEncoder envelope_encoder;
+        envelope_encoder.EncodeStart(&result_buffer);
+        result_buffer.push_back({{config.crdtp.namespace}}::cbor::EncodeIndefiniteLengthMapStart());
+        {% for parameter in command.returns %}
+          {{config.crdtp.namespace}}::SerializeField({{config.crdtp.namespace}}::SpanFrom("{{parameter.name}}"), {{parameter.name}}, &result_buffer);
+        {% endfor %}
+        result_buffer.push_back({{config.crdtp.namespace}}::cbor::EncodeStop());
+        envelope_encoder.EncodeStop(&result_buffer);
+        sendIfActive({{config.crdtp.namespace}}::Serializable::From(std::move(result_buffer)), DispatchResponse::Success());
     }
 
     void fallThrough() override
@@ -290,21 +303,19 @@
 
     void sendFailure(const DispatchResponse& response) override
     {
-        DCHECK(response.status() == DispatchResponse::kError);
+        DCHECK(response.IsError());
         sendIfActive(nullptr, response);
     }
 };
     {% endif %}
 
-void DispatcherImpl::{{command.name}}(int callId, const String& method, {{config.crdtp.namespace}}::span<uint8_t> message, std::unique_ptr<DictionaryValue> requestMessageObject, ErrorSupport* errors)
+void DomainDispatcherImpl::{{command.name}}(const {{config.crdtp.namespace}}::Dispatchable& dispatchable, DictionaryValue* params, ErrorSupport* errors)
 {
     {% if "parameters" in command %}
     // Prepare input parameters.
-    protocol::DictionaryValue* object = DictionaryValue::cast(requestMessageObject->get("params"));
-    errors->Push();
       {% for parameter in command.parameters %}
         {% set parameter_type = protocol.resolve_type(parameter) %}
-    protocol::Value* {{parameter.name}}Value = object ? object->get("{{parameter.name}}") : nullptr;
+    protocol::Value* {{parameter.name}}Value = params ? params->get("{{parameter.name}}") : nullptr;
         {% if parameter.optional %}
     Maybe<{{parameter_type.raw_type}}> in_{{parameter.name}};
     if ({{parameter.name}}Value) {
@@ -316,11 +327,7 @@
     {{parameter_type.type}} in_{{parameter.name}} = ValueConversions<{{parameter_type.raw_type}}>::fromValue({{parameter.name}}Value, errors);
         {% endif %}
       {% endfor %}
-    errors->Pop();
-    if (!errors->Errors().empty()) {
-        reportProtocolError(callId, DispatchResponse::kInvalidParams, kInvalidParamsString, errors);
-        return;
-    }
+    if (MaybeReportInvalidParams(dispatchable, *errors)) return;
     {% endif %}
     {% if "returns" in command and not protocol.is_async_command(domain.domain, command.name) %}
     // Declare output parameters.
@@ -334,7 +341,7 @@
     {% endif %}
 
     {% if not protocol.is_async_command(domain.domain, command.name) %}
-    std::unique_ptr<DispatcherBase::WeakPtr> weak = weakPtr();
+    std::unique_ptr<DomainDispatcher::WeakPtr> weak = weakPtr();
     DispatchResponse response = m_backend->{{command.name | to_method_case}}(
       {%- for parameter in command.parameters -%}
         {%- if not loop.first -%}, {% endif -%}
@@ -350,31 +357,31 @@
           &out_{{parameter.name}}
         {%- endfor %}
       {% endif %});
-    if (response.status() == DispatchResponse::kFallThrough) {
-        channel()->fallThrough(callId, method, message);
+    if (response.IsFallThrough()) {
+        channel()->FallThrough(dispatchable.CallId(), {{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}.{{command.name}}"), dispatchable.Serialized());
         return;
     }
       {% if "returns" in command %}
-    std::unique_ptr<protocol::DictionaryValue> result = DictionaryValue::create();
-    if (response.status() == DispatchResponse::kSuccess) {
-        {% for parameter in command.returns %}
-          {% if "optional" in parameter %}
-        if (out_{{parameter.name}}.isJust())
-            result->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue(out_{{parameter.name}}.fromJust()));
-          {% else %}
-        result->setValue("{{parameter.name}}", ValueConversions<{{protocol.resolve_type(parameter).raw_type}}>::toValue({{protocol.resolve_type(parameter).to_raw_type % ("out_" + parameter.name)}}));
-          {% endif %}
-        {% endfor %}
-    }
-    if (weak->get())
-        weak->get()->sendResponse(callId, response, std::move(result));
+      if (weak->get()) {
+        std::vector<uint8_t> result;
+        if (response.IsSuccess()) {
+          {{config.crdtp.namespace}}::cbor::EnvelopeEncoder envelope_encoder;
+          envelope_encoder.EncodeStart(&result);
+          result.push_back({{config.crdtp.namespace}}::cbor::EncodeIndefiniteLengthMapStart());
+          {% for parameter in command.returns %}
+            {{config.crdtp.namespace}}::SerializeField({{config.crdtp.namespace}}::SpanFrom("{{parameter.name}}"), out_{{parameter.name}}, &result);
+          {% endfor %}
+          result.push_back({{config.crdtp.namespace}}::cbor::EncodeStop());
+          envelope_encoder.EncodeStop(&result);
+        }
+        weak->get()->sendResponse(dispatchable.CallId(), response, {{config.crdtp.namespace}}::Serializable::From(std::move(result)));
+      }
       {% else %}
     if (weak->get())
-        weak->get()->sendResponse(callId, response);
+        weak->get()->sendResponse(dispatchable.CallId(), response);
       {% endif %}
     return;
     {% else %}
-    std::unique_ptr<{{command_name_title}}CallbackImpl> callback(new {{command.name | to_title_case}}CallbackImpl(weakPtr(), callId, method, message));
     m_backend->{{command.name | to_method_case}}(
       {%- for property in command.parameters -%}
         {%- if not loop.first -%}, {% endif -%}
@@ -385,18 +392,34 @@
         {%- endif -%}
       {%- endfor -%}
         {%- if command.parameters -%}, {% endif -%}
-        std::move(callback));
-    return;
+        std::make_unique<{{command_name_title}}CallbackImpl>(weakPtr(), dispatchable.CallId(), dispatchable.Serialized()));
     {% endif %}
 }
   {% endfor %}
 
+namespace {
+// This helper method (with a static map of redirects) is used from Dispatcher::wire
+// immediately below.
+const std::vector<std::pair<{{config.crdtp.namespace}}::span<uint8_t>, {{config.crdtp.namespace}}::span<uint8_t>>>& SortedRedirects() {
+  static auto* redirects = [](){
+    auto* redirects = new std::vector<std::pair<{{config.crdtp.namespace}}::span<uint8_t>, {{config.crdtp.namespace}}::span<uint8_t>>>{
+      {% for command in domain.commands|sort(attribute="name",case_sensitive=True) %}
+        {% if "redirect" in command %}
+          { {{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}.{{command.name}}"), {{config.crdtp.namespace}}::SpanFrom("{{command.redirect}}.{{command.name}}") },
+        {% endif %}
+      {% endfor %}
+    };
+    return redirects;
+  }();
+  return *redirects;
+}
+}  // namespace
+
 // static
 void Dispatcher::wire(UberDispatcher* uber, Backend* backend)
 {
-    std::unique_ptr<DispatcherImpl> dispatcher(new DispatcherImpl(uber->channel(), backend));
-    uber->setupRedirects(dispatcher->redirects());
-    uber->registerBackend("{{domain.domain}}", std::move(dispatcher));
+    auto dispatcher = std::make_unique<DomainDispatcherImpl>(uber->channel(), backend);
+    uber->WireBackend({{config.crdtp.namespace}}::SpanFrom("{{domain.domain}}"), SortedRedirects(), std::move(dispatcher));
 }
 
 } // {{domain.domain}}
diff --git a/third_party/inspector_protocol/templates/TypeBuilder_h.template b/third_party/inspector_protocol/templates/TypeBuilder_h.template
index ab64f72..bc3998e 100644
--- a/third_party/inspector_protocol/templates/TypeBuilder_h.template
+++ b/third_party/inspector_protocol/templates/TypeBuilder_h.template
@@ -239,7 +239,7 @@
   {% if protocol.generate_disable(domain) %}
     virtual DispatchResponse {{"disable" | to_method_case}}()
     {
-        return DispatchResponse::OK();
+        return DispatchResponse::Success();
     }
   {% endif %}
 };
@@ -248,7 +248,7 @@
 
 class {{config.protocol.export_macro}} Frontend {
 public:
-    explicit Frontend(FrontendChannel* frontendChannel) : m_frontendChannel(frontendChannel) { }
+  explicit Frontend(FrontendChannel* frontend_channel) : frontend_channel_(frontend_channel) {}
   {% for event in domain.events %}
     {% if not protocol.generate_event(domain.domain, event.name) %}{% continue %}{% endif %}
     void {{event.name | to_method_case}}(
@@ -262,10 +262,10 @@
     );
   {% endfor %}
 
-    void flush();
-    void sendRawNotification(std::unique_ptr<Serializable>);
-private:
-    FrontendChannel* m_frontendChannel;
+  void flush();
+  void sendRawNotification(std::unique_ptr<Serializable>);
+ private:
+  FrontendChannel* frontend_channel_;
 };
 
 // ------------- Dispatcher.
diff --git a/third_party/usrsctp/OWNERS b/third_party/usrsctp/OWNERS
index 5d5a5ac..a41a2ca 100644
--- a/third_party/usrsctp/OWNERS
+++ b/third_party/usrsctp/OWNERS
@@ -1,5 +1,4 @@
-pthatcher@chromium.org
-jiayl@chromium.org
-ldixon@chromium.org
+deadbeef@chromium.org
+hta@chromium.org
 
 # COMPONENT: Internals>Networking
diff --git a/tools/android/checkxmlstyle/checkxmlstyle.py b/tools/android/checkxmlstyle/checkxmlstyle.py
index 169f956b..465cbd1 100644
--- a/tools/android/checkxmlstyle/checkxmlstyle.py
+++ b/tools/android/checkxmlstyle/checkxmlstyle.py
@@ -47,6 +47,7 @@
   result.extend(_CheckColorReferences(input_api, output_api))
   result.extend(_CheckDuplicateColors(input_api, output_api))
   result.extend(_CheckSemanticColorsReferences(input_api, output_api))
+  result.extend(_CheckColorPaletteReferences(input_api, output_api))
   result.extend(_CheckXmlNamespacePrefixes(input_api, output_api))
   result.extend(_CheckTextAppearance(input_api, output_api))
   result.extend(_CheckButtonCompatWidgetUsage(input_api, output_api))
@@ -191,16 +192,56 @@
   return []
 
 
+def _CheckColorPaletteReferences(input_api, output_api):
+  """
+  Checks colors defined in color_palette.xml are not references in colors.xml.
+  """
+  warnings = []
+  color_palette = None
+
+  for f in IncludedFiles(input_api):
+    if not f.LocalPath().endswith('/colors.xml'):
+      continue
+
+    if color_palette is None:
+      color_palette = _colorXml2Dict(
+          input_api.ReadFile(helpers.COLOR_PALETTE_PATH))
+    for line_number, line in f.ChangedContents():
+      r = helpers.COLOR_REFERENCE_PATTERN.search(line)
+      if not r:
+        continue
+      color = r.group()
+      if _removePrefix(color) in color_palette:
+        warnings.append(
+            '  %s:%d\n    \t%s' % (f.LocalPath(), line_number, line.strip()))
+
+  if warnings:
+    return [
+        output_api.PresubmitPromptWarning(
+            '''
+  Android Color Palette Reference Check warning:
+    Your new color values added in colors.xml are defined in color_palette.xml.
+
+    We can recommend using semantic colors already defined in
+    ui/android/java/res/values/semantic_colors_non_adaptive.xml
+    or ui/android/java/res/values/semantic_colors_adaptive.xml if possible.
+
+    See https://crbug.com/775198 for more information.
+  ''', warnings)
+    ]
+  return []
+
+
 def _CheckSemanticColorsReferences(input_api, output_api):
   """
-  Checks colors defined in semantic_colors.xml only referencing
+  Checks colors defined in semantic_colors_non_adaptive.xml only referencing
   resources in color_palette.xml.
   """
   errors = []
   color_palette = None
 
   for f in IncludedFiles(input_api):
-    if not f.LocalPath().endswith('/semantic_colors.xml'):
+    if not f.LocalPath().endswith('/semantic_colors_non_adaptive.xml'):
       continue
 
     if color_palette is None:
@@ -220,8 +261,8 @@
         output_api.PresubmitError(
             '''
   Android Semantic Color Reference Check failed:
-    Your new color values added in semantic_colors are not defined in
-    ui/android/java/res/values/color_palette.xml, listed below.
+    Your new color values added in semantic_colors_non_adaptive.xml are not
+    defined in ui/android/java/res/values/color_palette.xml, listed below.
 
     This is banned. Colors in semantic colors can only reference
     the existing color resource from color_palette.xml.
diff --git a/tools/android/checkxmlstyle/checkxmlstyle_test.py b/tools/android/checkxmlstyle/checkxmlstyle_test.py
index 08cb1fb..ed42c161 100755
--- a/tools/android/checkxmlstyle/checkxmlstyle_test.py
+++ b/tools/android/checkxmlstyle/checkxmlstyle_test.py
@@ -140,15 +140,35 @@
     mock_input_api.files = [
         MockFile(helpers.COLOR_PALETTE_PATH,
                  ['<resources><color name="a">#f0f0f0</color></resources>']),
-        MockFile('ui/android/java/res/values/semantic_colors.xml', [
-            '<color name="b">@color/hello<color>',
-            '<color name="c">@color/a<color>'
-        ])
+        MockFile('ui/android/java/res/values/semantic_colors_non_adaptive.xml',
+                 [
+                     '<color name="b">@color/hello<color>',
+                     '<color name="c">@color/a<color>'
+                 ]),
+        MockFile('ui/android/java/res/values/semantic_colors_adaptive.xml',
+                 ['<color name="c">@color/a<color>'])
     ]
     errors = checkxmlstyle._CheckSemanticColorsReferences(
       mock_input_api, MockOutputApi())
     self.assertEqual(1, len(errors))
 
+  def testReferenceInColorPalette(self):
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+        MockFile(helpers.COLOR_PALETTE_PATH,
+                 ['<resources><color name="foo">#f0f0f0</color></resources>']),
+        MockFile('ui/android/java/res/values/semantic_colors_adaptive.xml',
+                 ['<color name="b">@color/foo<color>']),
+        MockFile('ui/android/java/res/values/colors.xml', [
+            '<color name="c">@color/b</color>',
+            '<color name="d">@color/b</color>',
+            '<color name="e">@color/foo</color>'
+        ])
+    ]
+    warnings = checkxmlstyle._CheckColorPaletteReferences(
+        mock_input_api, MockOutputApi())
+    self.assertEqual(1, len(warnings))
+
 
 class DuplicateColorsTest(unittest.TestCase):
 
diff --git a/tools/android/checkxmlstyle/helpers.py b/tools/android/checkxmlstyle/helpers.py
index 7ca49e1..c0c54dd2 100644
--- a/tools/android/checkxmlstyle/helpers.py
+++ b/tools/android/checkxmlstyle/helpers.py
@@ -11,8 +11,6 @@
 COLOR_PALETTE_PATH = os.path.join(_SRC_ROOT, COLOR_PALETTE_RELATIVE_PATH)
 ONE_OFF_COLORS_RELATIVE_PATH = 'ui/android/java/res/values/one_off_colors.xml'
 ONE_OFF_COLORS_PATH = os.path.join(_SRC_ROOT, ONE_OFF_COLORS_RELATIVE_PATH)
-SEMANTIC_COLORS_PATH = os.path.join(_SRC_ROOT,
-    'ui/android/java/res/values/semantic_colors.xml')
 BUTTOM_COMPAT_WIDGET_RELATIVE_PATH = (
     'ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java')
 
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 88df096..e7de83e 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -39,9 +39,9 @@
 # Do NOT CHANGE this if you don't know what you're doing -- see
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '9284abd0040afecfd619dbcf1b244a8b533291c9'
-CLANG_SVN_REVISION = 'n344329'
-CLANG_SUB_REVISION = 6
+CLANG_REVISION = '5d881dd8a8b8ea6f80bf4ef5b900ca006dacd9bf'
+CLANG_SVN_REVISION = 'n345635'
+CLANG_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8],
                                 CLANG_SUB_REVISION)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 2b4ff2e5..314b06b1 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -852,7 +852,6 @@
       'linux_layout_tests_composite_after_paint': 'release_trybot',
       'linux_layout_tests_layout_ng_disabled': 'release_trybot',
       'linux-layout-tests-fragment-item': 'release_trybot',
-      'linux-layout-tests-fragment-paint': 'release_trybot',
       'linux_mojo': 'release_trybot',
       'linux_mojo_chromeos': 'chromeos_with_codecs_release_trybot',
       'linux_optional_gpu_tests_rel': 'gpu_fyi_tests_release_trybot',
diff --git a/tools/mb/mb_config_buckets.pyl b/tools/mb/mb_config_buckets.pyl
index 8cbd81c..fdfadd5 100644
--- a/tools/mb/mb_config_buckets.pyl
+++ b/tools/mb/mb_config_buckets.pyl
@@ -459,7 +459,6 @@
       'linux-dawn-rel': 'dawn_tests_release_trybot',
       'linux-dcheck-off-rel': 'release_trybot_dcheck_off',
       'linux-layout-tests-fragment-item': 'release_trybot',
-      'linux-layout-tests-fragment-paint': 'release_trybot',
       'linux-libfuzzer-asan-rel': 'libfuzzer_asan_release_trybot',
       'linux-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage',
       'linux-swangle-try-tot-angle-x64': 'deqp_release_trybot',
@@ -780,7 +779,6 @@
       'linux-dcheck-off-rel': 'release_trybot_dcheck_off',
       'linux-gcc-rel': 'release_bot_x86_minimal_symbols_no_clang_cxx11',
       'linux-layout-tests-fragment-item': 'release_trybot',
-      'linux-layout-tests-fragment-paint': 'release_trybot',
       'linux-libfuzzer-asan-rel': 'libfuzzer_asan_release_trybot',
       'linux-ozone-rel': 'ozone_linux_release_trybot',
       'linux-ozone-x11-and-wayland-rel': 'ozone_linux_release_trybot',
@@ -1107,7 +1105,6 @@
       'linux-dcheck-off-rel': 'release_trybot_dcheck_off',
       'linux-gcc-rel': 'release_bot_x86_minimal_symbols_no_clang_cxx11',
       'linux-layout-tests-fragment-item': 'release_trybot',
-      'linux-layout-tests-fragment-paint': 'release_trybot',
       'linux-libfuzzer-asan-rel': 'libfuzzer_asan_release_trybot',
       'linux-ozone-rel': 'ozone_linux_release_trybot',
       'linux-ozone-x11-and-wayland-rel': 'ozone_linux_release_trybot',
@@ -1362,7 +1359,6 @@
       'linux-dcheck-off-rel': 'release_trybot_dcheck_off',
       'linux-gcc-rel': 'release_bot_x86_minimal_symbols_no_clang_cxx11',
       'linux-layout-tests-fragment-item': 'release_trybot',
-      'linux-layout-tests-fragment-paint': 'release_trybot',
       'linux-libfuzzer-asan-rel': 'libfuzzer_asan_release_trybot',
       'linux-ozone-rel': 'ozone_linux_release_trybot',
       'linux-ozone-x11-and-wayland-rel': 'ozone_linux_release_trybot',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 759ab43..19a8722 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -37712,7 +37712,6 @@
   <int value="-1713564656" label="ProtectSyncCredentialOnReauth:enabled"/>
   <int value="-1711751318" label="enable-data-reduction-proxy-lo-fi-preview"/>
   <int value="-1710772665" label="disable-my-files-navigation"/>
-  <int value="-1704561384" label="AndroidSetupSearchEngine:enabled"/>
   <int value="-1704472714" label="UseMessagesGoogleComDomain:disabled"/>
   <int value="-1703709912" label="enable-new-ntp"/>
   <int value="-1703308540" label="disable-webaudio"/>
@@ -37974,7 +37973,6 @@
   <int value="-1404469375" label="RemoteCopyProgressNotification:enabled"/>
   <int value="-1399753480" label="disable-harfbuzz-rendertext"/>
   <int value="-1399419572" label="enable-app-list"/>
-  <int value="-1398531606" label="AndroidSetupSearchEngine:disabled"/>
   <int value="-1396974542" label="UserMediaScreenCapturing:enabled"/>
   <int value="-1392689905" label="ServiceWorkerLongRunningMessage:enabled"/>
   <int value="-1392562498" label="disable-origin-chip"/>
@@ -38397,7 +38395,6 @@
       label="ProcessSharingWithDefaultSiteInstances:enabled"/>
   <int value="-929944930"
       label="AutofillRationalizeRepeatedServerPredictions:disabled"/>
-  <int value="-929047480" label="ImeAssistAutocorrect:enabled"/>
   <int value="-928138978" label="IPH_DemoMode:disabled"/>
   <int value="-926422468" label="disable-embedded-shared-worker"/>
   <int value="-926236394" label="SendTabToSelfHistory:enabled"/>
@@ -40382,6 +40379,7 @@
   <int value="1465624446" label="disable-zero-copy"/>
   <int value="1466380480" label="enable-device-discovery-notifications"/>
   <int value="1466502102" label="DelayNavigation:disabled"/>
+  <int value="1467322206" label="AssistAutoCorrect:enabled"/>
   <int value="1469407485" label="disable-accelerated-2d-canvas"/>
   <int value="1473838479" label="EnableVirtualKeyboardMdUi:disabled"/>
   <int value="1473967338" label="OmniboxShortBookmarkSuggestions:enabled"/>
@@ -40443,7 +40441,6 @@
   <int value="1540395380" label="WebContentsOcclusion:enabled"/>
   <int value="1540487070" label="ContextualSearchDebug:enabled"/>
   <int value="1541723759" label="ServiceWorkerNavigationPreload:disabled"/>
-  <int value="1542548035" label="ImeAssistAutocorrect:disabled"/>
   <int value="1543027970" label="EnableDisplayZoomSetting:disabled"/>
   <int value="1544552792" label="InterestFeedContentSuggestions:enabled"/>
   <int value="1548776701" label="AllBookmarks:disabled"/>
@@ -40496,6 +40493,7 @@
   <int value="1614309501" label="DataSaverLiteModeRebranding:enabled"/>
   <int value="1614596813" label="CloseButtonsInactiveTabs:disabled"/>
   <int value="1615988672" label="GrantNotificationsToDSE:enabled"/>
+  <int value="1616418306" label="AssistAutoCorrect:disabled"/>
   <int value="1616782064" label="shelf-dense-clamshell"/>
   <int value="1616938915"
       label="OmniboxUIExperimentWhiteBackgroundOnBlur:disabled"/>
@@ -62801,6 +62799,12 @@
   <int value="1" label="Leave the current page"/>
 </enum>
 
+<enum name="StoragePressureBubbleUserAction">
+  <int value="0" label="The bubble was shown."/>
+  <int value="1" label="The user ignored the bubble."/>
+  <int value="2" label="The user clicked on the positive button."/>
+</enum>
+
 <enum name="StreamParserBufferDurationType">
   <summary>
     MSE parsing of WebM buffers may require estimating the duration. &quot;Known
@@ -65694,6 +65698,8 @@
   <int value="10" label="Can not close extracted file (Deprecated)"/>
   <int value="11" label="Can not create file memory mapping"/>
   <int value="12" label="File CRC mismatch"/>
+  <int value="13" label="There is not enough space on the disk."/>
+  <int value="14" label="I/O device error."/>
 </enum>
 
 <enum name="UnsupportedContainers">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index e9778ec3..89af4c3 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -33238,9 +33238,9 @@
 </histogram>
 
 <histogram name="DataReductionProxy.DaysSinceEnabled" units="days"
-    expires_after="M82">
+    expires_after="2021-03-10">
+  <owner>rajendrant@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
-  <owner>bengr@chromium.org</owner>
   <summary>
     Records the number of days since data reduction proxy was last enabled by
     the user. Recorded only if the data reduction proxy was last enabled since
@@ -33279,9 +33279,9 @@
 </histogram>
 
 <histogram name="DataReductionProxy.EnabledState"
-    enum="DataReductionProxyEnabledState" expires_after="M81">
-  <owner>bengr@chromium.org</owner>
+    enum="DataReductionProxyEnabledState" expires_after="2021-03-10">
   <owner>rajendrant@chromium.org</owner>
+  <owner>tbansal@chromium.org</owner>
   <summary>
     Samples of user interactions with the Data Saver settings menu across all
     platforms (android, IOS, desktop extension). Data is collected whenever user
@@ -33886,9 +33886,9 @@
 </histogram>
 
 <histogram name="DataReductionProxy.StartupState"
-    enum="DataReductionProxyStartupState" expires_after="M81">
-  <owner>bengr@chromium.org</owner>
-  <owner>marq@chromium.org</owner>
+    enum="DataReductionProxyStartupState" expires_after="2021-03-10">
+  <owner>rajendrant@chromium.org</owner>
+  <owner>tbansal@chromium.org</owner>
   <summary>
     Samples of the state of the data reduction proxy on Chrome startup. The
     proxy will either be unavailable (the feature hasn't been rolled out to this
@@ -75984,6 +75984,9 @@
 
 <histogram base="true" name="Media.WebMediaPlayerImpl.Memory" units="KB"
     expires_after="2020-08-09">
+  <obsolete>
+    Removed in March 2020.
+  </obsolete>
   <owner>wolenetz@chromium.org</owner>
   <summary>
     Amount of memory used by the WebMediaPlayerImpl and its components.
@@ -128946,6 +128949,36 @@
   </summary>
 </histogram>
 
+<histogram name="QuickAnswers.Consent" units="impressions"
+    expires_after="2020-12-10">
+  <owner>llin@google.com</owner>
+  <owner>croissant-eng@chromium.org</owner>
+  <summary>
+    For every quick answers consent impression, records how many times the user
+    has seen the consent. ChromeOS only.
+  </summary>
+</histogram>
+
+<histogram base="true" name="QuickAnswers.Consent.Duration" units="ms"
+    expires_after="2020-12-10">
+  <owner>llin@google.com</owner>
+  <owner>croissant-eng@chromium.org</owner>
+  <summary>
+    For every quick answers consent interaction event, records how long the user
+    has seen the consent before. ChromeOS only.
+  </summary>
+</histogram>
+
+<histogram base="true" name="QuickAnswers.Consent.Impression"
+    units="impressions" expires_after="2020-12-10">
+  <owner>llin@google.com</owner>
+  <owner>croissant-eng@chromium.org</owner>
+  <summary>
+    For every quick answers consent interaction event, records how many times
+    the user has seen the consent before. ChromeOS only.
+  </summary>
+</histogram>
+
 <histogram name="QuickAnswers.Loading.Duration" units="ms"
     expires_after="2020-12-10">
   <owner>llin@google.com</owner>
@@ -148413,6 +148446,9 @@
 
 <histogram name="Setup.Install.LzmaUnPackNTSTATUS" enum="NTSTATUS"
     expires_after="M82">
+  <obsolete>
+    Removed 03/2020.
+  </obsolete>
   <owner>zmin@chromium.org</owner>
   <summary>
     Record the NTSTATUS code of unpacking the contents of a 7z file.
@@ -148420,7 +148456,10 @@
 </histogram>
 
 <histogram base="true" name="Setup.Install.LzmaUnPackResult"
-    enum="WinGetLastError" expires_after="M82">
+    enum="WinGetLastError" expires_after="2021-03-06">
+  <obsolete>
+    Removed 03/2020.
+  </obsolete>
   <owner>etiennep@chromium.org</owner>
   <summary>
     Record the return value of unpacking the contents of a 7z file.
@@ -148648,6 +148687,16 @@
   </summary>
 </histogram>
 
+<histogram name="SharedMemory.MapBlockedForSecurity" enum="BooleanBlocked"
+    expires_after="M85">
+  <owner>dcheng@chromium.org</owner>
+  <owner>rsesek@chromium.org</owner>
+  <summary>
+    Tracks whether an attempt to map shared memory was blocked due to too much
+    shared memory already being mapped into the address space.
+  </summary>
+</histogram>
+
 <histogram name="SharedMemory.TimeSpentMakingAnonymousMemory" units="ms"
     expires_after="2015-06-03">
   <obsolete>
@@ -157715,6 +157764,17 @@
   </summary>
 </histogram>
 
+<histogram name="Storage.StoragePressure.Bubble"
+    enum="StoragePressureBubbleUserAction" expires_after="2021-03-17">
+  <owner>jarrydg@chromium.org</owner>
+  <owner>chrome-owp-storage@google.com</owner>
+  <summary>
+    How did the user interact with the StoragePressure Bubble? Ignored means the
+    user did not click on the positive button before the bubble is closed
+    (either manually closed or when the browser closes).
+  </summary>
+</histogram>
+
 <histogram name="Style.AuthorStyleSheet.ParseTime" units="microseconds"
     expires_after="2019-02-13">
   <obsolete>
@@ -168245,16 +168305,42 @@
   </summary>
 </histogram>
 
-<histogram name="UMA.JavaCachingRecorder.DroppedSampleCount" units="samples"
-    expires_after="2021-01-16">
+<histogram name="UMA.JavaCachingRecorder.DroppedHistogramSampleCount"
+    units="samples" expires_after="2021-01-16">
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
-    Number of samples that were not recorded when flushing due to a
+    Number of histogram samples that were not recorded when flushing due to
+    cache size limits in the Java in-memory cache. There are separate limits on
+    the number of cached histograms, and the number of samples in a histogram.
+  </summary>
+</histogram>
+
+<histogram name="UMA.JavaCachingRecorder.DroppedSampleCount" units="samples"
+    expires_after="2020-03-31">
+  <obsolete>
+    Removed on 2020-03-18. Renamed to
+    UMA.JavaCachingRecorder.DroppedHistogramSampleCount and reports also
+    histogram samples dropped due to a limit of the number of cached histograms.
+  </obsolete>
+  <owner>bttk@chromium.org</owner>
+  <owner>src/base/metrics/OWNERS</owner>
+  <summary>
+    Number of histogram samples that were not recorded when flushing due to a
     per-histogram sample count limit in the Java in-memory cache.
   </summary>
 </histogram>
 
+<histogram name="UMA.JavaCachingRecorder.DroppedUserActionCount"
+    units="samples" expires_after="2021-01-16">
+  <owner>bttk@chromium.org</owner>
+  <owner>src/base/metrics/OWNERS</owner>
+  <summary>
+    Number of user actions that were not recorded when flushing due to a cache
+    size limit in Java the in-memory cache.
+  </summary>
+</histogram>
+
 <histogram name="UMA.JavaCachingRecorder.FlushedHistogramCount"
     units="histograms" expires_after="2021-01-16">
   <owner>bttk@chromium.org</owner>
@@ -168265,7 +168351,11 @@
 </histogram>
 
 <histogram name="UMA.JavaCachingRecorder.FullHistogramCount" units="histograms"
-    expires_after="2021-01-16">
+    expires_after="2020-03-31">
+  <obsolete>
+    Removed on 2020-03-18 to reduce the number of histograms emitted by the
+    cache.
+  </obsolete>
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -168274,8 +168364,13 @@
   </summary>
 </histogram>
 
-<histogram name="UMA.JavaCachingRecorder.HistogramLimitSampleCount"
-    units="samples" expires_after="2021-01-16">
+<histogram name="UMA.JavaCachingRecorder.HistogramLimitDroppedSampleCount"
+    units="samples" expires_after="2020-03-31">
+  <obsolete>
+    Removed on 2020-03-18 to reduce the number of histograms emitted by the
+    cache. UMA.JavaCachingRecorder.DroppedHistogramSampleCount includes
+    histogram samples that were reported in this histogram.
+  </obsolete>
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -168284,8 +168379,22 @@
   </summary>
 </histogram>
 
+<histogram name="UMA.JavaCachingRecorder.InputHistogramSampleCount"
+    units="samples" expires_after="2021-01-16">
+  <owner>bttk@chromium.org</owner>
+  <owner>src/base/metrics/OWNERS</owner>
+  <summary>
+    Number of histogram samples seen by the time the Java in-memory cache was
+    flushed. This includes samples counted in DroppedHistogramSampleCount.
+  </summary>
+</histogram>
+
 <histogram name="UMA.JavaCachingRecorder.InputSampleCount" units="samples"
-    expires_after="2021-01-16">
+    expires_after="2020-03-31">
+  <obsolete>
+    Removed on 2020-03-18. Renamed to
+    UMA.JavaCachingRecorder.InputHistogramSampleCount.
+  </obsolete>
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -168294,8 +168403,22 @@
   </summary>
 </histogram>
 
+<histogram name="UMA.JavaCachingRecorder.InputUserActionCount" units="samples"
+    expires_after="2021-01-16">
+  <owner>bttk@chromium.org</owner>
+  <owner>src/base/metrics/OWNERS</owner>
+  <summary>
+    Number of user actions seen by the time the in-memory cache was flushed.
+    This includes actions counted in DroppedUserActionCount.
+  </summary>
+</histogram>
+
 <histogram name="UMA.JavaCachingRecorder.RemainingHistogramLimit"
-    units="histograms" expires_after="2021-01-16">
+    units="histograms" expires_after="2020-03-31">
+  <obsolete>
+    Removed on 2020-03-18 to reduce the number of histograms emitted by the
+    cache.
+  </obsolete>
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -168305,7 +168428,11 @@
 </histogram>
 
 <histogram name="UMA.JavaCachingRecorder.RemainingSampleLimit"
-    units="histograms" expires_after="2021-01-16">
+    units="histograms" expires_after="2020-03-31">
+  <obsolete>
+    Removed on 2020-03-18 to reduce the number of histograms emitted by the
+    cache.
+  </obsolete>
   <owner>bttk@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -190075,6 +190202,9 @@
 </histogram_suffixes>
 
 <histogram_suffixes name="MediaWMPIMemoryUsage" separator=".">
+  <obsolete>
+    Removed in March 2020.
+  </obsolete>
   <suffix name="Audio" label=""/>
   <suffix name="DataSource" label=""/>
   <suffix name="Demuxer" label=""/>
@@ -195434,6 +195564,14 @@
   <affected-histogram name="QuickAnswers.Result.Duration"/>
 </histogram_suffixes>
 
+<histogram_suffixes name="QuickAnswersConsentInteractionType" separator=".">
+  <suffix name="Accept" label="Clicks on the accept button"/>
+  <suffix name="Dismiss" label="Dismisses the consent"/>
+  <suffix name="ManageSettings" label="Clicks on the 'manage settings' button"/>
+  <affected-histogram name="QuickAnswers.Consent.Duration"/>
+  <affected-histogram name="QuickAnswers.Consent.Impression"/>
+</histogram_suffixes>
+
 <histogram_suffixes name="QuicPortSelection" separator="">
   <suffix name="RandomPort"
       label="The operating system randomly selected a source port for the
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h
index 91c2979..7102714 100644
--- a/ui/accessibility/ax_tree_serializer.h
+++ b/ui/accessibility/ax_tree_serializer.h
@@ -12,6 +12,7 @@
 #include <unordered_set>
 #include <vector>
 
+#include "base/debug/dump_without_crashing.h"
 #include "base/logging.h"
 #include "ui/accessibility/ax_export.h"
 #include "ui/accessibility/ax_tree_source.h"
@@ -341,7 +342,10 @@
         // This child is already in the client tree and valid, we won't
         // recursively serialize it so we don't need to check this
         // subtree recursively for reparenting.
-        continue;
+        // However, if the child is ignored, the children may now be
+        // considered as reparented, so continue recursion in that case.
+        if (!client_child->ignored)
+          continue;
       }
     }
 
@@ -548,6 +552,7 @@
     ClientTreeNode* client_child = ClientTreeNodeById(new_child_id);
     if (client_child && client_child->parent != client_node) {
       DVLOG(1) << "Reparenting detected";
+      base::debug::DumpWithoutCrashing();
       Reset();
       return false;
     }
diff --git a/ui/accessibility/extensions/chromevoxclassic/braille/braille_table.js b/ui/accessibility/extensions/chromevoxclassic/braille/braille_table.js
index 8957d1c2..2f3e889 100644
--- a/ui/accessibility/extensions/chromevoxclassic/braille/braille_table.js
+++ b/ui/accessibility/extensions/chromevoxclassic/braille/braille_table.js
@@ -116,7 +116,9 @@
  * @return {string} Localized display name.
  */
 cvox.BrailleTable.getDisplayName = function(table) {
-  var localeName = Msgs.getLocaleDisplayName(table.locale);
+  var localeName = chrome.accessibilityPrivate.getDisplayNameForLocale(
+      table.locale /* locale to be displayed */,
+      chrome.i18n.getUILanguage().toLowerCase() /* locale to localize into */);
   if (!table.grade && !table.variant) {
     return localeName;
   } else if (table.grade && !table.variant) {
diff --git a/ui/accessibility/extensions/chromevoxclassic/common/msgs.js b/ui/accessibility/extensions/chromevoxclassic/common/msgs.js
index 98f0995a..cffa815 100644
--- a/ui/accessibility/extensions/chromevoxclassic/common/msgs.js
+++ b/ui/accessibility/extensions/chromevoxclassic/common/msgs.js
@@ -23,13 +23,6 @@
 Msgs.NAMESPACE_ = 'chromevox_';
 
 /**
- * Dictionary of locale names.
- * @type {Object<string>}
- * @private
- */
-Msgs.localeNameDict_ = null;
-
-/**
  * Return the current locale.
  * @return {string} The locale.
  */
@@ -96,26 +89,6 @@
 };
 
 /**
- * Gets a localized display name for a locale.
- * NOTE: Only a subset of locale identifiers are supported.  See the
- * |CHROMEVOX_LOCALE_DICT| message.
- * @param {string} locale On the form |ll| or |ll_CC|, where |ll| is
- *     the language code and |CC| the country code.
- * @return {string} The display name.
- */
-Msgs.getLocaleDisplayName = function(locale) {
-  if (!Msgs.localeNameDict_) {
-    Msgs.localeNameDict_ = /** @type {!Object<string>} */(
-        JSON.parse(this.getMsg('locale_dict')));
-  }
-  var name = Msgs.localeNameDict_[locale];
-  if (!name) {
-    throw Error('Unsupported locale identifier: ' + locale);
-  }
-  return name;
-};
-
-/**
  * Applies substitions of the form $N, where N is a number from 1 to 9, to a
  * string. The numbers are one-based indices into |opt_subs|.
  * @param {string} message
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 02b039c..f506b13c 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -2098,31 +2098,7 @@
   if (!obj)
     return -1;
 
-  AtkObject* parent = obj->GetParent();
-  if (!parent)
-    return -1;
-
-  int n_children = GetNChildren(parent);
-
-  // Ask the delegate for the index in parent, and return it if it's plausible.
-  //
-  // Delegates are allowed to not implement this (AXPlatformNodeDelegateBase
-  // returns -1). Also, delegates may not know the correct answer if this
-  // node is the root of a tree that's embedded in another tree, in which
-  // case the delegate should return -1 and we'll compute it.
-  int index_in_parent = obj->GetDelegate()->GetIndexInParent();
-  if (index_in_parent >= 0 && index_in_parent < n_children)
-    return index_in_parent;
-
-  // Otherwise, search the parent's children.
-  for (int i = 0; i < n_children; i++) {
-    AtkObject* child = RefChild(parent, i);
-    g_object_unref(child);
-    if (child == atk_object)
-      return i;
-  }
-
-  return -1;
+  return obj->GetIndexInParent();
 }
 
 gint AtkGetIndexInParent(AtkObject* atk_object) {
@@ -2488,7 +2464,7 @@
 
 AtkObject* AXPlatformNodeAuraLinux::CreateAtkObject() {
   if (GetData().role != ax::mojom::Role::kApplication &&
-      !GetAccessibilityMode().has_mode(AXMode::kWebContents))
+      !GetAccessibilityMode().has_mode(AXMode::kNativeAPIs))
     return nullptr;
   EnsureGTypeInit();
   interface_mask_ = GetGTypeInterfaceMask(GetData());
@@ -3046,8 +3022,11 @@
     }
   }
 
-  DCHECK(GetOrCreateAtkObject());
-  if (delegate_->GetFocus() == GetOrCreateAtkObject())
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
+  if (delegate_->GetFocus() == atk_object)
     atk_state_set_add_state(atk_state_set, ATK_STATE_FOCUSED);
 
   // It is insufficient to compare with g_current_activedescendant due to both
@@ -3055,7 +3034,7 @@
   // have an active descendant. For instance, if we check the state set of a
   // selectable child, it will only have ATK_STATE_FOCUSED if we've processed
   // the activedescendant change.
-  if (GetActiveDescendantOfCurrentFocused() == GetOrCreateAtkObject())
+  if (GetActiveDescendantOfCurrentFocused() == atk_object)
     atk_state_set_add_state(atk_state_set, ATK_STATE_FOCUSED);
 }
 
@@ -3125,11 +3104,14 @@
 }
 
 AtkRelationSet* AXPlatformNodeAuraLinux::GetAtkRelations() {
-  DCHECK(GetOrCreateAtkObject());
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return nullptr;
+
   AtkRelationSet* relation_set = atk_relation_set_new();
 
   if (GetDelegate()->IsWebContent() && GetAtkRole() == ATK_ROLE_DOCUMENT_WEB) {
-    AtkObject* parent_frame = FindAtkObjectParentFrame(GetOrCreateAtkObject());
+    AtkObject* parent_frame = FindAtkObjectParentFrame(atk_object);
     if (parent_frame) {
       atk_relation_set_add_relation_by_type(
           relation_set, ATK_RELATION_EMBEDDED_BY, parent_frame);
@@ -3239,9 +3221,13 @@
 }
 
 void AXPlatformNodeAuraLinux::OnActiveDescendantChanged() {
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   // Active-descendant-changed notifications are typically only relevant when
   // the change is within the focused widget.
-  if (GetOrCreateAtkObject() != g_current_focused)
+  if (atk_object != g_current_focused)
     return;
 
   AtkObject* descendant = GetActiveDescendantOfCurrentFocused();
@@ -3276,8 +3262,12 @@
 }
 
 void AXPlatformNodeAuraLinux::OnCheckedStateChanged() {
+  AtkObject* obj = GetOrCreateAtkObject();
+  if (!obj)
+    return;
+
   atk_object_notify_state_change(
-      ATK_OBJECT(GetOrCreateAtkObject()), GetAtkStateTypeForCheckableNode(),
+      ATK_OBJECT(obj), GetAtkStateTypeForCheckableNode(),
       GetData().GetCheckedState() != ax::mojom::CheckedState::kFalse);
 }
 
@@ -3288,8 +3278,11 @@
   // might imply a change in ATK interfaces implemented.
   EnsureAtkObjectIsValid();
 
-  atk_object_notify_state_change(ATK_OBJECT(GetOrCreateAtkObject()),
-                                 ATK_STATE_EXPANDED, is_expanded);
+  AtkObject* obj = GetOrCreateAtkObject();
+  if (!obj)
+    return;
+
+  atk_object_notify_state_change(obj, ATK_STATE_EXPANDED, is_expanded);
 }
 
 void AXPlatformNodeAuraLinux::OnMenuPopupStart() {
@@ -3427,6 +3420,8 @@
 
 void AXPlatformNodeAuraLinux::OnWindowVisibilityChanged() {
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
 
   if (GetAtkRole() != ATK_ROLE_FRAME)
     return;
@@ -3445,6 +3440,8 @@
 
 void AXPlatformNodeAuraLinux::OnScrolledToAnchor() {
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
   DCHECK(ATK_IS_TEXT(atk_object));
   g_signal_emit_by_name(atk_object, "text-caret-moved", 0);
 }
@@ -3454,6 +3451,9 @@
   AtkObject* new_views_dialog = nullptr;
 
   AtkObject* parent = GetOrCreateAtkObject();
+  if (!parent)
+    return;
+
   if (!GetDelegate()->IsWebContent()) {
     while (parent) {
       if (atk_object::GetRole(parent) == ATK_ROLE_DIALOG) {
@@ -3476,6 +3476,8 @@
 
 void AXPlatformNodeAuraLinux::OnFocused() {
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
 
   if (atk_object::GetRole(atk_object) == ATK_ROLE_FRAME) {
     OnWindowActivated();
@@ -3501,6 +3503,8 @@
 
 void AXPlatformNodeAuraLinux::OnSelected() {
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
   if (g_current_selected && !g_current_selected->GetData().GetBoolAttribute(
                                 ax::mojom::BoolAttribute::kSelected)) {
     atk_object_notify_state_change(
@@ -3519,7 +3523,11 @@
 }
 
 void AXPlatformNodeAuraLinux::OnSelectedChildrenChanged() {
-  g_signal_emit_by_name(GetOrCreateAtkObject(), "selection-changed", true);
+  AtkObject* obj = GetOrCreateAtkObject();
+  if (!obj)
+    return;
+
+  g_signal_emit_by_name(obj, "selection-changed", true);
 }
 
 bool AXPlatformNodeAuraLinux::SelectionAndFocusAreTheSame() {
@@ -3649,6 +3657,9 @@
   std::pair<int, int> selection = GetSelectionOffsetsForAtk();
 
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   DCHECK(ATK_IS_TEXT(atk_object));
   g_signal_emit_by_name(atk_object, "text-caret-moved",
                         UTF16ToUnicodeOffsetInText(selection.second));
@@ -3693,6 +3704,10 @@
 }
 
 void AXPlatformNodeAuraLinux::OnDescriptionChanged() {
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   std::string description;
   GetStringAttribute(ax::mojom::StringAttribute::kDescription, &description);
 
@@ -3701,7 +3716,7 @@
   property_values.new_value = G_VALUE_INIT;
   g_value_init(&property_values.new_value, G_TYPE_STRING);
   g_value_set_string(&property_values.new_value, description.c_str());
-  g_signal_emit_by_name(G_OBJECT(GetOrCreateAtkObject()),
+  g_signal_emit_by_name(G_OBJECT(atk_object),
                         "property-change::accessible-description",
                         &property_values, nullptr);
   g_value_unset(&property_values.new_value);
@@ -3721,6 +3736,10 @@
   if (!GetFloatAttribute(ax::mojom::FloatAttribute::kValueForRange, &float_val))
     return;
 
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   AtkPropertyValues property_values;
   property_values.property_name = "accessible-value";
 
@@ -3728,13 +3747,17 @@
   g_value_init(&property_values.new_value, G_TYPE_DOUBLE);
   g_value_set_double(&property_values.new_value,
                      static_cast<double>(float_val));
-  g_signal_emit_by_name(G_OBJECT(GetOrCreateAtkObject()),
+  g_signal_emit_by_name(G_OBJECT(atk_object),
                         "property-change::accessible-value", &property_values,
                         nullptr);
 }
 
 void AXPlatformNodeAuraLinux::OnNameChanged() {
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object) {
+    CHECK(false);
+    return;
+  }
   std::string previous_accessible_name = accessible_name_;
   // Calling atk_object_get_name will update the value of accessible_name_.
   if (!g_strcmp0(atk_object::GetName(atk_object),
@@ -3760,8 +3783,13 @@
   // We also don't want to notify if this is an ignored node
   if (!GetParent() || GetData().IsIgnored())
     return;
+
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   g_signal_emit_by_name(GetParent(), "children-changed::add",
-                        GetIndexInParent(), GetOrCreateAtkObject());
+                        GetIndexInParent(), atk_object);
 }
 
 void AXPlatformNodeAuraLinux::OnSubtreeWillBeDeleted() {
@@ -3770,8 +3798,12 @@
   if (!GetParent() || GetData().IsIgnored())
     return;
 
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   g_signal_emit_by_name(GetParent(), "children-changed::remove",
-                        GetIndexInParent(), GetOrCreateAtkObject());
+                        GetIndexInParent(), atk_object);
 }
 
 void AXPlatformNodeAuraLinux::OnParentChanged() {
@@ -3790,8 +3822,12 @@
 }
 
 void AXPlatformNodeAuraLinux::OnInvalidStatusChanged() {
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   atk_object_notify_state_change(
-      ATK_OBJECT(GetOrCreateAtkObject()), ATK_STATE_INVALID_ENTRY,
+      ATK_OBJECT(atk_object), ATK_STATE_INVALID_ENTRY,
       GetData().GetInvalidState() != ax::mojom::InvalidState::kFalse);
 }
 
@@ -3904,10 +3940,11 @@
 }
 
 void AXPlatformNodeAuraLinux::UpdateHypertext() {
-  if (!GetOrCreateAtkObject())
+  EnsureAtkObjectIsValid();
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
     return;
 
-  EnsureAtkObjectIsValid();
   AXHypertext old_hypertext = hypertext_;
   base::OffsetAdjuster::Adjustments old_adjustments = GetHypertextAdjustments();
 
@@ -3927,7 +3964,6 @@
   size_t shared_prefix, old_len, new_len;
   ComputeHypertextRemovedAndInserted(old_hypertext, &shared_prefix, &old_len,
                                      &new_len);
-  AtkObject* atk_object = GetOrCreateAtkObject();
   if (old_len > 0) {
     base::string16 removed_substring =
         old_hypertext.hypertext.substr(shared_prefix, old_len);
@@ -4003,13 +4039,6 @@
   return utf16_offset;
 }
 
-int AXPlatformNodeAuraLinux::GetIndexInParent() {
-  if (!GetParent())
-    return -1;
-
-  return delegate_->GetIndexInParent();
-}
-
 gfx::Vector2d AXPlatformNodeAuraLinux::GetParentOriginInScreenCoordinates()
     const {
   AtkObject* parent = GetParent();
@@ -4124,9 +4153,13 @@
   if (GetAtkRole() == ATK_ROLE_DOCUMENT_WEB)
     return false;
 
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return false;
+
   if (GetData().HasState(ax::mojom::State::kFocusable) ||
       SelectionAndFocusAreTheSame()) {
-    if (g_current_focused != GetOrCreateAtkObject())
+    if (g_current_focused != atk_object)
       GrabFocus();
     return true;
   }
@@ -4333,6 +4366,8 @@
     base::Optional<FindInPageResultInfo> result =
         GetSelectionOffsetsFromFindInPage();
     AtkObject* atk_object = GetOrCreateAtkObject();
+    if (!atk_object)
+      return -1;
     if (result.has_value() && result->node == atk_object)
       return UTF16ToUnicodeOffsetInText(result->end_offset);
     return -1;
@@ -4343,9 +4378,11 @@
 }
 
 bool AXPlatformNodeAuraLinux::SetCaretOffset(int offset) {
-  DCHECK(GetOrCreateAtkObject());
-  int character_count =
-      atk_text_get_character_count(ATK_TEXT(GetOrCreateAtkObject()));
+  AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return false;
+
+  int character_count = atk_text_get_character_count(ATK_TEXT(atk_object));
   if (offset < 0 || offset > character_count)
     offset = character_count;
 
@@ -4431,7 +4468,9 @@
   GetSelectionExtents(&selection_start, &selection_end);
 
   AtkObject* atk_object = GetOrCreateAtkObject();
-  DCHECK(atk_object);
+  if (!atk_object)
+    return nullptr;
+
   if (selection_start < 0 || selection_end < 0 ||
       selection_start == selection_end) {
     base::Optional<FindInPageResultInfo> find_in_page_result =
@@ -4458,7 +4497,7 @@
     *start_offset = selection_start;
   if (end_offset)
     *end_offset = selection_end;
-  return atk_text::GetText(ATK_TEXT(GetOrCreateAtkObject()), selection_start,
+  return atk_text::GetText(ATK_TEXT(atk_object), selection_start,
                            selection_end);
 }
 
@@ -4675,6 +4714,9 @@
 void AXPlatformNodeAuraLinux::ActivateFindInPageResult(int start_offset,
                                                        int end_offset) {
   AtkObject* atk_object = GetOrCreateAtkObject();
+  if (!atk_object)
+    return;
+
   DCHECK(ATK_IS_TEXT(atk_object));
 
   if (!EmitsAtkTextEvents()) {
@@ -4741,7 +4783,9 @@
 
 void AXPlatformNodeAuraLinux::ForgetCurrentFindInPageResult() {
   AtkObject* atk_object = GetOrCreateAtkObject();
-  DCHECK(atk_object);
+  if (!atk_object)
+    return;
+
   AtkObject* parent_doc = FindAtkObjectToplevelParentDocument(atk_object);
   if (parent_doc)
     GetActiveFindInPageResults().erase(parent_doc);
@@ -4750,7 +4794,9 @@
 base::Optional<FindInPageResultInfo>
 AXPlatformNodeAuraLinux::GetSelectionOffsetsFromFindInPage() {
   AtkObject* atk_object = GetOrCreateAtkObject();
-  DCHECK(atk_object);
+  if (!atk_object)
+    return base::nullopt;
+
   AtkObject* parent_doc = FindAtkObjectToplevelParentDocument(atk_object);
   if (!parent_doc)
     return base::nullopt;
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h
index 462c3398..5029309a 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -229,7 +229,6 @@
 
   // AXPlatformNodeBase overrides.
   void Init(AXPlatformNodeDelegate* delegate) override;
-  int GetIndexInParent() override;
   base::string16 GetHypertext() const override;
 
   bool IsNameExposed();
@@ -307,6 +306,8 @@
 
   GType GetAccessibilityGType();
   AtkObject* CreateAtkObject();
+  // Get or Create AtkObject. Note that it could return nullptr except
+  // ax::mojom::Role::kApplication when the mode is not enabled.
   gfx::NativeViewAccessible GetOrCreateAtkObject();
   void DestroyAtkObjects();
   void AddRelationToSet(AtkRelationSet*,
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc
index 11c890f..81478de 100644
--- a/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -150,8 +150,32 @@
 }
 
 int AXPlatformNodeBase::GetIndexInParent() {
-  if (delegate_)
-    return delegate_->GetIndexInParent();
+  AXPlatformNodeBase* parent = FromNativeViewAccessible(GetParent());
+  if (!parent)
+    return 0;
+
+  int child_count = parent->GetChildCount();
+  if (child_count == 0) {
+    // |child_count| could be 0 if the node is PlatformIsLeaf.
+    return 0;
+  }
+
+  // Ask the delegate for the index in parent, and return it if it's plausible.
+  //
+  // Delegates are allowed to not implement this (ViewsAXPlatformNodeDelegate
+  // returns -1). Also, delegates may not know the correct answer if this
+  // node is the root of a tree that's embedded in another tree, in which
+  // case the delegate should return -1 and we'll compute it.
+  int index = delegate_ ? delegate_->GetIndexInParent() : -1;
+  if (index >= 0 && index < child_count)
+    return index;
+
+  // Otherwise, search the parent's children.
+  gfx::NativeViewAccessible current = GetNativeViewAccessible();
+  for (int i = 0; i < child_count; i++) {
+    if (parent->ChildAtIndex(i) == current)
+      return i;
+  }
   return -1;
 }
 
diff --git a/ui/accessibility/platform/ax_platform_node_base.h b/ui/accessibility/platform/ax_platform_node_base.h
index d5088c0..efd15b7 100644
--- a/ui/accessibility/platform/ax_platform_node_base.h
+++ b/ui/accessibility/platform/ax_platform_node_base.h
@@ -62,7 +62,7 @@
   std::string GetName() const;
   base::string16 GetNameAsString16() const;
 
-  // This needs to be implemented for each platform.
+  // This returns 0 if there's no parent.
   virtual int GetIndexInParent();
 
   // AXPlatformNode.
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h
index 5ddd11b..7c6e46e 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -98,6 +98,7 @@
   virtual gfx::NativeViewAccessible GetParent() = 0;
 
   // Get the index in parent. Typically this is the AXNode's index_in_parent_.
+  // This should return -1 if the index in parent is unknown.
   virtual int GetIndexInParent() = 0;
 
   // Get the number of children of this node.
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 31f9055..cba7b75 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -648,43 +648,6 @@
     AddAlertTarget();
 }
 
-int AXPlatformNodeWin::GetIndexInParent() {
-  Microsoft::WRL::ComPtr<IDispatch> parent_dispatch;
-  Microsoft::WRL::ComPtr<IAccessible> parent_accessible;
-  if (S_OK != get_accParent(parent_dispatch.GetAddressOf()))
-    return -1;
-  if (S_OK != parent_dispatch.CopyTo(parent_accessible.GetAddressOf()))
-    return -1;
-
-  LONG child_count = 0;
-  if (S_OK != parent_accessible->get_accChildCount(&child_count))
-    return -1;
-
-  // Ask the delegate for the index in parent, and return it if it's plausible.
-  //
-  // Delegates are allowed to not implement this (AXPlatformNodeDelegateBase
-  // returns -1). Also, delegates may not know the correct answer if this
-  // node is the root of a tree that's embedded in another tree, in which
-  // case the delegate should return -1 and we'll compute it.
-  int index_in_parent = GetDelegate()->GetIndexInParent();
-  if (index_in_parent >= 0 && index_in_parent < child_count)
-    return index_in_parent;
-
-  // Otherwise, search the parent's children.
-  for (LONG index = 1; index <= child_count; ++index) {
-    base::win::ScopedVariant childid_index(index);
-    Microsoft::WRL::ComPtr<IDispatch> child_dispatch;
-    Microsoft::WRL::ComPtr<IAccessible> child_accessible;
-    if (S_OK == parent_accessible->get_accChild(
-                    childid_index, child_dispatch.GetAddressOf()) &&
-        S_OK == child_dispatch.CopyTo(child_accessible.GetAddressOf())) {
-      if (child_accessible.Get() == this)
-        return index - 1;
-    }
-  }
-  return -1;
-}
-
 base::string16 AXPlatformNodeWin::GetHypertext() const {
   // Special case allows us to get text even in non-HTML case, e.g. browser UI.
   if (!GetDelegate()->IsWebContent()) {
diff --git a/ui/accessibility/platform/ax_platform_node_win.h b/ui/accessibility/platform/ax_platform_node_win.h
index bace4331..059f2f6 100644
--- a/ui/accessibility/platform/ax_platform_node_win.h
+++ b/ui/accessibility/platform/ax_platform_node_win.h
@@ -414,7 +414,6 @@
 
   // AXPlatformNodeBase overrides.
   void Destroy() override;
-  int GetIndexInParent() override;
   base::string16 GetValue() const override;
   base::string16 GetHypertext() const override;
 
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 1d67613b..619881d 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -1148,7 +1148,8 @@
   ComPtr<IAccessible2> right_iaccessible2 = ToIAccessible2(right_iaccessible);
 
   LONG index;
-  EXPECT_EQ(E_FAIL, root_iaccessible2->get_indexInParent(&index));
+  EXPECT_EQ(S_OK, root_iaccessible2->get_indexInParent(&index));
+  EXPECT_EQ(0, index);
 
   EXPECT_EQ(S_OK, left_iaccessible2->get_indexInParent(&index));
   EXPECT_EQ(0, index);
diff --git a/ui/android/java/res/color/blue_when_enabled.xml b/ui/android/java/res/color/blue_when_enabled.xml
index 8257553..6e098c1 100644
--- a/ui/android/java/res/color/blue_when_enabled.xml
+++ b/ui/android/java/res/color/blue_when_enabled.xml
@@ -4,6 +4,6 @@
      found in the LICENSE file.
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:color="@color/disabled_text_color_link" android:state_enabled="false" />
+    <item android:color="@color/default_text_color_link_disabled" android:state_enabled="false" />
     <item android:color="@color/default_text_color_link"/>
 </selector>
diff --git a/ui/android/java/res/color/chip_background_color.xml b/ui/android/java/res/color/chip_background_color.xml
index 59d3918..25bed75 100644
--- a/ui/android/java/res/color/chip_background_color.xml
+++ b/ui/android/java/res/color/chip_background_color.xml
@@ -5,26 +5,49 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- disabled -->
     <item android:color="@color/chip_background_color_disabled"
         android:state_enabled="false" />
-    <item android:alpha="@dimen/chip_background_selected_focused_alpha"
-        android:color="@color/filled_button_bg_color"
-        android:state_selected="true"
+
+    <!-- hover -->
+    <item android:alpha="@dimen/default_hovered_alpha"
+        android:color="@color/default_icon_color"
+        android:state_hovered="true"/>
+
+    <!-- focused -->
+    <item android:alpha="@dimen/default_focused_alpha"
+        android:color="@color/default_icon_color"
         android:state_focused="true" />
+
+    <!-- hover & focused -->
+    <item android:alpha="@dimen/default_focused_hovered_alpha"
+        android:color="@color/default_icon_color"
+        android:state_focused="true"
+        android:state_hovered="true" />
+
+    <!-- selected -->
     <item android:alpha="@dimen/chip_background_selected_alpha"
         android:color="@color/filled_button_bg_color"
         android:state_selected="true" />
-    <item android:alpha="@dimen/default_focused_alpha"
-        android:color="@color/modern_grey_800"
+
+    <!-- selected & hover -->
+    <item
+        android:color="@color/chip_selected_hover"
+        android:state_hovered="true"
+        android:state_selected="true" />
+
+    <!-- selected & focused -->
+    <item
+        android:color="@color/chip_selected_focused"
+        android:state_selected="true"
         android:state_focused="true" />
-    <item android:alpha="@dimen/chip_background_selected_hover_alpha"
-        android:color="@color/filled_button_bg_color"
-        android:state_focused="true"
-        android:state_hovered="true" />
-    <item android:alpha="@dimen/chip_background_selected_hover_focused_alpha"
-        android:color="@color/filled_button_bg_color"
+
+    <!-- selected & hover & focused -->
+    <item
+        android:color="@color/chip_selected_hover_and_focused"
         android:state_focused="true"
         android:state_hovered="true"
         android:state_selected="true" />
-    <item android:color="@android:color/transparent" />
+    <item android:color="@color/modern_primary_color" />
 </selector>
diff --git a/ui/android/java/res/color/chip_ripple_color.xml b/ui/android/java/res/color/chip_ripple_color.xml
index e25c9d9..abcbea9 100644
--- a/ui/android/java/res/color/chip_ripple_color.xml
+++ b/ui/android/java/res/color/chip_ripple_color.xml
@@ -8,12 +8,12 @@
     xmlns:tools="http://schemas.android.com/tools"
     tools:ignore="UnusedResources">
     <item android:alpha="@dimen/default_pressed_alpha"
-        android:color="@color/chip_ripple_color_default" android:state_pressed="true"/>
+        android:color="@color/default_chip_ripple_color" android:state_pressed="true"/>
     <item android:alpha="@dimen/default_focused_hovered_alpha"
-        android:color="@color/chip_ripple_color_default" android:state_focused="true" android:state_hovered="true"/>
+        android:color="@color/default_chip_ripple_color" android:state_focused="true" android:state_hovered="true"/>
     <item android:alpha="@dimen/default_focused_alpha"
-        android:color="@color/chip_ripple_color_default" android:state_focused="true"/>
+        android:color="@color/default_chip_ripple_color" android:state_focused="true"/>
     <item android:alpha="@dimen/default_hovered_alpha"
-        android:color="@color/chip_ripple_color_default" android:state_hovered="true"/>
-    <item android:color="@android:color/transparent" />
+        android:color="@color/default_chip_ripple_color" android:state_hovered="true"/>
+    <item android:color="@color/modern_primary_color" />
 </selector>
diff --git a/ui/android/java/res/color/chip_stroke_color.xml b/ui/android/java/res/color/chip_stroke_color.xml
index d48e9c6..6e1c352 100644
--- a/ui/android/java/res/color/chip_stroke_color.xml
+++ b/ui/android/java/res/color/chip_stroke_color.xml
@@ -8,5 +8,5 @@
     <item android:color="@color/hairline_stroke_color"
         android:state_enabled="true"
         android:state_selected="false" />
-    <item android:color="@android:color/transparent" />
+    <item android:color="@color/modern_primary_color" />
 </selector>
diff --git a/ui/android/java/res/color/filled_button_bg.xml b/ui/android/java/res/color/filled_button_bg.xml
index 44067c7..ea6867f 100644
--- a/ui/android/java/res/color/filled_button_bg.xml
+++ b/ui/android/java/res/color/filled_button_bg.xml
@@ -5,5 +5,8 @@
 -->
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:color="@color/filled_button_bg_color_disabled" android:state_enabled="false" />
+    <item android:color="@color/filled_button_focused" android:state_focused="true" />
+    <item android:color="@color/filled_button_hover" android:state_hovered="true" />
+    <item android:color="@color/filled_button_pressed" android:state_pressed="true" />
     <item android:color="@color/filled_button_bg_color"/>
 </selector>
diff --git a/ui/android/java/res/values-night/colors.xml b/ui/android/java/res/values-night/colors.xml
index d1744d0..f665281 100644
--- a/ui/android/java/res/values-night/colors.xml
+++ b/ui/android/java/res/values-night/colors.xml
@@ -10,14 +10,12 @@
     <color name="default_text_color_secondary">@color/default_text_color_secondary_light</color>
     <color name="default_text_color_tertiary">@color/default_text_color_tertiary_light</color>
     <color name="default_text_color_link">@color/default_text_color_link_light</color>
-    <color name="disabled_text_color_link">@color/modern_grey_300_alpha_38</color>
+    <color name="default_text_color_link_disabled">@color/default_text_color_link_disabled_light</color>
     <color name="default_text_color_error">@color/default_text_color_error_light</color>
 
     <!-- Common icon colors for drawables. -->
     <color name="default_icon_color">@color/default_icon_color_light</color>
-    <color name="default_icon_color_disabled">@color/default_icon_color_disabled_light</color>
     <color name="default_icon_color_inverse">@color/default_icon_color_dark</color>
-    <color name="default_icon_color_inverse_disabled">@color/default_icon_color_disabled_dark</color>
     <color name="default_icon_color_blue">@color/default_icon_color_blue_light</color>
     <color name="default_icon_color_secondary">@color/default_icon_color_secondary_light</color>
     <color name="hairline_stroke_color">@color/hairline_stroke_color_dark</color>
@@ -30,7 +28,7 @@
     <color name="default_bg_color_elev_2">@color/default_bg_color_dark_elev_2</color>
     <color name="default_bg_color_elev_3">@color/default_bg_color_dark_elev_3</color>
     <color name="default_bg_color_elev_4">@color/default_bg_color_dark_elev_4</color>
-    <color name="default_bg_color_blue">@color/modern_blue_300</color>
+    <color name="default_bg_color_blue">@color/default_bg_color_blue_light</color>
 
     <!-- Bottom sheet colors -->
     <color name="sheet_bg_color">@color/default_bg_color_dark_elev_4</color>
@@ -39,24 +37,36 @@
     <color name="snackbar_background_color">@color/default_bg_color_dark_elev_4</color>
 
     <!-- Ripple colors for clickable widgets -->
-    <color name="ripple_color_blue">@color/modern_blue_300</color>
+    <color name="ripple_color_blue">@color/ripple_color_blue_light</color>
 
     <!-- Chip colors -->
-    <color name="chip_text_color_selected">@color/default_text_color_dark</color>
-    <color name="chip_background_color_disabled">@color/modern_grey_300_alpha_38</color>
-    <color name="chip_ripple_color_default">@android:color/white</color>
+    <color name="chip_text_color_selected">@color/chip_text_color_selected_dark</color>
+    <color name="chip_background_color_disabled">@color/chip_background_color_disabled_light</color>
+    <color name="default_chip_ripple_color">@color/default_chip_ripple_color_light</color>
     <color name="default_chip_outline_color">@color/default_chip_outline_color_dark</color>
+    <color name="chip_selected_hover">@color/chip_selected_hover_light</color>
+    <color name="chip_selected_focused">@color/chip_selected_focused_light</color>
+    <color name="chip_selected_hover_and_focused">@color/chip_selected_hover_and_focused_light</color>
 
     <!-- CircularProgressView colors -->
-    <color name="circular_progress_inner_background_color_small">@color/modern_blue_300</color>
-    <color name="circular_progress_outer_circle_background_color_small">@color/modern_grey_800</color>
-    <color name="circular_progress_outer_circle_progress_color_small">@color/modern_blue_300</color>
-    <color name="circular_progress_icon_color_small_large">@color/modern_grey_800</color>
+    <color name="circular_progress_inner_background_color_small">
+        @color/circular_progress_inner_background_color_small_dark
+    </color>
+    <color name="circular_progress_outer_circle_background_color_small">
+        @color/circular_progress_outer_circle_background_color_small_dark
+    </color>
+    <color name="circular_progress_outer_circle_progress_color_small">
+        @color/circular_progress_outer_circle_progress_color_small_dark
+    </color>
+    <color name="circular_progress_icon_color_small_large">
+        @color/circular_progress_icon_color_small_large_dark
+    </color>
 
     <!-- Other colors -->
     <color name="default_red">@color/default_red_light</color>
     <color name="default_green">@color/default_green_light</color>
     <color name="filled_button_bg_color">@color/filled_button_bg_color_light</color>
-    <color name="filled_button_bg_color_disabled">@color/modern_grey_300_alpha_38</color>
-    <color name="divider_bg_color">@color/divider_bg_color_light</color>
+    <color name="filled_button_bg_color_disabled">@color/filled_button_bg_color_disabled_light</color>
+    <color name="divider_line_bg_color">@color/divider_line_bg_color_light</color>
+    <color name="omnibox_bg_color">@color/omnibox_bg_color_dark</color>
 </resources>
diff --git a/ui/android/java/res/values-night/dimens.xml b/ui/android/java/res/values-night/dimens.xml
index 30704a7..32b783b 100644
--- a/ui/android/java/res/values-night/dimens.xml
+++ b/ui/android/java/res/values-night/dimens.xml
@@ -4,8 +4,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file.
 -->
-<resources xmlns:tools="http://schemas.android.com/tools">
+<resources>
     <!-- Chips default measures -->
-    <item name="chip_background_selected_focused_alpha" format="float" type="dimen">1</item>
-    <item name="chip_background_selected_alpha" format="float" type="dimen">1</item>
+    <dimen name="chip_background_selected_alpha">@dimen/chip_background_selected_alpha_dark</dimen>
 </resources>
diff --git a/ui/android/java/res/values/color_palette.xml b/ui/android/java/res/values/color_palette.xml
index 25bdcdb..7d3d85c 100644
--- a/ui/android/java/res/values/color_palette.xml
+++ b/ui/android/java/res/values/color_palette.xml
@@ -12,6 +12,7 @@
     <color name="modern_blue_300_alpha_55" tools:ignore="UnusedResources">#5A7198</color>
     <color name="modern_blue_600">#1A73E8</color>
     <color name="modern_blue_600_alpha_10" tools:ignore="UnusedResources">#191A73E8</color>
+    <color name="modern_blue_600_alpha_12">#1F1A73E8</color>
     <color name="modern_blue_600_alpha_65" tools:ignore="UnusedResources">#6AA4F0</color>
     <color name="modern_blue_700">#3367D6</color>
     <color name="modern_blue_800" tools:ignore="UnusedResources">#185ABC</color>
diff --git a/ui/android/java/res/values/dimens.xml b/ui/android/java/res/values/dimens.xml
index 2bdd147f..a7061bc 100644
--- a/ui/android/java/res/values/dimens.xml
+++ b/ui/android/java/res/values/dimens.xml
@@ -22,6 +22,9 @@
     <item name="default_focused_hovered_alpha" format="float" type="dimen">0.06</item>
     <item name="default_focused_alpha" format="float" type="dimen">0.06</item>
     <item name="default_hovered_alpha" format="float" type="dimen">0.04</item>
+    <item name="default_icon_pressed_alpha" format="float" type="dimen" tools:ignore="UnusedResources">
+        0.50
+    </item>
 
     <!-- Minimum height/width for a touchable item -->
     <dimen name="min_touch_target_size">48dp</dimen>
@@ -31,16 +34,16 @@
     <dimen name="button_bg_vertical_inset">6dp</dimen>
 
     <!-- Chips default measures -->
+    <item name="chip_background_selected_alpha_light" format="float" type="dimen">0.06</item>
+    <item name="chip_background_selected_alpha_dark" format="float" type="dimen">1</item>
+
     <dimen name="chip_border_width">1dp</dimen>
     <dimen name="chip_corner_radius">8dp</dimen>
     <dimen name="chip_default_height">32dp</dimen>
     <dimen name="chip_end_padding">16dp</dimen>
     <dimen name="chip_element_leading_padding">8dp</dimen>
     <dimen name="chip_bg_vertical_inset">8dp</dimen>
-    <item name="chip_background_selected_focused_alpha" format="float" type="dimen">0.12</item>
-    <item name="chip_background_selected_alpha" format="float" type="dimen">0.06</item>
-    <item name="chip_background_selected_hover_alpha" format="float" type="dimen">0.10</item>
-    <item name="chip_background_selected_hover_focused_alpha" format="float" type="dimen">0.12</item>
+    <dimen name="chip_background_selected_alpha">@dimen/chip_background_selected_alpha_light</dimen>
     <dimen name="chip_icon_size">20dp</dimen>
 
     <!-- Dropdown default measures -->
diff --git a/ui/android/java/res/values/semantic_colors.xml b/ui/android/java/res/values/semantic_colors.xml
deleted file mode 100644
index 49f6f01..0000000
--- a/ui/android/java/res/values/semantic_colors.xml
+++ /dev/null
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2019 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.
--->
-<resources xmlns:tools="http://schemas.android.com/tools">
-    <!-- Semantic color references that don't change on night mode. -->
-    <!-- Common icon colors for drawables. -->
-    <color name="default_icon_color_dark">@color/modern_grey_800</color>
-    <color name="default_icon_color_disabled_dark">@color/modern_grey_800_alpha_38</color>
-    <color name="default_icon_color_light" tools:ignore="UnusedResources">
-        @color/modern_white
-    </color>
-    <color name="default_icon_color_disabled_light" tools:ignore="UnusedResources">
-        @color/white_alpha_38
-    </color>
-    <color name="default_icon_color_pressed_light" tools:ignore="UnusedResources">
-        @color/white_alpha_50
-    </color>
-    <color name="default_icon_color_secondary_dark">@color/modern_grey_600</color>
-    <color name="default_icon_color_secondary_light">@color/white_alpha_70</color>
-    <color name="default_icon_color_blue_light">@color/modern_blue_300</color>
-    <color name="default_icon_color_blue_dark">@color/modern_blue_600</color>
-
-    <!-- Common text colors -->
-    <color name="default_text_color_dark">@color/modern_grey_900</color>
-    <color name="default_text_color_light">@color/modern_white</color>
-    <color name="default_text_color_secondary_dark">@color/modern_grey_700</color>
-    <color name="default_text_color_secondary_light">@color/white_alpha_70</color>
-    <color name="default_text_color_tertiary_light">@color/white_alpha_50</color>
-    <color name="default_text_color_tertiary_dark">@color/modern_grey_900_alpha_38</color>
-    <color name="default_text_color_link_dark">@color/modern_blue_600</color>
-    <color name="default_text_color_link_light">@color/modern_blue_300</color>
-    <color name="default_text_color_error_light">@color/google_red_300</color>
-    <color name="default_text_color_error_dark">@color/google_red_600</color>
-
-    <color name="default_red_light" tools:ignore="UnusedResources">@color/google_red_300</color>
-    <color name="default_red_dark" tools:ignore="UnusedResources">@color/google_red_600</color>
-
-    <color name="default_green_light" tools:ignore="UnusedResources">@color/google_green_300</color>
-    <color name="default_green_dark" tools:ignore="UnusedResources">@color/google_green_600</color>
-
-    <!-- Common background colors. -->
-    <color name="default_bg_color_light">@color/modern_white</color>
-    <color name="default_bg_color_dark">@color/modern_grey_900</color>
-    <color name="default_bg_color_dark_elev_1" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_grey_200_alpha_5
-    </color>
-    <color name="default_bg_color_dark_elev_2" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_grey_200_alpha_8
-    </color>
-    <color name="default_bg_color_dark_elev_3" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_grey_200_alpha_11
-    </color>
-    <color name="default_bg_color_dark_elev_4" tools:ignore="UnusedResources">
-        @color/modern_grey_900_with_grey_200_alpha_12
-    </color>
-    <color name="divider_bg_color_dark">@color/modern_grey_300</color>
-    <color name="divider_bg_color_light">@color/white_alpha_12</color>
-
-    <!-- Chip Colors -->
-    <color name="default_chip_outline_color_light">@color/modern_grey_300</color>
-    <color name="default_chip_outline_color_dark">@color/modern_grey_700</color>
-
-    <!-- Colors used for Widgets (checkboxes, switches, buttons, etc)-->
-    <color name="control_active_color_light" tools:ignore="UnusedResources">@color/modern_blue_600</color>
-    <color name="control_active_color_dark" tools:ignore="UnusedResources">@color/modern_blue_300</color>
-    <color name="control_normal_color_light" tools:ignore="UnusedResources">@color/modern_grey_700</color>
-    <color name="control_normal_color_dark" tools:ignore="UnusedResources">@color/modern_grey_500</color>
-    <color name="control_highlight_color_light" tools:ignore="UnusedResources">
-        @color/modern_grey_800_alpha_38
-    </color>
-    <color name="control_highlight_color_dark" tools:ignore="UnusedResources">@color/white_alpha_12</color>
-
-    <!--  Others  -->
-    <color name="filled_button_bg_color_dark">@color/modern_blue_600</color>
-    <color name="filled_button_bg_color_light">@color/modern_blue_300</color>
-
-    <!-- Illustration only -->
-    <color name="ntp_incognito_icon_color" tools:ignore="UnusedResources">@color/modern_grey_300</color>
-</resources>
diff --git a/ui/android/java/res/values/colors.xml b/ui/android/java/res/values/semantic_colors_adaptive.xml
similarity index 76%
rename from ui/android/java/res/values/colors.xml
rename to ui/android/java/res/values/semantic_colors_adaptive.xml
index 32d3b902..2786e21 100644
--- a/ui/android/java/res/values/colors.xml
+++ b/ui/android/java/res/values/semantic_colors_adaptive.xml
@@ -17,22 +17,16 @@
     <color name="default_text_color_blue" tools:ignore="UnusedResources">@color/default_text_color_link</color>
     <!-- Text color for clickable text. -->
     <color name="default_text_color_link">@color/default_text_color_link_dark</color>
-    <color name="disabled_text_color_link">@color/modern_grey_800_alpha_38</color>
+    <color name="default_text_color_link_disabled">@color/default_text_color_link_disabled_dark</color>
     <color name="default_text_color_error">@color/default_text_color_error_dark</color>
 
     <!-- Common icon colors for drawables. -->
     <color name="default_icon_color" tools:ignore="UnusedResources">
         @color/default_icon_color_dark
     </color>
-    <color name="default_icon_color_disabled" tools:ignore="UnusedResources">
-        @color/default_icon_color_disabled_dark
-    </color>
     <color name="default_icon_color_inverse" tools:ignore="UnusedResources">
         @color/default_icon_color_light
     </color>
-    <color name="default_icon_color_inverse_disabled" tools:ignore="UnusedResources">
-        @color/default_icon_color_disabled_light
-    </color>
     <color name="default_icon_color_blue" tools:ignore="UnusedResources">
         @color/default_icon_color_blue_dark
     </color>
@@ -46,12 +40,7 @@
     <color name="modern_primary_color" tools:ignore="UnusedResources">@color/default_bg_color_light</color>
     <color name="modern_secondary_color" tools:ignore="UnusedResources">@color/modern_grey_100</color>
 
-    <color name="default_bg_color_blue" tools:ignore="UnusedResources">@color/modern_blue_600</color>
-
-    <!-- Dark background and branding color. -->
-    <color name="dark_primary_color" tools:ignore="UnusedResources">
-        @color/modern_grey_900
-    </color>
+    <color name="default_bg_color_blue" tools:ignore="UnusedResources">@color/default_bg_color_blue_dark</color>
 
     <!-- TODO(huayinz): Introduce a semantic bg reference for modern_grey_100. -->
     <!-- Background colors that are used to show layers and their relative elevation. In light mode,
@@ -74,9 +63,6 @@
     <!-- Popup colors -->
     <color name="popup_bg_color">@color/default_bg_color_elev_4</color>
 
-    <color name="dropdown_divider_color">#E5E5E5</color>
-    <color name="dropdown_dark_divider_color">#C0C0C0</color>
-
     <!-- Snackbar colors -->
     <color name="snackbar_background_color">@color/modern_primary_color</color>
 
@@ -87,27 +73,38 @@
     <color name="sheet_bg_color" tools:ignore="UnusedResources">@color/modern_primary_color</color>
 
     <!-- Ripple colors for clickable widgets -->
-    <color name="ripple_color_blue">@color/modern_blue_600</color>
+    <color name="ripple_color_blue">@color/ripple_color_blue_dark</color>
 
     <!-- Chip colors -->
     <color name="default_chip_assistive_text_color">@color/default_text_color</color>
-    <color name="chip_text_color_selected">@color/modern_blue_700</color>
+    <color name="chip_text_color_selected">@color/chip_text_color_selected_light</color>
     <color name="default_chip_assistive_text_color_secondary">@color/default_text_color_secondary</color>
-    <color name="chip_background_color_disabled">@color/modern_grey_100_alpha_38</color>
-    <color name="chip_ripple_color_default">@color/modern_grey_800</color>
+    <color name="chip_background_color_disabled">@color/chip_background_color_disabled_dark</color>
+    <color name="default_chip_ripple_color">@color/default_chip_ripple_color_dark</color>
     <color name="default_chip_outline_color" tools:ignore="UnusedResources">@color/default_chip_outline_color_light</color>
+    <color name="chip_selected_hover">@color/chip_selected_hover_dark</color>
+    <color name="chip_selected_focused">@color/chip_selected_focused_dark</color>
+    <color name="chip_selected_hover_and_focused">@color/chip_selected_hover_and_focused_dark</color>
 
     <!-- CircularProgressView colors -->
-    <color name="circular_progress_inner_background_color_small" tools:ignore="UnusedResources">@color/modern_grey_300</color>
-    <color name="circular_progress_outer_circle_background_color_small" tools:ignore="UnusedResources">@color/modern_grey_300</color>
-    <color name="circular_progress_outer_circle_progress_color_small" tools:ignore="UnusedResources">@color/modern_grey_800</color>
-    <color name="circular_progress_icon_color_small_large" tools:ignore="UnusedResources">@color/default_icon_color</color>
+    <color name="circular_progress_inner_background_color_small" tools:ignore="UnusedResources">
+        @color/circular_progress_inner_background_color_small_light
+    </color>
+    <color name="circular_progress_outer_circle_background_color_small" tools:ignore="UnusedResources">
+        @color/circular_progress_outer_circle_background_color_small_light
+    </color>
+    <color name="circular_progress_outer_circle_progress_color_small" tools:ignore="UnusedResources">
+        @color/circular_progress_outer_circle_progress_color_small_light
+    </color>
+    <color name="circular_progress_icon_color_small_large" tools:ignore="UnusedResources">
+        @color/circular_progress_icon_color_small_large_light
+    </color>
 
     <!-- Other colors -->
     <color name="default_red" tools:ignore="UnusedResources">@color/default_red_dark</color>
     <color name="default_green" tools:ignore="UnusedResources">@color/default_green_dark</color>
     <color name="filled_button_bg_color">@color/filled_button_bg_color_dark</color>
-    <color name="filled_button_bg_color_disabled">@color/modern_grey_800_alpha_38</color>
-    <color name="divider_bg_color" tools:ignore="UnusedResources">@color/divider_bg_color_dark</color>
-    <color name="drag_handlebar_color">#D9DBDF</color>
+    <color name="filled_button_bg_color_disabled">@color/filled_button_bg_color_disabled_dark</color>
+    <color name="divider_line_bg_color" tools:ignore="UnusedResources">@color/divider_line_bg_color_dark</color>
+    <color name="omnibox_bg_color" tools:ignore="UnusedResources">@color/omnibox_bg_color_light</color>
 </resources>
diff --git a/ui/android/java/res/values/semantic_colors_non_adaptive.xml b/ui/android/java/res/values/semantic_colors_non_adaptive.xml
new file mode 100644
index 0000000..d5c8410e
--- /dev/null
+++ b/ui/android/java/res/values/semantic_colors_non_adaptive.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 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.
+-->
+<resources xmlns:tools="http://schemas.android.com/tools">
+    <!-- Semantic color references that don't change on night mode. -->
+    <!-- Common icon colors for drawables. -->
+    <color name="default_icon_color_dark">@color/modern_grey_800</color>
+    <color name="default_icon_color_light" tools:ignore="UnusedResources">
+        @color/modern_white
+    </color>
+    <color name="default_icon_color_secondary_dark">@color/modern_grey_600</color>
+    <color name="default_icon_color_secondary_light">@color/white_alpha_70</color>
+    <color name="default_icon_color_blue_light">@color/modern_blue_300</color>
+    <color name="default_icon_color_blue_dark">@color/modern_blue_600</color>
+
+    <!-- Common text colors -->
+    <color name="default_text_color_dark">@color/modern_grey_900</color>
+    <color name="default_text_color_light">@color/modern_white</color>
+    <color name="default_text_color_secondary_dark">@color/modern_grey_700</color>
+    <color name="default_text_color_secondary_light">@color/white_alpha_70</color>
+    <color name="default_text_color_tertiary_light">@color/white_alpha_50</color>
+    <color name="default_text_color_tertiary_dark">@color/modern_grey_900_alpha_38</color>
+    <color name="default_text_color_link_dark">@color/modern_blue_600</color>
+    <color name="default_text_color_link_light">@color/modern_blue_300</color>
+    <color name="default_text_color_error_light">@color/google_red_300</color>
+    <color name="default_text_color_error_dark">@color/google_red_600</color>
+    <color name="default_text_color_link_disabled_light">@color/modern_grey_300_alpha_38</color>
+    <color name="default_text_color_link_disabled_dark">@color/modern_grey_800_alpha_38</color>
+
+    <color name="default_red_light" tools:ignore="UnusedResources">@color/google_red_300</color>
+    <color name="default_red_dark" tools:ignore="UnusedResources">@color/google_red_600</color>
+
+    <color name="default_green_light" tools:ignore="UnusedResources">@color/google_green_300</color>
+    <color name="default_green_dark" tools:ignore="UnusedResources">@color/google_green_600</color>
+
+    <!-- Common background colors. -->
+    <color name="default_bg_color_light">@color/modern_white</color>
+    <color name="default_bg_color_dark">@color/modern_grey_900</color>
+    <color name="default_bg_color_dark_elev_1" tools:ignore="UnusedResources">
+        @color/modern_grey_900_with_grey_200_alpha_5
+    </color>
+    <color name="default_bg_color_dark_elev_2" tools:ignore="UnusedResources">
+        @color/modern_grey_900_with_grey_200_alpha_8
+    </color>
+    <color name="default_bg_color_dark_elev_3" tools:ignore="UnusedResources">
+        @color/modern_grey_900_with_grey_200_alpha_11
+    </color>
+    <color name="default_bg_color_dark_elev_4" tools:ignore="UnusedResources">
+        @color/modern_grey_900_with_grey_200_alpha_12
+    </color>
+    <color name="divider_line_bg_color_dark">@color/modern_grey_300</color>
+    <color name="divider_line_bg_color_light">@color/white_alpha_12</color>
+    <color name="default_bg_color_blue_dark">@color/modern_blue_600</color>
+    <color name="default_bg_color_blue_light">@color/modern_blue_300</color>
+
+    <!-- Chip Colors -->
+    <color name="default_chip_outline_color_light">@color/modern_grey_300</color>
+    <color name="default_chip_outline_color_dark">@color/modern_grey_700</color>
+    <color name="chip_background_color_disabled_dark">@color/modern_grey_100_alpha_38</color>
+    <color name="chip_background_color_disabled_light">@color/white_alpha_38</color>
+    <color name="chip_text_color_selected_light">@color/modern_blue_700</color>
+    <color name="chip_text_color_selected_dark">@color/modern_grey_900</color>
+    <color name="default_chip_ripple_color_dark">@color/modern_grey_800</color>
+    <color name="default_chip_ripple_color_light">@color/modern_white</color>
+    <color name="chip_selected_hover_light">@color/white_alpha_8</color>
+    <color name="chip_selected_hover_dark">@color/modern_blue_600_alpha_10</color>
+    <color name="chip_selected_focused_light">@color/white_alpha_24</color>
+    <color name="chip_selected_focused_dark">@color/modern_blue_600_alpha_12</color>
+    <color name="chip_selected_hover_and_focused_light">@color/white_alpha_24</color>
+    <color name="chip_selected_hover_and_focused_dark">@color/modern_blue_600_alpha_12</color>
+
+    <!-- Colors used for Widgets (checkboxes, switches, buttons, etc)-->
+    <color name="default_control_color_active_light" tools:ignore="UnusedResources">@color/modern_blue_600</color>
+    <color name="default_control_color_active_dark" tools:ignore="UnusedResources">@color/modern_blue_300</color>
+    <color name="default_control_color_normal_light" tools:ignore="UnusedResources">@color/modern_grey_700</color>
+    <color name="default_control_color_normal_dark" tools:ignore="UnusedResources">@color/modern_grey_500</color>
+    <color name="default_control_color_highlight_light" tools:ignore="UnusedResources">
+        @color/modern_grey_800_alpha_38
+    </color>
+    <color name="default_control_color_highlight_dark" tools:ignore="UnusedResources">@color/white_alpha_12</color>
+
+    <!--  Filled Button  -->
+    <color name="filled_button_bg_color_dark">@color/modern_blue_600</color>
+    <color name="filled_button_bg_color_light">@color/modern_blue_300</color>
+    <color name="filled_button_bg_color_disabled_dark">@color/modern_grey_800_alpha_38</color>
+    <color name="filled_button_bg_color_disabled_light">@color/white_alpha_38</color>
+    <color name="filled_button_hover">@color/white_alpha_8</color>
+    <color name="filled_button_focused">@color/white_alpha_24</color>
+    <color name="filled_button_pressed">@color/white_alpha_32</color>
+
+    <!--  Dropdown divier  -->
+    <color name="dropdown_divider_color">@color/modern_grey_300</color>
+    <color name="dropdown_dark_divider_color">@color/white_alpha_12</color>
+
+    <!-- CircularProgressView colors -->
+    <color name="circular_progress_inner_background_color_small_light">@color/modern_grey_300</color>
+    <color name="circular_progress_inner_background_color_small_dark">@color/modern_blue_300</color>
+    <color name="circular_progress_outer_circle_background_color_small_light">@color/modern_grey_300</color>
+    <color name="circular_progress_outer_circle_background_color_small_dark">@color/modern_grey_800</color>
+    <color name="circular_progress_outer_circle_progress_color_small_light">@color/modern_grey_300</color>
+    <color name="circular_progress_outer_circle_progress_color_small_dark">@color/modern_blue_300</color>
+    <color name="circular_progress_icon_color_small_large_light">@color/modern_grey_800</color>
+    <color name="circular_progress_icon_color_small_large_dark">@color/modern_grey_800</color>
+
+    <!-- Ripple Colors -->
+    <color name="ripple_color_blue_dark">@color/modern_blue_600</color>
+    <color name="ripple_color_blue_light">@color/modern_blue_300</color>
+
+    <!-- Illustration -->
+    <color name="ntp_incognito_icon_color" tools:ignore="UnusedResources">@color/modern_grey_300</color>
+    <color name="drag_handlebar_color">@color/modern_grey_300</color>
+
+    <!-- Omnibox bg color -->
+    <color name="omnibox_bg_color_light" tools:ignore="UnusedResources">@color/modern_grey_100</color>
+    <color name="omnibox_bg_color_dark" tools:ignore="UnusedResources">@color/modern_grey_800</color>
+    <color name="omnibox_bg_color_incognito" tools:ignore="UnusedResources">@color/black_alpha_38</color>
+</resources>
diff --git a/ui/display/win/screen_win.cc b/ui/display/win/screen_win.cc
index 5899271..73625f9a 100644
--- a/ui/display/win/screen_win.cc
+++ b/ui/display/win/screen_win.cc
@@ -82,44 +82,47 @@
   return scale_factor;
 }
 
-bool GetPathInfo(HMONITOR monitor, DISPLAYCONFIG_PATH_INFO* path_info) {
-  // Get the monitor name.
-  MONITORINFOEX monitor_info;
-  monitor_info.cbSize = sizeof(monitor_info);
-  if (!GetMonitorInfo(monitor, &monitor_info))
-    return false;
-
-  // Get all path infos.
+std::vector<DISPLAYCONFIG_PATH_INFO> GetPathInfos() {
   LONG result;
   std::vector<DISPLAYCONFIG_PATH_INFO> path_infos;
   do {
     uint32_t path_elements, mode_elements;
     if (GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &path_elements,
                                     &mode_elements) != ERROR_SUCCESS) {
-      return false;
+      return {};
     }
     path_infos.resize(path_elements);
     std::vector<DISPLAYCONFIG_MODE_INFO> mode_infos(mode_elements);
     result = QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &path_elements,
                                 path_infos.data(), &mode_elements,
                                 mode_infos.data(), nullptr);
-    if (result == ERROR_SUCCESS)
+    if (result == ERROR_SUCCESS) {
       path_infos.resize(path_elements);
+      return path_infos;
+    }
   } while (result == ERROR_INSUFFICIENT_BUFFER);
+  return {};
+}
+
+bool GetPathInfo(HMONITOR monitor, DISPLAYCONFIG_PATH_INFO* path_info) {
+  // Get the monitor name.
+  MONITORINFOEX monitor_info = {};
+  monitor_info.cbSize = sizeof(monitor_info);
+  if (!GetMonitorInfo(monitor, &monitor_info))
+    return false;
 
   // Look for a path info with a matching name.
-  if (result == ERROR_SUCCESS) {
-    for (const auto& info : path_infos) {
-      DISPLAYCONFIG_SOURCE_DEVICE_NAME device_name = {};
-      device_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
-      device_name.header.size = sizeof(device_name);
-      device_name.header.adapterId = info.sourceInfo.adapterId;
-      device_name.header.id = info.sourceInfo.id;
-      if ((DisplayConfigGetDeviceInfo(&device_name.header) == ERROR_SUCCESS) &&
-          (wcscmp(monitor_info.szDevice, device_name.viewGdiDeviceName) == 0)) {
-        *path_info = info;
-        return true;
-      }
+  std::vector<DISPLAYCONFIG_PATH_INFO> path_infos = GetPathInfos();
+  for (const auto& info : path_infos) {
+    DISPLAYCONFIG_SOURCE_DEVICE_NAME device_name = {};
+    device_name.header.type = DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME;
+    device_name.header.size = sizeof(device_name);
+    device_name.header.adapterId = info.sourceInfo.adapterId;
+    device_name.header.id = info.sourceInfo.id;
+    if ((DisplayConfigGetDeviceInfo(&device_name.header) == ERROR_SUCCESS) &&
+        (wcscmp(monitor_info.szDevice, device_name.viewGdiDeviceName) == 0)) {
+      *path_info = info;
+      return true;
     }
   }
   return false;
@@ -139,6 +142,22 @@
   return 200.0f;
 }
 
+Display::Rotation OrientationToRotation(DWORD orientation) {
+  switch (orientation) {
+    case DMDO_DEFAULT:
+      return Display::ROTATE_0;
+    case DMDO_90:
+      return Display::ROTATE_90;
+    case DMDO_180:
+      return Display::ROTATE_180;
+    case DMDO_270:
+      return Display::ROTATE_270;
+    default:
+      NOTREACHED();
+      return Display::ROTATE_0;
+  }
+}
+
 void GetDisplaySettingsForDevice(const wchar_t* device_name,
                                  Display::Rotation* rotation,
                                  int* frequency) {
@@ -148,22 +167,7 @@
   mode.dmSize = sizeof(mode);
   if (!::EnumDisplaySettings(device_name, ENUM_CURRENT_SETTINGS, &mode))
     return;
-  switch (mode.dmDisplayOrientation) {
-    case DMDO_DEFAULT:
-      *rotation = Display::ROTATE_0;
-      break;
-    case DMDO_90:
-      *rotation = Display::ROTATE_90;
-      break;
-    case DMDO_180:
-      *rotation = Display::ROTATE_180;
-      break;
-    case DMDO_270:
-      *rotation = Display::ROTATE_270;
-      break;
-    default:
-      NOTREACHED();
-  }
+  *rotation = OrientationToRotation(mode.dmDisplayOrientation);
   *frequency = mode.dmDisplayFrequency;
 }
 
@@ -181,6 +185,52 @@
   return touching_display_infos;
 }
 
+void ConfigureColorSpacesForHdr(float sdr_white_level,
+                                gfx::DisplayColorSpaces* color_spaces) {
+  color_spaces->SetSDRWhiteLevel(sdr_white_level);
+
+  // This will map to DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 with
+  // DXGI_FORMAT_B8G8R8A8_UNORM.
+  const auto srgb = gfx::ColorSpace::CreateSRGB();
+
+  // This will map to DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709. In that space,
+  // the brightness of (1,1,1) is 80 nits.
+  constexpr float kScrgbWhiteLevel = 80.0f;
+  const auto scrgb_linear =
+      gfx::ColorSpace::CreateSCRGBLinear(kScrgbWhiteLevel / sdr_white_level);
+
+  // This will map to DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, with sRGB's
+  // (1,1,1) mapping to the specified number of nits.
+  const auto hdr10 = gfx::ColorSpace::CreateHDR10(sdr_white_level);
+
+  // For sRGB content, use 8-bit formats.
+  constexpr bool kNeedsAlpha = true;
+  color_spaces->SetOutputColorSpaceAndBufferFormat(
+      gfx::ContentColorUsage::kSRGB, !kNeedsAlpha, srgb,
+      gfx::BufferFormat::BGRX_8888);
+  color_spaces->SetOutputColorSpaceAndBufferFormat(
+      gfx::ContentColorUsage::kSRGB, kNeedsAlpha, srgb,
+      gfx::BufferFormat::BGRA_8888);
+
+  // Use HDR color spaces only when there is WCG or HDR content on the screen.
+  for (const auto& usage : {gfx::ContentColorUsage::kWideColorGamut,
+                            gfx::ContentColorUsage::kHDR}) {
+    // Using RGBA F16 backbuffers required by SCRGB linear causes stuttering on
+    // Windows RS3, but RGB10A2 with HDR10 color space works fine (see
+    // https://crbug.com/937108#c92).
+    if (base::win::GetVersion() > base::win::Version::WIN10_RS3) {
+      color_spaces->SetOutputColorSpaceAndBufferFormat(
+          usage, !kNeedsAlpha, scrgb_linear, gfx::BufferFormat::RGBA_F16);
+    } else {
+      color_spaces->SetOutputColorSpaceAndBufferFormat(
+          usage, !kNeedsAlpha, hdr10, gfx::BufferFormat::BGRA_1010102);
+    }
+    // Use RGBA F16 backbuffers for HDR if alpha channel is required.
+    color_spaces->SetOutputColorSpaceAndBufferFormat(
+        usage, kNeedsAlpha, scrgb_linear, gfx::BufferFormat::RGBA_F16);
+  }
+}
+
 Display CreateDisplayFromDisplayInfo(const DisplayInfo& display_info,
                                      ColorProfileReader* color_profile_reader,
                                      bool hdr_enabled) {
@@ -202,50 +252,7 @@
     color_spaces.SetOutputBufferFormats(gfx::BufferFormat::BGRX_8888,
                                         gfx::BufferFormat::BGRA_8888);
   } else if (hdr_enabled) {
-    const float sdr_white_level = display_info.sdr_white_level();
-    color_spaces.SetSDRWhiteLevel(sdr_white_level);
-
-    // This will map to DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 with
-    // DXGI_FORMAT_B8G8R8A8_UNORM.
-    const auto srgb = gfx::ColorSpace::CreateSRGB();
-
-    // This will map to DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709. In that
-    // space, the brightness of (1,1,1) is 80 nits.
-    constexpr float kScrgbWhiteLevel = 80.0f;
-    const auto scrgb_linear =
-        gfx::ColorSpace::CreateSCRGBLinear(kScrgbWhiteLevel / sdr_white_level);
-
-    // This will map to DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020, with
-    // sRGB's (1,1,1) mapping to the specified number of nits.
-    const auto hdr10 = gfx::ColorSpace::CreateHDR10(sdr_white_level);
-
-    // For sRGB content, use 8-bit formats.
-    constexpr bool kNeedsAlpha = true;
-    color_spaces.SetOutputColorSpaceAndBufferFormat(
-        gfx::ContentColorUsage::kSRGB, !kNeedsAlpha, srgb,
-        gfx::BufferFormat::BGRX_8888);
-    color_spaces.SetOutputColorSpaceAndBufferFormat(
-        gfx::ContentColorUsage::kSRGB, kNeedsAlpha, srgb,
-        gfx::BufferFormat::BGRA_8888);
-
-    // Use HDR color spaces only when there is WCG or HDR content on the
-    // screen.
-    for (const auto& usage : {gfx::ContentColorUsage::kWideColorGamut,
-                              gfx::ContentColorUsage::kHDR}) {
-      // Using RGBA F16 backbuffers required by SCRGB linear causes
-      // stuttering on Windows RS3, but RGB10A2 with HDR10 color space works
-      // fine (see https://crbug.com/937108#c92).
-      if (base::win::GetVersion() > base::win::Version::WIN10_RS3) {
-        color_spaces.SetOutputColorSpaceAndBufferFormat(
-            usage, !kNeedsAlpha, scrgb_linear, gfx::BufferFormat::RGBA_F16);
-      } else {
-        color_spaces.SetOutputColorSpaceAndBufferFormat(
-            usage, !kNeedsAlpha, hdr10, gfx::BufferFormat::BGRA_1010102);
-      }
-      // Use RGBA F16 backbuffers for HDR if alpha channel is required.
-      color_spaces.SetOutputColorSpaceAndBufferFormat(
-          usage, kNeedsAlpha, scrgb_linear, gfx::BufferFormat::RGBA_F16);
-    }
+    ConfigureColorSpacesForHdr(display_info.sdr_white_level(), &color_spaces);
 
     // These are (ab)used by pages via media query APIs to detect HDR support.
     display.set_color_depth(Display::kHDR10BitsPerPixel);
@@ -359,17 +366,8 @@
   return gfx::Vector2dF(default_dpi, default_dpi);
 }
 
-BOOL CALLBACK EnumMonitorForDisplayInfoCallback(HMONITOR monitor,
-                                                HDC hdc,
-                                                LPRECT rect,
-                                                LPARAM data) {
-  const MONITORINFOEX monitor_info = MonitorInfoFromHMONITOR(monitor);
-  Display::Rotation rotation;
-  int display_frequency;
-  GetDisplaySettingsForDevice(monitor_info.szDevice, &rotation,
-                              &display_frequency);
-
-  // Retrieve PPI for |monitor| based on touch pointer device handles.
+// Retrieve PPI for |monitor| based on touch pointer device handles.
+gfx::Vector2dF GetMonitorPixelsPerInch(HMONITOR monitor) {
   static const auto get_pointer_devices =
       reinterpret_cast<decltype(&::GetPointerDevices)>(
           base::win::GetUser32FunctionPointer("GetPointerDevices"));
@@ -390,6 +388,19 @@
       }
     }
   }
+  return pixels_per_inch;
+}
+
+BOOL CALLBACK EnumMonitorForDisplayInfoCallback(HMONITOR monitor,
+                                                HDC hdc,
+                                                LPRECT rect,
+                                                LPARAM data) {
+  const MONITORINFOEX monitor_info = MonitorInfoFromHMONITOR(monitor);
+  Display::Rotation rotation;
+  int display_frequency;
+  GetDisplaySettingsForDevice(monitor_info.szDevice, &rotation,
+                              &display_frequency);
+  gfx::Vector2dF pixels_per_inch = GetMonitorPixelsPerInch(monitor);
 
   auto* display_infos = reinterpret_cast<std::vector<DisplayInfo>*>(data);
   DCHECK(display_infos);
@@ -409,16 +420,33 @@
 
 // Returns |point|, transformed from |from_origin|'s to |to_origin|'s
 // coordinates, which differ by |scale_factor|.
-gfx::PointF ScalePointRelative(const gfx::Point& from_origin,
+gfx::PointF ScalePointRelative(const gfx::PointF& point,
+                               const gfx::Point& from_origin,
                                const gfx::Point& to_origin,
-                               const float scale_factor,
-                               const gfx::PointF& point) {
+                               const float scale_factor) {
   const gfx::PointF relative_point = point - from_origin.OffsetFromOrigin();
   const gfx::PointF scaled_relative_point =
       gfx::ScalePoint(relative_point, scale_factor);
   return scaled_relative_point + to_origin.OffsetFromOrigin();
 }
 
+gfx::PointF ScreenToDIPPoint(const gfx::PointF& screen_point,
+                             const ScreenWinDisplay& screen_win_display) {
+  const Display display = screen_win_display.display();
+  return ScalePointRelative(
+      screen_point, screen_win_display.pixel_bounds().origin(),
+      display.bounds().origin(), 1.0f / display.device_scale_factor());
+}
+
+gfx::Point DIPToScreenPoint(const gfx::Point& dip_point,
+                            const ScreenWinDisplay& screen_win_display) {
+  const Display display = screen_win_display.display();
+  return gfx::ToFlooredPoint(
+      ScalePointRelative(gfx::PointF(dip_point), display.bounds().origin(),
+                         screen_win_display.pixel_bounds().origin(),
+                         display.device_scale_factor()));
+}
+
 }  // namespace
 
 ScreenWin::ScreenWin() : ScreenWin(true) {}
@@ -433,20 +461,14 @@
   const ScreenWinDisplay screen_win_display =
       GetScreenWinDisplayVia(&ScreenWin::GetScreenWinDisplayNearestScreenPoint,
                              gfx::ToFlooredPoint(pixel_point));
-  const Display display = screen_win_display.display();
-  return ScalePointRelative(screen_win_display.pixel_bounds().origin(),
-                            display.bounds().origin(),
-                            1.0f / display.device_scale_factor(), pixel_point);
+  return ::display::win::ScreenToDIPPoint(pixel_point, screen_win_display);
 }
 
 // static
 gfx::Point ScreenWin::DIPToScreenPoint(const gfx::Point& dip_point) {
   const ScreenWinDisplay screen_win_display = GetScreenWinDisplayVia(
       &ScreenWin::GetScreenWinDisplayNearestDIPPoint, dip_point);
-  const Display display = screen_win_display.display();
-  return gfx::ToFlooredPoint(ScalePointRelative(
-      display.bounds().origin(), screen_win_display.pixel_bounds().origin(),
-      display.device_scale_factor(), gfx::PointF(dip_point)));
+  return ::display::win::DIPToScreenPoint(dip_point, screen_win_display);
 }
 
 // static
@@ -469,10 +491,8 @@
   const float scale_factor =
       1.0f / screen_win_display.display().device_scale_factor();
   gfx::Rect dip_rect = ScaleToEnclosingRect(pixel_bounds, scale_factor);
-  const Display display = screen_win_display.display();
-  dip_rect.set_origin(gfx::ToFlooredPoint(ScalePointRelative(
-      screen_win_display.pixel_bounds().origin(), display.bounds().origin(),
-      scale_factor, gfx::PointF(pixel_bounds.origin()))));
+  dip_rect.set_origin(gfx::ToFlooredPoint(::display::win::ScreenToDIPPoint(
+      gfx::PointF(pixel_bounds.origin()), screen_win_display)));
   return dip_rect;
 }
 
@@ -484,10 +504,8 @@
             &ScreenWin::GetScreenWinDisplayNearestDIPRect, dip_bounds);
   float scale_factor = screen_win_display.display().device_scale_factor();
   gfx::Rect screen_rect = ScaleToEnclosingRect(dip_bounds, scale_factor);
-  const Display display = screen_win_display.display();
-  screen_rect.set_origin(gfx::ToFlooredPoint(ScalePointRelative(
-      display.bounds().origin(), screen_win_display.pixel_bounds().origin(),
-      scale_factor, gfx::PointF(dip_bounds.origin()))));
+  screen_rect.set_origin(::display::win::DIPToScreenPoint(dip_bounds.origin(),
+                                                          screen_win_display));
   return screen_rect;
 }
 
diff --git a/ui/file_manager/file_manager/foreground/css/common.css b/ui/file_manager/file_manager/foreground/css/common.css
index 4342a31..4128853 100644
--- a/ui/file_manager/file_manager/foreground/css/common.css
+++ b/ui/file_manager/file_manager/foreground/css/common.css
@@ -156,6 +156,7 @@
   min-height: 32px;
   min-width: 70px;
   padding: auto;
+  text-transform: none;
 }
 
 .cr-dialog-buttons > button.cr-dialog-ok,
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index df3246b..1751878 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -617,6 +617,10 @@
   position: relative;
 }
 
+.dialog-header.files-ng button.menu-button:hover {
+  background-color: rgba(0, 0, 0, 4%);
+}
+
 .dialog-header button.icon-button > iron-icon {
   margin: 8px;
 }
@@ -2120,6 +2124,10 @@
   flex: auto;
 }
 
+body.files-ng #list-container input.rename {
+  margin-inline-end: 4px;
+}
+
 li[renaming=''] .filename-label,
 li[renaming=''] .badge {
   display: none;
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
index f604b0fa..f6d109b 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_manager_ui.js
@@ -429,8 +429,16 @@
     cr.ui.contextMenuHandler.setContextMenu(
         queryRequiredElement('.drive-welcome.page'), this.fileContextMenu);
 
-    // Add handlers.
+    // Add window resize handler.
     document.defaultView.addEventListener('resize', this.relayout.bind(this));
+
+    // Add global pointer-active handler.
+    const rootElement = document.documentElement;
+    ['pointerdown', 'pointerup'].forEach((eventType) => {
+      document.addEventListener(eventType, (e) => {
+        rootElement.classList.toggle('pointer-active', /down$/.test(e.type));
+      }, true);
+    });
   }
 
   /**
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc
index 48bb0de..e5f90be 100644
--- a/ui/native_theme/native_theme.cc
+++ b/ui/native_theme/native_theme.cc
@@ -8,7 +8,9 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/containers/flat_map.h"
 #include "base/feature_list.h"
+#include "base/no_destructor.h"
 #include "build/build_config.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/base/ui_base_switches.h"
@@ -23,6 +25,120 @@
 
 namespace ui {
 
+namespace {
+
+const base::flat_map<NativeTheme::ColorId, ColorId>&
+NativeThemeColorIdToColorIdMap() {
+  using NTCID = NativeTheme::ColorId;
+  static const base::NoDestructor<base::flat_map<NativeTheme::ColorId, ColorId>>
+      map({
+          {NTCID::kColorId_AlertSeverityHigh, kColorAlertHighSeverity},
+          {NTCID::kColorId_AlertSeverityLow, kColorAlertLowSeverity},
+          {NTCID::kColorId_AlertSeverityMedium, kColorAlertMediumSeverity},
+          {NTCID::kColorId_BubbleBackground, kColorBubbleBackground},
+          {NTCID::kColorId_BubbleFooterBackground,
+           kColorBubbleFooterBackground},
+          {NTCID::kColorId_DialogBackground, kColorButtonBackground},
+          {NTCID::kColorId_ButtonBorderColor, kColorButtonBorder},
+          {NTCID::kColorId_ButtonDisabledColor, kColorButtonDisabledForeground},
+          {NTCID::kColorId_ButtonEnabledColor, kColorButtonForeground},
+          {NTCID::kColorId_ProminentButtonColor,
+           kColorButtonProminentBackground},
+          {NTCID::kColorId_ProminentButtonDisabledColor,
+           kColorButtonProminentDisabledBackground},
+          {NTCID::kColorId_ProminentButtonFocusedColor,
+           kColorButtonProminentFocusedBackground},
+          {NTCID::kColorId_TextOnProminentButtonColor,
+           kColorButtonProminentForeground},
+          {NTCID::kColorId_ButtonUncheckedColor,
+           kColorButtonUncheckedForeground},
+          {NTCID::kColorId_DialogBackground, kColorDialogBackground},
+          {NTCID::kColorId_DialogForeground, kColorDialogForeground},
+          {NTCID::kColorId_FocusedBorderColor, kColorFocusableBorderFocused},
+          {NTCID::kColorId_UnfocusedBorderColor,
+           kColorFocusableBorderUnfocused},
+          {NTCID::kColorId_DefaultIconColor, kColorIcon},
+          {NTCID::kColorId_LabelDisabledColor, kColorLabelDisabledForeground},
+          {NTCID::kColorId_LabelEnabledColor, kColorLabelForeground},
+          {NTCID::kColorId_LabelSecondaryColor, kColorLabelSecondaryForeground},
+          {NTCID::kColorId_LabelTextSelectionBackgroundFocused,
+           kColorLabelSelectionBackground},
+          {NTCID::kColorId_LabelTextSelectionColor,
+           kColorLabelSelectionForeground},
+          {NTCID::kColorId_LinkDisabled, kColorLinkDisabledForeground},
+          {NTCID::kColorId_LinkEnabled, kColorLinkForeground},
+          {NTCID::kColorId_LinkPressed, kColorLinkPressedForeground},
+          {NTCID::kColorId_MenuBackgroundColor, kColorMenuBackground},
+          {NTCID::kColorId_MenuBorderColor, kColorMenuBorder},
+          {NTCID::kColorId_MenuItemAlertBackgroundColor,
+           kColorMenuItemAlertedBackground},
+          {NTCID::kColorId_DisabledMenuItemForegroundColor,
+           kColorMenuItemDisabledForeground},
+          {NTCID::kColorId_EnabledMenuItemForegroundColor,
+           kColorMenuItemForeground},
+          {NTCID::kColorId_HighlightedMenuItemBackgroundColor,
+           kColorMenuItemHighlightedBackground},
+          {NTCID::kColorId_HighlightedMenuItemForegroundColor,
+           kColorMenuItemHighlightedForeground},
+          {NTCID::kColorId_MenuItemMinorTextColor,
+           kColorMenuItemSecondaryForeground},
+          {NTCID::kColorId_FocusedMenuItemBackgroundColor,
+           kColorMenuItemSelectedBackground},
+          {NTCID::kColorId_SelectedMenuItemForegroundColor,
+           kColorMenuItemSelectedForeground},
+          {NTCID::kColorId_MenuSeparatorColor, kColorMenuSeparator},
+          {NTCID::kColorId_TabBottomBorder, kColorTabContentSeparator},
+          {NTCID::kColorId_TabTitleColorInactive, kColorTabForeground},
+          {NTCID::kColorId_TabTitleColorActive, kColorTabSelectedForeground},
+          {NTCID::kColorId_TableBackground, kColorTableBackground},
+          // TODO(http://crbug.com/1057754): kColorId_TableBackgroundAlternate,
+          // which is not needed on platforms other than Mac..
+          {NTCID::kColorId_TableText, kColorTableForeground},
+          {NTCID::kColorId_TableGroupingIndicatorColor,
+           kColorTableGroupingIndicator},
+          {NTCID::kColorId_TableHeaderBackground, kColorTableHeaderBackground},
+          {NTCID::kColorId_TableHeaderText, kColorTableHeaderForeground},
+          // TODO(http://crbug.com/1057754): kColorId_TableHeaderSeparator,
+          // which is implemented as a native theme override on Mac.
+          {NTCID::kColorId_TableSelectionBackgroundFocused,
+           kColorTableSelectedFocusedBackground},
+          {NTCID::kColorId_TableSelectedText,
+           kColorTableSelectedFocusedForeground},
+          {NTCID::kColorId_TableSelectionBackgroundUnfocused,
+           kColorTableSelectedUnfocusedBackground},
+          {NTCID::kColorId_TableSelectedTextUnfocused,
+           kColorTableSelectedUnfocusedForeground},
+          {NTCID::kColorId_TextfieldDefaultBackground,
+           kColorTextfieldBackground},
+          {NTCID::kColorId_TextfieldReadOnlyBackground,
+           kColorTextfieldDisabledBackground},
+          {NTCID::kColorId_TextfieldReadOnlyColor,
+           kColorTextfieldDisabledForeground},
+          {NTCID::kColorId_TextfieldDefaultColor, kColorTextfieldForeground},
+          {NTCID::kColorId_TextfieldSelectionBackgroundFocused,
+           kColorTextfieldSelectionBackground},
+          {NTCID::kColorId_TextfieldSelectionColor,
+           kColorTextfieldSelectionForeground},
+          {NTCID::kColorId_ThrobberSpinningColor, kColorThrobber},
+          {NTCID::kColorId_TooltipBackground, kColorTooltipBackground},
+          {NTCID::kColorId_TooltipText, kColorTooltipForeground},
+          {NTCID::kColorId_TreeBackground, kColorTreeBackground},
+          {NTCID::kColorId_TreeText, kColorTreeNodeForeground},
+          {NTCID::kColorId_TreeSelectionBackgroundFocused,
+           kColorTreeNodeSelectedFocusedBackground},
+          {NTCID::kColorId_TreeSelectedText,
+           kColorTreeNodeSelectedFocusedForeground},
+          {NTCID::kColorId_TreeSelectionBackgroundUnfocused,
+           kColorTreeNodeSelectedUnfocusedBackground},
+          {NTCID::kColorId_TreeSelectedTextUnfocused,
+           kColorTreeNodeSelectedUnfocusedForeground},
+          {NTCID::kColorId_WindowBackground, kColorWindowBackground},
+      });
+  return *map;
+}
+
+}  // namespace
+
 NativeTheme::ExtraParams::ExtraParams() {
   memset(this, 0, sizeof(*this));
 }
@@ -51,14 +167,10 @@
           ColorProviderManager::ColorMode::kLight,
           ColorProviderManager::ContrastMode::kNormal);
     }
-    switch (color_id) {
-      case kColorId_WindowBackground:
-        return color_provider_->GetColor(kColorWindowBackground);
-      case kColorId_DialogBackground:
-        return color_provider_->GetColor(kColorDialogBackground);
-      default:
-        break;
-    }
+    auto color_id_map = NativeThemeColorIdToColorIdMap();
+    auto result = color_id_map.find(color_id);
+    if (result != color_id_map.cend())
+      return color_provider_->GetColor(result->second);
   }
   return GetAuraColor(color_id, this, color_scheme);
 }
diff --git a/ui/strings/translations/ui_strings_en-GB.xtb b/ui/strings/translations/ui_strings_en-GB.xtb
index 77d4c136..1c42aad 100644
--- a/ui/strings/translations/ui_strings_en-GB.xtb
+++ b/ui/strings/translations/ui_strings_en-GB.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Maximise</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, installed app</translation>
 <translation id="1450753235335490080">Can't share <ph name="CONTENT_TYPE" /></translation>
+<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> swapped with <ph name="SECOND_ITEM_TITLE" /></translation>
 <translation id="1498028757988366001">You searched for this before. Deleting '<ph name="QUERY" />' from your history will permanently remove it from your account across all your devices.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minute and }other{# minutes and }}</translation>
 <translation id="1643823602425662293">Notification</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">Right to Left</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">MOST LIKELY</translation>
+<translation id="7170202025028120564">Your application's display settings will take effect when it is next restarted.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{1 min left}other{# mins left}}</translation>
 <translation id="7319740667687257810">Launcher, partial view</translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb
index e30cd3f..ab36b72 100644
--- a/ui/strings/translations/ui_strings_it.xtb
+++ b/ui/strings/translations/ui_strings_it.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Ingrandisci</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, app installata</translation>
 <translation id="1450753235335490080">Impossibile condividere <ph name="CONTENT_TYPE" /></translation>
+<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> è stato scambiato con <ph name="SECOND_ITEM_TITLE" /></translation>
 <translation id="1498028757988366001">Hai eseguito questa ricerca in precedenza. Se elimini "<ph name="QUERY" />" dalla cronologia, la query verrà rimossa in modo permanente dal tuo account su tutti i tuoi dispositivi.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto e }other{# minuti e }}</translation>
 <translation id="1643823602425662293">Notifica</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">Da destra a sinistra</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">PIÙ PROBABILI</translation>
+<translation id="7170202025028120564">Le impostazioni di visualizzazione dell'applicazione verranno applicate dopo il prossimo riavvio.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{1 min rimanente}other{# min rimanenti}}</translation>
 <translation id="7319740667687257810">Avvio applicazioni, visualizzazione parziale</translation>
diff --git a/ui/strings/translations/ui_strings_ms.xtb b/ui/strings/translations/ui_strings_ms.xtb
index f235d64..2346d6f 100644
--- a/ui/strings/translations/ui_strings_ms.xtb
+++ b/ui/strings/translations/ui_strings_ms.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Maksimumkan</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, Apl yang Dipasang</translation>
 <translation id="1450753235335490080">Tidak dapat berkongsi <ph name="CONTENT_TYPE" /></translation>
+<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> Ditukar dengan <ph name="SECOND_ITEM_TITLE" /></translation>
 <translation id="1498028757988366001">Anda pernah mencari perkara ini. Tindakan memadamkan "<ph name="QUERY" />" daripada sejarah anda akan mengalihkannya keluar daripada akaun anda pada semua peranti anda.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minit dan }other{# minit dan }}</translation>
 <translation id="1643823602425662293">Pemberitahuan</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">Kanan ke Kiri</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">KEMUNGKINAN BESAR</translation>
+<translation id="7170202025028120564">Tetapan paparan aplikasi anda akan berkuat kuasa apabila aplikasi ini dimulakan semula selepas ini.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{1 minit lagi}other{# minit lagi}}</translation>
 <translation id="7319740667687257810">Pelancar, paparan separa</translation>
diff --git a/ui/strings/translations/ui_strings_my.xtb b/ui/strings/translations/ui_strings_my.xtb
index b0c6115..f4d73d875b 100644
--- a/ui/strings/translations/ui_strings_my.xtb
+++ b/ui/strings/translations/ui_strings_my.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">ချဲ့</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />၊ ထည့်သွင်းထားသည့် အက်ပ်</translation>
 <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ကို မျှဝေ၍ မရပါ</translation>
+<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> ကို <ph name="SECOND_ITEM_TITLE" /> ဖြင့် လှဲလှယ်ထားသည်</translation>
 <translation id="1498028757988366001">ဤအရာကို ယခင်က ရှာဖွေဖူးသည်။ "<ph name="QUERY" />" အား သင့်မှတ်တမ်းမှ ဖျက်ခြင်းက စက်ပစ္စည်းအားလုံးရှိ သင်၏အကောင့်မှ ၎င်းကို အပြီးဖယ်ရှားလိုက်ပါမည်။</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{၁ မိနစ်နှင့် }other{# မိနစ်နှင့် }}</translation>
 <translation id="1643823602425662293">အကြောင်းကြားချက်</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">ညာမှ ဘယ်သို့</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">ဖြစ်နိုင်ချေအများဆုံး</translation>
+<translation id="7170202025028120564">သင့်အပလီကေးရှင်း၏ ဖန်သားပြင်ပြသမှုဆက်တင်များသည် နောက်တစ်ကြိမ် ပြန်လည်စတင်သည့်အခါ အကျိုးသက်ရောက်မှုရှိပါမည်။</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{၁ မိနစ်ကျန်၏}other{# မိနစ်ကျန်၏}}</translation>
 <translation id="7319740667687257810">Launcher၊ တစ်စိတ်တစ်ပိုင်း မြင်ကွင်း</translation>
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb
index 9e1633a..98c1b80 100644
--- a/ui/strings/translations/ui_strings_pl.xtb
+++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Maksymalizuj</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, zainstalowana aplikacja</translation>
 <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />: nie udało się udostępnić</translation>
+<translation id="1487931858675166540">Element <ph name="FIRST_ITEM_TITLE" /> został zastąpiony elementem <ph name="SECOND_ITEM_TITLE" /></translation>
 <translation id="1498028757988366001">Z Twojej historii wyszukiwania. Jeśli usuniesz zapytanie „<ph name="QUERY" />” z historii, zostanie ono trwale usunięte z Twojego konta na wszystkich urządzeniach.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta i }few{# minuty i }many{# minut i }other{# minuty i }}</translation>
 <translation id="1643823602425662293">Powiadomienie</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">Od prawej do lewej</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">NAJBARDZIEJ PRAWDOPODOBNE</translation>
+<translation id="7170202025028120564">Zmiany ustawień wyświetlania aplikacji zostaną wprowadzone po jej ponownym uruchomieniu.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{Pozostała 1 min}few{Pozostały # min}many{Pozostało # min}other{Pozostało # min}}</translation>
 <translation id="7319740667687257810">Menu z aplikacjami, widok częściowy</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb
index 56f57bf0..741561a 100644
--- a/ui/strings/translations/ui_strings_pt-BR.xtb
+++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Maximizar</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, app instalado</translation>
 <translation id="1450753235335490080">Falha no compartilhamento de <ph name="CONTENT_TYPE" /></translation>
+<translation id="1487931858675166540">Troca de <ph name="FIRST_ITEM_TITLE" /> por <ph name="SECOND_ITEM_TITLE" /> realizada</translation>
 <translation id="1498028757988366001">Você já pesquisou isso. Se você excluir "<ph name="QUERY" />" do seu histórico, essa consulta será permanentemente removida da sua conta em todos os seus dispositivos.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{Um minuto e }one{# minutos e }other{# minutos e }}</translation>
 <translation id="1643823602425662293">Notificação</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">Da direita para a esquerda</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">MUITO PROVAVELMENTE</translation>
+<translation id="7170202025028120564">As configurações de exibição do aplicativo entrarão em vigor quando ele for reiniciado.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{Um minuto restante}one{# minutos restantes}other{# minutos restantes}}</translation>
 <translation id="7319740667687257810">Iniciador, visualização parcial</translation>
diff --git a/ui/strings/translations/ui_strings_si.xtb b/ui/strings/translations/ui_strings_si.xtb
index 8c15e5e2..b5668bd 100644
--- a/ui/strings/translations/ui_strings_si.xtb
+++ b/ui/strings/translations/ui_strings_si.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">විශාල කරන්න</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, ස්ථාපිත යෙදුම</translation>
 <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> බෙදා ගත නොහැක</translation>
+<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> <ph name="SECOND_ITEM_TITLE" /> සමඟ හුවමාරු කර ගත්තා</translation>
 <translation id="1498028757988366001">ඔබ කලින් මෙය සොයා ඇත. ඔබේ ඉතිහාසයෙන් "<ph name="QUERY" />" මැකීම ඔබේ උපාංග සියල්ලෙහිම ඔබේ ගිණුමෙන් එය ස්ථිරව මකා දමයි.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{මිනිත්තු 1 ක් සහ }one{මිනිත්තු # ක් සහ }other{මිනිත්තු # ක් සහ }}</translation>
 <translation id="1643823602425662293">දැනුම්දීම</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">දකුණේ සිට වමට</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">වැඩියෙන්ම ඉඩ ඇති</translation>
+<translation id="7170202025028120564">එය මීළඟ වරට යළි ඇරඹූ විට ඔබේ යෙදුමේ සංදර්ශක සැකසීම් ක්‍රියාත්මක වෙයි.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{මිනිත්තු 1 ක් ඉතිරියි}one{මිනිත්තු # ක් ඉතිරියි}other{මිනිත්තු # ක් ඉතිරියි}}</translation>
 <translation id="7319740667687257810">දියත්කරණය, අර්ධ දසුන</translation>
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb
index 2ceba61d..a65a404 100644
--- a/ui/strings/translations/ui_strings_sk.xtb
+++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Maximalizovať</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, nainštalovaná aplikácia</translation>
 <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> sa nedá zdieľať</translation>
+<translation id="1487931858675166540">Položka <ph name="FIRST_ITEM_TITLE" /> bola vymenená za <ph name="SECOND_ITEM_TITLE" /></translation>
 <translation id="1498028757988366001">Toto ste už vyhľadávali. Odstránením dopytu <ph name="QUERY" /> z histórie ho natrvalo vymažete zo svojho účtu vo všetkých zariadeniach.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 minúta a }few{# minúty a }many{# minúty a }other{# minút a }}</translation>
 <translation id="1643823602425662293">Upozornenie</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">Sprava doľava</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">S NAJVÄČŠOU PRAVDEPODOBNOSŤOU</translation>
+<translation id="7170202025028120564">Nastavenia zobrazovania vašej aplikácie sa uplatnia po jej ďalšom reštartovaní.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{Zostáva 1 min}few{Zostávajú # min}many{Zostáva # min}other{Zostáva # min}}</translation>
 <translation id="7319740667687257810">Launcher, čiastočné zobrazenie</translation>
diff --git a/ui/strings/translations/ui_strings_uz.xtb b/ui/strings/translations/ui_strings_uz.xtb
index c219c21..89e19b9 100644
--- a/ui/strings/translations/ui_strings_uz.xtb
+++ b/ui/strings/translations/ui_strings_uz.xtb
@@ -21,6 +21,7 @@
 <translation id="1398853756734560583">Yoyish</translation>
 <translation id="1414271762428216854"><ph name="APP_NAME" />, Ilova oʻrnatildi</translation>
 <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> yuborilmadi</translation>
+<translation id="1487931858675166540"><ph name="FIRST_ITEM_TITLE" /> va <ph name="SECOND_ITEM_TITLE" /> almashtirildi</translation>
 <translation id="1498028757988366001">Buni oldin qidirgan edingiz. Qidiruv tarixidan “<ph name="QUERY" />” oʻchirib tashlanganda u barcha . qurilmalaringizdagi hisobingizdan butunlay olib tashlanadi.</translation>
 <translation id="1591184457164800433">{MINUTES,plural, =1{1 daqiqa va }other{# daqiqa va }}</translation>
 <translation id="1643823602425662293">Bildirishnoma</translation>
@@ -187,6 +188,7 @@
 <translation id="6974053822202609517">O‘ngdan chapga</translation>
 <translation id="7052633198403197513">F1</translation>
 <translation id="7130207228079676353">ENG SEVIMLI</translation>
+<translation id="7170202025028120564">Ilovangizdagi ekran sozlamalari keyingi safar ishga tushganda kuchga kiradi.</translation>
 <translation id="7222373446505536781">F11</translation>
 <translation id="7238427729722629793">{MINUTES,plural, =1{1 daqiqa qoldi}other{# daqiqa qoldi}}</translation>
 <translation id="7319740667687257810">Launcher, ajratib ko‘rsatish</translation>
diff --git a/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js b/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js
index 724957a..4da52c6 100644
--- a/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js
+++ b/ui/webui/resources/cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.js
@@ -13,7 +13,7 @@
  *            isGaiaAvatar: (boolean|undefined),
  *            selected: (boolean|undefined)}}
  */
-let AvatarIcon;
+/* #export */ let AvatarIcon;
 
 Polymer({
   is: 'cr-profile-avatar-selector',
diff --git a/ui/webui/resources/css/cros_colors.json5 b/ui/webui/resources/css/cros_colors.json5
index 0d2f5ed8..3fa5dda 100644
--- a/ui/webui/resources/css/cros_colors.json5
+++ b/ui/webui/resources/css/cros_colors.json5
@@ -14,17 +14,17 @@
      * Recommended colors.
      */
     cros_default_text_color: "$google_grey_900",
-    cros_default_text_color_secondary: "$google_grey_refresh_700",
+    cros_default_text_color_secondary: "$google_grey_700",
 
     cros_default_bg_color: "#ffffff",
 
     cros_default_toolbar_bg_color: "#ffffff",
-    cros_default_toolbar_search_bg_color: "$google_grey_refresh_100",
+    cros_default_toolbar_search_bg_color: "$google_grey_100",
 
     cros_default_button_color: "$google_blue_600",
 
     cros_menu_button_bg_color_active: "$google_blue_50",
-    cros_menu_button_bg_color_hover: "$google_grey_refresh_100",
+    cros_menu_button_bg_color_hover: "$google_grey_100",
     cros_menu_button_outline_color_focused: "$google_blue_600",
 
     cros_toggle_color: "$cros_default_button_color",
@@ -35,7 +35,7 @@
 
     cros_radio_button_color: "$cros_default_button_color",
     cros_radio_button_ripple_color: "rgba($cros_radio_button_color_rgb, .2)",
-    cros_radio_button_color_unchecked: "$google_grey_refresh_700",
+    cros_radio_button_color_unchecked: "$google_grey_700",
     cros_radio_button_ripple_color_unchecked: "rgba($google_grey_600_rgb, .15)",
 
     cros_separator_color: "rgba(0, 0, 0, 0.12)",
@@ -52,10 +52,10 @@
 
     /* OS Settings */
     cros_error_color: "$google_red_700",
-    cros_success_color: "$google_green_refresh_700",
+    cros_success_color: "$google_green_700",
 
-    cros_search_page_question_icon_color: "$google_grey_refresh_500",
-    cros_app_management_permission_icon_color: "$paper_grey_600",
+    cros_search_page_question_icon_color: "$google_grey_500",
+    cros_app_management_permission_icon_color: "$google_grey_600",
 
     cros_user_icon_color_secondary: "rgb(210, 210, 212)",
   },
diff --git a/ui/webui/resources/css/cros_palette.json5 b/ui/webui/resources/css/cros_palette.json5
index a79e9963e..b26d8170 100644
--- a/ui/webui/resources/css/cros_palette.json5
+++ b/ui/webui/resources/css/cros_palette.json5
@@ -11,333 +11,58 @@
 {
   colors: {
     google_blue_50: "#e8f0fe",
+    google_blue_100: "#d2e3fc",
+    google_blue_200: "#aecbfa",
+    google_blue_300: "#8ab4f8",
+    google_blue_400: "#669df6",
+    google_blue_500: "#4285f4",
     google_blue_600: "#1a73e8",
+    google_blue_700: "#1967d2",
+    google_blue_800: "#185abc",
+    google_blue_900: "#174ea6",
 
+    google_green_50: "#e6f4ea",
+    google_green_100: "#ceead6",
+    google_green_200: "#a8dab5",
+    google_green_300: "#81c995",
+    google_green_400: "#5bb974",
+    google_green_500: "#34a853",
+    google_green_600: "#1e8e3e",
+    google_green_700: "#188038",
+    google_green_800: "#137333",
+    google_green_900: "#0d652d",
+
+    google_grey_50: "#f8f9fa",
+    google_grey_100: "#f1f3f4",
     google_grey_200: "#e8eaed",
+    google_grey_300: "#dadce0",
     google_grey_400: "#bdc1c6",
+    google_grey_500: "#9aa0a6",
     google_grey_600: "#80868b",
+    google_grey_700: "#5f6368",
     google_grey_800: "#3c4043",
     google_grey_900: "#202124",
 
+    google_red_50: "#fce8e6",
+    google_red_100: "#fad2cf",
+    google_red_200: "#f6aea9",
+    google_red_300: "#f28b82",
+    google_red_400: "#ee675c",
+    google_red_500: "#ea4335",
     google_red_600: "#d93025",
+    google_red_700: "#c5221f",
+    google_red_800: "#b31412",
+    google_red_900: "#a50e0e",
 
-    /* _refresh differentiate from polymer's color.html. */
-    google_blue_refresh_100: "#d2e3fc",
-    google_blue_refresh_300: "#8ab4f8",
-    google_blue_refresh_500: "#4285f4",
-
-    google_green_refresh_300: "#81c995",
-    google_green_refresh_700: "#188038",
-
-    google_grey_refresh_100: "#f1f3f4",
-    google_grey_refresh_300: "#dadce0",
-    google_grey_refresh_500: "#9aa0a6",
-    google_grey_refresh_700: "#5f6368",
-
-    google_red_refresh_300: "#f28b82",
-
-    google_yellow_refresh_300: "#fdd633",
-
-    /* Material Design color palette for Google products */
-
-    google_red_100: "#f4c7c3",
-    google_red_300: "#e67c73",
-    google_red_500: "#db4437",
-    google_red_700: "#c53929",
-
-    google_blue_100: "#c6dafc",
-    google_blue_300: "#7baaf7",
-    google_blue_500: "#4285f4",
-    google_blue_700: "#3367d6",
-
-    google_green_100: "#b7e1cd",
-    google_green_300: "#57bb8a",
-    google_green_500: "#0f9d58",
-    google_green_700: "#0b8043",
-
-    google_yellow_100: "#fce8b2",
-    google_yellow_300: "#f7cb4d",
-    google_yellow_500: "#f4b400",
-    google_yellow_700: "#f09300",
-
-    google_grey_100: "#f5f5f5",
-    google_grey_300: "#e0e0e0",
-    google_grey_500: "#9e9e9e",
-    google_grey_700: "#616161",
-
-    /* Material Design color palette from online spec document */
-
-    paper_red_50: "#ffebee",
-    paper_red_100: "#ffcdd2",
-    paper_red_200: "#ef9a9a",
-    paper_red_300: "#e57373",
-    paper_red_400: "#ef5350",
-    paper_red_500: "#f44336",
-    paper_red_600: "#e53935",
-    paper_red_700: "#d32f2f",
-    paper_red_800: "#c62828",
-    paper_red_900: "#b71c1c",
-    paper_red_a100: "#ff8a80",
-    paper_red_a200: "#ff5252",
-    paper_red_a400: "#ff1744",
-    paper_red_a700: "#d50000",
-
-    paper_pink_50: "#fce4ec",
-    paper_pink_100: "#f8bbd0",
-    paper_pink_200: "#f48fb1",
-    paper_pink_300: "#f06292",
-    paper_pink_400: "#ec407a",
-    paper_pink_500: "#e91e63",
-    paper_pink_600: "#d81b60",
-    paper_pink_700: "#c2185b",
-    paper_pink_800: "#ad1457",
-    paper_pink_900: "#880e4f",
-    paper_pink_a100: "#ff80ab",
-    paper_pink_a200: "#ff4081",
-    paper_pink_a400: "#f50057",
-    paper_pink_a700: "#c51162",
-
-    paper_purple_50: "#f3e5f5",
-    paper_purple_100: "#e1bee7",
-    paper_purple_200: "#ce93d8",
-    paper_purple_300: "#ba68c8",
-    paper_purple_400: "#ab47bc",
-    paper_purple_500: "#9c27b0",
-    paper_purple_600: "#8e24aa",
-    paper_purple_700: "#7b1fa2",
-    paper_purple_800: "#6a1b9a",
-    paper_purple_900: "#4a148c",
-    paper_purple_a100: "#ea80fc",
-    paper_purple_a200: "#e040fb",
-    paper_purple_a400: "#d500f9",
-    paper_purple_a700: "#aa00ff",
-
-    paper_deep_purple_50: "#ede7f6",
-    paper_deep_purple_100: "#d1c4e9",
-    paper_deep_purple_200: "#b39ddb",
-    paper_deep_purple_300: "#9575cd",
-    paper_deep_purple_400: "#7e57c2",
-    paper_deep_purple_500: "#673ab7",
-    paper_deep_purple_600: "#5e35b1",
-    paper_deep_purple_700: "#512da8",
-    paper_deep_purple_800: "#4527a0",
-    paper_deep_purple_900: "#311b92",
-    paper_deep_purple_a100: "#b388ff",
-    paper_deep_purple_a200: "#7c4dff",
-    paper_deep_purple_a400: "#651fff",
-    paper_deep_purple_a700: "#6200ea",
-
-    paper_indigo_50: "#e8eaf6",
-    paper_indigo_100: "#c5cae9",
-    paper_indigo_200: "#9fa8da",
-    paper_indigo_300: "#7986cb",
-    paper_indigo_400: "#5c6bc0",
-    paper_indigo_500: "#3f51b5",
-    paper_indigo_600: "#3949ab",
-    paper_indigo_700: "#303f9f",
-    paper_indigo_800: "#283593",
-    paper_indigo_900: "#1a237e",
-    paper_indigo_a100: "#8c9eff",
-    paper_indigo_a200: "#536dfe",
-    paper_indigo_a400: "#3d5afe",
-    paper_indigo_a700: "#304ffe",
-
-    paper_blue_50: "#e3f2fd",
-    paper_blue_100: "#bbdefb",
-    paper_blue_200: "#90caf9",
-    paper_blue_300: "#64b5f6",
-    paper_blue_400: "#42a5f5",
-    paper_blue_500: "#2196f3",
-    paper_blue_600: "#1e88e5",
-    paper_blue_700: "#1976d2",
-    paper_blue_800: "#1565c0",
-    paper_blue_900: "#0d47a1",
-    paper_blue_a100: "#82b1ff",
-    paper_blue_a200: "#448aff",
-    paper_blue_a400: "#2979ff",
-    paper_blue_a700: "#2962ff",
-
-    paper_light_blue_50: "#e1f5fe",
-    paper_light_blue_100: "#b3e5fc",
-    paper_light_blue_200: "#81d4fa",
-    paper_light_blue_300: "#4fc3f7",
-    paper_light_blue_400: "#29b6f6",
-    paper_light_blue_500: "#03a9f4",
-    paper_light_blue_600: "#039be5",
-    paper_light_blue_700: "#0288d1",
-    paper_light_blue_800: "#0277bd",
-    paper_light_blue_900: "#01579b",
-    paper_light_blue_a100: "#80d8ff",
-    paper_light_blue_a200: "#40c4ff",
-    paper_light_blue_a400: "#00b0ff",
-    paper_light_blue_a700: "#0091ea",
-
-    paper_cyan_50: "#e0f7fa",
-    paper_cyan_100: "#b2ebf2",
-    paper_cyan_200: "#80deea",
-    paper_cyan_300: "#4dd0e1",
-    paper_cyan_400: "#26c6da",
-    paper_cyan_500: "#00bcd4",
-    paper_cyan_600: "#00acc1",
-    paper_cyan_700: "#0097a7",
-    paper_cyan_800: "#00838f",
-    paper_cyan_900: "#006064",
-    paper_cyan_a100: "#84ffff",
-    paper_cyan_a200: "#18ffff",
-    paper_cyan_a400: "#00e5ff",
-    paper_cyan_a700: "#00b8d4",
-
-    paper_teal_50: "#e0f2f1",
-    paper_teal_100: "#b2dfdb",
-    paper_teal_200: "#80cbc4",
-    paper_teal_300: "#4db6ac",
-    paper_teal_400: "#26a69a",
-    paper_teal_500: "#009688",
-    paper_teal_600: "#00897b",
-    paper_teal_700: "#00796b",
-    paper_teal_800: "#00695c",
-    paper_teal_900: "#004d40",
-    paper_teal_a100: "#a7ffeb",
-    paper_teal_a200: "#64ffda",
-    paper_teal_a400: "#1de9b6",
-    paper_teal_a700: "#00bfa5",
-
-    paper_green_50: "#e8f5e9",
-    paper_green_100: "#c8e6c9",
-    paper_green_200: "#a5d6a7",
-    paper_green_300: "#81c784",
-    paper_green_400: "#66bb6a",
-    paper_green_500: "#4caf50",
-    paper_green_600: "#43a047",
-    paper_green_700: "#388e3c",
-    paper_green_800: "#2e7d32",
-    paper_green_900: "#1b5e20",
-    paper_green_a100: "#b9f6ca",
-    paper_green_a200: "#69f0ae",
-    paper_green_a400: "#00e676",
-    paper_green_a700: "#00c853",
-
-    paper_light_green_50: "#f1f8e9",
-    paper_light_green_100: "#dcedc8",
-    paper_light_green_200: "#c5e1a5",
-    paper_light_green_300: "#aed581",
-    paper_light_green_400: "#9ccc65",
-    paper_light_green_500: "#8bc34a",
-    paper_light_green_600: "#7cb342",
-    paper_light_green_700: "#689f38",
-    paper_light_green_800: "#558b2f",
-    paper_light_green_900: "#33691e",
-    paper_light_green_a100: "#ccff90",
-    paper_light_green_a200: "#b2ff59",
-    paper_light_green_a400: "#76ff03",
-    paper_light_green_a700: "#64dd17",
-
-    paper_lime_50: "#f9fbe7",
-    paper_lime_100: "#f0f4c3",
-    paper_lime_200: "#e6ee9c",
-    paper_lime_300: "#dce775",
-    paper_lime_400: "#d4e157",
-    paper_lime_500: "#cddc39",
-    paper_lime_600: "#c0ca33",
-    paper_lime_700: "#afb42b",
-    paper_lime_800: "#9e9d24",
-    paper_lime_900: "#827717",
-    paper_lime_a100: "#f4ff81",
-    paper_lime_a200: "#eeff41",
-    paper_lime_a400: "#c6ff00",
-    paper_lime_a700: "#aeea00",
-
-    paper_yellow_50: "#fffde7",
-    paper_yellow_100: "#fff9c4",
-    paper_yellow_200: "#fff59d",
-    paper_yellow_300: "#fff176",
-    paper_yellow_400: "#ffee58",
-    paper_yellow_500: "#ffeb3b",
-    paper_yellow_600: "#fdd835",
-    paper_yellow_700: "#fbc02d",
-    paper_yellow_800: "#f9a825",
-    paper_yellow_900: "#f57f17",
-    paper_yellow_a100: "#ffff8d",
-    paper_yellow_a200: "#ffff00",
-    paper_yellow_a400: "#ffea00",
-    paper_yellow_a700: "#ffd600",
-
-    paper_amber_50: "#fff8e1",
-    paper_amber_100: "#ffecb3",
-    paper_amber_200: "#ffe082",
-    paper_amber_300: "#ffd54f",
-    paper_amber_400: "#ffca28",
-    paper_amber_500: "#ffc107",
-    paper_amber_600: "#ffb300",
-    paper_amber_700: "#ffa000",
-    paper_amber_800: "#ff8f00",
-    paper_amber_900: "#ff6f00",
-    paper_amber_a100: "#ffe57f",
-    paper_amber_a200: "#ffd740",
-    paper_amber_a400: "#ffc400",
-    paper_amber_a700: "#ffab00",
-
-    paper_orange_50: "#fff3e0",
-    paper_orange_100: "#ffe0b2",
-    paper_orange_200: "#ffcc80",
-    paper_orange_300: "#ffb74d",
-    paper_orange_400: "#ffa726",
-    paper_orange_500: "#ff9800",
-    paper_orange_600: "#fb8c00",
-    paper_orange_700: "#f57c00",
-    paper_orange_800: "#ef6c00",
-    paper_orange_900: "#e65100",
-    paper_orange_a100: "#ffd180",
-    paper_orange_a200: "#ffab40",
-    paper_orange_a400: "#ff9100",
-    paper_orange_a700: "#ff6500",
-
-    paper_deep_orange_50: "#fbe9e7",
-    paper_deep_orange_100: "#ffccbc",
-    paper_deep_orange_200: "#ffab91",
-    paper_deep_orange_300: "#ff8a65",
-    paper_deep_orange_400: "#ff7043",
-    paper_deep_orange_500: "#ff5722",
-    paper_deep_orange_600: "#f4511e",
-    paper_deep_orange_700: "#e64a19",
-    paper_deep_orange_800: "#d84315",
-    paper_deep_orange_900: "#bf360c",
-    paper_deep_orange_a100: "#ff9e80",
-    paper_deep_orange_a200: "#ff6e40",
-    paper_deep_orange_a400: "#ff3d00",
-    paper_deep_orange_a700: "#dd2c00",
-
-    paper_brown_50: "#efebe9",
-    paper_brown_100: "#d7ccc8",
-    paper_brown_200: "#bcaaa4",
-    paper_brown_300: "#a1887f",
-    paper_brown_400: "#8d6e63",
-    paper_brown_500: "#795548",
-    paper_brown_600: "#6d4c41",
-    paper_brown_700: "#5d4037",
-    paper_brown_800: "#4e342e",
-    paper_brown_900: "#3e2723",
-
-    paper_grey_50: "#fafafa",
-    paper_grey_100: "#f5f5f5",
-    paper_grey_200: "#eeeeee",
-    paper_grey_300: "#e0e0e0",
-    paper_grey_400: "#bdbdbd",
-    paper_grey_500: "#9e9e9e",
-    paper_grey_600: "#757575",
-    paper_grey_700: "#616161",
-    paper_grey_800: "#424242",
-    paper_grey_900: "#212121",
-
-    paper_blue_grey_50: "#eceff1",
-    paper_blue_grey_100: "#cfd8dc",
-    paper_blue_grey_200: "#b0bec5",
-    paper_blue_grey_300: "#90a4ae",
-    paper_blue_grey_400: "#78909c",
-    paper_blue_grey_500: "#607d8b",
-    paper_blue_grey_600: "#546e7a",
-    paper_blue_grey_700: "#455a64",
-    paper_blue_grey_800: "#37474f",
-    paper_blue_grey_900: "#263238",
+    google_yellow_50: "#fef7e0",
+    google_yellow_100: "#feefc3",
+    google_yellow_200: "#fde293",
+    google_yellow_300: "#fdd663",
+    google_yellow_400: "#fcc934",
+    google_yellow_500: "#fbbc04",
+    google_yellow_600: "#f9ab00",
+    google_yellow_700: "#f29900",
+    google_yellow_800: "#ea8600",
+    google_yellow_900: "#e37400",
   }
 }
diff --git a/weblayer/browser/permissions/weblayer_permissions_client.cc b/weblayer/browser/permissions/weblayer_permissions_client.cc
index 1dea3d6a..32bc87a6 100644
--- a/weblayer/browser/permissions/weblayer_permissions_client.cc
+++ b/weblayer/browser/permissions/weblayer_permissions_client.cc
@@ -6,6 +6,7 @@
 
 #include "weblayer/browser/host_content_settings_map_factory.h"
 #include "weblayer/browser/permissions/permission_decision_auto_blocker_factory.h"
+#include "weblayer/browser/permissions/permission_manager_factory.h"
 
 #if defined(OS_ANDROID)
 #include "weblayer/browser/android/resource_mapper.h"
@@ -31,6 +32,11 @@
       browser_context);
 }
 
+permissions::PermissionManager* WebLayerPermissionsClient::GetPermissionManager(
+    content::BrowserContext* browser_context) {
+  return PermissionManagerFactory::GetForBrowserContext(browser_context);
+}
+
 #if defined(OS_ANDROID)
 int WebLayerPermissionsClient::MapToJavaDrawableId(int resource_id) {
   return weblayer::MapToJavaDrawableId(resource_id);
diff --git a/weblayer/browser/permissions/weblayer_permissions_client.h b/weblayer/browser/permissions/weblayer_permissions_client.h
index 7ae45af5..e7a7ce2 100644
--- a/weblayer/browser/permissions/weblayer_permissions_client.h
+++ b/weblayer/browser/permissions/weblayer_permissions_client.h
@@ -24,6 +24,8 @@
       content::BrowserContext* browser_context) override;
   permissions::PermissionDecisionAutoBlocker* GetPermissionDecisionAutoBlocker(
       content::BrowserContext* browser_context) override;
+  permissions::PermissionManager* GetPermissionManager(
+      content::BrowserContext* browser_context) override;
 #if defined(OS_ANDROID)
   int MapToJavaDrawableId(int resource_id) override;
 #endif