diff --git a/.eslintrc.js b/.eslintrc.js
index 3b5554f..5399713 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -73,6 +73,20 @@
       'semi': 'off',
       '@typescript-eslint/semi': ['error'],
 
+      '@typescript-eslint/naming-convention': [
+        'error',
+        {
+          // https://google.github.io/styleguide/jsguide.html#naming-enum-names
+          selector: 'enum',
+          format: ['PascalCase'],
+        },
+        {
+          // https://google.github.io/styleguide/jsguide.html#naming-enum-names
+          selector: 'enumMember',
+          format: ['UPPER_CASE'],
+        },
+      ],
+
       '@typescript-eslint/member-delimiter-style': ['error', {
         multiline: {
           delimiter: 'comma',
diff --git a/DEPS b/DEPS
index 832a358..15616ec 100644
--- a/DEPS
+++ b/DEPS
@@ -269,23 +269,23 @@
   # 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': '4ff975ccd2326083cc51e089e7f3b4d8b67ef141',
+  'skia_revision': '0b81e991013707ff55295083c10eba077954d09b',
   # 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': 'b61adbec80a40a708d942bace26ba2e278f0ec24',
+  'v8_revision': '3f571e30b92061a2151a0e0a1b9a7f40f9152d39',
   # 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': 'cadb933fdb1247535ad5c9dc5f776662b2ea2df6',
+  'angle_revision': '78d88796b44b9ca2dad8872670d0e25bbf7dcba7',
   # 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': '2e793ae0800255ec73c23fc89da2526ccf5361e7',
+  'swiftshader_revision': '1dd93361b1d9a1755f73faac4cb2db8feb83a871',
   # 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': '987d48b2d23188a868309acb61bbdd5ece169118',
+  'pdfium_revision': '341d6adac1f4a8ff0d68a4da350b7c487807ef0d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -296,7 +296,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:8.20220506.0.1',
+  'fuchsia_version': 'version:8.20220508.3.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -340,7 +340,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '778ecbcb2ae1bc13df4e34a82f96451a55c8a782',
+  'catapult_revision': '0f76f22a35d5bdb79e7fb203690eb391facb9f55',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -348,7 +348,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': '1fcf6cf344b39c60135f3257ec726e9e878786a4',
+  'devtools_frontend_revision': '63bb96761f63ba36c0beaacbb7bee8574aa51e59',
   # 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.
@@ -384,11 +384,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': 'd66f973460dd6fef62cc83df50a2a2528149992c',
+  'dawn_revision': '680f513bda0bdb3e843d68f2b0b6a348c2fb83c7',
   # 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': '917cc0810c51fa930c830a341107bc3ab0722827',
+  'quiche_revision': 'bfb48274c6328b6e0e23dff12b2626e582adbd2f',
   # 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.
@@ -451,7 +451,7 @@
   'libcxx_revision':       '79a2e924d96e2fc1e4b937c42efd08898fa472d7',
 
   # GN CIPD package version.
-  'gn_version': 'git_revision:53ef169800760fdc09f0773bf380fe99eaeab339',
+  'gn_version': 'git_revision:bf4e17dc67b2a2007475415e3f9e1d1cf32f6e35',
 }
 
 # Only these hosts are allowed for dependencies in this DEPS file.
@@ -835,7 +835,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'kXVl9PtNzgqgAjunZaLtphLEPiNB_fdOvfMju4ef9I4C',
+          'version': 'K2p8otgGS0ihnz3lwwMJhwe96Je8BX3r6Y8BU8qVkcAC',
         },
       ],
       'dep_type': 'cipd',
@@ -846,7 +846,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'X7K2SBxj88IzslcJJCDRJtDQPtcmu-hBDTZhrRBapUEC',
+          'version': '8F7rKnfS-U1DCVRvDrHBKTMrJRvvPOjrWgl8OWoiqoEC',
         },
       ],
       'dep_type': 'cipd',
@@ -857,7 +857,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'xo944JnLDvbDr0fCYpOrztE6h6aAifNJznd2WDFp-osC',
+          'version': 'vQwjZml-9BiumXggjkKOAeDJ-hzoLC10qEW73UTF03QC',
         },
       ],
       'dep_type': 'cipd',
@@ -914,7 +914,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'XbPCfKKY9DjXFa-jD5pUowbW3cSXD9-8PDJ_f_MbbEoC',
+          'version': 'Z0dpz6ioZwh1ZUWtGx7SsGHJMmDwTZNAqQPu2b9hxmgC',
       },
     ],
     'condition': 'checkout_android',
@@ -1527,7 +1527,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a82f6c1e87407b000f3b45a8665ad88cdb77ecdb',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'dd233aed4e705bdb27ab26ae01189ab1e9e3728e',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1699,10 +1699,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'cf04aebdf9b53bb2853f22a81465688daf879ec6',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'a912567d309f6bde49e7e0c3b0671a2e138ab96c',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'a4f8740f71eb29723d28660ff4db07172cdcdb27',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '489e9bd49ce2e55f56b020923d59ff67c19c149a',
+    Var('webrtc_git') + '/src.git' + '@' + '42a829e6233e42f0882c6ee7c5bcbd8506aab422',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1775,7 +1775,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5fd28a4be30bdb8aac0b2a9afe2a271bfd048782',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@86db1fdecab893c484fa393afb7f1eab5ef9cd4b',
     'condition': 'checkout_src_internal',
   },
 
@@ -1805,7 +1805,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'B-oofm-UIjL7e2mu5k1tCiMz8XppLBIsvGs8xc44aesC',
+        'version': 'nAXbxZhUGa8xGTll2dKypwj9_D1Eenuy28MuHgCBZSgC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1816,7 +1816,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'nOPMqLS41l0eQreZmyJk77UStYfWiGDWH_ssJz56I1UC',
+        'version': 'LJqcu5LqhvjY9ns7y7CV0qH5Dj-HpNEFVJxXUesp89wC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1827,7 +1827,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': 'jqOOAabCIJ9bWjw9cJ36AaCiwJ6fOESnzH4CVHBi60wC',
+        'version': 'eD6itE5D4eiKlfICdRa0wlNXa6FEbu3EDogDv1aDpvkC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/renderer/aw_render_frame_ext.cc b/android_webview/renderer/aw_render_frame_ext.cc
index 81329d4..328e162 100644
--- a/android_webview/renderer/aw_render_frame_ext.cc
+++ b/android_webview/renderer/aw_render_frame_ext.cc
@@ -359,6 +359,9 @@
 
 void AwRenderFrameExt::BindLocalMainFrame(
     mojo::PendingAssociatedReceiver<mojom::LocalMainFrame> pending_receiver) {
+  // When bfcache is enabled, this bind can occur multiple times.
+  // receiver should be reset before.
+  local_main_frame_receiver_.reset();
   local_main_frame_receiver_.Bind(std::move(pending_receiver));
 }
 
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 7cc225c4..43c16177 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -299,6 +299,7 @@
   shell->window_tree_host_manager()->AddObserver(this);
   AssistantController::Get()->AddObserver(this);
   AssistantUiController::Get()->GetModel()->AddObserver(this);
+  FeatureDiscoveryDurationReporter::GetInstance()->AddObserver(this);
 }
 
 AppListControllerImpl::~AppListControllerImpl() {
@@ -577,9 +578,13 @@
 
   if (new_order) {
     RecordAppListSortAction(*new_order, IsInTabletMode());
-    FeatureDiscoveryDurationReporter::GetInstance()->MaybeFinishObservation(
-        feature_discovery::TrackableFeature::
-            kAppListReorderAfterEducationNudge);
+
+    FeatureDiscoveryDurationReporter* reporter =
+        FeatureDiscoveryDurationReporter::GetInstance();
+    reporter->MaybeFinishObservation(feature_discovery::TrackableFeature::
+                                         kAppListReorderAfterEducationNudge);
+    reporter->MaybeFinishObservation(feature_discovery::TrackableFeature::
+                                         kAppListReorderAfterSessionActivation);
   }
 
   // Adapt the bubble app list to the new sorting order. NOTE: the bubble app
@@ -2083,6 +2088,7 @@
   shell->wallpaper_controller()->RemoveObserver(this);
   shell->tablet_mode_controller()->RemoveObserver(this);
   shell->session_controller()->RemoveObserver(this);
+  FeatureDiscoveryDurationReporter::GetInstance()->RemoveObserver(this);
 
   badge_controller_->Shutdown();
 }
@@ -2149,4 +2155,13 @@
   OnHomeLauncherAnimationComplete(/*shown=*/true, display_id);
 }
 
+void AppListControllerImpl::OnReporterActivated() {
+  if (!features::IsProductivityLauncherEnabled())
+    return;
+
+  FeatureDiscoveryDurationReporter::GetInstance()->MaybeActivateObservation(
+      feature_discovery::TrackableFeature::
+          kAppListReorderAfterSessionActivation);
+}
+
 }  // namespace ash
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index de1f651..b125a9d 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -21,6 +21,7 @@
 #include "ash/public/cpp/app_list/app_list_controller.h"
 #include "ash/public/cpp/app_list/app_list_model_delegate.h"
 #include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
+#include "ash/public/cpp/feature_discovery_duration_reporter.h"
 #include "ash/public/cpp/keyboard/keyboard_controller_observer.h"
 #include "ash/public/cpp/session/session_observer.h"
 #include "ash/public/cpp/shelf_types.h"
@@ -62,20 +63,22 @@
 // Ash's AppListController owns the AppListModel and implements interface
 // functions that allow Chrome to modify and observe the Shelf and AppListModel
 // state. It also controls the "home launcher", the tablet mode app list.
-class ASH_EXPORT AppListControllerImpl : public AppListController,
-                                         public SessionObserver,
-                                         public AppListViewDelegate,
-                                         public ShellObserver,
-                                         public OverviewObserver,
-                                         public SplitViewObserver,
-                                         public TabletModeObserver,
-                                         public KeyboardControllerObserver,
-                                         public WallpaperControllerObserver,
-                                         public AssistantStateObserver,
-                                         public WindowTreeHostManager::Observer,
-                                         public aura::WindowObserver,
-                                         public AssistantControllerObserver,
-                                         public AssistantUiModelObserver {
+class ASH_EXPORT AppListControllerImpl
+    : public AppListController,
+      public SessionObserver,
+      public AppListViewDelegate,
+      public ShellObserver,
+      public OverviewObserver,
+      public SplitViewObserver,
+      public TabletModeObserver,
+      public KeyboardControllerObserver,
+      public WallpaperControllerObserver,
+      public AssistantStateObserver,
+      public WindowTreeHostManager::Observer,
+      public aura::WindowObserver,
+      public AssistantControllerObserver,
+      public AssistantUiModelObserver,
+      public FeatureDiscoveryDurationReporter::ReporterObserver {
  public:
   AppListControllerImpl();
   AppListControllerImpl(const AppListControllerImpl&) = delete;
@@ -430,6 +433,9 @@
   // "Go Home" have ended. |display_id| is the home screen display ID.
   void OnGoHomeWindowAnimationsEnded(int64_t display_id);
 
+  // FeatureDiscoveryDurationReporter::ReporterObserver:
+  void OnReporterActivated() override;
+
   // Whether the home launcher is
   // * being shown (either through an animation or a drag)
   // * being hidden (either through an animation or a drag)
diff --git a/ash/ash_prefs.cc b/ash/ash_prefs.cc
index 8bb6e66b..39abf947 100644
--- a/ash/ash_prefs.cc
+++ b/ash/ash_prefs.cc
@@ -88,7 +88,6 @@
   GestureEducationNotificationController::RegisterProfilePrefs(registry,
                                                                for_test);
   holding_space_prefs::RegisterProfilePrefs(registry);
-  HpsNotifyController::RegisterProfilePrefs(registry);
   LoginScreenController::RegisterProfilePrefs(registry, for_test);
   LogoutButtonTray::RegisterProfilePrefs(registry);
   LogoutConfirmationController::RegisterProfilePrefs(registry);
@@ -103,6 +102,7 @@
   PrivacyScreenController::RegisterProfilePrefs(registry);
   quick_pair::Mediator::RegisterProfilePrefs(registry);
   ShelfController::RegisterProfilePrefs(registry);
+  SnoopingProtectionController::RegisterProfilePrefs(registry);
   TouchDevicesController::RegisterProfilePrefs(registry, for_test);
   UnifiedSystemTrayController::RegisterProfilePrefs(registry);
   MediaTray::RegisterProfilePrefs(registry);
diff --git a/ash/components/arc/disk_quota/arc_disk_quota_bridge.cc b/ash/components/arc/disk_quota/arc_disk_quota_bridge.cc
index cac76a2..c9672e9 100644
--- a/ash/components/arc/disk_quota/arc_disk_quota_bridge.cc
+++ b/ash/components/arc/disk_quota/arc_disk_quota_bridge.cc
@@ -74,7 +74,7 @@
   *child_path_out = base::FilePath();
   if (kDownloadPath.IsParent(android_path)) {
     // /storage/emulated/0/Download/* =>
-    //     parent=/home/user/<hash>/Downloads/, child=*
+    //     parent=/home/user/<hash>/MyFiles/Downloads/, child=*
     *parent_path_out =
         user_data_auth::SetProjectIdAllowedPathType::PATH_DOWNLOADS;
     return kDownloadPath.AppendRelativePath(android_path, child_path_out);
@@ -302,7 +302,7 @@
           << " current_disk_size=" << guest_total_space
           << " new_disk_size=" << new_disk_size;
 
-  chromeos::ConciergeClient::Get()->ResizeDiskImage(
+  ash::ConciergeClient::Get()->ResizeDiskImage(
       resize_request, base::BindOnce(&ArcDiskQuotaBridge::OnResizeDiskResponse,
                                      weak_factory_.GetWeakPtr(), new_disk_size,
                                      std::move(callback)));
diff --git a/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json b/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json
new file mode 100644
index 0000000..166e55d
--- /dev/null
+++ b/ash/components/arc/input_overlay/resources/com.direlight.grimvalor.json
@@ -0,0 +1,157 @@
+// Copyright 2022 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.
+
+{
+  "tap": [
+    {
+      "id": 0,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "left",
+      "key": "KeyA",
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            0,
+            1
+          ],
+          "anchor_to_target": [
+            0.10555556,
+            -0.12757201
+          ],
+          "x_on_y": 1.4709678
+        }
+      ],
+      "radius": 0.06995885
+    },
+    {
+      "id": 1,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "right",
+      "key": "KeyD",
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            0,
+            1
+          ],
+          "anchor_to_target": [
+            0.21342592,
+            -0.12757201
+          ],
+          "x_on_y": 2.9741936
+        }
+      ],
+      "radius": 0.06995885
+    },
+    {
+      "id": 2,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "jump",
+      "key": "Space",
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            1,
+            1
+          ],
+          "anchor_to_target": [
+            -0.090277776,
+            -0.1563786
+          ],
+          "x_on_y": 1.0263158
+        }
+      ],
+      "radius": 0.06995885
+    },
+    {
+      "id": 3,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "attack",
+      "key": "KeyU",
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            1,
+            1
+          ],
+          "anchor_to_target": [
+            -0.22592592,
+            -0.15555556
+          ],
+          "x_on_y": 2.5820105
+        }
+      ],
+      "radius": 0.07901235
+    },
+    {
+      "id": 4,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "dodge",
+      "key": "KeyO",
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            1,
+            1
+          ],
+          "anchor_to_target": [
+            -0.072222225,
+            -0.34814814
+          ],
+          "x_on_y": 0.36879432
+        }
+      ],
+      "radius": 0.06584362
+    },
+    {
+      "id": 5,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "settings",
+      "key": "Escape",
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            1,
+            0
+          ],
+          "anchor_to_target": [
+            -0.048148148,
+            0.065020576
+          ],
+          "x_on_y": 1.3164557
+        },
+        {
+          "type": "position",
+          "anchor": [
+            1,
+            0
+          ],
+          "anchor_to_target": [
+            -0.048148148,
+            0.065020576
+          ]
+        }
+      ],
+      "radius": 0.042798355
+    }
+  ]
+}
diff --git a/ash/components/arc/input_overlay/resources/com.pixelstar.pbr.json b/ash/components/arc/input_overlay/resources/com.pixelstar.pbr.json
new file mode 100644
index 0000000..b7d6aa1
--- /dev/null
+++ b/ash/components/arc/input_overlay/resources/com.pixelstar.pbr.json
@@ -0,0 +1,126 @@
+// Copyright 2022 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.
+
+{
+  "move": [
+    {
+      "id": 0,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "Virtual Joystick",
+      "keys": [
+        "KeyW",
+        "KeyA",
+        "KeyS",
+        "KeyD"
+      ],
+      "location": [
+        {
+          "type": "dependent_position",
+          "anchor": [
+            0,
+            1
+          ],
+          "anchor_to_target": [
+            0.50048494,
+            -0.24876982
+          ],
+          "y_on_x": 0.88178295
+        }
+      ],
+      "radius": 0.09786769
+    }
+  ],
+  "tap": [
+    {
+      "id": 1,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "Tap",
+      "key": "Digit1",
+      "location": [
+        {
+          "type": "position",
+          "anchor": [
+            0,
+            1
+          ],
+          "anchor_to_target": [
+            0.18622696,
+            -0.07490432
+          ]
+        }
+      ],
+      "radius": 0.048660472
+    },
+    {
+      "id": 2,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "Tap",
+      "key": "Digit2",
+      "location": [
+        {
+          "type": "position",
+          "anchor": [
+            0,
+            1
+          ],
+          "anchor_to_target": [
+            0.39379242,
+            -0.07490432
+          ]
+        }
+      ],
+      "radius": 0.048660472
+    },
+    {
+      "id": 3,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "Tap",
+      "key": "Digit3",
+      "location": [
+        {
+          "type": "position",
+          "anchor": [
+            1,
+            1
+          ],
+          "anchor_to_target": [
+            -0.3986421,
+            -0.07490432
+          ]
+        }
+      ],
+      "radius": 0.048660472
+    },
+    {
+      "id": 4,
+      "input_sources": [
+        "keyboard"
+      ],
+      "name": "Tap",
+      "key": "Digit4",
+      "location": [
+        {
+          "type": "position",
+          "anchor": [
+            1,
+            1
+          ],
+          "anchor_to_target": [
+            -0.19107662,
+            -0.07490432
+          ]
+        }
+      ],
+      "radius": 0.048660472
+    }
+  ]
+}
diff --git a/ash/components/arc/input_overlay/resources/input_overlay_resources.grd b/ash/components/arc/input_overlay/resources/input_overlay_resources.grd
index a12a581..09ff87d 100644
--- a/ash/components/arc/input_overlay/resources/input_overlay_resources.grd
+++ b/ash/components/arc/input_overlay/resources/input_overlay_resources.grd
@@ -23,6 +23,8 @@
        <include name="IDR_IO_COM_DATAVISIONSTUDIO_ROGUELIKE" file="com.datavisionstudio.roguelike.json" type="BINDATA" />
        <include name="IDR_IO_COM_BLACKPANTHER_NINJAARASHI" file="com.blackpanther.ninjaarashi.json" type="BINDATA" />
        <include name="IDR_IO_COM_LOONGCHEER_NEVERLATE_WIZARDLEGEND_FIGHTMASTER" file="com.loongcheer.neverlate.wizardlegend.fightmaster.json" type="BINDATA" />
+       <include name="IDR_IO_COM_DIRELIGHT_GRIMVALOR" file="com.direlight.grimvalor.json" type="BINDATA" />
+       <include name="IDR_IO_COM_PIXELSTAR_PBR" file="com.pixelstar.pbr.json" type="BINDATA" />
     </includes>
   </release>
 </grit>
diff --git a/ash/components/arc/power/arc_power_bridge.cc b/ash/components/arc/power/arc_power_bridge.cc
index 11b6c5c4..71b759f 100644
--- a/ash/components/arc/power/arc_power_bridge.cc
+++ b/ash/components/arc/power/arc_power_bridge.cc
@@ -208,7 +208,7 @@
     vm_tools::concierge::SuspendVmRequest request;
     request.set_name(kArcVmName);
     request.set_owner_id(user_id_hash_);
-    chromeos::ConciergeClient::Get()->SuspendVm(
+    ash::ConciergeClient::Get()->SuspendVm(
         request, base::BindOnce(&ArcPowerBridge::OnConciergeSuspendVmResponse,
                                 weak_ptr_factory_.GetWeakPtr(), token));
     return;
@@ -233,7 +233,7 @@
     vm_tools::concierge::ResumeVmRequest request;
     request.set_name(kArcVmName);
     request.set_owner_id(user_id_hash_);
-    chromeos::ConciergeClient::Get()->ResumeVm(
+    ash::ConciergeClient::Get()->ResumeVm(
         request, base::BindOnce(&ArcPowerBridge::OnConciergeResumeVmResponse,
                                 weak_ptr_factory_.GetWeakPtr()));
     return;
diff --git a/ash/components/arc/session/arc_client_adapter_unittest.cc b/ash/components/arc/session/arc_client_adapter_unittest.cc
index 4148489..a9239d2c 100644
--- a/ash/components/arc/session/arc_client_adapter_unittest.cc
+++ b/ash/components/arc/session/arc_client_adapter_unittest.cc
@@ -34,11 +34,11 @@
     chromeos::DBusThreadManager::Initialize();
     chromeos::DBusThreadManager::GetSetterForTesting()->SetDebugDaemonClient(
         std::make_unique<chromeos::FakeDebugDaemonClient>());
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     ash::UpstartClient::InitializeFake();
   }
   void TearDown() override {
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/ash/components/arc/session/arc_vm_client_adapter.cc b/ash/components/arc/session/arc_vm_client_adapter.cc
index f3c06d8..ebe97a4 100644
--- a/ash/components/arc/session/arc_vm_client_adapter.cc
+++ b/ash/components/arc/session/arc_vm_client_adapter.cc
@@ -95,14 +95,6 @@
 constexpr int kLogdConfigSizeMed = 512;     // kBytes
 constexpr int kLogdConfigSizeLarge = 1024;  // kBytes
 
-// Disk size of virtio-blk image for /data.
-// TODO(b/217650747): Optimize this value.
-constexpr int64_t kDataDiskSizeBytes = 5LL * 1024 * 1024 * 1024;  // 5GB
-
-// The owner ID that ARCVM is started with for mini-ARCVM. On UpgradeArc,
-// the owner ID is set to the logged-in user.
-constexpr const char kArcVmDefaultOwner[] = "ARCVM_DEFAULT_OWNER";
-
 constexpr int64_t kInvalidCid = -1;
 
 constexpr base::TimeDelta kConnectTimeoutLimit = base::Seconds(20);
@@ -115,8 +107,8 @@
 absl::optional<base::TimeDelta> g_connect_sleep_duration_initial_for_testing;
 absl::optional<int> g_boot_notification_server_fd;
 
-chromeos::ConciergeClient* GetConciergeClient() {
-  return chromeos::ConciergeClient::Get();
+ash::ConciergeClient* GetConciergeClient() {
+  return ash::ConciergeClient::Get();
 }
 
 chromeos::DebugDaemonClient* GetDebugDaemonClient() {
@@ -370,6 +362,7 @@
 }
 
 vm_tools::concierge::StartArcVmRequest CreateStartArcVmRequest(
+    const std::string& user_id_hash,
     uint32_t cpus,
     const base::FilePath& demo_session_apps_path,
     const absl::optional<base::FilePath>& data_image_path,
@@ -380,7 +373,7 @@
   vm_tools::concierge::StartArcVmRequest request;
 
   request.set_name(kArcVmName);
-  request.set_owner_id(kArcVmDefaultOwner);
+  request.set_owner_id(user_id_hash);
   request.set_use_per_vm_core_scheduling(use_per_vm_core_scheduling);
 
   if (file_system_status.is_host_rootfs_writable() &&
@@ -630,8 +623,8 @@
 }
 
 class ArcVmClientAdapter : public ArcClientAdapter,
-                           public chromeos::ConciergeClient::VmObserver,
-                           public chromeos::ConciergeClient::Observer,
+                           public ash::ConciergeClient::VmObserver,
+                           public ash::ConciergeClient::Observer,
                            public ConnectionObserver<arc::mojom::AppInstance> {
  public:
   // Initializing |is_host_on_vm_| and |is_dev_mode_| is not always very fast.
@@ -667,7 +660,7 @@
     client->RemoveVmObserver(this);
   }
 
-  // chromeos::ConciergeClient::VmObserver overrides:
+  // ash::ConciergeClient::VmObserver overrides:
   void OnVmStarted(
       const vm_tools::concierge::VmStartedSignal& signal) override {
     if (signal.name() == kArcVmName)
@@ -694,6 +687,15 @@
   // ArcClientAdapter overrides:
   void StartMiniArc(StartParams params,
                     chromeos::VoidDBusMethodCallback callback) override {
+    // This step is mandatory regardless of StartMiniArc is called or not
+    // from |ArcSessionManager|. It is also called after login for ARCVM.
+    if (user_id_hash_.empty()) {
+      LOG(ERROR) << "User ID hash is not set";
+      StopArcInstanceInternal();
+      std::move(callback).Run(false);
+      return;
+    }
+
     start_params_ = std::move(params);
     base::ThreadPool::PostTaskAndReplyWithResult(
         FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
@@ -705,12 +707,7 @@
 
   void UpgradeArc(UpgradeParams params,
                   chromeos::VoidDBusMethodCallback callback) override {
-    if (user_id_hash_.empty()) {
-      LOG(ERROR) << "User ID hash is not set";
-      StopArcInstanceInternal();
-      std::move(callback).Run(false);
-      return;
-    }
+    DCHECK(!user_id_hash_.empty());
     if (serial_number_.empty()) {
       LOG(ERROR) << "Serial number is not set";
       StopArcInstanceInternal();
@@ -718,15 +715,10 @@
       return;
     }
 
-    // Stop the existing full-VM if any (e.g. in case of a chrome crash).
-    VLOG(1) << "Stopping the existing full-VM if any.";
-    vm_tools::concierge::StopVmRequest request;
-    request.set_name(kArcVmName);
-    request.set_owner_id(user_id_hash_);
-    GetConciergeClient()->StopVm(
-        request, base::BindOnce(&ArcVmClientAdapter::OnExistingFullVmStopped,
-                                weak_factory_.GetWeakPtr(), std::move(params),
-                                std::move(callback)));
+    VLOG(1) << "Checking adb sideload status";
+    chromeos::SessionManagerClient::Get()->QueryAdbSideload(base::BindOnce(
+        &ArcVmClientAdapter::OnQueryAdbSideload, weak_factory_.GetWeakPtr(),
+        std::move(params), std::move(callback)));
   }
 
   void StopArcInstance(bool on_shutdown, bool should_backup_log) override {
@@ -781,6 +773,7 @@
                          /*failure_reason=*/"user_id_hash_ is not set"));
       return;
     }
+
     vm_tools::concierge::ReclaimVmMemoryRequest request;
     request.set_name(kArcVmName);
     request.set_owner_id(user_id_hash_);
@@ -791,7 +784,7 @@
                        weak_factory_.GetWeakPtr(), std::move(callback)));
   }
 
-  // chromeos::ConciergeClient::Observer overrides:
+  // ash::ConciergeClient::Observer overrides:
   void ConciergeServiceStopped() override {
     VLOG(1) << "vm_concierge stopped";
     // At this point, all crosvm processes are gone. Notify the observer of the
@@ -848,23 +841,9 @@
     // regardless of whether the VM exists, check to see which VM is actually
     // running.
 
-    vm_tools::concierge::GetVmInfoRequest request;
-    request.set_name(kArcVmName);
-    request.set_owner_id(user_id_hash_);
-    GetConciergeClient()->GetVmInfo(
-        request, base::BindOnce(&ArcVmClientAdapter::OnGetVmReply,
-                                weak_factory_.GetWeakPtr()));
-  }
-
-  void OnGetVmReply(
-      absl::optional<vm_tools::concierge::GetVmInfoResponse> reply) {
     vm_tools::concierge::StopVmRequest request;
     request.set_name(kArcVmName);
-
-    if (reply.has_value() && reply.value().success())
-      request.set_owner_id(user_id_hash_);
-    else
-      request.set_owner_id(kArcVmDefaultOwner);
+    request.set_owner_id(user_id_hash_);
 
     GetConciergeClient()->StopVm(
         request, base::BindOnce(&ArcVmClientAdapter::OnStopVmReply,
@@ -919,18 +898,18 @@
       return;
     }
 
-    // Stop the existing mini-VM if any (e.g. in case of a chrome crash).
-    VLOG(1) << "Stopping the existing mini-VM if any.";
+    // Stop the existing VM if any (e.g. in case of a chrome crash).
+    VLOG(1) << "Stopping the existing VM if any.";
     vm_tools::concierge::StopVmRequest request;
     request.set_name(kArcVmName);
-    request.set_owner_id(kArcVmDefaultOwner);
+    request.set_owner_id(user_id_hash_);
     GetConciergeClient()->StopVm(
         request,
-        base::BindOnce(&ArcVmClientAdapter::OnExistingMiniVmStopped,
+        base::BindOnce(&ArcVmClientAdapter::OnExistingVmStopped,
                        weak_factory_.GetWeakPtr(), std::move(callback)));
   }
 
-  void OnExistingMiniVmStopped(
+  void OnExistingVmStopped(
       chromeos::VoidDBusMethodCallback callback,
       absl::optional<vm_tools::concierge::StopVmResponse> reply) {
     // reply->success() returns true even when there was no VM running.
@@ -1002,10 +981,11 @@
     }
 
     // Use virtio-blk for /data.
+    // If request.disk_size is not set, concierge calculates the desired size
+    // (90% of the available space) and creates a sparse disk image.
     vm_tools::concierge::CreateDiskImageRequest request;
     request.set_cryptohome_id(user_id_hash_);
     request.set_vm_name(kArcVmName);
-    request.set_disk_size(kDataDiskSizeBytes);
     request.set_image_type(vm_tools::concierge::DISK_IMAGE_AUTO);
     request.set_storage_location(vm_tools::concierge::STORAGE_CRYPTOHOME_ROOT);
 
@@ -1073,8 +1053,9 @@
         start_params_, file_system_status, *is_dev_mode_, is_host_on_vm_,
         GetChromeOsChannelFromLsbRelease());
     auto start_request = CreateStartArcVmRequest(
-        cpus, demo_session_apps_path, data_image_path, file_system_status,
-        use_per_vm_core_scheduling, std::move(kernel_cmdline), delegate_.get());
+        user_id_hash_, cpus, demo_session_apps_path, data_image_path,
+        file_system_status, use_per_vm_core_scheduling,
+        std::move(kernel_cmdline), delegate_.get());
 
     GetConciergeClient()->StartArcVm(
         start_request,
@@ -1104,26 +1085,6 @@
     std::move(callback).Run(true);
   }
 
-  void OnExistingFullVmStopped(
-      UpgradeParams params,
-      chromeos::VoidDBusMethodCallback callback,
-      absl::optional<vm_tools::concierge::StopVmResponse> reply) {
-    // reply->success() returns true even when there was no VM running.
-    if (!reply.has_value() || !reply->success()) {
-      LOG(ERROR) << "StopVm failed: "
-                 << (reply.has_value() ? reply->failure_reason()
-                                       : "No D-Bus response.");
-      StopArcInstanceInternal();
-      std::move(callback).Run(false);
-      return;
-    }
-
-    VLOG(1) << "Checking adb sideload status";
-    chromeos::SessionManagerClient::Get()->QueryAdbSideload(base::BindOnce(
-        &ArcVmClientAdapter::OnQueryAdbSideload, weak_factory_.GetWeakPtr(),
-        std::move(params), std::move(callback)));
-  }
-
   void OnQueryAdbSideload(
       UpgradeParams params,
       chromeos::VoidDBusMethodCallback callback,
@@ -1177,38 +1138,6 @@
       return;
     }
 
-    VLOG(1) << "Setting owner ID for mini-VM instance.";
-    vm_tools::concierge::SetVmIdRequest request;
-    request.set_name(kArcVmName);
-    request.set_src_owner_id(kArcVmDefaultOwner);
-    request.set_dest_owner_id(user_id_hash_);
-    GetConciergeClient()->SetVmId(
-        request, base::BindOnce(&ArcVmClientAdapter::OnSetVmId,
-                                weak_factory_.GetWeakPtr(), std::move(params),
-                                std::move(callback)));
-  }
-
-  void OnSetVmId(UpgradeParams params,
-                 chromeos::VoidDBusMethodCallback callback,
-                 absl::optional<vm_tools::concierge::SetVmIdResponse> reply) {
-    if (!reply.has_value()) {
-      LOG(ERROR) << "Failed to set VM ID. Empty response.";
-      StopArcInstanceInternal();
-      std::move(callback).Run(false);
-      return;
-    }
-
-    const vm_tools::concierge::SetVmIdResponse& response = reply.value();
-    if (!response.success()) {
-      LOG(ERROR) << "Failed to set VM ID. Failure reason="
-                 << response.failure_reason();
-      StopArcInstanceInternal();
-      std::move(callback).Run(false);
-      return;
-    }
-
-    VLOG(2) << "Set VM id for default instance";
-
     base::ThreadPool::PostTaskAndReplyWithResult(
         FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
         base::BindOnce(&SendUpgradePropsToArcVmBootNotificationServer,
diff --git a/ash/components/arc/session/arc_vm_client_adapter_unittest.cc b/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
index abb408bd7..6aab62e7 100644
--- a/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
+++ b/ash/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -70,7 +70,6 @@
     "arcvm_2dpost_2dlogin_2dservices";
 constexpr char kArcVmPostVmStartServicesJobName[] =
     "arcvm_2dpost_2dvm_2dstart_2dservices";
-constexpr const char kArcVmDefaultOwner[] = "ARCVM_DEFAULT_OWNER";
 
 // Disk path contained in CreateDiskImageResponse().
 constexpr const char kCreatedDiskImagePath[] = "test/data.img";
@@ -174,7 +173,7 @@
 
 // A concierge that remembers the parameter passed to StartArcVm.
 // TODO(yusukes): Merge the feature to FakeConciergeClient.
-class TestConciergeClient : public chromeos::FakeConciergeClient {
+class TestConciergeClient : public ash::FakeConciergeClient {
  public:
   static void Initialize() { new TestConciergeClient(); }
 
@@ -188,7 +187,7 @@
                   callback) override {
     ++stop_vm_call_count_;
     stop_vm_request_ = request;
-    chromeos::FakeConciergeClient::StopVm(request, std::move(callback));
+    ash::FakeConciergeClient::StopVm(request, std::move(callback));
     if (on_stop_vm_callback_ && (stop_vm_call_count_ == callback_count_))
       std::move(on_stop_vm_callback_).Run();
   }
@@ -198,7 +197,7 @@
       chromeos::DBusMethodCallback<vm_tools::concierge::StartVmResponse>
           callback) override {
     start_arc_vm_request_ = request;
-    chromeos::FakeConciergeClient::StartArcVm(request, std::move(callback));
+    ash::FakeConciergeClient::StartArcVm(request, std::move(callback));
   }
 
   void ReclaimVmMemory(
@@ -207,8 +206,7 @@
           callback) override {
     ++reclaim_vm_count_;
     reclaim_vm_request_ = request;
-    chromeos::FakeConciergeClient::ReclaimVmMemory(request,
-                                                   std::move(callback));
+    ash::FakeConciergeClient::ReclaimVmMemory(request, std::move(callback));
   }
 
   int stop_vm_call_count() const { return stop_vm_call_count_; }
@@ -237,7 +235,7 @@
 
  private:
   TestConciergeClient()
-      : chromeos::FakeConciergeClient(/*fake_cicerone_client=*/nullptr) {}
+      : ash::FakeConciergeClient(/*fake_cicerone_client=*/nullptr) {}
 
   int stop_vm_call_count_ = 0;
   // When callback_count_ == 0, the on_stop_vm_callback_ is not run.
@@ -362,7 +360,7 @@
   ArcVmClientAdapterTest& operator=(const ArcVmClientAdapterTest&) = delete;
 
   ~ArcVmClientAdapterTest() override {
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
@@ -453,6 +451,15 @@
   }
 
   void StartMiniArcWithParams(bool expect_success, StartParams params) {
+    StartMiniArcWithParamsAndUser(expect_success, std::move(params),
+                                  kUserIdHash, kSerialNumber);
+  }
+
+  void StartMiniArcWithParamsAndUser(bool expect_success,
+                                     StartParams params,
+                                     const std::string& hash,
+                                     const std::string& serial) {
+    SetUserInfo(hash, serial);
     adapter()->StartMiniArc(
         std::move(params),
         base::BindOnce(expect_success
@@ -586,19 +593,14 @@
         ash::FakeUpstartClient::StartStopJobCallback());
   }
 
-  // Calls ArcVmClientAdapter::StopArcInstance().
-  // If |arc_upgraded| is false, we expect ConciergeClient::StopVm to have been
-  // called two times, once to clear a stale mini-VM in StartMiniArc(), and
-  // another on this call to StopArcInstance().
-  // If |arc_upgraded| is true, we expect StopVm() to have been called three
-  // times, to clear a stale mini-VM in StartMiniArc(), to clear a stale
-  // full-VM in UpgradeArc, and finally on this call to StopArcInstance();
-  void StopArcInstance(bool arc_upgraded) {
+  // We expect ConciergeClient::StopVm to have been called two times,
+  // once to clear a stale VM in StartMiniArc(), and another on this
+  // call to StopArcInstance().
+  void StopArcInstance() {
     adapter()->StopArcInstance(/*on_shutdown=*/false,
                                /*should_backup_log=*/false);
     run_loop()->RunUntilIdle();
-    EXPECT_EQ(arc_upgraded ? 3 : 2,
-              GetTestConciergeClient()->stop_vm_call_count());
+    EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
     EXPECT_FALSE(is_system_shutdown().has_value());
 
     RecreateRunLoop();
@@ -610,15 +612,11 @@
 
   // Checks that ArcVmClientAdapter has requested to stop the VM (after an
   // error in UpgradeArc).
-  // If |stale_full_vm_stopped| is false, we expect ConciergeClient::StopVm to
-  // have been called two times, once to clear a stale mini-VM in
-  // StartMiniArc(), and another after some error condition. If
-  // |stale_full_vm_stopped| is true, we expect StopVm() to have been called
-  // three times, to clear a stale mini-VM in StartMiniArc(), to clear a stale
-  // full-VM in UpgradeArc, and finally after some error condition.
-  void ExpectArcStopped(bool stale_full_vm_stopped) {
-    EXPECT_EQ(stale_full_vm_stopped ? 3 : 2,
-              GetTestConciergeClient()->stop_vm_call_count());
+  // We expect ConciergeClient::StopVm to have been called two times,
+  // once to clear a stale VM in StartMiniArc(), and another after some
+  // error condition.
+  void ExpectArcStopped() {
+    EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
     EXPECT_FALSE(is_system_shutdown().has_value());
     RecreateRunLoop();
     SendVmStoppedSignal(vm_tools::concierge::STOP_VM_REQUESTED);
@@ -640,7 +638,7 @@
     return upstart_operations_;
   }
   TestConciergeClient* GetTestConciergeClient() {
-    return static_cast<TestConciergeClient*>(chromeos::ConciergeClient::Get());
+    return static_cast<TestConciergeClient*>(ash::ConciergeClient::Get());
   }
 
   TestDebugDaemonClient* GetTestDebugDaemonClient() {
@@ -719,8 +717,24 @@
 TEST_F(ArcVmClientAdapterTest, StartMiniArc) {
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
+  // No GetVmInfo call is expected
+  EXPECT_EQ(0, GetTestConciergeClient()->get_vm_info_call_count());
+  // Expect StopVm() to be called  once in StartMiniArc to clear stale
+  // VM.
+  EXPECT_EQ(1, GetTestConciergeClient()->stop_vm_call_count());
 
-  StopArcInstance(/*arc_upgraded=*/false);
+  StopArcInstance();
+}
+
+TEST_F(ArcVmClientAdapterTest, StartMiniArcEmptyUserIdHash) {
+  StartMiniArcWithParamsAndUser(false, {}, std::string(), kSerialNumber);
+
+  EXPECT_EQ(0, GetTestConciergeClient()->start_arc_vm_call_count());
+  // No GetVmInfo call is expected
+  EXPECT_EQ(0, GetTestConciergeClient()->get_vm_info_call_count());
+  // Expect StopVm() to be called  once in StartMiniArc to clear stale
+  // VM.
+  EXPECT_EQ(1, GetTestConciergeClient()->stop_vm_call_count());
 }
 
 // Tests that StartMiniArc() still succeeds without the feature.
@@ -732,7 +746,7 @@
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
-  StopArcInstance(/*arc_upgraded=*/false);
+  StopArcInstance();
 }
 
 // Tests that StartMiniArc() still succeeds even when Upstart fails to stop
@@ -744,7 +758,7 @@
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
-  StopArcInstance(/*arc_upgraded=*/false);
+  StopArcInstance();
 }
 
 // Tests that StartMiniArc() fails when Upstart fails to start the job.
@@ -777,7 +791,7 @@
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
-  StopArcInstance(/*arc_upgraded=*/false);
+  StopArcInstance();
 }
 
 // Tests that StartMiniArc()'s JOB_STOP_AND_START for
@@ -803,14 +817,13 @@
 
 // Tests that StopArcInstance() eventually notifies the observer.
 TEST_F(ArcVmClientAdapterTest, StopArcInstance) {
-  SetValidUserInfo();
   StartMiniArc();
   UpgradeArc(true);
 
   adapter()->StopArcInstance(/*on_shutdown=*/false,
                              /*should_backup_log=*/false);
   run_loop()->RunUntilIdle();
-  EXPECT_EQ(3, GetTestConciergeClient()->stop_vm_call_count());
+  EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
   // The callback for StopVm D-Bus reply does NOT call ArcInstanceStopped when
   // the D-Bus call result is successful.
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -881,7 +894,6 @@
     bool stopped_called_ = false;
   };
 
-  SetValidUserInfo();
   StartMiniArc();
   UpgradeArc(true);
 
@@ -907,13 +919,12 @@
 
 // Tests that StopArcInstance() initiates ARC log backup.
 TEST_F(ArcVmClientAdapterTest, StopArcInstance_WithLogBackup) {
-  SetValidUserInfo();
   StartMiniArc();
   UpgradeArc(true);
 
   adapter()->StopArcInstance(/*on_shutdown=*/false, /*should_backup_log=*/true);
   run_loop()->RunUntilIdle();
-  EXPECT_EQ(3, GetTestConciergeClient()->stop_vm_call_count());
+  EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
   // The callback for StopVm D-Bus reply does NOT call ArcInstanceStopped when
   // the D-Bus call result is successful.
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -928,7 +939,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, StopArcInstance_WithLogBackup_BackupFailed) {
-  SetValidUserInfo();
   StartMiniArc();
   UpgradeArc(true);
 
@@ -937,7 +947,7 @@
 
   adapter()->StopArcInstance(/*on_shutdown=*/false, /*should_backup_log=*/true);
   run_loop()->RunUntilIdle();
-  EXPECT_EQ(3, GetTestConciergeClient()->stop_vm_call_count());
+  EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
   // The callback for StopVm D-Bus reply does NOT call ArcInstanceStopped when
   // the D-Bus call result is successful.
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -955,19 +965,17 @@
 
 // Tests that StopArcInstance() called during shutdown doesn't do anything.
 TEST_F(ArcVmClientAdapterTest, StopArcInstance_OnShutdown) {
-  SetValidUserInfo();
   StartMiniArc();
   UpgradeArc(true);
 
   adapter()->StopArcInstance(/*on_shutdown=*/true, /*should_backup_log=*/false);
   run_loop()->RunUntilIdle();
-  EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
+  EXPECT_EQ(1, GetTestConciergeClient()->stop_vm_call_count());
   EXPECT_FALSE(is_system_shutdown().has_value());
 }
 
 // Tests that StopArcInstance() immediately notifies the observer on failure.
 TEST_F(ArcVmClientAdapterTest, StopArcInstance_Fail) {
-  SetValidUserInfo();
   StartMiniArc();
   UpgradeArc(true);
 
@@ -980,7 +988,7 @@
                              /*should_backup_log=*/false);
 
   run_loop()->Run();
-  EXPECT_EQ(3, GetTestConciergeClient()->stop_vm_call_count());
+  EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
 
   // The callback for StopVm D-Bus reply does call ArcInstanceStopped when
   // the D-Bus call result is NOT successful.
@@ -988,41 +996,35 @@
   EXPECT_FALSE(is_system_shutdown().value());
 }
 
-// Test that StopArcInstance() stops the mini-VM if it cannot find a VM with
-// the current user ID hash.
+// Test that StopArcInstance() stops the VM if only mini-ARCVM
+// is called.
 TEST_F(ArcVmClientAdapterTest, StopArcInstance_StopMiniVm) {
   StartMiniArc();
 
-  SetValidUserInfo();
-
-  vm_tools::concierge::GetVmInfoResponse response;
-  response.set_success(false);
-  GetTestConciergeClient()->set_get_vm_info_response(response);
-
   adapter()->StopArcInstance(/*on_shutdown=*/false,
                              /*should_backup_log*/ false);
   run_loop()->RunUntilIdle();
 
-  EXPECT_GE(GetTestConciergeClient()->get_vm_info_call_count(), 1);
+  // No GetVmInfo call is expected.
+  EXPECT_EQ(0, GetTestConciergeClient()->get_vm_info_call_count());
   // Expect StopVm() to be called twice; once in StartMiniArc to clear stale
-  // mini-VM, and again on StopArcInstance().
+  // VM, and again on StopArcInstance().
   EXPECT_EQ(2, GetTestConciergeClient()->stop_vm_call_count());
-  EXPECT_EQ(kArcVmDefaultOwner,
+  EXPECT_EQ(kUserIdHash,
             GetTestConciergeClient()->stop_vm_request().owner_id());
 }
 
 // Tests that UpgradeArc() handles arcvm-post-login-services startup failures
 // properly.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_StartArcVmPostLoginServicesFailure) {
-  SetValidUserInfo();
   StartMiniArc();
 
   // Inject failure to FakeUpstartClient.
   InjectUpstartStartJobFailure(kArcVmPostLoginServicesJobName);
 
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
+  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/2);
 
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
+  ExpectArcStopped();
 }
 
 // Tests that StartMiniArc()'s JOB_STOP_AND_START for
@@ -1030,7 +1032,6 @@
 // by default.
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_UreadaheadByDefault) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartRecordingUpstartOperations();
   StartMiniArcWithParams(true, std::move(start_params));
 
@@ -1049,7 +1050,6 @@
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_DisableUreadahead) {
   StartParams start_params(GetPopulatedStartParams());
   start_params.disable_ureadahead = true;
-  SetValidUserInfo();
   StartRecordingUpstartOperations();
   StartMiniArcWithParams(true, std::move(start_params));
 
@@ -1069,7 +1069,6 @@
 // properly.
 TEST_F(ArcVmClientAdapterTest,
        StartMiniArc_StopArcVmPostVmStartServicesFailure) {
-  SetValidUserInfo();
   // Inject failure to FakeUpstartClient.
   InjectUpstartStopJobFailure(kArcVmPostVmStartServicesJobName);
 
@@ -1088,43 +1087,29 @@
 // failures properly.
 TEST_F(ArcVmClientAdapterTest,
        UpgradeArc_StartArcVmPostVmStartServicesFailure) {
-  SetValidUserInfo();
   StartMiniArc();
 
   // Inject failure to FakeUpstartClient.
   InjectUpstartStartJobFailure(kArcVmPostVmStartServicesJobName);
   // UpgradeArc should fail and the VM should be stoppped.
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
-}
-
-// Tests that "no user ID hash" failure is handled properly.
-TEST_F(ArcVmClientAdapterTest, UpgradeArc_NoUserId) {
-  // Don't set the user id hash.
-  SetUserInfo(std::string(), kSerialNumber);
-  StartMiniArc();
-  EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
-
   UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/2);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/false);
+  ExpectArcStopped();
 }
 
 // Tests that a "Failed Adb Sideload response" case is handled properly.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_FailedAdbResponse) {
-  SetValidUserInfo();
   StartMiniArc();
 
   // Ask the Fake Session Manager to return a failed Adb Sideload response.
   chromeos::FakeSessionManagerClient::Get()->set_adb_sideload_response(
       chromeos::FakeSessionManagerClient::AdbSideloadResponseCode::FAILED);
 
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
+  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/2);
+  ExpectArcStopped();
 }
 
 // Tests that a "Need_Powerwash Adb Sideload response" case is handled properly.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_NeedPowerwashAdbResponse) {
-  SetValidUserInfo();
   StartMiniArc();
 
   // Ask the Fake Session Manager to return a Need_Powerwash Adb Sideload
@@ -1141,7 +1126,6 @@
 
 // Tests that adb sideloading is disabled by default.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_AdbSideloadingPropertyDefault) {
-  SetValidUserInfo();
   StartMiniArc();
 
   UpgradeArc(true);
@@ -1153,7 +1137,6 @@
 
 // Tests that adb sideloading can be controlled via session_manager.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_AdbSideloadingPropertyEnabled) {
-  SetValidUserInfo();
   StartMiniArc();
 
   chromeos::FakeSessionManagerClient::Get()->set_adb_sideload_enabled(true);
@@ -1165,7 +1148,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_AdbSideloadingPropertyDisabled) {
-  SetValidUserInfo();
   StartMiniArc();
 
   chromeos::FakeSessionManagerClient::Get()->set_adb_sideload_enabled(false);
@@ -1179,38 +1161,11 @@
 // Tests that "no serial" failure is handled properly.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_NoSerial) {
   // Don't set the serial number.
-  SetUserInfo(kUserIdHash, std::string());
-  StartMiniArc();
+  StartMiniArcWithParamsAndUser(true, {}, kUserIdHash, std::string());
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
   UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/2);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/false);
-}
-
-// Test that ConciergeClient::SetVmId() empty reply is handled properly.
-TEST_F(ArcVmClientAdapterTest, UpgradeArc_SetVmIdEmptyReply) {
-  SetValidUserInfo();
-  StartMiniArc();
-
-  // Inject failure
-  GetTestConciergeClient()->set_set_vm_id_response(absl::nullopt);
-
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
-}
-
-// Test that ConciergeClient::SetVmId() unsuccessful reply is handled properly.
-TEST_F(ArcVmClientAdapterTest, UpgradeArc_SetVmIdFailure) {
-  SetValidUserInfo();
-  StartMiniArc();
-
-  // Inject failure
-  vm_tools::concierge::SetVmIdResponse response;
-  response.set_success(false);
-  GetTestConciergeClient()->set_set_vm_id_response(response);
-
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
+  ExpectArcStopped();
 }
 
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_StopExistingVmFailure) {
@@ -1235,30 +1190,6 @@
   EXPECT_FALSE(is_system_shutdown().has_value());
 }
 
-TEST_F(ArcVmClientAdapterTest, UpgradeArc_StopExistingVmFailure) {
-  SetValidUserInfo();
-  StartMiniArc();
-
-  // Inject failure.
-  vm_tools::concierge::StopVmResponse response;
-  response.set_success(false);
-  GetTestConciergeClient()->set_stop_vm_response(response);
-
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
-}
-
-TEST_F(ArcVmClientAdapterTest, UpgradeArc_StopExistingVmFailureEmptyReply) {
-  SetValidUserInfo();
-  StartMiniArc();
-
-  // Inject failure.
-  GetTestConciergeClient()->set_stop_vm_response(absl::nullopt);
-
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
-}
-
 // Tests that ConciergeClient::WaitForServiceToBeAvailable() failure is handled
 // properly.
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_WaitForConciergeAvailableFailure) {
@@ -1273,7 +1204,6 @@
 
 // Tests that StartArcVm() failure is handled properly.
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_StartArcVmFailure) {
-  SetValidUserInfo();
   // Inject failure to StartArcVm().
   vm_tools::concierge::StartVmResponse start_vm_response;
   start_vm_response.set_status(vm_tools::concierge::VM_STATUS_UNKNOWN);
@@ -1286,7 +1216,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_StartArcVmFailureEmptyReply) {
-  SetValidUserInfo();
   // Inject failure to StartArcVm(). This emulates D-Bus timeout situations.
   GetTestConciergeClient()->set_start_vm_response(absl::nullopt);
 
@@ -1298,19 +1227,17 @@
 
 // Tests that successful StartArcVm() call is handled properly.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_Success) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
   UpgradeArc(true);
 
-  StopArcInstance(/*arc_upgraded=*/true);
+  StopArcInstance();
 }
 
 // Try to start and upgrade the instance with more params.
 TEST_F(ArcVmClientAdapterTest, StartUpgradeArc_VariousParams) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
 
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
@@ -1328,7 +1255,6 @@
   start_params.play_store_auto_update =
       StartParams::PlayStoreAutoUpdate::AUTO_UPDATE_OFF;
 
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
 
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
@@ -1378,7 +1304,6 @@
   // Make sure disks have the squashfs image.
   EXPECT_TRUE(HasDiskImage(request, kDemoImage));
 
-  SetValidUserInfo();
   UpgradeParams params(GetPopulatedUpgradeParams());
   // Enable demo mode.
   params.is_demo_session = true;
@@ -1391,7 +1316,6 @@
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_DisableSystemDefaultApp) {
   StartParams start_params(GetPopulatedStartParams());
   start_params.arc_disable_system_default_app = true;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -1403,7 +1327,6 @@
 TEST_F(ArcVmClientAdapterTest, StartUpgradeArc_DisableMediaStoreMaintenance) {
   StartParams start_params(GetPopulatedStartParams());
   start_params.disable_media_store_maintenance = true;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeParams params(GetPopulatedUpgradeParams());
   UpgradeArcWithParams(true, std::move(params));
@@ -1432,7 +1355,6 @@
 
 TEST_F(ArcVmClientAdapterTest, StartUpgradeArc_ArcVmUreadaheadMode) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeParams params(GetPopulatedUpgradeParams());
   UpgradeArcWithParams(true, std::move(params));
@@ -1446,7 +1368,6 @@
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_EnablePaiGeneration) {
   StartParams start_params(GetPopulatedStartParams());
   start_params.arc_generate_play_auto_install = true;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1454,7 +1375,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_PaiGenerationDefaultDisabled) {
-  SetValidUserInfo();
   StartMiniArcWithParams(true, GetPopulatedStartParams());
   // No androidboot property should be generated.
   EXPECT_FALSE(
@@ -1467,7 +1387,6 @@
 
 // Tests that StartArcVm() is called with valid parameters.
 TEST_F(ArcVmClientAdapterTest, StartMiniArc_StartArcVmParams) {
-  SetValidUserInfo();
   StartMiniArc();
   ASSERT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
@@ -1482,7 +1401,6 @@
 
 // Tests that crosvm crash is handled properly.
 TEST_F(ArcVmClientAdapterTest, CrosvmCrash) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -1497,7 +1415,6 @@
 
 // Tests that vm_concierge shutdown is handled properly.
 TEST_F(ArcVmClientAdapterTest, ConciergeShutdown) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -1520,7 +1437,6 @@
 
 // Tests that vm_concierge crash is handled properly.
 TEST_F(ArcVmClientAdapterTest, ConciergeCrash) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -1535,7 +1451,6 @@
 
 // Tests the case where crosvm crashes, then vm_concierge crashes too.
 TEST_F(ArcVmClientAdapterTest, CrosvmAndConciergeCrashes) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -1558,7 +1473,6 @@
 
 // Tests the case where a unknown VmStopped signal is sent to Chrome.
 TEST_F(ArcVmClientAdapterTest, VmStoppedSignal_UnknownCid) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -1634,7 +1548,6 @@
       "CHROMEOS_RELEASE_TRACK=stable-channel", base::Time::Now());
 
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1646,7 +1559,6 @@
                                              base::Time::Now());
 
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1658,7 +1570,6 @@
   feature_list.InitWithFeatureState(arc::kUseDefaultBlockSize, true /* use */);
 
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_EQ(
       0u, GetTestConciergeClient()->start_arc_vm_request().rootfs_block_size());
@@ -1666,7 +1577,6 @@
 
 TEST_F(ArcVmClientAdapterTest, SpecifyBlockSize) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_EQ(
       4096u,
@@ -1680,7 +1590,6 @@
   GetTestConciergeClient()->set_create_disk_image_response(
       CreateDiskImageResponse(vm_tools::concierge::DISK_STATUS_CREATED));
 
-  SetValidUserInfo();
   StartMiniArcWithParams(true, GetPopulatedStartParams());
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
@@ -1702,7 +1611,6 @@
   GetTestConciergeClient()->set_create_disk_image_response(absl::nullopt);
 
   // StartArcVm should NOT be called.
-  SetValidUserInfo();
   StartMiniArcWithParams(false, {});
   EXPECT_EQ(GetTestConciergeClient()->start_arc_vm_call_count(), 0);
 
@@ -1717,7 +1625,6 @@
       CreateDiskImageResponse(vm_tools::concierge::DISK_STATUS_FAILED));
 
   // StartArcVm should NOT be called.
-  SetValidUserInfo();
   StartMiniArcWithParams(false, {});
   EXPECT_EQ(GetTestConciergeClient()->start_arc_vm_call_count(), 0);
 
@@ -1731,7 +1638,6 @@
   GetTestConciergeClient()->set_create_disk_image_response(
       CreateDiskImageResponse(vm_tools::concierge::DISK_STATUS_CREATED));
 
-  SetValidUserInfo();
   StartMiniArcWithParams(true, GetPopulatedStartParams());
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
@@ -1751,7 +1657,6 @@
   GetTestConciergeClient()->set_create_disk_image_response(
       CreateDiskImageResponse(vm_tools::concierge::DISK_STATUS_EXISTS));
 
-  SetValidUserInfo();
   StartMiniArcWithParams(true, GetPopulatedStartParams());
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
 
@@ -1769,7 +1674,6 @@
       "CHROMEOS_RELEASE_TRACK=testimage-channel", base::Time::Now());
 
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeArc(true);
   EXPECT_TRUE(
@@ -1782,7 +1686,6 @@
       "CHROMEOS_RELEASE_TRACK=stable-channel", base::Time::Now());
 
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeArc(true);
   EXPECT_FALSE(
@@ -1795,7 +1698,6 @@
                                              base::Time::Now());
 
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeArc(true);
   EXPECT_FALSE(
@@ -1807,7 +1709,6 @@
 // enabled by USE flags.
 TEST_F(ArcVmClientAdapterTest, BintaryTranslationTypeNone) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1820,7 +1721,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--enable-houdini"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1833,7 +1733,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--enable-houdini64"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1846,7 +1745,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--enable-ndk-translation"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1859,7 +1757,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--enable-ndk-translation64"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1874,7 +1771,6 @@
       {"", "--enable-houdini", "--enable-ndk-translation"});
   StartParams start_params(GetPopulatedStartParams());
   start_params.native_bridge_experiment = true;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1889,7 +1785,6 @@
       {"", "--enable-houdini", "--enable-ndk-translation"});
   StartParams start_params(GetPopulatedStartParams());
   start_params.native_bridge_experiment = false;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_TRUE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1901,7 +1796,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--arcvm-ureadahead-mode=generate"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_FALSE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1916,7 +1810,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--arcvm-ureadahead-mode=disabled"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_FALSE(
       base::Contains(GetTestConciergeClient()->start_arc_vm_request().params(),
@@ -1930,7 +1823,6 @@
 // twice: once in StartMiniArc to check that it is listening, and the second
 // time in UpgradeArc to send props.
 TEST_F(ArcVmClientAdapterTest, TestConnectToBootNotificationServer) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_EQ(boot_notification_server()->connection_count(), 1);
   EXPECT_TRUE(boot_notification_server()->received_data().empty());
@@ -1963,33 +1855,30 @@
 // Tests that UpgradeArc() fails when sending the upgrade props
 // to the boot notification server fails.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_SendPropFail) {
-  SetValidUserInfo();
   StartMiniArc();
 
   // Let ConnectToArcVmBootNotificationServer() return an invalid FD.
   SetArcVmBootNotificationServerFdForTesting(-1);
 
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
+  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/2);
+  ExpectArcStopped();
 }
 
 // Tests that UpgradeArc() fails when sending the upgrade props
 // to the boot notification server fails.
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_SendPropFailNotWritable) {
-  SetValidUserInfo();
   StartMiniArc();
 
   // Let ConnectToArcVmBootNotificationServer() return dup(STDIN_FILENO) which
   // is not writable.
   SetArcVmBootNotificationServerFdForTesting(STDIN_FILENO);
 
-  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/3);
-  ExpectArcStopped(/*stale_full_vm_stopped=*/true);
+  UpgradeArcWithParamsAndStopVmCount(false, {}, /*run_until_stop_vm_count=*/2);
+  ExpectArcStopped();
 }
 
 TEST_F(ArcVmClientAdapterTest, DisableDownloadProviderDefault) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   // Not expected arc_disable_download_provider in properties.
@@ -2000,7 +1889,6 @@
 TEST_F(ArcVmClientAdapterTest, DisableDownloadProviderEnforced) {
   StartParams start_params(GetPopulatedStartParams());
   start_params.disable_download_provider = true;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_TRUE(
@@ -2013,7 +1901,6 @@
   feature_list.InitWithFeatureState(arc::kVmGmsCoreLowMemoryKillerProtection,
                                     false);
 
-  SetValidUserInfo();
   StartMiniArc();
 
   auto req = GetTestConciergeClient()->start_arc_vm_request();
@@ -2028,7 +1915,6 @@
   feature_list.InitWithFeatureState(arc::kVmGmsCoreLowMemoryKillerProtection,
                                     true);
 
-  SetValidUserInfo();
   StartMiniArc();
 
   auto req = GetTestConciergeClient()->start_arc_vm_request();
@@ -2038,7 +1924,6 @@
 
 TEST_F(ArcVmClientAdapterTest, TrimVmMemory_Success) {
   SetValidUserInfo();
-
   vm_tools::concierge::ReclaimVmMemoryResponse response;
   response.set_success(true);
   GetTestConciergeClient()->set_reclaim_vm_memory_response(response);
@@ -2060,7 +1945,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, TrimVmMemory_LimitPagesHonored) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2088,7 +1972,7 @@
   EXPECT_EQ(GetTestConciergeClient()->reclaim_vm_call_count(), 1);
   EXPECT_EQ(GetTestConciergeClient()->reclaim_vm_request().page_limit(), 1234);
 
-  StopArcInstance(/*arc_upgraded=*/true);
+  StopArcInstance();
 }
 
 TEST_F(ArcVmClientAdapterTest, TrimVmMemory_Failure) {
@@ -2164,7 +2048,6 @@
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--arcvm-use-hugepages"});
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_TRUE(request.use_hugepages());
@@ -2172,7 +2055,6 @@
 
 TEST_F(ArcVmClientAdapterTest, ArcVmUseHugePagesDisabled) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_FALSE(request.use_hugepages());
@@ -2184,7 +2066,6 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndDisableFeature(kVmMemorySize);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_EQ(request.memory_mib(), 0u);
@@ -2201,7 +2082,6 @@
   ASSERT_TRUE(base::GetSystemMemoryInfo(&info));
   const uint32_t total_mib = info.total / 1024;
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_EQ(request.memory_mib(), total_mib);
@@ -2218,7 +2098,6 @@
   ASSERT_TRUE(base::GetSystemMemoryInfo(&info));
   const uint32_t total_mib = info.total / 1024;
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_EQ(request.memory_mib(), total_mib - 1024);
@@ -2234,7 +2113,6 @@
   params["max_mib"] = "1024";
   feature_list.InitAndEnableFeatureWithParameters(kVmMemorySize, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   // The 1024 max_mib is below the 2048 MiB safety cut-off, so we expect
@@ -2252,7 +2130,6 @@
   params["max_mib"] = "2049";  // Above the 2048 minimum cut-off.
   feature_list.InitAndEnableFeatureWithParameters(kVmMemorySize, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_EQ(request.memory_mib(), 2049u);
@@ -2275,7 +2152,6 @@
   params["shift_mib"] = "0";
   feature_list.InitAndEnableFeatureWithParameters(kVmMemorySize, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_EQ(request.memory_mib(), 0u);
@@ -2302,7 +2178,6 @@
   params["shift_mib"] = "0";
   feature_list.InitAndEnableFeatureWithParameters(kVmMemorySize, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
 
@@ -2319,7 +2194,6 @@
   params["reclaim_kib"] = "3";
   feature_list.InitAndEnableFeatureWithParameters(kVmBalloonPolicy, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_TRUE(request.has_balloon_policy());
@@ -2335,7 +2209,6 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndDisableFeature(kVmBalloonPolicy);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   EXPECT_FALSE(request.has_balloon_policy());
@@ -2376,7 +2249,6 @@
 // Tests that OnConnectionReady() calls the ArcVmCompleteBoot call D-Bus method.
 TEST_F(ArcVmClientAdapterTest, OnConnectionReady) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeArc(true);
 
@@ -2390,7 +2262,6 @@
 // Tests that ArcVmCompleteBoot failure won't crash the adapter.
 TEST_F(ArcVmClientAdapterTest, OnConnectionReady_ArcVmCompleteBootFailure) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeArc(true);
 
@@ -2412,7 +2283,6 @@
 TEST_F(ArcVmClientAdapterTest,
        OnConnectionReady_ArcVmCompleteBootFailureNullReply) {
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   UpgradeArc(true);
 
@@ -2427,7 +2297,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_EnableArcNearbyShare_Default) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_EQ(boot_notification_server()->connection_count(), 1);
   EXPECT_TRUE(boot_notification_server()->received_data().empty());
@@ -2440,7 +2309,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_EnableArcNearbyShare_Enabled) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_EQ(boot_notification_server()->connection_count(), 1);
   EXPECT_TRUE(boot_notification_server()->received_data().empty());
@@ -2455,7 +2323,6 @@
 }
 
 TEST_F(ArcVmClientAdapterTest, UpgradeArc_EnableArcNearbyShare_Disabled) {
-  SetValidUserInfo();
   StartMiniArc();
   EXPECT_EQ(boot_notification_server()->connection_count(), 1);
   EXPECT_TRUE(boot_notification_server()->received_data().empty());
@@ -2475,7 +2342,6 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndDisableFeature(kLogdConfig);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2491,7 +2357,6 @@
   params["size"] = "333";  // Invalid size.
   feature_list.InitAndEnableFeatureWithParameters(kLogdConfig, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2507,7 +2372,6 @@
   params["size"] = "256";
   feature_list.InitAndEnableFeatureWithParameters(kLogdConfig, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2524,7 +2388,6 @@
   params["size"] = "512";
   feature_list.InitAndEnableFeatureWithParameters(kLogdConfig, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2541,7 +2404,6 @@
   params["size"] = "1024";
   feature_list.InitAndEnableFeatureWithParameters(kLogdConfig, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2556,7 +2418,6 @@
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndDisableFeature(kVmMemoryPSIReports);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2573,7 +2434,6 @@
   params["period"] = "300";
   feature_list.InitAndEnableFeatureWithParameters(kVmMemoryPSIReports, params);
   StartParams start_params(GetPopulatedStartParams());
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   EXPECT_GE(GetTestConciergeClient()->start_arc_vm_call_count(), 1);
   EXPECT_FALSE(is_system_shutdown().has_value());
@@ -2611,7 +2471,6 @@
   const auto& test_param = GetParam();
   StartParams start_params(GetPopulatedStartParams());
   start_params.dalvik_memory_profile = test_param.profile;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   if (test_param.profile_name) {
@@ -2651,7 +2510,6 @@
   const auto& test_param = GetParam();
   StartParams start_params(GetPopulatedStartParams());
   start_params.usap_profile = test_param.profile;
-  SetValidUserInfo();
   StartMiniArcWithParams(true, std::move(start_params));
   auto request = GetTestConciergeClient()->start_arc_vm_request();
   if (test_param.profile_name) {
diff --git a/ash/components/attestation/OWNERS b/ash/components/attestation/OWNERS
index c0021c8..78879ed 100644
--- a/ash/components/attestation/OWNERS
+++ b/ash/components/attestation/OWNERS
@@ -1,2 +1,2 @@
-dkrahn@chromium.org
-mnissler@chromium.org
+cylai@chromium.org
+drcrash@chromium.org
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index db3b3588..115502d6 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -305,6 +305,12 @@
 const base::Feature kClipboardHistoryNudgeSessionReset{
     "ClipboardHistoryNudgeSessionReset", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables cloud game features. A separate flag "LauncherGameSearch" controls
+// launcher-only cloud gaming features, since they can also be enabled on
+// non-cloud-gaming devices.
+const base::Feature kCloudGamingDevice{"CloudGamingDevice",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
 // If enabled and account falls under the new deal, will be allowed to toggle
 // auto updates.
 const base::Feature kConsumerAutoUpdateToggleAllowed{
@@ -412,6 +418,12 @@
 const base::Feature kDemoModeSWA{"DemoModeSWA",
                                  base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables or disables Assistant stylus features, including the
+// Assistant option in the stylus palette tool and the Assistant screen
+// selection flow triggered by the stylus long press action.
+const base::Feature kDeprecateAssistantStylusFeatures{
+    "DeprecateAssistantStylusFeatures", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables or disables Sync for desk templates on ChromeOS.
 const base::Feature kDeskTemplateSync{"DeskTemplateSync",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
@@ -1646,6 +1658,10 @@
   return base::FeatureList::IsEnabled(kClipboardHistoryNudgeSessionReset);
 }
 
+bool IsCloudGamingDevice() {
+  return base::FeatureList::IsEnabled(kCloudGamingDevice);
+}
+
 bool IsDesksCloseAllEnabled() {
   return base::FeatureList::IsEnabled(kDesksCloseAll);
 }
@@ -1672,6 +1688,10 @@
   return base::FeatureList::IsEnabled(kDemoModeSWA);
 }
 
+bool IsDeprecateAssistantStylusFeaturesEnabled() {
+  return base::FeatureList::IsEnabled(kDeprecateAssistantStylusFeatures);
+}
+
 bool IsDeskTemplateSyncEnabled() {
   return base::FeatureList::IsEnabled(kDeskTemplateSync);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 8007567..15d6d23 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -127,6 +127,7 @@
 extern const base::Feature kClipboardHistoryContextMenuNudge;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kClipboardHistoryNudgeSessionReset;
+COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCloudGamingDevice;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kConsumerAutoUpdateToggleAllowed;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDesksCloseAll;
@@ -165,6 +166,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kCryptohomeRecoveryFlow;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDemoModeSWA;
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kDeprecateAssistantStylusFeatures;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDeskTemplateSync;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kDeviceActiveClient;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -614,12 +617,15 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsClipboardHistoryEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsClipboardHistoryNudgeSessionResetEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCloudGamingDevice();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsConsumerAutoUpdateToggleAllowed();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDesksCloseAllEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsCryptohomeRecoveryFlowEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDarkLightModeEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeepLinkingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSWAEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS)
+bool IsDeprecateAssistantStylusFeaturesEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeskTemplateSyncEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDisplayAlignmentAssistanceEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDragUnpinnedAppToPinEnabled();
diff --git a/ash/constants/ash_pref_names.cc b/ash/constants/ash_pref_names.cc
index 2e0d9bd..314952a 100644
--- a/ash/constants/ash_pref_names.cc
+++ b/ash/constants/ash_pref_names.cc
@@ -956,9 +956,10 @@
 const char kProjectorViewerOnboardingShowCount[] =
     "ash.projector.viewer_onboarding_show_count";
 
-// A boolean pref that indicates the the skip-transcript dialog has been shown.
-const char kProjectorSkipTranscriptDialogShown[] =
-    "ash.projector.skip_transcript_dialog_shown";
+// A boolean pref that indicates the the exclude-transcript dialog has been
+// shown.
+const char kProjectorExcludeTranscriptDialogShown[] =
+    "ash.projector.exclude_transcript_dialog_shown";
 
 // A boolean pref that indicates the Projector has been enabled by admin
 // policy.
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h
index c83cdd2..e2b2791 100644
--- a/ash/constants/ash_pref_names.h
+++ b/ash/constants/ash_pref_names.h
@@ -438,7 +438,7 @@
 extern const char kProjectorViewerOnboardingShowCount[];
 
 COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const char kProjectorSkipTranscriptDialogShown[];
+extern const char kProjectorExcludeTranscriptDialogShown[];
 
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const char kProjectorAllowByPolicy[];
diff --git a/ash/keyboard/COMMON_METADATA b/ash/keyboard/COMMON_METADATA
deleted file mode 100644
index 1ae4c22..0000000
--- a/ash/keyboard/COMMON_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail {
-  component: "OS>Inputs"
-}
diff --git a/ash/keyboard/DIR_METADATA b/ash/keyboard/DIR_METADATA
index 671c987..caac77f 100644
--- a/ash/keyboard/DIR_METADATA
+++ b/ash/keyboard/DIR_METADATA
@@ -1 +1 @@
-mixins: "//ash/keyboard/COMMON_METADATA"
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/ash/metrics/feature_discovery_duration_reporter_impl.cc b/ash/metrics/feature_discovery_duration_reporter_impl.cc
index 3e66a5b..9ea4445 100644
--- a/ash/metrics/feature_discovery_duration_reporter_impl.cc
+++ b/ash/metrics/feature_discovery_duration_reporter_impl.cc
@@ -153,6 +153,16 @@
   active_time_recordings_.erase(iter);
 }
 
+void FeatureDiscoveryDurationReporterImpl::AddObserver(
+    ReporterObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void FeatureDiscoveryDurationReporterImpl::RemoveObserver(
+    ReporterObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 void FeatureDiscoveryDurationReporterImpl::SetActive(bool active) {
   // Return early if:
   // 1. the activity state does not change; or
@@ -204,6 +214,9 @@
     active_time_recordings_.emplace(feature_info.feature,
                                     base::TimeTicks::Now());
   }
+
+  for (ReporterObserver& observer : observers_)
+    observer.OnReporterActivated();
 }
 
 void FeatureDiscoveryDurationReporterImpl::Deactivate() {
diff --git a/ash/metrics/feature_discovery_duration_reporter_impl.h b/ash/metrics/feature_discovery_duration_reporter_impl.h
index cb9df77..2ce1e9ed 100644
--- a/ash/metrics/feature_discovery_duration_reporter_impl.h
+++ b/ash/metrics/feature_discovery_duration_reporter_impl.h
@@ -40,6 +40,8 @@
       feature_discovery::TrackableFeature feature) override;
   void MaybeFinishObservation(
       feature_discovery::TrackableFeature feature) override;
+  void AddObserver(ReporterObserver* observer) override;
+  void RemoveObserver(ReporterObserver* observer) override;
 
  private:
   friend class FeatureDiscoveryDurationReporterImplTest;
@@ -60,6 +62,8 @@
 
   bool is_active() const { return is_active_; }
 
+  base::ObserverList<ReporterObserver> observers_;
+
   // The mappings from trackable feature enum types to observation start
   // timestamps. It gets cleared when the reporter is deactivated. New entries
   // are added when:
diff --git a/ash/metrics/feature_discovery_duration_reporter_impl_unittest.cc b/ash/metrics/feature_discovery_duration_reporter_impl_unittest.cc
index fb42a1d4..2090930 100644
--- a/ash/metrics/feature_discovery_duration_reporter_impl_unittest.cc
+++ b/ash/metrics/feature_discovery_duration_reporter_impl_unittest.cc
@@ -47,9 +47,12 @@
   }
 
   // Returns true if the feature discovery reporter has ongoing observations.
-  bool HasActiveObservation() {
-    return !GetFeatureDiscoveryDurationReporter()
-                ->active_time_recordings_.empty();
+  bool IsMockFeatureUnderActiveObservation() {
+    const auto& active_time_recordings =
+        GetFeatureDiscoveryDurationReporter()->active_time_recordings_;
+    return active_time_recordings.find(
+               feature_discovery::TrackableFeature::kMockFeature) !=
+           active_time_recordings.cend();
   }
 
   // AshTestBase:
@@ -161,7 +164,7 @@
 
   // Verify that the finished observation does not resume.
   EXPECT_TRUE(IsReporterActive());
-  EXPECT_FALSE(HasActiveObservation());
+  EXPECT_FALSE(IsMockFeatureUnderActiveObservation());
 }
 
 // Verifies that the feature discovery duration is recorded correctly across
diff --git a/ash/public/cpp/app_list/app_list_metrics.cc b/ash/public/cpp/app_list/app_list_metrics.cc
index 8886407c..403e146 100644
--- a/ash/public/cpp/app_list/app_list_metrics.cc
+++ b/ash/public/cpp/app_list/app_list_metrics.cc
@@ -66,6 +66,10 @@
 constexpr char kAppListSortDiscoveryDurationAfterNudge[] =
     "Apps.AppList.SortDiscoveryDurationAfterEducationNudge";
 
+constexpr char kAppListSortDiscoveryDurationAfterActivation[] =
+    "Apps.AppList."
+    "AppListSortDiscoveryDurationAfterActivation";
+
 void RecordSearchResultOpenTypeHistogram(AppListLaunchedFrom launch_location,
                                          SearchResultType type,
                                          bool is_tablet_mode) {
diff --git a/ash/public/cpp/app_list/app_list_metrics.h b/ash/public/cpp/app_list/app_list_metrics.h
index 33065db2..8a2233f 100644
--- a/ash/public/cpp/app_list/app_list_metrics.h
+++ b/ash/public/cpp/app_list/app_list_metrics.h
@@ -27,6 +27,11 @@
 // education nudge show and the first sort usage.
 ASH_PUBLIC_EXPORT extern const char kAppListSortDiscoveryDurationAfterNudge[];
 
+// The UMA histogram that records the time duration between the earliest user
+// session activation with the app list sort enabled and the first sort usage.
+ASH_PUBLIC_EXPORT extern const char
+    kAppListSortDiscoveryDurationAfterActivation[];
+
 // The type of the ChromeSearchResult. This is used for logging so do not
 // change the order of this enum. If you add to this enum update
 // AppListSearchResult in enums.xml.
diff --git a/ash/public/cpp/feature_discovery_duration_reporter.h b/ash/public/cpp/feature_discovery_duration_reporter.h
index 2cd7296..5db4a3b 100644
--- a/ash/public/cpp/feature_discovery_duration_reporter.h
+++ b/ash/public/cpp/feature_discovery_duration_reporter.h
@@ -6,6 +6,7 @@
 #define ASH_PUBLIC_CPP_FEATURE_DISCOVERY_DURATION_REPORTER_H_
 
 #include "ash/public/cpp/ash_public_export.h"
+#include "base/observer_list_types.h"
 
 namespace ash {
 
@@ -32,6 +33,12 @@
 // In this case, the feature discovery time duration should be A + C.
 class ASH_PUBLIC_EXPORT FeatureDiscoveryDurationReporter {
  public:
+  class ReporterObserver : public base::CheckedObserver {
+   public:
+    // Called when the reporter is ready to use.
+    virtual void OnReporterActivated() = 0;
+  };
+
   FeatureDiscoveryDurationReporter();
   FeatureDiscoveryDurationReporter(const FeatureDiscoveryDurationReporter&) =
       delete;
@@ -50,6 +57,9 @@
   // on this feature is in progress.
   virtual void MaybeFinishObservation(
       feature_discovery::TrackableFeature feature) = 0;
+
+  virtual void AddObserver(ReporterObserver* observer) = 0;
+  virtual void RemoveObserver(ReporterObserver* observer) = 0;
 };
 
 }  // namespace ash
diff --git a/ash/public/cpp/feature_discovery_metric_util.cc b/ash/public/cpp/feature_discovery_metric_util.cc
index c082072..980f58a6 100644
--- a/ash/public/cpp/feature_discovery_metric_util.cc
+++ b/ash/public/cpp/feature_discovery_metric_util.cc
@@ -18,11 +18,17 @@
 
 }  // namespace
 
-const std::array<TrackableFeatureInfo, 2> kTrackableFeatureArray{
-    TrackableFeatureInfo{TrackableFeature::kMockFeature, kMockFeatureName,
-                         kMockFeatureHistogram},
-    TrackableFeatureInfo{TrackableFeature::kAppListReorderAfterEducationNudge,
-                         "AppListReorderAfterEducationNudge",
-                         kAppListSortDiscoveryDurationAfterNudge}};
+const std::array<TrackableFeatureInfo, static_cast<int>(TrackableFeature::kMax)>
+    kTrackableFeatureArray{
+        TrackableFeatureInfo{TrackableFeature::kMockFeature, kMockFeatureName,
+                             kMockFeatureHistogram},
+        TrackableFeatureInfo{
+            TrackableFeature::kAppListReorderAfterEducationNudge,
+            "AppListReorderAfterEducationNudge",
+            kAppListSortDiscoveryDurationAfterNudge},
+        TrackableFeatureInfo{
+            TrackableFeature::kAppListReorderAfterSessionActivation,
+            "AppListReorderAfterSessionActivation",
+            kAppListSortDiscoveryDurationAfterActivation}};
 
 }  // namespace ash::feature_discovery
diff --git a/ash/public/cpp/feature_discovery_metric_util.h b/ash/public/cpp/feature_discovery_metric_util.h
index 52afed4..cb2a4f1 100644
--- a/ash/public/cpp/feature_discovery_metric_util.h
+++ b/ash/public/cpp/feature_discovery_metric_util.h
@@ -25,8 +25,13 @@
   // clamshell and another one for tablet.
   kAppListReorderAfterEducationNudge = 1,
 
+  // App list reorder after the user session activation.
+  // TODO(https://crbug.com/1316185): split this histogram into the one for
+  // clamshell and another one for tablet.
+  kAppListReorderAfterSessionActivation = 2,
+
   // Used to mark the end. It should always be the last one.
-  kMax = 2,
+  kMax = 3,
 };
 
 struct ASH_PUBLIC_EXPORT TrackableFeatureInfo {
@@ -42,8 +47,9 @@
 
 // A hardcoded array of trackable features' info.
 // NOTE: update `kTrackableFeatureArray` if a new trackable feature is added.
-ASH_PUBLIC_EXPORT extern const std::array<TrackableFeatureInfo, 2>
-    kTrackableFeatureArray;
+ASH_PUBLIC_EXPORT extern const std::
+    array<TrackableFeatureInfo, static_cast<int>(TrackableFeature::kMax)>
+        kTrackableFeatureArray;
 
 }  // namespace ash::feature_discovery
 
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 92f7499..ac480c27 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -390,7 +390,6 @@
     "system_tray_caps_lock.icon",
     "system_tray_cast.icon",
     "system_tray_do_not_disturb.icon",
-    "system_tray_hps_notify.icon",
     "system_tray_managed.icon",
     "system_tray_notification_counter_plus.icon",
     "system_tray_recording.icon",
@@ -401,6 +400,7 @@
     "system_tray_select_to_speak_active.icon",
     "system_tray_select_to_speak_active_newui.icon",
     "system_tray_select_to_speak_newui.icon",
+    "system_tray_snooping_protection.icon",
     "system_tray_stop.icon",
     "system_tray_stop_newui.icon",
     "system_tray_supervised_user.icon",
diff --git a/ash/resources/vector_icons/system_tray_hps_notify.icon b/ash/resources/vector_icons/system_tray_snooping_protection.icon
similarity index 100%
rename from ash/resources/vector_icons/system_tray_hps_notify.icon
rename to ash/resources/vector_icons/system_tray_snooping_protection.icon
diff --git a/ash/services/ime/DIR_METADATA b/ash/services/ime/DIR_METADATA
index 1ae4c22..caac77f 100644
--- a/ash/services/ime/DIR_METADATA
+++ b/ash/services/ime/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 76e7b8bb..5f595056 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -1610,12 +1610,17 @@
       // The work area is initialized with BOTTOM_LOCKED insets to prevent
       // window movement on async preference initialization in tests:
       // crbug.com/834369
+      auto* shelf_native_window = shelf_widget_->GetNativeWindow();
       display_ = display::Screen::GetScreen()->GetDisplayNearestWindow(
-          shelf_widget_->GetNativeWindow());
-      bool in_overview =
+          shelf_native_window);
+      const bool in_overview =
           Shell::Get()->overview_controller()->InOverviewSession();
+      const bool in_splitview =
+          SplitViewController::Get(shelf_native_window)->InSplitViewMode();
       const WorkAreaInsets* const work_area =
-          WorkAreaInsets::ForWindow(shelf_widget_->GetNativeWindow());
+          WorkAreaInsets::ForWindow(shelf_native_window);
+      const gfx::Insets user_work_area_insets =
+          work_area->user_work_area_insets();
       if (state_.IsActiveSessionState()) {
         if (!in_overview &&
             (shelf_->alignment() != ShelfAlignment::kBottomLocked ||
@@ -1626,14 +1631,17 @@
           // area only if keyboard is not shown.
           // TODO(agawronska): Could this be called from WorkAreaInsets?
           if (!state_.IsAddingSecondaryUser() || work_area->IsKeyboardShown())
-            insets = work_area->user_work_area_insets();
-          Shell::Get()->SetDisplayWorkAreaInsets(
-              shelf_widget_->GetNativeWindow(), insets);
+            insets = user_work_area_insets;
+          Shell::Get()->SetDisplayWorkAreaInsets(shelf_native_window, insets);
+        } else if (in_overview && in_splitview) {
+          // When in the split view with Overview enabled, the display work area
+          // should be updated to guarantee snapped window has correct bounds.
+          Shell::Get()->SetDisplayWorkAreaInsets(shelf_native_window,
+                                                 user_work_area_insets);
         }
       } else {
         Shell::Get()->SetDisplayWorkAreaInsets(
-            shelf_widget_->GetNativeWindow(),
-            work_area->GetAccessibilityInsets());
+            shelf_native_window, work_area->GetAccessibilityInsets());
       }
     }
   }
diff --git a/ash/shell.cc b/ash/shell.cc
index 1912e53..406424df 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -717,13 +717,13 @@
   // before destroying |session_controller_|.
   accelerator_controller_->Shutdown();
 
-  // Must be destructed before hps_orientation_controller_.
+  // Must be destructed before human_presence_orientation_controller_.
   power_prefs_.reset();
 
   // Must be destructed before the tablet mode and message center controllers,
   // both of which these rely on.
-  hps_notify_controller_.reset();
-  hps_orientation_controller_.reset();
+  snooping_protection_controller_.reset();
+  human_presence_orientation_controller_.reset();
 
   // Shutdown tablet mode controller early on since it has some observers which
   // need to be removed. It will be destroyed later after all windows are closed
@@ -1017,13 +1017,15 @@
   // Observes the tablet mode controller if any hps feature is enabled.
   if (features::IsSnoopingProtectionEnabled() ||
       features::IsQuickDimEnabled()) {
-    hps_orientation_controller_ = std::make_unique<HpsOrientationController>();
+    human_presence_orientation_controller_ =
+        std::make_unique<HumanPresenceOrientationController>();
   }
 
-  // Construct HpsNotifyController, must be constructed after
-  // HpsOrientationController.
+  // Construct SnoopingProtectionController, must be constructed after
+  // HumanPresenceOrientationController.
   if (features::IsSnoopingProtectionEnabled()) {
-    hps_notify_controller_ = std::make_unique<HpsNotifyController>();
+    snooping_protection_controller_ =
+        std::make_unique<SnoopingProtectionController>();
   }
 
   // Manages lifetime of DiagnosticApp logs.
diff --git a/ash/shell.h b/ash/shell.h
index e4aeffc6..b006363 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -134,8 +134,7 @@
 class HighContrastController;
 class HighlighterController;
 class HoldingSpaceController;
-class HpsNotifyController;
-class HpsOrientationController;
+class HumanPresenceOrientationController;
 class ImeControllerImpl;
 class WebAuthNDialogControllerImpl;
 class KeyAccessibilityEnabler;
@@ -197,6 +196,7 @@
 class ShellObserver;
 class ShutdownControllerImpl;
 class SmsObserver;
+class SnoopingProtectionController;
 class StickyKeysController;
 class SystemGestureEventFilter;
 class SystemModalContainerEventFilter;
@@ -450,11 +450,8 @@
   HighContrastController* high_contrast_controller() {
     return high_contrast_controller_.get();
   }
-  HpsNotifyController* hps_notify_controller() {
-    return hps_notify_controller_.get();
-  }
-  HpsOrientationController* hps_orientation_controller() {
-    return hps_orientation_controller_.get();
+  HumanPresenceOrientationController* human_presence_orientation_controller() {
+    return human_presence_orientation_controller_.get();
   }
   ImeControllerImpl* ime_controller() { return ime_controller_.get(); }
   WebAuthNDialogControllerImpl* webauthn_dialog_controller() {
@@ -565,6 +562,9 @@
   ShutdownControllerImpl* shutdown_controller() {
     return shutdown_controller_.get();
   }
+  SnoopingProtectionController* snooping_protection_controller() {
+    return snooping_protection_controller_.get();
+  }
   StickyKeysController* sticky_keys_controller() {
     return sticky_keys_controller_.get();
   }
@@ -790,8 +790,9 @@
   std::unique_ptr<GeolocationController> geolocation_controller_;
   std::unique_ptr<HoldingSpaceController> holding_space_controller_;
   std::unique_ptr<PowerPrefs> power_prefs_;
-  std::unique_ptr<HpsNotifyController> hps_notify_controller_;
-  std::unique_ptr<HpsOrientationController> hps_orientation_controller_;
+  std::unique_ptr<SnoopingProtectionController> snooping_protection_controller_;
+  std::unique_ptr<HumanPresenceOrientationController>
+      human_presence_orientation_controller_;
   std::unique_ptr<ImeControllerImpl> ime_controller_;
   std::unique_ptr<chromeos::ImmersiveContext> immersive_context_;
   std::unique_ptr<WebAuthNDialogControllerImpl> webauthn_dialog_controller_;
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
index 8795440d..cb68052 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">تركيز شريط العناوين</translation>
 <translation id="3256109297135787951">إزالة التحديد عن عنصر على الرف</translation>
 <translation id="3288816184963444640">إغلاق النافذة الحالية</translation>
+<translation id="3322797428033495633">ركِّز على نافذة ميزة "نافذة ضمن النافذة"</translation>
 <translation id="3350805006883559974">تعويم النافذة النشطة فوق النوافذ الأخرى</translation>
 <translation id="3407560819924487926">استدعاء إدارة المهام</translation>
 <translation id="3417835166382867856">البحث في علامات التبويب</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb
index 75bd51a..dd1526b4 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Перайсці на адрасны радок</translation>
 <translation id="3256109297135787951">Скасаваць вылучэнне элемента на паліцы</translation>
 <translation id="3288816184963444640">Закрыць бягучае акно</translation>
+<translation id="3322797428033495633">Перайсці да акна "відарыс у відарысе"</translation>
 <translation id="3350805006883559974">Паказваць актыўнае акно зверху</translation>
 <translation id="3407560819924487926">Выклікаць менеджар заданняў</translation>
 <translation id="3417835166382867856">Пошук укладак</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb
index 3822e82..d4c26b5 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Преместване на фокуса върху адресната лента</translation>
 <translation id="3256109297135787951">Премахване на фокуса от елемент в лавицата</translation>
 <translation id="3288816184963444640">Затваряне на текущия прозорец</translation>
+<translation id="3322797428033495633">Поставяне на фокуса върху прозореца в режим „картина в картината“</translation>
 <translation id="3350805006883559974">Активният прозорец да остава пред всички други</translation>
 <translation id="3407560819924487926">Показване на диспечера на задачите</translation>
 <translation id="3417835166382867856">Търсене на раздели</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb
index d528fcb..d683d0b 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Mou el focus a la barra d'adreces</translation>
 <translation id="3256109297135787951">Deixa de destacar un element del prestatge</translation>
 <translation id="3288816184963444640">Tanca la finestra actual</translation>
+<translation id="3322797428033495633">Posa el focus a la finestra de pantalla en pantalla</translation>
 <translation id="3350805006883559974">Fes flotar la finestra activa al damunt</translation>
 <translation id="3407560819924487926">Obre el gestor de tasques</translation>
 <translation id="3417835166382867856">Cerca pestanyes</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb
index 76dcb0ce..0a826afe 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Ffocysu ar y bar cyfeiriad</translation>
 <translation id="3256109297135787951">Tynnwch yr amlygu o eitem ar eich silff</translation>
 <translation id="3288816184963444640">Cau'r ffenestr bresennol</translation>
+<translation id="3322797428033495633">Ffocysu'r ffenestr llun mewn llun</translation>
 <translation id="3350805006883559974">Dal y ffenestr weithredol ar y brig</translation>
 <translation id="3407560819924487926">Agor y rheolwr tasgau</translation>
 <translation id="3417835166382867856">Chwilio tabiau</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb
index d4892d5..b15abcd8 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Fokuser på adresselinje</translation>
 <translation id="3256109297135787951">Fjern fremhævningen af et element på din hylde</translation>
 <translation id="3288816184963444640">Luk det aktuelle vindue</translation>
+<translation id="3322797428033495633">Fokuser på vinduet med integreret billede</translation>
 <translation id="3350805006883559974">Vis aktivt vindue som svævende øverst</translation>
 <translation id="3407560819924487926">Se Jobliste</translation>
 <translation id="3417835166382867856">Søg i faner</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb
index b3834f4..76bd59b08 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Adressleiste fokussieren</translation>
 <translation id="3256109297135787951">Markierung eines Elements in der Ablage entfernen</translation>
 <translation id="3288816184963444640">Aktuelles Fenster schließen</translation>
+<translation id="3322797428033495633">Auf das Bild-im-Bild-Fenster fokussieren</translation>
 <translation id="3350805006883559974">Aktives Fenster im Vordergrund anzeigen</translation>
 <translation id="3407560819924487926">Task-Manager aufrufen</translation>
 <translation id="3417835166382867856">Tabs suchen</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb
index 065cf59..3af3eeb 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Εστίαση γραμμής διευθύνσεων</translation>
 <translation id="3256109297135787951">Κατάργηση της επισήμανσης από κάποιο στοιχείο στο ράφι σας</translation>
 <translation id="3288816184963444640">Κλείσιμο τρέχοντος παραθύρου</translation>
+<translation id="3322797428033495633">Εστίαση του παραθύρου picture-in-picture</translation>
 <translation id="3350805006883559974">Τοποθέτηση του ενεργού παραθύρου επάνω</translation>
 <translation id="3407560819924487926">Εμφάνιση της Διαχείρισης Εργασιών</translation>
 <translation id="3417835166382867856">Αναζήτηση στις καρτέλες</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb
index 65aab69..9ba05b0 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Enfocar la barra de direcciones</translation>
 <translation id="3256109297135787951">Dejar de destacar un elemento en la biblioteca</translation>
 <translation id="3288816184963444640">Cerrar la ventana actual</translation>
+<translation id="3322797428033495633">Enfocar la ventana pantalla en pantalla</translation>
 <translation id="3350805006883559974">Fijar la ventana activa en la parte superior</translation>
 <translation id="3407560819924487926">Mostrar el Administrador de tareas</translation>
 <translation id="3417835166382867856">Buscar pestañas</translation>
@@ -181,7 +182,7 @@
 <translation id="7422707470576323858">Cambiar al siguiente método de entrada disponible</translation>
 <translation id="743754632698445141">Dejar de fijar una app</translation>
 <translation id="7439718573248533901">Borrar la letra siguiente (borrar siguiente)</translation>
-<translation id="7500368597227394048">guión</translation>
+<translation id="7500368597227394048">guion</translation>
 <translation id="7611271430932669992">Mover el foco a ventanas emergentes y diálogos</translation>
 <translation id="7635348532214572995">Mueve el ícono de una app en la grilla de apps</translation>
 <translation id="766326951329901120">Pegar el contenido del portapapeles como texto sin formato</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb
index aa41447..edd2ef4 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Activar barra de direcciones</translation>
 <translation id="3256109297135787951">Dejar de destacar un elemento de la estantería</translation>
 <translation id="3288816184963444640">Cerrar la ventana actual</translation>
+<translation id="3322797428033495633">Enfocar la ventana de imagen en imagen</translation>
 <translation id="3350805006883559974">Traer una ventana al frente</translation>
 <translation id="3407560819924487926">Abrir el administrador de tareas</translation>
 <translation id="3417835166382867856">Buscar pestañas</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb
index e9249d6..fa34f4a 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Fokuratu helbide-barra</translation>
 <translation id="3256109297135787951">Utzi apaleko elementu bat nabarmentzeari</translation>
 <translation id="3288816184963444640">Itxi oraingo leihoa</translation>
+<translation id="3322797428033495633">Fokuratu pantaila txiki gainjarria</translation>
 <translation id="3350805006883559974">Mantendu leiho aktiboa gainean</translation>
 <translation id="3407560819924487926">Erakutsi ataza-kudeatzailea</translation>
 <translation id="3417835166382867856">Bilatu fitxak</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb
index 180b432..92ba1b4 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Keskitä osoitepalkkiin</translation>
 <translation id="3256109297135787951">Poista korostus hyllyssä olevasta kohteesta</translation>
 <translation id="3288816184963444640">Sulje nykyinen ikkuna</translation>
+<translation id="3322797428033495633">Tarkenna pikkuruutu-ikkuna</translation>
 <translation id="3350805006883559974">Siirrä aktiivinen ikkuna päällimmäiseksi</translation>
 <translation id="3407560819924487926">Aktivoi tehtävänhallinta</translation>
 <translation id="3417835166382867856">Hae välilehtiä</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb
index 1a8a0c7..3ad1968d 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Activer la barre d'adresse</translation>
 <translation id="3256109297135787951">Supprimer la mise en évidence d'un élément sur votre étagère</translation>
 <translation id="3288816184963444640">Fermer la fenêtre actuelle</translation>
+<translation id="3322797428033495633">Mettre en évidence la fenêtre d'incrustation d'image</translation>
 <translation id="3350805006883559974">Fenêtre active superposée sur le dessus</translation>
 <translation id="3407560819924487926">Activer le gestionnaire de tâches</translation>
 <translation id="3417835166382867856">Rechercher dans les onglets</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb
index 4726ec7..c388aa8 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Activer la barre d'adresse</translation>
 <translation id="3256109297135787951">Supprimer la mise en surbrillance d'un élément sur l'étagère</translation>
 <translation id="3288816184963444640">Fermer la fenêtre active</translation>
+<translation id="3322797428033495633">Sélectionner la fenêtre Picture-in-picture</translation>
 <translation id="3350805006883559974">Afficher la fenêtre active en superposition</translation>
 <translation id="3407560819924487926">Ouvrir le gestionnaire de tâches</translation>
 <translation id="3417835166382867856">Rechercher dans les onglets</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb
index b984148..65b3648e 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Activar barra de enderezos</translation>
 <translation id="3256109297135787951">Deixa de destacar un elemento do estante</translation>
 <translation id="3288816184963444640">Pecha a ventá actual</translation>
+<translation id="3322797428033495633">Enfoca a ventá de pantalla superposta</translation>
 <translation id="3350805006883559974">Mostrar ventá activa sobre as outras</translation>
 <translation id="3407560819924487926">Abre o xestor de tarefas</translation>
 <translation id="3417835166382867856">Realizar buscas nas pestanas</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb
index 035d460..b44e62b 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Կիզակետել հասցեագոտին</translation>
 <translation id="3256109297135787951">Չեղարկել տարրի նշումը դարակում</translation>
 <translation id="3288816184963444640">Փակել ընթացիկ պատուհանը</translation>
+<translation id="3322797428033495633">Անցնել «նկար նկարի մեջ» պատուհանին</translation>
 <translation id="3350805006883559974">Տեղափոխել ակտիվ պատուհանը վերև</translation>
 <translation id="3407560819924487926">Բացել խնդիրների կառավարը</translation>
 <translation id="3417835166382867856">Որոնել ներդիրներ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
index 48bff72..fd29310 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Fokus ke bilah alamat</translation>
 <translation id="3256109297135787951">Menghapus tanda dari item di rak</translation>
 <translation id="3288816184963444640">Menutup jendela aktif</translation>
+<translation id="3322797428033495633">Memfokuskan jendela picture-in-picture</translation>
 <translation id="3350805006883559974">Membuat jendela aktif mengambang di atas</translation>
 <translation id="3407560819924487926">Memunculkan pengelola tugas</translation>
 <translation id="3417835166382867856">Telusuri tab</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb
index 7dfd379..4fb82ab 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Setja fókus á veffangastiku</translation>
 <translation id="3256109297135787951">Fjarlægja auðkenningu atriðis á hillu</translation>
 <translation id="3288816184963444640">Loka núverandi glugga</translation>
+<translation id="3322797428033495633">Setja glugga með mynd í mynd í fókus</translation>
 <translation id="3350805006883559974">Láta virkan glugga fljóta efst</translation>
 <translation id="3407560819924487926">Opna verkstjórn</translation>
 <translation id="3417835166382867856">Leita í flipum</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb
index 8615099..18c18c9 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Мекенжай жолағына өту</translation>
 <translation id="3256109297135787951">Сөредегі элементтің бөлектенуін өшіру</translation>
 <translation id="3288816184963444640">Ағымдағы терезені жабу</translation>
+<translation id="3322797428033495633">"Суреттегі сурет" терезесіне өтіңіз.</translation>
 <translation id="3350805006883559974">Белсенді терезені жоғары жылжыту</translation>
 <translation id="3407560819924487926">Тапсырма менеджерін ашу</translation>
 <translation id="3417835166382867856">Қойындыларды іздеу</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb
index 4499720..55e37234 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">របាអាសយដ្ឋានផ្តោត</translation>
 <translation id="3256109297135787951">លុបការ​រំលេច​ចេញពី​ធាតុ​នៅលើ​ធ្នើ​របស់អ្នក</translation>
 <translation id="3288816184963444640">បិទ​វិនដូ​បច្ចុប្បន្ន</translation>
+<translation id="3322797428033495633">ផ្ដោតលើ​ផ្ទាំង​រូបក្នុងរូប</translation>
 <translation id="3350805006883559974">បណ្ដែតវិនដូសកម្មនៅផ្នែកខាងលើ</translation>
 <translation id="3407560819924487926">បង្ហាញកម្មវិធី​គ្រប់គ្រង​កិច្ចការ</translation>
 <translation id="3417835166382867856">ស្វែងរកផ្ទាំង</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb
index 229bbb7..d1408a14 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">주소 표시줄로 이동</translation>
 <translation id="3256109297135787951">실행기에 있는 항목에서 강조표시를 삭제합니다.</translation>
 <translation id="3288816184963444640">현재 창 닫기</translation>
+<translation id="3322797428033495633">PIP 모드 창에 포커스</translation>
 <translation id="3350805006883559974">활성 창을 맨 위에 표시</translation>
 <translation id="3407560819924487926">작업 관리자 호출</translation>
 <translation id="3417835166382867856">탭 검색</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb
index f6e3a74..6c8914b 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Tumpukan bar alamat</translation>
 <translation id="3256109297135787951">Buang serlahan daripada item pada rak anda</translation>
 <translation id="3288816184963444640">Tutup tetingkap semasa</translation>
+<translation id="3322797428033495633">Fokuskan tetingkap gambar dalam gambar</translation>
 <translation id="3350805006883559974">Apungkan tetingkap aktif di atas</translation>
 <translation id="3407560819924487926">Paparkan pengurus tugas</translation>
 <translation id="3417835166382867856">Cari tab</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb
index 0547b0b..e917382 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">ଠିକଣା ବାର୍‌ରେ ଫୋକସ୍ କରନ୍ତୁ</translation>
 <translation id="3256109297135787951">ଆପଣଙ୍କ ସେଲ୍ଫରେ ଥିବା ଏକ ଆଇଟମ୍‌ରୁ ହାଇଲାଇଟ୍‌କୁ କାଢ଼ନ୍ତୁ</translation>
 <translation id="3288816184963444640">ବର୍ତ୍ତମାନର ୱିଣ୍ଡୋ ବନ୍ଦ କରନ୍ତୁ</translation>
+<translation id="3322797428033495633">ପିକଚର-ଇନ-ପିକଚର ୱିଣ୍ଡୋକୁ ଫୋକସ କରନ୍ତୁ</translation>
 <translation id="3350805006883559974">ଶୀର୍ଷରେ ଫ୍ଲୋଟ୍ ହେଉଥିବା ସକ୍ରିୟ ୱିଣ୍ଡୋ</translation>
 <translation id="3407560819924487926">'କାର୍ଯ୍ୟ ପରିଚାଳକ'କୁ ଖୋଲନ୍ତୁ</translation>
 <translation id="3417835166382867856">ଟାବଗୁଡ଼ିକୁ ସନ୍ଧାନ କରନ୍ତୁ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb
index f0e39886..1ba91c14 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Focar barra de endereço</translation>
 <translation id="3256109297135787951">Remover o realce de um item na prateleira</translation>
 <translation id="3288816184963444640">Fechar a janela atual</translation>
+<translation id="3322797428033495633">Focar a janela de ecrã no ecrã</translation>
 <translation id="3350805006883559974">Apresente a janela ativa em cima</translation>
 <translation id="3407560819924487926">Abrir o Gestor de tarefas</translation>
 <translation id="3417835166382867856">Pesquisar separadores</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb
index db4da5e..eede8de 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">ලිපින බාර් එක ෆෝකස් කරන්න</translation>
 <translation id="3256109297135787951">ඔබේ රාක්කයෙහි අයිතමයකින් උද්දීපනය ඉවත් කරන්න</translation>
 <translation id="3288816184963444640">වත්මන් කවුළුව වසන්න</translation>
+<translation id="3322797428033495633">පින්තූරය-තුළ-පින්තූරය කවුළුව නාභිගත කරන්න</translation>
 <translation id="3350805006883559974">සක්‍රිය කවුළුව ඉහළින් පා කරන්න</translation>
 <translation id="3407560819924487926">කාර්ය කළමනාකරු ගෙන එන්න</translation>
 <translation id="3417835166382867856">ටැබ සොයන්න</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb
index b4d4777..9243f85 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Preklopi na naslovno vrstico</translation>
 <translation id="3256109297135787951">Opustitev označevanja elementa na polici</translation>
 <translation id="3288816184963444640">Zapiranje trenutnega okna</translation>
+<translation id="3322797428033495633">Izbira okna s sliko v sliki</translation>
 <translation id="3350805006883559974">Lebdenje aktivnega okna na vrhu.</translation>
 <translation id="3407560819924487926">Prikazovanje upravitelja opravil</translation>
 <translation id="3417835166382867856">Iskanje zavihkov</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb
index 4df05c9..7e796235 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Shiriti i adresës së fokusimit</translation>
 <translation id="3256109297135787951">Hiq theksimin nga një artikull në raftin tënd</translation>
 <translation id="3288816184963444640">Mbyll dritaren aktuale</translation>
+<translation id="3322797428033495633">Fokuso dritaren në modalitetin "figurë brenda figurës"</translation>
 <translation id="3350805006883559974">Bëj që dritarja aktive të pluskojë mbi dritaret e tjera</translation>
 <translation id="3407560819924487926">Aktivizo menaxherin e detyrave</translation>
 <translation id="3417835166382867856">Kërko skedat</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb
index 48f45946..3a584db 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Fokusera på adressfältet</translation>
 <translation id="3256109297135787951">Ta bort markeringen från ett objekt på hyllan</translation>
 <translation id="3288816184963444640">Stäng det aktuella fönstret</translation>
+<translation id="3322797428033495633">Flytta fokus till bild-i-bild-fönstret</translation>
 <translation id="3350805006883559974">Visa aktivt fönster överst</translation>
 <translation id="3407560819924487926">Öppna aktivitetshanteraren</translation>
 <translation id="3417835166382867856">Sök bland flikar</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb
index 632f3084..704ee00c 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Lenga upau anwani</translation>
 <translation id="3256109297135787951">Acha kuangazia kipengee kwenye rafu yako</translation>
 <translation id="3288816184963444640">Funga dirisha la sasa</translation>
+<translation id="3322797428033495633">Angazia dirisha la kupachika picha ndani ya picha nyingine</translation>
 <translation id="3350805006883559974">Fanya dirisha linalotumika lielee juu</translation>
 <translation id="3407560819924487926">Fungua kidhibiti cha shughuli kwenye Chrome</translation>
 <translation id="3417835166382867856">Tafuta vichupo</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb
index 9663d76..bd037d9 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">โฟกัสแถบที่อยู่</translation>
 <translation id="3256109297135787951">นำไฮไลต์ออกจากรายการบนชั้นวาง</translation>
 <translation id="3288816184963444640">ปิดหน้าต่างปัจจุบัน</translation>
+<translation id="3322797428033495633">โฟกัสหน้าต่างการแสดงภาพซ้อนภาพ</translation>
 <translation id="3350805006883559974">ทำให้หน้าต่างที่ใช้งานลอยอยู่ด้านบน</translation>
 <translation id="3407560819924487926">เรียกใช้ตัวจัดการงาน</translation>
 <translation id="3417835166382867856">ค้นหาแท็บ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
index 648067c..3162246 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">Adres çubuğuna odaklan</translation>
 <translation id="3256109297135787951">Rafınızdaki bir öğenin vurgusunu kaldırır</translation>
 <translation id="3288816184963444640">Geçerli pencereyi kapatır</translation>
+<translation id="3322797428033495633">Pencere içinde pencereye odaklanın</translation>
 <translation id="3350805006883559974">Etkin pencereyi en üstte kaydırın</translation>
 <translation id="3407560819924487926">Görev yöneticisini açar</translation>
 <translation id="3417835166382867856">Sekme ara</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb
index 09f3cf2..df9396e 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">将地址栏设为焦点</translation>
 <translation id="3256109297135787951">取消任务栏中某项内容的突出显示状态</translation>
 <translation id="3288816184963444640">关闭当前窗口</translation>
+<translation id="3322797428033495633">聚焦于画中画窗口</translation>
 <translation id="3350805006883559974">在顶部悬浮活动窗口</translation>
 <translation id="3407560819924487926">启动任务管理器</translation>
 <translation id="3417835166382867856">搜索标签页</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb
index e5ed7d1..dee4cd1f 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">將焦點移至網址列</translation>
 <translation id="3256109297135787951">取消捷徑列上項目的突顯狀態</translation>
 <translation id="3288816184963444640">關閉目前視窗</translation>
+<translation id="3322797428033495633">聚焦在畫中畫視窗</translation>
 <translation id="3350805006883559974">讓使用中的視窗浮動在畫面上方</translation>
 <translation id="3407560819924487926">啟動工作管理員</translation>
 <translation id="3417835166382867856">搜尋分頁</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb
index 73b9bad..6630487 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb
@@ -71,6 +71,7 @@
 <translation id="3140353188828248647">將焦點移至網址列</translation>
 <translation id="3256109297135787951">取消檔案櫃項目的醒目顯示狀態</translation>
 <translation id="3288816184963444640">關閉目前的視窗</translation>
+<translation id="3322797428033495633">聚焦在子母畫面視窗</translation>
 <translation id="3350805006883559974">讓使用中的視窗懸停在畫面上方</translation>
 <translation id="3407560819924487926">開啟工作管理員</translation>
 <translation id="3417835166382867856">搜尋分頁</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index 07ff5e15..8bc5d993 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">লাইভ কেপশ্বন অন আছে।</translation>
 <translation id="1720011244392820496">ৱাই-ফাই ছিংক অন কৰক</translation>
 <translation id="1736898441010944794">"<ph name="NAME" />" ব্লুটুথ ডিভাইচসমূহৰ বাবে দৃশ্যমান হ’ল।</translation>
+<translation id="174102739345480129">চিহ্নকৰ সুবিধাটো অফ আছে।</translation>
 <translation id="1743570585616704562">চিনাক্ত কৰিব পৰা নাই</translation>
 <translation id="1746730358044914197">ইনপুট পদ্ধতিসমূহ আপোনাৰ প্ৰশাসকে কনফিগাৰ কৰে।</translation>
 <translation id="1747827819627189109">অন-স্ক্ৰীণ কীব‘র্ড সক্ষম কৰা হ‘ল</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">এইয়া আপোনাৰ ষ্টাইলাছৰ সঁজুলি</translation>
 <translation id="4389184120735010762">আপুনি ড'ক কৰা বিৱৰ্ধকৰ বাবে কীব'ৰ্ডৰ শ্বৰ্টকাট টিপিছে। আপুনি এইটো অন কৰিব খোজেনে?</translation>
 <translation id="439598569299422042">পজ কৰা আছে, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">স্ক্ৰীনকাষ্ট ছেভ কৰিব পৰা নগ’ল</translation>
 <translation id="4405151984121254935">সংযোজিত পৰিধীয় ডিভাইচৰ প্ৰকাৰটো সমৰ্থিত নহয়</translation>
 <translation id="4406883609789734330">লাইভ কেপশ্বন</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> অফ কৰা আছে।</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">পৰৱৰ্তী বাক্য</translation>
+<translation id="5016558321564993266">চিহ্নকৰ সুবিধাটো ট’গল কৰক। <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">সময় সীমা উকলিল</translation>
 <translation id="5033299697334913360">পূৰ্ণ স্ক্ৰীন কেপচাৰ কৰিবলৈ যিকোনো ঠাইতে ক্লিক কৰক</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" />ক এটা নতুন ডিভাইচত সংযোগ কৰা হ'ল</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">ছাইন আউট কৰক</translation>
 <translation id="5234764350956374838">অগ্ৰাহ্য কৰক</translation>
 <translation id="523505283826916779">সাধ্য সুবিধাৰ ছেটিংসমূহ</translation>
+<translation id="5245201184978705914">ট্ৰেন্সক্ৰিপ্ট সৃষ্টি কৰিব পৰা নগ’ল</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> নামৰ ডিভাইচটোৰ সৈতে সংযুক্ত হৈ আছে, <ph name="BATTERY_PERCENTAGE" />% বেটাৰী</translation>
 <translation id="5260676007519551770">ডেস্ক ৪</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" />এ আপোনাৰ মনোযোগ বিচাৰি অনুৰোধ কৰিছে।</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">অডিঅ’ ইনপুট</translation>
 <translation id="544691375626129091">সকলো ব্যৱহাৰকাৰীকে ইতিমধ্যে এই ছেশ্বনত অন্তৰ্ভুক্ত কৰা হৈছে।</translation>
 <translation id="54609108002486618">পৰিচালিত</translation>
+<translation id="5460938382730614333">চিহ্নকৰ সুবিধাটো অন আছে।</translation>
 <translation id="5465662442746197494">সহায় লাগিবনে?</translation>
 <translation id="547979256943495781">শ্বেল্ফ সোঁফালে আছে</translation>
 <translation id="5491186829646618080">ফাৰ্মৱেৰ আপডে’ট উপলব্ধ</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">সূৰ্যাস্ত হ’লে ৰাতিৰ পোহৰ স্বয়ংক্রিয়ভাৱে অন হয়</translation>
 <translation id="5750765938512549687">ব্লুটুথ অফ আছে</translation>
 <translation id="5760866832697883462">আপোনাৰ <ph name="NAME" /> সংযোগ কৰক</translation>
+<translation id="5762420912707163638">চিহ্নকৰ সুবিধাটো ট’গল কৰক। <ph name="STATE_TEXT" /> স্ক্ৰীনত আঁকিবলৈ ট্ৰেকপেড, টাচ্চস্ক্ৰীন অথবা ষ্টাইলাছ ব্যৱহাৰ কৰক।</translation>
 <translation id="576341972084747908">বিপজ্জনক <ph name="FILENAME" /> ডাউনল’ড কৰক</translation>
 <translation id="5763928712329149804">Shelf Party অফ কৰা আছে।</translation>
 <translation id="576453121877257266">ৰাতিৰ লাইট অন কৰা আছে।</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb
index c8e44c84..8cb8519 100644
--- a/ash/strings/ash_strings_az.xtb
+++ b/ash/strings/ash_strings_az.xtb
@@ -303,6 +303,7 @@
 <translation id="2834813915651407382">Bu yaxınlarda açılıb</translation>
 <translation id="2841907151129139818">Planşet rejiminə keçirilib</translation>
 <translation id="2844169650293029770">USB-C cihazı (ön sol port)</translation>
+<translation id="2848120746144143659">Tam ekran skrinşot çəkmək üçün enter düyməsini basın</translation>
 <translation id="2849936225196189499">Kritik</translation>
 <translation id="2860184359326882502">Ən Uyğun Nəticə</translation>
 <translation id="2865888419503095837">Şəbəkə haqqında məlumat</translation>
@@ -481,6 +482,7 @@
 <translation id="3846575436967432996">Heç bir şəbəkə məlumatı yoxdur</translation>
 <translation id="385051799172605136">Geri</translation>
 <translation id="385300504083504382">Başlanğıc</translation>
+<translation id="3861651314799684201">Tam ekranı qeydə almaq üçün enter düyməsini basın</translation>
 <translation id="3886872229787704059">Bugün açılıb</translation>
 <translation id="3891340733213178823">Hesabdan çıxmaq üçün iki dəfə Ctrl+Shift+Q basın.</translation>
 <translation id="3893630138897523026">ChromeVox (şifahi geri əlaqə)</translation>
@@ -807,6 +809,7 @@
 <translation id="595202126637698455">Fəaliyyət izləməsi aktiv edildi</translation>
 <translation id="5955304353782037793">tətbiq</translation>
 <translation id="5958529069007801266">Nəzarət olunan istifadəçi</translation>
+<translation id="5976112937189445008">Pəncərəni qeydə almaq üçün enter düyməsini basın</translation>
 <translation id="5977415296283489383">Qulaqlıq</translation>
 <translation id="5978382165065462689">Uzaq Yardım vasitəsilə ekranınızın kontrolunu paylaşır.</translation>
 <translation id="5980301590375426705">Qonaq hesabından çıxın</translation>
@@ -1195,6 +1198,7 @@
 <translation id="8364673525741149932">Shelf Party rejimini keçirin. <ph name="STATE_TEXT" /></translation>
 <translation id="8371779926711439835">Hərf üzrə irəli keçin</translation>
 <translation id="8371991222807690464">Qonaq rejimində periferik cihaz performansı məhdud ola bilər</translation>
+<translation id="8374601332003098278">Qismən ekranı qeydə almaq üçün enter düyməsini basın</translation>
 <translation id="8375916635258623388">Bu <ph name="DEVICE_NAME" /> və telefon avtomatik qoşulacaq</translation>
 <translation id="8380784334203145311">Gecəniz xeyir,</translation>
 <translation id="8382715499079447151">Baxış qoruması</translation>
@@ -1247,6 +1251,7 @@
 <translation id="8653151467777939995">Bildiriş ayarlarını göstərin. Bildirişlər aktivdir</translation>
 <translation id="8660331759611631213">71-in kvadrat kökü</translation>
 <translation id="8663756353922886599"><ph name="CONNECTION_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" /></translation>
+<translation id="8664282223139913403">Qismən skrinşot çəkmək üçün enter düyməsini basın</translation>
 <translation id="8664753092453405566">Şəbəkə siyahısını göstərin. <ph name="STATE_TEXT" /></translation>
 <translation id="8666856788528804727">Cihazınızı ayarlamaq üçün <ph name="NAME" /> tətbiqini açın</translation>
 <translation id="8676770494376880701">Enerjiyə qənaət edən şarjer qoşuldu</translation>
@@ -1288,6 +1293,7 @@
 <translation id="8909138438987180327">Batareya <ph name="PERCENTAGE" /> faizdir.</translation>
 <translation id="8921554779039049422">H+</translation>
 <translation id="8921624153894383499">Google Assistentdə bu dil mövcud deyil.</translation>
+<translation id="8924458948354692166">Pəncərə skrinşotunu çəkmək üçün enter düyməsini basın</translation>
 <translation id="8926951137623668982">Rəf həmişə gizlidir</translation>
 <translation id="8936501819958976551">deaktiv</translation>
 <translation id="8938800817013097409">USB-C cihazı (arxadakı sağ port)</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb
index e8bfe93..89bd3632 100644
--- a/ash/strings/ash_strings_bn.xtb
+++ b/ash/strings/ash_strings_bn.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">"লাইভ ক্যাপশন" চালু আছে।</translation>
 <translation id="1720011244392820496">ওয়াই-ফাই সিঙ্ক করার সুবিধা চালু করুন</translation>
 <translation id="1736898441010944794">ব্লুটুথ ডিভাইসে "<ph name="NAME" />" দেখা যায়।</translation>
+<translation id="174102739345480129">মার্কার বন্ধ আছে।</translation>
 <translation id="1743570585616704562">শনাক্ত করা যায়নি</translation>
 <translation id="1746730358044914197">আপনার প্রশাসক ইনপুটের পদ্ধতিগুলি কনফিগার করে।</translation>
 <translation id="1747827819627189109">অন-স্ক্রিন কীবোর্ড সক্ষম করা রয়েছে</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">এগুলি হল আপনার স্টাইলাস টুল</translation>
 <translation id="4389184120735010762">ডক করা ম্যাগনিফায়ারের জন্য আপনি কীবোর্ড শর্টকাট টিপেছেন। আপনি কি এটি চালু করতে চান?</translation>
 <translation id="439598569299422042">পজ করা হয়েছে, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">স্ক্রিনকাস্ট সেভ করা যাচ্ছে না</translation>
 <translation id="4405151984121254935">কানেক্ট করা পেরিফেরাল যে ধরনের, তাতে কাজ করে না</translation>
 <translation id="4406883609789734330">লাইভ ক্যাপশন</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> বন্ধ আছে।</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">পরের বাক্য</translation>
+<translation id="5016558321564993266">মার্কার টগল করুন। <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">সময় শেষ</translation>
 <translation id="5033299697334913360">সম্পূর্ণ স্ক্রিন ক্যাপচার করতে যেকোনও জায়গায় ক্লিক করুন</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" />টি নতুন ফোনে কানেক্ট করা হয়েছে</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">সাইন-আউট করুন</translation>
 <translation id="5234764350956374838">খারিজ</translation>
 <translation id="523505283826916779">অ্যাক্সেসিবিলিটি সেটিংস</translation>
+<translation id="5245201184978705914">ট্রান্সক্রিপ্ট তৈরি করা যাচ্ছে না</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> নামের ডিভাইসে কানেক্ট করা হয়েছে, ব্যাটারি চার্জ <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="5260676007519551770">ডেস্ক ৪</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> আপনার মনোযোগ আকর্ষণ করতে চাইছে।</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">অডিও ইনপুট</translation>
 <translation id="544691375626129091">সমস্ত উপলব্ধ ব্যবহারকারীকে ইতিমধ্যেই এই সেশনে যোগ করা হয়েছে৷</translation>
 <translation id="54609108002486618">পরিচালিত</translation>
+<translation id="5460938382730614333">মার্কার চালু আছে।</translation>
 <translation id="5465662442746197494">সাহায্য চান?</translation>
 <translation id="547979256943495781">শেল্ফ ডান দিকে দেখানো হচ্ছে</translation>
 <translation id="5491186829646618080">ফার্মওয়্যারের আপডেট উপলভ্য আছে</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">সূর্যাস্তের সময় নাইট লাইট অটোমেটিক চালু হয়ে যায়</translation>
 <translation id="5750765938512549687">ব্লুটুথ বন্ধ আছে</translation>
 <translation id="5760866832697883462"><ph name="NAME" />-এর সাথে কানেক্ট করুন</translation>
+<translation id="5762420912707163638">মার্কার টগল করুন। <ph name="STATE_TEXT" /> অনস্ক্রিন অঙ্কন করার জন্য ট্র্যাকপ্যাড, টাচস্ক্রিন বা স্টাইলাস ব্যবহার করুন।</translation>
 <translation id="576341972084747908">বিপজ্জনক <ph name="FILENAME" /> ফাইল ডাউনলোড করা হচ্ছে</translation>
 <translation id="5763928712329149804">শেল্ফ পার্টি বন্ধ আছে।</translation>
 <translation id="576453121877257266">নাইট লাইট ফিচার চালু করা আছে।</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb
index 8270065..8783d0b 100644
--- a/ash/strings/ash_strings_eu.xtb
+++ b/ash/strings/ash_strings_eu.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">Istanteko azpitituluak aktibatuta daude.</translation>
 <translation id="1720011244392820496">Aktibatu Wifi-sinkronizazioa</translation>
 <translation id="1736898441010944794">Ezarri da ikusgai "<ph name="NAME" />" Bluetooth bidezko gailuetarako.</translation>
+<translation id="174102739345480129">Markatzailea desaktibatuta dago.</translation>
 <translation id="1743570585616704562">Ez da ezagutu</translation>
 <translation id="1746730358044914197">Administratzaileak konfiguratzen ditu idazketa-metodoak.</translation>
 <translation id="1747827819627189109">Pantailako teklatua gaitu egin da</translation>
@@ -565,6 +566,7 @@
 <translation id="4379531060876907730">Hauek dira arkatzaren tresnak</translation>
 <translation id="4389184120735010762">Lupa ainguratuaren lasterbidea sakatu duzu. Aktibatu egin nahi duzu?</translation>
 <translation id="439598569299422042">Pausatuta, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">Ezin da gorde pantaila-bideoa</translation>
 <translation id="4405151984121254935">Ez da onartzen konektatutako gailu periferiko mota</translation>
 <translation id="4406883609789734330">Istanteko azpitituluak</translation>
 <translation id="4412944820643904175">Desaktibatuta dago <ph name="FEATURE_NAME" />.</translation>
@@ -671,6 +673,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">Hurrengo esaldia</translation>
+<translation id="5016558321564993266">Aktibatu edo desaktibatu markatzailea. <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">Amaitu egin da denbora</translation>
 <translation id="5033299697334913360">Egin klik edonon pantaila osoaren argazkia ateratzeko</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" /> beste telefono batekin konektatu da</translation>
@@ -700,6 +703,7 @@
 <translation id="5222676887888702881">Amaitu saioa</translation>
 <translation id="5234764350956374838">Baztertu</translation>
 <translation id="523505283826916779">Erabilerraztasun-ezarpenak</translation>
+<translation id="5245201184978705914">Ezin da sortu transkripzioa</translation>
 <translation id="5253783950165989294">Konektatu da <ph name="DEVICE_NAME" /> izeneko gailu batera. Bateria: % <ph name="BATTERY_PERCENTAGE" />.</translation>
 <translation id="5260676007519551770">4. lan-eremua</translation>
 <translation id="5283099933536931082">Zure arreta behar du <ph name="APP_ITEM_TITLE" /> aplikazioak.</translation>
@@ -734,6 +738,7 @@
 <translation id="5433020815079095860">Audio-sarrera</translation>
 <translation id="544691375626129091">Erabilgarri dauden erabiltzaile guztiak dagoeneko gehitu dira saioan.</translation>
 <translation id="54609108002486618">Kudeatua</translation>
+<translation id="5460938382730614333">Markatzailea aktibatuta dago.</translation>
 <translation id="5465662442746197494">Laguntza behar duzu?</translation>
 <translation id="547979256943495781">Apala eskuinaldean dago</translation>
 <translation id="5491186829646618080">Firmwareen eguneratze batzuk erabilgarri daude</translation>
@@ -775,6 +780,7 @@
 <translation id="5745612484876805746">Iluntzean, automatikoki aktibatzen da gaueko argia</translation>
 <translation id="5750765938512549687">Desaktibatuta dago Bluetooth-a</translation>
 <translation id="5760866832697883462">Konektatu <ph name="NAME" /> gailua</translation>
+<translation id="5762420912707163638">Aktibatu edo desaktibatu markatzailea. <ph name="STATE_TEXT" /> Erabili ukipen-panela, ukipen-pantaila edo arkatza pantailan marrazteko.</translation>
 <translation id="576341972084747908">Arriskutsua da <ph name="FILENAME" /> deskargatzea</translation>
 <translation id="5763928712329149804">Apal-festa desaktibatuta dago.</translation>
 <translation id="576453121877257266">Gaueko argia aktibatuta dago.</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index ca23e00f..735fcaa3 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">લાઇવ કૅપ્શનની સુવિધા ચાલુ છે.</translation>
 <translation id="1720011244392820496">વાઇ-ફાઇ સિંક ચાલુ કરો</translation>
 <translation id="1736898441010944794">બ્લૂટૂથ ચાલુ હોય તેવા ડિવાઇસમાં "<ph name="NAME" />"ને જોઈ શકાય છે.</translation>
+<translation id="174102739345480129">માર્કર બંધ છે.</translation>
 <translation id="1743570585616704562">ઓળખાયેલ નથી</translation>
 <translation id="1746730358044914197">ઇનપુટ પદ્ધતિઓને તમારા વ્યવસ્થાપક દ્વારા ગોઠવવામાં આવી છે.</translation>
 <translation id="1747827819627189109">ઓન-સ્ક્રીન કીબોર્ડ સક્ષમ કર્યું</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">આ છે તમારા સ્ટાઇલસનાં સાધનો</translation>
 <translation id="4389184120735010762">તમે ડૉક કરેલ મૅગ્નિફાયર માટે કીબોર્ડ શૉર્ટકટ દબાવેલ છે. શું તમે તેને ચાલુ કરવા માગો છો?</translation>
 <translation id="439598569299422042">ડાઉનલોડ થોભાવ્યું, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">સ્ક્રીનકાસ્ટ સાચવી શકાયું નથી</translation>
 <translation id="4405151984121254935">કનેક્ટ કરવામાં આવેલા પેરિફેરલ પ્રકારને સપોર્ટ આપવામાં આવતો નથી</translation>
 <translation id="4406883609789734330">લાઇવ કૅપ્શન</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> બંધ છે.</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">આગલું વાક્ય</translation>
+<translation id="5016558321564993266">માર્કરને ટૉગલ કરો. <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">સમય પૂરો થયો</translation>
 <translation id="5033299697334913360">પૂર્ણ સ્ક્રીન કૅપ્ચર કરવા માટે સ્ક્રીન પર ગમે ત્યાં ક્લિક કરો</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" />, નવા ફોન સાથે કનેક્ટ થયું</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">સાઇન આઉટ</translation>
 <translation id="5234764350956374838">કાઢી નાખો</translation>
 <translation id="523505283826916779">ઍક્સેસિબિલિટી સેટિંગ</translation>
+<translation id="5245201184978705914">ટ્રાન્સક્રિપ્ટ જનરેટ કરી શકાતી નથી</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> નામના <ph name="BATTERY_PERCENTAGE" />% બૅટરી ધરાવતા ડિવાઇસ સાથે કનેક્ટેડ</translation>
 <translation id="5260676007519551770">ડેસ્ક 4</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> તમને ધ્યાન આપવાની વિનંતી કરે છે.</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">ઑડિયો ઇનપુટ</translation>
 <translation id="544691375626129091">બધા ઉપલબ્ધ વપરાશકર્તાઓ પહેલેથી જ આ સત્ર પર ઉમેરવામાં આવ્યા છે.</translation>
 <translation id="54609108002486618">મેનેજ કરેલું</translation>
+<translation id="5460938382730614333">માર્કર ચાલુ છે.</translation>
 <translation id="5465662442746197494">સહાયની જરૂર છે?</translation>
 <translation id="547979256943495781">શેલ્ફ જમણી બાજુએ છે</translation>
 <translation id="5491186829646618080">ફર્મવેયર અપડેટ ઉપલબ્ધ છે</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">સૂર્યાસ્ત વખતે રાત્રિ પ્રકાશ ઑટોમૅટિક રીતે ચાલુ થાય છે</translation>
 <translation id="5750765938512549687">બ્લૂટૂથ બંધ છે</translation>
 <translation id="5760866832697883462">તમારું <ph name="NAME" /> કનેક્ટ કરો</translation>
+<translation id="5762420912707163638">માર્કરને ટૉગલ કરો. <ph name="STATE_TEXT" /> સ્ક્રીન પર દોરવા માટે ટ્રૅકપૅડ, ટચસ્ક્રીન કે સ્ટાઇલસનો ઉપયોગ કરો.</translation>
 <translation id="576341972084747908">જોખમી <ph name="FILENAME" /> ડાઉનલોડ કરો</translation>
 <translation id="5763928712329149804">શેલ્ફ પાર્ટી બંધ છે.</translation>
 <translation id="576453121877257266">રાત્રિ પ્રકાશ ચાલુ છે.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index db408ca1..e3791ca 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -850,6 +850,7 @@
 <translation id="6166852626429024716">अपने डिवाइस, ऐप्लिकेशन, सेटिंग के साथ-साथ वेब पर भी खोजें...</translation>
 <translation id="6179832488876878285">आप अपनी ज़रूरी फ़ाइलों को यहां पिन कर सकते हैं. शुरू करने के लिए, फ़ाइल ऐप्लिकेशन खोलें.</translation>
 <translation id="619279033188484792">अपने फ़ोन में मौजूद हाल ही की फ़ोटो, मीडिया, और सूचनाएं <ph name="DEVICE_TYPE" /> पर देखें</translation>
+<translation id="619335566042889110">बैटरी पूरी चार्ज हो चुकी है</translation>
 <translation id="6220928844947387476">अब, कैमरे और स्क्रीन दोनों पर दिख रही चीज़ों की रिकॉर्डिंग एक साथ की जा सकती है</translation>
 <translation id="622484624075952240">नीचे</translation>
 <translation id="6231419273573514727">हो सकता है कि सहायक डिवाइस पूरी तरह काम न करें</translation>
@@ -1184,6 +1185,7 @@
 <translation id="826107067893790409">Enter दबाकर <ph name="USER_EMAIL_ADDRESS" /> के लिए अनलॉक करें</translation>
 <translation id="8261506727792406068">मिटाएं</translation>
 <translation id="8270450402312105425">{0,plural, =1{डिवाइस को एक घंटे के अंदर पिछले वर्शन पर ले जाएं}one{डिवाइस को # घंटे के अंदर पिछले वर्शन पर ले जाएं}other{डिवाइस को # घंटों के अंदर पिछले वर्शन पर ले जाएं}}</translation>
+<translation id="8271580342040932214">पावर सॉकेट में लगे होने पर, आपकी बैटरी कुछ समय तक 80% चार्ज रहती है. ऐसा, बैटरी लाइफ़ को बढ़ाने के लिए किया जाता है. बैटरी <ph name="FULLY_CHARGE_TIME" /> तक पूरी चार्ज हो जाएगी.</translation>
 <translation id="8284362522226889623">पिछले डेस्क पर स्विच करने के लिए, चार उंगलियों से बाईं ओर स्वाइप करें</translation>
 <translation id="828708037801473432">बंद है</translation>
 <translation id="8297006494302853456">कमज़ोर</translation>
@@ -1267,6 +1269,7 @@
 <translation id="8814190375133053267">वाई-फ़ाई </translation>
 <translation id="881757059229893486">इनपुट के तरीकों की सेटिंग</translation>
 <translation id="8818320199597151042">प्रोफ़ाइल हटाई जा रही है. थोड़ा इंतज़ार करें.</translation>
+<translation id="8819728065740986820">अडैप्टिव चार्जिंग की सुविधा चालू है</translation>
 <translation id="8825863694328519386">वापस जाने के लिए, स्क्रीन के बाएं किनारे से स्वाइप करें</translation>
 <translation id="8834539327799336565">फ़िलहाल, कनेक्ट किए गए डिवाइस</translation>
 <translation id="8841375032071747811">वापस जाएं बटन</translation>
@@ -1313,6 +1316,7 @@
 <translation id="9080132581049224423">होम पेज पर जाने के लिए ऊपर की ओर स्वाइप करें</translation>
 <translation id="9080206825613744995">माइक्रोफ़ोन का उपयोग हो रहा है.</translation>
 <translation id="9084606467167974638">टॉगल मेन्यू की जगह</translation>
+<translation id="9085962983642906571">पावर सॉकेट में लगे होने पर, आपकी बैटरी 80% चार्ज रहती है. ऐसा, बैटरी लाइफ़ को बढ़ाने के लिए किया जाता है.</translation>
 <translation id="9089416786594320554">इनपुट के तरीके</translation>
 <translation id="9091626656156419976">डिसप्ले <ph name="DISPLAY_NAME" /> हटा दिया गया</translation>
 <translation id="9098969848082897657">फ़ोन को साइलेंट करें</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb
index b959479..f0d9916 100644
--- a/ash/strings/ash_strings_km.xtb
+++ b/ash/strings/ash_strings_km.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">មុខងារអក្សររត់​ក្នុងពេលជាក់ស្ដែង​ត្រូវបានបើក។</translation>
 <translation id="1720011244392820496">បើក Wi-Fi Sync</translation>
 <translation id="1736898441010944794">"<ph name="NAME" />" អាចមើលឃើញដោយឧបករណ៍ប៊្លូធូស។</translation>
+<translation id="174102739345480129">ហ្វឺត​ត្រូវបានបិទ។</translation>
 <translation id="1743570585616704562">មិន​ស្គាល់ទេ</translation>
 <translation id="1746730358044914197">វិធីសាស្ត្រ​បញ្ចូលត្រូវ​បានកំណត់​រចនាសម្ព័ន្ធ​ដោយ​អ្នកគ្រប់គ្រង​របស់អ្នក។</translation>
 <translation id="1747827819627189109">ក្តារចុចលើអេក្រង់បានបើកដំណើរការ</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">ទាំងនេះគឺជាប៊ិចរបស់អ្នក</translation>
 <translation id="4389184120735010762">អ្នក​បានចុច​ផ្លូវកាត់ក្ដារចុច​សម្រាប់​កែវពង្រីក​ដាក់​ខាង​លើ​បំផុត។ តើអ្នក​ចង់បើក​វាដែរទេ?</translation>
 <translation id="439598569299422042">បានផ្អាក <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">មិនអាចរក្សាទុកការថតអេក្រង់បានទេ</translation>
 <translation id="4405151984121254935">មិនអាចប្រើប្រភេទឧបករណ៍ខាងក្រៅដែលបានភ្ជាប់នេះទេ</translation>
 <translation id="4406883609789734330">អក្សររត់​ក្នុងពេល​ជាក់ស្ដែង</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> បានបិទ។</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">ប្រយោគ​បន្ទាប់</translation>
+<translation id="5016558321564993266">បិទ/បើកហ្វឺត។ <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">ដល់ពេល​ហើយ</translation>
 <translation id="5033299697334913360">ចុចកន្លែង​ណាមួយ ដើម្បីថត​ពេញអេក្រង់</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" /> បានភ្ជាប់​ទៅទូរសព្ទថ្មី</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">ចាកចេញ</translation>
 <translation id="5234764350956374838">ច្រានចោល</translation>
 <translation id="523505283826916779">ការកំណត់លទ្ធភាពប្រើប្រាស់</translation>
+<translation id="5245201184978705914">មិនអាចបង្កើតប្រតិចារឹកបានទេ</translation>
 <translation id="5253783950165989294">បានភ្ជាប់ជាមួយ​ឧបករណ៍ដែលមាន​ឈ្មោះថា <ph name="DEVICE_NAME" /> ថ្ម <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="5260676007519551770">តុទី 4</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> ស្នើឱ្យអ្នកយកចិត្តទុកដាក់។</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">ការបញ្ចូល​សំឡេង</translation>
 <translation id="544691375626129091">អ្នកប្រើដែលមានទាំងអស់ត្រូវបានបន្ថែមទៅក្នុងវេននេះរួចទៅហើយ។</translation>
 <translation id="54609108002486618">បាន​គ្រប់គ្រង</translation>
+<translation id="5460938382730614333">ហ្វឺតត្រូវបានបើក។</translation>
 <translation id="5465662442746197494">ត្រូវការជំនួយ?</translation>
 <translation id="547979256943495781">ធ្នើ​នៅខាង​ស្ដាំ</translation>
 <translation id="5491186829646618080">មាន​កំណែថ្មីនៃកម្មវិធី​បង្កប់</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">ពន្លឺពេលយប់​បើក​ដោយស្វ័យប្រវត្តិ​នៅពេល​ថ្ងៃលិច</translation>
 <translation id="5750765938512549687">ប៊្លូធូស​ត្រូវបាន​បិទ</translation>
 <translation id="5760866832697883462">ភ្ជាប់ <ph name="NAME" /> របស់អ្នក</translation>
+<translation id="5762420912707163638">បិទ/បើកហ្វឺត។ <ph name="STATE_TEXT" /> ប្រើប្រាស់ផ្ទាំងប៉ះ អេក្រង់ថាច់ ឬប៊ិកដើម្បីគូរនៅលើអេក្រង់។</translation>
 <translation id="576341972084747908">ទាញយក <ph name="FILENAME" /> គ្រោះថ្នាក់</translation>
 <translation id="5763928712329149804">Shelf Party ត្រូវបានបិទ។</translation>
 <translation id="576453121877257266">បានបើកពន្លឺពេលយប់។</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb
index 73c123d..8f6d2e1 100644
--- a/ash/strings/ash_strings_ky.xtb
+++ b/ash/strings/ash_strings_ky.xtb
@@ -362,7 +362,7 @@
 <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Бир түзмөккө туташты}other{# түзмөккө туташты}}</translation>
 <translation id="320207200541803018">Таймер кой</translation>
 <translation id="3203405173652969239">Switch Access функциясы иштетилди</translation>
-<translation id="3207953481422525583">Колдонуучунун жөндөөлөрү</translation>
+<translation id="3207953481422525583">Колдонуучунун параметрлери</translation>
 <translation id="3208321278970793882">Колдонмо</translation>
 <translation id="3217205077783620295">Үнү чыгып турат, өчүрүү менен аудионун үнү басылат.</translation>
 <translation id="3226991577105957773">+ дагы <ph name="COUNT" /></translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 9dcb1433..f881a0a 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">തത്സമയ ക്യാപ്ഷൻ ഓണാണ്.</translation>
 <translation id="1720011244392820496">വൈഫൈ സമന്വയം ഓണാക്കുക</translation>
 <translation id="1736898441010944794">Bluetooth ഉപകരണങ്ങൾക്ക് "<ph name="NAME" />" ദൃശ്യമാണ്.</translation>
+<translation id="174102739345480129">മാർക്കർ ഓഫാണ്.</translation>
 <translation id="1743570585616704562">തിരിച്ചറിഞ്ഞില്ല</translation>
 <translation id="1746730358044914197">ഇൻപുട്ട് രീതികൾ കോൺഫിഗർ ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററാണ്.</translation>
 <translation id="1747827819627189109">ഓൺ‌ സ്‌ക്രീൻ കീ‌ബോർഡ് പ്രവർത്തനക്ഷമമാക്കി</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">ഇവയാണ് നിങ്ങളുടെ സ്‌റ്റൈലസ് ടൂളുകൾ</translation>
 <translation id="4389184120735010762">നിങ്ങൾ ഡോക്ക് ചെയ്‌ത മാഗ്നിഫയറിനായി കീബോഡ് കുറുക്കുവഴി അമർത്തി. അത് ഓണാക്കണോ?</translation>
 <translation id="439598569299422042">താൽക്കാലികമായി നിർത്തി, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">സ്ക്രീൻ‍കാസ്റ്റ് സംരക്ഷിക്കാനാകുന്നില്ല</translation>
 <translation id="4405151984121254935">കണക്റ്റ് ചെയ്തിരിക്കുന്ന പെരിഫറൽ തരം പിന്തുണയ്ക്കുന്നില്ല</translation>
 <translation id="4406883609789734330">തത്സമയ ക്യാപ്ഷൻ</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> ഓഫാണ്.</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">അടുത്ത വാചകം</translation>
+<translation id="5016558321564993266">മാർക്കർ ടോഗിൾ ചെയ്യുക. <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">സമയം കഴിഞ്ഞു</translation>
 <translation id="5033299697334913360">പൂർണ്ണ സ്ക്രീൻ ക്യാപ്‌ചർ ചെയ്യാൻ എവിടെയെങ്കിലും ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" /> പുതിയ ഫോണിലേക്ക് കണക്‌റ്റ് ചെയ്‌തു</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="5234764350956374838">ഡിസ്മിസ്സ് ചെയ്യുക</translation>
 <translation id="523505283826916779">ഉപയോഗസഹായി ക്രമീകരണങ്ങൾ</translation>
+<translation id="5245201184978705914">ട്രാൻസ്ക്രിപ്റ്റ് സൃഷ്ടിക്കാനാകുന്നില്ല</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> എന്ന് പേരുള്ള ഉപകരണത്തിലേക്ക് കണക്റ്റ് ചെയ്തിരിക്കുന്നു, <ph name="BATTERY_PERCENTAGE" />% ബാറ്ററി</translation>
 <translation id="5260676007519551770">ഡെസ്‌ക് 4</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> നിങ്ങളുടെ ശ്രദ്ധ അഭ്യർത്ഥിക്കുന്നു.</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">ഓഡിയോ ഇൻപുട്ട്</translation>
 <translation id="544691375626129091">ലഭ്യമായ എല്ലാ ഉപയോക്താക്കളേയും ഈ സെഷനിൽ ഇതിനകം ചേർത്തു.</translation>
 <translation id="54609108002486618">നിയന്ത്രിതം</translation>
+<translation id="5460938382730614333">മാർക്കർ ഓണാണ്.</translation>
 <translation id="5465662442746197494">സഹായം ആവശ്യമാണോ?</translation>
 <translation id="547979256943495781">സ്‌ക്രീനിൻ്റെ വലതുഭാഗത്താണ് ഷെൽഫ്</translation>
 <translation id="5491186829646618080">ഫേംവെയർ അപ്‌ഡേറ്റുകൾ ലഭ്യമാണ്</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">സൂര്യാസ്‌തമയ സമയത്ത് നൈറ്റ് ലൈറ്റ് സ്വയമേവ ഓണാകും</translation>
 <translation id="5750765938512549687">Bluetooth ഓഫാണ്</translation>
 <translation id="5760866832697883462">നിങ്ങളുടെ <ph name="NAME" /> കണക്‌റ്റ് ചെയ്യുക</translation>
+<translation id="5762420912707163638">മാർക്കർ ടോഗിൾ ചെയ്യുക. <ph name="STATE_TEXT" /> സ്ക്രീനിൽ വരയ്ക്കാൻ ട്രാക്ക്‌പാഡോ ടച്ച്സ്ക്രീനോ സ്റ്റൈലസോ ഉപയോഗിക്കുക.</translation>
 <translation id="576341972084747908">അപകടകരമായ <ph name="FILENAME" /> ഡൗൺലോഡ് ചെയ്യുക</translation>
 <translation id="5763928712329149804">ഷെൽഫ് പാർട്ടി ഓഫാണ്.</translation>
 <translation id="576453121877257266">നൈറ്റ് ലൈറ്റ് ഓണാണ്.</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb
index eb22bed..c3c69453 100644
--- a/ash/strings/ash_strings_ne.xtb
+++ b/ash/strings/ash_strings_ne.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">लाइभ क्याप्सन अन छ।</translation>
 <translation id="1720011244392820496">Wi-Fi सिंक गर्ने सुविधा अन गर्नुहोस्</translation>
 <translation id="1736898441010944794">ब्लुटुथ डिभाइसहरूले "<ph name="NAME" />" देख्न सक्छन्।</translation>
+<translation id="174102739345480129">मार्कर अफ छ।</translation>
 <translation id="1743570585616704562">पहिचान भएन</translation>
 <translation id="1746730358044914197">तपाईंको प्रशासकले इनपुट विधिहरूको कन्फिगर गर्नुभएको हो।</translation>
 <translation id="1747827819627189109">अन-स्क्रिन किबोर्ड सक्षम गरियो</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">यी तपाईंका स्टाइलस उपकरणहरू हुन्</translation>
 <translation id="4389184120735010762">तपाईंले डक गरिएको म्याग्निफायरको किबोर्ड सर्टकट थिच्नुभयो। तपाईं यसलाई सक्रिय गर्न चाहनुहुन्छ?</translation>
 <translation id="439598569299422042">पज गरिएको छ, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">स्क्रिनकास्ट सेभ गर्न सकिएन</translation>
 <translation id="4405151984121254935">कनेक्ट गरिएको यो सहायक डिभाइस प्रयोग गर्न मिल्दैन</translation>
 <translation id="4406883609789734330">लाइभ क्याप्सन</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> अफ छ।</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">अर्को वाक्य</translation>
+<translation id="5016558321564993266">मार्कर टगल गर्नुहोस्। <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">समय सकियो</translation>
 <translation id="5033299697334913360">फुल स्क्रिनको फोटो खिच्न कुनै ठाउँमा क्लिक गर्नुहोस्</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" /> कुनै नयाँ फोनसँग जोडियो</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">साइन आउट गर्नुहोस्</translation>
 <translation id="5234764350956374838">खारेज गर्नुहोस्</translation>
 <translation id="523505283826916779">पहुँचक्षमता सेटिङहरू</translation>
+<translation id="5245201184978705914">ट्रान्सक्रिप्ट बनाउन सकिएन</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> नामक डिभाइसमा कनेक्ट गरिएको छ, <ph name="BATTERY_PERCENTAGE" />% ब्याट्री बाँकी छ</translation>
 <translation id="5260676007519551770">डेस्क ४</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> तपाईंको ध्यानाकर्षण गराउन चाहन्छ।</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">अडियो इनपुट</translation>
 <translation id="544691375626129091">सबै उपलब्ध प्रयोगकर्ताहरू यस सत्रमा पहिले नै थपिएका छन्।</translation>
 <translation id="54609108002486618">व्यवस्थापन गरिएको</translation>
+<translation id="5460938382730614333">मार्कर अन छ।</translation>
 <translation id="5465662442746197494">मद्दत आवश्यक छ?</translation>
 <translation id="547979256943495781">सेल्फ दायाँतिर छ</translation>
 <translation id="5491186829646618080">फर्मवेयरसम्बन्धी अपडेटहरू उपलब्ध छन्</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">रात्रि प्रकाश सूर्यास्तको बेला स्वतः सक्रिय हुन्छ</translation>
 <translation id="5750765938512549687">ब्लुटुथ निष्क्रिय छ</translation>
 <translation id="5760866832697883462"><ph name="NAME" /> कनेक्ट गर्नुहोस्</translation>
+<translation id="5762420912707163638">मार्कर टगल गर्नुहोस्। <ph name="STATE_TEXT" /> ट्र्याकप्याड, टचस्क्रिन वा स्टाइलस प्रयोग गरी स्क्रिनमा चित्र बनाउनुहोस्।</translation>
 <translation id="576341972084747908">तपाईं <ph name="FILENAME" /> नामक जोखिमपूर्ण फाइल डाउनलोड गर्दै हुनुहुन्छ</translation>
 <translation id="5763928712329149804">सेल्फ पार्टी अफ छ।</translation>
 <translation id="576453121877257266">रात्रि प्रकाश सक्रिय छ।</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb
index 0fdfe21..bdf2c23 100644
--- a/ash/strings/ash_strings_pa.xtb
+++ b/ash/strings/ash_strings_pa.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">ਲਾਈਵ ਸੁਰਖੀਆਂ ਚਾਲੂ ਹਨ।</translation>
 <translation id="1720011244392820496">ਵਾਈ-ਫਾਈ ਸਿੰਕ ਚਾਲੂ ਕਰੋ</translation>
 <translation id="1736898441010944794">"<ph name="NAME" />" ਬਲੂਟੁੱਥ ਡੀਵਾਈਸਾਂ ਨੂੰ ਦਿਸ ਰਿਹਾ ਹੈ।</translation>
+<translation id="174102739345480129">ਮਾਰਕਰ ਬੰਦ ਹੈ।</translation>
 <translation id="1743570585616704562">ਪਛਾਣ ਨਹੀਂ ਹੋਈ</translation>
 <translation id="1746730358044914197">ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਇਨਪੁੱਟ ਵਿਧੀਆਂ ਦਾ ਸੰਰੂਪਣ ਕੀਤਾ ਗਿਆ ਹੈ।</translation>
 <translation id="1747827819627189109">ਔਨ-ਸਕ੍ਰੀਨ ਕੀ-ਬੋਰਡ ਸਮਰਥਿਤ</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">ਇਹ ਤੁਹਾਡੇ ਸਟਾਈਲਸ ਟੂਲ ਹਨ</translation>
 <translation id="4389184120735010762">ਤੁਸੀਂ ਡੌਕ ਕੀਤੇ ਵੱਡਦਰਸ਼ੀ ਲਈ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਦਬਾਇਆ ਹੈ। ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਚਾਲੂ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
 <translation id="439598569299422042">ਰੋਕਿਆ ਗਿਆ, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">ਸਕ੍ਰੀਨਕਾਸਟ ਨੂੰ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation>
 <translation id="4405151984121254935">ਇਸ ਕਨੈਕਟ ਕੀਤੀ ਪੈਰੀਫੈਰਲ ਕਿਸਮ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ</translation>
 <translation id="4406883609789734330">ਲਾਈਵ ਸੁਰਖੀਆਂ</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> ਬੰਦ ਹੈ।</translation>
@@ -671,6 +673,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">ਅਗਲਾ ਵਾਕ</translation>
+<translation id="5016558321564993266">ਮਾਰਕਰ ਨੂੰ ਟੌਗਲ ਕਰੋ। <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ</translation>
 <translation id="5033299697334913360">ਪੂਰੀ ਸਕ੍ਰੀਨ ਨੂੰ ਕੈਪਚਰ ਕਰਨ ਲਈ ਕਿਤੇ ਵੀ ਕਲਿੱਕ ਕਰੋ</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" />ਨੂੰ ਨਵੇਂ ਫ਼ੋਨ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ</translation>
@@ -700,6 +703,7 @@
 <translation id="5222676887888702881">ਸਾਈਨ-ਆਊਟ ਕਰੋ</translation>
 <translation id="5234764350956374838">ਬਰਖ਼ਾਸਤ ਕਰੋ</translation>
 <translation id="523505283826916779">ਪਹੁੰਚਯੋਗਤਾ ਸੈਟਿੰਗਾਂ</translation>
+<translation id="5245201184978705914">ਪ੍ਰਤੀਲਿਪੀਕਰਨ ਨੂੰ ਬਣਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> ਨਾਮ ਵਾਲੇ ਕਿਸੇ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ ਹੈ, <ph name="BATTERY_PERCENTAGE" />% ਬੈਟਰੀ</translation>
 <translation id="5260676007519551770">ਡੈਸਕ 4</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> ਨੂੰ ਤੁਹਾਡੇ ਧਿਆਨ ਦੀ ਲੋੜ ਹੈ।</translation>
@@ -734,6 +738,7 @@
 <translation id="5433020815079095860">ਆਡੀਓ ਇਨਪੁੱਟ</translation>
 <translation id="544691375626129091">ਸਾਰੇ ਉਪਲਬਧ ਉਪਭੋਗਤਾ ਇਸ ਸੈਸ਼ਨ ਵਿੱਚ ਪਹਿਲਾਂ ਹੀ ਜੋੜੇ ਗਏ ਹਨ।</translation>
 <translation id="54609108002486618">ਪ੍ਰਬੰਧਿਤ</translation>
+<translation id="5460938382730614333">ਮਾਰਕਰ ਚਾਲੂ ਹੈ।</translation>
 <translation id="5465662442746197494">ਕੀ ਸਹਾਇਤਾ ਦੀ ਲੋੜ ਹੈ?</translation>
 <translation id="547979256943495781">ਸ਼ੈਲਫ਼ ਸੱਜੇ ਪਾਸੇ</translation>
 <translation id="5491186829646618080">ਫ਼ਰਮਵੇਅਰ ਅੱਪਡੇਟ ਉਪਲਬਧ ਹਨ</translation>
@@ -775,6 +780,7 @@
 <translation id="5745612484876805746">ਸੂਰਜ ਡੁੱਬਣ ਸਮੇਂ ਰਾਤ ਦੀ ਰੋਸ਼ਨੀ ਆਪਣੇ ਆਪ ਚਾਲੂ ਹੋ ਜਾਂਦੀ ਹੈ</translation>
 <translation id="5750765938512549687">ਬਲੂਟੁੱਥ ਬੰਦ ਹੈ</translation>
 <translation id="5760866832697883462">ਆਪਣਾ <ph name="NAME" /> ਕਨੈਕਟ ਕਰੋ</translation>
+<translation id="5762420912707163638">ਮਾਰਕਰ ਨੂੰ ਟੌਗਲ ਕਰੋ। <ph name="STATE_TEXT" /> ਸਕ੍ਰੀਨ ਉੱਤੇ ਕੁਝ ਬਣਾਉਣ ਲਈ ਟਰੈਕਪੈਡ, ਟੱਚਸਕ੍ਰੀਨ, ਜਾਂ ਸਟਾਈਲਸ ਦੀ ਵਰਤੋਂ ਕਰੋ।</translation>
 <translation id="576341972084747908">ਖਤਰਨਾਕ <ph name="FILENAME" /> ਡਾਊਨਲੋਡ ਕਰੋ</translation>
 <translation id="5763928712329149804">ਸ਼ੈਲਫ ਪਾਰਟੀ ਬੰਦ ਹੈ।</translation>
 <translation id="576453121877257266">ਰਾਤ ਦੀ ਰੋਸ਼ਨੀ ਚਾਲੂ ਹੈ।</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index 82d54d3..02a6e108 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">Napisy na żywo są włączone.</translation>
 <translation id="1720011244392820496">Włącz synchronizację Wi-Fi</translation>
 <translation id="1736898441010944794">„<ph name="NAME" />” jest widoczny dla urządzeń Bluetooth.</translation>
+<translation id="174102739345480129">Znacznik jest wyłączony.</translation>
 <translation id="1743570585616704562">Nie rozpoznano</translation>
 <translation id="1746730358044914197">Metody wprowadzania zostały skonfigurowane przez administratora.</translation>
 <translation id="1747827819627189109">Klawiatura ekranowa włączona</translation>
@@ -564,6 +565,7 @@
 <translation id="4379531060876907730">To są Twoje narzędzia rysika</translation>
 <translation id="4389184120735010762">Naciśnięto skrót klawiszowy lupy zadokowanej. Czy chcesz ją włączyć?</translation>
 <translation id="439598569299422042">Wstrzymano, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">Nie udało się zapisać screencastu</translation>
 <translation id="4405151984121254935">Typ podłączonego urządzenia peryferyjnego nie jest obsługiwany</translation>
 <translation id="4406883609789734330">Napisy na żywo</translation>
 <translation id="4412944820643904175">Funkcja <ph name="FEATURE_NAME" /> jest wyłączona.</translation>
@@ -670,6 +672,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">Następne zdanie</translation>
+<translation id="5016558321564993266">Przełącz znacznik. <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">Czas minął</translation>
 <translation id="5033299697334913360">Aby zrobić zrzut całego ekranu, kliknij w dowolnym miejscu</translation>
 <translation id="5035236842988137213">Urządzenie <ph name="DEVICE_NAME" /> zostało połączone z nowym telefonem</translation>
@@ -699,6 +702,7 @@
 <translation id="5222676887888702881">Wyloguj się</translation>
 <translation id="5234764350956374838">Zamknij</translation>
 <translation id="523505283826916779">Ustawienia ułatwień dostępu</translation>
+<translation id="5245201184978705914">Nie udało się wygenerować transkrypcji</translation>
 <translation id="5253783950165989294">Połączono z urządzeniem o nazwie <ph name="DEVICE_NAME" />, bateria <ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="5260676007519551770">Biurko 4</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" /> wymaga Twojej reakcji.</translation>
@@ -733,6 +737,7 @@
 <translation id="5433020815079095860">Wejście audio</translation>
 <translation id="544691375626129091">Wszyscy dostępni użytkownicy zostali już dodani do tej sesji.</translation>
 <translation id="54609108002486618">Zarządzany</translation>
+<translation id="5460938382730614333">Znacznik jest włączony.</translation>
 <translation id="5465662442746197494">Potrzebujesz pomocy?</translation>
 <translation id="547979256943495781">Półka po prawej</translation>
 <translation id="5491186829646618080">Dostępne są aktualizacje oprogramowania</translation>
@@ -774,6 +779,7 @@
 <translation id="5745612484876805746">Podświetlenie nocne włącza się automatycznie o zachodzie słońca</translation>
 <translation id="5750765938512549687">Bluetooth jest wyłączony</translation>
 <translation id="5760866832697883462">Podłącz urządzenie <ph name="NAME" /></translation>
+<translation id="5762420912707163638">Przełącz znacznik. <ph name="STATE_TEXT" /> Aby rysować na ekranie, użyj trackpada, ekranu dotykowego lub rysika.</translation>
 <translation id="576341972084747908">Pobieranie niebezpiecznego pliku <ph name="FILENAME" /></translation>
 <translation id="5763928712329149804">Tryb Shelf Party jest wyłączony.</translation>
 <translation id="576453121877257266">Podświetlenie nocne jest włączone.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 2eeba68..69dffdf 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -136,6 +136,7 @@
 <translation id="1719094688023114093">లైవ్ క్యాప్షన్ ఆన్ చేయబడింది.</translation>
 <translation id="1720011244392820496">Wi-Fi సింక్‌ను ఆన్ చేయండి</translation>
 <translation id="1736898441010944794">"<ph name="NAME" />" బ్లూటూత్ పరికరాలకు కనిపిస్తుంది.</translation>
+<translation id="174102739345480129">మార్కర్ ఆఫ్‌లో ఉంది.</translation>
 <translation id="1743570585616704562">గుర్తించలేదు</translation>
 <translation id="1746730358044914197">ఇన్‌పుట్ పద్ధతులు మీ నిర్వాహకుల ద్వారా కాన్ఫిగర్ చేయబడ్డాయి.</translation>
 <translation id="1747827819627189109">స్క్రీన్‌పై కనిపించే కీబోర్డ్ ప్రారంభించబడింది</translation>
@@ -565,6 +566,7 @@
 <translation id="4379531060876907730">ఇవి మీ స్టైలస్ సాధనాలు</translation>
 <translation id="4389184120735010762">మీరు డాక్ చేసిన మాగ్నిఫైయర్‌ కోసం కీబోర్డ్ షార్ట్‌కట్‌ను నొక్కారు. మీరు దీన్ని ఆన్ చేయాలనుకుంటున్నారా?</translation>
 <translation id="439598569299422042">పాజ్ చేయబడింది, <ph name="SIZE_INFO" /></translation>
+<translation id="440113666232554208">స్క్రీన్‌కాస్ట్‌ను సేవ్ చేయడం సాధ్యం కాదు</translation>
 <translation id="4405151984121254935">కనెక్ట్ చేయబడిన పెరిఫెరల్ రకానికి సపోర్ట్ లేదు</translation>
 <translation id="4406883609789734330">లైవ్ క్యాప్షన్</translation>
 <translation id="4412944820643904175"><ph name="FEATURE_NAME" /> ఆఫ్‌లో ఉంది.</translation>
@@ -671,6 +673,7 @@
         <ph name="NOTIFICATION_2" />,
         <ph name="NUM_OTHER_NOTIFICATION" /></translation>
 <translation id="5003993274120026347">తర్వాతి వాక్యం</translation>
+<translation id="5016558321564993266">మార్కర్‌ను టోగుల్ చేయండి. <ph name="STATE_TEXT" /></translation>
 <translation id="5030687792513154421">సమయం ముగిసింది</translation>
 <translation id="5033299697334913360">ఫుల్ స్క్రీన్‌ను క్యాప్చర్ చేయడానికి ఎక్కడైనా క్లిక్ చేయండి</translation>
 <translation id="5035236842988137213"><ph name="DEVICE_NAME" /> ఒక కొత్త ఫోన్‌కి కనెక్ట్ చేయబడింది</translation>
@@ -700,6 +703,7 @@
 <translation id="5222676887888702881">సైన్ ఔట్</translation>
 <translation id="5234764350956374838">తొలగించు</translation>
 <translation id="523505283826916779">యాక్సెస్‌ సెట్టింగ్‌లు</translation>
+<translation id="5245201184978705914">టైప్ చేసిన మాటల ఫైల్‌‌ను జెనరేట్ చేయడం సాధ్యపడదు</translation>
 <translation id="5253783950165989294"><ph name="DEVICE_NAME" /> అనే పేరుతో ఉన్న పరికరానికి కనెక్ట్ చేయబడింది, బ్యాటరీ<ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="5260676007519551770">డెస్క్ 4</translation>
 <translation id="5283099933536931082"><ph name="APP_ITEM_TITLE" />, మీ అటెన్షన్ కోసం రిక్వెస్ట్ చేస్తోంది.</translation>
@@ -734,6 +738,7 @@
 <translation id="5433020815079095860">ఆడియో ఇన్‌పుట్</translation>
 <translation id="544691375626129091">అందుబాటులో ఉన్న వినియోగదారులందరూ ఇప్పటికే ఈ సెషన్‌కు జోడించబడ్డారు.</translation>
 <translation id="54609108002486618">నిర్వహించబడింది</translation>
+<translation id="5460938382730614333">మార్కర్ ఆన్‌లో ఉంది.</translation>
 <translation id="5465662442746197494">సహాయం కావాలా?</translation>
 <translation id="547979256943495781">అర కుడి వైపున ఉంది</translation>
 <translation id="5491186829646618080">ఫర్మ్‌వేర్ అప్‌డేట్‌లు అందుబాటులో ఉన్నాయి</translation>
@@ -775,6 +780,7 @@
 <translation id="5745612484876805746">సూర్యాస్తమయ సమయానికి రాత్రి కాంతి ఆటోమేటిక్‌గా ఆన్ అవుతుంది</translation>
 <translation id="5750765938512549687">బ్లూటూత్ ఆఫ్ చేయబడింది</translation>
 <translation id="5760866832697883462">మీ <ph name="NAME" />‌ను కనెక్ట్ చేయండి</translation>
+<translation id="5762420912707163638">మార్కర్‌ను టోగుల్ చేయండి. <ph name="STATE_TEXT" /> ట్రాక్‌ప్యాడ్, టచ్‌స్క్రీన్, లేదా స్క్రీన్‌పై డ్రా చేయడానికి స్టైలస్‌ను ఉపయోగించండి.</translation>
 <translation id="576341972084747908">ప్రమాదకరమైన <ph name="FILENAME" /> ఫైల్‌ను డౌన్‌లోడ్ చేయండి</translation>
 <translation id="5763928712329149804">షెల్ఫ్ పార్టీ మోడ్ ఆఫ్‌లో ఉంది.</translation>
 <translation id="576453121877257266">రాత్రి కాంతి ఆన్‌లో ఉంది.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 76f83fb..147bbbf 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -73,7 +73,7 @@
 <translation id="1306549533752902673">แอปแนะนำ</translation>
 <translation id="1312604459020188865">ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" /></translation>
 <translation id="1316069254387866896">แสดงชั้นวางเสมอ</translation>
-<translation id="1316811122439383437">Tote: การจับภาพหน้าจอ การดาวน์โหลด และไฟล์ที่ตรึงไว้ล่าสุด</translation>
+<translation id="1316811122439383437">Tote: การจับภาพหน้าจอ การดาวน์โหลด และไฟล์ที่ปักหมุดไว้ล่าสุด</translation>
 <translation id="132346741904777634">จัดกล้องพอดีกับมุมซ้ายบนแล้ว เนื่องจากขัดแย้งกับแพลตฟอร์มของระบบ</translation>
 <translation id="1333308631814936910">เชื่อมต่อ <ph name="DISPLAY_NAME" /> แล้ว</translation>
 <translation id="1341651618736211726">รายการเพิ่มเติม</translation>
@@ -149,7 +149,7 @@
 <translation id="181103072419391116">ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />, จัดการโดยผู้ดูแลระบบ</translation>
 <translation id="1812997170047690955">รายการที่อยู่ในหน้าจอของฉัน</translation>
 <translation id="1823873187264960516">อีเทอร์เน็ต: <ph name="ADDRESS" /></translation>
-<translation id="1830308660060964064">เลิกตรึง <ph name="ITEM_TITLE" /> แล้ว</translation>
+<translation id="1830308660060964064">เลิกปักหมุด <ph name="ITEM_TITLE" /> แล้ว</translation>
 <translation id="1836215606488044471">Assistant (กำลังโหลด...)</translation>
 <translation id="1838895407229022812">แสงตอนกลางคืนปิดอยู่</translation>
 <translation id="1864454756846565995">อุปกรณ์ USB-C (พอร์ตด้านหลัง)</translation>
@@ -422,7 +422,7 @@
 <translation id="353086728817903341">เชื่อมต่ออยู่กับอุปกรณ์ <ph name="NUM_DEVICES" /> เครื่อง</translation>
 <translation id="3542066395059568317">คุณจะเห็นคำแนะนำเพื่อให้ดำเนินการต่อจากจุดที่คุณค้างไว้ได้ โดยสามารถคลิกขวาหากต้องการนำคำแนะนำออก</translation>
 <translation id="3552189655002856821">Wi-Fi ปิดอยู่</translation>
-<translation id="3554637740840164787">ตรึง <ph name="ITEM_TITLE" /> แล้ว</translation>
+<translation id="3554637740840164787">ปักหมุด <ph name="ITEM_TITLE" /> แล้ว</translation>
 <translation id="3563775809269155755">เปิดใช้ฮอตสปอต</translation>
 <translation id="3566240529365775567">เปิดเมื่อสักครู่</translation>
 <translation id="3571734092741541777">ตั้งค่า</translation>
@@ -782,7 +782,7 @@
 <translation id="576453121877257266">แสงตอนกลางคืนเปิดอยู่</translation>
 <translation id="5769373120130404283">หน้าจอส่วนตัว</translation>
 <translation id="5777841717266010279">ต้องการหยุดแชร์หน้าจอไหม</translation>
-<translation id="5779721926447984944">ไฟล์ที่ตรึงไว้</translation>
+<translation id="5779721926447984944">ไฟล์ที่ปักหมุดไว้</translation>
 <translation id="5788127256798019331">ไฟล์ Play</translation>
 <translation id="5790085346892983794">สำเร็จ</translation>
 <translation id="5805809050170488595">คลิกเพื่อเปิดใช้ <ph name="NETWORK_NAME" /></translation>
@@ -850,7 +850,7 @@
 <translation id="615957422585914272">แสดงแป้นพิมพ์บนหน้าจอ</translation>
 <translation id="6165508094623778733">ดูข้อมูลเพิ่มเติม</translation>
 <translation id="6166852626429024716">ค้นหาอุปกรณ์ แอป การตั้งค่า เว็บ...</translation>
-<translation id="6179832488876878285">คุณตรึงไฟล์สำคัญๆ ไว้ที่นี่ได้ เปิดแอป Files เพื่อเริ่มต้นใช้งาน</translation>
+<translation id="6179832488876878285">คุณปักหมุดไฟล์สำคัญๆ ไว้ที่นี่ได้ เปิดแอป Files เพื่อเริ่มต้นใช้งาน</translation>
 <translation id="619279033188484792">ดูรูปภาพ สื่อ และการแจ้งเตือนล่าสุดของโทรศัพท์ใน <ph name="DEVICE_TYPE" /></translation>
 <translation id="619335566042889110">ชาร์จจนเต็มเลย</translation>
 <translation id="6220928844947387476">ตอนนี้สามารถบันทึกตัวคุณเองไปพร้อมกับหน้าจอได้แล้ว</translation>
@@ -1063,7 +1063,7 @@
 <translation id="7543399541175347147">ขณะนี้ยังไม่รองรับแอป Linux และหน้าต่างที่ไม่ระบุตัวตน ระบบจะบันทึกแอปอื่นๆ</translation>
 <translation id="7544300628205093162">ไฟแบ็กไลต์ของแป้นพิมพ์เปิดอยู่</translation>
 <translation id="7548434653388805669">ได้เวลาเข้านอนแล้ว</translation>
-<translation id="7551643184018910560">ตรึงที่ชั้นวาง</translation>
+<translation id="7551643184018910560">ปักหมุดที่ชั้นวาง</translation>
 <translation id="7561982940498449837">ปิดเมนู</translation>
 <translation id="7564874036684306347">การย้ายหน้าต่างไปยังเดสก์ท็อปอื่นอาจส่งผลให้ลักษณะการทำงานผิกปกติ การแจ้งเตือน หน้าต่าง และกล่องโต้ตอบที่ตามมาอาจแสดงแยกส่วนในเดสก์ท็อปทั้งสอง</translation>
 <translation id="7569509451529460200">เปิดใช้เบรลล์และ ChromeVox แล้ว</translation>
diff --git a/ash/system/human_presence/human_presence_orientation_controller.cc b/ash/system/human_presence/human_presence_orientation_controller.cc
index 2f20f769..ea29a301 100644
--- a/ash/system/human_presence/human_presence_orientation_controller.cc
+++ b/ash/system/human_presence/human_presence_orientation_controller.cc
@@ -15,7 +15,7 @@
 
 namespace ash {
 
-HpsOrientationController::HpsOrientationController() {
+HumanPresenceOrientationController::HumanPresenceOrientationController() {
   TabletModeController* tablet_mode_controller =
       Shell::Get()->tablet_mode_controller();
   DCHECK(tablet_mode_controller);
@@ -34,27 +34,28 @@
           .rotation() != display::Display::ROTATE_0;
 }
 
-HpsOrientationController::~HpsOrientationController() = default;
+HumanPresenceOrientationController::~HumanPresenceOrientationController() =
+    default;
 
-void HpsOrientationController::AddObserver(Observer* observer) {
+void HumanPresenceOrientationController::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
 
-void HpsOrientationController::RemoveObserver(Observer* observer) {
+void HumanPresenceOrientationController::RemoveObserver(Observer* observer) {
   observers_.RemoveObserver(observer);
 }
 
-bool HpsOrientationController::IsOrientationSuitable() const {
+bool HumanPresenceOrientationController::IsOrientationSuitable() const {
   return !physical_tablet_state_ && !display_rotated_;
 }
 
-void HpsOrientationController::OnTabletPhysicalStateChanged() {
+void HumanPresenceOrientationController::OnTabletPhysicalStateChanged() {
   const bool physical_tablet_state =
       Shell::Get()->tablet_mode_controller()->is_in_tablet_physical_state();
   UpdateOrientation(physical_tablet_state, display_rotated_);
 }
 
-void HpsOrientationController::OnDisplayMetricsChanged(
+void HumanPresenceOrientationController::OnDisplayMetricsChanged(
     const display::Display& display,
     uint32_t changed_metrics) {
   // We only care when the rotation of the in-built display changes.
@@ -67,8 +68,9 @@
   UpdateOrientation(physical_tablet_state_, display_rotated);
 }
 
-void HpsOrientationController::UpdateOrientation(bool physical_tablet_state,
-                                                 bool display_rotated) {
+void HumanPresenceOrientationController::UpdateOrientation(
+    bool physical_tablet_state,
+    bool display_rotated) {
   const bool was_suitable = IsOrientationSuitable();
 
   physical_tablet_state_ = physical_tablet_state;
diff --git a/ash/system/human_presence/human_presence_orientation_controller.h b/ash/system/human_presence/human_presence_orientation_controller.h
index d3206b3..0f64369 100644
--- a/ash/system/human_presence/human_presence_orientation_controller.h
+++ b/ash/system/human_presence/human_presence_orientation_controller.h
@@ -19,8 +19,9 @@
 //
 // This controller tracks the physical state of the device and signals observers
 // when it enters or leaves non-standard orientations.
-class ASH_EXPORT HpsOrientationController : public TabletModeObserver,
-                                            public display::DisplayObserver {
+class ASH_EXPORT HumanPresenceOrientationController
+    : public TabletModeObserver,
+      public display::DisplayObserver {
  public:
   class Observer : public base::CheckedObserver {
    public:
@@ -30,11 +31,12 @@
     virtual void OnOrientationChanged(bool suitable_for_hps) = 0;
   };
 
-  HpsOrientationController();
-  HpsOrientationController(const HpsOrientationController& other) = delete;
-  HpsOrientationController& operator=(const HpsOrientationController& other) =
-      delete;
-  ~HpsOrientationController() override;
+  HumanPresenceOrientationController();
+  HumanPresenceOrientationController(
+      const HumanPresenceOrientationController& other) = delete;
+  HumanPresenceOrientationController& operator=(
+      const HumanPresenceOrientationController& other) = delete;
+  ~HumanPresenceOrientationController() override;
 
   // Start or stop listening for changes to device orientation status.
   void AddObserver(Observer* observer);
diff --git a/ash/system/human_presence/human_presence_orientation_controller_unittest.cc b/ash/system/human_presence/human_presence_orientation_controller_unittest.cc
index 017cbec0..f673890 100644
--- a/ash/system/human_presence/human_presence_orientation_controller_unittest.cc
+++ b/ash/system/human_presence/human_presence_orientation_controller_unittest.cc
@@ -18,14 +18,14 @@
 namespace {
 
 // A simple observer that lists its last observation.
-class TestObserver : public HpsOrientationController::Observer {
+class TestObserver : public HumanPresenceOrientationController::Observer {
  public:
   TestObserver() = default;
   TestObserver(const TestObserver&) = delete;
   TestObserver& operator=(const TestObserver&) = delete;
   ~TestObserver() override = default;
 
-  // HpsOrientationController::Observer::
+  // HumanPresenceOrientationController::Observer::
   void OnOrientationChanged(bool suitable_for_hps) override {
     ++observation_count_;
     last_observation_ = suitable_for_hps;
@@ -40,13 +40,14 @@
   bool last_observation_ = false;
 };
 
-class HpsOrientationControllerTest : public AshTestBase {
+class HumanPresenceOrientationControllerTest : public AshTestBase {
  public:
-  HpsOrientationControllerTest() = default;
-  HpsOrientationControllerTest(const HpsOrientationControllerTest&) = delete;
-  HpsOrientationControllerTest& operator=(const HpsOrientationControllerTest&) =
-      delete;
-  ~HpsOrientationControllerTest() override = default;
+  HumanPresenceOrientationControllerTest() = default;
+  HumanPresenceOrientationControllerTest(
+      const HumanPresenceOrientationControllerTest&) = delete;
+  HumanPresenceOrientationControllerTest& operator=(
+      const HumanPresenceOrientationControllerTest&) = delete;
+  ~HumanPresenceOrientationControllerTest() override = default;
 
   void SetUp() override {
     scoped_feature_list_.InitWithFeatures({ash::features::kSnoopingProtection},
@@ -55,7 +56,8 @@
 
     AshTestBase::SetUp();
 
-    orientation_controller_ = Shell::Get()->hps_orientation_controller();
+    orientation_controller_ =
+        Shell::Get()->human_presence_orientation_controller();
     tablet_mode_controller_ = Shell::Get()->tablet_mode_controller();
     display_manager_ = Shell::Get()->display_manager();
 
@@ -73,7 +75,7 @@
         display::Display::RotationSource::ACTIVE);
   }
 
-  HpsOrientationController* orientation_controller_ = nullptr;
+  HumanPresenceOrientationController* orientation_controller_ = nullptr;
   TabletModeController* tablet_mode_controller_ = nullptr;
   display::DisplayManager* display_manager_ = nullptr;
 
@@ -82,7 +84,7 @@
   base::test::ScopedCommandLine scoped_command_line_;
 };
 
-TEST_F(HpsOrientationControllerTest, TabletMode) {
+TEST_F(HumanPresenceOrientationControllerTest, TabletMode) {
   ASSERT_TRUE(orientation_controller_->IsOrientationSuitable());
 
   tablet_mode_controller_->SetEnabledForTest(true);
@@ -91,7 +93,7 @@
   EXPECT_TRUE(orientation_controller_->IsOrientationSuitable());
 }
 
-TEST_F(HpsOrientationControllerTest, DisplayOrientation) {
+TEST_F(HumanPresenceOrientationControllerTest, DisplayOrientation) {
   ASSERT_TRUE(orientation_controller_->IsOrientationSuitable());
 
   // Rotating the external display has no effect on our sensor.
@@ -109,7 +111,7 @@
   EXPECT_TRUE(orientation_controller_->IsOrientationSuitable());
 }
 
-TEST_F(HpsOrientationControllerTest, Observer) {
+TEST_F(HumanPresenceOrientationControllerTest, Observer) {
   TestObserver observer;
   orientation_controller_->AddObserver(&observer);
 
diff --git a/ash/system/human_presence/snooping_protection_notification_blocker.cc b/ash/system/human_presence/snooping_protection_notification_blocker.cc
index f9f6f9e..974c8839 100644
--- a/ash/system/human_presence/snooping_protection_notification_blocker.cc
+++ b/ash/system/human_presence/snooping_protection_notification_blocker.cc
@@ -90,9 +90,9 @@
 
 }  // namespace hps_internal
 
-HpsNotifyNotificationBlocker::HpsNotifyNotificationBlocker(
+SnoopingProtectionNotificationBlocker::SnoopingProtectionNotificationBlocker(
     message_center::MessageCenter* message_center,
-    HpsNotifyController* controller)
+    SnoopingProtectionController* controller)
     : NotificationBlocker(message_center),
       message_center_(message_center),
       controller_(controller) {
@@ -109,9 +109,10 @@
   UpdateInfoNotificationIfNecessary();
 }
 
-HpsNotifyNotificationBlocker::~HpsNotifyNotificationBlocker() = default;
+SnoopingProtectionNotificationBlocker::
+    ~SnoopingProtectionNotificationBlocker() = default;
 
-void HpsNotifyNotificationBlocker::OnActiveUserPrefServiceChanged(
+void SnoopingProtectionNotificationBlocker::OnActiveUserPrefServiceChanged(
     PrefService* pref_service) {
   OnBlockingActiveChanged();
 
@@ -121,16 +122,16 @@
   pref_change_registrar_->Add(
       prefs::kSnoopingProtectionNotificationSuppressionEnabled,
       base::BindRepeating(
-          &HpsNotifyNotificationBlocker::OnBlockingActiveChanged,
+          &SnoopingProtectionNotificationBlocker::OnBlockingActiveChanged,
           weak_ptr_factory_.GetWeakPtr()));
 }
 
-void HpsNotifyNotificationBlocker::OnBlockingActiveChanged() {
+void SnoopingProtectionNotificationBlocker::OnBlockingActiveChanged() {
   NotifyBlockingStateChanged();
   UpdateInfoNotificationIfNecessary();
 }
 
-bool HpsNotifyNotificationBlocker::ShouldShowNotificationAsPopup(
+bool SnoopingProtectionNotificationBlocker::ShouldShowNotificationAsPopup(
     const message_center::Notification& notification) const {
   // If we've populated our info popup, we're definitely hiding some other
   // notifications and need to inform the user.
@@ -148,7 +149,8 @@
          !base::StartsWith(notification.id(), SmsObserver::kNotificationPrefix);
 }
 
-void HpsNotifyNotificationBlocker::OnSnoopingStatusChanged(bool /*snooper*/) {
+void SnoopingProtectionNotificationBlocker::OnSnoopingStatusChanged(
+    bool /*snooper*/) {
   // Need to reevaluate blocking for (i.e. un/hide) all notifications when a
   // snooper appears. This also catches disabling the snooping feature all
   // together, since that is translated to a "no snooper" event by the
@@ -156,17 +158,18 @@
   OnBlockingActiveChanged();
 }
 
-void HpsNotifyNotificationBlocker::OnHpsNotifyControllerDestroyed() {
+void SnoopingProtectionNotificationBlocker::
+    OnSnoopingProtectionControllerDestroyed() {
   controller_observation_.Reset();
 }
 
-void HpsNotifyNotificationBlocker::OnNotificationAdded(
+void SnoopingProtectionNotificationBlocker::OnNotificationAdded(
     const std::string& notification_id) {
   if (notification_id != kInfoNotificationId)
     UpdateInfoNotificationIfNecessary();
 }
 
-void HpsNotifyNotificationBlocker::OnNotificationRemoved(
+void SnoopingProtectionNotificationBlocker::OnNotificationRemoved(
     const std::string& notification_id,
     bool /*by_user*/) {
   if (notification_id == kInfoNotificationId)
@@ -175,21 +178,21 @@
     UpdateInfoNotificationIfNecessary();
 }
 
-void HpsNotifyNotificationBlocker::OnNotificationUpdated(
+void SnoopingProtectionNotificationBlocker::OnNotificationUpdated(
     const std::string& notification_id) {
   if (notification_id != kInfoNotificationId)
     UpdateInfoNotificationIfNecessary();
 }
 
-void HpsNotifyNotificationBlocker::OnBlockingStateChanged(
+void SnoopingProtectionNotificationBlocker::OnBlockingStateChanged(
     message_center::NotificationBlocker* blocker) {
   if (blocker != this)
     UpdateInfoNotificationIfNecessary();
 }
 
-void HpsNotifyNotificationBlocker::Close(bool by_user) {}
+void SnoopingProtectionNotificationBlocker::Close(bool by_user) {}
 
-void HpsNotifyNotificationBlocker::Click(
+void SnoopingProtectionNotificationBlocker::Click(
     const absl::optional<int>& button_index,
     const absl::optional<std::u16string>& reply) {
   if (!button_index.has_value())
@@ -212,7 +215,7 @@
   }
 }
 
-bool HpsNotifyNotificationBlocker::BlockingActive() const {
+bool SnoopingProtectionNotificationBlocker::BlockingActive() const {
   // Never block if the feature is disabled.
   const PrefService* const pref_service =
       Shell::Get()->session_controller()->GetActivePrefService();
@@ -225,7 +228,8 @@
   return controller_->SnooperPresent();
 }
 
-void HpsNotifyNotificationBlocker::UpdateInfoNotificationIfNecessary() {
+void SnoopingProtectionNotificationBlocker::
+    UpdateInfoNotificationIfNecessary() {
   // Collect the IDs whose popups would be shown but for us.
   std::set<std::string> new_blocked_popups;
   if (BlockingActive()) {
@@ -257,7 +261,7 @@
 }
 
 std::unique_ptr<message_center::Notification>
-HpsNotifyNotificationBlocker::CreateInfoNotification() const {
+SnoopingProtectionNotificationBlocker::CreateInfoNotification() const {
   // Create a list of popup titles in descending order of recentness and with no
   // duplicates.
   std::vector<std::u16string> titles;
@@ -300,7 +304,7 @@
       notification_data,
       base::MakeRefCounted<message_center::ThunkNotificationDelegate>(
           weak_ptr_factory_.GetWeakPtr()),
-      kSystemTrayHpsNotifyIcon,
+      kSystemTraySnoopingProtectionIcon,
       message_center::SystemNotificationWarningLevel::NORMAL);
 
   return notification;
diff --git a/ash/system/human_presence/snooping_protection_notification_blocker.h b/ash/system/human_presence/snooping_protection_notification_blocker.h
index 0022ead..401e27f 100644
--- a/ash/system/human_presence/snooping_protection_notification_blocker.h
+++ b/ash/system/human_presence/snooping_protection_notification_blocker.h
@@ -34,24 +34,26 @@
 // TODO(crbug.com/1241706): make this naming less opaque. Currently using "HPS
 // notify" because it was the feature name early in development, but paths /
 // identifiers will be renamed in one fell swoop.
-class ASH_EXPORT HpsNotifyNotificationBlocker
+class ASH_EXPORT SnoopingProtectionNotificationBlocker
     : public SessionObserver,
       public message_center::NotificationBlocker,
       public message_center::NotificationObserver,
-      public HpsNotifyController::Observer,
+      public SnoopingProtectionController::Observer,
       public message_center::MessageCenterObserver {
  public:
   // The ID of the informational popup.
   static constexpr char kInfoNotificationId[] = "hps-notify-info";
 
-  HpsNotifyNotificationBlocker(message_center::MessageCenter* message_center,
-                               HpsNotifyController* controller);
+  SnoopingProtectionNotificationBlocker(
+      message_center::MessageCenter* message_center,
+      SnoopingProtectionController* controller);
 
-  HpsNotifyNotificationBlocker(const HpsNotifyNotificationBlocker&) = delete;
-  HpsNotifyNotificationBlocker& operator=(const HpsNotifyNotificationBlocker&) =
-      delete;
+  SnoopingProtectionNotificationBlocker(
+      const SnoopingProtectionNotificationBlocker&) = delete;
+  SnoopingProtectionNotificationBlocker& operator=(
+      const SnoopingProtectionNotificationBlocker&) = delete;
 
-  ~HpsNotifyNotificationBlocker() override;
+  ~SnoopingProtectionNotificationBlocker() override;
 
   // SessionObserver:
   void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
@@ -60,9 +62,9 @@
   bool ShouldShowNotificationAsPopup(
       const message_center::Notification& notification) const override;
 
-  // HpsNotifyController::Observer:
+  // SnoopingProtectionController::Observer:
   void OnSnoopingStatusChanged(bool snooper) override;
-  void OnHpsNotifyControllerDestroyed() override;
+  void OnSnoopingProtectionControllerDestroyed() override;
 
   // message_center::MessageCenterObserver:
   void OnNotificationAdded(const std::string& notification_id) override;
@@ -94,7 +96,7 @@
   std::unique_ptr<message_center::Notification> CreateInfoNotification() const;
 
   message_center::MessageCenter* const message_center_;
-  HpsNotifyController* const controller_;
+  SnoopingProtectionController* const controller_;
 
   bool info_popup_exists_ = false;
 
@@ -103,7 +105,8 @@
 
   base::ScopedObservation<SessionController, SessionObserver>
       session_observation_{this};
-  base::ScopedObservation<HpsNotifyController, HpsNotifyController::Observer>
+  base::ScopedObservation<SnoopingProtectionController,
+                          SnoopingProtectionController::Observer>
       controller_observation_{this};
   base::ScopedObservation<message_center::MessageCenter,
                           message_center::MessageCenterObserver>
@@ -112,7 +115,8 @@
   std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
 
   // Must be last.
-  base::WeakPtrFactory<HpsNotifyNotificationBlocker> weak_ptr_factory_{this};
+  base::WeakPtrFactory<SnoopingProtectionNotificationBlocker> weak_ptr_factory_{
+      this};
 };
 
 }  // namespace ash
diff --git a/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc b/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc
index 689024c..02e5f429 100644
--- a/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc
+++ b/ash/system/human_presence/snooping_protection_notification_blocker_unittest.cc
@@ -100,7 +100,8 @@
 // Returns true if the HPS notify informational popup is popped-up.
 bool InfoPopupVisible() {
   return message_center::MessageCenter::Get()->FindPopupNotificationById(
-             HpsNotifyNotificationBlocker::kInfoNotificationId) != nullptr;
+             SnoopingProtectionNotificationBlocker::kInfoNotificationId) !=
+         nullptr;
 }
 
 // Returns the index at which the given substring appears in the informational
@@ -108,7 +109,7 @@
 size_t PositionInInfoPopupMessage(const std::u16string& substr) {
   const message_center::Notification* notification =
       message_center::MessageCenter::Get()->FindPopupNotificationById(
-          HpsNotifyNotificationBlocker::kInfoNotificationId);
+          SnoopingProtectionNotificationBlocker::kInfoNotificationId);
   return notification ? notification->message().find(substr)
                       : std::u16string::npos;
 }
@@ -175,9 +176,9 @@
 
 // A test fixture that gives access to the HPS notify controller (to fake
 // snooping events).
-class HpsNotifyNotificationBlockerTest : public AshTestBase {
+class SnoopingProtectionNotificationBlockerTest : public AshTestBase {
  public:
-  HpsNotifyNotificationBlockerTest()
+  SnoopingProtectionNotificationBlockerTest()
       : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
     scoped_feature_list_.InitWithFeatures({ash::features::kSnoopingProtection},
                                           {ash::features::kQuickDim});
@@ -185,18 +186,18 @@
         switches::kHasHps);
   }
 
-  HpsNotifyNotificationBlockerTest(const HpsNotifyNotificationBlockerTest&) =
-      delete;
-  HpsNotifyNotificationBlockerTest& operator=(
-      const HpsNotifyNotificationBlockerTest&) = delete;
+  SnoopingProtectionNotificationBlockerTest(
+      const SnoopingProtectionNotificationBlockerTest&) = delete;
+  SnoopingProtectionNotificationBlockerTest& operator=(
+      const SnoopingProtectionNotificationBlockerTest&) = delete;
 
-  ~HpsNotifyNotificationBlockerTest() override = default;
+  ~SnoopingProtectionNotificationBlockerTest() override = default;
 
   // AshTestBase overrides:
   void SetUp() override {
     // Simulate a working DBus client.
-    chromeos::HpsDBusClient::InitializeFake();
-    auto* dbus_client = chromeos::FakeHpsDBusClient::Get();
+    chromeos::HumanPresenceDBusClient::InitializeFake();
+    auto* dbus_client = chromeos::FakeHumanPresenceDBusClient::Get();
     dbus_client->set_hps_service_is_available(true);
     dbus_client->set_hps_notify_result(hps::HpsResult::NEGATIVE);
 
@@ -211,7 +212,7 @@
     // snooping protection pref.
     SetSnoopingPref(true);
 
-    controller_ = Shell::Get()->hps_notify_controller();
+    controller_ = Shell::Get()->snooping_protection_controller();
     message_center_ = message_center::MessageCenter::Get();
   }
 
@@ -219,17 +220,17 @@
     return GetPrimaryUnifiedSystemTray()->message_center_bubble();
   }
 
-  bool HasHpsNotification() {
+  bool HasInfoNotification() {
     message_center::Notification* notification =
         message_center::MessageCenter::Get()->FindVisibleNotificationById(
-            HpsNotifyNotificationBlocker::kInfoNotificationId);
+            SnoopingProtectionNotificationBlocker::kInfoNotificationId);
     return notification != nullptr;
   }
 
   void SimulateClick(int button_index) {
     message_center::Notification* notification =
         message_center::MessageCenter::Get()->FindVisibleNotificationById(
-            HpsNotifyNotificationBlocker::kInfoNotificationId);
+            SnoopingProtectionNotificationBlocker::kInfoNotificationId);
     notification->delegate()->Click(button_index, absl::nullopt);
   }
 
@@ -238,7 +239,7 @@
   }
 
  protected:
-  HpsNotifyController* controller_ = nullptr;
+  SnoopingProtectionController* controller_ = nullptr;
   message_center::MessageCenter* message_center_ = nullptr;
 
  private:
@@ -246,7 +247,7 @@
   base::test::ScopedCommandLine scoped_command_line_;
 };
 
-TEST_F(HpsNotifyNotificationBlockerTest, Snooping) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, Snooping) {
   SetBlockerPref(true);
 
   // By default, no snooper detected.
@@ -280,7 +281,7 @@
   EXPECT_EQ(VisibleNotificationCount(), 3u);
 }
 
-TEST_F(HpsNotifyNotificationBlockerTest, Pref) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, Pref) {
   SetBlockerPref(false);
 
   // Start with one notification that shouldn't be hidden.
@@ -322,7 +323,7 @@
   EXPECT_EQ(VisibleNotificationCount(), 3u);
 }
 
-TEST_F(HpsNotifyNotificationBlockerTest, SystemNotification) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, SystemNotification) {
   SetBlockerPref(true);
 
   // One regular notification, one important notification that should be
@@ -352,7 +353,7 @@
   EXPECT_EQ(VisibleNotificationCount(), 4u);
 }
 
-TEST_F(HpsNotifyNotificationBlockerTest, InfoPopup) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, InfoPopup) {
   SetBlockerPref(true);
 
   // Simulate snooper presence.
@@ -367,7 +368,8 @@
   EXPECT_EQ(VisibleNotificationCount(), 3u);
 
   // Check that the user can remove the info popup and it will return.
-  RemoveNotification(HpsNotifyNotificationBlocker::kInfoNotificationId);
+  RemoveNotification(
+      SnoopingProtectionNotificationBlocker::kInfoNotificationId);
   EXPECT_EQ(VisiblePopupCount(), 0u);
   AddNotification("notification-3", u"notifier-3");
   EXPECT_EQ(VisiblePopupCount(), 1u);  // Only our info popup.
@@ -377,7 +379,7 @@
 
 // Test that we don't report the notifiers of popups that we (alone) aren't
 // blocking.
-TEST_F(HpsNotifyNotificationBlockerTest, InfoPopupOtherBlocker) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, InfoPopupOtherBlocker) {
   IdPopupBlocker other_blocker(message_center_);
   other_blocker.SetTargetId("notification-2");
 
@@ -409,7 +411,8 @@
 
 // Test that the info popup message is changed as relevant notifications are
 // added and removed.
-TEST_F(HpsNotifyNotificationBlockerTest, InfoPopupChangingNotifications) {
+TEST_F(SnoopingProtectionNotificationBlockerTest,
+       InfoPopupChangingNotifications) {
   SetBlockerPref(true);
 
   // Simulate snooper presence.
@@ -455,7 +458,7 @@
 }
 
 // Test that message center is visible when click "Show" button.
-TEST_F(HpsNotifyNotificationBlockerTest, ShowButtonClicked) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, ShowButtonClicked) {
   SetBlockerPref(true);
 
   // Simulate snooper presence.
@@ -464,7 +467,7 @@
   AddNotification("notification-1", u"notifier-1");
   AddNotification("notification-2", u"notifier-2");
 
-  EXPECT_TRUE(HasHpsNotification());
+  EXPECT_TRUE(HasInfoNotification());
 
   // Click on show button.
   SimulateClick(/*button_index=*/0);
@@ -472,7 +475,7 @@
 }
 
 // Test that message center is visible when click Settings button.
-TEST_F(HpsNotifyNotificationBlockerTest, SettingsButtonClicked) {
+TEST_F(SnoopingProtectionNotificationBlockerTest, SettingsButtonClicked) {
   SetBlockerPref(true);
 
   // Simulate snooper presence.
@@ -481,14 +484,14 @@
   AddNotification("notification-1", u"notifier-1");
   AddNotification("notification-2", u"notifier-2");
 
-  EXPECT_TRUE(HasHpsNotification());
+  EXPECT_TRUE(HasInfoNotification());
 
   // Click on show button.
   SimulateClick(/*button_index=*/1);
   EXPECT_EQ(1, GetNumOsSmartPrivacySettingsOpened());
 }
 
-TEST(HpsNotifyNotificationBlockerInternalTest, WebsiteNotifierTitles) {
+TEST(SnoopingProtectionNotificationBlockerInternalTest, WebsiteNotifierTitles) {
   // Website without title uses a generic "web" string.
   const message_center::NotifierId untrusted_notifier(
       GURL("http://untrusted.com:443"));
@@ -508,7 +511,7 @@
   EXPECT_EQ(trusted_title, u"Trusted");
 }
 
-TEST(HpsNotifyNotificationBlockerInternalTest, AppNotifierTitles) {
+TEST(SnoopingProtectionNotificationBlockerInternalTest, AppNotifierTitles) {
   // App without known title uses a generic "app" string.
   const message_center::NotifierId unknown_app_notifier(
       message_center::NotifierType::APPLICATION, "unknown-app");
@@ -542,7 +545,7 @@
   EXPECT_EQ(crostini_app_title, u"Signal Messenger");
 }
 
-TEST(HpsNotifyNotificationBlockerInternalTest, PopupMessage) {
+TEST(SnoopingProtectionNotificationBlockerInternalTest, PopupMessage) {
   // Proper app names should be presented as-is.
   const std::vector<std::u16string> list_1 = {u"App title"};
   const std::u16string list_1_msg =
diff --git a/ash/system/message_center/message_center_controller.cc b/ash/system/message_center/message_center_controller.cc
index 6b61bcc3..028d5b9 100644
--- a/ash/system/message_center/message_center_controller.cc
+++ b/ash/system/message_center/message_center_controller.cc
@@ -105,10 +105,10 @@
   }
 
   // When adding other notification blockers, ensure that they are initialized
-  // before the shell's `HpsNotifyController`. The notification blocker that it
-  // adds during its construction must be the last blocker, since it observes
-  // the states of all the others.
-  DCHECK(!Shell::Get()->hps_notify_controller());
+  // before the shell's `SnoopingProtectionController`. The notification blocker
+  // that it adds during its construction must be the last blocker, since it
+  // observes the states of all the others.
+  DCHECK(!Shell::Get()->snooping_protection_controller());
 
   // Set the system notification source display name ("ChromeOS" or
   // "ChromiumOS").
diff --git a/ash/system/palette/palette_tool.cc b/ash/system/palette/palette_tool.cc
index 26df974..42240ab 100644
--- a/ash/system/palette/palette_tool.cc
+++ b/ash/system/palette/palette_tool.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "ash/assistant/util/assistant_util.h"
+#include "ash/constants/ash_features.h"
 #include "ash/system/palette/palette_tool_manager.h"
 #include "ash/system/palette/palette_utils.h"
 #include "ash/system/palette/tools/create_note_action.h"
@@ -22,8 +23,10 @@
 void PaletteTool::RegisterToolInstances(PaletteToolManager* tool_manager) {
   tool_manager->AddTool(std::make_unique<EnterCaptureMode>(tool_manager));
   tool_manager->AddTool(std::make_unique<CreateNoteAction>(tool_manager));
-  if (assistant::util::IsGoogleDevice())
+  if (!ash::features::IsDeprecateAssistantStylusFeaturesEnabled() &&
+      assistant::util::IsGoogleDevice()) {
     tool_manager->AddTool(std::make_unique<MetalayerMode>(tool_manager));
+  }
   tool_manager->AddTool(std::make_unique<LaserPointerMode>(tool_manager));
   tool_manager->AddTool(std::make_unique<MagnifierMode>(tool_manager));
 }
diff --git a/ash/system/power/lock_on_leave_controller.cc b/ash/system/power/lock_on_leave_controller.cc
index bd0660ff..b2eee82 100644
--- a/ash/system/power/lock_on_leave_controller.cc
+++ b/ash/system/power/lock_on_leave_controller.cc
@@ -14,100 +14,103 @@
 namespace {
 
 // Helper for EnableHpsSense.
-void EnableHpsSenseViaDBus() {
-  const auto config = hps::GetEnableHpsSenseConfig();
+void EnableLockOnLeaveViaDBus() {
+  const auto config = hps::GetEnableLockOnLeaveConfig();
   if (config.has_value()) {
-    chromeos::HpsDBusClient::Get()->EnableHpsSense(config.value());
+    chromeos::HumanPresenceDBusClient::Get()->EnableHpsSense(config.value());
   }
 }
 
 // Helper for DisableHpsSense.
-void DisableHpsSenseViaDBus() {
-  chromeos::HpsDBusClient::Get()->DisableHpsSense();
+void DisableLockOnLeaveViaDBus() {
+  chromeos::HumanPresenceDBusClient::Get()->DisableHpsSense();
 }
 
 }  // namespace
 
-HpsSenseController::HpsSenseController() {
-  hps_observation_.Observe(chromeos::HpsDBusClient::Get());
+LockOnLeaveController::LockOnLeaveController() {
+  human_presence_observation_.Observe(chromeos::HumanPresenceDBusClient::Get());
 
-  chromeos::HpsDBusClient::Get()->WaitForServiceToBeAvailable(
-      base::BindOnce(&HpsSenseController::OnHpsServiceAvailable,
+  chromeos::HumanPresenceDBusClient::Get()->WaitForServiceToBeAvailable(
+      base::BindOnce(&LockOnLeaveController::OnServiceAvailable,
                      weak_ptr_factory_.GetWeakPtr()));
 
   // Orientation controller is instantiated before us in the shell.
-  HpsOrientationController* orientation_controller =
-      Shell::Get()->hps_orientation_controller();
-  suitable_for_hps_ = orientation_controller->IsOrientationSuitable();
+  HumanPresenceOrientationController* orientation_controller =
+      Shell::Get()->human_presence_orientation_controller();
+  suitable_for_human_presence_ =
+      orientation_controller->IsOrientationSuitable();
   orientation_observation_.Observe(orientation_controller);
 }
 
-HpsSenseController::~HpsSenseController() {
-  hps_observation_.Reset();
+LockOnLeaveController::~LockOnLeaveController() {
+  human_presence_observation_.Reset();
   orientation_observation_.Reset();
 }
 
-void HpsSenseController::EnableHpsSense() {
-  want_hps_sense_ = true;
+void LockOnLeaveController::EnableLockOnLeave() {
+  want_lock_on_leave_ = true;
   ReconfigViaDbus();
 }
 
-void HpsSenseController::DisableHpsSense() {
-  want_hps_sense_ = false;
+void LockOnLeaveController::DisableLockOnLeave() {
+  want_lock_on_leave_ = false;
   ReconfigViaDbus();
 }
 
-// HpsOrientationObserver:
-void HpsSenseController::OnOrientationChanged(bool suitable_for_hps) {
-  suitable_for_hps_ = suitable_for_hps;
+// HumanPresenceOrientationObserver:
+void LockOnLeaveController::OnOrientationChanged(
+    bool suitable_for_human_presence) {
+  suitable_for_human_presence_ = suitable_for_human_presence;
   ReconfigViaDbus();
 }
 
-void HpsSenseController::OnHpsSenseChanged(hps::HpsResult state) {}
+void LockOnLeaveController::OnHpsSenseChanged(hps::HpsResult state) {}
 
-void HpsSenseController::OnHpsNotifyChanged(hps::HpsResult state) {}
+void LockOnLeaveController::OnHpsNotifyChanged(hps::HpsResult state) {}
 
-void HpsSenseController::OnRestart() {
+void LockOnLeaveController::OnRestart() {
   service_available_ = true;
   ReconfigViaDbus();
 }
 
-void HpsSenseController::OnShutdown() {
-  // HpsDBusService just stopped.
+void LockOnLeaveController::OnShutdown() {
+  // The service just stopped.
   service_available_ = false;
-  configured_state_ = ConfiguredHpsSenseState::kDisabled;
+  configured_state_ = ConfiguredLockOnLeaveState::kDisabled;
 }
 
-void HpsSenseController::OnHpsServiceAvailable(const bool service_available) {
+void LockOnLeaveController::OnServiceAvailable(const bool service_available) {
   service_available_ = service_available;
   ReconfigViaDbus();
 }
 
-void HpsSenseController::ReconfigViaDbus() {
+void LockOnLeaveController::ReconfigViaDbus() {
   if (!service_available_)
     return;
 
   // When chrome starts, it does not know the current configured_state_, because
   // it could be left enabled from previous chrome session, disable it so that
   // the new configuration can apply.
-  if (configured_state_ == ConfiguredHpsSenseState::kUnknown) {
-    DisableHpsSenseViaDBus();
-    configured_state_ = ConfiguredHpsSenseState::kDisabled;
+  if (configured_state_ == ConfiguredLockOnLeaveState::kUnknown) {
+    DisableLockOnLeaveViaDBus();
+    configured_state_ = ConfiguredLockOnLeaveState::kDisabled;
   }
 
   // Wanted state should be either kEnabled or kDisabled.
-  const ConfiguredHpsSenseState wanted_state =
-      want_hps_sense_ && suitable_for_hps_ ? ConfiguredHpsSenseState::kEnabled
-                                           : ConfiguredHpsSenseState::kDisabled;
+  const ConfiguredLockOnLeaveState wanted_state =
+      want_lock_on_leave_ && suitable_for_human_presence_
+          ? ConfiguredLockOnLeaveState::kEnabled
+          : ConfiguredLockOnLeaveState::kDisabled;
 
   // Return if already configured to the wanted state.
   if (wanted_state == configured_state_)
     return;
 
-  if (wanted_state == ConfiguredHpsSenseState::kEnabled) {
-    EnableHpsSenseViaDBus();
+  if (wanted_state == ConfiguredLockOnLeaveState::kEnabled) {
+    EnableLockOnLeaveViaDBus();
   } else {
-    DisableHpsSenseViaDBus();
+    DisableLockOnLeaveViaDBus();
   }
   configured_state_ = wanted_state;
 }
diff --git a/ash/system/power/lock_on_leave_controller.h b/ash/system/power/lock_on_leave_controller.h
index 74d8f96b..4eea53a 100644
--- a/ash/system/power/lock_on_leave_controller.h
+++ b/ash/system/power/lock_on_leave_controller.h
@@ -14,72 +14,76 @@
 
 namespace ash {
 
-// Helper class for chromeos::HpsDBusClient, responsible for enabling/disabling
-// the DBus service via the client and is responsible for maintaining state
-// between restarts.
-class ASH_EXPORT HpsSenseController : public HpsOrientationController::Observer,
-                                      chromeos::HpsDBusClient::Observer {
+// Helper class for chromeos::HumanPresenceDBusClient, responsible for
+// enabling/disabling the DBus service via the client and is responsible for
+// maintaining state between restarts.
+class ASH_EXPORT LockOnLeaveController
+    : public HumanPresenceOrientationController::Observer,
+      chromeos::HumanPresenceDBusClient::Observer {
  public:
-  // The state of HpsSense inside HpsDbusService that is configured. It is set
-  // as kUnknown in this class on initialization. And is set to either kEnable
-  // or kDisable when EnableHpsSense() or DisableHpsSense() is called.
-  enum class ConfiguredHpsSenseState {
+  // The state of lock on leave inside DBus service that is configured. It is
+  // set as kUnknown in this class on initialization. And is set to either
+  // kEnable or kDisable when EnableLockOnLeave() or DisableLockOnLeave() is
+  // called.
+  enum class ConfiguredLockOnLeaveState {
     kUnknown,
     kEnabled,
     kDisabled,
   };
 
-  HpsSenseController();
-  HpsSenseController(const HpsSenseController&) = delete;
-  HpsSenseController& operator=(const HpsSenseController&) = delete;
+  LockOnLeaveController();
+  LockOnLeaveController(const LockOnLeaveController&) = delete;
+  LockOnLeaveController& operator=(const LockOnLeaveController&) = delete;
 
-  ~HpsSenseController() override;
+  ~LockOnLeaveController() override;
 
-  // Enables the HpsSense feature inside HpsDBusClient; and it only sends the
-  // method call if HpsSense is not enabled yet.
-  void EnableHpsSense();
-  // Disables the HpsSense feature inside HpsDBusClient if it is currently
-  // enabled.
-  void DisableHpsSense();
+  // Enables the LockOnLeave feature inside HumanPresenceDBusClient; and it only
+  // sends the method call if LockOnLeave is not enabled yet.
+  void EnableLockOnLeave();
+  // Disables the LockOnLeave feature inside HumanPresenceDBusClient if it is
+  // currently enabled.
+  void DisableLockOnLeave();
 
-  // HpsOrientationObserver:
-  void OnOrientationChanged(bool suitable_for_hps) override;
+  // HumanPresenceOrientationObserver:
+  void OnOrientationChanged(bool suitable_for_human_presence) override;
 
-  // chromeos::HpsDBusClient::Observer:
+  // chromeos::HumanPresenceDBusClient::Observer:
   void OnHpsSenseChanged(hps::HpsResult state) override;
   void OnHpsNotifyChanged(hps::HpsResult state) override;
-  // Re-enables HpsSense on HpsBusService restart if it was enabled before.
+  // Re-enables LockOnLeave on human presence service restart if it was enabled
+  // before.
   void OnRestart() override;
   void OnShutdown() override;
 
  private:
-  // Called when the Hps Service is available.
-  void OnHpsServiceAvailable(bool service_available);
+  // Called when the human presence service is available.
+  void OnServiceAvailable(bool service_available);
 
-  // May disable/enable hps_sense based on current state.
+  // May disable/enable lock-on-leave based on current state.
   void ReconfigViaDbus();
 
-  // Indicates whether the hps service is available; it is set inside
-  // OnHpsServiceAvailable and set to false OnShutdown.
+  // Indicates whether the human presence service is available; it is set inside
+  // OnServiceAvailable and set to false OnShutdown.
   bool service_available_ = false;
 
-  // Records requested hps sense enable state from client.
-  bool want_hps_sense_ = false;
+  // Records requested lock-on-leave enable state from client.
+  bool want_lock_on_leave_ = false;
 
   // Whether the device is in physical orientation where our models are
   // accurate.
-  bool suitable_for_hps_ = false;
+  bool suitable_for_human_presence_ = false;
 
-  // Current configured state of HpsSense.
-  ConfiguredHpsSenseState configured_state_ = ConfiguredHpsSenseState::kUnknown;
+  // Current configured state of LockOnLeave.
+  ConfiguredLockOnLeaveState configured_state_ =
+      ConfiguredLockOnLeaveState::kUnknown;
 
-  base::ScopedObservation<chromeos::HpsDBusClient,
-                          chromeos::HpsDBusClient::Observer>
-      hps_observation_{this};
-  base::ScopedObservation<HpsOrientationController,
-                          HpsOrientationController::Observer>
+  base::ScopedObservation<chromeos::HumanPresenceDBusClient,
+                          chromeos::HumanPresenceDBusClient::Observer>
+      human_presence_observation_{this};
+  base::ScopedObservation<HumanPresenceOrientationController,
+                          HumanPresenceOrientationController::Observer>
       orientation_observation_{this};
-  base::WeakPtrFactory<HpsSenseController> weak_ptr_factory_{this};
+  base::WeakPtrFactory<LockOnLeaveController> weak_ptr_factory_{this};
 };
 
 }  // namespace ash
diff --git a/ash/system/power/lock_on_leave_controller_unittest.cc b/ash/system/power/lock_on_leave_controller_unittest.cc
index 33f7fc9a..2d7611b 100644
--- a/ash/system/power/lock_on_leave_controller_unittest.cc
+++ b/ash/system/power/lock_on_leave_controller_unittest.cc
@@ -19,208 +19,213 @@
 
 namespace ash {
 
-class HpsSenseControllerTest : public AshTestBase {
+class LockOnLeaveControllerTest : public AshTestBase {
  public:
   void SetUp() override {
-    // We need to enable kQuickDim to construct HpsOrientationController.
+    // We need to enable kQuickDim to construct
+    // HumanPresenceOrientationController.
     scoped_feature_list_.InitAndEnableFeature(features::kQuickDim);
     base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kHasHps);
 
-    // Initialize FakeHpsDBusClient.
-    chromeos::HpsDBusClient::InitializeFake();
-    hps_client_ = chromeos::FakeHpsDBusClient::Get();
-    hps_client_->Reset();
+    // Initialize FakeHumanPresenceDBusClient.
+    chromeos::HumanPresenceDBusClient::InitializeFake();
+    human_presence_client_ = chromeos::FakeHumanPresenceDBusClient::Get();
+    human_presence_client_->Reset();
 
     AshTestBase::SetUp();
   }
 
  protected:
-  chromeos::FakeHpsDBusClient* hps_client_ = nullptr;
+  chromeos::FakeHumanPresenceDBusClient* human_presence_client_ = nullptr;
 
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
   base::test::ScopedCommandLine scoped_command_line_;
 };
 
-// EnableHpsSense should be skipped if HpsService is not available.
-TEST_F(HpsSenseControllerTest,
-       EnableHpsSenseDoesNothingIfHpsServiceUnavailable) {
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+// EnableLockOnLeave should be skipped if the service is not available.
+TEST_F(LockOnLeaveControllerTest,
+       EnableLockOnLeaveDoesNothingIfServiceUnavailable) {
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 
-  hps_sense_controller->EnableHpsSense();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 }
 
-// DisableHpsSense should be called on HpsServiceAvailable.
-TEST_F(HpsSenseControllerTest, CallDisableHpsSenseOnHpsServiceAvailable) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+// DisableLockOnLeave should be called when the human presence service becomes
+// available.
+TEST_F(LockOnLeaveControllerTest, CallDisableLockOnLeaveOnServiceAvailable) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 }
 
-// EnableHpsSense should succeed if HpsService is available.
-TEST_F(HpsSenseControllerTest, EnableHpsSenseSucceedsIfHpsServiceAvailable) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+// EnableLockOnLeave should succeed if the service is available.
+TEST_F(LockOnLeaveControllerTest, EnableLockOnLeaveSucceedsIfServiceAvailable) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  hps_client_->Reset();
+  human_presence_client_->Reset();
 
-  hps_sense_controller->EnableHpsSense();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
 }
 
-// EnableHpsSense should only be applied once for multiple calls of
-// EnableHpsSense.
-TEST_F(HpsSenseControllerTest, EnableHpsSenseOnlyCalledOnceOnTwoCalls) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+// The DBus EnableHpsSense method should only be called once for multiple calls
+// of EnableLockOnLeave.
+TEST_F(LockOnLeaveControllerTest, EnableHpsSenseOnlyCalledOnceOnTwoCalls) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  hps_client_->Reset();
+  human_presence_client_->Reset();
 
   // Only 1 dbus calls should be sent.
-  hps_sense_controller->EnableHpsSense();
-  hps_sense_controller->EnableHpsSense();
+  lock_on_leave_controller->EnableLockOnLeave();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
 }
 
-TEST_F(HpsSenseControllerTest, DisableHpsSenseDoesNothingIfNotEnabled) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+TEST_F(LockOnLeaveControllerTest, DisableLockOnLeaveDoesNothingIfNotEnabled) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  hps_client_->Reset();
+  human_presence_client_->Reset();
 
-  // Calls DisableHpsSense does nothing if HpsSense is not enabled.
-  hps_sense_controller->DisableHpsSense();
+  // Calls DisableLockOnLeave does nothing if LockOnLeave is not enabled.
+  lock_on_leave_controller->DisableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 }
 
-// DisableHpsSense should succeed if HpsSense is enabled.
-TEST_F(HpsSenseControllerTest, DisableHpsSenseSuceedsIfEnabled) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
-  hps_sense_controller->EnableHpsSense();
-  hps_client_->Reset();
+// DisableLockOnLeave should succeed if LockOnLeave is enabled.
+TEST_F(LockOnLeaveControllerTest, DisableLockOnLeaveSuceedsIfEnabled) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
+  lock_on_leave_controller->EnableLockOnLeave();
+  human_presence_client_->Reset();
 
-  // DisableHpsSense succeeds since HpsSense is enabled.
-  hps_sense_controller->DisableHpsSense();
+  // DisableLockOnLeave succeeds since LockOnLeave is enabled.
+  lock_on_leave_controller->DisableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 }
 
-// DisableHpsSense should only be applied once with two consecutive calls.
-TEST_F(HpsSenseControllerTest, DisableHpsSenseOnlyCalledOnceOnTwoCalls) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
-  hps_sense_controller->EnableHpsSense();
+// The DBus method DisableHpsSense should only be called once with two
+// consecutive calls to DisableLockOnLeave.
+TEST_F(LockOnLeaveControllerTest, DisableHpsSenseOnlyCalledOnceOnTwoCalls) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  hps_client_->Reset();
+  human_presence_client_->Reset();
 
   // Only 1 dbus calls should be sent.
-  hps_sense_controller->DisableHpsSense();
-  hps_sense_controller->DisableHpsSense();
+  lock_on_leave_controller->DisableLockOnLeave();
+  lock_on_leave_controller->DisableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 }
 
-// No dbus call should be sent on restart if HpsSense is currently disabled.
-TEST_F(HpsSenseControllerTest, NoDbusCallsOnRestartIfHpsSenseDisabled) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+// No dbus call should be sent on restart if LockOnLeave is currently disabled.
+TEST_F(LockOnLeaveControllerTest, NoDbusCallsOnRestartIfLockOnLeaveDisabled) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 
-  // HpsSense is disabled; Restart will not send dbus calls.
-  hps_client_->Shutdown();
-  hps_client_->Restart();
+  // LockOnLeave is disabled; Restart will not send dbus calls.
+  human_presence_client_->Shutdown();
+  human_presence_client_->Restart();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 }
 
-// EnableHpsSense should be called on restart if HpsSense is enabled currently.
-TEST_F(HpsSenseControllerTest, EnableHpsSenseOnRestartIfHpsSenseWasEnabled) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+// The DBus method EnableHpsSense should be called on restart if LockOnLeave is
+// enabled currently.
+TEST_F(LockOnLeaveControllerTest,
+       EnableLockOnLeaveOnRestartIfLockOnLeaveWasEnabled) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
   base::RunLoop().RunUntilIdle();
-  hps_sense_controller->EnableHpsSense();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
 
-  // HpsSense is enabled; Restart will call EnableHpsSense.
-  hps_client_->Shutdown();
-  hps_client_->Restart();
+  // LockOnLeave is enabled; Restart will call EnableHpsSense.
+  human_presence_client_->Shutdown();
+  human_presence_client_->Restart();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 2);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 2);
 }
 
-// DisableHpsSense should be called on service available even if we need to
-// enable it immediately after that.
-TEST_F(HpsSenseControllerTest, AlwaysCallDisableOnServiceAvailable) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
-  hps_sense_controller->EnableHpsSense();
+// The DBus method DisableHpsSense should be called on service available even if
+// we need to enable it immediately after that.
+TEST_F(LockOnLeaveControllerTest, AlwaysCallDisableOnServiceAvailable) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
+  lock_on_leave_controller->EnableLockOnLeave();
   // At this point, OnServiceAvailable is not called yet, so no disable/enable
   // functions should be called.
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
   base::RunLoop().RunUntilIdle();
   // Although we only need enabling, the disable function should also be called.
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
 }
 
-// Confirm that enable_hps_sense is only called when both EnableHpsSense and
-// OnOrientationChanged(true) is set.
-TEST_F(HpsSenseControllerTest, OreientationChanging) {
-  hps_client_->set_hps_service_is_available(true);
-  auto hps_sense_controller = std::make_unique<HpsSenseController>();
-  hps_sense_controller->EnableHpsSense();
+// Confirm that the DBus method EnableHpsSense is only called when both
+// EnableLockOnLeave and OnOrientationChanged(true) is set.
+TEST_F(LockOnLeaveControllerTest, OrientationChanging) {
+  human_presence_client_->set_hps_service_is_available(true);
+  auto lock_on_leave_controller = std::make_unique<LockOnLeaveController>();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
-  hps_client_->Reset();
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
+  human_presence_client_->Reset();
 
-  // Orientation changed, HpsSense should be disabled.
-  hps_sense_controller->OnOrientationChanged(false);
+  // Orientation changed, LockOnLeave should be disabled.
+  lock_on_leave_controller->OnOrientationChanged(false);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
-  hps_client_->Reset();
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
+  human_presence_client_->Reset();
 
   // Calling enable/disable will not sent any dbus call while OrientationChanged
   // to be false.
-  hps_sense_controller->DisableHpsSense();
+  lock_on_leave_controller->DisableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  hps_sense_controller->OnOrientationChanged(false);
+  lock_on_leave_controller->OnOrientationChanged(false);
   base::RunLoop().RunUntilIdle();
-  hps_sense_controller->EnableHpsSense();
+  lock_on_leave_controller->EnableLockOnLeave();
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 0);
 
-  // Changing oritiantation will trigger enabling if EnableHpsSense was set.
-  hps_sense_controller->OnOrientationChanged(true);
+  // Changing orientation will trigger enabling if EnableLockOnLeave was set.
+  lock_on_leave_controller->OnOrientationChanged(true);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
-  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+  EXPECT_EQ(human_presence_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(human_presence_client_->enable_hps_sense_count(), 1);
 }
 
 }  // namespace ash
diff --git a/ash/system/power/power_prefs.cc b/ash/system/power/power_prefs.cc
index 649b0545..085196a 100644
--- a/ash/system/power/power_prefs.cc
+++ b/ash/system/power/power_prefs.cc
@@ -153,9 +153,9 @@
   DCHECK(power_policy_controller_);
   DCHECK(tick_clock_);
 
-  // Only construct hps_sense_controller_ if quick dim is enabled.
+  // Only construct lock_on_leave_controller_ if quick dim is enabled.
   if (features::IsQuickDimEnabled())
-    hps_sense_controller_ = std::make_unique<HpsSenseController>();
+    lock_on_leave_controller_ = std::make_unique<LockOnLeaveController>();
 
   power_manager_client_observation_.Observe(power_manager_client);
   Shell::Get()->session_controller()->AddObserver(this);
@@ -335,8 +335,8 @@
         prefs->GetDouble(prefs::kPowerUserActivityScreenDimDelayFactor);
   }
 
-  // Only set power_manager and hps if quick dim is enabled.
-  if (hps_sense_controller_) {
+  // Only set power_manager and lock-on-leave if quick dim is enabled.
+  if (lock_on_leave_controller_) {
     if (prefs->GetBoolean(prefs::kPowerQuickDimEnabled)) {
       values.battery_quick_dim_delay_ms =
           hps::GetQuickDimDelay().InMilliseconds();
@@ -348,9 +348,9 @@
 
       values.send_feedback_if_undimmed = hps::GetQuickDimFeedbackEnabled();
 
-      hps_sense_controller_->EnableHpsSense();
+      lock_on_leave_controller_->EnableLockOnLeave();
     } else {
-      hps_sense_controller_->DisableHpsSense();
+      lock_on_leave_controller_->DisableLockOnLeave();
     }
   }
 
diff --git a/ash/system/power/power_prefs.h b/ash/system/power/power_prefs.h
index 483c9f1..5ca534b 100644
--- a/ash/system/power/power_prefs.h
+++ b/ash/system/power/power_prefs.h
@@ -28,7 +28,7 @@
 
 namespace ash {
 
-class HpsSenseController;
+class LockOnLeaveController;
 class PowerPrefsTest;
 
 // Sends an updated power policy to the |power_policy_controller| whenever one
@@ -87,7 +87,7 @@
 
   std::unique_ptr<PrefChangeRegistrar> profile_registrar_;
   std::unique_ptr<PrefChangeRegistrar> local_state_registrar_;
-  std::unique_ptr<HpsSenseController> hps_sense_controller_;
+  std::unique_ptr<LockOnLeaveController> lock_on_leave_controller_;
 
   const base::TickClock* tick_clock_;  // Not owned.
 
diff --git a/ash/system/power/power_prefs_unittest.cc b/ash/system/power/power_prefs_unittest.cc
index 255b609c..799fb88 100644
--- a/ash/system/power/power_prefs_unittest.cc
+++ b/ash/system/power/power_prefs_unittest.cc
@@ -220,9 +220,10 @@
     feature_list_.InitWithFeatures(
         {features::kQuickDim, features::kAdaptiveCharging}, {});
     base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kHasHps);
-    chromeos::HpsDBusClient::InitializeFake();
-    chromeos::FakeHpsDBusClient::Get()->Reset();
-    chromeos::FakeHpsDBusClient::Get()->set_hps_service_is_available(true);
+    chromeos::HumanPresenceDBusClient::InitializeFake();
+    chromeos::FakeHumanPresenceDBusClient::Get()->Reset();
+    chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_service_is_available(
+        true);
     NoSessionAshTestBase::SetUp();
 
     power_policy_controller_ = chromeos::PowerPolicyController::Get();
@@ -577,8 +578,12 @@
 TEST_F(PowerPrefsTest, SetQuickDimParams) {
   // Check that DisableHpsSense is called on initialization.
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(chromeos::FakeHpsDBusClient::Get()->disable_hps_sense_count(), 1);
-  EXPECT_EQ(chromeos::FakeHpsDBusClient::Get()->enable_hps_sense_count(), 0);
+  EXPECT_EQ(
+      chromeos::FakeHumanPresenceDBusClient::Get()->disable_hps_sense_count(),
+      1);
+  EXPECT_EQ(
+      chromeos::FakeHumanPresenceDBusClient::Get()->enable_hps_sense_count(),
+      0);
 
   // This will trigger UpdatePowerPolicyFromPrefs and set correct parameters.
   SetQuickDimPreference(true);
@@ -599,12 +604,16 @@
 
   // EnableHpsSense should be called when kPowerQuickDimEnabled becomes true.
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(chromeos::FakeHpsDBusClient::Get()->enable_hps_sense_count(), 1);
+  EXPECT_EQ(
+      chromeos::FakeHumanPresenceDBusClient::Get()->enable_hps_sense_count(),
+      1);
 
   // DisableHpsSense should be called when kPowerQuickDimEnabled becomes false.
   SetQuickDimPreference(false);
   base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(chromeos::FakeHpsDBusClient::Get()->disable_hps_sense_count(), 2);
+  EXPECT_EQ(
+      chromeos::FakeHumanPresenceDBusClient::Get()->disable_hps_sense_count(),
+      2);
 }
 
 TEST_F(PowerPrefsTest, QuickDimMetrics) {
diff --git a/ash/system/unified/snooping_protection_controller.cc b/ash/system/unified/snooping_protection_controller.cc
index 54a8894b..d1dcf9b 100644
--- a/ash/system/unified/snooping_protection_controller.cc
+++ b/ash/system/unified/snooping_protection_controller.cc
@@ -30,10 +30,11 @@
 
 namespace ash {
 
-HpsNotifyController::HpsNotifyController()
-    : notification_blocker_(std::make_unique<HpsNotifyNotificationBlocker>(
-          message_center::MessageCenter::Get(),
-          this)),
+SnoopingProtectionController::SnoopingProtectionController()
+    : notification_blocker_(
+          std::make_unique<SnoopingProtectionNotificationBlocker>(
+              message_center::MessageCenter::Get(),
+              this)),
       pos_window_(hps::GetSnoopingProtectionPositiveWindow()) {
   // When the controller is initialized, we are never in an active user session
   // and we never have any user preferences active. Hence, our default state
@@ -48,36 +49,38 @@
   // Wait for the service to be available before subscribing to its events. If
   // we directly subscribe here, we will attempt to configure the DBus service
   // twice (once via this callback and once via |OnRestart|) if it's slow to
-  // start. Configuring HPS notify without first disabling it is an error.
+  // start. Configuring snooping protection without first disabling it is an
+  // error.
   //
   // Might not exist in unit tests.
-  if (chromeos::HpsDBusClient::Get()) {
-    chromeos::HpsDBusClient::Get()->WaitForServiceToBeAvailable(
-        base::BindOnce(&HpsNotifyController::StartHpsObservation,
+  if (chromeos::HumanPresenceDBusClient::Get()) {
+    chromeos::HumanPresenceDBusClient::Get()->WaitForServiceToBeAvailable(
+        base::BindOnce(&SnoopingProtectionController::StartServiceObservation,
                        weak_ptr_factory_.GetWeakPtr()));
   }
 
   // Orientation controller is instantiated before us in the shell.
-  HpsOrientationController* orientation_controller =
-      Shell::Get()->hps_orientation_controller();
+  HumanPresenceOrientationController* orientation_controller =
+      Shell::Get()->human_presence_orientation_controller();
   state_.orientation_suitable = orientation_controller->IsOrientationSuitable();
   orientation_observation_.Observe(orientation_controller);
 }
 
-HpsNotifyController::~HpsNotifyController() {
+SnoopingProtectionController::~SnoopingProtectionController() {
   // This is a no-op if the service isn't available or isn't enabled.
   // TODO(crbug.com/1241704): only disable if the service is enabled.
   //
   // Might not exist in unit tests.
-  if (chromeos::HpsDBusClient::Get())
-    chromeos::HpsDBusClient::Get()->DisableHpsNotify();
+  if (chromeos::HumanPresenceDBusClient::Get())
+    chromeos::HumanPresenceDBusClient::Get()->DisableHpsNotify();
 
   for (auto& observer : observers_)
-    observer.OnHpsNotifyControllerDestroyed();
+    observer.OnSnoopingProtectionControllerDestroyed();
 }
 
 // static
-void HpsNotifyController::RegisterProfilePrefs(PrefRegistrySimple* registry) {
+void SnoopingProtectionController::RegisterProfilePrefs(
+    PrefRegistrySimple* registry) {
   registry->RegisterBooleanPref(
       prefs::kSnoopingProtectionEnabled,
       /*default_value=*/false,
@@ -88,7 +91,7 @@
       user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PREF);
 }
 
-void HpsNotifyController::OnSessionStateChanged(
+void SnoopingProtectionController::OnSessionStateChanged(
     session_manager::SessionState session_state) {
   const bool session_active =
       session_state == session_manager::SessionState::ACTIVE;
@@ -96,11 +99,11 @@
   State new_state = state_;
   new_state.session_active = session_active;
 
-  ReconfigureHps(&new_state);
+  ReconfigureService(&new_state);
   UpdateSnooperStatus(new_state);
 }
 
-void HpsNotifyController::OnActiveUserPrefServiceChanged(
+void SnoopingProtectionController::OnActiveUserPrefServiceChanged(
     PrefService* pref_service) {
   DCHECK(pref_service);
   const bool pref_enabled =
@@ -109,7 +112,7 @@
   State new_state = state_;
   new_state.pref_enabled = pref_enabled;
 
-  ReconfigureHps(&new_state);
+  ReconfigureService(&new_state);
   UpdateSnooperStatus(new_state);
 
   // Re-subscribe to pref changes.
@@ -117,25 +120,27 @@
   pref_change_registrar_->Init(pref_service);
   pref_change_registrar_->Add(
       prefs::kSnoopingProtectionEnabled,
-      base::BindRepeating(&HpsNotifyController::UpdatePrefState,
+      base::BindRepeating(&SnoopingProtectionController::UpdatePrefState,
                           weak_ptr_factory_.GetWeakPtr()));
 }
 
-void HpsNotifyController::OnOrientationChanged(bool suitable_for_hps) {
+void SnoopingProtectionController::OnOrientationChanged(
+    bool suitable_for_human_presence) {
   State new_state = state_;
-  new_state.orientation_suitable = suitable_for_hps;
+  new_state.orientation_suitable = suitable_for_human_presence;
 
-  ReconfigureHps(&new_state);
+  ReconfigureService(&new_state);
   UpdateSnooperStatus(new_state);
 }
 
-void HpsNotifyController::OnHpsSenseChanged(hps::HpsResult) {}
+void SnoopingProtectionController::OnHpsSenseChanged(hps::HpsResult) {}
 
-void HpsNotifyController::OnHpsNotifyChanged(hps::HpsResult hps_state) {
-  const bool present = hps_state == hps::HpsResult::POSITIVE;
+void SnoopingProtectionController::OnHpsNotifyChanged(
+    hps::HpsResult detection_state) {
+  const bool present = detection_state == hps::HpsResult::POSITIVE;
 
   State new_state = state_;
-  new_state.hps_state = present;
+  new_state.present = present;
 
   // Prevent snooping status from becoming negative within a window of time.
   if (present) {
@@ -143,56 +148,56 @@
 
     // Cancels previous task if it is already scheduled.
     pos_window_timer_.Start(FROM_HERE, pos_window_, this,
-                            &HpsNotifyController::OnMinWindowExpired);
+                            &SnoopingProtectionController::OnMinWindowExpired);
   }
 
   UpdateSnooperStatus(new_state);
 }
 
-void HpsNotifyController::OnRestart() {
-  DCHECK(!state_.hps_state);
+void SnoopingProtectionController::OnRestart() {
+  DCHECK(!state_.present);
 
   State new_state = state_;
-  new_state.hps_available = true;
+  new_state.service_available = true;
 
-  ReconfigureHps(&new_state);
+  ReconfigureService(&new_state);
   UpdateSnooperStatus(new_state);
 }
 
-void HpsNotifyController::OnShutdown() {
+void SnoopingProtectionController::OnShutdown() {
   State new_state = state_;
-  new_state.hps_available = false;
+  new_state.service_available = false;
 
-  ReconfigureHps(&new_state);
+  ReconfigureService(&new_state);
   UpdateSnooperStatus(new_state);
 
   // We will be notified of the service starting back up again via our ongoing
   // observation of the DBus client.
 }
 
-void HpsNotifyController::AddObserver(Observer* observer) {
+void SnoopingProtectionController::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
 
-void HpsNotifyController::RemoveObserver(Observer* observer) {
+void SnoopingProtectionController::RemoveObserver(Observer* observer) {
   observers_.RemoveObserver(observer);
 }
 
-bool HpsNotifyController::SnooperPresent() const {
+bool SnoopingProtectionController::SnooperPresent() const {
   return state_.within_pos_window ||
-         (state_.session_active && state_.hps_state && state_.pref_enabled &&
+         (state_.session_active && state_.present && state_.pref_enabled &&
           state_.orientation_suitable);
 }
 
-void HpsNotifyController::UpdateSnooperStatus(const State& new_state) {
+void SnoopingProtectionController::UpdateSnooperStatus(const State& new_state) {
   // Clean up new state to be consistent.
   const bool detection_active =
       new_state.session_active && new_state.pref_enabled &&
-      new_state.hps_available && new_state.hps_configured &&
+      new_state.service_available && new_state.service_configured &&
       new_state.orientation_suitable;
 
   State clean_state = new_state;
-  clean_state.hps_state = new_state.hps_state && detection_active;
+  clean_state.present = new_state.present && detection_active;
   clean_state.within_pos_window =
       new_state.within_pos_window && detection_active;
 
@@ -207,10 +212,10 @@
     observer.OnSnoopingStatusChanged(is_present);
 }
 
-void HpsNotifyController::ReconfigureHps(State* new_state) {
+void SnoopingProtectionController::ReconfigureService(State* new_state) {
   // Can't configure or de-configure the service if it's unavailable.
-  if (!new_state->hps_available) {
-    new_state->hps_configured = false;
+  if (!new_state->service_available) {
+    new_state->service_configured = false;
     return;
   }
 
@@ -219,8 +224,8 @@
   const bool want_configured = new_state->pref_enabled &&
                                new_state->session_active &&
                                new_state->orientation_suitable;
-  if (state_.hps_configured == want_configured) {
-    new_state->hps_configured = want_configured;
+  if (state_.service_configured == want_configured) {
+    new_state->service_configured = want_configured;
     return;
   }
 
@@ -228,30 +233,32 @@
     // Configure the snooping started/stopped signals that the service will
     // emit.
     const absl::optional<hps::FeatureConfig> config =
-        hps::GetEnableHpsNotifyConfig();
+        hps::GetEnableSnoopingProtectionConfig();
     if (!config.has_value()) {
       LOG(ERROR) << "Couldn't parse notify configuration";
       return;
     }
 
-    chromeos::HpsDBusClient::Get()->EnableHpsNotify(*config);
+    chromeos::HumanPresenceDBusClient::Get()->EnableHpsNotify(*config);
 
     // Populate our initial HPS state for consistency with the service.
-    chromeos::HpsDBusClient::Get()->GetResultHpsNotify(base::BindOnce(
-        &HpsNotifyController::UpdateHpsState, weak_ptr_factory_.GetWeakPtr()));
-    new_state->hps_configured = true;
+    chromeos::HumanPresenceDBusClient::Get()->GetResultHpsNotify(
+        base::BindOnce(&SnoopingProtectionController::UpdateServiceState,
+                       weak_ptr_factory_.GetWeakPtr()));
+    new_state->service_configured = true;
 
     return;
   }
 
   // No longer need signals to be emitted.
-  chromeos::HpsDBusClient::Get()->DisableHpsNotify();
-  new_state->hps_configured = false;
+  chromeos::HumanPresenceDBusClient::Get()->DisableHpsNotify();
+  new_state->service_configured = false;
 }
 
-void HpsNotifyController::StartHpsObservation(bool service_is_available) {
-  state_.hps_available = service_is_available;
-  state_.hps_configured = false;
+void SnoopingProtectionController::StartServiceObservation(
+    bool service_is_available) {
+  state_.service_available = service_is_available;
+  state_.service_configured = false;
 
   if (!service_is_available) {
     LOG(ERROR) << "Could not make initial connection to HPS service";
@@ -261,17 +268,18 @@
   // Special case: at this point, the service could have been left in an enabled
   // state by a previous session that crashed (and hence didn't clean up
   // properly). Disable it here, which is a no-op if it is already disabled.
-  chromeos::HpsDBusClient::Get()->DisableHpsNotify();
+  chromeos::HumanPresenceDBusClient::Get()->DisableHpsNotify();
 
   // Start listening for state updates and restarts/shutdowns.
-  hps_dbus_observation_.Observe(chromeos::HpsDBusClient::Get());
+  human_presence_dbus_observation_.Observe(
+      chromeos::HumanPresenceDBusClient::Get());
 
   // Configure the service and poll its initial value if necessary.
-  ReconfigureHps(&state_);
+  ReconfigureService(&state_);
   UpdateSnooperStatus(state_);
 }
 
-void HpsNotifyController::UpdateHpsState(
+void SnoopingProtectionController::UpdateServiceState(
     absl::optional<hps::HpsResult> response) {
   LOG_IF(WARNING, !response.has_value())
       << "Polling the presence daemon failed";
@@ -280,7 +288,7 @@
       response.value_or(hps::HpsResult::NEGATIVE) == hps::HpsResult::POSITIVE;
 
   State new_state = state_;
-  new_state.hps_state = present;
+  new_state.present = present;
 
   // Prevent snooping status from becoming negative within a window of time.
   if (present) {
@@ -288,13 +296,13 @@
 
     // Cancels previous task if it is already scheduled.
     pos_window_timer_.Start(FROM_HERE, pos_window_, this,
-                            &HpsNotifyController::OnMinWindowExpired);
+                            &SnoopingProtectionController::OnMinWindowExpired);
   }
 
   UpdateSnooperStatus(new_state);
 }
 
-void HpsNotifyController::UpdatePrefState() {
+void SnoopingProtectionController::UpdatePrefState() {
   DCHECK(pref_change_registrar_);
   DCHECK(pref_change_registrar_->prefs());
   const bool pref_enabled = pref_change_registrar_->prefs()->GetBoolean(
@@ -303,13 +311,13 @@
   State new_state = state_;
   new_state.pref_enabled = pref_enabled;
 
-  ReconfigureHps(&new_state);
+  ReconfigureService(&new_state);
   UpdateSnooperStatus(new_state);
   base::UmaHistogramBoolean("ChromeOS.HPS.SnoopingProtection.Enabled",
                             pref_enabled);
 }
 
-void HpsNotifyController::OnMinWindowExpired() {
+void SnoopingProtectionController::OnMinWindowExpired() {
   State new_state = state_;
   new_state.within_pos_window = false;
   UpdateSnooperStatus(new_state);
diff --git a/ash/system/unified/snooping_protection_controller.h b/ash/system/unified/snooping_protection_controller.h
index 1827a139..45fe9381 100644
--- a/ash/system/unified/snooping_protection_controller.h
+++ b/ash/system/unified/snooping_protection_controller.h
@@ -26,14 +26,14 @@
 
 namespace ash {
 
-class HpsNotifyNotificationBlocker;
+class SnoopingProtectionNotificationBlocker;
 
 // Pushes status changes to the snooping protection icon and notification
 // blocker based on DBus state, preferences and session type.
-class ASH_EXPORT HpsNotifyController
+class ASH_EXPORT SnoopingProtectionController
     : public SessionObserver,
-      public HpsOrientationController::Observer,
-      public chromeos::HpsDBusClient::Observer {
+      public HumanPresenceOrientationController::Observer,
+      public chromeos::HumanPresenceDBusClient::Observer {
  public:
   class Observer : public base::CheckedObserver {
    public:
@@ -44,13 +44,14 @@
     virtual void OnSnoopingStatusChanged(bool snooper) = 0;
 
     // Used to coordinate observers that might outlive the controller.
-    virtual void OnHpsNotifyControllerDestroyed() = 0;
+    virtual void OnSnoopingProtectionControllerDestroyed() = 0;
   };
 
-  HpsNotifyController();
-  HpsNotifyController(const HpsNotifyController&) = delete;
-  HpsNotifyController& operator=(const HpsNotifyController&) = delete;
-  ~HpsNotifyController() override;
+  SnoopingProtectionController();
+  SnoopingProtectionController(const SnoopingProtectionController&) = delete;
+  SnoopingProtectionController& operator=(const SnoopingProtectionController&) =
+      delete;
+  ~SnoopingProtectionController() override;
 
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
@@ -58,10 +59,10 @@
   void OnSessionStateChanged(session_manager::SessionState state) override;
   void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
 
-  // HpsOrientationObserver:
-  void OnOrientationChanged(bool suitable_for_hps) override;
+  // HumanPresenceOrientationObserver:
+  void OnOrientationChanged(bool suitable_for_human_presence) override;
 
-  // chromeos::HpsDBusClient::Observer:
+  // chromeos::HumanPresenceDBusClient::Observer:
   void OnHpsSenseChanged(hps::HpsResult state) override;
   void OnHpsNotifyChanged(hps::HpsResult state) override;
   void OnRestart() override;
@@ -77,37 +78,44 @@
  private:
   // Used to track whether a signal should actually trigger a visibility change.
   struct State {
-    bool hps_state = false;       // The state last reported by the daemon.
-    bool session_active = false;  // Whether there is an active user
-                                  // session ongoing.
-    bool pref_enabled = false;    // Whether the user has enabled the
-                                  // feature via preferences.
-    bool hps_available = false;   // Whether the daemon is available for
-                                  // communication.
-    bool hps_configured = false;  // Whether the daemon has been
-                                  // successfully configured.
-    bool orientation_suitable = false;  // Whether the device is in physical
-                                        // orientation where our models are
-                                        // accurate.
-    bool within_pos_window = false;     // Whether we are within the minimum
-                                        // time window for which to report a
-                                        // positive result.
+    // Whether a snooper is present, as last reported by the service.
+    bool present = false;
+
+    // Whether there is an active user session ongoing.
+    bool session_active = false;
+
+    // Whether the user has enabled the feature via preferences.
+    bool pref_enabled = false;
+
+    // Whether the daemon is available for communication.
+    bool service_available = false;
+
+    // Whether the daemon has been successfully configured.
+    bool service_configured = false;
+
+    // Whether the device is in physical orientation where our models are
+    // accurate.
+    bool orientation_suitable = false;
+
+    // Whether we are within the minimum time window for which to report a
+    // positive result.
+    bool within_pos_window = false;
   };
 
   // Updates snooper state as appropriate given the signal, session,
   // preference and device orientation state. If changed, notifies observers.
   void UpdateSnooperStatus(const State& new_state);
 
-  // Requests the start or stop of the HPS snooping signal, so that the daemon
-  // need not be running snooping logic while the user has the feature disabled.
-  // Also updates the new state of HPS availability.
-  void ReconfigureHps(State* new_state);
+  // Requests the start or stop of the snooping signal, so that the daemon need
+  // not be running snooping logic while the user has the feature disabled.
+  // Also updates the new state of service availability.
+  void ReconfigureService(State* new_state);
 
   // Configures the daemon, polls its initial state and opts into its signals.
-  void StartHpsObservation(bool service_is_available);
+  void StartServiceObservation(bool service_is_available);
 
   // Performs the state update from the daemon response.
-  void UpdateHpsState(absl::optional<hps::HpsResult> result);
+  void UpdateServiceState(absl::optional<hps::HpsResult> result);
 
   // A callback to update visibility when the user enables or disables the
   // feature.
@@ -125,12 +133,12 @@
 
   base::ScopedObservation<SessionController, SessionObserver>
       session_observation_{this};
-  base::ScopedObservation<HpsOrientationController,
-                          HpsOrientationController::Observer>
+  base::ScopedObservation<HumanPresenceOrientationController,
+                          HumanPresenceOrientationController::Observer>
       orientation_observation_{this};
-  base::ScopedObservation<chromeos::HpsDBusClient,
-                          chromeos::HpsDBusClient::Observer>
-      hps_dbus_observation_{this};
+  base::ScopedObservation<chromeos::HumanPresenceDBusClient,
+                          chromeos::HumanPresenceDBusClient::Observer>
+      human_presence_dbus_observation_{this};
 
   // Used to notify ourselves of changes to the pref that enables / disables
   // this feature.
@@ -140,14 +148,15 @@
   base::ObserverList<Observer> observers_;
 
   // Controls popup hiding and our info notification.
-  const std::unique_ptr<HpsNotifyNotificationBlocker> notification_blocker_;
+  const std::unique_ptr<SnoopingProtectionNotificationBlocker>
+      notification_blocker_;
 
   // The minimum amount of time between emitting an initial positive signal and
   // then a subsequent negative one.
   const base::TimeDelta pos_window_;
 
   // Must be last.
-  base::WeakPtrFactory<HpsNotifyController> weak_ptr_factory_{this};
+  base::WeakPtrFactory<SnoopingProtectionController> weak_ptr_factory_{this};
 };
 
 }  // namespace ash
diff --git a/ash/system/unified/snooping_protection_controller_unittest.cc b/ash/system/unified/snooping_protection_controller_unittest.cc
index fbb7f1bd..56bdf4e 100644
--- a/ash/system/unified/snooping_protection_controller_unittest.cc
+++ b/ash/system/unified/snooping_protection_controller_unittest.cc
@@ -34,14 +34,15 @@
 
 // A fixture that provides access to a fake daemon and an instance of the
 // controller hooked up to the test environment.
-class HpsNotifyControllerTestBase : public NoSessionAshTestBase {
+class SnoopingProtectionControllerTestBase : public NoSessionAshTestBase {
  public:
   // Arguments control the state of the feature and service on controller
   // construction. We can't set this value in individual tests since it must be
   // done before AshTestBase::SetUp() executes.
-  HpsNotifyControllerTestBase(bool service_available,
-                              bool service_state,
-                              const std::map<std::string, std::string>& params)
+  SnoopingProtectionControllerTestBase(
+      bool service_available,
+      bool service_state,
+      const std::map<std::string, std::string>& params)
       : NoSessionAshTestBase(
             base::test::TaskEnvironment::TimeSource::MOCK_TIME),
         service_available_(service_available),
@@ -53,21 +54,22 @@
         switches::kHasHps);
   }
 
-  HpsNotifyControllerTestBase(const HpsNotifyControllerTestBase&) = delete;
-  HpsNotifyControllerTestBase& operator=(const HpsNotifyControllerTestBase&) =
-      delete;
-  ~HpsNotifyControllerTestBase() override = default;
+  SnoopingProtectionControllerTestBase(
+      const SnoopingProtectionControllerTestBase&) = delete;
+  SnoopingProtectionControllerTestBase& operator=(
+      const SnoopingProtectionControllerTestBase&) = delete;
+  ~SnoopingProtectionControllerTestBase() override = default;
 
   void SetUp() override {
-    chromeos::HpsDBusClient::InitializeFake();
-    dbus_client_ = chromeos::FakeHpsDBusClient::Get();
+    chromeos::HumanPresenceDBusClient::InitializeFake();
+    dbus_client_ = chromeos::FakeHumanPresenceDBusClient::Get();
     dbus_client_->set_hps_service_is_available(service_available_);
     dbus_client_->set_hps_notify_result(
         service_state_ ? hps::HpsResult::POSITIVE : hps::HpsResult::NEGATIVE);
 
     AshTestBase::SetUp();
 
-    controller_ = Shell::Get()->hps_notify_controller();
+    controller_ = Shell::Get()->snooping_protection_controller();
 
     // The controller has now been initialized, part of which entails sending a
     // method to the DBus service. Here we wait for the service to
@@ -77,7 +79,7 @@
 
   void TearDown() override {
     AshTestBase::TearDown();
-    chromeos::HpsDBusClient::Shutdown();
+    chromeos::HumanPresenceDBusClient::Shutdown();
   }
 
  protected:
@@ -88,8 +90,8 @@
   const bool service_state_;
   const std::map<std::string, std::string> params_;
 
-  chromeos::FakeHpsDBusClient* dbus_client_ = nullptr;
-  HpsNotifyController* controller_ = nullptr;
+  chromeos::FakeHumanPresenceDBusClient* dbus_client_ = nullptr;
+  SnoopingProtectionController* controller_ = nullptr;
 
   // Simulates a login. This will trigger a DBus call if and only if logging in
   // was the final precondition required for the feature. Hence we wait for any
@@ -113,17 +115,18 @@
 
 // A test fixture where no snooper is initially detected (using a minimal set of
 // valid params).
-class HpsNotifyControllerTestAbsent : public HpsNotifyControllerTestBase {
+class SnoopingProtectionControllerTestAbsent
+    : public SnoopingProtectionControllerTestBase {
  public:
-  HpsNotifyControllerTestAbsent()
-      : HpsNotifyControllerTestBase(
+  SnoopingProtectionControllerTestAbsent()
+      : SnoopingProtectionControllerTestBase(
             /*service_available=*/true,
             /*service_state=*/false,
             /*params=*/{{"SnoopingProtection_filter_config_case", "1"}}) {}
 };
 
 // Test that icon is hidden by default.
-TEST_F(HpsNotifyControllerTestAbsent, Hidden) {
+TEST_F(SnoopingProtectionControllerTestAbsent, Hidden) {
   SimulateLogin();
   SetEnabledPref(false);
 
@@ -133,7 +136,7 @@
 }
 
 // Test that messages from the daemon toggle the icon.
-TEST_F(HpsNotifyControllerTestAbsent, HpsStateChange) {
+TEST_F(SnoopingProtectionControllerTestAbsent, PresenceChange) {
   SimulateLogin();
   SetEnabledPref(true);
 
@@ -154,7 +157,7 @@
 
 // Test that daemon signals are only enabled when session and pref state means
 // they will be used.
-TEST_F(HpsNotifyControllerTestAbsent, ReconfigureOnPrefs) {
+TEST_F(SnoopingProtectionControllerTestAbsent, ReconfigureOnPrefs) {
   // When the service becomes available for the first time, one disable is
   // performed in case the last session ended in a crash without de-configuring
   // the daemon.
@@ -189,7 +192,7 @@
 
 // Test that daemon signals are correctly enabled/disabled when the daemon
 // starts and stops.
-TEST_F(HpsNotifyControllerTestAbsent, ReconfigureOnRestarts) {
+TEST_F(SnoopingProtectionControllerTestAbsent, ReconfigureOnRestarts) {
   SimulateLogin();
   SetEnabledPref(true);
 
@@ -215,7 +218,7 @@
 
 // Test that the service is only re-configured when the user is _both_ logged-in
 // and has enabled the preference.
-TEST_F(HpsNotifyControllerTestAbsent, ReconfigureOnlyIfNecessary) {
+TEST_F(SnoopingProtectionControllerTestAbsent, ReconfigureOnlyIfNecessary) {
   // Only the clean-up de-configure should have been sent.
   EXPECT_EQ(dbus_client_->enable_hps_notify_count(), 0);
   EXPECT_EQ(dbus_client_->disable_hps_notify_count(), 1);
@@ -237,17 +240,18 @@
 
 // A test fixture where a snooper is initially detected (using a minimal set of
 // valid params).
-class HpsNotifyControllerTestPresent : public HpsNotifyControllerTestBase {
+class SnoopingProtectionControllerTestPresent
+    : public SnoopingProtectionControllerTestBase {
  public:
-  HpsNotifyControllerTestPresent()
-      : HpsNotifyControllerTestBase(
+  SnoopingProtectionControllerTestPresent()
+      : SnoopingProtectionControllerTestBase(
             /*service_available=*/true,
             /*service_state=*/true,
             /*params=*/{{"SnoopingProtection_filter_config_case", "1"}}) {}
 };
 
 // Test that initial daemon state is considered.
-TEST_F(HpsNotifyControllerTestPresent, HpsState) {
+TEST_F(SnoopingProtectionControllerTestPresent, PresenceState) {
   SimulateLogin();
   SetEnabledPref(true);
   EXPECT_EQ(dbus_client_->hps_notify_count(), 1);
@@ -256,7 +260,7 @@
 }
 
 // Test that a user changing their preference toggles the icon.
-TEST_F(HpsNotifyControllerTestPresent, PrefChanged) {
+TEST_F(SnoopingProtectionControllerTestPresent, PrefChanged) {
   SimulateLogin();
   SetEnabledPref(false);
   EXPECT_EQ(dbus_client_->hps_notify_count(), 0);
@@ -270,7 +274,7 @@
 }
 
 // Test that eye icon isn't shown during the OOBE.
-TEST_F(HpsNotifyControllerTestPresent, Oobe) {
+TEST_F(SnoopingProtectionControllerTestPresent, Oobe) {
   TestSessionControllerClient* session = GetSessionControllerClient();
 
   // Simulate end of OOBE when user is logged in.
@@ -295,7 +299,7 @@
 }
 
 // Test that the eye icon isn't shown at the login page.
-TEST_F(HpsNotifyControllerTestPresent, Login) {
+TEST_F(SnoopingProtectionControllerTestPresent, Login) {
   // Note: login deferred.
 
   // Shouldn't configure, as the session isn't active.
@@ -314,7 +318,7 @@
 }
 
 // Test that the controller handles service restarts.
-TEST_F(HpsNotifyControllerTestPresent, Restarts) {
+TEST_F(SnoopingProtectionControllerTestPresent, Restarts) {
   SimulateLogin();
   SetEnabledPref(true);
 
@@ -340,7 +344,7 @@
 
 // Check that the controller state stays consistent even when the daemon starts
 // and stops.
-TEST_F(HpsNotifyControllerTestPresent, ClearHpsState) {
+TEST_F(SnoopingProtectionControllerTestPresent, ClearPresenceState) {
   SimulateLogin();
   SetEnabledPref(true);
   EXPECT_EQ(controller_->SnooperPresent(), true);
@@ -358,7 +362,7 @@
 
 // Test that detection is started and stopped based on whether the device's
 // physical orientation is suitable for sensing.
-TEST_F(HpsNotifyControllerTestPresent, Orientation) {
+TEST_F(SnoopingProtectionControllerTestPresent, Orientation) {
   SimulateLogin();
   SetEnabledPref(true);
   EXPECT_EQ(dbus_client_->enable_hps_notify_count(), 1);
@@ -367,7 +371,7 @@
   EXPECT_TRUE(controller_->SnooperPresent());
 
   // When the orientation becomes unsuitable, we should disable the daemon.
-  controller_->OnOrientationChanged(/*suitable_for_hps=*/false);
+  controller_->OnOrientationChanged(/*suitable_for_human_presence=*/false);
   task_environment()->FastForwardBy(kLongTime);
   EXPECT_EQ(dbus_client_->enable_hps_notify_count(), 1);
   EXPECT_EQ(dbus_client_->disable_hps_notify_count(), 2);
@@ -376,7 +380,7 @@
 
   // When the orientation becomes suitable again, we should re-enable the
   // daemon.
-  controller_->OnOrientationChanged(/*suitable_for_hps=*/true);
+  controller_->OnOrientationChanged(/*suitable_for_human_presence=*/true);
   task_environment()->FastForwardBy(kLongTime);
   EXPECT_EQ(dbus_client_->enable_hps_notify_count(), 2);
   EXPECT_EQ(dbus_client_->disable_hps_notify_count(), 2);
@@ -385,7 +389,7 @@
 }
 
 // Test that the minimum positive window is respected.
-TEST_F(HpsNotifyControllerTestPresent, PositiveWindow) {
+TEST_F(SnoopingProtectionControllerTestPresent, PositiveWindow) {
   SimulateLogin();
   SetEnabledPref(true);
   EXPECT_EQ(dbus_client_->hps_notify_count(), 1);
@@ -408,7 +412,7 @@
   task_environment()->FastForwardBy(kLongTime);
   EXPECT_TRUE(controller_->SnooperPresent());
 
-  // Snooping status should immediately become false if there is an HPS
+  // Snooping status should immediately become false if there is a service
   // reconfiguration (v.s. state change).
   controller_->OnShutdown();
   task_environment()->FastForwardBy(kShortTime);
@@ -417,10 +421,11 @@
 
 // Fixture with the DBus service initially unavailable (using a minimal set of
 // valid params).
-class HpsNotifyControllerTestUnavailable : public HpsNotifyControllerTestBase {
+class SnoopingProtectionControllerTestUnavailable
+    : public SnoopingProtectionControllerTestBase {
  public:
-  HpsNotifyControllerTestUnavailable()
-      : HpsNotifyControllerTestBase(
+  SnoopingProtectionControllerTestUnavailable()
+      : SnoopingProtectionControllerTestBase(
             /*service_available=*/false,
             /*service_state=*/true,
             /*params=*/{{"SnoopingProtection_filter_config_case", "1"}}) {}
@@ -428,7 +433,7 @@
 
 // Test that the controller waits for the DBus service to be available and
 // doesn't communicate until it is.
-TEST_F(HpsNotifyControllerTestUnavailable, WaitForService) {
+TEST_F(SnoopingProtectionControllerTestUnavailable, WaitForService) {
   SimulateLogin();
   SetEnabledPref(true);
 
@@ -455,17 +460,18 @@
 }
 
 // Fixture with an invalid feature config.
-class HpsNotifyControllerTestBadParams : public HpsNotifyControllerTestBase {
+class SnoopingProtectionControllerTestBadParams
+    : public SnoopingProtectionControllerTestBase {
  public:
-  HpsNotifyControllerTestBadParams()
-      : HpsNotifyControllerTestBase(
+  SnoopingProtectionControllerTestBadParams()
+      : SnoopingProtectionControllerTestBase(
             /*service_available=*/true,
             /*service_state=*/true,
             /*params=*/{{"SnoopingProtection_filter_config_case", "0"}}) {}
 };
 
 // Test that the controller gracefully handles invalid feature parameters.
-TEST_F(HpsNotifyControllerTestBadParams, BadParams) {
+TEST_F(SnoopingProtectionControllerTestBadParams, BadParams) {
   SimulateLogin();
   SetEnabledPref(true);
 
diff --git a/ash/system/unified/snooping_protection_view.cc b/ash/system/unified/snooping_protection_view.cc
index 12ed782..d3d2156 100644
--- a/ash/system/unified/snooping_protection_view.cc
+++ b/ash/system/unified/snooping_protection_view.cc
@@ -23,14 +23,16 @@
 
 namespace ash {
 
-HpsNotifyView::HpsNotifyView(Shelf* shelf) : TrayItemView(shelf) {
+SnoopingProtectionView::SnoopingProtectionView(Shelf* shelf)
+    : TrayItemView(shelf) {
   CreateImageView();
 
   SessionControllerImpl* session_controller =
       Shell::Get()->session_controller();
   session_observation_.Observe(session_controller);
 
-  HpsNotifyController* controller = Shell::Get()->hps_notify_controller();
+  SnoopingProtectionController* controller =
+      Shell::Get()->snooping_protection_controller();
   controller_observation_.Observe(controller);
 
   SetVisible(controller->SnooperPresent());
@@ -39,37 +41,37 @@
       IDS_ASH_SMART_PRIVACY_SNOOPING_NOTIFICATION_SYSTEM_TRAY_TOOLTIP_TEXT));
 }
 
-HpsNotifyView::~HpsNotifyView() = default;
+SnoopingProtectionView::~SnoopingProtectionView() = default;
 
-void HpsNotifyView::HandleLocaleChange() {}
+void SnoopingProtectionView::HandleLocaleChange() {}
 
-void HpsNotifyView::OnSessionStateChanged(
+void SnoopingProtectionView::OnSessionStateChanged(
     session_manager::SessionState session_state) {
   UpdateIconColor(session_state);
 }
 
-void HpsNotifyView::OnThemeChanged() {
+void SnoopingProtectionView::OnThemeChanged() {
   TrayItemView::OnThemeChanged();
   UpdateIconColor(Shell::Get()->session_controller()->GetSessionState());
 }
 
-const char* HpsNotifyView::GetClassName() const {
-  return "HpsNotifyView";
+const char* SnoopingProtectionView::GetClassName() const {
+  return "SnoopingProtectionView";
 }
 
-void HpsNotifyView::OnSnoopingStatusChanged(bool snooper) {
+void SnoopingProtectionView::OnSnoopingStatusChanged(bool snooper) {
   SetVisible(snooper);
 }
 
-void HpsNotifyView::OnHpsNotifyControllerDestroyed() {
+void SnoopingProtectionView::OnSnoopingProtectionControllerDestroyed() {
   controller_observation_.Reset();
 }
 
-void HpsNotifyView::UpdateIconColor(
+void SnoopingProtectionView::UpdateIconColor(
     session_manager::SessionState session_state) {
   const SkColor new_color = TrayIconColor(session_state);
   const gfx::ImageSkia new_icon = gfx::CreateVectorIcon(gfx::IconDescription(
-      kSystemTrayHpsNotifyIcon, kUnifiedTrayIconSize, new_color));
+      kSystemTraySnoopingProtectionIcon, kUnifiedTrayIconSize, new_color));
   image_view()->SetImage(new_icon);
 }
 
diff --git a/ash/system/unified/snooping_protection_view.h b/ash/system/unified/snooping_protection_view.h
index 883a975..79feaed4 100644
--- a/ash/system/unified/snooping_protection_view.h
+++ b/ash/system/unified/snooping_protection_view.h
@@ -18,14 +18,15 @@
 
 // The icon in the system tray notifying a user that a second person has been
 // detected looking over their shoulder.
-class ASH_EXPORT HpsNotifyView : public TrayItemView,
-                                 public SessionObserver,
-                                 public HpsNotifyController::Observer {
+class ASH_EXPORT SnoopingProtectionView
+    : public TrayItemView,
+      public SessionObserver,
+      public SnoopingProtectionController::Observer {
  public:
-  explicit HpsNotifyView(Shelf* shelf);
-  HpsNotifyView(const HpsNotifyView&) = delete;
-  HpsNotifyView& operator=(const HpsNotifyView&) = delete;
-  ~HpsNotifyView() override;
+  explicit SnoopingProtectionView(Shelf* shelf);
+  SnoopingProtectionView(const SnoopingProtectionView&) = delete;
+  SnoopingProtectionView& operator=(const SnoopingProtectionView&) = delete;
+  ~SnoopingProtectionView() override;
 
   // views::TrayItemView:
   const char* GetClassName() const override;
@@ -35,9 +36,9 @@
   // SessionObserver:
   void OnSessionStateChanged(session_manager::SessionState state) override;
 
-  // HpsNotifyController::Observer:
+  // SnoopingProtectionController::Observer:
   void OnSnoopingStatusChanged(bool snooper) override;
-  void OnHpsNotifyControllerDestroyed() override;
+  void OnSnoopingProtectionControllerDestroyed() override;
 
  private:
   // Updates the system tray icon to use the color corresponding to the current
@@ -47,11 +48,12 @@
   base::ScopedObservation<SessionController, SessionObserver>
       session_observation_{this};
 
-  base::ScopedObservation<HpsNotifyController, HpsNotifyController::Observer>
+  base::ScopedObservation<SnoopingProtectionController,
+                          SnoopingProtectionController::Observer>
       controller_observation_{this};
 
   // Must be last.
-  base::WeakPtrFactory<HpsNotifyView> weak_ptr_factory_{this};
+  base::WeakPtrFactory<SnoopingProtectionView> weak_ptr_factory_{this};
 };
 
 }  // namespace ash
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc
index d4ee9bf..78c659e 100644
--- a/ash/system/unified/unified_system_tray.cc
+++ b/ash/system/unified/unified_system_tray.cc
@@ -163,9 +163,9 @@
           std::make_unique<PrivacyScreenToastController>(this)),
       notification_icons_controller_(
           std::make_unique<NotificationIconsController>(this)),
-      hps_notify_view_(features::IsSnoopingProtectionEnabled()
-                           ? new HpsNotifyView(shelf)
-                           : nullptr),
+      snooping_protection_view_(features::IsSnoopingProtectionEnabled()
+                                    ? new SnoopingProtectionView(shelf)
+                                    : nullptr),
       current_locale_view_(new CurrentLocaleView(shelf)),
       ime_mode_view_(new ImeModeView(shelf)),
       managed_device_view_(new ManagedDeviceTrayItemView(shelf)),
@@ -198,7 +198,7 @@
   AddObservedTrayItem(notification_icons_controller_->quiet_mode_view());
 
   if (features::IsSnoopingProtectionEnabled())
-    AddTrayItemToContainer(hps_notify_view_);
+    AddTrayItemToContainer(snooping_protection_view_);
 
   AddTrayItemToContainer(current_locale_view_);
   AddTrayItemToContainer(ime_mode_view_);
diff --git a/ash/system/unified/unified_system_tray.h b/ash/system/unified/unified_system_tray.h
index 841e686..cccebab 100644
--- a/ash/system/unified/unified_system_tray.h
+++ b/ash/system/unified/unified_system_tray.h
@@ -33,11 +33,11 @@
 class CameraMicTrayItemView;
 class CurrentLocaleView;
 class ImeModeView;
-class HpsNotifyView;
 class ManagedDeviceTrayItemView;
 class NetworkTrayView;
 class NotificationIconsController;
 class PrivacyScreenToastController;
+class SnoopingProtectionView;
 class TimeTrayItemView;
 class TrayItemView;
 class UnifiedSliderBubbleController;
@@ -272,7 +272,7 @@
   const std::unique_ptr<NotificationIconsController>
       notification_icons_controller_;
 
-  HpsNotifyView* const hps_notify_view_;
+  SnoopingProtectionView* const snooping_protection_view_;
   CurrentLocaleView* const current_locale_view_;
   ImeModeView* const ime_mode_view_;
   ManagedDeviceTrayItemView* const managed_device_view_;
diff --git a/ash/system/virtual_keyboard/DIR_METADATA b/ash/system/virtual_keyboard/DIR_METADATA
index 1ae4c22..caac77f 100644
--- a/ash/system/virtual_keyboard/DIR_METADATA
+++ b/ash/system/virtual_keyboard/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/ash/webui/camera_app_ui/resources.h b/ash/webui/camera_app_ui/resources.h
index e3ed0c7c..61f0490 100644
--- a/ash/webui/camera_app_ui/resources.h
+++ b/ash/webui/camera_app_ui/resources.h
@@ -61,6 +61,7 @@
     {"error_msg_video_too_short", IDS_ERROR_MSG_VIDEO_TOO_SHORT},
     {"expert_custom_video_parameters", IDS_EXPERT_CUSTOM_VIDEO_PARAMETERS},
     {"expert_enable_expert_mode", IDS_EXPERT_ENABLE_EXPERT_MODE},
+    {"expert_enable_fps_picker_for_builtin", IDS_EXPERT_ENABLE_FPS_PICKER_FOR_BUILTIN},
     {"expert_enable_full_sized_video_snapshot",
      IDS_EXPERT_ENABLE_FULL_SIZED_VIDEO_SNAPSHOT},
     {"expert_multistream_recording", IDS_EXPERT_MULTISTREAM_RECORDING},
diff --git a/ash/webui/camera_app_ui/resources/js/i18n_string.ts b/ash/webui/camera_app_ui/resources/js/i18n_string.ts
index 45f2a96..65dec05 100644
--- a/ash/webui/camera_app_ui/resources/js/i18n_string.ts
+++ b/ash/webui/camera_app_ui/resources/js/i18n_string.ts
@@ -52,6 +52,7 @@
   ERROR_MSG_VIDEO_TOO_SHORT = 'error_msg_video_too_short',
   EXPERT_CUSTOM_VIDEO_PARAMETERS = 'expert_custom_video_parameters',
   EXPERT_ENABLE_EXPERT_MODE = 'expert_enable_expert_mode',
+  EXPERT_ENABLE_FPS_PICKER_FOR_BUILTIN = 'expert_enable_fps_picker_for_builtin',
   EXPERT_ENABLE_FULL_SIZED_VIDEO_SNAPSHOT =
       'expert_enable_full_sized_video_snapshot',
   EXPERT_MODE_BUTTON = 'expert_mode_button',
diff --git a/ash/webui/camera_app_ui/resources/js/nav.ts b/ash/webui/camera_app_ui/resources/js/nav.ts
index a4e8ce08..40f9030 100644
--- a/ash/webui/camera_app_ui/resources/js/nav.ts
+++ b/ash/webui/camera_app_ui/resources/js/nav.ts
@@ -2,8 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assertExists, assertInstanceof} from './assert.js';
-import * as dom from './dom.js';
+import {assert, assertInstanceof} from './assert.js';
 import {toggleExpertMode} from './expert.js';
 import * as state from './state.js';
 import * as toast from './toast.js';
@@ -52,45 +51,6 @@
 }
 
 /**
- * Activates the view to be focusable.
- *
- * @param index Index of the view.
- */
-function activate(index: number) {
-  // Restore the view's child elements' tabindex and then focus the view.
-  const view = allViews[index];
-  view.root.setAttribute('aria-hidden', 'false');
-  for (const element of dom.getAllFrom(view.root, '[tabindex]', HTMLElement)) {
-    if (element.dataset['tabindex'] === undefined) {
-      // First activation, no need to restore tabindex from data-tabindex.
-      continue;
-    }
-    element.setAttribute('tabindex', element.dataset['tabindex']);
-    element.removeAttribute('data-tabindex');
-  }
-  view.focus();
-}
-
-/**
- * Deactivates the view to be unfocusable.
- *
- * @param index Index of the view.
- */
-function deactivate(index: number) {
-  const view = allViews[index];
-  view.root.setAttribute('aria-hidden', 'true');
-  for (const element of dom.getAllFrom(view.root, '[tabindex]', HTMLElement)) {
-    element.dataset['tabindex'] =
-        assertExists(element.getAttribute('tabindex'));
-    element.setAttribute('tabindex', '-1');
-  }
-  const activeElement = document.activeElement;
-  if (activeElement instanceof HTMLElement) {
-    activeElement.blur();
-  }
-}
-
-/**
  * Checks if the view is already shown.
  *
  * @param index Index of the view.
@@ -109,16 +69,17 @@
  */
 function show(index: number): View {
   const view = allViews[index];
-  if (!isShown(index)) {
-    state.set(view.name, true);
-    view.layout();
-    if (index > topmostIndex) {
-      if (topmostIndex >= 0) {
-        deactivate(topmostIndex);
-      }
-      activate(index);
-      topmostIndex = index;
+  if (isShown(index)) {
+    return view;
+  }
+  state.set(view.name, true);
+  view.layout();
+  if (index > topmostIndex) {
+    if (topmostIndex >= 0) {
+      allViews[topmostIndex].onCoveredAsTop();
     }
+    topmostIndex = index;
+    allViews[index].onShownAsTop();
   }
   return view;
 }
@@ -144,13 +105,14 @@
  * @param index Index of the view.
  */
 function hide(index: number) {
+  assert(isShown(index));
   if (index === topmostIndex) {
-    deactivate(index);
+    allViews[index].onHideAsTop();
     const next = findNextTopmostIndex();
-    if (next >= 0) {
-      activate(next);
-    }
     topmostIndex = next;
+    if (next >= 0) {
+      allViews[next].onUncoveredAsTop(allViews[index].name);
+    }
   }
   state.set(allViews[index].name, false);
 }
diff --git a/ash/webui/camera_app_ui/resources/js/state.ts b/ash/webui/camera_app_ui/resources/js/state.ts
index ce4507cc..641726a 100644
--- a/ash/webui/camera_app_ui/resources/js/state.ts
+++ b/ash/webui/camera_app_ui/resources/js/state.ts
@@ -14,6 +14,7 @@
   CAMERA_CONFIGURING = 'camera-configuring',
   CAMERA_SWITCHING = 'camera-switching',
   CUSTOM_VIDEO_PARAMETERS = 'custom-video-parameters',
+  ENABLE_FPS_PICKER_FOR_BUILTIN = 'enable-fps-picker-for-builtin',
   ENABLE_FULL_SIZED_VIDEO_SNAPSHOT = 'enable-full-sized-video-snapshot',
   ENABLE_GIF_RECORDING = 'enable-gif-recording',
   ENABLE_MULTISTREAM_RECORDING = 'enable-multistream-recording',
diff --git a/ash/webui/camera_app_ui/resources/js/views/camera.ts b/ash/webui/camera_app_ui/resources/js/views/camera.ts
index e1f0fe4c..c9cf221 100644
--- a/ash/webui/camera_app_ui/resources/js/views/camera.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/camera.ts
@@ -254,6 +254,9 @@
           state.set(state.State.MODE_SWITCHING, true);
           const isSuccess = await this.cameraManager.switchMode(mode);
           state.set(state.State.MODE_SWITCHING, false, {hasError: !isSuccess});
+          if (isSuccess) {
+            this.focusShutterButton();
+          }
         }
       });
     }
@@ -360,13 +363,8 @@
     // to take document photo with space key as shortcut. See b/196907822.
     const checkRefocus = () => {
       if (!state.get(state.State.CAMERA_CONFIGURING) && state.get(Mode.SCAN) &&
-          this.scanOptions.isDocumentModeEanbled() &&
-          nav.isTopMostView(this.name)) {
-        for (const btn of dom.getAll('button.shutter', HTMLButtonElement)) {
-          if (btn.offsetParent !== null) {
-            btn.focus();
-          }
-        }
+          this.scanOptions.isDocumentModeEanbled()) {
+        this.focusShutterButton();
       }
     };
     state.addObserver(state.State.CAMERA_CONFIGURING, checkRefocus);
@@ -377,27 +375,46 @@
     return this.subViews;
   }
 
-  override focus(): void {
-    (async () => {
-      await this.cameraReady.wait();
-
-      // Check the view is still on the top after await.
-      if (!nav.isTopMostView(ViewName.CAMERA)) {
-        return;
+  private focusShutterButton(): void {
+    if (!nav.isTopMostView(this.name)) {
+      return;
+    }
+    // Avoid focusing invisible shutters.
+    for (const btn of dom.getAll('button.shutter', HTMLButtonElement)) {
+      if (btn.offsetParent !== null) {
+        btn.focus();
       }
+    }
+  }
 
-      if (newFeatureToast.isShowing()) {
-        newFeatureToast.focus();
-        return;
-      }
+  private async defaultFocus(): Promise<void> {
+    await this.cameraReady.wait();
 
-      // Avoid focusing invisible shutters.
-      for (const btn of dom.getAll('button.shutter', HTMLButtonElement)) {
-        if (btn.offsetParent !== null) {
-          btn.focus();
-        }
-      }
-    })();
+    // Check the view is still on the top after await.
+    if (!nav.isTopMostView(ViewName.CAMERA)) {
+      return;
+    }
+
+    if (newFeatureToast.isShowing()) {
+      newFeatureToast.focus();
+      return;
+    }
+
+    this.focusShutterButton();
+  }
+
+  override onShownAsTop(): void {
+    this.defaultFocus();
+  }
+
+  override onUncoveredAsTop(viewName: ViewName): void {
+    if ([ViewName.SETTINGS, ViewName.OPTION_PANEL].includes(viewName)) {
+      // Don't refocus on shutter button when coming back from setting menu.
+      super.onUncoveredAsTop(viewName);
+    } else {
+      this.setFocusable();
+      this.defaultFocus();
+    }
   }
 
   /**
@@ -415,7 +432,8 @@
 
     state.set(state.State.TAKING, true);
     this.shutterType = shutterType;
-    this.focus();  // Refocus the visible shutter button for ChromeVox.
+    // Refocus the visible shutter button for ChromeVox.
+    this.focusShutterButton();
     this.take = (async () => {
       let hasError = false;
       try {
@@ -449,7 +467,8 @@
           hasError,
           facing: this.getFacing(),
         });
-        this.focus();  // Refocus the visible shutter button for ChromeVox.
+        // Refocus the visible shutter button for ChromeVox.
+        this.focusShutterButton();
       }
     })();
     return this.take;
diff --git a/ash/webui/camera_app_ui/resources/js/views/settings/base.ts b/ash/webui/camera_app_ui/resources/js/views/settings/base.ts
index 611fc2d..ae1815d 100644
--- a/ash/webui/camera_app_ui/resources/js/views/settings/base.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/settings/base.ts
@@ -4,25 +4,13 @@
 
 import * as dom from '../../dom.js';
 import {ViewName} from '../../type.js';
-
-import {LeaveCondition, View} from '../view.js';
+import {View} from '../view.js';
 
 /**
  * Base controller of settings view.
  */
 export class BaseSettings extends View {
   /**
-   * The default focus element when focus on view is reset.
-   */
-  private readonly defaultFocus: HTMLElement;
-
-  /**
-   * The DOM element to be focused when the focus on view is reset by calling
-   * |focus()|.
-   */
-  protected focusElement: HTMLElement;
-
-  /**
    * @param name Name of the view.
    */
   constructor(name: ViewName) {
@@ -30,18 +18,5 @@
 
     dom.getFrom(this.root, '.menu-header button', HTMLButtonElement)
         .addEventListener('click', () => this.leave());
-
-    this.defaultFocus = dom.getFrom(this.root, '[tabindex]', HTMLElement);
-
-    this.focusElement = this.defaultFocus;
-  }
-
-  override focus(): void {
-    this.focusElement.focus();
-  }
-
-  override leaving(condition: LeaveCondition): boolean {
-    this.focusElement = this.defaultFocus;
-    return super.leaving(condition);
   }
 }
diff --git a/ash/webui/camera_app_ui/resources/js/views/settings/primary.ts b/ash/webui/camera_app_ui/resources/js/views/settings/primary.ts
index 4e25fe7..bedc93a 100644
--- a/ash/webui/camera_app_ui/resources/js/views/settings/primary.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/settings/primary.ts
@@ -33,11 +33,10 @@
 const helpUrl =
     'https://support.google.com/chromebook/?p=camera_usage_on_chromebook';
 
-function bindButton(
-    openerId: string, callback: (element: HTMLElement) => void): void {
+function bindButton(openerId: string, callback: () => void): void {
   const opener = dom.get(`#${openerId}`, HTMLElement);
   opener.addEventListener('click', () => {
-    callback(opener);
+    callback();
   });
 }
 
@@ -64,19 +63,16 @@
 
     bindButton(
         'settings-photo-resolution',
-        (element) =>
-            this.openSubSettings(element, ViewName.PHOTO_RESOLUTION_SETTINGS));
+        () => this.openSubSettings(ViewName.PHOTO_RESOLUTION_SETTINGS));
     bindButton(
         'settings-photo-aspect-ratio',
-        (element) => this.openSubSettings(
-            element, ViewName.PHOTO_ASPECT_RATIO_SETTINGS));
+        () => this.openSubSettings(ViewName.PHOTO_ASPECT_RATIO_SETTINGS));
     bindButton(
         'settings-video-resolution',
-        (element) =>
-            this.openSubSettings(element, ViewName.VIDEO_RESOLUTION_SETTINGS));
+        () => this.openSubSettings(ViewName.VIDEO_RESOLUTION_SETTINGS));
     bindButton(
         'settings-expert',
-        (element) => this.openSubSettings(element, ViewName.EXPERT_SETTINGS));
+        () => this.openSubSettings(ViewName.EXPERT_SETTINGS));
     bindButton('settings-feedback', () => {
       // Prevent setting view overlapping preview when sending app
       // window feedback screenshot b/155938542.
@@ -217,12 +213,9 @@
   /**
    * Opens sub-settings.
    *
-   * @param opener The DOM element triggering the open.
    * @param name Name of settings view.
    */
-  private async openSubSettings(opener: HTMLElement, name: ViewName):
-      Promise<void> {
-    this.focusElement = opener;
+  private async openSubSettings(name: ViewName): Promise<void> {
     // Dismiss primary-settings if sub-settings was dismissed by background
     // click.
     const cond = await nav.open(name);
diff --git a/ash/webui/camera_app_ui/resources/js/views/settings/video_resolution.ts b/ash/webui/camera_app_ui/resources/js/views/settings/video_resolution.ts
index 3224403..1e29b02 100644
--- a/ash/webui/camera_app_ui/resources/js/views/settings/video_resolution.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/settings/video_resolution.ts
@@ -49,6 +49,11 @@
 
     this.cameraManager.addVideoResolutionOptionListener(
         (groups) => this.onOptionsUpdate(groups));
+
+    for (const s of [state.State.EXPERT,
+      state.State.ENABLE_FPS_PICKER_FOR_BUILTIN]) {
+      state.addObserver(s, () => this.toggleFPSPickerVisiblity());
+    }
   }
 
   private onOptionsUpdate(groups: VideoResolutionOptionGroup[]): void {
@@ -99,11 +104,17 @@
             SUPPORTED_CONSTANT_FPS.some((fps) => fps === fpsOption.constFps));
     const showFpsButton =
         constFpsOptions.length > 1 && facing === Facing.EXTERNAL;
+    const isFPSEnabled = state.get(state.State.EXPERT) &&
+      state.get(state.State.ENABLE_FPS_PICKER_FOR_BUILTIN);
     let resolution = new Resolution();
     for (const fps of SUPPORTED_CONSTANT_FPS) {
       const fpsButton =
           dom.getFrom(optionElement, `.fps-${fps}`, HTMLButtonElement);
-      fpsButton.hidden = !showFpsButton;
+      if (!isFPSEnabled) {
+        fpsButton.hidden = true;
+      } else if (!showFpsButton) {
+        fpsButton.classList.add('invisible');
+      }
 
       const fpsOption =
           option.fpsOptions.find((fpsOption) => fpsOption.constFps === fps);
@@ -151,4 +162,14 @@
       input.focus();
     }
   }
+
+  private toggleFPSPickerVisiblity(): void {
+    const isFPSEnabled = state.get(state.State.EXPERT) &&
+      state.get(state.State.ENABLE_FPS_PICKER_FOR_BUILTIN);
+    const fpsButtons = dom.getAllFrom(
+      this.menu, '.fps-buttons button', HTMLButtonElement);
+    for (const fpsButton of fpsButtons) {
+      fpsButton.hidden = !isFPSEnabled;
+    }
+  }
 }
diff --git a/ash/webui/camera_app_ui/resources/js/views/view.ts b/ash/webui/camera_app_ui/resources/js/views/view.ts
index 5461068..5d84a6b 100644
--- a/ash/webui/camera_app_ui/resources/js/views/view.ts
+++ b/ash/webui/camera_app_ui/resources/js/views/view.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assertInstanceof} from '../assert.js';
+import {assertExists, assertInstanceof} from '../assert.js';
 import * as dom from '../dom.js';
 import {I18nString} from '../i18n_string.js';
 import * as state from '../state.js';
@@ -116,7 +116,7 @@
 }
 
 /**
- * Base controller of a view for views' navigation sessions (nav.js).
+ * Base controller of a view for views' navigation sessions (nav.ts).
  */
 export class View {
   root: HTMLElement;
@@ -130,6 +130,8 @@
 
   private readonly defaultFocusSelector: string;
 
+  protected lastFocusedElement: HTMLElement|null = null;
+
   /**
    * @param name Unique name of view which should be same as its DOM element id.
    */
@@ -185,9 +187,44 @@
   }
 
   /**
-   * Focuses the default element on the view if applicable.
+   * Deactivates the view to be unfocusable.
    */
-  focus(): void {
+  protected setUnfocusable(): void {
+    this.root.setAttribute('aria-hidden', 'true');
+    for (const element of dom.getAllFrom(
+             this.root, '[tabindex]', HTMLElement)) {
+      element.dataset['tabindex'] =
+          assertExists(element.getAttribute('tabindex'));
+      element.setAttribute('tabindex', '-1');
+    }
+    const activeElement = document.activeElement;
+    if (activeElement instanceof HTMLElement) {
+      activeElement.blur();
+    }
+  }
+
+  /**
+   * Activates the view to be focusable.
+   */
+  protected setFocusable(): void {
+    this.root.setAttribute('aria-hidden', 'false');
+    for (const element of dom.getAllFrom(
+             this.root, '[tabindex]', HTMLElement)) {
+      if (element.dataset['tabindex'] === undefined) {
+        // First activation, no need to restore tabindex from data-tabindex.
+        continue;
+      }
+      element.setAttribute('tabindex', element.dataset['tabindex']);
+      element.removeAttribute('data-tabindex');
+    }
+  }
+
+  /**
+   * The view is newly shown as the topmost view.
+   */
+  onShownAsTop(): void {
+    this.setFocusable();
+    // Focus on the default selector on enter.
     const el = this.root.querySelector(this.defaultFocusSelector);
     if (el !== null) {
       assertInstanceof(el, HTMLElement).focus();
@@ -195,6 +232,39 @@
   }
 
   /**
+   * The view was the topmost shown view and is being hidden.
+   */
+  onHideAsTop(): void {
+    this.lastFocusedElement = null;
+    this.setUnfocusable();
+  }
+
+  /**
+   * The view was the topmost shown view and is being covered by newly shown
+   * view.
+   */
+  onCoveredAsTop(): void {
+    this.lastFocusedElement = document.activeElement === null ?
+        null :
+        assertInstanceof(document.activeElement, HTMLElement);
+    this.setUnfocusable();
+  }
+
+  /**
+   * The view becomes the new topmost shown view after some upper view is
+   * hidden.
+   *
+   * @param _viewName The name of the upper view that is hidden.
+   */
+  onUncoveredAsTop(_viewName: ViewName): void {
+    this.setFocusable();
+    if (this.lastFocusedElement !== null) {
+      this.lastFocusedElement.focus();
+      this.lastFocusedElement = null;
+    }
+  }
+
+  /**
    * Layouts the view.
    */
   layout(): void {
@@ -206,7 +276,7 @@
    *
    * @param _options Optional rest parameters for entering the view.
    */
-  entering(_options?: EnterOptions): void {
+  protected entering(_options?: EnterOptions): void {
     // To be overridden by subclasses.
   }
 
@@ -232,7 +302,7 @@
    * @param _condition Optional condition for leaving the view.
    * @return Whether able to leaving the view or not.
    */
-  leaving(_condition: LeaveCondition): boolean {
+  protected leaving(_condition: LeaveCondition): boolean {
     return true;
   }
 
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings.grd b/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
index 902092f..72c3fa9 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings.grd
@@ -351,6 +351,9 @@
       <message desc="Label for expert mode option: Multi-stream video recording." name="IDS_EXPERT_MULTISTREAM_RECORDING">
         Multistream video recording
       </message>
+      <message desc="Label for expert mode option: enable video FPS picker for builtin camera." name="IDS_EXPERT_ENABLE_FPS_PICKER_FOR_BUILTIN">
+        Enable video FPS picker
+      </message>
       <message desc="Label for expert mode option: enable expert mode." name="IDS_EXPERT_ENABLE_EXPERT_MODE">
         Enable expert mode
       </message>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb
index 6e7c867..33e75ff3 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -118,6 +118,7 @@
 যদি আপোনাৰ মতামতটো প্ৰতিচ্ছবি অথবা ভিডিঅ’ৰ গুণগত মান সম্পৰ্কীয়, অনুগ্ৰহ কৰি নমুনা হিচাপে এখন ফট’ অথবা এটা ভিডিঅ’ সংলগ্ন কৰক আৰু কি সমস্যা হৈছে বৰ্ণনা কৰক। (উদাহৰণস্বৰূপে, ফট’খন বহুত ক’লা হৈছে অথবা মূল বস্তুটো ফ’কাছত নাই।)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> মেগা পিক্সেল</translation>
 <translation id="6527303717912515753">শ্বেয়াৰ কৰক</translation>
+<translation id="6617916774429601017">আটাইবোৰ ৰিজ’লিউশ্বন দেখুৱাওক</translation>
 <translation id="6631515515009660915">মিৰ’ৰ অফ</translation>
 <translation id="6652737148136672975">এৰ’ কীসমূহৰ জৰিয়তে চুকৰ স্থান সলনি কৰক</translation>
 <translation id="667999046851023355">নথি</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
index 512cb0a..febd628 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_az.xtb
@@ -59,6 +59,7 @@
 <translation id="3411958449466169012">Taymer deaktivdir</translation>
 <translation id="3448774564454087943">Çox qısa olduğuna görə video saxlanılmadı</translation>
 <translation id="346539236881580388">Yenidən çəkin</translation>
+<translation id="3511295087439225876">Səssiz düyməsi aktivdir</translation>
 <translation id="3517926952904427380">Portret fotosu çəkmək alınmadı</translation>
 <translation id="3566302376254083266">Yuxarı sol tərəfə daşınır</translation>
 <translation id="3569311554794739032"><ph name="FILE" /> faylını silmək istəyirsiniz?</translation>
@@ -149,6 +150,7 @@
 <translation id="8131740175452115882">Təsdiq edin</translation>
 <translation id="8145038249676204903">"Foto çəkin" rejiminə keçin</translation>
 <translation id="8167081290930651932">Foto olaraq yadda saxlayın</translation>
+<translation id="8236532224592646488">Səssiz düyməsi deaktivdir</translation>
 <translation id="8239780215768881278">Video snepşotu çəkin</translation>
 <translation id="8261506727792406068">Silin</translation>
 <translation id="8425673304802773841">Aşağı əyin</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
index 4d8bd95..22c0421 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -118,6 +118,7 @@
 যদি আপনি কোনও ছবি বা ভিডিওর কোয়ালিটির ব্যাপারে মতামত জানাতে চান, তাহলে উদাহরণস্বরূপ একটি ফটো বা ভিডিও এখানে অ্যাটাচ করুন এবং আমাদের জানান সেটিতে কোন বিষয়টি আপনার খারাপ লেগেছে। (যেমন, ফটোতে পর্যাপ্ত আলোর অভাব রয়েছে বা যার ফটো তোলা হয়েছে, তাকে ফোকাসে রেখে ফটোটি তোলা হয়নি।)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> মেগা পিক্সেল</translation>
 <translation id="6527303717912515753">শেয়ার করুন</translation>
+<translation id="6617916774429601017">সমস্ত রেজোলিউশন দেখান</translation>
 <translation id="6631515515009660915">মিরর করার ফিচার বন্ধ করুন</translation>
 <translation id="6652737148136672975">অ্যারো কী ব্যবহার করে কোণার অবস্থান সরান</translation>
 <translation id="667999046851023355">দস্তাবেজ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
index 8426fd1..84a949a 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_eu.xtb
@@ -118,6 +118,7 @@
 Irudi edo bideoaren kalitateari buruzko iritzia eman nahi baduzu, erantsi argazki edo bideo bat lagin gisa eta azal iezaguzu zein den arazoa (adibidez, argazkia ilunegia da edo subjektua ez dago fokuratuta).</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" /> × <ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> megapixel</translation>
 <translation id="6527303717912515753">Partekatu</translation>
+<translation id="6617916774429601017">Erakutsi bereizmen guztiak</translation>
 <translation id="6631515515009660915">Ispilu modua desaktibatuta</translation>
 <translation id="6652737148136672975">Mugitu ertzaren kokapena gezi-teklak erabilita</translation>
 <translation id="667999046851023355">Dokumentua</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_ENABLE_FPS_PICKER_FOR_BUILTIN.png.sha1 b/ash/webui/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_ENABLE_FPS_PICKER_FOR_BUILTIN.png.sha1
new file mode 100644
index 0000000..0b0425c1a
--- /dev/null
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_grd/IDS_EXPERT_ENABLE_FPS_PICKER_FOR_BUILTIN.png.sha1
@@ -0,0 +1 @@
+73dd4880b6dc48811cf2441f2ec79b61313f9261
\ No newline at end of file
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
index 13031e8..3d4c4c9 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_gu.xtb
@@ -118,6 +118,7 @@
 જો તમારો પ્રતિસાદ કોઈ છબી અથવા વીડિયો ક્વૉલિટી વિશે હોય, તો કૃપા કરીને ફોટો અથવા વીડિયોનો કોઈ નમૂનો શામેલ કરો અને સમસ્યાનું વર્ણન કરો. (ઉદાહરણ તરીકે, ફોટો ઘણા ઓછા પ્રકાશમાં લેવામાં આવ્યો છે અથવા તે ફોકસમાં નથી.)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> મેગાપિક્સેલ</translation>
 <translation id="6527303717912515753">શેર કરો</translation>
+<translation id="6617916774429601017">બધા નિરાકરણો બતાવો</translation>
 <translation id="6631515515009660915">મિરર કરવાનું બંધ કરો</translation>
 <translation id="6652737148136672975">ઍરો કી વડે ખૂણાની સ્થિતિને ખસેડો</translation>
 <translation id="667999046851023355">દસ્તાવેજ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
index 5011684e..b16f632 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -118,6 +118,7 @@
 ប្រសិនបើមតិកែលម្អរបស់អ្នកពាក់ព័ន្ធនឹងគុណភាពរូបភាព ឬវីដេអូ សូមភ្ជាប់ជាមួយសំណាករូបថត ឬវីដេអូ និងរៀបរាប់ថាមានបញ្ហាអ្វី។ (ឧទាហរណ៍ រូបថតងងឹតជ្រុល ឬមានលក្ខណៈព្រាល។)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> មេហ្គាភីកសែល</translation>
 <translation id="6527303717912515753">ចែករំលែក</translation>
+<translation id="6617916774429601017">បង្ហាញកម្រិតគុណភាពទាំងអស់</translation>
 <translation id="6631515515009660915">បិទ​កញ្ចក់</translation>
 <translation id="6652737148136672975">ផ្លាស់ទីទីតាំងជ្រុងដោយប្រើគ្រាប់ចុចព្រួញ</translation>
 <translation id="667999046851023355">ឯកសារ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
index d90a561..95ac04bb 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -118,6 +118,7 @@
 നിങ്ങളുടെ ഫീഡ്‌ബാക്ക് ചിത്രത്തെക്കുറിച്ചോ വീഡിയോ നിലവാരത്തെക്കുറിച്ചോ ആണെങ്കിൽ, സാമ്പിൾ ഫോട്ടോയോ വീഡിയോയോ അറ്റാച്ച് ചെയ്‌ത് പ്രശ്‌നം എന്താണെന്ന് വിവരിക്കുക. (ഉദാഹരണത്തിന്, ഫോട്ടോ വളരെ ഇരുണ്ടതാണ് അല്ലെങ്കിൽ വസ്‌തു ഫോക്കസിലല്ല ഉള്ളത്.)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> മെഗാ പിക്‌സൽ</translation>
 <translation id="6527303717912515753">പങ്കിടുക</translation>
+<translation id="6617916774429601017">എല്ലാ റെസൊല്യൂഷനുകളും കാണിക്കുക</translation>
 <translation id="6631515515009660915">മിറർ ചെയ്യൽ ഓഫാക്കുക</translation>
 <translation id="6652737148136672975">അമ്പടയാള കീകൾ ഉപയോഗിച്ച് മൂലയുടെ സ്ഥാനം നീക്കുക</translation>
 <translation id="667999046851023355">പ്രമാണം</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
index 5ae5ed25..2149850a 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ne.xtb
@@ -118,6 +118,7 @@
 तपाईंको प्रतिक्रिया फोटो वा भिडियोको गुणस्तरका सम्बन्धमा हो भने कृपया फोटो वा भिडियोको एउटा नमुना एट्याच गर्नुहोस् र उक्त फोटो वा भिडियोमा के समस्या छ भन्ने कुरा बताउनुहोस्। (उदाहरणका लागि, फोटो ज्यादै अँध्यारो छ वा जुन कुराको फोटो खिच्नु पर्ने हो त्यो कुरा फोकसबाहिर छ।)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> मेगा पिक्सेल</translation>
 <translation id="6527303717912515753">साझा गर्नुहोस्</translation>
+<translation id="6617916774429601017">सबै रिजोल्युसनहरू देखाइयोस्</translation>
 <translation id="6631515515009660915">मिरर अफ गर्नुहोस्</translation>
 <translation id="6652737148136672975">एरो कीहरू प्रयोग गरेर कुना सार्नुहोस्</translation>
 <translation id="667999046851023355">कागजात</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
index 42faecb..17eecc8e 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -118,6 +118,7 @@
 ਜੇ ਤੁਹਾਡਾ ਵਿਚਾਰ ਚਿੱਤਰ ਜਾਂ ਵੀਡੀਓ ਦੀ ਕੁਆਲਿਟੀ ਬਾਰੇ ਹੈ, ਤਾਂ ਕਿਰਪਾ ਕਰਕੇ ਕੋਈ ਸੈਂਪਲ ਫ਼ੋਟੋ ਜਾਂ ਵੀਡੀਓ ਨੱਥੀ ਕਰੋ ਅਤੇ ਵਰਣਨ ਕਰੋ ਕਿ ਇਸ ਵਿੱਚ ਕੀ ਗਲਤ ਹੈ। (ਜਿਵੇਂ ਕਿ, ਫ਼ੋਟੋ ਬਹੁਤ ਕਾਲੀ ਹੈ ਜਾਂ ਵਿਸ਼ਾ ਫੋਕਸ ਵਿੱਚ ਨਹੀਂ ਹੈ।)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> ਮੈਗਾ ਪਿਕਸਲ</translation>
 <translation id="6527303717912515753">ਸ਼ੇਅਰ ਕਰੋ</translation>
+<translation id="6617916774429601017">ਸਭ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਦਿਖਾਓ</translation>
 <translation id="6631515515009660915">ਪ੍ਰਤਿਬਿੰਬ ਬੰਦ ਹੈ</translation>
 <translation id="6652737148136672975">ਤੀਰ ਕੁੰਜੀਆਂ ਨਾਲ ਕੋਨੇ ਦੀ ਸਥਿਤੀ ਨੂੰ ਬਦਲੋ</translation>
 <translation id="667999046851023355">ਦਸਤਾਵੇਜ਼</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
index 9a33ef50..843dd08 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -118,6 +118,7 @@
 Jeśli dotyczyła ona jakości zdjęć lub filmów, zamieść tutaj przykładowe zdjęcie lub film i opisz, na czym polega problem (na przykład zdjęcie jest za ciemne lub obiekt jest nieostry).</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> – <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> Mpix</translation>
 <translation id="6527303717912515753">Udostępnij</translation>
+<translation id="6617916774429601017">Pokaż wszystkie rozdzielczości</translation>
 <translation id="6631515515009660915">Odbicie lustrzane wyłączone</translation>
 <translation id="6652737148136672975">Przesuń pozycję rogu za pomocą klawiszy strzałek</translation>
 <translation id="667999046851023355">Dokument</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
index 8773bfe..22817e4 100644
--- a/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
+++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_te.xtb
@@ -118,6 +118,7 @@
 మీ ఫీడ్‌బ్యాక్ ఇమేజ్ లేదా వీడియో క్వాలిటీ గురించి అయితే, దయచేసి నమూనా ఫోటో లేదా వీడియోను జోడించి, అందులో తప్పు ఏమిటో వివరించండి. (ఉదాహరణకు, ఫోటో మరీ మసకగా ఉండటం, లేదా తీయాల్సిన దానిపై ఫోకస్ చేయకపోవడం వంటివి)</translation>
 <translation id="6420689864531458495">(<ph name="ASPECT_RATIO_WIDTH" />:<ph name="ASPECT_RATIO_HEIGHT" /> - <ph name="WIDTH" />x<ph name="HEIGHT" />) <ph name="MEGAPIXEL" /> మెగా పిక్సెల్</translation>
 <translation id="6527303717912515753">షేర్ చేయండి</translation>
+<translation id="6617916774429601017">అన్ని రిజల్యూషన్‌లను చూడండి</translation>
 <translation id="6631515515009660915">మిర్రర్ బటన్‌ను ఆఫ్ చేయండి</translation>
 <translation id="6652737148136672975">డాక్యుమెంట్ మూలన స్థానాన్ని బాణం కీలతో జరపండి</translation>
 <translation id="667999046851023355">డాక్యుమెంట్‌</translation>
diff --git a/ash/webui/camera_app_ui/resources/views/main.html b/ash/webui/camera_app_ui/resources/views/main.html
index 5de9128..ae605c27 100644
--- a/ash/webui/camera_app_ui/resources/views/main.html
+++ b/ash/webui/camera_app_ui/resources/views/main.html
@@ -456,6 +456,13 @@
           <span i18n-text="expert_enable_full_sized_video_snapshot"></span>
         </label>
         <label class="menu-item inkdrop">
+          <input id="expert-enable-fps-picker-for-builtin" class="icon"
+                 type="checkbox" tabindex="0"
+                 data-state="enable-fps-picker-for-builtin"
+                 data-key="enableFPSPicker">
+          <span i18n-text="expert_enable_fps_picker_for_builtin"></span>
+        </label>
+        <label class="menu-item inkdrop">
           <input id="expert-show-all-resolutions" class="icon"
                  type="checkbox" tabindex="0"
                  data-state="show-all-resolutions"
diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc
index c0cdfa0d..042855e 100644
--- a/ash/webui/projector_app/projector_message_handler.cc
+++ b/ash/webui/projector_app/projector_message_handler.cc
@@ -89,7 +89,7 @@
   return pref == ash::prefs::kProjectorCreationFlowEnabled ||
          pref == ash::prefs::kProjectorGalleryOnboardingShowCount ||
          pref == ash::prefs::kProjectorViewerOnboardingShowCount ||
-         pref == ash::prefs::kProjectorSkipTranscriptDialogShown;
+         pref == ash::prefs::kProjectorExcludeTranscriptDialogShown;
 }
 
 bool IsValidOnboardingPref(const SetUserPrefArgs& args) {
@@ -103,14 +103,14 @@
          args.pref_name == ash::prefs::kProjectorCreationFlowEnabled;
 }
 
-bool IsValidSkipTranscriptDialogShownPref(const SetUserPrefArgs& args) {
+bool IsValidExcludeTranscriptDialogShownPref(const SetUserPrefArgs& args) {
   return args.value.is_bool() &&
-         args.pref_name == ash::prefs::kProjectorSkipTranscriptDialogShown;
+         args.pref_name == ash::prefs::kProjectorExcludeTranscriptDialogShown;
 }
 
 bool IsValidPrefValueArg(const SetUserPrefArgs& args) {
   return IsValidCreationFlowPref(args) || IsValidOnboardingPref(args) ||
-         IsValidSkipTranscriptDialogShownPref(args);
+         IsValidExcludeTranscriptDialogShownPref(args);
 }
 
 // Returns true if the request, `args`, contains a valid user preference string.
diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
index d11d8bb..bb4f675 100644
--- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc
+++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -78,7 +78,7 @@
     registry->RegisterBooleanPref(ash::prefs::kProjectorCreationFlowEnabled,
                                   false);
     registry->RegisterBooleanPref(
-        ash::prefs::kProjectorSkipTranscriptDialogShown, false);
+        ash::prefs::kProjectorExcludeTranscriptDialogShown, false);
     registry->RegisterIntegerPref(
         ash::prefs::kProjectorGalleryOnboardingShowCount, 0);
     registry->RegisterIntegerPref(
@@ -423,13 +423,13 @@
   EXPECT_TRUE(args->GetBool());
 }
 
-TEST_F(ProjectorMessageHandlerUnitTest, SkipTranscriptDialogShownPref) {
+TEST_F(ProjectorMessageHandlerUnitTest, ExcludeTranscriptDialogShownPref) {
   base::ListValue list_args;
   list_args.Append(base::Value(kSetUserPrefCallback));
 
   base::ListValue func_args;
   func_args.Append(
-      base::Value(ash::prefs::kProjectorSkipTranscriptDialogShown));
+      base::Value(ash::prefs::kProjectorExcludeTranscriptDialogShown));
   func_args.Append(base::Value(true));
   list_args.Append(std::move(func_args));
 
@@ -445,7 +445,7 @@
   list_args.ClearList();
   list_args.Append(base::Value(kGetUserPrefCallback));
   func_args.ClearList();
-  func_args.Append(ash::prefs::kProjectorSkipTranscriptDialogShown);
+  func_args.Append(ash::prefs::kProjectorExcludeTranscriptDialogShown);
   list_args.Append(std::move(func_args));
 
   web_ui().HandleReceivedMessage("getUserPref", &list_args);
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc
index fe90d8b..2ba640296 100644
--- a/ash/webui/shimless_rma/shimless_rma.cc
+++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -156,8 +156,6 @@
        IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE},
       {"calibrationFailedInstructionsText",
        IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS},
-      {"calibrationFailedRetryButtonLabel",
-       IDS_SHIMLESS_RMA_CALIBRATION_FAILED_RETRY_BUTTON_LABEL},
       {"calibrationFailedDialogTitle",
        IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE},
       {"calibrationFailedDialogText",
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 58be9bf..f984a74 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -5884,4 +5884,52 @@
   EXPECT_TRUE(split_view_controller()->split_view_divider()->IsAdjustable());
 }
 
+// Tests that in the split view with Overview enabled, the snapped window bounds
+// will be updated when the on-screen keyboard is enabled and disabled.
+TEST_F(SplitViewKeyboardTest, ShowHideOnScreenKeyboardWithOverviewEnabled) {
+  UpdateDisplay("1200x800");
+  int64_t display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id();
+  display::DisplayManager* display_manager = Shell::Get()->display_manager();
+  display::test::ScopedSetInternalDisplayId set_internal(display_manager,
+                                                         display_id);
+  ScreenOrientationControllerTestApi test_api(
+      Shell::Get()->screen_orientation_controller());
+  std::unique_ptr<aura::Window> right_window(
+      CreateWindow(gfx::Rect(0, 0, 400, 400)));
+  for (auto rotation :
+       {display::Display::ROTATE_0, display::Display::ROTATE_270}) {
+    EXPECT_FALSE(Shell::Get()->overview_controller()->InOverviewSession());
+    test_api.SetDisplayRotation(rotation,
+                                display::Display::RotationSource::ACTIVE);
+    // Cache the original work area.
+    const gfx::Rect origin_work_area =
+        screen_util::GetDisplayWorkAreaBoundsInParent(right_window.get());
+
+    // Enable an on-screen virtual keyboard. The display work area should shrink
+    // the size of intersection between on-screen keyboard and original work
+    // area.
+    keyboard_controller()->ShowKeyboard(/*lock=*/true);
+    const gfx::Rect shrink_work_area =
+        screen_util::GetDisplayWorkAreaBoundsInParent(right_window.get());
+    const gfx::Rect keyboard_bounds =
+        keyboard_controller()->GetKeyboardWindow()->GetBoundsInScreen();
+    EXPECT_EQ(origin_work_area.height() - shrink_work_area.height(),
+              gfx::IntersectRects(keyboard_bounds, origin_work_area).height());
+
+    // Snapping the window will enable Overview, the window's bottom is equal to
+    // the shrunk work area bottom.
+    split_view_controller()->SnapWindow(right_window.get(),
+                                        SplitViewController::RIGHT);
+    EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
+    EXPECT_EQ(right_window->bounds().bottom(), shrink_work_area.bottom());
+
+    // Dismiss on-screen keyboard, the window's bottom is equal to the original
+    // work area bottom.
+    keyboard_controller()->HideKeyboardByUser();
+    EXPECT_EQ(right_window->bounds().bottom(), origin_work_area.bottom());
+    EndSplitView();
+    ExitOverview();
+  }
+}
+
 }  // namespace ash
diff --git a/base/threading/platform_thread_win.cc b/base/threading/platform_thread_win.cc
index 5b179a2..5d01f880 100644
--- a/base/threading/platform_thread_win.cc
+++ b/base/threading/platform_thread_win.cc
@@ -81,9 +81,9 @@
   info.dwFlags = 0;
 
   __try {
-    RaiseException(kVCThreadNameException, 0, sizeof(info)/sizeof(DWORD),
-                   reinterpret_cast<DWORD_PTR*>(&info));
-  } __except(EXCEPTION_CONTINUE_EXECUTION) {
+    RaiseException(kVCThreadNameException, 0, sizeof(info) / sizeof(ULONG_PTR),
+                   reinterpret_cast<ULONG_PTR*>(&info));
+  } __except (EXCEPTION_EXECUTE_HANDLER) {
   }
 }
 
diff --git a/base/trace_event/memory_infra_background_allowlist.cc b/base/trace_event/memory_infra_background_allowlist.cc
index ca4d4a2e..43b482d 100644
--- a/base/trace_event/memory_infra_background_allowlist.cc
+++ b/base/trace_event/memory_infra_background_allowlist.cc
@@ -277,6 +277,7 @@
     "sync/0x?/model_type/DICTIONARY",
     "sync/0x?/model_type/EXTENSION",
     "sync/0x?/model_type/EXTENSION_SETTING",
+    "sync/0x?/model_type/HISTORY",
     "sync/0x?/model_type/HISTORY_DELETE_DIRECTIVE",
     "sync/0x?/model_type/MANAGED_USER",
     "sync/0x?/model_type/MANAGED_USER_SETTING",
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 8b9f2916..4028184 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-8.20220506.2.1
+8.20220509.1.1
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 53ff034..03a1ebb2 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -5682,21 +5682,27 @@
 
 TEST_F(LegacySWPictureLayerImplTest, CompositedImageCalculateContentsScale) {
   gfx::Size layer_bounds(400, 400);
+  gfx::Rect layer_rect(layer_bounds);
+
+  host_impl()->active_tree()->SetDeviceViewportRect(layer_rect);
+
   scoped_refptr<FakeRasterSource> pending_raster_source =
       FakeRasterSource::CreateFilled(layer_bounds);
+  SetupPendingTree(pending_raster_source);
 
-  host_impl()->CreatePendingTree();
   LayerTreeImpl* pending_tree = host_impl()->pending_tree();
+  const int kLayerId = 100;
 
   std::unique_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::Create(pending_tree, root_id(),
+      FakePictureLayerImpl::Create(pending_tree, kLayerId,
                                    pending_raster_source);
   pending_layer->SetDirectlyCompositedImageDefaultRasterScale(
       gfx::Vector2dF(1, 1));
   pending_layer->SetDrawsContent(true);
   FakePictureLayerImpl* pending_layer_ptr = pending_layer.get();
-  pending_tree->SetRootLayerForTesting(std::move(pending_layer));
-  SetupRootProperties(pending_layer_ptr);
+  pending_tree->AddLayer(std::move(pending_layer));
+  CopyProperties(pending_tree->root_layer(), pending_layer_ptr);
+
   UpdateDrawProperties(pending_tree);
 
   SetupDrawPropertiesAndUpdateTiles(pending_layer_ptr, 2.f, 3.f, 4.f);
@@ -5706,23 +5712,26 @@
 TEST_F(LegacySWPictureLayerImplTest, CompositedImageIgnoreIdealContentsScale) {
   gfx::Size layer_bounds(400, 400);
   gfx::Rect layer_rect(layer_bounds);
-  scoped_refptr<FakeRasterSource> pending_raster_source =
-      FakeRasterSource::CreateFilled(layer_bounds);
 
   host_impl()->active_tree()->SetDeviceViewportRect(layer_rect);
-  host_impl()->CreatePendingTree();
+
+  scoped_refptr<FakeRasterSource> pending_raster_source =
+      FakeRasterSource::CreateFilled(layer_bounds);
+  SetupPendingTree(pending_raster_source);
+
   LayerTreeImpl* pending_tree = host_impl()->pending_tree();
+  const int kLayerId = 100;
 
   std::unique_ptr<FakePictureLayerImpl> pending_layer =
-      FakePictureLayerImpl::Create(pending_tree, root_id(),
+      FakePictureLayerImpl::Create(pending_tree, kLayerId,
                                    pending_raster_source);
   pending_layer->SetDirectlyCompositedImageDefaultRasterScale(
       gfx::Vector2dF(1, 1));
   pending_layer->SetDrawsContent(true);
   FakePictureLayerImpl* pending_layer_ptr = pending_layer.get();
-  pending_tree->SetRootLayerForTesting(std::move(pending_layer));
-  pending_tree->SetDeviceViewportRect(layer_rect);
-  SetupRootProperties(pending_layer_ptr);
+  pending_tree->AddLayer(std::move(pending_layer));
+  CopyProperties(pending_tree->root_layer(), pending_layer_ptr);
+
   UpdateDrawProperties(pending_tree);
 
   // Set PictureLayerImpl::ideal_contents_scale_ to 2.f.
@@ -5739,7 +5748,7 @@
   host_impl()->ActivateSyncTree();
 
   FakePictureLayerImpl* active_layer = static_cast<FakePictureLayerImpl*>(
-      host_impl()->active_tree()->root_layer());
+      host_impl()->active_tree()->LayerById(kLayerId));
   SetupDrawPropertiesAndUpdateTiles(active_layer,
                                     suggested_ideal_contents_scale,
                                     device_scale_factor, page_scale_factor);
diff --git a/cc/test/layer_tree_pixel_test.cc b/cc/test/layer_tree_pixel_test.cc
index 37a2d2cc..4e5dac3 100644
--- a/cc/test/layer_tree_pixel_test.cc
+++ b/cc/test/layer_tree_pixel_test.cc
@@ -148,7 +148,7 @@
 }
 
 std::unique_ptr<viz::SkiaOutputSurface>
-LayerTreePixelTest::CreateDisplaySkiaOutputSurfaceOnThread(
+LayerTreePixelTest::CreateSkiaOutputSurfaceOnThread(
     viz::DisplayCompositorMemoryAndTaskController* display_controller) {
   // Set up the SkiaOutputSurfaceImpl.
   auto output_surface = viz::SkiaOutputSurfaceImpl::Create(
@@ -157,8 +157,7 @@
 }
 
 std::unique_ptr<viz::OutputSurface>
-LayerTreePixelTest::CreateDisplayOutputSurfaceOnThread(
-    scoped_refptr<viz::ContextProvider> compositor_context_provider) {
+LayerTreePixelTest::CreateSoftwareOutputSurfaceOnThread() {
   EXPECT_EQ(viz::RendererType::kSoftware, renderer_type_);
   return std::make_unique<PixelTestOutputSurface>(
       std::make_unique<viz::SoftwareOutputDevice>());
diff --git a/cc/test/layer_tree_pixel_test.h b/cc/test/layer_tree_pixel_test.h
index 62fce50..c2b8e14 100644
--- a/cc/test/layer_tree_pixel_test.h
+++ b/cc/test/layer_tree_pixel_test.h
@@ -55,11 +55,10 @@
       override;
   std::unique_ptr<viz::DisplayCompositorMemoryAndTaskController>
   CreateDisplayControllerOnThread() override;
-  std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurfaceOnThread(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurfaceOnThread(
       viz::DisplayCompositorMemoryAndTaskController*) override;
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider) override;
+  std::unique_ptr<viz::OutputSurface> CreateSoftwareOutputSurfaceOnThread()
+      override;
   void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override;
   void InitializeSettings(LayerTreeSettings* settings) override;
 
diff --git a/cc/test/layer_tree_test.cc b/cc/test/layer_tree_test.cc
index d64ddf57..813a39d 100644
--- a/cc/test/layer_tree_test.cc
+++ b/cc/test/layer_tree_test.cc
@@ -609,19 +609,16 @@
     DCHECK(task_runner_provider_->IsImplThread());
     return hooks_->CreateDisplayControllerOnThread();
   }
-  std::unique_ptr<viz::SkiaOutputSurface> CreateDisplaySkiaOutputSurface(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurface(
       viz::DisplayCompositorMemoryAndTaskController* display_controller)
       override {
     DCHECK(task_runner_provider_->IsImplThread());
-    return hooks_->CreateDisplaySkiaOutputSurfaceOnThread(display_controller);
+    return hooks_->CreateSkiaOutputSurfaceOnThread(display_controller);
   }
 
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurface(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider)
-      override {
+  std::unique_ptr<viz::OutputSurface> CreateSoftwareOutputSurface() override {
     DCHECK(task_runner_provider_->IsImplThread());
-    return hooks_->CreateDisplayOutputSurfaceOnThread(
-        std::move(compositor_context_provider));
+    return hooks_->CreateSoftwareOutputSurfaceOnThread();
   }
   void DisplayReceivedLocalSurfaceId(
       const viz::LocalSurfaceId& local_surface_id) override {
@@ -1213,21 +1210,15 @@
 }
 
 std::unique_ptr<viz::SkiaOutputSurface>
-LayerTreeTest::CreateDisplaySkiaOutputSurfaceOnThread(
+LayerTreeTest::CreateSkiaOutputSurfaceOnThread(
     viz::DisplayCompositorMemoryAndTaskController*) {
   return viz::FakeSkiaOutputSurface::Create3d();
 }
 
 std::unique_ptr<viz::OutputSurface>
-LayerTreeTest::CreateDisplayOutputSurfaceOnThread(
-    scoped_refptr<viz::ContextProvider> compositor_context_provider) {
-  // By default the Display shares a context with the LayerTreeHostImpl.
-  if (use_software_renderer()) {
-    return viz::FakeOutputSurface::CreateSoftware(
-        std::make_unique<viz::SoftwareOutputDevice>());
-  }
-  return viz::FakeOutputSurface::Create3d(
-      std::move(compositor_context_provider));
+LayerTreeTest::CreateSoftwareOutputSurfaceOnThread() {
+  return std::make_unique<viz::FakeSoftwareOutputSurface>(
+      std::make_unique<viz::SoftwareOutputDevice>());
 }
 
 void LayerTreeTest::DestroyLayerTreeHost() {
diff --git a/cc/test/layer_tree_test.h b/cc/test/layer_tree_test.h
index 2f30022..f95399a 100644
--- a/cc/test/layer_tree_test.h
+++ b/cc/test/layer_tree_test.h
@@ -198,13 +198,10 @@
       scoped_refptr<viz::RasterContextProvider> worker_context_provider);
   std::unique_ptr<viz::DisplayCompositorMemoryAndTaskController>
   CreateDisplayControllerOnThread() override;
-  std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurfaceOnThread(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurfaceOnThread(
       viz::DisplayCompositorMemoryAndTaskController*) override;
-  // TODO(crbug.com/1247756): This should only ever return SoftwareOutputSurface
-  // after GLRenderer is deleted and can be refactored.
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider) override;
+  std::unique_ptr<viz::OutputSurface> CreateSoftwareOutputSurfaceOnThread()
+      override;
 
   base::SingleThreadTaskRunner* image_worker_task_runner() const {
     return image_worker_->task_runner().get();
diff --git a/cc/test/test_hooks.h b/cc/test/test_hooks.h
index 3e56478..1e079d8 100644
--- a/cc/test/test_hooks.h
+++ b/cc/test/test_hooks.h
@@ -147,11 +147,10 @@
   virtual std::unique_ptr<viz::DisplayCompositorMemoryAndTaskController>
   CreateDisplayControllerOnThread() = 0;
   virtual std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurfaceOnThread(
+  CreateSkiaOutputSurfaceOnThread(
       viz::DisplayCompositorMemoryAndTaskController*) = 0;
   virtual std::unique_ptr<viz::OutputSurface>
-  CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider) = 0;
+  CreateSoftwareOutputSurfaceOnThread() = 0;
 };
 
 }  // namespace cc
diff --git a/cc/test/test_layer_tree_frame_sink.cc b/cc/test/test_layer_tree_frame_sink.cc
index cc078b0..f8e99aa 100644
--- a/cc/test/test_layer_tree_frame_sink.cc
+++ b/cc/test/test_layer_tree_frame_sink.cc
@@ -83,11 +83,10 @@
   if (renderer_settings_.use_skia_renderer) {
     display_controller = test_client_->CreateDisplayController();
     auto output_surface =
-        test_client_->CreateDisplaySkiaOutputSurface(display_controller.get());
+        test_client_->CreateSkiaOutputSurface(display_controller.get());
     display_output_surface = std::move(output_surface);
   } else {
-    display_output_surface =
-        test_client_->CreateDisplayOutputSurface(context_provider());
+    display_output_surface = test_client_->CreateSoftwareOutputSurface();
   }
 
   std::unique_ptr<viz::DisplayScheduler> scheduler;
diff --git a/cc/test/test_layer_tree_frame_sink.h b/cc/test/test_layer_tree_frame_sink.h
index 268f3db6..60558cc 100644
--- a/cc/test/test_layer_tree_frame_sink.h
+++ b/cc/test/test_layer_tree_frame_sink.h
@@ -37,14 +37,9 @@
 
   virtual std::unique_ptr<viz::DisplayCompositorMemoryAndTaskController>
   CreateDisplayController() = 0;
-  virtual std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurface(
+  virtual std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurface(
       viz::DisplayCompositorMemoryAndTaskController*) = 0;
-
-  // This passes the ContextProvider being used by LayerTreeHostImpl which
-  // can be used for the OutputSurface optionally.
-  virtual std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurface(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider) = 0;
+  virtual std::unique_ptr<viz::OutputSurface> CreateSoftwareOutputSurface() = 0;
 
   virtual void DisplayReceivedLocalSurfaceId(
       const viz::LocalSurfaceId& local_surface_id) = 0;
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index b18e59c4..4a32d9b 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -3569,7 +3569,7 @@
 
 class HdrImageTileManagerTest : public CheckerImagingTileManagerTest {
  public:
-  void DecodeHdrImage(const gfx::ColorSpace& raster_cs) {
+  void DecodeHdrImage(const gfx::ColorSpace& output_cs) {
     auto color_space = gfx::ColorSpace::CreateHDR10();
     auto size = gfx::Size(250, 250);
     auto info =
@@ -3586,7 +3586,7 @@
 
     // Add the image to our decoded_image_tracker.
     TargetColorParams target_color_params;
-    target_color_params.color_space = raster_cs;
+    target_color_params.color_space = output_cs;
     host_impl()->tile_manager()->decoded_image_tracker().QueueImageDecode(
         hdr_image, target_color_params, base::DoNothing());
     FlushDecodeTasks();
@@ -3606,8 +3606,8 @@
     SetupPendingTree(raster_source, kTileSize, invalidation);
 
     constexpr float kCustomWhiteLevel = 200.f;
-    auto display_cs = gfx::DisplayColorSpaces(raster_cs);
-    if (raster_cs.IsHDR())
+    auto display_cs = gfx::DisplayColorSpaces(output_cs);
+    if (output_cs.IsHDR())
       display_cs.SetSDRMaxLuminanceNits(kCustomWhiteLevel);
 
     pending_layer()->layer_tree_impl()->SetDisplayColorSpaces(display_cs);
@@ -3628,7 +3628,8 @@
     auto pending_tiles = pending_tiling->AllTilesForTesting();
     ASSERT_FALSE(pending_tiles.empty());
 
-    if (raster_cs.IsHDR()) {
+    const auto raster_cs = gfx::ColorSpace::CreateExtendedSRGB();
+    if (output_cs.IsHDR()) {
       // Only the last tile will have any pending tasks.
       const auto& pending_tasks =
           host_impl()->tile_manager()->decode_tasks_for_testing(
@@ -3647,7 +3648,7 @@
     ASSERT_FALSE(
         host_impl()->tile_manager()->HasScheduledTileTasksForTesting());
 
-    auto expected_format = raster_cs.IsHDR() ? viz::RGBA_F16 : viz::RGBA_8888;
+    auto expected_format = output_cs.IsHDR() ? viz::RGBA_F16 : viz::RGBA_8888;
     auto all_tiles = host_impl()->tile_manager()->AllTilesForTesting();
     for (const auto* tile : all_tiles)
       EXPECT_EQ(expected_format, tile->draw_info().resource_format());
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 8dfd6b2..d1430cc 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -732,7 +732,7 @@
 
 void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(float page_scale_delta) {
   DCHECK(IsMainThread());
-  DCHECK(CommitRequested());
+  DCHECK(syncing_deltas_for_test_ || CommitRequested());
   if (page_scale_delta == 1.f)
     return;
   float page_scale =
@@ -1574,14 +1574,14 @@
 }
 
 void LayerTreeHost::SetPageScaleFromImplSide(float page_scale) {
-  DCHECK(CommitRequested());
+  DCHECK(syncing_deltas_for_test_ || CommitRequested());
   pending_commit_state()->page_scale_factor = page_scale;
   SetPropertyTreesNeedRebuild();
 }
 
 void LayerTreeHost::SetElasticOverscrollFromImplSide(
     gfx::Vector2dF elastic_overscroll) {
-  DCHECK(CommitRequested());
+  DCHECK(syncing_deltas_for_test_ || CommitRequested());
   pending_commit_state()->elastic_overscroll = elastic_overscroll;
 }
 
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 027c2ea0..1c9e630 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -841,6 +841,14 @@
     return base::AutoReset<bool>(&in_composite_for_test_, true);
   }
 
+  // Blink compositor unit tests sometimes want to simulate pushing deltas
+  // without going through the whole lifecycle to test the effects of the
+  // deltas. This flag turns off DCHECKs that deltas being set to main are
+  // during a commit phase so these tests can do this.
+  [[nodiscard]] base::AutoReset<bool> SimulateSyncingDeltasForTesting() {
+    return base::AutoReset<bool>(&syncing_deltas_for_test_, true);
+  }
+
  protected:
   LayerTreeHost(InitParams params, CompositorMode mode);
 
@@ -1020,6 +1028,8 @@
 
   bool in_composite_for_test_ = false;
 
+  bool syncing_deltas_for_test_ = false;
+
   // Used to vend weak pointers to LayerTreeHost to ScopedDeferMainFrameUpdate
   // objects.
   base::WeakPtrFactory<LayerTreeHost> defer_main_frame_update_weak_ptr_factory_{
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 8879c58a..729975a8d 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1892,11 +1892,19 @@
   if (!hdr_color_space.IsValid())
     return params;
 
-  // It's expensive to rasterize in HDR, so we only want to do so when we know
-  // we have HDR content to rasterize.
-  if (hdr_color_space.IsHDR() &&
-      content_color_usage != gfx::ContentColorUsage::kHDR) {
-    params.color_space = gfx::ColorSpace::CreateDisplayP3D65();
+  if (hdr_color_space.IsHDR()) {
+    if (content_color_usage == gfx::ContentColorUsage::kHDR) {
+      // Rasterization of HDR content is always done in extended-sRGB space.
+      params.color_space = gfx::ColorSpace::CreateExtendedSRGB();
+
+      // Only report the HDR capabilities if they are requested.
+      params.hdr_max_luminance_relative =
+          display_cs.GetHDRMaxLuminanceRelative();
+    } else {
+      // If the content is not HDR, then use Display P3 as the rasterization
+      // color space.
+      params.color_space = gfx::ColorSpace::CreateDisplayP3D65();
+    }
     return params;
   }
 
@@ -1906,10 +1914,6 @@
     params.color_space = hdr_color_space;
   }
 
-  // Only report the HDR capabilities if they are requested.
-  if (content_color_usage == gfx::ContentColorUsage::kHDR)
-    params.hdr_max_luminance_relative = display_cs.GetHDRMaxLuminanceRelative();
-
   return params;
 }
 
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 5608e35..7685dcc 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -11659,17 +11659,15 @@
     // there is no overlay support.
     return nullptr;
   }
-  std::unique_ptr<viz::SkiaOutputSurface> CreateDisplaySkiaOutputSurface(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurface(
       viz::DisplayCompositorMemoryAndTaskController*) override {
     return viz::FakeSkiaOutputSurface::Create3d(
         std::move(display_context_provider_));
   }
 
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurface(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider)
-      override {
-    return viz::FakeOutputSurface::Create3d(
-        std::move(display_context_provider_));
+  std::unique_ptr<viz::OutputSurface> CreateSoftwareOutputSurface() override {
+    NOTREACHED();
+    return nullptr;
   }
 
   void DisplayReceivedLocalSurfaceId(
@@ -15832,7 +15830,7 @@
 }
 
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, UpdatePageScaleFactorOnActiveTree) {
-  // Check page scale factor update in property trees when an update is made
+  // Check page scale factor updates the property trees when an update is made
   // on the active tree.
   CreatePendingTree();
   host_impl_->pending_tree()->PushPageScaleFromMainThread(1, 1, 3);
@@ -15851,20 +15849,26 @@
   EXPECT_EQ(gfx::Vector2dF(2, 2), active_tree_node->local.To2dScale());
   EXPECT_EQ(gfx::Point3F(), active_tree_node->origin);
   EXPECT_EQ(2, host_impl_->active_tree()->current_page_scale_factor());
-
-  TransformNode* pending_tree_node =
-      host_impl_->pending_tree()->PageScaleTransformNode();
-  // Before pending tree updates draw properties, its properties are still
-  // based on 1.0 page scale, except for current_page_scale_factor() which is a
-  // shared data between the active and pending trees.
-  EXPECT_TRUE(pending_tree_node->local.IsIdentity());
-  EXPECT_EQ(gfx::Point3F(), pending_tree_node->origin);
-  EXPECT_EQ(2, host_impl_->pending_tree()->current_page_scale_factor());
-  EXPECT_EQ(1, host_impl_->pending_tree()
+  EXPECT_EQ(2, host_impl_->active_tree()
                    ->property_trees()
                    ->transform_tree()
                    .page_scale_factor());
 
+  TransformNode* pending_tree_node =
+      host_impl_->pending_tree()->PageScaleTransformNode();
+
+  // Since the pending tree shares the scale factor with the active tree, its
+  // value and property trees should also have been updated.
+  EXPECT_TRUE(pending_tree_node->local.IsScale2d());
+  EXPECT_EQ(gfx::Vector2dF(2, 2), pending_tree_node->local.To2dScale());
+  EXPECT_EQ(gfx::Point3F(), pending_tree_node->origin);
+  EXPECT_EQ(2, host_impl_->pending_tree()->current_page_scale_factor());
+  EXPECT_EQ(2, host_impl_->pending_tree()
+                   ->property_trees()
+                   ->transform_tree()
+                   .page_scale_factor());
+
+  // Update draw properties doesn't change the correct values
   host_impl_->pending_tree()->set_needs_update_draw_properties();
   UpdateDrawProperties(host_impl_->pending_tree());
   pending_tree_node = host_impl_->pending_tree()->PageScaleTransformNode();
@@ -16338,7 +16342,7 @@
   EXPECT_EQ(wcg_params.sdr_max_luminance_nits, kCustomWhiteLevel);
   EXPECT_EQ(wcg_params.hdr_max_luminance_relative, 1.f);
 
-  EXPECT_EQ(hdr_params.color_space, hdr);
+  EXPECT_EQ(hdr_params.color_space, gfx::ColorSpace::CreateExtendedSRGB());
   EXPECT_EQ(hdr_params.sdr_max_luminance_nits, kCustomWhiteLevel);
   EXPECT_EQ(hdr_params.hdr_max_luminance_relative, kHDRMaxLuminanceRelative);
 }
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 0f8da93..78a05743 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -79,6 +79,7 @@
 #include "components/viz/common/quads/draw_quad.h"
 #include "components/viz/common/quads/tile_draw_quad.h"
 #include "components/viz/service/display/output_surface.h"
+#include "components/viz/service/display/skia_output_surface.h"
 #include "components/viz/test/begin_frame_args_test.h"
 #include "components/viz/test/fake_output_surface.h"
 #include "components/viz/test/test_gles2_interface.h"
@@ -7387,30 +7388,6 @@
 // thread.
 MULTI_THREAD_TEST_F(LayerTreeHostTestCrispUpAfterPinchEnds);
 
-class LayerTreeHostTestCrispUpAfterPinchEndsWithOneCopy
-    : public LayerTreeHostTestCrispUpAfterPinchEnds {
- protected:
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider)
-      override {
-    scoped_refptr<viz::TestContextProvider> display_context_provider =
-        viz::TestContextProvider::Create();
-    viz::TestGLES2Interface* gl =
-        display_context_provider->UnboundTestContextGL();
-    gl->set_support_sync_query(true);
-#if BUILDFLAG(IS_MAC)
-    gl->set_support_texture_rectangle(true);
-#endif
-    display_context_provider->BindToCurrentThread();
-    return LayerTreeTest::CreateDisplayOutputSurfaceOnThread(
-        std::move(display_context_provider));
-  }
-};
-
-// This test does pinching on the impl side which is not supported in single
-// thread.
-MULTI_THREAD_TEST_F(LayerTreeHostTestCrispUpAfterPinchEndsWithOneCopy);
-
 class RasterizeWithGpuRasterizationCreatesResources : public LayerTreeHostTest {
  protected:
   void SetUpUnboundContextProviders(
diff --git a/cc/trees/layer_tree_host_unittest_copyrequest.cc b/cc/trees/layer_tree_host_unittest_copyrequest.cc
index ce695f6..992af86c 100644
--- a/cc/trees/layer_tree_host_unittest_copyrequest.cc
+++ b/cc/trees/layer_tree_host_unittest_copyrequest.cc
@@ -204,26 +204,12 @@
     return nullptr;
   }
 
-  std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurfaceOnThread(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurfaceOnThread(
       viz::DisplayCompositorMemoryAndTaskController*) override {
     auto skia_output_surface = viz::FakeSkiaOutputSurface::Create3d();
     skia_output_surface->SetOutOfOrderCallbacks(true);
     return skia_output_surface;
   }
-
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider)
-      override {
-    // Since this test does not override CreateLayerTreeFrameSink, the
-    // |compositor_context_provider| will be a viz::TestContextProvider.
-    auto* context_support = static_cast<viz::TestContextSupport*>(
-        compositor_context_provider->ContextSupport());
-    context_support->set_out_of_order_callbacks(true);
-
-    return viz::FakeOutputSurface::Create3d(
-        std::move(compositor_context_provider));
-  }
 };
 
 INSTANTIATE_TEST_SUITE_P(
@@ -888,25 +874,13 @@
     // and there is no overlay support.
     return nullptr;
   }
-  std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurfaceOnThread(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurfaceOnThread(
       viz::DisplayCompositorMemoryAndTaskController*) override {
     display_context_provider_ = viz::TestContextProvider::Create();
     display_context_provider_->BindToCurrentThread();
     return viz::FakeSkiaOutputSurface::Create3d(display_context_provider_);
   }
 
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider)
-      override {
-    // Since this test does not override CreateLayerTreeFrameSink, the
-    // |compositor_context_provider| will be a viz::TestContextProvider.
-    display_context_provider_ = static_cast<viz::TestContextProvider*>(
-        compositor_context_provider.get());
-    return viz::FakeOutputSurface::Create3d(
-        std::move(compositor_context_provider));
-  }
-
   void SetupTree() override {
     root_ = FakePictureLayer::Create(&client_);
     root_->SetBounds(gfx::Size(20, 20));
@@ -1045,25 +1019,13 @@
     // and there is no overlay support.
     return nullptr;
   }
-  std::unique_ptr<viz::SkiaOutputSurface>
-  CreateDisplaySkiaOutputSurfaceOnThread(
+  std::unique_ptr<viz::SkiaOutputSurface> CreateSkiaOutputSurfaceOnThread(
       viz::DisplayCompositorMemoryAndTaskController*) override {
     display_context_provider_ = viz::TestContextProvider::Create();
     display_context_provider_->BindToCurrentThread();
     return viz::FakeSkiaOutputSurface::Create3d(display_context_provider_);
   }
 
-  std::unique_ptr<viz::OutputSurface> CreateDisplayOutputSurfaceOnThread(
-      scoped_refptr<viz::ContextProvider> compositor_context_provider)
-      override {
-    // Since this test does not override CreateLayerTreeFrameSink, the
-    // |compositor_context_provider| will be a viz::TestContextProvider.
-    display_context_provider_ = static_cast<viz::TestContextProvider*>(
-        compositor_context_provider.get());
-    return viz::FakeOutputSurface::Create3d(
-        std::move(compositor_context_provider));
-  }
-
   void SetupTree() override {
     // The layers in this test have solid color content, so they don't
     // actually allocate any textures, making counting easier.
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index e6d81ea..f291aa4c 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -1180,10 +1180,8 @@
   DCHECK(IsActiveTree());
   DCHECK(lifecycle().AllowsPropertyTreeAccess());
   float clamped_page_scale = ClampPageScaleFactorToLimits(active_page_scale);
-  if (page_scale_factor()->SetCurrent(clamped_page_scale)) {
+  if (page_scale_factor()->SetCurrent(clamped_page_scale))
     DidUpdatePageScale();
-    UpdatePageScaleNode();
-  }
 }
 
 void LayerTreeImpl::PushPageScaleFromMainThread(float page_scale_factor,
@@ -1214,10 +1212,6 @@
 
   if (changed_page_scale)
     DidUpdatePageScale();
-
-  DCHECK(lifecycle().AllowsPropertyTreeAccess());
-  if (page_scale_factor)
-    UpdatePageScaleNode();
 }
 
 void LayerTreeImpl::SetBrowserControlsParams(
@@ -1322,27 +1316,33 @@
 }
 
 void LayerTreeImpl::DidUpdatePageScale() {
-  if (IsActiveTree())
+  if (IsActiveTree()) {
     page_scale_factor()->SetCurrent(
         ClampPageScaleFactorToLimits(current_page_scale_factor()));
 
-  set_needs_update_draw_properties();
+    // Ensure the other trees are kept in sync.
+    if (host_impl_->pending_tree())
+      host_impl_->pending_tree()->DidUpdatePageScale();
+    if (host_impl_->recycle_tree())
+      host_impl_->recycle_tree()->DidUpdatePageScale();
 
-  // Viewport scrollbar sizes depend on the page scale factor.
-  SetScrollbarGeometriesNeedUpdate();
-
-  if (IsActiveTree()) {
     if (settings().scrollbar_flash_after_any_scroll_update) {
       host_impl_->FlashAllScrollbars(true);
-      return;
-    }
-    if (auto* scroll_node = host_impl_->OuterViewportScrollNode()) {
+    } else if (auto* scroll_node = host_impl_->OuterViewportScrollNode()) {
       if (ScrollbarAnimationController* controller =
               host_impl_->ScrollbarAnimationControllerForElementId(
                   scroll_node->element_id))
         controller->DidScrollUpdate();
     }
   }
+
+  DCHECK(lifecycle().AllowsPropertyTreeAccess());
+  UpdatePageScaleNode();
+
+  set_needs_update_draw_properties();
+
+  // Viewport scrollbar sizes depend on the page scale factor.
+  SetScrollbarGeometriesNeedUpdate();
 }
 
 void LayerTreeImpl::SetDeviceScaleFactor(float device_scale_factor) {
diff --git a/chrome/VERSION b/chrome/VERSION
index 7850a5e..7ffa591 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=103
 MINOR=0
-BUILD=5048
+BUILD=5053
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplier.java
index 2cf322ad..47635c0f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplier.java
@@ -6,44 +6,51 @@
 
 import android.os.SystemClock;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.Callback;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.supplier.OneshotSupplier;
 import org.chromium.base.supplier.OneshotSupplierImpl;
 import org.chromium.components.signin.AccountManagerFacade;
-import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
 
 /**
  * Fetches the child account status to be used by other FRE components.
  *
- * TODO(https://crbug.com/1320374): Check app restrictions to speed up this listener.
+ * This class checks app restrictions for Chrome to obtain the child account status faster. This
+ * optimisation leverages the fact that FamilyLink always pushes some policies for Chrome on
+ * supervised devices. So, if there are no app restrictions specified for Chrome -
+ * {@link ChildAccountStatusSupplier} will consider that the child account status is false.
+ * Note: this optimisation creates a potential conflict if there are no app restrictions on
+ * a supervised device. However, this should never happen on real devices.
  */
 public class ChildAccountStatusSupplier implements OneshotSupplier<Boolean> {
     private final OneshotSupplierImpl<Boolean> mValue = new OneshotSupplierImpl<>();
+    private final long mChildAccountStatusStartTime;
+
+    private Boolean mHasRestriction;
+    private Boolean mChildAccountStatusFromAccountManagerFacade;
 
     /**
-     * Creates ChildAccountStatusSupplier. This doesn't actually start fetching the child account
-     * status until {@link #startFetchingChildAccountStatus()} is invoked.
+     * Creates ChildAccountStatusSupplier and starts fetching the child account status.
+     * @param accountManagerFacade {@link AccountManagerFacade} instance to use for getting accounts
+     * @param appRestrictionInfo Optional instance of {@link FirstRunAppRestrictionInfo} that can
+     *         be used to check app restrictions (see class-level JavaDoc). If null is passed - this
+     *         {@link ChildAccountStatusSupplier} will ignore app restrictions and rely solely on
+     *         {@link AccountManagerFacade}.
      */
-    public ChildAccountStatusSupplier() {}
+    public ChildAccountStatusSupplier(AccountManagerFacade accountManagerFacade,
+            @Nullable FirstRunAppRestrictionInfo appRestrictionInfo) {
+        mChildAccountStatusStartTime = SystemClock.elapsedRealtime();
 
-    /**
-     * Starts the process to obtain the child account status from {@link AccountManagerFacade}.
-     * Should be invoked after AccountManagerFacade instance has been already set.
-     *
-     * TODO(https://crbug.com/1320487): Add Supplier to AccountManagerFacadeProvider and remove this
-     *                                  method.
-     */
-    public void startFetchingChildAccountStatus() {
-        long childAccountStatusStart = SystemClock.elapsedRealtime();
-        AccountManagerFacadeProvider.getInstance().getAccounts().then(accounts -> {
-            AccountUtils.checkChildAccountStatus(
-                    AccountManagerFacadeProvider.getInstance(), accounts, (isChild, account) -> {
-                        RecordHistogram.recordTimesHistogram("MobileFre.ChildAccountStatusDuration",
-                                SystemClock.elapsedRealtime() - childAccountStatusStart);
-                        mValue.set(isChild);
-                    });
+        if (appRestrictionInfo != null) {
+            appRestrictionInfo.getHasAppRestriction(this::onAppRestrictionDetected);
+        }
+
+        accountManagerFacade.getAccounts().then(accounts -> {
+            AccountUtils.checkChildAccountStatus(accountManagerFacade, accounts,
+                    (isChild, account) -> onChildAccountStatusReady(isChild));
         });
     }
 
@@ -56,4 +63,43 @@
     public Boolean get() {
         return mValue.get();
     }
+
+    private void onAppRestrictionDetected(boolean hasAppRestriction) {
+        mHasRestriction = hasAppRestriction;
+        setSupplierIfDecidable();
+    }
+
+    private void onChildAccountStatusReady(boolean isChild) {
+        mChildAccountStatusFromAccountManagerFacade = isChild;
+        setSupplierIfDecidable();
+    }
+
+    private void setSupplierIfDecidable() {
+        // Early return if the value has been set.
+        if (mValue.get() != null) return;
+
+        Boolean value = tryCalculateSupplierValue();
+        if (value == null) return;
+
+        RecordHistogram.recordTimesHistogram("MobileFre.ChildAccountStatusDuration",
+                SystemClock.elapsedRealtime() - mChildAccountStatusStartTime);
+        mValue.set(value);
+    }
+
+    private @Nullable Boolean tryCalculateSupplierValue() {
+        if (mChildAccountStatusFromAccountManagerFacade != null) {
+            // Child account status from AccountManagerFacade is more reliable than app
+            // restrictions, so use it if available.
+            return mChildAccountStatusFromAccountManagerFacade;
+        }
+
+        boolean confirmedNoAppRestriction = mHasRestriction != null && !mHasRestriction;
+        if (confirmedNoAppRestriction) {
+            // No app restriction is found. On real devices this means that there are no child
+            // accounts on the device, as FamilyLink pushes some policies for supervised devices.
+            return false;
+        }
+        // Otherwise, we can't determine the supplier value yet.
+        return null;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java
index 7617ea6..0c177fb7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunActivityBase.java
@@ -23,7 +23,10 @@
 import org.chromium.chrome.browser.metrics.UmaUtils;
 import org.chromium.chrome.browser.policy.PolicyServiceFactory;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
+import org.chromium.chrome.browser.signin.services.FREMobileIdentityConsistencyFieldTrial;
 import org.chromium.components.policy.PolicyService;
+import org.chromium.components.signin.AccountManagerFacade;
+import org.chromium.components.signin.AccountManagerFacadeProvider;
 
 /** Base class for First Run Experience. */
 public abstract class FirstRunActivityBase extends AsyncInitializationActivity {
@@ -52,17 +55,17 @@
     private final FirstRunAppRestrictionInfo mFirstRunAppRestrictionInfo;
     private final OneshotSupplierImpl<PolicyService> mPolicyServiceSupplier;
     private final PolicyLoadListener mPolicyLoadListener;
-    private final ChildAccountStatusSupplier mChildAccountStatusSupplier;
 
     private final long mStartTime;
     private long mNativeInitializedTime;
 
+    private ChildAccountStatusSupplier mChildAccountStatusSupplier;
+
     public FirstRunActivityBase() {
         mFirstRunAppRestrictionInfo = FirstRunAppRestrictionInfo.takeMaybeInitialized();
         mPolicyServiceSupplier = new OneshotSupplierImpl<>();
         mPolicyLoadListener =
                 new PolicyLoadListener(mFirstRunAppRestrictionInfo, mPolicyServiceSupplier);
-        mChildAccountStatusSupplier = new ChildAccountStatusSupplier();
         mStartTime = SystemClock.elapsedRealtime();
         mPolicyLoadListener.onAvailable(this::onPolicyLoadListenerAvailable);
     }
@@ -81,9 +84,14 @@
     @Override
     @CallSuper
     public void triggerLayoutInflation() {
-        // ChildAccountStatusSupplier can't be created in the constructor, as AccountManagerFacade
-        // instance is not set yet there.
-        mChildAccountStatusSupplier.startFetchingChildAccountStatus();
+        AccountManagerFacade accountManagerFacade = AccountManagerFacadeProvider.getInstance();
+        if (FREMobileIdentityConsistencyFieldTrial.isEnabled()) {
+            mChildAccountStatusSupplier = new ChildAccountStatusSupplier(
+                    accountManagerFacade, mFirstRunAppRestrictionInfo);
+        } else {
+            mChildAccountStatusSupplier =
+                    new ChildAccountStatusSupplier(accountManagerFacade, null);
+        }
     }
 
     // Activity:
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunActivitySigninAndSyncTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunActivitySigninAndSyncTest.java
index 3b11961..c66b931 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunActivitySigninAndSyncTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunActivitySigninAndSyncTest.java
@@ -29,6 +29,7 @@
 import androidx.test.filters.MediumTest;
 
 import org.hamcrest.Matcher;
+import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -36,6 +37,7 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
@@ -86,6 +88,9 @@
     @Mock
     private LocaleManagerDelegate mLocalManagerDelegateMock;
 
+    @Mock
+    private FirstRunAppRestrictionInfo mFirstRunAppRestrictionInfoMock;
+
     @Before
     public void setUp() {
         when(mLocalManagerDelegateMock.getSearchEnginePromoShowType())
@@ -97,6 +102,11 @@
         ExternalAuthUtils.setInstanceForTesting(mExternalAuthUtilsMock);
     }
 
+    @After
+    public void tearDown() {
+        FirstRunAppRestrictionInfo.setInitializedInstanceForTest(null);
+    }
+
     @Test
     @MediumTest
     public void dismissButtonClickSkipsSyncConsentPageWhenNoAccountsAreOnDevice() {
@@ -136,6 +146,9 @@
     @Test
     @MediumTest
     public void continueButtonClickShowsSyncConsentPageWithChildAccount() {
+        // ChildAccountStatusSupplier uses AppRestrictions to quickly detect non-supervised cases.
+        Mockito.doNothing().when(mFirstRunAppRestrictionInfoMock).getHasAppRestriction(any());
+        FirstRunAppRestrictionInfo.setInitializedInstanceForTest(mFirstRunAppRestrictionInfoMock);
         mAccountManagerTestRule.addAccount(CHILD_EMAIL);
         launchFirstRunActivity();
         ensureCurrentPageIs(SigninFirstRunFragment.class);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
index 2464e025..911a1be 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
@@ -913,6 +913,9 @@
     @CommandLineFlags.Remove({ChromeSwitches.FORCE_DISABLE_SIGNIN_FRE})
     @CommandLineFlags.Add({ChromeSwitches.FORCE_ENABLE_SIGNIN_FRE})
     public void testSigninFirstRunPageShownBeforeChildStatusFetch() throws Exception {
+        // ChildAccountStatusSupplier uses AppRestrictions to quickly detect non-supervised cases,
+        // so pretend there are AppRestrictions set by FamilyLink.
+        setHasAppRestrictionForMock(true);
         blockOnFlowIsKnown();
         initializePreferences(new FirstRunPagesTestCase());
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplierTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplierTest.java
index 8385466..97324c6 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplierTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/ChildAccountStatusSupplierTest.java
@@ -8,21 +8,29 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.os.Looper;
 
 import org.junit.After;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 import org.robolectric.annotation.Config;
 
-import org.chromium.base.metrics.UmaRecorderHolder;
+import org.chromium.base.Callback;
 import org.chromium.base.metrics.test.ShadowRecordHistogram;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
+import org.chromium.components.signin.test.util.FakeAccountManagerFacade;
 
 /**
  * Tests for {@link ChildAccountStatusSupplier}.
@@ -34,38 +42,41 @@
     private static final String CHILD_ACCOUNT_EMAIL =
             AccountManagerTestRule.generateChildEmail(/*baseName=*/"account@gmail.com");
 
+    FakeAccountManagerFacade mAccountManagerFacade = new FakeAccountManagerFacade();
     @Rule
-    public final AccountManagerTestRule mAccountManagerTestRule = new AccountManagerTestRule();
+    public final AccountManagerTestRule mAccountManagerTestRule =
+            new AccountManagerTestRule(mAccountManagerFacade);
 
-    private ChildAccountStatusSupplier mSupplier;
+    @Rule
+    public MockitoRule mMockitoRule = MockitoJUnit.rule();
 
-    @Before
-    public void setUp() {
-        mSupplier = new ChildAccountStatusSupplier();
-    }
+    @Captor
+    public ArgumentCaptor<Callback<Boolean>> mCallbackCaptor;
+    @Mock
+    private FirstRunAppRestrictionInfo mFirstRunAppRestrictionInfoMock;
 
     @After
     public void tearDown() {
-        UmaRecorderHolder.resetForTesting();
         ShadowRecordHistogram.reset();
     }
 
     @Test
-    public void testUnsetByDefault() {
+    public void testNoAccounts() {
+        mAccountManagerFacade.blockGetAccounts();
+        ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier(
+                mAccountManagerFacade, mFirstRunAppRestrictionInfoMock);
+        shadowOf(Looper.getMainLooper()).idle();
         // Supplier shouldn't be set and should not record any histograms until it can obtain the
         // list of accounts from AccountManagerFacade.
-        assertNull(mSupplier.get());
+        assertNull(supplier.get());
         assertEquals(0,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         "MobileFre.ChildAccountStatusDuration"));
-    }
 
-    @Test
-    public void testNoAccounts() {
-        mSupplier.startFetchingChildAccountStatus();
+        mAccountManagerFacade.unblockGetAccounts();
         shadowOf(Looper.getMainLooper()).idle();
 
-        assertFalse(mSupplier.get());
+        assertFalse(supplier.get());
         assertEquals(1,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         "MobileFre.ChildAccountStatusDuration"));
@@ -75,10 +86,11 @@
     public void testOneChildAccount() {
         mAccountManagerTestRule.addAccount(CHILD_ACCOUNT_EMAIL);
 
-        mSupplier.startFetchingChildAccountStatus();
+        ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier(
+                mAccountManagerFacade, mFirstRunAppRestrictionInfoMock);
         shadowOf(Looper.getMainLooper()).idle();
 
-        assertTrue(mSupplier.get());
+        assertTrue(supplier.get());
         assertEquals(1,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         "MobileFre.ChildAccountStatusDuration"));
@@ -88,10 +100,11 @@
     public void testNonChildAccount() {
         mAccountManagerTestRule.addAccount(ADULT_ACCOUNT_EMAIL);
 
-        mSupplier.startFetchingChildAccountStatus();
+        ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier(
+                mAccountManagerFacade, mFirstRunAppRestrictionInfoMock);
         shadowOf(Looper.getMainLooper()).idle();
 
-        assertFalse(mSupplier.get());
+        assertFalse(supplier.get());
         assertEquals(1,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         "MobileFre.ChildAccountStatusDuration"));
@@ -102,10 +115,62 @@
         mAccountManagerTestRule.addAccount(CHILD_ACCOUNT_EMAIL);
         mAccountManagerTestRule.addAccount(ADULT_ACCOUNT_EMAIL);
 
-        mSupplier.startFetchingChildAccountStatus();
+        ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier(
+                mAccountManagerFacade, mFirstRunAppRestrictionInfoMock);
         shadowOf(Looper.getMainLooper()).idle();
 
-        assertTrue(mSupplier.get());
+        assertTrue(supplier.get());
+        assertEquals(1,
+                ShadowRecordHistogram.getHistogramTotalCountForTesting(
+                        "MobileFre.ChildAccountStatusDuration"));
+    }
+
+    @Test
+    public void testNonChildWhenNoAppRestrictions() {
+        mAccountManagerTestRule.addAccount(ADULT_ACCOUNT_EMAIL);
+        // Block getAccounts call to make sure ChildAccountStatusSupplier checks app restrictions.
+        mAccountManagerFacade.blockGetAccounts();
+        doNothing()
+                .when(mFirstRunAppRestrictionInfoMock)
+                .getHasAppRestriction(mCallbackCaptor.capture());
+        ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier(
+                mAccountManagerFacade, mFirstRunAppRestrictionInfoMock);
+        shadowOf(Looper.getMainLooper()).idle();
+        assertNull(supplier.get());
+
+        Callback<Boolean> getHasAppRestrictionsCallback = mCallbackCaptor.getValue();
+        getHasAppRestrictionsCallback.onResult(false);
+
+        // No app restrictions should mean that the child account status is false.
+        assertFalse(supplier.get());
+        assertEquals(1,
+                ShadowRecordHistogram.getHistogramTotalCountForTesting(
+                        "MobileFre.ChildAccountStatusDuration"));
+    }
+
+    @Test
+    public void testWaitsForAccountManagerFacadeWhenAppRestrictionsFound() {
+        mAccountManagerTestRule.addAccount(CHILD_ACCOUNT_EMAIL);
+        // Block getAccounts call to make sure ChildAccountStatusSupplier checks app restrictions.
+        mAccountManagerFacade.blockGetAccounts();
+        doAnswer(invocation -> {
+            Callback<Boolean> callback = invocation.getArgument(0);
+            callback.onResult(true);
+            return null;
+        })
+                .when(mFirstRunAppRestrictionInfoMock)
+                .getHasAppRestriction(any());
+        ChildAccountStatusSupplier supplier = new ChildAccountStatusSupplier(
+                mAccountManagerFacade, mFirstRunAppRestrictionInfoMock);
+        shadowOf(Looper.getMainLooper()).idle();
+        // Since app restrictions were found - ChildAccountSupplier should wait for status from
+        // AccountManagerFacade, so the status shouldn't be available yet.
+        assertNull(supplier.get());
+
+        mAccountManagerFacade.unblockGetAccounts();
+        shadowOf(Looper.getMainLooper()).idle();
+
+        assertTrue(supplier.get());
         assertEquals(1,
                 ShadowRecordHistogram.getHistogramTotalCountForTesting(
                         "MobileFre.ChildAccountStatusDuration"));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
index 155c85715..69f6afb3 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencerTest.java
@@ -39,6 +39,7 @@
 import org.chromium.chrome.browser.signin.services.IdentityServicesProvider;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
+import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
 import org.chromium.components.signin.identitymanager.IdentityManager;
 
@@ -95,22 +96,10 @@
         public Bundle returnedBundle;
         public boolean calledOnFlowIsKnown;
 
-        private final ChildAccountStatusSupplier mChildAccountStatusSupplier;
-
         public TestFirstRunFlowSequencer(Activity activity) {
-            this(activity, new ChildAccountStatusSupplier());
-        }
-
-        private TestFirstRunFlowSequencer(
-                Activity activity, ChildAccountStatusSupplier childAccountStatusSupplier) {
-            super(activity, childAccountStatusSupplier);
-            mChildAccountStatusSupplier = childAccountStatusSupplier;
-        }
-
-        @Override
-        public void start() {
-            super.start();
-            mChildAccountStatusSupplier.startFetchingChildAccountStatus();
+            super(activity,
+                    new ChildAccountStatusSupplier(
+                            AccountManagerFacadeProvider.getInstance(), null));
         }
 
         @Override
@@ -128,7 +117,7 @@
     private IdentityManager mIdentityManagerMock;
 
     private ActivityController<Activity> mActivityController;
-    private TestFirstRunFlowSequencer mSequencer;
+    private Activity mActivity;
     private TestFirstRunFlowSequencerDelegate mDelegate;
 
     @Before
@@ -141,10 +130,9 @@
         when(mIdentityManagerMock.hasPrimaryAccount(ConsentLevel.SYNC)).thenReturn(false);
 
         mActivityController = Robolectric.buildActivity(Activity.class);
-        Activity activity = mActivityController.setup().get();
+        mActivity = mActivityController.setup().get();
         mDelegate = new TestFirstRunFlowSequencerDelegate();
         FirstRunFlowSequencer.setDelegateForTesting(mDelegate);
-        mSequencer = new TestFirstRunFlowSequencer(activity);
     }
 
     @After
@@ -160,12 +148,13 @@
         mDelegate.isSyncAllowed = true;
         mDelegate.shouldSkipFirstUseHints = false;
 
-        mSequencer.start();
+        TestFirstRunFlowSequencer sequencer = new TestFirstRunFlowSequencer(mActivity);
+        sequencer.start();
 
         verifyNumberOfAccountsRecorded(0);
-        assertTrue(mSequencer.calledOnFlowIsKnown);
+        assertTrue(sequencer.calledOnFlowIsKnown);
 
-        Bundle bundle = mSequencer.returnedBundle;
+        Bundle bundle = sequencer.returnedBundle;
         assertTrue(bundle.getBoolean(FirstRunActivityBase.SHOW_SYNC_CONSENT_PAGE));
         assertFalse(bundle.getBoolean(FirstRunActivityBase.SHOW_SEARCH_ENGINE_PAGE));
         assertFalse(bundle.getBoolean(SyncConsentFirstRunFragment.IS_CHILD_ACCOUNT));
@@ -179,12 +168,13 @@
         mDelegate.isSyncAllowed = true;
         mDelegate.shouldSkipFirstUseHints = false;
 
-        mSequencer.start();
+        TestFirstRunFlowSequencer sequencer = new TestFirstRunFlowSequencer(mActivity);
+        sequencer.start();
 
         verifyNumberOfAccountsRecorded(1);
-        assertTrue(mSequencer.calledOnFlowIsKnown);
+        assertTrue(sequencer.calledOnFlowIsKnown);
 
-        Bundle bundle = mSequencer.returnedBundle;
+        Bundle bundle = sequencer.returnedBundle;
         assertTrue(bundle.getBoolean(FirstRunActivityBase.SHOW_SYNC_CONSENT_PAGE));
         assertFalse(bundle.getBoolean(FirstRunActivityBase.SHOW_SEARCH_ENGINE_PAGE));
         assertTrue(bundle.getBoolean(SyncConsentFirstRunFragment.IS_CHILD_ACCOUNT));
@@ -198,12 +188,13 @@
         mDelegate.shouldSkipFirstUseHints = false;
         mDelegate.shouldShowSearchEnginePage = true;
 
-        mSequencer.start();
+        TestFirstRunFlowSequencer sequencer = new TestFirstRunFlowSequencer(mActivity);
+        sequencer.start();
 
         verifyNumberOfAccountsRecorded(0);
-        assertTrue(mSequencer.calledOnFlowIsKnown);
+        assertTrue(sequencer.calledOnFlowIsKnown);
 
-        Bundle bundle = mSequencer.returnedBundle;
+        Bundle bundle = sequencer.returnedBundle;
         assertTrue(bundle.getBoolean(FirstRunActivityBase.SHOW_SYNC_CONSENT_PAGE));
         assertTrue(bundle.getBoolean(FirstRunActivityBase.SHOW_SEARCH_ENGINE_PAGE));
         assertFalse(bundle.getBoolean(SyncConsentFirstRunFragment.IS_CHILD_ACCOUNT));
@@ -219,11 +210,12 @@
         mDelegate.shouldSkipFirstUseHints = false;
         mDelegate.shouldShowSearchEnginePage = false;
 
-        mSequencer.start();
+        TestFirstRunFlowSequencer sequencer = new TestFirstRunFlowSequencer(mActivity);
+        sequencer.start();
 
         verifyNumberOfAccountsRecorded(0);
-        assertTrue(mSequencer.calledOnFlowIsKnown);
-        final Bundle bundle = mSequencer.returnedBundle;
+        assertTrue(sequencer.calledOnFlowIsKnown);
+        final Bundle bundle = sequencer.returnedBundle;
         assertFalse(bundle.getBoolean(FirstRunActivityBase.SHOW_SYNC_CONSENT_PAGE));
         assertFalse(bundle.getBoolean(FirstRunActivityBase.SHOW_SEARCH_ENGINE_PAGE));
         assertFalse(bundle.getBoolean(SyncConsentFirstRunFragment.IS_CHILD_ACCOUNT));
@@ -240,11 +232,12 @@
         mDelegate.shouldSkipFirstUseHints = false;
         mDelegate.shouldShowSearchEnginePage = false;
 
-        mSequencer.start();
+        TestFirstRunFlowSequencer sequencer = new TestFirstRunFlowSequencer(mActivity);
+        sequencer.start();
 
         verifyNumberOfAccountsRecorded(1);
-        assertTrue(mSequencer.calledOnFlowIsKnown);
-        final Bundle bundle = mSequencer.returnedBundle;
+        assertTrue(sequencer.calledOnFlowIsKnown);
+        final Bundle bundle = sequencer.returnedBundle;
         assertTrue(bundle.getBoolean(FirstRunActivityBase.SHOW_SYNC_CONSENT_PAGE));
         assertFalse(bundle.getBoolean(FirstRunActivityBase.SHOW_SEARCH_ENGINE_PAGE));
         assertFalse(bundle.getBoolean(SyncConsentFirstRunFragment.IS_CHILD_ACCOUNT));
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index 7ec81ad3..3d1d3ee7 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -171,6 +171,7 @@
 <translation id="5398878173008909840">‏يتوفر إصدار جديد من Chromium.</translation>
 <translation id="5427571867875391349">‏تعيين Chromium المتصفح التلقائي</translation>
 <translation id="5438241569118040789">‏<ph name="PAGE_TITLE" /> - الإصدار التجريبي من Chromium</translation>
+<translation id="5473971139929175403">‏قد لا يعمل Chromium بشكل صحيح لأنّه لم يعد متاحًا على توزيع Linux هذا.</translation>
 <translation id="5480860683791598150">‏يحتاج Chromium للوصول إلى موقعك الجغرافي لمشاركته مع هذا الموقع.</translation>
 <translation id="5487574057737591516">‏لحماية خصوصيتك، نحذف تلقائيًا اهتماماتك التي يمر عليها أكثر من أربعة أسابيع. وفي حال بحثت عن أحد الاهتمامات مرّة آخرى، سيظهر في القائمة من جديد. يمكنك إزالة أي اهتمام إذا كان تقدير Chromium غير صحيح بشأنه، أو إذا كنت لا تريد رؤية إعلانات معيّنة.</translation>
 <translation id="549669000822060376">‏يُرجى الانتظار أثناء تثبيت Chromium لآخر تحديثات النظام.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb
index 93802a7a..dd2d476 100644
--- a/chrome/app/resources/chromium_strings_be.xtb
+++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Даступная новая версія Chromium.</translation>
 <translation id="5427571867875391349">Зрабіць Chromium стандартным браўзерам</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium (бэта-версія)</translation>
+<translation id="5473971139929175403">Chromium на гэтым дыстрыбутыве Linux больш не падтрымліваецца і таму можа працаваць няправільна</translation>
 <translation id="5480860683791598150">Chromium патрабуецца доступ да геаданых, каб абагуліць звесткі аб вашым месцазнаходжанні з гэтым сайтам</translation>
 <translation id="5487574057737591516">У мэтах аховы вашай прыватнасці старэйшыя за 4 тыдні звесткі пра вашы інтарэсы аўтаматычна выдаляюцца. Па меры прагляду сайтаў у інтэрнэце пэўныя інтарэсы могуць з'яўляцца ў спісе зноў. Калі Chromium няправільна ацаніў вашы інтарэсы або вы не хочаце бачыць пэўную рэкламу, вы можаце выдаліць пэўны інтарэс.</translation>
 <translation id="549669000822060376">Пачакайце, пакуль Chromium усталюе апошнія абнаўленні сістэмы.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index 00d78baa..852e5c7 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -173,6 +173,7 @@
 <translation id="5398878173008909840">Налице е нова версия на Chromium.</translation>
 <translation id="5427571867875391349">Задаване на Chromium като браузър по подразбиране</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium бета</translation>
+<translation id="5473971139929175403">Chromium може да не функционира правилно, защото вече не се поддържа за тази дистрибуция на Linux</translation>
 <translation id="5480860683791598150">Chromium се нуждае от достъп до данните за местоположението ви, за да ги сподели с този сайт</translation>
 <translation id="5487574057737591516">С цел защита на поверителността ви автоматично изтриваме интересите, които са по-стари от 4 седмици. Докато сърфирате, даден интерес може отново да се покаже в списъка. А ако Chromium допусне грешка или не желаете да виждате определени реклами, имате възможност да премахнете съответния интерес.</translation>
 <translation id="549669000822060376">Моля, изчакайте, докато Chromium инсталира най-новите системни актуализации.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index 95674ae3..4fc24546 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Hi ha disponible una versió nova de Chromium.</translation>
 <translation id="5427571867875391349">Defineix Chromium com a navegador predeterminat</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Pot ser que Chromium no funcioni correctament perquè ja no és compatible amb aquesta distribució de Linux</translation>
 <translation id="5480860683791598150">Chromium necessita accedir a la teva ubicació per compartir-la amb aquest lloc web</translation>
 <translation id="5487574057737591516">Amb la finalitat de protegir la teva privadesa, suprimim automàticament els interessos que tenen més de 4 setmanes. A mesura que continuïs navegant, és possible que torni a aparèixer un interès a la llista. Si Chromium s'equivoca o no vols veure determinats anuncis, pots suprimir un interès.</translation>
 <translation id="549669000822060376">Espereu mentre Chromium instal·la les darreres actualitzacions del sistema.</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb
index 08477d00..18df4595 100644
--- a/chrome/app/resources/chromium_strings_cy.xtb
+++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Mae fersiwn newydd o Chromium ar gael.</translation>
 <translation id="5427571867875391349">Gosod Chromium fel eich porwr diofyn</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Beta Chromium</translation>
+<translation id="5473971139929175403">Mae'n bosib na fydd Chromium yn gweithredu'n gywir oherwydd nad yw'n cael ei gefnogi mwyach ar y dosbarthiad Linux hwn</translation>
 <translation id="5480860683791598150">Mae angen mynediad at eich lleoliad ar Chromium i rannu'ch lleoliad gyda'r wefan hon</translation>
 <translation id="5487574057737591516">Er mwyn amddiffyn eich preifatrwydd, rydym yn awtoddileu eich diddordebau sy'n hŷn na 4 wythnos. Wrth i chi barhau i bori, mae'n bosib y bydd diddordeb yn ymddangos ar y rhestr eto. Ac os yw Chromium yn ei chael yn anghywir neu os nad ydych am weld rhai hysbysebion, gallwch ddileu diddordeb.</translation>
 <translation id="549669000822060376">Arhoswch dra bod Chromium yn gosod y diweddariadau system diweddaraf.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb
index c5a50de5..60a7bec 100644
--- a/chrome/app/resources/chromium_strings_da.xtb
+++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Der er en ny version af Chromium til rådighed.</translation>
 <translation id="5427571867875391349">Angiv Chromium som din standardbrowser</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium beta</translation>
+<translation id="5473971139929175403">Chromium fungerer muligvis ikke korrekt, da det ikke længere understøttes af denne Linux-distribution</translation>
 <translation id="5480860683791598150">Chromium skal have adgang til din lokation for at dele din lokation med dette website</translation>
 <translation id="5487574057737591516">Vi sletter automatisk de interesser, der er ældre end 4 uger, for at beskytte dine personlige oplysninger Mens du surfer, kan en interesse vises på listen igen. Hvis Chromium tager fejl, eller du ikke vil se visse annoncer, kan du fjerne en interesse.</translation>
 <translation id="549669000822060376">Vent, mens Chromium installerer de nyeste systemopdateringer.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb
index 8492c41..3ba2802 100644
--- a/chrome/app/resources/chromium_strings_de.xtb
+++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Eine neue Version von Chromium ist verfügbar.</translation>
 <translation id="5427571867875391349">Chromium als Standardbrowser festlegen</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium funktioniert unter Umständen nicht ordnungsgemäß, da es unter dieser Linux-Distribution nicht mehr unterstützt wird</translation>
 <translation id="5480860683791598150">Chromium benötigt Zugriff auf deinen Standort, um ihn mit dieser Website zu teilen</translation>
 <translation id="5487574057737591516">Zum Schutz deiner Daten löschen wir automatisch deine Interessen, die älter als vier Wochen sind. Je nach deinen Browsingaktivitäten können die Interessen wieder in der Liste erscheinen. Falls Chromium falsch liegt oder du bestimmte Werbung nicht sehen möchtest, kannst du einzelne Interessen entfernen.</translation>
 <translation id="549669000822060376">Bitte warte, bis die aktuellen Systemupdates von Chromium installiert wurden.</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb
index 9a169da..f588cf8 100644
--- a/chrome/app/resources/chromium_strings_el.xtb
+++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Μια νέα έκδοση του Chromium είναι διαθέσιμη.</translation>
 <translation id="5427571867875391349">Ορισμός του Chromium ως προεπιλεγμένου προγράμματος περιήγησης</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Το Chromium ενδέχεται να μην λειτουργεί σωστά, επειδή δεν υποστηρίζεται πλέον σε αυτήν τη διανομή Linux.</translation>
 <translation id="5480860683791598150">Το Chromium χρειάζεται πρόσβαση στην τοποθεσία σας, για να την κοινοποιήσει σε αυτόν τον ιστότοπο</translation>
 <translation id="5487574057737591516">Για την προστασία του απορρήτου σας, διαγράφουμε αυτόματα τα ενδιαφέροντα που είναι παλαιότερα των 4 εβδομάδων. Καθώς συνεχίζετε την περιήγηση, ενδέχεται να εμφανιστεί ξανά ένα ενδιαφέρον στη λίστα. Και εάν το Chromium κάνει κάποιο λάθος ή δεν θέλετε να βλέπετε συγκεκριμένες διαφημίσεις, μπορείτε να καταργήσετε ένα ενδιαφέρον.</translation>
 <translation id="549669000822060376">Περιμένετε μέχρι να γίνει εγκατάσταση των πιο πρόσφατων ενημερώσεων συστήματος από το Chromium.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb
index b28578a..9c24c9f 100644
--- a/chrome/app/resources/chromium_strings_es-419.xtb
+++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -173,6 +173,7 @@
 <translation id="5398878173008909840">Hay una nueva versión de Chromium disponible.</translation>
 <translation id="5427571867875391349">Establecer Chromium como navegador predeterminado</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" />: Versión Beta de Chromium</translation>
+<translation id="5473971139929175403">Es posible que Chromium no funcione correctamente porque ya no es compatible con esta distribución de Linux</translation>
 <translation id="5480860683791598150">Chromium necesita acceder a tu ubicación para compartirla con este sitio</translation>
 <translation id="5487574057737591516">Para proteger tu privacidad, quitamos los intereses automáticamente luego de 4 semanas. Es posible que, a medida que navegues, un interés vuelva a aparecer en la lista. Y si Chromium se equivoca o no quieres ver ciertos anuncios, puedes quitar un interés.</translation>
 <translation id="549669000822060376">Espera mientras Chromium instala las últimas actualizaciones del sistema.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index 0463d7f..925c6d2 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Hay una nueva versión de Chromium disponible.</translation>
 <translation id="5427571867875391349">Establecer Chromium como navegador predeterminado</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> ‑ Chromium Beta</translation>
+<translation id="5473971139929175403">Es posible que Chromium no funcione correctamente porque ya no es compatible con esta distribución Linux</translation>
 <translation id="5480860683791598150">Chromium necesita acceder a tu ubicación para compartirla con este sitio web</translation>
 <translation id="5487574057737591516">Para proteger tu privacidad, eliminamos automáticamente tus intereses si tienen una antigüedad superior a 4 semanas. A medida que sigas navegando, es posible que un interés vuelva a aparecer en la lista. Además, si Chromium se equivoca o no quieres ver ciertos anuncios, puedes eliminar un interés.</translation>
 <translation id="549669000822060376">Espera mientras Chromium instala las últimas actualizaciones del sistema.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb
index dbbd2f3..991b2e2 100644
--- a/chrome/app/resources/chromium_strings_eu.xtb
+++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Chromium arakatzailearen bertsio berria erabilgarri dago.</translation>
 <translation id="5427571867875391349">Ezarri Chromium arakatzaile lehenetsi gisa</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium-ek agian ez du behar bezala funtzionatuko ez delako jada bateragarria Linux banaketa honekin</translation>
 <translation id="5480860683791598150">Chromium-ek zure kokapena webgune honekin partekatzeko baimena behar du</translation>
 <translation id="5487574057737591516">Zure pribatutasuna babesteko, lau aste baino gehiago dituzten interesak automatikoki ezabatzen ditugu. Arakatzen jarraitu ahala, baliteke interes bat berriro agertzea zerrendan. Gainera, Chromium-ek oker igarri badu interesen bat edo iragarki jakin batzuk ikusi nahi ez badituzu, interes hori ken dezakezu.</translation>
 <translation id="549669000822060376">Itxaron Chromium-ek sistemaren azken eguneratzeak instalatu arte.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index bcf869b..5f92588 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Chromiumista on saatavilla uusi versio.</translation>
 <translation id="5427571867875391349">Aseta Chromium oletusselaimeksi</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium ei ehkä toimi oikein, koska sen käyttöä tällä Linux-jakelulla ei enää tueta.</translation>
 <translation id="5480860683791598150">Chromium tarvitsee oikeuden käyttää sijaintiasi, jotta se voidaan jakaa tämän sivuston kanssa.</translation>
 <translation id="5487574057737591516">Yksityisyytesi suojaamiseksi poistamme automaattisesti yli neljä viikkoa vanhat kiinnostuksen kohteet. Kun jatkat selaamista, kiinnostuksen kohde voi näkyä listalla uudelleen. Jos Chromiumin arvio menee pieleen tai jos et halua nähdä tiettyjä mainoksia, voit poistaa haluamasi kiinnostuksen kohteen.</translation>
 <translation id="549669000822060376">Odota hetki, Chromium asentaa uusimpia järjestelmäpäivityksiä.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb
index 2e1a68de..2f0dac9 100644
--- a/chrome/app/resources/chromium_strings_fr-CA.xtb
+++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Une nouvelle version de Chromium est maintenant offerte.</translation>
 <translation id="5427571867875391349">Faire de Chromium le navigateur par défaut</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium bêta</translation>
+<translation id="5473971139929175403">Chromium peut ne pas fonctionner correctement parce qu'il n'est plus pris en charge sur cette distribution Linux</translation>
 <translation id="5480860683791598150">Chromium a besoin d'accéder à votre position afin de la partager avec ce site</translation>
 <translation id="5487574057737591516">Afin de protéger votre confidentialité, nous supprimons automatiquement vos centres d'intérêt ayant plus de quatre semaines. Au fur et à mesure que vous naviguez, un centre d'intérêt peut réapparaître sur la liste. En revanche, si Chromium se trompe ou si vous ne souhaitez pas voir certaines annonces, vous pouvez retirer un centre d'intérêt.</translation>
 <translation id="549669000822060376">Veuillez patienter pendant que Chromium installe les dernières mises à jour système.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index cf816cd..37eae5f 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -176,6 +176,7 @@
 <translation id="5398878173008909840">Une nouvelle version de Chromium est disponible.</translation>
 <translation id="5427571867875391349">Définir Chromium comme navigateur par défaut</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Bêta</translation>
+<translation id="5473971139929175403">Chromium risque de ne pas fonctionner correctement, car la compatibilité n'est plus assurée sur cette distribution Linux.</translation>
 <translation id="5480860683791598150">Chromium a besoin d'accéder à votre position pour la partager avec ce site</translation>
 <translation id="5487574057737591516">Pour protéger votre confidentialité, nous supprimons automatiquement vos centres d'intérêt s'ils datent de plus de quatre semaines. Au fil de votre navigation, un centre d'intérêt peut réapparaître dans la liste. Si Chromium se trompe ou que vous ne voulez pas voir certaines annonces, vous pouvez supprimer un centre d'intérêt.</translation>
 <translation id="549669000822060376">Veuillez patienter pendant que Chromium installe les dernières mises à jour du système.</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb
index 71676b8..d837af7 100644
--- a/chrome/app/resources/chromium_strings_gl.xtb
+++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Hai unha nova versión de Chromium dispoñible.</translation>
 <translation id="5427571867875391349">Establecer Chromium como o teu navegador predeterminado</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> (versión beta de Chromium)</translation>
+<translation id="5473971139929175403">Pode que Chromium non funcione correctamente porque xa non é compatible con esta distribución de Linux</translation>
 <translation id="5480860683791598150">Chromium necesita acceder á túa localización para compartila con este sitio</translation>
 <translation id="5487574057737591516">Para protexer a túa privacidade, eliminamos automaticamente os teus intereses cuxa antigüidade sexa superior a 4 semanas. Algúns poderían volver incluírse na lista ao seguires navegando. Se Chromium se trabuca ou non queres ver certos anuncios, podes quitar un interese.</translation>
 <translation id="549669000822060376">Espera a que Chromium instale as actualizacións do sistema máis recentes.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb
index 01ccb81e..bf84c92 100644
--- a/chrome/app/resources/chromium_strings_hy.xtb
+++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Մատչելի է Chromium-ի նոր տարբերակը:</translation>
 <translation id="5427571867875391349">Դարձնել Chromium-ը կանխադրված դիտարկիչը</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium բետա</translation>
+<translation id="5473971139929175403">Chromium-ը հնարավոր է չաշխատի ինչպես հարկն է, քանի որ այն այլևս չի աջակցվում Լինուքսի այս բաշխման մեջ։</translation>
 <translation id="5480860683791598150">Chromium-ին այս կայքի համար անհրաժեշտ է ձեզ տեղորոշելու թույլտվություն</translation>
 <translation id="5487574057737591516">Ձեր գաղտնիությունը պաշտպանելու նպատակով մենք 4 շաբաթից ավտոմատ ջնջում ենք ձեր հետաքրքրությունները։ Երբ դուք շարունակում եք դիտել վեբ էջեր, համապատասխան հետաքրքրությունը կարող է նորից հայտնվել ցանկում։ Եթե Chromium-ը սխալ է որոշել ձեր հետաքրքրությունը, կամ դուք չեք ուզում տեսնել որոշակի գովազդներ, կարող եք հեռացնել հետաքրքրությունը։</translation>
 <translation id="549669000822060376">Սպասեք` մինչ Chromium-ը տեղադրում է համակարգի նորագույն թարմացումները:</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index 8a2e3f44..bbe9211 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Tersedia Chromium versi baru.</translation>
 <translation id="5427571867875391349">Setel Chromium sebagai browser default</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium mungkin tidak berfungsi dengan semestinya karena sudah tidak didukung di distribusi Linux ini</translation>
 <translation id="5480860683791598150">Chromium memerlukan akses ke lokasi Anda untuk berbagi lokasi dengan situs ini</translation>
 <translation id="5487574057737591516">Untuk melindungi privasi Anda, kami otomatis menghapus minat Anda yang tersimpan lebih dari 4 minggu. Saat Anda terus menjelajah, minat dapat kembali muncul di daftar. Dan jika Chromium keliru atau Anda tidak ingin melihat iklan tertentu, Anda dapat menghapus minat.</translation>
 <translation id="549669000822060376">Harap tunggu selagi Chromium memasang pembaruan sistem terkini.</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb
index 48a3d865..b416f86 100644
--- a/chrome/app/resources/chromium_strings_is.xtb
+++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Ný útgáfa af Chromium er í boði.</translation>
 <translation id="5427571867875391349">Stilla Chromium sem sjálfgefinn vafra</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - tilraunaútgáfa Chromium</translation>
+<translation id="5473971139929175403">Vera kann að Chromium virki ekki sem skyldi vegna þess að það er ekki lengur stutt í þessu Linux-kerfi.</translation>
 <translation id="5480860683791598150">Chromium þarf staðsetningaraðgang til að deila staðsetningu þinni með þessu vefsvæði</translation>
 <translation id="5487574057737591516">Til að gæta persónuverndar þinnar eyðum við áhugasviðunum þínum sem eru eldri en 4 vikna sjálfkrafa. Áhugasvið kann að birtast aftur á listanum þegar þú heldur áfram að vafra. Ef Chromium skjátlast eða ef þú vilt ekki sjá tilteknar auglýsingar geturðu fjarlægt áhugamál.</translation>
 <translation id="549669000822060376">Bíddu á meðan Chromium setur upp nýjustu kerfisuppfærslunar.</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb
index b69a2b3..380fd00 100644
--- a/chrome/app/resources/chromium_strings_kk.xtb
+++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Жаңа Chromium нұсқасы қолжетімді.</translation>
 <translation id="5427571867875391349">Әдепкі браузер ретінде Chromium қолданбасын орнату</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium бета нұсқасы</translation>
+<translation id="5473971139929175403">Chromium дұрыс жұмыс істемеуі мүмкін, себебі оған Linux жүйесінде қолдау көрсетілмейді.</translation>
 <translation id="5480860683791598150">Бұл сайтқа көрсету үшін Chromium браузері орналасқан жеріңізді білуі керек</translation>
 <translation id="5487574057737591516">Құпиялылығыңызды сақтау үшін 4 аптадан көп көрсетілген қызығушылықтарды автоматты түрде жойып отырамыз. Интернетті шолу кезінде белгілі бір қызығушылық тізімде қайтадан шығуы мүмкін. Егер Chromium браузері қателессе немесе белгілі бір жарнамаларды көргіңіз келмесе, қызығушылықты өшіре аласыз.</translation>
 <translation id="549669000822060376">Chromium ең соңғы жүйе жаңартуларын орнатуда, күте тұрыңыз.</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb
index ab06e40..4cee4224 100644
--- a/chrome/app/resources/chromium_strings_km.xtb
+++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -178,6 +178,7 @@
 <translation id="5398878173008909840">មានកំណែ Chromium ថ្មី។</translation>
 <translation id="5427571867875391349">កំណត់ Chromium ជាកម្មវិធីរុករកលំនាំដើមរបស់អ្នក</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium អាច​នឹង​មិន​ដំណើរការ​បានត្រឹមត្រូវ​ទេ ដោយសារ​វា​លែង​ទទួលបាន​ការគាំទ្រ​នៅលើ​ប្រព័ន្ធ Linux ទៀតហើយ។</translation>
 <translation id="5480860683791598150">Chromium ត្រូវការ​សិទ្ធិចូលប្រើ​ទីតាំង​របស់អ្នក ដើម្បីចែករំលែក​ទីតាំង​របស់អ្នក​ជាមួយ​ទំព័រនេះ</translation>
 <translation id="5487574057737591516">ដើម្បីការពារ​ឯកជនភាព​របស់អ្នក យើងលុប​ចំណាប់អារម្មណ៍​របស់អ្នក​ដែលចាស់ជាង 4 សប្ដាហ៍​ដោយស្វ័យប្រវត្តិ។ នៅពេលដែលអ្នក​បន្តរុករក ចំណាប់អារម្មណ៍​ប្រហែលជាបង្ហាញ​នៅលើ​បញ្ជីម្ដងទៀត។ ហើយប្រសិនបើ Chromium បង្ហាញចំណាប់អារម្មណ៍នោះ​មិនបានត្រឹមត្រូវទេ ឬអ្នកមិនចង់ឃើញ​ការផ្សាយពាណិជ្ជកម្ម​ជាក់លាក់ អ្នកអាចដក​ចំណាប់អារម្មណ៍​ចេញបាន។</translation>
 <translation id="549669000822060376">សូមរង់ចាំ ខណៈពេលដែល Chromium តំឡើងការធ្វើបច្ចុប្បន្នភាពប្រព័ន្ធចុងក្រោយបំផុត។</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 29fbd27..bde64bb8 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Chromium의 새 버전이 출시되었습니다.</translation>
 <translation id="5427571867875391349">Chromium을 기본 브라우저로 설정</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium 베타</translation>
+<translation id="5473971139929175403">이 Linux 배포판에서 더 이상 Chromium을 지원하지 않으므로 Chromium이 올바르게 작동하지 않을 수 있습니다.</translation>
 <translation id="5480860683791598150">이 사이트와 위치를 공유하려면 Chromium에 내 위치 액세스 권한이 있어야 합니다</translation>
 <translation id="5487574057737591516">개인 정보를 보호하기 위해 Chromium에서는 4주가 지난 관심분야를 자동 삭제합니다. 인터넷 사용에 따라 특정 관심분야가 목록에 다시 표시될 수 있습니다. Chromium에서 관심분야를 잘못 예측했거나 특정 광고를 보고 싶지 않다면 직접 관심분야를 삭제하세요.</translation>
 <translation id="549669000822060376">Chromium에서 최신 시스템 업데이트를 설치하는 동안 잠시 기다려 주세요.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index 03f97832d..ca0b2c3 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Terdapat versi baharu Chromium tersedia.</translation>
 <translation id="5427571867875391349">Tetapkan Chromium sebagai penyemak imbas lalai anda</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium mungkin tidak akan berfungsi dengan betul kerana tidak disokong pada edaran Linux ini lagi</translation>
 <translation id="5480860683791598150">Chromium memerlukan akses kepada lokasi anda untuk berkongsi lokasi dengan tapak ini</translation>
 <translation id="5487574057737591516">Untuk melindungi privasi anda, kami memadamkan minat anda yang disimpan melebihi 4 minggu secara automatik. Semasa anda terus menyemak imbas, minat itu mungkin muncul semula dalam senarai. Jika Chromium tersilap atau anda tidak mahu melihat iklan tertentu, anda boleh mengalih keluar minat itu.</translation>
 <translation id="549669000822060376">Sila tunggu sementara Chromium memasang kemas kini sistem terkini.</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb
index b496cef9..6f8506a 100644
--- a/chrome/app/resources/chromium_strings_or.xtb
+++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Chromiumର ଏକ ନୂଆ ସଂସ୍କରଣ ଉପଲବ୍ଧ ଅଟେ।</translation>
 <translation id="5427571867875391349">Chromiumକୁ ଆପଣଙ୍କର ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ ଭାବରେ ସେଟ୍ କରନ୍ତୁ</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium ବିଟା</translation>
+<translation id="5473971139929175403">ଏହି Linux ଡିଷ୍ଟ୍ରିବ୍ୟୁସନରେ Chromium ଆଉ ସମର୍ଥିତ ନଥିବା ଯୋଗୁଁ ଏହା ସଠିକ୍ ଭାବରେ କାମ କରିନପାରେ</translation>
 <translation id="5480860683791598150">ଏହି ସାଇଟ୍ ସହ ଆପଣଙ୍କ ଲୋକେସନ୍ ସେୟାର୍ କରିବା ପାଇଁ Chromium ଆପଣଙ୍କ ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହୁଁଛି।</translation>
 <translation id="5487574057737591516">ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, ଆମେ ଆପଣଙ୍କ 4 ସପ୍ତାହରୁ ଅଧିକ ପୁରୁଣା ରୁଚିଗୁଡ଼ିକୁ ସ୍ୱତଃ-ଡିଲିଟ କରୁ। ଆପଣ ବ୍ରାଉଜ କରିବା ଜାରି ରଖିବା ସମୟରେ, ତାଲିକାରେ ଏକ ରୁଚି ପୁଣି ଦେଖାଯାଇପାରେ। ଏବଂ ଯଦି Chromiumର ଭୁଲ ହୁଏ କିମ୍ବା ଆପଣ ନିର୍ଦ୍ଦିଷ୍ଟ ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ଦେଖିବାକୁ ଚାହୁଁନଥାନ୍ତି, ତେବେ ଆପଣ ଏକ ରୁଚିକୁ କାଢ଼ି ଦେଇପାରିବେ।</translation>
 <translation id="549669000822060376">Chromium ନବୀନତମ ସିଷ୍ଟମ୍ ଅପ୍‌ଡେଟ୍ ଇନ୍‌ଷ୍ଟଲ୍ କରିବା ସମୟରେ ଦୟାକରି ଅପେକ୍ଷା କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb
index d4340045..f477285 100644
--- a/chrome/app/resources/chromium_strings_pt-PT.xtb
+++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Está disponível uma nova versão do Chromium.</translation>
 <translation id="5427571867875391349">Definir o Chromium como o seu navegador predefinido</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
+<translation id="5473971139929175403">O Chromium pode não funcionar corretamente, uma vez que já não é suportado nesta distribuição do Linux</translation>
 <translation id="5480860683791598150">O Chromium necessita de aceder à sua localização para a partilhar com este site.</translation>
 <translation id="5487574057737591516">Para proteger a sua privacidade, eliminamos automaticamente os seus interesses com mais de 4 semanas. Enquanto navega, um interesse pode aparecer novamente na lista. Além disso, pode remover um interesse se o Chromium se enganar ou caso não queira ver determinados anúncios.</translation>
 <translation id="549669000822060376">Aguarde até que o Chromium instale as atualizações do sistema mais recentes.</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb
index 676f686..621029a 100644
--- a/chrome/app/resources/chromium_strings_si.xtb
+++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Chromium හි නව සංස්කරණයක් පවතී.</translation>
 <translation id="5427571867875391349">Chromium ඔබේ පෙරනිමි බ්‍රව්සරය ලෙස සකසන්න</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium බීටා</translation>
+<translation id="5473971139929175403">එය තවදුරටත් මෙම Linux ව්‍යාප්තියට සහාය නොදක්වන නිසා Chromium නිවැරදිව ක්‍රියා නොකළ හැකිය.</translation>
 <translation id="5480860683791598150">Chromium හට මෙම අඩවිය සමඟ ඔබේ ස්ථානය බෙදා ගැනීමට ඔබේ ස්ථානයට ප්‍රවේශය අවශ්‍යයි</translation>
 <translation id="5487574057737591516">ඔබගේ පෞද්ගලිකත්වය ආරක්ෂා කිරීමට, අපි සති 4කට වඩා පැරණි ඔබගේ ලැදිකම් ස්වයංක්‍රියව මකමු. ඔබ දිගටම බ්‍රවුස් කරන විට, ලැදිකමක් නැවත ලැයිස්තුවේ දිස් විය හැකිය. Chromium හට එය වැරදුණි නම් හෝ ඔබට ඇතැම් වෙළඳ දැන්වීම් දැකීමට අවශ්‍ය නැතිනම්, ඔබට ලැදිකමක් ඉවත් කළ හැකිය.</translation>
 <translation id="549669000822060376">කරුණාකර Chromium නවතම පද්ධති යාවත්කාලීන ස්ථාපනය කරන අතරතුර රැඳී සිටින්න.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index a836b368..2aa9f0e4 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Na voljo je nova različica Chromiuma.</translation>
 <translation id="5427571867875391349">Nastavitev Chromiuma za privzeti brskalnik</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – različica beta Chromiuma</translation>
+<translation id="5473971139929175403">Chromium morda ne bo deloval pravilno, ker ni več podprt v tej distribuciji Linuxa.</translation>
 <translation id="5480860683791598150">Chromium potrebuje dostop do vaše lokacije, da jo bo lahko delil s tem spletnim mestom</translation>
 <translation id="5487574057737591516">Zaradi zaščite vaše varnosti samodejno izbrišemo vaša zanimanja, starejša od 4 tednov. Ko brskate naprej, se zanimanje morda znova prikaže na seznamu. Če se Chromium zmoti in ne želite videti nekaterih oglasov, lahko odstranite zanimanje.</translation>
 <translation id="549669000822060376">Počakajte, da Chromium namesti najnovejše sistemske posodobitve.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb
index bd4af3b..4b45d04c 100644
--- a/chrome/app/resources/chromium_strings_sq.xtb
+++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Ofrohet një version i ri i Chromium.</translation>
 <translation id="5427571867875391349">Caktoje Chromium si shfletuesin tënd të parazgjedhur</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium mund të mos funksionojë si duhet sepse nuk mbështetet më në këtë version të Linux</translation>
 <translation id="5480860683791598150">Chromium ka nevojë për qasje te vendndodhja jote për të ndarë vendndodhjen tënde me këtë sajt</translation>
 <translation id="5487574057737591516">Për të mbrojtur privatësinë tënde, ne fshijmë automatikisht interesat e tua që janë më të vjetra se 4 javë. Ndërsa vazhdon të shfletosh, një interes mund të shfaqet përsëri në listë. Nëse Chromium gabohet ose nëse nuk dëshiron të shikosh reklama të caktuara, mund të heqësh një interes.</translation>
 <translation id="549669000822060376">Prit ndërsa Chromium instalon përditësimet më të fundit të sistemit.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index fbdb63e1..aaf1a64 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Det finns en ny version av Chromium.</translation>
 <translation id="5427571867875391349">Använd Chromium som standardwebbläsare</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> – Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium kanske inte fungerar ordentligt eftersom det inte längre stöds på den här Linux-distributionen</translation>
 <translation id="5480860683791598150">Du behöver ge Chromium åtkomst till din plats om den ska kunna delas med webbplatsen</translation>
 <translation id="5487574057737591516">För att skydda din integritet raderar vi automatiskt intressen som är äldre än fyra veckor. Medan du surfar kan ett intresse dyka upp på listan igen. Och om Chromium gör fel eller om du inte vill se vissa annonser kan du ta bort intresset.</translation>
 <translation id="549669000822060376">Vänta medan de senaste systemuppdateringarna installeras av Chromium.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index e5cfc9da..53ac2fb1 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">Kuna toleo jipya la Chromium linalopatikana.</translation>
 <translation id="5427571867875391349">Weka Chromium kuwa kivinjari chako chaguomsingi</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Beta ya Chromium</translation>
+<translation id="5473971139929175403">Huenda Chromium haitafanya kazi vizuri kwa sababu haitumiki tena kwenye toleo hili la Linux</translation>
 <translation id="5480860683791598150">Chromium inahitaji kufikia maelezo ya mahali ulipo ili kushiriki mahali ulipo na tovuti hii</translation>
 <translation id="5487574057737591516">Ili kulinda faragha yako, tunafuta kiotomatiki mambo yanayokuvutia ambayo yapo kwenye orodha kwa zaidi ya wiki nne. Kadiri unavyoendelea kuvinjari, jambo linalokuvutia linaweza kuonekana tena kwenye orodha. Na iwapo Chromium itakosea au usingependa kuona matangazo fulani, unaweza kuondoa jambo hilo linalokuvutia.</translation>
 <translation id="549669000822060376">Tafadhali subiri Chromium inaposakinisha sasisho mpya ya mfumo.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index 28fddc5..14e78b0 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Chromium รุ่นใหม่พร้อมให้ใช้งานแล้ว</translation>
 <translation id="5427571867875391349">ตั้ง Chromium เป็นเบราว์เซอร์เริ่มต้นของคุณ</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium เบต้า</translation>
+<translation id="5473971139929175403">Chromium อาจทำงานไม่ถูกต้องเพราะไม่รองรับใน Linux Distribution นี้แล้ว</translation>
 <translation id="5480860683791598150">Chromium ต้องการสิทธิ์เข้าถึงตำแหน่งของคุณเพื่อแชร์ตำแหน่งกับเว็บไซต์นี้</translation>
 <translation id="5487574057737591516">เราลบความสนใจที่เก่ากว่า 4 สัปดาห์โดยอัตโนมัติเพื่อปกป้องความเป็นส่วนตัวของคุณ ความสนใจอาจกลับมาปรากฏในรายการอีกเมื่อคุณท่องเว็บต่อ และหาก Chromium คาดคะเนผิดหรือคุณไม่ต้องการเห็นโฆษณาบางรายการ คุณนำความสนใจออกได้</translation>
 <translation id="549669000822060376">โปรดรอขณะที่ Chromium ติดตั้งการอัปเดตระบบล่าสุด</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index eafbcbe..42fcb0e 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -173,6 +173,7 @@
 <translation id="5398878173008909840">Chromium'un yeni bir sürümü çıktı.</translation>
 <translation id="5427571867875391349">Chromium'u varsayılan tarayıcım olarak ayarla</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta</translation>
+<translation id="5473971139929175403">Chromium artık bu Linux dağıtım sisteminde desteklenmediği için doğru şekilde çalışmayabilir</translation>
 <translation id="5480860683791598150">Konumunuzu bu siteyle paylaşabilmek için Chromium'un konum bilgilerinize erişmesi gerekiyor</translation>
 <translation id="5487574057737591516">Gizliliğinizi korumak için 4 haftadan eski ilgi alanlarınızı otomatik olarak sileriz. Siz internette gezindikçe ilgi alanları tekrar listede görünmeye başlayabilir. Chromium ilgi alanınızı yanlış algılarsa veya belirli reklamları görmek istemezseniz ilgi alanlarını kaldırabilirsiniz.</translation>
 <translation id="549669000822060376">Chromium en son sistem güncellemelerini yüklerken lütfen bekleyin.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb
index 533ed53..d2ea399 100644
--- a/chrome/app/resources/chromium_strings_zh-CN.xtb
+++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">Chromium 现已推出新版本。</translation>
 <translation id="5427571867875391349">将Chromium设为默认浏览器</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium 测试版</translation>
+<translation id="5473971139929175403">Chromium 可能无法正常运行,因为它不再支持此 Linux 发行版</translation>
 <translation id="5480860683791598150">Chromium 需要获得位置权限,才能将您的位置信息共享给此网站</translation>
 <translation id="5487574057737591516">为了保护您的隐私,如果您的兴趣保留时间超过 4 周,系统便会自动将其删除。随着您继续浏览,某项兴趣可能会再次出现在列表中。如果 Chromium 的推测不准确,或者您不想看到某些广告,可以移除某项兴趣。</translation>
 <translation id="549669000822060376">Chromium正在安装最新的系统更新,请稍候。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb
index ecb82a8..14a0a1f1 100644
--- a/chrome/app/resources/chromium_strings_zh-HK.xtb
+++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -177,6 +177,7 @@
 <translation id="5398878173008909840">新版 Chromium 現已推出。</translation>
 <translation id="5427571867875391349">將 Chromium 設為預設瀏覽器</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium Beta 版本</translation>
+<translation id="5473971139929175403">Chromium 不再支援此 Linux 發行版本,因此可能無法正常運作</translation>
 <translation id="5480860683791598150">Chromium 需要位置資訊存取權,才能與這個網站分享您的位置資訊</translation>
 <translation id="5487574057737591516">為保障您的私隱,我們會自動刪除超過 4 星期的興趣。按瀏覽內容而定,某個主題可能會再次在您的興趣清單中顯示。如果您認為 Chromium 判斷錯誤或不想看到特定廣告,可以移除感興趣的主題。</translation>
 <translation id="549669000822060376">請稍候,Chromium 正在安裝最新的系統更新。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 2841b98..e4aa417 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -175,6 +175,7 @@
 <translation id="5398878173008909840">新版 Chromium 現已推出。</translation>
 <translation id="5427571867875391349">將 Chromium 設為預設瀏覽器</translation>
 <translation id="5438241569118040789"><ph name="PAGE_TITLE" /> - Chromium 測試版</translation>
+<translation id="5473971139929175403">Chromium 已不再支援這個 Linux 發行版本,因此可能無法正常運作</translation>
 <translation id="5480860683791598150">Chromium 需要位置資訊存取權,才能與這個網站分享你的位置資訊</translation>
 <translation id="5487574057737591516">為保護個人隱私,我們會自動刪除 4 週以上的興趣喜好。視瀏覽內容而定,某個主題可能會再次顯示在你的興趣喜好清單中。如果你認為 Chromium 判斷錯誤或不想看到特定廣告,可以移除感興趣的主題。</translation>
 <translation id="549669000822060376">請稍候,Chromium 正在安裝最新的系統更新。</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb
index d175107..7f9636d7 100644
--- a/chrome/app/resources/generated_resources_af.xtb
+++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1014,6 +1014,7 @@
 <translation id="1942600407708803723">Skakel af wanneer omhulsel toe is</translation>
 <translation id="1944528062465413897">Bluetooth-saambindkode:</translation>
 <translation id="1944921356641260203">Opdatering gevind</translation>
+<translation id="1947136734041527201">Stel jou in staat om by webwerwe aan te meld met die rekening wat jy by ’n identiteitsdiens het</translation>
 <translation id="1949584741547056205">Kitsantwoorde</translation>
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1954597385941141174">Werwe kan vra om aan USB-toestelle te koppel</translation>
@@ -2414,6 +2415,7 @@
 <translation id="32939749466444286">Die Linux-houer het nie begin nie. Probeer asseblief weer.</translation>
 <translation id="3294437725009624529">Gas</translation>
 <translation id="3294686910656423119">Gebruikstatistieke en omvalverslae</translation>
+<translation id="3297105622164376095">Word toegelaat om derdeparty-aanmeldporboodskappe te wys</translation>
 <translation id="3297536526040732495">Koppel hierdie data tydelik aan jou Google-rekening wanneer jy aangemeld is om jou oral in Google-programme te beskerm</translation>
 <translation id="329838636886466101">Herstel</translation>
 <translation id="3298789223962368867">Ongeldige URL ingevoer.</translation>
@@ -3670,6 +3672,7 @@
 <translation id="452750746583162491">Gaan jou gesinkroniseerde data na</translation>
 <translation id="4527929807707405172">Aktiveer omgekeerde rollees. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Vertalingvoorstel</translation>
+<translation id="4529455689802245339">Chrome se Intydse Onderskrifte sal dalk nie werk nie</translation>
 <translation id="4530494379350999373">Oorsprong</translation>
 <translation id="4531924570968473143">Wie wil jy graag by hierdie <ph name="DEVICE_TYPE" /> voeg?</translation>
 <translation id="4532625150642446981">"<ph name="USB_DEVICE_NAME" />" word tans gebruik. As die toestel hertoegewys word terwyl dit gebruik word, kan dit foute veroorsaak. Is jy seker jy wil voortgaan?</translation>
@@ -3868,6 +3871,7 @@
 <translation id="471880041731876836">Jy het nie toestemming om hierdie werf te besoek nie</translation>
 <translation id="4722735765955348426">Wagwoord vir <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> deel tans jou skerm.</translation>
+<translation id="4722989931633062466">Word nie toegelaat om derdeparty-aanmeldingporboodskappe te wys nie</translation>
 <translation id="4723140812774948886">Ruil met volgende</translation>
 <translation id="4724450788351008910">Affiliasie het verander</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4839,6 +4843,7 @@
 <translation id="5711010025974903573">Diensloglêers</translation>
 <translation id="5711983031544731014">Kan nie ontsluit nie. Voer jou wagwoord in.</translation>
 <translation id="5712153969432126546">Werwe publiseer soms PDF's, soos dokumente, kontrakte en vorms</translation>
+<translation id="571222594670061844">Werwe kan vir jou aanmeldporboodskappe van identiteitsdienste af wys</translation>
 <translation id="5713158217420111469">Gekoppel aan <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Inpropagent: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Versteksoekenjins</translation>
@@ -4997,6 +5002,7 @@
 <translation id="5876851302954717356">Nuwe oortjie aan die regterkant</translation>
 <translation id="5877064549588274448">Kanaal het verander. Herbegin jou toestel om veranderinge toe te pas.</translation>
 <translation id="5877584842898320529">Die geselekteerde drukker is nie beskikbaar nie of is nie reg geïnstalleer nie. <ph name="BR" /> Gaan jou drukker na of probeer 'n ander drukker kies.</translation>
+<translation id="5878945009165002849">Blokkeer aanmeldporboodskappe van identiteitsdienste af</translation>
 <translation id="5882919346125742463">Bekende netwerke</translation>
 <translation id="5883356647197510494">Het <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> outomaties geblokkeer</translation>
 <translation id="5884474295213649357">Hierdie oortjie is aan 'n USB-toestel gekoppel.</translation>
@@ -5634,6 +5640,7 @@
 <translation id="6513247462497316522">Google Chrome sal mobiele data gebruik as jy nie aan 'n ander netwerk gekoppel is nie.</translation>
 <translation id="6514010653036109809">Beskikbare toestel:</translation>
 <translation id="6514565641373682518">Hierdie bladsy het jou muismerker gedeaktiveer.</translation>
+<translation id="6517709704288360414">Jou toestel sal dalk nie meer reg werk nie en jy kan veiligheid- en werkverrigtingkwessies ervaar. As jy opdaterings afskakel, kan dit jou reg beïnvloed om wetlike eise in te dien as jy enige kwessies ervaar.</translation>
 <translation id="6518014396551869914">Kopieer prent</translation>
 <translation id="6518133107902771759">Verifieer</translation>
 <translation id="651942933739530207">Wil jy hê <ph name="APP_NAME" /> moet jou skerm en oudio-uitvoer deel?</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index a284c65..3f427260 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1010,6 +1010,7 @@
 <translation id="1942600407708803723">ክዳኑ ሲዘጋ አጥፋ</translation>
 <translation id="1944528062465413897">የብሉቱዝ ማጣመሪያ ኮድ፦</translation>
 <translation id="1944921356641260203">ዝማኔ ተገኝቷል</translation>
+<translation id="1947136734041527201">በማንነት አገልግሎት ያለዎትን መለያ ተጠቅመው ወደ ድር ጣቢያዎች እንዲገቡ ያስችልዎታል</translation>
 <translation id="1949584741547056205">ፈጣን መልሶች</translation>
 <translation id="1951012854035635156">ረዳት</translation>
 <translation id="1954597385941141174">ጣቢያዎች ከዩኤስቢ መሣሪያዎች ጋር ለመገናኘት መጠየቅ ይችላሉ</translation>
@@ -2408,6 +2409,7 @@
 <translation id="32939749466444286">የLinux መያዣ አልጀመረም። እባክዎ እንደገና ይሞክሩ።</translation>
 <translation id="3294437725009624529">እንግዳ</translation>
 <translation id="3294686910656423119">የአጠቃቀም ስታቲስቲክስ እና የብልሽት ሪፖርቶች</translation>
+<translation id="3297105622164376095">የሶስተኛ ወገን የመግባት ጥያቄዎችን ማሳየት ተፈቅዷል</translation>
 <translation id="3297536526040732495">እርስዎን በመላው የGoogle መተግበሪያዎች ላይ ለመጠበቅ ይህን ውሂብ ለጊዜው ከGoogle መለያዎ ጋር ያገናኘዋል</translation>
 <translation id="329838636886466101">ይጠግኑ</translation>
 <translation id="3298789223962368867">ልክ ያልሆነ ዩአርኤል ገብቷል።</translation>
@@ -3661,6 +3663,7 @@
 <translation id="452750746583162491">የሰመረ ውሂብዎን ይገምግሙ</translation>
 <translation id="4527929807707405172">ኋልዮሽ መሸብለልን አንቃ <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">የትርጉም አስተያየት ጥቆማ</translation>
+<translation id="4529455689802245339">የChrome የቀጥታ መግለጫ ጽሑፍ ላይሰራ ይችላል</translation>
 <translation id="4530494379350999373">መነሻ</translation>
 <translation id="4531924570968473143">ማንን ወደዚህ <ph name="DEVICE_TYPE" /> ማከል ይፈልጋል?</translation>
 <translation id="4532625150642446981">«<ph name="USB_DEVICE_NAME" />» ሥራ ላይ ነው። መሣሪያውን በሚሠራበት ጊዜ እንደገና መመደብ ስህተት ሊያስከትል ይችላል። እርግጠኛ ነዎት መቀጠል ይፈልጋሉ?</translation>
@@ -3859,6 +3862,7 @@
 <translation id="471880041731876836">ይህን ጣቢያ የመጎብኘት ፈቃድ የለዎትም</translation>
 <translation id="4722735765955348426">የ<ph name="USERNAME" /> ይለፍ ቃል</translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> ማያ ገጽዎን እያጋራ ነው።</translation>
+<translation id="4722989931633062466">የሶስተኛ ወገን የመግባት ጥያቄዎችን ማሳየት አይፈቀድም</translation>
 <translation id="4723140812774948886">ከቀጣዩ ጋር ይለዋወጡ</translation>
 <translation id="4724450788351008910">ዝምድናው ተለውጧል</translation>
 <translation id="4725511304875193254">ኮርጂ</translation>
@@ -4829,6 +4833,7 @@
 <translation id="5711010025974903573">የአገልግሎት ምዝግብ ማስታወሻዎች</translation>
 <translation id="5711983031544731014">ማስከፈት አልተቻለም። የይለፍ ቃልዎን ያስገቡ።</translation>
 <translation id="5712153969432126546">ጣቢያዎች አንዳንድ ጊዜ እንደ ሰነዶች፣ ውሎች እና ቅጾች ያሉ በPDF ያትማሉ</translation>
+<translation id="571222594670061844">ጣቢያዎች ከማንነት አገልግሎቶች የመግቢያ ጥያቄዎችን ማሳየት ይችላሉ</translation>
 <translation id="5713158217420111469">ከ<ph name="DEVICE" /> ጋር ተገናኝቷል</translation>
 <translation id="5715711091495208045">የተሰኪ አስማሚ፦ <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">ነባሪ የፍለጋ ፕሮግራሞች</translation>
@@ -4987,6 +4992,7 @@
 <translation id="5876851302954717356">በቀኝ በኩል አዲስ ትር</translation>
 <translation id="5877064549588274448">ሰርጥ ተለውጧል። ለውጦችን ለመተግበር መሳሪያዎን ዳግም ያስጀምሩ።</translation>
 <translation id="5877584842898320529">የተመረጠው አታሚ የለም ወይም በትክክል አልተጫነም። <ph name="BR" /> አታሚዎን ይፈትሹት ወይም ሌላ አታሚ ለመምረጥ ይሞክሩ።</translation>
+<translation id="5878945009165002849">የመግቢያ መጠይቆችን ከማንነት አገልግሎቶች ያግዱ</translation>
 <translation id="5882919346125742463">የታወቁ አውታረ መረቦች</translation>
 <translation id="5883356647197510494">በራስ-ሰር የታገዱ <ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">ይህ ትር ከአንድ የዩኤስቢ መሣሪያ ጋር የተገናኘ ነው።</translation>
@@ -5624,6 +5630,7 @@
 <translation id="6513247462497316522">ከሌላ አውታረ መረብ ጋር ካልተገናኙ Google Chrome የተንቀሳቃሽ ውሂብን ይጠቀማል።</translation>
 <translation id="6514010653036109809">የሚገኝ መሣሪያ፦</translation>
 <translation id="6514565641373682518">ይህ ገጽ የመዳፊት ጠቋሚዎን አሰናክሏል።</translation>
+<translation id="6517709704288360414">መሣሪያዎ ከአንግዲህ በትክክል ላይሰራ ይችላል፣ እና የደህንነት እና የአፈጻጸም ችግሮች ሊያጋጥሙዎት ይችላሉ። ዝማኔዎችን ማጥፋት ምንም አይነት ችግሮች ካጋጠሙዎት ሕጋዊ የይገባኛል ጥያቄዎች በማቅረብ መብትዎ ላይ ተጽዕኖ ሊያሳርፍ ይችላል።</translation>
 <translation id="6518014396551869914">ምስል ቅ&amp;ዳ</translation>
 <translation id="6518133107902771759">አረጋግጥ</translation>
 <translation id="651942933739530207"><ph name="APP_NAME" /> ማያ ገጽዎን እና የድምፅ ውፅዓትዎን እንዲጋራ ይፈልጋሉ?</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index d479a95..35863288 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1958,6 +1958,7 @@
 <translation id="2832124733806557606">يمكن لطفلك استخدام رقم تعريف شخصي لفتح قفل الجهاز أو تسجيل الدخول عليه</translation>
 <translation id="2835177225987815960">ستتم إعادة ضبط الإعداد الحالي للمسح الضوئي، بما في ذلك الإعدادات المفضّلة لمفاتيح التحكم المخصّصة وسرعة المسح التلقائي.</translation>
 <translation id="2835547721736623118">خدمة "التعرُّف على الكلام"</translation>
+<translation id="2836232638504556905">للمتابعة، سيشارك <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> اسمك وعنوان بريدك الإلكتروني وصورة ملفك الشخصي مع هذا الموقع الإلكتروني. ويمكنك الاطّلاع على <ph name="BEGIN_LINK" />سياسة الخصوصية<ph name="END_LINK" /> لهذا الموقع الإلكتروني.</translation>
 <translation id="2836269494620652131">تعطل</translation>
 <translation id="2836635946302913370">تم إيقاف تسجيل الدخول باستخدام اسم المستخدم هذا بواسطة المشرف.</translation>
 <translation id="283669119850230892">لاستخدام الشبكة <ph name="NETWORK_ID" />، أكمل أولاً اتصالك بالإنترنت أدناه.</translation>
@@ -2239,6 +2240,7 @@
 <translation id="3105796011181310544">‏هل تريد التغيير مرة أخرى إلى Google؟</translation>
 <translation id="310671807099593501">يستخدم الموقع الإلكتروني البلوتوث.</translation>
 <translation id="3108931485517391283">يتعذّر تلقّي الملف</translation>
+<translation id="3109206895301430738">مجموعات علامات التبويب المحفوظة</translation>
 <translation id="3109724472072898302">مصغّر</translation>
 <translation id="311214366526552035">التنزيل على أيّ حال</translation>
 <translation id="3112292765614504292">حجم التطبيق: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 71119bf..b6659396 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -970,6 +970,7 @@
 <translation id="1892341345406963517">নমস্কাৰ <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">অন্য ভাষা</translation>
 <translation id="1895658205118569222">শ্বাটডাউন</translation>
+<translation id="1897120393475391208">বিশ্বস্ত পাছৱৰ্ড ব্যৱহাৰ কৰক</translation>
 <translation id="1900305421498694955">Google Playৰ এপ্‌সমূহক বাহ্যিক ষ্ট’ৰেজ ডিভাইচসমূহত থকা ফাইলসমূহ পঢ়িবলৈ আৰু লিখিবলৈ সম্পূৰ্ণ ফাইল ছিষ্টেমৰ এক্সেছ প্ৰয়োজন হ’ব পাৰে। ডিভাইচটোত সৃষ্টি কৰা ফাইল আৰু ফ’ল্ডাৰসমূহ বাহ্যিক ড্ৰাইভটো ব্যৱহাৰ কৰা সকলোৰে বাবে দৃশ্যমান। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">&amp;সকলো বাছনি কৰক</translation>
 <translation id="1901396183631570154">Chromeএ আপোনাৰ Google একাউণ্টত এই পাছৱৰ্ডসমূহ ছেভ কৰিব নোৱাৰিলে। আপুনি তথাপি সেইসমূহ এই ডিভাইচটোত ছেভ কৰিব পাৰে।</translation>
@@ -6563,6 +6564,7 @@
 <translation id="7444970023873202833">Google Photosত আপোনাৰ স্মৃতিসমূহ আৰু অন্বেষণ কৰক</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> অক্ষম কৰক</translation>
 <translation id="7448430327655618736">এপ্‌সমূহ স্বয়ংক্ৰিয়ভাৱে ইনষ্টল কৰক</translation>
+<translation id="7449381494541372002">আৰম্ভ হৈ আছে...</translation>
 <translation id="7449752890690775568">পাছৱৰ্ড আঁতৰাবনে?</translation>
 <translation id="7450761244949417357">এতিয়া <ph name="ALTERNATIVE_BROWSER_NAME" />ত খুলি থকা হৈছে</translation>
 <translation id="7452166281927983300">অগ্ৰাহ্য কৰা সকীয়নি (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb
index 2e3fd50..171117e 100644
--- a/chrome/app/resources/generated_resources_az.xtb
+++ b/chrome/app/resources/generated_resources_az.xtb
@@ -419,6 +419,7 @@
 <translation id="1415708812149920388">Buferdəki kontenti oxumaq üçün giriş rədd edildi</translation>
 <translation id="1415990189994829608"><ph name="EXTENSION_NAME" /> ("<ph name="EXTENSION_ID" />") identifikasiyalı artırmaya bu tip sessiyada icazə verilmir.</translation>
 <translation id="1418552618736477642">Bildirişlər və tətbiqlər</translation>
+<translation id="1418882096915998312">Müəssisə qeydiyyatı davam edir</translation>
 <translation id="1418954524306642206">Printer PPD faylını təyin etmək üçün baxış keçirin</translation>
 <translation id="1420834118113404499">Media lisenziyası</translation>
 <translation id="1420920093772172268">Cütləməyə icazə vermək üçün <ph name="TURN_ON_BLUETOOTH_LINK" /></translation>
@@ -3402,6 +3403,7 @@
 <translation id="4275830172053184480">Cihazınızı yenidən başladın</translation>
 <translation id="4277434192562187284">XML konfiqurasiya mənbəyi</translation>
 <translation id="4278390842282768270">İcazə verilib</translation>
+<translation id="4278498748067682896">Cihazın yalnız köşk və ya işarə rejimində işləməsinə imkan verən Köşk və İşarə Güncəlləməsindən istifadə edəcəksiniz. İstifadəçilərin cihaza daxil olmasını istəyirsinizsə, geri qayıdın və Chrome Enterprise Upgrade ilə qeydiyyatdan keçin.</translation>
 <translation id="4279129444466079448">Bu cihazda maksimum <ph name="PROFILE_LIMIT" /> eSIM profili quraşdıra bilərsiniz. Başqa bir profil əlavə etmək üçün əvvəlcə mövcud profili silin.</translation>
 <translation id="4280325816108262082">Cihaz söndürüldükdə və ya istifadə edilmədikdə avtomatik olaraq ayrılacaq</translation>
 <translation id="4281844954008187215">Xidmət Şərtləri</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index f9c3706..5a5b094 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1957,6 +1957,7 @@
 <translation id="2832124733806557606">Ваша дзіця можа выкарыстоўваць PIN-код для ўваходу ва ўліковы запіс і разблакіроўкі прылады.</translation>
 <translation id="2835177225987815960">Бягучыя налады сканіравання, у тым ліку ўсе прызначаныя пераключальнікі і хуткасць аўтаматычнага сканіравання, будуць скінуты.</translation>
 <translation id="2835547721736623118">Сэрвіс распазнавання маўлення</translation>
+<translation id="2836232638504556905">Каб працягнуць, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> абагуліць ваша імя, адрас электроннай пошты і відарыс профілю з гэтым сайтам. Азнаёмцеся з <ph name="BEGIN_LINK" />палітыкай прыватнасці<ph name="END_LINK" /> сайта.</translation>
 <translation id="2836269494620652131">Збой</translation>
 <translation id="2836635946302913370">Уваход пад гэтым іменем карыстальніка выключаны адміністратарам.</translation>
 <translation id="283669119850230892">Каб выкарыстоўваць сетку <ph name="NETWORK_ID" />, спачатку завяршыце падключэнне да інтэрнэту (гл. ніжэй).</translation>
@@ -2238,6 +2239,7 @@
 <translation id="3105796011181310544">Зноў зрабіць Google стандартнай пошукавай сістэмай?</translation>
 <translation id="310671807099593501">Сайт выкарыстоўвае Bluetooth</translation>
 <translation id="3108931485517391283">Не ўдалося атрымаць</translation>
+<translation id="3109206895301430738">Захаваныя групы ўкладак</translation>
 <translation id="3109724472072898302">Згорнута</translation>
 <translation id="311214366526552035">Усё роўна спампаваць</translation>
 <translation id="3112292765614504292">Памер праграмы: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 600f9407c..78c58308 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1966,6 +1966,7 @@
 <translation id="2832124733806557606">Детето ви може да използва ПИН код, за да влиза в профила си или да отключва устройството.</translation>
 <translation id="2835177225987815960">Текущите ви настройки за сканиране ще бъдат нулирани, включително зададените превключватели и предпочитанията за скорост на автоматичното сканиране.</translation>
 <translation id="2835547721736623118">Услуга за разпознаване на говор</translation>
+<translation id="2836232638504556905">За да продължите, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ще сподели с този сайт името, имейл адреса и снимката на потребителския ви профил. Вижте <ph name="BEGIN_LINK" />декларацията за поверителност<ph name="END_LINK" /> на сайта.</translation>
 <translation id="2836269494620652131">Срив</translation>
 <translation id="2836635946302913370">Влизането с това потребителско име е деактивирано от администратора ви.</translation>
 <translation id="283669119850230892">За да използвате мрежата <ph name="NETWORK_ID" />, първо завършете свързването си с интернет по-долу.</translation>
@@ -2247,6 +2248,7 @@
 <translation id="3105796011181310544">Искате ли да се върнете към Google?</translation>
 <translation id="310671807099593501">Сайтът използва Bluetooth</translation>
 <translation id="3108931485517391283">Не е възможно получаване</translation>
+<translation id="3109206895301430738">Запазени групи раздели</translation>
 <translation id="3109724472072898302">Свито</translation>
 <translation id="311214366526552035">Изтегляне въпреки това</translation>
 <translation id="3112292765614504292">Размер на приложението: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index a3684cc..04c43d77 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -973,6 +973,7 @@
 <translation id="1892341345406963517">হাই <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">অন্যান্য ভাষা</translation>
 <translation id="1895658205118569222">বন্ধ করুন</translation>
+<translation id="1897120393475391208">শক্তিশালী পাসওয়ার্ড ব্যবহার করুন</translation>
 <translation id="1900305421498694955">এক্সটার্নাল স্টোরেজ ডিভাইসে ফাইল পড়তে এবং সেভ করতে Google Play থেকে ডাউনলোড করা অ্যাপের সম্পূর্ণ ফাইল সিস্টেমে অ্যাক্সেসের প্রয়োজন হতে পারে। ডিভাইসে তৈরি করা ফাইল এবং ফোল্ডার এক্সটার্নাল ড্রাইভ ব্যবহারকারীরা দেখতে পারবেন। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">&amp;সকল বেছে নিন</translation>
 <translation id="1901396183631570154">আপনার Google অ্যাকাউন্টে Chrome এই পাসওয়ার্ডগুলি সেভ করতে পারেনি। যদিও আপনি এখনও এগুলিকে এই ডিভাইসে সেভ করে রাখতে পারেন।</translation>
@@ -6570,6 +6571,7 @@
 <translation id="7444970023873202833">Google Photos-এ আপনার মেমোরি থেকে আরও ফটো দেখুন</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> বন্ধ করুন</translation>
 <translation id="7448430327655618736">অ্যাপ অটোমেটিক ইনস্টল করে</translation>
+<translation id="7449381494541372002">শুরু হচ্ছে…</translation>
 <translation id="7449752890690775568">পাসওয়ার্ড সরিয়ে দেবেন?</translation>
 <translation id="7450761244949417357">এখন <ph name="ALTERNATIVE_BROWSER_NAME" /> চালু হচ্ছে</translation>
 <translation id="7452166281927983300">বাতিল করা সতর্কতা (<ph name="MUTED_PASSWORDS" />টি)</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 78ca336..a147d03 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1955,6 +1955,7 @@
 <translation id="2832124733806557606">El teu fill pot utilitzar un PIN per iniciar la sessió o desbloquejar el dispositiu.</translation>
 <translation id="2835177225987815960">Es restablirà la teva configuració actual de cerca, la qual inclou tots els interruptors assignats i les preferències de velocitat per a la cerca automàtica.</translation>
 <translation id="2835547721736623118">Servei de reconeixement de parla</translation>
+<translation id="2836232638504556905">Per continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirà el teu nom, la teva adreça electrònica i la teva foto de perfil amb aquest lloc web. Consulta la <ph name="BEGIN_LINK" />política de privadesa<ph name="END_LINK" /> del lloc web.</translation>
 <translation id="2836269494620652131">Bloqueig</translation>
 <translation id="2836635946302913370">L'administrador ha desactivat l'inici de sessió amb aquest nom d'usuari.</translation>
 <translation id="283669119850230892">Per fer servir la xarxa <ph name="NETWORK_ID" />, primer cal establir la connexió a Internet a continuació.</translation>
@@ -2236,6 +2237,7 @@
 <translation id="3105796011181310544">Vols tornar a utilitzar Google?</translation>
 <translation id="310671807099593501">El lloc web està utilitzant el Bluetooth</translation>
 <translation id="3108931485517391283">No es pot rebre</translation>
+<translation id="3109206895301430738">Grups de pestanyes desats</translation>
 <translation id="3109724472072898302">Reduït</translation>
 <translation id="311214366526552035">Baixa igualment</translation>
 <translation id="3112292765614504292">Mida de l'aplicació: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb
index adafbef..9f8efdf8 100644
--- a/chrome/app/resources/generated_resources_cy.xtb
+++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -1973,6 +1973,7 @@
 <translation id="2832124733806557606">Gall eich plentyn ddefnyddio PIN i fewngofnodi neu ddatgloi'r ddyfais.</translation>
 <translation id="2835177225987815960">Bydd eich gosodiad sganio presennol yn cael ei ailosod, gan gynnwys unrhyw switshis sydd wedi'u haseinio a dewisiadau cyflymder awtosganio.</translation>
 <translation id="2835547721736623118">Gwasanaeth adnabod llais</translation>
+<translation id="2836232638504556905">I barhau, bydd <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> yn rhannu eich enw, eich e-bost, eich cyfeiriad, a'ch llun proffil gyda'r wefan. Gweld <ph name="BEGIN_LINK" />polisi preifatrwydd<ph name="END_LINK" /> y wefan hon.</translation>
 <translation id="2836269494620652131">Wedi torri</translation>
 <translation id="2836635946302913370">Mae mewngofnodi gyda'r enw defnyddiwr hwn wedi'i analluogi gan eich gweinyddwr.</translation>
 <translation id="283669119850230892">I ddefnyddio'r rhwydwaith <ph name="NETWORK_ID" />, cwblhewch eich cysylltiad â'r Rhyngrwyd isod yn gyntaf.</translation>
@@ -2254,6 +2255,7 @@
 <translation id="3105796011181310544">Newid yn ôl i Google?</translation>
 <translation id="310671807099593501">Mae'r wefan yn defnyddio Bluetooth</translation>
 <translation id="3108931485517391283">Methu â chael</translation>
+<translation id="3109206895301430738">Cadwyd Grwpiau Tabiau</translation>
 <translation id="3109724472072898302">Wedi'i grebachu</translation>
 <translation id="311214366526552035">Lawrlwytho Beth Bynnag</translation>
 <translation id="3112292765614504292">Maint ap: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index e06a62c4..a1f15ac 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1971,6 +1971,7 @@
 <translation id="2832124733806557606">Dit barn kan bruge en pinkode til at logge ind på enheden eller låse den op.</translation>
 <translation id="2835177225987815960">Din aktuelle konfiguration af scanning nulstilles, herunder præferencerne for tildelte kontakter og hastigheden ved automatisk scanning.</translation>
 <translation id="2835547721736623118">Tjeneste til talegenkendelse</translation>
+<translation id="2836232638504556905">For at fortsætte deler <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> dit navn, din mailadresse, og dit profilbillede med dette website. Se dette websites <ph name="BEGIN_LINK" />privatlivspolitik<ph name="END_LINK" />.</translation>
 <translation id="2836269494620652131">Nedbrud</translation>
 <translation id="2836635946302913370">Login med dette brugernavn er blevet deaktiveret af din administrator.</translation>
 <translation id="283669119850230892">Hvis du vil bruge netværket <ph name="NETWORK_ID" />, skal du først oprette forbindelse til internettet nedenfor.</translation>
@@ -2252,6 +2253,7 @@
 <translation id="3105796011181310544">Vil du skifte tilbage til Google?</translation>
 <translation id="310671807099593501">Websitet anvender Bluetooth</translation>
 <translation id="3108931485517391283">Kan ikke modtage</translation>
+<translation id="3109206895301430738">Gemte fanegrupper</translation>
 <translation id="3109724472072898302">Skjult</translation>
 <translation id="311214366526552035">Download alligevel</translation>
 <translation id="3112292765614504292">Appstørrelse: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 286edd4..308f2ed 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -999,6 +999,7 @@
 <translation id="1942600407708803723">Beim Zuklappen herunterfahren</translation>
 <translation id="1944528062465413897">Bluetooth-Kopplungscode:</translation>
 <translation id="1944921356641260203">Update gefunden</translation>
+<translation id="1947136734041527201">Du kannst dich mit einem Konto, das du bei einem Identitätsdienst hast, auf Websites anmelden</translation>
 <translation id="1949584741547056205">Schnelle Antworten</translation>
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1954597385941141174">Websites dürfen nachfragen, wenn sie eine Verbindung mit USB-Geräten herstellen möchten</translation>
@@ -1952,6 +1953,7 @@
 <translation id="2832124733806557606">Dein Kind kann eine PIN verwenden, um sich anzumelden oder das Gerät zu entsperren.</translation>
 <translation id="2835177225987815960">Deine aktuelle Scankonfiguration wird zurückgesetzt, einschließlich aller Einstellungen für zugewiesene Schalter und für die Geschwindigkeit des automatischen Scans.</translation>
 <translation id="2835547721736623118">Spracherkennungsservice</translation>
+<translation id="2836232638504556905"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> teilt zum Fortfahren deinen Namen, deine E-Mail-Adresse und dein Profilbild mit dieser Website. Lies die <ph name="BEGIN_LINK" />Datenschutzerklärung<ph name="END_LINK" /> dieser Website.</translation>
 <translation id="2836269494620652131">Absturz</translation>
 <translation id="2836635946302913370">Die Anmeldung mit diesem Nutzernamen wurde von deinem Administrator deaktiviert.</translation>
 <translation id="283669119850230892">Zur Verwendung des Netzwerks "<ph name="NETWORK_ID" />" musst du zuerst unten deine Internetverbindung herstellen.</translation>
@@ -2233,6 +2235,7 @@
 <translation id="3105796011181310544">Wieder zu Google wechseln?</translation>
 <translation id="310671807099593501">Die Website verwendet Bluetooth</translation>
 <translation id="3108931485517391283">Empfang nicht möglich</translation>
+<translation id="3109206895301430738">Gespeicherte Tabgruppen</translation>
 <translation id="3109724472072898302">Minimiert</translation>
 <translation id="311214366526552035">Trotzdem herunterladen</translation>
 <translation id="3112292765614504292">App-Größe: <ph name="APP_SIZE" /></translation>
@@ -2394,6 +2397,7 @@
 <translation id="32939749466444286">Der Linux-Container konnte nicht gestartet werden. Bitte versuche es noch einmal.</translation>
 <translation id="3294437725009624529">Gast</translation>
 <translation id="3294686910656423119">Nutzungsstatistik und Absturzberichte</translation>
+<translation id="3297105622164376095">Dürfen Aufforderungen zur Anmeldung von Drittanbietern anzeigen</translation>
 <translation id="3297536526040732495">Verknüpft diese Daten vorübergehend mit deinem Google-Konto, sofern du angemeldet bist, um dich in Google-Apps zu schützen</translation>
 <translation id="329838636886466101">Reparieren</translation>
 <translation id="3298789223962368867">Die eingegebene URL ist ungültig.</translation>
@@ -3649,6 +3653,7 @@
 <translation id="452750746583162491">Synchronisierte Daten prüfen</translation>
 <translation id="4527929807707405172">„Scrollrichtung umkehren“ aktivieren <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Übersetzungsvorschlag</translation>
+<translation id="4529455689802245339">Die Chrome-Funktion „Automatische Untertitel“ funktioniert eventuell nicht</translation>
 <translation id="4530494379350999373">Ursprung</translation>
 <translation id="4531924570968473143">Wen möchtest du diesem Gerät (<ph name="DEVICE_TYPE" />) hinzufügen?</translation>
 <translation id="4532625150642446981">„<ph name="USB_DEVICE_NAME" />“ wird gegenwärtig verwendet. Wenn du das Gerät neu zuweist, während es verwendet wird, kann dies zu Fehlern führen. Möchtest du den Vorgang wirklich fortsetzen?</translation>
@@ -3847,6 +3852,7 @@
 <translation id="471880041731876836">Du bist nicht berechtigt, auf diese Website zuzugreifen</translation>
 <translation id="4722735765955348426">Passwort für <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> hat deinen Bildschirm freigegeben.</translation>
+<translation id="4722989931633062466">Dürfen keine Aufforderungen zur Anmeldung von Drittanbietern anzeigen</translation>
 <translation id="4723140812774948886">Mit nächstem tauschen</translation>
 <translation id="4724450788351008910">Zugehörigkeit geändert</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4815,6 +4821,7 @@
 <translation id="5711010025974903573">Dienstprotokolle</translation>
 <translation id="5711983031544731014">Entsperren nicht möglich. Bitte gib dein Passwort ein.</translation>
 <translation id="5712153969432126546">Websites veröffentlichen manchmal PDFs wie Dokumente, Verträge und Formulare</translation>
+<translation id="571222594670061844">Websites dürfen Aufforderungen zur Anmeldung von Identitätsdiensten anzeigen</translation>
 <translation id="5713158217420111469">Verbunden mit <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Plug-in-Broker: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Standardsuchmaschinen</translation>
@@ -4973,6 +4980,7 @@
 <translation id="5876851302954717356">Neuer Tab rechts</translation>
 <translation id="5877064549588274448">Kanal geändert. Starte dein Gerät neu, um die Änderungen zu übernehmen.</translation>
 <translation id="5877584842898320529">Der ausgewählte Drucker ist entweder nicht verfügbar oder nicht ordnungsgemäß installiert. <ph name="BR" /> Überprüfe den Drucker oder wähle einen anderen Drucker aus.</translation>
+<translation id="5878945009165002849">Aufforderungen zur Anmeldung von Identitätsdiensten blockieren</translation>
 <translation id="5882919346125742463">Bekannte Netzwerke</translation>
 <translation id="5883356647197510494"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> automatisch blockiert</translation>
 <translation id="5884474295213649357">Dieser Tab ist mit einem USB-Gerät verbunden.</translation>
@@ -5609,6 +5617,7 @@
 <translation id="6513247462497316522">Google Chrome verwendet Mobilfunk, wenn du nicht mit einem anderen Netzwerk verbunden bist.</translation>
 <translation id="6514010653036109809">Verfügbares Gerät:</translation>
 <translation id="6514565641373682518">Diese Seite hat den Cursor deaktiviert.</translation>
+<translation id="6517709704288360414">Dein Gerät funktioniert dann möglicherweise nicht mehr richtig und es können Sicherheits- und Leistungsprobleme auftreten. Das Deaktivieren von Updates beeinträchtigt eventuell auch deinen Anspruch, rechtliche Forderungen zu stellen, falls Probleme auftreten sollten.</translation>
 <translation id="6518014396551869914">Bild ko&amp;pieren</translation>
 <translation id="6518133107902771759">Bestätigen</translation>
 <translation id="651942933739530207">Soll <ph name="APP_NAME" /> deinen Bildschirm und deine Audioausgabe freigeben?</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index bf771ce..0303049f 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1970,6 +1970,7 @@
 <translation id="2832124733806557606">Το παιδί σας μπορεί χρησιμοποιεί PIN για να συνδέεται ή να ξεκλειδώνει τη συσκευή του.</translation>
 <translation id="2835177225987815960">Θα γίνει επαναφορά της τρέχουσας ρύθμισης σάρωσης, συμπεριλαμβανομένων τυχόν διακοπτών που έχουν ανατεθεί καθώς και προτιμήσεων ταχύτητας αυτόματης σάρωσης.</translation>
 <translation id="2835547721736623118">Υπηρεσία αναγνώρισης ομιλίας</translation>
+<translation id="2836232638504556905">Για να συνεχίσετε, το <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> θα κοινοποιήσει το όνομα, τη διεύθυνση ηλεκτρονικού ταχυδρομείου και τη φωτογραφία προφίλ σας σε αυτόν τον ιστότοπο. Δείτε την <ph name="BEGIN_LINK" />πολιτική απορρήτου<ph name="END_LINK" /> αυτού του ιστοτόπου.</translation>
 <translation id="2836269494620652131">Σφάλμα</translation>
 <translation id="2836635946302913370">Η σύνδεση με αυτό το όνομα χρήστη έχει απενεργοποιηθεί από τον διαχειριστή σας.</translation>
 <translation id="283669119850230892">Για τη χρήση του δικτύου <ph name="NETWORK_ID" />, πρώτα ολοκληρώστε τη σύνδεσή σας στο διαδίκτυο παρακάτω.</translation>
@@ -2251,6 +2252,7 @@
 <translation id="3105796011181310544">Αλλαγή σε Google;</translation>
 <translation id="310671807099593501">Ο ιστότοπος χρησιμοποιεί bluetooth</translation>
 <translation id="3108931485517391283">Δεν είναι δυνατή η λήψη</translation>
+<translation id="3109206895301430738">Αποθηκευμένες ομάδες καρτελών</translation>
 <translation id="3109724472072898302">Συμπτυγμένο</translation>
 <translation id="311214366526552035">Λήψη ούτως ή άλλως</translation>
 <translation id="3112292765614504292">Μέγεθος εφαρμογής: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 5fa5419..1eb507b473 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1015,6 +1015,7 @@
 <translation id="1942600407708803723">Shut down when cover is closed</translation>
 <translation id="1944528062465413897">Bluetooth pairing code</translation>
 <translation id="1944921356641260203">Update found</translation>
+<translation id="1947136734041527201">Lets you sign in to websites using the account that you have with an identity service</translation>
 <translation id="1949584741547056205">Quick answers</translation>
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1954597385941141174">Sites can ask to connect to USB devices</translation>
@@ -2415,6 +2416,7 @@
 <translation id="32939749466444286">The Linux container didn't start. Please try again.</translation>
 <translation id="3294437725009624529">Guest</translation>
 <translation id="3294686910656423119">Usage statistics and crash reports</translation>
+<translation id="3297105622164376095">Allowed to show third-party sign-in prompts</translation>
 <translation id="3297536526040732495">Temporarily links this data to your Google Account when you're signed in, to protect you across Google apps</translation>
 <translation id="329838636886466101">Repair</translation>
 <translation id="3298789223962368867">Invalid URL entered.</translation>
@@ -3671,6 +3673,7 @@
 <translation id="452750746583162491">Review your synced data</translation>
 <translation id="4527929807707405172">Enable reverse scrolling. <ph name="LINK_BEGIN" />Learn more<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Translation suggestion</translation>
+<translation id="4529455689802245339">Chrome Live Caption might not work</translation>
 <translation id="4530494379350999373">Origin</translation>
 <translation id="4531924570968473143">Who would you like to add to this <ph name="DEVICE_TYPE" />?</translation>
 <translation id="4532625150642446981">"<ph name="USB_DEVICE_NAME" />" is in use. Reassigning the device while it's in use could cause errors. Are you sure that you want to continue?</translation>
@@ -3869,6 +3872,7 @@
 <translation id="471880041731876836">You don't have permission to visit this site</translation>
 <translation id="4722735765955348426">Password for <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> is sharing your screen.</translation>
+<translation id="4722989931633062466">Not allowed to show third-party sign-in prompts</translation>
 <translation id="4723140812774948886">Swap with next</translation>
 <translation id="4724450788351008910">Affiliation Changed</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4839,6 +4843,7 @@
 <translation id="5711010025974903573">Service logs</translation>
 <translation id="5711983031544731014">Unable to unlock. Enter your password.</translation>
 <translation id="5712153969432126546">Sites sometimes publish PDFs, like documents, contracts and forms</translation>
+<translation id="571222594670061844">Sites can show sign-in prompts from identity services</translation>
 <translation id="5713158217420111469">Connected to <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Plug-in Broker: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Default search engines</translation>
@@ -4997,6 +5002,7 @@
 <translation id="5876851302954717356">New Tab to the Right</translation>
 <translation id="5877064549588274448">Channel changed. Restart your device to apply changes.</translation>
 <translation id="5877584842898320529">The selected printer is not available or not installed correctly. <ph name="BR" /> Check your printer or try selecting another printer.</translation>
+<translation id="5878945009165002849">Block sign-in prompts from identity services</translation>
 <translation id="5882919346125742463">Known Networks</translation>
 <translation id="5883356647197510494">Automatically blocked <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">This tab is connected to a USB device.</translation>
@@ -5634,6 +5640,7 @@
 <translation id="6513247462497316522">Google Chrome will use mobile data if you're not connected to another network.</translation>
 <translation id="6514010653036109809">Available device:</translation>
 <translation id="6514565641373682518">This page has disabled your mouse cursor.</translation>
+<translation id="6517709704288360414">Your device may no longer work properly, and you may experience security and performance issues. Turning off updates may also impact your right to make legal claims if you experience any issues.</translation>
 <translation id="6518014396551869914">Cop&amp;y image</translation>
 <translation id="6518133107902771759">Verify</translation>
 <translation id="651942933739530207">Do you want <ph name="APP_NAME" /> to share your screen and audio output?</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 1217faa..b365ec7 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1952,6 +1952,7 @@
 <translation id="2832124733806557606">Tu hijo puede usar un PIN para acceder al dispositivo o desbloquearlo.</translation>
 <translation id="2835177225987815960">Se restablecerá la configuración actual de escaneo, incluidos los interruptores asignados y las preferencias de velocidad de escaneo automático.</translation>
 <translation id="2835547721736623118">Servicio de reconocimiento de voz</translation>
+<translation id="2836232638504556905">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá tu nombre, dirección de correo electrónico y foto de perfil con este sitio. Consulta la <ph name="BEGIN_LINK" />política de privacidad<ph name="END_LINK" /> de este sitio.</translation>
 <translation id="2836269494620652131">Fallo</translation>
 <translation id="2836635946302913370">El administrador ha inhabilitado el inicio de sesión para este nombre de usuario.</translation>
 <translation id="283669119850230892">Para utilizar la red <ph name="NETWORK_ID" />, primero debes establecer la conexión a Internet que se especifica a continuación.</translation>
@@ -2233,6 +2234,7 @@
 <translation id="3105796011181310544">¿Deseas volver a Google?</translation>
 <translation id="310671807099593501">El sitio está usando la conexión Bluetooth</translation>
 <translation id="3108931485517391283">No se puede recibir el archivo</translation>
+<translation id="3109206895301430738">Grupos de pestañas guardados</translation>
 <translation id="3109724472072898302">Contraído</translation>
 <translation id="311214366526552035">Descargar de todos modos</translation>
 <translation id="3112292765614504292">Tamaño de la app: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 59549cc6..302de0a 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1002,6 +1002,7 @@
 <translation id="1942600407708803723">Apagar cuando se cierre la tapa</translation>
 <translation id="1944528062465413897">Código de emparejamiento por Bluetooth:</translation>
 <translation id="1944921356641260203">Actualización encontrada</translation>
+<translation id="1947136734041527201">Permite iniciar sesión en sitios web con la cuenta que tengas con un servicio de identidad</translation>
 <translation id="1949584741547056205">Respuestas rápidas</translation>
 <translation id="1951012854035635156">Asistente</translation>
 <translation id="1954597385941141174">Los sitios pueden solicitar permiso para conectarse a dispositivos USB</translation>
@@ -1955,6 +1956,7 @@
 <translation id="2832124733806557606">Tu hijo/a puede usar el PIN para iniciar sesión en el dispositivo o para desbloquearlo.</translation>
 <translation id="2835177225987815960">Se borrará la configuración de búsqueda actual, incluyendo todos los interruptores asignados y las preferencias de velocidad de la búsqueda automática.</translation>
 <translation id="2835547721736623118">Servicio de reconocimiento de voz</translation>
+<translation id="2836232638504556905">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá tu nombre, dirección de correo electrónico e imagen de perfil con este sitio. Consulta la <ph name="BEGIN_LINK" />política de privacidad<ph name="END_LINK" /> de este sitio.</translation>
 <translation id="2836269494620652131">Error</translation>
 <translation id="2836635946302913370">El administrador ha inhabilitado el inicio de sesión para este nombre de usuario.</translation>
 <translation id="283669119850230892">Para utilizar la red <ph name="NETWORK_ID" />, primero debes establecer la conexión a Internet que se especifica a continuación.</translation>
@@ -2236,6 +2238,7 @@
 <translation id="3105796011181310544">¿Cambiar de nuevo a Google?</translation>
 <translation id="310671807099593501">El sitio web está usando el Bluetooth</translation>
 <translation id="3108931485517391283">Error al recibir</translation>
+<translation id="3109206895301430738">Grupos de pestañas guardados</translation>
 <translation id="3109724472072898302">Contraído</translation>
 <translation id="311214366526552035">Descargar de todos modos</translation>
 <translation id="3112292765614504292">Tamaño de la aplicación: <ph name="APP_SIZE" /></translation>
@@ -2397,6 +2400,7 @@
 <translation id="32939749466444286">El contenedor de Linux no se ha iniciado. Inténtalo de nuevo.</translation>
 <translation id="3294437725009624529">Invitado</translation>
 <translation id="3294686910656423119">Estadísticas de uso e informes sobre fallos</translation>
+<translation id="3297105622164376095">Tiene permiso para mostrar notificaciones de inicio de sesión de terceros</translation>
 <translation id="3297536526040732495">Vincula temporalmente estos datos a tu cuenta de Google (si has iniciado sesión) para protegerte en las aplicaciones de Google.</translation>
 <translation id="329838636886466101">Reparar</translation>
 <translation id="3298789223962368867">URL introducida no válida</translation>
@@ -3651,6 +3655,7 @@
 <translation id="452750746583162491">Revisar los datos sincronizados</translation>
 <translation id="4527929807707405172">Habilitar desplazamiento inverso. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Sugerencia de traducción</translation>
+<translation id="4529455689802245339">Subtítulos automáticos de Chrome podría no funcionar</translation>
 <translation id="4530494379350999373">Origen</translation>
 <translation id="4531924570968473143">¿A quién quieres añadir a este <ph name="DEVICE_TYPE" />?</translation>
 <translation id="4532625150642446981">"<ph name="USB_DEVICE_NAME" />" está en uso. Si el dispositivo se reasigna mientras se está usando, podrían producirse errores. ¿Seguro que quieres continuar?</translation>
@@ -3849,6 +3854,7 @@
 <translation id="471880041731876836">No tienes permiso para acceder a este sitio web</translation>
 <translation id="4722735765955348426">Contraseña de <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> está compartiendo tu pantalla.</translation>
+<translation id="4722989931633062466">No tiene permiso para mostrar notificaciones de inicio de sesión de terceros</translation>
 <translation id="4723140812774948886">Intercambiar con el siguiente</translation>
 <translation id="4724450788351008910">Afiliación modificada</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4819,6 +4825,7 @@
 <translation id="5711010025974903573">Registros del servicio</translation>
 <translation id="5711983031544731014">No se puede realizar el desbloqueo. Introduce tu contraseña.</translation>
 <translation id="5712153969432126546">A veces, los sitios publican archivos PDF, como documentos, contratos y formularios</translation>
+<translation id="571222594670061844">Los sitios pueden mostrar notificaciones de inicio de sesión de servicios de identidad</translation>
 <translation id="5713158217420111469">Conectado a <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Agente de complementos: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Buscadores predeterminados</translation>
@@ -4977,6 +4984,7 @@
 <translation id="5876851302954717356">Nueva pestaña a la derecha</translation>
 <translation id="5877064549588274448">Se ha cambiado el canal. Reinicia el dispositivo para aplicar los cambios.</translation>
 <translation id="5877584842898320529">La impresora seleccionada no se encuentra disponible o no está bien instalada. <ph name="BR" /> Compruébala o prueba a seleccionar otra.</translation>
+<translation id="5878945009165002849">Bloquear notificaciones de inicio de sesión de servicios de identidad</translation>
 <translation id="5882919346125742463">Redes conocidas</translation>
 <translation id="5883356647197510494">Con bloqueo automático: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Esta pestaña está conectada a un dispositivo USB.</translation>
@@ -5614,6 +5622,7 @@
 <translation id="6513247462497316522">Google Chrome utilizará datos móviles si no te has conectado a otra red.</translation>
 <translation id="6514010653036109809">Dispositivo disponible:</translation>
 <translation id="6514565641373682518">Esta página ha inhabilitado el cursor de tu ratón.</translation>
+<translation id="6517709704288360414">Es posible que tu dispositivo ya no funcione correctamente y que tengas problemas de seguridad y rendimiento. Desactivar las actualizaciones también puede afectar a tu derecho a presentar demandas judiciales si tienes algún problema.</translation>
 <translation id="6518014396551869914">Copia&amp;r imagen</translation>
 <translation id="6518133107902771759">Verificar</translation>
 <translation id="651942933739530207">¿Quieres que <ph name="APP_NAME" /> comparta la pantalla y la salida de audio?</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index 6c8c47e..c483a195 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -960,6 +960,7 @@
 <translation id="1892341345406963517">Kaixo, <ph name="PARENT_NAME" />!</translation>
 <translation id="189358972401248634">Beste hizkuntzak</translation>
 <translation id="1895658205118569222">Itzali</translation>
+<translation id="1897120393475391208">Erabili pasahitz seguru bat</translation>
 <translation id="1900305421498694955">Google Play-ko aplikazioek sistemako fitxategi guztiak atzitzeko baimena beharko dute agian kanpoko memoriako fitxategiak irakurri eta haietan idazteko. Kanpoko unitatea darabilen edonork ikusi ahalko ditu gailuan sortutako fitxategi eta karpetak. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">Hautatu &amp;guztiak</translation>
 <translation id="1901396183631570154">Chrome-k ezin izan ditu gorde pasahitz horiek zure Google-ko kontuan. Gailu honetan gorde ditzakezu, bestela.</translation>
@@ -1954,6 +1955,7 @@
 <translation id="2832124733806557606">Haurrak PIN bat erabil dezake saioa hasteko edo gailua desblokeatzeko.</translation>
 <translation id="2835177225987815960">Oraingo mugitze-konfigurazioa berrezarri egingo da, esleitutako etengailuak eta pantailan automatikoki mugitzeko abiadura-hobespenak barne.</translation>
 <translation id="2835547721736623118">Ahotsa hautemateko zerbitzua</translation>
+<translation id="2836232638504556905">Aurrera egiteko, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> hornitzaileak zure izena, helbide elektronikoa eta profileko argazkia partekatuko ditu webgune honekin. Ikusi webgunearen <ph name="BEGIN_LINK" />pribatutasun-gidalerroak<ph name="END_LINK" />.</translation>
 <translation id="2836269494620652131">Hutsegitea</translation>
 <translation id="2836635946302913370">Administratzaileak desgaitu egin du erabiltzaile-izen horrekin saioa hasteko aukera.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> sarea erabiltzeko, lehendabizi, osatu Interneterako konexioa hemen behean.</translation>
@@ -2235,6 +2237,7 @@
 <translation id="3105796011181310544">Google-ra itzuli nahi duzu?</translation>
 <translation id="310671807099593501">Webgunea Bluetooth-a erabiltzen ari da</translation>
 <translation id="3108931485517391283">Ezin da jaso</translation>
+<translation id="3109206895301430738">Gordetako fitxa taldeak</translation>
 <translation id="3109724472072898302">Tolestuta</translation>
 <translation id="311214366526552035">Deskargatu halere</translation>
 <translation id="3112292765614504292">Aplikazioaren tamaina: <ph name="APP_SIZE" /></translation>
@@ -6536,6 +6539,7 @@
 <translation id="7444970023873202833">Arakatu oroitzapen gehiago Google Argazkiak zerbitzuan</translation>
 <translation id="7444983668544353857">Desgaitu <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Instalatu aplikazioak automatikoki</translation>
+<translation id="7449381494541372002">abiarazten…</translation>
 <translation id="7449752890690775568">Pasahitza kendu nahi duzu?</translation>
 <translation id="7450761244949417357"><ph name="ALTERNATIVE_BROWSER_NAME" /> arakatzailean irekiko da orain</translation>
 <translation id="7452166281927983300">Baztertutako abisuak (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index b1243c5c..6eb09bb 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1969,6 +1969,7 @@
 <translation id="2832124733806557606">Lapsi voi avata tämän laitteen tai kirjautua sille PIN-koodilla.</translation>
 <translation id="2835177225987815960">Nykyiset skannausmääritykset nollataan, mukaan lukien kaikki määritetyt kytkimet ja automaattisen skannauksen nopeusasetukset.</translation>
 <translation id="2835547721736623118">Puheentunnistuspalvelu</translation>
+<translation id="2836232638504556905">Jos jatkat, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> jakaa nimesi, sähköpostiosoitteesi, osoitteesi ja profiilikuvasi tälle sivustolle. Tutustu sivuston <ph name="BEGIN_LINK" />tietosuojakäytäntöön<ph name="END_LINK" />.</translation>
 <translation id="2836269494620652131">Kaatuminen</translation>
 <translation id="2836635946302913370">Järjestelmänvalvoja on estänyt tällä käyttäjänimellä kirjautumisen.</translation>
 <translation id="283669119850230892">Jos haluat käyttää verkkoa <ph name="NETWORK_ID" />, määritä ensin internetyhteyden muodostus alla.</translation>
@@ -2250,6 +2251,7 @@
 <translation id="3105796011181310544">Vaihdetaanko takaisin Googleen?</translation>
 <translation id="310671807099593501">Sivusto käyttää Bluetoothia</translation>
 <translation id="3108931485517391283">Ei voi vastaanottaa</translation>
+<translation id="3109206895301430738">Tallennetut välilehtiryhmät</translation>
 <translation id="3109724472072898302">Tiivistetty</translation>
 <translation id="311214366526552035">Lataa silti</translation>
 <translation id="3112292765614504292">Sovelluksen koko: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 11d163ca..7af27eab 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1015,6 +1015,7 @@
 <translation id="1942600407708803723">I-shut down kapag nakasara ang cover</translation>
 <translation id="1944528062465413897">Code ng pagpapares ng Bluetooth</translation>
 <translation id="1944921356641260203">May nahanap na update</translation>
+<translation id="1947136734041527201">Pinapayagan kang mag-sign in sa mga website gamit ang account mo sa serbisyo ng pagkakakilanlan</translation>
 <translation id="1949584741547056205">Mga Mabilisang Sagot</translation>
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1954597385941141174">Puwedeng hilingin ng mga site na kumonekta sa mga USB device</translation>
@@ -2415,6 +2416,7 @@
 <translation id="32939749466444286">Hindi nalunsad ang Linux container. Pakisubukang muli.</translation>
 <translation id="3294437725009624529">Bisita</translation>
 <translation id="3294686910656423119">Mga istatistika sa paggamit at ulat ng pag-crash</translation>
+<translation id="3297105622164376095">Pinapayagang magpakita ng mga third-party na prompt sa pag-sign in</translation>
 <translation id="3297536526040732495">Pansamantalang nili-link ang data na ito sa iyong Google Account kapag naka-sign in ka, para maprotektahan ka sa lahat ng Google app</translation>
 <translation id="329838636886466101">Ayusin</translation>
 <translation id="3298789223962368867">Di-wastong URL ang ipinasok.</translation>
@@ -3671,6 +3673,7 @@
 <translation id="452750746583162491">Suriin ang iyong naka-sync na data</translation>
 <translation id="4527929807707405172">I-enable ang reverse na pag-scroll. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Suhestyon sa pagsasalin</translation>
+<translation id="4529455689802245339">Posibleng hindi gumana ang Live Caption ng Chrome</translation>
 <translation id="4530494379350999373">Pinanggalingan</translation>
 <translation id="4531924570968473143">Sino ang gusto mong idagdag sa <ph name="DEVICE_TYPE" /> na ito?</translation>
 <translation id="4532625150642446981">Ginagamit ang "<ph name="USB_DEVICE_NAME" />." Kapag na-reassign ang device habang ginagamit ito, posibleng maging sanhi ito ng mga error. Sigurado ka bang gusto mong magpatuloy?</translation>
@@ -3869,6 +3872,7 @@
 <translation id="471880041731876836">Wala kang pahintulot na bisitahin ang site na ito</translation>
 <translation id="4722735765955348426">Password ni <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856">Ibinabahagi ng <ph name="APP_NAME" /> ang iyong screen.</translation>
+<translation id="4722989931633062466">Hindi pinapayagang magpakita ng mga third-party na prompt sa pag-sign in</translation>
 <translation id="4723140812774948886">I-swap sa susunod</translation>
 <translation id="4724450788351008910">Binago ang Kaugnayan</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4839,6 +4843,7 @@
 <translation id="5711010025974903573">Mga log ng serbisyo</translation>
 <translation id="5711983031544731014">Hindi mai-unlock. Ilagay ang iyong password.</translation>
 <translation id="5712153969432126546">Paminsan-minsan, nagpa-publish ang mga site ng mga PDF, tulad ng mga dokumento, kontrata, at form</translation>
+<translation id="571222594670061844">Puwedeng magpakita ang mga site ng mga prompt sa pag-sign in mula sa mga serbisyo ng pagkakakilanlan</translation>
 <translation id="5713158217420111469">Nakakonekta sa <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Broker ng plugin: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Mga default na search engine</translation>
@@ -4997,6 +5002,7 @@
 <translation id="5876851302954717356">Bagong Tab sa Kanan</translation>
 <translation id="5877064549588274448">Binago ang channel. I-restart ang iyong device upang ilapat ang mga pagbabago.</translation>
 <translation id="5877584842898320529">Hindi available o hindi naka-install nang tama ang napiling printer. <ph name="BR" /> Suriin ang iyong printer o subukang pumili ng ibang printer.</translation>
+<translation id="5878945009165002849">I-block ang mga prompt sa pag-sign in mula sa mga serbisyo ng pagkakakilanlan</translation>
 <translation id="5882919346125742463">Mga Kilalang Network</translation>
 <translation id="5883356647197510494">Awtomatikong na-block ang <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Nakakonekta ang tab na ito sa isang USB device.</translation>
@@ -5634,6 +5640,7 @@
 <translation id="6513247462497316522">Gagamit ang Google Chrome ng data ng mobile kung hindi ka nakakonekta sa isa pang network.</translation>
 <translation id="6514010653036109809">Available na device:</translation>
 <translation id="6514565641373682518">Hindi pinagana ng pahinang ito ang cursor ng iyong mouse.</translation>
+<translation id="6517709704288360414">Posibleng hindi na gumana nang maayos ang iyong device, at posibleng makaranas ka ng mga isyu sa seguridad at performance. Puwede ring maapektuhan ng pag-off mo sa mga update ang karapatan mong maghain ng mga legal na claim kung makakaranas ka ng anumang isyu.</translation>
 <translation id="6518014396551869914">Kop&amp;yahin ang imahe</translation>
 <translation id="6518133107902771759">I-verify</translation>
 <translation id="651942933739530207">Gusto mo bang ibahagi ng <ph name="APP_NAME" /> ang iyong screen at audio output?</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb
index 3cecebe..8bb00a6 100644
--- a/chrome/app/resources/generated_resources_fr-CA.xtb
+++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1957,6 +1957,7 @@
 <translation id="2832124733806557606">Votre enfant peut utiliser un NIP pour se connecter à l'appareil ou pour le déverrouiller.</translation>
 <translation id="2835177225987815960">Votre configuration de recherche actuelle sera réinitialisée, y compris les commutateurs attribués et les préférences de vitesse de la recherche automatique.</translation>
 <translation id="2835547721736623118">Service de reconnaissance vocale</translation>
+<translation id="2836232638504556905">Pour continuer, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> partagera votre nom, votre adresse de courriel et votre photo de profil avec ce site. Consultez la <ph name="BEGIN_LINK" />politique de confidentialité<ph name="END_LINK" /> de ce site.</translation>
 <translation id="2836269494620652131">Plantage</translation>
 <translation id="2836635946302913370">L'administrateur a désactivé la connexion avec ce nom d'utilisateur.</translation>
 <translation id="283669119850230892">Pour utiliser le réseau <ph name="NETWORK_ID" />, terminez d'abord la connexion à Internet ci-dessous.</translation>
@@ -2238,6 +2239,7 @@
 <translation id="3105796011181310544">Rétablir Google?</translation>
 <translation id="310671807099593501">Le site utilise le Bluetooth</translation>
 <translation id="3108931485517391283">Impossible de recevoir le fichier</translation>
+<translation id="3109206895301430738">Groupes d'onglets enregistrés</translation>
 <translation id="3109724472072898302">Réduit</translation>
 <translation id="311214366526552035">Télécharger quand même</translation>
 <translation id="3112292765614504292">Taille de l'application : <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 01642c5..897b9513 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1956,6 +1956,7 @@
 <translation id="2832124733806557606">Votre enfant peut l'utiliser pour se connecter ou déverrouiller l'appareil.</translation>
 <translation id="2835177225987815960">La configuration actuelle de l'analyse sera réinitialisée, y compris les contacteurs associés et les paramètres liés à la vitesse d'exploration automatique.</translation>
 <translation id="2835547721736623118">Service de reconnaissance vocale</translation>
+<translation id="2836232638504556905">Pour continuer, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> partagera avec ce site vos nom, adresse e-mail et photo de profil. Consultez les <ph name="BEGIN_LINK" />Règles de confidentialité<ph name="END_LINK" /> de ce site.</translation>
 <translation id="2836269494620652131">Blocage</translation>
 <translation id="2836635946302913370">Impossible de se connecter avec ce nom d'utilisateur, car il a été désactivé par votre administrateur.</translation>
 <translation id="283669119850230892">Pour utiliser le réseau <ph name="NETWORK_ID" />, finalisez d'abord la connexion à Internet ci-dessous</translation>
@@ -2237,6 +2238,7 @@
 <translation id="3105796011181310544">Revenir à Google ?</translation>
 <translation id="310671807099593501">Le site utilise le Bluetooth</translation>
 <translation id="3108931485517391283">Impossible de recevoir le transfert</translation>
+<translation id="3109206895301430738">Groupes d'onglets enregistrés</translation>
 <translation id="3109724472072898302">Réduit</translation>
 <translation id="311214366526552035">Télécharger quand même</translation>
 <translation id="3112292765614504292">Taille de l'appli : <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb
index 3fff6f9..f5c29ca 100644
--- a/chrome/app/resources/generated_resources_gl.xtb
+++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1953,6 +1953,7 @@
 <translation id="2832124733806557606">O teu fillo ou filla pode usar un PIN para iniciar sesión ou desbloquear o dispositivo.</translation>
 <translation id="2835177225987815960">Restablecerase a configuración actual de exploración, dentro da que se inclúen as asignacións de interruptores e as preferencias de velocidade da exploración automática.</translation>
 <translation id="2835547721736623118">Servizo de recoñecemento de voz</translation>
+<translation id="2836232638504556905">Para continuar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> compartirá o teu nome, enderezo de correo electrónico e imaxe do perfil con este sitio. Consulta a <ph name="BEGIN_LINK" />política de privacidade<ph name="END_LINK" /> deste sitio.</translation>
 <translation id="2836269494620652131">Erro</translation>
 <translation id="2836635946302913370">O administrador desactivou o inicio de sesión con este nome de usuario.</translation>
 <translation id="283669119850230892">Para utilizar a rede <ph name="NETWORK_ID" />, primeiro completa a túa conexión a Internet a continuación.</translation>
@@ -2234,6 +2235,7 @@
 <translation id="3105796011181310544">Queres volver cambiar a Google?</translation>
 <translation id="310671807099593501">O sitio está usando o Bluetooth</translation>
 <translation id="3108931485517391283">Non se puido recibir o ficheiro</translation>
+<translation id="3109206895301430738">Grupos de pestanas gardados</translation>
 <translation id="3109724472072898302">Contraído</translation>
 <translation id="311214366526552035">Descargar de todos os modos</translation>
 <translation id="3112292765614504292">Tamaño da aplicación: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index 3eda58a..1b58df52 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -957,6 +957,7 @@
 <translation id="1892341345406963517">નમસ્કાર <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">અન્ય ભાષાઓ</translation>
 <translation id="1895658205118569222">બંધ કરો</translation>
+<translation id="1897120393475391208">સશક્ત પાસવર્ડનો ઉપયોગ કરો</translation>
 <translation id="1900305421498694955">Google Play પરની ઍપને બાહ્ય સ્ટોરેજ ડિવાઇસ પરની ફાઇલો તથા ફોલ્ડરો વાંચવા અને લખવા માટે ફાઇલ સિસ્ટમનો સંપૂર્ણ ઍક્સેસ હોવો જરૂરી હોઈ શકે છે. બાહ્ય ડ્રાઇવનો ઉપયોગ કરનાર કોઈપણ વ્યક્તિ ડિવાઇસ પર બનાવેલી ફાઇલો તથા ફોલ્ડરોને જોઈ શકે છે. <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">&amp;બધા પસંદ કરો</translation>
 <translation id="1901396183631570154">Chrome આ પાસવર્ડને તમારા Google એકાઉન્ટમાં સાચવી શક્યું નથી. તમે હજુ પણ તેમને આ ડિવાઇસ પર સાચવી શકો છો.</translation>
@@ -6551,6 +6552,7 @@
 <translation id="7444970023873202833">Google Photosમાં તમારી યાદગીરીઓ વિશે વધુ શોધખોળ કરો</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> બંધ કરો</translation>
 <translation id="7448430327655618736">ઍપ ઑટોમૅટિક રીતે ઇન્સ્ટૉલ કરો</translation>
+<translation id="7449381494541372002">શરૂ થઈ રહ્યું છે...</translation>
 <translation id="7449752890690775568">પાસવર્ડ કાઢી નાખીએ?</translation>
 <translation id="7450761244949417357">હમણાં <ph name="ALTERNATIVE_BROWSER_NAME" />માં ખુલી રહ્યું છે</translation>
 <translation id="7452166281927983300">છોડી દીધેલી ચેતવણીઓ (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 5fa34f4..61238de8 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -133,6 +133,7 @@
 <translation id="1124772482545689468">उपयोगकर्ता</translation>
 <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> जैसा लगता है (मूल)</translation>
 <translation id="1126809382673880764">इस मोड में आपको नुकसान पहुंचाने वाली वेबसाइटों, डाउनलोड, और एक्सटेंशन से सुरक्षा नहीं मिलती. Gmail और Search जैसी दूसरी Google की सेवाओं में, आपको अब भी सुरक्षित ब्राउज़िंग की सुरक्षा मिल सकती है.</translation>
+<translation id="1128090040635299943">Linux को कॉन्फ़िगर किया जा रहा है. कॉन्फ़िगर करने में कुछ मिनट लगेंगे.</translation>
 <translation id="1128591060186966949">खोज इंजन में बदलाव करें</translation>
 <translation id="1129420403709586868">अपने फ़ोन में मौजूद फ़ोटो और मीडिया देखें</translation>
 <translation id="1129850422003387628">ऐप्लिकेशन प्रबंधित करें</translation>
@@ -335,6 +336,7 @@
 <translation id="1327794256477341646">जिन सुविधाओं के लिए जगह की जानकारी की ज़रूरत होती है वे काम नहीं करेंगी</translation>
 <translation id="1329191040029425999">पक्का करें कि आपका डिवाइस अप-टू-डेट हो और कृपया फिर से कोशिश करें</translation>
 <translation id="1330145147221172764">ऑन-स्क्रीन कीबोर्ड चालू करें</translation>
+<translation id="1331625853030156663"><ph name="APP_NAME" /> खोलने के लिए, "स्लीप मोड से बाहर आने पर लॉक स्क्रीन दिखाएं" चालू करें</translation>
 <translation id="1331977651797684645">यह मैं ही था/थी.</translation>
 <translation id="1333489022424033687"><ph name="ORIGIN" /> पर मौजूद कुछ सुविधाएं तब तक काम नहीं करेंगी, जब तक आप उस डेटा को नहीं मिटाते जिसे दूसरी साइटों ने आपके डिवाइस पर सेव किया हुआ है</translation>
 <translation id="1333965224356556482">साइटों को आपकी जगह की जानकारी देखने की अनुमति न दें</translation>
@@ -3347,6 +3349,7 @@
 <translation id="420283545744377356">स्क्रीन सेवर बंद करें</translation>
 <translation id="4203065553461038553">फ़ाइल का पाथ बहुत लंबा है या यह बहुत अंदर सेव की गई है</translation>
 <translation id="4204851595694839599">गेमप्ले का अनुभव कैसा रहा?</translation>
+<translation id="4205157409548006256">Linux को कॉन्फ़िगर करते समय गड़बड़ी हुई.</translation>
 <translation id="4206144641569145248">एलियन</translation>
 <translation id="4206323443866416204">फ़ीडबैक रिपोर्ट</translation>
 <translation id="4207522141889799150"><ph name="SITE" /> के लिए साइट की अनुमतियों में बदलाव करें</translation>
@@ -5813,6 +5816,7 @@
 <translation id="6686665106869989887">टैब को दाईं ओर ले जाया गया</translation>
 <translation id="6686817083349815241">अपना पासवर्ड सेव करें</translation>
 <translation id="6687079240787935001"><ph name="MODULE_TITLE" /> छिपाएं</translation>
+<translation id="6688391094668641513"><ph name="ORIGIN" /> को पढ़ने और उसमें बदलाव करने का अनुरोध किया जा रहा है:</translation>
 <translation id="6689714331348768690"><ph name="SUPERVISED_USER_NAME" /> को कंप्यूटर पर आने के लिए कहें. अपनी आवाज़ का नमूना बनाने के लिए, आपका बच्चा इस स्क्रीन पर कुछ वाक्यांश पढ़ेगा.
     <ph name="BR" />
     अगर <ph name="SUPERVISED_USER_NAME" /> को पढ़ने में मदद चाहिए, तो उन्हें अपने बाद वाक्यांश दोहराने को कहें. माइक से दूर होकर धीरे बोलें, ताकि Assistant आपके बजाय आपके बच्चे की आवाज़ जानें.</translation>
@@ -6324,6 +6328,7 @@
 <translation id="720715819012336933">{NUM_PAGES,plural, =1{पेज से बाहर निकलें}one{पेज से बाहर निकलें}other{पेज से बाहर निकलें}}</translation>
 <translation id="7207457272187520234">इस्तेमाल और गड़बड़ी की जानकारी से जुड़ा डेटा भेजें. यह डिवाइस फ़िलहाल Google को गड़बड़ी की जानकारी, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने-आप भेज रहा है. यह सिस्टम और ऐप्लिकेशन की स्थिरता बढ़ाने और दूसरे सुधार करने में मदद करेगा. इकट्ठा किया गया कुछ डेटा, Google ऐप्लिकेशन और पार्टनर की भी मदद करेगा. जैसे, Android डेवलपर. यह सेटिंग, डिवाइस के मालिक ने लागू की है. अगर आपकी दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा आपके Google खाते में सेव किया जा सकता है.</translation>
 <translation id="7207631048330366454">ऐप्लिकेशन खोजें</translation>
+<translation id="720808544705441386">ऐप्लिकेशन नहीं खोला जा सका</translation>
 <translation id="7210499381659830293">एक्सटेंशन प्रिंटर</translation>
 <translation id="7211783048245131419">अभी तक कोई भी स्विच असाइन नहीं किया गया</translation>
 <translation id="7212097698621322584">अपना मौजूदा पिन डालकर उसे बदलें. अगर आप पिन नहीं जानते हैं, तो आपको सुरक्षा कुंजी रीसेट करनी होगी, फिर एक नया पिन बनाना होगा.</translation>
@@ -7478,6 +7483,7 @@
 <translation id="8324784016256120271">अलग-अलग साइटों पर आपकी ब्राउज़िंग गतिविधि देखने के लिए, साइटें कुकी का इस्तेमाल कर सकती हैं. जैसे, दर्शकों की पसंद को ध्यान में रखकर विज्ञापन दिखाने के लिए</translation>
 <translation id="8325413836429495820">क्लिपबोर्ड देखने की अनुमति नहीं है</translation>
 <translation id="8326478304147373412">PKCS #7, प्रमाणपत्र चेन</translation>
+<translation id="8327386430364625757">मैथमैटिकल फ़ॉन्ट</translation>
 <translation id="8327676037044516220">अनुमतियां और सामग्री सेटिंग</translation>
 <translation id="8330617762701840933">उन वेबसाइटों की सूची जिन्हें वैकल्पिक ब्राउज़र पर रीडायरेक्ट किया जाता है.</translation>
 <translation id="8330689128072902965">आस-पास मौजूद संपर्क, आपके डिवाइस के साथ फ़ाइलें शेयर कर सकते हैं. इसे बदलने के लिए क्लिक करें.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index f0c7a38..ebd05cb8 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1013,6 +1013,7 @@
 <translation id="1942600407708803723">Kikapcsolás a képernyő lecsukásakor</translation>
 <translation id="1944528062465413897">Bluetooth-párosítókód:</translation>
 <translation id="1944921356641260203">A rendszer frissítést talált</translation>
+<translation id="1947136734041527201">Lehetővé teszi, hogy identitásszolgáltató által biztosított fiókkal jelentkezzen be a webhelyekre</translation>
 <translation id="1949584741547056205">Gyors válaszok</translation>
 <translation id="1951012854035635156">Segéd</translation>
 <translation id="1954597385941141174">A webhelyek engedélyt kérhetnek az USB-eszközökhöz való csatlakozásra</translation>
@@ -2412,6 +2413,7 @@
 <translation id="32939749466444286">A Linux-tároló elindítása nem sikerült. Próbálja újra.</translation>
 <translation id="3294437725009624529">Vendég</translation>
 <translation id="3294686910656423119">Használati statisztikák és hibajelentések</translation>
+<translation id="3297105622164376095">Engedélyezve van a harmadik fél szolgáltatások bejelentkezési értesítéseinek megjelenítése</translation>
 <translation id="3297536526040732495">Amikor be van jelentkezve, ideiglenesen a Google-fiókjához kapcsolja ezeket az adatokat, hogy megvédhessük Önt a Google-alkalmazásokban.</translation>
 <translation id="329838636886466101">Javítás</translation>
 <translation id="3298789223962368867">A megadott URL érvénytelen.</translation>
@@ -3667,6 +3669,7 @@
 <translation id="452750746583162491">A szinkronizált adatok áttekintése</translation>
 <translation id="4527929807707405172">A fordított görgetés engedélyezése. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation>
 <translation id="4528494169189661126">Fordítási javaslat</translation>
+<translation id="4529455689802245339">Előfordulhat, hogy a Chrome Élő feliratozás funkciója nem működik</translation>
 <translation id="4530494379350999373">Eredet</translation>
 <translation id="4531924570968473143">Kit szeretne hozzáadni ehhez az eszközhöz (<ph name="DEVICE_TYPE" />)?</translation>
 <translation id="4532625150642446981">A(z) „<ph name="USB_DEVICE_NAME" />” használatban van. A még használatban lévő eszköz újbóli csatlakoztatása hibákat okozhat. Biztosan folytatni szeretné?</translation>
@@ -3865,6 +3868,7 @@
 <translation id="471880041731876836">Nincs jogosultsága a webhely felkereséséhez</translation>
 <translation id="4722735765955348426">A(z) <ph name="USERNAME" /> felhasználónévhez tartozó jelszó</translation>
 <translation id="4722920479021006856">A(z) <ph name="APP_NAME" /> megosztja az Ön képernyőjét.</translation>
+<translation id="4722989931633062466">Nincs engedélyezve a harmadik fél szolgáltatások bejelentkezési értesítéseinek megjelenítése</translation>
 <translation id="4723140812774948886">Csere a következővel</translation>
 <translation id="4724450788351008910">A hovatartozás módosult</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4837,6 +4841,7 @@
 <translation id="5711010025974903573">Szerviznaplók</translation>
 <translation id="5711983031544731014">Nem lehet végrehajtani a feloldást. Adja meg jelszavát.</translation>
 <translation id="5712153969432126546">A webhelyek néha közzétesznek PDF formátumú tartalmakat (pl. dokumentumokat, szerződéseket vagy űrlapokat)</translation>
+<translation id="571222594670061844">A webhelyek megjeleníthetnek identitásszolgáltatásoktól származó bejelentkezési értesítéseket</translation>
 <translation id="5713158217420111469">Csatlakozva – <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Beépülő modul közvetítője: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Alapértelmezett keresőmotorok</translation>
@@ -4995,6 +5000,7 @@
 <translation id="5876851302954717356">Új lap jobbra</translation>
 <translation id="5877064549588274448">Módosult a csatorna. Indítsa újra az eszközt a módosítások alkalmazásához.</translation>
 <translation id="5877584842898320529">A kiválasztott nyomtató nem áll rendelkezésre, vagy nincs megfelelően telepítve. <ph name="BR" /> Ellenőrizze a nyomtatót, vagy válasszon másikat.</translation>
+<translation id="5878945009165002849">Az identitásszolgáltatásoktól származó bejelentkezési értesítések letiltása</translation>
 <translation id="5882919346125742463">Ismert hálózatok</translation>
 <translation id="5883356647197510494">Automatikusan letiltva: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Ez a lap USB-eszközhöz csatlakozik.</translation>
@@ -5632,6 +5638,7 @@
 <translation id="6513247462497316522">A Google Chrome mobil-adatforgalmat fog használni, ha nem kapcsolódik másik hálózathoz.</translation>
 <translation id="6514010653036109809">Rendelkezésre álló eszköz:</translation>
 <translation id="6514565641373682518">Ez az oldal letiltotta az egérmutatóját.</translation>
+<translation id="6517709704288360414">Előfordulhat, hogy az eszköz már nem működik megfelelően, és biztonsággal, illetve teljesítménnyel kapcsolatos problémákat tapasztalhat. A frissítések kikapcsolása befolyásolhatja az ahhoz fűződő jogát, hogy probléma esetén jogi keresetet nyújtson be.</translation>
 <translation id="6518014396551869914">Ké&amp;p másolása</translation>
 <translation id="6518133107902771759">Ellenőrzés</translation>
 <translation id="651942933739530207">Szeretné, ha a(z) <ph name="APP_NAME" /> megosztaná az Ön képernyőjét és a hangkimenetét?</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index ff1479c..9b4d4a8 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1956,6 +1956,7 @@
 <translation id="2832124733806557606">Ձեր երեխան կարող է մտնել հաշիվ կամ ապակողպել սարքը PIN կոդի միջոցով։</translation>
 <translation id="2835177225987815960">Սկանավորման ձեր ընթացիկ կարգավորումները (այդ թվում՝ նշանակված փոխանջատիչները և ավտոմատ սկանավորման արագության պարամետրերը) կզրոյացվեն։</translation>
 <translation id="2835547721736623118">Խոսքի ճանաչման ծառայություն</translation>
+<translation id="2836232638504556905">Շարունակելու համար <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ընկերությունը կփոխանցի ձեր անունը, էլ․ հասցեն և պրոֆիլի նկարը այս կայքին։ Ծանոթացեք այս կայքի <ph name="BEGIN_LINK" />գաղտնիության քաղաքականությանը<ph name="END_LINK" />։</translation>
 <translation id="2836269494620652131">Խափանում</translation>
 <translation id="2836635946302913370">Այս օգտանունով մուտքը կասեցվել է ձեր ադմինիստրատորի կողմից:</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> ցանցն օգտագործելու համար նախ կապակցվեք համացանցին:</translation>
@@ -2237,6 +2238,7 @@
 <translation id="3105796011181310544">Վերադառնա՞լ Google-ին</translation>
 <translation id="310671807099593501">Կայքն օգտագործում է Bluetooth-ը</translation>
 <translation id="3108931485517391283">Չհաջողվեց ստանալ ֆայլը</translation>
+<translation id="3109206895301430738">Պահված ներդիրների խմբեր</translation>
 <translation id="3109724472072898302">Կոծկված</translation>
 <translation id="311214366526552035">Միևնույն է ներբեռնել</translation>
 <translation id="3112292765614504292">Հավելվածի չափը՝ <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 64609b11..04fc4e57 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1970,6 +1970,7 @@
 <translation id="2832124733806557606">Anak Anda dapat menggunakan PIN untuk login atau membuka kunci perangkat.</translation>
 <translation id="2835177225987815960">Penyiapan pemindaian saat ini akan direset, termasuk semua preferensi tombol akses yang ditetapkan dan kecepatan pemindaian otomatis.</translation>
 <translation id="2835547721736623118">Layanan pengenalan ucapan</translation>
+<translation id="2836232638504556905">Untuk melanjutkan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan membagikan nama, alamat email, dan foto profil Anda ke situs ini. Lihat <ph name="BEGIN_LINK" />kebijakan privasi<ph name="END_LINK" /> situs ini.</translation>
 <translation id="2836269494620652131">Kerusakan</translation>
 <translation id="2836635946302913370">Login dengan nama pengguna ini telah dinonaktifkan oleh administrator Anda.</translation>
 <translation id="283669119850230892">Untuk menggunakan <ph name="NETWORK_ID" /> jaringan, pertama-tama, selesaikan sambungan Anda ke Internet di bawah ini.</translation>
@@ -2251,6 +2252,7 @@
 <translation id="3105796011181310544">Ubah kembali ke Google?</translation>
 <translation id="310671807099593501">Situs sedang menggunakan bluetooth</translation>
 <translation id="3108931485517391283">Tidak dapat menerima</translation>
+<translation id="3109206895301430738">Grup Tab Tersimpan</translation>
 <translation id="3109724472072898302">Diciutkan</translation>
 <translation id="311214366526552035">Tetap Download</translation>
 <translation id="3112292765614504292">Ukuran aplikasi: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb
index 65c3910..8287152 100644
--- a/chrome/app/resources/generated_resources_is.xtb
+++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1970,6 +1970,7 @@
 <translation id="2832124733806557606">Barnið getur notað PIN-númer til að skrá sig inn í tækið eða taka það úr lás.</translation>
 <translation id="2835177225987815960">Núverandi uppsetning skönnunar verður endurstillt, þ.m.t. úthlutaðir rofar og hraðastillingar sjálfvirkrar skönnunar.</translation>
 <translation id="2835547721736623118">Raddgreiningarþjónusta</translation>
+<translation id="2836232638504556905">Til að halda áfram mun <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> deila nafni þínu, netfangi og prófílmynd með þessu vefsvæði. Sjá <ph name="BEGIN_LINK" />persónuverndarstefnu<ph name="END_LINK" /> vefsvæðisins.</translation>
 <translation id="2836269494620652131">Hrun</translation>
 <translation id="2836635946302913370">Kerfisstjóri hefur lokað á innskráningu með þessu notandanafni.</translation>
 <translation id="283669119850230892">Til að nota netið <ph name="NETWORK_ID" /> þarftu fyrst að ljúka við tenginguna við internetið hér fyrir neðan.</translation>
@@ -2251,6 +2252,7 @@
 <translation id="3105796011181310544">Skipta aftur yfir í Google?</translation>
 <translation id="310671807099593501">Vefsvæði er að nota Bluetooth</translation>
 <translation id="3108931485517391283">Ekki er hægt að taka við</translation>
+<translation id="3109206895301430738">Vistaðir flipahópar</translation>
 <translation id="3109724472072898302">Minnkað</translation>
 <translation id="311214366526552035">Sækja samt</translation>
 <translation id="3112292765614504292">Stærð forrits <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb
index a29e1ea2..6c8f419 100644
--- a/chrome/app/resources/generated_resources_kk.xtb
+++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1951,6 +1951,7 @@
 <translation id="2832124733806557606">Құрылғыға кіру немесе оның құлпын ашу үшін балаңыз PIN кодын пайдалана алады.</translation>
 <translation id="2835177225987815960">Сканерлеудің қазіргі реттеуі, соның ішінде тағайындалған ауыстырғыштар мен автосканерлеу жылдамдығының параметрлері бастапқы күйге қайтарылады.</translation>
 <translation id="2835547721736623118">Айтылған сөзді тану қызметі</translation>
+<translation id="2836232638504556905">Жалғастыру үшін <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> аты-жөніңізді, электрондық мекенжайыңызды және профиль суретіңізді осы сайтпен бөліседі. Осы сайттың <ph name="BEGIN_LINK" />Құпиялылық саясатын<ph name="END_LINK" /> көріңіз.</translation>
 <translation id="2836269494620652131">Бұзылу</translation>
 <translation id="2836635946302913370">Бұл пайдаланушы атымен кіру мүмкіндігін әкімші өшірген.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> желісін пайдалану үшін алдымен төмендегі интернет байланысын орнатып болыңыз.</translation>
@@ -2232,6 +2233,7 @@
 <translation id="3105796011181310544">Google іздеу жүйесіне қайта ораласыз ба?</translation>
 <translation id="310671807099593501">Сайт Bluetooth функциясын пайдалануда</translation>
 <translation id="3108931485517391283">Қабылдау мүмкін емес.</translation>
+<translation id="3109206895301430738">Қойындылар тобына сақталды.</translation>
 <translation id="3109724472072898302">Жиылған</translation>
 <translation id="311214366526552035">Сонда да жүктеп алу</translation>
 <translation id="3112292765614504292">Қолданба көлемі: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb
index 8a18f945b..7ee5dd3 100644
--- a/chrome/app/resources/generated_resources_km.xtb
+++ b/chrome/app/resources/generated_resources_km.xtb
@@ -972,6 +972,7 @@
 <translation id="1892341345406963517">សួស្ដី <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">ភាសាផ្សេងទៀត</translation>
 <translation id="1895658205118569222">បិទ</translation>
+<translation id="1897120393475391208">ប្រើ​ពាក្យសម្ងាត់ខ្លាំង</translation>
 <translation id="1900305421498694955">កម្មវិធីពី Google Play អាចតម្រូវឱ្យមាន​សិទ្ធិចូលប្រើ​ប្រព័ន្ធ​ឯកសារពេញលេញ ដើម្បីអាន និង​សរសេរឯកសារ​នៅលើ​ឧបករណ៍​ផ្ទុកខាងក្រៅ។ អ្នកដែលប្រើ​ថាសខាងក្រៅ​អាចមើលឃើញឯកសារ និងថត​ដែលបានបង្កើត​នៅលើឧបករណ៍នេះ។ <ph name="LINK_BEGIN" />ស្វែងយល់​បន្ថែម<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">ជ្រើសរើសទាំងអស់</translation>
 <translation id="1901396183631570154">Chrome មិនអាច​រក្សាទុក​ពាក្យសម្ងាត់​ទាំងនេះ​នៅក្នុង​គណនី Google របស់អ្នក​បានទេ​។ អ្នក​នៅតែ​អាច​រក្សាទុក​ពាក្យសម្ងាត់ទាំងនេះ​នៅលើ​ឧបករណ៍​នេះបាន​ដដែល។</translation>
@@ -1971,6 +1972,7 @@
 <translation id="2832124733806557606">កូនរបស់អ្នកអាចប្រើកូដ PIN ដើម្បី​ចូលគណនី ឬដោះសោឧបករណ៍​។</translation>
 <translation id="2835177225987815960">ការរៀបចំ​ការស្កេនបច្ចុប្បន្ន​របស់អ្នកនឹងត្រូវ​បានកំណត់ឡើងវិញ រួមទាំងឧបករណ៍ចុច​ដែលបានកំណត់ និងចំណូលចិត្តនៃ​ល្បឿនស្កេនដោយស្វ័យប្រវត្តិ។</translation>
 <translation id="2835547721736623118">សេវាកម្ម​សម្គាល់ការនិយាយ</translation>
+<translation id="2836232638504556905">ដើម្បីបន្ត <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> នឹងចែករំលែក​ឈ្មោះ អាសយដ្ឋាន​អ៊ីមែល និង​រូបភាព​កម្រងព័ត៌មាន​របស់អ្នក​ជាមួយ​គេហទំព័រនេះ។ សូមមើល​<ph name="BEGIN_LINK" />គោលការណ៍​ឯកជនភាព<ph name="END_LINK" />​របស់​គេហទំព័រ​នេះ។</translation>
 <translation id="2836269494620652131">គាំង</translation>
 <translation id="2836635946302913370">ការចូលដោយជាមួយឈ្មោះអ្នកប្រើនេះត្រូវបាន</translation>
 <translation id="283669119850230892">ដើម្បីប្រើបណ្តាញ <ph name="NETWORK_ID" /> ជាដំបូងបំពេញការភ្ជាប់របស់អ្នកទៅអ៊ីនធឺណិតខាងក្រោម។</translation>
@@ -2252,6 +2254,7 @@
 <translation id="3105796011181310544">ប្ដូរទៅ Google វិញឬ?</translation>
 <translation id="310671807099593501">ទំព័រ​កំពុងប្រើ​ប៊្លូធូស</translation>
 <translation id="3108931485517391283">មិនអាចទទួលបានទេ</translation>
+<translation id="3109206895301430738">ក្រុម​ផ្ទាំង​ដែលបានរក្សាទុក</translation>
 <translation id="3109724472072898302">បានបង្រួមចូល</translation>
 <translation id="311214366526552035">មិនអីទេ ទាញយកចុះ</translation>
 <translation id="3112292765614504292">ទំហំកម្មវិធី៖ <ph name="APP_SIZE" /></translation>
@@ -6564,6 +6567,7 @@
 <translation id="7444970023873202833">រុករក​អនុស្សាវរីយ៍​របស់អ្នក​ច្រើនទៀត​នៅក្នុង Google រូបថត</translation>
 <translation id="7444983668544353857">បិទដំណើរការ <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">ដំឡើងកម្មវិធី​ដោយស្វ័យប្រវត្តិ</translation>
+<translation id="7449381494541372002">កំពុងចាប់ផ្ដើម…</translation>
 <translation id="7449752890690775568">លុប​ពាក្យ​សម្ងាត់ឬ?</translation>
 <translation id="7450761244949417357">កំពុង​បើក​នៅក្នុង <ph name="ALTERNATIVE_BROWSER_NAME" /> ឥឡូវនេះ</translation>
 <translation id="7452166281927983300">ការព្រមាន​ដែលបានច្រានចោល (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index e88851f..839a826 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1971,6 +1971,7 @@
 <translation id="2832124733806557606">자녀가 PIN을 사용해 로그인하거나 기기를 잠금 해제할 수 있습니다</translation>
 <translation id="2835177225987815960">할당된 스위치 및 자동 스캔 속도 환경설정을 포함하여 현재의 스캔 설정이 재설정됩니다.</translation>
 <translation id="2835547721736623118">음성 인식 서비스</translation>
+<translation id="2836232638504556905">계속하려면 <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />에서 내 이름, 이메일 주소, 프로필 사진을 이 사이트와 공유해야 합니다. 이 사이트의 <ph name="BEGIN_LINK" />개인정보처리방침<ph name="END_LINK" />을 확인하세요.</translation>
 <translation id="2836269494620652131">비정상 종료</translation>
 <translation id="2836635946302913370">해당 사용자 이름 로그인이 관리자에 의해 사용 중지되었습니다.</translation>
 <translation id="283669119850230892">네트워크 <ph name="NETWORK_ID" />을(를) 사용하려면 먼저 아래에서 인터넷 연결을 완료합니다.</translation>
@@ -2252,6 +2253,7 @@
 <translation id="3105796011181310544">Google로 되돌리시겠습니까?</translation>
 <translation id="310671807099593501">사이트에서 블루투스를 사용하고 있습니다.</translation>
 <translation id="3108931485517391283">수신할 수 없습니다.</translation>
+<translation id="3109206895301430738">저장된 탭 그룹</translation>
 <translation id="3109724472072898302">접힘</translation>
 <translation id="311214366526552035">무시하고 다운로드</translation>
 <translation id="3112292765614504292">앱 크기: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index 04ca98f..620fc028 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1015,6 +1015,7 @@
 <translation id="1942600407708803723">Исклучи кога капакот е затворен</translation>
 <translation id="1944528062465413897">Код за спарување преку Bluetooth:</translation>
 <translation id="1944921356641260203">Најдено е ажурирање</translation>
+<translation id="1947136734041527201">Ви овозможува да се најавувате на веб-сајтови со сметката што ја имате на услугата за идентификација</translation>
 <translation id="1949584741547056205">Брзи одговори</translation>
 <translation id="1951012854035635156">Помошник</translation>
 <translation id="1954597385941141174">Сајтовите може да прашуваат дали да се поврзат со USB-уредите</translation>
@@ -2415,6 +2416,7 @@
 <translation id="32939749466444286">Контејнерот за Linux не се стартуваше. Обидете се повторно.</translation>
 <translation id="3294437725009624529">Гостин</translation>
 <translation id="3294686910656423119">Статистика на користење и извештаи за падовите</translation>
+<translation id="3297105622164376095">Дозволено е да се прикажува prompt за најавување од трети страни</translation>
 <translation id="3297536526040732495">Привремено ги поврзува податоциве со вашата сметка на Google кога сте најавени за да ве заштити на апликациите на Google</translation>
 <translation id="329838636886466101">Поправи</translation>
 <translation id="3298789223962368867">Внесена неважечка URL-адреса.</translation>
@@ -3671,6 +3673,7 @@
 <translation id="452750746583162491">Прегледајте ги синхронизираните податоци</translation>
 <translation id="4527929807707405172">Овозможи обратно лизгање. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Предлог за превод</translation>
+<translation id="4529455689802245339">„Автоматски титлови“ на Chrome може да не функционира</translation>
 <translation id="4530494379350999373">Потекло</translation>
 <translation id="4531924570968473143">Кого сакате да го додадете на овој <ph name="DEVICE_TYPE" />?</translation>
 <translation id="4532625150642446981">„<ph name="USB_DEVICE_NAME" />“ се користи. Преназначувањето на уредот додека се користи може да предизвика грешки. Дали сигурно сакате да продолжите?</translation>
@@ -3869,6 +3872,7 @@
 <translation id="471880041731876836">Немате дозвола за посета на сајтов</translation>
 <translation id="4722735765955348426">Лозинка за <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> го споделува вашиот екран.</translation>
+<translation id="4722989931633062466">Не е дозволено да се прикажува prompt за најавување од трети страни</translation>
 <translation id="4723140812774948886">Заменете ја со следната</translation>
 <translation id="4724450788351008910">Припадностa е променета</translation>
 <translation id="4725511304875193254">Корги</translation>
@@ -4839,6 +4843,7 @@
 <translation id="5711010025974903573">Евиденција за услугата за одржување</translation>
 <translation id="5711983031544731014">Не може да се отклучи. Внесете ја лозинката.</translation>
 <translation id="5712153969432126546">Сајтовите понекогаш објавуваат документи, договори и формулари во PDF-формат</translation>
+<translation id="571222594670061844">Сајтовите може да прикажуваат prompt за најавување од услуги за идентификација</translation>
 <translation id="5713158217420111469">Поврзан со <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Посредник со приклучоци: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Стандардни пребарувачи</translation>
@@ -4997,6 +5002,7 @@
 <translation id="5876851302954717356">Нова картичка надесно</translation>
 <translation id="5877064549588274448">Каналот е сменет. Рестартирајте го вашиот уред за да ги примените измените.</translation>
 <translation id="5877584842898320529">Избраниот печатач не е достапен или не е правилно инсталиран. <ph name="BR" /> Проверете го или обидете се да изберете друг печатач.</translation>
+<translation id="5878945009165002849">Блокирајте prompt за најавување од услуги за идентификација</translation>
 <translation id="5882919346125742463">Познати мрежи</translation>
 <translation id="5883356647197510494">Автоматски блокирани: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Картичкава е поврзана со USB-уред.</translation>
@@ -5634,6 +5640,7 @@
 <translation id="6513247462497316522">Google Chrome ќе користи мобилен интернет ако не сте поврзани на друга мрежа.</translation>
 <translation id="6514010653036109809">Достапен уред:</translation>
 <translation id="6514565641373682518">Оваа страница го оневозможи курсорот на глушецот.</translation>
+<translation id="6517709704288360414">Можно е уредот да не ви функционира правилно и може да наидете на проблеми со безбедноста и изведбата. Ако ги исклучите ажурирањата, тоа може да влијае и врз вашето право на законски побарувања во случај да имате проблеми.</translation>
 <translation id="6518014396551869914">Копи&amp;рај слика</translation>
 <translation id="6518133107902771759">Потврди</translation>
 <translation id="651942933739530207">Дали сакате <ph name="APP_NAME" /> да го сподели вашиот екран и аудиоизлез?</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 98286b7..92c81f3 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -959,6 +959,7 @@
 <translation id="1892341345406963517">ഹായ് <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">മറ്റ് ഭാഷകൾ</translation>
 <translation id="1895658205118569222">ഷട്ട്‌ഡൗൺ ചെയ്യുക</translation>
+<translation id="1897120393475391208">ശക്തമായ പാസ്‌വേഡ് ഉപയോഗിക്കുക</translation>
 <translation id="1900305421498694955">ബാഹ്യ സ്‌റ്റോറേജ് ഉപകരണങ്ങളിലെ ഫയലുകൾ വായിക്കാനും എഴുതാനും Google Play-ൽ നിന്നുള്ള ആപ്പുകൾക്ക് പൂർണ്ണ ഫയൽ സിസ്‌റ്റം ആക്‌സസ് ആവശ്യമായേക്കാം. ഉപകരണത്തിൽ സൃഷ്‌ടിച്ച ഫയലുകളും ഫോൾഡറുകളും ബാഹ്യ ഡ്രൈവ് ഉപയോഗിക്കുന്ന ആർക്കും ദൃശ്യമാകും. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">എല്ലാം &amp;തിരഞ്ഞെടുക്കൂ</translation>
 <translation id="1901396183631570154">Chrome-ന് ഈ പാസ്‌വേഡുകൾ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കാനായില്ല. എങ്കിലും അവ നിങ്ങൾക്ക് ഈ ഉപകരണത്തിൽ തുടർന്നും സൂക്ഷിക്കാനാകും.</translation>
@@ -6542,6 +6543,7 @@
 <translation id="7444970023873202833">Google Photos-ൽ നിങ്ങളുടെ കൂടുതൽ മനോഹര ഓർമ്മകൾ കാണുക</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> അപ്രാപ്‌തമാക്കുക</translation>
 <translation id="7448430327655618736">സ്വയമേവ ആപ്പുകൾ ഇൻസ്‌റ്റാൾ ചെയ്യുക</translation>
+<translation id="7449381494541372002">ആരംഭിക്കുന്നു…</translation>
 <translation id="7449752890690775568">പാസ്‌വേഡ് നീക്കം ചെയ്യണോ?</translation>
 <translation id="7450761244949417357">ഇപ്പോൾ <ph name="ALTERNATIVE_BROWSER_NAME" />-ൽ തുറക്കുന്നു</translation>
 <translation id="7452166281927983300">ഡിസ്‌മിസ് ചെയ്‌ത മുന്നറിയിപ്പുകൾ (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 0fca34e..1902ca2 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1013,6 +1013,7 @@
 <translation id="1942600407708803723">कव्हर बंद केल्यावर शट डाउन करा</translation>
 <translation id="1944528062465413897">ब्लूटूथ पेअरिंग कोड:</translation>
 <translation id="1944921356641260203">अपडेट आढळले</translation>
+<translation id="1947136734041527201">ओळखीच्या सेवेसह तुमच्याकडे असलेले खाते वापरून तुम्हाला वेबसाइटवर साइन इन करू देते</translation>
 <translation id="1949584741547056205">झटपट उत्तरे</translation>
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1954597385941141174">साइट USB डिव्हाइसशी कनेक्ट करण्यासाठी विचारू शकतात</translation>
@@ -2413,6 +2414,7 @@
 <translation id="32939749466444286">Linux कंटेनर सुरू झाले नाही. कृपया पुन्हा प्रयत्न करा.</translation>
 <translation id="3294437725009624529">अतिथी</translation>
 <translation id="3294686910656423119">वापरविषयक आकडेवारी आणि क्रॅश अहवाल</translation>
+<translation id="3297105622164376095">तृतीय पक्ष साइन-इन सूचना दाखवण्याची अनुमती दिली आहे</translation>
 <translation id="3297536526040732495">सर्व Google अ‍ॅप्सवर तुमचे संरक्षण करण्यासाठी, तुम्ही साइन इन केलेले असताना हा डेटा तुमच्या Google खाते शी तात्पुरते लिंक करते</translation>
 <translation id="329838636886466101">दुरुस्त करा</translation>
 <translation id="3298789223962368867">चुकीची URL एंटर केली.</translation>
@@ -3667,6 +3669,7 @@
 <translation id="452750746583162491">तुमच्या सिंक केलेल्या डेटाचे पुनरावलोकन करा</translation>
 <translation id="4527929807707405172">रिव्हर्स स्क्रोलिंग सुरू करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">भाषांतर सूचना</translation>
+<translation id="4529455689802245339">Chrome लाइव्ह कॅप्शन कदाचित काम करणार नाही</translation>
 <translation id="4530494379350999373">मूळ</translation>
 <translation id="4531924570968473143">तुम्हाला या <ph name="DEVICE_TYPE" /> वर कोणाला जोडायचे आहे?</translation>
 <translation id="4532625150642446981">"<ph name="USB_DEVICE_NAME" />" वापरात आहे. डिव्हाइस वापरात असताना ते पुन्हा नियुक्त केल्यामुळे एरर उद्भवू शकतात. तुम्हाला नक्की पुढे सुरू ठेवायचे आहे का?</translation>
@@ -3865,6 +3868,7 @@
 <translation id="471880041731876836">या साइटला भेट देण्याची तुम्हाला परवानगी नाही</translation>
 <translation id="4722735765955348426"><ph name="USERNAME" /> साठी पासवर्ड</translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> तुमची स्क्रीन शेअर करत आहे.</translation>
+<translation id="4722989931633062466">तृतीय पक्ष साइन-इन सूचना दाखवण्याची अनुमती दिली नाही</translation>
 <translation id="4723140812774948886">पुढच्याशी बदला</translation>
 <translation id="4724450788351008910">सदस्यत्व बदलले</translation>
 <translation id="4725511304875193254">कॉर्गी</translation>
@@ -4835,6 +4839,7 @@
 <translation id="5711010025974903573">सेवा लॉग</translation>
 <translation id="5711983031544731014">अनलॉक करता आले नाही. तुमचा पासवर्ड एंटर करा.</translation>
 <translation id="5712153969432126546">साइट काहीवेळा दस्तऐवज, करार आणि फॉर्म यांसारख्या PDF प्रकाशित करतात</translation>
+<translation id="571222594670061844">साइट या ओळखीच्या सेवांकडून मिळणाऱ्या साइन-इन सूचना दाखवू शकतात</translation>
 <translation id="5713158217420111469"><ph name="DEVICE" /> शी कनेक्ट केले आहे</translation>
 <translation id="5715711091495208045">प्लगइन ब्रोकर: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">डीफॉल्ट शोध इंजीन</translation>
@@ -4993,6 +4998,7 @@
 <translation id="5876851302954717356">उजवीकडील नवीन टॅब</translation>
 <translation id="5877064549588274448">चॅनल बदलले. बदल लागू करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा.</translation>
 <translation id="5877584842898320529">निवडलेले प्रिंटर उपलब्ध नाही किंवा योग्यरीत्या इंस्टॉल केलेले नाही. <ph name="BR" /> तुमचा प्रिंटर तपासा किंवा दुसरा प्रिंटर निवडून पहा.</translation>
+<translation id="5878945009165002849">ओळखीच्या सेवांकडून मिळणाऱ्या साइन-इन सूचना ब्लॉक करा</translation>
 <translation id="5882919346125742463">ज्ञात नेटवर्क</translation>
 <translation id="5883356647197510494">आपोआप ब्लॉक केलेले <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">हा टॅब USB डिव्हाइसशी कनेक्ट केला आहे.</translation>
@@ -5631,6 +5637,7 @@
 <translation id="6513247462497316522">तुम्ही इतर नेटवर्कशी कनेक्टेड नसल्यास Google Chrome मोबाइल डेटाचा वापर करेल.</translation>
 <translation id="6514010653036109809">उपलब्ध डिव्हाइस:</translation>
 <translation id="6514565641373682518">या पेजने तुमचा माउस कर्सर बंद केला आहे.</translation>
+<translation id="6517709704288360414">तुमचे डिव्हाइस यापुढे कदाचित योग्यरीत्या काम करणार नाही आणि तुम्हाला सुरक्षा व परफॉर्मन्सशी संबंधित समस्या येऊ शकतात. अपडेट बंद केल्याने तुम्हाला काही समस्या येत असल्यास, कायदेशीर दावे करण्याच्या तुमच्या अधिकारावरदेखील परिणाम होऊ शकतो.</translation>
 <translation id="6518014396551869914">इमेज कॉपी&amp; करा</translation>
 <translation id="6518133107902771759">सत्यापित करा</translation>
 <translation id="651942933739530207">तुम्ही <ph name="APP_NAME" /> नी तुमची स्क्रीन आणि ऑडिओ इनपुट शेअर करावी असे इच्छिता?</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index 64d146d..ce93097 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1970,6 +1970,7 @@
 <translation id="2832124733806557606">Anak anda boleh menggunakan PIN untuk log masuk atau membuka kunci peranti.</translation>
 <translation id="2835177225987815960">Persediaan pengimbasan semasa anda akan ditetapkan semula, termasuk sebarang suis yang ditetapkan dan keutamaan kelajuan autoimbas.</translation>
 <translation id="2835547721736623118">Perkhidmatan pengecaman pertuturan</translation>
+<translation id="2836232638504556905">Untuk meneruskan, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> akan berkongsi nama, alamat e-mel dan gambar profil anda dengan laman ini. Lihat <ph name="BEGIN_LINK" />dasar privasi<ph name="END_LINK" /> laman ini.</translation>
 <translation id="2836269494620652131">Ranap</translation>
 <translation id="2836635946302913370">Log masuk dengan nama pengguna ini telah dilumpuhkan oleh pentadbir anda.</translation>
 <translation id="283669119850230892">Untuk menggunakan rangkaian <ph name="NETWORK_ID" />, mula-mula lengkapkan sambungan anda ke Internet di bawah.</translation>
@@ -2251,6 +2252,7 @@
 <translation id="3105796011181310544">Tukar kembali kepada Google?</translation>
 <translation id="310671807099593501">Tapak sedang menggunakan bluetooth</translation>
 <translation id="3108931485517391283">Tidak dapat menerima</translation>
+<translation id="3109206895301430738">Kumpulan Tab Disimpan</translation>
 <translation id="3109724472072898302">Diruntuhkan</translation>
 <translation id="311214366526552035">Muat Turun Juga</translation>
 <translation id="3112292765614504292">Saiz apl: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb
index 78e5eef6..d59ee04b 100644
--- a/chrome/app/resources/generated_resources_my.xtb
+++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1012,6 +1012,7 @@
 <translation id="1942600407708803723">အဖုံးကို ပိတ်လိုက်သည့်အခါ စက်ပိတ်ရန်</translation>
 <translation id="1944528062465413897">ဘလူးတုသ် တွဲချိတ်ရန်ကုဒ်-</translation>
 <translation id="1944921356641260203">မွမ်းမံမှု တွေ့ထား</translation>
+<translation id="1947136734041527201">အထောက်အထား ဝန်ဆောင်မှုဖြင့် သင့်အကောင့်ကို သုံးပြီး ဝဘ်ဆိုက်များသို့ လက်မှတ်ထိုးဝင်ခွင့်ပြုသည်</translation>
 <translation id="1949584741547056205">အမြန်အဖြေများ</translation>
 <translation id="1951012854035635156">Assistant</translation>
 <translation id="1954597385941141174">ဝဘ်ဆိုက်များက USB ကိရိယာများသို့ ချိတ်ဆက်လိုပါက ခွင့်တောင်းနိုင်သည်</translation>
@@ -2412,6 +2413,7 @@
 <translation id="32939749466444286">Linux ထည့်သွင်းမှုစနစ် မစတင်ပါ။ နောက်မှ ထပ်စမ်းကြည့်ပါ။</translation>
 <translation id="3294437725009624529">ဧည့်သည်</translation>
 <translation id="3294686910656423119">သုံးစွဲမှုဆိုင်ရာ အချက်အလက်ကိန်းဂဏန်းများနှင့် ပျက်စီးမှု အစီရင်ခံစာများ</translation>
+<translation id="3297105622164376095">ပြင်ပအဖွဲ့အစည်း လက်မှတ်ထိုးဝင်ခြင်း အတည်ပြုစနစ်ကို ပြသရန် ခွင့်ပြုထားသည်</translation>
 <translation id="3297536526040732495">သင်လက်မှတ်ထိုးဝင်ထားသည့်အခါ Google အက်ပ်များတွင် သင့်အားကာကွယ်ရန် ဤဒေတာကို သင်၏ Google Account နှင့် ယာယီလင့်ခ်ချိတ်ပေးသည်</translation>
 <translation id="329838636886466101">ပြင်ဆင်ရန်</translation>
 <translation id="3298789223962368867">ရိုက်ထည့်ခဲ့သည့် URL မမှန်ပါ။</translation>
@@ -3667,6 +3669,7 @@
 <translation id="452750746583162491">သင်စင့်ခ်လုပ်ထားသည့် ဒေတာများကို ပြန်စစ်ခြင်း</translation>
 <translation id="4527929807707405172">နောက်ပြန်လှိမ့်ခြင်း ဖွင့်ပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">ဘာသာပြန် အကြံပြုချက်</translation>
+<translation id="4529455689802245339">Chrome ‘တိုက်ရိုက်စာတန်း’ အလုပ်လုပ်နိုင်လောက်မည် မဟုတ်ပါ</translation>
 <translation id="4530494379350999373">မူရင်း</translation>
 <translation id="4531924570968473143">ဤ <ph name="DEVICE_TYPE" /> တွင် ဘယ်သူ့ကို ထည့်လိုသလဲ။</translation>
 <translation id="4532625150642446981">"<ph name="USB_DEVICE_NAME" />" ကို အသုံးပြုနေသည်။ စက်အသုံးပြုနေစဉ် ပြန်လည်သတ်မှတ်ခြင်းကြောင့် အမှားများဖြစ်နိုင်သည်။ ရှေ့ဆက်လိုသည်မှာ သေချာသလား။</translation>
@@ -3865,6 +3868,7 @@
 <translation id="471880041731876836">ဤဝဘ်ဆိုက်သို့ ဝင်ကြည့်ရန် သင့်တွင် ခွင့်ပြုချက်မရှိပါ</translation>
 <translation id="4722735765955348426"><ph name="USERNAME" /> အတွက် စကားဝှက်</translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> က သင်၏ မျက်နှာပြင်ကို မျှဝေပေးနေသည်။</translation>
+<translation id="4722989931633062466">ပြင်ပအဖွဲ့အစည်း လက်မှတ်ထိုးဝင်ခြင်း အတည်ပြုစနစ်ကို ပြသရန် ခွင့်ပြုမထားပါ</translation>
 <translation id="4723140812774948886">နောက်တစ်ခုဖြင့် လဲလှယ်ရန်</translation>
 <translation id="4724450788351008910">ဆက်နွှယ်မှု ပြောင်းလဲသွား</translation>
 <translation id="4725511304875193254">ခွေးငယ်လေး</translation>
@@ -4836,6 +4840,7 @@
 <translation id="5711010025974903573">ဝန်ဆောင်မှု မှတ်တမ်းများ</translation>
 <translation id="5711983031544731014">သော့ဖွင့် မရပါ။ သင်၏ စကားဝှက်ကို ရိုက်ထည့်ပါ။</translation>
 <translation id="5712153969432126546">ဝဘ်ဆိုက်များသည် စာရွက်စာတမ်း၊ စာချုပ်နှင့် ဖောင်များကဲ့သို့ PDF များကို တစ်ခါတစ်ရံ ထုတ်ဝေသည်</translation>
+<translation id="571222594670061844">ဝဘ်ဆိုက်များက အထောက်အထားဆိုင်ရာ ဝန်ဆောင်မှုများမှ လက်မှတ်ထိုးဝင်မှုဆိုင်ရာ အတည်ပြုစနစ်ကို ပြနိုင်သည်</translation>
 <translation id="5713158217420111469"><ph name="DEVICE" /> သို့ ချိတ်ဆက်လိုက်သည်</translation>
 <translation id="5715711091495208045">ပလတ်အင် အကျိုးဆောင်- <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">မူရင်းရှာဖွေမှုအင်ဂျင်များ</translation>
@@ -4994,6 +4999,7 @@
 <translation id="5876851302954717356">ညာဘက်တွင် တဘ်အသစ်</translation>
 <translation id="5877064549588274448">ချာနယ် ပြောင်းသွားပြီ။ အပြောင်းအလဲများ သက်ဝင်လာရန် သင့် ကိရိယာကို ပြန်ဖွင့်ပါ။</translation>
 <translation id="5877584842898320529">ရွေးထားသည့် ပရင်တာကို အသုံးပြု၍မရပါ (သို့) မှန်ကန်စွာ ထည့်သွင်းမထားပါ။ <ph name="BR" /> သင်၏ ပရင်တာကို စစ်ကြည့်ပါ (သို့) နောက်တစ်ခုကို ရွေးကြည့်ပါ။</translation>
+<translation id="5878945009165002849">အထောက်အထားဆိုင်ရာ ဝန်ဆောင်မှုများမှ လက်မှတ်ထိုးဝင်မှုဆိုင်ရာ အတည်ပြုစနစ်ကို ပိတ်နိုင်သည်</translation>
 <translation id="5882919346125742463">သိရှိထားသည့် ကွန်ရက်များ</translation>
 <translation id="5883356647197510494"><ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> ကို အလိုအလျောက် ပိတ်ထားသည်</translation>
 <translation id="5884474295213649357">ဤတဘ်သည် USB စက်ပစ္စည်းတစ်ခုသို့ ချိတ်ဆက်ထားသည်။</translation>
@@ -5630,6 +5636,7 @@
 <translation id="6513247462497316522">သင်အခြားကွန်ရက်သို့ ချိတ်ဆက်ထားမှု မရှိလျှင် Google Chrome မိုဘိုင်းအချက်လက်ကို အသုံးပြုပါမည်။</translation>
 <translation id="6514010653036109809">ရနိုင်သည့် စက်ပစ္စည်း−</translation>
 <translation id="6514565641373682518">ဒီစာမျက်နှာက သင်၏ မောက်စ်ကို ပိတ်ပစ်ခဲ့သည်။</translation>
+<translation id="6517709704288360414">သင့်စက် မှန်ကန်စွာ အလုပ်မလုပ်တော့ဘဲ လုံခြုံရေးနှင့် စွမ်းဆောင်မှုပြဿနာများ ကြုံတွေ့ရနိုင်သည်။ အပ်ဒိတ်များကို ပိတ်ခြင်းကြောင့် ပြဿနာတစ်စုံတစ်ခု ကြုံတွေ့ရပါက ဥပဒေနှင့်အညီ တောင်းဆိုမှုများပြုလုပ်ခွင့်အပေါ်တွင် သက်ရောက်မှုရှိနိုင်သည်။</translation>
 <translation id="6518014396551869914">ကူးယူရန် ပုံ</translation>
 <translation id="6518133107902771759">စိစစ်ရန်</translation>
 <translation id="651942933739530207">သင်သည် <ph name="APP_NAME" />အနေနှင့် သင်၏ မျက်နှာပြင် နှင့် အသံထုတ်ပေးမှုကို မျှပေးစေလိုပါသလား?</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb
index 4a1dc45..fbb001b 100644
--- a/chrome/app/resources/generated_resources_ne.xtb
+++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -957,6 +957,7 @@
 <translation id="1892341345406963517">नमस्ते <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">अन्य भाषाहरू</translation>
 <translation id="1895658205118569222">बन्द गर्नुहोस्</translation>
+<translation id="1897120393475391208">भरपर्दो पासवर्ड प्रयोग गर्नुहोस्</translation>
 <translation id="1900305421498694955">डिभाइसहरूको बाह्य भण्डारणमा रहेका फाइलहरू रिड र राइट गर्न Google Play का एपहरूलाई फाइलको प्रणालीमा पूर्ण पहुँच चाहिन सक्छ। बाह्य ड्राइभ प्रयोग गर्ने सबैले यन्त्रमा सिर्जना गरिएका फाइल र फोल्डरहरू देख्न सक्छन्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">&amp;सबै चयन गर्नुहोस्</translation>
 <translation id="1901396183631570154">Chrome ले यी पासवर्डहरू तपाईंको Google खातामा सुरक्षित गर्न सकेन। तर तपाईं ती पासवर्डहरू यो डिभाइसमा भने सुरक्षित गर्न सक्नुहुन्छ।</translation>
@@ -6545,6 +6546,7 @@
 <translation id="7444970023873202833">Google Photos मा भएका तपाईंका अझ धेरै स्मरणीय क्षणहरू हेर्नुहोस्</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> लाई अक्षम बनाउनुहोस्</translation>
 <translation id="7448430327655618736">एपहरू स्वतः स्थापना गर्नुहोस्</translation>
+<translation id="7449381494541372002">सुरु गरिँदै छ…</translation>
 <translation id="7449752890690775568">पासवर्ड हटाउने हो?</translation>
 <translation id="7450761244949417357">अहिले <ph name="ALTERNATIVE_BROWSER_NAME" /> मा खोलिँदै</translation>
 <translation id="7452166281927983300">खारेज गरिएका चेतावनी (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 4bc613c6..e1aec2c 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1002,6 +1002,7 @@
 <translation id="1942600407708803723">Uitzetten als de klep wordt gesloten</translation>
 <translation id="1944528062465413897">Bluetooth-koppelingscode:</translation>
 <translation id="1944921356641260203">Update gevonden</translation>
+<translation id="1947136734041527201">Hiermee kun je inloggen bij websites met het account dat je hebt bij een identiteitsservice</translation>
 <translation id="1949584741547056205">Snelle antwoorden</translation>
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1954597385941141174">Sites kunnen vragen of ze verbinding mogen maken met USB-apparaten</translation>
@@ -2398,6 +2399,7 @@
 <translation id="32939749466444286">De Linux-container is niet gestart. Probeer het opnieuw.</translation>
 <translation id="3294437725009624529">Gast</translation>
 <translation id="3294686910656423119">Gebruiksstatistieken en crashrapporten</translation>
+<translation id="3297105622164376095">Toestemming om externe inlogprompts te tonen</translation>
 <translation id="3297536526040732495">Koppelt deze gegevens tijdelijk aan je Google-account als je bent ingelogd om je te beschermen binnen de Google-apps</translation>
 <translation id="329838636886466101">Repareren</translation>
 <translation id="3298789223962368867">Ongeldige URL opgegeven</translation>
@@ -3652,6 +3654,7 @@
 <translation id="452750746583162491">Je gesynchroniseerde gegevens controleren</translation>
 <translation id="4527929807707405172">Omgekeerd scrollen aanzetten. <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Vertaalsuggestie</translation>
+<translation id="4529455689802245339">Live ondertiteling van Chrome werkt misschien niet</translation>
 <translation id="4530494379350999373">Herkomst</translation>
 <translation id="4531924570968473143">Wie wil je toevoegen aan dit <ph name="DEVICE_TYPE" />?</translation>
 <translation id="4532625150642446981">'<ph name="USB_DEVICE_NAME" />' is in gebruik. Als je het apparaat opnieuw toewijst terwijl het in gebruik is, kan dit tot fouten leiden. Weet je zeker dat je wilt doorgaan?</translation>
@@ -3849,6 +3852,7 @@
 <translation id="471880041731876836">Je hebt geen rechten om deze site te bezoeken</translation>
 <translation id="4722735765955348426">Wachtwoord voor <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> deelt je scherm.</translation>
+<translation id="4722989931633062466">Geen toestemming om externe inlogprompts te tonen</translation>
 <translation id="4723140812774948886">Wisselen met volgende</translation>
 <translation id="4724450788351008910">Relatie is gewijzigd</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4817,6 +4821,7 @@
 <translation id="5711010025974903573">Servicelogboeken</translation>
 <translation id="5711983031544731014">Kan niet ontgrendelen. Geef je wachtwoord op.</translation>
 <translation id="5712153969432126546">Sites publiceren soms pdf's, zoals documenten, contracten en formulieren</translation>
+<translation id="571222594670061844">Sites kunnen inlogprompts van identiteitsservices tonen</translation>
 <translation id="5713158217420111469">Verbonden met <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Plug-inbroker: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Standaardzoekmachines</translation>
@@ -4975,6 +4980,7 @@
 <translation id="5876851302954717356">Nieuw tabblad aan de rechterkant</translation>
 <translation id="5877064549588274448">Kanaal gewijzigd. Start het apparaat opnieuw op om de wijzigingen door te voeren.</translation>
 <translation id="5877584842898320529">De geselecteerde printer is niet beschikbaar of niet correct geïnstalleerd.<ph name="BR" />Controleer de printer of probeer een andere printer te selecteren.</translation>
+<translation id="5878945009165002849">Inlogprompts van identiteitsservices blokkeren</translation>
 <translation id="5882919346125742463">Bekende netwerken</translation>
 <translation id="5883356647197510494">Rechten voor <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> automatisch geblokkeerd</translation>
 <translation id="5884474295213649357">Dit tabblad is gekoppeld aan een USB-apparaat.</translation>
@@ -5610,6 +5616,7 @@
 <translation id="6513247462497316522">Google Chrome maakt gebruik van mobiele data als je geen verbinding hebt met een ander netwerk.</translation>
 <translation id="6514010653036109809">Beschikbaar apparaat:</translation>
 <translation id="6514565641373682518">Deze pagina heeft je muisaanwijzer uitgezet.</translation>
+<translation id="6517709704288360414">Je apparaat werkt misschien niet meer goed en je kunt beveiligings- en prestatieproblemen ondervinden. Als je updates uitzet, kan dit ook van invloed zijn op je recht op juridische eisen als je problemen ondervindt.</translation>
 <translation id="6518014396551869914">A&amp;fbeelding kopiëren</translation>
 <translation id="6518133107902771759">Controleren</translation>
 <translation id="651942933739530207">Wilt je je scherm en audio-uitvoer delen met <ph name="APP_NAME" />?</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index a64368e..aaa6084d 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1008,6 +1008,7 @@
 <translation id="1942600407708803723">Slå av når dekselet lukkes</translation>
 <translation id="1944528062465413897">Bluetooth-sammenkoblingskode</translation>
 <translation id="1944921356641260203">En oppdatering ble funnet</translation>
+<translation id="1947136734041527201">Lar deg logge på nettsteder med kontoer du har hos identitetstjenester</translation>
 <translation id="1949584741547056205">Hurtigsvar</translation>
 <translation id="1951012854035635156">Assistent</translation>
 <translation id="1954597385941141174">Nettsteder kan be om å få koble til USB-enheter</translation>
@@ -2408,6 +2409,7 @@
 <translation id="32939749466444286">Linux-beholderen startet ikke. Prøv på nytt.</translation>
 <translation id="3294437725009624529">Gjest</translation>
 <translation id="3294686910656423119">Bruksstatistikk og programstopprapporter</translation>
+<translation id="3297105622164376095">Nettsteder som har lov til å vise påloggingsforespørsler fra tredjeparter</translation>
 <translation id="3297536526040732495">Knytter disse dataene til Google-kontoen din midlertidig når du er pålogget, slik at du er beskyttet i alle Google-appene</translation>
 <translation id="329838636886466101">Reparer</translation>
 <translation id="3298789223962368867">Ugyldig nettadresse angitt.</translation>
@@ -3661,6 +3663,7 @@
 <translation id="452750746583162491">Gjennomgå de synkroniserte dataene dine</translation>
 <translation id="4527929807707405172">Slå på omvendt rulling. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Oversettelsesforslag</translation>
+<translation id="4529455689802245339">Det kan hende at Chrome Direkteteksting ikke kommer til å fungere</translation>
 <translation id="4530494379350999373">Opprinnelse</translation>
 <translation id="4531924570968473143">Hvem vil du legge til på denne <ph name="DEVICE_TYPE" />-enheten?</translation>
 <translation id="4532625150642446981">«<ph name="USB_DEVICE_NAME" />» er i bruk. Hvis du endrer tilordningen av enheten mens den er i bruk, kan det forårsake feil. Er du sikker på at du vil fortsette?</translation>
@@ -3859,6 +3862,7 @@
 <translation id="471880041731876836">Du har ikke tillatelse til å besøke dette nettstedet</translation>
 <translation id="4722735765955348426">Passord for <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> deler skjermen din.</translation>
+<translation id="4722989931633062466">Nettsteder som ikke har lov til å vise påloggingsforespørsler fra tredjeparter</translation>
 <translation id="4723140812774948886">Bytt med neste</translation>
 <translation id="4724450788351008910">Tilknytning endret</translation>
 <translation id="4725511304875193254">Corgi</translation>
@@ -4828,6 +4832,7 @@
 <translation id="5711010025974903573">Tjenestelogger</translation>
 <translation id="5711983031544731014">Kan ikke låse opp. Skriv inn passordet ditt.</translation>
 <translation id="5712153969432126546">Nettsteder publiserer av og til PDF-filer, for eksempel dokumenter, kontrakter og skjemaer</translation>
+<translation id="571222594670061844">Nettsteder kan vise påloggingsforespørsler fra identitetstjenester</translation>
 <translation id="5713158217420111469">Koblet til <ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Programtilleggsmegler: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Standard søkemotorer</translation>
@@ -4986,6 +4991,7 @@
 <translation id="5876851302954717356">Ny fane til høyre</translation>
 <translation id="5877064549588274448">Kanalen ble endret. Start enheten på nytt for å aktivere endringene.</translation>
 <translation id="5877584842898320529">Den valgte skriveren er ikke tilgjengelig, eller den er ikke installert på riktig måte. <ph name="BR" /> Kontrollér skriveren din, eller prøv å velge en annen skriver.</translation>
+<translation id="5878945009165002849">Blokker påloggingsforespørsler fra identitetstjenester</translation>
 <translation id="5882919346125742463">Kjente nettverk</translation>
 <translation id="5883356647197510494">Blokkerte automatisk <ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Denne fanen er koblet til en USB-enhet.</translation>
@@ -5623,6 +5629,7 @@
 <translation id="6513247462497316522">Google Chrome bruker mobile data hvis du ikke er koblet til et annet nettverk.</translation>
 <translation id="6514010653036109809">Tilgjengelig enhet:</translation>
 <translation id="6514565641373682518">Denne siden har deaktivert markøren din.</translation>
+<translation id="6517709704288360414">Det kan hende at enheten din slutter å fungere som den skal, og du kan oppleve sikkerhets- og ytelsesproblemer. Hvis du slår av oppdateringer, kan det også påvirke rettighetene dine til å fremsette juridiske krav hvis du støter på problemer.</translation>
 <translation id="6518014396551869914">&amp;Kopier bilde</translation>
 <translation id="6518133107902771759">Bekreft</translation>
 <translation id="651942933739530207">Vil du at <ph name="APP_NAME" /> skal dele skjerm- og lydutdataene dine?</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb
index f8dc84d36..fd385096 100644
--- a/chrome/app/resources/generated_resources_or.xtb
+++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1953,6 +1953,7 @@
 <translation id="2832124733806557606">ଆପଣଙ୍କ ପିଲା ଡିଭାଇସରେ ସାଇନ୍ ଇନ୍ କରିବାକୁ କିମ୍ବା ଏହାକୁ ଅନଲକ୍ କରିବାକୁ ଏକ PIN ବ୍ୟବହାର କରିପାରିବ।</translation>
 <translation id="2835177225987815960">ଆସାଇନ କରାଯାଇଥିବା ଯେ କୌଣସି ସ୍ୱିଚ ଏବଂ ଅଟୋ-ସ୍କାନର ସ୍ପିଡ ସମ୍ବନ୍ଧିତ ପସନ୍ଦଗୁଡ଼ିକ ସମେତ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ସ୍କାନିଂ ସେଟଅପ ରିସେଟ ହୋଇଯିବ।</translation>
 <translation id="2835547721736623118">ସ୍ପିଚ୍ ଚିହ୍ନଟକରଣ ସେବା</translation>
+<translation id="2836232638504556905">ଜାରି ରଖିବାକୁ, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ଏହି ସାଇଟ ସହ ଆପଣଙ୍କ ନାମ, ଇମେଲ ଠିକଣା ଏବଂ ପ୍ରୋଫାଇଲ ଛବିକୁ ସେୟାର କରିବ। ଏହି ସାଇଟର <ph name="BEGIN_LINK" />ଗୋପନୀୟତା ନୀତି<ph name="END_LINK" /> ଦେଖନ୍ତୁ।</translation>
 <translation id="2836269494620652131">କ୍ରାଶ୍</translation>
 <translation id="2836635946302913370">ଆପଣଙ୍କ ବ୍ୟବସ୍ଥାପକଙ୍କ ଦ୍ୱାରା ଏହି ଉପଯୋଗକର୍ତ୍ତାନାମରେ ସାଇନ୍‌ ଇନ୍‌ କରିବା ଅକ୍ଷମ କରାଯାଇଛି।</translation>
 <translation id="283669119850230892">ନେଟ୍‍ୱର୍କ <ph name="NETWORK_ID" /> ବ୍ୟବହାର କରିବାକୁ, ପ୍ରଥମେ ନିମ୍ନରେ ଦିଆଯାଇଥିବା ଆପଣଙ୍କର ଇଣ୍ଟର୍ନେଟ୍‍କୁ ସଂଯୋଗ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ।</translation>
@@ -2234,6 +2235,7 @@
 <translation id="3105796011181310544">ପୁଣି Googleକୁ ବଦଳାଇବାକୁ ଚାହାଁନ୍ତି?</translation>
 <translation id="310671807099593501">ସାଇଟ୍ ଆପଣଙ୍କର ବ୍ଲୁଟୁଥ୍ ବ୍ୟବହାର କରୁଛି।</translation>
 <translation id="3108931485517391283">ପ୍ରାପ୍ତ କରାଯାଇପାରିବ ନାହିଁ</translation>
+<translation id="3109206895301430738">ସେଭ କରାଯାଇଥିବା ଟାବ ଗ୍ରୁପ</translation>
 <translation id="3109724472072898302">ସଙ୍କୁଚିତ କରାଗଲା</translation>
 <translation id="311214366526552035">ଯେ କୌଣସି ମତେ ଡାଉନଲୋଡ କରନ୍ତୁ</translation>
 <translation id="3112292765614504292">ଆପର ଆକାର: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb
index 3355acb7..8d9c3a04 100644
--- a/chrome/app/resources/generated_resources_pa.xtb
+++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -973,6 +973,7 @@
 <translation id="1892341345406963517">ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">ਹੋਰ ਭਾਸ਼ਾਵਾਂ</translation>
 <translation id="1895658205118569222">ਸ਼ਟਡਾਊਨ</translation>
+<translation id="1897120393475391208">ਮਜ਼ਬੂਤ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋ</translation>
 <translation id="1900305421498694955">Google Play ਦੀਆਂ ਐਪਾਂ ਨੂੰ ਸ਼ਾਇਦ ਬਾਹਰੀ ਸਟੋਰੇਜ ਡੀਵਾਈਸਾਂ ਦੀਆਂ ਫ਼ਾਈਲਾਂ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਲਈ ਪੂਰੇ ਫ਼ਾਈਲ ਸਿਸਟਮ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਲੋੜ ਪਵੇ। ਡੀਵਾਈਸ 'ਤੇ ਬਣਾਈਆਂ ਫ਼ਾਈਲਾਂ ਅਤੇ ਫੋਲਡਰ ਬਾਹਰੀ ਡਰਾਈਵ ਵਰਤਣ ਵਾਲੇ ਹਰ ਵਿਅਕਤੀ ਨੂੰ ਦਿਸਦੇ ਹਨ। <ph name="LINK_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">&amp;ਸਾਰੇ ਚੁਣੋ</translation>
 <translation id="1901396183631570154">Chrome ਇਹਨਾਂ ਪਾਸਵਰਡਾਂ ਨੂੰ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਇਹਨਾਂ ਨੂੰ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਰੱਖਿਅਤ ਕਰ ਸਕਦੇ ਹੋ।</translation>
@@ -6561,6 +6562,7 @@
 <translation id="7444970023873202833">Google Photos ਵਿੱਚ ਆਪਣੀਆਂ ਹੋਰ ਯਾਦਾਂ ਦੀ ਪੜਚੋਲ ਕਰੋ</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" /> ਨੂੰ ਬੰਦ ਕਰੋ</translation>
 <translation id="7448430327655618736">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਐਪਾਂ ਦੀ ਸਥਾਪਨਾ</translation>
+<translation id="7449381494541372002">ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ…</translation>
 <translation id="7449752890690775568">ਕੀ ਪਾਸਵਰਡ ਹਟਾਉਣਾ ਹੈ?</translation>
 <translation id="7450761244949417357">ਹੁਣ <ph name="ALTERNATIVE_BROWSER_NAME" /> ਵਿੱਚ ਖੁੱਲ੍ਹ ਰਿਹਾ ਹੈ</translation>
 <translation id="7452166281927983300">ਖਾਰਜ ਕੀਤੀਆਂ ਗਈਆਂ ਚਿਤਾਵਨੀਆਂ (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 289681308..83b1e4f 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -958,6 +958,7 @@
 <translation id="1892341345406963517">Cześć, <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">Inne języki</translation>
 <translation id="1895658205118569222">Wyłączenie</translation>
+<translation id="1897120393475391208">Użyj silnego hasła</translation>
 <translation id="1900305421498694955">Aplikacje z Google Play mogą wymagać pełnego dostępu do systemu plików, by odczytywać i zapisywać pliki na zewnętrznych urządzeniach pamięci masowej. Pliki i foldery utworzone na urządzeniu są widoczne dla każdej osoby używającej dysku zewnętrznego. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">Zaznacz &amp;wszystko</translation>
 <translation id="1901396183631570154">Chrome nie może zapisać tych haseł na Twoim koncie Google. Możesz je jednak zapisać na tym urządzeniu.</translation>
@@ -6531,6 +6532,7 @@
 <translation id="7444970023873202833">Zobacz więcej swoich wspomnień w Zdjęciach Google</translation>
 <translation id="7444983668544353857">Wyłącz – <ph name="NETWORKDEVICE" /></translation>
 <translation id="7448430327655618736">Automatyczne instalowanie aplikacji</translation>
+<translation id="7449381494541372002">uruchamiam…</translation>
 <translation id="7449752890690775568">Usunąć hasło?</translation>
 <translation id="7450761244949417357">Otwieram w przeglądarce <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
 <translation id="7452166281927983300">Zamknięte ostrzeżenia (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 47e7abe..bc82254e 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1956,6 +1956,7 @@
 <translation id="2832124733806557606">A criança pode utilizar um PIN para iniciar sessão ou desbloquear o dispositivo.</translation>
 <translation id="2835177225987815960">A sua configuração de análise atual será reposta, incluindo quaisquer interruptores atribuídos e preferências de velocidade de análise automática.</translation>
 <translation id="2835547721736623118">Serviço de reconhecimento de voz</translation>
+<translation id="2836232638504556905">Para continuar, o fornecedor <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> vai partilhar o seu nome, endereço de email e imagem do perfil com este site. Consulte a <ph name="BEGIN_LINK" />política de privacidade<ph name="END_LINK" /> deste site.</translation>
 <translation id="2836269494620652131">Falha</translation>
 <translation id="2836635946302913370">O início de sessão com este nome de utilizador foi desativado pelo seu gestor.</translation>
 <translation id="283669119850230892">Para utilizar a rede <ph name="NETWORK_ID" />, conclua primeiro a sua ligação à internet abaixo.</translation>
@@ -2238,6 +2239,7 @@
 <translation id="3105796011181310544">Pretende reverter para o Google?</translation>
 <translation id="310671807099593501">O site está a utilizar o Bluetooth.</translation>
 <translation id="3108931485517391283">Não é possível receber</translation>
+<translation id="3109206895301430738">Grupos de separadores guardados</translation>
 <translation id="3109724472072898302">Fechado</translation>
 <translation id="311214366526552035">Transferir mesmo assim</translation>
 <translation id="3112292765614504292">Tamanho da app: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 853cacf..a4700726 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1004,6 +1004,7 @@
 <translation id="1942600407708803723">Завершить работу, когда обложка закрыта</translation>
 <translation id="1944528062465413897">Код Bluetooth-подключения:</translation>
 <translation id="1944921356641260203">Найдено обновление</translation>
+<translation id="1947136734041527201">Позволяет выполнять вход на сайтах через сервисы подтверждения личности.</translation>
 <translation id="1949584741547056205">Быстрые ответы</translation>
 <translation id="1951012854035635156">Ассистент</translation>
 <translation id="1954597385941141174">Разрешить сайтам отправлять запрос на подключение к USB-устройствам</translation>
@@ -2400,6 +2401,7 @@
 <translation id="32939749466444286">Не удалось запустить контейнер Linux. Повторите попытку.</translation>
 <translation id="3294437725009624529">Гость</translation>
 <translation id="3294686910656423119">Статистика использования и отчеты о сбоях</translation>
+<translation id="3297105622164376095">Разрешить предложения войти в аккаунт через сторонние сервисы</translation>
 <translation id="3297536526040732495">Когда выполнен вход в аккаунт Google, между этими данными и аккаунтом временно устанавливается связь, чтобы защитить вас во время работы с приложениями Google.</translation>
 <translation id="329838636886466101">Восстановить</translation>
 <translation id="3298789223962368867">Введен недопустимый URL.</translation>
@@ -3655,6 +3657,7 @@
 <translation id="452750746583162491">Проверить синхронизированные данные</translation>
 <translation id="4527929807707405172">Включить прокрутку в обратную сторону. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Предлагать перевод</translation>
+<translation id="4529455689802245339">Автоматические субтитры Chrome могут не поддерживаться</translation>
 <translation id="4530494379350999373">Происхождение</translation>
 <translation id="4531924570968473143">Добавьте пользователя на это устройство (<ph name="DEVICE_TYPE" />)</translation>
 <translation id="4532625150642446981">Устройство "<ph name="USB_DEVICE_NAME" />" уже используется. Его переназначение может привести к возникновению ошибок. Продолжить?</translation>
@@ -3853,6 +3856,7 @@
 <translation id="471880041731876836">Доступ запрещен</translation>
 <translation id="4722735765955348426">Пароль аккаунта пользователя <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856">Приложению <ph name="APP_NAME" /> предоставлен доступ к вашему экрану.</translation>
+<translation id="4722989931633062466">Запретить предложения войти в аккаунт через сторонние сервисы</translation>
 <translation id="4723140812774948886">Поменять местами со следующим</translation>
 <translation id="4724450788351008910">Изменение принадлежности</translation>
 <translation id="4725511304875193254">Корги</translation>
@@ -4823,6 +4827,7 @@
 <translation id="5711010025974903573">Служебные журналы</translation>
 <translation id="5711983031544731014">Невозможно разблокировать. Введите пароль.</translation>
 <translation id="5712153969432126546">Иногда на сайтах публикуются файлы в формате PDF, например документы, договоры или формы.</translation>
+<translation id="571222594670061844">Разрешить сайтам показывать предложения войти в аккаунт через сервисы подтверждения личности</translation>
 <translation id="5713158217420111469">Подключено устройство "<ph name="DEVICE" />"</translation>
 <translation id="5715711091495208045">Посредник: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Поисковая система по умолчанию</translation>
@@ -4981,6 +4986,7 @@
 <translation id="5876851302954717356">Новая вкладка справа</translation>
 <translation id="5877064549588274448">Канал изменен. Чтобы изменения вступили в силу, перезапустите устройство.</translation>
 <translation id="5877584842898320529">Этот принтер недоступен или настроен неправильно.<ph name="BR" />Проверьте его или выберите другой.</translation>
+<translation id="5878945009165002849">Запретить сайтам показывать предложения войти в аккаунт через сервисы подтверждения личности</translation>
 <translation id="5882919346125742463">Известные сети</translation>
 <translation id="5883356647197510494">Автоматически отключены разрешения "<ph name="PERMISSION_1" />" и "<ph name="PERMISSION_2" />"</translation>
 <translation id="5884474295213649357">Эта вкладка подключена к USB-устройству</translation>
@@ -5618,6 +5624,7 @@
 <translation id="6513247462497316522">При отсутствии подключения к другой сети Google Chrome будет использовать мобильную сеть передачи данных.</translation>
 <translation id="6514010653036109809">Доступное устройство:</translation>
 <translation id="6514565641373682518">Эта страница скрыла курсор.</translation>
+<translation id="6517709704288360414">Возможны сбои в работе устройства, а также проблемы с производительностью и безопасностью. После отключения обновлений вы можете утратить право на подачу судебных исков в случае возникновения проблем.</translation>
 <translation id="6518014396551869914">Коп&amp;ировать картинку</translation>
 <translation id="6518133107902771759">Подтвердить</translation>
 <translation id="651942933739530207">Предоставить приложению "<ph name="APP_NAME" />" доступ к вашему экрану и звуку?</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index e0f4fca..07644a10 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1958,6 +1958,7 @@
 <translation id="2832124733806557606">උපාංගයට පිරීමට හෝ අගුලු හැරීමට ඔබගේ දරුවාට PIN එකක් භාවිත කළ හැකිය.</translation>
 <translation id="2835177225987815960">ඔබගේ වත්මන් ස්කෑන් කිරීමේ පිහිටුම, පවරා ඇති ඕනෑම ස්විචයක් සහ ස්වයංක්‍රීය ස්කෑන් කිරීම් වේග මනාප ඇතුළුව යළි සකසනු ඇත.</translation>
 <translation id="2835547721736623118">කථන හඳුනා ගැනීමේ සේවය</translation>
+<translation id="2836232638504556905">ඉදිරියට යාමට, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> ඔබගේ නම, ඉ-තැපැල් ලිපිනය සහ පැතිකඩ පින්තූරය මෙම අඩවිය සමග බෙදා ගනු ඇත. මෙම අඩවියෙහි <ph name="BEGIN_LINK" />පෞද්ගලිකත්ව ප්‍රතිපත්තිය<ph name="END_LINK" /> බලන්න.</translation>
 <translation id="2836269494620652131">බිඳවැටීම</translation>
 <translation id="2836635946302913370">මෙම භාවිතනම සමඟ එවීම ඔබේ පරිපාලක විසින් අක්‍රිය කරන ලදි.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> ජාලය භාවිතා කිරීම සඳහා, ඔබේ අන්තර්ජාල සම්බන්ධතාවය පහතින් සම්පූර්ණ කරන්න.</translation>
@@ -2239,6 +2240,7 @@
 <translation id="3105796011181310544">ආපසු Google වෙත හරවන්නේද?</translation>
 <translation id="310671807099593501">අඩවිය බ්ලූටූත් භාවිත කරයි</translation>
 <translation id="3108931485517391283">ලැබිය නොහැකිය</translation>
+<translation id="3109206895301430738">සුරැකි ටැබ සමූහ</translation>
 <translation id="3109724472072898302">හැකිළූ</translation>
 <translation id="311214366526552035">කෙසේ වෙතත් බාගන්න</translation>
 <translation id="3112292765614504292">යෙදුම් තරම: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 9c30362..d3ad2dd 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1973,6 +1973,7 @@
 <translation id="2832124733806557606">Otrok lahko uporabi kodo PIN za prijavo ali odklepanje naprave.</translation>
 <translation id="2835177225987815960">Trenutna nastavitev optičnega branja bo ponastavljena, vključno z vsemi dodeljenimi stikali in nastavitvami hitrosti samodejnega iskanja.</translation>
 <translation id="2835547721736623118">Storitev prepoznavanja govora</translation>
+<translation id="2836232638504556905">Če želite nadaljevati, bo ponudnik <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> delil vaše ime, e-poštni naslov in profilno sliko s tem spletnim mestom. Oglejte si <ph name="BEGIN_LINK" />pravilnik o zasebnosti<ph name="END_LINK" /> tega spletnega mesta.</translation>
 <translation id="2836269494620652131">Zrušitev</translation>
 <translation id="2836635946302913370">Skrbnik je onemogočil prijavo s tem uporabniškim imenom.</translation>
 <translation id="283669119850230892">Če želite uporabljati omrežje <ph name="NETWORK_ID" />, najprej spodaj vzpostavite povezavo z internetom.</translation>
@@ -2254,6 +2255,7 @@
 <translation id="3105796011181310544">Želite preklopiti nazaj na Google?</translation>
 <translation id="310671807099593501">Spletno mesto uporablja Bluetooth</translation>
 <translation id="3108931485517391283">Ni mogoče prejemati</translation>
+<translation id="3109206895301430738">Shranjene skupine zavihkov</translation>
 <translation id="3109724472072898302">Strnjeno</translation>
 <translation id="311214366526552035">Vseeno prenesi</translation>
 <translation id="3112292765614504292">Velikost aplikacije: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index f36a0579..319213e 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1952,6 +1952,7 @@
 <translation id="2832124733806557606">Fëmija yt mund të përdorë një PIN për t'u identifikuar ose për të shkyçur pajisjen.</translation>
 <translation id="2835177225987815960">Konfigurimi yt aktual i skanimit do të rivendoset, duke përfshirë çdo çelës të caktuar dhe preferencë të shpejtësisë së skanimit automatik.</translation>
 <translation id="2835547721736623118">Shërbimi i njohjes së ligjërimit</translation>
+<translation id="2836232638504556905">Për të vazhduar, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> do të ndajë emrin, adresën e email-it dhe fotografinë tënde të profilit me këtë sajt. Shiko <ph name="BEGIN_LINK" />politikën e privatësisë<ph name="END_LINK" /> të këtij sajti.</translation>
 <translation id="2836269494620652131">Ndërprerje aksidentale</translation>
 <translation id="2836635946302913370">Identifikimi me këtë emër përdoruesi është çaktivizuar nga administratori yt.</translation>
 <translation id="283669119850230892">Për të përdorur rrjetin <ph name="NETWORK_ID" />, në fillim përfundo lidhjen tënde me internetin më poshtë.</translation>
@@ -2233,6 +2234,7 @@
 <translation id="3105796011181310544">Të ndryshohet përsëri në Google?</translation>
 <translation id="310671807099593501">Sajti po përdor Bluetooth-in</translation>
 <translation id="3108931485517391283">Nuk mund të merret</translation>
+<translation id="3109206895301430738">Grupet e ruajtura të skedave</translation>
 <translation id="3109724472072898302">Palosur</translation>
 <translation id="311214366526552035">Shkarko gjithsesi</translation>
 <translation id="3112292765614504292">Madhësia e aplikacionit: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb
index 9d367d3..8773ba9d 100644
--- a/chrome/app/resources/generated_resources_sr-Latn.xtb
+++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -445,7 +445,7 @@
 <translation id="142758023928848008">Omogući lepljive tastere (da biste koristili tasterske prečice tako što ćete pritiskati jedan po jedan taster)</translation>
 <translation id="142765311413773645">Licenca za aplikaciju <ph name="APP_NAME" /> je istekla</translation>
 <translation id="1428373049397869723">Pomoću ove aplikacije možete da otvarate i menjate podržane fajlove iz Finder-a ili drugih aplikacija. Da biste kontrolisali koji fajlovi podrazumevano otvaraju ovu aplikaciju, <ph name="BEGIN_LINK" />saznajte kako da podesite podrazumevane aplikacije na uređaju<ph name="END_LINK" />.</translation>
-<translation id="1428770807407000502">Želite li da isključite sinhronizaciju?</translation>
+<translation id="1428770807407000502">Želite da isključite sinhronizaciju?</translation>
 <translation id="1429300045468813835">Sve je obrisano</translation>
 <translation id="1430915738399379752">Štampaj</translation>
 <translation id="1431188203598586230">Poslednje ažuriranje softvera</translation>
@@ -2810,7 +2810,7 @@
 <translation id="369522892592566391">{NUM_FILES,plural, =0{Bezbednosne provere su gotove. Podaci će se otpremiti.}=1{Bezbednosne provere su gotove. Datoteka će se otpremiti.}one{Bezbednosne provere su gotove. Datoteke će se otpremiti.}few{Bezbednosne provere su gotove. Datoteke će se otpremiti.}other{Bezbednosne provere su gotove. Datoteke će se otpremiti.}}</translation>
 <translation id="3698471669415859717">Pregled je završen</translation>
 <translation id="3699624789011381381">Imejl adresa</translation>
-<translation id="3699920817649120894">Želite li da isključite sinhronizaciju i personalizaciju?</translation>
+<translation id="3699920817649120894">Želite da isključite sinhronizaciju i personalizaciju?</translation>
 <translation id="3700888195348409686">Prikazuje se (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3700993174159313525">Ne dozvoljavaj sajtovima da prate položaj kamere</translation>
 <translation id="3702500414347826004">Polazne stranice su promenjene, pa sada obuhvataju <ph name="URL" />.</translation>
@@ -3411,7 +3411,7 @@
 <translation id="4280325816108262082">Veza sa uređajem će se automatski isključiti kada se uređaj isključi ili se ne koristi</translation>
 <translation id="4281844954008187215">Uslovi korišćenja usluge</translation>
 <translation id="4282196459431406533">Smart Lock je uključen</translation>
-<translation id="4284755288573763878">Želite li da isključite poboljšanu bezbednost?</translation>
+<translation id="4284755288573763878">Želite da isključite poboljšanu bezbednost?</translation>
 <translation id="4285418559658561636">Ažuriraj lozinku</translation>
 <translation id="4285498937028063278">Otkači</translation>
 <translation id="428565720843367874">Došlo je do neočekivane greške sa antivirusnim softverom pri skeniranju ove datoteke.</translation>
@@ -5235,7 +5235,7 @@
 <translation id="6122093587541546701">Imejl (opcionalno):</translation>
 <translation id="6122095009389448667">Nastavi da blokiraš uvid u privremenu memoriju ovom sajtu</translation>
 <translation id="6122600716821516697">Želite da delite sadržaj sa ovim uređajem?</translation>
-<translation id="6122831415929794347">Želite li da isključite Bezbednosno pregledanje?</translation>
+<translation id="6122831415929794347">Želite da isključite Bezbednosno pregledanje?</translation>
 <translation id="6122875415561139701">Operacija pisanja nije dozvoljena na: „<ph name="DEVICE_NAME" />“.</translation>
 <translation id="6124213551517593835">Ovim brišete sve podatke i kolačiće koje čuvaju sajt <ph name="SITE_GROUP_NAME" /> i svi njemu podređeni sajtovi</translation>
 <translation id="6124650939968185064">Sledeći dodaci zavise od ovog dodatka:</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index c411e220..6856e594 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -445,7 +445,7 @@
 <translation id="142758023928848008">Омогући лепљиве тастере (да бисте користили тастерске пречице тако што ћете притискати један по један тастер)</translation>
 <translation id="142765311413773645">Лиценца за апликацију <ph name="APP_NAME" /> је истекла</translation>
 <translation id="1428373049397869723">Помоћу ове апликације можете да отварате и мењате подржане фајлове из Finder-а или других апликација. Да бисте контролисали који фајлови подразумевано отварају ову апликацију, <ph name="BEGIN_LINK" />сазнајте како да подесите подразумеване апликације на уређају<ph name="END_LINK" />.</translation>
-<translation id="1428770807407000502">Желите ли да искључите синхронизацију?</translation>
+<translation id="1428770807407000502">Желите да искључите синхронизацију?</translation>
 <translation id="1429300045468813835">Све је обрисано</translation>
 <translation id="1430915738399379752">Штампај</translation>
 <translation id="1431188203598586230">Последње ажурирање софтвера</translation>
@@ -2810,7 +2810,7 @@
 <translation id="369522892592566391">{NUM_FILES,plural, =0{Безбедносне провере су готове. Подаци ће се отпремити.}=1{Безбедносне провере су готове. Датотека ће се отпремити.}one{Безбедносне провере су готове. Датотеке ће се отпремити.}few{Безбедносне провере су готове. Датотеке ће се отпремити.}other{Безбедносне провере су готове. Датотеке ће се отпремити.}}</translation>
 <translation id="3698471669415859717">Преглед је завршен</translation>
 <translation id="3699624789011381381">Имејл адреса</translation>
-<translation id="3699920817649120894">Желите ли да искључите синхронизацију и персонализацију?</translation>
+<translation id="3699920817649120894">Желите да искључите синхронизацију и персонализацију?</translation>
 <translation id="3700888195348409686">Приказује се (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3700993174159313525">Не дозвољавај сајтовима да прате положај камере</translation>
 <translation id="3702500414347826004">Полазне странице су промењене, па сада обухватају <ph name="URL" />.</translation>
@@ -3411,7 +3411,7 @@
 <translation id="4280325816108262082">Веза са уређајем ће се аутоматски искључити када се уређај искључи или се не користи</translation>
 <translation id="4281844954008187215">Услови коришћења услуге</translation>
 <translation id="4282196459431406533">Smart Lock је укључен</translation>
-<translation id="4284755288573763878">Желите ли да искључите побољшану безбедност?</translation>
+<translation id="4284755288573763878">Желите да искључите побољшану безбедност?</translation>
 <translation id="4285418559658561636">Ажурирај лозинку</translation>
 <translation id="4285498937028063278">Откачи</translation>
 <translation id="428565720843367874">Дошло је до неочекиване грешке са антивирусним софтвером при скенирању ове датотеке.</translation>
@@ -5235,7 +5235,7 @@
 <translation id="6122093587541546701">Имејл (опционално):</translation>
 <translation id="6122095009389448667">Настави да блокираш увид у привремену меморију овом сајту</translation>
 <translation id="6122600716821516697">Желите да делите садржај са овим уређајем?</translation>
-<translation id="6122831415929794347">Желите ли да искључите Безбедносно прегледање?</translation>
+<translation id="6122831415929794347">Желите да искључите Безбедносно прегледање?</translation>
 <translation id="6122875415561139701">Операција писања није дозвољена на: „<ph name="DEVICE_NAME" />“.</translation>
 <translation id="6124213551517593835">Овим бришете све податке и колачиће које чувају сајт <ph name="SITE_GROUP_NAME" /> и сви њему подређени сајтови</translation>
 <translation id="6124650939968185064">Следећи додаци зависе од овог додатка:</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 1a3103c..0c4b5db 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1970,6 +1970,7 @@
 <translation id="2832124733806557606">Ditt barn kan logga in på enheten eller låsa upp den med en pinkod.</translation>
 <translation id="2835177225987815960">Din nuvarande konfiguration för genomsökning återställs, inklusive brytartilldelningar och hastighetsinställning för automatisk genomsökning.</translation>
 <translation id="2835547721736623118">Tjänst för taligenkänning</translation>
+<translation id="2836232638504556905"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> delar ditt namn, din e-postadress, din adress och din profilbild med den här webbplatsen om du fortsätter. Läs webbplatsens <ph name="BEGIN_LINK" />integritetspolicy<ph name="END_LINK" />.</translation>
 <translation id="2836269494620652131">Krasch</translation>
 <translation id="2836635946302913370">Inloggningar med detta användarnamn har inaktiverats av administratören.</translation>
 <translation id="283669119850230892">För att kunna använda nätverket <ph name="NETWORK_ID" /> måste du först ansluta till Internet nedan.</translation>
@@ -2251,6 +2252,7 @@
 <translation id="3105796011181310544">Vill du byta tillbaka till Google?</translation>
 <translation id="310671807099593501">Webbplatsen använder Bluetooth</translation>
 <translation id="3108931485517391283">Det går inte att ta emot</translation>
+<translation id="3109206895301430738">Sparade flikgrupper</translation>
 <translation id="3109724472072898302">Komprimerat</translation>
 <translation id="311214366526552035">Ladda ned ändå</translation>
 <translation id="3112292765614504292">Appstorlek: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 5d70068..b026492 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1967,6 +1967,7 @@
 <translation id="2832124733806557606">Mtoto wako anaweza kutumia PIN kuingia katika akaunti kwenye kifaa au kukifungua.</translation>
 <translation id="2835177225987815960">Mipangilio yako ya sasa ya kuchanganua itawekwa upya, ikijumuisha swichi zozote ulizoteua na mapendeleo ya kasi ya kuchanganua kiotomatiki.</translation>
 <translation id="2835547721736623118">Huduma ya utambuzi wa matamshi</translation>
+<translation id="2836232638504556905">Ili uendelee, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> itashiriki jina, anwani ya barua pepe, pamoja na picha yako ya wasifu na tovuti hii. Angalia <ph name="BEGIN_LINK" />sera ya faragha<ph name="END_LINK" /> ya tovuti hii.</translation>
 <translation id="2836269494620652131">Imeacha kufanya kazi</translation>
 <translation id="2836635946302913370">Kuingia kwa jina hili la mtumiaji kumelemazwa na msimamizi wako.</translation>
 <translation id="283669119850230892">Ili kutumia mtandao <ph name="NETWORK_ID" />, kwanza kamilisha muunganisho wako katika Mtandao hapo chini.</translation>
@@ -2248,6 +2249,7 @@
 <translation id="3105796011181310544">Ungependa kubadilisha ili urudi kwenye Google?</translation>
 <translation id="310671807099593501">Tovuti inatumia bluetooth</translation>
 <translation id="3108931485517391283">Imeshindwa kupokea</translation>
+<translation id="3109206895301430738">Vikundi vya Vichupo Vilivyohifadhiwa</translation>
 <translation id="3109724472072898302">Imekunjwa</translation>
 <translation id="311214366526552035">Pakua Licha ya Hayo</translation>
 <translation id="3112292765614504292">Ukubwa wa programu: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 22760f81d..674b128 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -971,6 +971,7 @@
 <translation id="1892341345406963517">హాయ్ <ph name="PARENT_NAME" /></translation>
 <translation id="189358972401248634">ఇతర భాషలు</translation>
 <translation id="1895658205118569222">షట్‌డౌన్</translation>
+<translation id="1897120393475391208">శక్తివంతమైన పాస్‌వర్డ్‌ను ఉపయోగించండి</translation>
 <translation id="1900305421498694955">బాహ్య నిల్వ పరికరాలలో ఫైళ్లను చదవడానికి, రాయడానికి, Google Play యాప్‌లకు పూర్తి ఫైల్ సిస్టమ్ యాక్సెస్ అవసరం పడొచ్చు. బాహ్య డిస్క్‌ను ఉపయోగించే ఎవరికైనా పరికరంలో క్రియేట్ చేసిన ఫైళ్లు, ఫోల్డర్‌లు కనిపిస్తాయి. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
 <translation id="1901303067676059328">&amp;అన్నీ ఎంచుకోండి</translation>
 <translation id="1901396183631570154">Chrome ఈ పాస్‌వర్డ్‌లను మీ Google ఖాతాలో సేవ్ చేయలేకపోయింది. మీరు వాటిని ఇప్పటికీ మీ పరికరంలో సేవ్ చేయవచ్చు.</translation>
@@ -6557,6 +6558,7 @@
 <translation id="7444970023873202833">Google Photosలో మీ జ్ఞాపకాల గురించి మరింత తెలుసుకోండి</translation>
 <translation id="7444983668544353857"><ph name="NETWORKDEVICE" />ను నిలిపివేయి</translation>
 <translation id="7448430327655618736">యాప్‌లను ఆటోమేటిక్‌గా ఇన్‌స్టాల్ చేస్తుంది</translation>
+<translation id="7449381494541372002">ప్రారంభిస్తోంది…</translation>
 <translation id="7449752890690775568">పాస్‌వర్డ్‌ను తీసివేయాలా?</translation>
 <translation id="7450761244949417357">ఇప్పుడు <ph name="ALTERNATIVE_BROWSER_NAME" />లో తెరుస్తోంది</translation>
 <translation id="7452166281927983300">విస్మరించిన హెచ్చరికలు (<ph name="MUTED_PASSWORDS" />)</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index 3e77084..ec854bc7 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -87,7 +87,7 @@
 <translation id="1079766198702302550">บล็อกการเข้าถึงกล้องเสมอ</translation>
 <translation id="1081956462909987459">{NUM_TABS,plural, =1{<ph name="GROUP_TITLE" /> - 1 แท็บ}other{<ph name="GROUP_TITLE" /> - # แท็บ}}</translation>
 <translation id="1082214733466244292">ผู้ดูแลระบบบล็อกฟังก์ชันการทำงานบางอย่างในอุปกรณ์นี้</translation>
-<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> ต้องการคืนค่าการตั้งค่า Chrome ของคุณกลับไปเป็นค่าเริ่มต้นดั้งเดิม การดำเนินการนี้จะรีเซ็ตหน้าหลักของคุณ หน้าแท็บใหม่ และเครื่องมือค้นหา ปิดใช้ส่วนขยาย และเลิกตรึงแท็บทั้งหมด นอกจากนี้ยังล้างข้อมูลชั่วคราวอื่นๆ และข้อมูลที่แคชไว้ เช่น คุกกี้ เนื้อหา และข้อมูลเว็บไซต์อีกด้วย</translation>
+<translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" /> ต้องการคืนค่าการตั้งค่า Chrome ของคุณกลับไปเป็นค่าเริ่มต้นดั้งเดิม การดำเนินการนี้จะรีเซ็ตหน้าหลักของคุณ หน้าแท็บใหม่ และเครื่องมือค้นหา ปิดใช้ส่วนขยาย และเลิกปักหมุดแท็บทั้งหมด นอกจากนี้ยังล้างข้อมูลชั่วคราวอื่นๆ และข้อมูลที่แคชไว้ เช่น คุกกี้ เนื้อหา และข้อมูลเว็บไซต์อีกด้วย</translation>
 <translation id="1084096383128641877">การนำรหัสผ่านนี้ออกจะไม่ลบบัญชีของคุณใน <ph name="DOMAIN" /> เปลี่ยนรหัสผ่านหรือลบบัญชีของคุณใน <ph name="DOMAIN_LINK" /> เพื่อให้ปลอดภัยจากบุคคลอื่น</translation>
 <translation id="1084824384139382525">คัดลอก&amp;ที่อยู่ลิงก์</translation>
 <translation id="1085064499066015002">ตลอดเวลาในทุกเว็บไซต์</translation>
@@ -303,7 +303,7 @@
 <translation id="1293264513303784526">อุปกรณ์ USB-C (พอร์ตด้านซ้าย)</translation>
 <translation id="1293556467332435079">ไฟล์</translation>
 <translation id="1294807885394205587">ขั้นตอนนี้อาจใช้เวลาสักครู่ กำลังเริ่มต้นตัวจัดการคอนเทนเนอร์</translation>
-<translation id="1296911687402551044">ตรึงแท็บที่เลือก</translation>
+<translation id="1296911687402551044">ปักหมุดแท็บที่เลือก</translation>
 <translation id="1297175357211070620">ปลายทาง</translation>
 <translation id="129770436432446029">ส่งความคิดเห็นสำหรับ <ph name="EXPERIMENT_NAME" /></translation>
 <translation id="1301135395320604080"><ph name="ORIGIN" /> แก้ไขไฟล์ต่อไปนี้ได้</translation>
@@ -448,7 +448,7 @@
 <translation id="1430915738399379752">พิมพ์</translation>
 <translation id="1431188203598586230">การอัปเดตซอฟต์แวร์ครั้งสุดท้าย</translation>
 <translation id="1432581352905426595">จัดการเครื่องมือค้นหา</translation>
-<translation id="1434696352799406980">การดำเนินการนี้จะรีเซ็ตหน้าเริ่มต้นใช้งาน หน้าแท็บใหม่ เครื่องมือค้นหา แท็บที่ถูกตรึง และยังปิดใช้ส่วนขยายทั้งหมด ตลอดจนล้างข้อมูลชั่วคราว เช่น คุกกี้ โดยจะไม่ล้างบุ๊กมาร์ก ประวัติ และรหัสผ่านที่บันทึกไว้</translation>
+<translation id="1434696352799406980">การดำเนินการนี้จะรีเซ็ตหน้าเริ่มต้นใช้งาน หน้าแท็บใหม่ เครื่องมือค้นหา แท็บที่ถูกปักหมุด และยังปิดใช้ส่วนขยายทั้งหมด ตลอดจนล้างข้อมูลชั่วคราว เช่น คุกกี้ โดยจะไม่ล้างบุ๊กมาร์ก ประวัติ และรหัสผ่านที่บันทึกไว้</translation>
 <translation id="1434886155212424586">หน้าแรกคือหน้าแท็บใหม่</translation>
 <translation id="1436390408194692385">ใช้ได้เป็นเวลา <ph name="TICKET_TIME_LEFT" /></translation>
 <translation id="1436784010935106834">ลบออกแล้ว</translation>
@@ -1003,6 +1003,7 @@
 <translation id="1942600407708803723">ปิดเครื่องเมื่อปิดเคส</translation>
 <translation id="1944528062465413897">รหัสการจับคู่บลูทูธ</translation>
 <translation id="1944921356641260203">พบการอัปเดต</translation>
+<translation id="1947136734041527201">ช่วยให้ลงชื่อเข้าใช้เว็บไซต์ได้ผ่านบัญชีที่คุณมีด้วยบริการระบุตัวตน</translation>
 <translation id="1949584741547056205">คำตอบด่วน</translation>
 <translation id="1951012854035635156">ผู้ช่วย</translation>
 <translation id="1954597385941141174">เว็บไซต์ขอเชื่อมต่อกับอุปกรณ์ USB ได้</translation>
@@ -1168,7 +1169,7 @@
 <translation id="211144231511833662">ล้างประเภท</translation>
 <translation id="2111670510994270194">แท็บใหม่อยู่ด้านขวา</translation>
 <translation id="2112554630428445878">ยินดีต้อนรับ <ph name="USERNAME" /></translation>
-<translation id="21133533946938348">ตรึงแท็บ</translation>
+<translation id="21133533946938348">ปักหมุดแท็บ</translation>
 <translation id="2113479184312716848">เปิดไ&amp;ฟล์...</translation>
 <translation id="2113921862428609753">การเข้าถึงข้อมูลผู้ออกใบรับรอง</translation>
 <translation id="2114326799768592691">โหลดเ&amp;ฟรมซ้ำ</translation>
@@ -1956,6 +1957,7 @@
 <translation id="2832124733806557606">บุตรหลานจะใช้ PIN เพื่อลงชื่อเข้าใช้หรือปลดล็อกอุปกรณ์ได้</translation>
 <translation id="2835177225987815960">ระบบจะรีเซ็ตการตั้งค่าการสแกนในปัจจุบัน ซึ่งรวมถึงสวิตช์ที่กำหนดไว้และค่ากำหนดความเร็วในการสแกนอัตโนมัติ</translation>
 <translation id="2835547721736623118">บริการการรู้จำคำพูด</translation>
+<translation id="2836232638504556905">หากต้องการดำเนินการต่อ <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> จะแชร์ชื่อ อีเมล และรูปโปรไฟล์ของคุณกับเว็บไซต์นี้ ดู<ph name="BEGIN_LINK" />นโยบายความเป็นส่วนตัว<ph name="END_LINK" />ของเว็บไซต์</translation>
 <translation id="2836269494620652131">ขัดข้อง</translation>
 <translation id="2836635946302913370">ผู้ดูแลระบบของคุณปิดใช้งานการลงชื่อเข้าใช้ด้วยชื่อผู้ใช้นี้</translation>
 <translation id="283669119850230892">หากต้องการใช้เครือข่าย <ph name="NETWORK_ID" /> ก่อนอื่น ให้เชื่อมต่ออินเทอร์เน็ตตามด้านล่างนี้</translation>
@@ -1988,7 +1990,7 @@
 <translation id="2864601841139725659">ตั้งรูปโปรไฟล์</translation>
 <translation id="2865919525181940183">ภาพหน้าจอของโปรแกรมที่กำลังแสดงอยู่ในหน้าจอ</translation>
 <translation id="286674810810214575">กำลังตรวจสอบแหล่งจ่ายไฟ...</translation>
-<translation id="2867768963760577682">เปิดเป็นแท็บที่ถูกตรึง</translation>
+<translation id="2867768963760577682">เปิดเป็นแท็บที่ถูกปักหมุด</translation>
 <translation id="2868746137289129307">ส่วนขยายนี้ล้าสมัยแล้วและปิดใช้อยู่โดยนโยบายองค์กร แต่อาจเปิดใช้โดยอัตโนมัติได้เมื่อมีเวอร์ชันใหม่</translation>
 <translation id="2870560284913253234">เว็บไซต์</translation>
 <translation id="2870909136778269686">กำลังอัปเดต...</translation>
@@ -2237,6 +2239,7 @@
 <translation id="3105796011181310544">ต้องการเปลี่ยนกลับไปใช้ Google ไหม</translation>
 <translation id="310671807099593501">เว็บไซต์กำลังใช้บลูทูธ</translation>
 <translation id="3108931485517391283">รับไม่ได้</translation>
+<translation id="3109206895301430738">กลุ่มแท็บที่บันทึกไว้</translation>
 <translation id="3109724472072898302">ยุบแล้ว</translation>
 <translation id="311214366526552035">ดาวน์โหลดต่อไป</translation>
 <translation id="3112292765614504292">ขนาดแอป: <ph name="APP_SIZE" /></translation>
@@ -2398,6 +2401,7 @@
 <translation id="32939749466444286">คอนเทนเนอร์ Linux ไม่เริ่มทำงาน โปรดลองอีกครั้ง</translation>
 <translation id="3294437725009624529">ผู้มาเยือน</translation>
 <translation id="3294686910656423119">สถิติการใช้งานและรายงานข้อขัดข้อง</translation>
+<translation id="3297105622164376095">ได้รับอนุญาตให้แสดงข้อความแจ้งให้ลงชื่อเข้าใช้ของบุคคลที่สาม</translation>
 <translation id="3297536526040732495">ลิงก์ข้อมูลนี้กับบัญชี Google เป็นการชั่วคราวเมื่อคุณลงชื่อเข้าใช้ เพื่อปกป้องคุณในแอปต่างๆ ของ Google</translation>
 <translation id="329838636886466101">ซ่อม</translation>
 <translation id="3298789223962368867">URL ที่ป้อนไม่ถูกต้อง</translation>
@@ -3567,7 +3571,7 @@
 <translation id="4441124369922430666">คุณต้องการเริ่มแอปนี้โดยอัตโนมัติเมื่อเครื่องเปิดไหม</translation>
 <translation id="4441147046941420429">หากต้องการดำเนินการต่อ ให้ดึงคีย์ความปลอดภัยออกจากอุปกรณ์ จากนั้นเสียบกลับเข้าไปใหม่แล้วแตะที่คีย์นั้น</translation>
 <translation id="444134486829715816">ขยาย...</translation>
-<translation id="4441928470323187829">ผู้ดูแลระบบตรึงไว้</translation>
+<translation id="4441928470323187829">ผู้ดูแลระบบปักหมุดไว้</translation>
 <translation id="4443536555189480885">&amp;ความช่วยเหลือ</translation>
 <translation id="4444304522807523469">เข้าถึงเครื่องสแกนเอกสารที่เชื่อมต่อผ่าน USB หรือบนเครือข่าย LAN</translation>
 <translation id="4444512841222467874">หากไม่เพิ่มพื้นที่ว่าง ระบบอาจลบผู้ใช้และข้อมูลโดยอัตโนมัติ</translation>
@@ -3653,6 +3657,7 @@
 <translation id="452750746583162491">ตรวจสอบข้อมูลที่ซิงค์</translation>
 <translation id="4527929807707405172">เปิดใช้การเลื่อนแบบ "กลับด้าน" <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">เสนอการแปลภาษา</translation>
+<translation id="4529455689802245339">คำบรรยายสดของ Chrome อาจไม่ทำงาน</translation>
 <translation id="4530494379350999373">ต้นทาง</translation>
 <translation id="4531924570968473143">คุณต้องการเพิ่มใครใน <ph name="DEVICE_TYPE" /> เครื่องนี้</translation>
 <translation id="4532625150642446981">กำลังใช้ "<ph name="USB_DEVICE_NAME" />" อยู่ การกำหนดอุปกรณ์ซ้ำอีกครั้งขณะใช้งานอยู่อาจทำให้เกิดข้อผิดพลาด แน่ใจไหมว่าจะดำเนินการต่อ</translation>
@@ -3851,6 +3856,7 @@
 <translation id="471880041731876836">คุณไม่มีสิทธิ์เข้าชมเว็บไซต์นี้</translation>
 <translation id="4722735765955348426">รหัสผ่านของ <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> กำลังแชร์หน้าจอของคุณ</translation>
+<translation id="4722989931633062466">ไม่ได้รับอนุญาตให้แสดงข้อความแจ้งให้ลงชื่อเข้าใช้ของบุคคลที่สาม</translation>
 <translation id="4723140812774948886">สลับกับชั้นวางถัดไป</translation>
 <translation id="4724450788351008910">ข้อมูลประจำตัวถูกเปลี่ยนแปลง</translation>
 <translation id="4725511304875193254">คอร์กี</translation>
@@ -4262,7 +4268,7 @@
 <translation id="5154108062446123722">การตั้งค่าขั้นสูงสำหรับ <ph name="PRINTING_DESTINATION" /></translation>
 <translation id="5154702632169343078">เรื่อง</translation>
 <translation id="5155327081870541046">ป้อนทางลัดของเว็บไซต์ที่ต้องการค้นหาในแถบที่อยู่ เช่น @bookmarks จากนั้นกดแป้นพิมพ์ลัดที่ต้องการ แล้วป้อนข้อความค้นหา</translation>
-<translation id="5157635116769074044">ตรึงหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation>
+<translation id="5157635116769074044">ปักหมุดหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation>
 <translation id="5159094275429367735">ตั้งค่า Crostini</translation>
 <translation id="5159419673777902220">ผู้ปกครองของคุณปิดใช้สิทธิ์ของส่วนขยาย</translation>
 <translation id="5159643365935452998">ตรวจสอบการล้างข้อมูลอัตโนมัติ</translation>
@@ -4477,7 +4483,7 @@
 <translation id="5369694795837229225">ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ Linux</translation>
 <translation id="5370819323174483825">&amp;โหลดซ้ำ</translation>
 <translation id="5372529912055771682">รุ่นของระบบปฏิบัติการนี้ไม่สนับสนุนโหมดการลงทะเบียนที่กำหนด โปรดตรวจสอบให้แน่ใจว่าคุณกำลังใช้งานรุ่นใหม่ล่าสุดและลองอีกครั้ง</translation>
-<translation id="5372579129492968947">เลิกตรึงส่วนขยาย</translation>
+<translation id="5372579129492968947">เลิกปักหมุดส่วนขยาย</translation>
 <translation id="5372632722660566343">ดำเนินการต่อโดยไม่มีบัญชี</translation>
 <translation id="5375318608039113175">หากต้องการใช้การแชร์ใกล้เคียงกับรายชื่อติดต่อเหล่านี้ ให้เพิ่มอีเมลที่ลิงก์กับบัญชี Google ของรายชื่อติดต่อนั้นลงในรายชื่อติดต่อของคุณ</translation>
 <translation id="5376169624176189338">คลิกเพื่อย้อนกลับ กดค้างเพื่อดูประวัติการเข้าชม</translation>
@@ -4819,6 +4825,7 @@
 <translation id="5711010025974903573">บันทึกของบริการ</translation>
 <translation id="5711983031544731014">ไม่สามารถปลดล็อก โปรดใส่รหัสผ่าน</translation>
 <translation id="5712153969432126546">บางครั้งเว็บไซต์จะเผยแพร่ PDF เช่น เอกสาร สัญญา แบบฟอร์ม</translation>
+<translation id="571222594670061844">เว็บไซต์สามารถแสดงข้อความแจ้งให้ลงชื่อเข้าใช้จากบริการระบุตัวตนได้</translation>
 <translation id="5713158217420111469">เชื่อมต่อกับ <ph name="DEVICE" /> แล้ว</translation>
 <translation id="5715711091495208045">โบรกเกอร์ปลั๊กอิน: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">เครื่องมือค้นหาเริ่มต้น</translation>
@@ -4977,6 +4984,7 @@
 <translation id="5876851302954717356">แท็บใหม่อยู่ด้านขวา</translation>
 <translation id="5877064549588274448">เปลี่ยนช่องแล้ว รีสตาร์ทอุปกรณ์เพื่อใช้การเปลี่ยนแปลง</translation>
 <translation id="5877584842898320529">เครื่องพิมพ์ที่เลือกไว้ไม่พร้อมใช้งานหรือไม่ได้ติดตั้งไว้อย่างถูกต้อง <ph name="BR" /> โปรดตรวจสอบเครื่องพิมพ์หรือลองเลือกเครื่องพิมพ์อื่น</translation>
+<translation id="5878945009165002849">บล็อกข้อความแจ้งให้ลงชื่อเข้าใช้จากบริการระบุตัวตน</translation>
 <translation id="5882919346125742463">เครือข่ายที่รู้จัก</translation>
 <translation id="5883356647197510494">บล็อก<ph name="PERMISSION_1" />และ<ph name="PERMISSION_2" />โดยอัตโนมัติ</translation>
 <translation id="5884474295213649357">แท็บนี้เชื่อมต่อกับอุปกรณ์ USB อยู่</translation>
@@ -5216,7 +5224,7 @@
 <translation id="6113942107547980621">โปรดเปลี่ยนเป็นโปรไฟล์ผู้ใช้หลักในโทรศัพท์เพื่อใช้ Smart Lock</translation>
 <translation id="6116921718742659598">เปลี่ยนการตั้งค่าภาษาและการป้อนข้อมูล</translation>
 <translation id="6119927814891883061">ตั้งชื่ออุปกรณ์ว่า <ph name="DEVICE_NAME" /></translation>
-<translation id="6120205520491252677">ตรึงหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation>
+<translation id="6120205520491252677">ปักหมุดหน้าเว็บนี้ไว้ที่หน้าจอเริ่ม...</translation>
 <translation id="6120707837086723438">สิ่งที่เห็นนี้คือสูตรอาหารที่แนะนำตามกิจกรรมการค้นหาสูตรอาหารครั้งล่าสุดของคุณ
         <ph name="BREAK" />
         <ph name="BREAK" />
@@ -5613,6 +5621,7 @@
 <translation id="6513247462497316522">Google Chrome จะใช้ข้อมูลมือถือหากคุณไม่ได้เชื่อมต่อกับเครือข่ายอื่น</translation>
 <translation id="6514010653036109809">อุปกรณ์ที่พร้อมใช้งาน:</translation>
 <translation id="6514565641373682518">หน้าเว็บนี้ได้ปิดใช้งานเคอร์เซอร์เมาส์แล้ว</translation>
+<translation id="6517709704288360414">อุปกรณ์อาจทำงานไม่ถูกต้องอีกต่อไป และคุณอาจพบปัญหาด้านความปลอดภัยและประสิทธิภาพ การปิดการอัปเดตอาจส่งผลกระทบต่อสิทธิ์ในการอ้างสิทธิ์ตามกฎหมายด้วยหากคุณพบปัญหา</translation>
 <translation id="6518014396551869914">&amp;คัดลอกรูปภาพ</translation>
 <translation id="6518133107902771759">ยืนยัน</translation>
 <translation id="651942933739530207">คุณต้องการให้ <ph name="APP_NAME" /> แชร์หน้าจอและเอาต์พุตเสียงของคุณไหม</translation>
@@ -6640,7 +6649,7 @@
 <translation id="7548856833046333824">เลมอนเนด</translation>
 <translation id="7550830279652415241">bookmarks_<ph name="DATESTAMP" />.html</translation>
 <translation id="7551059576287086432">ดาวน์โหลด <ph name="FILE_NAME" /> สำเร็จแล้ว</translation>
-<translation id="7551643184018910560">ตรึงที่ชั้นวาง</translation>
+<translation id="7551643184018910560">ปักหมุดที่ชั้นวาง</translation>
 <translation id="7552846755917812628">ลองทำตามเคล็ดลับต่อไปนี้:</translation>
 <translation id="7553012839257224005">กำลังตรวจสอบคอนเทนเนอร์ Linux</translation>
 <translation id="7553242001898162573">ป้อนรหัสผ่าน</translation>
@@ -6726,7 +6735,7 @@
 <translation id="7633724038415831385">ต้องรอการอัปเดตเพียงแค่ครั้งนี้เท่านั้น เพราะตามปกติการอัปเดตซอฟต์แวร์บน Chromebooks จะเกิดขึ้นในเบื้องหลัง</translation>
 <translation id="7634280112532283638">การลดจำนวนสแปมและการประพฤติมิชอบ</translation>
 <translation id="7634566076839829401">เกิดข้อผิดพลาดบางอย่าง โปรดลองอีกครั้ง</translation>
-<translation id="7635048370253485243">ผู้ดูแลระบบตรึงไว้</translation>
+<translation id="7635048370253485243">ผู้ดูแลระบบปักหมุดไว้</translation>
 <translation id="7636919061354591437">ติดตั้งในอุปกรณ์นี้</translation>
 <translation id="7637593984496473097">มีพื้นที่ในดิสก์ไม่เพียงพอ</translation>
 <translation id="7639914187072011620">ดึงข้อมูล URL เปลี่ยนเส้นทาง SAML จากเซิร์ฟเวอร์ไม่สำเร็จ</translation>
@@ -7470,7 +7479,7 @@
 <translation id="8331323939220256760">{FILE_TYPE_COUNT,plural, =1{ประเภทไฟล์ที่รองรับ ได้แก่ <ph name="FILE_TYPE1" />}=2{ประเภทไฟล์ที่รองรับ ได้แก่ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />}=3{ประเภทไฟล์ที่รองรับ ได้แก่ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />}=4{ประเภทไฟล์ที่รองรับ ได้แก่ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />, <ph name="FILE_TYPE4" />}other{ประเภทไฟล์ที่รองรับ ได้แก่ <ph name="FILE_TYPE1" />, <ph name="FILE_TYPE2" />, <ph name="FILE_TYPE3" />, <ph name="FILE_TYPE4" /> (<ph name="LINK" />และอีก {OVERFLOW_COUNT} ประเภท<ph name="END_LINK" />)}}</translation>
 <translation id="8331822764922665615">ตั้งชื่อกลุ่ม เลือกสี แล้วกด Esc</translation>
 <translation id="833256022891467078">โฟลเดอร์ที่แชร์ใน Crostini</translation>
-<translation id="8335587457941836791">เลิกตรึงในชั้นวาง</translation>
+<translation id="8335587457941836791">เลิกปักหมุดในชั้นวาง</translation>
 <translation id="8336407002559723354">การอัปเดตจะสิ้นสุดใน<ph name="MONTH_AND_YEAR" /></translation>
 <translation id="8336739000755212683">เปลี่ยนรูปภาพของบัญชีอุปกรณ์</translation>
 <translation id="8337047789441383384">คุณลงทะเบียนคีย์ความปลอดภัยนี้ไปแล้ว ไม่จำเป็นต้องลงทะเบียนซ้ำ</translation>
@@ -7946,7 +7955,7 @@
 <translation id="8823704566850948458">แนะนำรหัสผ่าน...</translation>
 <translation id="8824701697284169214">เพิ่มหน้&amp;า...</translation>
 <translation id="8827125715368568315">บล็อก<ph name="PERMISSION" />และอีก <ph name="COUNT" /> รายการ</translation>
-<translation id="8827289157496676362">ตรึงส่วนขยาย</translation>
+<translation id="8827289157496676362">ปักหมุดส่วนขยาย</translation>
 <translation id="8827752199525959199">การดำเนินการอื่นๆ รหัสผ่านของ <ph name="USERNAME" /> ใน <ph name="DOMAIN" /></translation>
 <translation id="882854468542856424">ไม่อนุญาตให้เว็บไซต์ค้นหาอุปกรณ์บลูทูธใกล้เคียง</translation>
 <translation id="8828933418460119530">ชื่อ DNS</translation>
@@ -7993,7 +8002,7 @@
 <translation id="8868838761037459823">รายละเอียดเครือข่ายมือถือ</translation>
 <translation id="8868964574897075186">ย้ายรหัสผ่านไปยังบัญชี Google ของคุณแล้ว</translation>
 <translation id="8870413625673593573">เพิ่งปิด</translation>
-<translation id="8871551568777368300">ตรึงโดยผู้ดูแลระบบ</translation>
+<translation id="8871551568777368300">ปักหมุดโดยผู้ดูแลระบบ</translation>
 <translation id="8871696467337989339">คุณกำลังใช้แฟล็กบรรทัดคำสั่งที่ไม่ได้รับการสนับสนุน: <ph name="BAD_FLAG" /> ซึ่งอาจส่งผลต่อเสถียรภาพและความปลอดภัย</translation>
 <translation id="8871974300055371298">การตั้งค่าเนื้อหา</translation>
 <translation id="8872155268274985541">พบไฟล์ Manifest การอัปเดตภายนอกของคีออสก์ที่ไม่ถูกต้อง ไม่สามารถอัปเดตแอปคีออสก์ได้ โปรดนำ USB สติ๊กออก</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 4d15dd5..fb5fcf6f 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1952,6 +1952,7 @@
 <translation id="2832124733806557606">Çocuğunuz, cihazda oturum açmak veya cihazın kilidini açmak için PIN kullanabilir.</translation>
 <translation id="2835177225987815960">Atanmış anahtarlar ve otomatik tarama hızı tercihleriniz dahil olmak üzere mevcut tarama kurulumunuz sıfırlanır.</translation>
 <translation id="2835547721736623118">Konuşma tanıma hizmeti</translation>
+<translation id="2836232638504556905"><ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" />, devam etmek için adınızı, e-posta adresinizi ve profil resminizi bu siteyle paylaşacaktır. Bu sitenin <ph name="BEGIN_LINK" />gizlilik politikasına<ph name="END_LINK" /> bakın.</translation>
 <translation id="2836269494620652131">Kilitlenme</translation>
 <translation id="2836635946302913370">Yöneticiniz bu kullanıcı adıyla oturum açmayı devre dışı bırakmış durumda.</translation>
 <translation id="283669119850230892"><ph name="NETWORK_ID" /> ağını kullanmak için önce aşağıdan İnternet bağlantınızı yapın.</translation>
@@ -2233,6 +2234,7 @@
 <translation id="3105796011181310544">Google’a geri dönmek ister misiniz?</translation>
 <translation id="310671807099593501">Site, Bluetooth bağlantısını kullanıyor</translation>
 <translation id="3108931485517391283">Alınamıyor.</translation>
+<translation id="3109206895301430738">Kayıtlı Sekme Grupları</translation>
 <translation id="3109724472072898302">Daraltılmış</translation>
 <translation id="311214366526552035">Yine de İndir</translation>
 <translation id="3112292765614504292">Uygulama boyutu: <ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 3bbe718..c868c29 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1017,6 +1017,7 @@
 <translation id="1942600407708803723">Завершувати роботу, коли кришка закрита</translation>
 <translation id="1944528062465413897">Код підключення через Bluetooth:</translation>
 <translation id="1944921356641260203">Знайдено оновлення</translation>
+<translation id="1947136734041527201">Дає змогу входити на веб-сайти, використовуючи обліковий запис сервісу ідентифікації</translation>
 <translation id="1949584741547056205">Швидкі відповіді</translation>
 <translation id="1951012854035635156">Асистент</translation>
 <translation id="1954597385941141174">Сайти можуть запитувати дозвіл на підключення до пристроїв USB</translation>
@@ -2417,6 +2418,7 @@
 <translation id="32939749466444286">Не вдалося запустити контейнер Linux. Повторіть спробу.</translation>
 <translation id="3294437725009624529">Гість</translation>
 <translation id="3294686910656423119">Статистика використання та звіти про аварійне завершення роботи</translation>
+<translation id="3297105622164376095">Дозволено показувати підказки щодо входу через сторонні сервіси</translation>
 <translation id="3297536526040732495">Тимчасово зв’язує ці дані з обліковим записом Google, у який ви ввійшли, щоб захищати вас у всіх додатках Google</translation>
 <translation id="329838636886466101">Полагодити</translation>
 <translation id="3298789223962368867">Введено недійсну URL-адресу.</translation>
@@ -3673,6 +3675,7 @@
 <translation id="452750746583162491">Переглянути синхронізовані дані</translation>
 <translation id="4527929807707405172">Увімкнути зворотне прокручування. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Пропозиція перекладу</translation>
+<translation id="4529455689802245339">Функція живих субтитрів у Chrome може не працювати</translation>
 <translation id="4530494379350999373">Походження</translation>
 <translation id="4531924570968473143">Хто буде використовувати <ph name="DEVICE_TYPE" />?</translation>
 <translation id="4532625150642446981">Пристрій "<ph name="USB_DEVICE_NAME" />" використовується. Якщо перепризначити його під час використання, можуть виникнути помилки. Продовжити?</translation>
@@ -3871,6 +3874,7 @@
 <translation id="471880041731876836">У вас немає дозволу відвідувати цей сайт</translation>
 <translation id="4722735765955348426">Пароль користувача <ph name="USERNAME" /></translation>
 <translation id="4722920479021006856"><ph name="APP_NAME" /> має доступ до вашого екрана.</translation>
+<translation id="4722989931633062466">Заборонено показувати підказки щодо входу через сторонні сервіси</translation>
 <translation id="4723140812774948886">Замінити наступним</translation>
 <translation id="4724450788351008910">Зміна приналежності</translation>
 <translation id="4725511304875193254">Коргі</translation>
@@ -4839,6 +4843,7 @@
 <translation id="5711010025974903573">Журнали технічного обслуговування</translation>
 <translation id="5711983031544731014">Не вдалося розблокувати. Введіть пароль.</translation>
 <translation id="5712153969432126546">Сайти іноді публікують файли PDF, як-от документи, договори та форми</translation>
+<translation id="571222594670061844">Сайти можуть показувати підказки щодо входу від сервісів ідентифікації</translation>
 <translation id="5713158217420111469">Підключено до пристрою "<ph name="DEVICE" />"</translation>
 <translation id="5715711091495208045">Посередник для плагінів: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Пошукові системи за умовчанням</translation>
@@ -4997,6 +5002,7 @@
 <translation id="5876851302954717356">Нова вкладка праворуч</translation>
 <translation id="5877064549588274448">Канал змінено. Перезапустіть пристрій, щоб застосувати зміни.</translation>
 <translation id="5877584842898320529">Вибраний принтер недоступний або неправильно встановлений. <ph name="BR" /> Перевірте принтер або спробуйте вибрати інший.</translation>
+<translation id="5878945009165002849">Блокувати підказки щодо входу від сервісів ідентифікації</translation>
 <translation id="5882919346125742463">Відомі мережі</translation>
 <translation id="5883356647197510494">Автоматично заблоковано: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Цю вкладку під’єднано до пристрою USB.</translation>
@@ -5633,6 +5639,7 @@
 <translation id="6513247462497316522">Google Chrome використовуватиме мобільне передавання даних, якщо ви не підключені до іншої мережі.</translation>
 <translation id="6514010653036109809">Доступний пристрій:</translation>
 <translation id="6514565641373682518">Ця сторінка вимкнула курсор миші.</translation>
+<translation id="6517709704288360414">Ваш пристрій може працювати неналежним чином, і у вас можуть виникати проблеми з безпекою та продуктивністю. Якщо вимкнути оновлення, ви також можете втратити право подавати судові позови в разі виникнення проблем.</translation>
 <translation id="6518014396551869914">Копіюват&amp;и зображення</translation>
 <translation id="6518133107902771759">Підтвердити</translation>
 <translation id="651942933739530207">Надати програмі <ph name="APP_NAME" /> доступ до вашого екрана й аудіовиходу?</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 6cca7e1..46b57de 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1946,6 +1946,7 @@
 <translation id="2832124733806557606">您的孩子可以使用 PIN 码登录或解锁此设备。</translation>
 <translation id="2835177225987815960">您当前的扫描设置将被重置,包括已分配的所有开关以及自动扫描速度偏好设置。</translation>
 <translation id="2835547721736623118">语音识别服务</translation>
+<translation id="2836232638504556905">如果您继续注册,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 便会将您的用户名、电子邮件地址和个人资料照片提供给此网站。不妨看看此网站的<ph name="BEGIN_LINK" />隐私权政策<ph name="END_LINK" />。</translation>
 <translation id="2836269494620652131">崩溃</translation>
 <translation id="2836635946302913370">管理员已禁止使用此用户名登录。</translation>
 <translation id="283669119850230892">要使用网络“<ph name="NETWORK_ID" />”,请先在下方连接互联网。</translation>
@@ -2227,6 +2228,7 @@
 <translation id="3105796011181310544">改回 Google?</translation>
 <translation id="310671807099593501">该网站正在使用蓝牙</translation>
 <translation id="3108931485517391283">无法接收</translation>
+<translation id="3109206895301430738">已保存的标签页分组</translation>
 <translation id="3109724472072898302">已收起</translation>
 <translation id="311214366526552035">仍然下载</translation>
 <translation id="3112292765614504292">应用大小:<ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb
index 54222b4..06f5848 100644
--- a/chrome/app/resources/generated_resources_zh-HK.xtb
+++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1970,6 +1970,7 @@
 <translation id="2832124733806557606">子女可使用 PIN 來登入裝置或裝置解鎖。</translation>
 <translation id="2835177225987815960">系統將會重設目前的掃瞄設定,包括任何已指派的按鈕裝置和自動掃瞄速度偏好設定。</translation>
 <translation id="2835547721736623118">語音識別服務</translation>
+<translation id="2836232638504556905">如要繼續,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 將會與此網站分享您的姓名、電郵地址和個人檔案相片。查看此網站的《<ph name="BEGIN_LINK" />私隱權政策<ph name="END_LINK" />》。</translation>
 <translation id="2836269494620652131">當機</translation>
 <translation id="2836635946302913370">管理員已禁止使用這個使用者名稱登入。</translation>
 <translation id="283669119850230892">如要使用 <ph name="NETWORK_ID" /> 網絡,請先在下方連線至互聯網。</translation>
@@ -2251,6 +2252,7 @@
 <translation id="3105796011181310544">要改回使用 Google 嗎?</translation>
 <translation id="310671807099593501">網站正在使用藍牙</translation>
 <translation id="3108931485517391283">無法接收</translation>
+<translation id="3109206895301430738">儲存咗嘅分頁群組</translation>
 <translation id="3109724472072898302">已收合</translation>
 <translation id="311214366526552035">仍要下載</translation>
 <translation id="3112292765614504292">應用程式大小:<ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 917e880b..f4687460 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1954,6 +1954,7 @@
 <translation id="2832124733806557606">你的孩子可以使用 PIN 碼登入裝置,或將裝置解鎖。</translation>
 <translation id="2835177225987815960">目前的掃描設定將會重設,包含指派的外接切換裝置和自動掃描的速度偏好設定。</translation>
 <translation id="2835547721736623118">語音辨識服務</translation>
+<translation id="2836232638504556905">如要繼續,<ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> 會將你的姓名、電子郵件地址和個人資料相片提供給這個網站。查看這個網站的《<ph name="BEGIN_LINK" />隱私權政策<ph name="END_LINK" />》。</translation>
 <translation id="2836269494620652131">當機</translation>
 <translation id="2836635946302913370">管理員已禁止使用這個使用者名稱登入。</translation>
 <translation id="283669119850230892">如要使用 <ph name="NETWORK_ID" /> 網路,請先在下方連線至網際網路。</translation>
@@ -2235,6 +2236,7 @@
 <translation id="3105796011181310544">要改回 Google 嗎?</translation>
 <translation id="310671807099593501">網站正在使用藍牙</translation>
 <translation id="3108931485517391283">無法接收</translation>
+<translation id="3109206895301430738">已儲存的分頁群組</translation>
 <translation id="3109724472072898302">已收合</translation>
 <translation id="311214366526552035">仍要下載</translation>
 <translation id="3112292765614504292">應用程式大小:<ph name="APP_SIZE" /></translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb
index 16a05527..3e34f4f 100644
--- a/chrome/app/resources/generated_resources_zu.xtb
+++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1013,6 +1013,7 @@
 <translation id="1942600407708803723">Vala uma ikhava ivaliwe</translation>
 <translation id="1944528062465413897">Ikhodi yokumatanisa ye-Bluetooth:</translation>
 <translation id="1944921356641260203">Isibuyekezo sitholakale</translation>
+<translation id="1947136734041527201">Ikuvumela ukuthi ungene ngemvume kumawebhusayithi usebenzisa i-akhawunti onayo enesevisi kamazisi</translation>
 <translation id="1949584741547056205">Izimpendulo Ezisheshayo</translation>
 <translation id="1951012854035635156">Umsizi</translation>
 <translation id="1954597385941141174">Amasayithi angacela ukuxhumeka kumadivayisi e-USB</translation>
@@ -2415,6 +2416,7 @@
 <translation id="32939749466444286">Isiqukathi se-Linux asiqalanga. Zama futhi.</translation>
 <translation id="3294437725009624529">Isivakashi</translation>
 <translation id="3294686910656423119">Izibalo zokusebenzisa nemibiko yokusaphazeka</translation>
+<translation id="3297105622164376095">Ivunyelwe ukubonisa imiyalo yokungena ngemvume yongahlangene ngqo</translation>
 <translation id="3297536526040732495">Ixhumanisa idatha yakho ne-Google Account okwesikhashana uma ungene ngemvume, ukuze ikuvikele kuwo wonke ama-app we-Google</translation>
 <translation id="329838636886466101">Lungisa</translation>
 <translation id="3298789223962368867">Kufakwe i-URL engavumelekile</translation>
@@ -3670,6 +3672,7 @@
 <translation id="452750746583162491">Buyekeza idatha yakho evunyelanisiwe</translation>
 <translation id="4527929807707405172">Nika amandla ukuskrolela emuva. <ph name="LINK_BEGIN" />Funda kabanzi<ph name="LINK_END" /></translation>
 <translation id="4528494169189661126">Isiphakamiso sokuhumusha</translation>
+<translation id="4529455689802245339">I-Chrome Live Caption ingahle ingasebenzi</translation>
 <translation id="4530494379350999373">Umsuka</translation>
 <translation id="4531924570968473143">Ubani ongathanda ukumengeza kule <ph name="DEVICE_TYPE" />?</translation>
 <translation id="4532625150642446981">I-"<ph name="USB_DEVICE_NAME" />" iyasetshenziswa. Ukuphinda unikeze idivayisi ngenkathi isetshenziswa kungabangela amaphutha. Ingabe uqinisekile ukuthi ufuna ukuqhubeka?</translation>
@@ -3868,6 +3871,7 @@
 <translation id="471880041731876836">Awunayo imvume yokuvakashela leli sayithi</translation>
 <translation id="4722735765955348426">Iphasiwedi ye-<ph name="USERNAME" /></translation>
 <translation id="4722920479021006856">I-<ph name="APP_NAME" /> yabelana ngesikrini sakho.</translation>
+<translation id="4722989931633062466">Ayivunyelwe ukubonisa imiyalo yokungena ngemvume kongahlangene ngqo</translation>
 <translation id="4723140812774948886">Shintshisana nokulandelayo</translation>
 <translation id="4724450788351008910">Ukuhlotshaniswa kuguquliwe</translation>
 <translation id="4725511304875193254">I-Corgi</translation>
@@ -4841,6 +4845,7 @@
 <translation id="5711010025974903573">Amalogu wesevisi</translation>
 <translation id="5711983031544731014">Ayikwazi ukuvula. Faka phasiwedi yakho.</translation>
 <translation id="5712153969432126546">Amasayithi ngezinye izikhathi ashicilela ama-PDF, njengamadokhumenti, izinkontileka, namafomu</translation>
+<translation id="571222594670061844">Amasayithi angabonisa imiyalo yokungena ngemvume kusukela kumasevisi kamazisi</translation>
 <translation id="5713158217420111469">Xhuma ku-<ph name="DEVICE" /></translation>
 <translation id="5715711091495208045">Ibhulokha ye-plugin: <ph name="PLUGIN_NAME" /></translation>
 <translation id="5719603411793408026">Izinjini zosesho ezizenzakalelayo</translation>
@@ -4999,6 +5004,7 @@
 <translation id="5876851302954717356">Ithebhu entsha kwesokudla</translation>
 <translation id="5877064549588274448">Isiteshi sishintshiwe. Qala kabusha idivayisi yakho ukuze usebenzise izinguquko.</translation>
 <translation id="5877584842898320529">Iphrintha ekhethiwe ayitholakali noma ayifakiwe ngokulungile. <ph name="BR" /> Hlola iphrinta yakho noma uzame ukukhetha enye iphrinta.</translation>
+<translation id="5878945009165002849">Vimba imiyalo yokungena ngemvume evela kumasevisi kamazisi</translation>
 <translation id="5882919346125742463">Amanethiwekhi aziwayo</translation>
 <translation id="5883356647197510494">Kuvinjelwe ngokuzenzakalela i-<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation>
 <translation id="5884474295213649357">Le thebhu ixhunywe kudivayisi ye-USB.</translation>
@@ -5636,6 +5642,7 @@
 <translation id="6513247462497316522">I-Google Chrome izosebenzisa idatha yeselula uma ngabe ungaxhunyiwe kwenye inethiwekhi</translation>
 <translation id="6514010653036109809">Idivayisi etholakalayo:</translation>
 <translation id="6514565641373682518">Leli khasi likhubaze umcibisholo wegundane lakho.</translation>
+<translation id="6517709704288360414">Idivayisi yakho ingase ingasasebenzi kahle, futhi ungase ube nezinkinga zokuvikeleka nokusebenza. Ukuvala izibuyekezo kungase kuthinte nelungelo lakho lokwenza izimangalo ezingokomthetho uma uhlangabezana nanoma yiziphi izinkinga.</translation>
 <translation id="6518014396551869914">Kopish&amp;a isithombe</translation>
 <translation id="6518133107902771759">Qinisekisa</translation>
 <translation id="651942933739530207">Ingabe ufuna i-<ph name="APP_NAME" /> ukuthi yabelane ngesikrini sakho nokukhiphayo komsindo?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index f6d1970..192de28f 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -283,6 +283,7 @@
 <translation id="7388770099345495132">‏إذا أردت استخدام هذا الحساب لمرة واحدة فقط، يمكنك استخدام "وضع الضيف" في متصفّح Chrome. وإذا أردت إضافة حساب لمستخدم آخر، <ph name="LINK_BEGIN" />أضِف مستخدمًا جديدًا<ph name="LINK_END" /> إلى <ph name="DEVICE_TYPE" />، مع العِلم بأنّ الأذونات التي سبق لك منحها إلى المواقع الإلكترونية والتطبيقات يمكن أن تنطبق على هذا الحساب. يمكنك إدارة حساباتك على Google من خلال <ph name="SETTINGS_LINK_BEGIN" />الإعدادات<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">‏تم تسجيل دخولك إلى Chrome باعتبارك <ph name="USER_EMAIL_ADDRESS" />. يُرجى استخدام الحساب نفسه لتسجيل الدخول مرة أخرى.</translation>
 <translation id="7410958280246779049">‏حَظَر Chrome هذا الملف لأنّه ملف ضار.</translation>
+<translation id="7426611252293106642">‏قد لا يعمل Google Chrome بشكل صحيح لأنّه لم يعد متاحًا على توزيع Linux هذا.</translation>
 <translation id="7481213027396403996">‏الحصول على أعلى مستوى من الأمان في متصفِّح Chrome</translation>
 <translation id="7486227612705979895">‏سيصل Chrome إلى Drive لإنشاء الاقتراحات في شريط العناوين.</translation>
 <translation id="7535429826459677826">‏إصدار مطوري البرامج من Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb
index d016bb9..8a95ca32 100644
--- a/chrome/app/resources/google_chrome_strings_be.xtb
+++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -288,6 +288,7 @@
 Дазволы, якія вы ўжо далі вэб-сайтам і праграмам, могуць дзейнічаць для гэтага ўліковага запісу. Кіраваць Уліковымі запісамі Google можна ў <ph name="SETTINGS_LINK_BEGIN" />Наладах<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Раней вы ўваходзілі ў Chrome як <ph name="USER_EMAIL_ADDRESS" />. Для паўторнага ўваходу скарыстайце той жа ўліковы запіс.</translation>
 <translation id="7410958280246779049">Chrome заблакіраваў гэты файл, бо ён небяспечны</translation>
+<translation id="7426611252293106642">Google Chrome на гэтым дыстрыбутыве Linux больш не падтрымліваецца і таму можа працаваць няправільна</translation>
 <translation id="7481213027396403996">Засцеражыце браўзер Chrome ад небяспек</translation>
 <translation id="7486227612705979895">Каб выводзіць прапановы ў адрасным радку, браўзер Chrome будзе карыстацца доступам да вашага Дыска</translation>
 <translation id="7535429826459677826">Google Chrome для распрацоўшчыкаў</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index fdc5ef2..9ab046f4 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -284,6 +284,7 @@
 За този профил може да важат разрешенията, които вече сте предоставили на уебсайтове и приложения. Имате възможност да управлявате профилите си в Google в <ph name="SETTINGS_LINK_BEGIN" />Настройки<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Бяхте влезли в Chrome като <ph name="USER_EMAIL_ADDRESS" />. Моля, използвайте същия профил, за да влезете отново.</translation>
 <translation id="7410958280246779049">Chrome блокира този файл, защото е опасен</translation>
+<translation id="7426611252293106642">Google Chrome може да не функционира правилно, защото вече не се поддържа за тази дистрибуция на Linux</translation>
 <translation id="7481213027396403996">Получете най-високото ниво на сигурност на Chrome</translation>
 <translation id="7486227612705979895">Chrome ще осъществява достъп до хранилището ви в Диск, за да извежда предложения в адресната лента</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index ae15454d..54f9dbb 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -282,6 +282,7 @@
 És possible que els permisos que ja hagis donat a llocs web i aplicacions s'apliquin a aquest compte. Pots gestionar els teus Comptes de Google a <ph name="SETTINGS_LINK_BEGIN" />Configuració<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Teníeu la sessió iniciada a Chrome com a <ph name="USER_EMAIL_ADDRESS" />. Utilitzeu el mateix compte per tornar-hi a iniciar la sessió.</translation>
 <translation id="7410958280246779049">Chrome ha bloquejat aquest fitxer perquè és perillós</translation>
+<translation id="7426611252293106642">Pot ser que Google Chrome no funcioni correctament perquè ja no és compatible amb aquesta distribució de Linux</translation>
 <translation id="7481213027396403996">Obtén la seguretat més efectiva de Chrome</translation>
 <translation id="7486227612705979895">Chrome accedirà a Drive per fer suggeriments a la barra d'adreces</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb
index 93acc47..9b753c2 100644
--- a/chrome/app/resources/google_chrome_strings_cy.xtb
+++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -291,6 +291,7 @@
 Mae'n bosib y bydd caniatadau rydych eisoes wedi'u rhoi i wefannau ac apiau yn berthnasol i'r cyfrif hwn. Gallwch reoli'ch Cyfrifon Google yn y <ph name="SETTINGS_LINK_BEGIN" />Gosodiadau<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Roeddech wedi'ch mewngofnodi i Chrome fel <ph name="USER_EMAIL_ADDRESS" />. Defnyddiwch yr un cyfrif i fewngofnodi eto.</translation>
 <translation id="7410958280246779049">Gwnaeth Chrome rwystro'r ffeil hon oherwydd ei bod yn beryglus</translation>
+<translation id="7426611252293106642">Mae'n bosib na fydd Google Chrome yn gweithio'n gywir oherwydd nid yw'n cael ei gynnal mwyach ar y dosbarthiad Linux hwn</translation>
 <translation id="7481213027396403996">Cael diogelwch cryfaf Chrome</translation>
 <translation id="7486227612705979895">Bydd Chrome yn cyrchu eich Drive i wneud awgrymiadau yn y bar cyfeiriadau</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index a34456a..7cb7f73 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -283,6 +283,7 @@
 De tilladelser, du har givet til websites og apps, gælder muligvis for denne konto. Du kan administrere dine Google-konti under <ph name="SETTINGS_LINK_BEGIN" />Indstillinger<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Du loggede ind i Chrome som <ph name="USER_EMAIL_ADDRESS" />. Brug den samme konto til at logge ind igen.</translation>
 <translation id="7410958280246779049">Chrome har blokeret denne fil, fordi den er skadelig</translation>
+<translation id="7426611252293106642">Google Chrome fungerer muligvis ikke korrekt, da det ikke længere understøttes af denne Linux-distribution</translation>
 <translation id="7481213027396403996">Få Chromes stærkeste beskyttelse</translation>
 <translation id="7486227612705979895">Chrome har adgang til Drev, så der kan vises forslag i adresselinjen</translation>
 <translation id="7535429826459677826">Udviklerversionen af Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index c102ef6..4989f22 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -281,6 +281,7 @@
 Berechtigungen, die du Websites und Apps bereits gewährt hast, gelten möglicherweise für dieses Konto. Du kannst deine Google-Konten in den <ph name="SETTINGS_LINK_BEGIN" />Einstellungen<ph name="SETTINGS_LINK_END" /> verwalten.</translation>
 <translation id="7398801000654795464">Du warst in Chrome als <ph name="USER_EMAIL_ADDRESS" /> angemeldet. Melde dich bitte wieder mit demselben Konto an.</translation>
 <translation id="7410958280246779049">Chrome hat diese Datei blockiert, weil sie gefährlich ist</translation>
+<translation id="7426611252293106642">Google Chrome funktioniert unter Umständen nicht ordnungsgemäß, da es unter dieser Linux-Distribution nicht mehr unterstützt wird</translation>
 <translation id="7481213027396403996">Höchste Sicherheit in Chrome erhalten</translation>
 <translation id="7486227612705979895">Chrome greift auf Google Drive zu, um in der Adressleiste Vorschläge zu machen</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index d881708f..8f98b23 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -287,6 +287,7 @@
 Οι άδειες που έχετε εκχωρήσει ήδη σε ιστοτόπους και εφαρμογές μπορεί να ισχύουν για αυτόν τον λογαριασμό. Μπορείτε να διαχειριστείτε τους Λογαριασμούς σας Google στις <ph name="SETTINGS_LINK_BEGIN" />Ρυθμίσεις<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Συνδεθήκατε στο Chrome ως <ph name="USER_EMAIL_ADDRESS" />. Χρησιμοποιήστε τον ίδιο λογαριασμό για να συνδεθείτε ξανά.</translation>
 <translation id="7410958280246779049">Το Chrome απέκλεισε αυτό το αρχείο γιατί είναι επικίνδυνο</translation>
+<translation id="7426611252293106642">Το Google Chrome ενδέχεται να μην λειτουργεί σωστά, επειδή δεν υποστηρίζεται πλέον σε αυτήν τη διανομή Linux.</translation>
 <translation id="7481213027396403996">Λάβετε την ισχυρότερη ασφάλεια του Chrome</translation>
 <translation id="7486227612705979895">Το Chrome θα αποκτήσει πρόσβαση στο Drive, για να κάνει προτάσεις στη γραμμή διευθύνσεων</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb
index 0c86e58..40adb3a 100644
--- a/chrome/app/resources/google_chrome_strings_es-419.xtb
+++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -283,6 +283,7 @@
 Es posible que se apliquen a esta cuenta los permisos que otorgaste a sitios web y apps. Puedes administrar tus Cuentas de Google en <ph name="SETTINGS_LINK_BEGIN" />Configuración<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Accediste a Google Chrome con <ph name="USER_EMAIL_ADDRESS" />. Usa la misma cuenta para volver a acceder.</translation>
 <translation id="7410958280246779049">Chrome bloqueó este archivo porque es peligroso</translation>
+<translation id="7426611252293106642">Es posible que Google Chrome no funcione correctamente porque ya no es compatible con esta distribución de Linux</translation>
 <translation id="7481213027396403996">Obtén la seguridad más sólida de Chrome</translation>
 <translation id="7486227612705979895">Chrome accederá a tus datos de Drive para hacer sugerencias en la barra de direcciones</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 0a42812e..4f7d35db 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -291,6 +291,7 @@
 Los permisos que hayas dado a sitios web y aplicaciones se pueden aplicar a esta cuenta. Puedes gestionar tus cuentas de Google en <ph name="SETTINGS_LINK_BEGIN" />Configuración<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Habías iniciado sesión en Chrome como <ph name="USER_EMAIL_ADDRESS" />. Utiliza la misma cuenta para volver a iniciar sesión.</translation>
 <translation id="7410958280246779049">Chrome ha bloqueado este archivo porque es peligroso</translation>
+<translation id="7426611252293106642">Es posible que Google Chrome no funcione correctamente porque ya no es compatible con esta distribución Linux</translation>
 <translation id="7481213027396403996">Consigue la seguridad más potente de Chrome</translation>
 <translation id="7486227612705979895">Chrome accederá a tu Drive para mostrarte sugerencias en la barra de direcciones</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb
index f03e999b..2057613 100644
--- a/chrome/app/resources/google_chrome_strings_eu.xtb
+++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -289,6 +289,7 @@
 Baliteke webguneei eta aplikazioei emandako baimenak kontu honi aplikatzea. Google-ko kontuak kudeatzeko, joan <ph name="SETTINGS_LINK_BEGIN" />Ezarpenak<ph name="SETTINGS_LINK_END" /> atalera.</translation>
 <translation id="7398801000654795464">Chrome arakatzaileko saioa <ph name="USER_EMAIL_ADDRESS" /> gisa hasi duzu. Saioa berriro hasteko, erabili hasiera batean erabilitako kontu bera.</translation>
 <translation id="7410958280246779049">Chrome-k fitxategia blokeatu du arriskutsua delako</translation>
+<translation id="7426611252293106642">Google Chrome-k agian ez du behar bezala funtzionatuko ez delako jada bateragarria Linux banaketa honekin</translation>
 <translation id="7481213027396403996">Lortu Chrome-ren segurtasun-aukerarik sendoena</translation>
 <translation id="7486227612705979895">Chrome-k zure Drive unitatea atzituko du helbide-barran iradokizunak egiteko</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index c8dd567..477feac 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -283,6 +283,7 @@
 Sivustoille ja sovelluksille myöntämäsi luvat saattavat koskea tätä tiliä. Voit ylläpitää Google-tilejä <ph name="SETTINGS_LINK_BEGIN" />asetuksissa<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Chromeen kirjautunut käyttäjä: <ph name="USER_EMAIL_ADDRESS" />. Kirjaudu uudelleen sisään samalla tilillä.</translation>
 <translation id="7410958280246779049">Chrome esti tämän tiedoston, koska se on vaarallinen</translation>
+<translation id="7426611252293106642">Google Chrome ei välttämättä toimi oikein, koska tämä Linux-jakelu ei enää tue sitä</translation>
 <translation id="7481213027396403996">Ota Chromen tehokkain suojaus käyttöön</translation>
 <translation id="7486227612705979895">Chrome käyttää Drivea antaakseen ehdotuksia osoitepalkissa</translation>
 <translation id="7535429826459677826">Google Chromen kehittäjäversio</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
index c700b755..6c15fa5 100644
--- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -290,6 +290,7 @@
 Les autorisations que vous avez déjà accordées à des sites Web et à des applications peuvent s'appliquer à ce compte. Vous pouvez gérer vos comptes Google dans les <ph name="SETTINGS_LINK_BEGIN" />Paramètres<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Vous étiez connecté à Google Chrome en tant que <ph name="USER_EMAIL_ADDRESS" />. Veuillez utiliser le même compte pour vous reconnecter.</translation>
 <translation id="7410958280246779049">Chrome a bloqué ce fichier parce qu'il est dangereux</translation>
+<translation id="7426611252293106642">Google Chrome peut ne pas fonctionner correctement parce qu'il n'est plus pris en charge sur cette distribution Linux</translation>
 <translation id="7481213027396403996">Profitez de la sécurité la plus robuste de Chrome</translation>
 <translation id="7486227612705979895">Chrome accédera à votre Disque pour faire des suggestions dans la barre d'adresse</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 24d06fa..4e725b9e4 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -289,6 +289,7 @@
 Les autorisations que vous avez déjà accordées aux sites Web et aux applis peuvent s'appliquer à ce compte. Vous pouvez gérer vos comptes Google dans <ph name="SETTINGS_LINK_BEGIN" />Paramètres<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Vous étiez connecté à Google Chrome en tant que <ph name="USER_EMAIL_ADDRESS" />. Veuillez utiliser le même compte pour vous reconnecter.</translation>
 <translation id="7410958280246779049">Chrome a bloqué ce fichier, car il est dangereux</translation>
+<translation id="7426611252293106642">Google Chrome risque de ne pas fonctionner correctement, car la compatibilité n'est plus assurée sur cette distribution Linux</translation>
 <translation id="7481213027396403996">Renforcer la sécurité de Chrome</translation>
 <translation id="7486227612705979895">Chromium va accéder à votre Drive pour proposer des suggestions dans la barre d'adresse</translation>
 <translation id="7535429826459677826">Google Chrome pour les développeurs</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb
index 62a314f..ef90a9a 100644
--- a/chrome/app/resources/google_chrome_strings_gl.xtb
+++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -288,6 +288,7 @@
 Pódense aplicar a esta conta os permisos que xa lles concedeses aos sitios web e ás aplicacións. Podes xestionar as túas Contas de Google en <ph name="SETTINGS_LINK_BEGIN" />Configuración<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Iniciaches sesión en Chrome como <ph name="USER_EMAIL_ADDRESS" />. Utiliza a mesma conta para iniciar sesión de novo.</translation>
 <translation id="7410958280246779049">Chrome bloqueou este ficheiro porque é perigoso</translation>
+<translation id="7426611252293106642">Pode que Google Chrome non funcione correctamente porque xa non é compatible con esta distribución de Linux</translation>
 <translation id="7481213027396403996">Goza da máxima seguranza de Chrome</translation>
 <translation id="7486227612705979895">Chrome accederá a Drive para facer suxestións na barra de enderezos</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb
index 19abf1f..71e37ee7 100644
--- a/chrome/app/resources/google_chrome_strings_hy.xtb
+++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -286,6 +286,7 @@
 Թույլտվությունները, որոնք տրամադրել եք կայքերին և հավելվածներին, կարող են կիրառվել այս հաշվի նկատմամբ։ Ձեր Google հաշիվները կարող եք կառավարել <ph name="SETTINGS_LINK_BEGIN" />Կարգավորումներում<ph name="SETTINGS_LINK_END" />։</translation>
 <translation id="7398801000654795464">Դուք մուտք եք գործում Chrome որպես <ph name="USER_EMAIL_ADDRESS" />: Նորից մուտք գործելու համար օգտագործեք նույն հաշիվը:</translation>
 <translation id="7410958280246779049">Chrome-ն արգելափակել է այս ֆայլը, քանի որ այն վտանգավոր է</translation>
+<translation id="7426611252293106642">Google Chrome-ը հնարավոր է չաշխատի ինչպես հարկն է, քանի որ այն այլևս չի աջակցվում Լինուքսի այս բաշխման մեջ։</translation>
 <translation id="7481213027396403996">Ուժեղացրեք Chrome-ի անվտանգությունը</translation>
 <translation id="7486227612705979895">Chrome-ը կօգտագործի ձեր Drive-ը՝ հասցեագոտում հուշումներ ցուցադրելու համար</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 8cb2a9c2..fd5cbf3 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -283,6 +283,7 @@
 Izin yang telah Anda berikan ke situs dan aplikasi dapat berlaku untuk akun ini. Anda dapat mengelola Akun Google Anda di <ph name="SETTINGS_LINK_BEGIN" />Setelan<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Anda telah masuk ke Chrome sebagai <ph name="USER_EMAIL_ADDRESS" />. Gunakan akun yang sama untuk masuk kembali.</translation>
 <translation id="7410958280246779049">Chrome memblokir file ini karena berbahaya</translation>
+<translation id="7426611252293106642">Google Chrome mungkin tidak berfungsi dengan semestinya karena sudah tidak didukung di distribusi Linux ini</translation>
 <translation id="7481213027396403996">Dapatkan keamanan terkuat Chrome</translation>
 <translation id="7486227612705979895">Chrome akan mengakses Drive Anda untuk membuat saran di kolom URL</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb
index ccf9248..8e16b652 100644
--- a/chrome/app/resources/google_chrome_strings_is.xtb
+++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -290,6 +290,7 @@
 Heimildir sem þú hefur þegar veitt vefsvæðum og forritum kunna að gilda á þessum reikningi. Þú getur haft umsjón með Google reikningunum þínum í <ph name="SETTINGS_LINK_BEGIN" />stillingum<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Þú varst skráð(ur) inn á Chrome sem <ph name="USER_EMAIL_ADDRESS" />. Notaðu sama reikning til að skrá þig inn aftur.</translation>
 <translation id="7410958280246779049">Chrome setti þessa skrá á bannlista því hún er hættuleg</translation>
+<translation id="7426611252293106642">Vera kann að Chrome virki ekki sem skyldi vegna þess að vafrinn er ekki lengur studdur í þessu Linux-kerfi.</translation>
 <translation id="7481213027396403996">Njóttu hámarksöryggis Chrome</translation>
 <translation id="7486227612705979895">Chrome mun fá aðgang að svæðinu þínu á Drive til þess að bjóða upp á tillögur í veffangastikunni</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb
index 304d4ef..c21e2cc 100644
--- a/chrome/app/resources/google_chrome_strings_kk.xtb
+++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -288,6 +288,7 @@
 Веб-сайттар мен қолданбаларға берілген рұқсаттар осы аккаунтқа пайдаланылуы мүмкін. Google аккаунттарын <ph name="SETTINGS_LINK_BEGIN" />Параметрлер<ph name="SETTINGS_LINK_END" /> бөлімінен басқаруға болады.</translation>
 <translation id="7398801000654795464">Chrome жүйесіне <ph name="USER_EMAIL_ADDRESS" /> ретінде кірдіңіз. Қайта кіру үшін бірдей аккаунтты пайдаланыңыз.</translation>
 <translation id="7410958280246779049">Бұл файл қауіпті болғандықтан, Chrome оны бөгеді.</translation>
+<translation id="7426611252293106642">Google Chrome дұрыс жұмыс істемеуі мүмкін, себебі оған Linux дистрибутивінде қолдау көрсетілмейді</translation>
 <translation id="7481213027396403996">Chrome браузерінің ең күшті қорғанысын қолданыңыз</translation>
 <translation id="7486227612705979895">Chrome браузері мекенжай жолағында ұсыныстар жасау үшін Drive дискісіне кіреді</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb
index cd29cc9..eb39b966 100644
--- a/chrome/app/resources/google_chrome_strings_km.xtb
+++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -290,6 +290,7 @@
 ការអនុញ្ញាត​ដែលអ្នកបានផ្ដល់​ឱ្យគេហទំព័រ និងកម្មវិធីរួចហើយ​អាចអនុវត្តចំពោះ​គណនីនេះ។ អ្នកអាចគ្រប់គ្រងគណនី Google របស់អ្នកបាននៅក្នុង<ph name="SETTINGS_LINK_BEGIN" />ការកំណត់<ph name="SETTINGS_LINK_END" />។</translation>
 <translation id="7398801000654795464">អ្នកបានចូលទៅក្នុង Chrome ជា <ph name="USER_EMAIL_ADDRESS" />. សូមប្រើគណនីដូចគ្នាដើម្បីចូលម្តងទៀត។</translation>
 <translation id="7410958280246779049">Chrome បានទប់ស្កាត់ឯកសារនេះ ដោយសារវាមានគ្រោះថ្នាក់</translation>
+<translation id="7426611252293106642">Google Chrome អាច​នឹង​មិន​បំពេញ​មុខងារ​បានត្រឹមត្រូវ​ទេ ដោយសារវា​លែង​ទទួល​បានការគាំទ្រ​នៅលើ​ប្រព័ន្ធ Linux ទៀតហើយ</translation>
 <translation id="7481213027396403996">ទទួលបាន​សុវត្ថិភាពខ្លាំង​បំផុតរបស់ Chrome</translation>
 <translation id="7486227612705979895">Chrome នឹងចូលប្រើ​ថាស​របស់អ្នក ដើម្បី​ធ្វើការណែនាំ​នៅក្នុង​របារ​អាសយដ្ឋាន</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 70616ec..e2d27fb 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -291,6 +291,7 @@
 이 계정에는 웹사이트와 앱에 이미 부여한 권한이 적용될 수 있습니다. <ph name="SETTINGS_LINK_BEGIN" />설정<ph name="SETTINGS_LINK_END" />에서 Google 계정을 관리할 수 있습니다.</translation>
 <translation id="7398801000654795464"><ph name="USER_EMAIL_ADDRESS" />(으)로 Chrome에 로그인되어 있습니다. 같은 계정으로 다시 로그인해 주세요.</translation>
 <translation id="7410958280246779049">위험한 파일이므로 Chrome에서 차단했습니다.</translation>
+<translation id="7426611252293106642">이 Linux 배포판에서 더 이상 Chrome을 지원하지 않으므로 Chrome이 올바르게 작동하지 않을 수 있습니다.</translation>
 <translation id="7481213027396403996">Chrome의 가장 강력한 보안 기능을 이용하세요</translation>
 <translation id="7486227612705979895">Chrome에서 내 드라이브에 액세스하여 주소 표시줄에 추천 검색어를 표시합니다.</translation>
 <translation id="7535429826459677826">Chrome 개발자</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index e862c84..96c7ce1 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -283,6 +283,7 @@
 Kebenaran yang telah anda berikan kepada laman web dan apl mungkin dikenakan pada akaun ini. Anda boleh mengurus Google Account anda dalam <ph name="SETTINGS_LINK_BEGIN" />Tetapan<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Anda telah log masuk ke Chrome sebagai <ph name="USER_EMAIL_ADDRESS" />. Sila gunakan akaun yang sama untuk log masuk lagi.</translation>
 <translation id="7410958280246779049">Chrome menyekat fail ini kerana fail ini berbahaya</translation>
+<translation id="7426611252293106642">Google Chrome mungkin tidak berfungsi dengan betul kerana tidak disokong pada edaran Linux ini lagi</translation>
 <translation id="7481213027396403996">Dapatkan keselamatan Chrome yang paling kukuh</translation>
 <translation id="7486227612705979895">Chrome akan mengakses Drive anda untuk membuat cadangan dalam bar alamat</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb
index 3e8e299..33ae021 100644
--- a/chrome/app/resources/google_chrome_strings_or.xtb
+++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -289,6 +289,7 @@
 ଆପଣ ୱେବସାଇଟ ଏବଂ ଆପ୍ସକୁ ପୂର୍ବରୁ ଦେଇଥିବା ଅନୁମତିଗୁଡ଼ିକ ଏହି ଆକାଉଣ୍ଟରେ ଲାଗୁ ହୋଇପାରେ। ଆପଣ <ph name="SETTINGS_LINK_BEGIN" />ସେଟିଂସ<ph name="SETTINGS_LINK_END" />ରେ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟଗୁଡ଼ିକୁ ପରିଚାଳନା କରିପାରିବେ।</translation>
 <translation id="7398801000654795464"><ph name="USER_EMAIL_ADDRESS" /> ଭାବରେ ଆପଣ Chromeରେ ସାଇନ୍ ଇନ୍ କରିଛନ୍ତି। ପୁଣିଥରେ ସାଇନ୍ ଇନ୍ କରିବା ପାଇଁ ଦୟାକରି ସେହି ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="7410958280246779049">ଏହି ଫାଇଲଟି ବିପଦଜନକ ହୋଇଥିବା ଯୋଗୁଁ Chrome ଏହାକୁ ବ୍ଲକ କରିଛି</translation>
+<translation id="7426611252293106642">ଏହି Linux ଡିଷ୍ଟ୍ରିବ୍ୟୁସନରେ Google Chrome ଆଉ ସମର୍ଥିତ ନଥିବା ଯୋଗୁଁ ଏହା ସଠିକ୍ ଭାବରେ କାମ କରିନପାରେ</translation>
 <translation id="7481213027396403996">Chromeର ସବୁଠାରୁ ଶକ୍ତିଶାଳୀ ସୁରକ୍ଷା ପାଆନ୍ତୁ</translation>
 <translation id="7486227612705979895">ଠିକଣା ବାର୍‌‌ରେ ପ୍ରସ୍ତାବ ଦେବା ପାଇଁ Chrome ଆପଣଙ୍କର ଡ୍ରାଇଭ୍‌କୁ ଆକ୍‌ସେସ୍ କରିବ</translation>
 <translation id="7535429826459677826">Google Chrome ଡେଭ୍‍</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index 877a15a..f8c7b97 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -283,6 +283,7 @@
 As autorizações que já concedeu aos Websites e apps podem aplicar-se a esta conta. Pode gerir as suas Contas Google nas <ph name="SETTINGS_LINK_BEGIN" />Definições<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Iniciou sessão no Chrome com a conta <ph name="USER_EMAIL_ADDRESS" />. Utilize a mesma conta para iniciar sessão novamente.</translation>
 <translation id="7410958280246779049">O Chrome bloqueou este ficheiro porque é perigoso</translation>
+<translation id="7426611252293106642">O Google Chrome pode não funcionar corretamente, uma vez que já não é suportado nesta distribuição do Linux</translation>
 <translation id="7481213027396403996">Obtenha a segurança mais avançada do Chrome</translation>
 <translation id="7486227612705979895">O Chrome vai aceder ao Drive para fornecer sugestões na barra de endereço.</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb
index 1e803a4..578edb40 100644
--- a/chrome/app/resources/google_chrome_strings_si.xtb
+++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -290,6 +290,7 @@
 ඔබ දැනටමත් වෙබ් අඩවි සහ යෙදුම් සඳහා ලබා දී ඇති අවසර මෙම ගිණුමට අදාළ විය හැකිය. ඔබට ඔබගේ Google ගිණුම් <ph name="SETTINGS_LINK_BEGIN" />සැකසීම්<ph name="SETTINGS_LINK_END" /> තුළ කළමනාකරණය කිරීමට හැකිය.</translation>
 <translation id="7398801000654795464">ඔබ Chrome වෙත <ph name="USER_EMAIL_ADDRESS" /> ලෙස පුරා තිබුණි. කරුණාකර නැවත පිරීමට එම ගිණුමම භාවිතා කරන්න.</translation>
 <translation id="7410958280246779049">Chrome මෙම ගොනුව අනතුරුදායක නිසා අවහිර කළේය</translation>
+<translation id="7426611252293106642">Google Chrome මෙම Linux ව්‍යාප්තියෙහි තවදුරටත් සහාය නොදක්වන නිසා එය නිවැරදිව ක්‍රියා නොකළ හැකිය</translation>
 <translation id="7481213027396403996">Chrome හි ප්‍රබලම ආරක්ෂාව ලබා ගන්න</translation>
 <translation id="7486227612705979895">ලිපින තීරුවේ යෝජනා කිරීමට Chrome ඔබගේ Drive ප්‍රවේශ කරනු ඇත</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index 20a3779..fe84918 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -291,6 +291,7 @@
 Dovoljenja, ki ste jih že odobrili spletnim mestom in aplikacijam, morda veljajo za ta račun. Račune Google lahko upravljate v <ph name="SETTINGS_LINK_BEGIN" />nastavitvah<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">V Chrome ste bili prijavljeni kot <ph name="USER_EMAIL_ADDRESS" />. Pri vnovični prijavi uporabite isti račun.</translation>
 <translation id="7410958280246779049">Chrome je blokiral to datoteko, ker je nevarna.</translation>
+<translation id="7426611252293106642">Google Chrome morda ne bo deloval pravilno, ker ni več podprt v tej distribuciji Linuxa.</translation>
 <translation id="7481213027396403996">Izberite Chromovo najmočnejšo varnost</translation>
 <translation id="7486227612705979895">Chrome bo dostopal do Googla Drive zaradi ponujanja predlogov v naslovni vrstici</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb
index 00f32853..677a0a2 100644
--- a/chrome/app/resources/google_chrome_strings_sq.xtb
+++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -290,6 +290,7 @@
 Lejet që u ke dhënë sajteve të uebit dhe aplikacioneve mund të zbatohen për këtë llogari. "Llogaritë e tua të Google" mund t'i menaxhosh te <ph name="SETTINGS_LINK_BEGIN" />Cilësimet<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Ishe i identifikuar në Chrome si <ph name="USER_EMAIL_ADDRESS" />. Përdor të njëjtën llogari për t'u identifikuar sërish.</translation>
 <translation id="7410958280246779049">Chrome e bllokoi këtë skedar sepse ai është i rrezikshëm</translation>
+<translation id="7426611252293106642">Google Chrome mund të mos funksionojë si duhet sepse nuk mbështetet më në këtë version të Linux</translation>
 <translation id="7481213027396403996">Merr sigurinë më të fortë të Chrome</translation>
 <translation id="7486227612705979895">Chrome do të ketë qasje te "Disku" yt për të dhënë sugjerime në shiritin e adresës</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 78682c7..5b62e98 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -291,6 +291,7 @@
 Behörigheter som du redan har gett webbplatser och appar kan gälla för det här kontot. Du kan hantera dina Google-konton i <ph name="SETTINGS_LINK_BEGIN" />inställningarna<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Du var inloggad i Chrome som <ph name="USER_EMAIL_ADDRESS" />. Använd samma konto när du loggar in igen.</translation>
 <translation id="7410958280246779049">Den här filen blockerades eftersom den är farlig</translation>
+<translation id="7426611252293106642">Google Chrome kanske inte fungerar ordentligt eftersom det inte längre stöds på den här Linux-distributionen</translation>
 <translation id="7481213027396403996">Få det bästa skyddet i Chrome</translation>
 <translation id="7486227612705979895">Chrome får åtkomst till din Drive så att du kan få förslag därifrån i adressfältet</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 5b73d666..7e30a02 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -291,6 +291,7 @@
 Huenda ruhusa ambazo tayari umezipa tovuti na programu zikatumika kwenye akaunti hii. Unaweza kudhibiti Akaunti zako za Google katika <ph name="SETTINGS_LINK_BEGIN" />Mipangilio<ph name="SETTINGS_LINK_END" />.</translation>
 <translation id="7398801000654795464">Uliingia kwenye Chrome kama <ph name="USER_EMAIL_ADDRESS" />. Tafadhali tumia akaunti sawa ili kuingia tena.</translation>
 <translation id="7410958280246779049">Chrome imezuia faili hii kwa sababu si salama</translation>
+<translation id="7426611252293106642">Huenda Google Chrome isifanye kazi vizuri kwa sababu haitumiki tena kwenye toleo hili la Linux</translation>
 <translation id="7481213027396403996">Pata usalama thabiti zaidi kutoka Chrome</translation>
 <translation id="7486227612705979895">Chrome itafikia Hifadhi yako ili kutoa mapendekezo kwenye sehemu ya anwani</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 2a2822fc..be5f67a 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -280,6 +280,7 @@
 สิทธิ์ที่คุณให้กับเว็บไซต์และแอปต่างๆ ไว้แล้วอาจมีผลกับบัญชีนี้ คุณจัดการบัญชี Google ใน<ph name="SETTINGS_LINK_BEGIN" />การตั้งค่า<ph name="SETTINGS_LINK_END" />ได้</translation>
 <translation id="7398801000654795464">คุณเคยลงชื่อเข้าใช้ Chrome ในชื่อ <ph name="USER_EMAIL_ADDRESS" /> โปรดใช้บัญชีเดิมเพื่อลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="7410958280246779049">Chrome บล็อกไฟล์นี้เนื่องจากเป็นอันตราย</translation>
+<translation id="7426611252293106642">Google Chrome อาจทำงานไม่ถูกต้องเพราะไม่รองรับใน Linux Distribution นี้แล้ว</translation>
 <translation id="7481213027396403996">รับการรักษาความปลอดภัยที่เข้มงวดที่สุดของ Chrome</translation>
 <translation id="7486227612705979895">Chrome จะเข้าถึงไดรฟ์ของคุณเพื่อแสดงคำแนะนำในแถบที่อยู่</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index ad564da..f2819ce4 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -284,6 +284,7 @@
 Web sitelerine ve uygulamalara verdiğiniz izinler, bu hesap için geçerli olabilir. Google Hesaplarınızı <ph name="SETTINGS_LINK_BEGIN" />Ayarlar<ph name="SETTINGS_LINK_END" /> bölümünden yönetebilirsiniz.</translation>
 <translation id="7398801000654795464">Chrome'da <ph name="USER_EMAIL_ADDRESS" /> olarak oturum açtınız. Tekrar oturum açmak için lütfen aynı hesabı kullanın.</translation>
 <translation id="7410958280246779049">Chrome bu dosyayı tehlikeli olduğu için engelledi</translation>
+<translation id="7426611252293106642">Google Chrome artık bu Linux dağıtımında desteklenmediği için doğru şekilde çalışmayabilir</translation>
 <translation id="7481213027396403996">Chrome’un en güçlü güvenlik özelliklerinden faydalanın</translation>
 <translation id="7486227612705979895">Chrome, adres çubuğunda öneriler göstermek için Drive'ınıza erişecektir</translation>
 <translation id="7535429826459677826">Google Chrome Dev</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
index 41985aa..0b6ecfa 100644
--- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -280,6 +280,7 @@
 您已向网站和应用授予的权限可能会应用于此帐号。您可在<ph name="SETTINGS_LINK_BEGIN" />设置<ph name="SETTINGS_LINK_END" />部分中管理您的 Google 帐号。</translation>
 <translation id="7398801000654795464">您之前登录 Chrome 时使用的帐号为 <ph name="USER_EMAIL_ADDRESS" />,请使用同一帐号再次登录。</translation>
 <translation id="7410958280246779049">此文件存在危险,因此 Chrome 已将其屏蔽</translation>
+<translation id="7426611252293106642">Google Chrome 可能无法正常运行,因为它不再支持此 Linux 发行版</translation>
 <translation id="7481213027396403996">获享 Chrome 的最强安全保护</translation>
 <translation id="7486227612705979895">Chrome 将访问您的云端硬盘,以在地址栏提供建议</translation>
 <translation id="7535429826459677826">Google Chrome 开发者版</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
index 3f18d973..b1801c4 100644
--- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -288,6 +288,7 @@
 您已向網站和應用程式授予的權限,可能會套用到此帳戶。您可在「<ph name="SETTINGS_LINK_BEGIN" />設定<ph name="SETTINGS_LINK_END" />」中管理 Google 帳戶。</translation>
 <translation id="7398801000654795464">您使用了 <ph name="USER_EMAIL_ADDRESS" /> 的身分登入 Chrome,請使用相同帳戶重新登入。</translation>
 <translation id="7410958280246779049">由於此檔案不安全,因此 Chrome 已封鎖此檔案</translation>
+<translation id="7426611252293106642">Google Chrome 不再支援此 Linux 發行版本,因此可能無法正常運作</translation>
 <translation id="7481213027396403996">取得 Chrome 最強大的安全防護</translation>
 <translation id="7486227612705979895">Chrome 會存取您的「雲端硬碟」,然後在網址列提出建議</translation>
 <translation id="7535429826459677826">Google Chrome 開發人員版</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index faac4807..5c24cd6 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -283,6 +283,7 @@
 你授予網站和應用程式的權限可能會存入這個帳戶的設定。你可以前往「<ph name="SETTINGS_LINK_BEGIN" />設定<ph name="SETTINGS_LINK_END" />」管理 Google 帳戶。</translation>
 <translation id="7398801000654795464">你使用了 <ph name="USER_EMAIL_ADDRESS" /> 的身分登入 Chrome,請使用相同帳戶重新登入。</translation>
 <translation id="7410958280246779049">這個檔案有安全疑慮,因此遭到 Chrome 封鎖</translation>
+<translation id="7426611252293106642">Google Chrome 已不再支援這個 Linux 發行版本,因此可能無法正常運作</translation>
 <translation id="7481213027396403996">獲得 Chrome 最強大的安全防護</translation>
 <translation id="7486227612705979895">Chrome 將存取你的雲端硬碟,並在網址列提供建議</translation>
 <translation id="7535429826459677826">Google Chrome 開發人員版</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index a74b6cc..08e8292 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -494,6 +494,25 @@
 };
 #endif  // BUILDFLAG(IS_ANDROID)
 
+const FeatureEntry::FeatureParam
+    kAutofillSaveCardUiExperimentEnableFasterAndProtected[] = {
+        {"autofill_save_card_ui_experiment_selector_in_number", "1"},
+};
+
+const FeatureEntry::FeatureParam
+    kAutofillSaveCardUiExperimentEnableEncryptedAndSecure[] = {
+        {"autofill_save_card_ui_experiment_selector_in_number", "2"},
+};
+
+const FeatureEntry::FeatureVariation kAutofillSaveCardUiExperimentOptions[] = {
+    {flag_descriptions::kAutofillSaveCardUiExperimentFasterAndProtected,
+     kAutofillSaveCardUiExperimentEnableFasterAndProtected,
+     std::size(kAutofillSaveCardUiExperimentEnableFasterAndProtected), nullptr},
+    {flag_descriptions::kAutofillSaveCardUiExperimentEncryptedAndSecure,
+     kAutofillSaveCardUiExperimentEnableEncryptedAndSecure,
+     std::size(kAutofillSaveCardUiExperimentEnableEncryptedAndSecure), nullptr},
+};
+
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
 const FeatureEntry::FeatureParam kForceDark_SimpleHsl[] = {
     {"inversion_method", "hsl_based"},
@@ -5947,6 +5966,11 @@
      flag_descriptions::kEnableGoogleAssistantDspDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::assistant::features::kEnableDspHotword)},
 
+    {"deprecate-assistant-stylus-features",
+     flag_descriptions::kDeprecateAssistantStylusFeaturesName,
+     flag_descriptions::kDeprecateAssistantStylusFeaturesDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kDeprecateAssistantStylusFeatures)},
+
     {"disable-quick-answers-v2-translation",
      flag_descriptions::kDisableQuickAnswersV2TranslationName,
      flag_descriptions::kDisableQuickAnswersV2TranslationDescription, kOsCrOS,
@@ -6083,6 +6107,10 @@
      flag_descriptions::kForceStartupSigninPromoName,
      flag_descriptions::kForceStartupSigninPromoDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(switches::kForceStartupSigninPromo)},
+
+    {"tangible-sync", flag_descriptions::kTangibleSyncName,
+     flag_descriptions::kTangibleSyncDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(switches::kTangibleSync)},
 #endif  // BUILDFLAG(IS_ANDROID)
 
     {"autofill-use-improved-label-disambiguation",
@@ -8514,7 +8542,10 @@
     {"autofill-enable-upstream-save-card-offer-ui-experiment",
      flag_descriptions::kAutofillSaveCardUiExperimentName,
      flag_descriptions::kAutofillSaveCardUiExperimentDescription, kOsDesktop,
-     FEATURE_VALUE_TYPE(autofill::features::kAutofillSaveCardUiExperiment)},
+     FEATURE_WITH_PARAMS_VALUE_TYPE(
+         autofill::features::kAutofillSaveCardUiExperiment,
+         kAutofillSaveCardUiExperimentOptions,
+         "AutofillSaveCardUiExperiment")},
 
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
diff --git a/chrome/browser/android/chrome_backup_agent.cc b/chrome/browser/android/chrome_backup_agent.cc
index a484e4f..9850236c 100644
--- a/chrome/browser/android/chrome_backup_agent.cc
+++ b/chrome/browser/android/chrome_backup_agent.cc
@@ -20,7 +20,7 @@
 
 // TODO(crbug.com/1305213): The data type toggles shouldn't be individually
 // listed here.
-static_assert(38 == syncer::GetNumModelTypes(),
+static_assert(39 == syncer::GetNumModelTypes(),
               "If the new type has a corresponding pref, add it here");
 const char* backed_up_preferences_[] = {
     autofill::prefs::kAutofillWalletImportEnabled,
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index b00c3c2..909c32f 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -5964,6 +5964,67 @@
   EXPECT_TRUE(script_listener.WaitUntilSatisfied());
 }
 
+// Check that with site-isolated <webview>, two same-site OOPIFs in two
+// unrelated <webview> tags share the same process due to the subframe process
+// reuse policy.
+IN_PROC_BROWSER_TEST_F(SitePerProcessWebViewTest, SubframeProcessReuse) {
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  // Load an app with a <webview> guest that starts at a data: URL.
+  LoadAppWithGuest("web_view/simple");
+  content::WebContents* guest = GetGuestWebContents();
+  ASSERT_TRUE(guest);
+
+  // Navigate <webview> to a cross-site page with a same-site iframe.
+  const GURL start_url =
+      embedded_test_server()->GetURL("a.test", "/iframe.html");
+  EXPECT_TRUE(NavigateToURL(guest, start_url));
+
+  // Navigate <webview> subframe cross-site.
+  const GURL frame_url =
+      embedded_test_server()->GetURL("b.test", "/title1.html");
+  EXPECT_TRUE(NavigateIframeToURL(guest, "test", frame_url));
+  content::RenderFrameHost* subframe =
+      content::ChildFrameAt(guest->GetMainFrame(), 0);
+
+  // Attach a second <webview>.
+  ASSERT_TRUE(content::ExecuteScript(
+      GetEmbedderWebContents(),
+      base::StringPrintf("const w = document.createElement('webview');"
+                         "w.src = '%s';"
+                         "document.body.appendChild(w);",
+                         start_url.spec().c_str())));
+  GetGuestViewManager()->WaitForNumGuestsCreated(2u);
+  auto* guest2 = GetGuestViewManager()->GetLastGuestCreated();
+  EXPECT_TRUE(content::WaitForLoadStop(guest2));
+  ASSERT_NE(guest, guest2);
+
+  // Navigate second <webview> cross-site.  Use NavigateToURL() to swap
+  // BrowsingInstances.
+  const GURL second_guest_url =
+      embedded_test_server()->GetURL("c.test", "/iframe.html");
+  EXPECT_TRUE(NavigateToURL(guest2, second_guest_url));
+  EXPECT_NE(guest->GetMainFrame()->GetSiteInstance(),
+            guest2->GetMainFrame()->GetSiteInstance());
+  EXPECT_NE(guest->GetMainFrame()->GetProcess(),
+            guest2->GetMainFrame()->GetProcess());
+  EXPECT_FALSE(guest->GetMainFrame()->GetSiteInstance()->IsRelatedSiteInstance(
+      guest2->GetMainFrame()->GetSiteInstance()));
+
+  // Navigate second <webview> subframe to the same site as the first <webview>
+  // subframe, ending up with A(B) in `guest` and C(B) in `guest2`.  These
+  // subframes should be in the same (guest's) StoragePartition, but different
+  // SiteInstances and BrowsingInstances. Nonetheless, due to the subframe
+  // reuse policy, they should share the same process.
+  EXPECT_TRUE(NavigateIframeToURL(guest2, "test", frame_url));
+  content::RenderFrameHost* subframe2 =
+      content::ChildFrameAt(guest2->GetMainFrame(), 0);
+  EXPECT_NE(subframe->GetSiteInstance(), subframe2->GetSiteInstance());
+  EXPECT_EQ(subframe->GetSiteInstance()->GetStoragePartitionConfig(),
+            subframe2->GetSiteInstance()->GetStoragePartitionConfig());
+  EXPECT_EQ(subframe->GetProcess(), subframe2->GetProcess());
+}
+
 class WebViewFencedFrameTest : public WebViewTest {
  public:
   ~WebViewFencedFrameTest() override = default;
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher.cc b/chrome/browser/ash/app_mode/startup_app_launcher.cc
index f3fe58e..3696f7c 100644
--- a/chrome/browser/ash/app_mode/startup_app_launcher.cc
+++ b/chrome/browser/ash/app_mode/startup_app_launcher.cc
@@ -146,11 +146,11 @@
     const std::string& app_id) {
   DCHECK(state_ == LaunchState::kWaitingForCache);
 
-  kiosk_app_manager_observation_.Reset();
-
   if (app_id != app_id_)
     return;
 
+  kiosk_app_manager_observation_.Reset();
+
   if (KioskAppManager::Get()->HasCachedCrx(app_id_))
     BeginInstall();
   else
diff --git a/chrome/browser/ash/arc/arc_util_unittest.cc b/chrome/browser/ash/arc/arc_util_unittest.cc
index 1b77414f..e1939c9f 100644
--- a/chrome/browser/ash/arc/arc_util_unittest.cc
+++ b/chrome/browser/ash/arc/arc_util_unittest.cc
@@ -746,7 +746,7 @@
 class ArcOobeTest : public ChromeArcUtilTest {
  public:
   ArcOobeTest() {
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     oobe_configuration_ = std::make_unique<ash::OobeConfiguration>();
   }
 
@@ -758,7 +758,7 @@
     // configuration.
     fake_login_display_host_.reset();
     oobe_configuration_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
   }
 
  protected:
diff --git a/chrome/browser/ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc b/chrome/browser/ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc
index 944b3293..7c0efaf 100644
--- a/chrome/browser/ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc
+++ b/chrome/browser/ash/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc
@@ -38,7 +38,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     chromeos::SessionManagerClient::InitializeFakeInMemory();
 
     arc_service_manager_ = std::make_unique<ArcServiceManager>();
@@ -72,7 +72,7 @@
     arc_session_manager_.reset();
     arc_service_manager_.reset();
     chromeos::SessionManagerClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/enterprise/arc_data_snapshotd_delegate_unittest.cc b/chrome/browser/ash/arc/enterprise/arc_data_snapshotd_delegate_unittest.cc
index a1f3091..696c18e5 100644
--- a/chrome/browser/ash/arc/enterprise/arc_data_snapshotd_delegate_unittest.cc
+++ b/chrome/browser/ash/arc/enterprise/arc_data_snapshotd_delegate_unittest.cc
@@ -69,7 +69,7 @@
     ArcSessionManager::EnableCheckAndroidManagementForTesting(false);
 
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     chromeos::SessionManagerClient::InitializeFakeInMemory();
 
     TestingProfile::Builder profile_builder;
@@ -88,7 +88,7 @@
 
   ~ArcDataSnapshotdDelegateTest() override {
     chromeos::SessionManagerClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/enterprise/arc_enterprise_reporting_service_unittest.cc b/chrome/browser/ash/arc/enterprise/arc_enterprise_reporting_service_unittest.cc
index 08c05ed8..e70be07 100644
--- a/chrome/browser/ash/arc/enterprise/arc_enterprise_reporting_service_unittest.cc
+++ b/chrome/browser/ash/arc/enterprise/arc_enterprise_reporting_service_unittest.cc
@@ -56,7 +56,7 @@
     GetFakeUserManager()->LoginUser(account_id);
 
     // Set up ArcSessionManager for ReportManagementState tests
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
     ArcSessionManager::SetUiEnabledForTesting(false);
diff --git a/chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map.cc b/chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map.cc
index 4573c49..961e6c8f 100644
--- a/chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map.cc
+++ b/chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map.cc
@@ -8,6 +8,7 @@
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_root.h"
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map_factory.h"
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_util.h"
+#include "chrome/browser/ash/arc/fileapi/arc_media_view_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -30,11 +31,14 @@
 
 // List of documents providers for media views.
 constexpr DocumentsProviderSpec kDocumentsProviderAllowlist[] = {
-    {"com.android.providers.media.documents", "images_root", "images_root",
-     true},
-    {"com.android.providers.media.documents", "videos_root", "videos_root",
-     true},
-    {"com.android.providers.media.documents", "audio_root", "audio_root", true},
+    {kMediaDocumentsProviderAuthority, kImagesRootDocumentId,
+     kImagesRootDocumentId, true},
+    {kMediaDocumentsProviderAuthority, kVideosRootDocumentId,
+     kVideosRootDocumentId, true},
+    {kMediaDocumentsProviderAuthority, kAudioRootDocumentId,
+     kAudioRootDocumentId, true},
+    {kMediaDocumentsProviderAuthority, kDocumentsRootDocumentId,
+     kDocumentsRootDocumentId, true},
 };
 
 }  // namespace
diff --git a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge_unittest.cc b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge_unittest.cc
index e2d3ef7..d884323 100644
--- a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge_unittest.cc
+++ b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge_unittest.cc
@@ -58,7 +58,7 @@
   void SetUp() override {
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     profile_manager_ = std::make_unique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
     ASSERT_TRUE(profile_manager_->SetUp());
@@ -82,7 +82,7 @@
     arc_bridge_service_.file_system()->CloseInstance(&fake_file_system_);
     arc_file_system_bridge_.reset();
     profile_manager_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/fileapi/arc_media_view_util.cc b/chrome/browser/ash/arc/fileapi/arc_media_view_util.cc
index c69f990..3cb46cd8 100644
--- a/chrome/browser/ash/arc/fileapi/arc_media_view_util.cc
+++ b/chrome/browser/ash/arc/fileapi/arc_media_view_util.cc
@@ -21,6 +21,7 @@
 const char kImagesRootDocumentId[] = "images_root";
 const char kVideosRootDocumentId[] = "videos_root";
 const char kAudioRootDocumentId[] = "audio_root";
+const char kDocumentsRootDocumentId[] = "documents_root";
 
 std::string GetMediaViewVolumeId(const std::string& root_document_id) {
   return std::string(kMediaViewVolumeIdPrefix) + root_document_id;
diff --git a/chrome/browser/ash/arc/fileapi/arc_media_view_util.h b/chrome/browser/ash/arc/fileapi/arc_media_view_util.h
index cec656ff..f042369 100644
--- a/chrome/browser/ash/arc/fileapi/arc_media_view_util.h
+++ b/chrome/browser/ash/arc/fileapi/arc_media_view_util.h
@@ -23,6 +23,7 @@
 extern const char kImagesRootDocumentId[];
 extern const char kVideosRootDocumentId[];
 extern const char kAudioRootDocumentId[];
+extern const char kDocumentsRootDocumentId[];
 
 // Returns an ID of a Media View volume.
 std::string GetMediaViewVolumeId(const std::string& root_document_id);
diff --git a/chrome/browser/ash/arc/input_overlay/input_overlay_resources_util.cc b/chrome/browser/ash/arc/input_overlay/input_overlay_resources_util.cc
index 46ad31a..a6da714b 100644
--- a/chrome/browser/ash/arc/input_overlay/input_overlay_resources_util.cc
+++ b/chrome/browser/ash/arc/input_overlay/input_overlay_resources_util.cc
@@ -24,6 +24,8 @@
       {"com.blackpanther.ninjaarashi", IDR_IO_COM_BLACKPANTHER_NINJAARASHI},
       {"com.loongcheer.neverlate.wizardlegend.fightmaster",
        IDR_IO_COM_LOONGCHEER_NEVERLATE_WIZARDLEGEND_FIGHTMASTER},
+      {"com.direlight.grimvalor", IDR_IO_COM_DIRELIGHT_GRIMVALOR},
+      {"com.pixelstar.pbr", IDR_IO_COM_PIXELSTAR_PBR},
   };
 
   auto it = resource_id_map.find(package_name);
diff --git a/chrome/browser/ash/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc b/chrome/browser/ash/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
index 9ab31bd7..bbad3b6 100644
--- a/chrome/browser/ash/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
+++ b/chrome/browser/ash/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
@@ -42,7 +42,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     arc_session_manager_ =
         CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
             base::BindRepeating(FakeArcSession::Create)));
@@ -82,7 +82,7 @@
     observer()->StopObserving();
     testing_profile_.reset();
     arc_session_manager_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle.cc b/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle.cc
index 5bfb4b6..fe4d120 100644
--- a/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle.cc
+++ b/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle.cc
@@ -88,7 +88,7 @@
     return;
   }
 
-  auto* const client = chromeos::ConciergeClient::Get();
+  auto* const client = ash::ConciergeClient::Get();
   if (!client) {
     LOG(ERROR) << "ConciergeClient is not available";
     return;
@@ -100,7 +100,7 @@
 
 void SetArcVmCpuRestriction(CpuRestrictionState cpu_restriction_state,
                             bool use_quota) {
-  auto* const client = chromeos::ConciergeClient::Get();
+  auto* const client = ash::ConciergeClient::Get();
   if (!client) {
     LOG(ERROR) << "ConciergeClient is not available";
     return;
diff --git a/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle_unittest.cc b/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle_unittest.cc
index 3897b3c0e9..cee0012 100644
--- a/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle_unittest.cc
+++ b/chrome/browser/ash/arc/instance_throttle/arc_instance_throttle_unittest.cc
@@ -54,7 +54,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     arc_service_manager_ = std::make_unique<ArcServiceManager>();
     arc_session_manager_ =
         CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
@@ -97,7 +97,7 @@
     testing_profile_.reset();
     arc_session_manager_.reset();
     arc_service_manager_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
     chromeos::PowerManagerClient::Shutdown();
   }
diff --git a/chrome/browser/ash/arc/instance_throttle/arc_power_throttle_observer_unittest.cc b/chrome/browser/ash/arc/instance_throttle/arc_power_throttle_observer_unittest.cc
index 0189755..66011948 100644
--- a/chrome/browser/ash/arc/instance_throttle/arc_power_throttle_observer_unittest.cc
+++ b/chrome/browser/ash/arc/instance_throttle/arc_power_throttle_observer_unittest.cc
@@ -47,7 +47,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     service_manager_ = std::make_unique<ArcServiceManager>();
     session_manager_ =
         CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
diff --git a/chrome/browser/ash/arc/instance_throttle/arc_provisioning_throttle_observer_unittest.cc b/chrome/browser/ash/arc/instance_throttle/arc_provisioning_throttle_observer_unittest.cc
index 46b2f8b..24301f73 100644
--- a/chrome/browser/ash/arc/instance_throttle/arc_provisioning_throttle_observer_unittest.cc
+++ b/chrome/browser/ash/arc/instance_throttle/arc_provisioning_throttle_observer_unittest.cc
@@ -29,7 +29,7 @@
  public:
   ArcProvisioningThrottleObserverTest()
       : scoped_user_manager_(std::make_unique<ash::FakeChromeUserManager>()) {
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
 
diff --git a/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc b/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc
index 783939a..d049d1e 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc
+++ b/chrome/browser/ash/arc/intent_helper/arc_settings_service_unittest.cc
@@ -61,7 +61,7 @@
         base::CommandLine::ForCurrentProcess());
     ArcSessionManager::SetUiEnabledForTesting(false);
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     network_handler_test_helper_ =
         std::make_unique<chromeos::NetworkHandlerTestHelper>();
     network_config_helper_ = std::make_unique<
@@ -125,7 +125,7 @@
 
     ash::StatsReportingController::Shutdown();
     network_handler_test_helper_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/notification/arc_provision_notification_service_unittest.cc b/chrome/browser/ash/arc/notification/arc_provision_notification_service_unittest.cc
index 72c9a14c..bc1947c 100644
--- a/chrome/browser/ash/arc/notification/arc_provision_notification_service_unittest.cc
+++ b/chrome/browser/ash/arc/notification/arc_provision_notification_service_unittest.cc
@@ -59,7 +59,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
@@ -106,7 +106,7 @@
     arc_session_manager_.reset();
     arc_service_manager_.reset();
 
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc b/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc
index faa5b9b..947a7297 100644
--- a/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc
+++ b/chrome/browser/ash/arc/policy/arc_policy_bridge_unittest.cc
@@ -789,7 +789,7 @@
   constexpr char kTrue[] = "true";
 
   chromeos::DBusThreadManager::Initialize();
-  chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+  ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
   auto upstart_client = std::make_unique<ash::FakeUpstartClient>();
   arc::prefs::RegisterLocalStatePrefs(
@@ -823,7 +823,7 @@
   manager.reset();
   upstart_client.reset();
   arc_session_manager.reset();
-  chromeos::ConciergeClient::Shutdown();
+  ash::ConciergeClient::Shutdown();
   chromeos::DBusThreadManager::Shutdown();
 }
 
diff --git a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
index ee76d291..b89e8389 100644
--- a/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
+++ b/chrome/browser/ash/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
@@ -67,7 +67,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     chromeos::SessionManagerClient::InitializeFakeInMemory();
     ash::UpstartClient::InitializeFake();
 
@@ -114,7 +114,7 @@
     TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
     ash::UpstartClient::Shutdown();
     chromeos::SessionManagerClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.cc b/chrome/browser/ash/arc/session/arc_session_manager.cc
index c06e143..6ef5aad 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager.cc
@@ -569,7 +569,7 @@
   if (chromeos::SessionManagerClient::Get())
     chromeos::SessionManagerClient::Get()->AddObserver(this);
   ResetStabilityMetrics();
-  chromeos::ConciergeClient::Get()->AddVmObserver(this);
+  ash::ConciergeClient::Get()->AddVmObserver(this);
   arc_dlc_installer_ = std::make_unique<ArcDlcInstaller>();
 }
 
@@ -577,7 +577,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   arc_dlc_installer_.reset();
 
-  chromeos::ConciergeClient::Get()->RemoveVmObserver(this);
+  ash::ConciergeClient::Get()->RemoveVmObserver(this);
 
   if (chromeos::SessionManagerClient::Get())
     chromeos::SessionManagerClient::Get()->RemoveObserver(this);
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.h b/chrome/browser/ash/arc/session/arc_session_manager.h
index fea6e23..6a0f2ad 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager.h
+++ b/chrome/browser/ash/arc/session/arc_session_manager.h
@@ -57,7 +57,7 @@
 class ArcSessionManager : public ArcSessionRunner::Observer,
                           public ArcSupportHost::ErrorDelegate,
                           public chromeos::SessionManagerClient::Observer,
-                          public chromeos::ConciergeClient::VmObserver,
+                          public ash::ConciergeClient::VmObserver,
                           public policy::PolicyService::Observer {
  public:
   // Represents each State of ARC session.
@@ -314,7 +314,7 @@
     property_files_expansion_result_.reset();
   }
 
-  // chromeos::ConciergeClient::VmObserver overrides.
+  // ash::ConciergeClient::VmObserver overrides.
   void OnVmStarted(
       const vm_tools::concierge::VmStartedSignal& vm_signal) override;
   void OnVmStopped(
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
index 5669097..a8b2a24 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
@@ -162,7 +162,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     chromeos::SessionManagerClient::InitializeFakeInMemory();
 
     ArcSessionManager::SetUiEnabledForTesting(false);
@@ -184,7 +184,7 @@
     arc_session_manager_.reset();
     arc_service_manager_.reset();
     chromeos::SessionManagerClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
@@ -276,7 +276,7 @@
 
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     chromeos::PowerManagerClient::InitializeFake();
     chromeos::SessionManagerClient::InitializeFakeInMemory();
     ash::UpstartClient::InitializeFake();
@@ -310,7 +310,7 @@
     ash::UpstartClient::Shutdown();
     chromeos::SessionManagerClient::Shutdown();
     chromeos::PowerManagerClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/attestation/OWNERS b/chrome/browser/ash/attestation/OWNERS
index 57c540d2..3040672 100644
--- a/chrome/browser/ash/attestation/OWNERS
+++ b/chrome/browser/ash/attestation/OWNERS
@@ -1,7 +1,6 @@
 emaxx@chromium.org
 drcrash@chromium.org
 dkrahn@chromium.org
-mnissler@chromium.org
 bartfab@chromium.org
 
 per-file *tpm_challenge_key*=pmarko@chromium.org
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_impl.cc b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
index 89587eb..29c8b9b 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
+++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.cc
@@ -86,9 +86,9 @@
 BorealisContextManagerImpl::BorealisContextManagerImpl(Profile* profile)
     : profile_(profile), weak_factory_(this) {
   // ConciergeClient may not be initialized in tests.
-  if (chromeos::ConciergeClient::Get()) {
+  if (ash::ConciergeClient::Get()) {
     ShutDownBorealisIfRunning();
-    chromeos::ConciergeClient::Get()->AddVmObserver(this);
+    ash::ConciergeClient::Get()->AddVmObserver(this);
   }
 }
 
@@ -97,8 +97,8 @@
   // prior to BorealisService/BorealisContextManagerImpl in tests. Therefore we
   // must not keep a pointer to the observed ConciergeClient, either directly or
   // via ScopedObservation or similar.
-  if (chromeos::ConciergeClient::Get()) {
-    chromeos::ConciergeClient::Get()->RemoveVmObserver(this);
+  if (ash::ConciergeClient::Get()) {
+    ash::ConciergeClient::Get()->RemoveVmObserver(this);
   }
 }
 
@@ -109,7 +109,7 @@
   vm_tools::concierge::GetVmInfoRequest request;
   request.set_owner_id(ash::ProfileHelper::GetUserIdHashFromProfile(profile_));
   request.set_name(kBorealisVmName);
-  chromeos::ConciergeClient::Get()->GetVmInfo(
+  ash::ConciergeClient::Get()->GetVmInfo(
       std::move(request),
       base::BindOnce(
           [](base::WeakPtr<BorealisContextManagerImpl> weak_this,
@@ -130,7 +130,7 @@
   vm_tools::concierge::StopVmRequest request;
   request.set_owner_id(ash::ProfileHelper::GetUserIdHashFromProfile(profile_));
   request.set_name(vm_name);
-  chromeos::ConciergeClient::Get()->StopVm(
+  ash::ConciergeClient::Get()->StopVm(
       std::move(request),
       base::BindOnce(
           [](base::OnceCallback<void(BorealisShutdownResult)>
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_impl.h b/chrome/browser/ash/borealis/borealis_context_manager_impl.h
index 0377b754..f5c97d1 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_impl.h
+++ b/chrome/browser/ash/borealis/borealis_context_manager_impl.h
@@ -23,9 +23,8 @@
 
 // The Borealis Context Manager is a keyed service responsible for managing
 // the Borealis VM startup flow and guaranteeing its state to other processes.
-class BorealisContextManagerImpl
-    : public BorealisContextManager,
-      public chromeos::ConciergeClient::VmObserver {
+class BorealisContextManagerImpl : public BorealisContextManager,
+                                   public ash::ConciergeClient::VmObserver {
  public:
   explicit BorealisContextManagerImpl(Profile* profile);
   BorealisContextManagerImpl(const BorealisContextManagerImpl&) = delete;
@@ -87,7 +86,7 @@
   BorealisContextManager::ContextOrFailure GetResult(
       const Startup::Result& completion_result);
 
-  // chromeos::ConciergeClient::VmObserver:
+  // ash::ConciergeClient::VmObserver:
   void OnVmStarted(const vm_tools::concierge::VmStartedSignal& signal) override;
   void OnVmStopped(const vm_tools::concierge::VmStoppedSignal& signal) override;
 
diff --git a/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc b/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
index 70d62d1..066a780 100644
--- a/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
+++ b/chrome/browser/ash/borealis/borealis_context_manager_unittest.cc
@@ -109,7 +109,7 @@
   }
 
   void SendVmStartedSignal() {
-    auto* concierge_client = chromeos::FakeConciergeClient::Get();
+    auto* concierge_client = ash::FakeConciergeClient::Get();
 
     vm_tools::concierge::VmStartedSignal signal;
     signal.set_name("test_vm_name");
@@ -119,7 +119,7 @@
   }
 
   void SendVmStoppedSignal() {
-    auto* concierge_client = chromeos::FakeConciergeClient::Get();
+    auto* concierge_client = ash::FakeConciergeClient::Get();
 
     vm_tools::concierge::VmStoppedSignal signal;
     signal.set_name("test_vm_name");
@@ -294,8 +294,8 @@
   context_manager.ShutDownBorealis(shutdown_callback_handler.BindOnce());
   task_environment_.RunUntilIdle();
 
-  chromeos::FakeConciergeClient* fake_concierge_client =
-      chromeos::FakeConciergeClient::Get();
+  ash::FakeConciergeClient* fake_concierge_client =
+      ash::FakeConciergeClient::Get();
   EXPECT_GE(fake_concierge_client->stop_vm_call_count(), 1);
   histogram_tester_->ExpectTotalCount(kBorealisShutdownNumAttemptsHistogram, 1);
   histogram_tester_->ExpectUniqueSample(kBorealisShutdownResultHistogram,
@@ -321,8 +321,8 @@
   vm_tools::concierge::StopVmResponse response;
   response.set_success(false);
   response.set_failure_reason("expected failure");
-  chromeos::FakeConciergeClient* fake_concierge_client =
-      chromeos::FakeConciergeClient::Get();
+  ash::FakeConciergeClient* fake_concierge_client =
+      ash::FakeConciergeClient::Get();
   fake_concierge_client->set_stop_vm_response(std::move(response));
 
   ShutdownCallbackFactory shutdown_callback_handler;
@@ -426,8 +426,8 @@
 }
 
 TEST_F(BorealisContextManagerTest, VmShutsDownAfterChromeCrashes) {
-  chromeos::FakeConciergeClient* fake_concierge_client =
-      chromeos::FakeConciergeClient::Get();
+  ash::FakeConciergeClient* fake_concierge_client =
+      ash::FakeConciergeClient::Get();
 
   // Ensure that GetVmInfo returns success - a VM "still running".
   SendVmStartedSignal();
diff --git a/chrome/browser/ash/borealis/borealis_context_unittest.cc b/chrome/browser/ash/borealis/borealis_context_unittest.cc
index 9ada0ef..bbdd4ea 100644
--- a/chrome/browser/ash/borealis/borealis_context_unittest.cc
+++ b/chrome/browser/ash/borealis/borealis_context_unittest.cc
@@ -97,7 +97,7 @@
 };
 
 TEST_F(BorealisContextTest, ConciergeFailure) {
-  auto* concierge_client = chromeos::FakeConciergeClient::Get();
+  auto* concierge_client = ash::FakeConciergeClient::Get();
 
   concierge_client->NotifyConciergeStopped();
   histogram_tester_.ExpectUniqueSample(
diff --git a/chrome/browser/ash/borealis/borealis_disk_manager_impl.cc b/chrome/browser/ash/borealis/borealis_disk_manager_impl.cc
index da1cb852..12972bc 100644
--- a/chrome/browser/ash/borealis/borealis_disk_manager_impl.cc
+++ b/chrome/browser/ash/borealis/borealis_disk_manager_impl.cc
@@ -140,7 +140,7 @@
         ash::ProfileHelper::GetUserIdHashFromProfile(context_->profile()));
     request.set_storage_location(vm_tools::concierge::STORAGE_CRYPTOHOME_ROOT);
     request.set_vm_name(context_->vm_name());
-    chromeos::ConciergeClient::Get()->ListVmDisks(
+    ash::ConciergeClient::Get()->ListVmDisks(
         std::move(request),
         base::BindOnce(&BuildDiskInfo::HandleListVmDisksResult,
                        weak_factory_.GetWeakPtr()));
@@ -191,7 +191,7 @@
     : public Transition<BorealisDiskInfo,
                         std::pair<BorealisDiskInfo, BorealisDiskInfo>,
                         Described<BorealisResizeDiskResult>>,
-      public chromeos::ConciergeClient::DiskImageObserver {
+      public ash::ConciergeClient::DiskImageObserver {
  public:
   explicit ResizeDisk(
       int64_t space_delta,
@@ -205,7 +205,7 @@
         weak_factory_(this) {}
 
   ~ResizeDisk() override {
-    chromeos::ConciergeClient::Get()->RemoveDiskImageObserver(this);
+    ash::ConciergeClient::Get()->RemoveDiskImageObserver(this);
   }
 
   void Start(std::unique_ptr<BorealisDiskManagerImpl::BorealisDiskInfo>
@@ -314,7 +314,7 @@
         ash::ProfileHelper::GetUserIdHashFromProfile(context_->profile()));
     request.set_vm_name(context_->vm_name());
     request.set_disk_size(space_delta_ + original_disk_info_.disk_size);
-    chromeos::ConciergeClient::Get()->ResizeDiskImage(
+    ash::ConciergeClient::Get()->ResizeDiskImage(
         std::move(request), base::BindOnce(&ResizeDisk::HandleResizeResponse,
                                            weak_factory_.GetWeakPtr()));
   }
@@ -330,7 +330,7 @@
     } else if (response->status() ==
                vm_tools::concierge::DiskImageStatus::DISK_STATUS_IN_PROGRESS) {
       uuid_ = response->command_uuid();
-      chromeos::ConciergeClient::Get()->AddDiskImageObserver(this);
+      ash::ConciergeClient::Get()->AddDiskImageObserver(this);
     } else {
       GetUpdatedDiskInfo(
           "got an unexpected or error status from concierge when resizing: " +
@@ -339,7 +339,7 @@
     }
   }
 
-  // chromeos::ConciergeClient::DiskImageObserver
+  // ash::ConciergeClient::DiskImageObserver
   void OnDiskImageProgress(
       const vm_tools::concierge::DiskImageStatusResponse& signal) override {
     if (signal.command_uuid() != uuid_) {
diff --git a/chrome/browser/ash/borealis/borealis_features.cc b/chrome/browser/ash/borealis/borealis_features.cc
index e8bba6b..3321f07 100644
--- a/chrome/browser/ash/borealis/borealis_features.cc
+++ b/chrome/browser/ash/borealis/borealis_features.cc
@@ -78,7 +78,7 @@
 
     // The board-specific tokens.
     if (BoardIn({"hatch-borealis", "puff-borealis", "zork-borealis",
-                 "volteer-borealis"})) {
+                 "volteer-borealis", "aurora-borealis"})) {
       if (TokenHashMatches("MXlY+SFZ!2,P_k^02]hK",
                            "FbxB2mxNa/uqskX4X+NqHhAE6ebHeWC0u+Y+UlGEB/4=")) {
         LOG(WARNING) << "Dogfooder token provided, bypassing hardware checks.";
diff --git a/chrome/browser/ash/borealis/borealis_installer_impl.cc b/chrome/browser/ash/borealis/borealis_installer_impl.cc
index 5d4d031..d3b9588 100644
--- a/chrome/browser/ash/borealis/borealis_installer_impl.cc
+++ b/chrome/browser/ash/borealis/borealis_installer_impl.cc
@@ -269,7 +269,7 @@
     request.set_cryptohome_id(
         ash::ProfileHelper::GetUserIdHashFromProfile(profile_));
     request.set_vm_name(uninstall_info_->vm_name);
-    chromeos::ConciergeClient::Get()->DestroyDiskImage(
+    ash::ConciergeClient::Get()->DestroyDiskImage(
         std::move(request), base::BindOnce(&Uninstallation::OnDiskRemoved,
                                            weak_factory_.GetWeakPtr()));
   }
diff --git a/chrome/browser/ash/borealis/borealis_task.cc b/chrome/browser/ash/borealis/borealis_task.cc
index 37cb43ce..df36723 100644
--- a/chrome/browser/ash/borealis/borealis_task.cc
+++ b/chrome/browser/ash/borealis/borealis_task.cc
@@ -135,7 +135,7 @@
   request.set_storage_location(vm_tools::concierge::STORAGE_CRYPTOHOME_ROOT);
   request.set_disk_size(0);
 
-  chromeos::ConciergeClient::Get()->CreateDiskImage(
+  ash::ConciergeClient::Get()->CreateDiskImage(
       std::move(request), base::BindOnce(&CreateDiskImage::OnCreateDiskImage,
                                          weak_factory_.GetWeakPtr(), context));
 }
@@ -251,13 +251,13 @@
   if (external_disk) {
     base::ScopedFD fd(external_disk->TakePlatformFile());
     request.add_fds(vm_tools::concierge::StartVmRequest::STORAGE);
-    chromeos::ConciergeClient::Get()->StartTerminaVmWithFd(
+    ash::ConciergeClient::Get()->StartTerminaVmWithFd(
         std::move(fd), std::move(request),
         base::BindOnce(&StartBorealisVm::OnStartBorealisVm,
                        weak_factory_.GetWeakPtr(), context));
     return;
   }
-  chromeos::ConciergeClient::Get()->StartTerminaVm(
+  ash::ConciergeClient::Get()->StartTerminaVm(
       std::move(request), base::BindOnce(&StartBorealisVm::OnStartBorealisVm,
                                          weak_factory_.GetWeakPtr(), context));
 }
diff --git a/chrome/browser/ash/borealis/testing/dbus.cc b/chrome/browser/ash/borealis/testing/dbus.cc
index b14ee6b..9258f04 100644
--- a/chrome/browser/ash/borealis/testing/dbus.cc
+++ b/chrome/browser/ash/borealis/testing/dbus.cc
@@ -62,15 +62,15 @@
 
 FakeConciergeHelper::FakeConciergeHelper(FakeCiceroneHelper* cicerone_helper) {
   DCHECK(cicerone_helper);
-  chromeos::ConciergeClient::InitializeFake();
+  ash::ConciergeClient::InitializeFake();
 }
 
 FakeConciergeHelper::~FakeConciergeHelper() {
-  chromeos::ConciergeClient::Shutdown();
+  ash::ConciergeClient::Shutdown();
 }
 
-chromeos::FakeConciergeClient* FakeConciergeHelper::FakeConciergeClient() {
-  return chromeos::FakeConciergeClient::Get();
+ash::FakeConciergeClient* FakeConciergeHelper::FakeConciergeClient() {
+  return ash::FakeConciergeClient::Get();
 }
 
 FakeVmServicesHelper::FakeVmServicesHelper()
diff --git a/chrome/browser/ash/borealis/testing/dbus.h b/chrome/browser/ash/borealis/testing/dbus.h
index 54627be2..ee657af 100644
--- a/chrome/browser/ash/borealis/testing/dbus.h
+++ b/chrome/browser/ash/borealis/testing/dbus.h
@@ -6,12 +6,12 @@
 #define CHROME_BROWSER_ASH_BOREALIS_TESTING_DBUS_H_
 
 namespace ash {
+class FakeConciergeClient;
 class FakeSeneschalClient;
-}
+}  // namespace ash
 
 namespace chromeos {
 class FakeCiceroneClient;
-class FakeConciergeClient;
 class FakeDlcserviceClient;
 }  // namespace chromeos
 
@@ -55,7 +55,7 @@
   ~FakeConciergeHelper();
 
   // Returns a handle to the dbus fake for concierge.
-  chromeos::FakeConciergeClient* FakeConciergeClient();
+  ash::FakeConciergeClient* FakeConciergeClient();
 };
 
 class FakeVmServicesHelper : public BasicDBusHelper,
diff --git a/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator_unittest.cc b/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator_unittest.cc
index de4bb698..4c683ef92 100644
--- a/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator_unittest.cc
+++ b/chrome/browser/ash/cert_provisioning/cert_provisioning_invalidator_unittest.cc
@@ -76,12 +76,12 @@
   }
 
   bool IsInvalidationSent(const invalidation::Invalidation& invalidation) {
-    return !invalidation_service_.GetMockAckHandler()->IsUnsent(invalidation);
+    return !invalidation_service_.GetFakeAckHandler()->IsUnsent(invalidation);
   }
 
   bool IsInvalidationAcknowledged(
       const invalidation::Invalidation& invalidation) {
-    return invalidation_service_.GetMockAckHandler()->IsAcknowledged(
+    return invalidation_service_.GetFakeAckHandler()->IsAcknowledged(
         invalidation);
   }
 
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util.cc b/chrome/browser/ash/crosapi/browser_data_migrator_util.cc
index 4d52fd1..1f43c529 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util.cc
@@ -627,9 +627,9 @@
 }
 
 // Given a key in Sync Data's leveldb, return true if (based on its prefix) its
-// data type is to be migrated to Lacros, false otherwise.
-bool IsLacrosSyncDataType(base::StringPiece key) {
-  for (auto type : kLacrosSyncDataTypes) {
+// data type has to stay in Ash and Ash only, false otherwise.
+bool IsAshOnlySyncDataType(base::StringPiece key) {
+  for (auto type : kAshOnlySyncDataTypes) {
     if ((base::StartsWith(key, FormatDataPrefix(type)) ||
          base::StartsWith(key, FormatMetaPrefix(type)) ||
          key == FormatGlobalMetadataKey(type))) {
@@ -775,12 +775,10 @@
       return false;
     }
 
-    // TODO(andreaorru): decide whether copy is better in some cases (e.g. user
-    // consents).
-    if (IsLacrosSyncDataType(key))
-      lacros_write_batch.Put(key, value);
-    else
+    if (IsAshOnlySyncDataType(key))
       ash_write_batch.Put(key, value);
+    else
+      lacros_write_batch.Put(key, value);
   }
 
   // Write everything in bulk.
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util.h b/chrome/browser/ash/crosapi/browser_data_migrator_util.h
index bd8d454c..d76ab62 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util.h
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util.h
@@ -289,13 +289,18 @@
     "sync.cache_guid",
 };
 
-// List of data types in Sync Data that have to be migrated to Lacros.
-// TODO(andreaorru): fill this in with the complete list.
-static_assert(38 == syncer::GetNumModelTypes(),
-              "If adding a new sync data type, update the list below below if"
-              " you want to migrate the new data type to Lacros.");
-constexpr syncer::ModelType kLacrosSyncDataTypes[] = {
-    syncer::ModelType::WEB_APPS,
+// List of data types in Sync Data that have to stay in Ash and Ash only.
+static_assert(39 == syncer::GetNumModelTypes(),
+              "If adding a new sync data type, update the lists below if"
+              " you want to keep the new data type in Ash only.");
+constexpr syncer::ModelType kAshOnlySyncDataTypes[] = {
+    syncer::ModelType::APP_LIST,
+    syncer::ModelType::ARC_PACKAGE,
+    syncer::ModelType::OS_PREFERENCES,
+    syncer::ModelType::OS_PRIORITY_PREFERENCES,
+    syncer::ModelType::PRINTERS,
+    syncer::ModelType::WIFI_CONFIGURATIONS,
+    syncer::ModelType::WORKSPACE_DESK,
 };
 
 constexpr char kTotalSize[] = "Ash.UserDataStatsRecorder.DataSize.TotalSize";
diff --git a/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc b/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc
index 96fdccd..a7baa380 100644
--- a/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_data_migrator_util_unittest.cc
@@ -8,6 +8,7 @@
 
 #include <map>
 
+#include "base/containers/contains.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -38,7 +39,12 @@
 constexpr char kTextFileContent[] = "Hello, World!";
 constexpr int kTextFileSize = sizeof(kTextFileContent);
 constexpr char kMoveExtensionId[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
-constexpr syncer::ModelType kAshSyncDataType = syncer::ModelType::UNSPECIFIED;
+
+constexpr syncer::ModelType kAshSyncDataType =
+    browser_data_migrator_util::kAshOnlySyncDataTypes[0];
+constexpr syncer::ModelType kLacrosSyncDataType = syncer::ModelType::WEB_APPS;
+static_assert(!base::Contains(browser_data_migrator_util::kAshOnlySyncDataTypes,
+                              kLacrosSyncDataType));
 
 struct TargetItemComparator {
   bool operator()(const TargetItem& t1, const TargetItem& t2) const {
@@ -142,16 +148,6 @@
   ASSERT_TRUE(status.ok());
 
   leveldb::WriteBatch batch;
-  const syncer::ModelType lacros_dt =
-      browser_data_migrator_util::kLacrosSyncDataTypes[0];
-
-  batch.Put(syncer::FormatDataPrefix(lacros_dt) + kMoveExtensionId,
-            "lacros_data");
-  batch.Put(syncer::FormatMetaPrefix(lacros_dt) + kMoveExtensionId,
-            "lacros_metadata");
-  batch.Put(syncer::FormatGlobalMetadataKey(lacros_dt),
-            "lacros_globalmetadata");
-
   batch.Put(syncer::FormatDataPrefix(kAshSyncDataType) + kMoveExtensionId,
             "ash_data");
   batch.Put(syncer::FormatMetaPrefix(kAshSyncDataType) + kMoveExtensionId,
@@ -159,6 +155,13 @@
   batch.Put(syncer::FormatGlobalMetadataKey(kAshSyncDataType),
             "ash_globalmetadata");
 
+  batch.Put(syncer::FormatDataPrefix(kLacrosSyncDataType) + kMoveExtensionId,
+            "lacros_data");
+  batch.Put(syncer::FormatMetaPrefix(kLacrosSyncDataType) + kMoveExtensionId,
+            "lacros_metadata");
+  batch.Put(syncer::FormatGlobalMetadataKey(kLacrosSyncDataType),
+            "lacros_globalmetadata");
+
   leveldb::WriteOptions write_options;
   write_options.sync = true;
   status = db->Write(write_options, &batch);
@@ -447,13 +450,13 @@
 
   // Check resulting Lacros database.
   auto lacros_db_map = ReadLevelDB(lacros_db_path);
-  const syncer::ModelType lacros_dt =
-      browser_data_migrator_util::kLacrosSyncDataTypes[0];
   std::map<std::string, std::string> expected_lacros_db_map = {
-      {syncer::FormatDataPrefix(lacros_dt) + kMoveExtensionId, "lacros_data"},
-      {syncer::FormatMetaPrefix(lacros_dt) + kMoveExtensionId,
+      {syncer::FormatDataPrefix(kLacrosSyncDataType) + kMoveExtensionId,
+       "lacros_data"},
+      {syncer::FormatMetaPrefix(kLacrosSyncDataType) + kMoveExtensionId,
        "lacros_metadata"},
-      {syncer::FormatGlobalMetadataKey(lacros_dt), "lacros_globalmetadata"},
+      {syncer::FormatGlobalMetadataKey(kLacrosSyncDataType),
+       "lacros_globalmetadata"},
   };
   EXPECT_EQ(expected_lacros_db_map, lacros_db_map);
 }
diff --git a/chrome/browser/ash/crosapi/move_migrator_unittest.cc b/chrome/browser/ash/crosapi/move_migrator_unittest.cc
index f7b44d2..8a1d0748 100644
--- a/chrome/browser/ash/crosapi/move_migrator_unittest.cc
+++ b/chrome/browser/ash/crosapi/move_migrator_unittest.cc
@@ -54,7 +54,11 @@
 // included in `kExtensionsAshOnly`.
 constexpr char kMoveExtensionId[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
 
-constexpr syncer::ModelType kAshSyncDataType = syncer::ModelType::UNSPECIFIED;
+constexpr syncer::ModelType kAshSyncDataType =
+    browser_data_migrator_util::kAshOnlySyncDataTypes[0];
+constexpr syncer::ModelType kLacrosSyncDataType = syncer::ModelType::WEB_APPS;
+static_assert(!base::Contains(browser_data_migrator_util::kAshOnlySyncDataTypes,
+                              kLacrosSyncDataType));
 
 constexpr int64_t kRequiredDiskSpaceForBot =
     browser_data_migrator_util::kBuffer * 2;
@@ -264,9 +268,6 @@
   ASSERT_TRUE(status.ok());
 
   leveldb::WriteBatch batch;
-  const syncer::ModelType lacros_dt =
-      browser_data_migrator_util::kLacrosSyncDataTypes[0];
-
   if (ash) {
     batch.Put(syncer::FormatDataPrefix(kAshSyncDataType) + kMoveExtensionId,
               "ash_data");
@@ -276,11 +277,11 @@
               "ash_globalmetadata");
   }
   if (lacros) {
-    batch.Put(syncer::FormatDataPrefix(lacros_dt) + kMoveExtensionId,
+    batch.Put(syncer::FormatDataPrefix(kLacrosSyncDataType) + kMoveExtensionId,
               "lacros_data");
-    batch.Put(syncer::FormatMetaPrefix(lacros_dt) + kMoveExtensionId,
+    batch.Put(syncer::FormatMetaPrefix(kLacrosSyncDataType) + kMoveExtensionId,
               "lacros_metadata");
-    batch.Put(syncer::FormatGlobalMetadataKey(lacros_dt),
+    batch.Put(syncer::FormatGlobalMetadataKey(kLacrosSyncDataType),
               "lacros_globalmetadata");
   }
 
diff --git a/chrome/browser/ash/crostini/ansible/ansible_management_service_unittest.cc b/chrome/browser/ash/crostini/ansible/ansible_management_service_unittest.cc
index dc037b1d..2eabd210 100644
--- a/chrome/browser/ash/crostini/ansible/ansible_management_service_unittest.cc
+++ b/chrome/browser/ash/crostini/ansible/ansible_management_service_unittest.cc
@@ -36,7 +36,7 @@
   AnsibleManagementServiceTest() {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     profile_ = std::make_unique<TestingProfile>();
@@ -66,7 +66,7 @@
     profile_.reset();
 
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/crostini/crostini_disk.cc b/chrome/browser/ash/crostini/crostini_disk.cc
index 541882f..3b31892 100644
--- a/chrome/browser/ash/crostini/crostini_disk.cc
+++ b/chrome/browser/ash/crostini/crostini_disk.cc
@@ -24,8 +24,8 @@
 using DiskImageStatus = vm_tools::concierge::DiskImageStatus;
 
 namespace {
-chromeos::ConciergeClient* GetConciergeClient() {
-  return chromeos::ConciergeClient::Get();
+ash::ConciergeClient* GetConciergeClient() {
+  return ash::ConciergeClient::Get();
 }
 
 std::string FormatBytes(const int64_t value) {
@@ -232,13 +232,13 @@
   return ticks;
 }
 
-class Observer : public chromeos::ConciergeClient::DiskImageObserver {
+class Observer : public ash::ConciergeClient::DiskImageObserver {
  public:
   Observer(std::string uuid, base::OnceCallback<void(bool)> callback)
       : uuid_(std::move(uuid)), callback_(std::move(callback)) {}
   ~Observer() override { GetConciergeClient()->RemoveDiskImageObserver(this); }
 
-  // chromeos::ConciergeClient::DiskImageObserver:
+  // ash::ConciergeClient::DiskImageObserver:
   void OnDiskImageProgress(
       const vm_tools::concierge::DiskImageStatusResponse& signal) override {
     if (signal.command_uuid() != uuid_ ||
diff --git a/chrome/browser/ash/crostini/crostini_disk_unittest.cc b/chrome/browser/ash/crostini/crostini_disk_unittest.cc
index 5dba2b3..a25f1ab 100644
--- a/chrome/browser/ash/crostini/crostini_disk_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_disk_unittest.cc
@@ -56,9 +56,9 @@
   CrostiniDiskTestDbus() {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
   }
 
   void SetUp() override {
@@ -72,7 +72,7 @@
     test_helper_.reset();
     profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -98,7 +98,7 @@
   Profile* profile() { return profile_.get(); }
 
   content::BrowserTaskEnvironment task_environment_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
 
   std::unique_ptr<TestingProfile> profile_;
   std::unique_ptr<CrostiniTestHelper> test_helper_;
diff --git a/chrome/browser/ash/crostini/crostini_export_import_unittest.cc b/chrome/browser/ash/crostini/crostini_export_import_unittest.cc
index 9816ed1..697b7d8 100644
--- a/chrome/browser/ash/crostini/crostini_export_import_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_export_import_unittest.cc
@@ -127,7 +127,7 @@
         custom_container_id_("MyVM", "MyContainer") {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     fake_seneschal_client_ = ash::FakeSeneschalClient::Get();
     fake_cicerone_client_ = chromeos::FakeCiceroneClient::Get();
@@ -138,7 +138,7 @@
 
   ~CrostiniExportImportTest() override {
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/crostini/crostini_installer_unittest.cc b/chrome/browser/ash/crostini/crostini_installer_unittest.cc
index c302672..f3322ba 100644
--- a/chrome/browser/ash/crostini/crostini_installer_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_installer_unittest.cc
@@ -63,17 +63,16 @@
     MOCK_METHOD0(OnCanceled, void());
   };
 
-  class WaitingFakeConciergeClient : public chromeos::FakeConciergeClient {
+  class WaitingFakeConciergeClient : public ash::FakeConciergeClient {
    public:
     explicit WaitingFakeConciergeClient(chromeos::FakeCiceroneClient* client)
-        : chromeos::FakeConciergeClient(client) {}
+        : ash::FakeConciergeClient(client) {}
 
     void StartTerminaVm(
         const vm_tools::concierge::StartVmRequest& request,
         chromeos::DBusMethodCallback<vm_tools::concierge::StartVmResponse>
             callback) override {
-      chromeos::FakeConciergeClient::StartTerminaVm(request,
-                                                    std::move(callback));
+      ash::FakeConciergeClient::StartTerminaVm(request, std::move(callback));
       if (quit_closure_) {
         base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
                                                       std::move(quit_closure_));
@@ -155,7 +154,7 @@
 
     ash::disks::MockDiskMountManager::Shutdown();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
     chromeos::DlcserviceClient::Shutdown();
diff --git a/chrome/browser/ash/crostini/crostini_low_disk_notification_unittest.cc b/chrome/browser/ash/crostini/crostini_low_disk_notification_unittest.cc
index 866e2cb1..0879c1b 100644
--- a/chrome/browser/ash/crostini/crostini_low_disk_notification_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_low_disk_notification_unittest.cc
@@ -40,7 +40,7 @@
     BrowserWithTestWindowTest::SetUp();
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     GetCrosSettingsHelper()->ReplaceDeviceSettingsProviderWithStub();
@@ -70,7 +70,7 @@
   void TearDown() override {
     low_disk_notification_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
     BrowserWithTestWindowTest::TearDown();
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc
index f11241d..93d666c 100644
--- a/chrome/browser/ash/crostini/crostini_manager.cc
+++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -90,8 +90,8 @@
   return chromeos::CiceroneClient::Get();
 }
 
-chromeos::ConciergeClient* GetConciergeClient() {
-  return chromeos::ConciergeClient::Get();
+ash::ConciergeClient* GetConciergeClient() {
+  return ash::ConciergeClient::Get();
 }
 
 chromeos::AnomalyDetectorClient* GetAnomalyDetectorClient() {
@@ -367,7 +367,7 @@
   if (!CrostiniFeatures::Get()->IsAllowedNow(profile_)) {
     LOG(ERROR) << "Crostini UI not allowed for profile "
                << profile_->GetProfileUserName();
-    std::move(completed_callback_).Run(CrostiniResult::NOT_ALLOWED);
+    FinishRestart(CrostiniResult::NOT_ALLOWED);
     return;
   }
 
diff --git a/chrome/browser/ash/crostini/crostini_manager.h b/chrome/browser/ash/crostini/crostini_manager.h
index b7195be..7522d505 100644
--- a/chrome/browser/ash/crostini/crostini_manager.h
+++ b/chrome/browser/ash/crostini/crostini_manager.h
@@ -154,8 +154,8 @@
 // only the Concierge name is exposed outside of here.
 class CrostiniManager : public KeyedService,
                         public chromeos::AnomalyDetectorClient::Observer,
-                        public chromeos::ConciergeClient::VmObserver,
-                        public chromeos::ConciergeClient::ContainerObserver,
+                        public ash::ConciergeClient::VmObserver,
+                        public ash::ConciergeClient::ContainerObserver,
                         public chromeos::CiceroneClient::Observer,
                         public chromeos::NetworkStateHandlerObserver,
                         public chromeos::PowerManagerClient::Observer {
diff --git a/chrome/browser/ash/crostini/crostini_manager_unittest.cc b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
index ada7980..1d2ce73 100644
--- a/chrome/browser/ash/crostini/crostini_manager_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_manager_unittest.cc
@@ -195,10 +195,10 @@
         browser_part_(g_browser_process->platform_part()) {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     fake_cicerone_client_ = chromeos::FakeCiceroneClient::Get();
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
     fake_anomaly_detector_client_ =
         static_cast<chromeos::FakeAnomalyDetectorClient*>(
             chromeos::DBusThreadManager::Get()->GetAnomalyDetectorClient());
@@ -209,7 +209,7 @@
 
   ~CrostiniManagerTest() override {
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -289,7 +289,7 @@
   }
 
   chromeos::FakeCiceroneClient* fake_cicerone_client_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
   // Owned by chromeos::DBusThreadManager
   chromeos::FakeAnomalyDetectorClient* fake_anomaly_detector_client_;
 
@@ -835,6 +835,21 @@
       "Crostini.SetUpLxdContainerUser.UnknownResult", false, 1);
 }
 
+TEST_F(CrostiniManagerRestartTest, CrostiniNotAllowed) {
+  FakeCrostiniFeatures crostini_features;
+  crostini_features.set_is_allowed_now(false);
+  restart_id_ = crostini_manager()->RestartCrostini(
+      container_id(),
+      base::BindOnce(&CrostiniManagerRestartTest::RestartCrostiniCallback,
+                     base::Unretained(this), run_loop()->QuitClosure()),
+      this);
+  run_loop()->Run();
+  ExpectCrostiniRestartResult(CrostiniResult::NOT_ALLOWED);
+  EXPECT_FALSE(crostini_manager()->IsRestartPending(restart_id_));
+  histogram_tester_.ExpectBucketCount("Crostini.RestarterResult",
+                                      CrostiniResult::NOT_ALLOWED, 1);
+}
+
 TEST_F(CrostiniManagerRestartTest, UncleanRestartReportsMetricToUncleanBucket) {
   crostini_manager()->SetUncleanStartupForTesting(true);
   restart_id_ = crostini_manager()->RestartCrostini(
diff --git a/chrome/browser/ash/crostini/crostini_package_notification_unittest.cc b/chrome/browser/ash/crostini/crostini_package_notification_unittest.cc
index b68544a..baeda96 100644
--- a/chrome/browser/ash/crostini/crostini_package_notification_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_package_notification_unittest.cc
@@ -36,7 +36,7 @@
   void SetUp() override {
     DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     task_environment_ = std::make_unique<content::BrowserTaskEnvironment>(
         base::test::TaskEnvironment::MainThreadType::UI,
@@ -55,7 +55,7 @@
     profile_.reset();
     task_environment_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/crostini/crostini_package_service_unittest.cc b/chrome/browser/ash/crostini/crostini_package_service_unittest.cc
index 5821169..96d30de1 100644
--- a/chrome/browser/ash/crostini/crostini_package_service_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_package_service_unittest.cc
@@ -44,11 +44,11 @@
 
 namespace {
 
+using ::ash::FakeConciergeClient;
 using ::ash::FakeSeneschalClient;
 using ::chromeos::DBusMethodCallback;
 using ::chromeos::DBusThreadManager;
 using ::chromeos::FakeCiceroneClient;
-using ::chromeos::FakeConciergeClient;
 using ::testing::_;
 using ::testing::Invoke;
 using ::testing::IsEmpty;
@@ -176,7 +176,7 @@
     DBusThreadManager::Initialize();
 
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     fake_cicerone_client_ = chromeos::FakeCiceroneClient::Get();
     ASSERT_TRUE(fake_cicerone_client_);
@@ -234,7 +234,7 @@
     profile_.reset();
     task_environment_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc b/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc
index 8bc80f7..3b291df1 100644
--- a/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc
@@ -45,7 +45,7 @@
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     chromeos::PermissionBrokerClient::InitializeFake();
     profile_ = std::make_unique<TestingProfile>();
@@ -68,7 +68,7 @@
     test_helper_.reset();
     profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc b/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc
index 945ce84a..48f4be00 100644
--- a/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_sshfs_unittest.cc
@@ -72,7 +72,7 @@
   CrostiniSshfsHelperTest() {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     profile_ = std::make_unique<TestingProfile>();
     crostini_test_helper_ =
@@ -92,7 +92,7 @@
     base::Base64Encode("privkey", &identity);
     default_mount_options_ = {"UserKnownHostsBase64=" + known_hosts,
                               "IdentityBase64=" + identity, "Port=2222"};
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
   }
 
   CrostiniSshfsHelperTest(const CrostiniSshfsHelperTest&) = delete;
@@ -108,7 +108,7 @@
     crostini_test_helper_.reset();
     profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -164,7 +164,7 @@
   std::unique_ptr<CrostiniTestHelper> crostini_test_helper_;
   const std::string kMountName = "crostini_test_termina_penguin";
   std::vector<std::string> default_mount_options_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
   std::unique_ptr<file_manager::VolumeManager> volume_manager_;
   std::unique_ptr<CrostiniSshfs> crostini_sshfs_;
   CrostiniManager* crostini_manager_;
diff --git a/chrome/browser/ash/crostini/crostini_upgrade_available_notification_unittest.cc b/chrome/browser/ash/crostini/crostini_upgrade_available_notification_unittest.cc
index 6b0aefa..59e35d0 100644
--- a/chrome/browser/ash/crostini/crostini_upgrade_available_notification_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_upgrade_available_notification_unittest.cc
@@ -53,7 +53,7 @@
     BrowserWithTestWindowTest::SetUp();
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
@@ -67,7 +67,7 @@
     display_service_.reset();
     BrowserWithTestWindowTest::TearDown();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/crostini/crostini_util_unittest.cc b/chrome/browser/ash/crostini/crostini_util_unittest.cc
index 81012c5..8bbf6b5 100644
--- a/chrome/browser/ash/crostini/crostini_util_unittest.cc
+++ b/chrome/browser/ash/crostini/crostini_util_unittest.cc
@@ -48,15 +48,15 @@
         browser_part_(g_browser_process->platform_part()) {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
   }
 
   ~CrostiniUtilTest() override {
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -96,7 +96,7 @@
   }
 
  protected:
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
 
   std::unique_ptr<base::RunLoop> run_loop_;
   std::unique_ptr<TestingProfile> profile_;
diff --git a/chrome/browser/ash/dbus/ash_dbus_helper.cc b/chrome/browser/ash/dbus/ash_dbus_helper.cc
index 8d67de8..d566968a 100644
--- a/chrome/browser/ash/dbus/ash_dbus_helper.cc
+++ b/chrome/browser/ash/dbus/ash_dbus_helper.cc
@@ -117,7 +117,7 @@
   InitializeDBusClient<chromeos::CdmFactoryDaemonClient>(bus);
   InitializeDBusClient<chromeos::CiceroneClient>(bus);
   // ConciergeClient depends on CiceroneClient.
-  InitializeDBusClient<chromeos::ConciergeClient>(bus);
+  InitializeDBusClient<ConciergeClient>(bus);
   InitializeDBusClient<chromeos::CrasAudioClient>(bus);
   InitializeDBusClient<cros_healthd::CrosHealthdClient>(bus);
   InitializeDBusClient<chromeos::CryptohomeMiscClient>(bus);
@@ -185,7 +185,7 @@
 
   if (ash::features::IsSnoopingProtectionEnabled() ||
       ash::features::IsQuickDimEnabled()) {
-    InitializeDBusClient<chromeos::HpsDBusClient>(bus);
+    InitializeDBusClient<chromeos::HumanPresenceDBusClient>(bus);
   }
 }
 
@@ -194,7 +194,7 @@
   // shut down in reverse order of initialization (in case of dependencies).
   if (ash::features::IsSnoopingProtectionEnabled() ||
       ash::features::IsQuickDimEnabled()) {
-    chromeos::HpsDBusClient::Shutdown();
+    chromeos::HumanPresenceDBusClient::Shutdown();
   }
   chromeos::WilcoDtcSupportdClient::Shutdown();
 #if BUILDFLAG(PLATFORM_CFM)
@@ -249,7 +249,7 @@
   chromeos::CryptohomeMiscClient::Shutdown();
   cros_healthd::CrosHealthdClient::Shutdown();
   chromeos::CrasAudioClient::Shutdown();
-  chromeos::ConciergeClient::Shutdown();
+  ConciergeClient::Shutdown();
   chromeos::CiceroneClient::Shutdown();
   chromeos::CdmFactoryDaemonClient::Shutdown();
   BiodClient::Shutdown();
diff --git a/chrome/browser/ash/dbus/fusebox_service_provider.cc b/chrome/browser/ash/dbus/fusebox_service_provider.cc
index 6765cd58..8dbdef9 100644
--- a/chrome/browser/ash/dbus/fusebox_service_provider.cc
+++ b/chrome/browser/ash/dbus/fusebox_service_provider.cc
@@ -13,6 +13,7 @@
 #include "ash/constants/ash_features.h"
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/task/bind_post_task.h"
@@ -306,11 +307,8 @@
 }  // namespace
 
 FuseBoxServiceProvider::OnCloseCallbackTracker::OnCloseCallbackTracker(
-    base::OnceClosure on_close_callback)
-    : base::RefCountedDeleteOnSequence<
-          FuseBoxServiceProvider::OnCloseCallbackTracker>(
-          content::GetIOThreadTaskRunner({})),
-      on_close_callback_runner(std::move(on_close_callback)) {}
+    base::ScopedClosureRunner on_close_callback)
+    : on_close_callback_runner(std::move(on_close_callback)) {}
 
 FuseBoxServiceProvider::OnCloseCallbackTracker::~OnCloseCallbackTracker() =
     default;
@@ -428,7 +426,7 @@
     dbus::MethodCall* method_call,
     dbus::ExportedObject::ResponseSender sender,
     base::File file,
-    base::OnceClosure on_close_callback) {
+    base::ScopedClosureRunner on_close_callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   uint64_t cookie = next_tracker_key_++;
diff --git a/chrome/browser/ash/dbus/fusebox_service_provider.h b/chrome/browser/ash/dbus/fusebox_service_provider.h
index 0d09262..0d136d0 100644
--- a/chrome/browser/ash/dbus/fusebox_service_provider.h
+++ b/chrome/browser/ash/dbus/fusebox_service_provider.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_ASH_DBUS_FUSEBOX_SERVICE_PROVIDER_H_
 #define CHROME_BROWSER_ASH_DBUS_FUSEBOX_SERVICE_PROVIDER_H_
 
+#include "base/callback_helpers.h"
 #include "base/containers/flat_map.h"
 #include "base/files/file.h"
 #include "base/memory/ref_counted_delete_on_sequence.h"
@@ -36,20 +37,19 @@
   // which we are the fusebox::kFuseBoxServiceInterface server.
   //
   // This struct tracks when the underlying FD is closed in both client and
-  // server. When its ref-count hits zero, the on_close_callback_runner
-  // destructor will run the on_close_calback and the "Sequence" in
-  // "RefCountedDeleteOnSequence" means that this happens on the IO thread.
+  // server. When its ref-count hits zero, on_close_callback_runner will run.
   class OnCloseCallbackTracker
-      : public base::RefCountedDeleteOnSequence<OnCloseCallbackTracker> {
+      : public base::RefCounted<OnCloseCallbackTracker> {
    public:
-    explicit OnCloseCallbackTracker(base::OnceClosure on_close_callback);
+    explicit OnCloseCallbackTracker(
+        base::ScopedClosureRunner on_close_callback);
     OnCloseCallbackTracker(const OnCloseCallbackTracker&) = delete;
     OnCloseCallbackTracker& operator=(const OnCloseCallbackTracker&) = delete;
 
    private:
     ~OnCloseCallbackTracker();
     friend class base::DeleteHelper<OnCloseCallbackTracker>;
-    friend class base::RefCountedDeleteOnSequence<OnCloseCallbackTracker>;
+    friend class base::RefCounted<OnCloseCallbackTracker>;
 
     base::ScopedClosureRunner on_close_callback_runner;
   };
@@ -78,7 +78,7 @@
                           dbus::MethodCall* method_call,
                           dbus::ExportedObject::ResponseSender sender,
                           base::File file,
-                          base::OnceClosure on_close_callback);
+                          base::ScopedClosureRunner on_close_callback);
 
   // base::WeakPtr{this} factory.
   base::WeakPtrFactory<FuseBoxServiceProvider> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/exo/chrome_data_exchange_delegate_unittest.cc b/chrome/browser/ash/exo/chrome_data_exchange_delegate_unittest.cc
index 04b26de..99bedf3 100644
--- a/chrome/browser/ash/exo/chrome_data_exchange_delegate_unittest.cc
+++ b/chrome/browser/ash/exo/chrome_data_exchange_delegate_unittest.cc
@@ -74,7 +74,7 @@
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ConciergeClient::InitializeFake();
     SeneschalClient::InitializeFake();
 
     profile_ = std::make_unique<TestingProfile>();
@@ -118,7 +118,7 @@
     test_helper_.reset();
     profile_.reset();
     SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index 9a11e84..165092d 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -428,9 +428,13 @@
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     OpenVideoMediaApp, /* open_video_media_app.js */
     FilesAppBrowserTest,
-    ::testing::Values(TestCase("videoOpenDownloads").MediaSwa().InGuestMode(),
-                      TestCase("videoOpenDownloads").MediaSwa(),
-                      TestCase("videoOpenDrive").MediaSwa()));
+    ::testing::Values(
+        TestCase("videoOpenDownloads").MediaSwa().InGuestMode(),
+        TestCase("videoOpenDownloads").MediaSwa().InGuestMode().FilesSwa(),
+        TestCase("videoOpenDownloads").MediaSwa().FilesSwa(),
+        TestCase("videoOpenDownloads").MediaSwa(),
+        TestCase("videoOpenDrive").MediaSwa(),
+        TestCase("videoOpenDrive").MediaSwa().FilesSwa()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     OpenAudioMediaApp, /* open_audio_media_app.js */
@@ -444,8 +448,14 @@
     FilesAppBrowserTest,
     ::testing::Values(
         TestCase("imageOpenMediaAppDownloads").MediaSwa().InGuestMode(),
+        TestCase("imageOpenMediaAppDownloads")
+            .MediaSwa()
+            .InGuestMode()
+            .FilesSwa(),
         TestCase("imageOpenMediaAppDownloads").MediaSwa(),
-        TestCase("imageOpenMediaAppDrive").MediaSwa()));
+        TestCase("imageOpenMediaAppDownloads").MediaSwa().FilesSwa(),
+        TestCase("imageOpenMediaAppDrive").MediaSwa(),
+        TestCase("imageOpenMediaAppDrive").MediaSwa().FilesSwa()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     OpenSniffedFiles, /* open_sniffed_files.js */
@@ -888,17 +898,29 @@
     FilesAppBrowserTest,
     ::testing::Values(
         TestCase("directoryTreeActiveDirectory"),
+        TestCase("directoryTreeActiveDirectory").FilesSwa(),
         TestCase("directoryTreeSelectedDirectory"),
+        TestCase("directoryTreeSelectedDirectory").FilesSwa(),
         TestCase("directoryTreeRecentsSubtypeScroll"),
+        // TODO(b/189173190): Enable
+        // TestCase("directoryTreeRecentsSubtypeScroll").FilesSwa(),
         TestCase("directoryTreeHorizontalScroll"),
+        TestCase("directoryTreeHorizontalScroll").FilesSwa(),
         TestCase("directoryTreeExpandHorizontalScroll"),
+        TestCase("directoryTreeExpandHorizontalScroll").FilesSwa(),
         TestCase("directoryTreeExpandHorizontalScrollRTL"),
+        TestCase("directoryTreeExpandHorizontalScrollRTL").FilesSwa(),
         TestCase("directoryTreeVerticalScroll"),
+        TestCase("directoryTreeVerticalScroll").FilesSwa(),
         TestCase("directoryTreeExpandFolder"),
+        TestCase("directoryTreeExpandFolder").FilesSwa(),
         TestCase(
             "directoryTreeExpandFolderWithHiddenFileAndShowHiddenFilesOff"),
-        TestCase(
-            "directoryTreeExpandFolderWithHiddenFileAndShowHiddenFilesOn")));
+        TestCase("directoryTreeExpandFolderWithHiddenFileAndShowHiddenFilesOff")
+            .FilesSwa(),
+        TestCase("directoryTreeExpandFolderWithHiddenFileAndShowHiddenFilesOn"),
+        TestCase("directoryTreeExpandFolderWithHiddenFileAndShowHiddenFilesOn")
+            .FilesSwa()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     DirectoryTreeContextMenu, /* directory_tree_context_menu.js */
@@ -1037,32 +1059,65 @@
     FilesAppBrowserTest,
     ::testing::Values(
         TestCase("driveOpenSidebarOffline").EnableGenericDocumentsProvider(),
+        TestCase("driveOpenSidebarOffline")
+            .EnableGenericDocumentsProvider()
+            .FilesSwa(),
         TestCase("driveOpenSidebarSharedWithMe"),
+        TestCase("driveOpenSidebarSharedWithMe").FilesSwa(),
         TestCase("driveAutoCompleteQuery"),
+        TestCase("driveAutoCompleteQuery").FilesSwa(),
         TestCase("drivePinMultiple"),
+        TestCase("drivePinMultiple").FilesSwa(),
         TestCase("drivePinHosted"),
+        TestCase("drivePinHosted").FilesSwa(),
         TestCase("drivePinFileMobileNetwork"),
+        // TODO(b/189173190): Enable
+        // TestCase("drivePinFileMobileNetwork").FilesSwa(),
         TestCase("drivePinToggleUpdatesInFakeEntries"),
+        TestCase("drivePinToggleUpdatesInFakeEntries").FilesSwa(),
         TestCase("driveClickFirstSearchResult"),
+        TestCase("driveClickFirstSearchResult").FilesSwa(),
         TestCase("drivePressEnterToSearch"),
+        TestCase("drivePressEnterToSearch").FilesSwa(),
         TestCase("drivePressClearSearch"),
         TestCase("drivePressClearSearch").FilesSwa(),
         TestCase("drivePressCtrlAFromSearch"),
+        TestCase("drivePressCtrlAFromSearch").FilesSwa(),
         TestCase("driveBackupPhotos"),
         TestCase("driveBackupPhotos").EnableSinglePartitionFormat(),
         TestCase("driveAvailableOfflineGearMenu"),
+        TestCase("driveAvailableOfflineGearMenu").FilesSwa(),
         TestCase("driveAvailableOfflineDirectoryGearMenu"),
+        TestCase("driveAvailableOfflineDirectoryGearMenu").FilesSwa(),
         TestCase("driveAvailableOfflineActionBar"),
+        TestCase("driveAvailableOfflineActionBar").FilesSwa(),
         TestCase("driveLinkToDirectory"),
+        TestCase("driveLinkToDirectory").FilesSwa(),
         TestCase("driveLinkOpenFileThroughLinkedDirectory").MediaSwa(),
+        TestCase("driveLinkOpenFileThroughLinkedDirectory")
+            .MediaSwa()
+            .FilesSwa(),
         TestCase("driveLinkOpenFileThroughTransitiveLink").MediaSwa(),
         TestCase("driveWelcomeBanner"),
         TestCase("driveOfflineInfoBanner").EnableDriveDssPin(),
         TestCase("driveOfflineInfoBannerWithoutFlag"),
+        TestCase("driveLinkOpenFileThroughTransitiveLink")
+            .MediaSwa()
+            .FilesSwa(),
         TestCase("driveEnableDocsOfflineDialog"),
+        // TODO(b/189173190): Enable
+        // TestCase("driveEnableDocsOfflineDialog").FilesSwa(),
         TestCase("driveEnableDocsOfflineDialogWithoutWindow"),
+        // TODO(b/189173190): Enable
+        // TestCase("driveEnableDocsOfflineDialogWithoutWindow").FilesSwa(),
         TestCase("driveEnableDocsOfflineDialogMultipleWindows"),
-        TestCase("driveEnableDocsOfflineDialogDisappearsOnUnmount")));
+        // TODO(b/189173190): Enable
+        // TestCase("driveEnableDocsOfflineDialogMultipleWindows").FilesSwa(),
+        TestCase("driveEnableDocsOfflineDialogDisappearsOnUnmount")
+        // TODO(b/189173190): Enable
+        // TestCase("driveEnableDocsOfflineDialogDisappearsOnUnmount")
+        //     .FilesSwa()
+        ));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     HoldingSpace, /* holding_space.js */
@@ -1153,8 +1208,9 @@
         TestCase("transferDeletedFile"),
         TestCase("transferDeletedFile").FilesSwa(),
         TestCase("transferDeletedFile").EnableTrash(),
-        TestCase("transferDeletedFile").FilesSwa().EnableTrash(),
+        TestCase("transferDeletedFile").EnableTrash().FilesSwa(),
         TestCase("transferInfoIsRemembered"),
+        // TODO(b/189173190): Enable
         // TestCase("transferInfoIsRemembered").FilesSwa(),
         TestCase("transferToUsbHasDestinationText"),
         // TODO(lucmult): Re-enable this once SWA uses the feedback panel.
@@ -1167,8 +1223,8 @@
             .FilesSwa(),
         TestCase("transferUpdateSamePanelItem"),
         TestCase("transferUpdateSamePanelItem").FilesSwa(),
-        TestCase("transferShowPendingMessageForZeroRemainingTime").FilesSwa(),
-        TestCase("transferShowPendingMessageForZeroRemainingTime")));
+        TestCase("transferShowPendingMessageForZeroRemainingTime"),
+        TestCase("transferShowPendingMessageForZeroRemainingTime").FilesSwa()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Transfer, /* transfer.js */
@@ -1179,8 +1235,12 @@
     RestorePrefs, /* restore_prefs.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("restoreSortColumn").InGuestMode(),
+                      TestCase("restoreSortColumn").InGuestMode().FilesSwa(),
                       TestCase("restoreSortColumn"),
+                      TestCase("restoreSortColumn").FilesSwa(),
                       TestCase("restoreCurrentView").InGuestMode(),
+                      TestCase("restoreCurrentView").InGuestMode().FilesSwa(),
+                      TestCase("restoreCurrentView").FilesSwa(),
                       TestCase("restoreCurrentView")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
@@ -1194,53 +1254,86 @@
     ShareAndManageDialog, /* share_and_manage_dialog.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("shareFileDrive"),
+                      TestCase("shareFileDrive").FilesSwa(),
                       TestCase("shareDirectoryDrive"),
+                      TestCase("shareDirectoryDrive").FilesSwa(),
                       TestCase("shareHostedFileDrive"),
+                      TestCase("shareHostedFileDrive").FilesSwa(),
                       TestCase("manageHostedFileDrive"),
+                      TestCase("manageHostedFileDrive").FilesSwa(),
                       TestCase("manageFileDrive"),
+                      TestCase("manageFileDrive").FilesSwa(),
                       TestCase("manageDirectoryDrive"),
+                      TestCase("manageDirectoryDrive").FilesSwa(),
                       TestCase("shareFileTeamDrive"),
+                      TestCase("shareFileTeamDrive").FilesSwa(),
                       TestCase("shareDirectoryTeamDrive"),
+                      TestCase("shareDirectoryTeamDrive").FilesSwa(),
                       TestCase("shareHostedFileTeamDrive"),
+                      TestCase("shareHostedFileTeamDrive").FilesSwa(),
                       TestCase("shareTeamDrive"),
+                      TestCase("shareTeamDrive").FilesSwa(),
                       TestCase("manageHostedFileTeamDrive"),
+                      TestCase("manageHostedFileTeamDrive").FilesSwa(),
                       TestCase("manageFileTeamDrive"),
+                      TestCase("manageFileTeamDrive").FilesSwa(),
                       TestCase("manageDirectoryTeamDrive"),
+                      TestCase("manageDirectoryTeamDrive").FilesSwa(),
+                      TestCase("manageTeamDrive").FilesSwa(),
                       TestCase("manageTeamDrive")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Traverse, /* traverse.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("traverseDownloads").InGuestMode(),
+                      TestCase("traverseDownloads").InGuestMode().FilesSwa(),
                       TestCase("traverseDownloads"),
+                      TestCase("traverseDownloads").FilesSwa(),
+                      TestCase("traverseDrive").FilesSwa(),
                       TestCase("traverseDrive")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Tasks, /* tasks.js */
     FilesAppBrowserTest,
-    ::testing::Values(TestCase("executeDefaultTaskDownloads"),
-                      TestCase("executeDefaultTaskDownloads").InGuestMode(),
-                      TestCase("executeDefaultTaskDrive"),
-                      TestCase("defaultTaskForPdf"),
-                      TestCase("defaultTaskForTextPlain"),
-                      TestCase("defaultTaskDialogDownloads"),
-                      TestCase("defaultTaskDialogDownloads").InGuestMode(),
-                      TestCase("defaultTaskDialogDrive"),
-                      TestCase("changeDefaultDialogScrollList"),
-                      TestCase("genericTaskIsNotExecuted"),
-                      TestCase("genericTaskAndNonGenericTask"),
-                      TestCase("noActionBarOpenForDirectories")));
+    ::testing::Values(
+        TestCase("executeDefaultTaskDownloads"),
+        TestCase("executeDefaultTaskDownloads").FilesSwa(),
+        TestCase("executeDefaultTaskDownloads").InGuestMode(),
+        TestCase("executeDefaultTaskDownloads").InGuestMode().FilesSwa(),
+        TestCase("executeDefaultTaskDrive"),
+        TestCase("executeDefaultTaskDrive").FilesSwa(),
+        TestCase("defaultTaskForPdf"),
+        TestCase("defaultTaskForPdf").FilesSwa(),
+        TestCase("defaultTaskForTextPlain"),
+        TestCase("defaultTaskForTextPlain").FilesSwa(),
+        TestCase("defaultTaskDialogDownloads"),
+        TestCase("defaultTaskDialogDownloads").FilesSwa(),
+        TestCase("defaultTaskDialogDownloads").InGuestMode(),
+        TestCase("defaultTaskDialogDownloads").InGuestMode().FilesSwa(),
+        TestCase("defaultTaskDialogDrive"),
+        TestCase("defaultTaskDialogDrive").FilesSwa(),
+        TestCase("changeDefaultDialogScrollList"),
+        TestCase("changeDefaultDialogScrollList").FilesSwa(),
+        TestCase("genericTaskIsNotExecuted"),
+        TestCase("genericTaskIsNotExecuted").FilesSwa(),
+        TestCase("genericTaskAndNonGenericTask"),
+        TestCase("genericTaskAndNonGenericTask").FilesSwa(),
+        TestCase("noActionBarOpenForDirectories").FilesSwa(),
+        TestCase("noActionBarOpenForDirectories")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     FolderShortcuts, /* folder_shortcuts.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("traverseFolderShortcuts"),
+                      TestCase("traverseFolderShortcuts").FilesSwa(),
+                      TestCase("addRemoveFolderShortcuts").FilesSwa(),
                       TestCase("addRemoveFolderShortcuts")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     SortColumns, /* sort_columns.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("sortColumns"),
+                      TestCase("sortColumns").FilesSwa(),
                       TestCase("sortColumns").InGuestMode()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
@@ -1248,12 +1341,24 @@
     FilesAppBrowserTest,
     ::testing::Values(
         TestCase("tabindexSearchBoxFocus"),
+        TestCase("tabindexSearchBoxFocus").FilesSwa(),
         TestCase("tabindexFocus"),
+        TestCase("tabindexFocus").FilesSwa(),
         TestCase("tabindexFocusDownloads"),
+        TestCase("tabindexFocusDownloads").FilesSwa(),
         TestCase("tabindexFocusDownloads").InGuestMode(),
+        TestCase("tabindexFocusDownloads").InGuestMode().FilesSwa(),
         TestCase("tabindexFocusDirectorySelected"),
+        TestCase("tabindexFocusDirectorySelected").FilesSwa(),
         TestCase("tabindexOpenDialogDownloads").WithBrowser(),
+        // TODO(b/189173190): Enable
+        // TestCase("tabindexOpenDialogDownloads").WithBrowser().FilesSwa(),
         TestCase("tabindexOpenDialogDownloads").WithBrowser().InGuestMode()
+        // TODO(b/189173190): Enable
+        // TestCase("tabindexOpenDialogDownloads")
+        //     .WithBrowser()
+        //     .InGuestMode()
+        //     .FilesSwa()
         // TODO(crbug.com/1236842): Remove flakiness and enable this test.
         //      ,
         //      TestCase("tabindexSaveFileDialogDrive").WithBrowser(),
@@ -1275,8 +1380,10 @@
             .InGuestMode()
             .FilesSwa(),
         TestCase("openFileDialogDownloads").WithBrowser().InIncognito(),
-        // TODO(b/194255793): Fix this.
-        // TestCase("openFileDialogDownloads").WithBrowser().InIncognito().FilesSwa(),
+        // TestCase("openFileDialogDownloads")
+        //     .WithBrowser()
+        //     .InIncognito()
+        //     .FilesSwa(),
         TestCase("openFileDialogPanelsDisabled").WithBrowser(),
         TestCase("openFileDialogPanelsDisabled").WithBrowser().FilesSwa(),
         TestCase("openFileDialogAriaMultipleSelect").WithBrowser(),
@@ -1301,6 +1408,10 @@
         // TestCase("saveFileDialogDownloadsNewFolderButton")
         //     .WithBrowser()
         //     .FilesSwa(),
+        TestCase("saveFileDialogDownloadsNewFolderButton").WithBrowser(),
+        TestCase("saveFileDialogDownloadsNewFolderButton")
+            .WithBrowser()
+            .FilesSwa(),
         TestCase("saveFileDialogPanelsDisabled").WithBrowser(),
         TestCase("saveFileDialogPanelsDisabled").WithBrowser().FilesSwa(),
         TestCase("openFileDialogCancelDownloads").WithBrowser(),
@@ -1391,68 +1502,103 @@
     CopyBetweenWindows, /* copy_between_windows.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("copyBetweenWindowsLocalToDrive"),
+                      TestCase("copyBetweenWindowsLocalToDrive").FilesSwa(),
                       TestCase("copyBetweenWindowsLocalToUsb"),
+                      // TODO(b/189173190): Enable
+                      // TestCase("copyBetweenWindowsLocalToUsb").FilesSwa(),
                       TestCase("copyBetweenWindowsUsbToDrive"),
+                      TestCase("copyBetweenWindowsUsbToDrive").FilesSwa(),
                       TestCase("copyBetweenWindowsDriveToLocal"),
+                      TestCase("copyBetweenWindowsDriveToLocal").FilesSwa(),
                       TestCase("copyBetweenWindowsDriveToUsb"),
+                      // TODO(b/189173190): Enable
+                      // TestCase("copyBetweenWindowsDriveToUsb").FilesSwa(),
+                      TestCase("copyBetweenWindowsUsbToLocal").FilesSwa(),
                       TestCase("copyBetweenWindowsUsbToLocal")));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     GridView, /* grid_view.js */
     FilesAppBrowserTest,
-    ::testing::Values(TestCase("showGridViewDownloads").InGuestMode(),
-                      TestCase("showGridViewDownloads"),
-                      TestCase("showGridViewDrive"),
-                      TestCase("showGridViewButtonSwitches"),
-                      TestCase("showGridViewButtonSwitches").FilesSwa(),
-                      TestCase("showGridViewKeyboardSelectionA11y"),
-                      TestCase("showGridViewTitles"),
-                      TestCase("showGridViewTitles").FilesSwa(),
-                      TestCase("showGridViewMouseSelectionA11y"),
-                      TestCase("showGridViewDocumentsProvider")
-                          .EnableGenericDocumentsProvider(),
-                      TestCase("showGridViewDocumentsProvider")
-                          .EnableGenericDocumentsProvider()
-                          .FilesSwa()));
+    ::testing::Values(
+        TestCase("showGridViewDownloads").InGuestMode(),
+        TestCase("showGridViewDownloads").InGuestMode().FilesSwa(),
+        TestCase("showGridViewDownloads"),
+        TestCase("showGridViewDownloads").FilesSwa(),
+        TestCase("showGridViewButtonSwitches"),
+        TestCase("showGridViewButtonSwitches").FilesSwa(),
+        TestCase("showGridViewKeyboardSelectionA11y"),
+        TestCase("showGridViewKeyboardSelectionA11y").FilesSwa(),
+        TestCase("showGridViewTitles"),
+        TestCase("showGridViewTitles").FilesSwa(),
+        TestCase("showGridViewMouseSelectionA11y"),
+        TestCase("showGridViewMouseSelectionA11y").FilesSwa(),
+        TestCase("showGridViewDocumentsProvider")
+            .EnableGenericDocumentsProvider(),
+        TestCase("showGridViewDocumentsProvider")
+            .EnableGenericDocumentsProvider()
+            .FilesSwa()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Providers, /* providers.js */
     ExtendedFilesAppBrowserTest,
     ::testing::Values(
         TestCase("requestMount"),
+        TestCase("requestMount").FilesSwa(),
         TestCase("requestMount").DisableNativeSmb(),
+        TestCase("requestMount").DisableNativeSmb().FilesSwa(),
         TestCase("requestMountMultipleMounts"),
+        TestCase("requestMountMultipleMounts").FilesSwa(),
         TestCase("requestMountMultipleMounts").DisableNativeSmb(),
+        TestCase("requestMountMultipleMounts").DisableNativeSmb().FilesSwa(),
         TestCase("requestMountSourceDevice"),
+        TestCase("requestMountSourceDevice").FilesSwa(),
         TestCase("requestMountSourceDevice").DisableNativeSmb(),
+        TestCase("requestMountSourceDevice").DisableNativeSmb().FilesSwa(),
         TestCase("requestMountSourceFile"),
+        TestCase("requestMountSourceFile").FilesSwa(),
         TestCase("requestMountSourceFile").DisableNativeSmb(),
+        TestCase("requestMountSourceFile").DisableNativeSmb().FilesSwa(),
         TestCase("providerEject"),
+        TestCase("providerEject").FilesSwa(),
         TestCase("providerEject").DisableNativeSmb(),
-        TestCase("deduplicatedUmaMetricForFileSystemProviders"),
-        TestCase("deduplicatedUmaMetricForFileSystemProviders").FilesSwa()));
+        TestCase("providerEject").DisableNativeSmb().FilesSwa()));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     GearMenu, /* gear_menu.js */
     FilesAppBrowserTest,
     ::testing::Values(
         TestCase("showHiddenFilesDownloads"),
+        TestCase("showHiddenFilesDownloads").FilesSwa(),
         TestCase("showHiddenFilesDownloads").InGuestMode(),
+        TestCase("showHiddenFilesDownloads").InGuestMode().FilesSwa(),
         TestCase("showHiddenFilesDrive"),
+        TestCase("showHiddenFilesDrive").FilesSwa(),
         TestCase("showPasteIntoCurrentFolder"),
+        TestCase("showPasteIntoCurrentFolder").FilesSwa(),
         TestCase("showSelectAllInCurrentFolder"),
+        TestCase("showSelectAllInCurrentFolder").FilesSwa(),
         TestCase("showToggleHiddenAndroidFoldersGearMenuItemsInMyFiles"),
+        TestCase("showToggleHiddenAndroidFoldersGearMenuItemsInMyFiles")
+            .FilesSwa(),
         TestCase("enableToggleHiddenAndroidFoldersShowsHiddenFiles"),
+        TestCase("enableToggleHiddenAndroidFoldersShowsHiddenFiles").FilesSwa(),
         TestCase("hideCurrentDirectoryByTogglingHiddenAndroidFolders"),
+        TestCase("hideCurrentDirectoryByTogglingHiddenAndroidFolders")
+            .FilesSwa(),
         TestCase("newFolderInDownloads"),
+        TestCase("newFolderInDownloads").FilesSwa(),
         TestCase("showSendFeedbackAction"),
         TestCase("showSendFeedbackAction").FilesSwa(),
         TestCase("enableDisableStorageSettingsLink"),
+        TestCase("enableDisableStorageSettingsLink").FilesSwa(),
         TestCase("showAvailableStorageMyFiles"),
+        TestCase("showAvailableStorageMyFiles").FilesSwa(),
         // Disabled until Drive quota can be properly displayed.
         // crbug.com/1177203
         // TestCase("showAvailableStorageDrive"),
+        // TestCase("showAvailableStorageDrive").FilesSwa(),
         TestCase("showAvailableStorageSmbfs"),
+        TestCase("showAvailableStorageSmbfs").FilesSwa(),
         TestCase("showAvailableStorageDocProvider")
             .EnableGenericDocumentsProvider(),
         TestCase("showAvailableStorageDocProvider")
@@ -1763,14 +1909,27 @@
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     Trash, /* trash.js */
     FilesAppBrowserTest,
-    ::testing::Values(TestCase("trashMoveToTrash").EnableTrash(),
-                      TestCase("trashPermanentlyDelete").EnableTrash(),
-                      TestCase("trashRestoreFromToast").EnableTrash(),
-                      TestCase("trashRestoreFromTrash").EnableTrash(),
-                      TestCase("trashRestoreFromTrashShortcut").EnableTrash(),
-                      TestCase("trashEmptyTrash").EnableTrash(),
-                      TestCase("trashEmptyTrashShortcut").EnableTrash(),
-                      TestCase("trashDeleteFromTrash").EnableTrash()));
+    ::testing::Values(
+        TestCase("trashMoveToTrash").EnableTrash(),
+        TestCase("trashMoveToTrash").EnableTrash().FilesSwa(),
+        TestCase("trashPermanentlyDelete").EnableTrash(),
+        TestCase("trashPermanentlyDelete").EnableTrash().FilesSwa(),
+        TestCase("trashRestoreFromToast").EnableTrash(),
+        TestCase("trashRestoreFromToast").EnableTrash().FilesSwa(),
+        TestCase("trashRestoreFromTrash").EnableTrash(),
+        TestCase("trashRestoreFromTrash").EnableTrash().FilesSwa(),
+        TestCase("trashRestoreFromTrashShortcut").EnableTrash(),
+        TestCase("trashRestoreFromTrashShortcut").EnableTrash().FilesSwa(),
+        TestCase("trashEmptyTrash").EnableTrash(),
+        // TODO(b/189173190): Enable
+        // TestCase("trashEmptyTrash").EnableTrash().FilesSwa(),
+        TestCase("trashEmptyTrashShortcut").EnableTrash(),
+        // TODO(b/189173190): Enable
+        // TestCase("trashEmptyTrashShortcut").EnableTrash().FilesSwa(),
+        TestCase("trashDeleteFromTrash").EnableTrash()
+        // TODO(b/189173190): Enable
+        // TestCase("trashDeleteFromTrash").EnableTrash().FilesSwa()
+        ));
 
 WRAPPED_INSTANTIATE_TEST_SUITE_P(
     AndroidPhotos, /* android_photos.js */
diff --git a/chrome/browser/ash/file_manager/file_tasks_unittest.cc b/chrome/browser/ash/file_manager/file_tasks_unittest.cc
index 4fcd823..3ec362f9 100644
--- a/chrome/browser/ash/file_manager/file_tasks_unittest.cc
+++ b/chrome/browser/ash/file_manager/file_tasks_unittest.cc
@@ -499,7 +499,7 @@
       : crostini_test_helper_(std::make_unique<crostini::CrostiniTestHelper>(
             test_profile_.get())),
         crostini_folder_(util::GetCrostiniMountDirectory(test_profile_.get())) {
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     vm_tools::apps::App text_app =
         crostini::CrostiniTestHelper::BasicApp("text_app");
@@ -542,7 +542,7 @@
   ~FileManagerFileTasksCrostiniTest() override {
     crostini_test_helper_.reset();
     test_profile_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
   }
 
   void SetUp() override {
diff --git a/chrome/browser/ash/file_manager/file_watcher_unittest.cc b/chrome/browser/ash/file_manager/file_watcher_unittest.cc
index 743fa87..c9ba5e7 100644
--- a/chrome/browser/ash/file_manager/file_watcher_unittest.cc
+++ b/chrome/browser/ash/file_manager/file_watcher_unittest.cc
@@ -37,13 +37,13 @@
       : task_environment_(content::BrowserTaskEnvironment::IO_MAINLOOP) {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
   }
 
   ~FileManagerFileWatcherTest() override {
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ash/file_manager/path_util_unittest.cc b/chrome/browser/ash/file_manager/path_util_unittest.cc
index 5050d2a..7b8784ce 100644
--- a/chrome/browser/ash/file_manager/path_util_unittest.cc
+++ b/chrome/browser/ash/file_manager/path_util_unittest.cc
@@ -325,7 +325,7 @@
   // Initialize DBUS and running container.
   chromeos::DBusThreadManager::Initialize();
   chromeos::CiceroneClient::InitializeFake();
-  chromeos::ConciergeClient::InitializeFake();
+  ash::ConciergeClient::InitializeFake();
   ash::SeneschalClient::InitializeFake();
 
   crostini::CrostiniManager* crostini_manager =
@@ -499,7 +499,7 @@
 
   profile_.reset();
   ash::SeneschalClient::Shutdown();
-  chromeos::ConciergeClient::Shutdown();
+  ash::ConciergeClient::Shutdown();
   chromeos::DBusThreadManager::Shutdown();
 }
 
@@ -808,7 +808,7 @@
 TEST_F(FileManagerPathUtilConvertUrlTest, ConvertPathToArcUrl_MyDriveArcvm) {
   chromeos::DBusThreadManager::Initialize();
   chromeos::CiceroneClient::InitializeFake();
-  chromeos::ConciergeClient::InitializeFake();
+  ash::ConciergeClient::InitializeFake();
   ash::SeneschalClient::InitializeFake();
 
   auto* command_line = base::CommandLine::ForCurrentProcess();
@@ -1122,6 +1122,7 @@
   volume_manager->RegisterMediaViewForTesting(arc::kAudioRootDocumentId);
   volume_manager->RegisterMediaViewForTesting(arc::kImagesRootDocumentId);
   volume_manager->RegisterMediaViewForTesting(arc::kVideosRootDocumentId);
+  volume_manager->RegisterMediaViewForTesting(arc::kDocumentsRootDocumentId);
 
   volume_manager->AddVolumeForTesting(
       Volume::CreateForDrive(base::FilePath("/mount_path/drive")));
@@ -1238,6 +1239,11 @@
            .Append("foo/bar")
            .value(),
        "Videos/foo/bar"},
+      {arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                          arc::kDocumentsRootDocumentId)
+           .Append("bar")
+           .value(),
+       "Documents/bar"},
       {
           "/mount_path/android",
           "My files/Play files",
diff --git a/chrome/browser/ash/file_manager/volume_manager.cc b/chrome/browser/ash/file_manager/volume_manager.cc
index ae1fa619..14756cc 100644
--- a/chrome/browser/ash/file_manager/volume_manager.cc
+++ b/chrome/browser/ash/file_manager/volume_manager.cc
@@ -235,6 +235,9 @@
   } else if (root_document_id == arc::kVideosRootDocumentId) {
     return l10n_util::GetStringUTF8(
         IDS_FILE_BROWSER_MEDIA_VIEW_VIDEOS_ROOT_LABEL);
+  } else if (root_document_id == arc::kDocumentsRootDocumentId) {
+    return l10n_util::GetStringUTF8(
+        IDS_FILE_BROWSER_MEDIA_VIEW_DOCUMENTS_ROOT_LABEL);
   }
   NOTREACHED();
   return "";
@@ -1268,6 +1271,7 @@
   if (enabled == arc_volumes_mounted_)
     return;
 
+  // Need to mount all roots declared in in arc_media_view_util.cc.
   if (enabled) {
     DoMountEvent(chromeos::MOUNT_ERROR_NONE,
                  Volume::CreateForMediaView(arc::kImagesRootDocumentId));
@@ -1275,6 +1279,8 @@
                  Volume::CreateForMediaView(arc::kVideosRootDocumentId));
     DoMountEvent(chromeos::MOUNT_ERROR_NONE,
                  Volume::CreateForMediaView(arc::kAudioRootDocumentId));
+    DoMountEvent(chromeos::MOUNT_ERROR_NONE,
+                 Volume::CreateForMediaView(arc::kDocumentsRootDocumentId));
     DoMountEvent(
         chromeos::MOUNT_ERROR_NONE,
         Volume::CreateForAndroidFiles(base::FilePath(util::kAndroidFilesPath)));
@@ -1286,6 +1292,8 @@
     DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
                    *Volume::CreateForMediaView(arc::kAudioRootDocumentId));
     DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
+                   *Volume::CreateForMediaView(arc::kDocumentsRootDocumentId));
+    DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
                    *Volume::CreateForAndroidFiles(
                        base::FilePath(util::kAndroidFilesPath)));
   }
diff --git a/chrome/browser/ash/file_manager/volume_manager_unittest.cc b/chrome/browser/ash/file_manager/volume_manager_unittest.cc
index 54ebc54..a8777dd 100644
--- a/chrome/browser/ash/file_manager/volume_manager_unittest.cc
+++ b/chrome/browser/ash/file_manager/volume_manager_unittest.cc
@@ -12,6 +12,10 @@
 #include <utility>
 #include <vector>
 
+#include "ash/components/arc/session/arc_bridge_service.h"
+#include "ash/components/arc/session/arc_service_manager.h"
+#include "ash/components/arc/test/connection_holder_util.h"
+#include "ash/components/arc/test/fake_file_system_instance.h"
 #include "ash/components/disks/disk.h"
 #include "ash/components/disks/disk_mount_manager.h"
 #include "base/bind.h"
@@ -21,11 +25,14 @@
 #include "base/ranges/algorithm.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_running_on_chromeos.h"
+#include "chrome/browser/ash/arc/fileapi/arc_file_system_operation_runner.h"
+#include "chrome/browser/ash/arc/fileapi/arc_media_view_util.h"
 #include "chrome/browser/ash/drive/file_system_util.h"
 #include "chrome/browser/ash/file_manager/fake_disk_mount_manager.h"
 #include "chrome/browser/ash/file_manager/volume_manager_observer.h"
 #include "chrome/browser/ash/file_system_provider/fake_extension_provider.h"
 #include "chrome/browser/ash/file_system_provider/service.h"
+#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
@@ -34,6 +41,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/storage_monitor/storage_info.h"
 #include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
 #include "content/public/test/browser_task_environment.h"
 #include "extensions/browser/extension_registry.h"
 #include "services/device/public/mojom/mtp_storage_info.mojom.h"
@@ -45,6 +53,11 @@
 using ::ash::disks::Disk;
 using ::ash::disks::DiskMountManager;
 
+std::vector<std::string> arc_volume_ids = {
+    arc::kImagesRootDocumentId, arc::kVideosRootDocumentId,
+    arc::kAudioRootDocumentId, arc::kDocumentsRootDocumentId,
+    "android_files:0"};
+
 class LoggingObserver : public VolumeManagerObserver {
  public:
   struct Event {
@@ -72,6 +85,9 @@
     // RENAME_COMPLETED, PARTITION_STARTED, PARTITION_COMPLETED.
     std::string device_label;
 
+    // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
+    std::string volume_id;
+
     // Available on DISK_ADDED.
     bool mounting;
 
@@ -127,6 +143,7 @@
     Event event;
     event.type = Event::VOLUME_MOUNTED;
     event.device_path = volume.source_path().AsUTF8Unsafe();
+    event.volume_id = volume.volume_id();
     event.mount_error = error_code;
     events_.push_back(event);
   }
@@ -136,6 +153,7 @@
     Event event;
     event.type = Event::VOLUME_UNMOUNTED;
     event.device_path = volume.source_path().AsUTF8Unsafe();
+    event.volume_id = volume.volume_id();
     event.mount_error = error_code;
     events_.push_back(event);
   }
@@ -221,14 +239,22 @@
 
 }  // namespace
 
+std::unique_ptr<KeyedService> CreateFileSystemOperationRunnerForTesting(
+    content::BrowserContext* context) {
+  return arc::ArcFileSystemOperationRunner::CreateForTesting(
+      context, arc::ArcServiceManager::Get()->arc_bridge_service());
+}
+
 class VolumeManagerTest : public testing::Test {
  protected:
   // Helper class that contains per-profile objects.
   class ProfileEnvironment {
    public:
     ProfileEnvironment(chromeos::PowerManagerClient* power_manager_client,
-                       DiskMountManager* disk_manager)
-        : profile_(std::make_unique<TestingProfile>()),
+                       DiskMountManager* disk_manager,
+                       std::unique_ptr<TestingProfile> profile =
+                           std::make_unique<TestingProfile>())
+        : profile_(std::move(profile)),
           extension_registry_(
               std::make_unique<extensions::ExtensionRegistry>(profile_.get())),
           file_system_provider_service_(
@@ -257,6 +283,15 @@
           &user_, profile_.get());
     }
 
+    void LoginUser() {
+      ash::ProfileHelper::Get()->SetAlwaysReturnPrimaryUserForTesting(true);
+      ash::FakeChromeUserManager* fake_user_manager =
+          static_cast<ash::FakeChromeUserManager*>(
+              user_manager::UserManager::Get());
+      fake_user_manager->AddUser(account_id_);
+      fake_user_manager->LoginUser(account_id_);
+    }
+
     ~ProfileEnvironment() {
       // In production, KeyedServices have Shutdown() called before destruction.
       volume_manager_->Shutdown();
@@ -284,19 +319,44 @@
   };
 
   void SetUp() override {
+    // Set up an Arc service manager with a fake file system. This must be done
+    // before initializing VolumeManager() to make its dependency
+    // DocumentsProviderRootManager work.
+    std::unique_ptr<TestingProfile> profile =
+        std::make_unique<TestingProfile>();
+    arc_service_manager_ = std::make_unique<arc::ArcServiceManager>();
+    arc_service_manager_->set_browser_context(profile.get());
+    arc::ArcFileSystemOperationRunner::GetFactory()->SetTestingFactoryAndUse(
+        profile.get(),
+        base::BindRepeating(&CreateFileSystemOperationRunnerForTesting));
+    arc_service_manager_->arc_bridge_service()->file_system()->SetInstance(
+        &file_system_instance_);
+    arc::WaitForInstanceReady(
+        arc_service_manager_->arc_bridge_service()->file_system());
+    ASSERT_TRUE(file_system_instance_.InitCalled());
+
     chromeos::PowerManagerClient::InitializeFake();
     disk_mount_manager_ = std::make_unique<FakeDiskMountManager>();
     main_profile_ = std::make_unique<ProfileEnvironment>(
-        chromeos::PowerManagerClient::Get(), disk_mount_manager_.get());
+        chromeos::PowerManagerClient::Get(), disk_mount_manager_.get(),
+        std::move(profile));
   }
 
   void TearDown() override {
     main_profile_.reset();
     disk_mount_manager_.reset();
+    arc_service_manager_->arc_bridge_service()->file_system()->CloseInstance(
+        &file_system_instance_);
     chromeos::PowerManagerClient::Shutdown();
     task_environment_.RunUntilIdle();
   }
 
+  void EnableArcForProfile() {
+    base::CommandLine::ForCurrentProcess()->InitFromArgv(
+        {"", "--arc-availability=officially-supported"});
+    main_profile_->LoginUser();
+  }
+
   Profile* profile() const { return main_profile_->profile(); }
   VolumeManager* volume_manager() const {
     return main_profile_->volume_manager();
@@ -305,6 +365,8 @@
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<FakeDiskMountManager> disk_mount_manager_;
   std::unique_ptr<ProfileEnvironment> main_profile_;
+  arc::FakeFileSystemInstance file_system_instance_;
+  std::unique_ptr<arc::ArcServiceManager> arc_service_manager_;
 };
 
 TEST_F(VolumeManagerTest, OnDriveFileSystemMountAndUnmount) {
@@ -1232,4 +1294,62 @@
   volume_manager()->RemoveObserver(&observer);
 }
 
+TEST_F(VolumeManagerTest, OnArcPlayStoreEnabledChanged_Enabled) {
+  // Setup to pass IsArcAllowedForProfile() DCHECK.
+  EnableArcForProfile();
+
+  LoggingObserver observer;
+  volume_manager()->AddObserver(&observer);
+
+  volume_manager()->OnArcPlayStoreEnabledChanged(true);
+
+  ASSERT_EQ(5U, observer.events().size());
+
+  unsigned index = 0;
+  for (const auto& event : observer.events()) {
+    EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
+    EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
+    if (index < 4) {
+      EXPECT_EQ(arc::GetMediaViewVolumeId(arc_volume_ids[index]),
+                event.volume_id);
+    } else {
+      EXPECT_EQ(arc_volume_ids[index], event.volume_id);
+    }
+    index++;
+  }
+
+  volume_manager()->RemoveObserver(&observer);
+}
+
+TEST_F(VolumeManagerTest, OnArcPlayStoreEnabledChanged_Disabled) {
+  // Setup to pass IsArcAllowedForProfile() DCHECK.
+  EnableArcForProfile();
+
+  // Need to enable it first before disabling it, otherwise
+  // it will be no-op.
+  volume_manager()->OnArcPlayStoreEnabledChanged(true);
+
+  LoggingObserver observer;
+  volume_manager()->AddObserver(&observer);
+
+  volume_manager()->OnArcPlayStoreEnabledChanged(false);
+
+  ASSERT_EQ(5U, observer.events().size());
+
+  unsigned index = 0;
+  for (const auto& event : observer.events()) {
+    EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
+    EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
+    if (index < 4) {
+      EXPECT_EQ(arc::GetMediaViewVolumeId(arc_volume_ids[index]),
+                event.volume_id);
+    } else {
+      EXPECT_EQ(arc_volume_ids[index], event.volume_id);
+    }
+    index++;
+  }
+
+  volume_manager()->RemoveObserver(&observer);
+}
+
 }  // namespace file_manager
diff --git a/chrome/browser/ash/guest_os/guest_os_registry_service_icon_browsertest.cc b/chrome/browser/ash/guest_os/guest_os_registry_service_icon_browsertest.cc
index 6855985..5af0553 100644
--- a/chrome/browser/ash/guest_os/guest_os_registry_service_icon_browsertest.cc
+++ b/chrome/browser/ash/guest_os/guest_os_registry_service_icon_browsertest.cc
@@ -31,7 +31,7 @@
   void SetUpInProcessBrowserTestFixture() override {
     InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     fake_cicerone_client_ = chromeos::FakeCiceroneClient::Get();
   }
@@ -39,7 +39,7 @@
   void TearDownInProcessBrowserTestFixture() override {
     service_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     InProcessBrowserTest::TearDownInProcessBrowserTestFixture();
   }
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
index 5313ec2..8cd164b2 100644
--- a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
+++ b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
@@ -225,10 +225,10 @@
         browser_part_(g_browser_process->platform_part()) {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
     fake_seneschal_client_ = ash::FakeSeneschalClient::Get();
   }
 
@@ -237,7 +237,7 @@
 
   ~GuestOsSharePathTest() override {
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -343,7 +343,7 @@
   std::unique_ptr<file_manager::Volume> volume_downloads_;
 
   ash::FakeSeneschalClient* fake_seneschal_client_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
 
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<base::RunLoop> run_loop_;
diff --git a/chrome/browser/ash/guest_os/guest_os_stability_monitor.cc b/chrome/browser/ash/guest_os/guest_os_stability_monitor.cc
index 1b39d44..1255ec1 100644
--- a/chrome/browser/ash/guest_os/guest_os_stability_monitor.cc
+++ b/chrome/browser/ash/guest_os/guest_os_stability_monitor.cc
@@ -15,7 +15,7 @@
       cicerone_observer_(this),
       seneschal_observer_(this),
       chunneld_observer_(this) {
-  auto* concierge_client = chromeos::ConciergeClient::Get();
+  auto* concierge_client = ash::ConciergeClient::Get();
   DCHECK(concierge_client);
   concierge_client->WaitForServiceToBeAvailable(
       base::BindOnce(&GuestOsStabilityMonitor::ConciergeStarted,
@@ -46,7 +46,7 @@
 void GuestOsStabilityMonitor::ConciergeStarted(bool is_available) {
   DCHECK(is_available);
 
-  auto* concierge_client = chromeos::ConciergeClient::Get();
+  auto* concierge_client = ash::ConciergeClient::Get();
   DCHECK(concierge_client);
   concierge_observer_.Observe(concierge_client);
 }
diff --git a/chrome/browser/ash/guest_os/guest_os_stability_monitor.h b/chrome/browser/ash/guest_os/guest_os_stability_monitor.h
index 2ba8d00..bc36a9e 100644
--- a/chrome/browser/ash/guest_os/guest_os_stability_monitor.h
+++ b/chrome/browser/ash/guest_os/guest_os_stability_monitor.h
@@ -53,7 +53,7 @@
 // Implementers should also listen for VmStopped events from concierge, and
 // call |LogUnexpectedVmShutdown| if any are considered unexpected.
 // Take care to ignore VMs owned by other implementers.
-class GuestOsStabilityMonitor : chromeos::ConciergeClient::Observer,
+class GuestOsStabilityMonitor : ash::ConciergeClient::Observer,
                                 chromeos::CiceroneClient::Observer,
                                 ash::SeneschalClient::Observer,
                                 chromeos::ChunneldClient::Observer {
@@ -71,7 +71,7 @@
   void SeneschalStarted(bool is_available);
   void ChunneldStarted(bool is_available);
 
-  //  chromeos::ConciergeClient::Observer::
+  //  ash::ConciergeClient::Observer::
   void ConciergeServiceStopped() override;
   void ConciergeServiceStarted() override;
 
@@ -89,8 +89,7 @@
 
  private:
   std::string histogram_;
-  base::ScopedObservation<chromeos::ConciergeClient,
-                          chromeos::ConciergeClient::Observer>
+  base::ScopedObservation<ash::ConciergeClient, ash::ConciergeClient::Observer>
       concierge_observer_;
   base::ScopedObservation<chromeos::CiceroneClient,
                           chromeos::CiceroneClient::Observer>
diff --git a/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc b/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc
index e8a9706..f1b425b 100644
--- a/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc
+++ b/chrome/browser/ash/guest_os/guest_os_stability_monitor_unittest.cc
@@ -32,7 +32,7 @@
   GuestOsStabilityMonitorTest() : task_env_() {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     // CrostiniManager will create a GuestOsStabilityMonitor for us.
@@ -56,7 +56,7 @@
     crostini_manager_.reset();
     profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -73,7 +73,7 @@
   }
 
   void SendVmStoppedSignal() {
-    auto* concierge_client = chromeos::FakeConciergeClient::Get();
+    auto* concierge_client = ash::FakeConciergeClient::Get();
 
     vm_tools::concierge::VmStoppedSignal signal;
     signal.set_name("termina");
@@ -90,7 +90,7 @@
 };
 
 TEST_F(GuestOsStabilityMonitorTest, ConciergeFailure) {
-  auto* concierge_client = chromeos::FakeConciergeClient::Get();
+  auto* concierge_client = ash::FakeConciergeClient::Get();
 
   concierge_client->NotifyConciergeStopped();
   histogram_tester_.ExpectUniqueSample(crostini::kCrostiniStabilityHistogram,
diff --git a/chrome/browser/ash/input_method/DIR_METADATA b/chrome/browser/ash/input_method/DIR_METADATA
new file mode 100644
index 0000000..caac77f
--- /dev/null
+++ b/chrome/browser/ash/input_method/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chrome/browser/ash/input_method/ui/DIR_METADATA b/chrome/browser/ash/input_method/ui/DIR_METADATA
deleted file mode 100644
index ca0e79f..0000000
--- a/chrome/browser/ash/input_method/ui/DIR_METADATA
+++ /dev/null
@@ -1,3 +0,0 @@
-monorail: {
-  component: "OS>Inputs"
-}
diff --git a/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc b/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc
index f9bd496..2e999add 100644
--- a/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc
+++ b/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc
@@ -153,7 +153,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     // Initialize command line so `ash::NoteTakingHelper` thinks note taking
     // on lock screen is enabled.
@@ -195,7 +195,7 @@
     arc_session_manager_.reset();
     extensions::ExtensionSystem::Get(profile())->Shutdown();
 
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc b/chrome/browser/ash/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
index c6752411..055f42c3d 100644
--- a/chrome/browser/ash/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
+++ b/chrome/browser/ash/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
@@ -225,7 +225,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
         extensions::switches::kAllowlistedExtensionID,
@@ -257,7 +257,7 @@
     ash::NoteTakingHelper::Shutdown();
     TestingBrowserProcess::GetGlobal()->SetProfileManager(nullptr);
 
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc
index c681932..3d5e1c33 100644
--- a/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc
+++ b/chrome/browser/ash/lock_screen_apps/state_controller_unittest.cc
@@ -397,7 +397,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     command_line_ = std::make_unique<base::test::ScopedCommandLine>();
     command_line_->GetProcessCommandLine()->InitFromArgv({""});
@@ -461,7 +461,7 @@
     app_window_.reset();
     BrowserWithTestWindowTest::TearDown();
     command_line_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/login/active_directory_login_browsertest.cc b/chrome/browser/ash/login/active_directory_login_browsertest.cc
index bc48fccb..62f2a81 100644
--- a/chrome/browser/ash/login/active_directory_login_browsertest.cc
+++ b/chrome/browser/ash/login/active_directory_login_browsertest.cc
@@ -9,6 +9,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "chrome/browser/ash/authpolicy/kerberos_files_handler.h"
 #include "chrome/browser/ash/login/test/active_directory_login_mixin.h"
 #include "chrome/browser/ash/login/test/device_state_mixin.h"
@@ -136,7 +137,13 @@
 }
 
 // Test different UI errors for Active Directory login.
-IN_PROC_BROWSER_TEST_F(ActiveDirectoryLoginTest, LoginErrors) {
+// TODO(1323271): Flakily times out with dbg or asan builds.
+#if !defined(NDEBUG) || defined(ADDRESS_SANITIZER)
+#define MAYBE_LoginErrors DISABLED_LoginErrors
+#else
+#define MAYBE_LoginErrors LoginErrors
+#endif
+IN_PROC_BROWSER_TEST_F(ActiveDirectoryLoginTest, MAYBE_LoginErrors) {
   ASSERT_TRUE(InstallAttributes::Get()->IsActiveDirectoryManaged());
   ad_login_.TestNoError();
   ad_login_.TestDomainHidden();
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc b/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc
index 1a488630..276729f6 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_test_helper.cc
@@ -28,7 +28,7 @@
   if (!DBusThreadManager::IsInitialized()) {
     DBusThreadManager::Initialize();
     dbus_thread_manager_initialized_ = true;
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
   }
 
   DemoSession::SetDemoConfigForTesting(DemoSession::DemoModeConfig::kNone);
@@ -43,7 +43,7 @@
 
 DemoModeTestHelper::~DemoModeTestHelper() {
   if (dbus_thread_manager_initialized_) {
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     DBusThreadManager::Shutdown();
   }
   DemoSession::ShutDownIfInitialized();
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
index fab54a7c..add381a0 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
@@ -68,7 +68,7 @@
   void SetUp() override {
     ASSERT_TRUE(profile_manager_->SetUp());
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     DemoSession::SetDemoConfigForTesting(DemoSession::DemoModeConfig::kOnline);
     InitializeCrosComponentManager();
     session_manager_ = std::make_unique<session_manager::SessionManager>();
@@ -82,7 +82,7 @@
     DemoSession::ResetDemoConfigForTesting();
 
     wallpaper_controller_client_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
 
     cros_component_manager_ = nullptr;
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
index 87de084..3f05926 100644
--- a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
@@ -1058,7 +1058,7 @@
   // Expect inactive "OK" button when entering the preference screen.
   test::OobeJS().ExpectDisabledPath(kDemoPreferencesNext);
   test::OobeJS().ExpectElementValue("N/A", kDemoPreferencesCountrySelect);
-  test::OobeJS().ClickOnPath(kDemoPreferencesNext);
+  // test::OobeJS().ClickOnPath(kDemoPreferencesNext);
 
   SelectFranceAndFinishSetup();
 }
@@ -1097,7 +1097,7 @@
   // Expect inactive "OK" button when entering the preference screen.
   test::OobeJS().ExpectDisabledPath(kDemoPreferencesNext);
   test::OobeJS().ExpectElementValue("N/A", kDemoPreferencesCountrySelect);
-  test::OobeJS().ClickOnPath(kDemoPreferencesNext);
+  // test::OobeJS().ClickOnPath(kDemoPreferencesNext);
 
   SelectFranceAndFinishSetup();
 }
diff --git a/chrome/browser/ash/login/screens/base_screen.cc b/chrome/browser/ash/login/screens/base_screen.cc
index f344656b..d43fed8 100644
--- a/chrome/browser/ash/login/screens/base_screen.cc
+++ b/chrome/browser/ash/login/screens/base_screen.cc
@@ -19,7 +19,7 @@
                        OobeScreenPriority screen_priority)
     : screen_id_(screen_id), screen_priority_(screen_priority) {}
 
-BaseScreen::~BaseScreen() {}
+BaseScreen::~BaseScreen() = default;
 
 void BaseScreen::Show(WizardContext* context) {
   wizard_context_ = context;
diff --git a/chrome/browser/ash/login/screens/demo_preferences_screen.cc b/chrome/browser/ash/login/screens/demo_preferences_screen.cc
index e530de26..eea6b0b 100644
--- a/chrome/browser/ash/login/screens/demo_preferences_screen.cc
+++ b/chrome/browser/ash/login/screens/demo_preferences_screen.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ash/login/screens/demo_preferences_screen.h"
 
+#include "base/memory/weak_ptr.h"
+#include "base/values.h"
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
 #include "chrome/browser/ash/login/screens/welcome_screen.h"
 #include "chrome/browser/browser_process.h"
@@ -18,6 +20,7 @@
 
 constexpr char kUserActionContinue[] = "continue-setup";
 constexpr char kUserActionClose[] = "close-setup";
+constexpr char kUserActionSetDemoModeCountry[] = "set-demo-mode-country";
 
 }  // namespace
 
@@ -32,15 +35,12 @@
 }
 
 DemoPreferencesScreen::DemoPreferencesScreen(
-    DemoPreferencesScreenView* view,
+    base::WeakPtr<DemoPreferencesScreenView> view,
     const ScreenExitCallback& exit_callback)
     : BaseScreen(DemoPreferencesScreenView::kScreenId,
                  OobeScreenPriority::DEFAULT),
-      view_(view),
+      view_(std::move(view)),
       exit_callback_(exit_callback) {
-  DCHECK(view_);
-  view_->Bind(this);
-
   // TODO(agawronska): Add tests for locale and input changes.
   input_method::InputMethodManager* input_manager =
       input_method::InputMethodManager::Get();
@@ -50,14 +50,6 @@
 
 DemoPreferencesScreen::~DemoPreferencesScreen() {
   input_method::InputMethodManager::Get()->RemoveObserver(this);
-
-  if (view_)
-    view_->Bind(nullptr);
-}
-
-void DemoPreferencesScreen::SetDemoModeCountry(const std::string& country_id) {
-  g_browser_process->local_state()->SetString(prefs::kDemoModeCountry,
-                                              country_id);
 }
 
 void DemoPreferencesScreen::ShowImpl() {
@@ -65,13 +57,10 @@
     view_->Show();
 }
 
-void DemoPreferencesScreen::HideImpl() {
-  if (view_)
-    view_->Hide();
-}
+void DemoPreferencesScreen::HideImpl() {}
 
-void DemoPreferencesScreen::OnUserActionDeprecated(
-    const std::string& action_id) {
+void DemoPreferencesScreen::OnUserAction(const base::Value::List& args) {
+  const std::string& action_id = args[0].GetString();
   if (action_id == kUserActionContinue) {
     std::string country(
         g_browser_process->local_state()->GetString(prefs::kDemoModeCountry));
@@ -81,16 +70,15 @@
     exit_callback_.Run(Result::COMPLETED);
   } else if (action_id == kUserActionClose) {
     exit_callback_.Run(Result::CANCELED);
+  } else if (action_id == kUserActionSetDemoModeCountry) {
+    CHECK_EQ(args.size(), 2);
+    g_browser_process->local_state()->SetString(prefs::kDemoModeCountry,
+                                                args[1].GetString());
   } else {
-    BaseScreen::OnUserActionDeprecated(action_id);
+    BaseScreen::OnUserAction(args);
   }
 }
 
-void DemoPreferencesScreen::OnViewDestroyed(DemoPreferencesScreenView* view) {
-  if (view_ == view)
-    view_ = nullptr;
-}
-
 void DemoPreferencesScreen::InputMethodChanged(
     input_method::InputMethodManager* manager,
     Profile* profile,
diff --git a/chrome/browser/ash/login/screens/demo_preferences_screen.h b/chrome/browser/ash/login/screens/demo_preferences_screen.h
index 1da4f31..d2e6bb70 100644
--- a/chrome/browser/ash/login/screens/demo_preferences_screen.h
+++ b/chrome/browser/ash/login/screens/demo_preferences_screen.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/callback.h"
+#include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "chrome/browser/ash/login/screens/base_screen.h"
 // TODO(https://crbug.com/1164001): move to forward declaration.
@@ -27,7 +28,7 @@
   static std::string GetResultString(Result result);
 
   using ScreenExitCallback = base::RepeatingCallback<void(Result result)>;
-  DemoPreferencesScreen(DemoPreferencesScreenView* view,
+  DemoPreferencesScreen(base::WeakPtr<DemoPreferencesScreenView> view,
                         const ScreenExitCallback& exit_callback);
 
   DemoPreferencesScreen(const DemoPreferencesScreen&) = delete;
@@ -37,15 +38,11 @@
 
   void SetDemoModeCountry(const std::string& country_id);
 
-  // Called when view is being destroyed. If Screen is destroyed earlier
-  // then it has to call Bind(nullptr).
-  void OnViewDestroyed(DemoPreferencesScreenView* view);
-
  protected:
   // BaseScreen:
   void ShowImpl() override;
   void HideImpl() override;
-  void OnUserActionDeprecated(const std::string& action_id) override;
+  void OnUserAction(const base::Value::List& args) override;
 
   ScreenExitCallback* exit_callback() { return &exit_callback_; }
 
@@ -62,7 +59,7 @@
                           input_method::InputMethodManager::Observer>
       input_manager_observation_{this};
 
-  DemoPreferencesScreenView* view_;
+  base::WeakPtr<DemoPreferencesScreenView> view_;
   ScreenExitCallback exit_callback_;
 };
 
diff --git a/chrome/browser/ash/login/screens/demo_setup_screen.cc b/chrome/browser/ash/login/screens/demo_setup_screen.cc
index d80d69e..aed07416d 100644
--- a/chrome/browser/ash/login/screens/demo_setup_screen.cc
+++ b/chrome/browser/ash/login/screens/demo_setup_screen.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ash/login/screens/demo_setup_screen.h"
 
 #include "base/bind.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/ash/login/wizard_controller.h"
 #include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
@@ -29,31 +30,23 @@
   }
 }
 
-DemoSetupScreen::DemoSetupScreen(DemoSetupScreenView* view,
+DemoSetupScreen::DemoSetupScreen(base::WeakPtr<DemoSetupScreenView> view,
                                  const ScreenExitCallback& exit_callback)
     : BaseScreen(DemoSetupScreenView::kScreenId, OobeScreenPriority::DEFAULT),
-      view_(view),
-      exit_callback_(exit_callback) {
-  DCHECK(view_);
-  view_->Bind(this);
-}
+      view_(std::move(view)),
+      exit_callback_(exit_callback) {}
 
-DemoSetupScreen::~DemoSetupScreen() {
-  if (view_)
-    view_->Bind(nullptr);
-}
+DemoSetupScreen::~DemoSetupScreen() = default;
 
 void DemoSetupScreen::ShowImpl() {
   if (view_)
     view_->Show();
 }
 
-void DemoSetupScreen::HideImpl() {
-  if (view_)
-    view_->Hide();
-}
+void DemoSetupScreen::HideImpl() {}
 
-void DemoSetupScreen::OnUserActionDeprecated(const std::string& action_id) {
+void DemoSetupScreen::OnUserAction(const base::Value::List& args) {
+  const std::string& action_id = args[0].GetString();
   if (action_id == kUserActionStartSetup) {
     StartEnrollment();
   } else if (action_id == kUserActionClose) {
@@ -61,7 +54,7 @@
   } else if (action_id == kUserActionPowerwash) {
     SessionManagerClient::Get()->StartDeviceWipe();
   } else {
-    BaseScreen::OnUserActionDeprecated(action_id);
+    BaseScreen::OnUserAction(args);
   }
 }
 
@@ -81,6 +74,8 @@
 
 void DemoSetupScreen::SetCurrentSetupStep(
     const DemoSetupController::DemoSetupStep current_step) {
+  if (!view_)
+    return;
   view_->SetCurrentSetupStep(current_step);
 }
 
@@ -91,6 +86,8 @@
 
 void DemoSetupScreen::OnSetupError(
     const DemoSetupController::DemoSetupError& error) {
+  if (!view_)
+    return;
   view_->OnSetupFailed(error);
 }
 
@@ -98,9 +95,4 @@
   exit_callback_.Run(Result::COMPLETED);
 }
 
-void DemoSetupScreen::OnViewDestroyed(DemoSetupScreenView* view) {
-  if (view_ == view)
-    view_ = nullptr;
-}
-
 }  // namespace ash
diff --git a/chrome/browser/ash/login/screens/demo_setup_screen.h b/chrome/browser/ash/login/screens/demo_setup_screen.h
index b415bc6..409fe3b 100644
--- a/chrome/browser/ash/login/screens/demo_setup_screen.h
+++ b/chrome/browser/ash/login/screens/demo_setup_screen.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "base/values.h"
 #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/ash/login/screens/base_screen.h"
 // TODO(https://crbug.com/1164001): move to forward declaration.
@@ -25,7 +26,7 @@
   static std::string GetResultString(Result result);
 
   using ScreenExitCallback = base::RepeatingCallback<void(Result result)>;
-  DemoSetupScreen(DemoSetupScreenView* view,
+  DemoSetupScreen(base::WeakPtr<DemoSetupScreenView> view,
                   const ScreenExitCallback& exit_callback);
 
   DemoSetupScreen(const DemoSetupScreen&) = delete;
@@ -33,10 +34,6 @@
 
   ~DemoSetupScreen() override;
 
-  // Called when view is being destroyed. If Screen is destroyed earlier
-  // then it has to call Bind(nullptr).
-  void OnViewDestroyed(DemoSetupScreenView* view);
-
   // Test utilities.
   void SetCurrentSetupStepForTest(
       const DemoSetupController::DemoSetupStep current_step);
@@ -45,7 +42,7 @@
   // BaseScreen:
   void ShowImpl() override;
   void HideImpl() override;
-  void OnUserActionDeprecated(const std::string& action_id) override;
+  void OnUserAction(const base::Value::List& args) override;
 
   ScreenExitCallback* exit_callback() { return &exit_callback_; }
 
@@ -62,7 +59,7 @@
   // Called when the setup flow finished successfully.
   void OnSetupSuccess();
 
-  DemoSetupScreenView* view_;
+  base::WeakPtr<DemoSetupScreenView> view_;
   ScreenExitCallback exit_callback_;
 
   base::WeakPtrFactory<DemoSetupScreen> weak_ptr_factory_{this};
diff --git a/chrome/browser/ash/login/screens/mock_demo_preferences_screen.cc b/chrome/browser/ash/login/screens/mock_demo_preferences_screen.cc
index 0ccd792a..c13e4af 100644
--- a/chrome/browser/ash/login/screens/mock_demo_preferences_screen.cc
+++ b/chrome/browser/ash/login/screens/mock_demo_preferences_screen.cc
@@ -3,13 +3,14 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ash/login/screens/mock_demo_preferences_screen.h"
+#include "base/memory/weak_ptr.h"
 
 namespace ash {
 
 MockDemoPreferencesScreen::MockDemoPreferencesScreen(
-    DemoPreferencesScreenView* view,
+    base::WeakPtr<DemoPreferencesScreenView> view,
     const ScreenExitCallback& exit_callback)
-    : DemoPreferencesScreen(view, exit_callback) {}
+    : DemoPreferencesScreen(std::move(view), exit_callback) {}
 
 MockDemoPreferencesScreen::~MockDemoPreferencesScreen() = default;
 
@@ -19,14 +20,6 @@
 
 MockDemoPreferencesScreenView::MockDemoPreferencesScreenView() = default;
 
-MockDemoPreferencesScreenView::~MockDemoPreferencesScreenView() {
-  if (screen_)
-    screen_->OnViewDestroyed(this);
-}
-
-void MockDemoPreferencesScreenView::Bind(DemoPreferencesScreen* screen) {
-  screen_ = screen;
-  MockBind(screen);
-}
+MockDemoPreferencesScreenView::~MockDemoPreferencesScreenView() = default;
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/screens/mock_demo_preferences_screen.h b/chrome/browser/ash/login/screens/mock_demo_preferences_screen.h
index d778a401..d1a19ef 100644
--- a/chrome/browser/ash/login/screens/mock_demo_preferences_screen.h
+++ b/chrome/browser/ash/login/screens/mock_demo_preferences_screen.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/ash/login/screens/demo_preferences_screen.h"
 #include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -15,7 +16,7 @@
 
 class MockDemoPreferencesScreen : public DemoPreferencesScreen {
  public:
-  MockDemoPreferencesScreen(DemoPreferencesScreenView* view,
+  MockDemoPreferencesScreen(base::WeakPtr<DemoPreferencesScreenView> view,
                             const ScreenExitCallback& exit_callback);
 
   MockDemoPreferencesScreen(const MockDemoPreferencesScreen&) = delete;
@@ -41,14 +42,7 @@
   ~MockDemoPreferencesScreenView() override;
 
   MOCK_METHOD(void, Show, ());
-  MOCK_METHOD(void, Hide, ());
-  MOCK_METHOD(void, MockBind, (DemoPreferencesScreen * screen));
   MOCK_METHOD(void, SetInputMethodId, (const std::string& input_method));
-
-  void Bind(DemoPreferencesScreen* screen) override;
-
- private:
-  DemoPreferencesScreen* screen_ = nullptr;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/screens/mock_demo_setup_screen.cc b/chrome/browser/ash/login/screens/mock_demo_setup_screen.cc
index b1767ab..7ff0077 100644
--- a/chrome/browser/ash/login/screens/mock_demo_setup_screen.cc
+++ b/chrome/browser/ash/login/screens/mock_demo_setup_screen.cc
@@ -3,11 +3,12 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ash/login/screens/mock_demo_setup_screen.h"
+#include "base/memory/weak_ptr.h"
 
 namespace ash {
 
 MockDemoSetupScreen::MockDemoSetupScreen(
-    DemoSetupScreenView* view,
+    base::WeakPtr<DemoSetupScreenView> view,
     const ScreenExitCallback& exit_callback)
     : DemoSetupScreen(view, exit_callback) {}
 
@@ -19,14 +20,6 @@
 
 MockDemoSetupScreenView::MockDemoSetupScreenView() = default;
 
-MockDemoSetupScreenView::~MockDemoSetupScreenView() {
-  if (screen_)
-    screen_->OnViewDestroyed(this);
-}
-
-void MockDemoSetupScreenView::Bind(DemoSetupScreen* screen) {
-  screen_ = screen;
-  MockBind(screen);
-}
+MockDemoSetupScreenView::~MockDemoSetupScreenView() = default;
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/screens/mock_demo_setup_screen.h b/chrome/browser/ash/login/screens/mock_demo_setup_screen.h
index 54e1421..aab200f05d 100644
--- a/chrome/browser/ash/login/screens/mock_demo_setup_screen.h
+++ b/chrome/browser/ash/login/screens/mock_demo_setup_screen.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_ASH_LOGIN_SCREENS_MOCK_DEMO_SETUP_SCREEN_H_
 #define CHROME_BROWSER_ASH_LOGIN_SCREENS_MOCK_DEMO_SETUP_SCREEN_H_
 
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/ash/login/screens/demo_setup_screen.h"
 #include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
@@ -14,7 +15,7 @@
 
 class MockDemoSetupScreen : public DemoSetupScreen {
  public:
-  MockDemoSetupScreen(DemoSetupScreenView* view,
+  MockDemoSetupScreen(base::WeakPtr<DemoSetupScreenView> view,
                       const ScreenExitCallback& exit_callback);
   ~MockDemoSetupScreen() override;
 
@@ -30,8 +31,6 @@
   ~MockDemoSetupScreenView() override;
 
   MOCK_METHOD(void, Show, ());
-  MOCK_METHOD(void, Hide, ());
-  MOCK_METHOD(void, MockBind, (DemoSetupScreen * screen));
   MOCK_METHOD(void, OnSetupSucceeded, ());
   MOCK_METHOD(void,
               OnSetupFailed,
@@ -39,11 +38,6 @@
   MOCK_METHOD(void,
               SetCurrentSetupStep,
               (const DemoSetupController::DemoSetupStep current_step));
-
-  void Bind(DemoSetupScreen* screen) override;
-
- private:
-  DemoSetupScreen* screen_ = nullptr;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/login/ui/login_display_host_webui.cc b/chrome/browser/ash/login/ui/login_display_host_webui.cc
index aa83b59..ff6258a 100644
--- a/chrome/browser/ash/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/ash/login/ui/login_display_host_webui.cc
@@ -236,13 +236,16 @@
   if (LoginDisplayHost::default_host()) {
     // Tests may have already allocated an instance for us to use.
     display_host = LoginDisplayHost::default_host();
-  } else if (ShouldShowSigninScreen(first_screen) ||
-             first_screen == LacrosDataMigrationScreenView::kScreenId) {
+  } else if (ShouldShowSigninScreen(first_screen)) {
+    display_host = new LoginDisplayHostMojo(DisplayedScreen::SIGN_IN_SCREEN);
+  } else if (first_screen == LacrosDataMigrationScreenView::kScreenId) {
     // TODO(crbug.com/1178702): Once lacros is officially released,
     // `ShowLoginWizard()` will no longer be called with lacros screen id.
     // Instead simply call `SigninUI::StartBrowserDataMigration()` as part of
     // the login flow.
     display_host = new LoginDisplayHostMojo(DisplayedScreen::SIGN_IN_SCREEN);
+    DCHECK(session_manager::SessionManager::Get());
+    session_manager::SessionManager::Get()->NotifyLoginOrLockScreenVisible();
   } else {
     display_host = new LoginDisplayHostWebUI();
   }
diff --git a/chrome/browser/ash/login/users/user_manager_unittest.cc b/chrome/browser/ash/login/users/user_manager_unittest.cc
index 60f3bd0..bcd7451 100644
--- a/chrome/browser/ash/login/users/user_manager_unittest.cc
+++ b/chrome/browser/ash/login/users/user_manager_unittest.cc
@@ -103,7 +103,7 @@
         std::make_unique<FakeProfileManager>(temp_dir_.GetPath()));
 
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     ResetUserManager();
 
@@ -123,7 +123,7 @@
     local_state_.reset();
 
     base::RunLoop().RunUntilIdle();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc
index 66aa6c616..d4f2ba8b 100644
--- a/chrome/browser/ash/login/wizard_controller.cc
+++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -546,7 +546,7 @@
                             weak_factory_.GetWeakPtr())));
 
     append(std::make_unique<DemoPreferencesScreen>(
-        oobe_ui->GetView<DemoPreferencesScreenHandler>(),
+        oobe_ui->GetView<DemoPreferencesScreenHandler>()->AsWeakPtr(),
         base::BindRepeating(&WizardController::OnDemoPreferencesScreenExit,
                             weak_factory_.GetWeakPtr())));
 
@@ -579,7 +579,7 @@
       base::BindRepeating(&WizardController::OnResetScreenExit,
                           weak_factory_.GetWeakPtr())));
   append(std::make_unique<DemoSetupScreen>(
-      oobe_ui->GetView<DemoSetupScreenHandler>(),
+      oobe_ui->GetView<DemoSetupScreenHandler>()->AsWeakPtr(),
       base::BindRepeating(&WizardController::OnDemoSetupScreenExit,
                           weak_factory_.GetWeakPtr())));
   append(std::make_unique<EnableAdbSideloadingScreen>(
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc
index f27ee45..8593805 100644
--- a/chrome/browser/ash/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -538,7 +538,7 @@
         std::make_unique<MockDemoPreferencesScreenView>();
     mock_demo_preferences_screen_ =
         MockScreenExpectLifecycle(std::make_unique<MockDemoPreferencesScreen>(
-            mock_demo_preferences_screen_view_.get(),
+            mock_demo_preferences_screen_view_->AsWeakPtr(),
             base::BindRepeating(&WizardController::OnDemoPreferencesScreenExit,
                                 base::Unretained(wizard_controller))));
 
@@ -622,19 +622,17 @@
                                 base::Unretained(wizard_controller))));
 
     mock_demo_setup_screen_view_ = std::make_unique<MockDemoSetupScreenView>();
-    ExpectBind(mock_demo_setup_screen_view_.get());
     mock_demo_setup_screen_ =
         MockScreenExpectLifecycle(std::make_unique<MockDemoSetupScreen>(
-            mock_demo_setup_screen_view_.get(),
+            mock_demo_setup_screen_view_->AsWeakPtr(),
             base::BindRepeating(&WizardController::OnDemoSetupScreenExit,
                                 base::Unretained(wizard_controller))));
 
     mock_demo_preferences_screen_view_ =
         std::make_unique<MockDemoPreferencesScreenView>();
-    ExpectBind(mock_demo_preferences_screen_view_.get());
     mock_demo_preferences_screen_ =
         MockScreenExpectLifecycle(std::make_unique<MockDemoPreferencesScreen>(
-            mock_demo_preferences_screen_view_.get(),
+            mock_demo_preferences_screen_view_->AsWeakPtr(),
             base::BindRepeating(&WizardController::OnDemoPreferencesScreenExit,
                                 base::Unretained(wizard_controller))));
 
diff --git a/chrome/browser/ash/notifications/gnubby_notification_unittest.cc b/chrome/browser/ash/notifications/gnubby_notification_unittest.cc
index f9df079..5f447ccf 100644
--- a/chrome/browser/ash/notifications/gnubby_notification_unittest.cc
+++ b/chrome/browser/ash/notifications/gnubby_notification_unittest.cc
@@ -27,7 +27,7 @@
     DBusThreadManager::GetSetterForTesting()->SetGnubbyClient(
         std::unique_ptr<chromeos::GnubbyClient>(
             new chromeos::FakeGnubbyClient));
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     BrowserWithTestWindowTest::SetUp();
 
     TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
@@ -48,7 +48,7 @@
     gnubby_notification_.reset();
     tester_.reset();
     BrowserWithTestWindowTest::TearDown();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_diagnostics.cc b/chrome/browser/ash/plugin_vm/plugin_vm_diagnostics.cc
index e92c006..a1c79c7 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_diagnostics.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_diagnostics.cc
@@ -188,7 +188,7 @@
     request.set_storage_location(
         vm_tools::concierge::STORAGE_CRYPTOHOME_PLUGINVM);
 
-    chromeos::ConciergeClient::Get()->ListVmDisks(
+    ash::ConciergeClient::Get()->ListVmDisks(
         std::move(request),
         base::BindOnce(&PluginVmDiagnostics::OnListVmDisks, this,
                        /*plugin_vm_is_allowed=*/true));
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc
index f97ef95..68e4b97 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_files_unittest.cc
@@ -99,12 +99,12 @@
     ScopedDBusThreadManager() {
       chromeos::DBusThreadManager::Initialize();
       chromeos::CiceroneClient::InitializeFake();
-      chromeos::ConciergeClient::InitializeFake();
+      ash::ConciergeClient::InitializeFake();
       ash::SeneschalClient::InitializeFake();
     }
     ~ScopedDBusThreadManager() {
       ash::SeneschalClient::Shutdown();
-      chromeos::ConciergeClient::Shutdown();
+      ash::ConciergeClient::Shutdown();
       chromeos::CiceroneClient::Shutdown();
       chromeos::DBusThreadManager::Shutdown();
     }
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc b/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc
index 19d0478b..7a5d785a 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_installer.cc
@@ -57,8 +57,8 @@
 
 constexpr char kHomeDirectory[] = "/home";
 
-chromeos::ConciergeClient* GetConciergeClient() {
-  return chromeos::ConciergeClient::Get();
+ash::ConciergeClient* GetConciergeClient() {
+  return ash::ConciergeClient::Get();
 }
 
 constexpr char kIsoSignature[] = "CD001";
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_installer.h b/chrome/browser/ash/plugin_vm/plugin_vm_installer.h
index 08e3434..3ba3181 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_installer.h
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_installer.h
@@ -43,7 +43,7 @@
 // depending on whether an .iso (new VM) or archive (prepared VM) is
 // downloaded.
 class PluginVmInstaller : public KeyedService,
-                          public chromeos::ConciergeClient::DiskImageObserver {
+                          public ash::ConciergeClient::DiskImageObserver {
  public:
   // FailureReasons values are logged to UMA and shown to users. Do not change
   // or re-use enum values.
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc
index 7a286d5..fa1190b6 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_installer_unittest.cc
@@ -165,7 +165,7 @@
  protected:
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     ASSERT_TRUE(profiles_dir_.CreateUniqueTempDir());
     CreateProfile();
@@ -184,7 +184,7 @@
 
     SetDefaultExpectations();
 
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
 
     chromeos::DlcserviceClient::InitializeFake();
     fake_dlcservice_client_ = static_cast<chromeos::FakeDlcserviceClient*>(
@@ -197,7 +197,7 @@
     profile_.reset();
     observer_.reset();
 
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
     chromeos::DlcserviceClient::Shutdown();
   }
@@ -274,7 +274,7 @@
 
   // A pointer to a singleton object which is valid until
   // ConciergeClient::Shutdown() is called.
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
   // Owned by chromeos::DBusThreadManager
   chromeos::FakeDlcserviceClient* fake_dlcservice_client_;
 
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl.cc b/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl.cc
index 768a97a..3f31a88 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl.cc
@@ -374,7 +374,7 @@
     vm_tools::concierge::GetVmInfoRequest concierge_request;
     concierge_request.set_owner_id(owner_id_);
     concierge_request.set_name(kPluginVmName);
-    chromeos::ConciergeClient::Get()->GetVmInfo(
+    ash::ConciergeClient::Get()->GetVmInfo(
         std::move(concierge_request),
         base::BindOnce(&PluginVmManagerImpl::OnGetVmInfoForSharing,
                        weak_ptr_factory_.GetWeakPtr()));
@@ -749,7 +749,7 @@
   request.set_cryptohome_id(owner_id_);
   request.set_vm_name(kPluginVmName);
 
-  chromeos::ConciergeClient::Get()->DestroyDiskImage(
+  ash::ConciergeClient::Get()->DestroyDiskImage(
       std::move(request),
       base::BindOnce(&PluginVmManagerImpl::OnDestroyDiskImage,
                      weak_ptr_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl_unittest.cc
index 7057c5e..01f42c0 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl_unittest.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_manager_impl_unittest.cc
@@ -50,7 +50,7 @@
   PluginVmManagerImplTest() {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     testing_profile_ = std::make_unique<TestingProfile>();
     test_helper_ = std::make_unique<PluginVmTestHelper>(testing_profile_.get());
@@ -90,7 +90,7 @@
     test_helper_.reset();
     testing_profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -100,8 +100,8 @@
     return *static_cast<chromeos::FakeVmPluginDispatcherClient*>(
         chromeos::DBusThreadManager::Get()->GetVmPluginDispatcherClient());
   }
-  chromeos::FakeConciergeClient& ConciergeClient() {
-    return *chromeos::FakeConciergeClient::Get();
+  ash::FakeConciergeClient& ConciergeClient() {
+    return *ash::FakeConciergeClient::Get();
   }
   ash::FakeSeneschalClient& SeneschalClient() {
     return *ash::FakeSeneschalClient::Get();
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.cc b/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.cc
index 04e16e7d..147a4c7 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.cc
@@ -50,7 +50,7 @@
 }  // namespace
 
 void SetupConciergeForSuccessfulDiskImageImport(
-    chromeos::FakeConciergeClient* fake_concierge_client_) {
+    ash::FakeConciergeClient* fake_concierge_client_) {
   // Set immediate response for the ImportDiskImage call: will be that "image is
   // in progress":
   vm_tools::concierge::ImportDiskImageResponse import_disk_image_response;
@@ -84,7 +84,7 @@
 }
 
 void SetupConciergeForFailedDiskImageImport(
-    chromeos::FakeConciergeClient* fake_concierge_client_,
+    ash::FakeConciergeClient* fake_concierge_client_,
     vm_tools::concierge::DiskImageStatus status) {
   // Set immediate response for the ImportDiskImage call: will be that "image is
   // in progress":
@@ -118,7 +118,7 @@
 }
 
 void SetupConciergeForCancelDiskImageOperation(
-    chromeos::FakeConciergeClient* fake_concierge_client_,
+    ash::FakeConciergeClient* fake_concierge_client_,
     bool success) {
   vm_tools::concierge::CancelDiskImageResponse cancel_disk_image_response;
   cancel_disk_image_response.set_success(success);
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.h b/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.h
index 330d02f..ecb9b61 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.h
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_test_helper.h
@@ -23,14 +23,14 @@
 namespace plugin_vm {
 
 void SetupConciergeForSuccessfulDiskImageImport(
-    chromeos::FakeConciergeClient* fake_concierge_client_);
+    ash::FakeConciergeClient* fake_concierge_client_);
 
 void SetupConciergeForFailedDiskImageImport(
-    chromeos::FakeConciergeClient* fake_concierge_client_,
+    ash::FakeConciergeClient* fake_concierge_client_,
     vm_tools::concierge::DiskImageStatus status);
 
 void SetupConciergeForCancelDiskImageOperation(
-    chromeos::FakeConciergeClient* fake_concierge_client_,
+    ash::FakeConciergeClient* fake_concierge_client_,
     bool success);
 
 // A helper class for enabling Plugin VM in unit tests.
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc
index f481f7cc..0f138d6 100644
--- a/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc
+++ b/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc
@@ -35,11 +35,11 @@
   struct ScopedDBusThreadManager {
     ScopedDBusThreadManager() {
       chromeos::DBusThreadManager::Initialize();
-      chromeos::ConciergeClient::InitializeFake(
+      ash::ConciergeClient::InitializeFake(
           /*fake_cicerone_client=*/nullptr);
     }
     ~ScopedDBusThreadManager() {
-      chromeos::ConciergeClient::Shutdown();
+      ash::ConciergeClient::Shutdown();
       chromeos::DBusThreadManager::Shutdown();
     }
   } dbus_thread_manager_;
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc b/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc
index 6595a36..cf80c5bb 100644
--- a/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc
+++ b/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc
@@ -156,7 +156,7 @@
 
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     scoped_feature_list_.InitWithFeatures(
         GetParam() /* enabled_features */,
@@ -239,7 +239,7 @@
     test_system_shared_loader_factory_->Detach();
     test_signin_shared_loader_factory_->Detach();
 
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_token_forwarder_unittest.cc b/chrome/browser/ash/policy/core/user_cloud_policy_token_forwarder_unittest.cc
index e8e2283..9d3b640 100644
--- a/chrome/browser/ash/policy/core/user_cloud_policy_token_forwarder_unittest.cc
+++ b/chrome/browser/ash/policy/core/user_cloud_policy_token_forwarder_unittest.cc
@@ -116,7 +116,7 @@
 
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     ASSERT_TRUE(profile_manager_->SetUp());
     scoped_feature_list_.InitAndEnableFeature(
         features::kDMServerOAuthForChildUser);
@@ -126,7 +126,7 @@
     user_policy_manager_->core()->Disconnect();
     // Must be torn down before |profile_manager_|.
     user_policy_manager_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/policy/dlp/dlp_files_controller_unittest.cc b/chrome/browser/ash/policy/dlp/dlp_files_controller_unittest.cc
index 47f0f39..ab3dd2aa 100644
--- a/chrome/browser/ash/policy/dlp/dlp_files_controller_unittest.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_files_controller_unittest.cc
@@ -235,7 +235,7 @@
 
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     crostini::CrostiniManager* crostini_manager =
@@ -270,7 +270,7 @@
 
     chromeos::DBusThreadManager::Shutdown();
     chromeos::CiceroneClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     ash::SeneschalClient::Shutdown();
 
     storage::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
diff --git a/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.cc b/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.cc
index 967db51..2854f6a 100644
--- a/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.cc
+++ b/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.cc
@@ -30,8 +30,8 @@
 
 namespace {
 
-chromeos::ConciergeClient* GetConciergeClient() {
-  return chromeos::ConciergeClient::Get();
+ash::ConciergeClient* GetConciergeClient() {
+  return ash::ConciergeClient::Get();
 }
 
 LockToSingleUserManager* g_lock_to_single_user_manager_instance;
diff --git a/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.h b/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.h
index 65cc244a..916b979 100644
--- a/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.h
+++ b/chrome/browser/ash/policy/handlers/lock_to_single_user_manager.h
@@ -22,7 +22,7 @@
 class LockToSingleUserManager final
     : public user_manager::UserManager::UserSessionStateObserver,
       public arc::ArcSessionManagerObserver,
-      public chromeos::ConciergeClient::VmObserver,
+      public ash::ConciergeClient::VmObserver,
       public ash::VmStartingObserver {
  public:
   static LockToSingleUserManager* GetLockToSingleUserManagerInstance();
diff --git a/chrome/browser/ash/policy/handlers/lock_to_single_user_manager_unittest.cc b/chrome/browser/ash/policy/handlers/lock_to_single_user_manager_unittest.cc
index 8db22d0..8505ba7 100644
--- a/chrome/browser/ash/policy/handlers/lock_to_single_user_manager_unittest.cc
+++ b/chrome/browser/ash/policy/handlers/lock_to_single_user_manager_unittest.cc
@@ -51,7 +51,7 @@
     chromeos::DBusThreadManager::Initialize();
 
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     arc::SetArcAvailableCommandLineForTesting(
@@ -74,9 +74,9 @@
     arc::ArcMetricsService::GetForBrowserContextForTesting(profile());
 
     // TODO(yusukes): Stop re-creating the client here.
-    chromeos::ConciergeClient::Shutdown();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    ash::ConciergeClient::Shutdown();
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
   }
 
   void TearDown() override {
@@ -101,7 +101,7 @@
     arc_service_manager_.reset();
     chromeos::CryptohomeMiscClient::Shutdown();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -173,7 +173,7 @@
   // Required for initialization.
   ash::SessionTerminationManager termination_manager_;
   std::unique_ptr<LockToSingleUserManager> lock_to_single_user_manager_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
   TestingPrefServiceSimple local_state_;
 };
 
diff --git a/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc
index 5e1d334..e3c2c5b8 100644
--- a/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/child_status_collector_browsertest.cc
@@ -205,7 +205,7 @@
         base::WrapUnique<chromeos::UpdateEngineClient>(update_engine_client_));
 
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     chromeos::PowerManagerClient::InitializeFake();
     chromeos::LoginState::Initialize();
@@ -219,7 +219,7 @@
     ash::SeneschalClient::Shutdown();
     // |testing_profile_| must be destructed while ConciergeClient is alive.
     testing_profile_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
 
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
index 8bcb1f2c..8557734 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -919,7 +919,7 @@
     ash::cros_healthd::FakeCrosHealthd::Initialize();
 
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
   }
 
@@ -931,7 +931,7 @@
     ash::SeneschalClient::Shutdown();
     // |testing_profile_| must be destroyed while ConciergeClient is alive.
     testing_profile_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::LoginState::Shutdown();
     chromeos::TpmManagerClient::Shutdown();
diff --git a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
index 947804a2..7bce0d8 100644
--- a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector_browsertest.cc
@@ -907,7 +907,7 @@
     chromeos::LoginState::Initialize();
 
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
   }
 
@@ -920,7 +920,7 @@
     ash::SeneschalClient::Shutdown();
     // |testing_profile_| must be destroyed while ConciergeClient is alive.
     testing_profile_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::LoginState::Shutdown();
     chromeos::TpmManagerClient::Shutdown();
diff --git a/chrome/browser/ash/settings/device_settings_test_helper.cc b/chrome/browser/ash/settings/device_settings_test_helper.cc
index 5fd992e..1155430 100644
--- a/chrome/browser/ash/settings/device_settings_test_helper.cc
+++ b/chrome/browser/ash/settings/device_settings_test_helper.cc
@@ -58,7 +58,7 @@
       base::WrapUnique(user_manager_));
   owner_key_util_ = new ownership::MockOwnerKeyUtil();
   device_settings_service_ = std::make_unique<DeviceSettingsService>();
-  chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+  ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
   chromeos::UserDataAuthClient::InitializeFake();
   chromeos::CryptohomeMiscClient::InitializeFake();
   PowerManagerClient::InitializeFake();
@@ -89,7 +89,7 @@
   PowerManagerClient::Shutdown();
   chromeos::CryptohomeMiscClient::Shutdown();
   chromeos::UserDataAuthClient::Shutdown();
-  chromeos::ConciergeClient::Shutdown();
+  ConciergeClient::Shutdown();
   device_policy_.reset();
   base::RunLoop().RunUntilIdle();
   profile_.reset();
diff --git a/chrome/browser/ash/smb_client/smb_service_unittest.cc b/chrome/browser/ash/smb_client/smb_service_unittest.cc
index 29d18585..c6637e314 100644
--- a/chrome/browser/ash/smb_client/smb_service_unittest.cc
+++ b/chrome/browser/ash/smb_client/smb_service_unittest.cc
@@ -175,7 +175,7 @@
     chromeos::DBusThreadManager::Initialize();
     chromeos::DBusThreadManager::GetSetterForTesting()->SetSmbProviderClient(
         std::make_unique<FakeSmbProviderClient>());
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     // Takes ownership of |disk_mount_manager_|, but Shutdown() must be called.
     disks::DiskMountManager::InitializeForTesting(disk_mount_manager_);
@@ -186,7 +186,7 @@
     user_manager_enabler_.reset();
     profile_manager_.reset();
     disks::DiskMountManager::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ash/usb/cros_usb_detector.cc b/chrome/browser/ash/usb/cros_usb_detector.cc
index aa69e8e..510e0c2 100644
--- a/chrome/browser/ash/usb/cros_usb_detector.cc
+++ b/chrome/browser/ash/usb/cros_usb_detector.cc
@@ -433,7 +433,7 @@
   fastboot_device_filter_->has_protocol_code = true;
   fastboot_device_filter_->protocol_code = kFastbootProtocol;
 
-  chromeos::ConciergeClient::Get()->AddVmObserver(this);
+  ConciergeClient::Get()->AddVmObserver(this);
   chromeos::DBusThreadManager::Get()
       ->GetVmPluginDispatcherClient()
       ->AddObserver(this);
@@ -443,7 +443,7 @@
 CrosUsbDetector::~CrosUsbDetector() {
   DCHECK_EQ(this, g_cros_usb_detector);
   disks::DiskMountManager::GetInstance()->RemoveObserver(this);
-  chromeos::ConciergeClient::Get()->RemoveVmObserver(this);
+  ConciergeClient::Get()->RemoveVmObserver(this);
   chromeos::DBusThreadManager::Get()
       ->GetVmPluginDispatcherClient()
       ->RemoveObserver(this);
@@ -780,7 +780,7 @@
   request.set_owner_id(crostini::CryptohomeIdForProfile(profile()));
   request.set_guest_port(*device.guest_port);
 
-  chromeos::ConciergeClient::Get()->DetachUsbDevice(
+  ConciergeClient::Get()->DetachUsbDevice(
       std::move(request),
       base::BindOnce(&CrosUsbDetector::OnUsbDeviceDetachFinished,
                      weak_ptr_factory_.GetWeakPtr(), vm_name, guid,
@@ -950,7 +950,7 @@
   request.set_vendor_id(device_info->vendor_id);
   request.set_product_id(device_info->product_id);
 
-  chromeos::ConciergeClient::Get()->AttachUsbDevice(
+  ConciergeClient::Get()->AttachUsbDevice(
       std::move(fd), std::move(request),
       base::BindOnce(&CrosUsbDetector::OnUsbDeviceAttachFinished,
                      weak_ptr_factory_.GetWeakPtr(), vm_name, device_info->guid,
diff --git a/chrome/browser/ash/usb/cros_usb_detector.h b/chrome/browser/ash/usb/cros_usb_detector.h
index d35f066f..b1d3b260 100644
--- a/chrome/browser/ash/usb/cros_usb_detector.h
+++ b/chrome/browser/ash/usb/cros_usb_detector.h
@@ -71,7 +71,7 @@
 // Detects USB Devices for Chrome OS and manages UI for controlling their use
 // with CrOS, Web or GuestOSs.
 class CrosUsbDetector : public device::mojom::UsbDeviceManagerClient,
-                        public chromeos::ConciergeClient::VmObserver,
+                        public ConciergeClient::VmObserver,
                         public chromeos::VmPluginDispatcherClient::Observer,
                         public disks::DiskMountManager::Observer {
  public:
@@ -154,7 +154,7 @@
     // TODO(nverne): Add current state and errors etc.
   };
 
-  // chromeos::ConciergeClient::VmObserver:
+  // ConciergeClient::VmObserver:
   void OnVmStarted(const vm_tools::concierge::VmStartedSignal& signal) override;
   void OnVmStopped(const vm_tools::concierge::VmStoppedSignal& signal) override;
 
diff --git a/chrome/browser/ash/usb/cros_usb_detector_unittest.cc b/chrome/browser/ash/usb/cros_usb_detector_unittest.cc
index 0e00275..faa5dc5 100644
--- a/chrome/browser/ash/usb/cros_usb_detector_unittest.cc
+++ b/chrome/browser/ash/usb/cros_usb_detector_unittest.cc
@@ -135,10 +135,10 @@
   CrosUsbDetectorTest() {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ConciergeClient::InitializeFake();
     SeneschalClient::InitializeFake();
     fake_cicerone_client_ = chromeos::FakeCiceroneClient::Get();
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = FakeConciergeClient::Get();
     fake_vm_plugin_dispatcher_client_ =
         static_cast<chromeos::FakeVmPluginDispatcherClient*>(
             chromeos::DBusThreadManager::Get()->GetVmPluginDispatcherClient());
@@ -154,7 +154,7 @@
   ~CrosUsbDetectorTest() override {
     disks::DiskMountManager::Shutdown();
     SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -286,7 +286,7 @@
   disks::DiskMountManager::DiskMap disks_;
 
   chromeos::FakeCiceroneClient* fake_cicerone_client_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  FakeConciergeClient* fake_concierge_client_;
   // Owned by chromeos::DBusThreadManager
   chromeos::FakeVmPluginDispatcherClient* fake_vm_plugin_dispatcher_client_;
 
diff --git a/chrome/browser/chromeos/OWNERS b/chrome/browser/chromeos/OWNERS
index 78a30ea..9fca8d6 100644
--- a/chrome/browser/chromeos/OWNERS
+++ b/chrome/browser/chromeos/OWNERS
@@ -11,6 +11,5 @@
 satorux@chromium.org
 xiyuan@chromium.org
 per-file *active_directory*=file://chrome/browser/ash/authpolicy/OWNERS
-per-file tpm_firmware_update*=mnissler@chromium.org
 per-file note_taking*=glenrob@chromium.org
 per-file note_taking*=ericwilligers@chromium.org
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
index dfcbdce..77a68f0 100644
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
@@ -191,6 +191,10 @@
       return file_manager_private::MOUNT_COMPLETED_STATUS_ERROR_INVALID_ARCHIVE;
     case chromeos::MOUNT_ERROR_NEED_PASSWORD:
       return file_manager_private::MOUNT_COMPLETED_STATUS_ERROR_NEED_PASSWORD;
+    case chromeos::MOUNT_ERROR_IN_PROGRESS:
+      return file_manager_private::MOUNT_COMPLETED_STATUS_ERROR_IN_PROGRESS;
+    case chromeos::MOUNT_ERROR_CANCELLED:
+      return file_manager_private::MOUNT_COMPLETED_STATUS_ERROR_CANCELLED;
     // Not a real error.
     case chromeos::MOUNT_ERROR_COUNT:
       NOTREACHED();
diff --git a/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc b/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc
index bb827c4..cbea74f8 100644
--- a/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc
+++ b/chrome/browser/chromeos/fileapi/recent_arc_media_source.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_root.h"
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_root_map.h"
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_util.h"
+#include "chrome/browser/ash/arc/fileapi/arc_media_view_util.h"
 #include "chrome/browser/chromeos/fileapi/recent_file.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
@@ -40,18 +41,17 @@
 const char kAndroidMyFilesDirPrefix[] =
     "/storage/0000000000000000000000000000CAFEF00D2019/";
 
-const char kMediaDocumentsProviderAuthority[] =
-    "com.android.providers.media.documents";
-constexpr char kMediaDocumentsProviderImagesRoot[] = "images_root";
-constexpr char kMediaDocumentsProviderVideosRoot[] = "videos_root";
+// Android's MediaDocumentsProvider.queryRecentDocuments() doesn't support
+// audio files, http://b/175155820
 const char* kMediaDocumentsProviderRootIds[] = {
-    kMediaDocumentsProviderImagesRoot,
-    kMediaDocumentsProviderVideosRoot,
+    arc::kImagesRootDocumentId,
+    arc::kVideosRootDocumentId,
+    arc::kDocumentsRootDocumentId,
 };
 
 base::FilePath GetRelativeMountPath(const std::string& root_id) {
   base::FilePath mount_path =
-      arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
                                          // In MediaDocumentsProvider, |root_id|
                                          // and |root_document_id| are the same.
                                          root_id);
@@ -174,7 +174,7 @@
     return;
   }
 
-  runner->GetRecentDocuments(kMediaDocumentsProviderAuthority, root_id_,
+  runner->GetRecentDocuments(arc::kMediaDocumentsProviderAuthority, root_id_,
                              base::BindOnce(&MediaRoot::OnGetRecentDocuments,
                                             weak_ptr_factory_.GetWeakPtr()));
 }
@@ -227,7 +227,8 @@
   }
 
   // In MediaDocumentsProvider, |root_id| and |root_document_id| are the same.
-  auto* root = root_map->Lookup(kMediaDocumentsProviderAuthority, root_id_);
+  auto* root =
+      root_map->Lookup(arc::kMediaDocumentsProviderAuthority, root_id_);
   if (!root) {
     // Media roots should always exist.
     LOG(ERROR) << "ArcDocumentsProviderRoot is missing";
@@ -313,9 +314,11 @@
     case FileType::kAll:
       return true;
     case FileType::kImage:
-      return root_id_ == kMediaDocumentsProviderImagesRoot;
+      return root_id_ == arc::kImagesRootDocumentId;
     case FileType::kVideo:
-      return root_id_ == kMediaDocumentsProviderVideosRoot;
+      return root_id_ == arc::kVideosRootDocumentId;
+    case FileType::kDocument:
+      return root_id_ == arc::kDocumentsRootDocumentId;
     default:
       return false;
   }
diff --git a/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc b/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc
index 16045580..f1ae71d 100644
--- a/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc
+++ b/chrome/browser/chromeos/fileapi/recent_arc_media_source_unittest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ash/arc/fileapi/arc_documents_provider_util.h"
 #include "chrome/browser/ash/arc/fileapi/arc_file_system_mounter.h"
 #include "chrome/browser/ash/arc/fileapi/arc_file_system_operation_runner.h"
+#include "chrome/browser/ash/arc/fileapi/arc_media_view_util.h"
 #include "chrome/browser/chromeos/fileapi/recent_arc_media_source.h"
 #include "chrome/browser/chromeos/fileapi/recent_file.h"
 #include "chrome/browser/chromeos/fileapi/recent_source.h"
@@ -28,12 +29,6 @@
 namespace chromeos {
 namespace {
 
-const char kMediaDocumentsProviderAuthority[] =
-    "com.android.providers.media.documents";
-const char kAudioRootId[] = "audio_root";
-const char kImagesRootId[] = "images_root";
-const char kVideosRootId[] = "videos_root";
-
 std::unique_ptr<KeyedService> CreateFileSystemOperationRunnerForTesting(
     content::BrowserContext* context) {
   return arc::ArcFileSystemOperationRunner::CreateForTesting(
@@ -47,13 +42,13 @@
     const std::string& mime_type,
     const base::Time& last_modified) {
   return arc::FakeFileSystemInstance::Document(
-      kMediaDocumentsProviderAuthority,  // authority
-      document_id,                       // document_id
-      parent_document_id,                // parent_document_id
-      display_name,                      // display_name
-      mime_type,                         // mime_type
-      0,                                 // size
-      last_modified.ToJavaTime());       // last_modified
+      arc::kMediaDocumentsProviderAuthority,  // authority
+      document_id,                            // document_id
+      parent_document_id,                     // parent_document_id
+      display_name,                           // display_name
+      mime_type,                              // mime_type
+      0,                                      // size
+      last_modified.ToJavaTime());            // last_modified
 }
 
 }  // namespace
@@ -90,29 +85,38 @@
 
  protected:
   void AddDocumentsToFakeFileSystemInstance() {
-    auto images_root_doc =
-        MakeDocument(kImagesRootId, "", "", arc::kAndroidDirectoryMimeType,
-                     base::Time::FromJavaTime(1));
-    auto cat_doc = MakeDocument("cat", kImagesRootId, "cat.png", "image/png",
-                                base::Time::FromJavaTime(2));
-    auto dog_doc = MakeDocument("dog", kImagesRootId, "dog.jpg", "image/jpeg",
-                                base::Time::FromJavaTime(3));
-    auto fox_doc = MakeDocument("fox", kImagesRootId, "fox.gif", "image/gif",
-                                base::Time::FromJavaTime(4));
-    auto elk_doc = MakeDocument("elk", kImagesRootId, "elk.tiff", "image/tiff",
-                                base::Time::FromJavaTime(5));
-    auto audio_root_doc =
-        MakeDocument(kAudioRootId, "", "", arc::kAndroidDirectoryMimeType,
-                     base::Time::FromJavaTime(1));
-    auto god_doc = MakeDocument("god", kAudioRootId, "god.mp3", "audio/mp3",
-                                base::Time::FromJavaTime(6));
-    auto videos_root_doc =
-        MakeDocument(kVideosRootId, "", "", arc::kAndroidDirectoryMimeType,
-                     base::Time::FromJavaTime(1));
-    auto hot_doc = MakeDocument("hot", kVideosRootId, "hot.mp4", "video/mp4",
-                                base::Time::FromJavaTime(7));
-    auto ink_doc = MakeDocument("ink", kVideosRootId, "ink.webm", "video/webm",
-                                base::Time::FromJavaTime(8));
+    auto images_root_doc = MakeDocument(arc::kImagesRootDocumentId, "", "",
+                                        arc::kAndroidDirectoryMimeType,
+                                        base::Time::FromJavaTime(1));
+    auto cat_doc = MakeDocument("cat", arc::kImagesRootDocumentId, "cat.png",
+                                "image/png", base::Time::FromJavaTime(2));
+    auto dog_doc = MakeDocument("dog", arc::kImagesRootDocumentId, "dog.jpg",
+                                "image/jpeg", base::Time::FromJavaTime(3));
+    auto fox_doc = MakeDocument("fox", arc::kImagesRootDocumentId, "fox.gif",
+                                "image/gif", base::Time::FromJavaTime(4));
+    auto elk_doc = MakeDocument("elk", arc::kImagesRootDocumentId, "elk.tiff",
+                                "image/tiff", base::Time::FromJavaTime(5));
+    auto audio_root_doc = MakeDocument(arc::kAudioRootDocumentId, "", "",
+                                       arc::kAndroidDirectoryMimeType,
+                                       base::Time::FromJavaTime(1));
+    auto god_doc = MakeDocument("god", arc::kAudioRootDocumentId, "god.mp3",
+                                "audio/mp3", base::Time::FromJavaTime(6));
+    auto videos_root_doc = MakeDocument(arc::kVideosRootDocumentId, "", "",
+                                        arc::kAndroidDirectoryMimeType,
+                                        base::Time::FromJavaTime(1));
+    auto hot_doc = MakeDocument("hot", arc::kVideosRootDocumentId, "hot.mp4",
+                                "video/mp4", base::Time::FromJavaTime(7));
+    auto ink_doc = MakeDocument("ink", arc::kVideosRootDocumentId, "ink.webm",
+                                "video/webm", base::Time::FromJavaTime(8));
+    auto documents_root_doc = MakeDocument(arc::kDocumentsRootDocumentId, "",
+                                           "", arc::kAndroidDirectoryMimeType,
+                                           base::Time::FromJavaTime(1));
+    auto word_doc =
+        MakeDocument("word", arc::kDocumentsRootDocumentId, "word.doc",
+                     "application/msword", base::Time::FromJavaTime(9));
+    auto text_doc =
+        MakeDocument("text", arc::kDocumentsRootDocumentId, "text.txt",
+                     "text/plain", base::Time::FromJavaTime(10));
 
     fake_file_system_.AddDocument(images_root_doc);
     fake_file_system_.AddDocument(cat_doc);
@@ -123,16 +127,28 @@
     fake_file_system_.AddDocument(videos_root_doc);
     fake_file_system_.AddDocument(hot_doc);
     fake_file_system_.AddDocument(ink_doc);
+    fake_file_system_.AddDocument(documents_root_doc);
+    fake_file_system_.AddDocument(word_doc);
+    fake_file_system_.AddDocument(text_doc);
 
-    fake_file_system_.AddRecentDocument(kImagesRootId, images_root_doc);
-    fake_file_system_.AddRecentDocument(kImagesRootId, cat_doc);
-    fake_file_system_.AddRecentDocument(kImagesRootId, dog_doc);
-    fake_file_system_.AddRecentDocument(kImagesRootId, elk_doc);
-    fake_file_system_.AddRecentDocument(kAudioRootId, audio_root_doc);
-    fake_file_system_.AddRecentDocument(kAudioRootId, god_doc);
-    fake_file_system_.AddRecentDocument(kVideosRootId, videos_root_doc);
-    fake_file_system_.AddRecentDocument(kVideosRootId, hot_doc);
-    fake_file_system_.AddRecentDocument(kVideosRootId, ink_doc);
+    fake_file_system_.AddRecentDocument(arc::kImagesRootDocumentId,
+                                        images_root_doc);
+    fake_file_system_.AddRecentDocument(arc::kImagesRootDocumentId, cat_doc);
+    fake_file_system_.AddRecentDocument(arc::kImagesRootDocumentId, dog_doc);
+    fake_file_system_.AddRecentDocument(arc::kImagesRootDocumentId, elk_doc);
+    fake_file_system_.AddRecentDocument(arc::kAudioRootDocumentId,
+                                        audio_root_doc);
+    fake_file_system_.AddRecentDocument(arc::kAudioRootDocumentId, god_doc);
+    fake_file_system_.AddRecentDocument(arc::kVideosRootDocumentId,
+                                        videos_root_doc);
+    fake_file_system_.AddRecentDocument(arc::kVideosRootDocumentId, hot_doc);
+    fake_file_system_.AddRecentDocument(arc::kVideosRootDocumentId, ink_doc);
+    fake_file_system_.AddRecentDocument(arc::kDocumentsRootDocumentId,
+                                        documents_root_doc);
+    fake_file_system_.AddRecentDocument(arc::kDocumentsRootDocumentId,
+                                        word_doc);
+    fake_file_system_.AddRecentDocument(arc::kDocumentsRootDocumentId,
+                                        text_doc);
   }
 
   void EnableFakeFileSystemInstance() {
@@ -185,27 +201,43 @@
 
   std::vector<RecentFile> files = GetRecentFiles();
 
-  ASSERT_EQ(4u, files.size());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kImagesRootId)
-                .Append("cat.png"),
-            files[0].url().path());
+  ASSERT_EQ(6u, files.size());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kImagesRootDocumentId)
+          .Append("cat.png"),
+      files[0].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(2), files[0].last_modified());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kImagesRootId)
-                .Append("dog.jpg"),
-            files[1].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kImagesRootDocumentId)
+          .Append("dog.jpg"),
+      files[1].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(3), files[1].last_modified());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kVideosRootId)
-                .Append("hot.mp4"),
-            files[2].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kVideosRootDocumentId)
+          .Append("hot.mp4"),
+      files[2].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(7), files[2].last_modified());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kVideosRootId)
-                .Append("ink.webm"),
-            files[3].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kVideosRootDocumentId)
+          .Append("ink.webm"),
+      files[3].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(8), files[3].last_modified());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kDocumentsRootDocumentId)
+          .Append("text.txt"),
+      files[4].url().path());
+  EXPECT_EQ(base::Time::FromJavaTime(10), files[4].last_modified());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kDocumentsRootDocumentId)
+          .Append("word.doc"),
+      files[5].url().path());
+  EXPECT_EQ(base::Time::FromJavaTime(9), files[5].last_modified());
 }
 
 TEST_F(RecentArcMediaSourceTest, ArcNotAvailable) {
@@ -240,15 +272,17 @@
       GetRecentFiles(RecentSource::FileType::kImage);
 
   ASSERT_EQ(2u, files.size());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kImagesRootId)
-                .Append("cat.png"),
-            files[0].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kImagesRootDocumentId)
+          .Append("cat.png"),
+      files[0].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(2), files[0].last_modified());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kImagesRootId)
-                .Append("dog.jpg"),
-            files[1].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kImagesRootDocumentId)
+          .Append("dog.jpg"),
+      files[1].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(3), files[1].last_modified());
 }
 
@@ -259,18 +293,41 @@
       GetRecentFiles(RecentSource::FileType::kVideo);
 
   ASSERT_EQ(2u, files.size());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kVideosRootId)
-                .Append("hot.mp4"),
-            files[0].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kVideosRootDocumentId)
+          .Append("hot.mp4"),
+      files[0].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(7), files[0].last_modified());
-  EXPECT_EQ(arc::GetDocumentsProviderMountPath(kMediaDocumentsProviderAuthority,
-                                               kVideosRootId)
-                .Append("ink.webm"),
-            files[1].url().path());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kVideosRootDocumentId)
+          .Append("ink.webm"),
+      files[1].url().path());
   EXPECT_EQ(base::Time::FromJavaTime(8), files[1].last_modified());
 }
 
+TEST_F(RecentArcMediaSourceTest, GetDocumentFiles) {
+  EnableFakeFileSystemInstance();
+
+  std::vector<RecentFile> files =
+      GetRecentFiles(RecentSource::FileType::kDocument);
+
+  ASSERT_EQ(2u, files.size());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kDocumentsRootDocumentId)
+          .Append("text.txt"),
+      files[0].url().path());
+  EXPECT_EQ(base::Time::FromJavaTime(10), files[0].last_modified());
+  EXPECT_EQ(
+      arc::GetDocumentsProviderMountPath(arc::kMediaDocumentsProviderAuthority,
+                                         arc::kDocumentsRootDocumentId)
+          .Append("word.doc"),
+      files[1].url().path());
+  EXPECT_EQ(base::Time::FromJavaTime(9), files[1].last_modified());
+}
+
 TEST_F(RecentArcMediaSourceTest, UmaStats) {
   EnableFakeFileSystemInstance();
 
diff --git a/chrome/browser/extensions/api/commands/command_service.h b/chrome/browser/extensions/api/commands/command_service.h
index 245fb84..6d7ea95 100644
--- a/chrome/browser/extensions/api/commands/command_service.h
+++ b/chrome/browser/extensions/api/commands/command_service.h
@@ -10,11 +10,11 @@
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
 #include "base/scoped_observation.h"
-#include "chrome/common/extensions/command.h"
 #include "extensions/browser/browser_context_keyed_api_factory.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
 #include "extensions/common/api/extension_action/action_info.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension.h"
 
 class Profile;
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index 0c0058a..ec7ce69 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/extensions/shared_module_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
-#include "chrome/common/extensions/command.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
@@ -46,6 +45,7 @@
 #include "extensions/browser/ui_util.h"
 #include "extensions/browser/warning_service.h"
 #include "extensions/common/api/extension_action/action_info.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension_set.h"
 #include "extensions/common/install_warning.h"
 #include "extensions/common/manifest.h"
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys_private/OWNERS b/chrome/browser/extensions/api/enterprise_platform_keys_private/OWNERS
index 19c0042..c6f0c7f 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys_private/OWNERS
+++ b/chrome/browser/extensions/api/enterprise_platform_keys_private/OWNERS
@@ -1,5 +1,4 @@
 emaxx@chromium.org
 drcrash@chromium.org
 bartfab@chromium.org
-mnissler@chromium.org
 dkrahn@chromium.org
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api_interactive_uitest.cc b/chrome/browser/extensions/api/extension_action/extension_action_api_interactive_uitest.cc
index 4151ae5..8cb09a2 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api_interactive_uitest.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api_interactive_uitest.cc
@@ -44,7 +44,7 @@
   // `extension`, and waits for a corresponding test success notification.
   void RunScriptTest(const std::string& script, const Extension& extension) {
     ResultCatcher result_catcher;
-    browsertest_util::BackgroundScriptExecutor::ExecuteScript(
+    browsertest_util::BackgroundScriptExecutor::ExecuteScriptAsync(
         profile(), extension.id(), script);
     EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
   }
diff --git a/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
index 707afb2..70c24fd 100644
--- a/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
+++ b/chrome/browser/extensions/api/gcm/extension_gcm_app_handler_unittest.cc
@@ -271,7 +271,7 @@
     // This is needed to create extension service under CrOS.
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     test_user_manager_ = std::make_unique<ash::ScopedTestUserManager>();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 #endif
 
     // Create a new profile.
@@ -311,7 +311,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     gcm_app_handler_.reset();
     profile_.reset();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
 #endif
   }
 
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.cc b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
index fcc3293a..ab8c0ec 100644
--- a/chrome/browser/extensions/api/image_writer_private/test_utils.cc
+++ b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
@@ -246,7 +246,7 @@
       // For browser tests, chromeos::InitializeDBus() automatically does the
       // same.
       chromeos::DBusThreadManager::Initialize();
-      chromeos::ConciergeClient::InitializeFake(
+      ash::ConciergeClient::InitializeFake(
           /*fake_cicerone_client=*/nullptr);
     }
     chromeos::DBusThreadManager::GetSetterForTesting()->SetImageBurnerClient(
@@ -275,7 +275,7 @@
   if (chromeos::DBusThreadManager::IsInitialized()) {
     // When in browser_tests, this path is not taken. These clients have already
     // been shut down by chromeos::ShutdownDBus().
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
   ash::disks::DiskMountManager::Shutdown();
diff --git a/chrome/browser/extensions/api/input_ime/DIR_METADATA b/chrome/browser/extensions/api/input_ime/DIR_METADATA
new file mode 100644
index 0000000..caac77f
--- /dev/null
+++ b/chrome/browser/extensions/api/input_ime/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chrome/browser/extensions/api/scripting/scripting_apitest.cc b/chrome/browser/extensions/api/scripting/scripting_apitest.cc
index c6b0eb1..1b44b668 100644
--- a/chrome/browser/extensions/api/scripting/scripting_apitest.cc
+++ b/chrome/browser/extensions/api/scripting/scripting_apitest.cc
@@ -392,14 +392,18 @@
   // A helper function to run the script in the worker context.
   auto run_script_in_worker = [this, extension](const std::string& script) {
     return browsertest_util::BackgroundScriptExecutor::ExecuteScript(
-        profile(), extension->id(), script);
+        profile(), extension->id(), script,
+        browsertest_util::BackgroundScriptExecutor::ResultCapture::
+            kSendScriptResult);
   };
 
   auto get_default_result = [run_script_in_worker]() {
-    return run_script_in_worker("self.defaultResult;");
+    return run_script_in_worker(
+        "chrome.test.sendScriptResult(self.defaultResult);");
   };
   auto get_immediate_result = [run_script_in_worker]() {
-    return run_script_in_worker("self.immediateResult;");
+    return run_script_in_worker(
+        "chrome.test.sendScriptResult(self.immediateResult);");
   };
 
   // Send back some HTML for the request (this can only be done once the
@@ -415,7 +419,8 @@
                                                   /*will_reply=*/false);
   ExtensionTestMessageListener default_listener("default complete",
                                                 /*will_reply=*/false);
-  run_script_in_worker(base::StringPrintf(kInjectScripts, tab_id));
+  browsertest_util::BackgroundScriptExecutor::ExecuteScriptAsync(
+      profile(), extension->id(), base::StringPrintf(kInjectScripts, tab_id));
 
   // The script with immediate injection should finish (but it's still round
   // trips to the browser and renderer, so it won't be synchronous).
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/DIR_METADATA b/chrome/browser/extensions/api/virtual_keyboard_private/DIR_METADATA
index 1ae4c22..caac77f 100644
--- a/chrome/browser/extensions/api/virtual_keyboard_private/DIR_METADATA
+++ b/chrome/browser/extensions/api/virtual_keyboard_private/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chrome/browser/extensions/browsertest_util_browsertest.cc b/chrome/browser/extensions/browsertest_util_browsertest.cc
index 7ff6786..dcbb643 100644
--- a/chrome/browser/extensions/browsertest_util_browsertest.cc
+++ b/chrome/browser/extensions/browsertest_util_browsertest.cc
@@ -12,6 +12,8 @@
 
 namespace extensions {
 
+using browsertest_util::BackgroundScriptExecutor;
+
 using BrowserTestUtilBrowserTest = ExtensionBrowserTest;
 
 // Tests the ability to run JS in an extension-registered service worker.
@@ -36,10 +38,79 @@
   ASSERT_TRUE(extension);
   ASSERT_TRUE(listener.WaitUntilSatisfied());
 
-  base::Value value = browsertest_util::BackgroundScriptExecutor::ExecuteScript(
-      profile(), extension->id(), "console.warn('script ran'); myTestFlag;");
+  {
+    // Synchronous result.
+    base::Value value = BackgroundScriptExecutor::ExecuteScript(
+        profile(), extension->id(), "chrome.test.sendScriptResult(myTestFlag);",
+        BackgroundScriptExecutor::ResultCapture::kSendScriptResult);
+    EXPECT_THAT(value, base::test::IsJson(R"("HELLO!")"));
+  }
 
-  EXPECT_THAT(value, base::test::IsJson(R"("HELLO!")"));
+  {
+    // Asynchronous result.
+    static constexpr char kScript[] =
+        R"(setTimeout(() => {
+             chrome.test.sendScriptResult(myTestFlag);
+           });)";
+    base::Value value = BackgroundScriptExecutor::ExecuteScript(
+        profile(), extension->id(), kScript,
+        BackgroundScriptExecutor::ResultCapture::kSendScriptResult);
+    EXPECT_THAT(value, base::test::IsJson(R"("HELLO!")"));
+  }
+}
+
+// Tests the ability to run JS in an extension background page.
+IN_PROC_BROWSER_TEST_F(BrowserTestUtilBrowserTest,
+                       ExecuteScriptInBackgroundPage) {
+  constexpr char kManifest[] =
+      R"({
+          "name": "Test",
+          "manifest_version": 2,
+          "background": {"scripts": ["background.js"]},
+          "version": "0.1"
+        })";
+  constexpr char kBackgroundScript[] = R"(self.myTestFlag = 'HELLO!';)";
+
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(kManifest);
+  test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), kBackgroundScript);
+  const Extension* extension = LoadExtension(test_dir.UnpackedPath());
+  ASSERT_TRUE(extension);
+
+  {
+    // Synchronous result.
+    base::Value value = BackgroundScriptExecutor::ExecuteScript(
+        profile(), extension->id(), "chrome.test.sendScriptResult(myTestFlag);",
+        BackgroundScriptExecutor::ResultCapture::kSendScriptResult,
+        browsertest_util::ScriptUserActivation::kActivate);
+    EXPECT_THAT(value, base::test::IsJson(R"("HELLO!")"));
+  }
+
+  {
+    // Asynchronous result with sendScriptResult().
+    static constexpr char kScript[] =
+        R"(setTimeout(() => {
+             chrome.test.sendScriptResult(myTestFlag);
+           }, 0);)";
+    base::Value value = BackgroundScriptExecutor::ExecuteScript(
+        profile(), extension->id(), kScript,
+        BackgroundScriptExecutor::ResultCapture::kSendScriptResult,
+        browsertest_util::ScriptUserActivation::kActivate);
+    EXPECT_THAT(value, base::test::IsJson(R"("HELLO!")"));
+  }
+
+  {
+    // Asynchronous result with domAutomationController.send().
+    static constexpr char kScript[] =
+        R"(setTimeout(() => {
+             window.domAutomationController.send(myTestFlag);
+           }, 0);)";
+    base::Value value = BackgroundScriptExecutor::ExecuteScript(
+        profile(), extension->id(), kScript,
+        BackgroundScriptExecutor::ResultCapture::kWindowDomAutomationController,
+        browsertest_util::ScriptUserActivation::kActivate);
+    EXPECT_THAT(value, base::test::IsJson(R"("HELLO!")"));
+  }
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_keybinding_registry.cc b/chrome/browser/extensions/extension_keybinding_registry.cc
index f11d113..2c650ddfa 100644
--- a/chrome/browser/extensions/extension_keybinding_registry.cc
+++ b/chrome/browser/extensions/extension_keybinding_registry.cc
@@ -13,11 +13,11 @@
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/common/extensions/command.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/media_keys_listener_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/event_router.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension_set.h"
 #include "extensions/common/manifest_constants.h"
 
diff --git a/chrome/browser/extensions/global_shortcut_listener_mac.mm b/chrome/browser/extensions/global_shortcut_listener_mac.mm
index befe726..2325d0b 100644
--- a/chrome/browser/extensions/global_shortcut_listener_mac.mm
+++ b/chrome/browser/extensions/global_shortcut_listener_mac.mm
@@ -9,9 +9,9 @@
 #include <IOKit/hidsystem/ev_keymap.h>
 
 #import "base/mac/foundation_util.h"
-#include "chrome/common/extensions/command.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/media_keys_listener_manager.h"
+#include "extensions/common/command.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/events/event.h"
 #import "ui/events/keycodes/keyboard_code_conversion_mac.h"
diff --git a/chrome/browser/extensions/global_shortcut_listener_win.cc b/chrome/browser/extensions/global_shortcut_listener_win.cc
index 0f344ee..2778a18 100644
--- a/chrome/browser/extensions/global_shortcut_listener_win.cc
+++ b/chrome/browser/extensions/global_shortcut_listener_win.cc
@@ -7,9 +7,9 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/win/win_util.h"
-#include "chrome/common/extensions/command.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/media_keys_listener_manager.h"
+#include "extensions/common/command.h"
 #include "ui/base/accelerators/accelerator.h"
 #include "ui/events/event_constants.h"
 #include "ui/events/keycodes/keyboard_code_conversion_win.h"
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc
index 7ab4305..f2ea179b 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier.cc
+++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -320,7 +320,7 @@
 void ScriptingPermissionsModifier::WithholdHostPermissions() {
   std::unique_ptr<const PermissionSet> revokable_permissions =
       GetRevokablePermissions();
-  CHECK(revokable_permissions);  // For https://crbug.com/1307911
+  DCHECK(revokable_permissions);
   PermissionsUpdater(browser_context_)
       .RevokeRuntimePermissions(*extension_, *revokable_permissions,
                                 base::DoNothing());
diff --git a/chrome/browser/feed/web_feed_tab_helper.cc b/chrome/browser/feed/web_feed_tab_helper.cc
index ad54ccf..d481bdd 100644
--- a/chrome/browser/feed/web_feed_tab_helper.cc
+++ b/chrome/browser/feed/web_feed_tab_helper.cc
@@ -60,15 +60,7 @@
 
 WebFeedTabHelper::~WebFeedTabHelper() = default;
 
-void WebFeedTabHelper::DidFinishNavigation(
-    content::NavigationHandle* navigation_handle) {
-  if (!navigation_handle->IsInPrimaryMainFrame())
-    return;
-  if (!navigation_handle->HasCommitted())
-    return;
-  if (navigation_handle->IsSameDocument())
-    return;
-
+void WebFeedTabHelper::PrimaryPageChanged(content::Page& page) {
   // This is a new navigation so we can invalidate any previously scheduled
   // operations.
   weak_ptr_factory_.InvalidateWeakPtrs();
diff --git a/chrome/browser/feed/web_feed_tab_helper.h b/chrome/browser/feed/web_feed_tab_helper.h
index df5f44cb..b43d31fc 100644
--- a/chrome/browser/feed/web_feed_tab_helper.h
+++ b/chrome/browser/feed/web_feed_tab_helper.h
@@ -68,8 +68,7 @@
   explicit WebFeedTabHelper(content::WebContents* web_contents);
 
   // Overridden from content::WebContentsObserver:
-  void DidFinishNavigation(
-      content::NavigationHandle* navigation_handle) override;
+  void PrimaryPageChanged(content::Page& page) override;
 
   void OnWebFeedInfoRetrieved(const GURL& url, WebFeedMetadata metadata);
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 6e738dc..2c8a98d0 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1158,6 +1158,11 @@
     "expiry_milestone": 105
   },
   {
+    "name": "deprecate-assistant-stylus-features",
+    "owners": [ "croissant-eng", "angelaxiao" ],
+    "expiry_milestone": 110
+  },
+  {
     "name": "deprecate-low-usage-codecs",
     "owners": [ "dalecurtis", "sweyn" ],
     "expiry_milestone": 92
@@ -5665,6 +5670,11 @@
       "expiry_milestone":102
   },
   {
+    "name": "tangible-sync",
+    "owners": [ "aliceywang", "chrome-signin-team" ],
+    "expiry_milestone":120
+  },
+  {
     "name": "terminal-dev",
     "owners": [ "joelhockey", "lxj@google.com", "//chrome/browser/ash/guest_os/OWNERS" ],
     // This flag is used by CrOS Terminal developers for testing SSH on devices
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 59c0601..7ec04a9 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -122,6 +122,10 @@
     "If enabled, the full screen signin promo will be forced to show up at "
     "Chrome start-up.";
 
+const char kTangibleSyncName[] = "Tangible Sync";
+const char kTangibleSyncDescription[] =
+    "Enables the tangible sync when a user starts the sync consent flow";
+
 const char kDebugHistoryInterventionNoUserActivationName[] =
     "Debug flag for history intervention on no user activation";
 const char kDebugHistoryInterventionNoUserActivationDescription[] =
@@ -444,6 +448,10 @@
 const char kAutofillSaveCardUiExperimentDescription[] =
     "When enabled, it will trigger slightly different UI variants along with "
     "notification texts, when the upload credit card save bubble is shown.";
+const char kAutofillSaveCardUiExperimentFasterAndProtected[] =
+    "Faster and Protected";
+const char kAutofillSaveCardUiExperimentEncryptedAndSecure[] =
+    "Encrypted and Secure";
 
 const char kAutofillSuggestVirtualCardsOnIncompleteFormName[] =
     "Autofill suggests virtual cards on incomplete forms";
@@ -4686,6 +4694,12 @@
     "Enable the variable refresh rate (Adaptive Sync) setting for capable "
     "displays.";
 
+const char kDeprecateAssistantStylusFeaturesName[] =
+    "Deprecate Assistant Stylus Features";
+const char kDeprecateAssistantStylusFeaturesDescription[] =
+    "Deprecates the stylus features associated with the Assistant \"what's on "
+    "my screen\" feature which is already deprecated.";
+
 const char kDisableQuickAnswersV2TranslationName[] =
     "Disable Quick Answers Translation";
 const char kDisableQuickAnswersV2TranslationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 243dfcf..90e61aa 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -99,6 +99,9 @@
 extern const char kForceStartupSigninPromoName[];
 extern const char kForceStartupSigninPromoDescription[];
 
+extern const char kTangibleSyncName[];
+extern const char kTangibleSyncDescription[];
+
 extern const char kLauncherAppSortName[];
 extern const char kLauncherAppSortDescription[];
 
@@ -244,6 +247,8 @@
 
 extern const char kAutofillSaveCardUiExperimentName[];
 extern const char kAutofillSaveCardUiExperimentDescription[];
+extern const char kAutofillSaveCardUiExperimentFasterAndProtected[];
+extern const char kAutofillSaveCardUiExperimentEncryptedAndSecure[];
 
 extern const char kAutofillSuggestVirtualCardsOnIncompleteFormName[];
 extern const char kAutofillSuggestVirtualCardsOnIncompleteFormDescription[];
@@ -2670,6 +2675,9 @@
 extern const char kEnableTouchscreensInDiagnosticsAppName[];
 extern const char kEnableTouchscreensInDiagnosticsAppDescription[];
 
+extern const char kDeprecateAssistantStylusFeaturesName[];
+extern const char kDeprecateAssistantStylusFeaturesDescription[];
+
 extern const char kDisableQuickAnswersV2TranslationName[];
 extern const char kDisableQuickAnswersV2TranslationDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 2b53794..58f727f5 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -370,6 +370,7 @@
     &switches::kAllowSyncOffForChildAccounts,
     &switches::kForceStartupSigninPromo,
     &switches::kForceDisableExtendedSyncPromos,
+    &switches::kTangibleSync,
     &syncer::kEnableSyncImmediatelyInFRE,
     &syncer::kSyncTrustedVaultPassphraseRecovery,
     &syncer::kSyncAndroidPromosWithSingleButton,
@@ -575,7 +576,7 @@
     "ContextualSearchMlTapSuppression", base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature KContextualSearchNewSettings{
-    "ContextualSearchNewSettings", base::FEATURE_DISABLED_BY_DEFAULT};
+    "ContextualSearchNewSettings", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kContextualSearchTapDisableOverride{
     "ContextualSearchTapDisableOverride", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -585,7 +586,7 @@
     base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kContextualSearchTranslations{
-    "ContextualSearchTranslations", base::FEATURE_DISABLED_BY_DEFAULT};
+    "ContextualSearchTranslations", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kContextualTriggersSelectionHandles{
     "ContextualTriggersSelectionHandles", base::FEATURE_DISABLED_BY_DEFAULT};
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 1229a1b..bca838d0 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
@@ -349,6 +349,7 @@
     public static final String FORCE_DISABLE_EXTENDED_SYNC_PROMOS =
             "ForceDisableExtendedSyncPromos";
     public static final String FORCE_STARTUP_SIGNIN_PROMO = "ForceStartupSigninPromo";
+    public static final String TANGIBLE_SYNC = "TangibleSync";
     public static final String GIVE_JAVA_UI_THREAD_DEFAULT_TASK_TRAITS_USER_BLOCKING_PRIORITY =
             "GiveJavaUiThreadDefaultTaskTraitsUserBlockingPriority";
     public static final String GRID_TAB_SWITCHER_FOR_TABLETS = "GridTabSwitcherForTablets";
diff --git a/chrome/browser/gcm/gcm_profile_service_unittest.cc b/chrome/browser/gcm/gcm_profile_service_unittest.cc
index ebf6261d..28163d4 100644
--- a/chrome/browser/gcm/gcm_profile_service_unittest.cc
+++ b/chrome/browser/gcm/gcm_profile_service_unittest.cc
@@ -164,7 +164,7 @@
 
 void GCMProfileServiceTest::SetUp() {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-  chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+  ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 #endif
   TestingProfile::Builder builder;
   profile_ = builder.Build();
@@ -174,7 +174,7 @@
   gcm_profile_service_->driver()->RemoveAppHandler(kTestAppID);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   profile_.reset();
-  chromeos::ConciergeClient::Shutdown();
+  ash::ConciergeClient::Shutdown();
 #endif
 }
 
diff --git a/chrome/browser/media/media_engagement_browsertest.cc b/chrome/browser/media/media_engagement_browsertest.cc
index 5a515f8..0ff72d2 100644
--- a/chrome/browser/media/media_engagement_browsertest.cc
+++ b/chrome/browser/media/media_engagement_browsertest.cc
@@ -7,6 +7,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/gmock_callback_support.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "base/test/test_mock_time_task_runner.h"
@@ -1040,9 +1041,8 @@
   std::unique_ptr<content::test::FencedFrameTestHelper> fenced_frame_helper_;
 };
 
-// TODO(crbug.com/1320380): Re-enable this test
 IN_PROC_BROWSER_TEST_F(MediaEngagementContentsObserverFencedFrameBrowserTest,
-                       DISABLED_SendEngagementLevelToRenderFrameOnFencedFrame) {
+                       SendEngagementLevelToRenderFrameOnFencedFrame) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
   MockAutoplayConfigurationClient client;
@@ -1071,10 +1071,13 @@
   OverrideInterface(fenced_frame_host, &fenced_frame_client);
   GURL fenced_frame_navigate_url =
       embedded_test_server()->GetURL("b.com", "/fenced_frames/title2.html");
+  base::RunLoop run_loop;
   EXPECT_CALL(fenced_frame_client,
               AddAutoplayFlags(url::Origin::Create(fenced_frame_navigate_url),
                                testing::_))
-      .Times(1);
+      .Times(1)
+      .WillOnce(base::test::RunClosure(run_loop.QuitClosure()));
   fenced_frame_test_helper().NavigateFrameInFencedFrameTree(
       fenced_frame_host, fenced_frame_navigate_url);
+  run_loop.Run();
 }
diff --git a/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc
index 8cb4c36..b05ca54 100644
--- a/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc
+++ b/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc
@@ -62,7 +62,9 @@
       PageLoad::kInteractiveTiming_TotalAdjustedInputDelayName, int64_t(0), 0);
 }
 
-IN_PROC_BROWSER_TEST_F(TotalInputDelayIntegrationTest, MultipleInputEvents) {
+// Flaky on multiple platforms. https://crbug.com/1163677
+IN_PROC_BROWSER_TEST_F(TotalInputDelayIntegrationTest,
+                       DISABLED_MultipleInputEvents) {
   LoadHTML(R"HTML(
     <script type="text/javascript">
     let eventCounts = {mouseup: 0, pointerup: 0, click: 0};
@@ -91,8 +93,7 @@
     };
 
     runtest = async () => {
-      // return await eventPromise;
-      return true;
+      return await eventPromise;
     };
     </script>
   )HTML");
diff --git a/chrome/browser/page_load_metrics/observers/foreground_duration_ukm_observer.cc b/chrome/browser/page_load_metrics/observers/foreground_duration_ukm_observer.cc
index 1d95d6a..c0c8449a 100644
--- a/chrome/browser/page_load_metrics/observers/foreground_duration_ukm_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/foreground_duration_ukm_observer.cc
@@ -30,11 +30,12 @@
   return CONTINUE_OBSERVING;
 }
 
-// TODO(https://crbug.com/1317494): Audit and use appropriate policy.
 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
 ForegroundDurationUKMObserver::OnFencedFramesStart(
     content::NavigationHandle* navigation_handle,
     const GURL& currently_committed_url) {
+  // This class doesn't use information on subframes and inner pages. No need to
+  // forward.
   return STOP_OBSERVING;
 }
 
diff --git a/chrome/browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer.cc
index 8711a77..c7ec225 100644
--- a/chrome/browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/live_tab_count_page_load_metrics_observer.cc
@@ -46,11 +46,12 @@
 
 LiveTabCountPageLoadMetricsObserver::~LiveTabCountPageLoadMetricsObserver() {}
 
-// TODO(https://crbug.com/1317494): Audit and use appropriate policy.
 page_load_metrics::PageLoadMetricsObserver::ObservePolicy
 LiveTabCountPageLoadMetricsObserver::OnFencedFramesStart(
     content::NavigationHandle* navigation_handle,
     const GURL& currently_committed_url) {
+  // This class doesn't use information on subframes and inner pages. No need to
+  // forward.
   return STOP_OBSERVING;
 }
 
diff --git a/chrome/browser/performance_manager/mechanisms/working_set_trimmer_chromeos_unittest.cc b/chrome/browser/performance_manager/mechanisms/working_set_trimmer_chromeos_unittest.cc
index a2a8633..57ad53e 100644
--- a/chrome/browser/performance_manager/mechanisms/working_set_trimmer_chromeos_unittest.cc
+++ b/chrome/browser/performance_manager/mechanisms/working_set_trimmer_chromeos_unittest.cc
@@ -36,7 +36,7 @@
   ~TestWorkingSetTrimmerChromeOS() override = default;
 
   void SetUp() override {
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     arc_session_manager_ = arc::CreateTestArcSessionManager(
         std::make_unique<arc::ArcSessionRunner>(
             base::BindRepeating(arc::FakeArcSession::Create)));
@@ -57,7 +57,7 @@
     trimmer_.reset();
     testing_profile_.reset();
     TearDownArcSessionManager();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
   }
 
  protected:
diff --git a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_arcvm_unittest.cc b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_arcvm_unittest.cc
index 5f9c2252..240be1f 100644
--- a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_arcvm_unittest.cc
+++ b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_arcvm_unittest.cc
@@ -45,7 +45,7 @@
         {"", "--enable-arcvm"});
     arc::prefs::RegisterLocalStatePrefs(local_state_.registry());
     arc::StabilityMetricsManager::Initialize(&local_state_);
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     arc_service_manager_ = std::make_unique<arc::ArcServiceManager>();
 
@@ -83,7 +83,7 @@
     arc_service_manager_.reset();
 
     // All other object must be destroyed before shutting down ConciergeClient.
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     arc::StabilityMetricsManager::Shutdown();
   }
 
diff --git a/chrome/browser/permissions/grouped_permission_infobar_delegate_android.cc b/chrome/browser/permissions/grouped_permission_infobar_delegate_android.cc
index c6120515..86cd4a0 100644
--- a/chrome/browser/permissions/grouped_permission_infobar_delegate_android.cc
+++ b/chrome/browser/permissions/grouped_permission_infobar_delegate_android.cc
@@ -12,7 +12,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "components/infobars/content/content_infobar_manager.h"
 #include "components/infobars/core/infobar.h"
-#include "components/permissions/android/permission_prompt_android.h"
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
 #include "components/permissions/permission_request.h"
 #include "components/permissions/permission_request_manager.h"
 #include "components/permissions/permission_uma_util.h"
diff --git a/chrome/browser/permissions/notification_blocked_message_delegate_android.cc b/chrome/browser/permissions/notification_blocked_message_delegate_android.cc
index c7040e9..dc0e8d1 100644
--- a/chrome/browser/permissions/notification_blocked_message_delegate_android.cc
+++ b/chrome/browser/permissions/notification_blocked_message_delegate_android.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/permissions/quiet_permission_prompt_model_android.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/messages/android/message_dispatcher_bridge.h"
-#include "components/permissions/android/permission_prompt_android.h"
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
 #include "components/permissions/permission_request.h"
 #include "components/permissions/permission_request_manager.h"
 #include "components/permissions/permission_ui_selector.h"
diff --git a/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc b/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
index 99edeca6..0ffc1adb 100644
--- a/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
+++ b/chrome/browser/policy/cloud/cloud_policy_invalidator_unittest.cc
@@ -364,7 +364,7 @@
 
 bool CloudPolicyInvalidatorTestBase::IsUnsent(
     const invalidation::Invalidation& invalidation) {
-  return invalidation_service_.GetMockAckHandler()->IsUnsent(invalidation);
+  return invalidation_service_.GetFakeAckHandler()->IsUnsent(invalidation);
 }
 
 bool CloudPolicyInvalidatorTestBase::CheckPolicyRefreshedWithUnknownVersion() {
@@ -384,7 +384,7 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_FALSE(IsUnsent(invalidation));
-  return !invalidation_service_.GetMockAckHandler()->IsUnacked(invalidation);
+  return !invalidation_service_.GetFakeAckHandler()->IsUnacked(invalidation);
 }
 
 bool CloudPolicyInvalidatorTestBase::IsInvalidatorRegistered() {
diff --git a/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc b/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc
index 3944932..13071bc 100644
--- a/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc
+++ b/chrome/browser/policy/cloud/remote_commands_invalidator_unittest.cc
@@ -6,9 +6,9 @@
 
 #include "base/run_loop.h"
 #include "base/test/task_environment.h"
+#include "components/invalidation/impl/fake_ack_handler.h"
 #include "components/invalidation/impl/fake_invalidation_service.h"
 #include "components/invalidation/impl/invalidator_registrar_with_memory.h"
-#include "components/invalidation/impl/mock_ack_handler.h"
 #include "components/invalidation/public/invalidation.h"
 #include "components/invalidation/public/invalidation_util.h"
 #include "components/invalidation/public/invalidator_state.h"
@@ -82,12 +82,12 @@
   }
 
   bool IsInvalidationSent(const invalidation::Invalidation& invalidation) {
-    return !invalidation_service_.GetMockAckHandler()->IsUnsent(invalidation);
+    return !invalidation_service_.GetFakeAckHandler()->IsUnsent(invalidation);
   }
 
   bool IsInvalidationAcknowledged(
       const invalidation::Invalidation& invalidation) {
-    return invalidation_service_.GetMockAckHandler()->IsAcknowledged(
+    return invalidation_service_.GetFakeAckHandler()->IsAcknowledged(
         invalidation);
   }
 
@@ -176,8 +176,8 @@
     const invalidation::Invalidation invalidation = FireInvalidation(topic);
 
     EXPECT_TRUE(
-        invalidation_service_.GetMockAckHandler()->IsUnacked(invalidation));
-    EXPECT_FALSE(invalidation_service_.GetMockAckHandler()->IsAcknowledged(
+        invalidation_service_.GetFakeAckHandler()->IsUnacked(invalidation));
+    EXPECT_FALSE(invalidation_service_.GetFakeAckHandler()->IsAcknowledged(
         invalidation));
     VerifyExpectations();
   }
diff --git a/chrome/browser/policy/policy_prefs_browsertest.cc b/chrome/browser/policy/policy_prefs_browsertest.cc
index 7a8a8fc..cf28eb53 100644
--- a/chrome/browser/policy/policy_prefs_browsertest.cc
+++ b/chrome/browser/policy/policy_prefs_browsertest.cc
@@ -117,15 +117,10 @@
 // README SHERIFFs: This test encapsulates a whole suite of individual browser
 // tests for performance reasons and therefore has an increased chance of
 // failure/flakiness.
-// IPORTANT: Please add hendrich@chromium.org on any related bugs when
+// IMPORTANT: Please add hendrich@chromium.org on any related bugs when
 // disabling this test.
-// Flake on linux-chromeos-dbg: crbug.com/1294825
-#if (BUILDFLAG(IS_CHROMEOS) && !defined(NDEBUG))
-#define MAYBE_PolicyToPrefsMapping DISABLED_PolicyToPrefsMapping
-#else
-#define MAYBE_PolicyToPrefsMapping PolicyToPrefsMapping
-#endif
-IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, MAYBE_PolicyToPrefsMapping) {
+// Flaky on all platforms: crbug.com/1294825
+IN_PROC_BROWSER_TEST_F(PolicyPrefsTest, DISABLED_PolicyToPrefsMapping) {
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   policy::FakeBrowserDMTokenStorage storage;
   policy::BrowserDMTokenStorage::SetForTesting(&storage);
diff --git a/chrome/browser/printing/print_job_worker_oop.cc b/chrome/browser/printing/print_job_worker_oop.cc
index dd27bbf3..1e158ec 100644
--- a/chrome/browser/printing/print_job_worker_oop.cc
+++ b/chrome/browser/printing/print_job_worker_oop.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/printing/print_job_worker_oop.h"
 
+#include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
@@ -32,6 +33,20 @@
 
 namespace {
 
+// Enumeration of printing events when submitting a job to a print driver.
+// This must stay in sync with the corresponding histogram in `histograms.xml`.
+// These values are persisted to logs.  Entries should not be renumbered and
+// numeric values should never be reused.
+enum class PrintOopResult {
+  kSuccessful = 0,
+  kCanceled = 1,
+  kAccessDenied = 2,
+  kFailed = 3,
+  kMaxValue = kFailed,
+};
+
+constexpr char kPrintOopPrintResultHistogramName[] = "Printing.Oop.PrintResult";
+
 mojom::PrintTargetType DeterminePrintTargetType(
     const base::Value::Dict& job_settings) {
 #if BUILDFLAG(IS_MAC)
@@ -210,6 +225,8 @@
   VLOG(1) << "Printing completed with service for document "
           << document()->cookie();
   UnregisterServiceManagerClient();
+  base::UmaHistogramEnumeration(kPrintOopPrintResultHistogramName,
+                                PrintOopResult::kSuccessful);
   FinishDocumentDone(job_id);
 }
 
@@ -380,6 +397,7 @@
 void PrintJobWorkerOop::NotifyFailure(mojom::ResultCode result) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
+  PrintOopResult uma_result = PrintOopResult::kFailed;
   if (result == mojom::ResultCode::kAccessDenied) {
     // An attempt to restart could be undesirable if some pages were able to
     // be sent to the destination before the error occurred.  If we receive
@@ -393,7 +411,11 @@
     PrintBackendServiceManager& service_mgr =
         PrintBackendServiceManager::GetInstance();
     service_mgr.SetPrinterDriverFoundToRequireElevatedPrivilege(device_name_);
+    uma_result = PrintOopResult::kAccessDenied;
+  } else if (result == mojom::ResultCode::kCanceled) {
+    uma_result = PrintOopResult::kCanceled;
   }
+  base::UmaHistogramEnumeration(kPrintOopPrintResultHistogramName, uma_result);
   ShowErrorDialog();
 
   // Initiate rest of regular failure handling.
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
index 845b77c0..b6f2690 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
@@ -35,6 +35,10 @@
 #include "third_party/blink/public/common/features.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
+#endif
+
 namespace {
 
 constexpr char kBlockedTopicsTopicKey[] = "topic";
@@ -149,6 +153,9 @@
     content::InterestGroupManager* interest_group_manager,
     profile_metrics::BrowserProfileType profile_type,
     content::BrowsingDataRemover* browsing_data_remover,
+#if !BUILDFLAG(IS_ANDROID)
+    TrustSafetySentimentService* sentiment_service,
+#endif
     browsing_topics::BrowsingTopicsService* browsing_topics_service)
     : privacy_sandbox_settings_(privacy_sandbox_settings),
       cookie_settings_(cookie_settings),
@@ -159,6 +166,9 @@
       interest_group_manager_(interest_group_manager),
       profile_type_(profile_type),
       browsing_data_remover_(browsing_data_remover),
+#if !BUILDFLAG(IS_ANDROID)
+      sentiment_service_(sentiment_service),
+#endif
       browsing_topics_service_(browsing_topics_service) {
   DCHECK(privacy_sandbox_settings_);
   DCHECK(pref_service_);
@@ -213,6 +223,7 @@
 
 void PrivacySandboxService::DialogActionOccurred(
     PrivacySandboxService::DialogAction action) {
+  InformSentimentService(action);
   switch (action) {
     case (DialogAction::kNoticeShown): {
       DCHECK_EQ(DialogType::kNotice, GetRequiredDialogType());
@@ -1081,3 +1092,38 @@
   DCHECK(privacy_sandbox::kPrivacySandboxSettings3NoticeRequired.Get());
   return DialogType::kNotice;
 }
+
+void PrivacySandboxService::InformSentimentService(
+    PrivacySandboxService::DialogAction action) {
+#if !BUILDFLAG(IS_ANDROID)
+  if (!sentiment_service_)
+    return;
+
+  TrustSafetySentimentService::FeatureArea area;
+  switch (action) {
+    case (DialogAction::kNoticeOpenSettings):
+      area = TrustSafetySentimentService::FeatureArea::
+          kPrivacySandbox3NoticeSettings;
+      break;
+    case (DialogAction::kNoticeAcknowledge):
+      area = TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk;
+      break;
+    case (DialogAction::kNoticeDismiss):
+      area = TrustSafetySentimentService::FeatureArea::
+          kPrivacySandbox3NoticeDismiss;
+      break;
+    case (DialogAction::kConsentAccepted):
+      area = TrustSafetySentimentService::FeatureArea::
+          kPrivacySandbox3ConsentAccept;
+      break;
+    case (DialogAction::kConsentDeclined):
+      area = TrustSafetySentimentService::FeatureArea::
+          kPrivacySandbox3ConsentDecline;
+      break;
+    default:
+      return;
+  }
+
+  sentiment_service_->InteractedWithPrivacySandbox3(area);
+#endif
+}
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
index 1ee75252..aced8c1c 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -22,6 +22,9 @@
 
 class Browser;
 class PrefService;
+#if !BUILDFLAG(IS_ANDROID)
+class TrustSafetySentimentService;
+#endif
 
 namespace content {
 class BrowsingDataRemover;
@@ -100,7 +103,11 @@
       content::InterestGroupManager* interest_group_manager,
       profile_metrics::BrowserProfileType profile_type,
       content::BrowsingDataRemover* browsing_data_remover,
-      browsing_topics::BrowsingTopicsService* browsing_topics_service_);
+#if !BUILDFLAG(IS_ANDROID)
+      TrustSafetySentimentService* sentiment_service,
+#endif
+      browsing_topics::BrowsingTopicsService* browsing_topics_service);
+
   ~PrivacySandboxService() override;
 
   // Returns the dialog type that should be shown to the user. This consults
@@ -451,6 +458,9 @@
   raw_ptr<content::InterestGroupManager> interest_group_manager_;
   profile_metrics::BrowserProfileType profile_type_;
   raw_ptr<content::BrowsingDataRemover> browsing_data_remover_;
+#if !BUILDFLAG(IS_ANDROID)
+  raw_ptr<TrustSafetySentimentService> sentiment_service_;
+#endif
   raw_ptr<browsing_topics::BrowsingTopicsService> browsing_topics_service_;
 
   base::ScopedObservation<syncer::SyncService, syncer::SyncServiceObserver>
@@ -480,6 +490,11 @@
       {browsing_topics::Topic(4),
        privacy_sandbox::CanonicalTopic::AVAILABLE_TAXONOMY}};
 
+  // Informs the TrustSafetySentimentService, if it exists, that a
+  // Privacy Sandbox 3 interaction for an area has occurred The area is
+  // determined by |action|. Only a subset of actions has a corresponding area.
+  void InformSentimentService(PrivacySandboxService::DialogAction action);
+
   base::WeakPtrFactory<PrivacySandboxService> weak_factory_{this};
 };
 
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
index d9ca816..e63fdd0 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
@@ -20,6 +20,10 @@
 #include "components/profile_metrics/browser_profile_type.h"
 #include "content/public/browser/storage_partition.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
+#endif
+
 PrivacySandboxServiceFactory* PrivacySandboxServiceFactory::GetInstance() {
   return base::Singleton<PrivacySandboxServiceFactory>::get();
 }
@@ -39,6 +43,9 @@
   DependsOn(SyncServiceFactory::GetInstance());
   DependsOn(IdentityManagerFactory::GetInstance());
   DependsOn(browsing_topics::BrowsingTopicsServiceFactory::GetInstance());
+#if !BUILDFLAG(IS_ANDROID)
+  DependsOn(TrustSafetySentimentServiceFactory::GetInstance());
+#endif
 }
 
 KeyedService* PrivacySandboxServiceFactory::BuildServiceInstanceFor(
@@ -55,6 +62,9 @@
       (!profile->IsGuestSession() || profile->IsOffTheRecord())
           ? profile->GetBrowsingDataRemover()
           : nullptr,
+#if !BUILDFLAG(IS_ANDROID)
+      TrustSafetySentimentServiceFactory::GetForProfile(profile),
+#endif
       browsing_topics::BrowsingTopicsServiceFactory::GetForProfile(profile));
 }
 
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
index 8b06443..7da57d4 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
@@ -43,6 +43,10 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "url/origin.h"
 
+#if !BUILDFLAG(IS_ANDROID)
+#include "chrome/browser/ui/hats/mock_trust_safety_sentiment_service.h"
+#endif
+
 namespace {
 using browsing_topics::Topic;
 using privacy_sandbox::CanonicalTopic;
@@ -662,12 +666,19 @@
         std::make_unique<privacy_sandbox::PrivacySandboxSettings>(
             std::move(mock_delegate), host_content_settings_map(),
             cookie_settings(), prefs(), /*incognito_profile=*/false);
-
+#if !BUILDFLAG(IS_ANDROID)
+    mock_sentiment_service_ =
+        std::make_unique<::testing::NiceMock<MockTrustSafetySentimentService>>(
+            profile());
+#endif
     privacy_sandbox_service_ = std::make_unique<PrivacySandboxService>(
         privacy_sandbox_settings(), cookie_settings(), profile()->GetPrefs(),
         policy_service(), sync_service(),
         identity_test_env()->identity_manager(), test_interest_group_manager(),
         GetProfileType(), browsing_data_remover(),
+#if !BUILDFLAG(IS_ANDROID)
+        mock_sentiment_service(),
+#endif
         mock_browsing_topics_service());
   }
 
@@ -722,6 +733,11 @@
   browsing_topics::MockBrowsingTopicsService* mock_browsing_topics_service() {
     return &mock_browsing_topics_service_;
   }
+#if !BUILDFLAG(IS_ANDROID)
+  MockTrustSafetySentimentService* mock_sentiment_service() {
+    return mock_sentiment_service_.get();
+  }
+#endif
 
  private:
   content::BrowserTaskEnvironment browser_task_environment_;
@@ -734,6 +750,9 @@
   TestInterestGroupManager test_interest_group_manager_;
   privacy_sandbox_test_util::MockPrivacySandboxSettingsDelegate* mock_delegate_;
   browsing_topics::MockBrowsingTopicsService mock_browsing_topics_service_;
+#if !BUILDFLAG(IS_ANDROID)
+  std::unique_ptr<MockTrustSafetySentimentService> mock_sentiment_service_;
+#endif
   std::unique_ptr<privacy_sandbox::PrivacySandboxSettings>
       privacy_sandbox_settings_;
 
@@ -1438,6 +1457,161 @@
                    "Settings.PrivacySandbox.Consent.ClosedNoInteraction"));
 }
 
+#if !BUILDFLAG(IS_ANDROID)
+TEST_F(PrivacySandboxServiceTest, DialogActionsSentimentService) {
+  {
+    EXPECT_CALL(*mock_sentiment_service(),
+                InteractedWithPrivacySandbox3(testing::_))
+        .Times(0);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/false,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kNoticeShown);
+  }
+  {
+    EXPECT_CALL(
+        *mock_sentiment_service(),
+        InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
+                                          kPrivacySandbox3NoticeSettings))
+        .Times(1);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/false,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kNoticeOpenSettings);
+  }
+  {
+    EXPECT_CALL(
+        *mock_sentiment_service(),
+        InteractedWithPrivacySandbox3(
+            TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk))
+        .Times(1);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/false,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kNoticeAcknowledge);
+  }
+  {
+    EXPECT_CALL(
+        *mock_sentiment_service(),
+        InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
+                                          kPrivacySandbox3NoticeDismiss))
+        .Times(1);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/false,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kNoticeDismiss);
+  }
+  {
+    EXPECT_CALL(*mock_sentiment_service(),
+                InteractedWithPrivacySandbox3(testing::_))
+        .Times(0);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/false,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kNoticeClosedNoInteraction);
+  }
+  {
+    EXPECT_CALL(*mock_sentiment_service(),
+                InteractedWithPrivacySandbox3(testing::_))
+        .Times(0);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/true,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kConsentShown);
+  }
+  {
+    EXPECT_CALL(
+        *mock_sentiment_service(),
+        InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
+                                          kPrivacySandbox3ConsentAccept))
+        .Times(1);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/true,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kConsentAccepted);
+  }
+  {
+    EXPECT_CALL(
+        *mock_sentiment_service(),
+        InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
+                                          kPrivacySandbox3ConsentDecline))
+        .Times(1);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/true,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kConsentDeclined);
+  }
+  {
+    EXPECT_CALL(*mock_sentiment_service(),
+                InteractedWithPrivacySandbox3(testing::_))
+        .Times(0);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/true,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kConsentMoreInfoOpened);
+  }
+  {
+    EXPECT_CALL(*mock_sentiment_service(),
+                InteractedWithPrivacySandbox3(testing::_))
+        .Times(0);
+    SetupDialogTestState(feature_list(), prefs(),
+                         {/*consent_required=*/true,
+                          /*old_api_pref=*/true,
+                          /*new_api_pref=*/false,
+                          /*notice_displayed=*/false,
+                          /*consent_decision_made=*/false,
+                          /*confirmation_not_shown=*/false});
+    privacy_sandbox_service()->DialogActionOccurred(
+        PrivacySandboxService::DialogAction::kConsentClosedNoDecision);
+  }
+}
+#endif
+
 TEST_F(PrivacySandboxServiceTest, Block3PCookieNoDialog) {
   // Confirm that when 3P cookies are blocked, that no dialog is shown.
   prefs()->SetUserPref(
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js
index f79cf30..f7f63fe2 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/automation_object_constructor_installer.js
@@ -18,20 +18,22 @@
  * @param {chrome.automation.AutomationNode} node
  * @param {function()} callback Called when installation finishes.
  */
-AutomationObjectConstructorInstaller.init = function(node, callback) {
-  chrome.automation.AutomationNode =
-      /** @type {function (new:chrome.automation.AutomationNode)} */ (
-          node.constructor);
-  node.addEventListener(
-      chrome.automation.EventType.CHILDREN_CHANGED,
-      function installAutomationEvent(e) {
-        chrome.automation.AutomationEvent =
-            /** @type {function (new:chrome.automation.AutomationEvent)} */ (
-                e.constructor);
-        node.removeEventListener(
-            chrome.automation.EventType.CHILDREN_CHANGED,
-            installAutomationEvent, true);
-        callback();
-      },
-      true);
+AutomationObjectConstructorInstaller.init = async (node) => {
+  return new Promise(resolve => {
+    chrome.automation.AutomationNode =
+        /** @type {function (new:chrome.automation.AutomationNode)} */ (
+            node.constructor);
+    node.addEventListener(
+        chrome.automation.EventType.CHILDREN_CHANGED,
+        function installAutomationEvent(e) {
+          chrome.automation.AutomationEvent =
+              /** @type {function (new:chrome.automation.AutomationEvent)} */ (
+                  e.constructor);
+          node.removeEventListener(
+              chrome.automation.EventType.CHILDREN_CHANGED,
+              installAutomationEvent, true);
+          resolve();
+        },
+        true);
+  });
 };
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
index 5cf7935..17a1283f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -27,9 +27,7 @@
  * background page.
  */
 
-const AutomationNode = chrome.automation.AutomationNode;
 const Dir = constants.Dir;
-const EventType = chrome.automation.EventType;
 const RoleType = chrome.automation.RoleType;
 const StateType = chrome.automation.StateType;
 
@@ -40,17 +38,30 @@
 
     // Initialize legacy background page first.
     ChromeVoxBackground.init();
-    LocaleOutputHelper.init();
 
     /** @private {cursors.Range} */
     this.currentRange_ = null;
 
-    /** @private {cursors.Range} */
-    this.previousRange_ = null;
-
     /** @type {!AbstractEarcons} @private */
     this.earcons_ = new Earcons();
 
+    /** @private {string|undefined} */
+    this.lastClipboardEvent_;
+
+    /** @private {cursors.Range} */
+    this.pageSel_;
+
+    /** @private {cursors.Range} */
+    this.previousRange_ = null;
+
+    /** @type {boolean} */
+    this.talkBackEnabled = false;
+
+    this.init_();
+  }
+
+  /** @private */
+  init_() {
     // Read-only earcons.
     Object.defineProperty(ChromeVox, 'earcons', {
       get: () => this.earcons_,
@@ -65,15 +76,6 @@
       }
     });
 
-    /** @type {!BackgroundKeyboardHandler} @private */
-    this.keyboardHandler_ = new BackgroundKeyboardHandler();
-
-    /** @type {!LiveRegions} @private */
-    this.liveRegions_ = new LiveRegions(this);
-
-    /** @private {string|undefined} */
-    this.lastClipboardEvent_;
-
     chrome.clipboard.onClipboardDataChanged.addListener(() => {
       this.onClipboardDataChanged_();
     });
@@ -81,27 +83,18 @@
       this.onClipboardCopyEvent_(event);
     });
 
-    /** @private {cursors.Range} */
-    this.pageSel_;
-
-    /** @type {boolean} */
-    this.talkBackEnabled = false;
-
-    // Initialize various handlers for automation.
+    BackgroundKeyboardHandler.init();
     DesktopAutomationHandler.init();
-    /** @private {!RangeAutomationHandler} */
-    this.rangeAutomationHandler_ = new RangeAutomationHandler();
-    /** @private {!FocusAutomationHandler} */
-    this.focusAutomationHandler_ = new FocusAutomationHandler();
-    /** @private {!MediaAutomationHandler} */
-    this.mediaAutomationHandler_ = new MediaAutomationHandler();
-    /** @private {!PageLoadSoundHandler} */
-    this.pageLoadSoundHandler_ = new PageLoadSoundHandler();
-
-    FindHandler.init();
     DownloadHandler.init();
+    FindHandler.init();
+    FocusAutomationHandler.init();
     JaPhoneticData.init(JaPhoneticMap.MAP);
+    LiveRegions.init(this);
+    LocaleOutputHelper.init();
+    MediaAutomationHandler.init();
+    PageLoadSoundHandler.init();
     PanelBackground.init();
+    RangeAutomationHandler.init();
 
     chrome.accessibilityPrivate.onAnnounceForAccessibility.addListener(
         (announceText) => {
@@ -151,9 +144,8 @@
     this.previousRange_ = this.currentRange_;
     this.currentRange_ = newRange;
 
-    ChromeVoxState.observers.forEach(function(observer) {
-      observer.onCurrentRangeChanged(newRange, opt_fromEditing);
-    });
+    ChromeVoxState.observers.forEach(
+        observer => observer.onCurrentRangeChanged(newRange, opt_fromEditing));
 
     if (!this.currentRange_) {
       ChromeVoxState.instance.setFocusBounds([]);
@@ -336,14 +328,13 @@
   }
 
   /** @private */
-  setCurrentRangeToFocus_() {
-    chrome.automation.getFocus((focus) => {
-      if (focus) {
-        this.setCurrentRange(cursors.Range.fromNode(focus));
-      } else {
-        this.setCurrentRange(null);
-      }
-    });
+  async setCurrentRangeToFocus_() {
+    const focus = await new Promise(chrome.automation.getFocus);
+    if (focus) {
+      this.setCurrentRange(cursors.Range.fromNode(focus));
+    } else {
+      this.setCurrentRange(null);
+    }
   }
 
   /**
@@ -377,10 +368,9 @@
       return;
     }
 
-    const isFocusableLinkOrControl = function(node) {
-      return node.state[StateType.FOCUSABLE] &&
-          AutomationPredicate.linkOrControl(node);
-    };
+    const isFocusableLinkOrControl = (node) =>
+        node.state[StateType.FOCUSABLE] &&
+        AutomationPredicate.linkOrControl(node);
 
     // Next, try to focus the start or end node.
     if (!AutomationPredicate.structuralContainer(start) &&
@@ -430,11 +420,10 @@
     return new RegExp(
         '^(' +
         globs
-            .map(function(glob) {
-              return glob.replace(/[.+^$(){}|[\]\\]/g, '\\$&')
-                  .replace(/\*/g, '.*')
-                  .replace(/\?/g, '.');
-            })
+            .map(
+                glob => glob.replace(/[.+^$(){}|[\]\\]/g, '\\$&')
+                            .replace(/\*/g, '.*')
+                            .replace(/\?/g, '.'))
             .join('|') +
         ')$');
   }
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 3e5c91c8..8cec4e28 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background_test.js
@@ -22,6 +22,9 @@
     this.forceContextualLastOutput();
 
     await importModule(
+        'BackgroundKeyboardHandler',
+        '/chromevox/background/keyboard_handler.js');
+    await importModule(
         'BaseAutomationHandler',
         '/chromevox/background/base_automation_handler.js');
     await importModule(
@@ -3510,7 +3513,7 @@
   `;
       const root = await this.runWithLoadedTree(site);
       // Different ways to navigate to the next object.
-      const keyboardHandler = ChromeVoxState.instance.keyboardHandler_;
+      const keyboardHandler = BackgroundKeyboardHandler.instance;
       const nextObjectKeyboard =
           keyboardHandler.onKeyDown.bind(keyboardHandler, {
             keyCode: KeyCode.RIGHT,
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
index 321b88f..898a7ec 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/desktop_automation_handler.js
@@ -20,6 +20,7 @@
 export class DesktopAutomationHandler extends DesktopAutomationInterface {
   /**
    * @param {!AutomationNode} node
+   * @private
    */
   constructor(node) {
     super(node);
@@ -75,6 +76,14 @@
     /** @private {number} */
     this.totalPages_ = -1;
 
+    this.init_(node);
+  }
+
+  /**
+   * @param {!AutomationNode} node
+   * @private
+   */
+  async init_(node) {
     this.addListener_(EventType.ALERT, this.onAlert);
     this.addListener_(EventType.BLUR, this.onBlur);
     this.addListener_(
@@ -110,18 +119,15 @@
         EventType.VALUE_IN_TEXT_FIELD_CHANGED, this.onEditableChanged_);
     this.addListener_(EventType.VALUE_CHANGED, this.onValueChanged);
 
-    AutomationObjectConstructorInstaller.init(node, function() {
-      chrome.automation.getFocus((function(focus) {
-                                   if (focus) {
-                                     const event = new CustomAutomationEvent(
-                                         EventType.FOCUS, focus, {
-                                           eventFrom: 'page',
-                                           eventFromAction: ActionType.FOCUS
-                                         });
-                                     this.onFocus(event);
-                                   }
-                                 }).bind(this));
-    }.bind(this));
+    await AutomationObjectConstructorInstaller.init(node);
+    const focus =
+        await new Promise(resolve => chrome.automation.getFocus(resolve));
+    if (focus) {
+      const event = new CustomAutomationEvent(
+          EventType.FOCUS, focus,
+          {eventFrom: 'page', eventFromAction: ActionType.FOCUS});
+      this.onFocus(event);
+    }
   }
 
   /** @type {TextEditHandler} */
@@ -859,18 +865,15 @@
         .go();
   }
 
-  /**
-   * Initializes global state for DesktopAutomationHandler.
-   */
-  static init() {
+  /** Initializes global state for DesktopAutomationHandler. */
+  static async init() {
     if (DesktopAutomationInterface.instance) {
       throw new Error('DesktopAutomationInterface.instance already exists.');
     }
 
-    chrome.automation.getDesktop(function(desktop) {
-      DesktopAutomationInterface.instance =
-          new DesktopAutomationHandler(desktop);
-    });
+    const desktop =
+        await new Promise(resolve => chrome.automation.getDesktop(resolve));
+    DesktopAutomationInterface.instance = new DesktopAutomationHandler(desktop);
   }
 }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/find_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/find_handler.js
index 7e2e0ae0..e64f256 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/find_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/find_handler.js
@@ -9,6 +9,7 @@
 const TreeChangeObserverFilter = chrome.automation.TreeChangeObserverFilter;
 
 export class FindHandler {
+  /** @private */
   constructor() {
     /**
      * The last time a find marker was received.
@@ -25,6 +26,9 @@
 
   /** Initializes this module. */
   static init() {
+    if (FindHandler.instance) {
+      throw 'Error: Trying to create two instances of singleton FindHandler';
+    }
     FindHandler.instance = new FindHandler();
   }
 
@@ -70,3 +74,6 @@
  * @const {number}
  */
 FindHandler.DROP_MATCH_WITHIN_TIME_MS = 50;
+
+/** @type {FindHandler} */
+FindHandler.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
index 184c5d96..4d2343f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/focus_automation_handler.js
@@ -16,6 +16,7 @@
 const StateType = chrome.automation.StateType;
 
 export class FocusAutomationHandler extends BaseAutomationHandler {
+  /** @private */
   constructor() {
     super(null);
 
@@ -27,6 +28,13 @@
     });
   }
 
+  static init() {
+    if (FocusAutomationHandler.instance) {
+      throw 'Error: Trying to create two instances of singleton FocusAutomationHandler';
+    }
+    FocusAutomationHandler.instance = new FocusAutomationHandler();
+  }
+
   /**
    * @param {!AutomationEvent} evt
    */
@@ -147,3 +155,6 @@
     }
   }
 }
+
+/** @type {FocusAutomationHandler} */
+FocusAutomationHandler.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
index 03b35a7a..e0e779e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
@@ -28,6 +28,7 @@
 };
 
 export class BackgroundKeyboardHandler {
+  /** @private */
   constructor() {
     /** @private {!KeyboardPassThroughState_} */
     this.passThroughState_ = KeyboardPassThroughState_.NO_PASS_THROUGH;
@@ -45,6 +46,13 @@
         true, ChromeVox.isStickyPrefOn);
   }
 
+  static init() {
+    if (BackgroundKeyboardHandler.instance) {
+      throw 'Error: trying to create two instances of singleton BackgroundKeyboardHandler.';
+    }
+    BackgroundKeyboardHandler.instance = new BackgroundKeyboardHandler();
+  }
+
   /**
    * Handles key down events.
    * @param {Event} evt The key down event to process.
@@ -130,3 +138,6 @@
     return false;
   }
 }
+
+/** @type {BackgroundKeyboardHandler} */
+BackgroundKeyboardHandler.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js
index 3dc9014..39d2a3c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/live_regions.js
@@ -20,6 +20,7 @@
   /**
    * @param {!ChromeVoxState} chromeVoxState The ChromeVox state object,
    *     keeping track of the current mode and current range.
+   * @private
    */
   constructor(chromeVoxState) {
     /**
@@ -55,6 +56,17 @@
   }
 
   /**
+   * @param {!ChromeVoxState} chromeVoxState The ChromeVox state object,
+   *     keeping track of the current mode and current range.
+   */
+  static init(chromeVoxState) {
+    if (LiveRegions.instance) {
+      throw 'Error: Trying to create two instances of singleton LiveRegions';
+    }
+    LiveRegions.instance = new LiveRegions(chromeVoxState);
+  }
+
+  /**
    * Called when the automation tree is changed.
    * @param {TreeChange} treeChange
    */
@@ -243,22 +255,22 @@
 /**
  * Live region events received in fewer than this many milliseconds will
  * queue, otherwise they'll be output with a category flush.
- * @type {number}
- * @const
+ * @const {number}
  */
 LiveRegions.LIVE_REGION_QUEUE_TIME_MS = 5000;
 
 /**
  * Live region events received on the same node in fewer than this many
  * milliseconds will be dropped to avoid a stream of constant chatter.
- * @type {number}
- * @const
+ * @const {number}
  */
 LiveRegions.LIVE_REGION_MIN_SAME_NODE_MS = 20;
 
 /**
  * Whether live regions from background tabs should be announced or not.
- * @type {boolean}
- * @private
+ * @private {boolean}
  */
 LiveRegions.announceLiveRegionsFromBackgroundTabs_ = false;
+
+/** @type {LiveRegions} */
+LiveRegions.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js
index 24d4969..76344775 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/media_automation_handler.js
@@ -12,10 +12,9 @@
 const EventType = chrome.automation.EventType;
 const RoleType = chrome.automation.RoleType;
 
-/**
- * @implements {TtsCapturingEventListener}
- */
+/** @implements {TtsCapturingEventListener} */
 export class MediaAutomationHandler extends BaseAutomationHandler {
+  /** @private */
   constructor() {
     super(null);
     /** @type {!Set<AutomationNode>} @private */
@@ -36,6 +35,13 @@
     });
   }
 
+  static init() {
+    if (MediaAutomationHandler.instance) {
+      throw 'Error: trying to create two instances of singleton MediaAutomationHandler';
+    }
+    MediaAutomationHandler.instance = new MediaAutomationHandler();
+  }
+
   /** @override */
   onTtsStart() {
     this.lastTtsEvent_ = new Date();
@@ -108,5 +114,8 @@
   }
 }
 
-/** @type {number} */
+/** @const {number} */
 MediaAutomationHandler.MIN_WAITTIME_MS = 1000;
+
+/** @type {MediaAutomationHandler} */
+MediaAutomationHandler.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
index a8ec7ec..6c97f80 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/page_load_sound_handler.js
@@ -17,6 +17,7 @@
 
 /** @implements {ChromeVoxStateObserver} */
 export class PageLoadSoundHandler extends BaseAutomationHandler {
+  /** @private */
   constructor() {
     super(null);
 
@@ -33,6 +34,13 @@
     });
   }
 
+  static init() {
+    if (PageLoadSoundHandler.instance) {
+      throw 'Error: Trying to create two instances of singleton PageLoadSoundHandler';
+    }
+    PageLoadSoundHandler.instance = new PageLoadSoundHandler();
+  }
+
   /**
    * Stops page load sound on load complete.
    * @param {!ChromeVoxEvent} evt
@@ -81,3 +89,6 @@
     // the docLoadingProgress < 1.
   }
 }
+
+/** @type {PageLoadSoundHandler} */
+PageLoadSoundHandler.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
index acae7a9..f1fa0b79 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -14,6 +14,7 @@
 
 /** @implements {ISearchHandler} */
 export class PanelBackground {
+  /** @private */
   constructor() {
     /** @private {ISearch} */
     this.iSearch_;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
index 07f4d762..12532a1d 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/range_automation_handler.js
@@ -20,6 +20,7 @@
  * @implements {ChromeVoxStateObserver}
  */
 export class RangeAutomationHandler extends BaseAutomationHandler {
+  /** @private */
   constructor() {
     super(null);
 
@@ -35,6 +36,13 @@
     ChromeVoxState.addObserver(this);
   }
 
+  static init() {
+    if (RangeAutomationHandler.instance) {
+      throw 'Error: Trying to create two copies of singleton RangeAutomationHandler';
+    }
+    RangeAutomationHandler.instance = new RangeAutomationHandler();
+  }
+
   /**
    * @param {cursors.Range} newRange
    * @param {boolean=} opt_fromEditing
@@ -248,3 +256,6 @@
         rectA.width === rectB.width && rectA.height === rectB.height;
   }
 }
+
+/** @type {RangeAutomationHandler} */
+RangeAutomationHandler.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
index 1b18191e..3f5c25a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
@@ -184,3 +184,6 @@
                locale, locale) !== '';
   }
 };
+
+/** @type {LocaleOutputHelper} */
+LocaleOutputHelper.instance;
diff --git a/chrome/browser/resources/chromeos/emoji_picker/DIR_METADATA b/chrome/browser/resources/chromeos/emoji_picker/DIR_METADATA
index ca0e79f..caac77f 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/DIR_METADATA
+++ b/chrome/browser/resources/chromeos/emoji_picker/DIR_METADATA
@@ -1,3 +1 @@
-monorail: {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
index e4fd81f1..661524a 100644
--- a/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
+++ b/chrome/browser/resources/chromeos/emoji_picker/emoji_picker.js
@@ -247,9 +247,7 @@
       this.set(
           ['preferenceMapping'], this.recentEmojiStore.getPreferenceMapping());
     }
-    this.set(
-        ['emojiGroupTabs', 0, 'disabled'],
-        this.emojiHistory.emoji.length === 0);
+    this.updateHistoryTabDisabledProperty();
     // Make highlight bar visible (now we know where it should be) and
     // add smooth sliding.
     this.updateActiveGroup(/*updateTabsScroll=*/ true);
@@ -393,10 +391,12 @@
 
   clearRecentEmoji() {
     this.set(['emojiHistory', 'emoji'], makeRecentlyUsed([]));
-    this.set(['emojiGroupTabs', 0, 'disabled'], true);
     this.recentEmojiStore.clearRecents();
     afterNextRender(
-        this, () => this.updateActiveGroup(/*updateTabsScroll=*/ true));
+        this, () => {
+          this.updateActiveGroup(/*updateTabsScroll=*/ true);
+          this.updateHistoryTabDisabledProperty();
+        });
   }
 
   /**
@@ -683,6 +683,48 @@
   }
 
   /**
+   * Disables the history tab when there is no usage history for the
+   * selected category and enables it otherwise.
+   */
+  updateHistoryTabDisabledProperty() {
+    this.set(
+      ['emojiGroupTabs', 0, 'disabled'],
+      this.isCategoryUsageHistoryEmpty(this.category)
+      );
+  }
+
+  /**
+   * Returns whether the usage history of a give category is empty or not.
+   * @param {string} category Input category.
+   * @returns {boolean}
+   */
+  isCategoryUsageHistoryEmpty(category) {
+    return this.getCategoryUsageHistory(this.category).emoji.length === 0;
+  }
+
+  /**
+   * Returns the usage history instance for a given category.
+   * @param {string} category Input category.
+   * @returns {EmojiGroup} The history instance for the given category.
+   */
+  getCategoryUsageHistory(category) {
+    // TODO(b/231500029): Simplify the logic after unifying `history` structs.
+    // Histories for different categories (e.g. emoticon and emoji) can be
+    // maintained as a dictionary of Object<CategoryEnum,EmojiGroup> to allow
+    // generalization to more categories without much code duplication. In that
+    // case, the following logic can be  simplified as a dictionary lookup.
+
+    switch (category) {
+      case CategoryEnum.EMOJI:
+        return this.emojiHistory;
+      case CategoryEnum.EMOTICON:
+        return this.emoticonHistory;
+      default:
+        throw new Error(`Unknown category "${category}."`);
+    }
+  }
+
+  /**
    * @param {!EmojiVariantsShownEvent} ev
    */
   onShowEmojiVariants(ev) {
@@ -780,6 +822,7 @@
     this.set('emojiGroupTabs', categoryTabs);
     afterNextRender(this, () => {
       this.updateActiveGroup(true);
+      this.updateHistoryTabDisabledProperty();
       this.$.tabs.scrollLeft =
           this.calculateTabScrollLeftPosition(this.pagination);
     });
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index 0410643..e8518b57 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -189,8 +189,8 @@
     "components/dialogs/oobe_modal_dialog.js",
     "components/display_manager_types.html",
     "components/oobe_vars/oobe_shared_vars_css.html",
-    "components/oobe_carousel/oobe_carousel.html",
-    "components/oobe_carousel/oobe_carousel.js",
+    "components/oobe_carousel.html",
+    "components/oobe_carousel.js",
     "components/oobe_slide.html",
     "components/oobe_slide.js",
     "components/progress_list_item/progress_list_item.html",
@@ -395,7 +395,7 @@
     "components/common_styles/cr_card_radio_group_styles.m.js",
     "components/common_styles/oobe_dialog_host_styles.m.js",
     "components/common_styles/oobe_flex_layout_styles.m.js",
-    "components/oobe_carousel/oobe_carousel.m.js",
+    "components/oobe_carousel.m.js",
     "components/oobe_slide.m.js",
     "components/oobe_vars/oobe_shared_vars_css.m.js",
     "components/progress_list_item/progress_list_item.m.js",
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn
index 0cdb644..dc817e7c 100644
--- a/chrome/browser/resources/chromeos/login/components/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -14,7 +14,6 @@
     "buttons:closure_compile",
     "common_styles:closure_compile",
     "dialogs:closure_compile",
-    "oobe_carousel:closure_compile",
     "oobe_vars:closure_compile",
     "progress_list_item:closure_compile",
 
@@ -31,6 +30,7 @@
     ":network_select_login.m",
     ":notification_card.m",
     ":oobe_a11y_option.m",
+    ":oobe_carousel.m",
     ":oobe_cr_lottie.m",
     ":oobe_i18n_dropdown.m",
     ":oobe_icons.m",
@@ -50,7 +50,6 @@
   public_deps = [
                   "behaviors:modulize",
                   "buttons:polymer3_elements",
-                  "oobe_carousel:polymer3_elements",
                   "common_styles:polymer3_elements",
                   "dialogs:polymer3_elements",
                   "oobe_vars:polymer3_elements",
@@ -66,6 +65,7 @@
                   ":network_select_login_module",
                   ":notification_card_module",
                   ":oobe_a11y_option_module",
+                  ":oobe_carousel_module",
                   ":oobe_cr_lottie_module",
                   ":oobe_icons_module",
                   ":oobe_i18n_dropdown_module",
@@ -186,6 +186,15 @@
   extra_deps = [ ":oobe_i18n_dropdown_module" ]
 }
 
+js_library("oobe_carousel.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_carousel.m.js" ]
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:load_time_data.m",
+  ]
+  extra_deps = [ ":oobe_carousel_module" ]
+}
+
 js_library("oobe_cr_lottie.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.m.js" ]
   deps = [
@@ -233,7 +242,10 @@
 
 js_library("throbber_notice.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/throbber_notice.m.js" ]
-  deps = [ "./behaviors:oobe_i18n_behavior.m" ]
+  deps = [
+    "./behaviors:oobe_i18n_behavior.m",
+    "//ui/webui/resources/cr_elements/chromeos:cros_color_overrides_module",
+  ]
   extra_deps = [ ":throbber_notice_module" ]
 }
 
@@ -339,6 +351,14 @@
   namespace_rewrites = oobe_namespace_rewrites
 }
 
+polymer_modulizer("oobe_carousel") {
+  js_file = "oobe_carousel.js"
+  html_file = "oobe_carousel.html"
+  html_type = "dom-module"
+  auto_imports = oobe_auto_imports
+  namespace_rewrites = oobe_namespace_rewrites
+}
+
 polymer_modulizer("oobe_cr_lottie") {
   js_file = "oobe_cr_lottie.js"
   html_file = "oobe_cr_lottie.html"
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_carousel/oobe_carousel.html b/chrome/browser/resources/chromeos/login/components/oobe_carousel.html
similarity index 100%
rename from chrome/browser/resources/chromeos/login/components/oobe_carousel/oobe_carousel.html
rename to chrome/browser/resources/chromeos/login/components/oobe_carousel.html
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_carousel/oobe_carousel.js b/chrome/browser/resources/chromeos/login/components/oobe_carousel.js
similarity index 69%
rename from chrome/browser/resources/chromeos/login/components/oobe_carousel/oobe_carousel.js
rename to chrome/browser/resources/chromeos/login/components/oobe_carousel.js
index a2ab708..f7ae0dcc 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_carousel/oobe_carousel.js
+++ b/chrome/browser/resources/chromeos/login/components/oobe_carousel.js
@@ -2,93 +2,99 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Polymer({
-  is: 'oobe-carousel',
+/* #js_imports_placeholder */
 
-  properties: {
-    /**
-     * Current slide index.
-     */
-    slideIndex: {
-      type: Number,
-      value: 0,
-      observer: 'onSlideIndexChanged_',
-    },
+class OobeCarousel extends Polymer.Element {
+  static get is() {
+    return 'oobe-carousel';
+  }
+
+  /* #html_template_placeholder */
+
+  static get properties() {
+    return {
+      /**
+       * Current slide index.
+       */
+      slideIndex: {
+        type: Number,
+        value: 0,
+        observer: 'onSlideIndexChanged_',
+      },
+
+      /**
+       * Controls if slides will be rotated automatically.
+       * Note: This feature is not a11y friendly and will cause bugs when
+       * ChromeVox is turned on. There is a need to observe ChromeVox and stop
+       * auto transition when ChromeVox is turned on.
+       */
+      autoTransition: {
+        type: Boolean,
+        value: false,
+        observer: 'restartAutoTransition_',
+      },
+
+      /**
+       * Number of seconds each slide should remain for.
+       */
+      slideDurationInSeconds: {
+        type: Number,
+        value: 10,
+        observer: 'restartAutoTransition_',
+      },
+
+      /**
+       * Slide aria-label.
+       */
+      slideLabel: String,
+
+      /**
+       * Selected button aria-label.
+       */
+      selectedButtonLabel: String,
+
+      /**
+       * Unselected button aria-label.
+       */
+      unselectedButtonLabel: String,
+    };
+  }
+
+  constructor() {
+    super();
 
     /**
-     * Controls if slides will be rotated automatically.
-     * Note: This feature is not a11y friendly and will cause bugs when
-     * ChromeVox is turned on. There is a need to observe ChromeVox and stop
-     * auto transition when ChromeVox is turned on.
+     * Array for storing number leading up to totalSlides
+     * Example: [ 0 1 2 3 ... ]
+     * @type {Array<number>}
      */
-    autoTransition: {
-      type: Boolean,
-      value: false,
-      observer: 'restartAutoTransition_',
-    },
+    this.dots = [];
 
     /**
-     * Number of seconds each slide should remain for.
+     * Array of slotted slides.
+     * @type {Array<HTMLElement>}
      */
-    slideDurationInSeconds: {
-      type: Number,
-      value: 10,
-      observer: 'restartAutoTransition_',
-    },
+    this.slides = [];
 
     /**
-     * Slide aria-label.
+     * Total number of slides.
+     * @type {number}
      */
-    slideLabel: String,
+    this.totalSlides = 0;
 
     /**
-     * Selected button aria-label.
+     * ID of the timer which rotates slides.
+     * @type {number|null}
      */
-    selectedButtonLabel: String,
+    this.timerID = null;
+  }
 
-    /**
-     * Unselected button aria-label.
-     */
-    unselectedButtonLabel: String,
-  },
-
-  /**
-   * Array for storing number leading up to totalSlides
-   * @type {Array<number>}
-   */
-  dots: [],
-
-  /**
-   * Array of slotted slides.
-   * @type {Array<HTMLElement>}
-   */
-  slides: [],
-
-  /**
-   * Total number of slides.
-   * @type {number}
-   */
-  totalSlides: 0,
-
-  /**
-   * ID of the timer which rotates slides.
-   * @type {number|null}
-   */
-  timerID: null,
-
-  /** @type {function(Event)} */
-  removeAnimateToHandler: Function,
-
-  /** @type {function(Event)} */
-  removeAnimateFromHandler: Function,
-
-  attached() {
-    this.removeAnimateToHandler = this.removeAnimateTo_.bind(this);
-    this.removeAnimateFromHandler = this.removeAnimateFrom_.bind(this);
+  ready() {
+    super.ready();
     this.prepareCarousel_();
     this.restartAutoTransition_();
     this.hideNonActiveSlides_();
-  },
+  }
 
   /**
    * @private
@@ -97,14 +103,12 @@
   prepareCarousel_() {
     this.slides = this.$.slot.assignedElements();
     this.totalSlides = this.slides.length;
-    const array = [];
+    this.dots = [...Array(this.totalSlides).keys()];
     for (let i = 0; i < this.totalSlides; ++i) {
       this.slides[i].setAttribute('aria-label', this.getSlideLabel_(i));
       this.slides[i].setAttribute('role', 'group');
-      array.push(i);
     }
-    this.dots = array;
-  },
+  }
 
   /**
    * @private
@@ -114,7 +118,7 @@
   getSlideLabel_(index) {
     return loadTimeData.getStringF(
         this.slideLabel, index + 1, this.totalSlides);
-  },
+  }
 
   /**
    * @private
@@ -122,10 +126,10 @@
   hideNonActiveSlides_() {
     for (let idx = 0; idx < this.totalSlides; ++idx) {
       if (idx != this.slideIndex) {
-        this.hideSlide(this.slides[idx]);
+        OobeCarousel.hideSlide(this.slides[idx]);
       }
     }
-  },
+  }
 
   /**
    * @private
@@ -134,7 +138,7 @@
   restartAutoTransition_() {
     this.stopAutoTransition_();
     this.startAutoTransition_();
-  },
+  }
 
   /**
    * @private
@@ -145,7 +149,7 @@
       this.timerID = setInterval(
           this.moveNext.bind(this), (this.slideDurationInSeconds * 1000));
     }
-  },
+  }
 
   /**
    * @private
@@ -156,7 +160,7 @@
       clearInterval(this.timerID);
       this.timerID = null;
     }
-  },
+  }
 
   /**
    * @private
@@ -180,7 +184,7 @@
     if (toIndex > fromIndex) {
       this.animateInternal_(toIndex, fromIndex, true);
     }
-  },
+  }
 
   /**
    * @private
@@ -197,57 +201,58 @@
       this.animateInternalWithStyles_(
           toIndex, fromIndex, 'backward', 'forward');
     }
-  },
+  }
 
   /**
    * @private
    * @param {EventTarget|null} slide
    */
-  hideSlide(slide) {
+  static hideSlide(slide) {
     slide.setAttribute('aria-hidden', 'true');
     slide.hidden = true;
-  },
+  }
 
   /**
    * @private
    * @param {EventTarget|null} slide
    */
-  showSlide(slide) {
+  static showSlide(slide) {
     slide.removeAttribute('aria-hidden');
     slide.hidden = false;
-  },
+  }
 
   /**
    * @private
    * @param {EventTarget|null} slide
    */
-  cleanStyles(slide) {
+  static cleanStyles(slide) {
     slide.classList.remove('animated', 'forward', 'backward', 'hide-slide');
-  },
+  }
 
   /**
    * @private
    * @param {Event} event transitionend event.
    */
-  removeAnimateTo_(event) {
+  static removeAnimateTo_(event) {
     const toElement = event.target;
 
-    this.cleanStyles(toElement);
-    toElement.removeEventListener('transitionend', this.removeAnimateToHandler);
-  },
+    OobeCarousel.cleanStyles(toElement);
+    toElement.removeEventListener(
+        'transitionend', OobeCarousel.removeAnimateTo_);
+  }
 
   /**
    * @private
    * @param {Event} event transitionend event.
    */
-  removeAnimateFrom_(event) {
+  static removeAnimateFrom_(event) {
     const fromElement = event.target;
 
-    this.hideSlide(fromElement);
-    this.cleanStyles(fromElement);
+    OobeCarousel.hideSlide(fromElement);
+    OobeCarousel.cleanStyles(fromElement);
     fromElement.removeEventListener(
-        'transitionend', this.removeAnimateFromHandler);
-  },
+        'transitionend', OobeCarousel.removeAnimateFrom_);
+  }
 
   /**
    * @private
@@ -258,15 +263,16 @@
   cleanUpState_(fromIndex) {
     for (let idx = 0; idx < this.totalSlides; ++idx) {
       const slide = this.slides[idx];
-      slide.removeEventListener('transitionend', this.removeAnimateFromHandler);
-      slide.removeEventListener('transitionend', this.removeAnimateToHandler);
+      slide.removeEventListener(
+          'transitionend', OobeCarousel.removeAnimateFrom_);
+      slide.removeEventListener('transitionend', OobeCarousel.removeAnimateTo_);
       if (idx != fromIndex) {
-        this.hideSlide(slide);
+        OobeCarousel.hideSlide(slide);
       }
-      this.cleanStyles(slide);
+      OobeCarousel.cleanStyles(slide);
     }
-    this.showSlide(this.slides[fromIndex]);
-  },
+    OobeCarousel.showSlide(this.slides[fromIndex]);
+  }
 
   /**
    * @private
@@ -298,10 +304,10 @@
     fromElement.classList.add(fromStyle);
     fromElement.classList.add('hide-slide');
 
-    toElement.addEventListener('transitionend', this.removeAnimateToHandler);
+    toElement.addEventListener('transitionend', OobeCarousel.removeAnimateTo_);
     fromElement.addEventListener(
-        'transitionend', this.removeAnimateFromHandler);
-  },
+        'transitionend', OobeCarousel.removeAnimateFrom_);
+  }
 
   /**
    * @private
@@ -313,7 +319,7 @@
     if (e.keyCode == 32 || e.keyCode == 13) {
       this.slideIndex = e.model.item;
     }
-  },
+  }
 
   /**
    * @private
@@ -322,7 +328,11 @@
    */
   onClick_(e) {
     this.slideIndex = e.model.item;
-  },
+    // Set a timer to remove the focus ring.
+    setTimeout(
+        element => element.blur(), this.slideDurationInSeconds * 1000,
+        e.currentTarget);
+  }
 
   /**
    * @private
@@ -331,7 +341,7 @@
    */
   isActive_(index) {
     return index == this.slideIndex;
-  },
+  }
 
   /**
    * @private
@@ -345,7 +355,7 @@
     }
     return loadTimeData.getStringF(
         this.unselectedButtonLabel, index + 1, this.totalSlides);
-  },
+  }
 
   /**
    * @private
@@ -357,14 +367,16 @@
   onSlideIndexChanged_(toIndex, fromIndex) {
     this.restartAutoTransition_();
     this.animateSlides_(toIndex, fromIndex);
-  },
+  }
 
   moveNext() {
     this.slideIndex = (this.slideIndex + 1) % this.totalSlides;
-  },
+  }
 
   movePrev() {
     this.slideIndex =
         (this.slideIndex + this.totalSlides - 1) % this.totalSlides;
-  },
-});
+  }
+}
+
+customElements.define(OobeCarousel.is, OobeCarousel);
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_carousel/BUILD.gn b/chrome/browser/resources/chromeos/login/components/oobe_carousel/BUILD.gn
deleted file mode 100644
index cae38154..0000000
--- a/chrome/browser/resources/chromeos/login/components/oobe_carousel/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/polymer.gni")
-import("../../oobe_auto_imports.gni")
-
-group("polymer3_elements") {
-  public_deps = [ ":oobe_carousel_module" ]
-}
-
-js_type_check("closure_compile") {
-  is_polymer3 = true
-  deps = [ ":oobe_carousel.m" ]
-}
-
-#### Polymer3 / JS Modules libraries
-
-js_library("oobe_carousel.m") {
-  sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_carousel/oobe_carousel.m.js" ]
-  deps = [
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/js:load_time_data.m",
-  ]
-  extra_deps = [ ":oobe_carousel_module" ]
-}
-
-#### Polymer3 auto generation
-
-polymer_modulizer("oobe_carousel") {
-  js_file = "oobe_carousel.js"
-  html_file = "oobe_carousel.html"
-  html_type = "dom-module"
-  auto_imports = oobe_auto_imports
-}
diff --git a/chrome/browser/resources/chromeos/login/components/throbber_notice.html b/chrome/browser/resources/chromeos/login/components/throbber_notice.html
index 65a0b31..fdfb727 100644
--- a/chrome/browser/resources/chromeos/login/components/throbber_notice.html
+++ b/chrome/browser/resources/chromeos/login/components/throbber_notice.html
@@ -6,13 +6,14 @@
 
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
+<link rel="import" href="chrome://resources/cr_elements/chromeos/cros_color_overrides.html">
 
 <link rel="import" href="./behaviors/oobe_i18n_behavior.html">
 
-<!-- TODO(1172980): Delete once oobe-loading-dialog replaces throbber-notice -->
+<!-- TODO(http://crbug.com/1172980): Delete once oobe-loading-dialog replaces throbber-notice -->
 <dom-module id="throbber-notice">
   <template>
-    <style>
+    <style include="cros-color-overrides">
       :host {
         align-items: center;
         display: flex;
@@ -29,7 +30,7 @@
 
       #comment {
         @apply --oobe-default-font;
-        color: #747474;
+        color: var(--cros-text-color-secondary);
       }
     </style>
     <paper-spinner-lite dir="ltr" active></paper-spinner-lite>
diff --git a/chrome/browser/resources/chromeos/login/md_login.html b/chrome/browser/resources/chromeos/login/md_login.html
index bec5cab5..d126082b 100644
--- a/chrome/browser/resources/chromeos/login/md_login.html
+++ b/chrome/browser/resources/chromeos/login/md_login.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<html build="$i18n{buildType}">
+<html build="$i18n{buildType}" cros>
 <head>
 <meta charset="utf-8">
 <meta name="google" value="notranslate">
diff --git a/chrome/browser/resources/chromeos/login/oobe.html b/chrome/browser/resources/chromeos/login/oobe.html
index 3252017..d7d2633 100644
--- a/chrome/browser/resources/chromeos/login/oobe.html
+++ b/chrome/browser/resources/chromeos/login/oobe.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<html build="$i18n{buildType}">
+<html build="$i18n{buildType}" cros>
 <head>
 <meta charset="utf-8">
 <meta name="google" value="notranslate">
diff --git a/chrome/browser/resources/chromeos/login/oobe_polymer3.html b/chrome/browser/resources/chromeos/login/oobe_polymer3.html
index c6d28d6..641a59506 100644
--- a/chrome/browser/resources/chromeos/login/oobe_polymer3.html
+++ b/chrome/browser/resources/chromeos/login/oobe_polymer3.html
@@ -1,5 +1,5 @@
 <!doctype html>
-<html build="$i18n{buildType}">
+<html build="$i18n{buildType}" cros>
 <head>
   <meta charset="utf-8">
   <meta name="google" value="notranslate">
diff --git a/chrome/browser/resources/chromeos/login/screens.js b/chrome/browser/resources/chromeos/login/screens.js
index edd5e83..99ce1b9e 100644
--- a/chrome/browser/resources/chromeos/login/screens.js
+++ b/chrome/browser/resources/chromeos/login/screens.js
@@ -89,6 +89,7 @@
    {tag: 'marketing-opt-in-element', id: 'marketing-opt-in'},
    {tag: 'multidevice-setup-element', id: 'multidevice-setup-screen'},
    {tag: 'offline-ad-login-element', id: 'offline-ad-login'},
+   {tag: 'oobe-eula-element', id: 'oobe-eula-md'},
    {tag: 'oobe-reset-element', id: 'reset'},
    {tag: 'os-install-element', id: 'os-install', condition: 'isOsInstallAllowed'},
    {tag: 'os-trial-element', id: 'os-trial', condition: 'isOsInstallAllowed'},
@@ -129,7 +130,6 @@
     {tag: 'enable-debugging-element', id: 'debugging'},
     {tag: 'enterprise-enrollment-element', id: 'enterprise-enrollment'},
     {tag: 'hid-detection-element', id: 'hid-detection'},
-    {tag: 'oobe-eula-element', id: 'oobe-eula-md'},
     {tag: 'oobe-network-element', id: 'network-selection'},
     {tag: 'packaged-license-element', id: 'packaged-license'},
     {tag: 'quick-start-element', id: 'quick-start'},
diff --git a/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
index 415bb42d..3f2cc5fb1 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/screens/login/BUILD.gn
@@ -84,6 +84,7 @@
 js_library("lacros_data_migration.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.m.js" ]
   deps = [
+    "../../components:oobe_slide.m",
     "../../components/behaviors:login_screen_behavior.m",
     "../../components/behaviors:oobe_dialog_host_behavior.m",
     "../../components/dialogs:oobe_loading_dialog.m",
diff --git a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html
index 784fb94c..f5854084 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html
+++ b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.html
@@ -43,7 +43,7 @@
           value="[[progressValue_]]">
       </paper-progress>
       <div slot="subtitle">
-        <p>
+        <p role="status" aria-live="polite">
           [[i18nDynamic(locale, 'lacrosDataMigrationSubtitle', progressValue_)]]
         </p>
         <p hidden="[[!canSkip_]]">
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
index 812ed31..8516bc5 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
@@ -197,8 +197,7 @@
    * @private
    */
   onCountrySelected_(event) {
-    chrome.send(
-        'DemoPreferencesScreen.setDemoModeCountry', [event.detail.value]);
+    this.userActed(['set-demo-mode-country', event.detail.value]);
     this.is_country_selected_ =
         event.detail.value !== this.country_not_selected_id_;
   }
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/update.html b/chrome/browser/resources/chromeos/login/screens/oobe/update.html
index 0c5b27c..1393ccf 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/update.html
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/update.html
@@ -17,7 +17,7 @@
 <link rel="import" href="../../components/common_styles/oobe_dialog_host_styles.html">
 <link rel="import" href="../../components/dialogs/oobe_adaptive_dialog.html">
 <link rel="import" href="../../components/dialogs/oobe_loading_dialog.html">
-<link rel="import" href="../../components/oobe_carousel/oobe_carousel.html">
+<link rel="import" href="../../components/oobe_carousel.html">
 <link rel="import" href="../../components/oobe_slide.html">
 
 <dom-module id="update-element">
diff --git a/chrome/browser/resources/download_shelf/download_item.ts b/chrome/browser/resources/download_shelf/download_item.ts
index 676c646..df981b9c 100644
--- a/chrome/browser/resources/download_shelf/download_item.ts
+++ b/chrome/browser/resources/download_shelf/download_item.ts
@@ -20,11 +20,11 @@
 
 enum DisplayMode {
   // Shows icon + filename + context menu button.
-  kNormal = 'normal',
+  NORMAL = 'normal',
   // Shows icon + warning text + discard button + context menu button.
-  kWarn = 'warn',
+  WARN = 'warn',
   // Shows icon + warning text + keep button + discard button.
-  kWarnKeep = 'warn-keep',
+  WARN_KEEP = 'warn-keep',
 }
 
 export class DownloadItemElement extends CustomElement {
@@ -154,13 +154,13 @@
     });
 
     if (item.mode === DownloadMode.kNormal) {
-      downloadElement.dataset['displayMode'] = DisplayMode.kNormal;
+      downloadElement.dataset['displayMode'] = DisplayMode.NORMAL;
     } else if (
         item.mode === DownloadMode.kDangerous ||
         item.mode === DownloadMode.kMixedContentWarn) {
-      downloadElement.dataset['displayMode'] = DisplayMode.kWarnKeep;
+      downloadElement.dataset['displayMode'] = DisplayMode.WARN_KEEP;
     } else {
-      downloadElement.dataset['displayMode'] = DisplayMode.kWarn;
+      downloadElement.dataset['displayMode'] = DisplayMode.WARN;
     }
 
     (this.$('#keep-button') as HTMLElement).innerText =
diff --git a/chrome/browser/resources/extensions/shortcut_input.ts b/chrome/browser/resources/extensions/shortcut_input.ts
index e51bc19..51e2398 100644
--- a/chrome/browser/resources/extensions/shortcut_input.ts
+++ b/chrome/browser/resources/extensions/shortcut_input.ts
@@ -147,7 +147,7 @@
       return;
     }
 
-    if (e.keyCode === Key.Escape) {
+    if (e.keyCode === Key.ESCAPE) {
       if (!this.capturing_) {
         // If we're not currently capturing, allow escape to propagate.
         return;
@@ -158,7 +158,7 @@
       e.stopPropagation();
       return;
     }
-    if (e.keyCode === Key.Tab) {
+    if (e.keyCode === Key.TAB) {
       // Allow tab propagation for keyboard navigation.
       return;
     }
@@ -183,7 +183,7 @@
       return;
     }
 
-    if (e.keyCode === Key.Escape || e.keyCode === Key.Tab) {
+    if (e.keyCode === Key.ESCAPE || e.keyCode === Key.TAB) {
       return;
     }
 
diff --git a/chrome/browser/resources/extensions/shortcut_util.ts b/chrome/browser/resources/extensions/shortcut_util.ts
index c761f935..ec52f41 100644
--- a/chrome/browser/resources/extensions/shortcut_util.ts
+++ b/chrome/browser/resources/extensions/shortcut_util.ts
@@ -7,25 +7,25 @@
 
 
 export enum Key {
-  Comma = 188,
-  Del = 46,
-  Down = 40,
-  End = 35,
-  Escape = 27,
-  Home = 36,
-  Ins = 45,
-  Left = 37,
-  MediaNextTrack = 176,
-  MediaPlayPause = 179,
-  MediaPrevTrack = 177,
-  MediaStop = 178,
-  PageDown = 34,
-  PageUp = 33,
-  Period = 190,
-  Right = 39,
-  Space = 32,
-  Tab = 9,
-  Up = 38,
+  COMMA = 188,
+  DEL = 46,
+  DOWN = 40,
+  END = 35,
+  ESCAPE = 27,
+  HOME = 36,
+  INS = 45,
+  LEFT = 37,
+  MEDIA_NEXT_TRACK = 176,
+  MEDIA_PLAY_PAUSE = 179,
+  MEDIA_PREV_TRACK = 177,
+  MEDIA_STOP = 178,
+  PAGE_DOWN = 34,
+  PAGE_UP = 33,
+  PERIOD = 190,
+  RIGHT = 39,
+  SPACE = 32,
+  TAB = 9,
+  UP = 38,
 }
 
 /**
@@ -42,10 +42,10 @@
  */
 function getModifierPolicy(keyCode: number): ModifierPolicy {
   switch (keyCode) {
-    case Key.MediaNextTrack:
-    case Key.MediaPlayPause:
-    case Key.MediaPrevTrack:
-    case Key.MediaStop:
+    case Key.MEDIA_NEXT_TRACK:
+    case Key.MEDIA_PLAY_PAUSE:
+    case Key.MEDIA_PREV_TRACK:
+    case Key.MEDIA_STOP:
       return ModifierPolicy.NOT_ALLOWED;
     default:
       return ModifierPolicy.REQUIRED;
@@ -72,7 +72,7 @@
  * @return Whether the key is valid.
  */
 export function isValidKeyCode(keyCode: number): boolean {
-  if (keyCode === Key.Escape) {
+  if (keyCode === Key.ESCAPE) {
     return false;
   }
   for (const k in Key) {
@@ -114,58 +114,58 @@
       output.push(String.fromCharCode(keyCode));
     } else {
       switch (keyCode) {
-        case Key.Comma:
+        case Key.COMMA:
           output.push('Comma');
           break;
-        case Key.Del:
+        case Key.DEL:
           output.push('Delete');
           break;
-        case Key.Down:
+        case Key.DOWN:
           output.push('Down');
           break;
-        case Key.End:
+        case Key.END:
           output.push('End');
           break;
-        case Key.Home:
+        case Key.HOME:
           output.push('Home');
           break;
-        case Key.Ins:
+        case Key.INS:
           output.push('Insert');
           break;
-        case Key.Left:
+        case Key.LEFT:
           output.push('Left');
           break;
-        case Key.MediaNextTrack:
+        case Key.MEDIA_NEXT_TRACK:
           output.push('MediaNextTrack');
           break;
-        case Key.MediaPlayPause:
+        case Key.MEDIA_PLAY_PAUSE:
           output.push('MediaPlayPause');
           break;
-        case Key.MediaPrevTrack:
+        case Key.MEDIA_PREV_TRACK:
           output.push('MediaPrevTrack');
           break;
-        case Key.MediaStop:
+        case Key.MEDIA_STOP:
           output.push('MediaStop');
           break;
-        case Key.PageDown:
+        case Key.PAGE_DOWN:
           output.push('PageDown');
           break;
-        case Key.PageUp:
+        case Key.PAGE_UP:
           output.push('PageUp');
           break;
-        case Key.Period:
+        case Key.PERIOD:
           output.push('Period');
           break;
-        case Key.Right:
+        case Key.RIGHT:
           output.push('Right');
           break;
-        case Key.Space:
+        case Key.SPACE:
           output.push('Space');
           break;
-        case Key.Tab:
+        case Key.TAB:
           output.push('Tab');
           break;
-        case Key.Up:
+        case Key.UP:
           output.push('Up');
           break;
       }
diff --git a/chrome/browser/resources/new_tab_page/app.ts b/chrome/browser/resources/new_tab_page/app.ts
index d9101f0..d5270360 100644
--- a/chrome/browser/resources/new_tab_page/app.ts
+++ b/chrome/browser/resources/new_tab_page/app.ts
@@ -47,15 +47,15 @@
  * renumbered, removed or reused.
  */
 export enum NtpElement {
-  kOther = 0,
-  kBackground = 1,
-  kOneGoogleBar = 2,
-  kLogo = 3,
-  kRealbox = 4,
-  kMostVisited = 5,
-  kMiddleSlotPromo = 6,
-  kModule = 7,
-  kCustomize = 8,
+  OTHER = 0,
+  BACKGROUND = 1,
+  ONE_GOOGLE_BAR = 2,
+  LOGO = 3,
+  REALBOX = 4,
+  MOST_VISITED = 5,
+  MIDDLE_SLOT_PROMO = 6,
+  MODULE = 7,
+  CUSTOMIZE = 8,
 }
 
 const CUSTOMIZE_URL_PARAM: string = 'customize';
@@ -425,7 +425,7 @@
 
   private onOpenVoiceSearch_() {
     this.showVoiceSearchOverlay_ = true;
-    recordVoiceAction(VoiceAction.kActivateSearchBox);
+    recordVoiceAction(VoiceAction.ACTIVATE_SEARCH_BOX);
   }
 
   private onCustomizeClick_() {
@@ -453,7 +453,7 @@
     // </if>
     if (ctrlKeyPressed && e.code === 'Period' && e.shiftKey) {
       this.showVoiceSearchOverlay_ = true;
-      recordVoiceAction(VoiceAction.kActivateKeyboard);
+      recordVoiceAction(VoiceAction.ACTIVATE_KEYBOARD);
     }
   }
 
@@ -608,7 +608,7 @@
       this.executePromoBrowserCommand_(
           data.data, event.source as Window, event.origin);
     } else if (data.messageType === 'click') {
-      recordClick(NtpElement.kOneGoogleBar);
+      recordClick(NtpElement.ONE_GOOGLE_BAR);
     }
   }
 
@@ -665,33 +665,33 @@
 
   private onWindowClick_(e: Event) {
     if (e.composedPath() && e.composedPath()[0] === $$(this, '#content')) {
-      recordClick(NtpElement.kBackground);
+      recordClick(NtpElement.BACKGROUND);
       return;
     }
     for (const target of e.composedPath()) {
       switch (target) {
         case $$(this, 'ntp-logo'):
-          recordClick(NtpElement.kLogo);
+          recordClick(NtpElement.LOGO);
           return;
         case $$(this, 'ntp-realbox'):
-          recordClick(NtpElement.kRealbox);
+          recordClick(NtpElement.REALBOX);
           return;
         case $$(this, 'cr-most-visited'):
-          recordClick(NtpElement.kMostVisited);
+          recordClick(NtpElement.MOST_VISITED);
           return;
         case $$(this, 'ntp-middle-slot-promo'):
-          recordClick(NtpElement.kMiddleSlotPromo);
+          recordClick(NtpElement.MIDDLE_SLOT_PROMO);
           return;
         case $$(this, 'ntp-modules'):
-          recordClick(NtpElement.kModule);
+          recordClick(NtpElement.MODULE);
           return;
         case $$(this, '#customizeButton'):
         case $$(this, 'ntp-customize-dialog'):
-          recordClick(NtpElement.kCustomize);
+          recordClick(NtpElement.CUSTOMIZE);
           return;
       }
     }
-    recordClick(NtpElement.kOther);
+    recordClick(NtpElement.OTHER);
   }
 }
 
diff --git a/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts b/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts
index 2318f9f..0007a0e 100644
--- a/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts
+++ b/chrome/browser/resources/new_tab_page/modules/cart/discount_consent_card.ts
@@ -55,11 +55,11 @@
 export enum DiscountConsentVariation {
   // These values are persisted to logs. Entries should not be renumbered and
   // numeric values should never be reused.
-  Default = 0,
-  StringChange = 1,
-  Inline = 2,
-  Dialog = 3,
-  NativeDialog = 4
+  DEFAULT = 0,
+  STRING_CHANGE = 1,
+  INLINE = 2,
+  DIALOG = 3,
+  NATIVE_DIALOG = 4
 }
 
 // This is a configurable multi-step card. Each step is represented by the Step
@@ -116,7 +116,7 @@
   private getTotalStep_(): number {
     // Inline-variation is 2, see ntp_feature::DiscountConsentNtpVariation.
     if (loadTimeData.getInteger('modulesCartDiscountConsentVariation') ===
-        DiscountConsentVariation.Inline) {
+        DiscountConsentVariation.INLINE) {
       return 2;
     }
     return 1;
@@ -146,7 +146,7 @@
           this.dispatchEvent(
               new CustomEvent('discount-consent-continued', {composed: true}));
           if (loadTimeData.getInteger('modulesCartDiscountConsentVariation') ===
-              DiscountConsentVariation.NativeDialog) {
+              DiscountConsentVariation.NATIVE_DIALOG) {
             return;
           }
           if (this.currentStep + 1 < this.getTotalStep_()) {
diff --git a/chrome/browser/resources/new_tab_page/modules/cart/module.ts b/chrome/browser/resources/new_tab_page/modules/cart/module.ts
index 15f5e1f..716cba6 100644
--- a/chrome/browser/resources/new_tab_page/modules/cart/module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/cart/module.ts
@@ -87,7 +87,7 @@
         type: Boolean,
         value: () =>
             loadTimeData.getInteger('modulesCartDiscountConsentVariation') >
-            DiscountConsentVariation.StringChange
+            DiscountConsentVariation.STRING_CHANGE
       },
       firstThreeCartItems_:
           {type: Array, computed: 'computeFirstThreeCartItems_(cartItems)'},
@@ -476,7 +476,7 @@
 
   private async onDiscountConsentContinued_() {
     if (loadTimeData.getInteger('modulesCartDiscountConsentVariation') ===
-        DiscountConsentVariation.NativeDialog) {
+        DiscountConsentVariation.NATIVE_DIALOG) {
       const {consentStatus} =
           await ChromeCartProxy.getHandler().showNativeConsentDialog();
 
diff --git a/chrome/browser/resources/new_tab_page/modules/photos/module.ts b/chrome/browser/resources/new_tab_page/modules/photos/module.ts
index a6e8e11d..3fd5b43 100644
--- a/chrome/browser/resources/new_tab_page/modules/photos/module.ts
+++ b/chrome/browser/resources/new_tab_page/modules/photos/module.ts
@@ -23,9 +23,9 @@
  * to logs. Entries should not be renumbered, removed or reused.
  */
 enum OptInStatus {
-  kHardOptOut = 0,
-  kOptIn = 1,
-  kSoftOptOut = 2,
+  HARD_OPT_OUT = 0,
+  OPT_IN = 1,
+  SOFT_OPT_OUT = 2,
 }
 
 function recordOptInStatus(optInStatus: OptInStatus) {
@@ -134,7 +134,7 @@
   }
 
   private onSoftOptOutClick_() {
-    recordOptInStatus(OptInStatus.kSoftOptOut);
+    recordOptInStatus(OptInStatus.SOFT_OPT_OUT);
     PhotosProxy.getHandler().softOptOut();
     this.dispatchEvent(new CustomEvent('dismiss-module', {
       bubbles: true,
@@ -167,7 +167,7 @@
   }
 
   private onOptInClick_() {
-    recordOptInStatus(OptInStatus.kOptIn);
+    recordOptInStatus(OptInStatus.OPT_IN);
     PhotosProxy.getHandler().onUserOptIn(true);
     this.showOptInScreen = false;
     this.hideMenuButton = false;
@@ -175,7 +175,7 @@
   }
 
   private onOptOutClick_() {
-    recordOptInStatus(OptInStatus.kHardOptOut);
+    recordOptInStatus(OptInStatus.HARD_OPT_OUT);
     PhotosProxy.getHandler().onUserOptIn(false);
     // Disable the module when user opt out.
     this.onDisableButtonClick_();
diff --git a/chrome/browser/resources/new_tab_page/voice_search_overlay.ts b/chrome/browser/resources/new_tab_page/voice_search_overlay.ts
index 0bfb1ed..02efd35 100644
--- a/chrome/browser/resources/new_tab_page/voice_search_overlay.ts
+++ b/chrome/browser/resources/new_tab_page/voice_search_overlay.ts
@@ -86,13 +86,13 @@
  * persisted to logs. Entries should not be renumbered, removed or reused.
  */
 export enum Action {
-  kActivateSearchBox = 0,
-  kActivateKeyboard = 1,
-  kCloseOverlay = 2,
-  kQuerySubmitted = 3,
-  kSupportLinkClicked = 4,
-  kTryAgainLink = 5,
-  kTryAgainMicButton = 6,
+  ACTIVATE_SEARCH_BOX = 0,
+  ACTIVATE_KEYBOARD = 1,
+  CLOSE_OVERLAY = 2,
+  QUERY_SUBMITTED = 3,
+  SUPPORT_LINK_CLICKED = 4,
+  TRY_AGAIN_LINK = 5,
+  TRY_AGAIN_MIC_BUTTON = 6,
 }
 
 /**
@@ -101,16 +101,16 @@
  * to logs. Entries should not be renumbered, removed or reused.
  */
 export enum Error {
-  kAborted = 0,
-  kAudioCapture = 1,
-  kBadGrammar = 2,
-  kLanguageNotSupported = 3,
-  kNetwork = 4,
-  kNoMatch = 5,
-  kNoSpeech = 6,
-  kNotAllowed = 7,
-  kOther = 8,
-  kServiceNotAllowed = 9,
+  ABORTED = 0,
+  AUDIO_CAPTURE = 1,
+  BAD_GRAMMAR = 2,
+  LANGUAGE_NOT_SUPPORTED = 3,
+  NETWORK = 4,
+  NO_MATCH = 5,
+  NO_SPEECH = 6,
+  NOT_ALLOWED = 7,
+  OTHER = 8,
+  SERVICE_NOT_ALLOWED = 9,
 }
 
 export function recordVoiceAction(action: Action) {
@@ -128,23 +128,23 @@
 function toError(webkitError: string): Error {
   switch (webkitError) {
     case 'aborted':
-      return Error.kAborted;
+      return Error.ABORTED;
     case 'audio-capture':
-      return Error.kAudioCapture;
+      return Error.AUDIO_CAPTURE;
     case 'language-not-supported':
-      return Error.kLanguageNotSupported;
+      return Error.LANGUAGE_NOT_SUPPORTED;
     case 'network':
-      return Error.kNetwork;
+      return Error.NETWORK;
     case 'no-speech':
-      return Error.kNoSpeech;
+      return Error.NO_SPEECH;
     case 'not-allowed':
-      return Error.kNotAllowed;
+      return Error.NOT_ALLOWED;
     case 'service-not-allowed':
-      return Error.kServiceNotAllowed;
+      return Error.SERVICE_NOT_ALLOWED;
     case 'bad-grammar':
-      return Error.kBadGrammar;
+      return Error.BAD_GRAMMAR;
     default:
-      return Error.kOther;
+      return Error.OTHER;
   }
 }
 
@@ -156,10 +156,10 @@
  */
 function getErrorTimeout(error: Error): number {
   switch (error) {
-    case Error.kAudioCapture:
-    case Error.kNoSpeech:
-    case Error.kNotAllowed:
-    case Error.kNoMatch:
+    case Error.AUDIO_CAPTURE:
+    case Error.NO_SPEECH:
+    case Error.NOT_ALLOWED:
+    case Error.NO_MATCH:
       return ERROR_TIMEOUT_LONG_MS;
     default:
       return ERROR_TIMEOUT_SHORT_MS;
@@ -249,7 +249,7 @@
       this.onError_(toError(e.error));
     };
     this.voiceRecognition_.onnomatch = () => {
-      this.onError_(Error.kNoMatch);
+      this.onError_(Error.NO_MATCH);
     };
   }
 
@@ -272,7 +272,7 @@
 
   private onOverlayClick_() {
     this.$.dialog.close();
-    recordVoiceAction(Action.kCloseOverlay);
+    recordVoiceAction(Action.CLOSE_OVERLAY);
   }
 
   /**
@@ -301,25 +301,25 @@
   }
 
   private onLearnMoreClick_() {
-    recordVoiceAction(Action.kSupportLinkClicked);
+    recordVoiceAction(Action.SUPPORT_LINK_CLICKED);
   }
 
   private onTryAgainClick_(e: Event) {
     // Otherwise, we close the overlay.
     e.stopPropagation();
     this.start();
-    recordVoiceAction(Action.kTryAgainLink);
+    recordVoiceAction(Action.TRY_AGAIN_LINK);
   }
 
   private onMicClick_(e: Event) {
     if (this.state_ !== State.ERROR_RECEIVED ||
-        this.error_ !== Error.kNoMatch) {
+        this.error_ !== Error.NO_MATCH) {
       return;
     }
     // Otherwise, we close the overlay.
     e.stopPropagation();
     this.start();
-    recordVoiceAction(Action.kTryAgainMicButton);
+    recordVoiceAction(Action.TRY_AGAIN_MIC_BUTTON);
   }
 
   private resetIdleTimer_() {
@@ -339,7 +339,7 @@
       return;
     }
     this.voiceRecognition_.abort();
-    this.onError_(Error.kNoMatch);
+    this.onError_(Error.NO_MATCH);
   }
 
   private resetErrorTimer_(duration: number) {
@@ -416,7 +416,7 @@
 
   private onFinalResult_() {
     if (!this.finalResult_) {
-      this.onError_(Error.kNoMatch);
+      this.onError_(Error.NO_MATCH);
       return;
     }
     this.state_ = State.RESULT_FINAL;
@@ -428,27 +428,27 @@
     const queryUrl =
         new URL('/search', loadTimeData.getString('googleBaseUrl'));
     queryUrl.search = searchParams.toString();
-    recordVoiceAction(Action.kQuerySubmitted);
+    recordVoiceAction(Action.QUERY_SUBMITTED);
     WindowProxy.getInstance().navigate(queryUrl.href);
   }
 
   private onEnd_() {
     switch (this.state_) {
       case State.STARTED:
-        this.onError_(Error.kAudioCapture);
+        this.onError_(Error.AUDIO_CAPTURE);
         return;
       case State.AUDIO_RECEIVED:
-        this.onError_(Error.kNoSpeech);
+        this.onError_(Error.NO_SPEECH);
         return;
       case State.SPEECH_RECEIVED:
       case State.RESULT_RECEIVED:
-        this.onError_(Error.kNoMatch);
+        this.onError_(Error.NO_MATCH);
         return;
       case State.ERROR_RECEIVED:
       case State.RESULT_FINAL:
         return;
       default:
-        this.onError_(Error.kOther);
+        this.onError_(Error.OTHER);
         return;
     }
   }
@@ -456,7 +456,7 @@
   private onError_(error: Error) {
     chrome.metricsPrivate.recordEnumerationValue(
         'NewTabPage.VoiceErrors', error, Object.keys(Error).length);
-    if (error === Error.kAborted) {
+    if (error === Error.ABORTED) {
       // We are in the process of closing voice search.
       return;
     }
@@ -500,21 +500,21 @@
 
   private getErrorText_(): string {
     switch (this.error_) {
-      case Error.kNoSpeech:
+      case Error.NO_SPEECH:
         return 'no-speech';
-      case Error.kAudioCapture:
+      case Error.AUDIO_CAPTURE:
         return 'audio-capture';
-      case Error.kNetwork:
+      case Error.NETWORK:
         return 'network';
-      case Error.kNotAllowed:
-      case Error.kServiceNotAllowed:
+      case Error.NOT_ALLOWED:
+      case Error.SERVICE_NOT_ALLOWED:
         return 'not-allowed';
-      case Error.kLanguageNotSupported:
+      case Error.LANGUAGE_NOT_SUPPORTED:
         return 'language-not-supported';
-      case Error.kNoMatch:
+      case Error.NO_MATCH:
         return 'no-match';
-      case Error.kAborted:
-      case Error.kOther:
+      case Error.ABORTED:
+      case Error.OTHER:
       default:
         return 'other';
     }
@@ -522,13 +522,13 @@
 
   private getErrorLink_(): string {
     switch (this.error_) {
-      case Error.kNoSpeech:
-      case Error.kAudioCapture:
+      case Error.NO_SPEECH:
+      case Error.AUDIO_CAPTURE:
         return 'learn-more';
-      case Error.kNotAllowed:
-      case Error.kServiceNotAllowed:
+      case Error.NOT_ALLOWED:
+      case Error.SERVICE_NOT_ALLOWED:
         return 'details';
-      case Error.kNoMatch:
+      case Error.NO_MATCH:
         return 'try-again';
       default:
         return 'none';
diff --git a/chrome/browser/resources/settings/site_settings/all_sites.ts b/chrome/browser/resources/settings/site_settings/all_sites.ts
index 278a71c..befb22f 100644
--- a/chrome/browser/resources/settings/site_settings/all_sites.ts
+++ b/chrome/browser/resources/settings/site_settings/all_sites.ts
@@ -35,7 +35,7 @@
 import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
 
 import {getTemplate} from './all_sites.html.js';
-import {ALL_SITES_DIALOG, AllSitesAction2, ContentSetting, SortMethod} from './constants.js';
+import {AllSitesAction2, AllSitesDialog, ContentSetting, SortMethod} from './constants.js';
 import {LocalDataBrowserProxy, LocalDataBrowserProxyImpl} from './local_data_browser_proxy.js';
 import {SiteSettingsMixin, SiteSettingsMixinInterface} from './site_settings_mixin.js';
 import {OriginInfo, SiteGroup} from './site_settings_prefs_browser_proxy.js';
@@ -517,7 +517,7 @@
     e.preventDefault();
     const scope = this.actionMenuModel_!.actionScope === 'origin' ? 'Origin' :
                                                                     'SiteGroup';
-    const scopes = [ALL_SITES_DIALOG.RESET_PERMISSIONS, scope, 'DialogOpened'];
+    const scopes = [AllSitesDialog.RESET_PERMISSIONS, scope, 'DialogOpened'];
     this.recordUserAction_(scopes);
     this.$.confirmResetSettings.get().showModal();
   }
@@ -537,7 +537,7 @@
     const installed = appInstalled ? 'Installed' : '';
 
     const scopes =
-        [ALL_SITES_DIALOG.CLEAR_DATA, scope, installed, 'DialogOpened'];
+        [AllSitesDialog.CLEAR_DATA, scope, installed, 'DialogOpened'];
     this.recordUserAction_(scopes);
     this.$.confirmClearData.get().showModal();
   }
@@ -549,7 +549,7 @@
     e.preventDefault();
     this.clearAllData_ = true;
     const anyAppsInstalled = this.filteredList_.some(g => g.hasInstalledPWA);
-    const scopes = [ALL_SITES_DIALOG.CLEAR_DATA, 'All'];
+    const scopes = [AllSitesDialog.CLEAR_DATA, 'All'];
     const installed = anyAppsInstalled ? 'Installed' : '';
     this.recordUserAction_([...scopes, installed, 'DialogOpened']);
     this.$.confirmClearAllData.get().showModal();
@@ -767,7 +767,7 @@
     if (actionScope === 'origin') {
       this.browserProxy.recordAction(AllSitesAction2.RESET_ORIGIN_PERMISSIONS);
       this.recordUserAction_(
-          [ALL_SITES_DIALOG.RESET_PERMISSIONS, 'Origin', 'Confirm']);
+          [AllSitesDialog.RESET_PERMISSIONS, 'Origin', 'Confirm']);
 
       this.resetPermissionsForOrigin_(origin);
       updatedSiteGroup.origins = siteGroupToUpdate.origins;
@@ -783,7 +783,7 @@
       this.browserProxy.recordAction(
           AllSitesAction2.RESET_SITE_GROUP_PERMISSIONS);
       this.recordUserAction_(
-          [ALL_SITES_DIALOG.RESET_PERMISSIONS, 'SiteGroup', 'Confirm']);
+          [AllSitesDialog.RESET_PERMISSIONS, 'SiteGroup', 'Confirm']);
 
       if (this.actionMenuModel_!.item.etldPlus1 !==
           siteGroupToUpdate.etldPlus1) {
@@ -905,7 +905,7 @@
    */
   private onClearData_(e: Event) {
     const {index, actionScope, origin} = this.actionMenuModel_!;
-    const scopes: Array<string> = [ALL_SITES_DIALOG.CLEAR_DATA];
+    const scopes: Array<string> = [AllSitesDialog.CLEAR_DATA];
 
     if (actionScope === 'origin') {
       this.browserProxy.recordAction(AllSitesAction2.CLEAR_ORIGIN_DATA);
@@ -942,7 +942,7 @@
   private onClearAllData_(e: Event) {
     this.browserProxy.recordAction(AllSitesAction2.CLEAR_ALL_DATA);
 
-    const scopes = [ALL_SITES_DIALOG.CLEAR_DATA, 'All'];
+    const scopes = [AllSitesDialog.CLEAR_DATA, 'All'];
     const anyAppsInstalled = this.filteredList_.some(g => g.hasInstalledPWA);
     const installed = anyAppsInstalled ? 'Installed' : '';
     this.recordUserAction_([...scopes, installed, 'Confirm']);
diff --git a/chrome/browser/resources/settings/site_settings/constants.ts b/chrome/browser/resources/settings/site_settings/constants.ts
index 38fb1216..a9dee83d 100644
--- a/chrome/browser/resources/settings/site_settings/constants.ts
+++ b/chrome/browser/resources/settings/site_settings/constants.ts
@@ -151,7 +151,7 @@
  * Contains types of dialogs on the AllSites page,
  * used for logging userActions.
  */
-export enum ALL_SITES_DIALOG {
+export enum AllSitesDialog {
   CLEAR_DATA = 'ClearData',
   RESET_PERMISSIONS = 'ResetPermissions',
 }
diff --git a/chrome/browser/resources/side_panel/BUILD.gn b/chrome/browser/resources/side_panel/BUILD.gn
index 8a9912a..661371e 100644
--- a/chrome/browser/resources/side_panel/BUILD.gn
+++ b/chrome/browser/resources/side_panel/BUILD.gn
@@ -68,7 +68,6 @@
     "bookmarks/bookmarks_drag_manager.ts",
     "bookmarks/bookmarks.mojom-webui.js",
     "read_anything/app.ts",
-    "read_anything/heading_element.ts",
     "read_anything/read_anything_api_proxy.ts",
     "read_anything/read_anything.mojom-webui.js",
     "reading_list/app.ts",
diff --git a/chrome/browser/resources/side_panel/read_anything/BUILD.gn b/chrome/browser/resources/side_panel/read_anything/BUILD.gn
index 51fc2d1b..25b1a69 100644
--- a/chrome/browser/resources/side_panel/read_anything/BUILD.gn
+++ b/chrome/browser/resources/side_panel/read_anything/BUILD.gn
@@ -27,15 +27,9 @@
   deps = [ ":web_components" ]
   in_folder = target_gen_dir
   out_folder = preprocess_folder
-  in_files = [
-    "app.ts",
-    "heading_element.ts",
-  ]
+  in_files = [ "app.ts" ]
 }
 
 html_to_js("web_components") {
-  js_files = [
-    "app.ts",
-    "heading_element.ts",
-  ]
+  js_files = [ "app.ts" ]
 }
diff --git a/chrome/browser/resources/side_panel/read_anything/app.html b/chrome/browser/resources/side_panel/read_anything/app.html
index 701c919..6f0c8a6 100644
--- a/chrome/browser/resources/side_panel/read_anything/app.html
+++ b/chrome/browser/resources/side_panel/read_anything/app.html
@@ -24,15 +24,5 @@
   .calibri {
     font-family: Calibri, 'Times New Roman', serif;
   }
-
 </style>
-<div id="container" class$="[[fontName_]]">
-  <template is="dom-repeat" items="[[content_]]">
-    <template is="dom-if" if="[[isParagraph_(item)]]">
-      <p>[[item.text]]</p>
-    </template>
-    <template is="dom-if" if="[[isHeading_(item)]]">
-      <read-anything-heading content-node="[[item]]"></read-anything-heading>
-    </template>
-  </template>
-</div>
+<div id="container" class$="[[fontName_]]"></div>
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts
index d984a1a..a3a9954c 100644
--- a/chrome/browser/resources/side_panel/read_anything/app.ts
+++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import '../strings.m.js';
-import './heading_element.js';
 
 import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -24,11 +23,6 @@
 
   static get properties() {
     return {
-      content_: {
-        type: Array,
-        value: () => [],
-      },
-
       fontName_: {
         type: String,
       }
@@ -38,7 +32,6 @@
   private apiProxy_: ReadAnythingApiProxy =
       ReadAnythingApiProxyImpl.getInstance();
   private listenerIds_: number[];
-  private content_: ContentNode[];
   private fontName_: string;
 
   // Defines the valid font names that can be passed to front-end and maps
@@ -75,16 +68,66 @@
         id => this.apiProxy_.getCallbackRouter().removeListener(id));
   }
 
-  /////////////////////////
-  // Called by app.html. //
-  /////////////////////////
-
-  private isParagraph_(contentNode: ContentNode): boolean {
-    return contentNode.type === ContentType.kParagraph;
+  private buildNode_(contentNode: ContentNode): Node|null {
+    switch (contentNode.type) {
+      case ContentType.kHeading:
+        return this.buildHeadingElement_(contentNode);
+      case ContentType.kLink:
+        return this.buildLinkElement_(contentNode);
+      case ContentType.kParagraph:
+        return this.buildParagraphElement_(contentNode);
+      case ContentType.kStaticText:
+        return this.buildStaticTextElement_(contentNode);
+      default:
+        return null;
+    }
   }
 
-  private isHeading_(contentNode: ContentNode): boolean {
-    return contentNode.type === ContentType.kHeading;
+  private buildHeadingElement_(contentNode: ContentNode): HTMLHeadingElement {
+    let headingLevel: number = contentNode.headingLevel;
+    // In ARIA 1.1, the default heading level is 2.
+    // See AXNodeObject::kDefaultHeadingLevel.
+    if (headingLevel < 1 || headingLevel > 6) {
+      headingLevel = 2;
+    }
+    const tagName: string = 'h' + headingLevel;
+    const element: HTMLElement = document.createElement(tagName);
+    element.setAttribute('align', 'left');
+    this.appendChildNodes_(contentNode, element);
+    return element as HTMLHeadingElement;
+  }
+
+  private buildLinkElement_(contentNode: ContentNode): HTMLAnchorElement|null {
+    if (!contentNode.url.url) {
+      return null;
+    }
+    const element: HTMLAnchorElement = document.createElement('a');
+    element.setAttribute('href', contentNode.url.url);
+    this.appendChildNodes_(contentNode, element);
+    return element;
+  }
+
+  private buildParagraphElement_(contentNode: ContentNode):
+      HTMLParagraphElement {
+    const element: HTMLParagraphElement = document.createElement('p');
+    this.appendChildNodes_(contentNode, element);
+    return element;
+  }
+
+  private buildStaticTextElement_(contentNode: ContentNode): Text|null {
+    if (!contentNode.text || contentNode.children.length) {
+      return null;
+    }
+    return document.createTextNode(contentNode.text);
+  }
+
+  private appendChildNodes_(contentNode: ContentNode, node: Node) {
+    for (const childContentNode of contentNode.children) {
+      const childNode: Node|null = this.buildNode_(childContentNode);
+      if (childNode) {
+        node.appendChild(childNode);
+      }
+    }
   }
 
   ////////////////////////////////////////////////////////////
@@ -92,7 +135,26 @@
   ////////////////////////////////////////////////////////////
 
   showContent_(contentNodes: ContentNode[]) {
-    this.content_ = contentNodes;
+    const shadowRoot: ShadowRoot|null = this.shadowRoot;
+    if (!shadowRoot) {
+      return;
+    }
+    const container: HTMLElement|null = shadowRoot.getElementById('container');
+    if (!container) {
+      return;
+    }
+
+    // Construct a dom node corresponding to each ContentNode and append it to
+    // container. This does not use polymer's templating abstraction, which
+    // would create a shadow node element representing each ContentNode, because
+    // experimentation found the shadow node creation to be ~8-10x slower than
+    // constructing and appending nodes directly to the container element.
+    for (const contentNode of contentNodes) {
+      const node: Node|null = this.buildNode_(contentNode);
+      if (node) {
+        container.appendChild(node);
+      }
+    }
   }
 
   updateFontName_(newFontName: string) {
diff --git a/chrome/browser/resources/side_panel/read_anything/heading_element.html b/chrome/browser/resources/side_panel/read_anything/heading_element.html
deleted file mode 100644
index bb6b447d..0000000
--- a/chrome/browser/resources/side_panel/read_anything/heading_element.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<template is="dom-if" if="[[isH1_()]]">
-  <h1>[[contentNode.text]]</h1>
-</template>
-<template is="dom-if" if="[[isH2_()]]">
-  <h2>[[contentNode.text]]</h2>
-</template>
-<template is="dom-if" if="[[isH3_()]]">
-  <h3>[[contentNode.text]]</h3>
-</template>
-<template is="dom-if" if="[[isH4_()]]">
-  <h4>[[contentNode.text]]</h4>
-</template>
-<template is="dom-if" if="[[isH5_()]]">
-  <h5>[[contentNode.text]]</h5>
-</template>
-<template is="dom-if" if="[[isH6_()]]">
-  <h6>[[contentNode.text]]</h6>
-</template>
-<!-- In ARIA 1.1, the default heading level is 2.
-  See AXNodeObject::kDefaultHeadingLevel. -->
-<template is="dom-if" if="[[isUnknown_()]]">
-  <h2>[[contentNode.text]]</h2>
-</template>
diff --git a/chrome/browser/resources/side_panel/read_anything/heading_element.ts b/chrome/browser/resources/side_panel/read_anything/heading_element.ts
deleted file mode 100644
index e57b9765..0000000
--- a/chrome/browser/resources/side_panel/read_anything/heading_element.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2022 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 {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {ContentNode} from './read_anything.mojom-webui.js';
-
-export class HeadingElement extends PolymerElement {
-  static get is() {
-    return 'read-anything-heading';
-  }
-
-  static get template() {
-    return html`{__html_template__}`;
-  }
-
-  static get properties() {
-    return {
-      contentNode: Object,
-    };
-  }
-
-  contentNode: ContentNode;
-
-  /////////////////////////////////////
-  // Called by heading_element.html. //
-  /////////////////////////////////////
-
-  private isH1_(): boolean {
-    return this.contentNode.headingLevel === 1;
-  }
-
-  private isH2_(): boolean {
-    return this.contentNode.headingLevel === 2;
-  }
-
-  private isH3_(): boolean {
-    return this.contentNode.headingLevel === 3;
-  }
-
-  private isH4_(): boolean {
-    return this.contentNode.headingLevel === 4;
-  }
-
-  private isH5_(): boolean {
-    return this.contentNode.headingLevel === 5;
-  }
-
-  private isH6_(): boolean {
-    return this.contentNode.headingLevel === 6;
-  }
-
-  private isUnknown_(): boolean {
-    // If heading level was not specified or it is an unexpected value, return
-    // true. This will force heading to be shown with the default heading level,
-    // which is 2 according to ARIA 1.1.
-    return !this.contentNode.headingLevel ||
-        this.contentNode.headingLevel < 1 || this.contentNode.headingLevel > 6;
-  }
-}
-
-declare global {
-  interface HTMLElementTagNameMap {
-    'read-anything-heading': HeadingElement;
-  }
-}
-
-customElements.define(HeadingElement.is, HeadingElement);
diff --git a/chrome/browser/resources/signin/OWNERS b/chrome/browser/resources/signin/OWNERS
index e978b193..9332942 100644
--- a/chrome/browser/resources/signin/OWNERS
+++ b/chrome/browser/resources/signin/OWNERS
@@ -1,3 +1,2 @@
 file://components/signin/OWNERS
 
-jkrcal@chromium.org
diff --git a/chrome/browser/resources/welcome/landing_view_proxy.ts b/chrome/browser/resources/welcome/landing_view_proxy.ts
index e3cb481..cc07315 100644
--- a/chrome/browser/resources/welcome/landing_view_proxy.ts
+++ b/chrome/browser/resources/welcome/landing_view_proxy.ts
@@ -6,10 +6,10 @@
     'FirstRun.NewUserExperience.LandingPageInteraction';
 
 enum NuxLandingPageInteractions {
-  PageShown = 0,
-  NavigatedAway,
-  NewUser,
-  ExistingUser,
+  PAGE_SHOWN = 0,
+  NAVIGATED_AWAY,
+  NEW_USER,
+  EXISTING_USER,
 }
 
 const NUX_LANDING_PAGE_INTERACTIONS_COUNT =
@@ -24,19 +24,19 @@
 
 export class LandingViewProxyImpl implements LandingViewProxy {
   recordPageShown() {
-    this.recordInteraction_(NuxLandingPageInteractions.PageShown);
+    this.recordInteraction_(NuxLandingPageInteractions.PAGE_SHOWN);
   }
 
   recordNavigatedAway() {
-    this.recordInteraction_(NuxLandingPageInteractions.NavigatedAway);
+    this.recordInteraction_(NuxLandingPageInteractions.NAVIGATED_AWAY);
   }
 
   recordNewUser() {
-    this.recordInteraction_(NuxLandingPageInteractions.NewUser);
+    this.recordInteraction_(NuxLandingPageInteractions.NEW_USER);
   }
 
   recordExistingUser() {
-    this.recordInteraction_(NuxLandingPageInteractions.ExistingUser);
+    this.recordInteraction_(NuxLandingPageInteractions.EXISTING_USER);
   }
 
   private recordInteraction_(interaction: number) {
diff --git a/chrome/browser/resources/welcome/ntp_background/ntp_background_proxy.ts b/chrome/browser/resources/welcome/ntp_background/ntp_background_proxy.ts
index 9154c91..c77fc59e 100644
--- a/chrome/browser/resources/welcome/ntp_background/ntp_background_proxy.ts
+++ b/chrome/browser/resources/welcome/ntp_background/ntp_background_proxy.ts
@@ -44,7 +44,7 @@
   recordBackgroundImageFailedToLoad() {
     chrome.metricsPrivate.recordEnumerationValue(
         'FirstRun.NewUserExperience.NtpBackgroundInteraction',
-        NuxNtpBackgroundInteractions.BackgroundImageFailedToLoad,
+        NuxNtpBackgroundInteractions.BACKGROUND_IMAGE_FAILED_TO_LOAD,
         Object.keys(NuxNtpBackgroundInteractions).length);
   }
 
@@ -56,7 +56,7 @@
   recordBackgroundImageNeverLoaded() {
     chrome.metricsPrivate.recordEnumerationValue(
         'FirstRun.NewUserExperience.NtpBackgroundInteraction',
-        NuxNtpBackgroundInteractions.BackgroundImageNeverLoaded,
+        NuxNtpBackgroundInteractions.BACKGROUND_IMAGE_NEVER_LOADED,
         Object.keys(NuxNtpBackgroundInteractions).length);
   }
 
diff --git a/chrome/browser/resources/welcome/set_as_default/nux_set_as_default_proxy.ts b/chrome/browser/resources/welcome/set_as_default/nux_set_as_default_proxy.ts
index 0f26f2c6..d6e87b6 100644
--- a/chrome/browser/resources/welcome/set_as_default/nux_set_as_default_proxy.ts
+++ b/chrome/browser/resources/welcome/set_as_default/nux_set_as_default_proxy.ts
@@ -9,12 +9,12 @@
     'FirstRun.NewUserExperience.SetAsDefaultInteraction';
 
 enum NuxSetAsDefaultInteractions {
-  PageShown = 0,
-  NavigatedAway,
-  Skip,
-  ClickSetDefault,
-  SuccessfullySetDefault,
-  NavigatedAwayThroughBrowserHistory,
+  PAGE_SHOWN = 0,
+  NAVIGATED_AWAY,
+  SKIP,
+  CLICK_SET_DEFAULT,
+  SUCCESSFULLY_SET_DEFAULT,
+  NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY,
 }
 
 const NUX_SET_AS_DEFAULT_INTERACTIONS_COUNT =
@@ -41,28 +41,29 @@
   }
 
   recordPageShown() {
-    this.recordInteraction_(NuxSetAsDefaultInteractions.PageShown);
+    this.recordInteraction_(NuxSetAsDefaultInteractions.PAGE_SHOWN);
   }
 
   recordNavigatedAway() {
-    this.recordInteraction_(NuxSetAsDefaultInteractions.NavigatedAway);
+    this.recordInteraction_(NuxSetAsDefaultInteractions.NAVIGATED_AWAY);
   }
 
   recordNavigatedAwayThroughBrowserHistory() {
     this.recordInteraction_(
-        NuxSetAsDefaultInteractions.NavigatedAwayThroughBrowserHistory);
+        NuxSetAsDefaultInteractions.NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY);
   }
 
   recordSkip() {
-    this.recordInteraction_(NuxSetAsDefaultInteractions.Skip);
+    this.recordInteraction_(NuxSetAsDefaultInteractions.SKIP);
   }
 
   recordBeginSetDefault() {
-    this.recordInteraction_(NuxSetAsDefaultInteractions.ClickSetDefault);
+    this.recordInteraction_(NuxSetAsDefaultInteractions.CLICK_SET_DEFAULT);
   }
 
   recordSuccessfullySetDefault() {
-    this.recordInteraction_(NuxSetAsDefaultInteractions.SuccessfullySetDefault);
+    this.recordInteraction_(
+        NuxSetAsDefaultInteractions.SUCCESSFULLY_SET_DEFAULT);
   }
 
   private recordInteraction_(interaction: number): void {
diff --git a/chrome/browser/resources/welcome/shared/module_metrics_proxy.ts b/chrome/browser/resources/welcome/shared/module_metrics_proxy.ts
index 94381af..4ec93bc4 100644
--- a/chrome/browser/resources/welcome/shared/module_metrics_proxy.ts
+++ b/chrome/browser/resources/welcome/shared/module_metrics_proxy.ts
@@ -9,16 +9,16 @@
  * See tools/metrics/histograms/enums.xml.
  */
 export enum NuxNtpBackgroundInteractions {
-  PageShown = 0,
-  DidNothingAndNavigatedAway,
-  DidNothingAndChoseSkip,
-  DidNothingAndChoseNext,
-  ChoseAnOptionAndNavigatedAway,
-  ChoseAnOptionAndChoseSkip,
-  ChoseAnOptionAndChoseNext,
-  NavigatedAwayThroughBrowserHistory,
-  BackgroundImageFailedToLoad,
-  BackgroundImageNeverLoaded,
+  PAGE_SHOWN = 0,
+  DID_NOTHING_AND_NAVIGATED_AWAY,
+  DID_NOTHING_AND_CHOSE_SKIP,
+  DID_NOTHING_AND_CHOSE_NEXT,
+  CHOSE_AN_OPTION_AND_NAVIGATED_AWAY,
+  CHOSE_AN_OPTION_AND_CHOSE_SKIP,
+  CHOSE_AN_OPTION_AND_CHOSE_NEXT,
+  NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY,
+  BACKGROUND_IMAGE_FAILED_TO_LOAD,
+  BACKGROUND_IMAGE_NEVER_LOADED,
 }
 
 /**
@@ -28,19 +28,19 @@
  * See tools/metrics/histograms/enums.xml.
  */
 export enum NuxGoogleAppsInteractions {
-  PageShown = 0,
-  NotUsed_DEPRECATED,
-  GetStarted_DEPRECATED,
-  DidNothingAndNavigatedAway,
-  DidNothingAndChoseSkip,
-  ChoseAnOptionAndNavigatedAway,
-  ChoseAnOptionAndChoseSkip,
-  ChoseAnOptionAndChoseNext,
-  ClickedDisabledNextButtonAndNavigatedAway,
-  ClickedDisabledNextButtonAndChoseSkip,
-  ClickedDisabledNextButtonAndChoseNext,
-  DidNothingAndChoseNext,
-  NavigatedAwayThroughBrowserHistory,
+  PAGE_SHOWN = 0,
+  NOT_USED_DEPRECATED,
+  GET_STARTED_DEPRECATED,
+  DID_NOTHING_AND_NAVIGATED_AWAY,
+  DID_NOTHING_AND_CHOSE_SKIP,
+  CHOSE_AN_OPTION_AND_NAVIGATED_AWAY,
+  CHOSE_AN_OPTION_AND_CHOSE_SKIP,
+  CHOSE_AN_OPTION_AND_CHOSE_NEXT,
+  CLICKED_DISABLED_NEXT_BUTTON_AND_NAVIGATED_AWAY,
+  CLICKED_DISABLED_NEXT_BUTTON_AND_CHOSE_SKIP,
+  CLICKED_DISABLED_NEXT_BUTTON_AND_CHOSE_NEXT,
+  DID_NOTHING_AND_CHOSE_NEXT,
+  NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY,
 }
 
 export interface ModuleMetricsProxy {
@@ -72,72 +72,75 @@
 
   recordPageShown() {
     chrome.metricsPrivate.recordEnumerationValue(
-        this.interactionMetric_, this.interactions_.PageShown,
+        this.interactionMetric_, this.interactions_.PAGE_SHOWN,
         Object.keys(this.interactions_).length);
   }
 
   recordDidNothingAndNavigatedAway() {
     chrome.metricsPrivate.recordEnumerationValue(
-        this.interactionMetric_, this.interactions_.DidNothingAndNavigatedAway,
+        this.interactionMetric_,
+        this.interactions_.DID_NOTHING_AND_NAVIGATED_AWAY,
         Object.keys(this.interactions_).length);
   }
 
   recordDidNothingAndChoseSkip() {
     chrome.metricsPrivate.recordEnumerationValue(
-        this.interactionMetric_, this.interactions_.DidNothingAndChoseSkip,
+        this.interactionMetric_, this.interactions_.DID_NOTHING_AND_CHOSE_SKIP,
         Object.keys(this.interactions_).length);
   }
 
   recordDidNothingAndChoseNext() {
     chrome.metricsPrivate.recordEnumerationValue(
-        this.interactionMetric_, this.interactions_.DidNothingAndChoseNext,
+        this.interactionMetric_, this.interactions_.DID_NOTHING_AND_CHOSE_NEXT,
         Object.keys(this.interactions_).length);
   }
 
   recordChoseAnOptionAndNavigatedAway() {
     chrome.metricsPrivate.recordEnumerationValue(
         this.interactionMetric_,
-        this.interactions_.ChoseAnOptionAndNavigatedAway,
+        this.interactions_.CHOSE_AN_OPTION_AND_NAVIGATED_AWAY,
         Object.keys(this.interactions_).length);
   }
 
   recordChoseAnOptionAndChoseSkip() {
     chrome.metricsPrivate.recordEnumerationValue(
-        this.interactionMetric_, this.interactions_.ChoseAnOptionAndChoseSkip,
+        this.interactionMetric_,
+        this.interactions_.CHOSE_AN_OPTION_AND_CHOSE_SKIP,
         Object.keys(this.interactions_).length);
   }
 
   recordChoseAnOptionAndChoseNext() {
     chrome.metricsPrivate.recordEnumerationValue(
-        this.interactionMetric_, this.interactions_.ChoseAnOptionAndChoseNext,
+        this.interactionMetric_,
+        this.interactions_.CHOSE_AN_OPTION_AND_CHOSE_NEXT,
         Object.keys(this.interactions_).length);
   }
 
   recordClickedDisabledNextButtonAndNavigatedAway() {
     chrome.metricsPrivate.recordEnumerationValue(
         this.interactionMetric_,
-        this.interactions_.ClickedDisabledNextButtonAndNavigatedAway,
+        this.interactions_.CLICKED_DISABLED_NEXT_BUTTON_AND_NAVIGATED_AWAY,
         Object.keys(this.interactions_).length);
   }
 
   recordClickedDisabledNextButtonAndChoseSkip() {
     chrome.metricsPrivate.recordEnumerationValue(
         this.interactionMetric_,
-        this.interactions_.ClickedDisabledNextButtonAndChoseSkip,
+        this.interactions_.CLICKED_DISABLED_NEXT_BUTTON_AND_CHOSE_SKIP,
         Object.keys(this.interactions_).length);
   }
 
   recordClickedDisabledNextButtonAndChoseNext() {
     chrome.metricsPrivate.recordEnumerationValue(
         this.interactionMetric_,
-        this.interactions_.ClickedDisabledNextButtonAndChoseNext,
+        this.interactions_.CLICKED_DISABLED_NEXT_BUTTON_AND_CHOSE_NEXT,
         Object.keys(this.interactions_).length);
   }
 
   recordNavigatedAwayThroughBrowserHistory() {
     chrome.metricsPrivate.recordEnumerationValue(
         this.interactionMetric_,
-        this.interactions_.NavigatedAwayThroughBrowserHistory,
+        this.interactions_.NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY,
         Object.keys(this.interactions_).length);
   }
 }
diff --git a/chrome/browser/resources/welcome/signin_view_proxy.ts b/chrome/browser/resources/welcome/signin_view_proxy.ts
index f1463e65..6965f0c 100644
--- a/chrome/browser/resources/welcome/signin_view_proxy.ts
+++ b/chrome/browser/resources/welcome/signin_view_proxy.ts
@@ -6,11 +6,11 @@
     'FirstRun.NewUserExperience.SignInInterstitialInteraction';
 
 enum NuxSignInInterstitialInteractions {
-  PageShown = 0,
-  NavigatedAway,
-  Skip,
-  SignIn,
-  NavigatedAwayThroughBrowserHistory,
+  PAGE_SHOWN = 0,
+  NAVIGATED_AWAY,
+  SKIP,
+  SIGN_IN,
+  NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY,
 }
 
 const NUX_SIGNIN_VIEW_INTERACTIONS_COUNT =
@@ -26,24 +26,24 @@
 
 export class SigninViewProxyImpl implements SigninViewProxy {
   recordPageShown() {
-    this.recordInteraction_(NuxSignInInterstitialInteractions.PageShown);
+    this.recordInteraction_(NuxSignInInterstitialInteractions.PAGE_SHOWN);
   }
 
   recordNavigatedAway() {
-    this.recordInteraction_(NuxSignInInterstitialInteractions.NavigatedAway);
+    this.recordInteraction_(NuxSignInInterstitialInteractions.NAVIGATED_AWAY);
   }
 
   recordNavigatedAwayThroughBrowserHistory() {
-    this.recordInteraction_(
-        NuxSignInInterstitialInteractions.NavigatedAwayThroughBrowserHistory);
+    this.recordInteraction_(NuxSignInInterstitialInteractions
+                                .NAVIGATED_AWAY_THROUGH_BROWSER_HISTORY);
   }
 
   recordSkip() {
-    this.recordInteraction_(NuxSignInInterstitialInteractions.Skip);
+    this.recordInteraction_(NuxSignInInterstitialInteractions.SKIP);
   }
 
   recordSignIn() {
-    this.recordInteraction_(NuxSignInInterstitialInteractions.SignIn);
+    this.recordInteraction_(NuxSignInInterstitialInteractions.SIGN_IN);
   }
 
   private recordInteraction_(interaction: number): void {
diff --git a/chrome/browser/sync/sync_service_factory_unittest.cc b/chrome/browser/sync/sync_service_factory_unittest.cc
index 7e36b56ab..0eadbeaa 100644
--- a/chrome/browser/sync/sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/sync_service_factory_unittest.cc
@@ -80,7 +80,7 @@
 
   // Returns the collection of default datatypes.
   syncer::ModelTypeSet DefaultDatatypes() {
-    static_assert(38 == syncer::GetNumModelTypes(),
+    static_assert(39 == syncer::GetNumModelTypes(),
                   "When adding a new type, you probably want to add it here as "
                   "well (assuming it is already enabled).");
 
@@ -137,6 +137,7 @@
     datatypes.Put(syncer::AUTOFILL_WALLET_OFFER);
     datatypes.Put(syncer::BOOKMARKS);
     datatypes.Put(syncer::DEVICE_INFO);
+    // TODO(crbug.com/1318028): Add HISTORY once it has a Controller.
     datatypes.Put(syncer::HISTORY_DELETE_DIRECTIVES);
     datatypes.Put(syncer::PREFERENCES);
     datatypes.Put(syncer::PRIORITY_PREFERENCES);
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
index c42189d..c7d50c9 100644
--- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -29,7 +29,7 @@
 namespace {
 
 syncer::ModelTypeSet AllowedTypesInStandaloneTransportMode() {
-  static_assert(38 == syncer::GetNumModelTypes(),
+  static_assert(39 == syncer::GetNumModelTypes(),
                 "Add new types below if they run in transport mode");
   // Only some special allowlisted types (and control types) are allowed in
   // standalone transport mode.
diff --git a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
index 70f9606..fbcae5d 100644
--- a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
+++ b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
@@ -627,7 +627,6 @@
        << (snap.model_neutral_state().num_successful_commits == 0 &&
            snap.model_neutral_state().commit_result.value() ==
                syncer::SyncerError::SYNCER_OK)
-       << ", hierarchy conflicts: " << snap.num_hierarchy_conflicts()
        << ", server conflicts: " << snap.num_server_conflicts()
        << ", num_updates_downloaded : "
        << snap.model_neutral_state().num_updates_downloaded_total
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.cc b/chrome/browser/tracing/chrome_tracing_delegate.cc
index d5d0629..3d99201 100644
--- a/chrome/browser/tracing/chrome_tracing_delegate.cc
+++ b/chrome/browser/tracing/chrome_tracing_delegate.cc
@@ -30,7 +30,9 @@
 #include "components/metrics/metrics_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
+#include "components/tracing/common/background_tracing_state_manager.h"
 #include "components/tracing/common/background_tracing_utils.h"
+#include "components/tracing/common/pref_names.h"
 #include "components/variations/active_field_trials.h"
 #include "components/version_info/version_info.h"
 #include "content/public/browser/background_tracing_config.h"
@@ -59,13 +61,8 @@
 namespace {
 
 using tracing::BackgroundTracingSetupMode;
-
-constexpr char kTracingStateKey[] = "state";
-constexpr char kUploadTimesKey[] = "upload_times";
-constexpr char kScenarioKey[] = "scenario";
-constexpr char kUploadTimestampKey[] = "time";
-
-const int kMinDaysUntilNextUpload = 7;
+using tracing::BackgroundTracingState;
+using tracing::BackgroundTracingStateManager;
 
 // These values are logged to UMA. Entries should not be renumbered and numeric
 // values should never be reused. Please keep in sync with
@@ -96,13 +93,6 @@
   return false;
 }
 
-// Removes any version numbers from the scenario name.
-std::string StripScenarioName(const std::string& scenario_name) {
-  std::string stripped_scenario_name;
-  base::RemoveChars(scenario_name, "1234567890", &stripped_scenario_name);
-  return stripped_scenario_name;
-}
-
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 // Helper for reading the value of device policy from ash-chrome.
 class DevicePolicyObserver {
@@ -138,167 +128,11 @@
 
 }  // namespace
 
-ChromeTracingDelegate::BackgroundTracingStateManager::
-    BackgroundTracingStateManager() = default;
-ChromeTracingDelegate::BackgroundTracingStateManager::
-    ~BackgroundTracingStateManager() = default;
-
-ChromeTracingDelegate::BackgroundTracingStateManager&
-ChromeTracingDelegate::BackgroundTracingStateManager::GetInstance() {
-  static base::NoDestructor<BackgroundTracingStateManager> instance;
-  return *instance;
-}
-
-void ChromeTracingDelegate::BackgroundTracingStateManager::Initialize() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  if (initialized_)
-    return;
-  initialized_ = true;
-
-  PrefService* local_state = g_browser_process->local_state();
-  DCHECK(local_state);
-  const base::Value* dict =
-      local_state->GetDictionary(prefs::kBackgroundTracingSessionState);
-  if (!dict) {
-    SaveState();
-    return;
-  }
-  absl::optional<int> state = dict->FindIntKey(kTracingStateKey);
-  if (state) {
-    if (*state >= 0 &&
-        *state <= static_cast<int>(BackgroundTracingState::LAST)) {
-      last_session_end_state_ = static_cast<BackgroundTracingState>(*state);
-    } else {
-      last_session_end_state_ = BackgroundTracingState::NOT_ACTIVATED;
-    }
-  }
-
-  const base::Value* upload_times = dict->FindListKey(kUploadTimesKey);
-  if (upload_times) {
-    for (const auto& scenario_dict : upload_times->GetListDeprecated()) {
-      DCHECK(scenario_dict.is_dict());
-      const std::string* scenario = scenario_dict.FindStringKey(kScenarioKey);
-      const base::Value* timestamp_val =
-          scenario_dict.FindKey(kUploadTimestampKey);
-      if (!scenario || !timestamp_val) {
-        continue;
-      }
-      absl::optional<base::Time> upload_time = base::ValueToTime(timestamp_val);
-      if (!upload_time) {
-        continue;
-      }
-      if ((base::Time::Now() - *upload_time) >
-          base::Days(kMinDaysUntilNextUpload)) {
-        continue;
-      }
-      scenario_last_upload_timestamp_[*scenario] = *upload_time;
-    }
-  }
-
-  // Save state to update the current session state, replacing the previous
-  // session state.
-  SaveState();
-}
-
-void ChromeTracingDelegate::BackgroundTracingStateManager::SaveState() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DCHECK(initialized_);
-  SaveState(scenario_last_upload_timestamp_, state_);
-}
-
-// static
-void ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-    const ChromeTracingDelegate::ScenarioUploadTimestampMap&
-        scenario_upload_times,
-    ChromeTracingDelegate::BackgroundTracingState state) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetIntKey(kTracingStateKey, static_cast<int>(state));
-  base::Value upload_times(base::Value::Type::LIST);
-  for (const auto& it : scenario_upload_times) {
-    base::Value scenario(base::Value::Type::DICTIONARY);
-    scenario.SetStringKey(kScenarioKey, StripScenarioName(it.first));
-    scenario.SetKey(kUploadTimestampKey, base::TimeToValue(it.second));
-    upload_times.Append(std::move(scenario));
-  }
-  dict.SetKey(kUploadTimesKey, std::move(upload_times));
-
-  PrefService* local_state = g_browser_process->local_state();
-  local_state->Set(prefs::kBackgroundTracingSessionState, std::move(dict));
-  local_state->CommitPendingWrite();
-}
-
-bool ChromeTracingDelegate::BackgroundTracingStateManager::
-    DidLastSessionEndUnexpectedly() const {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DCHECK(initialized_);
-  switch (last_session_end_state_) {
-    case BackgroundTracingState::NOT_ACTIVATED:
-    case BackgroundTracingState::RAN_30_SECONDS:
-    case BackgroundTracingState::FINALIZATION_STARTED:
-      return false;
-    case BackgroundTracingState::STARTED:
-      // If Chrome did not run for 30 seconds after tracing started in previous
-      // session then do not start tracing in current session as a safeguard.
-      // This would be impacted by short sessions (eg: on Android), but worth
-      // the tradeoff of crashing loop on startup. Checking for previous session
-      // crash status is platform dependent and the crash status is initialized
-      // at later point than when tracing begins. So, this check is safer than
-      // waiting for crash metrics to be available. Note that this setting only
-      // checks for last session and not sessions before that. So, the next
-      // session might still crash due to tracing if the user has another
-      // tracing experiment. But, meanwhile we would be able to turn off tracing
-      // experiments based on uploaded crash metrics.
-      return true;
-  }
-}
-
-bool ChromeTracingDelegate::BackgroundTracingStateManager::
-    DidRecentlyUploadForScenario(
-        const content::BackgroundTracingConfig& config) const {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DCHECK(initialized_);
-  std::string stripped_scenario_name =
-      StripScenarioName(config.scenario_name());
-  auto it = scenario_last_upload_timestamp_.find(stripped_scenario_name);
-  if (it != scenario_last_upload_timestamp_.end()) {
-    return (base::Time::Now() - it->second) <=
-           base::Days(kMinDaysUntilNextUpload);
-  }
-  return false;
-}
-
-void ChromeTracingDelegate::BackgroundTracingStateManager::SetState(
-    BackgroundTracingState new_state) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DCHECK(initialized_);
-  if (state_ == new_state) {
-    return;
-  }
-  // If finalization started before 30 seconds, skip recording the new state.
-  if (new_state == BackgroundTracingState::RAN_30_SECONDS &&
-      state_ == BackgroundTracingState::FINALIZATION_STARTED) {
-    return;
-  }
-  state_ = new_state;
-  SaveState();
-}
-
-void ChromeTracingDelegate::BackgroundTracingStateManager::OnScenarioUploaded(
-    const std::string& scenario_name) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DCHECK(initialized_);
-
-  scenario_last_upload_timestamp_[StripScenarioName(scenario_name)] =
-      base::Time::Now();
-  SaveState();
-}
-
 void ChromeTracingDelegate::RegisterPrefs(PrefRegistrySimple* registry) {
   // TODO(ssid): This is no longer used, remove the pref once the new one is
   // stable.
   registry->RegisterInt64Pref(prefs::kBackgroundTracingLastUpload, 0);
-  registry->RegisterDictionaryPref(prefs::kBackgroundTracingSessionState);
+  tracing::RegisterPrefs(registry);
 }
 
 ChromeTracingDelegate::ChromeTracingDelegate() {
@@ -400,7 +234,7 @@
   // previous session where tracing was enabled.
   BackgroundTracingStateManager& state =
       BackgroundTracingStateManager::GetInstance();
-  state.Initialize();
+  state.Initialize(g_browser_process->local_state());
 
   // If the config includes a crash scenario, ignore the trace limit so that a
   // trace can be taken on crash. We check if the trigger is actually due to a
@@ -412,13 +246,7 @@
     return false;
   }
 
-  state.SetState(BackgroundTracingState::STARTED);
-  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, base::BindOnce([]() {
-        BackgroundTracingStateManager::GetInstance().SetState(
-            BackgroundTracingState::RAN_30_SECONDS);
-      }),
-      base::Seconds(30));
+  state.NotifyTracingStarted();
   return true;
 }
 
@@ -428,7 +256,7 @@
     bool is_crash_scenario) {
   BackgroundTracingStateManager& state =
       BackgroundTracingStateManager::GetInstance();
-  state.SetState(BackgroundTracingState::FINALIZATION_STARTED);
+  state.NotifyFinalizationStarted();
 
   // If a crash scenario triggered, ignore the trace upload limit and continue
   // uploading.
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.h b/chrome/browser/tracing/chrome_tracing_delegate.h
index 953a892..2db2911 100644
--- a/chrome/browser/tracing/chrome_tracing_delegate.h
+++ b/chrome/browser/tracing/chrome_tracing_delegate.h
@@ -5,9 +5,6 @@
 #ifndef CHROME_BROWSER_TRACING_CHROME_TRACING_DELEGATE_H_
 #define CHROME_BROWSER_TRACING_CHROME_TRACING_DELEGATE_H_
 
-#include <memory>
-
-#include "base/containers/flat_map.h"
 #include "base/gtest_prod_util.h"
 #include "base/no_destructor.h"
 #include "base/time/time.h"
@@ -24,7 +21,6 @@
 class PrefRegistrySimple;
 
 namespace base {
-class Time;
 class Value;
 }
 
@@ -81,69 +77,6 @@
   FRIEND_TEST_ALL_PREFIXES(ChromeTracingDelegateBrowserTest,
                            BackgroundTracingFinalizationBefore30Seconds);
 
-  // Do not remove or change the order of enum fields since it is stored in
-  // preferences.
-  enum class BackgroundTracingState : int {
-    // Default state when tracing is not started in previous session, or when
-    // state is not found or invalid.
-    NOT_ACTIVATED = 0,
-    STARTED = 1,
-    RAN_30_SECONDS = 2,
-    FINALIZATION_STARTED = 3,
-    LAST = FINALIZATION_STARTED,
-  };
-
-  using ScenarioUploadTimestampMap = base::flat_map<std::string, base::Time>;
-
-  // Manages local state prefs for background tracing, and tracks state from
-  // previous background tracing session(s). This is a singleton, but there
-  // could be many instances of ChromeTracingDelegate. All the calls are
-  // expected to run on UI thread.
-  class BackgroundTracingStateManager {
-   public:
-    static BackgroundTracingStateManager& GetInstance();
-
-    // Initializes state from previous session and writes current state to
-    // prefs, when called the first time. NOOP on any calls after that. It also
-    // deletes any expired entries from prefs.
-    void Initialize();
-
-    // True if last session potentially crashed and it is unsafe to turn on
-    // background tracing in current session.
-    bool DidLastSessionEndUnexpectedly() const;
-    // True if chrome uploaded a trace for the given |config| recently, and
-    // uploads should be throttled for the |config|.
-    bool DidRecentlyUploadForScenario(
-        const content::BackgroundTracingConfig& config) const;
-
-    // Updates the current tracing state and saves it to prefs.
-    void SetState(BackgroundTracingState new_state);
-    // Updates the state to include the upload time for |scenario_name|, and
-    // saves it to prefs.
-    void OnScenarioUploaded(const std::string& scenario_name);
-
-    // Saves the given state to prefs, public for testing.
-    static void SaveState(const ScenarioUploadTimestampMap& upload_times,
-                          BackgroundTracingState state);
-
-   private:
-    friend base::NoDestructor<BackgroundTracingStateManager>;
-
-    BackgroundTracingStateManager();
-    ~BackgroundTracingStateManager();
-
-    void SaveState();
-
-    BackgroundTracingState state_ = BackgroundTracingState::NOT_ACTIVATED;
-
-    bool initialized_ = false;
-
-    // Following are valid only when |initialized_| = true.
-    BackgroundTracingState last_session_end_state_ =
-        BackgroundTracingState::NOT_ACTIVATED;
-    base::flat_map<std::string, base::Time> scenario_last_upload_timestamp_;
-  };
-
 #if BUILDFLAG(IS_ANDROID)
   // TabModelListObserver implementation.
   void OnTabModelAdded() override;
diff --git a/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc b/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc
index 9ff839a..c3803d5 100644
--- a/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc
+++ b/chrome/browser/tracing/chrome_tracing_delegate_browsertest.cc
@@ -17,7 +17,6 @@
 #include "base/test/bind.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/tracing/chrome_tracing_delegate.h"
@@ -28,6 +27,8 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "components/tracing/common/background_tracing_state_manager.h"
+#include "components/tracing/common/pref_names.h"
 #include "components/tracing/common/trace_startup_config.h"
 #include "components/variations/variations_params_manager.h"
 #include "content/public/browser/background_tracing_config.h"
@@ -46,16 +47,16 @@
         started_finalizations_count_(0),
         last_on_started_finalizing_success_(false) {}
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
   void SetUpOnMainThread() override {
     InProcessBrowserTest::SetUpOnMainThread();
 
     PrefService* local_state = g_browser_process->local_state();
     DCHECK(local_state);
     local_state->SetBoolean(metrics::prefs::kMetricsReportingEnabled, true);
+    tracing::BackgroundTracingStateManager::GetInstance()
+        .SetPrefServiceForTesting(local_state);
     content::TracingController::GetInstance();  // Create tracing agents.
   }
-#endif
 
   bool StartPreemptiveScenario(
       content::BackgroundTracingManager::DataFiltering data_filtering,
@@ -162,7 +163,7 @@
   PrefService* local_state = g_browser_process->local_state();
   DCHECK(local_state);
   const base::Value* state =
-      local_state->GetDictionary(prefs::kBackgroundTracingSessionState);
+      local_state->GetDictionary(tracing::kBackgroundTracingSessionState);
   std::string json;
   EXPECT_TRUE(base::JSONWriter::Write(*state, &json));
   return json;
@@ -206,11 +207,11 @@
   EXPECT_EQ(state, "{}");
 
   base::Time upload_time = base::Time::Now() - base::Days(1);
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
   upload_times["TestScenario"] = upload_time;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::NOT_ACTIVATED);
 
   EXPECT_FALSE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING));
@@ -228,12 +229,12 @@
   EXPECT_EQ(state, "{}");
 
   base::Time upload_time = base::Time::Now() - base::Days(1);
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
   upload_times["TestScenario10"] = upload_time;
   upload_times["TestingScenario1"] = upload_time;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::NOT_ACTIVATED);
 
   EXPECT_FALSE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING, "TestScenario12"));
@@ -252,12 +253,12 @@
   EXPECT_EQ(state, "{}");
 
   base::Time upload_time = base::Time::Now() - base::Days(1);
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
   upload_times["TestScenario10"] = upload_time;
   upload_times["TestingScenario1"] = upload_time;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::NOT_ACTIVATED);
 
   EXPECT_TRUE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING, "OtherScenario"));
@@ -289,11 +290,11 @@
   EXPECT_EQ(state, "{}");
 
   base::Time upload_time = base::Time::Now() - base::Days(8);
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
   upload_times["TestScenario"] = upload_time;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::NOT_ACTIVATED);
 
   EXPECT_TRUE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING));
@@ -374,9 +375,10 @@
   std::string state = GetSessionStateJson();
   EXPECT_EQ(state, "{}");
 
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times, ChromeTracingDelegate::BackgroundTracingState::STARTED);
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::STARTED);
 
   EXPECT_FALSE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING));
@@ -387,10 +389,10 @@
   std::string state = GetSessionStateJson();
   EXPECT_EQ(state, "{}");
 
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::RAN_30_SECONDS);
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::RAN_30_SECONDS);
 
   EXPECT_TRUE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING));
@@ -401,10 +403,10 @@
   std::string state = GetSessionStateJson();
   EXPECT_EQ(state, "{}");
 
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::FINALIZATION_STARTED);
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::FINALIZATION_STARTED);
 
   EXPECT_TRUE(StartPreemptiveScenario(
       content::BackgroundTracingManager::NO_DATA_FILTERING));
@@ -415,15 +417,14 @@
   std::string state = GetSessionStateJson();
   EXPECT_EQ(state, "{}");
 
-  ChromeTracingDelegate::ScenarioUploadTimestampMap upload_times;
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::FINALIZATION_STARTED);
+  tracing::BackgroundTracingStateManager::ScenarioUploadTimestampMap
+      upload_times;
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::FINALIZATION_STARTED);
 
   // State does not update from finalization started to ran 30 seconds.
-  ChromeTracingDelegate::BackgroundTracingStateManager::SaveState(
-      upload_times,
-      ChromeTracingDelegate::BackgroundTracingState::RAN_30_SECONDS);
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      upload_times, tracing::BackgroundTracingState::RAN_30_SECONDS);
   state = GetSessionStateJson();
   EXPECT_EQ(state, R"({"state":2,"upload_times":[]})");
 }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
index e371803..d0b3652 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">চাওক</translation>
 <translation id="8218052821161047641">দ্ৰুত পৃষ্ঠা</translation>
 <translation id="8218622182176210845">আপোনাৰ একাউণ্টটো পৰিচালনা কৰক</translation>
+<translation id="8221656072740924283">অব্যাহত ৰাখক</translation>
 <translation id="8223642481677794647">ফীড কাৰ্ড মেনু</translation>
 <translation id="8250920743982581267">নথিপত্রসমূহ</translation>
 <translation id="825412236959742607">এই পৃষ্ঠাটোৱে বহুত বেছি মেম’ৰি খৰচ কৰে, সেয়েহে Chromeএ কিছুমান সমল আঁতৰাই পেলাইছে৷</translation>
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 dc1445e..62f9ed3 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
@@ -1318,6 +1318,7 @@
 <translation id="8216351761227087153">দেখুন</translation>
 <translation id="8218052821161047641">অতি দ্রুত লোড হওয়া পৃষ্ঠা</translation>
 <translation id="8218622182176210845">আপনার অ্যাকাউন্ট ম্যানেজ করুন</translation>
+<translation id="8221656072740924283">চালিয়ে যান</translation>
 <translation id="8223642481677794647">ফিড কার্ডের মেনু</translation>
 <translation id="8250920743982581267">দস্তাবেজগুলি</translation>
 <translation id="825412236959742607">এই পৃষ্ঠাটি খুব বেশি মেমরি ব্যবহার করছে তাই Chrome কিছু কন্টেন্ট সরিয়ে দিয়েছে।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
index e2e5680..3269c39 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">Ikusi</translation>
 <translation id="8218052821161047641">Orri bizkorra</translation>
 <translation id="8218622182176210845">Kudeatu kontua</translation>
+<translation id="8221656072740924283">Egin aurrera</translation>
 <translation id="8223642481677794647">Jarioko txartelaren menua</translation>
 <translation id="8250920743982581267">Dokumentuak</translation>
 <translation id="825412236959742607">Chrome-k orri honetako eduki batzuk kendu ditu, orriak memoria gehiegi erabiltzen duelako.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
index c710eb2..5683e48 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">જુઓ</translation>
 <translation id="8218052821161047641">ઝડપી લોડિંગ પેજ</translation>
 <translation id="8218622182176210845">તમારું એકાઉન્ટ મેનેજ કરો</translation>
+<translation id="8221656072740924283">આગળ વધો</translation>
 <translation id="8223642481677794647">ફીડ કાર્ડ મેનૂ</translation>
 <translation id="8250920743982581267">દસ્તાવેજો</translation>
 <translation id="825412236959742607">આ પેજ મેમરીનો બહુ ઉપયોગ કરે છે, તેથી Chromeએ કેટલુંક કન્ટેન્ટ કાઢી નાખ્યું છે.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
index 2fdf4b2..a78e87e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">មើល</translation>
 <translation id="8218052821161047641">ទំព័ររហ័ស</translation>
 <translation id="8218622182176210845">គ្រប់គ្រង​គណនី​របស់អ្នក</translation>
+<translation id="8221656072740924283">បន្ត</translation>
 <translation id="8223642481677794647">ម៉ឺនុយ​កាត​ព័ត៌មាន</translation>
 <translation id="8250920743982581267">ឯកសារ</translation>
 <translation id="825412236959742607">ទំព័រនេះ​ប្រើអង្គ​ចងចាំ​ច្រើនពេក ដូច្នេះ Chrome បាន​លុប​ខ្លឹមសារមួយចំនួន។</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
index 26db70d9..4856a1e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">കാ‍ണുക</translation>
 <translation id="8218052821161047641">വേഗം ലോഡാകുന്ന പേജ്</translation>
 <translation id="8218622182176210845">നിങ്ങളുടെ അക്കൗണ്ട് മാനേജ് ചെയ്യുക</translation>
+<translation id="8221656072740924283">തുടരുക</translation>
 <translation id="8223642481677794647">ഫീഡ് കാർഡ് മെനു</translation>
 <translation id="8250920743982581267">ഡോക്യുമെന്റുകൾ</translation>
 <translation id="825412236959742607">ഈ പേജ് കൂടുതൽ മെമ്മറി ഉപയോഗിക്കുന്നു, അതിനാൽ Chrome കുറച്ച് ഉള്ളടക്കം നീക്കം ചെയ്‌തു.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
index ea8d63ad..bd59e9a 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -1315,6 +1315,7 @@
 <translation id="8216351761227087153">हेर्नुहोस्</translation>
 <translation id="8218052821161047641">छिटो लोड हुने पृष्ठ</translation>
 <translation id="8218622182176210845">आफ्नो खाताको व्यवस्थापन गर्नुहोस्</translation>
+<translation id="8221656072740924283">जारी राख्नुहोस्</translation>
 <translation id="8223642481677794647">फिड कार्ड मेनु</translation>
 <translation id="8250920743982581267">कागजातहरू</translation>
 <translation id="825412236959742607">यस पृष्ठले अत्यधिक मेमोरी प्रयोग गर्छ, त्यसैले Chrome ले केही सामग्री हटायो।</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
index aec648d..a797e328 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">ਦੇਖੋ</translation>
 <translation id="8218052821161047641">ਤੇਜ਼ੀ ਨਾਲ ਲੋਡ ਹੋਣ ਵਾਲਾ ਪੰਨਾ</translation>
 <translation id="8218622182176210845">ਆਪਣੇ ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation>
+<translation id="8221656072740924283">ਜਾਰੀ ਰੱਖੋ</translation>
 <translation id="8223642481677794647">ਫ਼ੀਡ ਕਾਰਡ ਮੀਨੂ</translation>
 <translation id="8250920743982581267">ਦਸਤਾਵੇਜ਼</translation>
 <translation id="825412236959742607">ਇਹ ਪੰਨਾ ਬਹੁਤ ਜ਼ਿਆਦਾ ਮੈਮੋਰੀ ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ, ਇਸ ਲਈ Chrome ਨੇ ਕੁਝ ਸਮੱਗਰੀ ਹਟਾ ਦਿੱਤੀ ਹੈ।</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 8b048d4..e9f93da 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
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">Zobacz</translation>
 <translation id="8218052821161047641">Szybka strona</translation>
 <translation id="8218622182176210845">Zarządzaj kontem</translation>
+<translation id="8221656072740924283">Dalej</translation>
 <translation id="8223642481677794647">Menu karty kanału</translation>
 <translation id="8250920743982581267">Dokumenty</translation>
 <translation id="825412236959742607">Ta strona używa zbyt dużo pamięci, dlatego Chrome usunął część jej zawartości.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
index 916f7ba3..a19423c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -91,7 +91,7 @@
 <translation id="1409879593029778104">Preuzimanje datoteke <ph name="FILE_NAME" /> je sprečeno jer ona već postoji.</translation>
 <translation id="1414981605391750300">Kontaktiramo Google. To može malo da potraje...</translation>
 <translation id="1416550906796893042">Verzija aplikacije</translation>
-<translation id="1428770807407000502">Želite li da isključite sinhronizaciju?</translation>
+<translation id="1428770807407000502">Želite da isključite sinhronizaciju?</translation>
 <translation id="1430915738399379752">Štampaj</translation>
 <translation id="1436784010935106834">Uklonjeno</translation>
 <translation id="1448440926884431741">Organizujte proizvode koje pratite u Obeleživačima</translation>
@@ -917,7 +917,7 @@
 <translation id="6095578583683628124">Ako vam je Google i podrazumevani pretraživač, videćete bolje, kontekstualno relevantne predloge</translation>
 <translation id="6108923351542677676">Podešavanje je u toku...</translation>
 <translation id="6112702117600201073">Osvežavanje stranice</translation>
-<translation id="6122831415929794347">Želite li da isključite Bezbednosno pregledanje?</translation>
+<translation id="6122831415929794347">Želite da isključite Bezbednosno pregledanje?</translation>
 <translation id="6127379762771434464">Uklonili ste stavku</translation>
 <translation id="6137022273846704445">Jezik aplikacije <ph name="APP_NAME" /></translation>
 <translation id="6138832295072039549">Promenite podešavanja sajta ovde</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
index fac124a..342e84c 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -91,7 +91,7 @@
 <translation id="1409879593029778104">Преузимање датотеке <ph name="FILE_NAME" /> је спречено јер она већ постоји.</translation>
 <translation id="1414981605391750300">Контактирамо Google. То може мало да потраје...</translation>
 <translation id="1416550906796893042">Верзија апликације</translation>
-<translation id="1428770807407000502">Желите ли да искључите синхронизацију?</translation>
+<translation id="1428770807407000502">Желите да искључите синхронизацију?</translation>
 <translation id="1430915738399379752">Штампај</translation>
 <translation id="1436784010935106834">Уклоњено</translation>
 <translation id="1448440926884431741">Организујте производе које пратите у Обележивачима</translation>
@@ -917,7 +917,7 @@
 <translation id="6095578583683628124">Ако вам је Google и подразумевани претраживач, видећете боље, контекстуално релевантне предлоге</translation>
 <translation id="6108923351542677676">Подешавање је у току...</translation>
 <translation id="6112702117600201073">Освежавање странице</translation>
-<translation id="6122831415929794347">Желите ли да искључите Безбедносно прегледање?</translation>
+<translation id="6122831415929794347">Желите да искључите Безбедносно прегледање?</translation>
 <translation id="6127379762771434464">Уклонили сте ставку</translation>
 <translation id="6137022273846704445">Језик апликације <ph name="APP_NAME" /></translation>
 <translation id="6138832295072039549">Промените подешавања сајта овде</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 8fd73e2..313c1f9 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
@@ -1316,6 +1316,7 @@
 <translation id="8216351761227087153">చూడండి</translation>
 <translation id="8218052821161047641">వేగంగా లోడ్ అయ్యే పేజీ</translation>
 <translation id="8218622182176210845">మీ ఖాతాను నిర్వహించండి</translation>
+<translation id="8221656072740924283">కొనసాగించండి</translation>
 <translation id="8223642481677794647">ఫీడ్ కార్డ్ మెనూ</translation>
 <translation id="8250920743982581267">డాక్యుమెంట్లు</translation>
 <translation id="825412236959742607">ఈ పేజీ చాలా మెమరీని ఉపయోగిస్తుంది, కాబట్టి Chrome కొంత కంటెంట్‌ను తీసివేసింది.</translation>
diff --git a/chrome/browser/ui/app_list/app_list_sort_browsertest.cc b/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
index f24c212..6abba0b 100644
--- a/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_sort_browsertest.cc
@@ -258,6 +258,8 @@
   histograms.ExpectBucketCount(ash::kClamshellReorderActionHistogram,
                                ash::AppListSortOrder::kNameAlphabetical, 1);
   histograms.ExpectTotalCount(ash::kAppListSortDiscoveryDurationAfterNudge, 1);
+  histograms.ExpectTotalCount(ash::kAppListSortDiscoveryDurationAfterActivation,
+                              1);
 
   ReorderTopLevelAppsGridAndWaitForCompletion(ash::AppListSortOrder::kColor,
                                               MenuType::kAppListPageMenu);
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
index 706d5ef..c01e873 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
@@ -738,7 +738,7 @@
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     AppServiceAppModelBuilderTest::SetUp();
     test_helper_ = std::make_unique<CrostiniTestHelper>(testing_profile());
@@ -757,7 +757,7 @@
     // clients are destroyed.
     profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
@@ -978,12 +978,12 @@
     ScopedDBusThreadManager() {
       chromeos::DBusThreadManager::Initialize();
       chromeos::CiceroneClient::InitializeFake();
-      chromeos::ConciergeClient::InitializeFake();
+      ash::ConciergeClient::InitializeFake();
       ash::SeneschalClient::InitializeFake();
     }
     ~ScopedDBusThreadManager() {
       ash::SeneschalClient::Shutdown();
-      chromeos::ConciergeClient::Shutdown();
+      ash::ConciergeClient::Shutdown();
       chromeos::CiceroneClient::Shutdown();
       chromeos::DBusThreadManager::Shutdown();
     }
diff --git a/chrome/browser/ui/app_list/arc/arc_app_test.cc b/chrome/browser/ui/app_list/arc/arc_app_test.cc
index 204cccc..f7076705 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_test.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_test.cc
@@ -87,7 +87,7 @@
   if (!chromeos::DBusThreadManager::IsInitialized()) {
     chromeos::DBusThreadManager::Initialize();
     dbus_thread_manager_initialized_ = true;
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
   }
   arc::SetArcAvailableCommandLineForTesting(
       base::CommandLine::ForCurrentProcess());
@@ -259,7 +259,7 @@
   // ash::AshTestHelper::SetUp(), so Shutdown() only when it is initialized in
   // ArcAppTest::SetUp().
   if (dbus_thread_manager_initialized_) {
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
     dbus_thread_manager_initialized_ = false;
   }
diff --git a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
index 88896c2..89d9d37 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider_unittest.cc
@@ -564,7 +564,7 @@
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
     AppSearchProviderTest::SetUp();
   }
@@ -579,7 +579,7 @@
     // clients are destroyed.
     profile_.reset();
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ui/app_list/search/search_features.cc b/chrome/browser/ui/app_list/search/search_features.cc
index aecc38a..b12f470 100644
--- a/chrome/browser/ui/app_list/search/search_features.cc
+++ b/chrome/browser/ui/app_list/search/search_features.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/app_list/search/search_features.h"
 
+#include "ash/constants/ash_features.h"
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 
@@ -13,7 +14,8 @@
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
 bool IsLauncherGameSearchEnabled() {
-  return base::FeatureList::IsEnabled(kLauncherGameSearch);
+  return base::FeatureList::IsEnabled(kLauncherGameSearch) ||
+         base::FeatureList::IsEnabled(ash::features::kCloudGamingDevice);
 }
 
 }  // namespace search_features
diff --git a/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc b/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
index 8360b514..140458b 100644
--- a/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
@@ -33,7 +33,7 @@
     // Need to initialize DBusThreadManager before ArcSessionManager's
     // constructor calls DBusThreadManager::Get().
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     ChromeAshTestBase::SetUp();
 
     // Setup test profile.
@@ -62,7 +62,7 @@
     arc_session_manager_->Shutdown();
     arc_session_manager_.reset();
     ChromeAshTestBase::TearDown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ui/ash/keyboard/DIR_METADATA b/chrome/browser/ui/ash/keyboard/DIR_METADATA
index 671c987..caac77f 100644
--- a/chrome/browser/ui/ash/keyboard/DIR_METADATA
+++ b/chrome/browser/ui/ash/keyboard/DIR_METADATA
@@ -1 +1 @@
-mixins: "//ash/keyboard/COMMON_METADATA"
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc
index 94c9fc3..9dccfb0e 100644
--- a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc
+++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc
@@ -58,8 +58,9 @@
   registry->RegisterBooleanPref(
       ash::prefs::kProjectorDogfoodForFamilyLinkEnabled,
       /*default_value=*/false);
-  registry->RegisterBooleanPref(ash::prefs::kProjectorSkipTranscriptDialogShown,
-                                /*default_value=*/false);
+  registry->RegisterBooleanPref(
+      ash::prefs::kProjectorExcludeTranscriptDialogShown,
+      /*default_value=*/false);
 }
 
 ProjectorAppClientImpl::ProjectorAppClientImpl()
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
index 9bb73860..7b2e3f2 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
@@ -426,7 +426,7 @@
     command_line->AppendSwitch(switches::kDisableDefaultApps);
 
     chromeos::DBusThreadManager::Initialize();
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ash::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
 
     app_list::AppListSyncableServiceFactory::SetUseInTesting(true);
 
@@ -606,7 +606,7 @@
     shelf_controller_ = nullptr;
     shelf_item_factory_.reset();
     BrowserWithTestWindowTest::TearDown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
     app_list::AppListSyncableServiceFactory::SetUseInTesting(false);
   }
diff --git a/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc b/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc
index 1f80694f..df814a9 100644
--- a/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/shelf_context_menu_unittest.cc
@@ -107,7 +107,7 @@
   void SetUp() override {
     chromeos::DBusThreadManager::Initialize();
     chromeos::CiceroneClient::InitializeFake();
-    chromeos::ConciergeClient::InitializeFake();
+    ash::ConciergeClient::InitializeFake();
     ash::SeneschalClient::InitializeFake();
 
     ChromeAshTestBase::SetUp();
@@ -209,7 +209,7 @@
     ChromeAshTestBase::TearDown();
 
     ash::SeneschalClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     chromeos::CiceroneClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
diff --git a/chrome/browser/ui/extensions/extension_installed_bubble_model.cc b/chrome/browser/ui/extensions/extension_installed_bubble_model.cc
index f96b44c..ee32eb2 100644
--- a/chrome/browser/ui/extensions/extension_installed_bubble_model.cc
+++ b/chrome/browser/ui/extensions/extension_installed_bubble_model.cc
@@ -11,10 +11,10 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/sync/sync_promo_ui.h"
 #include "chrome/common/extensions/api/omnibox/omnibox_handler.h"
-#include "chrome/common/extensions/command.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "extensions/common/api/extension_action/action_info.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/image/image_skia_operations.h"
diff --git a/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc b/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc
index 80d4456..a71cb3e 100644
--- a/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc
+++ b/chrome/browser/ui/hats/trust_safety_sentiment_service_browsertest.cc
@@ -9,6 +9,8 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/hats/hats_service_factory.h"
 #include "chrome/browser/ui/hats/mock_hats_service.h"
+#include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
+#include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
 #include "chrome/browser/ui/page_info/page_info_dialog.h"
 #include "chrome/browser/ui/views/page_info/page_info_bubble_view.h"
 #include "chrome/common/chrome_features.h"
@@ -19,6 +21,16 @@
 
 using ::testing::_;
 
+namespace {
+
+std::unique_ptr<KeyedService> BuildSentimentServiceForTesting(
+    content::BrowserContext* context) {
+  return std::make_unique<TrustSafetySentimentService>(
+      static_cast<Profile*>(context));
+}
+
+}  // namespace
+
 class TrustSafetySentimentServiceBrowserTest : public InProcessBrowserTest {
  public:
   TrustSafetySentimentServiceBrowserTest() {
@@ -31,6 +43,9 @@
     mock_hats_service_ = static_cast<MockHatsService*>(
         HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
             browser()->profile(), base::BindRepeating(&BuildMockHatsService)));
+    TrustSafetySentimentServiceFactory::GetInstance()->SetTestingFactory(
+        browser()->profile(),
+        base::BindRepeating(&BuildSentimentServiceForTesting));
     EXPECT_CALL(*mock_hats_service_, CanShowAnySurvey(_))
         .WillRepeatedly(testing::Return(true));
   }
diff --git a/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc b/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc
index 69d8ec73..5b779a6d 100644
--- a/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc
+++ b/chrome/browser/ui/views/crostini/crostini_uninstaller_view_browsertest.cc
@@ -26,16 +26,16 @@
 
 class CrostiniUninstallerViewBrowserTest : public CrostiniDialogBrowserTest {
  public:
-  class WaitingFakeConciergeClient : public chromeos::FakeConciergeClient {
+  class WaitingFakeConciergeClient : public ash::FakeConciergeClient {
    public:
     explicit WaitingFakeConciergeClient(chromeos::FakeCiceroneClient* client)
-        : chromeos::FakeConciergeClient(client) {}
+        : ash::FakeConciergeClient(client) {}
 
     void StopVm(
         const vm_tools::concierge::StopVmRequest& request,
         chromeos::DBusMethodCallback<vm_tools::concierge::StopVmResponse>
             callback) override {
-      chromeos::FakeConciergeClient::StopVm(request, std::move(callback));
+      ash::FakeConciergeClient::StopVm(request, std::move(callback));
       if (closure_) {
         base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
                                                       std::move(closure_));
@@ -58,7 +58,7 @@
 
   explicit CrostiniUninstallerViewBrowserTest(bool register_termina)
       : CrostiniDialogBrowserTest(register_termina) {
-    chromeos::ConciergeClient::Shutdown();
+    ash::ConciergeClient::Shutdown();
     // After the browser's mainloop is terminated. chromeos::ShutdownDBus() will
     // delete the object.
     waiting_fake_concierge_client_ = new WaitingFakeConciergeClient(nullptr);
diff --git a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
index c7100791..eb76a070 100644
--- a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
+++ b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
@@ -17,9 +17,9 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_action_view_delegate_views.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_view.h"
-#include "chrome/common/extensions/command.h"
 #include "extensions/browser/extension_action.h"
 #include "extensions/common/api/extension_action/action_info.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest_constants.h"
 #include "ui/views/view.h"
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc
index 0bfc7b1..0d4c12f 100644
--- a/chrome/browser/ui/views/frame/browser_frame.cc
+++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -100,6 +100,11 @@
     params.z_order = ui::ZOrderLevel::kFloatingWindow;
   }
 
+#if defined(USE_OZONE)
+  params.inhibit_keyboard_shortcuts =
+      browser->is_type_app() || browser->is_type_app_popup();
+#endif
+
   if (native_browser_frame_->ShouldRestorePreviousBrowserWidgetState()) {
     if (browser->is_type_normal() || browser->is_type_devtools() ||
         browser->is_type_app()) {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 3d70a2c..4f8adabe 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -162,7 +162,6 @@
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/command.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/chromium_strings.h"
@@ -198,6 +197,7 @@
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
+#include "extensions/common/command.h"
 #include "ui/accessibility/accessibility_features.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/accessibility/ax_mode_observer.h"
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc
index 2be3cb7..9e4d4ee 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.cc
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -160,25 +160,6 @@
 }
 
 // static
-std::unique_ptr<IntentPickerBubbleView>
-IntentPickerBubbleView::CreateBubbleViewForTesting(
-    views::View* anchor_view,
-    BubbleType bubble_type,
-    std::vector<AppInfo> app_info,
-    bool show_stay_in_chrome,
-    bool show_remember_selection,
-    const absl::optional<url::Origin>& initiating_origin,
-    IntentPickerResponse intent_picker_cb,
-    content::WebContents* web_contents) {
-  auto bubble = std::make_unique<IntentPickerBubbleView>(
-      anchor_view, bubble_type, std::move(app_info),
-      std::move(intent_picker_cb), web_contents, show_stay_in_chrome,
-      show_remember_selection, initiating_origin);
-  bubble->Initialize();
-  return bubble;
-}
-
-// static
 void IntentPickerBubbleView::CloseCurrentBubble() {
   if (intent_picker_bubble_)
     intent_picker_bubble_->CloseBubble();
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.h b/chrome/browser/ui/views/intent_picker_bubble_view.h
index 80ada0ba..ee21a595 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view.h
+++ b/chrome/browser/ui/views/intent_picker_bubble_view.h
@@ -152,16 +152,6 @@
   FRIEND_TEST_ALL_PREFIXES(IntentPickerBubbleViewBrowserTestChromeOS,
                            StayInChromeARCAndPWA);
 
-  static std::unique_ptr<IntentPickerBubbleView> CreateBubbleViewForTesting(
-      views::View* anchor_view,
-      BubbleType bubble_type,
-      std::vector<AppInfo> app_info,
-      bool show_stay_in_chrome,
-      bool show_remember_selection,
-      const absl::optional<url::Origin>& initiating_origin,
-      IntentPickerResponse intent_picker_cb,
-      content::WebContents* web_contents);
-
   const std::vector<AppInfo>& app_info_for_testing() const { return app_info_; }
 
   // views::BubbleDialogDelegateView overrides:
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc b/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
index dc8170f..c3849d5 100644
--- a/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/intent_picker_bubble_view_unittest.cc
@@ -28,6 +28,7 @@
 #include "ui/events/base_event_utils.h"
 #include "ui/gfx/image/image.h"
 #include "ui/strings/grit/ui_strings.h"
+#include "ui/views/animation/ink_drop_state.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/button/checkbox.h"
@@ -118,14 +119,13 @@
                             app.display_name);
     }
 
-    auto bubble = IntentPickerBubbleView::CreateBubbleViewForTesting(
-        anchor_view_, bubble_type, std::move(app_info), show_stay_in_chrome,
+    IntentPickerBubbleView::ShowBubble(
+        anchor_view_, /*highlighted_button=*/nullptr, bubble_type, web_contents,
+        std::move(app_info), show_stay_in_chrome,
         /*show_remember_selection=*/true, initiating_origin,
         base::BindOnce(&IntentPickerBubbleViewTest::OnBubbleClosed,
-                       base::Unretained(this)),
-        web_contents);
-    bubble_ = bubble.get();
-    views::BubbleDialogDelegateView::CreateBubble(std::move(bubble));
+                       base::Unretained(this)));
+    bubble_ = IntentPickerBubbleView::intent_picker_bubble();
   }
 
   // Add an app to the bubble opened by CreateBubbleView. Manually added apps
@@ -197,13 +197,16 @@
   EXPECT_EQ(size, bubble_->GetScrollViewSize() + chrome_package_repetitions);
 }
 
-// Verifies the InkDrop state when creating a new bubble.
+// Verifies that the first item is activated by default when creating a new
+// bubble.
 TEST_F(IntentPickerBubbleViewTest, VerifyStartingInkDrop) {
   CreateBubbleView(/*use_icons=*/true, /*show_stay_in_chrome=*/true,
                    BubbleType::kLinkCapturing,
                    /*initiating_origin=*/absl::nullopt);
   size_t size = bubble_->GetScrollViewSize();
-  for (size_t i = 0; i < size; ++i) {
+  EXPECT_EQ(bubble_->GetInkDropStateForTesting(0),
+            views::InkDropState::ACTIVATED);
+  for (size_t i = 1; i < size; ++i) {
     EXPECT_EQ(bubble_->GetInkDropStateForTesting(i),
               views::InkDropState::HIDDEN);
   }
@@ -227,20 +230,19 @@
   }
 }
 
-// Arbitrary press the first button twice, check that the InkDropState remains
-// the same.
+// Arbitrary press a button twice, check that the InkDropState remains the same.
 TEST_F(IntentPickerBubbleViewTest, PressButtonTwice) {
   CreateBubbleView(/*use_icons=*/true, /*show_stay_in_chrome=*/true,
                    BubbleType::kLinkCapturing,
                    /*initiating_origin=*/absl::nullopt);
   const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
                              ui::EventTimeForNow(), 0, 0);
-  EXPECT_EQ(bubble_->GetInkDropStateForTesting(0), views::InkDropState::HIDDEN);
-  bubble_->PressButtonForTesting(0, event);
-  EXPECT_EQ(bubble_->GetInkDropStateForTesting(0),
+  EXPECT_EQ(bubble_->GetInkDropStateForTesting(1), views::InkDropState::HIDDEN);
+  bubble_->PressButtonForTesting(1, event);
+  EXPECT_EQ(bubble_->GetInkDropStateForTesting(1),
             views::InkDropState::ACTIVATED);
-  bubble_->PressButtonForTesting(0, event);
-  EXPECT_EQ(bubble_->GetInkDropStateForTesting(0),
+  bubble_->PressButtonForTesting(1, event);
+  EXPECT_EQ(bubble_->GetInkDropStateForTesting(1),
             views::InkDropState::ACTIVATED);
 }
 
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
index 2fb0e29..061c41807 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
@@ -68,7 +68,7 @@
 
   void SetUpOnMainThread() override {
     ASSERT_TRUE(embedded_test_server()->Start());
-    fake_concierge_client_ = chromeos::FakeConciergeClient::Get();
+    fake_concierge_client_ = ash::FakeConciergeClient::Get();
     fake_concierge_client_->set_disk_image_progress_signal_connected(true);
     fake_vm_plugin_dispatcher_client_ =
         static_cast<chromeos::FakeVmPluginDispatcherClient*>(
@@ -154,7 +154,7 @@
       network_connection_tracker_;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
   PluginVmInstallerView* view_;
-  chromeos::FakeConciergeClient* fake_concierge_client_;
+  ash::FakeConciergeClient* fake_concierge_client_;
   chromeos::FakeVmPluginDispatcherClient* fake_vm_plugin_dispatcher_client_;
 
  private:
diff --git a/chrome/browser/ui/views/profiles/OWNERS b/chrome/browser/ui/views/profiles/OWNERS
index dd65bd2dd..e35c884 100644
--- a/chrome/browser/ui/views/profiles/OWNERS
+++ b/chrome/browser/ui/views/profiles/OWNERS
@@ -1,3 +1,2 @@
 droger@chromium.org
-jkrcal@chromium.org
 rhalavati@chromium.org
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
index f91a729..919d2ea 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -15,9 +15,13 @@
 #include "ui/accessibility/ax_node.h"
 #include "ui/accessibility/ax_role_properties.h"
 #include "ui/accessibility/ax_tree.h"
+#include "url/gurl.h"
 
 namespace {
 
+using ax::mojom::IntAttribute;
+using ax::mojom::Role;
+using ax::mojom::StringAttribute;
 using read_anything::mojom::ContentNode;
 using read_anything::mojom::ContentNodePtr;
 using read_anything::mojom::ContentType;
@@ -30,17 +34,27 @@
   if (ui::IsHeading(ax_node->GetRole())) {
     content_node->type = ContentType::kHeading;
     content_node->heading_level =
-        ax_node->GetIntAttribute(ax::mojom::IntAttribute::kHierarchicalLevel);
-  } else if (ax_node->GetRole() == ax::mojom::Role::kParagraph) {
+        ax_node->GetIntAttribute(IntAttribute::kHierarchicalLevel);
+  } else if (ui::IsLink(ax_node->GetRole())) {
+    content_node->type = ContentType::kLink;
+    content_node->url =
+        GURL(ax_node->GetStringAttribute(StringAttribute::kUrl));
+  } else if (ax_node->GetRole() == Role::kParagraph) {
     content_node->type = ContentType::kParagraph;
+  } else if (ax_node->GetRole() == Role::kStaticText) {
+    content_node->type = ContentType::kStaticText;
+    content_node->text = ax_node->GetTextContentUTF8();
   } else {
     return nullptr;
   }
 
-  // Set ContentNode.text. If ax_node doesn't contain any text, return nullptr.
-  if (!ax_node->GetTextContentLengthUTF8())
-    return nullptr;
-  content_node->text = ax_node->GetTextContentUTF8();
+  // Set ContentNode.children.
+  for (auto it = ax_node->UnignoredChildrenBegin();
+       it != ax_node->UnignoredChildrenEnd(); ++it) {
+    ContentNodePtr child_content_node = GetFromAXNode(it.get());
+    if (child_content_node)
+      content_node->children.push_back(std::move(child_content_node));
+  }
 
   return content_node;
 }
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 3a76247..fe640ad 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -987,8 +987,8 @@
     return &NewWebUI<chromeos::LauncherInternalsUI>;
   if (url.host_piece() == ash::kChromeUIHelpAppHost)
     return &NewComponentUI<ash::HelpAppUI, ash::ChromeHelpAppUIDelegate>;
-  if (url.host_piece() == chrome::kChromeUIHpsInternalsHost)
-    return &NewWebUI<chromeos::HpsInternalsUI>;
+  if (url.host_piece() == chrome::kChromeUIHumanPresenceInternalsHost)
+    return &NewWebUI<chromeos::HumanPresenceInternalsUI>;
   if (url.host_piece() == chrome::kChromeUIMobileSetupHost)
     return &NewWebUI<chromeos::cellular_setup::MobileSetupUI>;
   if (url.host_piece() == chrome::kChromeUIMultiDeviceInternalsHost)
diff --git a/chrome/browser/ui/webui/chromeos/emoji/DIR_METADATA b/chrome/browser/ui/webui/chromeos/emoji/DIR_METADATA
index ca0e79f..caac77f 100644
--- a/chrome/browser/ui/webui/chromeos/emoji/DIR_METADATA
+++ b/chrome/browser/ui/webui/chromeos/emoji/DIR_METADATA
@@ -1,3 +1 @@
-monorail: {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc b/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc
index 3ca3d2f..725b827d 100644
--- a/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.cc
@@ -26,23 +26,25 @@
 namespace {
 
 // Class acting as a controller of the chrome://hps-internals WebUI.
-class HpsInternalsUIMessageHandler : public content::WebUIMessageHandler,
-                                     public chromeos::HpsDBusClient::Observer {
+class HumanPresenceInternalsUIMessageHandler
+    : public content::WebUIMessageHandler,
+      public chromeos::HumanPresenceDBusClient::Observer {
  public:
-  HpsInternalsUIMessageHandler();
+  HumanPresenceInternalsUIMessageHandler();
 
-  HpsInternalsUIMessageHandler(const HpsInternalsUIMessageHandler&) = delete;
-  HpsInternalsUIMessageHandler& operator=(const HpsInternalsUIMessageHandler&) =
-      delete;
+  HumanPresenceInternalsUIMessageHandler(
+      const HumanPresenceInternalsUIMessageHandler&) = delete;
+  HumanPresenceInternalsUIMessageHandler& operator=(
+      const HumanPresenceInternalsUIMessageHandler&) = delete;
 
-  ~HpsInternalsUIMessageHandler() override;
+  ~HumanPresenceInternalsUIMessageHandler() override;
 
   // WebUIMessageHandler implementation.
   void RegisterMessages() override;
   void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
-  // chromeos::HpsDBusClient::Observer implementation.
+  // chromeos::HumanPresenceDBusClient::Observer implementation.
   void OnHpsSenseChanged(hps::HpsResult state) override;
   void OnHpsNotifyChanged(hps::HpsResult state) override;
   void OnRestart() override;
@@ -50,38 +52,43 @@
 
  private:
   void Connect(const base::Value::List& args);
-  void EnableSense(const base::Value::List& args);
-  void DisableSense(const base::Value::List& args);
-  void QuerySense(const base::Value::List& args);
-  void EnableNotify(const base::Value::List& args);
-  void DisableNotify(const base::Value::List& args);
-  void QueryNotify(const base::Value::List& args);
+  void EnableLockOnLeave(const base::Value::List& args);
+  void DisableLockOnLeave(const base::Value::List& args);
+  void QueryLockOnLeave(const base::Value::List& args);
+  void EnableSnoopingProtection(const base::Value::List& args);
+  void DisableSnoopingProtection(const base::Value::List& args);
+  void QuerySnoopingProtection(const base::Value::List& args);
 
   void OnConnected(bool connected);
-  void OnHpsSenseResult(absl::optional<hps::HpsResult>);
-  void OnHpsNotifyResult(absl::optional<hps::HpsResult>);
+  void OnLockOnLeaveResult(absl::optional<hps::HpsResult>);
+  void OnSnoopingProtectionResult(absl::optional<hps::HpsResult>);
 
-  base::ScopedObservation<chromeos::HpsDBusClient,
-                          chromeos::HpsDBusClient::Observer>
-      hps_observation_{this};
-  base::WeakPtrFactory<HpsInternalsUIMessageHandler> msg_weak_ptr_factory_{
-      this};
-  base::WeakPtrFactory<HpsInternalsUIMessageHandler> weak_ptr_factory_{this};
+  base::ScopedObservation<chromeos::HumanPresenceDBusClient,
+                          chromeos::HumanPresenceDBusClient::Observer>
+      human_presence_observation_{this};
+  base::WeakPtrFactory<HumanPresenceInternalsUIMessageHandler>
+      msg_weak_ptr_factory_{this};
+  base::WeakPtrFactory<HumanPresenceInternalsUIMessageHandler>
+      weak_ptr_factory_{this};
 };
 
-HpsInternalsUIMessageHandler::HpsInternalsUIMessageHandler() = default;
+HumanPresenceInternalsUIMessageHandler::
+    HumanPresenceInternalsUIMessageHandler() = default;
 
-HpsInternalsUIMessageHandler::~HpsInternalsUIMessageHandler() = default;
+HumanPresenceInternalsUIMessageHandler::
+    ~HumanPresenceInternalsUIMessageHandler() = default;
 
-void HpsInternalsUIMessageHandler::OnHpsSenseChanged(hps::HpsResult state) {
-  OnHpsSenseResult(state);
+void HumanPresenceInternalsUIMessageHandler::OnHpsSenseChanged(
+    hps::HpsResult state) {
+  OnLockOnLeaveResult(state);
 }
 
-void HpsInternalsUIMessageHandler::OnHpsNotifyChanged(hps::HpsResult state) {
-  OnHpsNotifyResult(state);
+void HumanPresenceInternalsUIMessageHandler::OnHpsNotifyChanged(
+    hps::HpsResult state) {
+  OnSnoopingProtectionResult(state);
 }
 
-void HpsInternalsUIMessageHandler::OnHpsSenseResult(
+void HumanPresenceInternalsUIMessageHandler::OnLockOnLeaveResult(
     absl::optional<hps::HpsResult> state) {
   base::DictionaryValue value;
   if (state.has_value()) {
@@ -89,10 +96,10 @@
   } else {
     value.SetBoolean("disabled", true);
   }
-  FireWebUIListener(hps::kHpsInternalsSenseChangedEvent, value);
+  FireWebUIListener(hps::kHumanPresenceInternalsLockOnLeaveChangedEvent, value);
 }
 
-void HpsInternalsUIMessageHandler::OnHpsNotifyResult(
+void HumanPresenceInternalsUIMessageHandler::OnSnoopingProtectionResult(
     absl::optional<hps::HpsResult> state) {
   base::DictionaryValue value;
   if (state.has_value()) {
@@ -100,147 +107,165 @@
   } else {
     value.SetBoolean("disabled", true);
   }
-  FireWebUIListener(hps::kHpsInternalsNotifyChangedEvent, value);
+  FireWebUIListener(hps::kHumanPresenceInternalsSnoopingProtectionChangedEvent,
+                    value);
 }
 
-void HpsInternalsUIMessageHandler::OnRestart() {
+void HumanPresenceInternalsUIMessageHandler::OnRestart() {
   OnConnected(true);
 }
 
-void HpsInternalsUIMessageHandler::OnShutdown() {
+void HumanPresenceInternalsUIMessageHandler::OnShutdown() {
   OnConnected(false);
 }
 
-void HpsInternalsUIMessageHandler::Connect(const base::Value::List& args) {
-  if (!chromeos::HpsDBusClient::Get()) {
+void HumanPresenceInternalsUIMessageHandler::Connect(
+    const base::Value::List& args) {
+  if (!chromeos::HumanPresenceDBusClient::Get()) {
     LOG(ERROR) << "HPS dbus client not available";
     return;
   }
   AllowJavascript();
-  chromeos::HpsDBusClient::Get()->WaitForServiceToBeAvailable(
-      base::BindOnce(&HpsInternalsUIMessageHandler::OnConnected,
+  chromeos::HumanPresenceDBusClient::Get()->WaitForServiceToBeAvailable(
+      base::BindOnce(&HumanPresenceInternalsUIMessageHandler::OnConnected,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void HpsInternalsUIMessageHandler::OnConnected(bool connected) {
+void HumanPresenceInternalsUIMessageHandler::OnConnected(bool connected) {
   base::DictionaryValue value;
   value.SetBoolean("connected", connected);
-  FireWebUIListener(hps::kHpsInternalsConnectedEvent, value);
+  FireWebUIListener(hps::kHumanPresenceInternalsConnectedEvent, value);
 }
 
-void HpsInternalsUIMessageHandler::EnableSense(const base::Value::List& args) {
-  if (!chromeos::HpsDBusClient::Get() ||
-      !hps::GetEnableHpsSenseConfig().has_value()) {
-    FireWebUIListener(hps::kHpsInternalsEnableErrorEvent);
-    return;
-  }
-  hps::FeatureConfig config(*hps::GetEnableHpsSenseConfig());
-  chromeos::HpsDBusClient::Get()->EnableHpsSense(config);
-}
-
-void HpsInternalsUIMessageHandler::DisableSense(const base::Value::List& args) {
-  if (chromeos::HpsDBusClient::Get())
-    chromeos::HpsDBusClient::Get()->DisableHpsSense();
-}
-
-void HpsInternalsUIMessageHandler::QuerySense(const base::Value::List& args) {
-  if (!chromeos::HpsDBusClient::Get())
-    return;
-  chromeos::HpsDBusClient::Get()->GetResultHpsSense(
-      base::BindOnce(&HpsInternalsUIMessageHandler::OnHpsSenseResult,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-void HpsInternalsUIMessageHandler::EnableNotify(const base::Value::List& args) {
-  if (!chromeos::HpsDBusClient::Get() ||
-      !hps::GetEnableHpsNotifyConfig().has_value()) {
-    FireWebUIListener(hps::kHpsInternalsEnableErrorEvent);
-    return;
-  }
-  hps::FeatureConfig config(*hps::GetEnableHpsNotifyConfig());
-  chromeos::HpsDBusClient::Get()->EnableHpsNotify(config);
-}
-
-void HpsInternalsUIMessageHandler::DisableNotify(
+void HumanPresenceInternalsUIMessageHandler::EnableLockOnLeave(
     const base::Value::List& args) {
-  if (chromeos::HpsDBusClient::Get())
-    chromeos::HpsDBusClient::Get()->DisableHpsNotify();
-}
-
-void HpsInternalsUIMessageHandler::QueryNotify(const base::Value::List& args) {
-  if (!chromeos::HpsDBusClient::Get())
+  if (!chromeos::HumanPresenceDBusClient::Get() ||
+      !hps::GetEnableLockOnLeaveConfig().has_value()) {
+    FireWebUIListener(hps::kHumanPresenceInternalsEnableErrorEvent);
     return;
-  chromeos::HpsDBusClient::Get()->GetResultHpsNotify(
-      base::BindOnce(&HpsInternalsUIMessageHandler::OnHpsNotifyResult,
-                     weak_ptr_factory_.GetWeakPtr()));
+  }
+  hps::FeatureConfig config(*hps::GetEnableLockOnLeaveConfig());
+  chromeos::HumanPresenceDBusClient::Get()->EnableHpsSense(config);
 }
 
-void HpsInternalsUIMessageHandler::RegisterMessages() {
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsConnectCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::Connect,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsEnableSenseCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::EnableSense,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsDisableSenseCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::DisableSense,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsQuerySenseCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::QuerySense,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsEnableNotifyCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::EnableNotify,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsDisableNotifyCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::DisableNotify,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
-  web_ui()->RegisterMessageCallback(
-      hps::kHpsInternalsQueryNotifyCmd,
-      base::BindRepeating(&HpsInternalsUIMessageHandler::QueryNotify,
-                          msg_weak_ptr_factory_.GetWeakPtr()));
+void HumanPresenceInternalsUIMessageHandler::DisableLockOnLeave(
+    const base::Value::List& args) {
+  if (chromeos::HumanPresenceDBusClient::Get())
+    chromeos::HumanPresenceDBusClient::Get()->DisableHpsSense();
 }
 
-void HpsInternalsUIMessageHandler::OnJavascriptAllowed() {
-  if (chromeos::HpsDBusClient::Get())
-    hps_observation_.Observe(chromeos::HpsDBusClient::Get());
+void HumanPresenceInternalsUIMessageHandler::QueryLockOnLeave(
+    const base::Value::List& args) {
+  if (!chromeos::HumanPresenceDBusClient::Get())
+    return;
+  chromeos::HumanPresenceDBusClient::Get()->GetResultHpsSense(base::BindOnce(
+      &HumanPresenceInternalsUIMessageHandler::OnLockOnLeaveResult,
+      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void HpsInternalsUIMessageHandler::OnJavascriptDisallowed() {
+void HumanPresenceInternalsUIMessageHandler::EnableSnoopingProtection(
+    const base::Value::List& args) {
+  if (!chromeos::HumanPresenceDBusClient::Get() ||
+      !hps::GetEnableSnoopingProtectionConfig().has_value()) {
+    FireWebUIListener(hps::kHumanPresenceInternalsEnableErrorEvent);
+    return;
+  }
+  hps::FeatureConfig config(*hps::GetEnableSnoopingProtectionConfig());
+  chromeos::HumanPresenceDBusClient::Get()->EnableHpsNotify(config);
+}
+
+void HumanPresenceInternalsUIMessageHandler::DisableSnoopingProtection(
+    const base::Value::List& args) {
+  if (chromeos::HumanPresenceDBusClient::Get())
+    chromeos::HumanPresenceDBusClient::Get()->DisableHpsNotify();
+}
+
+void HumanPresenceInternalsUIMessageHandler::QuerySnoopingProtection(
+    const base::Value::List& args) {
+  if (!chromeos::HumanPresenceDBusClient::Get())
+    return;
+  chromeos::HumanPresenceDBusClient::Get()->GetResultHpsNotify(base::BindOnce(
+      &HumanPresenceInternalsUIMessageHandler::OnSnoopingProtectionResult,
+      weak_ptr_factory_.GetWeakPtr()));
+}
+
+void HumanPresenceInternalsUIMessageHandler::RegisterMessages() {
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsConnectCmd,
+      base::BindRepeating(&HumanPresenceInternalsUIMessageHandler::Connect,
+                          msg_weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsEnableLockOnLeaveCmd,
+      base::BindRepeating(
+          &HumanPresenceInternalsUIMessageHandler::EnableLockOnLeave,
+          msg_weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsDisableLockOnLeaveCmd,
+      base::BindRepeating(
+          &HumanPresenceInternalsUIMessageHandler::DisableLockOnLeave,
+          msg_weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsQueryLockOnLeaveCmd,
+      base::BindRepeating(
+          &HumanPresenceInternalsUIMessageHandler::QueryLockOnLeave,
+          msg_weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsEnableSnoopingProtectionCmd,
+      base::BindRepeating(
+          &HumanPresenceInternalsUIMessageHandler::EnableSnoopingProtection,
+          msg_weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsDisableSnoopingProtectionCmd,
+      base::BindRepeating(
+          &HumanPresenceInternalsUIMessageHandler::DisableSnoopingProtection,
+          msg_weak_ptr_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      hps::kHumanPresenceInternalsQuerySnoopingProtectionCmd,
+      base::BindRepeating(
+          &HumanPresenceInternalsUIMessageHandler::QuerySnoopingProtection,
+          msg_weak_ptr_factory_.GetWeakPtr()));
+}
+
+void HumanPresenceInternalsUIMessageHandler::OnJavascriptAllowed() {
+  if (chromeos::HumanPresenceDBusClient::Get())
+    human_presence_observation_.Observe(
+        chromeos::HumanPresenceDBusClient::Get());
+}
+
+void HumanPresenceInternalsUIMessageHandler::OnJavascriptDisallowed() {
   // Invalidate weak ptrs in order to cancel any pending callbacks.
   weak_ptr_factory_.InvalidateWeakPtrs();
-  hps_observation_.Reset();
+  human_presence_observation_.Reset();
 }
 
 }  // namespace
 
 namespace chromeos {
 
-HpsInternalsUI::HpsInternalsUI(content::WebUI* web_ui)
+HumanPresenceInternalsUI::HumanPresenceInternalsUI(content::WebUI* web_ui)
     : content::WebUIController(web_ui) {
   // Set up the chrome://gcm-internals source.
-  content::WebUIDataSource* html_source =
-      content::WebUIDataSource::Create(chrome::kChromeUIHpsInternalsHost);
+  content::WebUIDataSource* html_source = content::WebUIDataSource::Create(
+      chrome::kChromeUIHumanPresenceInternalsHost);
 
   html_source->UseStringsJs();
 
   // Add required resources.
-  html_source->AddResourcePath(hps::kHpsInternalsCSS, IDR_HPS_INTERNALS_CSS);
-  html_source->AddResourcePath(hps::kHpsInternalsJS, IDR_HPS_INTERNALS_JS);
-  html_source->AddResourcePath(hps::kHpsInternalsIcon, IDR_HPS_INTERNALS_ICON);
-  html_source->SetDefaultResource(IDR_HPS_INTERNALS_HTML);
+  html_source->AddResourcePath(hps::kHumanPresenceInternalsCSS,
+                               IDR_HUMAN_PRESENCE_INTERNALS_CSS);
+  html_source->AddResourcePath(hps::kHumanPresenceInternalsJS,
+                               IDR_HUMAN_PRESENCE_INTERNALS_JS);
+  html_source->AddResourcePath(hps::kHumanPresenceInternalsIcon,
+                               IDR_HUMAN_PRESENCE_INTERNALS_ICON);
+  html_source->SetDefaultResource(IDR_HUMAN_PRESENCE_INTERNALS_HTML);
 
   Profile* profile = Profile::FromWebUI(web_ui);
   content::WebUIDataSource::Add(profile, html_source);
 
-  web_ui->AddMessageHandler(std::make_unique<HpsInternalsUIMessageHandler>());
+  web_ui->AddMessageHandler(
+      std::make_unique<HumanPresenceInternalsUIMessageHandler>());
 }
 
-HpsInternalsUI::~HpsInternalsUI() = default;
+HumanPresenceInternalsUI::~HumanPresenceInternalsUI() = default;
 
 }  //  namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.h b/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.h
index 9fc7901..13846c1 100644
--- a/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.h
+++ b/chrome/browser/ui/webui/chromeos/human_presence_internals_ui.h
@@ -10,14 +10,14 @@
 namespace chromeos {
 
 // The WebUI for chrome://hps-internals.
-class HpsInternalsUI : public content::WebUIController {
+class HumanPresenceInternalsUI : public content::WebUIController {
  public:
-  explicit HpsInternalsUI(content::WebUI* web_ui);
+  explicit HumanPresenceInternalsUI(content::WebUI* web_ui);
 
-  HpsInternalsUI(const HpsInternalsUI&) = delete;
-  HpsInternalsUI& operator=(const HpsInternalsUI&) = delete;
+  HumanPresenceInternalsUI(const HumanPresenceInternalsUI&) = delete;
+  HumanPresenceInternalsUI& operator=(const HumanPresenceInternalsUI&) = delete;
 
-  ~HpsInternalsUI() override;
+  ~HumanPresenceInternalsUI() override;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
index 8f9a1ec..f97dad3a 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.cc
@@ -4,46 +4,27 @@
 
 #include "chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h"
 
-#include "chrome/browser/ash/login/oobe_screen.h"
-#include "chrome/browser/ash/login/screens/demo_preferences_screen.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/login/localized_values_builder.h"
 
 namespace chromeos {
 
-constexpr StaticOobeScreenId DemoPreferencesScreenView::kScreenId;
-
 DemoPreferencesScreenView::~DemoPreferencesScreenView() = default;
 
 DemoPreferencesScreenHandler::DemoPreferencesScreenHandler()
-    : BaseScreenHandler(kScreenId) {
-  set_user_acted_method_path_deprecated(
-      "login.DemoPreferencesScreen.userActed");
-}
+    : BaseScreenHandler(kScreenId) {}
 
-DemoPreferencesScreenHandler::~DemoPreferencesScreenHandler() {
-  if (screen_)
-    screen_->OnViewDestroyed(this);
-}
+DemoPreferencesScreenHandler::~DemoPreferencesScreenHandler() = default;
 
 void DemoPreferencesScreenHandler::Show() {
   ShowInWebUI();
 }
 
-void DemoPreferencesScreenHandler::Hide() {}
-
-void DemoPreferencesScreenHandler::Bind(DemoPreferencesScreen* screen) {
-  screen_ = screen;
-  BaseScreenHandler::SetBaseScreenDeprecated(screen);
-}
-
 void DemoPreferencesScreenHandler::SetInputMethodId(
     const std::string& input_method) {
   CallJS("login.DemoPreferencesScreen.setSelectedKeyboard", input_method);
 }
 
-void DemoPreferencesScreenHandler::InitializeDeprecated() {}
-
 void DemoPreferencesScreenHandler::DeclareLocalizedValues(
     ::login::LocalizedValuesBuilder* builder) {
   builder->Add("demoPreferencesScreenTitle",
@@ -54,16 +35,4 @@
   builder->Add("countryDropdownLabel", IDS_COUNTRY_DROPDOWN_LABEL);
 }
 
-void DemoPreferencesScreenHandler::RegisterMessages() {
-  BaseScreenHandler::RegisterMessages();
-  AddCallback("DemoPreferencesScreen.setDemoModeCountry",
-              &DemoPreferencesScreenHandler::HandleSetDemoModeCountry);
-}
-
-void DemoPreferencesScreenHandler::HandleSetDemoModeCountry(
-    const std::string& country_id) {
-  if (screen_)
-    screen_->SetDemoModeCountry(country_id);
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
index fefb798..81e4901 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/demo_preferences_screen_handler.h
@@ -7,30 +7,23 @@
 
 #include <string>
 
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
 
-namespace ash {
-class DemoPreferencesScreen;
-}
-
 namespace chromeos {
 
 // Interface of the demo mode preferences screen view.
-class DemoPreferencesScreenView {
+class DemoPreferencesScreenView
+    : public base::SupportsWeakPtr<DemoPreferencesScreenView> {
  public:
-  constexpr static StaticOobeScreenId kScreenId{"demo-preferences"};
+  inline constexpr static StaticOobeScreenId kScreenId{"demo-preferences",
+                                                       "DemoPreferencesScreen"};
 
   virtual ~DemoPreferencesScreenView();
 
   // Shows the contents of the screen.
   virtual void Show() = 0;
 
-  // Hides the contents of the screen.
-  virtual void Hide() = 0;
-
-  // Sets view and screen.
-  virtual void Bind(ash::DemoPreferencesScreen* screen) = 0;
-
   // Called to set the input method id on JS side.
   virtual void SetInputMethodId(const std::string& input_method) = 0;
 };
@@ -51,22 +44,11 @@
 
   // DemoPreferencesScreenView:
   void Show() override;
-  void Hide() override;
-  void Bind(ash::DemoPreferencesScreen* screen) override;
   void SetInputMethodId(const std::string& input_method) override;
 
   // BaseScreenHandler:
-  void InitializeDeprecated() override;
   void DeclareLocalizedValues(
       ::login::LocalizedValuesBuilder* builder) override;
-
-  // content::WebUIMessageHandler:
-  void RegisterMessages() override;
-
- private:
-  void HandleSetDemoModeCountry(const std::string& country_id);
-
-  ash::DemoPreferencesScreen* screen_ = nullptr;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
index e0833433..7be941e 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
@@ -10,60 +10,44 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/ash/login/oobe_screen.h"
-#include "chrome/browser/ash/login/screens/demo_setup_screen.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/login/localized_values_builder.h"
 
 namespace chromeos {
 
-constexpr StaticOobeScreenId DemoSetupScreenView::kScreenId;
-
 DemoSetupScreenView::~DemoSetupScreenView() = default;
 
 DemoSetupScreenHandler::DemoSetupScreenHandler()
-    : BaseScreenHandler(kScreenId) {
-  set_user_acted_method_path_deprecated("login.DemoSetupScreen.userActed");
-}
+    : BaseScreenHandler(kScreenId) {}
 
-DemoSetupScreenHandler::~DemoSetupScreenHandler() {
-  if (screen_)
-    screen_->OnViewDestroyed(this);
-}
+DemoSetupScreenHandler::~DemoSetupScreenHandler() = default;
 
 void DemoSetupScreenHandler::Show() {
   ShowInWebUI();
 }
 
-void DemoSetupScreenHandler::Hide() {}
-
-void DemoSetupScreenHandler::Bind(DemoSetupScreen* screen) {
-  screen_ = screen;
-  BaseScreenHandler::SetBaseScreenDeprecated(screen);
-}
-
 void DemoSetupScreenHandler::OnSetupFailed(
     const DemoSetupController::DemoSetupError& error) {
   // TODO(wzang): Consider customization for RecoveryMethod::kReboot as well.
-  CallJS("login.DemoSetupScreen.onSetupFailed",
-         base::JoinString({error.GetLocalizedErrorMessage(),
-                           error.GetLocalizedRecoveryMessage()},
-                          u" "),
-         error.recovery_method() ==
-             DemoSetupController::DemoSetupError::RecoveryMethod::kPowerwash);
+  CallExternalAPI(
+      "onSetupFailed",
+      base::JoinString({error.GetLocalizedErrorMessage(),
+                        error.GetLocalizedRecoveryMessage()},
+                       u" "),
+      error.recovery_method() ==
+          DemoSetupController::DemoSetupError::RecoveryMethod::kPowerwash);
 }
 
 void DemoSetupScreenHandler::SetCurrentSetupStep(
     DemoSetupController::DemoSetupStep current_step) {
-  CallJS("login.DemoSetupScreen.setCurrentSetupStep",
-         DemoSetupController::GetDemoSetupStepString(current_step));
+  CallExternalAPI("setCurrentSetupStep",
+                  DemoSetupController::GetDemoSetupStepString(current_step));
 }
 
 void DemoSetupScreenHandler::OnSetupSucceeded() {
-  CallJS("login.DemoSetupScreen.onSetupSucceeded");
+  CallExternalAPI("onSetupSucceeded");
 }
 
-void DemoSetupScreenHandler::InitializeDeprecated() {}
-
 void DemoSetupScreenHandler::DeclareLocalizedValues(
     ::login::LocalizedValuesBuilder* builder) {
   builder->Add("demoSetupProgressScreenTitle",
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
index 9595d2f..915e8a2 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
@@ -5,32 +5,24 @@
 #ifndef CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEMO_SETUP_SCREEN_HANDLER_H_
 #define CHROME_BROWSER_UI_WEBUI_CHROMEOS_LOGIN_DEMO_SETUP_SCREEN_HANDLER_H_
 
+#include "base/memory/weak_ptr.h"
 #include "base/values.h"
 #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/ui/webui/chromeos/login/base_screen_handler.h"
 
-namespace ash {
-class DemoSetupScreen;
-}
-
 namespace chromeos {
 
 // Interface of the demo mode setup screen view.
-class DemoSetupScreenView {
+class DemoSetupScreenView : public base::SupportsWeakPtr<DemoSetupScreenView> {
  public:
-  constexpr static StaticOobeScreenId kScreenId{"demo-setup"};
+  inline constexpr static StaticOobeScreenId kScreenId{"demo-setup",
+                                                       "DemoSetupScreen"};
 
   virtual ~DemoSetupScreenView();
 
   // Shows the contents of the screen.
   virtual void Show() = 0;
 
-  // Hides the contents of the screen.
-  virtual void Hide() = 0;
-
-  // Sets view and screen.
-  virtual void Bind(ash::DemoSetupScreen* screen) = 0;
-
   // Updates current setup step.
   virtual void SetCurrentSetupStep(
       DemoSetupController::DemoSetupStep current_step) = 0;
@@ -59,23 +51,17 @@
 
   // DemoSetupScreenView:
   void Show() override;
-  void Hide() override;
-  void Bind(ash::DemoSetupScreen* screen) override;
   void SetCurrentSetupStep(
       DemoSetupController::DemoSetupStep current_step) override;
   void OnSetupFailed(const DemoSetupController::DemoSetupError& error) override;
   void OnSetupSucceeded() override;
 
   // BaseScreenHandler:
-  void InitializeDeprecated() override;
   void DeclareLocalizedValues(
       ::login::LocalizedValuesBuilder* builder) override;
 
   // BaseWebUIHandler:
   void GetAdditionalParameters(base::Value::Dict* parameters) override;
-
- private:
-  ash::DemoSetupScreen* screen_ = nullptr;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index d20871a..c80a0ae 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -189,8 +189,8 @@
     return;
   }
 
-  if (!cloud_devices::CloudDeviceDescription::IsValidTicket(
-          print_job->ticket)) {
+  cloud_devices::CloudDeviceDescription ticket;
+  if (!ticket.InitFromValue(print_job->ticket.Clone())) {
     WrapPrintCallback(std::move(callback),
                       base::Value(kInvalidTicketPrintError));
     return;
@@ -198,7 +198,7 @@
 
   print_job->content_type = kContentTypePWGRaster;
   ConvertToPWGRaster(
-      print_data, printer_description, page_size, std::move(print_job),
+      print_data, printer_description, ticket, page_size, std::move(print_job),
       base::BindOnce(&ExtensionPrinterHandler::DispatchPrintJob,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
@@ -241,18 +241,15 @@
 void ExtensionPrinterHandler::ConvertToPWGRaster(
     scoped_refptr<base::RefCountedMemory> data,
     const cloud_devices::CloudDeviceDescription& printer_description,
+    const cloud_devices::CloudDeviceDescription& print_ticket,
     const gfx::Size& page_size,
     std::unique_ptr<extensions::PrinterProviderPrintJob> job,
     PrintJobCallback callback) {
   if (!pwg_raster_converter_)
     pwg_raster_converter_ = PwgRasterConverter::CreateDefault();
 
-  cloud_devices::CloudDeviceDescription ticket;
-  bool ok = ticket.InitFromValue(std::move(job->ticket));
-  DCHECK(ok);
   PwgRasterSettings bitmap_settings =
-      PwgRasterConverter::GetBitmapSettings(printer_description, ticket);
-  job->ticket = std::move(ticket).ToValue();
+      PwgRasterConverter::GetBitmapSettings(printer_description, print_ticket);
 
   pwg_raster_converter_->Start(
       data.get(),
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.h b/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
index 872b454..10732415 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.h
@@ -67,12 +67,13 @@
   void SetPwgRasterConverterForTesting(
       std::unique_ptr<PwgRasterConverter> pwg_raster_converter);
 
-  // Converts |data| to PWG raster format (from PDF) for a printer described
-  // by |printer_description|.
-  // |callback| is called with the converted data.
+  // Converts `data` to PWG raster format (from PDF) for a printer described
+  // by `printer_description` and a given `print_ticket`.
+  // `callback` is called with the converted data.
   void ConvertToPWGRaster(
       scoped_refptr<base::RefCountedMemory> data,
       const cloud_devices::CloudDeviceDescription& printer_description,
+      const cloud_devices::CloudDeviceDescription& print_ticket,
       const gfx::Size& page_size,
       std::unique_ptr<extensions::PrinterProviderPrintJob> job,
       PrintJobCallback callback);
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
index b626739..bfddfc5 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler.cc
@@ -7,25 +7,6 @@
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
-#include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
-
-namespace {
-
-// Informs the TrustSafetySentimentService, if it exists for |profile|, that a
-// Privacy Sandbox 3 interaction for |area| has occurred.
-void InformSentimentService(Profile* profile,
-                            TrustSafetySentimentService::FeatureArea area) {
-  auto* sentiment_service =
-      TrustSafetySentimentServiceFactory::GetForProfile(profile);
-
-  if (!sentiment_service)
-    return;
-
-  sentiment_service->InteractedWithPrivacySandbox3(area);
-}
-
-}  // namespace
 
 PrivacySandboxDialogHandler::PrivacySandboxDialogHandler(
     base::OnceClosure close_callback,
@@ -92,49 +73,21 @@
     std::move(open_settings_callback_).Run();
   }
 
-  bool covered_action = true;
   switch (action) {
-    case PrivacySandboxService::DialogAction::kNoticeAcknowledge: {
-      InformSentimentService(
-          Profile::FromWebUI(web_ui()),
-          TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk);
-      break;
-    }
-    case PrivacySandboxService::DialogAction::kNoticeDismiss: {
-      InformSentimentService(Profile::FromWebUI(web_ui()),
-                             TrustSafetySentimentService::FeatureArea::
-                                 kPrivacySandbox3NoticeDismiss);
-      break;
-    }
-    case PrivacySandboxService::DialogAction::kNoticeOpenSettings: {
-      InformSentimentService(Profile::FromWebUI(web_ui()),
-                             TrustSafetySentimentService::FeatureArea::
-                                 kPrivacySandbox3NoticeSettings);
-      break;
-    }
-    case PrivacySandboxService::DialogAction::kConsentAccepted: {
-      InformSentimentService(Profile::FromWebUI(web_ui()),
-                             TrustSafetySentimentService::FeatureArea::
-                                 kPrivacySandbox3ConsentAccept);
-      break;
-    }
+    case PrivacySandboxService::DialogAction::kNoticeAcknowledge:
+    case PrivacySandboxService::DialogAction::kNoticeDismiss:
+    case PrivacySandboxService::DialogAction::kNoticeOpenSettings:
+    case PrivacySandboxService::DialogAction::kConsentAccepted:
     case PrivacySandboxService::DialogAction::kConsentDeclined: {
-      InformSentimentService(Profile::FromWebUI(web_ui()),
-                             TrustSafetySentimentService::FeatureArea::
-                                 kPrivacySandbox3ConsentDecline);
+      did_user_make_decision_ = true;
+      DCHECK(close_callback_);
+      std::move(close_callback_).Run();
       break;
     }
     default:
-      covered_action = false;
       break;
   }
 
-  if (covered_action) {
-    did_user_make_decision_ = true;
-    DCHECK(close_callback_);
-    std::move(close_callback_).Run();
-  }
-
   NotifyServiceAboutDialogAction(action);
 }
 
diff --git a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
index 099d2ab..ad1b5d0 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
+++ b/chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_handler_unittest.cc
@@ -6,9 +6,6 @@
 
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h"
-#include "chrome/browser/ui/hats/mock_trust_safety_sentiment_service.h"
-#include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
-#include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_renderer_host.h"
@@ -55,11 +52,6 @@
     mock_privacy_sandbox_service_ = static_cast<MockPrivacySandboxService*>(
         PrivacySandboxServiceFactory::GetInstance()->SetTestingFactoryAndUse(
             profile(), base::BindRepeating(&BuildMockPrivacySandboxService)));
-    mock_sentiment_service_ = static_cast<MockTrustSafetySentimentService*>(
-        TrustSafetySentimentServiceFactory::GetInstance()
-            ->SetTestingFactoryAndUse(
-                profile(),
-                base::BindRepeating(&BuildMockTrustSafetySentimentService)));
 
     web_ui_ = std::make_unique<content::TestWebUI>();
     web_ui_->set_web_contents(web_contents_.get());
@@ -87,7 +79,6 @@
 
  protected:
   virtual std::unique_ptr<PrivacySandboxDialogHandler> CreateHandler() = 0;
-  raw_ptr<MockTrustSafetySentimentService> mock_sentiment_service_;
 
  private:
   content::BrowserTaskEnvironment browser_task_environment_;
@@ -191,12 +182,6 @@
           PrivacySandboxService::DialogAction::kConsentClosedNoDecision))
       .Times(0);
 
-  EXPECT_CALL(
-      *mock_sentiment_service_,
-      InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
-                                        kPrivacySandbox3ConsentAccept))
-      .Times(1);
-
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(PrivacySandboxService::DialogAction::kConsentAccepted));
@@ -216,12 +201,6 @@
           PrivacySandboxService::DialogAction::kConsentClosedNoDecision))
       .Times(0);
 
-  EXPECT_CALL(
-      *mock_sentiment_service_,
-      InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
-                                        kPrivacySandbox3ConsentDecline))
-      .Times(1);
-
   base::Value args(base::Value::Type::LIST);
   args.Append(
       static_cast<int>(PrivacySandboxService::DialogAction::kConsentDeclined));
@@ -294,12 +273,6 @@
           PrivacySandboxService::DialogAction::kNoticeClosedNoInteraction))
       .Times(0);
 
-  EXPECT_CALL(
-      *mock_sentiment_service_,
-      InteractedWithPrivacySandbox3(TrustSafetySentimentService::FeatureArea::
-                                        kPrivacySandbox3NoticeSettings))
-      .Times(1);
-
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       PrivacySandboxService::DialogAction::kNoticeOpenSettings));
@@ -319,12 +292,6 @@
           PrivacySandboxService::DialogAction::kNoticeClosedNoInteraction))
       .Times(0);
 
-  EXPECT_CALL(
-      *mock_sentiment_service_,
-      InteractedWithPrivacySandbox3(
-          TrustSafetySentimentService::FeatureArea::kPrivacySandbox3NoticeOk))
-      .Times(1);
-
   base::Value args(base::Value::Type::LIST);
   args.Append(static_cast<int>(
       PrivacySandboxService::DialogAction::kNoticeAcknowledge));
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
index 6c81d5c..09b52438 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
@@ -211,7 +211,7 @@
 
 TEST_F(CupsPrintersHandlerTest, RemoveCorrectPrinter) {
   DBusThreadManager::Initialize();
-  chromeos::ConciergeClient::InitializeFake(
+  ConciergeClient::InitializeFake(
       /*fake_cicerone_client=*/nullptr);
 
   DebugDaemonClient* client = DBusThreadManager::Get()->GetDebugDaemonClient();
@@ -240,7 +240,7 @@
   EXPECT_FALSE(expected);
 
   profile_.reset();
-  chromeos::ConciergeClient::Shutdown();
+  ConciergeClient::Shutdown();
   DBusThreadManager::Shutdown();
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
index 43500501..606cf86f 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
@@ -67,7 +67,7 @@
     chromeos::DBusThreadManager::Initialize();
 
     // Initialize fake DBus clients.
-    chromeos::ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
+    ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr);
     chromeos::SpacedClient::InitializeFake();
 
     // The storage handler requires an instance of DiskMountManager,
@@ -139,7 +139,7 @@
     ash::disks::DiskMountManager::Shutdown();
     storage::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
     chromeos::SpacedClient::Shutdown();
-    chromeos::ConciergeClient::Shutdown();
+    ConciergeClient::Shutdown();
     chromeos::DBusThreadManager::Shutdown();
   }
 
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/BUILD.gn b/chrome/browser/ui/webui/side_panel/read_anything/BUILD.gn
index 66c05e4..3b218d5 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/BUILD.gn
+++ b/chrome/browser/ui/webui/side_panel/read_anything/BUILD.gn
@@ -7,5 +7,8 @@
 mojom("mojo_bindings") {
   sources = [ "read_anything.mojom" ]
   webui_module_path = "/"
-  public_deps = [ "//mojo/public/mojom/base" ]
+  public_deps = [
+    "//mojo/public/mojom/base",
+    "//url/mojom:url_mojom_gurl",
+  ]
 }
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything.mojom b/chrome/browser/ui/webui/side_panel/read_anything/read_anything.mojom
index 1e634ef..5337d5f 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything.mojom
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything.mojom
@@ -5,6 +5,8 @@
 // A module for a prototype of the Read Anything feature.
 module read_anything.mojom;
 
+import "url/mojom/url.mojom";
+
 // Used by the WebUI page to bootstrap bidirectional communication.
 interface PageHandlerFactory {
   // The WebUI calls this method when the page is first initialized.
@@ -15,16 +17,22 @@
 // The type of content node.
 enum ContentType {
   kHeading,
+  kLink,
   kParagraph,
+  kStaticText,
 };
 
-// A node that contains distilled content. All nodes have type ContentType and
-// text. Some node types have additional values, which are verified in WebUI:
+// A node that contains distilled content. All nodes have type ContentType.
+// Some node types have additional values, which are verified in WebUI:
 //   ContentNode with type kHeading must have a heading_level.
+//   ContentNode with type kStaticText must have text.
+//   ContentNode with type kUrl must have a url.
 struct ContentNode {
-  ContentType type;
-  string text;
+  array<ContentNode> children;
   uint32 heading_level;
+  string text;
+  ContentType type;
+  url.mojom.Url url;
 };
 
 // Browser-side handler for requests from WebUI page.
diff --git a/chrome/browser/ui/webui/signin/OWNERS b/chrome/browser/ui/webui/signin/OWNERS
index 0e538f02..c6612a3 100644
--- a/chrome/browser/ui/webui/signin/OWNERS
+++ b/chrome/browser/ui/webui/signin/OWNERS
@@ -1,6 +1,5 @@
 file://components/signin/OWNERS
 
-jkrcal@chromium.org
 
 # For ChromeOS changes
 achuith@chromium.org
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index ac475b2..1e46377 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1651859849-3d56dd6f987fde5f2d7a8f7e3fa3a1139d25567f.profdata
+chrome-linux-main-1652075605-cf7e6eb10cd3fea947eefd6cb5ca0b0b96b04368.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 9dbea36d..f853284 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1651859849-35ac968ff6f8803602aced0852c666fd8b09b447.profdata
+chrome-mac-arm-main-1652075605-0606bd46eed825d05ddc29ea3dbc534cab196ec2.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 67581fd..9c711b4 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1651859849-32046e7ba5563527751d00bbe01b873e1bf9cfe9.profdata
+chrome-mac-main-1652075605-b41aaed47c9d4c3818c1bddfc2f4665fc49502d1.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 724bf5f9..ccd919df 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1651870513-e845b7e932108ebf271d088c825a6397e4853f98.profdata
+chrome-win32-main-1652086175-4beaf6402c200211a812e770b10a7cc213e06f89.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index aee15c0..1ea20a9 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1651870513-ab57afa3caf26487547bd1f62f81c2c7df8ad893.profdata
+chrome-win64-main-1652086175-0a9eeba03dc6445c78769593a32836b73fe34265.profdata
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 83882e8c0e..3500082d 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -293,8 +293,6 @@
       "extensions/chrome_manifest_handlers.h",
       "extensions/chrome_manifest_url_handlers.cc",
       "extensions/chrome_manifest_url_handlers.h",
-      "extensions/command.cc",
-      "extensions/command.h",
       "extensions/extension_constants.cc",
       "extensions/extension_constants.h",
       "extensions/extension_metrics.cc",
diff --git a/chrome/common/extensions/api/commands/commands_handler.cc b/chrome/common/extensions/api/commands/commands_handler.cc
index aeb247e..6283c42 100644
--- a/chrome/common/extensions/api/commands/commands_handler.cc
+++ b/chrome/common/extensions/api/commands/commands_handler.cc
@@ -11,7 +11,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "chrome/common/extensions/command.h"
+#include "extensions/common/command.h"
 #include "extensions/common/error_utils.h"
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/manifest_handlers/permissions_parser.h"
diff --git a/chrome/common/extensions/api/commands/commands_handler.h b/chrome/common/extensions/api/commands/commands_handler.h
index 96d2873..fcd64cda 100644
--- a/chrome/common/extensions/api/commands/commands_handler.h
+++ b/chrome/common/extensions/api/commands/commands_handler.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <string>
 
-#include "chrome/common/extensions/command.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 #include "extensions/common/manifest_handler.h"
diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl
index a3a717a..c6b832a 100644
--- a/chrome/common/extensions/api/file_manager_private.idl
+++ b/chrome/common/extensions/api/file_manager_private.idl
@@ -90,7 +90,9 @@
   error_unknown_filesystem,
   error_unsupported_filesystem,
   error_invalid_archive,
-  error_need_password
+  error_need_password,
+  error_in_progress,
+  error_cancelled
 };
 
 // Filesystem to format to.
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc
index d6f16ec..8d63f93 100644
--- a/chrome/common/extensions/extension_unittest.cc
+++ b/chrome/common/extensions/extension_unittest.cc
@@ -12,11 +12,11 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/common/chrome_paths.h"
-#include "chrome/common/extensions/command.h"
 #include "chrome/common/extensions/extension_test_util.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/crx_file/id_util.h"
+#include "extensions/common/command.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/extension_resource.h"
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index b6fbd83..a0e3012 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2956,8 +2956,6 @@
 #endif
 
 const char kBackgroundTracingLastUpload[] = "background_tracing.last_upload";
-const char kBackgroundTracingSessionState[] =
-    "background_tracing.session_state";
 
 const char kAllowDinosaurEasterEgg[] = "allow_dinosaur_easter_egg";
 
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 1fc9d10..62f08225f 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -994,7 +994,6 @@
 #endif
 
 extern const char kBackgroundTracingLastUpload[];
-extern const char kBackgroundTracingSessionState[];
 
 extern const char kAllowDinosaurEasterEgg[];
 
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index bbb880d..4cc333af 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -109,7 +109,7 @@
 const char kChromeUIHistoryHost[] = "history";
 const char kChromeUIHistorySyncedTabs[] = "/syncedTabs";
 const char kChromeUIHistoryURL[] = "chrome://history/";
-const char kChromeUIHpsInternalsHost[] = "hps-internals";
+const char kChromeUIHumanPresenceInternalsHost[] = "hps-internals";
 const char kChromeUIIdentityInternalsHost[] = "identity-internals";
 const char kChromeUIImageEditorHost[] = "image-editor";
 const char kChromeUIImageEditorURL[] = "chrome://image-editor/";
@@ -616,7 +616,7 @@
     kChromeUIHistoryHost,
     history_clusters_internals::kChromeUIHistoryClustersInternalsHost,
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    kChromeUIHpsInternalsHost,
+    kChromeUIHumanPresenceInternalsHost,
 #endif
     kChromeUIInterstitialHost,
     kChromeUIInvalidationsHost,
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 7172ff4..d05e82ad 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -107,7 +107,7 @@
 extern const char kChromeUIHistoryHost[];
 extern const char kChromeUIHistorySyncedTabs[];
 extern const char kChromeUIHistoryURL[];
-extern const char kChromeUIHpsInternalsHost[];
+extern const char kChromeUIHumanPresenceInternalsHost[];
 extern const char kChromeUIIdentityInternalsHost[];
 extern const char kChromeUIImageEditorHost[];
 extern const char kChromeUIImageEditorURL[];
diff --git a/chrome/installer/linux/rpm/additional_deps b/chrome/installer/linux/rpm/additional_deps
index 6b99719c..c59ba07 100644
--- a/chrome/installer/linux/rpm/additional_deps
+++ b/chrome/installer/linux/rpm/additional_deps
@@ -45,5 +45,5 @@
 # For OS integration.
 xdg-utils
 
-# For ANGLE with Wayland support
-libwayland-client
+# For ANGLE with Wayland support - Fedora and openSUSE use different package names
+libwayland-client.so.0()(64bit)
diff --git a/chrome/renderer/cart/commerce_hint_agent_browsertest.cc b/chrome/renderer/cart/commerce_hint_agent_browsertest.cc
index b8621de..eb27430b1 100644
--- a/chrome/renderer/cart/commerce_hint_agent_browsertest.cc
+++ b/chrome/renderer/cart/commerce_hint_agent_browsertest.cc
@@ -53,6 +53,7 @@
                                            const char* cart_url) {
   cart_db::ChromeCartContentProto proto;
   proto.set_key(domain);
+  proto.set_merchant(domain);
   proto.set_merchant_cart_url(cart_url);
   proto.set_timestamp(base::Time::Now().ToDoubleT());
   return proto;
@@ -309,6 +310,8 @@
         satisfied_ &= GURL(found[i].second.merchant_cart_url())
                           .ReplaceComponents(remove_port)
                           .spec() == expected[i].second.merchant_cart_url();
+        satisfied_ &=
+            found[i].second.merchant() == expected[i].second.merchant();
       }
     }
     std::move(closure).Run();
@@ -642,6 +645,33 @@
       CommerceHeuristicsDataMetricsHelper::HeuristicsSource::FROM_RESOURCE, 1);
 }
 
+IN_PROC_BROWSER_TEST_F(CommerceHintAgentTest, AddCartFromComponent) {
+  bool is_populated =
+      commerce_hint_service_->InitializeCommerceHeuristicsForTesting(
+          base::Version("0.0.0.1"), R"###(
+          {
+            "guitarcenter.com": {
+              "merchant_name" : "SPECIAL_NAME",
+              "cart_url" : "https://www.guitarcenter.com/special_cart"
+            }
+          }
+      )###",
+          "{}", "", "");
+  DCHECK(is_populated);
+
+  NavigateToURL("https://www.guitarcenter.com/");
+  SendXHR("/add-to-cart", "product: 123");
+
+  // Browser-side commerce heuristics are still correct despite being
+  // used to populate renderer side commerce heuristics.
+  cart_db::ChromeCartContentProto expected_cart_protos = BuildProto(
+      "guitarcenter.com", "https://www.guitarcenter.com/special_cart");
+  expected_cart_protos.set_merchant("SPECIAL_NAME");
+  const ShoppingCarts expected_carts = {
+      {"guitarcenter.com", expected_cart_protos}};
+  WaitForCarts(expected_carts);
+}
+
 class CommerceHintNoRateControlTest : public CommerceHintAgentTest {
  public:
   void SetUpInProcessBrowserTestFixture() override {
diff --git a/chrome/services/wilco_dtc_supportd/public/mojom/OWNERS b/chrome/services/wilco_dtc_supportd/public/mojom/OWNERS
index 0e2926f..6fab044 100644
--- a/chrome/services/wilco_dtc_supportd/public/mojom/OWNERS
+++ b/chrome/services/wilco_dtc_supportd/public/mojom/OWNERS
@@ -1,7 +1,7 @@
 per-file *.mojom=set noparent
 
 # Primary:
-per-file *.mojom=mnissler@chromium.org
+per-file *.mojom=file://chromeos/SECURITY_OWNERS
 
 # Backup reviewers:
 per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 2eae417..b25e627 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1386,6 +1386,7 @@
       "//components/sync_device_info:test_support",
       "//components/tab_count_metrics",
       "//components/tab_groups",
+      "//components/tracing:background_tracing_utils",
       "//components/translate/content/browser:test_support",
       "//components/translate/content/renderer",
       "//components/translate/core/common",
@@ -7624,7 +7625,6 @@
       "../common/extensions/api/storage/storage_schema_manifest_handler_unittest.cc",
       "../common/extensions/chrome_extensions_client_unittest.cc",
       "../common/extensions/chrome_manifest_url_handlers_unittest.cc",
-      "../common/extensions/command_unittest.cc",
       "../common/extensions/extension_unittest.cc",
       "../common/extensions/manifest_handlers/automation_unittest.cc",
       "../common/extensions/manifest_handlers/content_scripts_manifest_unittest.cc",
diff --git a/chrome/test/data/webui/cr_elements/cr_view_manager_test.ts b/chrome/test/data/webui/cr_elements/cr_view_manager_test.ts
index 413cd8711..44dca35 100644
--- a/chrome/test/data/webui/cr_elements/cr_view_manager_test.ts
+++ b/chrome/test/data/webui/cr_elements/cr_view_manager_test.ts
@@ -16,8 +16,8 @@
 /** @fileoverview Suite of tests for cr-view-manager. */
 /** @enum {string} */
 enum TestNames {
-  Visibility = 'visibility',
-  EventFiring = 'event firing',
+  VISIBILITY = 'visibility',
+  EVENT_FIRING = 'event firing',
 }
 
 let viewManager: CrViewManagerElement;
@@ -42,7 +42,7 @@
     viewManager = document.body.querySelector('#viewManager')!;
   });
 
-  test(assert(TestNames.Visibility), function() {
+  test(assert(TestNames.VISIBILITY), function() {
     function assertViewVisible(id: string, expectIsVisible: boolean) {
       assertEquals(
           expectIsVisible,
@@ -68,7 +68,7 @@
         });
   });
 
-  test(assert(TestNames.EventFiring), function() {
+  test(assert(TestNames.EVENT_FIRING), function() {
     const viewOne = viewManager.querySelector('#viewOne')!;
 
     let fired = new Set();
diff --git a/chrome/test/data/webui/extensions/keyboard_shortcuts_test.ts b/chrome/test/data/webui/extensions/keyboard_shortcuts_test.ts
index 27d9e80..44e7c93 100644
--- a/chrome/test/data/webui/extensions/keyboard_shortcuts_test.ts
+++ b/chrome/test/data/webui/extensions/keyboard_shortcuts_test.ts
@@ -109,9 +109,9 @@
     assertTrue(isValidKeyCode('F'.charCodeAt(0)));
     assertTrue(isValidKeyCode('Z'.charCodeAt(0)));
     assertTrue(isValidKeyCode('4'.charCodeAt(0)));
-    assertTrue(isValidKeyCode(Key.PageUp));
-    assertTrue(isValidKeyCode(Key.MediaPlayPause));
-    assertTrue(isValidKeyCode(Key.Down));
+    assertTrue(isValidKeyCode(Key.PAGE_UP));
+    assertTrue(isValidKeyCode(Key.MEDIA_PLAY_PAUSE));
+    assertTrue(isValidKeyCode(Key.DOWN));
     assertFalse(isValidKeyCode(16));   // Shift
     assertFalse(isValidKeyCode(17));   // Ctrl
     assertFalse(isValidKeyCode(18));   // Alt
diff --git a/chrome/test/data/webui/new_tab_page/app_test.ts b/chrome/test/data/webui/new_tab_page/app_test.ts
index ffa269a2..6f055e4f7 100644
--- a/chrome/test/data/webui/new_tab_page/app_test.ts
+++ b/chrome/test/data/webui/new_tab_page/app_test.ts
@@ -119,7 +119,7 @@
       assertEquals(
           1,
           metrics.count(
-              'NewTabPage.VoiceActions', VoiceAction.kActivateSearchBox));
+              'NewTabPage.VoiceActions', VoiceAction.ACTIVATE_SEARCH_BOX));
     });
 
     test('voice search keyboard shortcut', async () => {
@@ -138,7 +138,7 @@
       assertEquals(
           1,
           metrics.count(
-              'NewTabPage.VoiceActions', VoiceAction.kActivateKeyboard));
+              'NewTabPage.VoiceActions', VoiceAction.ACTIVATE_KEYBOARD));
 
       // Test other shortcut doesn't close voice search.
       // Act
@@ -405,12 +405,12 @@
     });
 
     ([
-      ['#content', NtpElement.kBackground],
-      ['ntp-logo', NtpElement.kLogo],
-      ['ntp-realbox', NtpElement.kRealbox],
-      ['cr-most-visited', NtpElement.kMostVisited],
-      ['ntp-middle-slot-promo', NtpElement.kMiddleSlotPromo],
-      ['ntp-modules', NtpElement.kModule],
+      ['#content', NtpElement.BACKGROUND],
+      ['ntp-logo', NtpElement.LOGO],
+      ['ntp-realbox', NtpElement.REALBOX],
+      ['cr-most-visited', NtpElement.MOST_VISITED],
+      ['ntp-middle-slot-promo', NtpElement.MIDDLE_SLOT_PROMO],
+      ['ntp-modules', NtpElement.MODULE],
     ] as [string, NtpElement][])
         .forEach(([selector, element]) => {
           test(`clicking '${selector}' records click`, () => {
@@ -431,7 +431,7 @@
 
       // Assert.
       assertEquals(2, metrics.count('NewTabPage.Click'));
-      assertEquals(2, metrics.count('NewTabPage.Click', NtpElement.kCustomize));
+      assertEquals(2, metrics.count('NewTabPage.Click', NtpElement.CUSTOMIZE));
     });
 
     test('clicking OGB records click', () => {
@@ -446,7 +446,7 @@
       // Assert.
       assertEquals(1, metrics.count('NewTabPage.Click'));
       assertEquals(
-          1, metrics.count('NewTabPage.Click', NtpElement.kOneGoogleBar));
+          1, metrics.count('NewTabPage.Click', NtpElement.ONE_GOOGLE_BAR));
     });
   });
 
diff --git a/chrome/test/data/webui/new_tab_page/modules/cart/module_test.ts b/chrome/test/data/webui/new_tab_page/modules/cart/module_test.ts
index 18a9012..f5e69fa3 100644
--- a/chrome/test/data/webui/new_tab_page/modules/cart/module_test.ts
+++ b/chrome/test/data/webui/new_tab_page/modules/cart/module_test.ts
@@ -38,7 +38,7 @@
     suiteSetup(() => {
       loadTimeData.overrideValues({
         ruleBasedDiscountEnabled: false,
-        modulesCartDiscountConsentVariation: DiscountConsentVariation.Default
+        modulesCartDiscountConsentVariation: DiscountConsentVariation.DEFAULT
       });
     });
 
@@ -1186,7 +1186,7 @@
         modulesCartConsentStepTwoDifferentColor: false,
         modulesCartDiscountConsentRejectConfirmation: 'Reject confirmation!',
         modulesCartDiscountConsentAcceptConfirmation: 'Accept confirmation!',
-        modulesCartDiscountConsentVariation: DiscountConsentVariation.Inline,
+        modulesCartDiscountConsentVariation: DiscountConsentVariation.INLINE,
         modulesCartStepOneUseStaticContent: true,
         modulesCartConsentStepOneButton: 'Continue',
         modulesCartStepOneStaticContent: 'Step one consent',
@@ -1406,7 +1406,7 @@
       setup(async () => {
         loadTimeData.overrideValues({
           modulesCartDiscountConsentVariation:
-              DiscountConsentVariation.NativeDialog
+              DiscountConsentVariation.NATIVE_DIALOG
         });
 
         const carts = [
diff --git a/chrome/test/data/webui/new_tab_page/voice_search_overlay_test.ts b/chrome/test/data/webui/new_tab_page/voice_search_overlay_test.ts
index d053f90..e487a4c 100644
--- a/chrome/test/data/webui/new_tab_page/voice_search_overlay_test.ts
+++ b/chrome/test/data/webui/new_tab_page/voice_search_overlay_test.ts
@@ -185,23 +185,25 @@
     assertStyle(voiceSearchOverlay.$.micVolume, '--mic-volume-level', '0');
     assertEquals(1, metrics.count('NewTabPage.VoiceActions'));
     assertEquals(
-        1, metrics.count('NewTabPage.VoiceActions', Action.kQuerySubmitted));
+        1, metrics.count('NewTabPage.VoiceActions', Action.QUERY_SUBMITTED));
   });
 
   ([
-    ['no-speech', 'no-speech', 'learn-more', Error.kNoSpeech],
-    ['audio-capture', 'audio-capture', 'learn-more', Error.kAudioCapture],
-    ['network', 'network', 'none', Error.kNetwork],
-    ['not-allowed', 'not-allowed', 'details', Error.kNotAllowed],
-    ['service-not-allowed', 'not-allowed', 'details', Error.kServiceNotAllowed],
+    ['no-speech', 'no-speech', 'learn-more', Error.NO_SPEECH],
+    ['audio-capture', 'audio-capture', 'learn-more', Error.AUDIO_CAPTURE],
+    ['network', 'network', 'none', Error.NETWORK],
+    ['not-allowed', 'not-allowed', 'details', Error.NOT_ALLOWED],
+    [
+      'service-not-allowed', 'not-allowed', 'details', Error.SERVICE_NOT_ALLOWED
+    ],
     [
       'language-not-supported', 'language-not-supported', 'none',
-      Error.kLanguageNotSupported
+      Error.LANGUAGE_NOT_SUPPORTED
     ],
-    ['aborted', 'other', 'none', Error.kAborted],
-    ['bad-grammar', 'other', 'none', Error.kBadGrammar],
-    ['foo', 'other', 'none', Error.kOther],
-    ['no-match', 'no-match', 'try-again', Error.kNoMatch],
+    ['aborted', 'other', 'none', Error.ABORTED],
+    ['bad-grammar', 'other', 'none', Error.BAD_GRAMMAR],
+    ['foo', 'other', 'none', Error.OTHER],
+    ['no-match', 'no-match', 'try-again', Error.NO_MATCH],
   ] as [SpeechRecognitionErrorCode & 'no-match', string, string, Error][])
       .forEach(([error, text, link, logError]) => {
         test(`on '${error}' received shows error text`, async () => {
@@ -336,8 +338,8 @@
   });
 
   ([
-    ['#retryLink', Action.kTryAgainLink],
-    ['#micButton', Action.kTryAgainMicButton],
+    ['#retryLink', Action.TRY_AGAIN_LINK],
+    ['#micButton', Action.TRY_AGAIN_MIC_BUTTON],
   ] as [string, Action][])
       .forEach(([id, action]) => {
         test(`clicking '${id}' starts voice search if in retry state`, () => {
@@ -408,7 +410,7 @@
     assertFalse(voiceSearchOverlay.$.dialog.open);
     assertEquals(1, metrics.count('NewTabPage.VoiceActions'));
     assertEquals(
-        1, metrics.count('NewTabPage.VoiceActions', Action.kCloseOverlay));
+        1, metrics.count('NewTabPage.VoiceActions', Action.CLOSE_OVERLAY));
   });
 
   test('Click closes overlay', () => {
@@ -419,7 +421,7 @@
     assertFalse(voiceSearchOverlay.$.dialog.open);
     assertEquals(1, metrics.count('NewTabPage.VoiceActions'));
     assertEquals(
-        1, metrics.count('NewTabPage.VoiceActions', Action.kCloseOverlay));
+        1, metrics.count('NewTabPage.VoiceActions', Action.CLOSE_OVERLAY));
   });
 
   test('Clicking learn more logs action', () => {
@@ -437,6 +439,6 @@
     // Assert.
     assertEquals(
         1,
-        metrics.count('NewTabPage.VoiceActions', Action.kSupportLinkClicked));
+        metrics.count('NewTabPage.VoiceActions', Action.SUPPORT_LINK_CLICKED));
   });
 });
diff --git a/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts b/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts
index b6a402e1..22e3ec0 100644
--- a/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts
+++ b/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts
@@ -6,15 +6,61 @@
 import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {ReadAnythingElement} from 'chrome://read-later.top-chrome/read_anything/app.js';
-import {HeadingElement} from 'chrome://read-later.top-chrome/read_anything/heading_element.js';
-import {ContentNode, ContentType} from 'chrome://read-later.top-chrome/read_anything/read_anything.mojom-webui.js';
-import {PageRemote} from 'chrome://read-later.top-chrome/read_anything/read_anything.mojom-webui.js';
+import {ContentNode, ContentType, PageRemote} from 'chrome://read-later.top-chrome/read_anything/read_anything.mojom-webui.js';
 import {ReadAnythingApiProxyImpl} from 'chrome://read-later.top-chrome/read_anything/read_anything_api_proxy.js';
-import {assertEquals} from 'chrome://webui-test/chai_assert.js';
+import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
+import {assertEquals, assertNotReached} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {TestReadAnythingApiProxy} from './test_read_anything_api_proxy.js';
 
+class ContentNodeBuilder {
+  children: ContentNode[];
+  headingLevel: number;
+  text: string;
+  type: ContentType;
+  url: Url;
+
+  constructor(type: ContentType) {
+    this.children = [];
+    this.headingLevel = 0;
+    this.text = '';
+    this.type = type;
+    this.url = {url: ''};
+  }
+
+  setChildren(children: ContentNode[]) {
+    this.children = children;
+    return this;
+  }
+
+  setHeadingLevel(headingLevel: number) {
+    this.headingLevel = headingLevel;
+    return this;
+  }
+
+  setText(text: string) {
+    this.text = text;
+    return this;
+  }
+
+  setUrl(url: string) {
+    this.url = {url: url};
+    return this;
+  }
+
+  build() {
+    const contentNode: ContentNode = {
+      children: this.children,
+      headingLevel: this.headingLevel,
+      text: this.text,
+      type: this.type,
+      url: this.url,
+    };
+    return contentNode;
+  }
+}
+
 suite('ReadAnythingAppTest', () => {
   let readAnythingApp: ReadAnythingElement;
   let testProxy: TestReadAnythingApiProxy;
@@ -36,38 +82,64 @@
     assertEquals(fontFamily, getComputedStyle(container!).fontFamily);
   }
 
-  function assertContentNode(contentNode: ContentNode, element: Element) {
-    let expectedTagName;
+  function assertHeading(contentNode: ContentNode, node: Node) {
+    assertEquals(Node.ELEMENT_NODE, node.nodeType);
+    const tagName: string = 'H' + contentNode.headingLevel;
+    const element: HTMLElement = node as HTMLElement;
+    assertEquals(tagName, element.tagName);
+  }
+
+  function assertLink(contentNode: ContentNode, node: Node) {
+    assertEquals(Node.ELEMENT_NODE, node.nodeType);
+    const element: HTMLElement = node as HTMLElement;
+    assertEquals('A', element.tagName);
+    assertEquals(contentNode.url.url, element.getAttribute('href'));
+  }
+
+  function assertParagraph(node: Node) {
+    assertEquals(Node.ELEMENT_NODE, node.nodeType);
+    const element: HTMLElement = node as HTMLElement;
+    assertEquals('P', element.tagName);
+  }
+
+  function assertStaticText(contentNode: ContentNode, node: Node) {
+    assertEquals(Node.TEXT_NODE, node.nodeType);
+    assertEquals(contentNode.text, node.textContent);
+  }
+
+  function assertContentNode(contentNode: ContentNode, node: Node) {
     switch (contentNode.type) {
       case ContentType.kHeading:
-        switch (contentNode.headingLevel) {
-          case 1:
-            expectedTagName = 'H1';
-            break;
-          case 3:
-            expectedTagName = 'H3';
-            break;
-          case 4:
-            expectedTagName = 'H4';
-            break;
-          case 5:
-            expectedTagName = 'H5';
-            break;
-          case 6:
-            expectedTagName = 'H6';
-            break;
-          case 2:
-          default:  // Heading levels default to H2; see heading_element.ts.
-            expectedTagName = 'H2';
-            break;
-        }
+        assertHeading(contentNode, node);
+        break;
+      case ContentType.kLink:
+        assertLink(contentNode, node);
         break;
       case ContentType.kParagraph:
-        expectedTagName = 'P';
+        assertParagraph(node);
+        break;
+      case ContentType.kStaticText:
+        assertStaticText(contentNode, node);
+        break;
+      default:
+        assertNotReached('ContentNode must be a defined type.');
         break;
     }
-    assertEquals(expectedTagName, element.tagName);
-    assertEquals(contentNode.text, element.textContent);
+
+    const childNodes: Node[] = Array.from(node.childNodes);
+    assertEquals(contentNode.children.length, childNodes.length);
+    for (let i = 0; i < contentNode.children.length; i++) {
+      assertContentNode(contentNode.children[i]!, childNodes[i]!);
+    }
+  }
+
+  function assertContentNodes(contentNodes: ContentNode[]) {
+    const nodes: Node[] = Array.from(
+        readAnythingApp.shadowRoot!.getElementById('container')!.childNodes);
+    assertEquals(contentNodes.length, nodes.length);
+    for (let i = 0; i < contentNodes.length; i++) {
+      assertContentNode(contentNodes[i]!, nodes[i]!);
+    }
   }
 
   test('onFontNameChange', async () => {
@@ -98,83 +170,165 @@
 
   test('showContent paragraph', async () => {
     const contentNodes: ContentNode[] = [
-      {
-        type: ContentType.kParagraph,
-        text: 'This is a paragraph.',
-        headingLevel: 0,
-      },
-      {
-        type: ContentType.kParagraph,
-        text: 'This is a second paragraph.',
-        headingLevel: 0,
-      },
+      new ContentNodeBuilder(ContentType.kParagraph)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is a paragraph.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kParagraph)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is a second paragraph.')
+                            .build()])
+          .build(),
     ];
 
     callbackRouter.showContent(contentNodes);
     await flushTasks();
-
-    const paragraphs: HTMLElement[] =
-        Array.from(readAnythingApp.shadowRoot!.querySelectorAll('p'));
-    assertEquals(contentNodes.length, paragraphs.length);
-    for (let i = 0; i < paragraphs.length; i++) {
-      assertContentNode(contentNodes[i]!, paragraphs[i]!);
-    }
+    assertContentNodes(contentNodes);
   });
 
   test('showContent heading', async () => {
     const contentNodes: ContentNode[] = [
-      {
-        type: ContentType.kHeading,
-        text: 'This is an h1.',
-        headingLevel: 1,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is an h2.',
-        headingLevel: 2,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is an h3.',
-        headingLevel: 3,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is an h4.',
-        headingLevel: 5,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is an h5.',
-        headingLevel: 5,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is an h6.',
-        headingLevel: 6,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is a heading with an improper heading level.',
-        headingLevel: 0,
-      },
-      {
-        type: ContentType.kHeading,
-        text: 'This is another heading with an improper heading level.',
-        headingLevel: 7,
-      },
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(1)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is an h1.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(2)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is an h2.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(3)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is an h3.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(4)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is an h4.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(5)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is an h5.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(6)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is an h6.')
+                            .build()])
+          .build(),
+    ];
+
+    callbackRouter.showContent(contentNodes);
+    await flushTasks();
+    assertContentNodes(contentNodes);
+  });
+
+  test('showContent heading badInput', async () => {
+    const contentNodes: ContentNode[] = [
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(0)
+          .setChildren(
+              [new ContentNodeBuilder(ContentType.kStaticText)
+                   .setText('This is a heading with an improper heading level.')
+                   .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kHeading)
+          .setHeadingLevel(7)
+          .setChildren([
+            new ContentNodeBuilder(ContentType.kStaticText)
+                .setText(
+                    'This is another heading with an improper heading level.')
+                .build()
+          ])
+          .build(),
     ];
 
     callbackRouter.showContent(contentNodes);
     await flushTasks();
 
-    const headings: HeadingElement[] = Array.from(
-        readAnythingApp.shadowRoot!.querySelectorAll('read-anything-heading'));
-    assertEquals(contentNodes.length, headings.length);
-    for (let i = 0; i < headings.length; i++) {
-      const heading =
-          headings[i]!.shadowRoot!.querySelector('h1, h2, h3, h4, h5, h6');
-      assertContentNode(contentNodes[i]!, heading!);
-    }
+    // Heading levels default to 2.
+    const expected: ContentNode[] = contentNodes;
+    expected[0]!.headingLevel = 2;
+    expected[1]!.headingLevel = 2;
+    assertContentNodes(expected);
+  });
+
+  test('showContent link', async () => {
+    const contentNodes: ContentNode[] = [
+      new ContentNodeBuilder(ContentType.kLink)
+          .setUrl('http://www.google.com')
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is a link.')
+                            .build()])
+          .build(),
+      new ContentNodeBuilder(ContentType.kLink)
+          .setUrl('http://www.youtube.com')
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This is another link.')
+                            .build()])
+          .build(),
+    ];
+
+    callbackRouter.showContent(contentNodes);
+    await flushTasks();
+    assertContentNodes(contentNodes);
+  });
+
+  test('showContent link badInput', async () => {
+    // Links must have a url.
+    const contentNodes: ContentNode[] = [
+      new ContentNodeBuilder(ContentType.kLink)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This link does not have a url.')
+                            .build()])
+          .build(),
+    ];
+
+    callbackRouter.showContent(contentNodes);
+    await flushTasks();
+    const expected: ContentNode[] = [];
+    assertContentNodes(expected);
+  });
+
+  test('showContent staticText', async () => {
+    const contentNodes: ContentNode[] = [
+      new ContentNodeBuilder(ContentType.kStaticText)
+          .setText('This is some text.')
+          .build(),
+      new ContentNodeBuilder(ContentType.kStaticText)
+          .setText('This is some more text.')
+          .build(),
+    ];
+
+    callbackRouter.showContent(contentNodes);
+    await flushTasks();
+    assertContentNodes(contentNodes);
+  });
+
+  test('showContent staticText badInput', async () => {
+    // Static text nodes must have text and must not have children.
+    const contentNodes: ContentNode[] = [
+      new ContentNodeBuilder(ContentType.kStaticText).build(),
+      new ContentNodeBuilder(ContentType.kStaticText).setText('').build(),
+      new ContentNodeBuilder(ContentType.kStaticText)
+          .setChildren([new ContentNodeBuilder(ContentType.kStaticText)
+                            .setText('This text has children.')
+                            .build()])
+          .build(),
+    ];
+
+    callbackRouter.showContent(contentNodes);
+    await flushTasks();
+    const expected: ContentNode[] = [];
+    assertContentNodes(expected);
   });
 });
diff --git a/chromeos/SECURITY_OWNERS b/chromeos/SECURITY_OWNERS
index 829175ba..ccba198 100644
--- a/chromeos/SECURITY_OWNERS
+++ b/chromeos/SECURITY_OWNERS
@@ -1,3 +1,2 @@
 jorgelo@chromium.org
 kerrnel@chromium.org
-mnissler@chromium.org
diff --git a/chromeos/ash/components/dbus/concierge/concierge_client.cc b/chromeos/ash/components/dbus/concierge/concierge_client.cc
index faa14ff..9794aa6 100644
--- a/chromeos/ash/components/dbus/concierge/concierge_client.cc
+++ b/chromeos/ash/components/dbus/concierge/concierge_client.cc
@@ -21,7 +21,7 @@
 
 namespace concierge = vm_tools::concierge;
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -521,4 +521,4 @@
   return g_instance;
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/dbus/concierge/concierge_client.h b/chromeos/ash/components/dbus/concierge/concierge_client.h
index 51958239..3c35e5b 100644
--- a/chromeos/ash/components/dbus/concierge/concierge_client.h
+++ b/chromeos/ash/components/dbus/concierge/concierge_client.h
@@ -9,13 +9,13 @@
 #include "base/files/scoped_file.h"
 #include "base/observer_list.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_service.pb.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/dbus/cicerone/fake_cicerone_client.h"
 #include "chromeos/dbus/common/dbus_client.h"
 #include "chromeos/dbus/common/dbus_method_call_status.h"
 #include "dbus/object_proxy.h"
 
-namespace chromeos {
-
-class FakeCiceroneClient;
+namespace ash {
 
 // ConciergeClient is used to communicate with Concierge, which is used to
 // start and stop VMs, as well as for disk image management.
@@ -316,12 +316,11 @@
   ConciergeClient();
 };
 
-}  // namespace chromeos
+}  // namespace ash
 
-// TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
-// source migration is finished.
-namespace ash {
-using ::chromeos::ConciergeClient;
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::ConciergeClient;
 }
 
 #endif  // CHROMEOS_ASH_COMPONENTS_DBUS_CONCIERGE_CONCIERGE_CLIENT_H_
diff --git a/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc b/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc
index 26760fe9..86f28f8 100644
--- a/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc
+++ b/chromeos/ash/components/dbus/concierge/fake_concierge_client.cc
@@ -11,7 +11,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/dbus/cicerone/fake_cicerone_client.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -467,4 +467,4 @@
   set_vm_id_response_->set_success(true);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/dbus/concierge/fake_concierge_client.h b/chromeos/ash/components/dbus/concierge/fake_concierge_client.h
index 585978a5..a48ff748 100644
--- a/chromeos/ash/components/dbus/concierge/fake_concierge_client.h
+++ b/chromeos/ash/components/dbus/concierge/fake_concierge_client.h
@@ -12,11 +12,11 @@
 #include "base/time/time.h"
 #include "chromeos/ash/components/dbus/concierge/concierge_client.h"
 #include "chromeos/dbus/cicerone/cicerone_client.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/dbus/cicerone/fake_cicerone_client.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
-
-class FakeCiceroneClient;
+namespace ash {
 
 // FakeConciergeClient is a light mock of ConciergeClient used for testing.
 class COMPONENT_EXPORT(CONCIERGE) FakeConciergeClient : public ConciergeClient {
@@ -447,11 +447,6 @@
   base::WeakPtrFactory<FakeConciergeClient> weak_ptr_factory_{this};
 };
 
-}  // namespace chromeos
-
-// TODO(https://crbug.com/1164001): remove after the migration is finished.
-namespace ash {
-using ::chromeos::FakeConciergeClient;
-}
+}  // namespace ash
 
 #endif  // CHROMEOS_ASH_COMPONENTS_DBUS_CONCIERGE_FAKE_CONCIERGE_CLIENT_H_
diff --git a/chromeos/ash/components/dbus/rmad/fake_rmad_client.cc b/chromeos/ash/components/dbus/rmad/fake_rmad_client.cc
index 988bee2..aa4e6c4f 100644
--- a/chromeos/ash/components/dbus/rmad/fake_rmad_client.cc
+++ b/chromeos/ash/components/dbus/rmad/fake_rmad_client.cc
@@ -210,6 +210,13 @@
                      absl::optional<rmad::GetLogReply>(get_log_reply_)));
 }
 
+void FakeRmadClient::SaveLog(DBusMethodCallback<rmad::SaveLogReply> callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(callback),
+                     absl::optional<rmad::SaveLogReply>(save_log_reply_)));
+}
+
 void FakeRmadClient::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
@@ -343,6 +350,12 @@
   get_log_reply_.set_error(error);
 }
 
+void FakeRmadClient::SetSaveLogReply(const std::string& save_path,
+                                     rmad::RmadErrorCode error) {
+  save_log_reply_.set_save_path(save_path);
+  save_log_reply_.set_error(error);
+}
+
 void FakeRmadClient::TriggerErrorObservation(rmad::RmadErrorCode error) {
   for (auto& observer : observers_)
     observer.Error(error);
diff --git a/chromeos/ash/components/dbus/rmad/fake_rmad_client.h b/chromeos/ash/components/dbus/rmad/fake_rmad_client.h
index 198cb99e..f4da936 100644
--- a/chromeos/ash/components/dbus/rmad/fake_rmad_client.h
+++ b/chromeos/ash/components/dbus/rmad/fake_rmad_client.h
@@ -41,6 +41,8 @@
 
   void GetLog(DBusMethodCallback<rmad::GetLogReply> callback) override;
 
+  void SaveLog(DBusMethodCallback<rmad::SaveLogReply> callback) override;
+
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
   bool HasObserver(const Observer* observer) const override;
@@ -50,6 +52,7 @@
 
   void SetAbortable(bool abortable);
   void SetGetLogReply(const std::string& log, rmad::RmadErrorCode error);
+  void SetSaveLogReply(const std::string& save_path, rmad::RmadErrorCode error);
 
   void TriggerErrorObservation(rmad::RmadErrorCode error);
   void TriggerCalibrationProgressObservation(
@@ -84,6 +87,7 @@
   size_t state_index_;
   rmad::AbortRmaReply abort_rma_reply_;
   rmad::GetLogReply get_log_reply_;
+  rmad::SaveLogReply save_log_reply_;
   base::ObserverList<Observer, /*check_empty=*/true, /*allow_reentrancy=*/false>
       observers_;
 };
diff --git a/chromeos/ash/components/dbus/rmad/fake_rmad_client_unittest.cc b/chromeos/ash/components/dbus/rmad/fake_rmad_client_unittest.cc
index 4aa5a758..2291ca8 100644
--- a/chromeos/ash/components/dbus/rmad/fake_rmad_client_unittest.cc
+++ b/chromeos/ash/components/dbus/rmad/fake_rmad_client_unittest.cc
@@ -495,6 +495,20 @@
   run_loop.RunUntilIdle();
 }
 
+TEST_F(FakeRmadClientTest, SaveLog) {
+  const std::string expected_save_path = "fake save path for testing";
+  fake_client_()->SetSaveLogReply(expected_save_path, rmad::RMAD_ERROR_OK);
+  base::RunLoop run_loop;
+  client_->SaveLog(base::BindLambdaForTesting(
+      [&](absl::optional<rmad::SaveLogReply> response) {
+        EXPECT_TRUE(response.has_value());
+        EXPECT_EQ(response->save_path(), expected_save_path);
+        EXPECT_EQ(response->error(), rmad::RMAD_ERROR_OK);
+        run_loop.Quit();
+      }));
+  run_loop.RunUntilIdle();
+}
+
 // Tests that synchronous observers are notified about errors that occur outside
 // of state transitions.
 TEST_F(FakeRmadClientTest, ErrorObservation) {
diff --git a/chromeos/ash/components/dbus/rmad/rmad_client.cc b/chromeos/ash/components/dbus/rmad/rmad_client.cc
index 421dbe11..4ed56a8 100644
--- a/chromeos/ash/components/dbus/rmad/rmad_client.cc
+++ b/chromeos/ash/components/dbus/rmad/rmad_client.cc
@@ -48,6 +48,8 @@
 
   void GetLog(DBusMethodCallback<rmad::GetLogReply> callback) override;
 
+  void SaveLog(DBusMethodCallback<rmad::SaveLogReply> callback) override;
+
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
   bool HasObserver(const Observer* observer) const override;
@@ -440,6 +442,15 @@
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
+void RmadClientImpl::SaveLog(DBusMethodCallback<rmad::SaveLogReply> callback) {
+  dbus::MethodCall method_call(rmad::kRmadInterfaceName, rmad::kSaveLogMethod);
+  dbus::MessageWriter writer(&method_call);
+  rmad_proxy_->CallMethod(
+      &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+      base::BindOnce(&RmadClientImpl::OnProtoReply<rmad::SaveLogReply>,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+}
+
 void RmadClientImpl::AddObserver(Observer* observer) {
   // Currently there is only one observer (chromeos::ShimlessRmaService) and it
   // is added before any signals are expected, so there is no need to preserve
diff --git a/chromeos/ash/components/dbus/rmad/rmad_client.h b/chromeos/ash/components/dbus/rmad/rmad_client.h
index 3254725..8b33734 100644
--- a/chromeos/ash/components/dbus/rmad/rmad_client.h
+++ b/chromeos/ash/components/dbus/rmad/rmad_client.h
@@ -103,6 +103,9 @@
   // Request the RMA process logs.
   virtual void GetLog(DBusMethodCallback<rmad::GetLogReply> callback) = 0;
 
+  // Save RMA logs to a USB drive.
+  virtual void SaveLog(DBusMethodCallback<rmad::SaveLogReply> callback) = 0;
+
   // Adds and removes the observer.
   virtual void AddObserver(Observer* observer) = 0;
   virtual void RemoveObserver(Observer* observer) = 0;
diff --git a/chromeos/ash/components/dbus/rmad/rmad_client_unittest.cc b/chromeos/ash/components/dbus/rmad/rmad_client_unittest.cc
index 1f14e4a..7921fd85 100644
--- a/chromeos/ash/components/dbus/rmad/rmad_client_unittest.cc
+++ b/chromeos/ash/components/dbus/rmad/rmad_client_unittest.cc
@@ -677,6 +677,66 @@
   run_loop.RunUntilIdle();
 }
 
+TEST_F(RmadClientTest, SaveLog) {
+  const std::string expected_save_path = "test save path";
+  std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
+  rmad::SaveLogReply expected_proto;
+  expected_proto.set_save_path(expected_save_path);
+  expected_proto.set_error(rmad::RMAD_ERROR_OK);
+  ASSERT_TRUE(dbus::MessageWriter(response.get())
+                  .AppendProtoAsArrayOfBytes(expected_proto));
+
+  response_ = response.get();
+  EXPECT_CALL(*mock_proxy_.get(),
+              DoCallMethod(HasMember(rmad::kSaveLogMethod),
+                           dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, _))
+      .WillOnce(Invoke(this, &RmadClientTest::OnCallDbusMethod));
+
+  base::RunLoop run_loop;
+  client_->SaveLog(base::BindLambdaForTesting(
+      [&](absl::optional<rmad::SaveLogReply> response) {
+        EXPECT_TRUE(response.has_value());
+        EXPECT_EQ(response->save_path(), expected_save_path);
+        EXPECT_EQ(response->error(), rmad::RMAD_ERROR_OK);
+        run_loop.Quit();
+      }));
+  run_loop.RunUntilIdle();
+}
+
+TEST_F(RmadClientTest, SaveLog_NullResponse) {
+  response_ = nullptr;
+  EXPECT_CALL(*mock_proxy_.get(),
+              DoCallMethod(HasMember(rmad::kSaveLogMethod),
+                           dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, _))
+      .WillOnce(Invoke(this, &RmadClientTest::OnCallDbusMethod));
+
+  base::RunLoop run_loop;
+  client_->SaveLog(base::BindLambdaForTesting(
+      [&](absl::optional<rmad::SaveLogReply> response) {
+        EXPECT_FALSE(response.has_value());
+        run_loop.Quit();
+      }));
+  run_loop.RunUntilIdle();
+}
+
+TEST_F(RmadClientTest, SaveLog_EmptyResponse) {
+  std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty();
+
+  response_ = response.get();
+  EXPECT_CALL(*mock_proxy_.get(),
+              DoCallMethod(HasMember(rmad::kSaveLogMethod),
+                           dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, _))
+      .WillOnce(Invoke(this, &RmadClientTest::OnCallDbusMethod));
+
+  base::RunLoop run_loop;
+  client_->SaveLog(base::BindLambdaForTesting(
+      [&](absl::optional<rmad::SaveLogReply> response) {
+        EXPECT_FALSE(response.has_value());
+        run_loop.Quit();
+      }));
+  run_loop.RunUntilIdle();
+}
+
 // Tests that synchronous observers are notified about errors that occur outside
 // of state transitions.
 TEST_F(RmadClientTest, Error) {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index b059117..2e101aa2 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -2815,22 +2815,19 @@
         Write protection disable complete, you must keep the device disassembled.
       </message>
       <!-- Check calibration page -->
-      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE" translateable="false" desc="Title for the page shown when confirming components to calibrate after calibration fails.">
-        Some components have failed to calibrate
+      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE" desc="Title for the page shown when confirming components to calibrate after calibration fails.">
+        Couldn't calibrate some components
       </message>
-      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS" translateable="false" desc="The text instructions shown when confirming components to calibrate after calibration fails.">
-        You may select certain or all components to try again, or move forward without calibration.
+      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS" desc="The text instructions shown when confirming components to calibrate after calibration fails.">
+        Select 1 or more components and try again, or skip calibration
       </message>
-      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_RETRY_BUTTON_LABEL" translateable="false" desc="The label for the button to retry calibrating.">
-        Retry calibration
-      </message>
-      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE" translateable="false" desc="The title for the dialog warning users they have components that failed calibration.">
+      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE" desc="The title for the dialog warning users they have components that failed calibration.">
         Proceed with failed calibrations?
       </message>
-      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TEXT" translateable="false" desc="The text in the dialog warning users the consequences of proceeding with components that failed calibration.">
+      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TEXT" desc="The text in the dialog warning users the consequences of proceeding with components that failed calibration.">
         Components may not work correctly unless calibrated
       </message>
-      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_SKIP_CALIBRATION_LABEL" translateable="false" desc="The label for the button letting the user skip component calibration.">
+      <message name="IDS_SHIMLESS_RMA_CALIBRATION_FAILED_SKIP_CALIBRATION_LABEL" desc="The label for the button letting the user skip component calibration.">
         Skip calibration
       </message>
       <!-- Setup calibration page -->
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TEXT.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TEXT.png.sha1
new file mode 100644
index 0000000..40ae078
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TEXT.png.sha1
@@ -0,0 +1 @@
+e03f10daf98c32c644037e056536c46af57392f7
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..40ae078
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+e03f10daf98c32c644037e056536c46af57392f7
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS.png.sha1
new file mode 100644
index 0000000..95a8c05
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS.png.sha1
@@ -0,0 +1 @@
+29fd116c7103ad351ebd629dfdd9b032969c774d
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE.png.sha1
new file mode 100644
index 0000000..95a8c05
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@
+29fd116c7103ad351ebd629dfdd9b032969c774d
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_SKIP_CALIBRATION_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_SKIP_CALIBRATION_LABEL.png.sha1
new file mode 100644
index 0000000..40ae078
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_CALIBRATION_FAILED_SKIP_CALIBRATION_LABEL.png.sha1
@@ -0,0 +1 @@
+e03f10daf98c32c644037e056536c46af57392f7
\ No newline at end of file
diff --git a/chromeos/components/human_presence/human_presence_configuration.cc b/chromeos/components/human_presence/human_presence_configuration.cc
index ff61c6d..d067ff77 100644
--- a/chromeos/components/human_presence/human_presence_configuration.cc
+++ b/chromeos/components/human_presence/human_presence_configuration.cc
@@ -51,7 +51,7 @@
 // The config to use when no parameters are specified. We need to ensure that
 // that empty params induce a working config (as required for, e.g., a
 // chrome:://flags entry).
-hps::FeatureConfig GetDefaultHpsNotifyFeatureConfig() {
+hps::FeatureConfig GetDefaultSnoopingProtectionConfig() {
   hps::FeatureConfig config;
 
   // Just apply a threshold to the last-seen inference.
@@ -65,7 +65,7 @@
   return config;
 }
 
-hps::FeatureConfig GetDefaultHpsSenseFeatureConfig() {
+hps::FeatureConfig GetDefaultLockOnLeaveConfig() {
   hps::FeatureConfig config;
   auto& filter_config = *config.mutable_consecutive_results_filter_config();
   // Any positive result will undim the screen.
@@ -80,15 +80,15 @@
   return config;
 }
 
-// This function constructs a FeatureConfig proto from feature parameters..
+// This function constructs a FeatureConfig proto from feature parameters.
 // The FeatureConfig contains one type of FilterConfig that will be used for
-// enabling a Hps feature.
+// enabling a human presence feature.
 //
 // If empty parameters are provided, a reasonable default is used.
 //
 // More details can be found at:
 // src/platform2/hps/daemon/filters/filter_factory.h
-absl::optional<hps::FeatureConfig> ConstructHpsFilterConfigFromFeatureParams(
+absl::optional<hps::FeatureConfig> ConstructFilterConfigFromFeatureParams(
     const base::Feature& feature,
     const hps::FeatureConfig& default_value) {
   // Load current params map for the feature.
@@ -105,7 +105,7 @@
   const absl::optional<int> filter_config_case =
       GetIntParam(params, feature_name, "filter_config_case");
   if (!filter_config_case.has_value()) {
-    LOG(ERROR) << "HpsFilterConfig error: missing param filter_config_case for "
+    LOG(ERROR) << "Filter config error: missing param filter_config_case for "
                << feature_name;
     return absl::nullopt;
   }
@@ -134,7 +134,7 @@
           !uncertain_count_threshold.has_value() ||
           !positive_score_threshold.has_value() ||
           !negative_score_threshold.has_value()) {
-        LOG(ERROR) << "HpsFilterConfig error: missing params for "
+        LOG(ERROR) << "Filter config error: missing params for "
                       "ConsecutiveResultsFilterConfig for "
                    << feature_name;
         return absl::nullopt;
@@ -164,7 +164,7 @@
           !positive_score_threshold.has_value() ||
           !negative_score_threshold.has_value() ||
           !default_uncertain_score.has_value()) {
-        LOG(ERROR) << "HpsFilterConfig error: missing params for "
+        LOG(ERROR) << "Filter config error: missing params for "
                       "AverageFilterConfig for "
                    << feature_name;
         return absl::nullopt;
@@ -186,14 +186,14 @@
 
 }  // namespace
 
-absl::optional<hps::FeatureConfig> GetEnableHpsSenseConfig() {
-  return ConstructHpsFilterConfigFromFeatureParams(
-      ash::features::kQuickDim, GetDefaultHpsSenseFeatureConfig());
+absl::optional<hps::FeatureConfig> GetEnableLockOnLeaveConfig() {
+  return ConstructFilterConfigFromFeatureParams(ash::features::kQuickDim,
+                                                GetDefaultLockOnLeaveConfig());
 }
 
-absl::optional<hps::FeatureConfig> GetEnableHpsNotifyConfig() {
-  return ConstructHpsFilterConfigFromFeatureParams(
-      ash::features::kSnoopingProtection, GetDefaultHpsNotifyFeatureConfig());
+absl::optional<hps::FeatureConfig> GetEnableSnoopingProtectionConfig() {
+  return ConstructFilterConfigFromFeatureParams(
+      ash::features::kSnoopingProtection, GetDefaultSnoopingProtectionConfig());
 }
 
 base::TimeDelta GetQuickDimDelay() {
diff --git a/chromeos/components/human_presence/human_presence_configuration.h b/chromeos/components/human_presence/human_presence_configuration.h
index 490528c6..6cf8b15 100644
--- a/chromeos/components/human_presence/human_presence_configuration.h
+++ b/chromeos/components/human_presence/human_presence_configuration.h
@@ -16,15 +16,15 @@
 
 namespace hps {
 
-// Gets FeatureConfig for enabling HpsSense from Finch.
+// Gets FeatureConfig for enabling LockOnLeave from Finch.
 // Returns nullopt if feature is not enabled or can't be parsed correctly.
 COMPONENT_EXPORT(HPS)
-absl::optional<hps::FeatureConfig> GetEnableHpsSenseConfig();
+absl::optional<hps::FeatureConfig> GetEnableLockOnLeaveConfig();
 
-// Gets FeatureConfig for enabling HpsNotify from Finch.
+// Gets FeatureConfig for enabling SnoopingProtection from Finch.
 // Returns nullopt if feature is not enabled or can't be parsed correctly.
 COMPONENT_EXPORT(HPS)
-absl::optional<hps::FeatureConfig> GetEnableHpsNotifyConfig();
+absl::optional<hps::FeatureConfig> GetEnableSnoopingProtectionConfig();
 
 // Gets quick dim delay to configure power_manager.
 COMPONENT_EXPORT(HPS) base::TimeDelta GetQuickDimDelay();
diff --git a/chromeos/components/human_presence/human_presence_configuration_unittest.cc b/chromeos/components/human_presence/human_presence_configuration_unittest.cc
index 1d545600..3c371f0b 100644
--- a/chromeos/components/human_presence/human_presence_configuration_unittest.cc
+++ b/chromeos/components/human_presence/human_presence_configuration_unittest.cc
@@ -21,38 +21,40 @@
   return expected_serialized == actual_serialized;
 }
 
-TEST(HpsFeatureConfigTest, EmptyParamsValid) {
+TEST(HumanPresenceFeatureConfigTest, EmptyParamsValid) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
       {ash::features::kQuickDim, ash::features::kSnoopingProtection},
       {} /* disabled_features */);
 
-  EXPECT_EQ(GetEnableHpsSenseConfig()->filter_config_case(),
+  EXPECT_EQ(GetEnableLockOnLeaveConfig()->filter_config_case(),
             hps::FeatureConfig::kConsecutiveResultsFilterConfig);
-  EXPECT_EQ(GetEnableHpsNotifyConfig()->filter_config_case(),
+  EXPECT_EQ(GetEnableSnoopingProtectionConfig()->filter_config_case(),
             hps::FeatureConfig::kConsecutiveResultsFilterConfig);
 }
 
-TEST(HpsFeatureConfigTest, ReturnNullIfTypeIsNotRecognizableHpsSense) {
+TEST(HumanPresenceFeatureConfigTest,
+     ReturnNullIfTypeIsNotRecognizableLockOnLeave) {
   const base::FieldTrialParams params = {{"QuickDim_filter_config_case", "0"}};
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{ash::features::kQuickDim, params}}, {});
 
-  EXPECT_FALSE(GetEnableHpsSenseConfig().has_value());
+  EXPECT_FALSE(GetEnableLockOnLeaveConfig().has_value());
 }
 
-TEST(HpsFeatureConfigTest, ReturnNullIfTypeIsNotRecognizableHpsNotify) {
+TEST(HumanPresenceFeatureConfigTest,
+     ReturnNullIfTypeIsNotRecognizableSnoopingProtection) {
   const base::FieldTrialParams params = {
       {"SnoopingProtection_filter_config_case", "0"}};
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeaturesAndParameters(
       {{ash::features::kSnoopingProtection, params}}, {});
 
-  EXPECT_FALSE(GetEnableHpsNotifyConfig().has_value());
+  EXPECT_FALSE(GetEnableSnoopingProtectionConfig().has_value());
 }
 
-TEST(HpsFeatureConfigTest, VerifyBasicFilterConfigHpsSense) {
+TEST(HumanPresenceFeatureConfigTest, VerifyBasicFilterConfigLockOnLeave) {
   const std::map<std::string, std::string> params = {
       {"QuickDim_filter_config_case", "1"}};
   base::test::ScopedFeatureList feature_list;
@@ -62,10 +64,12 @@
   hps::FeatureConfig expected_config;
   expected_config.mutable_basic_filter_config();
 
-  EXPECT_THAT(GetEnableHpsSenseConfig().value(), ProtoEquals(expected_config));
+  EXPECT_THAT(GetEnableLockOnLeaveConfig().value(),
+              ProtoEquals(expected_config));
 }
 
-TEST(HpsFeatureConfigTest, VerifyBasicFilterConfigHpsNotify) {
+TEST(HumanPresenceFeatureConfigTest,
+     VerifyBasicFilterConfigSnoopingProtection) {
   const std::map<std::string, std::string> params = {
       {"SnoopingProtection_filter_config_case", "1"}};
   base::test::ScopedFeatureList feature_list;
@@ -75,10 +79,12 @@
   hps::FeatureConfig expected_config;
   expected_config.mutable_basic_filter_config();
 
-  EXPECT_THAT(GetEnableHpsNotifyConfig().value(), ProtoEquals(expected_config));
+  EXPECT_THAT(GetEnableSnoopingProtectionConfig().value(),
+              ProtoEquals(expected_config));
 }
 
-TEST(HpsFeatureConfigTest, VerifyConsecutiveResultsFilterConfigHpsSense) {
+TEST(HumanPresenceFeatureConfigTest,
+     VerifyConsecutiveResultsFilterConfigLockOnLeave) {
   const std::map<std::string, std::string> params = {
       {"QuickDim_filter_config_case", "2"},
       {"QuickDim_positive_count_threshold", "3"},
@@ -100,11 +106,12 @@
   consecutive_results_filter_config.set_positive_score_threshold(7);
   consecutive_results_filter_config.set_negative_score_threshold(6);
 
-  const auto hps_sense_config = GetEnableHpsSenseConfig();
-  EXPECT_THAT(*hps_sense_config, ProtoEquals(expected_config));
+  const auto lock_on_leave = GetEnableLockOnLeaveConfig();
+  EXPECT_THAT(*lock_on_leave, ProtoEquals(expected_config));
 }
 
-TEST(HpsFeatureConfigTest, VerifyConsecutiveResultsFilterConfigHpsNotify) {
+TEST(HumanPresenceFeatureConfigTest,
+     VerifyConsecutiveResultsFilterConfigSnoopingProtection) {
   const std::map<std::string, std::string> params = {
       {"SnoopingProtection_filter_config_case", "2"},
       {"SnoopingProtection_positive_count_threshold", "3"},
@@ -126,11 +133,11 @@
   consecutive_results_filter_config.set_positive_score_threshold(7);
   consecutive_results_filter_config.set_negative_score_threshold(6);
 
-  const auto hps_notify_config = GetEnableHpsNotifyConfig();
-  EXPECT_THAT(*hps_notify_config, ProtoEquals(expected_config));
+  const auto snooping_protection_config = GetEnableSnoopingProtectionConfig();
+  EXPECT_THAT(*snooping_protection_config, ProtoEquals(expected_config));
 }
 
-TEST(HpsFeatureConfigTest, VerifyAverageFilterConfigHpsSense) {
+TEST(HumanPresenceFeatureConfigTest, VerifyAverageFilterConfigLockOnLeave) {
   const std::map<std::string, std::string> params = {
       {"QuickDim_filter_config_case", "3"},
       {"QuickDim_average_window_size", "4"},
@@ -149,11 +156,12 @@
   average_filter_config.set_negative_score_threshold(6);
   average_filter_config.set_default_uncertain_score(7);
 
-  const auto hps_sense_config = GetEnableHpsSenseConfig();
-  EXPECT_THAT(*hps_sense_config, ProtoEquals(expected_config));
+  const auto lock_on_leave = GetEnableLockOnLeaveConfig();
+  EXPECT_THAT(*lock_on_leave, ProtoEquals(expected_config));
 }
 
-TEST(HpsFeatureConfigTest, VerifyAverageFilterConfigHpsNotify) {
+TEST(HumanPresenceFeatureConfigTest,
+     VerifyAverageFilterConfigSnoopingProtection) {
   const std::map<std::string, std::string> params = {
       {"SnoopingProtection_filter_config_case", "3"},
       {"SnoopingProtection_average_window_size", "4"},
@@ -172,8 +180,8 @@
   average_filter_config.set_negative_score_threshold(6);
   average_filter_config.set_default_uncertain_score(7);
 
-  const auto hps_notify_config = GetEnableHpsNotifyConfig();
-  EXPECT_THAT(*hps_notify_config, ProtoEquals(expected_config));
+  const auto snooping_protection_config = GetEnableSnoopingProtectionConfig();
+  EXPECT_THAT(*snooping_protection_config, ProtoEquals(expected_config));
 }
 
 }  // namespace hps
diff --git a/chromeos/components/human_presence/human_presence_internals.cc b/chromeos/components/human_presence/human_presence_internals.cc
index 263b922..3a3d69c1 100644
--- a/chromeos/components/human_presence/human_presence_internals.cc
+++ b/chromeos/components/human_presence/human_presence_internals.cc
@@ -7,23 +7,26 @@
 namespace hps {
 
 // Resource paths.
-const char kHpsInternalsCSS[] = "human_presence_internals.css";
-const char kHpsInternalsJS[] = "human_presence_internals.js";
-const char kHpsInternalsIcon[] = "human_presence_internals_icon.svg";
+const char kHumanPresenceInternalsCSS[] = "human_presence_internals.css";
+const char kHumanPresenceInternalsJS[] = "human_presence_internals.js";
+const char kHumanPresenceInternalsIcon[] = "human_presence_internals_icon.svg";
 
 // Message handlers.
-const char kHpsInternalsConnectCmd[] = "connect";
-const char kHpsInternalsEnableSenseCmd[] = "enable_sense";
-const char kHpsInternalsDisableSenseCmd[] = "disable_sense";
-const char kHpsInternalsQuerySenseCmd[] = "query_sense";
-const char kHpsInternalsEnableNotifyCmd[] = "enable_notify";
-const char kHpsInternalsDisableNotifyCmd[] = "disable_notify";
-const char kHpsInternalsQueryNotifyCmd[] = "query_notify";
+const char kHumanPresenceInternalsConnectCmd[] = "connect";
+const char kHumanPresenceInternalsEnableLockOnLeaveCmd[] = "enable_sense";
+const char kHumanPresenceInternalsDisableLockOnLeaveCmd[] = "disable_sense";
+const char kHumanPresenceInternalsQueryLockOnLeaveCmd[] = "query_sense";
+const char kHumanPresenceInternalsEnableSnoopingProtectionCmd[] =
+    "enable_notify";
+const char kHumanPresenceInternalsDisableSnoopingProtectionCmd[] =
+    "disable_notify";
+const char kHumanPresenceInternalsQuerySnoopingProtectionCmd[] = "query_notify";
 
 // Events.
-const char kHpsInternalsConnectedEvent[] = "connected";
-const char kHpsInternalsSenseChangedEvent[] = "sense_changed";
-const char kHpsInternalsNotifyChangedEvent[] = "notify_changed";
-const char kHpsInternalsEnableErrorEvent[] = "enable_error";
+const char kHumanPresenceInternalsConnectedEvent[] = "connected";
+const char kHumanPresenceInternalsLockOnLeaveChangedEvent[] = "sense_changed";
+const char kHumanPresenceInternalsSnoopingProtectionChangedEvent[] =
+    "notify_changed";
+const char kHumanPresenceInternalsEnableErrorEvent[] = "enable_error";
 
 }  // namespace hps
diff --git a/chromeos/components/human_presence/human_presence_internals.h b/chromeos/components/human_presence/human_presence_internals.h
index 05c11a09..09a69eb7 100644
--- a/chromeos/components/human_presence/human_presence_internals.h
+++ b/chromeos/components/human_presence/human_presence_internals.h
@@ -8,24 +8,24 @@
 namespace hps {
 
 // Resource paths.
-extern const char kHpsInternalsCSS[];
-extern const char kHpsInternalsJS[];
-extern const char kHpsInternalsIcon[];
+extern const char kHumanPresenceInternalsCSS[];
+extern const char kHumanPresenceInternalsJS[];
+extern const char kHumanPresenceInternalsIcon[];
 
 // Message handlers.
-extern const char kHpsInternalsConnectCmd[];
-extern const char kHpsInternalsEnableSenseCmd[];
-extern const char kHpsInternalsDisableSenseCmd[];
-extern const char kHpsInternalsQuerySenseCmd[];
-extern const char kHpsInternalsEnableNotifyCmd[];
-extern const char kHpsInternalsDisableNotifyCmd[];
-extern const char kHpsInternalsQueryNotifyCmd[];
+extern const char kHumanPresenceInternalsConnectCmd[];
+extern const char kHumanPresenceInternalsEnableLockOnLeaveCmd[];
+extern const char kHumanPresenceInternalsDisableLockOnLeaveCmd[];
+extern const char kHumanPresenceInternalsQueryLockOnLeaveCmd[];
+extern const char kHumanPresenceInternalsEnableSnoopingProtectionCmd[];
+extern const char kHumanPresenceInternalsDisableSnoopingProtectionCmd[];
+extern const char kHumanPresenceInternalsQuerySnoopingProtectionCmd[];
 
 // Events.
-extern const char kHpsInternalsConnectedEvent[];
-extern const char kHpsInternalsSenseChangedEvent[];
-extern const char kHpsInternalsNotifyChangedEvent[];
-extern const char kHpsInternalsEnableErrorEvent[];
+extern const char kHumanPresenceInternalsConnectedEvent[];
+extern const char kHumanPresenceInternalsLockOnLeaveChangedEvent[];
+extern const char kHumanPresenceInternalsSnoopingProtectionChangedEvent[];
+extern const char kHumanPresenceInternalsEnableErrorEvent[];
 
 }  // namespace hps
 
diff --git a/chromeos/components/human_presence/test/human_presence_internals_browsertest.js b/chromeos/components/human_presence/test/human_presence_internals_browsertest.js
index 98fb8af7..018a4b1 100644
--- a/chromeos/components/human_presence/test/human_presence_internals_browsertest.js
+++ b/chromeos/components/human_presence/test/human_presence_internals_browsertest.js
@@ -16,7 +16,7 @@
 //
 // js2gtest fixtures require var here (https://crbug.com/1033337).
 // eslint-disable-next-line no-var
-var HpsInternalsUIBrowserTest = class extends testing.Test {
+var HumanPresenceInternalsUIBrowserTest = class extends testing.Test {
   /** @override */
   get browsePreload() {
     return HOST_ORIGIN;
@@ -30,39 +30,41 @@
   /** @override */
   testGenPreamble() {
     GEN(`
-        chromeos::HpsDBusClient::InitializeFake();
-        chromeos::FakeHpsDBusClient::Get()->Reset();
-        chromeos::FakeHpsDBusClient::Get()->set_hps_service_is_available(true);
-        chromeos::FakeHpsDBusClient::Get()->set_hps_sense_result(
+        chromeos::HumanPresenceDBusClient::InitializeFake();
+        chromeos::FakeHumanPresenceDBusClient::Get()->Reset();
+        chromeos::FakeHumanPresenceDBusClient::Get()->
+            set_hps_service_is_available(true);
+        chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_sense_result(
             hps::HpsResult::POSITIVE);
-        chromeos::FakeHpsDBusClient::Get()->set_hps_notify_result(
+        chromeos::FakeHumanPresenceDBusClient::Get()->set_hps_notify_result(
             hps::HpsResult::NEGATIVE);`);
   }
 };
 
 // Tests that chrome://hps-internals loads successfully.
-TEST_F('HpsInternalsUIBrowserTest', 'HasChromeSchemeURL', async () => {
-  assertEquals(document.location.origin, HOST_ORIGIN);
-  testDone();
-});
+TEST_F(
+    'HumanPresenceInternalsUIBrowserTest', 'HasChromeSchemeURL', async () => {
+      assertEquals(document.location.origin, HOST_ORIGIN);
+      testDone();
+    });
 
 // Tests that the UI reflects the state of HPS.
-TEST_F('HpsInternalsUIBrowserTest', 'StateSynchronized', async () => {
-  document.querySelector('#root')
-      .addEventListener('state-updated-for-test', () => {
-    const senseState = document.querySelector('#sense-state').textContent;
-    const notifyState = document.querySelector('#notify-state').textContent;
-    // Wait until both features become enabled.
-    if (senseState === 'disabled' || notifyState === 'disabled')
-      return;
-    assertEquals(senseState, 'positive');
-    assertEquals(notifyState, 'negative');
-    assertTrue(document.querySelector('#enable-sense').disabled);
-    assertTrue(document.querySelector('#enable-notify').disabled);
-    assertFalse(document.querySelector('#disable-sense').disabled);
-    assertFalse(document.querySelector('#disable-notify').disabled);
-    testDone();
-  });
+TEST_F('HumanPresenceInternalsUIBrowserTest', 'StateSynchronized', async () => {
+  document.querySelector('#root').addEventListener(
+      'state-updated-for-test', () => {
+        const senseState = document.querySelector('#sense-state').textContent;
+        const notifyState = document.querySelector('#notify-state').textContent;
+        // Wait until both features become enabled.
+        if (senseState === 'disabled' || notifyState === 'disabled')
+          return;
+        assertEquals(senseState, 'positive');
+        assertEquals(notifyState, 'negative');
+        assertTrue(document.querySelector('#enable-sense').disabled);
+        assertTrue(document.querySelector('#enable-notify').disabled);
+        assertFalse(document.querySelector('#disable-sense').disabled);
+        assertFalse(document.querySelector('#disable-notify').disabled);
+        testDone();
+      });
   // Enable a feature to trigger the UI state to update.
   document.querySelector('#enable-notify').click();
 });
diff --git a/chromeos/dbus/cicerone/fake_cicerone_client.h b/chromeos/dbus/cicerone/fake_cicerone_client.h
index c0815b86..1f6d1e5 100644
--- a/chromeos/dbus/cicerone/fake_cicerone_client.h
+++ b/chromeos/dbus/cicerone/fake_cicerone_client.h
@@ -515,4 +515,9 @@
 
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash {
+using ::chromeos::FakeCiceroneClient;
+}
+
 #endif  // CHROMEOS_DBUS_CICERONE_FAKE_CICERONE_CLIENT_H_
diff --git a/chromeos/dbus/cros_disks/cros_disks_client.cc b/chromeos/dbus/cros_disks/cros_disks_client.cc
index 0300bf19..f68c484 100644
--- a/chromeos/dbus/cros_disks/cros_disks_client.cc
+++ b/chromeos/dbus/cros_disks/cros_disks_client.cc
@@ -121,6 +121,10 @@
       return MOUNT_ERROR_UNKNOWN;
     case cros_disks::MOUNT_ERROR_NEED_PASSWORD:
       return MOUNT_ERROR_NEED_PASSWORD;
+    case cros_disks::MOUNT_ERROR_IN_PROGRESS:
+      return MOUNT_ERROR_IN_PROGRESS;
+    case cros_disks::MOUNT_ERROR_CANCELLED:
+      return MOUNT_ERROR_CANCELLED;
     default:
       LOG(ERROR) << "Unrecognised mount error code " << mount_error;
       return MOUNT_ERROR_UNKNOWN;
diff --git a/chromeos/dbus/cros_disks/cros_disks_client.h b/chromeos/dbus/cros_disks/cros_disks_client.h
index 6847a8e..0844aad8 100644
--- a/chromeos/dbus/cros_disks/cros_disks_client.h
+++ b/chromeos/dbus/cros_disks/cros_disks_client.h
@@ -54,24 +54,26 @@
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 enum MountError {
-  MOUNT_ERROR_NONE,
-  MOUNT_ERROR_UNKNOWN,
-  MOUNT_ERROR_INTERNAL,
-  MOUNT_ERROR_INVALID_ARGUMENT,
-  MOUNT_ERROR_INVALID_PATH,
-  MOUNT_ERROR_PATH_ALREADY_MOUNTED,
-  MOUNT_ERROR_PATH_NOT_MOUNTED,
-  MOUNT_ERROR_DIRECTORY_CREATION_FAILED,
-  MOUNT_ERROR_INVALID_MOUNT_OPTIONS,
-  MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS,
-  MOUNT_ERROR_INSUFFICIENT_PERMISSIONS,
-  MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND,
-  MOUNT_ERROR_MOUNT_PROGRAM_FAILED,
-  MOUNT_ERROR_INVALID_DEVICE_PATH,
-  MOUNT_ERROR_UNKNOWN_FILESYSTEM,
-  MOUNT_ERROR_UNSUPPORTED_FILESYSTEM,
-  MOUNT_ERROR_INVALID_ARCHIVE,
-  MOUNT_ERROR_NEED_PASSWORD,
+  MOUNT_ERROR_NONE = 0,
+  MOUNT_ERROR_UNKNOWN = 1,
+  MOUNT_ERROR_INTERNAL = 2,
+  MOUNT_ERROR_INVALID_ARGUMENT = 3,
+  MOUNT_ERROR_INVALID_PATH = 4,
+  MOUNT_ERROR_PATH_ALREADY_MOUNTED = 5,
+  MOUNT_ERROR_PATH_NOT_MOUNTED = 6,
+  MOUNT_ERROR_DIRECTORY_CREATION_FAILED = 7,
+  MOUNT_ERROR_INVALID_MOUNT_OPTIONS = 8,
+  MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS = 9,
+  MOUNT_ERROR_INSUFFICIENT_PERMISSIONS = 10,
+  MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND = 11,
+  MOUNT_ERROR_MOUNT_PROGRAM_FAILED = 12,
+  MOUNT_ERROR_INVALID_DEVICE_PATH = 13,
+  MOUNT_ERROR_UNKNOWN_FILESYSTEM = 14,
+  MOUNT_ERROR_UNSUPPORTED_FILESYSTEM = 15,
+  MOUNT_ERROR_INVALID_ARCHIVE = 16,
+  MOUNT_ERROR_NEED_PASSWORD = 17,
+  MOUNT_ERROR_IN_PROGRESS = 18,
+  MOUNT_ERROR_CANCELLED = 19,
   MOUNT_ERROR_COUNT,
 };
 
diff --git a/chromeos/dbus/human_presence/fake_human_presence_dbus_client.cc b/chromeos/dbus/human_presence/fake_human_presence_dbus_client.cc
index e06288b..2ace00d7 100644
--- a/chromeos/dbus/human_presence/fake_human_presence_dbus_client.cc
+++ b/chromeos/dbus/human_presence/fake_human_presence_dbus_client.cc
@@ -13,82 +13,84 @@
 
 namespace {
 
-FakeHpsDBusClient* g_fake_instance = nullptr;
+FakeHumanPresenceDBusClient* g_fake_instance = nullptr;
 
 }  // namespace
 
 // static
-FakeHpsDBusClient* FakeHpsDBusClient::Get() {
+FakeHumanPresenceDBusClient* FakeHumanPresenceDBusClient::Get() {
   return g_fake_instance;
 }
 
-FakeHpsDBusClient::FakeHpsDBusClient() {
+FakeHumanPresenceDBusClient::FakeHumanPresenceDBusClient() {
   DCHECK(!g_fake_instance);
   g_fake_instance = this;
 }
 
-FakeHpsDBusClient::~FakeHpsDBusClient() {
+FakeHumanPresenceDBusClient::~FakeHumanPresenceDBusClient() {
   DCHECK_EQ(this, g_fake_instance);
   g_fake_instance = nullptr;
 }
 
-void FakeHpsDBusClient::AddObserver(Observer* observer) {
+void FakeHumanPresenceDBusClient::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
 
-void FakeHpsDBusClient::RemoveObserver(Observer* observer) {
+void FakeHumanPresenceDBusClient::RemoveObserver(Observer* observer) {
   observers_.RemoveObserver(observer);
 }
 
-void FakeHpsDBusClient::GetResultHpsSense(GetResultCallback cb) {
+void FakeHumanPresenceDBusClient::GetResultHpsSense(GetResultCallback cb) {
   ++hps_sense_count_;
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(cb), hps_sense_result_));
 }
 
-void FakeHpsDBusClient::GetResultHpsNotify(GetResultCallback cb) {
+void FakeHumanPresenceDBusClient::GetResultHpsNotify(GetResultCallback cb) {
   ++hps_notify_count_;
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(cb), hps_notify_result_));
 }
 
-void FakeHpsDBusClient::EnableHpsSense(const hps::FeatureConfig& config) {
+void FakeHumanPresenceDBusClient::EnableHpsSense(
+    const hps::FeatureConfig& config) {
   ++enable_hps_sense_count_;
 }
 
-void FakeHpsDBusClient::DisableHpsSense() {
+void FakeHumanPresenceDBusClient::DisableHpsSense() {
   ++disable_hps_sense_count_;
 }
 
-void FakeHpsDBusClient::EnableHpsNotify(const hps::FeatureConfig& config) {
+void FakeHumanPresenceDBusClient::EnableHpsNotify(
+    const hps::FeatureConfig& config) {
   ++enable_hps_notify_count_;
 }
 
-void FakeHpsDBusClient::DisableHpsNotify() {
+void FakeHumanPresenceDBusClient::DisableHpsNotify() {
   ++disable_hps_notify_count_;
 }
 
-void FakeHpsDBusClient::WaitForServiceToBeAvailable(
+void FakeHumanPresenceDBusClient::WaitForServiceToBeAvailable(
     dbus::ObjectProxy::WaitForServiceToBeAvailableCallback cb) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE, base::BindOnce(std::move(cb), hps_service_is_available_));
 }
 
-void FakeHpsDBusClient::Restart() {
+void FakeHumanPresenceDBusClient::Restart() {
   for (auto& observer : observers_) {
     observer.OnRestart();
   }
 }
 
-void FakeHpsDBusClient::Shutdown() {
+void FakeHumanPresenceDBusClient::Shutdown() {
   for (auto& observer : observers_) {
     observer.OnShutdown();
   }
 }
 
-void FakeHpsDBusClient::Reset() {
+void FakeHumanPresenceDBusClient::Reset() {
   hps_notify_result_.reset();
   hps_notify_count_ = 0;
   enable_hps_notify_count_ = 0;
diff --git a/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h b/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h
index db99f882..712bbd3 100644
--- a/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h
+++ b/chromeos/dbus/human_presence/fake_human_presence_dbus_client.h
@@ -11,20 +11,22 @@
 
 namespace chromeos {
 
-// Fake implementation of HpsDBusClient. Allows callers to set a response value
-// and count the number of calls to GetResultHpsNotify.
-class COMPONENT_EXPORT(HPS) FakeHpsDBusClient : public HpsDBusClient {
+// Fake implementation of HumanPresenceDBusClient. Allows callers to set a
+// response value and count the number of calls to GetResultHpsNotify.
+class COMPONENT_EXPORT(HPS) FakeHumanPresenceDBusClient
+    : public HumanPresenceDBusClient {
  public:
-  FakeHpsDBusClient();
-  ~FakeHpsDBusClient() override;
+  FakeHumanPresenceDBusClient();
+  ~FakeHumanPresenceDBusClient() override;
 
-  FakeHpsDBusClient(const FakeHpsDBusClient&) = delete;
-  FakeHpsDBusClient& operator=(const FakeHpsDBusClient&) = delete;
+  FakeHumanPresenceDBusClient(const FakeHumanPresenceDBusClient&) = delete;
+  FakeHumanPresenceDBusClient& operator=(const FakeHumanPresenceDBusClient&) =
+      delete;
 
   // Returns the fake global instance if initialized. May return null.
-  static FakeHpsDBusClient* Get();
+  static FakeHumanPresenceDBusClient* Get();
 
-  // HpsDBusClient:
+  // HumanPresenceDBusClient:
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
   void GetResultHpsSense(GetResultCallback cb) override;
diff --git a/chromeos/dbus/human_presence/human_presence_dbus_client.cc b/chromeos/dbus/human_presence/human_presence_dbus_client.cc
index b225ecf..af39ac2 100644
--- a/chromeos/dbus/human_presence/human_presence_dbus_client.cc
+++ b/chromeos/dbus/human_presence/human_presence_dbus_client.cc
@@ -22,7 +22,7 @@
 
 namespace {
 
-HpsDBusClient* g_instance = nullptr;
+HumanPresenceDBusClient* g_instance = nullptr;
 
 // Extracts result data out of a DBus response.
 absl::optional<hps::HpsResult> UnwrapHpsResult(dbus::Response* response) {
@@ -40,37 +40,42 @@
   return result.value();
 }
 
-class HpsDBusClientImpl : public HpsDBusClient {
+class HumanPresenceDBusClientImpl : public HumanPresenceDBusClient {
  public:
-  explicit HpsDBusClientImpl(dbus::Bus* bus)
-      : hps_proxy_(bus->GetObjectProxy(hps::kHpsServiceName,
-                                       dbus::ObjectPath(hps::kHpsServicePath))),
+  explicit HumanPresenceDBusClientImpl(dbus::Bus* bus)
+      : human_presence_proxy_(
+            bus->GetObjectProxy(hps::kHpsServiceName,
+                                dbus::ObjectPath(hps::kHpsServicePath))),
         weak_ptr_factory_(this) {
-    // Connect to HpsSenseChanged signal.
-    hps_proxy_->ConnectToSignal(
+    // Connect to lock-on-leave changed signal.
+    human_presence_proxy_->ConnectToSignal(
         hps::kHpsServiceInterface, hps::kHpsSenseChanged,
-        base::BindRepeating(&HpsDBusClientImpl::HpsSenseChangedReceived,
-                            weak_ptr_factory_.GetWeakPtr()),
-        base::BindOnce(&HpsDBusClientImpl::HpsSenseChangedConnected,
+        base::BindRepeating(
+            &HumanPresenceDBusClientImpl::HpsSenseChangedReceived,
+            weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&HumanPresenceDBusClientImpl::HpsSenseChangedConnected,
                        weak_ptr_factory_.GetWeakPtr()));
 
-    // Connect to HpsNotifyChanged signal.
-    hps_proxy_->ConnectToSignal(
+    // Connect to snooping protection changed signal.
+    human_presence_proxy_->ConnectToSignal(
         hps::kHpsServiceInterface, hps::kHpsNotifyChanged,
-        base::BindRepeating(&HpsDBusClientImpl::HpsNotifyChangedReceived,
-                            weak_ptr_factory_.GetWeakPtr()),
-        base::BindOnce(&HpsDBusClientImpl::HpsNotifyChangedConnected,
+        base::BindRepeating(
+            &HumanPresenceDBusClientImpl::HpsNotifyChangedReceived,
+            weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&HumanPresenceDBusClientImpl::HpsNotifyChangedConnected,
                        weak_ptr_factory_.GetWeakPtr()));
 
     // Monitor daemon restarts.
-    hps_proxy_->SetNameOwnerChangedCallback(base::BindRepeating(
-        &HpsDBusClientImpl::NameOwnerChanged, weak_ptr_factory_.GetWeakPtr()));
+    human_presence_proxy_->SetNameOwnerChangedCallback(
+        base::BindRepeating(&HumanPresenceDBusClientImpl::NameOwnerChanged,
+                            weak_ptr_factory_.GetWeakPtr()));
   }
 
-  ~HpsDBusClientImpl() override = default;
+  ~HumanPresenceDBusClientImpl() override = default;
 
-  HpsDBusClientImpl(const HpsDBusClientImpl&) = delete;
-  HpsDBusClientImpl& operator=(const HpsDBusClientImpl&) = delete;
+  HumanPresenceDBusClientImpl(const HumanPresenceDBusClientImpl&) = delete;
+  HumanPresenceDBusClientImpl& operator=(const HumanPresenceDBusClientImpl&) =
+      delete;
 
   // Called when user presence signal is received.
   void HpsSenseChangedReceived(dbus::Signal* signal) {
@@ -127,12 +132,12 @@
     LOG_IF(ERROR, !success) << "Failed to connect to HpsNotifyChanged signal.";
   }
 
-  // HpsDBusClient:
+  // HumanPresenceDBusClient:
   void GetResultHpsSense(GetResultCallback cb) override {
     dbus::MethodCall method_call(hps::kHpsServiceInterface,
                                  hps::kGetResultHpsSense);
     dbus::MessageWriter writer(&method_call);
-    hps_proxy_->CallMethod(
+    human_presence_proxy_->CallMethod(
         &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
         base::BindOnce(&UnwrapHpsResult).Then(std::move(cb)));
   }
@@ -141,7 +146,7 @@
     dbus::MethodCall method_call(hps::kHpsServiceInterface,
                                  hps::kGetResultHpsNotify);
     dbus::MessageWriter writer(&method_call);
-    hps_proxy_->CallMethod(
+    human_presence_proxy_->CallMethod(
         &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
         base::BindOnce(&UnwrapHpsResult).Then(std::move(cb)));
   }
@@ -155,92 +160,96 @@
   }
 
   void EnableHpsSense(const hps::FeatureConfig& config) override {
-    EnableHpsFeature(hps::kEnableHpsSense, config);
+    EnableHumanPresenceFeature(hps::kEnableHpsSense, config);
   }
 
-  void DisableHpsSense() override { DisableHpsFeature(hps::kDisableHpsSense); }
+  void DisableHpsSense() override {
+    DisableHumanPresenceFeature(hps::kDisableHpsSense);
+  }
 
   void EnableHpsNotify(const hps::FeatureConfig& config) override {
-    EnableHpsFeature(hps::kEnableHpsNotify, config);
+    EnableHumanPresenceFeature(hps::kEnableHpsNotify, config);
   }
 
   void DisableHpsNotify() override {
-    DisableHpsFeature(hps::kDisableHpsNotify);
+    DisableHumanPresenceFeature(hps::kDisableHpsNotify);
   }
 
   void WaitForServiceToBeAvailable(
       dbus::ObjectProxy::WaitForServiceToBeAvailableCallback callback)
       override {
-    hps_proxy_->WaitForServiceToBeAvailable(std::move(callback));
+    human_presence_proxy_->WaitForServiceToBeAvailable(std::move(callback));
   }
 
  private:
-  // Send a method call to HpsDBus with given method name and config.
-  void EnableHpsFeature(const std::string& method_name,
-                        const hps::FeatureConfig& config) {
+  // Send a method call to the human presence service with given method name and
+  // config.
+  void EnableHumanPresenceFeature(const std::string& method_name,
+                                  const hps::FeatureConfig& config) {
     dbus::MethodCall method_call(hps::kHpsServiceInterface, method_name);
     dbus::MessageWriter writer(&method_call);
 
     if (!writer.AppendProtoAsArrayOfBytes(config)) {
       LOG(ERROR) << "Failed to encode protobuf for " << method_name;
     } else {
-      hps_proxy_->CallMethod(&method_call,
-                             dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
-                             base::DoNothing());
+      human_presence_proxy_->CallMethod(&method_call,
+                                        dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+                                        base::DoNothing());
     }
   }
 
   // Send a method call to HpsDBus with given method name.
-  void DisableHpsFeature(const std::string& method_name) {
+  void DisableHumanPresenceFeature(const std::string& method_name) {
     dbus::MethodCall method_call(hps::kHpsServiceInterface, method_name);
-    hps_proxy_->CallMethod(&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
-                           base::DoNothing());
+    human_presence_proxy_->CallMethod(&method_call,
+                                      dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+                                      base::DoNothing());
   }
 
-  dbus::ObjectProxy* const hps_proxy_;
+  dbus::ObjectProxy* const human_presence_proxy_;
 
   base::ObserverList<Observer> observers_;
 
   // Must be last class member.
-  base::WeakPtrFactory<HpsDBusClientImpl> weak_ptr_factory_{this};
+  base::WeakPtrFactory<HumanPresenceDBusClientImpl> weak_ptr_factory_{this};
 };
 
 }  // namespace
 
-HpsDBusClient::Observer::~Observer() = default;
+HumanPresenceDBusClient::Observer::~Observer() = default;
 
-HpsDBusClient::HpsDBusClient() {
+HumanPresenceDBusClient::HumanPresenceDBusClient() {
   DCHECK_EQ(g_instance, nullptr);
   g_instance = this;
 }
 
-HpsDBusClient::~HpsDBusClient() {
+HumanPresenceDBusClient::~HumanPresenceDBusClient() {
   DCHECK_EQ(g_instance, this);
   g_instance = nullptr;
 }
 
 // static
-void HpsDBusClient::Initialize(dbus::Bus* bus) {
+void HumanPresenceDBusClient::Initialize(dbus::Bus* bus) {
   DCHECK_NE(bus, nullptr);
-  new HpsDBusClientImpl(bus);
+  new HumanPresenceDBusClientImpl(bus);
 }
 
 // static
-void HpsDBusClient::InitializeFake() {
+void HumanPresenceDBusClient::InitializeFake() {
   // Do not create a new fake if it was initialized early in a test, to allow
   // the test to set its own client.
-  if (!FakeHpsDBusClient::Get())
-    new FakeHpsDBusClient();
+  if (!FakeHumanPresenceDBusClient::Get())
+    new FakeHumanPresenceDBusClient();
 }
 
 // static
-void HpsDBusClient::Shutdown() {
+void HumanPresenceDBusClient::Shutdown() {
   DCHECK_NE(g_instance, nullptr);
   delete g_instance;
 }
 
 // static
-HpsDBusClient* HpsDBusClient::Get() {
+HumanPresenceDBusClient* HumanPresenceDBusClient::Get() {
   return g_instance;
 }
 
diff --git a/chromeos/dbus/human_presence/human_presence_dbus_client.h b/chromeos/dbus/human_presence/human_presence_dbus_client.h
index b1e0535..d3b497c 100644
--- a/chromeos/dbus/human_presence/human_presence_dbus_client.h
+++ b/chromeos/dbus/human_presence/human_presence_dbus_client.h
@@ -18,14 +18,12 @@
 
 namespace chromeos {
 
-// D-Bus client for ambient presence sensing. Communicates with the Chrome OS
+// D-Bus client for human presence sensing. Communicates with the Chrome OS
 // presence daemon to allow for features that depend on user presence.
 //
 // Use of this API is restricted by policy. Consult
 // go/cros-pdd#bookmark=id.7emuxnhxv638 and Chrome OS Privacy before using.
-//
-// TODO(crbug/1241706): clarify naming.
-class COMPONENT_EXPORT(HPS) HpsDBusClient {
+class COMPONENT_EXPORT(HPS) HumanPresenceDBusClient {
  public:
   class Observer : public base::CheckedObserver {
    public:
@@ -48,29 +46,29 @@
   using GetResultCallback =
       base::OnceCallback<void(absl::optional<hps::HpsResult>)>;
 
-  HpsDBusClient(const HpsDBusClient&) = delete;
-  HpsDBusClient& operator=(const HpsDBusClient&) = delete;
+  HumanPresenceDBusClient(const HumanPresenceDBusClient&) = delete;
+  HumanPresenceDBusClient& operator=(const HumanPresenceDBusClient&) = delete;
 
-  // Registers the given observer to receive HPS signals.
+  // Registers the given observer to receive human presence signals.
   virtual void AddObserver(Observer* observer) = 0;
   // Deregisters the given observer.
   virtual void RemoveObserver(Observer* observer) = 0;
 
   // D-Bus methods.
-  // Polls the HPS sense state.
+  // Polls the lock-on-leave state.
   virtual void GetResultHpsSense(GetResultCallback cb) = 0;
-  // Polls the HPS notify state.
+  // Polls the snooping protection state.
   virtual void GetResultHpsNotify(GetResultCallback cb) = 0;
-  // Enables HpsSense in HpsService.
+  // Enables lock-on-leave in the service.
   virtual void EnableHpsSense(const hps::FeatureConfig& config) = 0;
-  // Disables HpsSense in HpsService.
+  // Disables lock-on-leave in the service.
   virtual void DisableHpsSense() = 0;
-  // Enables HpsNotify in HpsService.
+  // Enables snooping protection in the service.
   virtual void EnableHpsNotify(const hps::FeatureConfig& config) = 0;
-  // Disables HpsNotify in HpsService.
+  // Disables snooping protection in the service.
   virtual void DisableHpsNotify() = 0;
 
-  // Registers |callback| to run when the HpsService becomes available.
+  // Registers |callback| to run when the presence service becomes available.
   // If the service is already available, or if connecting to the name-owner-
   // changed signal fails, |callback| will be run once asynchronously.
   // Otherwise, |callback| will be run once in the future after the service
@@ -85,12 +83,12 @@
   // Destroys the global instance.
   static void Shutdown();
   // Returns the global instance which may be null if not initialized.
-  static HpsDBusClient* Get();
+  static HumanPresenceDBusClient* Get();
 
  protected:
   // Initialize/Shutdown should be used instead.
-  HpsDBusClient();
-  virtual ~HpsDBusClient();
+  HumanPresenceDBusClient();
+  virtual ~HumanPresenceDBusClient();
 };
 
 }  // namespace chromeos
diff --git a/chromeos/ime/DIR_METADATA b/chromeos/ime/DIR_METADATA
index 1ae4c22..caac77f 100644
--- a/chromeos/ime/DIR_METADATA
+++ b/chromeos/ime/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/chromeos/printing/OWNERS b/chromeos/printing/OWNERS
index bc2301e..3cbee45 100644
--- a/chromeos/printing/OWNERS
+++ b/chromeos/printing/OWNERS
@@ -1,5 +1,4 @@
 # Primary OWNERS
-batrapranav@chromium.org
 kdlee@chromium.org
 pawliczek@chromium.org
 skau@chromium.org
diff --git a/chromeos/resources/human_presence_resources.grdp b/chromeos/resources/human_presence_resources.grdp
index 71ea207..88679041 100644
--- a/chromeos/resources/human_presence_resources.grdp
+++ b/chromeos/resources/human_presence_resources.grdp
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <grit-part>
-  <include name="IDR_HPS_INTERNALS_HTML" file="../components/human_presence/resources/human_presence_internals.html" type="BINDATA" />
-  <include name="IDR_HPS_INTERNALS_CSS" file="../components/human_presence/resources/human_presence_internals.css" type="BINDATA" />
-  <include name="IDR_HPS_INTERNALS_ICON" file="../components/human_presence/resources/human_presence_internals_icon.svg" type="BINDATA" />
-  <include name="IDR_HPS_INTERNALS_JS"
+  <include name="IDR_HUMAN_PRESENCE_INTERNALS_HTML" file="../components/human_presence/resources/human_presence_internals.html" type="BINDATA" />
+  <include name="IDR_HUMAN_PRESENCE_INTERNALS_CSS" file="../components/human_presence/resources/human_presence_internals.css" type="BINDATA" />
+  <include name="IDR_HUMAN_PRESENCE_INTERNALS_ICON" file="../components/human_presence/resources/human_presence_internals_icon.svg" type="BINDATA" />
+  <include name="IDR_HUMAN_PRESENCE_INTERNALS_JS"
       file="${root_gen_dir}/chromeos/components/human_presence/resources/human_presence_internals.js"
       resource_path="chromeos/components/human_presence/resources/human_presence_internals.js"
       use_base_dir="false"
diff --git a/chromeos/services/cros_healthd/private/cpp/BUILD.gn b/chromeos/services/cros_healthd/private/cpp/BUILD.gn
index 9bf28ee5..7d6b85df 100644
--- a/chromeos/services/cros_healthd/private/cpp/BUILD.gn
+++ b/chromeos/services/cros_healthd/private/cpp/BUILD.gn
@@ -8,6 +8,8 @@
 
 source_set("cpp") {
   sources = [
+    "data_collector.cc",
+    "data_collector.h",
     "internal_service_factory.cc",
     "internal_service_factory.h",
     "internal_service_factory_impl.cc",
@@ -22,7 +24,10 @@
 
 source_set("unit_tests") {
   testonly = true
-  sources = [ "internal_service_factory_impl_unittest.cc" ]
+  sources = [
+    "data_collector_unittest.cc",
+    "internal_service_factory_impl_unittest.cc",
+  ]
   deps = [
     ":cpp",
     "//base/test:test_support",
diff --git a/chromeos/services/cros_healthd/private/cpp/data_collector.cc b/chromeos/services/cros_healthd/private/cpp/data_collector.cc
new file mode 100644
index 0000000..c5bc0b1
--- /dev/null
+++ b/chromeos/services/cros_healthd/private/cpp/data_collector.cc
@@ -0,0 +1,126 @@
+// Copyright 2022 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 "chromeos/services/cros_healthd/private/cpp/data_collector.h"
+
+#include "base/check_op.h"
+#include "base/no_destructor.h"
+#include "base/notreached.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+
+namespace chromeos {
+namespace cros_healthd {
+namespace internal {
+namespace {
+
+class DataCollectorDelegateImpl : public DataCollector::Delegate {
+ public:
+  DataCollectorDelegateImpl();
+  DataCollectorDelegateImpl(const DataCollectorDelegateImpl&) = delete;
+  DataCollectorDelegateImpl& operator=(const DataCollectorDelegateImpl&) =
+      delete;
+
+ private:
+  ~DataCollectorDelegateImpl() override;
+
+  // DataCollector::Delegate override.
+  std::string GetTouchpadLibraryName() override;
+};
+
+DataCollectorDelegateImpl::DataCollectorDelegateImpl() = default;
+
+DataCollectorDelegateImpl::~DataCollectorDelegateImpl() = default;
+
+std::string DataCollectorDelegateImpl::GetTouchpadLibraryName() {
+  NOTIMPLEMENTED();
+  return "";
+}
+
+DataCollectorDelegateImpl* GetDataCollectorDelegate() {
+  static base::NoDestructor<DataCollectorDelegateImpl> delegate;
+  return delegate.get();
+}
+
+class DataCollectorImpl : public DataCollector,
+                          public mojom::ChromiumDataCollector {
+ public:
+  explicit DataCollectorImpl(Delegate* delegate);
+  DataCollectorImpl(const DataCollectorImpl&) = delete;
+  DataCollectorImpl& operator=(const DataCollectorImpl&) = delete;
+  ~DataCollectorImpl() override;
+
+  // DataCollector overrides.
+  void BindReceiver(
+      mojo::PendingReceiver<mojom::ChromiumDataCollector> receiver) override;
+
+ private:
+  // mojom::ChromiumDataCollector overrides.
+  void GetTouchscreenDevices(GetTouchscreenDevicesCallback callback) override;
+  void GetTouchpadLibraryName(GetTouchpadLibraryNameCallback callback) override;
+
+  // Pointer to the delegate.
+  Delegate* const delegate_;
+  // The receiver set to keep the mojo receivers.
+  mojo::ReceiverSet<mojom::ChromiumDataCollector> receiver_set_;
+};
+
+DataCollectorImpl::DataCollectorImpl(Delegate* delegate)
+    : delegate_(delegate) {}
+
+DataCollectorImpl::~DataCollectorImpl() = default;
+
+void DataCollectorImpl::BindReceiver(
+    mojo::PendingReceiver<mojom::ChromiumDataCollector> receiver) {
+  receiver_set_.Add(this, std::move(receiver));
+}
+
+void DataCollectorImpl::GetTouchscreenDevices(
+    GetTouchscreenDevicesCallback callback) {
+  NOTIMPLEMENTED();
+}
+
+void DataCollectorImpl::GetTouchpadLibraryName(
+    GetTouchpadLibraryNameCallback callback) {
+  std::move(callback).Run(delegate_->GetTouchpadLibraryName());
+}
+
+// The pointer to the global instance.
+DataCollector* g_instance = nullptr;
+
+};  // namespace
+
+DataCollector::DataCollector() {
+  CHECK(!g_instance) << "Can have only one instance";
+  g_instance = this;
+}
+
+DataCollector::~DataCollector() {
+  CHECK_EQ(g_instance, this);
+  g_instance = nullptr;
+}
+
+// static
+void DataCollector::Initialize() {
+  new DataCollectorImpl(GetDataCollectorDelegate());
+}
+
+// static
+void DataCollector::InitializeWithDelegateForTesting(Delegate* delegate) {
+  new DataCollectorImpl(delegate);
+}
+
+// static
+void DataCollector::Shutdown() {
+  delete g_instance;
+}
+
+// static
+DataCollector* DataCollector::Get() {
+  CHECK(g_instance) << "Not initialized.";
+  return g_instance;
+}
+
+}  // namespace internal
+}  // namespace cros_healthd
+}  // namespace chromeos
diff --git a/chromeos/services/cros_healthd/private/cpp/data_collector.h b/chromeos/services/cros_healthd/private/cpp/data_collector.h
new file mode 100644
index 0000000..752939c
--- /dev/null
+++ b/chromeos/services/cros_healthd/private/cpp/data_collector.h
@@ -0,0 +1,64 @@
+// Copyright 2022 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_SERVICES_CROS_HEALTHD_PRIVATE_CPP_DATA_COLLECTOR_H_
+#define CHROMEOS_SERVICES_CROS_HEALTHD_PRIVATE_CPP_DATA_COLLECTOR_H_
+
+#include "chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+
+namespace chromeos {
+namespace cros_healthd {
+namespace internal {
+
+class DataCollector {
+ public:
+  // Delegate class to be replaced for testing.
+  class Delegate {
+   public:
+    Delegate() = default;
+    virtual ~Delegate() = default;
+
+    // Get the touchpad library name.
+    virtual std::string GetTouchpadLibraryName() = 0;
+  };
+
+  DataCollector(const DataCollector&) = delete;
+  DataCollector& operator=(const DataCollector&) = delete;
+
+  // Initialize a global instance.
+  static void Initialize();
+
+  // Initialize a global instance with delegate for testing.
+  static void InitializeWithDelegateForTesting(Delegate* delegate);
+
+  // Shutdown the global instance.
+  static void Shutdown();
+
+  // Returns the global instance. Check failed if this is not initialized.
+  static DataCollector* Get();
+
+  // Binds a mojo receiver to this.
+  virtual void BindReceiver(
+      mojo::PendingReceiver<mojom::ChromiumDataCollector> receiver) = 0;
+
+ protected:
+  DataCollector();
+  virtual ~DataCollector();
+};
+
+}  // namespace internal
+}  // namespace cros_healthd
+}  // namespace chromeos
+
+// TODO(https://crbug.com/1164001): remove when moved to ash.
+namespace ash {
+namespace cros_healthd {
+namespace internal {
+using ::chromeos::cros_healthd::internal::DataCollector;
+}
+}  // namespace cros_healthd
+}  // namespace ash
+
+#endif  // CHROMEOS_SERVICES_CROS_HEALTHD_PRIVATE_CPP_DATA_COLLECTOR_H_
diff --git a/chromeos/services/cros_healthd/private/cpp/data_collector_unittest.cc b/chromeos/services/cros_healthd/private/cpp/data_collector_unittest.cc
new file mode 100644
index 0000000..1feca3e
--- /dev/null
+++ b/chromeos/services/cros_healthd/private/cpp/data_collector_unittest.cc
@@ -0,0 +1,67 @@
+// Copyright 2022 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 "chromeos/services/cros_healthd/private/cpp/data_collector.h"
+
+#include "base/notreached.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace cros_healthd {
+namespace internal {
+namespace {
+
+constexpr char kFakeTouchpadLibraryName[] = "FakeTouchpadLibraryName";
+
+class FakeDataCollectorDelegate : public DataCollector::Delegate {
+ public:
+  FakeDataCollectorDelegate() = default;
+  ~FakeDataCollectorDelegate() override = default;
+
+  std::string GetTouchpadLibraryName() override {
+    return kFakeTouchpadLibraryName;
+  }
+};
+
+class DataCollectorTest : public testing::Test {
+ protected:
+  void SetUp() override {
+    DataCollector::InitializeWithDelegateForTesting(&delegate_);
+    DataCollector::Get()->BindReceiver(remote_.BindNewPipeAndPassReceiver());
+  }
+
+  void TearDown() override {
+    remote_.reset();
+    DataCollector::Shutdown();
+  }
+
+  // The test environment.
+  base::test::TaskEnvironment env_;
+  // The mojo remote to the data collector.
+  mojo::Remote<mojom::ChromiumDataCollector> remote_;
+  // The fake delegate for DataCollector.
+  FakeDataCollectorDelegate delegate_;
+};
+
+TEST_F(DataCollectorTest, GetTouchscreenDevices) {
+  NOTIMPLEMENTED();
+}
+
+TEST_F(DataCollectorTest, GetTouchpadLibraryName) {
+  base::RunLoop run_loop;
+  remote_->GetTouchpadLibraryName(
+      base::BindLambdaForTesting([&](const std::string& library_name) {
+        EXPECT_EQ(library_name, kFakeTouchpadLibraryName);
+        run_loop.Quit();
+      }));
+  run_loop.Run();
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace cros_healthd
+}  // namespace chromeos
diff --git a/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom b/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom
index 4b828f77..d41b04f 100644
--- a/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom
+++ b/chromeos/services/cros_healthd/private/mojom/cros_healthd_internal.mojom
@@ -48,3 +48,62 @@
   GetNetworkDiagnosticsRoutines@1(pending_receiver<
       chromeos.network_diagnostics.mojom.NetworkDiagnosticsRoutines> receiver);
 };
+
+// Collects data from chromium to Healthd.
+//
+// NextMinVersion: 1, NextIndex: 2
+interface ChromiumDataCollector {
+  // Get touchscreen devices info.
+  GetTouchscreenDevices@0() => (array<TouchscreenDevice> devices);
+  // Get the touchpad library name.
+  GetTouchpadLibraryName@1() => (string library_name);
+};
+
+// Data of a touch screen device in chromium.
+//
+// NextMinVersion: 1, NextIndex: 4
+struct TouchscreenDevice {
+  // The input device of this touchscreen.
+  InputDevice input_device@0;
+  // Number of touch points this device supports (0 if unknown).
+  int32 touch_points@1;
+  // True if the specified touchscreen device is stylus capable.
+  bool has_stylus@2;
+  // True if there is a garage/dock switch associated with the stylus.
+  bool has_stylus_garage_switch@3;
+};
+
+// Data of a input device in chromium.
+//
+// NextMinVersion: 1, NextIndex: 5
+struct InputDevice {
+  // Name of the device.
+  string name@0;
+
+  // The connection type of the input device.
+  [Extensible]
+  enum ConnectionType {
+    // For mojo backward compatibility.
+    [Default] kUnmappedEnumValue,
+    // Internally connected input device.
+    kInternal,
+    // Known externally connected usb input device.
+    kUSB,
+    // Known externally connected bluetooth input device.
+    kBluetooth,
+    // Device that may or may not be an external device.
+    kUnknown,
+  };
+
+  ConnectionType connection_type@1;
+  // The physical location(port) associated with the input device. This is
+  // (supposed to be) stable between reboots and hotplugs. However this may not
+  // always be set and will change when the device is connected via a different
+  // port.
+  string physical_location@2;
+  // If the device is enabled, and whether events should be dispatched to UI.
+  bool is_enabled@3;
+  // The path to the input device in the sysfs filesystem, this should be a path
+  // under /sys directory.
+  string sysfs_path@4;
+};
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
index 524ce92..495d67f 100644
--- a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
+++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
@@ -548,7 +548,7 @@
 
 // Information related to one of a device's Bluetooth adapters.
 //
-// NextMinVersion: 2, NextIndex: 9
+// NextMinVersion: 3, NextIndex: 11
 struct BluetoothAdapterInfo {
   // The name of the adapter.
   string name@0;
@@ -568,12 +568,16 @@
   [MinVersion=1] array<string>? uuids@7;
   // Local Device ID information.
   [MinVersion=1] string? modalias@8;
+  // List of allowed system devices.
+  [MinVersion=2] array<string>? service_allow_list@9;
+  // A dictionary of supported capabilities.
+  [MinVersion=2] SupportedCapabilities? supported_capabilities@10;
 };
 
 
 // Information related to one of a adapter's Bluetooth connected devices.
 //
-// NextMinVersion: 1, NextIndex: 8
+// NextMinVersion: 2, NextIndex: 9
 struct BluetoothDeviceInfo {
   // The MAC address of the device.
   string address@0;
@@ -591,6 +595,8 @@
   NullableUint16 mtu@6;
   // The list of the available remote services.
   array<string>? uuids@7;
+  // The battery percentage of the device.
+  [MinVersion=1] NullableUint8? battery_percentage@8;
 };
 
 // An enumeration of type in Bluetooth device info.
@@ -610,6 +616,20 @@
   kDual = 4,
 };
 
+// Supported Capabilities related information.
+//
+// NextMinVersion: 1, NextIndex: 4
+struct SupportedCapabilities {
+  // Max advertising data length.
+  uint8 max_adv_len@0;
+  // Max advertising scan response length.
+  uint8 max_scn_rsp_len@1;
+  // Min advertising tx power (dBm).
+  int16 min_tx_power@2;
+  // Max advertising tx power (dBm).
+  int16 max_tx_power@3;
+};
+
 // System probe result. Can either be populated with the SystemInfo or an error
 // retrieving the information.
 // DEPRECATED(b/188508561): Use SystemResultV2 instead.
diff --git a/chromeos/services/cros_healthd/public/mojom/nullable_primitives.mojom b/chromeos/services/cros_healthd/public/mojom/nullable_primitives.mojom
index ce96aea7d8..9e7d46d 100644
--- a/chromeos/services/cros_healthd/public/mojom/nullable_primitives.mojom
+++ b/chromeos/services/cros_healthd/public/mojom/nullable_primitives.mojom
@@ -13,6 +13,12 @@
 
 module chromeos.cros_healthd.mojom;
 
+// Optional uint8 field.
+struct NullableUint8 {
+  // The value of the uint8.
+  uint8 value;
+};
+
 // Optional int16 field.
 struct NullableInt16 {
   // The value of the int16.
diff --git a/chromeos/services/machine_learning/public/mojom/handwriting_recognizer.mojom b/chromeos/services/machine_learning/public/mojom/handwriting_recognizer.mojom
index 3e0a3d1..990581ed 100644
--- a/chromeos/services/machine_learning/public/mojom/handwriting_recognizer.mojom
+++ b/chromeos/services/machine_learning/public/mojom/handwriting_recognizer.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Next MinVersion: 2
+// Next MinVersion: 3
 
 // Datatypes and interfaces of handwriting recognition API.
 
@@ -139,7 +139,13 @@
   string language;
 
   // Path to the language pack to use (downloaded by Chrome via DLC).
+  // If unset, ml-service will try to find the model from rootfs.
   [MinVersion=1] string? language_pack_path;
+
+  // Path to already-installed handwriting recognition library (downloaded by
+  // chrome via DLC).
+  // If unset, ml-service will try to find the library from rootfs.
+  [MinVersion=2] string? library_dlc_path;
 };
 
 // The mojom interface for performing the recognition of handwritten text.
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb
index c576bc3..cbff930 100644
--- a/chromeos/strings/chromeos_strings_af.xtb
+++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Akkuraatheid van wisselpunt</translation>
 <translation id="2448312741937722512">Soort</translation>
 <translation id="2461822463642141190">Huidig</translation>
+<translation id="2480034874476596812">Skakel handmatig af</translation>
 <translation id="2491955442992294626">Sleutels word nie getoets wanneer jy ’n ander venster gebruik nie</translation>
 <translation id="2493126929778606526">Jou beste foto's, outomaties gekies</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Hoë traagheid na HTTPS-webwerwe</translation>
 <translation id="3621202678540785336">Invoer</translation>
 <translation id="3632579075709132555">Privaatheidskermwisselaar</translation>
+<translation id="3678765385266369662">Kies hoe jy Skryf-beskerming wil afskakel</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" />-toets</translation>
 <translation id="370665806235115550">Laai tans …</translation>
 <translation id="3708186454126126312">Voorheen gekoppel</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Jy het minstens 500 MB nodig om 'n geheuetoets uit te voer. Gaan na Instellings &gt; Bergingbestuur om spasie beskikbaar te maak.</translation>
 <translation id="4250229828105606438">Skermkiekie</translation>
 <translation id="4258281355379922695">HTTP-traagheid</translation>
+<translation id="4258561075226177474">Toestel gaan na dieselfde gebruiker. Vee gebruikerdata uit?</translation>
 <translation id="4271957103967917607">Bekyk volskerm</translation>
 <translation id="4275799948641988986">Wie sal die toestel gebruik nadat dit herstel is?</translation>
 <translation id="4289540628985791613">Oorsig</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Dateer op</translation>
 <translation id="4744944742468440486">Inligting wat met jou keuse verband hou</translation>
 <translation id="4773299976671772492">Gestop</translation>
+<translation id="4774530504324923332">Jy het ’n RSU-geaktiveerde sekuriteitsleutel, ’n QR-kodeskandeerder en ’n tweede toestel met ’n internetverbinding nodig</translation>
 <translation id="4782311465517282004">Kry definisies, vertalings of eenheidomskakelings wanneer jy regsklik of teks raak en hou</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> foto</translation>
 <translation id="4793710386569335688">Gaan na die <ph name="BEGIN_LINK" />Hulpsentrum<ph name="END_LINK" /> vir meer hulp.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Wi-fi-netwerk is nie veilig nie</translation>
 <translation id="5376354385557966694">Outomatiese ligmodus</translation>
 <translation id="537872351913703572">Toestel sal na ’n ander gebruiker of organisasie gaan</translation>
+<translation id="5395600419410242651">Vee alle data uit</translation>
 <translation id="5400907029458559844">Toestel koppel tans.</translation>
 <translation id="5401938042319910061">Laat loop alle roetines</translation>
 <translation id="5423849171846380976">Geaktiveer</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">USB-raakskerm</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> oor</translation>
 <translation id="7620771111601174153">Kom meer te wete in Hulpsentrum</translation>
+<translation id="7626501172915339021">Voer RMA-bedienerontsluiting (RSU) uit</translation>
 <translation id="763165478673169849">Laas teruggestel</translation>
 <translation id="7648838807254605802">Hoë HTTPS-traagheid</translation>
 <translation id="7656388927906093505">Toestel is 'n muis.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Gee hierdie navraag aan</translation>
 <translation id="9088306295921699330">Huidige gebruik</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Jy sal die toestel uitmekaar moet haal</translation>
+<translation id="9098156406873149060">Hou gebruikerdata</translation>
 <translation id="910415269708673980">Herlaai kaartjie vir <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Skandeer tans bladsy <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Ontsluit</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb
index aeadf70..aeb6ad5b 100644
--- a/chromeos/strings/chromeos_strings_am.xtb
+++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">የተንሳፋፊ ነጥብ ትክክለኛነት</translation>
 <translation id="2448312741937722512">አይነት</translation>
 <translation id="2461822463642141190">የአሁኑ ጊዜ</translation>
+<translation id="2480034874476596812">ራስዎ ያጥፉ</translation>
 <translation id="2491955442992294626">ሌላ መስኮት ሲጠቀሙ ቁልፎች አይሞከሩም</translation>
 <translation id="2493126929778606526">የእርስዎ ምርጥ ፎቶዎች፣ በራስ-ሰር የተመረጡ</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">ለኤችቲቲፒኤስ ድር ጣቢያዎች ከፍተኛ የስርዓተ ምላሽ ጊዜ</translation>
 <translation id="3621202678540785336">ግብዓት</translation>
 <translation id="3632579075709132555">የግላዊነት ማያ ገጽ መቀየሪያ</translation>
+<translation id="3678765385266369662">እንዴት የጻፍ ጥበቃን ማጥፋት እንደሚፈልጉ ይምረጡ</translation>
 <translation id="3689839747745352263">የ<ph name="TEST_NAME" /> ሙከራ</translation>
 <translation id="370665806235115550">በመጫን ላይ…</translation>
 <translation id="3708186454126126312">ከዚህ ቀደም የተገናኘ</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">የማህደረ ትውስታ ሙከራን ለማካሄድ ቢያንስ 500 ሜባ ነፃ ያስፈልገዎታል። ቦታን ለማስለቀቅ ወደ ቅንብሮች &gt; የማከማቻ አቀናባሪ ይሂዱ።</translation>
 <translation id="4250229828105606438">ቅጽበታዊ ገጽ እይታ</translation>
 <translation id="4258281355379922695">የኤችቲቲፒ የስርዓተ ምላሽ ጊዜ</translation>
+<translation id="4258561075226177474">መሣሪያው ወደ ተመሳሳዩ ተጠቃሚ ይሄዳል። የተጠቃሚ ውሂብ ይደምሰስ?</translation>
 <translation id="4271957103967917607">ሙሉ ማያ ገጽ ይመልከቱ</translation>
 <translation id="4275799948641988986">ከጥገና በኋላ መሳሪያውን ማን ይጠቀማል?</translation>
 <translation id="4289540628985791613">ማጠቃለያ</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">አዘምን</translation>
 <translation id="4744944742468440486">ከእርስዎ ምርጫ ጋር የተዛመደ መረጃ</translation>
 <translation id="4773299976671772492">ቆሟል</translation>
+<translation id="4774530504324923332">RSU የነቃላቸው የደህንነት ቁልፍ፣ የQR ኮድ መቃኛ እና ሁለተኛ የበይነመረብ ግንኙነት ያለው ሁለተኛ መሣሪያ ያስፈልገዎታል</translation>
 <translation id="4782311465517282004">ጽሑፍን በቀኝ ጠቅ ሲያደርጉ ወይም ነክተው ሲይዙ ፍቺዎችን፣ ትርጉሞችን ወይም የአሃድ ልወጣዎችን ያግኙ</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> ፎቶ</translation>
 <translation id="4793710386569335688">ለበለጠ እገዛ ወደ <ph name="BEGIN_LINK" />የእገዛ ማዕከል<ph name="END_LINK" /> ይሂዱ።</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">የWiFi አውታረ መረብ ደህንነት የተጠበቀ አይደለም</translation>
 <translation id="5376354385557966694">ራስሰር የብርሃን ሁነታ</translation>
 <translation id="537872351913703572">መሣሪያው ወደ ሌላ ተጠቃሚ ወይም ድርጅት ይሄዳል</translation>
+<translation id="5395600419410242651">ሁሉንም ውሂብ ደምስስ</translation>
 <translation id="5400907029458559844">መሣሪያው እየተገናኘ ነው።</translation>
 <translation id="5401938042319910061">ሁሉንም የዕለት ተዕለት ተግባራት አሂድ</translation>
 <translation id="5423849171846380976">ገብሯል</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">የዩኤስቢ መነካት የሚችል ማያ</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> ቀርቷል</translation>
 <translation id="7620771111601174153">በእገዛ ማዕከል ውስጥ የበለጠ ይረዱ</translation>
+<translation id="7626501172915339021">የአርኤምኤ አገልጋይ ማስከፈት (RSU) ያከናውኑ</translation>
 <translation id="763165478673169849">የመጨረሻ ዳግም ማስጀመሪያ ጊዜ</translation>
 <translation id="7648838807254605802">ከፍተኛ የHTTPS የስርዓተ ምላሽ ጊዜ</translation>
 <translation id="7656388927906093505">መሣሪያ መዳፊት ነው።</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">ይህንን መጠይቅ ሪፖርት ያድርጉ</translation>
 <translation id="9088306295921699330">የአሁኑ አጠቃቀም</translation>
 <translation id="9095775724867566971">PluginVm</translation>
+<translation id="90977145661420967">መሣሪያውን መከፋፈት ይኖርብዎታል</translation>
+<translation id="9098156406873149060">የተጠቃሚ ውሂብ ያቆዩት</translation>
 <translation id="910415269708673980">የ<ph name="PRINCIPAL_NAME" /> ቲኬትን ያድሱ</translation>
 <translation id="9106415115617144481">ገጽ <ph name="PAGE_NUMBER" />ን በመቃኘት ላይ</translation>
 <translation id="9111102763498581341">ክፈት</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index c45cca45..68328bc5 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">اختيار كلمة مرور جديدة فورًا</translation>
 <translation id="4891842000192098784">الإجهاد</translation>
 <translation id="4897058166682006107">مستوى شحن بطارية السماعة اليسرى هو %<ph name="BATTERY_PERCENTAGE" />.</translation>
+<translation id="4915052247106771211">‏يؤدي هذا الخيار إلى إعادة ضبط الجهاز على الإعدادات الأصلية (Powerwash).</translation>
 <translation id="4917385247580444890">قوية</translation>
 <translation id="4917889632206600977">توقّفت الطابعة - نفد الورق</translation>
 <translation id="4921665434385737356">تم شحن <ph name="RATE" /> خلال <ph name="NUM_SECONDS" /> ثانية.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">حدث خطأ. يُرجى اختيار خلفية مرة أخرى أو إعادة فتح التطبيق.</translation>
 <translation id="5372659122375744710">‏شبكة Wi-Fi غير آمنة.</translation>
 <translation id="5376354385557966694">الوضع الفاتح التلقائي</translation>
+<translation id="537872351913703572">سيتم نقل الجهاز إلى مستخدم آخر أو إلى مؤسسة أخرى.</translation>
 <translation id="5400907029458559844">جارٍ توصيل الجهاز</translation>
 <translation id="5401938042319910061">تشغيل جميع سلاسل الإجراءات</translation>
 <translation id="5423849171846380976">نشطة</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">التحديث إلى الإصدار <ph name="VERSION_NUMBER" /> ثم إعادة التشغيل</translation>
 <translation id="8675354002693747642">مفتاح المشاركة المسبقة</translation>
 <translation id="8677859815076891398">‏لا تتوفّر أيّ ألبومات. يمكنك إنشاء ألبوم في <ph name="LINK_BEGIN" />صور Google<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">سيتم نقل الجهاز إلى المستخدم نفسه.</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> يمكنك استخدام أزرار السهم المتجه لليمين أو السهم المتجه لليسار لإدارة هذه الميزة.</translation>
 <translation id="8712637175834984815">تم</translation>
 <translation id="871560550817059752">تعذَّرت الطباعة - نفد الحبر</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index d75d5e7..1e019e25 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">গাঢ় ৰঙৰ থীম অক্ষম কৰক</translation>
 <translation id="1807246157184219062">পাতল</translation>
 <translation id="1827738518074806965">আর্ট গেলাৰী</translation>
+<translation id="1840835860961531162">ৰাইট কৰিব নোৱৰাকৈ সুৰক্ষিত কৰাৰ সুবিধাটো অফ কৰক</translation>
 <translation id="1851218745569890714">ভিডিঅ’ কনফাৰেন্সিং</translation>
 <translation id="1852934301711881861">ChromeOS Flex ইনষ্টল কৰক</translation>
 <translation id="1856388568474281774">ডাউন এৰ’</translation>
@@ -274,6 +275,7 @@
 <translation id="3941014780699102620">হ’ষ্ট সম্পৰ্কীয় সমস্যা সমাধান কৰাত বিফল হ'ল</translation>
 <translation id="3942420633017001071">ডায়েগনষ্টিক্স</translation>
 <translation id="3954678691475912818">অজ্ঞাত প্ৰকাৰৰ ডিভাইচ।</translation>
+<translation id="3958703339436883942">ৰিষ্টাৰ্ট কৰিবলৈ সাজু কৰি থকা হৈছে...</translation>
 <translation id="3966286471246132217">অধিক সঠিক ফলাফলৰ বাবে, পৰীক্ষাটো সম্পূৰ্ণ নোহোৱালৈকে আটাইবোৰ এপ্ বন্ধ কৰক।</translation>
 <translation id="3967822245660637423">ডাউনল’ড সম্পূৰ্ণ হ’ল</translation>
 <translation id="3969602104473960991">ChromeOSৰ পাছৱৰ্ড আপডে’ট কৰা হৈছে</translation>
@@ -422,6 +424,7 @@
 <translation id="5275828089655680674">ৰুটিন পুনৰ চলাওক</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">সংস্কৰণ <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">পৰৱৰ্তী স্ক্ৰীনলৈ যাবলৈ ৰাইট কৰিব নোৱৰাকৈ সুৰক্ষিত কৰাৰ সুবিধাটো অক্ষম কৰক। নিৰ্দেশাৱলীৰ বাবে ডিভাইচ নিৰ্মাতাৰ সহায়ক পৃষ্ঠাখনলৈ যাওক।</translation>
 <translation id="5300814202279832142">ৱিণ্ড’ ডেস্কলৈ নিয়ক</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">সংযোগ কৰক</translation>
@@ -473,6 +476,7 @@
 <translation id="583281660410589416">অজ্ঞাত</translation>
 <translation id="5843706793424741864">ফাৰেনহাইট</translation>
 <translation id="5849570051105887917">হোম প্ৰদানকাৰীৰ ক’ড</translation>
+<translation id="5856532218727053281">ৰাইট কৰিব নোৱৰাকৈ সুৰক্ষিত কৰাৰ সুবিধাৰ স্থিতিটো সত্যাপন কৰাৰ পাছত ছিষ্টেমটো ৰিষ্টাৰ্ট হ’ব</translation>
 <translation id="5859603669299126575">আৰ্ট গেলাৰীৰ এলবাম</translation>
 <translation id="5860033963881614850">অফ আছে</translation>
 <translation id="5860491529813859533">অন কৰক</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index 28587d3..b62b3ee 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -24,7 +24,9 @@
 <translation id="1201402288615127009">Növbəti</translation>
 <translation id="1204296502688602597">DNS Gecikməsi</translation>
 <translation id="123124571410524056">Portal şübhəsi var</translation>
+<translation id="1236400083787698183">Yenidən başlamazdan əvvəl cihazınızı yenidən formatlayın. Cihazınızın qapağı varsa, qapağı bağlamazdan əvvəl yenidən formatlamanın tamamlanmasını gözləyin. Yenidən formatlamanın tamamlanması bir dəqiqə çəkə bilər.</translation>
 <translation id="1238612778414822719">HTTPS Gecikməsi</translation>
+<translation id="1240699967155581440">Yenidən formatlama (zavod sıfırlaması) tələb edilir</translation>
 <translation id="1264116747675686718">OS versiyası güncəllənir</translation>
 <translation id="1264369926465113395">Chromebook'un yaradıcılar üçün yeni rəqəmsal jurnalına baxın</translation>
 <translation id="1270369111467284986">Avtorizasiya portalı şübhəsi var</translation>
@@ -147,6 +149,7 @@
 <translation id="2360257214555822463"><ph name="LINK_BEGIN" />Uyğunsuz komponentlər<ph name="LINK_END" /> aşkarlanıb. Bunun quraşdırıldığını təsdiqləməyi seçsəniz, indi bunu edin.</translation>
 <translation id="2363636958541445404">Ekran qoruyucu seçimlərini seçmək üçün funksiyanı aktiv edin</translation>
 <translation id="2364498172489649528">Keçdi</translation>
+<translation id="236594517359128026">Davam etməzdən əvvəl noutbuku düz bir səthə qoyun</translation>
 <translation id="2380886658946992094">Hüquqi</translation>
 <translation id="2391082728065870591">Rəy Hesabatını Göndərin</translation>
 <translation id="2407209115954268704">SIM Kilid Statusu</translation>
@@ -263,6 +266,7 @@
 <translation id="3820172043799983114">Yanlış PIN.</translation>
 <translation id="3838338534323494292">Yeni parol</translation>
 <translation id="385051799172605136">Geri</translation>
+<translation id="385832974417157471">Söndürməzdən əvvəl cihazınızı yenidən formaylayın. Cihazınızın qapağı varsa, qapağı bağlamazdan əvvəl yenidən formatlamanın tamamlanmasını gözləyin. Yenidən formatlamanın tamamlanması bir dəqiqə çəkə bilər.</translation>
 <translation id="3858860766373142691">Ad</translation>
 <translation id="3865414814144988605">Dəqiqlik</translation>
 <translation id="387301095347517405">Batareyanızın tam şarj edilmə sayı</translation>
@@ -445,6 +449,7 @@
 <translation id="5507300744274596613">Chrome OS-in güncəl olduğuna əmin olun</translation>
 <translation id="5519195206574732858">LTE</translation>
 <translation id="554517032089923082">GTC</translation>
+<translation id="5548284010950733518">Komponentləri tənzimləyin</translation>
 <translation id="5578477003638479617">UMTS</translation>
 <translation id="5578519639599103840">Yenidən skan edin</translation>
 <translation id="5583640892426849032">Geri silmə</translation>
@@ -693,6 +698,7 @@
 <translation id="8206859287963243715">Mobil</translation>
 <translation id="8208861521865154048">İmtiyazlar</translation>
 <translation id="8217675307824400706">Qoşulun</translation>
+<translation id="8221728673725659466">Tənzimləmə tamamdır</translation>
 <translation id="8226628635270268143">Sevimli fotolarınızı və albomlarınızı seçin</translation>
 <translation id="8230672074305416752">Defolt şəbəkə girişini yoxlamaq alınmadı</translation>
 <translation id="8246209727385807362">Naməlum operator</translation>
@@ -703,6 +709,7 @@
 <translation id="8297006494302853456">Zəif</translation>
 <translation id="8302368968391049045">HTTPS Qoruyucu divarı</translation>
 <translation id="8318753676953949627">Heç bir şəkil yoxdur</translation>
+<translation id="8327249300223641918">Davam etməzdən əvvəl cihazınızı (baza və qapaq) düz bir səthə qoyun.</translation>
 <translation id="8336739000755212683">Cihazın hesab şəklini dəyişin</translation>
 <translation id="8347227221149377169">Çap işləri</translation>
 <translation id="8352772353338965963">Çoxsaylı giriş üçün hesab əlavə edin. Bu hesablara parolsuz daxil olmaq olar, ona görə də bu funksiya yalnız güvənilən hesablar ilə işlədilməlidir.</translation>
@@ -717,6 +724,7 @@
 <translation id="844521431886043384">DNS ayarlanmayıb</translation>
 <translation id="8456761643544401578">Avtomatik qaranlıq rejim</translation>
 <translation id="8461329675984532579">Əsas səhifə provayder adı</translation>
+<translation id="8467104829907989997">Komponentlər tənzimlənir...</translation>
 <translation id="8475690821716466388">WiFi şəbəkəsi zəif protokol WEP PSK ilə qorunur</translation>
 <translation id="8477551185774834963">DNS gecikməsi icazə verilən həddən azca yuxarıdır</translation>
 <translation id="8483248364096924578">IP ünvanı</translation>
@@ -776,6 +784,7 @@
 <translation id="8987565828374052507">{NUMBER_OF_PAGES,plural, =0{Skan edin}=1{Bu səhifəni skan edin: {NUMBER_OF_PAGES}}other{Bu səhifəni skan edin: {NUMBER_OF_PAGES}}}</translation>
 <translation id="8997710128084572139">Cihazın batareya səviyyəsi: <ph name="BATTERY_PERCENTAGE" />%.</translation>
 <translation id="9003704114456258138">Tezlik</translation>
+<translation id="9025198690966128418">Şəxsi cihaz kimi istifadə edin</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9062831201344759865">DNS ayırdetmə dəqiqliyində yüksək gecikmə var</translation>
 <translation id="9073281213608662541">PAP</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb
index b6f8369..d17cb96 100644
--- a/chromeos/strings/chromeos_strings_be.xtb
+++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Неадкладна задайце новы</translation>
 <translation id="4891842000192098784">Нагрузка</translation>
 <translation id="4897058166682006107">Узровень зараду акумулятара ў левым навушніку: <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4915052247106771211">Налады прылады будуць скінуты да заводскіх значэнняў (з дапамогай Powerwash).</translation>
 <translation id="4917385247580444890">Моцны</translation>
 <translation id="4917889632206600977">Спынена: скончылася папера</translation>
 <translation id="4921665434385737356">Зараджана: <ph name="RATE" /> за <ph name="NUM_SECONDS" /> с.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Нешта пайшло не так. Паспрабуйце выбраць шпалеры яшчэ раз або адкрыйце праграму зноў.</translation>
 <translation id="5372659122375744710">Сетка Wi-Fi не абаронена</translation>
 <translation id="5376354385557966694">Аўтаматычнае ўключэнне светлага рэжыму</translation>
+<translation id="537872351913703572">Прылада будзе перададзена іншаму карыстальніку або арганізацыі</translation>
 <translation id="5400907029458559844">Прылада падключаецца.</translation>
 <translation id="5401938042319910061">Запусціць усе паслядоўнасці дзеянняў</translation>
 <translation id="5423849171846380976">Уключана</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Абнавіць да версіі <ph name="VERSION_NUMBER" /> і перазапусціць</translation>
 <translation id="8675354002693747642">Папярэдне абагулены ключ</translation>
 <translation id="8677859815076891398">Альбомаў няма. Стварыце альбом у <ph name="LINK_BEGIN" />Google Фота<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Прылада застанецца ў ранейшага карыстальніка</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Каб кіраваць гэтай функцыяй, выкарыстоўвайце клавішы са стрэлкамі ўлева і ўправа</translation>
 <translation id="8712637175834984815">Зразумела</translation>
 <translation id="871560550817059752">Збой: скончылася чарніла</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb
index f4b4715..b844fb8a 100644
--- a/chromeos/strings/chromeos_strings_bg.xtb
+++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Изберете нова незабавно</translation>
 <translation id="4891842000192098784">Стрес</translation>
 <translation id="4897058166682006107">Нивото на батерията на лявата слушалка е <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4915052247106771211">Това действие ще възстанови фабричните настройки на устройството (Powerwash).</translation>
 <translation id="4917385247580444890">Силен</translation>
 <translation id="4917889632206600977">Спряло – няма хартия</translation>
 <translation id="4921665434385737356">За <ph name="NUM_SECONDS" /> секунди се заредиха <ph name="RATE" />.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Нещо се обърка. Изберете тапет отново или отворете приложението пак.</translation>
 <translation id="5372659122375744710">Wi-Fi мрежата не е сигурна</translation>
 <translation id="5376354385557966694">Автоматичен светъл режим</translation>
+<translation id="537872351913703572">Устройството преминава в друг потребител или организация</translation>
 <translation id="5400907029458559844">Устройството установява връзка.</translation>
 <translation id="5401938042319910061">Стартиране на всички процедури</translation>
 <translation id="5423849171846380976">Активиран</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Актуализиране до <ph name="VERSION_NUMBER" /> и рестартиране</translation>
 <translation id="8675354002693747642">Предварително споделен ключ</translation>
 <translation id="8677859815076891398">Няма албуми. Създайте албум в <ph name="LINK_BEGIN" />Google Снимки<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Устройството остава в същия потребител</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Използвайте клавишите със стрелки наляво и надясно, за да управлявате тази функция.</translation>
 <translation id="8712637175834984815">Разбрах</translation>
 <translation id="871560550817059752">Неуспешно – няма мастило</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb
index dcb70a9..46c397abd 100644
--- a/chromeos/strings/chromeos_strings_bn.xtb
+++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">ডার্ক থিম বন্ধ করুন</translation>
 <translation id="1807246157184219062">আলো</translation>
 <translation id="1827738518074806965">আর্ট গ্যালারি</translation>
+<translation id="1840835860961531162">Write Protect বন্ধ করুন</translation>
 <translation id="1851218745569890714">ভিডিও কনফারেন্সিং</translation>
 <translation id="1852934301711881861">ChromeOS Flex ইনস্টল করুন</translation>
 <translation id="1856388568474281774">নিম্নমুখী তীরচিহ্ন</translation>
@@ -274,6 +275,7 @@
 <translation id="3941014780699102620">হোস্ট নেম যাচাই করা যায়নি</translation>
 <translation id="3942420633017001071">ডায়গনিস্টিক</translation>
 <translation id="3954678691475912818">ডিভাইসের ধরন অজানা।</translation>
+<translation id="3958703339436883942">রিস্টার্ট করার চেষ্টা করা হচ্ছে...</translation>
 <translation id="3966286471246132217">আরও উন্নত ফলাফল পেতে পরীক্ষা সম্পূর্ণ না হওয়া পর্যন্ত সব অ্যাপ বন্ধ করে দিন।</translation>
 <translation id="3967822245660637423">ডাউনলোড সম্পূর্ণ</translation>
 <translation id="3969602104473960991">ChromeOS-এর পাসওয়ার্ড আপডেট করা হয়েছে</translation>
@@ -421,6 +423,7 @@
 <translation id="5275828089655680674">রুটিন আবার রান করান</translation>
 <translation id="5286252187236914003">L2TP/IPসেক</translation>
 <translation id="5294769550414936029">ভার্সন <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">পরবর্তী সিস্টেমে চালিয়ে যাওয়ার জন্য write-protect বন্ধ করুন। নির্দেশাবলীর জন্য ডিভাইস প্রস্তুতকারকের সহায়তা পৃষ্ঠায় যান।</translation>
 <translation id="5300814202279832142">উইন্ডোকে ডেস্কে সরিয়ে নিয়ে যান</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">কানেক্ট করুন</translation>
@@ -472,6 +475,7 @@
 <translation id="583281660410589416">অজানা</translation>
 <translation id="5843706793424741864">ফারেনহাইট</translation>
 <translation id="5849570051105887917">হোম পরিষেবা প্রদানকারী কোড</translation>
+<translation id="5856532218727053281">Write Protection স্ট্যাটাস যাচাই করার পরে সিস্টেম রিস্টার্ট হবে</translation>
 <translation id="5859603669299126575">আর্ট গ্যালারি অ্যালবাম</translation>
 <translation id="5860033963881614850">বন্ধ করুন</translation>
 <translation id="5860491529813859533">চালু করুন</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb
index 15bf6f71..d08626d1 100644
--- a/chromeos/strings/chromeos_strings_ca.xtb
+++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Tria'n una de nova immediatament</translation>
 <translation id="4891842000192098784">Estrès</translation>
 <translation id="4897058166682006107">L'auricular esquerre del dispositiu té un <ph name="BATTERY_PERCENTAGE" />% de bateria.</translation>
+<translation id="4915052247106771211">Es restablirà el dispositiu a la configuració de fàbrica (Powerwash).</translation>
 <translation id="4917385247580444890">Forta</translation>
 <translation id="4917889632206600977">S'ha aturat: no hi ha paper</translation>
 <translation id="4921665434385737356">S'ha carregat un <ph name="RATE" /> en <ph name="NUM_SECONDS" /> segons.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">S'ha produït un error. Prova novament de triar un fons de pantalla o d'obrir l'aplicació.</translation>
 <translation id="5372659122375744710">La xarxa Wi-Fi no és segura</translation>
 <translation id="5376354385557966694">Mode clar automàtic</translation>
+<translation id="537872351913703572">El dispositiu es retornarà a un altre usuari o a una altra organització</translation>
 <translation id="5400907029458559844">El dispositiu s'està connectant.</translation>
 <translation id="5401938042319910061">S'han executat totes les rutines</translation>
 <translation id="5423849171846380976">Activat</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Actualitza a <ph name="VERSION_NUMBER" /> i reinicia</translation>
 <translation id="8675354002693747642">Clau precompartida</translation>
 <translation id="8677859815076891398">No hi ha cap àlbum. Crea'n un a <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">El dispositiu es retornarà al mateix usuari</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Utilitza les tecles de fletxa dreta o esquerra per gestionar aquesta funció.</translation>
 <translation id="8712637175834984815">Entesos</translation>
 <translation id="871560550817059752">Error: no hi ha tinta</translation>
diff --git a/chromeos/strings/chromeos_strings_cy.xtb b/chromeos/strings/chromeos_strings_cy.xtb
index 384c5ea..f7c2f20 100644
--- a/chromeos/strings/chromeos_strings_cy.xtb
+++ b/chromeos/strings/chromeos_strings_cy.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Dewiswch un newydd ar unwaith</translation>
 <translation id="4891842000192098784">Straen</translation>
 <translation id="4897058166682006107">Mae gan y ddyfais <ph name="BATTERY_PERCENTAGE" />% o fatri bud chwith.</translation>
+<translation id="4915052247106771211">Bydd hyn yn ailosod y ddyfais i'r gosodiadau ffatri (Powerwash).</translation>
 <translation id="4917385247580444890">Cryf</translation>
 <translation id="4917889632206600977">Wedi'i atal - Allan o bapur</translation>
 <translation id="4921665434385737356">Wedi gwefru <ph name="RATE" /> mewn <ph name="NUM_SECONDS" /> eiliad.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Aeth rhywbeth o'i le. Rhowch gynnig arall ar ddewis papur wal neu ailagorwch yr ap.</translation>
 <translation id="5372659122375744710">Nid yw'r rhwydwaith Wi-Fi yn ddiogel</translation>
 <translation id="5376354385557966694">Modd golau awtomatig</translation>
+<translation id="537872351913703572">Bydd y ddyfais yn mynd i ddefnyddiwr neu sefydliad gwahanol</translation>
 <translation id="5400907029458559844">Mae'r ddyfais yn cysylltu.</translation>
 <translation id="5401938042319910061">Rhedeg Pob Arfer</translation>
 <translation id="5423849171846380976">Wedi gweithredu</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Diweddaru i <ph name="VERSION_NUMBER" /> ac ailgychwyn</translation>
 <translation id="8675354002693747642">Allwedd a rannwyd ymlaen llaw</translation>
 <translation id="8677859815076891398">Dim albymau. Creu albwm yn <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Bydd y ddyfais yn mynd i'r un defnyddiwr</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Defnyddiwch y bysellau saeth Chwith neu Dde i reoli'r nodwedd hon.</translation>
 <translation id="8712637175834984815">Iawn</translation>
 <translation id="871560550817059752">Wedi methu - Allan o inc</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb
index 5b75d1d5..caeabb8 100644
--- a/chromeos/strings/chromeos_strings_da.xtb
+++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Vælg omgående en ny adgangskode</translation>
 <translation id="4891842000192098784">Stress</translation>
 <translation id="4897058166682006107">Enheden har <ph name="BATTERY_PERCENTAGE" /> % batteri på venstre øretelefon.</translation>
+<translation id="4915052247106771211">Denne handling vil gendanne fabriksindstillingerne på enheden (Powerwash).</translation>
 <translation id="4917385247580444890">Stærk</translation>
 <translation id="4917889632206600977">Stoppet – Papirbakken er tom</translation>
 <translation id="4921665434385737356">Opladet <ph name="RATE" /> på <ph name="NUM_SECONDS" /> sekunder.</translation>
@@ -429,6 +430,7 @@
 <translation id="5358174242040570474">Noget gik galt. Prøv at vælge en baggrund igen eller genåbne appen.</translation>
 <translation id="5372659122375744710">Wi-Fi-netværket er ikke sikkert</translation>
 <translation id="5376354385557966694">Automatisk lys tilstand</translation>
+<translation id="537872351913703572">Enheden overdrages til en anden bruger eller organisation</translation>
 <translation id="5400907029458559844">Enheden opretter forbindelse.</translation>
 <translation id="5401938042319910061">Kør alle rutiner</translation>
 <translation id="5423849171846380976">Aktiveret</translation>
@@ -732,6 +734,7 @@
 <translation id="8671972493856476349">Opdater til <ph name="VERSION_NUMBER" />, og genstart</translation>
 <translation id="8675354002693747642">Forhåndsdelt nøgle:</translation>
 <translation id="8677859815076891398">Der er ingen album. Opret et album i <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Enheden bliver hos den samme ejer</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Tryk på venstre- eller højrepil for at bruge denne funktion.</translation>
 <translation id="8712637175834984815">Forstået</translation>
 <translation id="871560550817059752">Handlingen mislykkedes – Mangler blæk</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index 44dc128..44ebb84 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Gleitkommagenauigkeit</translation>
 <translation id="2448312741937722512">Art</translation>
 <translation id="2461822463642141190">Aktuell</translation>
+<translation id="2480034874476596812">Manuell deaktivieren</translation>
 <translation id="2491955442992294626">Tasten werden nicht getestet, wenn du ein anderes Fenster verwendest</translation>
 <translation id="2493126929778606526">Meine besten automatisch ausgewählten Fotos</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Hohe Latenz zu HTTPS-Websites</translation>
 <translation id="3621202678540785336">Eingang</translation>
 <translation id="3632579075709132555">Privatsphärefunktion</translation>
+<translation id="3678765385266369662">Wähle aus, wie du den Schreibschutz deaktivieren möchtest</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> – Test</translation>
 <translation id="370665806235115550">Wird geladen...</translation>
 <translation id="3708186454126126312">Zuletzt verbundene Geräte</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Zum Ausführen eines Speichertests müssen mindestens 500 MB frei sein. Unter „Einstellungen“ &gt; „Speicherplatzverwaltung“ kannst du Speicherplatz freigeben.</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4258281355379922695">HTTP-Latenz</translation>
+<translation id="4258561075226177474">Der Nutzer des Geräts ändert sich nicht. Nutzerdaten löschen?</translation>
 <translation id="4271957103967917607">Vollbildmodus aufrufen</translation>
 <translation id="4275799948641988986">Wer wird das Gerät nach der Reparatur nutzen?</translation>
 <translation id="4289540628985791613">Übersicht</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Aktualisieren</translation>
 <translation id="4744944742468440486">Informationen in Bezug auf deine Auswahl</translation>
 <translation id="4773299976671772492">Angehalten</translation>
+<translation id="4774530504324923332">Du benötigst einen RSU-fähigen Sicherheitsschlüssel, einen QR-Code-Scanner und ein zweites Gerät mit einer Internetverbindung</translation>
 <translation id="4782311465517282004">Du kannst Definitionen oder Übersetzungen anzeigen oder Einheiten umrechnen lassen, indem du Text gedrückt hältst oder mit der rechten Maustaste darauf klickst</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> Foto(s)</translation>
 <translation id="4793710386569335688"><ph name="BEGIN_LINK" />Weitere Informationen findest du in der Hilfe.<ph name="END_LINK" /></translation>
@@ -376,6 +380,7 @@
 <translation id="4890353053343094602">Lege so schnell wie möglich ein neues fest</translation>
 <translation id="4891842000192098784">Belastung</translation>
 <translation id="4897058166682006107">Der Akkustand des linken Kopfhörers liegt bei <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">Dadurch wird das Gerät auf die Werkseinstellungen zurückgesetzt (Powerwash).</translation>
 <translation id="4917385247580444890">Stark</translation>
 <translation id="4917889632206600977">Angehalten – Kein Papier</translation>
 <translation id="4921665434385737356"><ph name="RATE" /> in <ph name="NUM_SECONDS" /> Sekunden aufgeladen.</translation>
@@ -430,6 +435,8 @@
 <translation id="5358174242040570474">Es gab ein Problem. Wähle noch einmal einen Hintergrund aus oder öffne die App ein weiteres Mal.</translation>
 <translation id="5372659122375744710">WLAN ist nicht sicher</translation>
 <translation id="5376354385557966694">Automatischer heller Modus</translation>
+<translation id="537872351913703572">Gerät wird an einen anderen Nutzer oder eine andere Organisation übergeben</translation>
+<translation id="5395600419410242651">Alle Daten löschen</translation>
 <translation id="5400907029458559844">Das Gerät wird verbunden.</translation>
 <translation id="5401938042319910061">Alle Abläufe ausführen</translation>
 <translation id="5423849171846380976">Aktiviert</translation>
@@ -640,6 +647,7 @@
 <translation id="7570674786725311828">USB-Touchscreen</translation>
 <translation id="7595982850646262331">Noch <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Weitere Informationen in der Hilfe</translation>
+<translation id="7626501172915339021">Entsperrung über RMA-Server vornehmen (RSU)</translation>
 <translation id="763165478673169849">Zuletzt zurückgesetzt</translation>
 <translation id="7648838807254605802">Hohe HTTPS-Latenz</translation>
 <translation id="7656388927906093505">Das Gerät ist eine Maus.</translation>
@@ -733,6 +741,7 @@
 <translation id="8671972493856476349">Update auf <ph name="VERSION_NUMBER" /> durchführen und neu starten</translation>
 <translation id="8675354002693747642">Vorinstallierter Schlüssel</translation>
 <translation id="8677859815076891398">Keine Alben. Ein Album in <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" /> erstellen.</translation>
+<translation id="8680431479333800907">Nutzer des Geräts ändert sich nicht</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Verwende zum Verwalten dieser Funktion den Rechts- und Linkspfeil.</translation>
 <translation id="8712637175834984815">Alles klar</translation>
 <translation id="871560550817059752">Fehlgeschlagen – Keine Tinte</translation>
@@ -782,6 +791,8 @@
 <translation id="9087578468327036362">Diese Anfrage melden</translation>
 <translation id="9088306295921699330">Aktuelle Nutzung</translation>
 <translation id="9095775724867566971">PluginVM</translation>
+<translation id="90977145661420967">Du musst das Gerät auseinanderbauen</translation>
+<translation id="9098156406873149060">Nutzerdaten beibehalten</translation>
 <translation id="910415269708673980">Aktualisiere das Ticket für <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Seite <ph name="PAGE_NUMBER" /> wird gescannt</translation>
 <translation id="9111102763498581341">Entsperren</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb
index d0dd89f..becd66b 100644
--- a/chromeos/strings/chromeos_strings_el.xtb
+++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Επιλέξτε άμεσα έναν νέο</translation>
 <translation id="4891842000192098784">Καταπόνηση</translation>
 <translation id="4897058166682006107">Η μπαταρία αριστερού ακουστικού της συσκευής βρίσκεται στο <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4915052247106771211">Αυτή η ενέργεια θα επαναφέρει τη συσκευή στις εργοστασιακές ρυθμίσεις (Powerwash).</translation>
 <translation id="4917385247580444890">Ισχυρό</translation>
 <translation id="4917889632206600977">Διακοπή - Τελείωσε το χαρτί</translation>
 <translation id="4921665434385737356">Φόρτιση κατά <ph name="RATE" /> σε <ph name="NUM_SECONDS" /> δευτερόλεπτα.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Κάτι δεν πήγε καλά. Δοκιμάστε να επιλέξετε ξανά μια ταπετσαρία ή να επαναλάβετε το άνοιγμα της εφαρμογής.</translation>
 <translation id="5372659122375744710">Το δίκτυο Wi-Fi δεν είναι ασφαλές.</translation>
 <translation id="5376354385557966694">Αυτόματη φωτεινή λειτουργία</translation>
+<translation id="537872351913703572">Η συσκευή θα μεταβιβαστεί σε διαφορετικό χρήστη ή οργανισμό</translation>
 <translation id="5400907029458559844">Η συσκευή συνδέεται.</translation>
 <translation id="5401938042319910061">Εκτέλεση όλων των ρουτινών</translation>
 <translation id="5423849171846380976">Ενεργοποιημένο</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Ενημέρωση στην έκδοση <ph name="VERSION_NUMBER" /> και επανεκκίνηση</translation>
 <translation id="8675354002693747642">Ήδη κοινόχρηστο κλειδί</translation>
 <translation id="8677859815076891398">Δεν υπάρχουν λευκώματα. Δημιουργήστε ένα λεύκωμα στις <ph name="LINK_BEGIN" />Φωτογραφίες Google<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Η συσκευή θα μεταβιβαστεί στον ίδιο χρήστη</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Χρησιμοποιήστε τα πλήκτρα δεξιού ή αριστερού βέλους για τη διαχείριση αυτής της λειτουργίας.</translation>
 <translation id="8712637175834984815">Κατάλαβα!</translation>
 <translation id="871560550817059752">Σφάλμα - Τελείωσε το μελάνι</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index f4821c28..8d4780a 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -157,6 +157,7 @@
 <translation id="2446553403094072641">Floating point accuracy</translation>
 <translation id="2448312741937722512">Types</translation>
 <translation id="2461822463642141190">Current</translation>
+<translation id="2480034874476596812">Manually turn off</translation>
 <translation id="2491955442992294626">Keys aren't tested when you're using another window</translation>
 <translation id="2493126929778606526">Your best photos, selected automatically</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -252,6 +253,7 @@
 <translation id="3606583719724308068">High latency to HTTPS websites</translation>
 <translation id="3621202678540785336">Input</translation>
 <translation id="3632579075709132555">Privacy screen toggle</translation>
+<translation id="3678765385266369662">Select how you would like to turn off write protect</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> test</translation>
 <translation id="370665806235115550">Loading...</translation>
 <translation id="3708186454126126312">Previously connected</translation>
@@ -307,6 +309,7 @@
 <translation id="4244962993387259361">You need at least 500 MB free to run a Memory test. To free up space, go to Settings &gt; Storage management.</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4258281355379922695">HTTP latency</translation>
+<translation id="4258561075226177474">Device is going to the same user. Erase user data?</translation>
 <translation id="4271957103967917607">View full screen</translation>
 <translation id="4275799948641988986">After repair, who will be using the device?</translation>
 <translation id="4289540628985791613">Overview</translation>
@@ -355,6 +358,7 @@
 <translation id="473775607612524610">Update</translation>
 <translation id="4744944742468440486">Info related to your selection</translation>
 <translation id="4773299976671772492">Stopped</translation>
+<translation id="4774530504324923332">You'll need an RSU-enabled security key, a QR code scanner and a second device with an Internet connection</translation>
 <translation id="4782311465517282004">Get definitions, translations or unit conversions when you right-click or touch &amp; hold text</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> photo</translation>
 <translation id="4793710386569335688">For more help, go to the <ph name="BEGIN_LINK" />Help Centre<ph name="END_LINK" />.</translation>
@@ -435,6 +439,7 @@
 <translation id="5372659122375744710">Wi-Fi network is not secure</translation>
 <translation id="5376354385557966694">Automatic light mode</translation>
 <translation id="537872351913703572">Device will go to a different user or organisation</translation>
+<translation id="5395600419410242651">Erase all data</translation>
 <translation id="5400907029458559844">Device is connecting.</translation>
 <translation id="5401938042319910061">Run all routines</translation>
 <translation id="5423849171846380976">Activated</translation>
@@ -646,6 +651,7 @@
 <translation id="7570674786725311828">USB touchscreen</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> left</translation>
 <translation id="7620771111601174153">Find out more in the Help Centre</translation>
+<translation id="7626501172915339021">Perform RMA server unlock (RSU)</translation>
 <translation id="763165478673169849">Last reset time</translation>
 <translation id="7648838807254605802">High HTTPS latency</translation>
 <translation id="7656388927906093505">Device is a mouse.</translation>
@@ -789,6 +795,8 @@
 <translation id="9087578468327036362">Report this query</translation>
 <translation id="9088306295921699330">Current usage</translation>
 <translation id="9095775724867566971">PluginVm</translation>
+<translation id="90977145661420967">You'll need to take the device apart</translation>
+<translation id="9098156406873149060">Keep user data</translation>
 <translation id="910415269708673980">Refresh ticket for <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Scanning page <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Unlock</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb
index 01e542e1..436499c 100644
--- a/chromeos/strings/chromeos_strings_es-419.xtb
+++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Elige una nueva de inmediato</translation>
 <translation id="4891842000192098784">Esfuerzo</translation>
 <translation id="4897058166682006107">Nivel de batería del auricular izquierdo <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4915052247106771211">Esta opción restablecerá el dispositivo a la configuración de fábrica (Powerwash).</translation>
 <translation id="4917385247580444890">Fuerte</translation>
 <translation id="4917889632206600977">Se detuvo: no hay papel</translation>
 <translation id="4921665434385737356">Se cargó <ph name="RATE" /> en <ph name="NUM_SECONDS" /> segundos.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Se produjo un error. Intenta elegir un fondo de pantalla de nuevo o vuelve a abrir la app.</translation>
 <translation id="5372659122375744710">la red Wi-Fi no es segura</translation>
 <translation id="5376354385557966694">Modo claro automático</translation>
+<translation id="537872351913703572">El dispositivo cambiará de organización o usuario</translation>
 <translation id="5400907029458559844">El dispositivo se está conectando.</translation>
 <translation id="5401938042319910061">Ejecutar todas las rutinas</translation>
 <translation id="5423849171846380976">Activado</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Actualizar a <ph name="VERSION_NUMBER" /> y reiniciar</translation>
 <translation id="8675354002693747642">Clave compartida previamente</translation>
 <translation id="8677859815076891398">No hay álbumes. Crea un álbum en <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">El dispositivo no cambiará de usuario</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Para administrar esta función, utiliza las flechas hacia la izquierda o la derecha.</translation>
 <translation id="8712637175834984815">Entendido</translation>
 <translation id="871560550817059752">Error: Sin tinta</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb
index 92eba078..59ebe24 100644
--- a/chromeos/strings/chromeos_strings_es.xtb
+++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Precisión del punto flotante</translation>
 <translation id="2448312741937722512">Tipo</translation>
 <translation id="2461822463642141190">Actual</translation>
+<translation id="2480034874476596812">Desactivar manualmente</translation>
 <translation id="2491955442992294626">Las teclas no se prueban mientras usas otra ventana</translation>
 <translation id="2493126929778606526">Tus mejores fotos, seleccionadas automáticamente</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Latencia alta a sitios web HTTPS</translation>
 <translation id="3621202678540785336">Entrada</translation>
 <translation id="3632579075709132555">Activar o desactivar Pantalla de privacidad</translation>
+<translation id="3678765385266369662">Selecciona cómo quieres desactivar la protección contra escritura</translation>
 <translation id="3689839747745352263">Prueba <ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">Cargando...</translation>
 <translation id="3708186454126126312">Conectado anteriormente</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Necesitas al menos 500 MB de espacio libre para ejecutar una prueba de memoria. Para liberar espacio, ve a Configuración &gt; Gestión del almacenamiento.</translation>
 <translation id="4250229828105606438">Captura de pantalla</translation>
 <translation id="4258281355379922695">Latencia de HTTP</translation>
+<translation id="4258561075226177474">El dispositivo no cambiará de usuario. ¿Borrar datos de usuario?</translation>
 <translation id="4271957103967917607">Ver en pantalla completa</translation>
 <translation id="4275799948641988986">Una vez reparado, ¿quién va a usar el dispositivo?</translation>
 <translation id="4289540628985791613">Vista general</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Actualizar</translation>
 <translation id="4744944742468440486">Información relacionada con tu selección</translation>
 <translation id="4773299976671772492">Detenido</translation>
+<translation id="4774530504324923332">Necesitarás una clave de seguridad con RSU habilitado, un escáner de códigos QR y otro dispositivo con una conexión a Internet</translation>
 <translation id="4782311465517282004">Consulta definiciones, traducciones o conversiones de unidades haciendo clic con el botón derecho en un texto o manteniéndolo pulsado</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> foto</translation>
 <translation id="4793710386569335688">Para obtener más ayuda, accede al <ph name="BEGIN_LINK" />Centro de Ayuda<ph name="END_LINK" />.</translation>
@@ -376,6 +380,7 @@
 <translation id="4890353053343094602">Selecciona otra inmediatamente</translation>
 <translation id="4891842000192098784">Esfuerzo</translation>
 <translation id="4897058166682006107">Nivel de batería del auricular izquierdo del dispositivo: <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">Si seleccionas esta opción, se restablecerán los ajustes de fábrica del dispositivo (Powerwash).</translation>
 <translation id="4917385247580444890">Buena</translation>
 <translation id="4917889632206600977">Detenido: sin papel</translation>
 <translation id="4921665434385737356">Se ha cargado un <ph name="RATE" /> en <ph name="NUM_SECONDS" /> segundos.</translation>
@@ -429,6 +434,8 @@
 <translation id="5358174242040570474">Se ha producido un error. Prueba a elegir un fondo de pantalla de nuevo o vuelve a abrir la aplicación.</translation>
 <translation id="5372659122375744710">La red Wi-Fi no es segura</translation>
 <translation id="5376354385557966694">Modo Claro automático</translation>
+<translation id="537872351913703572">El dispositivo lo utilizará otro usuario u otra organización</translation>
+<translation id="5395600419410242651">Borrar todos los datos</translation>
 <translation id="5400907029458559844">El dispositivo se está conectando.</translation>
 <translation id="5401938042319910061">Ejecutar todas las rutinas</translation>
 <translation id="5423849171846380976">Activado</translation>
@@ -639,6 +646,7 @@
 <translation id="7570674786725311828">Pantalla táctil USB</translation>
 <translation id="7595982850646262331">Tiempo restante: <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Más información en el Centro de Ayuda</translation>
+<translation id="7626501172915339021">Realizar RMA Server Unlock (RSU)</translation>
 <translation id="763165478673169849">Hora a la que se restableció por última vez</translation>
 <translation id="7648838807254605802">Latencia de HTTPS alta</translation>
 <translation id="7656388927906093505">El dispositivo es un ratón.</translation>
@@ -732,6 +740,7 @@
 <translation id="8671972493856476349">Actualizar a <ph name="VERSION_NUMBER" /> y reiniciar</translation>
 <translation id="8675354002693747642">Clave precompartida</translation>
 <translation id="8677859815076891398">No hay álbumes. Crea un álbum en <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">El dispositivo lo utilizará el mismo usuario</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Usa las teclas de flecha izquierda y derecha para gestionar esta función.</translation>
 <translation id="8712637175834984815">Entendido</translation>
 <translation id="871560550817059752">No se ha podido imprimir - Sin tinta</translation>
@@ -781,6 +790,8 @@
 <translation id="9087578468327036362">Denunciar esta consulta</translation>
 <translation id="9088306295921699330">Uso actual</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Tendrás que desmontar el dispositivo</translation>
+<translation id="9098156406873149060">Conservar datos de usuario</translation>
 <translation id="910415269708673980">Actualiza el ticket de <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Escaneando página <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Desbloquear</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index d1639f0..88f1406 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">Desgaitu gai iluna</translation>
 <translation id="1807246157184219062">Argia</translation>
 <translation id="1827738518074806965">Arte-galeria</translation>
+<translation id="1840835860961531162">Desaktibatu idazketaren aurkako babesa</translation>
 <translation id="1851218745569890714">Bideokonferentziak</translation>
 <translation id="1852934301711881861">Instalatu ChromeOS Flex</translation>
 <translation id="1856388568474281774">Behera gezi-tekla</translation>
@@ -272,6 +273,7 @@
 <translation id="3941014780699102620">Ezin izan da ebatzi ostalaria</translation>
 <translation id="3942420633017001071">Diagnostikoak</translation>
 <translation id="3954678691475912818">Gailu mota ezezaguna da.</translation>
+<translation id="3958703339436883942">Berrabiarazteko prestatzen…</translation>
 <translation id="3966286471246132217">Emaitza zehatzagoak lortzeko, itxi aplikazio guztiak proba osatu arte.</translation>
 <translation id="3967822245660637423">Deskargatzen amaitu da</translation>
 <translation id="3969602104473960991">Eguneratu da Chrome OS-ko pasahitza</translation>
@@ -376,6 +378,7 @@
 <translation id="4890353053343094602">Aukeratu beste bat berehala</translation>
 <translation id="4891842000192098784">Estresa</translation>
 <translation id="4897058166682006107">Bateriaren ehuneko <ph name="BATTERY_PERCENTAGE" /> geratzen zaio gailuaren ezkerreko aurikularrari.</translation>
+<translation id="4915052247106771211">Powerwash bidez gailuaren jatorrizko ezarpenak berrezarriko dira.</translation>
 <translation id="4917385247580444890">Sendoa</translation>
 <translation id="4917889632206600977">Geldituta: ez dago paperik</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> segundo behar izan dira <ph name="RATE" /> kargatzeko.</translation>
@@ -417,6 +420,7 @@
 <translation id="5275828089655680674">Berrabiarazi errutinak</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029"><ph name="MILESTONE_VERSION" /> bertsioa</translation>
+<translation id="5298334025463010990">Desgaitu idazketaren aurkako babesa hurrengo pantailara joateko. Argibideak lortzeko, joan gailuaren fabrikatzailearen laguntza-orrira.</translation>
 <translation id="5300814202279832142">Eraman leihoa lan-eremura</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">Konektatu</translation>
@@ -430,6 +434,7 @@
 <translation id="5358174242040570474">Arazo bat izan da. Saiatu berriro horma-papera aukeratzen edo ireki berriro aplikazioa.</translation>
 <translation id="5372659122375744710">Wifi-sarea ez da segurua</translation>
 <translation id="5376354385557966694">Gai argi automatikoa</translation>
+<translation id="537872351913703572">Beste erabiltzaile edo erakunde batek erabiliko du gailua</translation>
 <translation id="5400907029458559844">Gailua konektatzen ari da.</translation>
 <translation id="5401938042319910061">Exekutatu errutina guztiak</translation>
 <translation id="5423849171846380976">Aktibatuta</translation>
@@ -466,6 +471,7 @@
 <translation id="583281660410589416">Ezezaguna</translation>
 <translation id="5843706793424741864">Fahrenheit</translation>
 <translation id="5849570051105887917">Hasierako hornitzailearen kodea</translation>
+<translation id="5856532218727053281">Idazketaren aurkako babesa egiaztatu ondoren, sistema berrabiaraziko da</translation>
 <translation id="5859603669299126575">Arte-galeria moduko albuma</translation>
 <translation id="5860033963881614850">Desaktibatuta</translation>
 <translation id="5860491529813859533">Aktibatu</translation>
@@ -733,6 +739,7 @@
 <translation id="8671972493856476349">Eguneratu <ph name="VERSION_NUMBER" /> bertsiora eta berrabiarazi gailua</translation>
 <translation id="8675354002693747642">Aurrez partekatutako gakoa</translation>
 <translation id="8677859815076891398">Ez dago albumik. Sortu bat <ph name="LINK_BEGIN" />Google Argazkiak<ph name="LINK_END" /> zerbitzuan.</translation>
+<translation id="8680431479333800907">Erabiltzaile berberak jarraituko du gailua erabiltzen</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Erabili ezkerrera edo eskuinera egiteko gezi-tekla eginbide hori kudeatzeko.</translation>
 <translation id="8712637175834984815">Ados</translation>
 <translation id="871560550817059752">Hutsegitea - Ez dago tintarik</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb
index cb31d0a5..73290930 100644
--- a/chromeos/strings/chromeos_strings_fi.xtb
+++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Valitse uusi välittömästi</translation>
 <translation id="4891842000192098784">Rasitus</translation>
 <translation id="4897058166682006107">Laitteen vasemman kuulokkeen akun varaus on <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">Tämä palauttaa laitteen tehdasasetukset (Powerwash).</translation>
 <translation id="4917385247580444890">Vahva</translation>
 <translation id="4917889632206600977">Pysähtynyt – Paperi loppu</translation>
 <translation id="4921665434385737356"><ph name="RATE" /> ladattiin <ph name="NUM_SECONDS" /> sekunnissa.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Jotain meni pieleen. Kokeile valita taustakuva uudelleen tai avaa sovellus.</translation>
 <translation id="5372659122375744710">Wi-Fi-verkko ei ole suojattu</translation>
 <translation id="5376354385557966694">Automaattinen vaalea tila</translation>
+<translation id="537872351913703572">Laitteen omistaja vaihtuu</translation>
 <translation id="5400907029458559844">Laite muodostaa yhteyttä.</translation>
 <translation id="5401938042319910061">Suorita kaikki ohjelmat</translation>
 <translation id="5423849171846380976">Aktivoitu</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Päivitä versioon <ph name="VERSION_NUMBER" /> ja käynnistä uudelleen</translation>
 <translation id="8675354002693747642">Esijaettu avain</translation>
 <translation id="8677859815076891398">Albumeja ei ole. Luo albumi <ph name="LINK_BEGIN" />Google Kuvissa<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Laite pysyy samalla käyttäjällä</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Säädä ominaisuutta vasemmalla ja oikealla nuolella.</translation>
 <translation id="8712637175834984815">Ymmärretty</translation>
 <translation id="871560550817059752">Epäonnistui – Muste loppu</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index 0270936..45a8a8e 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Katumpakan ng floating point</translation>
 <translation id="2448312741937722512">Uri</translation>
 <translation id="2461822463642141190">Kasalukuyan</translation>
+<translation id="2480034874476596812">Manual na i-off</translation>
 <translation id="2491955442992294626">Hindi sinusubukan ang mga key kapag gumagamit ka ng ibang window</translation>
 <translation id="2493126929778606526">Ang iyong mga pinakamagandang larawang awtomatikong napili</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Mataas ang latency sa mga HTTPS na website</translation>
 <translation id="3621202678540785336">Input</translation>
 <translation id="3632579075709132555">Toggle ng Privacy screen</translation>
+<translation id="3678765385266369662">Piliin kung paano mo gustong i-off ang Write Protect</translation>
 <translation id="3689839747745352263">Pagsusuri sa <ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">Naglo-load...</translation>
 <translation id="3708186454126126312">Dating nakakonekta</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Kailangan mo ng hindi bababa sa bakanteng 500 MB para magpatakbo ng pagsusuri sa Memory. Para magbakante ng espasyo, pumunta sa Mga Setting &gt; Pamamahala sa storage.</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4258281355379922695">Latency ng HTTP</translation>
+<translation id="4258561075226177474">Mapupunta ang device sa parehong user. Burahin ang data ng user?</translation>
 <translation id="4271957103967917607">Tingnan nang Full Screen</translation>
 <translation id="4275799948641988986">Pagkatapos maayos, sino na ang gagamit sa device?</translation>
 <translation id="4289540628985791613">Pangkalahatang-ideya</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">I-update</translation>
 <translation id="4744944742468440486">Impormasyong nauugnay sa iyong pinili</translation>
 <translation id="4773299976671772492">Inihinto</translation>
+<translation id="4774530504324923332">Mangangailangan ka ng security key na RSU-enabled, scanner ng QR code, at pangalawang device na may koneksyon sa internet</translation>
 <translation id="4782311465517282004">Makakuha ng mga kahulugan, pagsasalin, o conversion ng unit kapag nag-right click ka sa o pinindot mo nang matagal ang text</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> larawan</translation>
 <translation id="4793710386569335688">Para sa higit pang tulong, pumunta sa <ph name="BEGIN_LINK" />Help Center<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Hindi secure ang WiFi network</translation>
 <translation id="5376354385557966694">Awtomatikong light mode</translation>
 <translation id="537872351913703572">Mapupunta ang device sa ibang user o organisayon</translation>
+<translation id="5395600419410242651">Burahin ang lahat ng data</translation>
 <translation id="5400907029458559844">Kumokonekta ang device.</translation>
 <translation id="5401938042319910061">Patakbuhin ang Lahat ng Routine</translation>
 <translation id="5423849171846380976">Na-activate</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">USB na touchscreen</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> pa</translation>
 <translation id="7620771111601174153">Matuto pa sa Help Center</translation>
+<translation id="7626501172915339021">I-unlock ang RMA Server (RMA Server Unlock o RSU)</translation>
 <translation id="763165478673169849">Oras ng Huling Pag-reset</translation>
 <translation id="7648838807254605802">Mataas na latency ng HTTPS</translation>
 <translation id="7656388927906093505">Mouse ang device.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Iulat ang query na ito</translation>
 <translation id="9088306295921699330">Kasalukuyang paggamit</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Kakailanganin mong baklasin ang device</translation>
+<translation id="9098156406873149060">Panatilihin ang data ng user</translation>
 <translation id="910415269708673980">I-refresh ang ticket para sa <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Sina-scan ang pahina <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">I-unlock</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb
index b1321bd..42e6c5d 100644
--- a/chromeos/strings/chromeos_strings_fr-CA.xtb
+++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Choisissez-en un immédiatement</translation>
 <translation id="4891842000192098784">Stress</translation>
 <translation id="4897058166682006107">Le niveau de la pile de l'écouteur gauche est à <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">L'appareil sera réinitialisé aux paramètres par défaut (Powerwash).</translation>
 <translation id="4917385247580444890">Fort</translation>
 <translation id="4917889632206600977">Tâche arrêtée : à court de papier</translation>
 <translation id="4921665434385737356">L'appareil s'est rechargé de <ph name="RATE" /> en <ph name="NUM_SECONDS" /> secondes.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Un problème est survenu. Essayez de nouveau de choisir un fond d'écran ou rouvrez l'application.</translation>
 <translation id="5372659122375744710">Le réseau Wi-Fi n'est pas sécurisé</translation>
 <translation id="5376354385557966694">Mode clair automatique</translation>
+<translation id="537872351913703572">L'appareil appartiendra à un autre utilisateur ou à une autre organisation</translation>
 <translation id="5400907029458559844">L'appareil se connecte.</translation>
 <translation id="5401938042319910061">Exécuter toutes les routines</translation>
 <translation id="5423849171846380976">Activé</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Mettre à jour à la version <ph name="VERSION_NUMBER" /> et redémarrer</translation>
 <translation id="8675354002693747642">Clé prépartagée</translation>
 <translation id="8677859815076891398">Aucun album. Créez un album dans <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">L'appareil appartiendra au même utilisateur</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Utilisez les touches de flèche vers la droite ou vers la gauche pour gérer cette fonctionnalité.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="871560550817059752">Échec : à court d'encre</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb
index 6cc66be2..b83dc55d 100644
--- a/chromeos/strings/chromeos_strings_fr.xtb
+++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Choisissez-en un nouveau immédiatement</translation>
 <translation id="4891842000192098784">Contrainte</translation>
 <translation id="4897058166682006107">L'écouteur gauche de l'appareil a <ph name="BATTERY_PERCENTAGE" /> % de batterie.</translation>
+<translation id="4915052247106771211">La configuration d'usine sera rétablie sur l'appareil (Powerwash).</translation>
 <translation id="4917385247580444890">Très bon</translation>
 <translation id="4917889632206600977">Tâche suspendue - À court de papier</translation>
 <translation id="4921665434385737356"><ph name="RATE" /> chargés en <ph name="NUM_SECONDS" /> secondes.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Un problème est survenu. Choisissez à nouveau un fond d'écran ou rouvrez l'appli.</translation>
 <translation id="5372659122375744710">Réseau Wi-Fi non sécurisé</translation>
 <translation id="5376354385557966694">Mode clair automatique</translation>
+<translation id="537872351913703572">L'appareil sera transféré à un autre utilisateur ou à une autre organisation</translation>
 <translation id="5400907029458559844">L'appareil se connecte.</translation>
 <translation id="5401938042319910061">Exécuter toutes les routines</translation>
 <translation id="5423849171846380976">Activé</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Installer <ph name="VERSION_NUMBER" /> et redémarrer</translation>
 <translation id="8675354002693747642">Clé pré-partagée</translation>
 <translation id="8677859815076891398">Aucun album. Créez-en un dans <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">L'appareil sera transféré au même utilisateur</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Pour gérer cette fonctionnalité, utilisez les flèches vers la gauche ou vers la droite.</translation>
 <translation id="8712637175834984815">OK</translation>
 <translation id="871560550817059752">Échec – À court d'encre</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index 31d1205..b468aa5 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Escolle un novo inmediatamente</translation>
 <translation id="4891842000192098784">Estrés</translation>
 <translation id="4897058166682006107">Nivel de batería do auricular esquerdo do dispositivo: <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">Ao marcar esta opción, restablecerase a configuración de fábrica do dispositivo (Powerwash).</translation>
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4917889632206600977">Detívose (esgotouse o papel)</translation>
 <translation id="4921665434385737356">Cargouse un <ph name="RATE" /> en <ph name="NUM_SECONDS" /> segundos.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Produciuse un erro. Proba a escoller un fondo de pantalla de novo ou volve abrir a aplicación.</translation>
 <translation id="5372659122375744710">A rede wifi non é segura</translation>
 <translation id="5376354385557966694">Modo claro automático</translation>
+<translation id="537872351913703572">O dispositivo utilizarao un usuario ou unha organización diferente</translation>
 <translation id="5400907029458559844">O dispositivo estase conectando.</translation>
 <translation id="5401938042319910061">Executar todas as rutinas</translation>
 <translation id="5423849171846380976">Activado</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Actualiza á versión <ph name="VERSION_NUMBER" /> e reinicia o dispositivo</translation>
 <translation id="8675354002693747642">Clave compartida previamente</translation>
 <translation id="8677859815076891398">Non hai ningún álbum. Crea un en <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">O dispositivo utilizarao o mesmo usuario</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Utilizar teclas frecha cara á esquerda ou frecha arriba para xestionar esta función.</translation>
 <translation id="8712637175834984815">De acordo</translation>
 <translation id="871560550817059752">Produciuse un erro: a impresora quedou sen tinta</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb
index 7bec629..bb7e1764 100644
--- a/chromeos/strings/chromeos_strings_gu.xtb
+++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">ઘેરી થીમ બંધ કરો</translation>
 <translation id="1807246157184219062">આછું</translation>
 <translation id="1827738518074806965">આર્ટ ગૅલરી</translation>
+<translation id="1840835860961531162">Write Protect બંધ કરો</translation>
 <translation id="1851218745569890714">વીડિયો કૉન્ફરન્સિંગ</translation>
 <translation id="1852934301711881861">ChromeOS Flex ઇન્સ્ટૉલ કરો</translation>
 <translation id="1856388568474281774">નીચેની ઍરો કી</translation>
@@ -274,6 +275,7 @@
 <translation id="3941014780699102620">હોસ્ટ રિઝોલ્વ કરવામાં નિષ્ફળ રહ્યાં</translation>
 <translation id="3942420633017001071">ડાયગ્નોસ્ટિક્સ</translation>
 <translation id="3954678691475912818">ડિવાઇસનો પ્રકાર અજાણ્યો છે.</translation>
+<translation id="3958703339436883942">ફરી શરૂ કરવાની તૈયારી કરી રહ્યાં છીએ...</translation>
 <translation id="3966286471246132217">વધુ ચોક્કસ પરિણામો માટે, પરીક્ષણ પૂરું થાય ત્યાં સુધી બધી ઍપ બંધ રાખો.</translation>
 <translation id="3967822245660637423">ડાઉનલોડ પૂર્ણ</translation>
 <translation id="3969602104473960991">ChromeOSનો પાસવર્ડ અપડેટ કરવામાં આવ્યો</translation>
@@ -421,6 +423,7 @@
 <translation id="5275828089655680674">રૂટિન ફરીથી ચલાવો</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">વર્ઝન <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">આગલી સ્ક્રીન પર આગળ વધવા માટે write-protectને બંધ કરો. સૂચનાઓ માટે ડિવાઇસ નિર્માતાના સપોર્ટ પેજ પર જાઓ.</translation>
 <translation id="5300814202279832142">વિન્ડોને 'ડેસ્ક' સબમેનૂ પર ખસેડો</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">કનેક્ટ કરો</translation>
@@ -472,6 +475,7 @@
 <translation id="583281660410589416">અજ્ઞાત</translation>
 <translation id="5843706793424741864">ફેરનહીટ</translation>
 <translation id="5849570051105887917">હોમ પ્રદાતાનો કોડ</translation>
+<translation id="5856532218727053281">Write Protectionનું સ્ટેટસ ચકાસ્યા પછી સિસ્ટમ ફરી શરૂ થશે</translation>
 <translation id="5859603669299126575">આર્ટ ગૅલરી આલ્બમ</translation>
 <translation id="5860033963881614850">બંધ</translation>
 <translation id="5860491529813859533">ચાલુ કરો</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb
index 65c1add0..732e3310 100644
--- a/chromeos/strings/chromeos_strings_hi.xtb
+++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -113,6 +113,7 @@
 <translation id="2085089206770112532">डिसप्ले की रोशनी कम करने वाला बटन</translation>
 <translation id="2104796393919810494">मरम्मत का काम पूरा हुआ</translation>
 <translation id="2105810540595158374">डिवाइस एक गेम कंट्रोलर है.</translation>
+<translation id="2115956742084455574">कोड गलत है</translation>
 <translation id="2119172414412204879"><ph name="BOARD_NAME" />, वर्शन <ph name="MILESTONE_VERSION" /></translation>
 <translation id="2126937207024182736"><ph name="TOTAL_MEMORY" /> जीबी में से <ph name="AVAILABLE_MEMORY" /> जीबी उपलब्ध है</translation>
 <translation id="2138109643290557664">फ़्लोट ऑन बाई</translation>
@@ -143,6 +144,7 @@
 <translation id="2336381494582898602">पॉवरवॉश</translation>
 <translation id="2338501278241028356">आस-पास के डिवाइस खोजने के लिए ब्लूटूथ चालू करें</translation>
 <translation id="2346474577291266260">सिग्नल बहुत अच्छा है (<ph name="SIGNAL_STRENGTH" />)</translation>
+<translation id="2360257214555822463"><ph name="LINK_BEGIN" />अमान्य कॉम्पोनेंट<ph name="LINK_END" /> मिले. अगर इनकी पुष्टि 'इंस्टॉल कर दिए गए हैं' के तौर पर करनी है, तो कृपया अभी पुष्टि करें.</translation>
 <translation id="2363636958541445404">स्क्रीन सेवर चुनने के लिए, फ़ीचर चालू करें</translation>
 <translation id="2364498172489649528">जांच में पास</translation>
 <translation id="2380886658946992094">कानूनी</translation>
@@ -192,6 +194,7 @@
 <translation id="3054177598518735801"><ph name="CURRENT_VALUE" />mA</translation>
 <translation id="3056720590588772262">एंडपॉइंट</translation>
 <translation id="3069085583900247081">टेस्ट असफल रहा</translation>
+<translation id="3076243757415932261">कॉम्पोनेंट के मान्य होने की जांच की जा रही है...</translation>
 <translation id="3083667275341675831">कनेक्टिविटी डाइग्नोस्टिक्स</translation>
 <translation id="3084958266922136097">स्क्रीन सेवर बंद करें</translation>
 <translation id="3091839911843451378">प्रिंट नहीं हो पाया - प्रिंटर बंद हो गया</translation>
@@ -220,6 +223,7 @@
 <translation id="3368922792935385530">कनेक्ट है</translation>
 <translation id="3369013195428705271">क्या आप वाकई अपना पूरा प्रिंट इतिहास मिटाना चाहते हैं? प्रिंट का जो काम अभी चल रहा है उसकी जानकारी (प्रिंट जॉब) नहीं मिटाई जाएगी.</translation>
 <translation id="3404249063913988450">स्क्रीन सेवर चालू करें</translation>
+<translation id="3404770484521709967">कॉम्पोनेंट सही तरीके से इंस्टॉल किए गए हैं.</translation>
 <translation id="3413935475507503304">अपडेट करने के लिए 'आगे बढ़ें' पर क्लिक करें.</translation>
 <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation>
 <translation id="3435738964857648380">सुरक्षा</translation>
@@ -569,6 +573,7 @@
 <translation id="6768237774506518020">डीएनएस रिज़ॉल्यूशन नहीं हो पाने की बढ़ी हुई दर</translation>
 <translation id="680983167891198932">कुंजी</translation>
 <translation id="6816797338148849397">आपके चुने गए कॉन्टेंट से जुड़ी जानकारी उपलब्ध है. इसे ऐक्सेस करने के लिए, अप ऐरो बटन इस्तेमाल करें.</translation>
+<translation id="6840315122969944400"><ph name="DEVICE_TYPE" /> रिपेयर</translation>
 <translation id="6853312040151791195">डिस्चार्ज होने की दर</translation>
 <translation id="6889786074662672253">रीस्टार्ट करते समय, न तो इस बाहरी डिवाइस को डिसकनेक्ट करें और न ही अपने कंप्यूटर को शट डाउन करें. इस विंडो को छोटा किया जा सकता है. रीस्टार्ट होने में कुछ मिनट लग सकते हैं. हो सकता है कि इस दौरान आपका बाहरी डिवाइस काम न करे.</translation>
 <translation id="6905724422583748843"><ph name="PAGE_NAME" /> पर वापस जाएं</translation>
@@ -677,6 +682,7 @@
 <translation id="8045012663542226664">माइक्रोफ़ोन को म्यूट करने का बटन</translation>
 <translation id="8075838845814659848">इतने प्रतिशत चार्ज होना बाकी है</translation>
 <translation id="8082366717211101304">Android ऐप्लिकेशन से डीएनएस की समस्या ठीक नहीं की जा सकती</translation>
+<translation id="8083281199617904460">यह रिपेयर प्रोसेस, किसी प्रशिक्षित रिपेयर टेक्नीशियन के लिए है. खराब कॉम्पोनेंट बदलने के बाद ही प्रोसेस शुरू करें.</translation>
 <translation id="808894953321890993">पासवर्ड बदलें</translation>
 <translation id="8104083085214006426">आप एक ओपन नेटवर्क का इस्तेमाल कर रहे हैं जो सुरक्षित नहीं है</translation>
 <translation id="811820734797650957">(Android) गेटवे को पिंग किया जा सकता है</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb
index b03cd98..84c2a92 100644
--- a/chromeos/strings/chromeos_strings_hu.xtb
+++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Lebegőpontos pontosság</translation>
 <translation id="2448312741937722512">Típus</translation>
 <translation id="2461822463642141190">Jelenlegi</translation>
+<translation id="2480034874476596812">Manuális kikapcsolás</translation>
 <translation id="2491955442992294626">A rendszer nem teszteli a billentyűket, amikor másik ablakot használ</translation>
 <translation id="2493126929778606526">A legjobb, automatikusan kiválasztott fotók</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Hosszú a várakozási idő a HTTPS-protokollt használó webhelyekhez való csatlakozáskor</translation>
 <translation id="3621202678540785336">Bemenet</translation>
 <translation id="3632579075709132555">Az Adatvédelmi képernyő kapcsolója</translation>
+<translation id="3678765385266369662">Válassza ki, miként szeretné kikapcsolni az írásvédelmet</translation>
 <translation id="3689839747745352263">Teszt: <ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">Betöltés...</translation>
 <translation id="3708186454126126312">Korábban csatlakoztatva</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Legalább 500 MB szabad tárhely szükséges memóriateszt futtatásához. Tárhely felszabadításához lépjen a Beállítások &gt; Tárhelykezelő menübe.</translation>
 <translation id="4250229828105606438">Képernyőkép</translation>
 <translation id="4258281355379922695">HTTP várakozási idő</translation>
+<translation id="4258561075226177474">Az eszköz ugyanahhoz a felhasználóhoz kerül. Törli a felhasználói adatokat?</translation>
 <translation id="4271957103967917607">Teljes képernyős nézet</translation>
 <translation id="4275799948641988986">A javítást követően ki fogja használni az eszközt?</translation>
 <translation id="4289540628985791613">Áttekintés</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Frissítés</translation>
 <translation id="4744944742468440486">A kiválasztott elemhez kapcsolódó információ</translation>
 <translation id="4773299976671772492">Leállítva</translation>
+<translation id="4774530504324923332">Szüksége lesz egy RSU-képes biztonsági kulcsra, egy QR-kód-szkennelőre és egy internetkapcsolattal rendelkező második eszközre</translation>
 <translation id="4782311465517282004">A szövegre jobb egérgombbal kattintva, illetve a szöveget lenyomva tartva hozzáférhet a definíciókhoz, a fordításokhoz és az átváltott mértékegységekhez.</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> fotó</translation>
 <translation id="4793710386569335688">Ha további segítségére van szüksége, látogasson el a <ph name="BEGIN_LINK" />Súgó oldalára<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">A Wi-Fi-hálózat nem biztonságos</translation>
 <translation id="5376354385557966694">Automatikus világos mód</translation>
 <translation id="537872351913703572">Az eszköznek másik felhasználó vagy szervezet lesz a tulajdonosa</translation>
+<translation id="5395600419410242651">Minden adat törlése</translation>
 <translation id="5400907029458559844">Az eszköz csatlakozása folyamatban van.</translation>
 <translation id="5401938042319910061">Összes rutin futtatása</translation>
 <translation id="5423849171846380976">Aktiválva</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">USB-érintőképernyő</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> van hátra</translation>
 <translation id="7620771111601174153">További információ a Súgóban</translation>
+<translation id="7626501172915339021">Visszáru-engedélyezés szerverfeloldásának végrehajtása (RSU)</translation>
 <translation id="763165478673169849">Utolsó visszaállítás ideje</translation>
 <translation id="7648838807254605802">Hosszú várakozási idő HTTPS esetén</translation>
 <translation id="7656388927906093505">Az eszköz egy egér.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Bejelentheti ezt a lekérdezést.</translation>
 <translation id="9088306295921699330">Jelenleg felhasznált</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Szét kell szednie az eszközt</translation>
+<translation id="9098156406873149060">Felhasználói adatok megőrzése</translation>
 <translation id="910415269708673980">Frissítse a következőhöz tartozó jegyet: <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481"><ph name="PAGE_NUMBER" />. oldal beolvasása…</translation>
 <translation id="9111102763498581341">Feloldás</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb
index c6ad9d1..d4a2f01 100644
--- a/chromeos/strings/chromeos_strings_hy.xtb
+++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Հնարավորինս արագ փոխեք գաղտնաբառը</translation>
 <translation id="4891842000192098784">Ծանրաբեռնվածություն</translation>
 <translation id="4897058166682006107">Ձախ ականջակալի մարտկոցի լիցքի մակարդակը՝ <ph name="BATTERY_PERCENTAGE" />%։</translation>
+<translation id="4915052247106771211">Կվերականգնվեն սարքի գործարանային կարգավորումները (Powerwash)։</translation>
 <translation id="4917385247580444890">Ուժեղ</translation>
 <translation id="4917889632206600977">Դադարեցվել է – Թուղթ չկա</translation>
 <translation id="4921665434385737356">Լիցքավորվել է <ph name="RATE" />-ով՝ <ph name="NUM_SECONDS" /> վայրկյանում։</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Սխալ առաջացավ։ Նորից ընտրեք պաստառ կամ հավելվածը փակեք ու նորից բացեք։</translation>
 <translation id="5372659122375744710">Wi-Fi ցանցն անվտանգ չէ</translation>
 <translation id="5376354385557966694">Ավտոմատ բաց ռեժիմ</translation>
+<translation id="537872351913703572">Սարքը կփոխանցվի այլ օգտատիրոջ կամ կազմակերպության</translation>
 <translation id="5400907029458559844">Սարքը միանում է։</translation>
 <translation id="5401938042319910061">Գործարկել բոլոր հերթականությունները</translation>
 <translation id="5423849171846380976">Ակտիվացված է</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Տեղադրել <ph name="VERSION_NUMBER" /> տարբերակը և վերագործարկել</translation>
 <translation id="8675354002693747642">Ընդհանուր բանալի</translation>
 <translation id="8677859815076891398">Ալբոմներ չկան: Ստեղծեք ալբոմ <ph name="LINK_BEGIN" />Google Լուսանկարներում<ph name="LINK_END" />։</translation>
+<translation id="8680431479333800907">Սարքը կփոխանցվի նույն օգտատիրոջը</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Այս գործառույթը կառավարելու համար օգտագործեք ձախ կամ աջ սլաքները։</translation>
 <translation id="8712637175834984815">Պատրաստ է</translation>
 <translation id="871560550817059752">Չհաջողվեց տպել – Թանաքը սպառվել է</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb
index 2e5da97..8941578 100644
--- a/chromeos/strings/chromeos_strings_id.xtb
+++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Segera pilih satu sandi baru</translation>
 <translation id="4891842000192098784">Tegangan</translation>
 <translation id="4897058166682006107">Perangkat memiliki <ph name="BATTERY_PERCENTAGE" />% daya baterai earbud kiri.</translation>
+<translation id="4915052247106771211">Memilih opsi ini akan mereset perangkat ke setelan pabrik (Powerwash).</translation>
 <translation id="4917385247580444890">Kuat</translation>
 <translation id="4917889632206600977">Dihentikan - Kertas habis</translation>
 <translation id="4921665434385737356">Terisi <ph name="RATE" /> dalam <ph name="NUM_SECONDS" /> detik.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Terjadi error. Coba pilih wallpaper lagi atau buka aplikasi lagi.</translation>
 <translation id="5372659122375744710">Jaringan Wi-Fi tidak aman</translation>
 <translation id="5376354385557966694">Mode terang otomatis</translation>
+<translation id="537872351913703572">Perangkat akan digunakan oleh organisasi atau pengguna yang berbeda</translation>
 <translation id="5400907029458559844">Perangkat sedang menghubungkan.</translation>
 <translation id="5401938042319910061">Jalankan Semua Rutinitas</translation>
 <translation id="5423849171846380976">Diaktifkan</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Update ke <ph name="VERSION_NUMBER" /> &amp; mulai ulang</translation>
 <translation id="8675354002693747642">Kunci yang dibagikan sebelumnya</translation>
 <translation id="8677859815076891398">Tidak ada album. Buat album di <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Perangkat akan digunakan oleh pengguna yang sama</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Gunakan tombol Panah kiri atau kanan untuk mengelola fitur ini.</translation>
 <translation id="8712637175834984815">Mengerti</translation>
 <translation id="871560550817059752">Gagal - Tinta habis</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index 460abbe..4e80c2e 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Veldu nýtt án tafar</translation>
 <translation id="4891842000192098784">Álag</translation>
 <translation id="4897058166682006107">Rafhleðsla vinstra heyrnartóls er <ph name="BATTERY_PERCENTAGE" />%.</translation>
+<translation id="4915052247106771211">Þetta mun núllstilla tækið (djúphreinsun).</translation>
 <translation id="4917385247580444890">Sterkt</translation>
 <translation id="4917889632206600977">Stöðvað – pappír vantar</translation>
 <translation id="4921665434385737356">Hlóð <ph name="RATE" /> á <ph name="NUM_SECONDS" /> sekúndum.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Eitthvað fór úrskeiðis. Reyndu að velja veggfóður aftur eða endurræstu forritið.</translation>
 <translation id="5372659122375744710">Wi-Fi net er ekki öruggt</translation>
 <translation id="5376354385557966694">Sjálfvirk ljós stilling</translation>
+<translation id="537872351913703572">Tækið verður afhent öðrum notanda eða öðru fyrirtæki</translation>
 <translation id="5400907029458559844">Tækið er að tengjast.</translation>
 <translation id="5401938042319910061">Keyra allar rútínur</translation>
 <translation id="5423849171846380976">Virkjuð</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Uppfæra í <ph name="VERSION_NUMBER" /> og endurræsa</translation>
 <translation id="8675354002693747642">PSK-lykill</translation>
 <translation id="8677859815076891398">Engin albúm. Búðu til albúm í <ph name="LINK_BEGIN" />Google myndum<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Tækið verður afhent sama notanda</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Notaðu ör til vinstri eða ör til hægri til að stjórna þessum eiginleika.</translation>
 <translation id="8712637175834984815">Ég skil</translation>
 <translation id="871560550817059752">Mistókst – blekið er búið</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb
index bc181e96..373c645 100644
--- a/chromeos/strings/chromeos_strings_kk.xtb
+++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Дереу жаңа құпия сөз таңдаңыз.</translation>
 <translation id="4891842000192098784">Стресс</translation>
 <translation id="4897058166682006107">Сол құлақаспаптың батарея деңгейі: <ph name="BATTERY_PERCENTAGE" />%</translation>
+<translation id="4915052247106771211">Құрылғы зауыттық параметрлерге қайтарылады (Powerwash).</translation>
 <translation id="4917385247580444890">Күшті</translation>
 <translation id="4917889632206600977">Тоқтатылды: қағаз бітіп қалды</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> секундта <ph name="RATE" /> зарядталды.</translation>
@@ -429,6 +430,7 @@
 <translation id="5358174242040570474">Бірдеңе дұрыс болмады. Тұсқағазды қайта таңдап көріңіз немесе қолданбаны қайта ашыңыз.</translation>
 <translation id="5372659122375744710">WiFi желісі қауіпсіз емес.</translation>
 <translation id="5376354385557966694">Автоматты жарық режим</translation>
+<translation id="537872351913703572">Құрылғы басқа пайдаланушыға немесе ұйымға өтеді</translation>
 <translation id="5400907029458559844">Құрылғы жалғануда.</translation>
 <translation id="5401938042319910061">Барлық әрекеттер тізімін іске қосу</translation>
 <translation id="5423849171846380976">Белсендірілген</translation>
@@ -732,6 +734,7 @@
 <translation id="8671972493856476349"><ph name="VERSION_NUMBER" /> нұсқасына жаңарту және өшіріп қосу</translation>
 <translation id="8675354002693747642">Алдын ала бөлісілген код</translation>
 <translation id="8677859815076891398">Альбомдар жоқ. <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> қызметінде альбом жасаңыз.</translation>
+<translation id="8680431479333800907">Құрылғы сол иеге өтеді</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Бұл функцияны басқару үшін сол немесе оң жаққа бағыттауыш пернелерді пайдаланыңыз.</translation>
 <translation id="8712637175834984815">Түсінікті</translation>
 <translation id="871560550817059752">Сәтсіз: сия бітіп қалды</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb
index 41eddcd..a08a7c6 100644
--- a/chromeos/strings/chromeos_strings_km.xtb
+++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">បិទ​រចនាប័ទ្ម​ងងឹត</translation>
 <translation id="1807246157184219062">ភ្លឺ</translation>
 <translation id="1827738518074806965">វិចិត្រសាល</translation>
+<translation id="1840835860961531162">បិទ​ការការពារ​ការសរសេរ</translation>
 <translation id="1851218745569890714">ការប្រជុំតាម​វីដេអូ</translation>
 <translation id="1852934301711881861">ដំឡើង ChromeOS Flex</translation>
 <translation id="1856388568474281774">ព្រួញ​ចុះ​ក្រោម</translation>
@@ -274,6 +275,7 @@
 <translation id="3941014780699102620">មិនអាចដោះស្រាយម៉ាស៊ីនបានទេ</translation>
 <translation id="3942420633017001071">ការ​វិភាគ</translation>
 <translation id="3954678691475912818">មិន​ស្គាល់​ប្រភេទឧបករណ៍។</translation>
+<translation id="3958703339436883942">កំពុងរៀបចំ​ចាប់ផ្ដើម​ឡើងវិញ...</translation>
 <translation id="3966286471246132217">ដើម្បី​ទទួលបាន​លទ្ធផល​កាន់តែ​សុក្រឹត សូមបិទ​កម្មវិធី​ទាំងអស់ រហូតដល់​បញ្ចប់​ការធ្វើតេស្ត​។</translation>
 <translation id="3967822245660637423">ការទាញយកបានបញ្ចប់</translation>
 <translation id="3969602104473960991">បានប្ដូរ​ពាក្យសម្ងាត់ ChromeOS</translation>
@@ -380,6 +382,7 @@
 <translation id="4890353053343094602">សូមជ្រើសរើស​ពាក្យសម្ងាត់​ថ្មីភ្លាមៗ</translation>
 <translation id="4891842000192098784">ស្ត្រេស</translation>
 <translation id="4897058166682006107">ឧបករណ៍មានថ្មកាសខាងឆ្វេង <ph name="BATTERY_PERCENTAGE" />%។</translation>
+<translation id="4915052247106771211">វា​នឹង​កំណត់​ឧបករណ៍​ឡើងវិញ​ទៅ​ការកំណត់​ដូចចេញពី​រោងចក្រ (Powerwash)។</translation>
 <translation id="4917385247580444890">ខ្លាំង</translation>
 <translation id="4917889632206600977">បានឈប់ - អស់​ក្រដាស</translation>
 <translation id="4921665434385737356">បានសាកថ្ម <ph name="RATE" /> ក្នុងរយៈពេល <ph name="NUM_SECONDS" /> វិនាទី។</translation>
@@ -420,6 +423,7 @@
 <translation id="5275828089655680674">ដំណើរការ​ទម្លាប់ឡើងវិញ</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">កំណែ <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">បិទការការពារ​ការសរសេរ​ដើម្បីបន្តទៅអេក្រង់បន្ទាប់។ ចូលទៅកាន់ទំព័រជំនួយរបស់ក្រុមហ៊ុនផលិតឧបករណ៍ដើម្បីទទួលបានការណែនាំ។</translation>
 <translation id="5300814202279832142">ផ្លាស់ទី​វិនដូទៅតុ</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">ភ្ជាប់</translation>
@@ -433,6 +437,7 @@
 <translation id="5358174242040570474">មានអ្វីមួយខុសប្រក្រតី។ សូមសាកល្បង​ជ្រើសរើស​ផ្ទាំងរូបភាពម្ដងទៀត ឬបើក​កម្មវិធីឡើងវិញ។</translation>
 <translation id="5372659122375744710">បណ្ដាញ WiFi មិនមានសុវត្ថិភាពទេ</translation>
 <translation id="5376354385557966694">មុខងារភ្លឺ​ស្វ័យប្រវត្តិ</translation>
+<translation id="537872351913703572">ឧបករណ៍​នឹង​ប្រើប្រាស់​ដោយ​អ្នកប្រើប្រាស់ ឬ​ស្ថាប័ន​ផ្សេង</translation>
 <translation id="5395600419410242651">លុប​ទិន្នន័យ​ទាំង​អស់</translation>
 <translation id="5400907029458559844">ឧបករណ៍កំពុងភ្ជាប់។</translation>
 <translation id="5401938042319910061">ដំណើរការរាល់ការធ្វើតេស្តតាមការកំណត់</translation>
@@ -470,6 +475,7 @@
 <translation id="583281660410589416">មិនស្គាល់</translation>
 <translation id="5843706793424741864">ហ្វារិនហៃ</translation>
 <translation id="5849570051105887917">លេខកូដអ្នកផ្តល់សេវាកម្មនៅផ្ទះ</translation>
+<translation id="5856532218727053281">ប្រព័ន្ធនឹងចាប់ផ្តើមឡើងវិញ បន្ទាប់ពីផ្ទៀងផ្ទាត់ស្ថានភាព​នៃ​ការការពារ​ការសរសេរ</translation>
 <translation id="5859603669299126575">អាល់ប៊ុមវិចិត្រសាល</translation>
 <translation id="5860033963881614850">បិទ</translation>
 <translation id="5860491529813859533">បើក</translation>
@@ -738,6 +744,7 @@
 <translation id="8671972493856476349">ដំឡើងកំណែទៅ <ph name="VERSION_NUMBER" /> រួចចាប់ផ្ដើម​ឡើងវិញ</translation>
 <translation id="8675354002693747642">កូនសោ​ដែលបាន​ចែករំលែក​ជាមុន</translation>
 <translation id="8677859815076891398">គ្មាន​អាល់ប៊ុមទេ។ សូមបង្កើត​អាល់ប៊ុម​នៅក្នុង <ph name="LINK_BEGIN" />Google រូបថត<ph name="LINK_END" />។</translation>
+<translation id="8680431479333800907">ឧបករណ៍​នឹង​ប្រើប្រាស់ដោយ​ម្ចាស់​ដដែល</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> ប្រើគ្រាប់ចុចព្រួញទៅ​ឆ្វេង ឬស្ដាំ ដើម្បីគ្រប់គ្រងមុខងារនេះ។</translation>
 <translation id="8712637175834984815">យល់ហើយ</translation>
 <translation id="871560550817059752">មិនបានសម្រេច - ​​អស់ទឹកថ្នាំ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb
index 7831484..673ce148 100644
--- a/chromeos/strings/chromeos_strings_ko.xtb
+++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">지금 바로 새 비밀번호를 선택하세요.</translation>
 <translation id="4891842000192098784">스트레스</translation>
 <translation id="4897058166682006107">기기의 왼쪽 이어폰 배터리 잔량이 <ph name="BATTERY_PERCENTAGE" />%입니다.</translation>
+<translation id="4915052247106771211">기기가 기본 설정으로 재설정됩니다(파워워시).</translation>
 <translation id="4917385247580444890">강함</translation>
 <translation id="4917889632206600977">중지됨 - 용지 부족</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" />초 동안 <ph name="RATE" /> 충전했습니다.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">문제가 발생했습니다. 배경화면을 다시 선택하거나 앱을 다시 실행해 보세요.</translation>
 <translation id="5372659122375744710">Wi-Fi 네트워크가 안전하지 않습니다.</translation>
 <translation id="5376354385557966694">자동 밝은 모드</translation>
+<translation id="537872351913703572">기기의 사용자 또는 조직이 바뀜</translation>
 <translation id="5400907029458559844">기기 연결 중입니다.</translation>
 <translation id="5401938042319910061">모든 루틴 실행</translation>
 <translation id="5423849171846380976">활성화됨</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349"><ph name="VERSION_NUMBER" />로 업데이트 및 다시 시작</translation>
 <translation id="8675354002693747642">사전 공유 키:</translation>
 <translation id="8677859815076891398">앨범이 없습니다. <ph name="LINK_BEGIN" />Google 포토<ph name="LINK_END" />에서 앨범을 만드세요.</translation>
+<translation id="8680431479333800907">기기의 사용자가 유지됨</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> 이 기능을 관리하려면 왼쪽 또는 오른쪽 화살표 키를 사용하세요.</translation>
 <translation id="8712637175834984815">확인</translation>
 <translation id="871560550817059752">실패 - 잉크 없음</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb
index c65df49a..829b0dca 100644
--- a/chromeos/strings/chromeos_strings_mk.xtb
+++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Прецизност на подвижна запирка</translation>
 <translation id="2448312741937722512">Тип</translation>
 <translation id="2461822463642141190">Моментално</translation>
+<translation id="2480034874476596812">Рачно исклучи</translation>
 <translation id="2491955442992294626">Копчињата не се тестираат кога користите друг прозорец</translation>
 <translation id="2493126929778606526">Вашите најдобри фотографии, избрани автоматски</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Висока латенција кон веб-сајтовите со HTTPS</translation>
 <translation id="3621202678540785336">Внесување</translation>
 <translation id="3632579075709132555">Вклучи/исклучи заштита на приватноста</translation>
+<translation id="3678765385266369662">Изберете како сакате да ја исклучите „Заштитата од пишување“</translation>
 <translation id="3689839747745352263">Тест за <ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">Се вчитува...</translation>
 <translation id="3708186454126126312">Претходно поврзани</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Потребен ви е слободен капацитет од најмалку 500 MB за да извршите тестирање на меморијата. За да ослободите простор, одете во „Поставки &gt; Управување со капацитетот“.</translation>
 <translation id="4250229828105606438">Слика од екран</translation>
 <translation id="4258281355379922695">Латенција на HTTP</translation>
+<translation id="4258561075226177474">Уредот ќе оди кај истиот корисник. Да се избришат податоците на корисникот?</translation>
 <translation id="4271957103967917607">Приказ на цел екран</translation>
 <translation id="4275799948641988986">По поправката, кој ќе го користи уредот?</translation>
 <translation id="4289540628985791613">Преглед</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Ажурирај</translation>
 <translation id="4744944742468440486">Информации поврзани со вашиот избор</translation>
 <translation id="4773299976671772492">Сопрено</translation>
+<translation id="4774530504324923332">Потребен ви е безбедносен клуч што поддржува RSU, скенер на QR-кодови и втор уред со поврзување на интернет</translation>
 <translation id="4782311465517282004">Добивајте дефиниции, преводи или конверзија на вредности кога ќе кликнете со десно копче или ќе допрете и задржите текст</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> фотографија</translation>
 <translation id="4793710386569335688">За дополнителна помош, одете во <ph name="BEGIN_LINK" />Центарот за помош<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">WiFi мрежата не е безбедна</translation>
 <translation id="5376354385557966694">Автоматски светол режим</translation>
 <translation id="537872351913703572">Уредот ќе се префрли на друг корисник или организација</translation>
+<translation id="5395600419410242651">Избриши ги сите податоци</translation>
 <translation id="5400907029458559844">Уредот се поврзува.</translation>
 <translation id="5401938042319910061">Изврши ги сите рутини</translation>
 <translation id="5423849171846380976">Активиран</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">Допирен екран со USB</translation>
 <translation id="7595982850646262331">Уште <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Дознајте повеќе во „Центарот за помош“</translation>
+<translation id="7626501172915339021">Изведи отклучување на RMA-сервер (RSU)</translation>
 <translation id="763165478673169849">Време на последно ресетирање</translation>
 <translation id="7648838807254605802">Висока латенција на HTTPS</translation>
 <translation id="7656388927906093505">Уредот е глувче.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Пријавете го барањево</translation>
 <translation id="9088306295921699330">Моментално користење</translation>
 <translation id="9095775724867566971">PluginVm</translation>
+<translation id="90977145661420967">Треба да го раздвоите уредот</translation>
+<translation id="9098156406873149060">Задржи ги податоците на корисникот</translation>
 <translation id="910415269708673980">Освежете го билетот за <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Се скенира страницата <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Отклучи</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index ccc796a..f0581d8e 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">ഡാർക്ക് തീം പ്രവർത്തനരഹിതമാക്കുക</translation>
 <translation id="1807246157184219062">ലൈറ്റ്</translation>
 <translation id="1827738518074806965">ആര്‍ട്ട് ഗ്യാലറി</translation>
+<translation id="1840835860961531162">റൈറ്റ് പരിരക്ഷ ഓഫാക്കുക</translation>
 <translation id="1851218745569890714">വീഡിയോ കോൺഫറൻസിംഗ്</translation>
 <translation id="1852934301711881861">ChromeOS Flex ഇൻസ്റ്റാൾ ചെയ്യുക</translation>
 <translation id="1856388568474281774">താഴേയ്‌ക്കുള്ള അമ്പടയാളം</translation>
@@ -272,6 +273,7 @@
 <translation id="3941014780699102620">ഹോസ്‌റ്റ് പരിഹരിക്കാനായില്ല</translation>
 <translation id="3942420633017001071">പ്രശ്‌നനിർണ്ണയം</translation>
 <translation id="3954678691475912818">ഉപകരണ തരം അജ്ഞാതമാണ്.</translation>
+<translation id="3958703339436883942">റീസ്റ്റാർട്ട് ചെയ്യാൻ തയ്യാറെടുക്കുന്നു...</translation>
 <translation id="3966286471246132217">കൂടുതൽ കൃത്യമായ ഫലങ്ങൾക്ക്, ടെസ്റ്റ് പൂർത്തിയാകുന്നത് വരെ എല്ലാ ആപ്പുകളും അടയ്ക്കുക.</translation>
 <translation id="3967822245660637423">ഡൗൺലോഡ് പൂർത്തിയായി</translation>
 <translation id="3969602104473960991">ChromeOS പാസ്‌വേഡ് അപ്ഡേറ്റ് ചെയ്തു</translation>
@@ -417,6 +419,7 @@
 <translation id="5275828089655680674">ദിനചര്യകൾ വീണ്ടും റൺ ചെയ്യുക</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">പതിപ്പ് <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">അടുത്ത സ്ക്രീനിലേക്ക് പോകാൻ റൈറ്റ് പരിരക്ഷ പ്രവർത്തനരഹിതമാക്കുക. നിർദ്ദേശങ്ങൾക്ക്, ഉപകരണ നിർമ്മാതാവിന്റെ പിന്തുണാ പേജിലേക്ക് പോകുക.</translation>
 <translation id="5300814202279832142">വിൻഡോയെ ഡെസ്‌ക്കിലേക്ക് നീക്കുക</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">കണക്‌റ്റ് ചെയ്യുക</translation>
@@ -467,6 +470,7 @@
 <translation id="583281660410589416">അജ്ഞാതം</translation>
 <translation id="5843706793424741864">ഫാരൻഹീറ്റ്</translation>
 <translation id="5849570051105887917">ഹോം ദാതാവിന്റെ കോഡ്</translation>
+<translation id="5856532218727053281">റൈറ്റ് പരിരക്ഷയുടെ നില പരിശോധിച്ചുറപ്പിച്ച ശേഷം സിസ്റ്റം റീസ്റ്റാർട്ട് ചെയ്യും</translation>
 <translation id="5859603669299126575">ആര്‍ട്ട് ഗ്യാലറി ആൽബം</translation>
 <translation id="5860033963881614850">ഓഫാക്കുക</translation>
 <translation id="5860491529813859533">ഓൺ ചെയ്യുക</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb
index 44843557..7eeb478 100644
--- a/chromeos/strings/chromeos_strings_mr.xtb
+++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">फ्लोटिंग पॉइंटची अचूकता</translation>
 <translation id="2448312741937722512">प्रकार</translation>
 <translation id="2461822463642141190">सद्य</translation>
+<translation id="2480034874476596812">मॅन्युअली बंद करा</translation>
 <translation id="2491955442992294626">तुम्ही दुसरी विंडो वापरत असताना, कीची चाचणी केली जात नाही</translation>
 <translation id="2493126929778606526">तुमचे सर्वोत्तम फोटो, आपोआप निवडले</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">HTTPS वेबसाइटवर लेटन्सी जास्त आहे</translation>
 <translation id="3621202678540785336">इनपुट</translation>
 <translation id="3632579075709132555">गोपनीयता स्क्रीन टॉगल करा</translation>
+<translation id="3678765385266369662">तुम्हाला Write Protect कसे बंद करायचे आहे ते निवडा</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> चाचणी</translation>
 <translation id="370665806235115550">लोड करीत आहे...</translation>
 <translation id="3708186454126126312">यापूर्वी कनेक्ट केलेली</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">मेमरीसंबंधित चाचणी रन करण्यासाठी तुमच्याकडे किमान ५०० MB जागा मोकळी असणे आवश्यक आहे. जागा मोकळी करण्यासाठी, सेटिंग्ज &gt; स्टोरेज व्यवस्थापन वर जा.</translation>
 <translation id="4250229828105606438">स्क्रीनशॉट</translation>
 <translation id="4258281355379922695">HTTP लेटन्सी</translation>
+<translation id="4258561075226177474">डिव्हाइस त्याच वापरकर्त्याचे आहे. वापरकर्त्याचा डेटा मिटवायचा आहे का?</translation>
 <translation id="4271957103967917607">फुल स्क्रीन पहा</translation>
 <translation id="4275799948641988986">दुरूस्त केल्यानंतर, डिव्हाइस कोण वापरणार आहे?</translation>
 <translation id="4289540628985791613">विहंगावलोकन</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">अपडेट करा</translation>
 <translation id="4744944742468440486">तुमच्या निवडीशी संबंधित माहिती</translation>
 <translation id="4773299976671772492">थांबविले</translation>
+<translation id="4774530504324923332">तुमच्याकडे RSU सुरू केलेली सिक्युरिटी की, QR कोड स्कॅनर आणि इंटरनेट कनेक्शन असलेले दुसरे डिव्हाइस असणे आवश्यक असेल</translation>
 <translation id="4782311465517282004">तुम्ही मजकुरावर राइट-क्लिक करता तेव्हा किंवा त्याला स्पर्श करून तो धरून ठेवता तेव्हा व्याख्या, भाषांतरे किंवा युनिट रूपांतरे मिळवा</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> फोटो</translation>
 <translation id="4793710386569335688">अधिक मदत मिळवण्यासाठी, <ph name="BEGIN_LINK" />मदत केंद्र<ph name="END_LINK" /> वर जा.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">वायफाय नेटवर्क सुरक्षित नाही</translation>
 <translation id="5376354385557966694">ऑटोमॅटिक प्रकाश मोड</translation>
 <translation id="537872351913703572">डिव्हाइस दुसऱ्या वापरकर्त्याला किंवा संस्थेला दिले जाईल</translation>
+<translation id="5395600419410242651">सर्व डेटा मिटवा</translation>
 <translation id="5400907029458559844">डिव्हाइस कनेक्ट होत आहे.</translation>
 <translation id="5401938042319910061">सर्व दिनक्रम रन करा</translation>
 <translation id="5423849171846380976">सक्रिय</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">USB टचस्क्रीन</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> शिल्लक</translation>
 <translation id="7620771111601174153">मदत केंद्र मध्ये अधिक जाणून घ्या</translation>
+<translation id="7626501172915339021">RMA सर्व्हर अनलॉक करा (RSU)</translation>
 <translation id="763165478673169849">अंतिम रीसेट केल्याची वेळ</translation>
 <translation id="7648838807254605802">उच्च HTTPS लेटन्सी</translation>
 <translation id="7656388927906093505">डिव्हाइस हे माउस आहे.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">या क्वेरीची तक्रार करा</translation>
 <translation id="9088306295921699330">सद्य वापर</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">तुम्हाला डिव्हाइस वेगळे करावे लागेल</translation>
+<translation id="9098156406873149060">वापरकर्त्याचा डेटा ठेवा</translation>
 <translation id="910415269708673980"><ph name="PRINCIPAL_NAME" /> चे तिकीट रिफ्रेश करा</translation>
 <translation id="9106415115617144481">पेज <ph name="PAGE_NUMBER" /> स्कॅन करत आहे</translation>
 <translation id="9111102763498581341">अनलॉक करा</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb
index 9d7a140..79e4d0a 100644
--- a/chromeos/strings/chromeos_strings_ms.xtb
+++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Pilih kata laluan baharu secepat mungkin</translation>
 <translation id="4891842000192098784">Tekanan</translation>
 <translation id="4897058166682006107">Peranti mempunyai <ph name="BATTERY_PERCENTAGE" />% paras bateri kiri.</translation>
+<translation id="4915052247106771211">Tindakan ini akan menetapkan semula peranti kepada tetapan kilang (Powerwash).</translation>
 <translation id="4917385247580444890">Kuat</translation>
 <translation id="4917889632206600977">Dihentikan - Kehabisan kertas</translation>
 <translation id="4921665434385737356">Dicas <ph name="RATE" /> dalam masa <ph name="NUM_SECONDS" /> saat.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Kesilapan telah berlaku. Cuba pilih kertas dinding sekali lagi atau buka semula apl tersebut.</translation>
 <translation id="5372659122375744710">Rangkaian Wi-Fi tidak selamat</translation>
 <translation id="5376354385557966694">Mod cerah automatik</translation>
+<translation id="537872351913703572">Peranti akan menjadi milik pengguna atau organisasi lain</translation>
 <translation id="5400907029458559844">Peranti sedang menyambung.</translation>
 <translation id="5401938042319910061">Jalankan Semua Rutin</translation>
 <translation id="5423849171846380976">Diaktifkan</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Kemas kini <ph name="VERSION_NUMBER" /> &amp; mulakan semula</translation>
 <translation id="8675354002693747642">Kekunci prakongsi</translation>
 <translation id="8677859815076891398">Tiada album. Buat album dalam <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Peranti akan menjadi milik pengguna yang sama</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Gunakan kekunci Anak panah ke kiri atau Anak panah ke kanan untuk mengurus ciri ini.</translation>
 <translation id="8712637175834984815">Faham</translation>
 <translation id="871560550817059752">Gagal - Kehabisan dakwat</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index 0e8fb951..de216b2 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">အလွတ်ရွှေ့နိုင်သောအမှတ်၏ မှန်ကန်မှု</translation>
 <translation id="2448312741937722512">ပုံစံ</translation>
 <translation id="2461822463642141190">လက်ရှိ</translation>
+<translation id="2480034874476596812">ကိုယ်တိုင်ပိတ်ပါ</translation>
 <translation id="2491955442992294626">အခြားဝင်းဒိုးတစ်ခုကို သင်သုံးနေစဉ် ကီးများကို စမ်းသပ်ခြင်း မပြုပါ</translation>
 <translation id="2493126929778606526">အလိုအလျောက်ရွေးထားသော သင်၏ အကောင်းဆုံးဓာတ်ပုံများ</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">HTTPS ဝဘ်ဆိုက်များသို့ တုံ့ပြန်ချိန်မြင့်သည်</translation>
 <translation id="3621202678540785336">ထည့်သွင်းမှု</translation>
 <translation id="3632579075709132555">အချက်အလက်ကာကွယ်ရေး ဖန်သားပြင်ပြောင်းရန်</translation>
+<translation id="3678765385266369662">Write Protect ကို ပိတ်လိုသည့်ပုံစံကို ရွေးချယ်ပါ</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> စစ်ဆေးမှု</translation>
 <translation id="370665806235115550">တင်ပေးနေ...</translation>
 <translation id="3708186454126126312">ယခင် ချိတ်ဆက်ထားသည်များ</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">မှတ်ဉာဏ်စစ်ဆေးမှု လုပ်ဆောင်ရန် အနည်းဆုံး ၅၀၀ MB လွတ်နေရမည်။ နေရာလွတ်ပြုလုပ်ရန် ဆက်တင်များ &gt; ‘သိုလှောင်ခန်းစီမံခန့်ခွဲမှုစနစ်’ သို့ သွားပါ။</translation>
 <translation id="4250229828105606438">မျက်နှာပြင် လျှပ်တပြက်ပုံ</translation>
 <translation id="4258281355379922695">HTTP တုံ့ပြန်ချိန်</translation>
+<translation id="4258561075226177474">လက်ရှိအသုံးပြုသူသို့ စက်ရောက်ရှိသွားမည်။ အသုံးပြုသူဒေတာကို ဖျက်မလား။</translation>
 <translation id="4271957103967917607">‘ဖန်သားပြင်အပြည့်’ ကြည့်ရန်</translation>
 <translation id="4275799948641988986">ပြုပြင်ပြီးနောက် ဤစက်ကို မည်သူသုံးမလဲ။</translation>
 <translation id="4289540628985791613">အကျဉ်းချုပ်</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">အပ်ဒိတ်လုပ်ရန်</translation>
 <translation id="4744944742468440486">သင်ရွေးထားသည့်အရာနှင့် သက်ဆိုင်သည့် အချက်အလက်များ</translation>
 <translation id="4773299976671772492">ဆိုင်းငံ့ထား</translation>
+<translation id="4774530504324923332">RSU ဖွင့်ထားသော လုံခြုံရေးကီး၊ QR ကုဒ် စကင်ဖတ်စနစ်နှင့် အင်တာနက်ရှိသော နောက်စက်တစ်လုံး လိုအပ်လိမ့်မည်</translation>
 <translation id="4782311465517282004">ညာဘက်ခလုတ်ကို နှိပ်ချိန် (သို့) စာသားကိုတို့ထိ၍ ဖိထားချိန်တွင် အဓိပ္ပာယ်ဖွင့်ဆိုချက်၊ ဘာသာပြန်ဆိုချက် (သို့) ယူနစ်ပြောင်းလဲချက်များကို ရယူနိုင်သည်</translation>
 <translation id="4791000909649665275">ဓာတ်ပုံ <ph name="NUMBER" /> ပုံ</translation>
 <translation id="4793710386569335688">နောက်ထပ်အကူအညီအတွက် <ph name="BEGIN_LINK" />ကူညီရေးဌာန<ph name="END_LINK" /> သို့ သွားနိုင်သည်။</translation>
@@ -431,6 +435,7 @@
 <translation id="5372659122375744710">WiFi ကွန်ရက်က မလုံခြုံပါ</translation>
 <translation id="5376354385557966694">အလိုအလျောက် အလင်းမုဒ်</translation>
 <translation id="537872351913703572">အခြားအသုံးပြုသူ (သို့) အဖွဲ့အစည်းထံသို့ စက် ရောက်ရှိသွားမည်</translation>
+<translation id="5395600419410242651">ဒေတာအားလုံး ဖျက်ရန်</translation>
 <translation id="5400907029458559844">ကိရိယာ ချိတ်ဆက်နေသည်။</translation>
 <translation id="5401938042319910061">'ပုံမှန်အစီအစဉ်" အားလုံး အသုံးပြုရန်</translation>
 <translation id="5423849171846380976">အသက်သွင်းပြီး</translation>
@@ -641,6 +646,7 @@
 <translation id="7570674786725311828">USB တို့ထိမျက်နှာပြင်</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> ကျန်သည်</translation>
 <translation id="7620771111601174153">'ကူညီရေးဌာန' တွင် ပိုမိုလေ့လာရန်</translation>
+<translation id="7626501172915339021">RMA ဆာဗာ လော့ခ်ဖွင့်ပါ (RSU)</translation>
 <translation id="763165478673169849">နောက်ဆုံး ပြင်ဆင်သတ်မှတ်ထားချိန်</translation>
 <translation id="7648838807254605802">HTTPS တုံ့ပြန်ချိန် မြင့်သည်</translation>
 <translation id="7656388927906093505">ကိရိယာသည် မောက်စ်ဖြစ်သည်။</translation>
@@ -784,6 +790,8 @@
 <translation id="9087578468327036362">ဤမေးမြန်းချက်ကို အကြောင်းကြားရန်</translation>
 <translation id="9088306295921699330">လက်ရှိ အသုံးပြုမှု</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">စက်ကိုဖြုတ်ရန် လိုအပ်လိမ့်မည်</translation>
+<translation id="9098156406873149060">အသုံးပြုသူဒေတာကို ဆက်ထားရန်</translation>
 <translation id="910415269708673980"><ph name="PRINCIPAL_NAME" /> အတွက် လက်မှတ်ကို ပြန်လည်စတင်ပါ</translation>
 <translation id="9106415115617144481">စာမျက်နှာ <ph name="PAGE_NUMBER" /> ကို စကင်ဖတ်နေသည်</translation>
 <translation id="9111102763498581341">သော့ဖွင့်ရန်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index 7e70fd79..7ba85e9a 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">अँध्यारो थिम अफ गर्नुहोस्</translation>
 <translation id="1807246157184219062">हल्का</translation>
 <translation id="1827738518074806965">आर्ट ग्यालेरी</translation>
+<translation id="1840835860961531162">Write Protect अफ गर्नुहोस्</translation>
 <translation id="1851218745569890714">भिडियो कन्फ्रेन्स</translation>
 <translation id="1852934301711881861">ChromeOS Flex इन्स्टल गर्नुहोस्</translation>
 <translation id="1856388568474281774">डाउन एरो</translation>
@@ -274,6 +275,7 @@
 <translation id="3941014780699102620">होस्टको समस्या समाधान गर्न सकिएन</translation>
 <translation id="3942420633017001071">निदान</translation>
 <translation id="3954678691475912818">यो डिभाइस कुन प्रकारको डिभाइस हो भन्ने जानकारी उपलब्ध छैन।</translation>
+<translation id="3958703339436883942">रिस्टार्ट गर्नका लागि तयार पारिँदै छ...</translation>
 <translation id="3966286471246132217">अझ सटीक परिणामहरू प्राप्त गर्न जाँच पूरा नहुँदासम्म सबै एप बन्द राख्नुहोस्।</translation>
 <translation id="3967822245660637423">डाउनलोड पूर्ण भयो</translation>
 <translation id="3969602104473960991">ChromeOS को पासवर्ड परिवर्तन गरिएको छ</translation>
@@ -421,6 +423,7 @@
 <translation id="5275828089655680674">निदानसम्बन्धी रुटिनहरू पुनः सञ्चालन गर्नुहोस्</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">संस्करण <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">तपाईं अर्को स्क्रिनमा जान चाहनुहुन्छ भने Write Protect अफ गर्नुहोस्। तपाईं निर्देशनहरू प्राप्त गर्न चाहनुहुन्छ भने डिभाइसको उत्पादकको ग्राहक सेवा विभाग नामक पेजमा जानुहोस्।</translation>
 <translation id="5300814202279832142">विन्डो सारेर डेस्कमा लैजानुहोस्</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">कनेक्ट गर्नुहोस्</translation>
@@ -472,6 +475,7 @@
 <translation id="583281660410589416">अज्ञात</translation>
 <translation id="5843706793424741864">फरेनहाइट</translation>
 <translation id="5849570051105887917">गृहपृष्ठ प्रदायकको कोड</translation>
+<translation id="5856532218727053281">Write Protection को स्थिति पुष्टि गरेपछि सिस्टम रिस्टार्ट गरिने छ</translation>
 <translation id="5859603669299126575">आर्ट ग्यालेरी एल्बम</translation>
 <translation id="5860033963881614850">बन्द</translation>
 <translation id="5860491529813859533">अन गर्नुहोस्</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb
index 615967a..f06ad95a 100644
--- a/chromeos/strings/chromeos_strings_nl.xtb
+++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Nauwkeurigheid van zwevendekommagetallen</translation>
 <translation id="2448312741937722512">Type</translation>
 <translation id="2461822463642141190">Huidig</translation>
+<translation id="2480034874476596812">Handmatig uitzetten</translation>
 <translation id="2491955442992294626">Toetsen worden niet getest als je een ander venster gebruikt</translation>
 <translation id="2493126929778606526">Je beste foto's, automatisch geselecteerd</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Lange vertraging voor HTTPS-websites</translation>
 <translation id="3621202678540785336">Ingang</translation>
 <translation id="3632579075709132555">Privacyscherm schakelen</translation>
+<translation id="3678765385266369662">Selecteer hoe je Write Protect wilt uitzetten</translation>
 <translation id="3689839747745352263">Test <ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">Bezig met laden...</translation>
 <translation id="3708186454126126312">Eerder verbonden</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Je hebt minimaal 500 MB vrije ruimte nodig om een geheugentest uit te voeren. Ga naar Instellingen &gt; Opslagbeheer om ruimte vrij te maken.</translation>
 <translation id="4250229828105606438">Screenshot</translation>
 <translation id="4258281355379922695">HTTP-vertraging</translation>
+<translation id="4258561075226177474">Het apparaat gaat naar dezelfde gebruiker. Gebruikersgegevens wissen?</translation>
 <translation id="4271957103967917607">Bekijken op volledig scherm</translation>
 <translation id="4275799948641988986">Door wie wordt het apparaat na reparatie gebruikt?</translation>
 <translation id="4289540628985791613">Overzicht</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Updaten</translation>
 <translation id="4744944742468440486">Informatie met betrekking tot je selectie</translation>
 <translation id="4773299976671772492">Beëindigd</translation>
+<translation id="4774530504324923332">Je hebt een beveiligingssleutel waarvoor RSU aanstaat, een QR-codescanner en een tweede apparaat met een internetverbinding nodig</translation>
 <translation id="4782311465517282004">Als je met de rechtermuisknop op tekst klikt of op tekst tikt en deze vasthoudt, kun je definities, vertalingen of eenheidsconversies opvragen</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> foto('s)</translation>
 <translation id="4793710386569335688">Ga voor meer hulp naar het <ph name="BEGIN_LINK" />Helpcentrum<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Wifi-netwerk is niet beveiligd</translation>
 <translation id="5376354385557966694">Automatisch lichte modus</translation>
 <translation id="537872351913703572">Het apparaat gaat naar een andere gebruiker of organisatie</translation>
+<translation id="5395600419410242651">Alle gegevens wissen</translation>
 <translation id="5400907029458559844">Apparaat maakt verbinding.</translation>
 <translation id="5401938042319910061">Alle routines uitvoeren</translation>
 <translation id="5423849171846380976">Geactiveerd</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">USB-touchscreen</translation>
 <translation id="7595982850646262331">Nog <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Meer informatie in het Helpcentrum</translation>
+<translation id="7626501172915339021">RSU (RMA Server Unlock) uitvoeren</translation>
 <translation id="763165478673169849">Laatste resettijd</translation>
 <translation id="7648838807254605802">Lage HTTPS-latentie</translation>
 <translation id="7656388927906093505">Apparaat is een muis.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Deze zoekopdracht melden</translation>
 <translation id="9088306295921699330">Huidig gebruik</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Je moet het apparaat uit elkaar halen</translation>
+<translation id="9098156406873149060">Gebruikersgegevens behouden</translation>
 <translation id="910415269708673980">Ticket voor <ph name="PRINCIPAL_NAME" /> vernieuwen</translation>
 <translation id="9106415115617144481">Pagina <ph name="PAGE_NUMBER" /> scannen</translation>
 <translation id="9111102763498581341">Ontgrendelen</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb
index eb2570ac..40859e1 100644
--- a/chromeos/strings/chromeos_strings_no.xtb
+++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Nøyaktighet av flytende desimalpunkt</translation>
 <translation id="2448312741937722512">Type</translation>
 <translation id="2461822463642141190">Nåværende</translation>
+<translation id="2480034874476596812">Slå av manuelt</translation>
 <translation id="2491955442992294626">Taster blir ikke testet når du bruker andre vinduer</translation>
 <translation id="2493126929778606526">De beste bildene dine, valgt automatisk</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Høy tidsforsinkelse til HTTPS-nettsteder</translation>
 <translation id="3621202678540785336">Inndata</translation>
 <translation id="3632579075709132555">Personvernskjerm av/på</translation>
+<translation id="3678765385266369662">Velg hvordan du vil slå av skrivebeskyttelsen</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" />test</translation>
 <translation id="370665806235115550">Laster inn ...</translation>
 <translation id="3708186454126126312">Tidligere tilkoblet</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Du må ha minst 500 MB ledig for å kjøre en minnetest. For å frigjøre plass, gå til Innstillinger &gt; Lagringsbehandling.</translation>
 <translation id="4250229828105606438">Skjermdump</translation>
 <translation id="4258281355379922695">HTTP-tidsforsinkelse</translation>
+<translation id="4258561075226177474">Enheten skal ha samme bruker som før Vil du slette brukerdataene?</translation>
 <translation id="4271957103967917607">Vis i fullskjerm</translation>
 <translation id="4275799948641988986">Hvem skal bruke enheten etter at den er reparert?</translation>
 <translation id="4289540628985791613">Oversikt</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Oppdater</translation>
 <translation id="4744944742468440486">Informasjon om det du har markert</translation>
 <translation id="4773299976671772492">Stoppet</translation>
+<translation id="4774530504324923332">Du trenger en RSU-kompatibel sikkerhetsnøkkel, en QR-kodeskanner og en ekstra enhet med internettilkobling</translation>
 <translation id="4782311465517282004">Få definisjoner, oversettelser eller enhetskonverteringer når du høyreklikker eller trykker og holder inne på tekst</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> bilde</translation>
 <translation id="4793710386569335688">For å få mer hjelp, gå til <ph name="BEGIN_LINK" />brukerstøtten<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Wi-Fi-nettverket er ikke sikkert</translation>
 <translation id="5376354385557966694">Automatisk lys modus</translation>
 <translation id="537872351913703572">Enheten skal få ny bruker eller organisasjon</translation>
+<translation id="5395600419410242651">Slett alle data</translation>
 <translation id="5400907029458559844">Enheten kobler seg til.</translation>
 <translation id="5401938042319910061">Kjør alle rutinene</translation>
 <translation id="5423849171846380976">Aktivert</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">USB-berøringsskjerm</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> igjen</translation>
 <translation id="7620771111601174153">Finn ut mer i Brukerstøtte</translation>
+<translation id="7626501172915339021">Utfør RMA-tjeneropplåsing (RSU)</translation>
 <translation id="763165478673169849">Forrige tidspunkt for tilbakestilling</translation>
 <translation id="7648838807254605802">Høy HTTPS-tidsforsinkelse</translation>
 <translation id="7656388927906093505">Enheten er en mus.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Rapportér dette søket</translation>
 <translation id="9088306295921699330">Nåværende bruk</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Du må ta enheten fra hverandre</translation>
+<translation id="9098156406873149060">Behold brukerdata</translation>
 <translation id="910415269708673980">Oppdater saken for <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Skanner side <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Lås opp</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb
index 215f5b62..b3fb3c53 100644
--- a/chromeos/strings/chromeos_strings_or.xtb
+++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">ତୁରନ୍ତ ଏକ ନୂଆ ବାଛନ୍ତୁ</translation>
 <translation id="4891842000192098784">ଷ୍ଟ୍ରେସ୍</translation>
 <translation id="4897058166682006107">ଡିଭାଇସର ବାମପଟ ବଡରେ <ph name="BATTERY_PERCENTAGE" />% ବ୍ୟାଟେରୀ ଚାର୍ଜ ଅଛି।</translation>
+<translation id="4915052247106771211">ଏହା ଡିଭାଇସକୁ ଫ୍ୟାକ୍ଟୋରୀ ସେଟିଂସ (ପାୱାରୱାସ)ରେ ରିସେଟ କରିବ।</translation>
 <translation id="4917385247580444890">ଦୃଢ଼</translation>
 <translation id="4917889632206600977">ବନ୍ଦ ହୋଇଯାଇଛି - କାଗଜ ସରିଯାଇଛି</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> ସେକେଣ୍ଡରେ <ph name="RATE" /> ଚାର୍ଜ ହୋଇଛି</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">କିଛି ତ୍ରୁଟି ହୋଇଛି। ପୁଣି ଏକ ୱାଲପେପର ବାଛିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ କିମ୍ବା ଆପକୁ ପୁଣି ଖୋଲନ୍ତୁ।</translation>
 <translation id="5372659122375744710">ୱାଇଫାଇ ନେଟୱାର୍କ ସୁରକ୍ଷିତ ନୁହେଁ</translation>
 <translation id="5376354385557966694">ସ୍ଵଚାଳିତ ଲାଇଟ୍ ମୋଡ୍</translation>
+<translation id="537872351913703572">ଡିଭାଇସଟି ଏକ ଭିନ୍ନ ଉପଯୋଗକର୍ତ୍ତା କିମ୍ବା ସଂସ୍ଥା ପାଖରେ ରହିବ</translation>
 <translation id="5400907029458559844">ଡିଭାଇସ ସଂଯୋଗ କରାଯାଉଛି।</translation>
 <translation id="5401938042319910061">ସମସ୍ତ ରୁଟିନ୍ ଚଲାନ୍ତୁ</translation>
 <translation id="5423849171846380976">ସକ୍ରିୟ କରାଯାଇଛି</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349"><ph name="VERSION_NUMBER" />ରେ ଅପଡେଟ କରି ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ</translation>
 <translation id="8675354002693747642">ପୂର୍ବରୁ-ସେୟାର୍ କରାଯାଇଥିବା କୀ</translation>
 <translation id="8677859815076891398">କୌଣସି ଆଲବମ୍ ନାହିଁ। <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />ରେ ଏକ ଆଲବମ୍ ତିଆରି କରନ୍ତୁ।</translation>
+<translation id="8680431479333800907">ଡିଭାଇସଟି ସେହି ସମାନ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଖରେ ରହିବ</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> ଏହି ଫିଚରକୁ ପରିଚାଳନା କରିବା ପାଇଁ ବାମ କିମ୍ବା ଡାହାଣ ତୀର କୀ ବ୍ୟବହାର କରନ୍ତୁ।</translation>
 <translation id="8712637175834984815">ବୁଝିଗଲି</translation>
 <translation id="871560550817059752">ବିଫଳ ହୋଇଛି - ସ୍ୟାହି ଶେଷ ହୋଇଯାଇଛି</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb
index 4985354..f8a706b 100644
--- a/chromeos/strings/chromeos_strings_pa.xtb
+++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">ਗੂੜ੍ਹਾ ਥੀਮ ਬੰਦ ਕਰੋ</translation>
 <translation id="1807246157184219062">ਹਲਕਾ</translation>
 <translation id="1827738518074806965">ਕਲਾ ਗੈਲਰੀ</translation>
+<translation id="1840835860961531162">ਲਿਖਣ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ ਬੰਦ ਕਰੋ</translation>
 <translation id="1851218745569890714">ਵੀਡੀਓ ਕਾਨਫਰੰਸਿੰਗ</translation>
 <translation id="1852934301711881861">ChromeOS Flex ਸਥਾਪਤ ਕਰੋ</translation>
 <translation id="1856388568474281774">ਹੇਠਾਂ ਤੀਰ</translation>
@@ -272,6 +273,7 @@
 <translation id="3941014780699102620">ਹੋਸਟ ਨੂੰ ਹੱਲ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ</translation>
 <translation id="3942420633017001071">ਤਸ਼ਖੀਸ</translation>
 <translation id="3954678691475912818">ਡੀਵਾਈਸ ਦੀ ਕਿਸਮ ਅਗਿਆਤ ਹੈ।</translation>
+<translation id="3958703339436883942">ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation>
 <translation id="3966286471246132217">ਜ਼ਿਆਦਾ ਸਟੀਕ ਨਤੀਜਿਆਂ ਲਈ, ਟੈਸਟ ਪੂਰਾ ਹੋਣ ਤੱਕ ਸਾਰੀਆਂ ਐਪਾਂ ਬੰਦ ਰੱਖੋ।</translation>
 <translation id="3967822245660637423">ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ</translation>
 <translation id="3969602104473960991">ChromeOS ਦਾ ਪਾਸਵਰਡ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ</translation>
@@ -417,6 +419,7 @@
 <translation id="5275828089655680674">ਨਿਯਮਬੱਧ ਕੰਮਾਂ ਨੂੰ ਮੁੜ-ਚਲਾਓ</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">ਵਰਜਨ <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">ਅਗਲੀ ਸਕ੍ਰੀਨ 'ਤੇ ਜਾਣਾ ਜਾਰੀ ਰੱਖਣ ਲਈ ਲਿਖਣ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ ਨੂੰ ਬੰਦ ਕਰੋ। ਹਿਦਾਇਤਾਂ ਲਈ ਡੀਵਾਈਸ ਨਿਰਮਾਤਾ ਸੰਬੰਧੀ ਸਹਾਇਤਾ ਪੰਨੇ 'ਤੇ ਜਾਓ।</translation>
 <translation id="5300814202279832142">ਵਿੰਡੋ ਨੂੰ ਡੈਸਕ 'ਤੇ ਲਿਜਾਓ</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">ਕਨੈਕਟ ਕਰੋ</translation>
@@ -467,6 +470,7 @@
 <translation id="583281660410589416">ਅਗਿਆਤ</translation>
 <translation id="5843706793424741864">ਫਾਰੇਨਹੀਟ</translation>
 <translation id="5849570051105887917">ਹੋਮ ਪ੍ਰਦਾਨਕ ਕੋਡ</translation>
+<translation id="5856532218727053281">ਲਿਖਣ ਸੰਬੰਧੀ ਸੁਰੱਖਿਆ ਸਥਿਤੀ ਦੀ ਪੁਸ਼ਟੀ ਕਰਨ ਤੋਂ ਬਾਅਦ ਸਿਸਟਮ ਮੁੜ-ਸ਼ੁਰੂ ਹੋਵੇਗਾ</translation>
 <translation id="5859603669299126575">ਕਲਾ ਗੈਲਰੀ ਐਲਬਮ</translation>
 <translation id="5860033963881614850">ਬੰਦ ਕਰੋ</translation>
 <translation id="5860491529813859533">ਚਾਲੂ ਕਰੋ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb
index c4896a6f..10cb4b3 100644
--- a/chromeos/strings/chromeos_strings_pl.xtb
+++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">Wyłącz ciemny motyw</translation>
 <translation id="1807246157184219062">Jasny</translation>
 <translation id="1827738518074806965">Galeria sztuki</translation>
+<translation id="1840835860961531162">Wyłącz zabezpieczenie przed zapisem</translation>
 <translation id="1851218745569890714">Rozmowy wideo</translation>
 <translation id="1852934301711881861">Zainstaluj ChromeOS Flex</translation>
 <translation id="1856388568474281774">Strzałka w dół</translation>
@@ -272,6 +273,7 @@
 <translation id="3941014780699102620">Nie udało się znaleźć hosta</translation>
 <translation id="3942420633017001071">Diagnostyka</translation>
 <translation id="3954678691475912818">Typ urządzenia jest nieznany.</translation>
+<translation id="3958703339436883942">Przygotowuję ponowne uruchomienie…</translation>
 <translation id="3966286471246132217">Aby uzyskać dokładniejsze wyniki, zamknij wszystkie aplikacje do czasu ukończenia testu.</translation>
 <translation id="3967822245660637423">Pobieranie zakończone</translation>
 <translation id="3969602104473960991">Hasło do Chrome OS zostało zaktualizowane</translation>
@@ -418,6 +420,7 @@
 <translation id="5275828089655680674">Uruchom ponownie testy</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">wersja <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">Aby przejść na następny ekran, wyłącz zabezpieczenie przed zapisem. Instrukcje znajdziesz na stronie pomocy udostępnianej przez producenta urządzenia.</translation>
 <translation id="5300814202279832142">Przenieś okno na biurko</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">Połącz</translation>
@@ -468,6 +471,7 @@
 <translation id="583281660410589416">Nieznany</translation>
 <translation id="5843706793424741864">Stopnie Fahrenheita</translation>
 <translation id="5849570051105887917">Kod operatora macierzystego</translation>
+<translation id="5856532218727053281">System uruchomi się ponownie po sprawdzeniu stanu zabezpieczenia przed zapisem</translation>
 <translation id="5859603669299126575">Album Galeria sztuki</translation>
 <translation id="5860033963881614850">Wyłączone</translation>
 <translation id="5860491529813859533">Włącz</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb
index 1081bcf4..94771751 100644
--- a/chromeos/strings/chromeos_strings_pt-PT.xtb
+++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -378,6 +378,7 @@
 <translation id="4890353053343094602">Escolha uma nova de imediato</translation>
 <translation id="4891842000192098784">Tensão</translation>
 <translation id="4897058166682006107">O dispositivo tem <ph name="BATTERY_PERCENTAGE" />% de bateria no auricular esquerdo.</translation>
+<translation id="4915052247106771211">Esta ação repõe as definições de fábrica do dispositivo (Powerwash).</translation>
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4917889632206600977">Parada – Sem papel</translation>
 <translation id="4921665434385737356">Carregou <ph name="RATE" /> em <ph name="NUM_SECONDS" /> segundos.</translation>
@@ -433,6 +434,7 @@
 <translation id="5358174242040570474">Algo correu mal. Experimente escolher novamente uma imagem de fundo ou reabra a app.</translation>
 <translation id="5372659122375744710">A rede Wi-Fi não é segura.</translation>
 <translation id="5376354385557966694">Modo claro automático</translation>
+<translation id="537872351913703572">O dispositivo vai para um utilizador ou uma organização diferente</translation>
 <translation id="5400907029458559844">O dispositivo está a ligar.</translation>
 <translation id="5401938042319910061">Executar todas as rotinas</translation>
 <translation id="5423849171846380976">Activado</translation>
@@ -737,6 +739,7 @@
 <translation id="8671972493856476349">Atualizar para <ph name="VERSION_NUMBER" /> e reiniciar</translation>
 <translation id="8675354002693747642">Chave pré-partilhada</translation>
 <translation id="8677859815076891398">Não existem álbuns. Crie um álbum no <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">O dispositivo vai para o mesmo utilizador</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Utilize as teclas das setas para a esquerda ou para a direita para gerir esta funcionalidade.</translation>
 <translation id="8712637175834984815">Entendido</translation>
 <translation id="871560550817059752">Falha – Sem tinta</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb
index 5379b8f..43f121e 100644
--- a/chromeos/strings/chromeos_strings_ru.xtb
+++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Точность чисел с плавающей запятой</translation>
 <translation id="2448312741937722512">Тип</translation>
 <translation id="2461822463642141190">Расход энергии</translation>
+<translation id="2480034874476596812">Отключить вручную</translation>
 <translation id="2491955442992294626">Пока активно другое окно, проверка клавиатуры не выполняется</translation>
 <translation id="2493126929778606526">Ваши лучшие фото, отобранные автоматически</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Длительная задержка у HTTPS-сайтов.</translation>
 <translation id="3621202678540785336">Вход</translation>
 <translation id="3632579075709132555">Включение экрана конфиденциальности</translation>
+<translation id="3678765385266369662">Выберите способ отключения защиты от записи</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" />: тестирование</translation>
 <translation id="370665806235115550">Загрузка...</translation>
 <translation id="3708186454126126312">Ранее подключенные устройства</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Для запуска проверки памяти вам нужно не менее 500 МБ незанятого пространства. Чтобы освободить место, выберите "Настройки &gt; Управление хранилищем".</translation>
 <translation id="4250229828105606438">Скриншот</translation>
 <translation id="4258281355379922695">Время ожидания HTTP</translation>
+<translation id="4258561075226177474">Устройство будет возвращено прежнему пользователю. Удалить данные?</translation>
 <translation id="4271957103967917607">Перейти в полноэкранный режим</translation>
 <translation id="4275799948641988986">Кто будет пользоваться устройством после ремонта?</translation>
 <translation id="4289540628985791613">Обзор</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Обновить</translation>
 <translation id="4744944742468440486">Информация на основе выделенного текста</translation>
 <translation id="4773299976671772492">Остановлено</translation>
+<translation id="4774530504324923332">Потребуется электронный ключ с поддержкой RSU, сканер QR-кодов и второе устройство с доступом в интернет</translation>
 <translation id="4782311465517282004">Получайте определения слов, перевод или значение в других единицах измерения: достаточно нажать на текст правой кнопкой мыши или коснуться его и удерживать.</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> фото</translation>
 <translation id="4793710386569335688">Дополнительную информацию можно найти в <ph name="BEGIN_LINK" />Справочном центре<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Сеть Wi-Fi недостаточно безопасна.</translation>
 <translation id="5376354385557966694">Автоматическая светлая тема</translation>
 <translation id="537872351913703572">Устройство будет передано другому пользователю или организации</translation>
+<translation id="5395600419410242651">Удалить все данные</translation>
 <translation id="5400907029458559844">Устройство подключается.</translation>
 <translation id="5401938042319910061">Запустить все проверки</translation>
 <translation id="5423849171846380976">Активировано</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">Сенсорный экран USB</translation>
 <translation id="7595982850646262331">Ещё <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Узнать больше в Справочном центре</translation>
+<translation id="7626501172915339021">Выполнить RSU (разблокировать сервер разрешения на возврат товара)</translation>
 <translation id="763165478673169849">Время последнего сброса</translation>
 <translation id="7648838807254605802">большое время ожидания HTTPS</translation>
 <translation id="7656388927906093505">Это мышь.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Сообщить о запросе</translation>
 <translation id="9088306295921699330">Используется</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">Потребуется разобрать устройство</translation>
+<translation id="9098156406873149060">Сохранить пользовательские данные</translation>
 <translation id="910415269708673980">Обновите билет для аккаунта <ph name="PRINCIPAL_NAME" />.</translation>
 <translation id="9106415115617144481">Сканирование страницы <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Разблокировать</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index ac093af..8b21be1 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">වහාම අලුත් එකක් තෝරන්න</translation>
 <translation id="4891842000192098784">ආතතිය</translation>
 <translation id="4897058166682006107">උපාංගයෙහි බැටරි බඩ් <ph name="BATTERY_PERCENTAGE" />% ඉතිරිව ඇත.</translation>
+<translation id="4915052247106771211">මෙය උපාංගය කර්මාන්තශාලා සැකසීම් වෙත යළි සකසනු ඇත (Powerwash).</translation>
 <translation id="4917385247580444890">ශක්තිමත්</translation>
 <translation id="4917889632206600977">නැවතිණි - කඩදාසි අවසන් වී ඇත</translation>
 <translation id="4921665434385737356">තත්පර <ph name="NUM_SECONDS" />ක් තුළ <ph name="RATE" /> ආරෝපණය විය.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">යම් දෙයක් වැරදිණි. නැවත වෝල්පේපරයක් තෝරා ගැනීමට හෝ යෙදුම යළි විවෘත කිරීමට උත්සාහ කරන්න.</translation>
 <translation id="5372659122375744710">WiFi ජාලය ආරක්ෂිත නැත</translation>
 <translation id="5376354385557966694">ස්වයංක්‍රිය ආලෝක ප්‍රකාරය</translation>
+<translation id="537872351913703572">උපාංගය වෙනත් පරිශීලකයෙකු හෝ සංවිධානයක් වෙත යනු ඇත</translation>
 <translation id="5400907029458559844">උපාංගය සම්බන්ධ වෙමින් පවතී.</translation>
 <translation id="5401938042319910061">සියලු දින චර්යා ධාවනය කරන්න</translation>
 <translation id="5423849171846380976">සක්‍රිය කෙරිණි</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349"><ph name="VERSION_NUMBER" /> වෙත යාවත්කාලීන කර යළි අරඹන්න</translation>
 <translation id="8675354002693747642">පෙර-බෙදාගත් යතුර</translation>
 <translation id="8677859815076891398">ඇල්බම නොමැත. <ph name="LINK_BEGIN" />Google ඡායාරූප<ph name="LINK_END" /> තුළ ඇල්බමයක් තනන්න.</translation>
+<translation id="8680431479333800907">උපාංගය එම හිමිකරු වෙතම යනු ඇත</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> මෙම විශේෂාංගය කළමනාකරණය කිරීමට වම් හෝ දකුණු ඊතල යතුරු භාවිත කරන්න.</translation>
 <translation id="8712637175834984815">එය ලැබුණා</translation>
 <translation id="871560550817059752">අසාර්ථක විය - තීන්ත නැත</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index 25a93d1..fcf87e8c 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Takoj izberite novo</translation>
 <translation id="4891842000192098784">Obremenitev</translation>
 <translation id="4897058166682006107">Raven napolnjenosti baterije leve slušalke: <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">S tem bo naprava ponastavljena na tovarniške nastavitve (Powerwash).</translation>
 <translation id="4917385247580444890">Močan</translation>
 <translation id="4917889632206600977">Ustavljeno – zmanjkalo je papirja</translation>
 <translation id="4921665434385737356">Napolnjeno <ph name="RATE" /> v <ph name="NUM_SECONDS" /> s.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Prišlo je do napake. Poskusite znova izbrati zaslonsko ozadje ali znova odpreti aplikacijo.</translation>
 <translation id="5372659122375744710">Omrežje Wi-Fi ni varno</translation>
 <translation id="5376354385557966694">Samodejni svetli način</translation>
+<translation id="537872351913703572">Naprava se prenaša k drugemu uporabniku ali organizaciji.</translation>
 <translation id="5400907029458559844">Naprava se povezuje.</translation>
 <translation id="5401938042319910061">Izvedi vse rutine</translation>
 <translation id="5423849171846380976">Aktivirano</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Posodobi na različico <ph name="VERSION_NUMBER" /> in zaženi znova</translation>
 <translation id="8675354002693747642">Ključ v predhodni skupni rabi</translation>
 <translation id="8677859815076891398">Ni albumov. Ustvarite album v <ph name="LINK_BEGIN" />Googlu Foto<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Naprava se prenaša k istemu uporabniku.</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Upravljajte to funkcijo s tipkama puščica levo ali desno.</translation>
 <translation id="8712637175834984815">Razumem</translation>
 <translation id="871560550817059752">Napaka – zmanjkalo je črnila</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb
index 8d67a47..b38adf6 100644
--- a/chromeos/strings/chromeos_strings_sq.xtb
+++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Zgjidh një të re menjëherë</translation>
 <translation id="4891842000192098784">Tensioni</translation>
 <translation id="4897058166682006107">Pajisja ka <ph name="BATTERY_PERCENTAGE" />% bateri në kufjen e majtë.</translation>
+<translation id="4915052247106771211">Kjo do ta rivendosë pajisjen te cilësimet e fabrikës (Powerwash).</translation>
 <translation id="4917385247580444890">I fortë</translation>
 <translation id="4917889632206600977">Ndaloi - Nuk ka letër</translation>
 <translation id="4921665434385737356">U karikua <ph name="RATE" /> në <ph name="NUM_SECONDS" /> sekonda.</translation>
@@ -429,6 +430,7 @@
 <translation id="5358174242040570474">Ndodhi një gabim. Provo të zgjedhësh sërish një imazh sfondi ose të rihapësh aplikacionin.</translation>
 <translation id="5372659122375744710">Rrjeti Wi-Fi nuk është i sigurt</translation>
 <translation id="5376354385557966694">Modaliteti i ndriçuar automatik</translation>
+<translation id="537872351913703572">Pajisja do të kalojë te një përdorues ose organizatë tjerër</translation>
 <translation id="5400907029458559844">Pajisja po lidhet.</translation>
 <translation id="5401938042319910061">Ekzekuto të gjitha rutinat</translation>
 <translation id="5423849171846380976">U aktivizua</translation>
@@ -732,6 +734,7 @@
 <translation id="8671972493856476349">Përditësoje në <ph name="VERSION_NUMBER" /> dhe rinise</translation>
 <translation id="8675354002693747642">Çelës i ndarë paraprakisht</translation>
 <translation id="8677859815076891398">Nuk ka albume. Krijo një album te <ph name="LINK_BEGIN" />Fotografitë e Google<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Pajisja do të kalojë tek i njëjti përdorues</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Përdor tastet "Shigjeta majtas" ose "Shigjeta djathtas" për ta menaxhuar këtë veçori.</translation>
 <translation id="8712637175834984815">E kuptova</translation>
 <translation id="871560550817059752">Dështoi - Nuk ka bojë</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb
index 9401fd3..980803d 100644
--- a/chromeos/strings/chromeos_strings_sv.xtb
+++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Välj ett nytt omedelbart</translation>
 <translation id="4891842000192098784">Stress</translation>
 <translation id="4897058166682006107">Batterinivån för vänster hörsnäcka på enheten är <ph name="BATTERY_PERCENTAGE" /> %.</translation>
+<translation id="4915052247106771211">Det här återställer enheten till standardinställningarna (Powerwash).</translation>
 <translation id="4917385247580444890">Stark</translation>
 <translation id="4917889632206600977">Har stoppats – slut på papper</translation>
 <translation id="4921665434385737356">Har laddat <ph name="RATE" /> på <ph name="NUM_SECONDS" /> sekunder.</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Något gick fel. Testa att välja en bakgrund igen eller öppna appen på nytt.</translation>
 <translation id="5372659122375744710">wifi-nätverket är inte säkert</translation>
 <translation id="5376354385557966694">Automatiskt ljust läge</translation>
+<translation id="537872351913703572">En annan användare eller organisation tar över enheten</translation>
 <translation id="5400907029458559844">Enheter ansluter.</translation>
 <translation id="5401938042319910061">Kör alla rutiner</translation>
 <translation id="5423849171846380976">Aktiverat</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">Uppdatera till version <ph name="VERSION_NUMBER" /> och starta om enheten</translation>
 <translation id="8675354002693747642">I förväg delad nyckel</translation>
 <translation id="8677859815076891398">Du har inga album. Skapa ett album i <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Samma användare behåller enheten</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Hantera den här funktionen med tangenterna vänster- och högerpil.</translation>
 <translation id="8712637175834984815">Uppfattat</translation>
 <translation id="871560550817059752">Misslyckades – slut på bläck</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb
index b0c8669..75cb7f3 100644
--- a/chromeos/strings/chromeos_strings_sw.xtb
+++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Chagua nenosiri jipya mara moja</translation>
 <translation id="4891842000192098784">Shinikizo</translation>
 <translation id="4897058166682006107">Kiwango cha chaji cha spika ya masikioni ya kushoto ni asilimia <ph name="BATTERY_PERCENTAGE" />.</translation>
+<translation id="4915052247106771211">Hatua hii itarejesha kifaa katika mipangilio kiliyotokanayo kiwandani (Powerwash).</translation>
 <translation id="4917385247580444890">Thabiti</translation>
 <translation id="4917889632206600977">Imesimama - Karatasi zimeisha</translation>
 <translation id="4921665434385737356">Imechaji <ph name="RATE" /> baada ya sekunde <ph name="NUM_SECONDS" />.</translation>
@@ -429,6 +430,7 @@
 <translation id="5358174242040570474">Hitilafu fulani imetokea. Jaribu kuchagua mandhari tena au ufungue programu upya.</translation>
 <translation id="5372659122375744710">Mtandao wa WiFi si salama</translation>
 <translation id="5376354385557966694">Hali ya mwangaza inayowekwa kiotomatiki</translation>
+<translation id="537872351913703572">Kifaa kitaenda kwa mtumiaji au shirika tofauti</translation>
 <translation id="5400907029458559844">Kifaa kinaunganishwa.</translation>
 <translation id="5401938042319910061">Tekeleza Ratiba Zote</translation>
 <translation id="5423849171846380976">Imeamilishwa</translation>
@@ -732,6 +734,7 @@
 <translation id="8671972493856476349">Sasisha iwe <ph name="VERSION_NUMBER" /> na uzime kisha uwashe</translation>
 <translation id="8675354002693747642">Kitufe kilichoshirikiwa awali</translation>
 <translation id="8677859815076891398">Hakuna albamu. Anzisha albamu mpya katika <ph name="LINK_BEGIN" />Picha kwenye Google<ph name="LINK_END" />.</translation>
+<translation id="8680431479333800907">Kifaa kitaenda kwa mtumiaji yule yule</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Tumia vitufe vya vishale vya Kushoto au Kulia kudhibiti kipengele hiki.</translation>
 <translation id="8712637175834984815">Nimeelewa</translation>
 <translation id="871560550817059752">Haijakamilika - Wino umeisha</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 01b97be..e62bcd7 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -91,6 +91,7 @@
 <translation id="1801418420130173017">ముదురు రంగు రూపాన్ని డిజేబుల్ చేయండి</translation>
 <translation id="1807246157184219062">లేత</translation>
 <translation id="1827738518074806965">చిత్రకళా గ్యాలరీ</translation>
+<translation id="1840835860961531162">రైట్ ప్రొటెక్ట్‌ను ఆఫ్ చేయండి</translation>
 <translation id="1851218745569890714">వీడియో మీటింగ్‌ నిర్వహించడం</translation>
 <translation id="1852934301711881861">ChromeOS Flexను ఇన్‌స్టాల్ చేయండి</translation>
 <translation id="1856388568474281774">కింది వైపు బాణం</translation>
@@ -272,6 +273,7 @@
 <translation id="3941014780699102620">హోస్ట్‌ను పరిష్కరించడంలో విఫలమైంది</translation>
 <translation id="3942420633017001071">నిర్ధారణలు</translation>
 <translation id="3954678691475912818">పరికరం రకం తెలియదు.</translation>
+<translation id="3958703339436883942">రీస్టార్ట్ చేయడానికి సిద్ధం చేస్తోంది...</translation>
 <translation id="3966286471246132217">మరింత ఖచ్చితమైన ఫలితాల కోసం, టెస్ట్ పూర్తయ్యే వరకు అన్ని యాప్‌లను మూసివేయండి.</translation>
 <translation id="3967822245660637423">డౌన్‌లోడ్ పూర్తయింది</translation>
 <translation id="3969602104473960991">ChromeOS పాస్‌వర్డ్ అప్‌డేట్ చేయబడింది</translation>
@@ -417,6 +419,7 @@
 <translation id="5275828089655680674">రొటీన్‌లను మళ్లీ అమలు చేయి</translation>
 <translation id="5286252187236914003">L2TP/IPsec</translation>
 <translation id="5294769550414936029">వెర్షన్ <ph name="MILESTONE_VERSION" /></translation>
+<translation id="5298334025463010990">తర్వాత స్క్రీన్‌కు కొనసాగడానికి రైట్ ప్రొటెక్ట్‌ను డిజేబుల్‌ చేయండి. సూచనల కోసం పరికరం తయారీదారుని సపోర్ట్ పేజీకి వెళ్లండి.</translation>
 <translation id="5300814202279832142">విండోను డెస్క్‌కు తరలించు</translation>
 <translation id="5304899856529773394">EVDO</translation>
 <translation id="5308380583665731573">కనెక్ట్ చేయండి</translation>
@@ -467,6 +470,7 @@
 <translation id="583281660410589416">తెలియని</translation>
 <translation id="5843706793424741864">ఫారెన్‌హీట్</translation>
 <translation id="5849570051105887917">స్వస్థల నెట్‌వర్క్ ప్రదాత కోడ్</translation>
+<translation id="5856532218727053281">రైట్ ప్రొటెక్షన్ స్టేటస్‌ను వెరిఫై చేసిన తర్వాత సిస్టమ్ రీస్టార్ట్ అవుతుంది</translation>
 <translation id="5859603669299126575">చిత్రకళా గ్యాలరీ ఆల్బమ్</translation>
 <translation id="5860033963881614850">ఆఫ్ అయ్యింది</translation>
 <translation id="5860491529813859533">ఆన్ చేయండి</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index d643f38..1ad66def 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -157,6 +157,7 @@
 <translation id="2446553403094072641">ความแม่นยำของจุดลอยตัว</translation>
 <translation id="2448312741937722512">ประเภท</translation>
 <translation id="2461822463642141190">ปัจจุบัน</translation>
+<translation id="2480034874476596812">ปิดด้วยตัวเอง</translation>
 <translation id="2491955442992294626">แป้นจะไม่ได้รับการทดสอบเมื่อใช้หน้าต่างอื่น</translation>
 <translation id="2493126929778606526">รูปภาพที่ดีที่สุดซึ่งเลือกสรรมาให้คุณโดยอัตโนมัติ</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -252,6 +253,7 @@
 <translation id="3606583719724308068">เวลาในการตอบสนองไปยังเว็บไซต์ HTTPS สูง</translation>
 <translation id="3621202678540785336">อินพุต</translation>
 <translation id="3632579075709132555">เปิด/ปิดหน้าจอความเป็นส่วนตัว</translation>
+<translation id="3678765385266369662">เลือกว่าคุณต้องการปิด Write Protect อย่างไร</translation>
 <translation id="3689839747745352263">การทดสอบ <ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">กำลังโหลด ...</translation>
 <translation id="3708186454126126312">อุปกรณ์ที่เคยเชื่อมต่อ</translation>
@@ -307,6 +309,7 @@
 <translation id="4244962993387259361">คุณต้องมีพื้นที่เหลืออย่างน้อย 500 MB จึงจะทดสอบหน่วยความจำได้ ไปที่การตั้งค่า &gt; การจัดการพื้นที่เก็บข้อมูลเพื่อเพิ่มพื้นที่</translation>
 <translation id="4250229828105606438">ภาพหน้าจอ</translation>
 <translation id="4258281355379922695">เวลาในตอบสนองของ HTTP</translation>
+<translation id="4258561075226177474">อุปกรณ์จะยังอยู่กับผู้ใช้คนเดิม ลบข้อมูลผู้ใช้ไหม</translation>
 <translation id="4271957103967917607">ดูแบบเต็มหน้าจอ</translation>
 <translation id="4275799948641988986">ใครจะเป็นผู้ใช้อุปกรณ์หลังจากซ่อมแล้ว</translation>
 <translation id="4289540628985791613">ภาพรวม</translation>
@@ -355,6 +358,7 @@
 <translation id="473775607612524610">อัปเดต</translation>
 <translation id="4744944742468440486">ข้อมูลที่เกี่ยวข้องกับสิ่งที่คุณเลือก</translation>
 <translation id="4773299976671772492">หยุดแล้ว</translation>
+<translation id="4774530504324923332">คุณจะต้องมีคีย์ความปลอดภัยที่พร้อมใช้งาน RSU, เครื่องมือสแกนคิวอาร์โค้ด และอุปกรณ์เครื่องที่ 2 ที่มีการเชื่อมต่ออินเทอร์เน็ต</translation>
 <translation id="4782311465517282004">รับคำจำกัดความ คำแปล หรือการแปลงหน่วยเมื่อคุณคลิกขวาหรือแตะข้อความค้างไว้</translation>
 <translation id="4791000909649665275">รูปภาพ <ph name="NUMBER" /> รูป</translation>
 <translation id="4793710386569335688">ดูความช่วยเหลือเพิ่มเติมได้ที่<ph name="BEGIN_LINK" />ศูนย์ช่วยเหลือ<ph name="END_LINK" /></translation>
@@ -378,6 +382,7 @@
 <translation id="4890353053343094602">อย่ารอช้า รีบเลือกรหัสผ่านใหม่</translation>
 <translation id="4891842000192098784">ประสิทธิภาพเมื่อเพิ่มแรงกดดัน</translation>
 <translation id="4897058166682006107">อุปกรณ์มีระดับแบตเตอรี่ของหูฟังข้างซ้าย <ph name="BATTERY_PERCENTAGE" />%</translation>
+<translation id="4915052247106771211">ตัวเลือกนี้จะรีเซ็ตอุปกรณ์เป็นการตั้งค่าเริ่มต้น (Powerwash)</translation>
 <translation id="4917385247580444890">แรง</translation>
 <translation id="4917889632206600977">หยุดพิมพ์ - กระดาษหมด</translation>
 <translation id="4921665434385737356">ชาร์จ <ph name="RATE" /> ใน <ph name="NUM_SECONDS" /> วินาที</translation>
@@ -433,6 +438,8 @@
 <translation id="5358174242040570474">เกิดข้อผิดพลาด ลองเลือกวอลเปเปอร์อีกครั้งหรือเปิดแอปใหม่</translation>
 <translation id="5372659122375744710">เครือข่าย WiFi ไม่ปลอดภัย</translation>
 <translation id="5376354385557966694">โหมดสว่างอัตโนมัติ</translation>
+<translation id="537872351913703572">อุปกรณ์จะไปอยู่กับผู้ใช้หรือองค์กรใหม่</translation>
+<translation id="5395600419410242651">ลบข้อมูลทั้งหมด</translation>
 <translation id="5400907029458559844">อุปกรณ์กำลังเชื่อมต่อ</translation>
 <translation id="5401938042319910061">เรียกใช้กิจวัตรทั้งหมด</translation>
 <translation id="5423849171846380976">เปิดอยู่</translation>
@@ -644,6 +651,7 @@
 <translation id="7570674786725311828">หน้าจอสัมผัส USB</translation>
 <translation id="7595982850646262331">เหลือ <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">ดูข้อมูลเพิ่มเติมในศูนย์ช่วยเหลือ</translation>
+<translation id="7626501172915339021">ดำเนินการปลดล็อกเซิร์ฟเวอร์ RMA (RSU)</translation>
 <translation id="763165478673169849">เวลารีเซ็ตล่าสุด</translation>
 <translation id="7648838807254605802">เวลาในการตอบสนองของ HTTPS สูง</translation>
 <translation id="7656388927906093505">อุปกรณ์เป็นเมาส์</translation>
@@ -737,6 +745,7 @@
 <translation id="8671972493856476349">อัปเดตเป็น <ph name="VERSION_NUMBER" /> และรีสตาร์ท</translation>
 <translation id="8675354002693747642">คีย์ที่แชร์ล่วงหน้า</translation>
 <translation id="8677859815076891398">ไม่มีอัลบั้ม สร้างอัลบั้มใน <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /></translation>
+<translation id="8680431479333800907">อุปกรณ์จะยังอยู่กับผู้ใช้คนเดิม</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> ใช้แป้นลูกศรซ้ายหรือขวาเพื่อจัดการฟีเจอร์นี้</translation>
 <translation id="8712637175834984815">สำเร็จ</translation>
 <translation id="871560550817059752">ไม่สำเร็จ - หมึกหมด</translation>
@@ -786,6 +795,8 @@
 <translation id="9087578468327036362">โปรดรายงานการค้นหานี้</translation>
 <translation id="9088306295921699330">การใช้งานปัจจุบัน</translation>
 <translation id="9095775724867566971">Pluginvm</translation>
+<translation id="90977145661420967">คุณจะต้องแยกชิ้นส่วนอุปกรณ์</translation>
+<translation id="9098156406873149060">เก็บข้อมูลผู้ใช้ไว้</translation>
 <translation id="910415269708673980">รีเฟรชตั๋วสำหรับ <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">กำลังสแกนหน้า <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">ปลดล็อก</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index 13595bd8..c444633 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">Hemen yeni bir tane seçin</translation>
 <translation id="4891842000192098784">Stres</translation>
 <translation id="4897058166682006107">Cihazın sol kulaklık pili %<ph name="BATTERY_PERCENTAGE" /> düzeyinde.</translation>
+<translation id="4915052247106771211">Bu işlemden sonra cihaz fabrika ayarlarına sıfırlanır (Powerwash).</translation>
 <translation id="4917385247580444890">Güçlü</translation>
 <translation id="4917889632206600977">Durduruldu - Kağıt bitti</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> saniyede <ph name="RATE" /> şarj oldu</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">Bir sorun oldu. Tekrar bir duvar kağıdı seçmeyi deneyin veya uygulamayı yeniden açın.</translation>
 <translation id="5372659122375744710">Kablosuz ağ güvenli değil</translation>
 <translation id="5376354385557966694">Otomatik açık mod</translation>
+<translation id="537872351913703572">Cihaz başka bir kullanıcı veya kuruluşa teslim edilir</translation>
 <translation id="5400907029458559844">Cihaz bağlanıyor.</translation>
 <translation id="5401938042319910061">Tüm Rutinleri Çalıştır</translation>
 <translation id="5423849171846380976">Etkin</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349"><ph name="VERSION_NUMBER" /> sürümüne güncelle ve yeniden başlat</translation>
 <translation id="8675354002693747642">Önceden paylaşılan anahtar</translation>
 <translation id="8677859815076891398">Albüm yok. <ph name="LINK_BEGIN" />Google Fotoğraflar<ph name="LINK_END" />'da albüm oluşturun.</translation>
+<translation id="8680431479333800907">Cihaz aynı kullanıcıya teslim edilir</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" /> Bu özelliği yönetmek için sol veya sağ ok tuşlarını kullanın.</translation>
 <translation id="8712637175834984815">Anlaşıldı</translation>
 <translation id="871560550817059752">İşlem başarısız - Mürekkep yok</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb
index 3a942aa..d7556f07 100644
--- a/chromeos/strings/chromeos_strings_uk.xtb
+++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Точність рухомої коми</translation>
 <translation id="2448312741937722512">Тип</translation>
 <translation id="2461822463642141190">Енергоспоживання</translation>
+<translation id="2480034874476596812">Вимкнути вручну</translation>
 <translation id="2491955442992294626">Якщо відкрити інше вікно, клавіші не будуть перевірятися</translation>
 <translation id="2493126929778606526">Ваші найкращі фото, вибрані автоматично</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Велика затримка для веб-сайтів HTTPS</translation>
 <translation id="3621202678540785336">Вхід</translation>
 <translation id="3632579075709132555">Перемикач Екрана конфіденційності</translation>
+<translation id="3678765385266369662">Виберіть спосіб, у який хочете вимкнути захист від запису</translation>
 <translation id="3689839747745352263">Перевірка "<ph name="TEST_NAME" />"</translation>
 <translation id="370665806235115550">Завантаження...</translation>
 <translation id="3708186454126126312">Підключені раніше</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Щоб виконати перевірку пам’яті, потрібно принаймні 500 МБ вільного місця. Щоб звільнити пам’ять, перейдіть у розділ "Налаштування" &gt; "Керування пам’яттю".</translation>
 <translation id="4250229828105606438">Знімок екрана</translation>
 <translation id="4258281355379922695">Затримка HTTP</translation>
+<translation id="4258561075226177474">Власник пристрою не зміниться. Видалити дані користувача?</translation>
 <translation id="4271957103967917607">Переглянути в повноекранному режимі</translation>
 <translation id="4275799948641988986">Хто використовуватиме пристрій після ремонту?</translation>
 <translation id="4289540628985791613">Огляд</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Оновити</translation>
 <translation id="4744944742468440486">Інформація, пов'язана з виділеним текстом</translation>
 <translation id="4773299976671772492">Зупинено</translation>
+<translation id="4774530504324923332">Вам знадобляться ключ безпеки з підтримкою RSU, сканер QR-коду й інший пристрій із доступом до Інтернету</translation>
 <translation id="4782311465517282004">Щоб дізнатися визначення слова, перекласти його або конвертувати одиницю, натисніть правою кнопкою миші або натисніть і втримуйте потрібний текст</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> фото</translation>
 <translation id="4793710386569335688">Щоб дізнатися більше, перейдіть у <ph name="BEGIN_LINK" />Довідковий центр<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Мережа Wi-Fi ненадійна</translation>
 <translation id="5376354385557966694">Автоматичний світлий режим</translation>
 <translation id="537872351913703572">Пристрій буде передано іншому користувачу або організації</translation>
+<translation id="5395600419410242651">Стерти всі дані</translation>
 <translation id="5400907029458559844">Підключення пристрою.</translation>
 <translation id="5401938042319910061">Виконати всі послідовності дій</translation>
 <translation id="5423849171846380976">Активовано</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">Сенсорний екран USB</translation>
 <translation id="7595982850646262331">Ще <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Дізнатися більше в Довідковому центрі</translation>
+<translation id="7626501172915339021">Виконати серверне розблокування RMA (RSU)</translation>
 <translation id="763165478673169849">Час останнього скидання</translation>
 <translation id="7648838807254605802">велика затримка HTTPS</translation>
 <translation id="7656388927906093505">Це миша.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Повідомити про проблеми із запитом</translation>
 <translation id="9088306295921699330">Використовується</translation>
 <translation id="9095775724867566971">PluginVM</translation>
+<translation id="90977145661420967">Вам доведеться розібрати пристрій</translation>
+<translation id="9098156406873149060">Зберегти дані користувача</translation>
 <translation id="910415269708673980">Оновити квиток для користувача <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Сканування сторінки <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Розблокувати</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb
index 2c0c46ff..30de27eb 100644
--- a/chromeos/strings/chromeos_strings_zh-CN.xtb
+++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">请立即设置一个新密码</translation>
 <translation id="4891842000192098784">压力</translation>
 <translation id="4897058166682006107">设备左侧耳机的剩余电池电量为 <ph name="BATTERY_PERCENTAGE" />%。</translation>
+<translation id="4915052247106771211">选择此选项会将设备恢复出厂设置 (Powerwash)。</translation>
 <translation id="4917385247580444890">强</translation>
 <translation id="4917889632206600977">已停止 - 纸张已用完</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> 秒内充了 <ph name="RATE" /> 的电量。</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">出了点问题。请再次尝试选择一种壁纸,或者重新打开该应用。</translation>
 <translation id="5372659122375744710">Wi-Fi 网络不安全</translation>
 <translation id="5376354385557966694">自动浅色模式</translation>
+<translation id="537872351913703572">设备将由另一用户或组织使用</translation>
 <translation id="5400907029458559844">设备正在连接。</translation>
 <translation id="5401938042319910061">运行所有例程</translation>
 <translation id="5423849171846380976">已激活</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">更新至 <ph name="VERSION_NUMBER" /> 并重启</translation>
 <translation id="8675354002693747642">预共享密钥</translation>
 <translation id="8677859815076891398">无任何影集。请在 <ph name="LINK_BEGIN" />Google 相册<ph name="LINK_END" />中创建一个影集。</translation>
+<translation id="8680431479333800907">设备将由原用户使用</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" />使用向左键或向右键即可管理此功能。</translation>
 <translation id="8712637175834984815">知道了</translation>
 <translation id="871560550817059752">失败 - 墨水已用完</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index 6f4e3f2..fb043957 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">立即選擇新密碼</translation>
 <translation id="4891842000192098784">壓力</translation>
 <translation id="4897058166682006107">裝置嘅左邊耳機有 <ph name="BATTERY_PERCENTAGE" />% 電。</translation>
+<translation id="4915052247106771211">此操作會將裝置回復原廠設定 (Powerwash)。</translation>
 <translation id="4917385247580444890">強</translation>
 <translation id="4917889632206600977">已停止 - 紙張已用完</translation>
 <translation id="4921665434385737356">已在 <ph name="NUM_SECONDS" /> 秒內充電 <ph name="RATE" />。</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">發生錯誤,請再次選取桌布,或者重新開啟應用程式</translation>
 <translation id="5372659122375744710">Wi-Fi 網絡不安全</translation>
 <translation id="5376354385557966694">自動明亮模式</translation>
+<translation id="537872351913703572">裝置的使用者或機構將會變更</translation>
 <translation id="5400907029458559844">連接緊裝置。</translation>
 <translation id="5401938042319910061">執行所有日常安排</translation>
 <translation id="5423849171846380976">已啟用</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">請更新至 <ph name="VERSION_NUMBER" /> 並重新啟動</translation>
 <translation id="8675354002693747642">預先共用密鑰</translation>
 <translation id="8677859815076891398">沒有相簿。請在「<ph name="LINK_BEGIN" />Google 相片<ph name="LINK_END" />」中建立相簿。</translation>
+<translation id="8680431479333800907">裝置的使用者不會變更</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" />用向左或者向右箭咀掣就可以管理呢個功能。</translation>
 <translation id="8712637175834984815">我知道了</translation>
 <translation id="871560550817059752">失敗 - 墨水已用完</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index b9e9ed1..3b4ca2c 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -376,6 +376,7 @@
 <translation id="4890353053343094602">立即選擇新密碼</translation>
 <translation id="4891842000192098784">壓力</translation>
 <translation id="4897058166682006107">裝置的左側無線耳機電池電量為 <ph name="BATTERY_PERCENTAGE" />%。</translation>
+<translation id="4915052247106771211">這項操作會將裝置恢復原廠設定 (Powerwash)。</translation>
 <translation id="4917385247580444890">強</translation>
 <translation id="4917889632206600977">已停止 - 紙張用盡</translation>
 <translation id="4921665434385737356"><ph name="NUM_SECONDS" /> 秒內已充電 <ph name="RATE" />。</translation>
@@ -430,6 +431,7 @@
 <translation id="5358174242040570474">發生錯誤,請重新選擇桌布或重新開啟應用程式。</translation>
 <translation id="5372659122375744710">WiFi 網路不安全</translation>
 <translation id="5376354385557966694">自動淺色模式</translation>
+<translation id="537872351913703572">裝置的擁有者或所屬機構會變更</translation>
 <translation id="5400907029458559844">正在連接裝置。</translation>
 <translation id="5401938042319910061">執行所有的日常網路診斷</translation>
 <translation id="5423849171846380976">已啟用</translation>
@@ -733,6 +735,7 @@
 <translation id="8671972493856476349">更新至 <ph name="VERSION_NUMBER" /> 並重新啟動</translation>
 <translation id="8675354002693747642">預先共用金鑰</translation>
 <translation id="8677859815076891398">沒有任何相簿。請在 <ph name="LINK_BEGIN" />Google 相簿<ph name="LINK_END" />中建立相簿。</translation>
+<translation id="8680431479333800907">裝置的擁有者不會變更</translation>
 <translation id="8709616837707653427"><ph name="DESC_TEXT" />請使用向左鍵或向右鍵管理這項功能。</translation>
 <translation id="8712637175834984815">我瞭解了</translation>
 <translation id="871560550817059752">失敗 - 墨水用盡</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index d207e5c..7d54d9ec 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -156,6 +156,7 @@
 <translation id="2446553403094072641">Ukunemba kwephoyinti elintantayo</translation>
 <translation id="2448312741937722512">Uhlobo</translation>
 <translation id="2461822463642141190">Okwamanje</translation>
+<translation id="2480034874476596812">Vala ngokuzenzela</translation>
 <translation id="2491955442992294626">Okhiye abahlolwa uma usebenzisa elinye iwindi</translation>
 <translation id="2493126929778606526">Izithombe zakho ezingcono kakhulu, zikhethwe ngokuzenzakalelayo</translation>
 <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation>
@@ -251,6 +252,7 @@
 <translation id="3606583719724308068">Ukubambezeleka okukhulu kumawebhusayithi we-HTTPS</translation>
 <translation id="3621202678540785336">Okokufaka</translation>
 <translation id="3632579075709132555">Guqula isikrini sobumfihlo</translation>
+<translation id="3678765385266369662">Khetha ukuthi ungathanda ukuyivala kanjani i-Writ Protect</translation>
 <translation id="3689839747745352263">Ukuhlola kwe-<ph name="TEST_NAME" /></translation>
 <translation id="370665806235115550">Kuyalayisha...</translation>
 <translation id="3708186454126126312">Kuxhunywe ngaphambilini</translation>
@@ -305,6 +307,7 @@
 <translation id="4244962993387259361">Udinga okungenani u-500 MB okhululekile ukwenza ukuhlola Kwenkumbulo. Ukuze ukhulule isikhala, iya kokuthi Amasethingi &gt; Ukuphathwa kwesitoreji</translation>
 <translation id="4250229828105606438">Isithombe-skrini</translation>
 <translation id="4258281355379922695">Ukubambezeleka kwe-HTTP</translation>
+<translation id="4258561075226177474">Idivayisi iya kumsebenzisi ofanayo. Sula idatha yomsebenzisi?</translation>
 <translation id="4271957103967917607">Buka Isikrini Esigcwele</translation>
 <translation id="4275799948641988986">Ngemva kokulungiswa, ubani ozobe esebenzisa idivayisi?</translation>
 <translation id="4289540628985791613">Ukubuka konke</translation>
@@ -353,6 +356,7 @@
 <translation id="473775607612524610">Buyekeza</translation>
 <translation id="4744944742468440486">Ulwazi oluhambisana nokukhethile</translation>
 <translation id="4773299976671772492">Imisiwe</translation>
+<translation id="4774530504324923332">Uzodinga ukhiye wokuqinisekisa ubunikazi onikwe amandla yi-RSU, iskena sekhodi ye-QR, kanye nedivayisi yesibili enoxhumo lwe-inthanethi</translation>
 <translation id="4782311465517282004">Thola izincazelo, ukuhunyushwa, noma ukuguqulwa kweyunithi lapho uchofoza ngakwesokudla noma uthinta uphinde ubambe umbhalo</translation>
 <translation id="4791000909649665275"><ph name="NUMBER" /> isithombe</translation>
 <translation id="4793710386569335688">Ukuze uthole usizo olwengeziwe, iya <ph name="BEGIN_LINK" />Esikhungweni Sosizo<ph name="END_LINK" />.</translation>
@@ -432,6 +436,7 @@
 <translation id="5372659122375744710">Inethiwekhi ye-WiFi ayivikelekile</translation>
 <translation id="5376354385557966694">Imodi elula ngokuzenzekelayo</translation>
 <translation id="537872351913703572">Idivayisi izoya kumsebenzisi noma inhlangano ehlukile</translation>
+<translation id="5395600419410242651">Sula yonke idatha</translation>
 <translation id="5400907029458559844">Idivayisi iyaxhuma.</translation>
 <translation id="5401938042319910061">Qalisa Yonke Imijikelezo</translation>
 <translation id="5423849171846380976">Yenziwe yasebenza</translation>
@@ -642,6 +647,7 @@
 <translation id="7570674786725311828">Isikrini esithintwayo se-USB</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> esele</translation>
 <translation id="7620771111601174153">Funda kabanzi Esikhungweni sosizo</translation>
+<translation id="7626501172915339021">Yenza Ukuvula Kweseva ye-RMA (RSU)</translation>
 <translation id="763165478673169849">Isikhathi Sokusetha Kabusha Sokugcina</translation>
 <translation id="7648838807254605802">Ukubambezeleka okuphezulu kwe-HTTPS</translation>
 <translation id="7656388927906093505">Idivayisi iyimawusi.</translation>
@@ -785,6 +791,8 @@
 <translation id="9087578468327036362">Bika lo mbuzo</translation>
 <translation id="9088306295921699330">Ukusetshenziswa kwamanje</translation>
 <translation id="9095775724867566971">I-Pluginvm</translation>
+<translation id="90977145661420967">Uzodinga ukuhlukanisa idivayisi</translation>
+<translation id="9098156406873149060">Gcina idatha yomsebenzisi</translation>
 <translation id="910415269708673980">Vuselela ithikithi le-<ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Iskena ikhasi <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Vula</translation>
diff --git a/components/BUILD.gn b/components/BUILD.gn
index cb8bfb70..650e057 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -82,13 +82,16 @@
   }
 
   if (is_fuchsia) {
-    use_cfv2 = false
-    additional_manifest_fragments = [
-      "//build/config/fuchsia/test/font_capabilities.test-cmx",
+    use_cfv1 = false
 
-      # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed.
-      "//build/config/fuchsia/test/jit_capabilities.test-cmx",
-      "//build/config/fuchsia/test/network_capabilities.test-cmx",
+    # TODO(https://crbug.com/1185811): Investigate removing the requirement for
+    # job_policy_ambient_mark_vmo_exec for the sake of V8's allocator in tests.
+    test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
+
+    additional_manifest_fragments = [
+      "//build/config/fuchsia/test/fonts.shard.test-cml",
+      "//build/config/fuchsia/test/network.shard.test-cml",
+      "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
     ]
   }
 
diff --git a/components/autofill/core/browser/webdata/OWNERS b/components/autofill/core/browser/webdata/OWNERS
index 44502b7..5eb1e8f 100644
--- a/components/autofill/core/browser/webdata/OWNERS
+++ b/components/autofill/core/browser/webdata/OWNERS
@@ -1,8 +1,5 @@
-per-file *sync_bridge*=jkrcal@chromium.org
 per-file *sync_bridge*=file://components/sync/OWNERS
 
-per-file autofill_profile_sync_difference_tracker*=jkrcal@chromium.org
 per-file autofill_profile_sync_difference_tracker*=file://components/sync/OWNERS
 
-per-file *type_controller*=jkrcal@chromium.org
 per-file *type_controller*=file://components/sync/OWNERS
diff --git a/components/autofill_assistant/browser/service/service_request_sender_impl.cc b/components/autofill_assistant/browser/service/service_request_sender_impl.cc
index 44b28e98..b305a1c 100644
--- a/components/autofill_assistant/browser/service/service_request_sender_impl.cc
+++ b/components/autofill_assistant/browser/service/service_request_sender_impl.cc
@@ -90,7 +90,8 @@
   if (max_retries > 0) {
     loader->SetRetryOptions(
         max_retries, network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE |
-                         network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED);
+                         network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED |
+                         network::SimpleURLLoader::RETRY_ON_5XX);
   }
   loader->AttachStringForUpload(request_body, "application/x-protobuffer");
 #ifndef NDEBUG
diff --git a/components/autofill_assistant/browser/service/service_request_sender_impl_unittest.cc b/components/autofill_assistant/browser/service/service_request_sender_impl_unittest.cc
index 401eede..81416d1f 100644
--- a/components/autofill_assistant/browser/service/service_request_sender_impl_unittest.cc
+++ b/components/autofill_assistant/browser/service/service_request_sender_impl_unittest.cc
@@ -187,7 +187,8 @@
   EXPECT_CALL(*loader,
               SetRetryOptions(
                   2, network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE |
-                         network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED));
+                         network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED |
+                         network::SimpleURLLoader::RETRY_ON_5XX));
   EXPECT_CALL(*loader,
               AttachStringForUpload(std::string("request"),
                                     std::string("application/x-protobuffer")));
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index a6124e4..cc43186 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "9.4",
-  "log_list_timestamp": "2022-05-06T12:55:11Z",
+  "version": "9.6",
+  "log_list_timestamp": "2022-05-08T12:53:50Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/cloud_devices/common/cloud_device_description.cc b/components/cloud_devices/common/cloud_device_description.cc
index 468ea54..0c3cc3e 100644
--- a/components/cloud_devices/common/cloud_device_description.cc
+++ b/components/cloud_devices/common/cloud_device_description.cc
@@ -15,7 +15,7 @@
 
 namespace {
 
-bool IsValidTicketImpl(const base::Value::Dict& value) {
+bool IsValidTicket(const base::Value::Dict& value) {
   const std::string* version = value.FindString(json::kVersion);
   return version && *version == json::kVersion10;
 }
@@ -40,18 +40,10 @@
   if (!ticket.is_dict())
     return false;
   root_ = std::move(ticket.GetDict());
-  return IsValidTicketImpl(root_);
+  return IsValidTicket(root_);
 }
 
-// static
-bool CloudDeviceDescription::IsValidTicket(const base::Value& ticket) {
-  if (!ticket.is_dict())
-    return false;
-
-  return IsValidTicketImpl(ticket.GetDict());
-}
-
-std::string CloudDeviceDescription::ToString() const {
+std::string CloudDeviceDescription::ToStringForTesting() const {
   std::string json;
   base::JSONWriter::WriteWithOptions(
       root_, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json);
diff --git a/components/cloud_devices/common/cloud_device_description.h b/components/cloud_devices/common/cloud_device_description.h
index 0fa35b5..0082adc 100644
--- a/components/cloud_devices/common/cloud_device_description.h
+++ b/components/cloud_devices/common/cloud_device_description.h
@@ -28,9 +28,7 @@
   bool InitFromString(const std::string& json);
   bool InitFromValue(base::Value value);
 
-  static bool IsValidTicket(const base::Value& value);
-
-  std::string ToString() const;
+  std::string ToStringForTesting() const;
 
   base::Value ToValue() &&;
 
diff --git a/components/cloud_devices/common/printer_description_unittest.cc b/components/cloud_devices/common/printer_description_unittest.cc
index e52ab75c..2eea287 100644
--- a/components/cloud_devices/common/printer_description_unittest.cc
+++ b/components/cloud_devices/common/printer_description_unittest.cc
@@ -622,7 +622,8 @@
 
 TEST(PrinterDescriptionTest, CddInit) {
   CloudDeviceDescription description;
-  EXPECT_EQ(NormalizeJson(kDefaultCdd), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kDefaultCdd),
+            NormalizeJson(description.ToStringForTesting()));
 
   ContentTypesCapability content_types;
   PwgRasterConfigCapability pwg_raster;
@@ -741,7 +742,8 @@
   reverse.SaveTo(&description);
   pwg_raster_config.SaveTo(&description);
 
-  EXPECT_EQ(NormalizeJson(kCdd), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kCdd),
+            NormalizeJson(description.ToStringForTesting()));
 }
 
 TEST(PrinterDescriptionTest, CddGetDocumentTypeSupported) {
@@ -841,7 +843,7 @@
     pwg_raster.SaveTo(&description);
 
     EXPECT_EQ(NormalizeJson(kDocumentTypeColorOnlyCdd),
-              NormalizeJson(description.ToString()));
+              NormalizeJson(description.ToStringForTesting()));
   }
   {
     CloudDeviceDescription description;
@@ -856,7 +858,7 @@
     pwg_raster.SaveTo(&description);
 
     EXPECT_EQ(NormalizeJson(kDocumentTypeGrayOnlyCdd),
-              NormalizeJson(description.ToString()));
+              NormalizeJson(description.ToStringForTesting()));
   }
   {
     CloudDeviceDescription description;
@@ -873,7 +875,7 @@
     pwg_raster.SaveTo(&description);
 
     EXPECT_EQ(NormalizeJson(kDocumentTypeColorAndGrayCdd),
-              NormalizeJson(description.ToString()));
+              NormalizeJson(description.ToStringForTesting()));
   }
   {
     CloudDeviceDescription description;
@@ -886,7 +888,7 @@
     pwg_raster.SaveTo(&description);
 
     EXPECT_EQ(NormalizeJson(kDocumentTypeNoneCdd),
-              NormalizeJson(description.ToString()));
+              NormalizeJson(description.ToStringForTesting()));
   }
 }
 
@@ -1090,7 +1092,7 @@
 
   vendor_capabilities.SaveTo(&description);
   EXPECT_EQ(NormalizeJson(kVendorCapabilityOnlyCdd),
-            NormalizeJson(description.ToString()));
+            NormalizeJson(description.ToStringForTesting()));
 }
 
 #if BUILDFLAG(IS_CHROMEOS)
@@ -1117,7 +1119,8 @@
   PinCapability pin_capability;
   pin_capability.set_value(true);
   pin_capability.SaveTo(&description);
-  EXPECT_EQ(NormalizeJson(kPinOnlyCdd), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kPinOnlyCdd),
+            NormalizeJson(description.ToStringForTesting()));
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
@@ -1211,12 +1214,14 @@
   EXPECT_FALSE(collate.default_value());
   EXPECT_TRUE(reverse.default_value());
 
-  EXPECT_EQ(NormalizeJson(kCdd), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kCdd),
+            NormalizeJson(description.ToStringForTesting()));
 }
 
 TEST(PrinterDescriptionTest, CjtInit) {
   CloudDeviceDescription description;
-  EXPECT_EQ(NormalizeJson(kDefaultCjt), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kDefaultCjt),
+            NormalizeJson(description.ToStringForTesting()));
 
   PwgRasterConfigTicketItem pwg_raster_config;
   ColorTicketItem color;
@@ -1300,7 +1305,8 @@
   collate.SaveTo(&description);
   reverse.SaveTo(&description);
 
-  EXPECT_EQ(NormalizeJson(kCjt), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kCjt),
+            NormalizeJson(description.ToStringForTesting()));
 }
 
 TEST(PrinterDescriptionTest, CjtGetAll) {
@@ -1353,7 +1359,8 @@
   EXPECT_FALSE(collate.value());
   EXPECT_TRUE(reverse.value());
 
-  EXPECT_EQ(NormalizeJson(kCjt), NormalizeJson(description.ToString()));
+  EXPECT_EQ(NormalizeJson(kCjt),
+            NormalizeJson(description.ToStringForTesting()));
 }
 
 }  // namespace printer
diff --git a/components/commerce/core/commerce_heuristics_data.cc b/components/commerce/core/commerce_heuristics_data.cc
index f884ac98..fe8c4cb 100644
--- a/components/commerce/core/commerce_heuristics_data.cc
+++ b/components/commerce/core/commerce_heuristics_data.cc
@@ -104,12 +104,13 @@
   if (!hint_heuristics_.contains(domain)) {
     return absl::nullopt;
   }
-  base::Value::Dict* domain_heuristics = hint_heuristics_.FindDict(domain);
-  if (!domain_heuristics || domain_heuristics->empty()) {
+  base::Value::Dict domain_heuristics =
+      hint_heuristics_.FindDict(domain)->Clone();
+  if (domain_heuristics.empty()) {
     return absl::nullopt;
   }
   base::Value::Dict res_dic;
-  res_dic.Set(domain, std::move(*domain_heuristics));
+  res_dic.Set(domain, std::move(domain_heuristics));
   std::string res_string;
   base::JSONWriter::Write(res_dic, &res_string);
   return absl::optional<std::string>(res_string);
diff --git a/components/exo/keyboard.cc b/components/exo/keyboard.cc
index dd5cfef..5243794 100644
--- a/components/exo/keyboard.cc
+++ b/components/exo/keyboard.cc
@@ -129,14 +129,10 @@
   for (; window; window = window->parent()) {
     const auto app_type =
         static_cast<ash::AppType>(window->GetProperty(aura::client::kAppType));
-    // TODO(fukino): Always returning false for Lacros window is a short-term
-    // solution. In reality, Lacros can consume ash accelerator's key
-    // combination when it is a deprecated ash accelerator or the window is
-    // running PWA. We need to let the wayland client dynamically decrlare
-    // whether it want to consume ash accelerators' key combinations.
-    // crbug.com/1174025.
+    // TOOD(hidehiko): get rid of this if check, after introducing capability,
+    // followed by ARC/Crostini migration.
     if (app_type == ash::AppType::LACROS)
-      return false;
+      return surface->is_keyboard_shortcuts_inhibited();
   }
   return true;
 }
diff --git a/components/exo/keyboard_unittest.cc b/components/exo/keyboard_unittest.cc
index 435ff19..510d34147 100644
--- a/components/exo/keyboard_unittest.cc
+++ b/components/exo/keyboard_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "components/exo/keyboard.h"
 
+#include "ash/accelerators/accelerator_controller_impl.h"
 #include "ash/accessibility/accessibility_controller_impl.h"
 #include "ash/constants/app_types.h"
 #include "ash/constants/ash_pref_names.h"
@@ -30,6 +31,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/focus_client.h"
+#include "ui/base/accelerators/test_accelerator_target.h"
 #include "ui/base/ime/dummy_text_input_client.h"
 #include "ui/events/devices/device_data_manager.h"
 #include "ui/events/event_constants.h"
@@ -523,6 +525,84 @@
   input_method->SetFocusedTextInputClient(nullptr);
 }
 
+TEST_F(KeyboardTest, OnKeyboardKey_KeyboardInhibit) {
+  std::unique_ptr<Surface> surface(new Surface());
+  std::unique_ptr<ShellSurface> shell_surface(new ShellSurface(surface.get()));
+  gfx::Size buffer_size(10, 10);
+  std::unique_ptr<Buffer> buffer(
+      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
+  surface->Attach(buffer.get());
+  surface->Commit();
+  // Set lacros attribute now for testing. This can be removed, when
+  // all clients are migrated into this model.
+  surface->window()->SetProperty(aura::client::kAppType,
+                                 static_cast<int>(ash::AppType::LACROS));
+
+  aura::client::FocusClient* focus_client =
+      aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
+  focus_client->FocusWindow(nullptr);
+
+  // Register accelerator to be triggered.
+  ui::TestAcceleratorTarget accelerator_target;
+  {
+    ui::Accelerator accelerator(ui::VKEY_P,
+                                ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN);
+    ash::AcceleratorControllerImpl* controller =
+        ash::Shell::Get()->accelerator_controller();
+    controller->Register({accelerator}, &accelerator_target);
+  }
+
+  auto delegate = std::make_unique<NiceMockKeyboardDelegate>();
+  auto* delegate_ptr = delegate.get();
+  NiceMockKeyboardObserver observer;
+  Seat seat;
+  Keyboard keyboard(std::move(delegate), &seat);
+  keyboard.AddObserver(&observer);
+  keyboard.SetNeedKeyboardKeyAcks(true);
+
+  EXPECT_CALL(*delegate_ptr, CanAcceptKeyboardEventsForSurface(surface.get()))
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(*delegate_ptr,
+              OnKeyboardModifiers(KeyboardModifiers{kNumLockMask, 0, 0, 0}));
+  EXPECT_CALL(
+      *delegate_ptr,
+      OnKeyboardEnter(surface.get(), base::flat_map<ui::DomCode, KeyState>()));
+  focus_client->FocusWindow(surface->window());
+  testing::Mock::VerifyAndClearExpectations(delegate_ptr);
+
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+  // This should only generate a press event for KEY_P.
+  accelerator_target.ResetCounts();
+  EXPECT_CALL(observer,
+              OnKeyboardKey(testing::_, ui::DomCode::US_P, testing::_))
+      .Times(0);
+  EXPECT_CALL(*delegate_ptr,
+              OnKeyboardKey(testing::_, ui::DomCode::US_P, testing::_))
+      .Times(0);
+  seat.set_physical_code_for_currently_processing_event_for_testing(
+      ui::DomCode::US_P);
+  generator.PressKey(ui::VKEY_P, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN);
+  EXPECT_EQ(1, accelerator_target.accelerator_count());
+  testing::Mock::VerifyAndClearExpectations(&observer);
+  testing::Mock::VerifyAndClearExpectations(delegate_ptr);
+
+  // Set keyboard-shortcut-inhibited, so the key event should be sent to app.
+  surface->SetKeyboardShortcutsInhibited(true);
+  accelerator_target.ResetCounts();
+  {
+    testing::InSequence s;
+    EXPECT_CALL(observer, OnKeyboardKey(testing::_, ui::DomCode::US_P, true));
+    EXPECT_CALL(*delegate_ptr,
+                OnKeyboardKey(testing::_, ui::DomCode::US_P, true));
+  }
+  seat.set_physical_code_for_currently_processing_event_for_testing(
+      ui::DomCode::US_P);
+  generator.PressKey(ui::VKEY_P, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN);
+  EXPECT_EQ(0, accelerator_target.accelerator_count());
+  testing::Mock::VerifyAndClearExpectations(&observer);
+  testing::Mock::VerifyAndClearExpectations(delegate_ptr);
+}
+
 TEST_F(KeyboardTest, FocusWithArcOverlay) {
   auto delegate = std::make_unique<NiceMockKeyboardDelegate>();
   // Just allow any surface to receive focus.
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index 986f763..985906c 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/public/cpp/shell_window_ids.h"
+#include "ash/public/cpp/window_properties.h"
 #include "base/callback_helpers.h"
 #include "base/containers/adapters.h"
 #include "base/logging.h"
@@ -1626,4 +1627,17 @@
     observer.ThrottleFrameRate(on);
 }
 
+void Surface::SetKeyboardShortcutsInhibited(bool inhibited) {
+  if (keyboard_shortcuts_inhibited_ == inhibited)
+    return;
+
+  keyboard_shortcuts_inhibited_ = inhibited;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Also set kCanConsumeSystemKeysKey property, so that the key event
+  // is also forwarded to exo::Keyboard.
+  // TODO(hidehiko): Support capability on migrating ARC/Crostini.
+  window_->SetProperty(ash::kCanConsumeSystemKeysKey, inhibited);
+#endif
+}
+
 }  // namespace exo
diff --git a/components/exo/surface.h b/components/exo/surface.h
index 60832b9..fc4cf87e 100644
--- a/components/exo/surface.h
+++ b/components/exo/surface.h
@@ -411,6 +411,16 @@
   // Starts or ends throttling on the surface.
   void ThrottleFrameRate(bool on);
 
+  // If true is set, if this window has a focus, key events should be sent to
+  // the app, even if it is an ash shortcut (with some exceptions).
+  // See exo::Keyboard for more details.
+  void SetKeyboardShortcutsInhibited(bool inhibited);
+
+  // Returns whether keyboard shortcuts are inhibited.
+  bool is_keyboard_shortcuts_inhibited() const {
+    return keyboard_shortcuts_inhibited_;
+  }
+
  private:
   struct State {
     State();
@@ -616,6 +626,8 @@
   gfx::Size embedded_surface_size_;
 
   LeaveEnterCallback leave_enter_callback_;
+
+  bool keyboard_shortcuts_inhibited_ = false;
 };
 
 class ScopedSurface {
diff --git a/components/exo/wayland/BUILD.gn b/components/exo/wayland/BUILD.gn
index 31994fd..bf01ce2 100644
--- a/components/exo/wayland/BUILD.gn
+++ b/components/exo/wayland/BUILD.gn
@@ -88,6 +88,7 @@
     "//third_party/wayland-protocols:input_timestamps_protocol",
     "//third_party/wayland-protocols:keyboard_configuration_protocol",
     "//third_party/wayland-protocols:keyboard_extension_protocol",
+    "//third_party/wayland-protocols:keyboard_shortcuts_inhibit_protocol",
     "//third_party/wayland-protocols:linux_explicit_synchronization_protocol",
     "//third_party/wayland-protocols:notification_shell_protocol",
     "//third_party/wayland-protocols:pointer_constraints_protocol",
@@ -190,6 +191,8 @@
       "zwp_idle_inhibit_manager.h",
       "zwp_input_timestamps_manager.cc",
       "zwp_input_timestamps_manager.h",
+      "zwp_keyboard_shortcuts_inhibit_manager.cc",
+      "zwp_keyboard_shortcuts_inhibit_manager.h",
       "zwp_pointer_constraints.cc",
       "zwp_pointer_constraints.h",
       "zwp_pointer_gestures.cc",
@@ -342,6 +345,7 @@
     "//third_party/wayland-protocols:input_timestamps_protocol",
     "//third_party/wayland-protocols:keyboard_configuration_protocol",
     "//third_party/wayland-protocols:keyboard_extension_protocol",
+    "//third_party/wayland-protocols:keyboard_shortcuts_inhibit_protocol",
     "//third_party/wayland-protocols:linux_dmabuf_protocol",
     "//third_party/wayland-protocols:linux_dmabuf_protocol",
     "//third_party/wayland-protocols:linux_explicit_synchronization_protocol",
diff --git a/components/exo/wayland/clients/client_helper.cc b/components/exo/wayland/clients/client_helper.cc
index 343a9c0..dd99e1e 100644
--- a/components/exo/wayland/clients/client_helper.cc
+++ b/components/exo/wayland/clients/client_helper.cc
@@ -91,6 +91,8 @@
 DEFAULT_DELETER(zcr_keyboard_configuration_v1,
                 zcr_keyboard_configuration_v1_destroy)
 DEFAULT_DELETER(zcr_keyboard_extension_v1, zcr_keyboard_extension_v1_destroy)
+DEFAULT_DELETER(zwp_keyboard_shortcuts_inhibit_manager_v1,
+                zwp_keyboard_shortcuts_inhibit_manager_v1_destroy)
 DEFAULT_DELETER(zcr_notification_shell_v1, zcr_notification_shell_v1_destroy)
 DEFAULT_DELETER(zcr_remote_shell_v1, zcr_remote_shell_v1_destroy)
 DEFAULT_DELETER(zcr_remote_shell_v2, zcr_remote_shell_v2_destroy)
diff --git a/components/exo/wayland/clients/client_helper.h b/components/exo/wayland/clients/client_helper.h
index 96012d4..8fef924e1 100644
--- a/components/exo/wayland/clients/client_helper.h
+++ b/components/exo/wayland/clients/client_helper.h
@@ -16,6 +16,7 @@
 #include <input-timestamps-unstable-v1-client-protocol.h>
 #include <keyboard-configuration-unstable-v1-client-protocol.h>
 #include <keyboard-extension-unstable-v1-client-protocol.h>
+#include <keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h>
 #include <linux-dmabuf-unstable-v1-client-protocol.h>
 #include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
 #include <notification-shell-unstable-v1-client-protocol.h>
@@ -112,6 +113,7 @@
 DEFAULT_DELETER_FDECL(zcr_gaming_input_v2)
 DEFAULT_DELETER_FDECL(zcr_keyboard_configuration_v1)
 DEFAULT_DELETER_FDECL(zcr_keyboard_extension_v1)
+DEFAULT_DELETER_FDECL(zwp_keyboard_shortcuts_inhibit_manager_v1)
 DEFAULT_DELETER_FDECL(zcr_notification_shell_v1)
 DEFAULT_DELETER_FDECL(zcr_remote_shell_v1)
 DEFAULT_DELETER_FDECL(zcr_remote_shell_v2)
diff --git a/components/exo/wayland/clients/test/client_version_test.cc b/components/exo/wayland/clients/test/client_version_test.cc
index 21db861..b208a86d 100644
--- a/components/exo/wayland/clients/test/client_version_test.cc
+++ b/components/exo/wayland/clients/test/client_version_test.cc
@@ -11,6 +11,7 @@
 #include <idle-inhibit-unstable-v1-server-protocol.h>
 #include <keyboard-configuration-unstable-v1-server-protocol.h>
 #include <keyboard-extension-unstable-v1-server-protocol.h>
+#include <keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h>
 #include <notification-shell-unstable-v1-server-protocol.h>
 #include <overlay-prioritizer-server-protocol.h>
 #include <pointer-constraints-unstable-v1-server-protocol.h>
@@ -86,6 +87,8 @@
   std::unique_ptr<zcr_text_input_extension_v1> zcr_text_input_extension_v1;
   std::unique_ptr<zcr_keyboard_configuration_v1> zcr_keyboard_configuration_v1;
   std::unique_ptr<zcr_keyboard_extension_v1> zcr_keyboard_extension_v1;
+  std::unique_ptr<zwp_keyboard_shortcuts_inhibit_manager_v1>
+      zwp_keyboard_shortcuts_inhibit_manager_v1;
   std::unique_ptr<zcr_notification_shell_v1> zcr_notification_shell_v1;
   std::unique_ptr<zcr_remote_shell_v1> zcr_remote_shell_v1;
   std::unique_ptr<zcr_remote_shell_v2> zcr_remote_shell_v2;
@@ -177,6 +180,8 @@
                             zcr_keyboard_configuration_v1),
           REGISTRY_CALLBACK(zcr_keyboard_extension_v1,
                             zcr_keyboard_extension_v1),
+          REGISTRY_CALLBACK(zwp_keyboard_shortcuts_inhibit_manager_v1,
+                            zwp_keyboard_shortcuts_inhibit_manager_v1),
           REGISTRY_CALLBACK(zcr_notification_shell_v1,
                             zcr_notification_shell_v1),
           REGISTRY_CALLBACK(zcr_remote_shell_v1, zcr_remote_shell_v1),
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc
index c95043c..002bbfb7 100644
--- a/components/exo/wayland/server.cc
+++ b/components/exo/wayland/server.cc
@@ -13,6 +13,7 @@
 #include <input-timestamps-unstable-v1-server-protocol.h>
 #include <keyboard-configuration-unstable-v1-server-protocol.h>
 #include <keyboard-extension-unstable-v1-server-protocol.h>
+#include <keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h>
 #include <linux-explicit-synchronization-unstable-v1-server-protocol.h>
 #include <notification-shell-unstable-v1-server-protocol.h>
 #include <overlay-prioritizer-server-protocol.h>
@@ -98,6 +99,7 @@
 #include "components/exo/wayland/zcr_touchpad_haptics.h"
 #include "components/exo/wayland/zwp_idle_inhibit_manager.h"
 #include "components/exo/wayland/zwp_input_timestamps_manager.h"
+#include "components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.h"
 #include "components/exo/wayland/zwp_pointer_constraints.h"
 #include "components/exo/wayland/zwp_pointer_gestures.h"
 #include "components/exo/wayland/zwp_relative_pointer_manager.h"
@@ -376,6 +378,10 @@
   wl_global_create(wl_display_.get(), &zcr_keyboard_extension_v1_interface, 2,
                    zcr_keyboard_extension_data_.get(), bind_keyboard_extension);
 
+  wl_global_create(wl_display_.get(),
+                   &zwp_keyboard_shortcuts_inhibit_manager_v1_interface, 1,
+                   display_, bind_keyboard_shortcuts_inhibit_manager);
+
   zwp_text_manager_data_ = std::make_unique<WaylandTextInputManager>(
       display_->seat()->xkb_tracker(), serial_tracker_.get());
   wl_global_create(wl_display_.get(), &zwp_text_input_manager_v1_interface, 1,
diff --git a/components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.cc b/components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.cc
new file mode 100644
index 0000000..ed19855
--- /dev/null
+++ b/components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.cc
@@ -0,0 +1,101 @@
+// Copyright 2022 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 "components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.h"
+
+#include <keyboard-shortcuts-inhibit-unstable-v1-server-protocol.h>
+
+#include "components/exo/surface.h"
+#include "components/exo/surface_observer.h"
+#include "components/exo/wayland/server_util.h"
+
+namespace exo::wayland {
+namespace {
+
+// Tracks the keyboard-shortcut-inhibitor setting, and notifies corresponding
+// Surface on unset.
+class KeyboardShortcutsInhibitor : public SurfaceObserver {
+ public:
+  explicit KeyboardShortcutsInhibitor(Surface* surface) : surface_(surface) {
+    surface->SetKeyboardShortcutsInhibited(true);
+    surface_->AddSurfaceObserver(this);
+  }
+
+  ~KeyboardShortcutsInhibitor() override {
+    if (surface_) {
+      surface_->RemoveSurfaceObserver(this);
+      surface_->SetKeyboardShortcutsInhibited(false);
+    }
+  }
+
+  void OnSurfaceDestroying(Surface* surface) override {
+    DCHECK_EQ(surface, surface_);
+    surface->RemoveSurfaceObserver(this);
+    surface_ = nullptr;
+  }
+
+ private:
+  Surface* surface_;
+};
+
+void keyboard_shortcuts_inhibitor_destroy(wl_client* client,
+                                          wl_resource* resource) {
+  wl_resource_destroy(resource);
+}
+
+constexpr struct zwp_keyboard_shortcuts_inhibitor_v1_interface
+    keyboard_shortcuts_inhibitor_implementation = {
+        keyboard_shortcuts_inhibitor_destroy,
+};
+
+void keyboard_shortcuts_inhibit_manager_destroy(wl_client* client,
+                                                wl_resource* resource) {
+  wl_resource_destroy(resource);
+}
+
+void keyboard_shortcuts_inhibit_manager_inhibit_shortcuts(
+    wl_client* client,
+    wl_resource* resource,
+    uint32_t id,
+    wl_resource* surface_resource,
+    wl_resource* seat) {
+  Surface* surface = GetUserDataAs<Surface>(surface_resource);
+  if (surface->is_keyboard_shortcuts_inhibited()) {
+    wl_resource_post_error(
+        resource,
+        ZWP_KEYBOARD_SHORTCUTS_INHIBIT_MANAGER_V1_ERROR_ALREADY_INHIBITED,
+        "the associated surface has already been set to inhibit keyboard "
+        "shortcuts");
+    return;
+  }
+
+  uint32_t version = wl_resource_get_version(resource);
+  wl_resource* keyboard_shortcuts_inhibitor_resource = wl_resource_create(
+      client, &zwp_keyboard_shortcuts_inhibitor_v1_interface, version, id);
+  SetImplementation(keyboard_shortcuts_inhibitor_resource,
+                    &keyboard_shortcuts_inhibitor_implementation,
+                    std::make_unique<KeyboardShortcutsInhibitor>(surface));
+}
+
+constexpr struct zwp_keyboard_shortcuts_inhibit_manager_v1_interface
+    keyboard_shortcuts_inhibit_manager_implementation = {
+        keyboard_shortcuts_inhibit_manager_destroy,
+        keyboard_shortcuts_inhibit_manager_inhibit_shortcuts,
+};
+
+}  // namespace
+
+void bind_keyboard_shortcuts_inhibit_manager(wl_client* client,
+                                             void* data,
+                                             uint32_t version,
+                                             uint32_t id) {
+  wl_resource* resource = wl_resource_create(
+      client, &zwp_keyboard_shortcuts_inhibit_manager_v1_interface, version,
+      id);
+  wl_resource_set_implementation(
+      resource, &keyboard_shortcuts_inhibit_manager_implementation, data,
+      nullptr);
+}
+
+}  // namespace exo::wayland
diff --git a/components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.h b/components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.h
new file mode 100644
index 0000000..59fcebf
--- /dev/null
+++ b/components/exo/wayland/zwp_keyboard_shortcuts_inhibit_manager.h
@@ -0,0 +1,21 @@
+// Copyright 2022 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_EXO_WAYLAND_ZWP_KEYBOARD_SHORTCUTS_INHIBIT_MANAGER_H_
+#define COMPONENTS_EXO_WAYLAND_ZWP_KEYBOARD_SHORTCUTS_INHIBIT_MANAGER_H_
+
+#include <stdint.h>
+
+struct wl_client;
+
+namespace exo::wayland {
+
+void bind_keyboard_shortcuts_inhibit_manager(wl_client* client,
+                                             void* data,
+                                             uint32_t version,
+                                             uint32_t id);
+
+}  // namespace exo::wayland
+
+#endif  // COMPONENTS_EXO_WAYLAND_ZWP_KEYBOARD_SHORTCUTS_INHIBIT_MANAGER_H_
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
index 2427704..ab8aa40 100644
--- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "components/feed/core/common/pref_names.h"
+#include "components/feed/core/proto/v2/wire/info_card.pb.h"
 #include "components/feed/core/shared_prefs/pref_names.h"
 #include "components/feed/core/v2/api_test/feed_api_test.h"
 #include "components/feed/core/v2/config.h"
@@ -39,6 +40,9 @@
 namespace {
 
 const char kTestKey[] = "Youtube";
+const int kTestInfoCardType1 = 101;
+const int kTestInfoCardType2 = 8888;
+const int kMinimumViewIntervalSeconds = 5 * 60;
 
 TEST_F(FeedApiTest, IsArticlesListVisibleByDefault) {
   EXPECT_TRUE(stream_->IsArticlesListVisible());
@@ -3096,6 +3100,75 @@
                    .followed_from_web_page_menu_count);
 }
 
+TEST_F(FeedApiTest, InfoCardTrackingActions) {
+  StreamModelUpdateRequestGenerator model_generator;
+  response_translator_.InjectResponse(model_generator.MakeFirstPage());
+  TestForYouSurface surface(stream_.get());
+  WaitForIdleTaskQueue();
+
+  base::HistogramTester histograms;
+
+  stream_->ReportInfoCardTrackViewStarted(kForYouStream, kTestInfoCardType2);
+  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType2,
+                                kMinimumViewIntervalSeconds);
+  stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType2);
+  stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType2);
+  histograms.ExpectUniqueSample("ContentSuggestions.Feed.InfoCard.Started",
+                                kTestInfoCardType2, 1);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Viewed",
+                               kTestInfoCardType2, 1);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Clicked",
+                               kTestInfoCardType2, 2);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Dismissed",
+                               kTestInfoCardType2, 0);
+
+  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1,
+                                kMinimumViewIntervalSeconds);
+  task_environment_.AdvanceClock(base::Seconds(kMinimumViewIntervalSeconds));
+  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1,
+                                kMinimumViewIntervalSeconds);
+  task_environment_.AdvanceClock(base::Seconds(kMinimumViewIntervalSeconds));
+  stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1,
+                                kMinimumViewIntervalSeconds);
+  stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType1);
+  stream_->ReportInfoCardDismissedExplicitly(kForYouStream, kTestInfoCardType1);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Started",
+                               kTestInfoCardType1, 0);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Viewed",
+                               kTestInfoCardType1, 3);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Clicked",
+                               kTestInfoCardType1, 1);
+  histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Dismissed",
+                               kTestInfoCardType1, 1);
+
+  response_translator_.InjectResponse(model_generator.MakeFirstPage());
+  stream_->UnloadModel(kForYouStream);
+  stream_->ExecuteRefreshTask(RefreshTaskId::kRefreshForYouFeed);
+  WaitForIdleTaskQueue();
+
+  ASSERT_EQ(2, network_.query_request_sent->feed_request()
+                   .feed_query()
+                   .chrome_fulfillment_info()
+                   .info_card_tracking_state_size());
+  feedwire::InfoCardTrackingState state1;
+  state1.set_type(kTestInfoCardType1);
+  state1.set_view_count(3);
+  state1.set_click_count(1);
+  state1.set_explicitly_dismissed_count(1);
+  EXPECT_THAT(state1, EqualsProto(network_.query_request_sent->feed_request()
+                                      .feed_query()
+                                      .chrome_fulfillment_info()
+                                      .info_card_tracking_state(0)));
+  feedwire::InfoCardTrackingState state2;
+  state2.set_type(kTestInfoCardType2);
+  state2.set_view_count(1);
+  state2.set_click_count(2);
+  EXPECT_THAT(state2, EqualsProto(network_.query_request_sent->feed_request()
+                                      .feed_query()
+                                      .chrome_fulfillment_info()
+                                      .info_card_tracking_state(1)));
+}
+
 // Keep instantiations at the bottom.
 INSTANTIATE_TEST_SUITE_P(FeedApiTest,
                          FeedStreamTestForAllStreamTypes,
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc
index d6cd06e..eeab3fc 100644
--- a/components/feed/core/v2/feed_stream.cc
+++ b/components/feed/core/v2/feed_stream.cc
@@ -905,6 +905,7 @@
   result.autoplay_enabled = delegate_->IsAutoplayEnabled();
   result.acknowledged_notice_keys =
       NoticeCardTracker::GetAllAckowledgedKeys(profile_prefs_);
+  result.info_card_tracking_states = info_card_tracker_.GetAllStates();
 
   if (signed_in_request) {
     result.client_instance_id = prefs::GetClientInstanceId(*profile_prefs_);
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc
index 5f60d66..6cc9e13 100644
--- a/components/feed/core/v2/proto_util.cc
+++ b/components/feed/core/v2/proto_util.cc
@@ -236,6 +236,17 @@
   }
 }
 
+void SetInfoCardTrackingStates(feedwire::Request* request,
+                               const RequestMetadata& request_metadata) {
+  for (const auto& state : request_metadata.info_card_tracking_states) {
+    request->mutable_feed_request()
+        ->mutable_feed_query()
+        ->mutable_chrome_fulfillment_info()
+        ->add_info_card_tracking_state()
+        ->CopyFrom(state);
+  }
+}
+
 }  // namespace
 
 std::string ContentIdString(const feedwire::ContentId& content_id) {
@@ -332,6 +343,7 @@
   }
   SetNoticeCardAcknowledged(&request, request_metadata);
   SetCardSpecificNoticeAcknowledged(&request, request_metadata);
+  SetInfoCardTrackingStates(&request, request_metadata);
   return request;
 }
 
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc
index 2f2e1a0..ee252d52 100644
--- a/components/feed/core/v2/proto_util_unittest.cc
+++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -8,10 +8,12 @@
 #include "components/feed/core/proto/v2/wire/capability.pb.h"
 #include "components/feed/core/proto/v2/wire/client_info.pb.h"
 #include "components/feed/core/proto/v2/wire/feed_request.pb.h"
+#include "components/feed/core/proto/v2/wire/info_card.pb.h"
 #include "components/feed/core/proto/v2/wire/request.pb.h"
 #include "components/feed/core/v2/config.h"
 #include "components/feed/core/v2/public/feed_api.h"
 #include "components/feed/core/v2/test/proto_printer.h"
+#include "components/feed/core/v2/test/test_util.h"
 #include "components/feed/core/v2/types.h"
 #include "components/feed/feed_feature_list.h"
 #include "components/reading_list/features/reading_list_switches.h"
@@ -22,6 +24,7 @@
 namespace feed {
 namespace {
 
+using feedwire::InfoCardTrackingState;
 using ::testing::Contains;
 using ::testing::IsSupersetOf;
 using ::testing::Not;
@@ -183,6 +186,35 @@
                    .acknowledged_notice_key_size());
 }
 
+TEST(ProtoUtilTest, InfoCardTrackingStates) {
+  RequestMetadata request_metadata;
+  InfoCardTrackingState state1;
+  state1.set_type(101);
+  state1.set_view_count(2);
+  InfoCardTrackingState state2;
+  state1.set_type(2000);
+  state1.set_view_count(5);
+  state1.set_click_count(2);
+  state1.set_explicitly_dismissed_count(1);
+  request_metadata.info_card_tracking_states = {state1, state2};
+  feedwire::Request request = CreateFeedQueryRefreshRequest(
+      kForYouStream, feedwire::FeedQuery::MANUAL_REFRESH, request_metadata,
+      /*consistency_token=*/std::string());
+
+  ASSERT_EQ(2, request.feed_request()
+                   .feed_query()
+                   .chrome_fulfillment_info()
+                   .info_card_tracking_state_size());
+  EXPECT_THAT(state1, EqualsProto(request.feed_request()
+                                      .feed_query()
+                                      .chrome_fulfillment_info()
+                                      .info_card_tracking_state(0)));
+  EXPECT_THAT(state2, EqualsProto(request.feed_request()
+                                      .feed_query()
+                                      .chrome_fulfillment_info()
+                                      .info_card_tracking_state(1)));
+}
+
 TEST(ProtoUtilTest, AutoplayEnabled) {
   RequestMetadata request_metadata;
   request_metadata.autoplay_enabled = true;
diff --git a/components/feed/core/v2/stream/info_card_tracker_unittest.cc b/components/feed/core/v2/stream/info_card_tracker_unittest.cc
index 6d4ef1e..00271db6 100644
--- a/components/feed/core/v2/stream/info_card_tracker_unittest.cc
+++ b/components/feed/core/v2/stream/info_card_tracker_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/time/time.h"
 #include "components/feed/core/common/pref_names.h"
 #include "components/feed/core/v2/config.h"
-#include "components/feed/core/v2/test/proto_printer.h"
+#include "components/feed/core/v2/test/test_util.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -27,13 +27,6 @@
 const feedwire::InfoCardType kTestInfoCardType2 =
     feedwire::INFO_CARD_YOUTUBE_PRIVACY_NOTICE;
 
-MATCHER_P(EqualsProto, message, ToTextProto(message)) {
-  std::string expected_serialized, actual_serialized;
-  message.SerializeToString(&expected_serialized);
-  arg.SerializeToString(&actual_serialized);
-  return expected_serialized == actual_serialized;
-}
-
 }  // namespace
 
 class InfoCardTrackerTest : public testing::Test {
diff --git a/components/feed/core/v2/test/test_util.h b/components/feed/core/v2/test/test_util.h
index f951d3fe..9920ac8 100644
--- a/components/feed/core/v2/test/test_util.h
+++ b/components/feed/core/v2/test/test_util.h
@@ -9,6 +9,9 @@
 
 #include "base/callback.h"
 #include "base/time/time.h"
+#include "components/feed/core/v2/test/proto_printer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
 
 // Some functionality shared among feed tests.
 namespace feed {
@@ -34,6 +37,13 @@
                                << got___;                   \
   }
 
+MATCHER_P(EqualsProto, message, ToTextProto(message)) {
+  std::string expected_serialized, actual_serialized;
+  message.SerializeToString(&expected_serialized);
+  arg.SerializeToString(&actual_serialized);
+  return expected_serialized == actual_serialized;
+}
+
 // Execute a runloop until `criteria` is true. If the criteria are not true
 // after 1000 iterations, ASSERT with the content of
 // `failure_message_callback.Run()`.
diff --git a/components/feed/core/v2/types.h b/components/feed/core/v2/types.h
index 884ff3d..27674b4 100644
--- a/components/feed/core/v2/types.h
+++ b/components/feed/core/v2/types.h
@@ -15,6 +15,7 @@
 #include "base/types/id_type.h"
 #include "base/values.h"
 #include "components/feed/core/proto/v2/wire/client_info.pb.h"
+#include "components/feed/core/proto/v2/wire/info_card.pb.h"
 #include "components/feed/core/proto/v2/wire/reliability_logging_enums.pb.h"
 #include "components/feed/core/v2/enums.h"
 #include "components/feed/core/v2/public/common_enums.h"
@@ -59,6 +60,7 @@
   bool autoplay_enabled = false;
   int followed_from_web_page_menu_count = 0;
   std::vector<std::string> acknowledged_notice_keys;
+  std::vector<feedwire::InfoCardTrackingState> info_card_tracking_states;
 };
 
 // Data internal to MetricsReporter which is persisted to Prefs.
diff --git a/components/invalidation/impl/BUILD.gn b/components/invalidation/impl/BUILD.gn
index 84037aa..7c1923b1 100644
--- a/components/invalidation/impl/BUILD.gn
+++ b/components/invalidation/impl/BUILD.gn
@@ -19,6 +19,8 @@
   sources = [
     "channels_states.cc",
     "channels_states.h",
+    "fake_ack_handler.cc",
+    "fake_ack_handler.h",
     "fcm_invalidation_listener.cc",
     "fcm_invalidation_listener.h",
     "fcm_invalidation_service.cc",
@@ -38,8 +40,6 @@
     "invalidation_service_util.h",
     "invalidator_registrar_with_memory.cc",
     "invalidator_registrar_with_memory.h",
-    "mock_ack_handler.cc",
-    "mock_ack_handler.h",
     "per_user_topic_subscription_manager.cc",
     "per_user_topic_subscription_manager.h",
     "per_user_topic_subscription_request.cc",
diff --git a/components/invalidation/impl/mock_ack_handler.cc b/components/invalidation/impl/fake_ack_handler.cc
similarity index 78%
rename from components/invalidation/impl/mock_ack_handler.cc
rename to components/invalidation/impl/fake_ack_handler.cc
index 9a1f4f60..36f3568 100644
--- a/components/invalidation/impl/mock_ack_handler.cc
+++ b/components/invalidation/impl/fake_ack_handler.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 "components/invalidation/impl/mock_ack_handler.h"
+#include "components/invalidation/impl/fake_ack_handler.h"
 
 #include <algorithm>
 
@@ -21,8 +21,7 @@
   AckHandle handle_;
 };
 
-AckHandleMatcher::AckHandleMatcher(const AckHandle& handle)
-  : handle_(handle) {}
+AckHandleMatcher::AckHandleMatcher(const AckHandle& handle) : handle_(handle) {}
 
 bool AckHandleMatcher::operator()(const Invalidation& invalidation) const {
   return handle_.Equals(invalidation.ack_handle());
@@ -30,52 +29,52 @@
 
 }  // namespace
 
-MockAckHandler::MockAckHandler() = default;
+FakeAckHandler::FakeAckHandler() = default;
 
-MockAckHandler::~MockAckHandler() = default;
+FakeAckHandler::~FakeAckHandler() = default;
 
-void MockAckHandler::RegisterInvalidation(Invalidation* invalidation) {
+void FakeAckHandler::RegisterInvalidation(Invalidation* invalidation) {
   unacked_invalidations_.push_back(*invalidation);
   invalidation->SetAckHandler(AsWeakPtr(), base::ThreadTaskRunnerHandle::Get());
 }
 
-void MockAckHandler::RegisterUnsentInvalidation(Invalidation* invalidation) {
+void FakeAckHandler::RegisterUnsentInvalidation(Invalidation* invalidation) {
   unsent_invalidations_.push_back(*invalidation);
 }
 
-bool MockAckHandler::IsUnacked(const Invalidation& invalidation) const {
+bool FakeAckHandler::IsUnacked(const Invalidation& invalidation) const {
   AckHandleMatcher matcher(invalidation.ack_handle());
   auto it = std::find_if(unacked_invalidations_.begin(),
                          unacked_invalidations_.end(), matcher);
   return it != unacked_invalidations_.end();
 }
 
-bool MockAckHandler::IsAcknowledged(const Invalidation& invalidation) const {
+bool FakeAckHandler::IsAcknowledged(const Invalidation& invalidation) const {
   AckHandleMatcher matcher(invalidation.ack_handle());
   auto it = std::find_if(acked_invalidations_.begin(),
                          acked_invalidations_.end(), matcher);
   return it != acked_invalidations_.end();
 }
 
-bool MockAckHandler::IsDropped(const Invalidation& invalidation) const {
+bool FakeAckHandler::IsDropped(const Invalidation& invalidation) const {
   AckHandleMatcher matcher(invalidation.ack_handle());
   auto it = std::find_if(dropped_invalidations_.begin(),
                          dropped_invalidations_.end(), matcher);
   return it != dropped_invalidations_.end();
 }
 
-bool MockAckHandler::IsUnsent(const Invalidation& invalidation) const {
+bool FakeAckHandler::IsUnsent(const Invalidation& invalidation) const {
   AckHandleMatcher matcher(invalidation.ack_handle());
   auto it1 = std::find_if(unsent_invalidations_.begin(),
                           unsent_invalidations_.end(), matcher);
   return it1 != unsent_invalidations_.end();
 }
 
-bool MockAckHandler::AllInvalidationsAccountedFor() const {
+bool FakeAckHandler::AllInvalidationsAccountedFor() const {
   return unacked_invalidations_.empty() && unrecovered_drop_events_.empty();
 }
 
-void MockAckHandler::Acknowledge(const Topic& topic, const AckHandle& handle) {
+void FakeAckHandler::Acknowledge(const Topic& topic, const AckHandle& handle) {
   AckHandleMatcher matcher(handle);
   auto it = std::find_if(unacked_invalidations_.begin(),
                          unacked_invalidations_.end(), matcher);
@@ -90,7 +89,7 @@
   }
 }
 
-void MockAckHandler::Drop(const Topic& topic, const AckHandle& handle) {
+void FakeAckHandler::Drop(const Topic& topic, const AckHandle& handle) {
   AckHandleMatcher matcher(handle);
   auto it = std::find_if(unacked_invalidations_.begin(),
                          unacked_invalidations_.end(), matcher);
diff --git a/components/invalidation/impl/mock_ack_handler.h b/components/invalidation/impl/fake_ack_handler.h
similarity index 85%
rename from components/invalidation/impl/mock_ack_handler.h
rename to components/invalidation/impl/fake_ack_handler.h
index 280839c..7b831a9 100644
--- a/components/invalidation/impl/mock_ack_handler.h
+++ b/components/invalidation/impl/fake_ack_handler.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 COMPONENTS_INVALIDATION_IMPL_MOCK_ACK_HANDLER_H_
-#define COMPONENTS_INVALIDATION_IMPL_MOCK_ACK_HANDLER_H_
+#ifndef COMPONENTS_INVALIDATION_IMPL_FAKE_ACK_HANDLER_H_
+#define COMPONENTS_INVALIDATION_IMPL_FAKE_ACK_HANDLER_H_
 
 #include <map>
 #include <vector>
@@ -20,13 +20,12 @@
 
 // This AckHandler implementation colaborates with the FakeInvalidationService
 // to enable unit tests to assert that invalidations are being acked properly.
-// TODO(crbug.com/1105388): Rename to FakeAckHandler.
-class INVALIDATION_EXPORT MockAckHandler
-  : public AckHandler,
-    public base::SupportsWeakPtr<MockAckHandler> {
+class INVALIDATION_EXPORT FakeAckHandler
+    : public AckHandler,
+      public base::SupportsWeakPtr<FakeAckHandler> {
  public:
-  MockAckHandler();
-  ~MockAckHandler() override;
+  FakeAckHandler();
+  ~FakeAckHandler() override;
 
   // Sets up some internal state to track this invalidation, and modifies it so
   // that its Acknowledge() and Drop() methods will route back to us.
@@ -71,4 +70,4 @@
 
 }  // namespace invalidation
 
-#endif  // COMPONENTS_INVALIDATION_IMPL_MOCK_ACK_HANDLER_H_
+#endif  // COMPONENTS_INVALIDATION_IMPL_FAKE_ACK_HANDLER_H_
diff --git a/components/invalidation/impl/fake_invalidation_service.cc b/components/invalidation/impl/fake_invalidation_service.cc
index cabdc73..1cfd565 100644
--- a/components/invalidation/impl/fake_invalidation_service.cc
+++ b/components/invalidation/impl/fake_invalidation_service.cc
@@ -80,20 +80,20 @@
   // If no one is listening to this invalidation, do not send it out.
   Topics subscribed_topics = invalidator_registrar_->GetAllSubscribedTopics();
   if (subscribed_topics.find(invalidation.topic()) == subscribed_topics.end()) {
-    mock_ack_handler_.RegisterUnsentInvalidation(&invalidation_copy);
+    fake_ack_handler_.RegisterUnsentInvalidation(&invalidation_copy);
     return;
   }
 
-  // Otherwise, register the invalidation with the mock_ack_handler_ and deliver
+  // Otherwise, register the invalidation with the fake_ack_handler_ and deliver
   // it to the appropriate consumer.
-  mock_ack_handler_.RegisterInvalidation(&invalidation_copy);
+  fake_ack_handler_.RegisterInvalidation(&invalidation_copy);
   TopicInvalidationMap invalidation_map;
   invalidation_map.Insert(invalidation_copy);
   invalidator_registrar_->DispatchInvalidationsToHandlers(invalidation_map);
 }
 
-MockAckHandler* FakeInvalidationService::GetMockAckHandler() {
-  return &mock_ack_handler_;
+FakeAckHandler* FakeInvalidationService::GetFakeAckHandler() {
+  return &fake_ack_handler_;
 }
 
 }  // namespace invalidation
diff --git a/components/invalidation/impl/fake_invalidation_service.h b/components/invalidation/impl/fake_invalidation_service.h
index 5b66bbb..2cb7ab1c 100644
--- a/components/invalidation/impl/fake_invalidation_service.h
+++ b/components/invalidation/impl/fake_invalidation_service.h
@@ -9,8 +9,8 @@
 #include <utility>
 
 #include "base/callback_forward.h"
+#include "components/invalidation/impl/fake_ack_handler.h"
 #include "components/invalidation/impl/invalidator_registrar_with_memory.h"
-#include "components/invalidation/impl/mock_ack_handler.h"
 #include "components/invalidation/public/invalidation_service.h"
 #include "components/prefs/testing_pref_service.h"
 
@@ -52,14 +52,14 @@
 
   // Emitted invalidations will be hooked up to this AckHandler.  Clients can
   // query it to assert the invalidaitons are being acked properly.
-  MockAckHandler* GetMockAckHandler();
+  FakeAckHandler* GetFakeAckHandler();
 
  private:
   std::string client_id_;
   // |pref_service_| must outlive |invalidator_registrar_|.
   TestingPrefServiceSimple pref_service_;
   std::unique_ptr<InvalidatorRegistrarWithMemory> invalidator_registrar_;
-  MockAckHandler mock_ack_handler_;
+  FakeAckHandler fake_ack_handler_;
 };
 
 }  // namespace invalidation
diff --git a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
index 7233ea08..f292dcfc 100644
--- a/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
+++ b/components/no_state_prefetch/browser/no_state_prefetch_manager.cc
@@ -374,8 +374,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   auto dict_value = std::make_unique<base::DictionaryValue>();
-  dict_value->SetKey("history", base::Value::FromUniquePtrValue(
-                                    prerender_history_->CopyEntriesAsValue()));
+  dict_value->GetDict().Set("history",
+                            prerender_history_->CopyEntriesAsValue());
   dict_value->SetKey(
       "active", base::Value::FromUniquePtrValue(GetActivePrerendersAsValue()));
   dict_value->SetBoolKey("enabled",
@@ -931,7 +931,8 @@
   for (const auto& prefetch : active_prefetches_) {
     auto prefetch_value = prefetch->contents()->GetAsValue();
     if (prefetch_value)
-      list_value->Append(std::move(prefetch_value));
+      list_value->GetList().Append(
+          base::Value::FromUniquePtrValue(std::move(prefetch_value)));
   }
   return list_value;
 }
diff --git a/components/no_state_prefetch/browser/prerender_history.cc b/components/no_state_prefetch/browser/prerender_history.cc
index 95d2eb52d..eae9e69 100644
--- a/components/no_state_prefetch/browser/prerender_history.cc
+++ b/components/no_state_prefetch/browser/prerender_history.cc
@@ -33,24 +33,23 @@
   entries_.clear();
 }
 
-std::unique_ptr<base::Value> PrerenderHistory::CopyEntriesAsValue() const {
-  auto return_list = std::make_unique<base::ListValue>();
+base::Value::List PrerenderHistory::CopyEntriesAsValue() const {
+  base::Value::List return_list;
   // Javascript needs times in terms of milliseconds since Jan 1, 1970.
   base::Time epoch_start = base::Time::UnixEpoch();
   for (const Entry& entry : base::Reversed(entries_)) {
-    auto entry_dict = std::make_unique<base::DictionaryValue>();
-    entry_dict->SetString("url", entry.url.spec());
-    entry_dict->SetString("final_status",
-                          NameFromFinalStatus(entry.final_status));
-    entry_dict->SetString("origin", NameFromOrigin(entry.origin));
+    base::Value::Dict entry_dict;
+    entry_dict.Set("url", entry.url.spec());
+    entry_dict.Set("final_status", NameFromFinalStatus(entry.final_status));
+    entry_dict.Set("origin", NameFromOrigin(entry.origin));
     // Use a string to prevent overflow, as Values don't support 64-bit
     // integers.
-    entry_dict->SetString(
+    entry_dict.Set(
         "end_time",
         base::NumberToString((entry.end_time - epoch_start).InMilliseconds()));
-    return_list->Append(std::move(entry_dict));
+    return_list.Append(std::move(entry_dict));
   }
-  return std::move(return_list);
+  return return_list;
 }
 
 }  // namespace prerender
diff --git a/components/no_state_prefetch/browser/prerender_history.h b/components/no_state_prefetch/browser/prerender_history.h
index 5bd6889..ed0f81f 100644
--- a/components/no_state_prefetch/browser/prerender_history.h
+++ b/components/no_state_prefetch/browser/prerender_history.h
@@ -11,14 +11,11 @@
 
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "components/no_state_prefetch/common/no_state_prefetch_final_status.h"
 #include "components/no_state_prefetch/common/prerender_origin.h"
 #include "url/gurl.h"
 
-namespace base {
-class Value;
-}
-
 namespace prerender {
 
 // PrerenderHistory maintains a per-session history of prerendered pages
@@ -70,8 +67,8 @@
   // Deletes all history entries.
   void Clear();
 
-  // Retrieves the entries as a value which can be displayed.
-  std::unique_ptr<base::Value> CopyEntriesAsValue() const;
+  // Retrieves the entries as a list of values which can be displayed.
+  base::Value::List CopyEntriesAsValue() const;
 
  private:
   std::list<Entry> entries_;
diff --git a/components/no_state_prefetch/browser/prerender_history_unittest.cc b/components/no_state_prefetch/browser/prerender_history_unittest.cc
index 5665409..8e4110ec 100644
--- a/components/no_state_prefetch/browser/prerender_history_unittest.cc
+++ b/components/no_state_prefetch/browser/prerender_history_unittest.cc
@@ -15,7 +15,7 @@
 
 namespace {
 
-bool ListEntryMatches(base::Value::ListView list,
+bool ListEntryMatches(const base::Value::List& list,
                       size_t index,
                       const char* expected_url,
                       FinalStatus expected_final_status,
@@ -23,27 +23,27 @@
                       const std::string& expected_end_time) {
   if (index >= list.size())
     return false;
-  base::Value& dict = list[index];
+  const base::Value& dict = list[index];
   if (!dict.is_dict())
     return false;
   if (dict.DictSize() != 4u)
     return false;
-  std::string* url = dict.FindStringPath("url");
+  const std::string* url = dict.FindStringPath("url");
   if (!url)
     return false;
   if (*url != expected_url)
     return false;
-  std::string* final_status = dict.FindStringPath("final_status");
+  const std::string* final_status = dict.FindStringPath("final_status");
   if (!final_status)
     return false;
   if (*final_status != NameFromFinalStatus(expected_final_status))
     return false;
-  std::string* origin = dict.FindStringPath("origin");
+  const std::string* origin = dict.FindStringPath("origin");
   if (!origin)
     return false;
   if (*origin != NameFromOrigin(expected_origin))
     return false;
-  std::string* end_time = dict.FindStringPath("end_time");
+  const std::string* end_time = dict.FindStringPath("end_time");
   if (!end_time)
     return false;
   if (*end_time != expected_end_time)
@@ -52,16 +52,12 @@
 }
 
 TEST(PrerenderHistoryTest, GetAsValue) {
-  std::unique_ptr<base::Value> entry_value;
-
   // Create a history with only 2 values.
   PrerenderHistory history(2);
 
   // Make sure an empty list exists when retrieving as value.
-  entry_value = history.CopyEntriesAsValue();
-  ASSERT_TRUE(entry_value.get() != nullptr);
-  ASSERT_TRUE(entry_value->is_list());
-  EXPECT_TRUE(entry_value->GetListDeprecated().empty());
+  base::Value::List entry_value = history.CopyEntriesAsValue();
+  EXPECT_TRUE(entry_value.empty());
 
   // Base time used for all events.  Each event is given a time 1 millisecond
   // after that of the previous one.
@@ -75,11 +71,9 @@
                                       kFirstOrigin, epoch_start);
   history.AddEntry(entry_first);
   entry_value = history.CopyEntriesAsValue();
-  ASSERT_TRUE(entry_value.get() != nullptr);
-  ASSERT_TRUE(entry_value->is_list());
-  EXPECT_EQ(1u, entry_value->GetListDeprecated().size());
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 0u, kFirstUrl,
-                               kFirstFinalStatus, kFirstOrigin, "0"));
+  EXPECT_EQ(1u, entry_value.size());
+  EXPECT_TRUE(ListEntryMatches(entry_value, 0u, kFirstUrl, kFirstFinalStatus,
+                               kFirstOrigin, "0"));
 
   // Add a second entry and make sure both first and second appear.
   const char* const kSecondUrl = "http://www.beta.com/";
@@ -90,13 +84,11 @@
                                        epoch_start + base::Milliseconds(1));
   history.AddEntry(entry_second);
   entry_value = history.CopyEntriesAsValue();
-  ASSERT_TRUE(entry_value.get() != nullptr);
-  ASSERT_TRUE(entry_value->is_list());
-  EXPECT_EQ(2u, entry_value->GetListDeprecated().size());
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 0u, kSecondUrl,
-                               kSecondFinalStatus, kSecondOrigin, "1"));
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 1u, kFirstUrl,
-                               kFirstFinalStatus, kFirstOrigin, "0"));
+  EXPECT_EQ(2u, entry_value.size());
+  EXPECT_TRUE(ListEntryMatches(entry_value, 0u, kSecondUrl, kSecondFinalStatus,
+                               kSecondOrigin, "1"));
+  EXPECT_TRUE(ListEntryMatches(entry_value, 1u, kFirstUrl, kFirstFinalStatus,
+                               kFirstOrigin, "0"));
 
   // Add a third entry and make sure that the first one drops off.
   const char* const kThirdUrl = "http://www.gamma.com/";
@@ -107,20 +99,16 @@
                                       epoch_start + base::Milliseconds(2));
   history.AddEntry(entry_third);
   entry_value = history.CopyEntriesAsValue();
-  ASSERT_TRUE(entry_value.get() != nullptr);
-  ASSERT_TRUE(entry_value->is_list());
-  EXPECT_EQ(2u, entry_value->GetListDeprecated().size());
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 0u, kThirdUrl,
-                               kThirdFinalStatus, kThirdOrigin, "2"));
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 1u, kSecondUrl,
-                               kSecondFinalStatus, kSecondOrigin, "1"));
+  EXPECT_EQ(2u, entry_value.size());
+  EXPECT_TRUE(ListEntryMatches(entry_value, 0u, kThirdUrl, kThirdFinalStatus,
+                               kThirdOrigin, "2"));
+  EXPECT_TRUE(ListEntryMatches(entry_value, 1u, kSecondUrl, kSecondFinalStatus,
+                               kSecondOrigin, "1"));
 
   // Make sure clearing history acts as expected.
   history.Clear();
   entry_value = history.CopyEntriesAsValue();
-  ASSERT_TRUE(entry_value.get() != nullptr);
-  ASSERT_TRUE(entry_value->is_list());
-  EXPECT_TRUE(entry_value->GetListDeprecated().empty());
+  EXPECT_TRUE(entry_value.empty());
 }
 
 }  // namespace
diff --git a/components/omnibox/browser/suggestion_answer.cc b/components/omnibox/browser/suggestion_answer.cc
index 5f6b03e..983effc 100644
--- a/components/omnibox/browser/suggestion_answer.cc
+++ b/components/omnibox/browser/suggestion_answer.cc
@@ -35,6 +35,7 @@
 static constexpr char kAnswerJsonText[] = "t";
 static constexpr char kAnswerJsonAdditionalText[] = "at";
 static constexpr char kAnswerJsonStatusText[] = "st";
+static constexpr char kAnswerJsonAccessibilityLabel[] = "al";
 static constexpr char kAnswerJsonTextType[] = "tt";
 static constexpr char kAnswerJsonNumLines[] = "ln";
 static constexpr char kAnswerJsonImage[] = "i";
@@ -99,8 +100,7 @@
 
 // SuggestionAnswer::ImageLine -------------------------------------------------
 
-SuggestionAnswer::ImageLine::ImageLine()
-    : num_text_lines_(1) {}
+SuggestionAnswer::ImageLine::ImageLine() : num_text_lines_(1) {}
 SuggestionAnswer::ImageLine::ImageLine(const ImageLine& line) = default;
 SuggestionAnswer::ImageLine::ImageLine(ImageLine&&) noexcept = default;
 
@@ -161,6 +161,12 @@
     }
   }
 
+  const std::string* accessibility_label =
+      inner_json->FindString(kAnswerJsonAccessibilityLabel);
+  if (accessibility_label) {
+    image_line->accessibility_label_ = base::UTF8ToUTF16(*accessibility_label);
+  }
+
   const base::Value::Dict* image_json = inner_json->FindDict(kAnswerJsonImage);
   if (image_json) {
     const std::string* url_string =
@@ -218,6 +224,10 @@
     }
   }
 
+  if (accessibility_label_ != line.accessibility_label_) {
+    return false;
+  }
+
   return image_url_ == line.image_url_;
 }
 
@@ -249,6 +259,11 @@
   } else {
     res += sizeof(TextField);
   }
+  if (accessibility_label_) {
+    res += base::trace_event::EstimateMemoryUsage(accessibility_label_.value());
+  } else {
+    res += sizeof(std::u16string);
+  }
   res += base::trace_event::EstimateMemoryUsage(image_url_);
 
   return res;
diff --git a/components/omnibox/browser/suggestion_answer.h b/components/omnibox/browser/suggestion_answer.h
index 27fa624..8896c308 100644
--- a/components/omnibox/browser/suggestion_answer.h
+++ b/components/omnibox/browser/suggestion_answer.h
@@ -24,8 +24,9 @@
 // An answer has exactly two image lines, so called because they are a
 // combination of text and an optional image URL.  Each image line has 1 or more
 // text fields, each of which is required to contain a string and an integer
-// type.  The text fields are contained in a non-empty vector and two optional
-// named properties, referred to as "additional text" and "status text".
+// type.  The text fields are contained in a non-empty vector and three optional
+// named properties, referred to as `additional text`, `status text`, and
+// `accessibility label`.
 //
 // When represented in the UI, these elements should be styled and laid out
 // according to the specification at https://goto.google.com/ais_api.
@@ -188,6 +189,12 @@
       else
         return nullptr;
     }
+    const std::u16string* accessibility_label() const {
+      if (accessibility_label_)
+        return &accessibility_label_.value();
+      else
+        return nullptr;
+    }
     const GURL& image_url() const { return image_url_; }
 
     bool Equals(const ImageLine& line) const;
@@ -209,6 +216,7 @@
     int num_text_lines_;
     absl::optional<TextField> additional_text_;
     absl::optional<TextField> status_text_;
+    absl::optional<std::u16string> accessibility_label_;
     GURL image_url_;
 
     FRIEND_TEST_ALL_PREFIXES(SuggestionAnswerTest, DifferentValuesAreUnequal);
diff --git a/components/omnibox/browser/suggestion_answer_unittest.cc b/components/omnibox/browser/suggestion_answer_unittest.cc
index fdfcd55..04985c78 100644
--- a/components/omnibox/browser/suggestion_answer_unittest.cc
+++ b/components/omnibox/browser/suggestion_answer_unittest.cc
@@ -322,6 +322,23 @@
   EXPECT_EQ(GURL("https://gstatic.com/bar.jpg"), urls[0]);
 }
 
+TEST(SuggestionAnswerTest, ParseAccessibilityLabel) {
+  SuggestionAnswer answer;
+  std::string json =
+      "{ \"l\": ["
+      "  { \"il\": { \"t\": [{ \"t\": \"text\", \"tt\": 8 }] } }, "
+      "  { \"il\": { \"al\": \"accessibility label\", "
+      "              \"at\": { \"t\": \"additional text\", \"tt\": 12 }, "
+      "              \"t\": [{ \"t\": \"other text\", \"tt\": 5 }] } }] }";
+  ASSERT_TRUE(ParseAnswer(json, &answer));
+
+  EXPECT_FALSE(answer.first_line().accessibility_label());
+
+  const std::u16string* label = answer.second_line().accessibility_label();
+  ASSERT_NE(label, nullptr);
+  EXPECT_EQ(*label, u"accessibility label");
+}
+
 TEST(SuggestionAnswerTest, LogAnswerUsed) {
   {
     base::HistogramTester histograms;
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_am.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_am.xtb
index cb2fc45..751dfa5 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_am.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_am.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">የchrome ውርዶችን ያቀናብሩ፣ ውርዶችን ይመልከቱ</translation>
 <translation id="7988861522114961979">የዳሰሳ ጥናት፣ ቅጾች፣ ቅጽ፣ የፈተና ጥያቄ</translation>
 <translation id="7992725801741093524">የgoogle ግላዊነት ቅንብሮችን ይቀይሩ፣ የgoogle ግላዊነትን ያቀናብሩ</translation>
+<translation id="8020024640114692614">ሁልጊዜ አገናኞችን በchrome ውስጥ ይክፈቱ፣ ሁልጊዜ chromeን ይጠቀሙ፣ chrome እንደ ነባሪ፣ ነባሪ አሳሽ፣ safariን ሰርዝ፣ እንዴት chromeን ነባሪ አሳሽ ማድረግ እንደሚቻል፣ ዋና አሳሽ፣ chromeን ነባሪ አድርግ፣ chromeን ነባሪ አሳሽ አድርግ፣ chromeን የእኔ ነባሪ አሳሽ አድርግ፣ አገናኝን በchrome ክፈት፣ chromeን እንደ ነባሪ አሳሽ ምረጥ፣ ዋና አሳሽ፣ safariን አስወግድ፣ chrome ውስጥ ፈልግ፣ chromeን እንደ ነባሪ አዋቅር፣ chromeን እንደ ነባሪ አሳሽ አዋቅር፣ መደበኛ አሳሽ</translation>
 <translation id="8319253638505741466">ማንነት የማያሳውቅ መስኮትን ይዝጉ፣ ማንነት የማያሳውቅ ይጨርሱ</translation>
 <translation id="8483249620579465383">የሚችሉትን ሁሉ ያግኙ፣ ይረዱ፣ ያስሱ፣ ይማሩ፣ ይጎብኙ፣ ይመልከቱ</translation>
 <translation id="8591468627389439293">ማስታወሻዎች፣ ማስታወሻ</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ar.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ar.xtb
index e36d37d7..d718b8cb 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ar.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ar.xtb
@@ -47,6 +47,7 @@
 <translation id="7739523284295786564">إدارة عمليات التنزيل في Chrome، عرض عمليات التنزيل</translation>
 <translation id="7988861522114961979">استطلاع، نماذج، نموذج، اختبار</translation>
 <translation id="7992725801741093524">تغيير إعدادات الخصوصية في Google، إدارة الخصوصية في Google</translation>
+<translation id="8020024640114692614">فتح الروابط دائمًا في chrome، استخدام chrome دائمًا، استخدام chrome كمتصفِّح تلقائي، المتصفِّح التلقائي، حذف safari، كيفية ضبط chrome كمتصفِّح تلقائي، المتصفِّح الرئيسي، ضبط chrome كمتصفِّح تلقائي، ضبط متصفّح chrome كمتصفِّح تلقائي، اختيار chrome كمتصفِّح تلقائي، فتح الروابط في chrome، جعل chrome المتصفِّح التلقائي، المتصفّح الأساسي، إزالة safari، البحث في chrome، اختيار chrome ليكون المتصفِّح التلقائي، ضبط chrome ليكون المتصفِّح التلقائي، المتصفِّح العادي</translation>
 <translation id="8319253638505741466">إغلاق نافذة التصفّح المتخفي، إنهاء وضع التصفّح المتخفي</translation>
 <translation id="8483249620579465383">الاستفادة إلى أقصى حد، فهم، استكشاف، معرفة، زيارة، الاطّلاع على</translation>
 <translation id="8591468627389439293">ملاحظات، ملاحظة</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb
index 00f17766..bdec94e1 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_bg.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">управление на изтеглянията в chrome, преглед на изтеглянията, изтеглени файлове в chrome</translation>
 <translation id="7988861522114961979">анкета, проучване, формуляри, формуляр, тест, форма</translation>
 <translation id="7992725801741093524">промяна на настройките за поверителност в google, управление на поверителността в google, настройки за поверителност</translation>
+<translation id="8020024640114692614">връзките винаги да се отварят в chrome, винаги да се използва chrome, chrome по подразбиране, браузър по подразбиране, изтриване на safari, как да направя chrome стандартен браузър, основен браузър, използване на chrome по подразбиране, chrome да стане основен браузър, chrome да стане основният ми браузър, отваряне на връзките в chrome, избиране на chrome като стандартен браузър, основен браузър, премахване на safari, търсене в chrome, задаване на chrome по подразбиране, задаване на chrome като браузър по подразбиране, стандартен браузър</translation>
 <translation id="8319253638505741466">затваряне на прозорец в режим „инкогнито“, изход от режим „инкогнито“</translation>
 <translation id="8483249620579465383">разучаване, научаване, посещаване, разглеждане, запознаване</translation>
 <translation id="8591468627389439293">бележки, бележка</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ca.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ca.xtb
index 9f153dc..580a88ae 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ca.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ca.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">gestionar les baixades de chrome, veure les baixades</translation>
 <translation id="7988861522114961979">enquesta, formularis, formulari, qüestionari</translation>
 <translation id="7992725801741093524">canviar la configuració de privadesa de google, gestionar la privadesa de google</translation>
+<translation id="8020024640114692614">obrir enllaços sempre a chrome, usar sempre chrome, chrome predeterminat, navegador predeterminat, suprimir safari, que chrome sigui sempre el navegador predeterminat, que chrome sigui el navegador principal, vull que chrome sigui el navegador predeterminat, obrir tots els enllaços a chrome, que chrome sigui el meu navegador principal, configurar chrome com a navegador predeterminat, fer cerques a chrome, que chrome sigui el meu navegador predeterminat, configurar chrome com a navegador principal</translation>
 <translation id="8319253638505741466">tancar la finestra d'incògnit, finalitzar l'incògnit</translation>
 <translation id="8483249620579465383">treu el màxim profit, entén, explora, aprèn, visita, mostra</translation>
 <translation id="8591468627389439293">notes, nota</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb
index 2e1049d..dcb9928 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_da.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">administrer Chrome-downloads, se downloads, styr downloads, styr Chrome-downloads, administrer downloads i Chrome, se downloads i Chrome, se Chrome-downloads, styr downloads i Chrome</translation>
 <translation id="7988861522114961979">undersøgelse, formularer, formular, quiz</translation>
 <translation id="7992725801741093524">skift indstillinger for privatliv på Google, administrer privatliv på Google, skift indstillinger for beskyttelse af personlige oplysninger på Google, administrer beskyttelsen af personlige oplysninger på Google</translation>
+<translation id="8020024640114692614">åbn altid links i chrome, brug altid chrome, chrome som standard, standardbrowser, slet safari, hvordan gør jeg chrome til standardbrowser, hvordan gør man chrome til standardbrowser, standard browser, gør chrome til standard, gør chrome til standardbrowseren, gør chrome til min standardbrowser, åbn links i chrome, vælg chrome som standardbrowser, primær browser, fjern safari, søg i chrome, anvend chrome som standard, brug chrome som standardbrowser, standard til browsing</translation>
 <translation id="8319253638505741466">luk inkognitovindue, afslut inkognito, forlad inkognito, luk inkognitovinduet, afslut inkognitotilstand, luk inkognito ned, forlad inkognitotilstand</translation>
 <translation id="8483249620579465383">få mest muligt ud af, forstå, finde, finde ud af, få oplysninger om, besøge, se</translation>
 <translation id="8591468627389439293">noter, note</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_es-419.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_es-419.xtb
index de6a5ba..0f641a5 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_es-419.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_es-419.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">administrar las descargas de chrome, ver las descargas, gestionar las descargas de chrome, ir a las descargas</translation>
 <translation id="7988861522114961979">encuesta, formularios, formulario, cuestionario</translation>
 <translation id="7992725801741093524">cambiar la configuración de privacidad de google, cambiar configuración de privacidad, administrar la privacidad de google, cambiar los ajustes de privacidad de google, configuración de privacidad, ajustes de privacidad, editar configuración de privacidad</translation>
+<translation id="8020024640114692614">siempre abrir los vínculos en chrome, siempre usar chrome, chrome como predeterminado, navegador predeterminado, quitar safari, eliminar safari, establecer chrome como navegador predeterminado, navegador principal, establecer chrome como predeterminado, establecer chrome como mi navegador predeterminado, abrir los vínculos en chrome, seleccionar chrome como navegador predeterminado, borrar safari, buscar en chrome, navegador estándar, cómo poner chrome como predeterminado</translation>
 <translation id="8319253638505741466">cerrar la ventana de incógnito, cerrar ventana de incógnito, finalizar sesión de incógnito, terminar sesión de incógnito, salir del modo de incógnito, salir del modo incógnito</translation>
 <translation id="8483249620579465383">sacar el máximo provecho de, entender, explorar, aprender, visitar, ver</translation>
 <translation id="8591468627389439293">notas, nota</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_es.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_es.xtb
index a86d87ed..fb46d98 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_es.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_es.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">gestionar descargas de Chrome, ver las descargas, consultar los archivos descargados, ir a descargas</translation>
 <translation id="7988861522114961979">encuesta, formularios, formulario, cuestionario</translation>
 <translation id="7992725801741093524">cambiar los ajustes de privacidad de Google, gestionar la privacidad de Google, modificar la configuración de privacidad, ajustes de privacidad</translation>
+<translation id="8020024640114692614">abrir enlaces siempre en chrome, usar siempre chrome, usar chrome como navegador predeterminado, navegador predeterminado, borrar safari, eliminar safari, cómo poner chrome como predeterminado, navegador principal, hacer que chrome sea el navegador predeterminado, quiero que chrome sea mi navegador por defecto, abrir enlaces en chrome, elegir chrome como navegador predeterminado, navegador principal, buscar en chrome, configurar chrome como predeterminado</translation>
 <translation id="8319253638505741466">cerrar ventana de incógnito, terminar sesión de Incógnito, salir del modo Incógnito</translation>
 <translation id="8483249620579465383">aprovechar, comprender, explorar, entender, aprender, visitar, ver</translation>
 <translation id="8591468627389439293">notas, nota</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb
index 157dad2..5a29f7c 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_et.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">chrome'i allalaadimiste haldamine, chrome allalaadimiste haldamine, allalaadimiste vaatamine, chrome'i allalaadimised, chrome allalaadimised, allalaadimised, alla laaditud failid</translation>
 <translation id="7988861522114961979">uuring, vormid, vorm, küsitlus, küsimustik</translation>
 <translation id="7992725801741093524">google'i privaatsusseadete muutmine, google privaatsusseadete muutmine, google'i privaatsussätete muutmine, google privaatsussätete muutmine, google'i privaatsuse haldamine, google privaatsuse haldamine, google'i privaatsuse seadete muutmine, google privaatsuse seadete muutmine</translation>
+<translation id="8020024640114692614">linkide alati chrome'is avamine, linkide alati chromeis avamine, ava lingid alati chrome'is, ava lingid alati chromeis, alati chrome'i kasutamine, alati chrome kasutamine, chrome vaikebrauserina, chrome vaikebrauser, chrome vaikevalik, vaikebrauser, safari kustutamine, kuidas chrome vaikebrauseriks muuta, põhibrauser, peamine brauser, chrome'i vaikebrauseriks muutmine, chrome vaikebrauseriks muutmine, chrome vaikeseade, linkide avamine chrome'is, linkide avamine chrome'iga, linkide avamine chrome, lingid chrome'is, lingid chrome, chrome'i lingid, chrome lingid, chrome'i vaikebrauseriks valimine, chrome vaikebrauseriks valimine, safari eemaldamine, chrome'is otsimine, chromeis otsimine, chrome'i vaikebrauseriks seadmine, chrome vaikebrauseriks seadmine, chrome vaikebrauseriks, standardbrauser</translation>
 <translation id="8319253638505741466">inkognito akna sulgemine, inkognito sulgemine, inkognito lõpetamine, inkognitost väljumine</translation>
 <translation id="8483249620579465383">parimal moel kasutamine, sirvimine, sirvi, tutvumine, tutvu, külastamine, külasta, vaatamine, vaata</translation>
 <translation id="8591468627389439293">märkmed, märkus, märkused, märge</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb
index f5b60838..08a2565 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fi.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">tarkista chromen lataukset, katso lataukset</translation>
 <translation id="7988861522114961979">kyselytutkimus, lomakkeet, lomake, tietovisa</translation>
 <translation id="7992725801741093524">muuta googlen yksityisyysasetuksia, huolehdi yksityisyydestä googlessa</translation>
+<translation id="8020024640114692614">avaa linkit aina chromessa, käytä aina chromea, chrome oletuksena, oletusselain, poista safari, miten chromesta tehdään oletusselain, pääselain, tee chromesta oletus, tee chromesta oletusselain, tee chromesta oletusselaimeni, avaa linkit chromessa, valitse chrome oletusselaimeksi, ensisijainen selain, hae chromessa, aseta chrome oletukseksi, aseta chrome oletusselaimeksi, vakioselain</translation>
 <translation id="8319253638505741466">sulje incognito-ikkuna, lopeta incognito</translation>
 <translation id="8483249620579465383">hyödynnä parhaiten, perehdy, tutki, opi, siirry, näe</translation>
 <translation id="8591468627389439293">muistiinpanot, muistiinpano</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fr.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fr.xtb
index 480b96332b4..aa12110 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_fr.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_fr.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">gérer les téléchargements chrome, afficher les téléchargements, gérer téléchargements chrome, afficher téléchargements</translation>
 <translation id="7988861522114961979">sondage, formulaires, formulaire, quiz, enquête, Google Forms, Forms, Form</translation>
 <translation id="7992725801741093524">changer les paramètres de confidentialité google, gérer la confidentialité google, modifier les paramètres de confidentialité google, confidentialité google, paramètres</translation>
+<translation id="8020024640114692614">toujours ouvrir les liens dans chrome, toujours utiliser chrome, chrome par défaut, navigateur par défaut, supprimer safari, comment faire de chrome le navigateur par défaut, navigateur principal, définir chrome par défaut, faire de chrome le navigateur par défaut, faire de chrome mon navigateur par défaut, ouvrir les liens dans chrome, sélectionner chrome comme navigateur par défaut, choisir chrome par défaut, ouvrir les liens dans chrome, enlever safari, rechercher dans chrome, définir chrome par défaut, définir chrome comme navigateur par défaut, navigateur standard</translation>
 <translation id="8319253638505741466">fermer une fenêtre de navigation privée, mettre fin à la navigation privée, fermer la navigation privée, terminer la navigation privée, sortir de la navigation privée</translation>
 <translation id="8483249620579465383">tirer le maximum, exploiter, comprendre, explorer, apprendre, visiter, voir</translation>
 <translation id="8591468627389439293">notes, note, ajoute, ajouter, nouvel, nouvelle, nouvelles, nouveaux</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_hr.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_hr.xtb
index e4a15168..b6444a8 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_hr.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_hr.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">upravljanje chromeovim preuzimanjima, pregled preuzimanja</translation>
 <translation id="7988861522114961979">anketa, obrasci, obrazac, kviz</translation>
 <translation id="7992725801741093524">promjena postavki privatnosti na googleu, upravljanje postavkama privatnosti na googleu</translation>
+<translation id="8020024640114692614">uvijek otvarati veze u chromeu, uvijek koristiti chrome, zadani preglednik, izbrisati safari, kako postaviti chrome kao zadani preglednik, glavni preglednik, postaviti chrome kao zadani, postaviti chrome kao zadani preglednik, postaviti chrome kao moj zadani preglednik, otvarati veze u chromeu, odabrati chrome kao zadani preglednik, primarni preglednik, ukloniti safari, pretraživati u chromeu, standardni preglednik</translation>
 <translation id="8319253638505741466">zatvori anonimni prozor, napusti anonimni način</translation>
 <translation id="8483249620579465383">maksimalno iskoristiti, razumjeti, istražiti, saznati, posjetiti, vidjeti</translation>
 <translation id="8591468627389439293">napomene, napomena</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_id.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_id.xtb
index 92b5c80..39328bf 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_id.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_id.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">kelola download chrome, lihat download</translation>
 <translation id="7988861522114961979">survei, formulir, kuis</translation>
 <translation id="7992725801741093524">ubah setelan privasi google, kelola privasi google</translation>
+<translation id="8020024640114692614">link selalu dibuka di chrome, selalu buka link di chrome, selalu gunakan chrome, browser default, buka link tidak pakai safari, chrome jadi browser default, chrome sebagai browser utama, setting chrome sebagai browser default, ganti browser default, cara ganti browser ke chrome, mengubah chrome sebagai browser default, cara setel chrome jadi browser utama, ubah browser safari ke chrome, hapus safari, browser utama, agar chrome jadi browser utama, telusuri di chrome, browser standar</translation>
 <translation id="8319253638505741466">tutup jendela samaran, akhiri samaran</translation>
 <translation id="8483249620579465383">optimalkan, pahami, jelajahi, pelajari, buka, lihat</translation>
 <translation id="8591468627389439293">catatan</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_it.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_it.xtb
index 45dba83..1487a25 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_it.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_it.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">gestire i download di chrome, visualizzare i download</translation>
 <translation id="7988861522114961979">sondaggio, moduli, modulo, quiz</translation>
 <translation id="7992725801741093524">modificare le impostazioni sulla privacy di google, gestire la privacy di google</translation>
+<translation id="8020024640114692614">aprire sempre i link in chrome, aprire sempre link in chrome, apri sempre i link in chrome, apertura link sempre in chrome, usare sempre chrome, usa sempre chrome, usare chrome sempre, usa chrome sempre, chrome per default, chrome come predefinito, chrome predefinito, browser di default, browser predefinito, eliminare safari, elimina safari, eliminazione di safari, come impostare chrome come browser predefinito, come si imposta chrome come browser predefinito, come rendere chrome il browser predefinito, come si rende chrome il browser predefinito, browser principale, browser come principale, impostare chrome come predefinito, rendere chrome predefinito, impostare chrome come browser predefinito, rendere chrome il browser predefinito, impostare chrome come il mio browser predefinito, rendere chrome il mio browser predefinito, aprire link in chrome, apertura di link in chrome, scegliere chrome come browser predefinito, selezionare chrome come browser predefinito, browser principale, browser primario, rimuovere safari, rimuovi safari, cercare in chrome, ricerca in chrome, ricerche in chrome, configurare chrome come predefinito, configurare chrome come default, configurare chrome come browser predefinito, configurare chrome come browser di default, browser standard</translation>
 <translation id="8319253638505741466">chiudere una finestra di navigazione in incognito, terminare la modalità in incognito</translation>
 <translation id="8483249620579465383">sfrutta al massimo, scopri, esplora, impara, guarda, vedi</translation>
 <translation id="8591468627389439293">note, nota</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb
index 191c32b..e31f1e269 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ko.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">chrome 다운로드 관리, 크롬 다운로드 관리, 다운로드 보기</translation>
 <translation id="7988861522114961979">설문조사, 양식, 설문지, 퀴즈</translation>
 <translation id="7992725801741093524">google 개인 정보 보호 설정 변경, google 개인 정보 보호 관리, 구글 개인 정보 보호 설정 변경, 구글 개인 정보 보호 관리, 구글 프라이버시 설정 변경, 구글 프라이버시 관리, 내 개인정보 보호 설정, 내 개인 정보 보호 설정, 개인 정보 보호 설정, 개인정보 보호 설정</translation>
+<translation id="8020024640114692614">항상 chrome에서 링크 열기, 항상 chrome 사용, chrome을 기본으로, 기본 브라우저, safari 삭제, chrome을 기본 브라우저로 지정하는 방법, 메인 브라우저, chrome을 기본으로, chrome을 기본 브라우저로 지정, chrome을 내 기본 브라우저로 지정, chrome에서 링크 열기, chrome을 기본 브라우저로 선택, 주 브라우저, safari 제거, chrome에서 검색, chrome을 기본으로 설정, chrome을 기본 브라우저로 설정, 표준 브라우저</translation>
 <translation id="8319253638505741466">시크릿 창 닫기, 시크릿 모드 종료, 시크릿 모드 닫기</translation>
 <translation id="8483249620579465383">최대한 활용, 이해, 탐색, 학습, 방문, 보기</translation>
 <translation id="8591468627389439293">메모, 노트</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_lv.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_lv.xtb
index 233576b..a9a8670a 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_lv.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_lv.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">chrome lejupielāžu pārvaldība, pārvaldīt chrome lejupielādes, skatīt lejupielādes, skatīt lejupielādētos failus, lejupielāžu pārvaldība chrome, lejupielādēto failu pārvaldība chrome</translation>
 <translation id="7988861522114961979">aptauja, aptauju, veidlapa, veidlapu, viktorīna, viktorīnu</translation>
 <translation id="7992725801741093524">mainīt google konfidencialitātes iestatījumus, google konfidencialitātes iestatījumu mainīšana, google konfidencialitātes pārvaldība, pārvaldīt google konfidencialitāti, pārvaldīt konfidencialitāti google pakalpojumos, google pakalpojumu konfidencialitātes pārvaldība, google konta konfidencialitātes pārvaldība, pārvaldīt google konta konfidencialitāti</translation>
+<translation id="8020024640114692614">vienmēr atvērt saites pārlūkā chrome, vienmēr izmantot chrome, chrome kā noklusējuma pārlūks, noklusējuma pārlūks, dzēst safari, kā iestatīt chrome par noklusējuma pārlūku, galvenais pārlūks, iestatīt chrome kā manu noklusējuma pārlūku, atvērt saites pārlūkā chrome, izvēlēties chrome kā noklusējuma pārlūku, galvenā pārlūkprogramma, noņemt safari, meklēt pārlūkā chrome, iestatīt pārlūku chrome kā noklusējumu, iestatīt chrome kā noklusējuma pārlūku, standarta pārlūks</translation>
 <translation id="8319253638505741466">aizvērt inkognito logu, inkognito loga aizvēršana, beigt inkognito sesiju, iziet no inkognito režīma</translation>
 <translation id="8483249620579465383">efektīvi, iespējas, saprast, izpētīt, apgūt, apmeklēt, skatīt, iemācīties</translation>
 <translation id="8591468627389439293">piezīmes, piezīme, piezīmi</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_mr.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_mr.xtb
index 5698ee6f..339e7a8 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_mr.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_mr.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">Chrome डाउनलोड व्यवस्थापित करा, डाउनलोड पहा</translation>
 <translation id="7988861522114961979">सर्वेक्षण, forms, फॉर्म, क्विझ</translation>
 <translation id="7992725801741093524">Google ची गोपनीयता सेटिंग्ज बदला, Google वरील गोपनीयता व्यवस्थापित करा</translation>
+<translation id="8020024640114692614">लिंक नेहमी chrome मध्ये उघडा, सर्व लिंक नेहमी chrome मध्ये उघडा, नेहमी chrome वापरा, chrome डीफॉल्ट म्हणून वापरा, chrome डीफॉल्ट ब्राउझर म्हणून वापरा, डीफॉल्ट ब्राउझर, safari हटवा, chrome ला डीफॉल्ट ब्राउझर कसे बनवावे, chrome ला डीफॉल्ट कसे बनवावे, मुख्य ब्राउझर, प्रमुख ब्राउझर, chrome ला डीफॉल्ट बनवा, chrome ला डीफॉल्ट ब्राउझर बनवा, chrome ला माझा डीफॉल्ट ब्राउझर बनवा, लिंक chrome मध्ये उघडा, सर्व लिंक chrome मध्ये उघडा, डीफॉल्ट ब्राउझर म्हणून chrome निवडा, chrome हे डीफॉल्ट ब्राउझर म्हणून निवडा, प्राथमिक ब्राउझर, प्राधान्य दिलेला ब्राउझर, safari काढून टाका, chrome मध्ये शोधा, chrome हे डीफॉल्ट म्हणून सेट करा, chrome हे डीफॉल्ट ब्राउझर म्हणून सेट करा, साधारण ब्राउझर</translation>
 <translation id="8319253638505741466">गुप्त विंडो बंद करा, गुप्त मोड बंद करा</translation>
 <translation id="8483249620579465383">पुरेपूर वापर करणे, समजून घेणे, एक्सप्लोर करणे, जाणून घेणे, भेट देणे, पाहणे</translation>
 <translation id="8591468627389439293">टिपा, टीप</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ms.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ms.xtb
index 77e67e6f..d95e5be 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ms.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ms.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">urus muat turun chrome, lihat muat turun</translation>
 <translation id="7988861522114961979">tinjauan, forms, borang, kuiz</translation>
 <translation id="7992725801741093524">tukar tetapan privasi google, urus privasi google</translation>
+<translation id="8020024640114692614">sentiasa buka pautan dalam chrome, sentiasa gunakan chrome, chrome sebagai penyemak imbas lalai, penyemak imbas lalai, padam safari, cara menjadikan chrome penyemak imbas lalai, penyemak imbas utama, jadikan chrome penyemak imbas lalai, jadikan chrome penyemak imbas lalai saya, buka pautan dalam chrome, pilih chrome sebagai penyemak imbas lalai, penyemak imbas utama, alih keluar safari, cari dalam chrome, tetapkan chrome sebagai penyemak imbas lalai, penyemak imbas standard</translation>
 <translation id="8319253638505741466">tutup tetingkap inkognito, tamatkan inkognito</translation>
 <translation id="8483249620579465383">manfaatkan sepenuhnya, fahami, teroka, ketahui, lawati, lihat</translation>
 <translation id="8591468627389439293">nota, nota</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ro.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ro.xtb
index 043f0cd..5561b41 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ro.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ro.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">gestionează descărcările chrome, vezi descărcările</translation>
 <translation id="7988861522114961979">sondaj, formulare, formular, chestionar</translation>
 <translation id="7992725801741093524">modifică setările de confidențialitate google, gestionează confidențialitatea google</translation>
+<translation id="8020024640114692614">deschide întotdeauna linkurile în chrome, folosește întotdeauna chrome, chrome ca prestabilit, browser prestabilit, șterge safari, cum să faci chrome browserul prestabilit, browserul principal, setează chrome ca prestabilit, setează chrome ca browser prestabilit, setare chrome ca browser prestabilit, deschide linkurile în chrome, alege chrome ca browser prestabilit, browser principal, elimină safari, caută în chrome, setează chrome prestabilit, setare chrome drept browser prestabilit, browser standard</translation>
 <translation id="8319253638505741466">închide fereastra incognito, ieși din modul incognito</translation>
 <translation id="8483249620579465383">profită de, înțelege, explorează, învață, accesează, vezi</translation>
 <translation id="8591468627389439293">note, notă</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb
index 2e92c283..a60319e 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sl.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">upravljanje prenosov v chromu, ogled prenosov</translation>
 <translation id="7988861522114961979">anketa, obrazci, obrazec, test</translation>
 <translation id="7992725801741093524">spreminjanje nastavitev zasebnosti v googlu, upravljanje zasebnosti v googlu</translation>
+<translation id="8020024640114692614">vedno odpri povezave v chromu, vedno uporabi chrome, izbriši safari, kako nastaviti chrome kot privzeti iskalnik, glavni brskalnik, določi chrome kot privzeti iskalnik, odpiraj povezave v chromu, iskanje v chromu, nastavi chrome kot privzeti iskalnik, standardni brskalnik</translation>
 <translation id="8319253638505741466">zapiranje anonimnega okna, zapri anonimni način</translation>
 <translation id="8483249620579465383">čim boljše izkoriščenje, razumevanje, raziskovanje, učenje, obisk, ogled</translation>
 <translation id="8591468627389439293">zapiski, zapisek</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sv.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sv.xtb
index a659178e..1bdf670 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sv.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sv.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">hantera nedladdningar i chrome, visa nedladdningar, se nedladdningar</translation>
 <translation id="7988861522114961979">enkät, formulär, quiz</translation>
 <translation id="7992725801741093524">ändra googles integritetsinställningar, hantera integritet på google, ändra integritetsinställningar</translation>
+<translation id="8020024640114692614">öppna alltid länkar i chrome, använd alltid chrome, chrome som standard, standardwebbläsare, radera safari, hur gör man chrome till standardwebbläsare, huvudwebbläsare, använd chrome som standard, gör chrome till standardwebbläsare, använd chrome som standardwebbläsare, öppna länkar i chrome, välj chrome som standardwebbläsare, primär webbläsare, ta bort safari, sök i chrome, ställ in chrome som standard, ställ in chrome som standardwebbläsare, standardwebbläsare</translation>
 <translation id="8319253638505741466">stäng inkognitofönster, avsluta inkognito, stäng inkognito</translation>
 <translation id="8483249620579465383">få ut så mycket som möjligt, förstå, utforska, läsa, besöka, visa</translation>
 <translation id="8591468627389439293">anteckningar, anteckning</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sw.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sw.xtb
index f37c7d2..188855e 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_sw.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_sw.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">dhibiti vipakuliwa kwenye chrome, angalia vipakuliwa</translation>
 <translation id="7988861522114961979">utafiti, fomu, maswali</translation>
 <translation id="7992725801741093524">badilisha mipangilio ya faragha kwenye google, dhibiti faragha kwenye google</translation>
+<translation id="8020024640114692614">fungua viungo kwenye chrome kila wakati, tumia chrome kila wakati, chrome kama kivinjari chaguomsingi, futa kivinjari cha safari, namna ya kuifanya chrome iwe kivinjari chaguomsingi, kivinjari kikuu, ifanye chrome iwe chaguomsingi, ifanye chrome iwe kivinjari chaguomsingi, ifanye chrome kuwa kivinjari changu chaguomsingi, fungua viungo kwenye chrome, teua chrome iwe kivinjari chaguomsingi, kivinjari msingi, ondoa kivinjari cha safari, tafuta kwenye chrome, weka chrome iwe chaguomsingi, weka chrome iwe kivinjari chaguomsingi, kivinjari cha kawaida</translation>
 <translation id="8319253638505741466">funga dirisha fiche, ondoka katika hali fiche</translation>
 <translation id="8483249620579465383">nufaika zaidi na, elewa, gundua, jifunze, tembelea, ona</translation>
 <translation id="8591468627389439293">madokezo, dokezo</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ta.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ta.xtb
index be2fc3d8..2895ceb 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_ta.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_ta.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">Chrome பதிவிறக்கங்களை நிர்வகி, பதிவிறக்கங்களைக் காட்டு, Chrome பதிவிறக்கங்கள், பதிவிறக்கங்கள்</translation>
 <translation id="7988861522114961979">கருத்துக்கணிப்பு, forms, படிவம், வினாடி வினா</translation>
 <translation id="7992725801741093524">Google தனியுரிமை அமைப்புகளை மாற்று, Google தனியுரிமையை நிர்வகி, Google தனியுரிமை அமைப்புகள், Google தனியுரிமை</translation>
+<translation id="8020024640114692614">லிங்க்கை எப்போதும் குரோமில் எப்படித் திறப்பது?, எப்போதும் chromeமைப் பயன்படுத்துதல், Chromeமை இயல்பு உலாவியாக அமைத்தல், Chromeமை எப்படிப் பிரைமரியாக அமைப்பது?, குரோமில் எப்போதும் தேடுதல், இணைப்புகளை எப்போதும் chromeமில் திறத்தல், இணைப்புகளை எப்போதும் குரோமில் திற, Chromeமை இயல்பு உலாவியாக எப்படி அமைப்பது?, இணைப்புகளை எப்போதும் Chrome-இல் திற, Chromeமில் எப்போதும் தேட என்ன செய்ய வேண்டும்?, லிங்க்கை எப்போதும் chromeமில் திறக்க என்ன செய்ய வேண்டும்?, எப்போதும் குரோமைப் பயன்படுத்த என்ன செய்ய வேண்டும்?, Chromeமை இயல்பு உலாவியாக அமைக்க என்ன செய்ய வேண்டும்?, Chromeமைப் பிரைமரியாக அமைத்தல், லிங்க்கை எப்போதும் குரோமில் திறக்க என்ன செய்வது?</translation>
 <translation id="8319253638505741466">மறைநிலைச் சாளரத்தை மூடுக, மறைநிலைப் பயன்முறையை நிறைவுசெய், மறைநிலைப் பயன்முறையை முடி, மறைநிலைப் பயன்முறையை நிறுத்து</translation>
 <translation id="8483249620579465383">முழுவதுமாகப் பயன்படுத்து, புரிந்துகொள்க, கண்டறிக, அறிக, செல்க, காட்டு</translation>
 <translation id="8591468627389439293">குறிப்புகள், குறிப்பு</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb
index 857c39cc..e8b9e86 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_tr.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">chrome indirmelerini yönet, indirmeleri görüntüle</translation>
 <translation id="7988861522114961979">anket, formlar, form, test</translation>
 <translation id="7992725801741093524">google gizlilik ayarlarını değiştir, google gizliliğini yönet</translation>
+<translation id="8020024640114692614">bağlantıları her zaman chrome'da aç, her zaman chrome kullan, chrome'u varsayılan yap, varsayılan tarayıcı, safari'yi sil, chrome'u varsayılan tarayıcı yapma, asıl tarayıcı, chrome'u varsayılan olarak ayarla, chrome'u varsayılan tarayıcı yap, chrome'u varsayılan tarayıcım yap, bağlantıları chrome'da aç, chrome'u varsayılan tarayıcı olarak seç, ana tarayıcı, safari'yi kaldır, chrome'da ara, chrome'u varsayılan tarayıcı olarak ayarla, varsayılan tarayıcı chrome, standart tarayıcı</translation>
 <translation id="8319253638505741466">gizli pencereyi kapat, gizli modu sonlandır</translation>
 <translation id="8483249620579465383">faydalan, yararlan, değerlendir, anla, keşfet, öğren, ziyaret et, gör</translation>
 <translation id="8591468627389439293">notlar, not, notlarım</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb
index 1cb5b2fc..0fc9a835 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_uk.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">керувати завантаженнями chrome, переглянути завантаження, відкрити завантаження, завантажені файли, завантаження chrome</translation>
 <translation id="7988861522114961979">опитування, форми, форма, тест</translation>
 <translation id="7992725801741093524">керувати налаштуваннями конфіденційності в google, керувати конфіденційністю в google, налаштування конфіденційності, конфіденційність google</translation>
+<translation id="8020024640114692614">завжди відкривати посилання в chrome, завжди використовувати chrome, chrome за умовчанням, веб-переглядач за умовчанням, видалити safari, як зробити chrome веб-переглядачем за умовчанням, основний веб-переглядач, зробити chrome за умовчанням, зробити chrome веб-переглядачем за умовчанням, зробити chrome моїм веб-переглядачем за умовчанням, відкривати посилання в chrome, вибрати chrome веб-переглядачем за умовчанням, основний браузер, вилучити safari, пошук у chrome, використовувати chrome за умовчанням, використовувати chrome як веб-переглядач за умовчанням, стандартний веб-переглядач</translation>
 <translation id="8319253638505741466">закрити вікно в режимі анонімного перегляду, вимкнути анонімний режим, вікно в режимі анонімного перегляду, анонімний режим, вийти з анонімного режиму</translation>
 <translation id="8483249620579465383">усі можливості, зрозуміти, дізнатися, переглянути, відвідати, побачити</translation>
 <translation id="8591468627389439293">нотатки, нотатка</translation>
diff --git a/components/omnibox/resources/translations/omnibox_pedal_synonyms_vi.xtb b/components/omnibox/resources/translations/omnibox_pedal_synonyms_vi.xtb
index 1d5cbbf..caac5a24 100644
--- a/components/omnibox/resources/translations/omnibox_pedal_synonyms_vi.xtb
+++ b/components/omnibox/resources/translations/omnibox_pedal_synonyms_vi.xtb
@@ -46,6 +46,7 @@
 <translation id="7739523284295786564">quản lý tệp đã tải xuống trong chrome, xem tệp đã tải xuống</translation>
 <translation id="7988861522114961979">bản khảo sát, các biểu mẫu, biểu mẫu, câu đố</translation>
 <translation id="7992725801741093524">thay đổi chế độ cài đặt quyền riêng tư của google, quản lý quyền riêng tư của google</translation>
+<translation id="8020024640114692614">luôn mở đường liên kết trong chrome, luôn dùng chrome, chrome làm mặc định, trình duyệt mặc định, xoá safari, cách đặt chrome làm trình duyệt mặc định, trình duyệt chính, đặt chrome làm mặc định, đặt chrome làm trình duyệt mặc định, đặt chrome làm trình duyệt mặc định của tôi, mở đường liên kết trong chrome, chọn chrome làm trình duyệt mặc định, xoá safari, tìm kiếm trong chrome, đặt chrome làm tuỳ chọn mặc định, thiết lập chrome làm trình duyệt mặc định, trình duyệt tiêu chuẩn</translation>
 <translation id="8319253638505741466">đóng cửa sổ ẩn danh, kết thúc chế độ ẩn danh</translation>
 <translation id="8483249620579465383">khai thác tối đa, hiểu, khám phá, học hỏi, truy cập, xem</translation>
 <translation id="8591468627389439293">các ghi chú, ghi chú</translation>
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.cc b/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.cc
index 50a26f67..dde7d5a 100644
--- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.cc
+++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.cc
@@ -11,13 +11,25 @@
 #include "components/ukm/content/source_url_recorder.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_client.h"
+#include "third_party/blink/public/common/features.h"
 #include "url/gurl.h"
 
 namespace page_load_metrics {
 
 PageLoadMetricsObserverContentTestHarness::
-    PageLoadMetricsObserverContentTestHarness()
-    : content::RenderViewHostTestHarness() {}
+    PageLoadMetricsObserverContentTestHarness() {
+  scoped_feature_list_.InitWithFeaturesAndParameters(
+      {
+          {blink::features::kPrerender2, {}},
+          {blink::features::kFencedFrames, {{"implementation_type", "mparch"}}},
+          {blink::features::kInitialNavigationEntry, {}},
+      },
+      {
+          // Disable the memory requirement of Prerender2
+          // so the test can run on any bot.
+          {blink::features::kPrerender2MemoryControls},
+      });
+}
 
 PageLoadMetricsObserverContentTestHarness::
     ~PageLoadMetricsObserverContentTestHarness() {}
diff --git a/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h b/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h
index 22a988f1..b8b1d4bb 100644
--- a/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h
+++ b/components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/memory/raw_ptr.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/page_load_metrics/browser/metrics_navigation_throttle.h"
 #include "components/page_load_metrics/browser/observers/page_load_metrics_observer_tester.h"
 #include "components/page_load_metrics/browser/page_load_metrics_observer.h"
@@ -49,6 +50,7 @@
   std::unique_ptr<PageLoadMetricsObserverTester> tester_;
   PageLoadMetricsTestContentBrowserClient browser_client_;
   raw_ptr<content::ContentBrowserClient> original_browser_client_ = nullptr;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 }  // namespace page_load_metrics
diff --git a/components/page_load_metrics/browser/page_load_tracker_unittest.cc b/components/page_load_metrics/browser/page_load_tracker_unittest.cc
index 6ef89f96..74f5a8cd 100644
--- a/components/page_load_metrics/browser/page_load_tracker_unittest.cc
+++ b/components/page_load_metrics/browser/page_load_tracker_unittest.cc
@@ -5,13 +5,11 @@
 #include "components/page_load_metrics/browser/page_load_tracker.h"
 
 #include "base/containers/flat_map.h"
-#include "base/test/scoped_feature_list.h"
 #include "components/page_load_metrics/browser/observers/page_load_metrics_observer_content_test_harness.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/test_renderer_host.h"
 #include "content/public/test/web_contents_tester.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
-#include "third_party/blink/public/common/features.h"
 
 namespace page_load_metrics {
 
@@ -82,20 +80,8 @@
 
 class PageLoadTrackerTest : public PageLoadMetricsObserverContentTestHarness {
  public:
-  PageLoadTrackerTest() : observer_(new TestPageLoadMetricsObserver(&events_)) {
-    scoped_feature_list_.InitWithFeaturesAndParameters(
-        {
-            {blink::features::kPrerender2, {}},
-            {blink::features::kFencedFrames,
-             {{"implementation_type", "mparch"}}},
-            {blink::features::kInitialNavigationEntry, {}},
-        },
-        {
-            // Disable the memory requirement of Prerender2
-            // so the test can run on any bot.
-            {blink::features::kPrerender2MemoryControls},
-        });
-  }
+  PageLoadTrackerTest()
+      : observer_(new TestPageLoadMetricsObserver(&events_)) {}
 
  protected:
   void SetTargetUrl(const std::string& url) { target_url_ = GURL(url); }
@@ -128,7 +114,6 @@
   raw_ptr<TestPageLoadMetricsObserver> observer_;
   bool is_observer_passed_ = false;
 
-  base::test::ScopedFeatureList scoped_feature_list_;
   GURL target_url_;
 };
 
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn
index 1347f0f..de614886 100644
--- a/components/permissions/BUILD.gn
+++ b/components/permissions/BUILD.gn
@@ -145,10 +145,17 @@
       "android/bluetooth_scanning_prompt_android.cc",
       "android/bluetooth_scanning_prompt_android.h",
       "android/bluetooth_scanning_prompt_android_delegate.h",
-      "android/permission_dialog_delegate.cc",
-      "android/permission_dialog_delegate.h",
-      "android/permission_prompt_android.cc",
-      "android/permission_prompt_android.h",
+      "android/permission_prompt/permission_dialog.cc",
+      "android/permission_prompt/permission_dialog.h",
+      "android/permission_prompt/permission_dialog_delegate.cc",
+      "android/permission_prompt/permission_dialog_delegate.h",
+      "android/permission_prompt/permission_infobar.cc",
+      "android/permission_prompt/permission_infobar.h",
+      "android/permission_prompt/permission_message.cc",
+      "android/permission_prompt/permission_message.h",
+      "android/permission_prompt/permission_prompt_android.cc",
+      "android/permission_prompt/permission_prompt_android.h",
+      "android/permission_prompt/permission_prompt_android_factory.cc",
       "android/permissions_android_feature_list.cc",
       "android/permissions_android_feature_list.h",
       "contexts/geolocation_permission_context_android.cc",
@@ -260,7 +267,8 @@
     ]
   }
   if (is_android) {
-    sources += [ "android/permission_dialog_delegate_unittest.cc" ]
+    sources +=
+        [ "android/permission_prompt/permission_dialog_delegate_unittest.cc" ]
   }
   deps = [
     ":permissions",
diff --git a/components/permissions/android/permission_prompt/permission_dialog.cc b/components/permissions/android/permission_prompt/permission_dialog.cc
new file mode 100644
index 0000000..9d46dbe
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_dialog.cc
@@ -0,0 +1,25 @@
+// 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 "components/permissions/android/permission_prompt/permission_dialog.h"
+
+#include "components/permissions/android/permission_prompt/permission_dialog_delegate.h"
+
+namespace permissions {
+
+PermissionDialog::PermissionDialog(content::WebContents* web_contents,
+                                   Delegate* delegate)
+    : PermissionPromptAndroid(web_contents, delegate) {
+  DCHECK(web_contents);
+
+  PermissionDialogDelegate::Create(web_contents, this);
+}
+
+PermissionDialog::~PermissionDialog() = default;
+
+PermissionPromptDisposition PermissionDialog::GetPromptDisposition() const {
+  return PermissionPromptDisposition::MODAL_DIALOG;
+}
+
+}  // namespace permissions
diff --git a/components/permissions/android/permission_prompt/permission_dialog.h b/components/permissions/android/permission_prompt/permission_dialog.h
new file mode 100644
index 0000000..fc2aa7a7
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_dialog.h
@@ -0,0 +1,30 @@
+// Copyright 2022 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_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_H_
+#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_H_
+
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
+
+namespace content {
+class WebContents;
+}
+
+namespace permissions {
+
+class PermissionDialog : public PermissionPromptAndroid {
+ public:
+  PermissionDialog(content::WebContents* web_contents, Delegate* delegate);
+
+  PermissionDialog(const PermissionDialog&) = delete;
+  PermissionDialog& operator=(const PermissionDialog&) = delete;
+
+  ~PermissionDialog() override;
+
+  PermissionPromptDisposition GetPromptDisposition() const override;
+};
+
+}  // namespace permissions
+
+#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_H_
diff --git a/components/permissions/android/permission_dialog_delegate.cc b/components/permissions/android/permission_prompt/permission_dialog_delegate.cc
similarity index 96%
rename from components/permissions/android/permission_dialog_delegate.cc
rename to components/permissions/android/permission_prompt/permission_dialog_delegate.cc
index c76378df..a39e62b 100644
--- a/components/permissions/android/permission_dialog_delegate.cc
+++ b/components/permissions/android/permission_prompt/permission_dialog_delegate.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/permissions/android/permission_dialog_delegate.h"
+#include "components/permissions/android/permission_prompt/permission_dialog_delegate.h"
 
 #include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "components/permissions/android/jni_headers/PermissionDialogController_jni.h"
 #include "components/permissions/android/jni_headers/PermissionDialogDelegate_jni.h"
-#include "components/permissions/android/permission_prompt_android.h"
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
 #include "components/permissions/permissions_client.h"
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/web_contents.h"
diff --git a/components/permissions/android/permission_dialog_delegate.h b/components/permissions/android/permission_prompt/permission_dialog_delegate.h
similarity index 91%
rename from components/permissions/android/permission_dialog_delegate.h
rename to components/permissions/android/permission_prompt/permission_dialog_delegate.h
index 69e8a1a..f29dc0cb 100644
--- a/components/permissions/android/permission_dialog_delegate.h
+++ b/components/permissions/android/permission_prompt/permission_dialog_delegate.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 COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_DIALOG_DELEGATE_H_
-#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_DIALOG_DELEGATE_H_
+#ifndef COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_
+#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_
 
 #include "base/android/scoped_java_ref.h"
 #include "base/memory/raw_ptr.h"
@@ -14,7 +14,7 @@
 namespace content {
 class WebContents;
 class Page;
-}
+}  // namespace content
 
 namespace permissions {
 
@@ -94,4 +94,4 @@
 
 }  // namespace permissions
 
-#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_DIALOG_DELEGATE_H_
+#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_DIALOG_DELEGATE_H_
diff --git a/components/permissions/android/permission_dialog_delegate_unittest.cc b/components/permissions/android/permission_prompt/permission_dialog_delegate_unittest.cc
similarity index 95%
rename from components/permissions/android/permission_dialog_delegate_unittest.cc
rename to components/permissions/android/permission_prompt/permission_dialog_delegate_unittest.cc
index fcc3d09..d8452f5 100644
--- a/components/permissions/android/permission_dialog_delegate_unittest.cc
+++ b/components/permissions/android/permission_prompt/permission_dialog_delegate_unittest.cc
@@ -4,7 +4,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-#include "components/permissions/android/permission_dialog_delegate.h"
+#include "components/permissions/android/permission_prompt/permission_dialog_delegate.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/test_renderer_host.h"
diff --git a/components/permissions/android/permission_prompt/permission_infobar.cc b/components/permissions/android/permission_prompt/permission_infobar.cc
new file mode 100644
index 0000000..fe22303
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_infobar.cc
@@ -0,0 +1,71 @@
+// Copyright 2022 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 "components/permissions/android/permission_prompt/permission_infobar.h"
+
+#include "base/memory/ptr_util.h"
+#include "components/infobars/core/infobar.h"
+#include "components/infobars/core/infobar_manager.h"
+#include "components/permissions/permissions_client.h"
+#include "content/public/browser/web_contents.h"
+
+namespace permissions {
+
+PermissionInfobar::PermissionInfobar(content::WebContents* web_contents,
+                                     Delegate* delegate)
+    : PermissionPromptAndroid(web_contents, delegate) {
+  auto* permission_client = PermissionsClient::Get();
+  permission_infobar_ = permission_client->MaybeCreateInfoBar(
+      web_contents, GetContentSettingType(0u /* position */),
+      weak_factory_.GetWeakPtr());
+  if (permission_infobar_)
+    permission_client->GetInfoBarManager(web_contents)->AddObserver(this);
+}
+
+PermissionInfobar::~PermissionInfobar() {
+  infobars::InfoBarManager* infobar_manager =
+      PermissionsClient::Get()->GetInfoBarManager(web_contents());
+  if (!infobar_manager)
+    return;
+  // RemoveObserver before RemoveInfoBar to not get notified about the removal
+  // of the `permission_infobar_` infobar.
+  infobar_manager->RemoveObserver(this);
+  if (permission_infobar_) {
+    infobar_manager->RemoveInfoBar(permission_infobar_);
+  }
+}
+
+// static
+std::unique_ptr<PermissionInfobar> PermissionInfobar::Create(
+    content::WebContents* web_contents,
+    Delegate* delegate) {
+  auto prompt = base::WrapUnique(new PermissionInfobar(web_contents, delegate));
+  if (prompt->permission_infobar_)
+    return prompt;
+  return nullptr;
+}
+
+void PermissionInfobar::OnInfoBarRemoved(infobars::InfoBar* infobar,
+                                         bool animate) {
+  if (infobar != permission_infobar_)
+    return;
+
+  permission_infobar_ = nullptr;
+  infobars::InfoBarManager* infobar_manager =
+      PermissionsClient::Get()->GetInfoBarManager(web_contents());
+  if (infobar_manager)
+    infobar_manager->RemoveObserver(this);
+}
+
+void PermissionInfobar::OnManagerShuttingDown(
+    infobars::InfoBarManager* manager) {
+  permission_infobar_ = nullptr;
+  manager->RemoveObserver(this);
+}
+
+PermissionPromptDisposition PermissionInfobar::GetPromptDisposition() const {
+  return PermissionPromptDisposition::MINI_INFOBAR;
+}
+
+}  // namespace permissions
diff --git a/components/permissions/android/permission_prompt/permission_infobar.h b/components/permissions/android/permission_prompt/permission_infobar.h
new file mode 100644
index 0000000..708cf826
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_infobar.h
@@ -0,0 +1,49 @@
+// Copyright 2022 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_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_INFOBAR_H_
+#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_INFOBAR_H_
+
+#include <memory>
+
+#include "base/memory/weak_ptr.h"
+#include "components/infobars/core/infobar_manager.h"
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
+
+namespace content {
+class WebContents;
+}
+
+namespace permissions {
+
+class PermissionInfobar : public PermissionPromptAndroid,
+                          public infobars::InfoBarManager::Observer {
+ public:
+  PermissionInfobar(const PermissionInfobar&) = delete;
+  PermissionInfobar& operator=(const PermissionInfobar&) = delete;
+  ~PermissionInfobar() override;
+
+  PermissionPromptDisposition GetPromptDisposition() const override;
+
+  static std::unique_ptr<PermissionInfobar> Create(
+      content::WebContents* web_contents,
+      Delegate* delegate);
+
+  // InfoBar::Manager:
+  void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override;
+  void OnManagerShuttingDown(infobars::InfoBarManager* manager) override;
+
+ private:
+  PermissionInfobar(content::WebContents* web_contents, Delegate* delegate);
+
+  // The infobar used to display the permission request. Never assume that this
+  // pointer is currently alive.
+  raw_ptr<infobars::InfoBar> permission_infobar_;
+
+  base::WeakPtrFactory<PermissionInfobar> weak_factory_{this};
+};
+
+}  // namespace permissions
+
+#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_INFOBAR_H_
diff --git a/components/permissions/android/permission_prompt/permission_message.cc b/components/permissions/android/permission_prompt/permission_message.cc
new file mode 100644
index 0000000..a0cd8546
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_message.cc
@@ -0,0 +1,36 @@
+// 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 "components/permissions/android/permission_prompt/permission_message.h"
+
+#include "base/memory/ptr_util.h"
+
+namespace permissions {
+
+PermissionMessage::PermissionMessage(content::WebContents* web_contents,
+                                     Delegate* delegate)
+    : PermissionPromptAndroid(web_contents, delegate) {
+  auto* permission_client = PermissionsClient::Get();
+  message_delegate_ = permission_client->MaybeCreateMessageUI(
+      web_contents, GetContentSettingType(0u /* position */),
+      weak_factory_.GetWeakPtr());
+}
+
+PermissionMessage::~PermissionMessage() = default;
+
+// static
+std::unique_ptr<PermissionMessage> PermissionMessage::Create(
+    content::WebContents* web_contents,
+    Delegate* delegate) {
+  auto prompt = base::WrapUnique(new PermissionMessage(web_contents, delegate));
+  if (prompt->message_delegate_)
+    return prompt;
+  return nullptr;
+}
+
+PermissionPromptDisposition PermissionMessage::GetPromptDisposition() const {
+  return PermissionPromptDisposition::MESSAGE_UI;
+}
+
+}  // namespace permissions
diff --git a/components/permissions/android/permission_prompt/permission_message.h b/components/permissions/android/permission_prompt/permission_message.h
new file mode 100644
index 0000000..8a4637d4
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_message.h
@@ -0,0 +1,43 @@
+// Copyright 2022 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_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_MESSAGE_H_
+#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_MESSAGE_H_
+
+#include <memory>
+
+#include "base/memory/weak_ptr.h"
+#include "components/permissions/android/permission_prompt/permission_prompt_android.h"
+#include "components/permissions/permissions_client.h"
+
+namespace content {
+class WebContents;
+}
+
+namespace permissions {
+
+class PermissionMessage : public PermissionPromptAndroid {
+ public:
+  PermissionMessage(const PermissionMessage&) = delete;
+  PermissionMessage& operator=(const PermissionMessage&) = delete;
+  ~PermissionMessage() override;
+
+  static std::unique_ptr<PermissionMessage> Create(
+      content::WebContents* web_contents,
+      Delegate* delegate);
+
+  PermissionPromptDisposition GetPromptDisposition() const override;
+
+ private:
+  PermissionMessage(content::WebContents* web_contents, Delegate* delegate);
+
+  std::unique_ptr<PermissionsClient::PermissionMessageDelegate>
+      message_delegate_;
+
+  base::WeakPtrFactory<PermissionMessage> weak_factory_{this};
+};
+
+}  // namespace permissions
+
+#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_MESSAGE_H_
diff --git a/components/permissions/android/permission_prompt/permission_prompt_android.cc b/components/permissions/android/permission_prompt/permission_prompt_android.cc
new file mode 100644
index 0000000..0ccb430c
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_prompt_android.cc
@@ -0,0 +1,144 @@
+// 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 "components/permissions/android/permission_prompt/permission_prompt_android.h"
+
+#include <vector>
+
+#include "components/permissions/permission_request.h"
+#include "components/resources/android/theme_resources.h"
+#include "components/strings/grit/components_strings.h"
+#include "components/url_formatter/elide_url.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace permissions {
+
+PermissionPromptAndroid::PermissionPromptAndroid(
+    content::WebContents* web_contents,
+    Delegate* delegate)
+    : web_contents_(web_contents), delegate_(delegate) {
+  DCHECK(web_contents);
+}
+
+PermissionPromptAndroid::~PermissionPromptAndroid() = default;
+
+void PermissionPromptAndroid::UpdateAnchor() {
+  NOTIMPLEMENTED();
+}
+
+PermissionPrompt::TabSwitchingBehavior
+PermissionPromptAndroid::GetTabSwitchingBehavior() {
+  return TabSwitchingBehavior::kKeepPromptAlive;
+}
+
+void PermissionPromptAndroid::Closing() {
+  delegate_->Dismiss();
+}
+
+void PermissionPromptAndroid::Accept() {
+  delegate_->Accept();
+}
+
+void PermissionPromptAndroid::Deny() {
+  delegate_->Deny();
+}
+
+void PermissionPromptAndroid::SetManageClicked() {
+  delegate_->SetManageClicked();
+}
+
+void PermissionPromptAndroid::SetLearnMoreClicked() {
+  delegate_->SetLearnMoreClicked();
+}
+
+bool PermissionPromptAndroid::ShouldCurrentRequestUseQuietUI() {
+  return delegate_->ShouldCurrentRequestUseQuietUI();
+}
+
+absl::optional<PermissionUiSelector::QuietUiReason>
+PermissionPromptAndroid::ReasonForUsingQuietUi() const {
+  return delegate_->ReasonForUsingQuietUi();
+}
+
+size_t PermissionPromptAndroid::PermissionCount() const {
+  return delegate_->Requests().size();
+}
+
+ContentSettingsType PermissionPromptAndroid::GetContentSettingType(
+    size_t position) const {
+  const std::vector<PermissionRequest*>& requests = delegate_->Requests();
+  CHECK_LT(position, requests.size());
+  return requests[position]->GetContentSettingsType();
+}
+
+static bool IsValidMediaRequestGroup(
+    const std::vector<PermissionRequest*>& requests) {
+  if (requests.size() < 2)
+    return false;
+  return ((requests[0]->request_type() == RequestType::kMicStream &&
+           requests[1]->request_type() == RequestType::kCameraStream) ||
+          (requests[0]->request_type() == RequestType::kCameraStream &&
+           requests[1]->request_type() == RequestType::kMicStream));
+}
+
+static bool IsValidARCameraAccessRequestGroup(
+    const std::vector<PermissionRequest*>& requests) {
+  if (requests.size() < 2)
+    return false;
+  return ((requests[0]->request_type() == RequestType::kArSession &&
+           requests[1]->request_type() == RequestType::kCameraStream) ||
+          (requests[0]->request_type() == RequestType::kCameraStream &&
+           requests[1]->request_type() == RequestType::kArSession));
+}
+
+// Grouped permission requests can only be Mic+Camera, Camera+Mic,
+// AR + Camera, or Camera + AR.
+static void CheckValidRequestGroup(
+    const std::vector<PermissionRequest*>& requests) {
+  DCHECK_EQ(static_cast<size_t>(2u), requests.size());
+  DCHECK((IsValidMediaRequestGroup(requests)) ||
+         (IsValidARCameraAccessRequestGroup(requests)));
+}
+
+int PermissionPromptAndroid::GetIconId() const {
+  const std::vector<PermissionRequest*>& requests = delegate_->Requests();
+  if (requests.size() == 1)
+    return permissions::GetIconId(requests[0]->request_type());
+  CheckValidRequestGroup(requests);
+  return IDR_ANDROID_INFOBAR_MEDIA_STREAM_CAMERA;
+}
+
+std::u16string PermissionPromptAndroid::GetMessageText() const {
+  const std::vector<PermissionRequest*>& requests = delegate_->Requests();
+  if (requests.size() == 1) {
+    if (requests[0]->request_type() == RequestType::kStorageAccess) {
+      return l10n_util::GetStringFUTF16(
+          IDS_STORAGE_ACCESS_INFOBAR_TEXT,
+          url_formatter::FormatUrlForSecurityDisplay(
+              delegate_->GetRequestingOrigin(),
+              url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC),
+          url_formatter::FormatUrlForSecurityDisplay(
+              delegate_->GetEmbeddingOrigin(),
+              url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
+    } else {
+      return requests[0]->GetDialogMessageText();
+    }
+  }
+  CheckValidRequestGroup(requests);
+  if (IsValidARCameraAccessRequestGroup(requests)) {
+    return l10n_util::GetStringFUTF16(
+        IDS_AR_AND_MEDIA_CAPTURE_VIDEO_INFOBAR_TEXT,
+        url_formatter::FormatUrlForSecurityDisplay(
+            delegate_->GetRequestingOrigin(),
+            url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
+  } else {
+    return l10n_util::GetStringFUTF16(
+        IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_INFOBAR_TEXT,
+        url_formatter::FormatUrlForSecurityDisplay(
+            delegate_->GetRequestingOrigin(),
+            url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
+  }
+}
+
+}  // namespace permissions
diff --git a/components/permissions/android/permission_prompt_android.h b/components/permissions/android/permission_prompt/permission_prompt_android.h
similarity index 60%
rename from components/permissions/android/permission_prompt_android.h
rename to components/permissions/android/permission_prompt/permission_prompt_android.h
index 375817a..9da9180 100644
--- a/components/permissions/android/permission_prompt_android.h
+++ b/components/permissions/android/permission_prompt/permission_prompt_android.h
@@ -2,16 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_ANDROID_H_
-#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_ANDROID_H_
+#ifndef COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_
+#define COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_
 
 #include <memory>
 #include <string>
 
 #include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "components/infobars/core/infobar_manager.h"
 #include "components/permissions/permission_prompt.h"
 #include "components/permissions/permission_uma_util.h"
 #include "components/permissions/permissions_client.h"
@@ -19,14 +17,11 @@
 namespace content {
 class WebContents;
 }
-namespace infobars {
-class InfoBar;
-}
 
 namespace permissions {
 
-class PermissionPromptAndroid : public permissions::PermissionPrompt,
-                                public infobars::InfoBarManager::Observer {
+// Virtual class that is the base class for all Android permission prompts.
+class PermissionPromptAndroid : public PermissionPrompt {
  public:
   PermissionPromptAndroid(content::WebContents* web_contents,
                           Delegate* delegate);
@@ -42,11 +37,9 @@
   // 3. A higher priority request comes in.
   ~PermissionPromptAndroid() override;
 
-  // permissions::PermissionPrompt:
+  // PermissionPrompt:
   void UpdateAnchor() override;
   TabSwitchingBehavior GetTabSwitchingBehavior() override;
-  permissions::PermissionPromptDisposition GetPromptDisposition()
-      const override;
 
   void Closing();
   void Accept();
@@ -65,36 +58,18 @@
   std::u16string GetTitleText() const;
   std::u16string GetMessageText() const;
 
-  const content::WebContents* web_contents() { return web_contents_; }
-
-  // InfoBar::Manager:
-  void OnInfoBarRemoved(infobars::InfoBar* infobar, bool animate) override;
-  void OnManagerShuttingDown(infobars::InfoBarManager* manager) override;
+  content::WebContents* web_contents() { return web_contents_; }
 
  private:
   // PermissionPromptAndroid is owned by PermissionRequestManager, so it should
   // be safe to hold a raw WebContents pointer here because this class is
   // destroyed before the WebContents.
   const raw_ptr<content::WebContents> web_contents_;
+
   // |delegate_| is the PermissionRequestManager, which owns this object.
   const raw_ptr<Delegate> delegate_;
-
-  // The infobar used to display the permission request, if displayed in that
-  // format. Never assume that this pointer is currently alive.
-  raw_ptr<infobars::InfoBar> permission_infobar_;
-
-  // Message UI is alternative to infobars. So it should be impossible that
-  // both |message_delegate_| and |permission_infobar_| are non-null at the
-  // same moment.
-  std::unique_ptr<PermissionsClient::PermissionMessageDelegate>
-      message_delegate_;
-
-  permissions::PermissionPromptDisposition prompt_disposition_ =
-      permissions::PermissionPromptDisposition::NOT_APPLICABLE;
-
-  base::WeakPtrFactory<PermissionPromptAndroid> weak_factory_{this};
 };
 
 }  // namespace permissions
 
-#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_ANDROID_H_
+#endif  // COMPONENTS_PERMISSIONS_ANDROID_PERMISSION_PROMPT_PERMISSION_PROMPT_ANDROID_H_
diff --git a/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc b/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc
new file mode 100644
index 0000000..6ada7f4
--- /dev/null
+++ b/components/permissions/android/permission_prompt/permission_prompt_android_factory.cc
@@ -0,0 +1,32 @@
+// Copyright 2022 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 <memory>
+
+#include "components/permissions/android/permission_prompt/permission_dialog.h"
+#include "components/permissions/android/permission_prompt/permission_infobar.h"
+#include "components/permissions/android/permission_prompt/permission_message.h"
+#include "components/permissions/permission_prompt.h"
+#include "content/public/browser/web_contents.h"
+
+namespace permissions {
+
+std::unique_ptr<PermissionPrompt> PermissionPrompt::Create(
+    content::WebContents* web_contents,
+    Delegate* delegate) {
+  // Quiet UI (non-modal, less intrusive) is preferred over loud one, if
+  // necessary conditions are met. The message UI is preferred over the infobar
+  // UI.
+  auto message_ui = PermissionMessage::Create(web_contents, delegate);
+  if (message_ui)
+    return message_ui;
+
+  auto infobar = PermissionInfobar::Create(web_contents, delegate);
+  if (infobar)
+    return infobar;
+
+  return std::make_unique<PermissionDialog>(web_contents, delegate);
+}
+
+}  // namespace permissions
diff --git a/components/permissions/android/permission_prompt_android.cc b/components/permissions/android/permission_prompt_android.cc
deleted file mode 100644
index 0486024..0000000
--- a/components/permissions/android/permission_prompt_android.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/permissions/android/permission_prompt_android.h"
-
-#include <vector>
-
-#include "components/infobars/core/infobar.h"
-#include "components/infobars/core/infobar_manager.h"
-#include "components/messages/android/message_dispatcher_bridge.h"
-#include "components/permissions/android/permission_dialog_delegate.h"
-#include "components/permissions/permission_request.h"
-#include "components/resources/android/theme_resources.h"
-#include "components/strings/grit/components_strings.h"
-#include "components/url_formatter/elide_url.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace permissions {
-
-PermissionPromptAndroid::PermissionPromptAndroid(
-    content::WebContents* web_contents,
-    Delegate* delegate)
-    : web_contents_(web_contents),
-      delegate_(delegate),
-      permission_infobar_(nullptr),
-      weak_factory_(this) {
-  DCHECK(web_contents);
-
-  auto* permission_client = PermissionsClient::Get();
-  if ((message_delegate_ = permission_client->MaybeCreateMessageUI(
-           web_contents, GetContentSettingType(0u /* position */),
-           weak_factory_.GetWeakPtr()))) {
-    prompt_disposition_ = permissions::PermissionPromptDisposition::MESSAGE_UI;
-  } else if ((permission_infobar_ = permission_client->MaybeCreateInfoBar(
-                  web_contents, GetContentSettingType(0u /* position */),
-                  weak_factory_.GetWeakPtr()))) {
-    prompt_disposition_ =
-        permissions::PermissionPromptDisposition::MINI_INFOBAR;
-    permission_client->GetInfoBarManager(web_contents_)->AddObserver(this);
-  } else {
-    prompt_disposition_ =
-        permissions::PermissionPromptDisposition::MODAL_DIALOG;
-    PermissionDialogDelegate::Create(web_contents_, this);
-  }
-}
-
-PermissionPromptAndroid::~PermissionPromptAndroid() {
-  if (message_delegate_) {
-    return;
-  }
-  infobars::InfoBarManager* infobar_manager =
-      PermissionsClient::Get()->GetInfoBarManager(web_contents_);
-  if (!infobar_manager)
-    return;
-  // RemoveObserver before RemoveInfoBar to not get notified about the removal
-  // of the `permission_infobar_` infobar.
-  infobar_manager->RemoveObserver(this);
-  if (permission_infobar_) {
-    infobar_manager->RemoveInfoBar(permission_infobar_);
-  }
-}
-
-void PermissionPromptAndroid::UpdateAnchor() {
-  NOTIMPLEMENTED();
-}
-
-permissions::PermissionPrompt::TabSwitchingBehavior
-PermissionPromptAndroid::GetTabSwitchingBehavior() {
-  return TabSwitchingBehavior::kKeepPromptAlive;
-}
-
-permissions::PermissionPromptDisposition
-PermissionPromptAndroid::GetPromptDisposition() const {
-  return prompt_disposition_;
-}
-
-void PermissionPromptAndroid::Closing() {
-  delegate_->Dismiss();
-}
-
-void PermissionPromptAndroid::Accept() {
-  delegate_->Accept();
-}
-
-void PermissionPromptAndroid::Deny() {
-  delegate_->Deny();
-}
-
-void PermissionPromptAndroid::SetManageClicked() {
-  delegate_->SetManageClicked();
-}
-
-void PermissionPromptAndroid::SetLearnMoreClicked() {
-  delegate_->SetLearnMoreClicked();
-}
-
-bool PermissionPromptAndroid::ShouldCurrentRequestUseQuietUI() {
-  return delegate_->ShouldCurrentRequestUseQuietUI();
-}
-
-absl::optional<PermissionUiSelector::QuietUiReason>
-PermissionPromptAndroid::ReasonForUsingQuietUi() const {
-  return delegate_->ReasonForUsingQuietUi();
-}
-
-size_t PermissionPromptAndroid::PermissionCount() const {
-  return delegate_->Requests().size();
-}
-
-ContentSettingsType PermissionPromptAndroid::GetContentSettingType(
-    size_t position) const {
-  const std::vector<permissions::PermissionRequest*>& requests =
-      delegate_->Requests();
-  CHECK_LT(position, requests.size());
-  return requests[position]->GetContentSettingsType();
-}
-
-static bool IsValidMediaRequestGroup(
-    const std::vector<permissions::PermissionRequest*>& requests) {
-  if (requests.size() < 2)
-    return false;
-  return (
-      (requests[0]->request_type() == permissions::RequestType::kMicStream &&
-       requests[1]->request_type() ==
-           permissions::RequestType::kCameraStream) ||
-      (requests[0]->request_type() == permissions::RequestType::kCameraStream &&
-       requests[1]->request_type() == permissions::RequestType::kMicStream));
-}
-
-static bool IsValidARCameraAccessRequestGroup(
-    const std::vector<permissions::PermissionRequest*>& requests) {
-  if (requests.size() < 2)
-    return false;
-  return (
-      (requests[0]->request_type() == permissions::RequestType::kArSession &&
-       requests[1]->request_type() ==
-           permissions::RequestType::kCameraStream) ||
-      (requests[0]->request_type() == permissions::RequestType::kCameraStream &&
-       requests[1]->request_type() == permissions::RequestType::kArSession));
-}
-
-// Grouped permission requests can only be Mic+Camera, Camera+Mic,
-// AR + Camera, or Camera + AR.
-static void CheckValidRequestGroup(
-    const std::vector<permissions::PermissionRequest*>& requests) {
-  DCHECK_EQ(static_cast<size_t>(2u), requests.size());
-  DCHECK((IsValidMediaRequestGroup(requests)) ||
-         (IsValidARCameraAccessRequestGroup(requests)));
-}
-
-int PermissionPromptAndroid::GetIconId() const {
-  const std::vector<permissions::PermissionRequest*>& requests =
-      delegate_->Requests();
-  if (requests.size() == 1)
-    return permissions::GetIconId(requests[0]->request_type());
-  CheckValidRequestGroup(requests);
-  return IDR_ANDROID_INFOBAR_MEDIA_STREAM_CAMERA;
-}
-
-std::u16string PermissionPromptAndroid::GetMessageText() const {
-  const std::vector<permissions::PermissionRequest*>& requests =
-      delegate_->Requests();
-  if (requests.size() == 1) {
-    if (requests[0]->request_type() ==
-        permissions::RequestType::kStorageAccess) {
-      return l10n_util::GetStringFUTF16(
-          IDS_STORAGE_ACCESS_INFOBAR_TEXT,
-          url_formatter::FormatUrlForSecurityDisplay(
-              delegate_->GetRequestingOrigin(),
-              url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC),
-          url_formatter::FormatUrlForSecurityDisplay(
-              delegate_->GetEmbeddingOrigin(),
-              url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
-    } else {
-      return requests[0]->GetDialogMessageText();
-    }
-  }
-  CheckValidRequestGroup(requests);
-  if (IsValidARCameraAccessRequestGroup(requests)) {
-    return l10n_util::GetStringFUTF16(
-        IDS_AR_AND_MEDIA_CAPTURE_VIDEO_INFOBAR_TEXT,
-        url_formatter::FormatUrlForSecurityDisplay(
-            delegate_->GetRequestingOrigin(),
-            url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
-  } else {
-    return l10n_util::GetStringFUTF16(
-        IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_INFOBAR_TEXT,
-        url_formatter::FormatUrlForSecurityDisplay(
-            delegate_->GetRequestingOrigin(),
-            url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
-  }
-}
-
-void PermissionPromptAndroid::OnInfoBarRemoved(infobars::InfoBar* infobar,
-                                               bool animate) {
-  if (infobar != permission_infobar_)
-    return;
-
-  permission_infobar_ = nullptr;
-  infobars::InfoBarManager* infobar_manager =
-      PermissionsClient::Get()->GetInfoBarManager(web_contents_);
-  if (infobar_manager)
-    infobar_manager->RemoveObserver(this);
-}
-
-void PermissionPromptAndroid::OnManagerShuttingDown(
-    infobars::InfoBarManager* manager) {
-  permission_infobar_ = nullptr;
-  manager->RemoveObserver(this);
-}
-
-// static
-std::unique_ptr<permissions::PermissionPrompt>
-permissions::PermissionPrompt::Create(content::WebContents* web_contents,
-                                      Delegate* delegate) {
-  return std::make_unique<PermissionPromptAndroid>(web_contents, delegate);
-}
-
-}  // namespace permissions
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 7f507dcc..28e33cb4 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -622,6 +622,7 @@
 
       Wenn sie nicht konfiguriert ist, können Websites den Zugriff erfragen, aber Nutzer können diese Einstellung ändern.</translation>
 <translation id="1678137412645922426">Die Richtlinie legt die Verwendung von <ph name="AES_KL_NAME" /> für die Verschlüsselung des Nutzerdatenspeichers fest, wenn diese unterstützt wird</translation>
+<translation id="1681688654564283886">„Bildschirmzeit“ für Websites deaktivieren</translation>
 <translation id="1682063842123336408">Für die Installation von <ph name="PLUGIN_VM_NAME" /> erforderlicher freier Speicherplatz (in GB).
 
       Wenn die Richtlinie nicht konfiguriert ist, schlägt die Installation von <ph name="PLUGIN_VM_NAME" /> fehl, wenn weniger als 20 GB (Standardwert) freier Speicherplatz auf dem Gerät verfügbar sind.
@@ -1095,6 +1096,10 @@
 <translation id="2149957154942061013">Nur intern</translation>
 <translation id="2151831603578119302">Tastenkombinationen für Bedienungshilfen aktivieren</translation>
 <translation id="2156132677421487971">Konfigurieren von Richtlinien für <ph name="PRODUCT_NAME" />, ein Tool, mit dem Nutzer Inhalte von Tabs, Websites oder dem Desktop von einem Browser auf andere Bildschirme und Soundsysteme übertragen können.</translation>
+<translation id="2156179920247248678">Durch diese Richtlinie kann <ph name="PRODUCT_NAME" /> unter <ph name="MAC_OS_NAME" /> mit der Funktion „Bildschirmzeit“ zusammenarbeiten.
+
+      Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, werden besuchte Ursprünge an das Betriebssystem gemeldet. Für Ursprünge, die in den Einstellungen von „Bildschirmzeit“ blockiert sind, wird ein Blockierungsbildschirm angezeigt.
+      Ist die Richtlinie deaktiviert, werden besuchte Ursprünge nicht an das Betriebssystem gemeldet. Auf Ursprünge, die in den Einstellungen von „Bildschirmzeit“ blockiert sind, kann dann weiterhin zugegriffen werden.</translation>
 <translation id="2156755242840687300">Externe Druckserver aktiviert</translation>
 <translation id="2157842368188031417">Die Richtlinie wird nur auf verwaltete Gastsitzungen angewendet. Für den Modus für gemeinsam genutzte Arbeitsstationen von Imprivata muss sie aktiviert werden, um Benutzerwechsel bei laufender Sitzung zu ermöglichen.
       Ist die Richtlinie auf „True“ gesetzt, wird die Überschreibung bestimmter Richtlinien für Funktionen erzwungen, die sensible Benutzerdaten beibehalten und nicht durch den Bereinigungsmechanismus abgedeckt sind, der im Modus für gemeinsam genutzte Arbeitsstationen von Imprivata den Benutzerwechsel bei laufender Sitzung ermöglicht.
@@ -3218,6 +3223,7 @@
       Beachte, dass mit dieser Richtlinie sowohl DisabledPlugins als auch DisabledPluginsExceptions überschrieben wird.
 
       Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer beliebige auf dem System installierte Plug-ins deaktivieren.</translation>
+<translation id="4549405078915181477">„Bildschirmzeit“ für Websites aktivieren</translation>
 <translation id="4554651132977135445">Loopback-Verarbeitungsmodus der Nutzerrichtlinien</translation>
 <translation id="4555850956567117258">Remote-Bescheinigung (Remote Attestation) für den Nutzer aktivieren</translation>
 <translation id="4557134566541205630">Standardsuchanbieter-URL für die "Neuer Tab"-Seite</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 1ee27963..5b8e9d9 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -629,6 +629,7 @@
 
       Si no la estableces, los sitios web podrán solicitar acceso, pero los usuarios podrán cambiar esta configuración.</translation>
 <translation id="1678137412645922426">Controlar el uso de <ph name="AES_KL_NAME" /> para la encriptación del almacenamiento de datos del usuario (en caso de ser compatible)</translation>
+<translation id="1681688654564283886">Desactivar el Tiempo de uso para sitios web</translation>
 <translation id="1682063842123336408">Indica el espacio libre en disco (expresado en GB) que se necesita para instalar <ph name="PLUGIN_VM_NAME" />.
 
       Si no estableces esta política, fallará la instalación de <ph name="PLUGIN_VM_NAME" /> cuando el espacio libre en disco disponible en el dispositivo sea inferior a 20 GB (valor predeterminado).
@@ -1118,6 +1119,10 @@
 <translation id="2149957154942061013">Solo para uso interno</translation>
 <translation id="2151831603578119302">Habilita las combinaciones de teclas para las funciones de accesibilidad</translation>
 <translation id="2156132677421487971">Configura las políticas para <ph name="PRODUCT_NAME" />, una función que permite que los usuarios envíen el contenido de las pestañas, los sitios o el escritorio del navegador a pantallas y sistemas de sonido remotos.</translation>
+<translation id="2156179920247248678">Esta política permite que <ph name="PRODUCT_NAME" /> participe en la función Tiempo de uso de <ph name="MAC_OS_NAME" />.
+
+      Si habilitas la política o no la estableces, se informarán al SO los orígenes que visitaste, y los orígenes que se bloquearon en la configuración de Tiempo de uso mostrarán una pantalla de bloqueo.
+      Si la inhabilitas, no se informarán al SO los orígenes que visitaste y podrás acceder a los orígenes que se bloquearon en la configuración de Tiempo de uso.</translation>
 <translation id="2156755242840687300">Habilita los servidores de impresión externos</translation>
 <translation id="2157842368188031417">La política solo se aplica a sesiones de invitado administradas. Debe habilitarse para que se pueda cambiar de usuario durante la sesión en el modo de estación de trabajo compartida de Imprivata.
       Si estableces la política como verdadera, se anularán de manera automática algunas políticas de funciones, las cuales conservan datos sensibles del usuario y no se controlan mediante el mecanismo de limpieza utilizado para cambiar de usuario durante la sesión con el modo de estación de trabajo compartida de Imprivata.
@@ -3252,6 +3257,7 @@
       Ten en cuenta que esta política anula las políticas DisabledPlugins y DisabledPluginsExceptions.
 
       Si no se configura esta política, el usuario podrá inhabilitar cualquier complemento instalado en el sistema.</translation>
+<translation id="4549405078915181477">Activar el Tiempo de uso para sitios web</translation>
 <translation id="4554651132977135445">Modo de procesamiento de bucle invertido de la política del usuario</translation>
 <translation id="4555850956567117258">Habilita la atestación remota para el usuario.</translation>
 <translation id="4557134566541205630">URL de la página Nueva pestaña del proveedor de búsqueda predeterminado</translation>
@@ -4740,7 +4746,7 @@
       Si no la estableces, se inhabilitarán estas sugerencias para los usuarios administrados y se habilitarán para los demás usuarios.
       </translation>
 <translation id="6233173491898450179">Establecer el directorio de descarga</translation>
-<translation id="6234177445959386333">Configura la lista de las URL de acceso empresariales donde el servicio de protección de contraseñas debe capturar los hash con sal de las contraseñas.</translation>
+<translation id="6234177445959386333">Configura la lista de las URLs de acceso empresariales donde el servicio de protección de contraseñas debe capturar los hash con sal de las contraseñas.</translation>
 <translation id="6242147107333796512">Proporciona datos relacionados con informes de fallas, como id remota,
       marca de tiempo de captura y causa.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index ee25766..9f13305 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -628,6 +628,7 @@
 
       Si no se le asigna ningún valor, los sitios web podrán solicitar acceso, pero los usuarios podrán cambiar esta opción.</translation>
 <translation id="1678137412645922426">Controla el uso de <ph name="AES_KL_NAME" /> para el cifrado del almacenamiento de los datos del usuario, si se admite</translation>
+<translation id="1681688654564283886">Inhabilitar Tiempo de uso para sitios web</translation>
 <translation id="1682063842123336408">Espacio disponible en disco (en GB) necesario para instalar <ph name="PLUGIN_VM_NAME" />.
 
       Si no se asigna ningún valor a esta política, la instalación de <ph name="PLUGIN_VM_NAME" /> fallará si el dispositivo tiene menos de 20 GB (valor predeterminado) de espacio disponible en disco.
@@ -1120,6 +1121,10 @@
 <translation id="2149957154942061013">Solo para uso interno</translation>
 <translation id="2151831603578119302">Habilitar las combinaciones de teclas para las funciones de accesibilidad</translation>
 <translation id="2156132677421487971">Configura las políticas de <ph name="PRODUCT_NAME" />, una función que permite que los usuarios envíen contenido de las pestañas, los sitios web o el escritorio desde el navegador a pantallas y sistemas de sonido remotos.</translation>
+<translation id="2156179920247248678">Esta política permite que <ph name="PRODUCT_NAME" /> se incluya en la función Tiempo de uso de <ph name="MAC_OS_NAME" />.
+
+      Si esta política se habilita o no se establece, se informará de los orígenes visitados al SO y los orígenes que se hayan bloqueado en los ajustes de Tiempo de uso mostrarán una pantalla de bloqueo.
+      Si se inhabilita, no se informará de los orígenes visitados al SO y se permitirá acceder a los orígenes que se hayan bloqueado en los ajustes de Tiempo de uso.</translation>
 <translation id="2156755242840687300">Servidores de impresión externos habilitados</translation>
 <translation id="2157842368188031417">La política solo se aplica a las sesiones de invitado administradas. Tiene que estar habilitada para que el modo de estación de trabajo compartida de Imprivata permita cambios de usuario durante la sesión.
       Si se le asigna el valor True a la política, se forzará la anulación de determinadas políticas de funciones, que conservan datos de usuario sensibles y no se gestionan mediante el mecanismo de limpieza usado en los cambios de usuario durante la sesión del modo de estación de trabajo compartida de Imprivata.
@@ -3262,6 +3267,7 @@
       Ten en cuenta que esta política anula tanto DisabledPlugins como DisabledPluginsExceptions.
 
       Si no se asigna ningún valor a esta política, el usuario puede inhabilitar cualquier complemento instalado en el sistema.</translation>
+<translation id="4549405078915181477">Habilitar Tiempo de uso para sitios web</translation>
 <translation id="4554651132977135445">Modo de procesamiento loopback de políticas del usuario</translation>
 <translation id="4555850956567117258">Habilitar confirmación remota para el usuario</translation>
 <translation id="4557134566541205630">URL de la página Nueva pestaña del proveedor de búsqueda predeterminado</translation>
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 8c37c6f4..4d9d95b 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -625,6 +625,7 @@
 
       Si cette règle n'est pas configurée, les sites Web peuvent demander l'accès. Toutefois, les utilisateurs peuvent modifier ce paramètre.</translation>
 <translation id="1678137412645922426">Contrôle l'utilisation de <ph name="AES_KL_NAME" /> pour le chiffrement du stockage de l'utilisateur si celui-ci est compatible</translation>
+<translation id="1681688654564283886">Désactiver la fonctionnalité "Temps d'utilisation" pour les sites Web</translation>
 <translation id="1682063842123336408">Permet de spécifier l'espace disque libre requis (en Go) pour installer <ph name="PLUGIN_VM_NAME" />.
 
       Si cette règle n'est pas configurée et que l'espace disque libre sur l'appareil est inférieur à 20 Go (valeur par défaut), le plug-in <ph name="PLUGIN_VM_NAME" /> ne peut pas être installé.
@@ -1114,6 +1115,10 @@
 <translation id="2149957154942061013">Usage interne uniquement</translation>
 <translation id="2151831603578119302">Activer les raccourcis des fonctionnalités d'accessibilité</translation>
 <translation id="2156132677421487971">Configurer les règles pour <ph name="PRODUCT_NAME" />, une fonctionnalité permettant aux utilisateurs de caster le contenu des onglets, des sites ou de leur bureau depuis leur navigateur sur des écrans ou systèmes audio distants.</translation>
+<translation id="2156179920247248678">Ce règlement permet à <ph name="PRODUCT_NAME" /> d'utiliser la fonctionnalité <ph name="MAC_OS_NAME" /> "Temps d'utilisation".
+
+      Si le règlement est activé ou non défini, les origines visitées sont signalées à l'OS, tandis que les origines bloquées dans les paramètres de temps d'utilisation affichent un écran de blocage.
+      Si le règlement est désactivé, les origines visitées ne sont pas signalées à l'OS, tandis que les origines bloquées dans les paramètres de temps d'utilisation demeurent accessibles.</translation>
 <translation id="2156755242840687300">Serveurs d'impression externes activés</translation>
 <translation id="2157842368188031417">Cette règle ne concerne que les sessions Invité gérées. Elle doit être activée pour que le mode station de travail partagée d'Imprivata autorise les changements d'utilisateurs en cours de session.
       Si cette règle est définie sur "True", certaines règles sont ignorées d'office pour des fonctionnalités, qui conservent les données utilisateur sensibles et qui ne sont pas gérées par le mécanisme de nettoyage utilisé pour les changements d'utilisateurs en cours de session avec le mode station de travail partagée d'Imprivata.
@@ -3235,6 +3240,7 @@
       Notez que cette règle ignore les règles DisabledPlugins et DisabledPluginsExceptions.
 
       Si cette règle n'est pas configurée, l'utilisateur peut désactiver n'importe quel plug-in installé sur le système.</translation>
+<translation id="4549405078915181477">Activer la fonctionnalité "Temps d'utilisation" pour les sites Web</translation>
 <translation id="4554651132977135445">Mode de traitement du bouclage pour les règles relatives aux utilisateurs</translation>
 <translation id="4555850956567117258">Activer l'attestation à distance pour l'utilisateur</translation>
 <translation id="4557134566541205630">URL de la page Nouvel onglet du moteur de recherche par défaut</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 404d7d4..f9d9e46e 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -628,6 +628,7 @@
 
       Jika tidak disetel, situs akan meminta akses tetapi pengguna dapat mengubah setelan ini.</translation>
 <translation id="1678137412645922426">Mengontrol penggunaan <ph name="AES_KL_NAME" /> untuk enkripsi penyimpanan pengguna jika didukung</translation>
+<translation id="1681688654564283886">Nonaktifkan Waktu Pemakaian Perangkat untuk situs</translation>
 <translation id="1682063842123336408">Perlu ruang disk kosong (dalam GB) untuk menginstal <ph name="PLUGIN_VM_NAME" />.
 
       Jika kebijakan ini tidak disetel, penginstalan <ph name="PLUGIN_VM_NAME" /> akan gagal jika ruang disk kosong yang tersedia di perangkat kurang dari 20 GB (nilai default).
@@ -1121,6 +1122,10 @@
 <translation id="2149957154942061013">Khusus Internal</translation>
 <translation id="2151831603578119302">Mengaktifkan pintasan fitur aksesibilitas</translation>
 <translation id="2156132677421487971">Mengonfigurasi kebijakan untuk <ph name="PRODUCT_NAME" />, fitur yang memungkinkan pengguna mengirim konten tab, situs, atau desktop dari browser ke sistem suara dan layar jarak jauh.</translation>
+<translation id="2156179920247248678">Kebijakan ini memungkinkan <ph name="PRODUCT_NAME" /> untuk menggunakan fitur Waktu Pemakaian Perangkat <ph name="MAC_OS_NAME" />.
+
+      Jika kebijakan disetel ke Aktif atau tidak disetel, asal yang dikunjungi akan dilaporkan ke OS, dan asal yang telah diblokir di setelan Waktu Pemakaian Perangkat akan menampilkan layar pemblokiran.
+      Jika kebijakan disetel ke Nonaktif, asal yang dikunjungi tidak akan dilaporkan ke OS, dan asal yang telah diblokir di setelan Waktu Pemakaian Perangkat akan dapat diakses.</translation>
 <translation id="2156755242840687300">Server cetak eksternal diaktifkan</translation>
 <translation id="2157842368188031417">Kebijakan ini hanya berlaku untuk sesi tamu terkelola. Kebijakan ini harus diaktifkan untuk mode workstation bersama Imprivata guna memungkinkan pengalihan pengguna dalam sesi.
       Menyetel kebijakan ke Benar (True) akan memaksa penggantian kebijakan tertentu untuk fitur, yang mempertahankan data pengguna sensitif dan tidak ditangani oleh mekanisme pembersihan yang digunakan untuk pengalihan pengguna dalam sesi dengan mode workstation bersama Imprivata.
@@ -3260,6 +3265,7 @@
       Perlu diketahui bahwa kebijakan ini menggantikan DisabledPlugins dan DisabledPluginsExceptions.
 
       Jika kebijakan ini tidak ditetapkan, pengguna dapat menonaktifkan plugin apa pun yang diinstal pada sistem.</translation>
+<translation id="4549405078915181477">Aktifkan Waktu Pemakaian Perangkat untuk situs</translation>
 <translation id="4554651132977135445">Mode pemrosesan loopback kebijakan pengguna</translation>
 <translation id="4555850956567117258">Mengaktifkan pengesahan jarak jauh bagi pengguna</translation>
 <translation id="4557134566541205630">URL halaman tab baru penyedia penelusuran default</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index a44dedc..2feb185 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -629,6 +629,7 @@
 
       설정하지 않으면 웹사이트에서 액세스를 요청하도록 허용하지만 사용자가 이 설정을 변경할 수 있습니다.</translation>
 <translation id="1678137412645922426">지원되는 경우 사용자 저장용량 암호화로 <ph name="AES_KL_NAME" /> 사용 제어</translation>
+<translation id="1681688654564283886">웹사이트에 대한 Screen Time(기기 사용 시간) 사용 중지</translation>
 <translation id="1682063842123336408"><ph name="PLUGIN_VM_NAME" /> 설치에는 GB 단위의 디스크 여유 공간이 필요합니다.
 
       정책을 설정하지 않으면 기기의 디스크 여유 공간이 20GB(기본값) 미만일 경우 <ph name="PLUGIN_VM_NAME" /> 설치에 실패합니다.
@@ -1119,6 +1120,10 @@
 <translation id="2149957154942061013">내부용</translation>
 <translation id="2151831603578119302">접근성 기능 단축키 사용</translation>
 <translation id="2156132677421487971">사용자가 탭, 사이트 또는 데스크톱의 콘텐츠를 브라우저에서 원격 디스플레이와 사운드 시스템으로 전송하도록 해 주는 기능인 <ph name="PRODUCT_NAME" />의 정책을 설정합니다.</translation>
+<translation id="2156179920247248678">이 정책은 <ph name="PRODUCT_NAME" />에서 <ph name="MAC_OS_NAME" /> Screen Time(기기 사용 시간) 기능을 사용할 수 있도록 설정합니다.
+
+      정책을 사용 설정하거나 설정하지 않으면 방문한 출처가 OS에 보고되고, Screen Time(기기 사용 시간) 설정에서 차단된 출처인 경우 차단 화면이 표시됩니다.
+      정책을 사용 중지하면 방문한 출처가 OS에 보고되지 않으며 Screen Time(기기 사용 시간) 설정에서 차단된 출처에 액세스할 수 있습니다.</translation>
 <translation id="2156755242840687300">외부 프린트 서버가 사용 설정됨</translation>
 <translation id="2157842368188031417">이 정책은 관리되는 게스트 세션에만 적용됩니다. Imprivata의 공유 워크스테이션 모드에서 세션 내 사용자 전환을 허용하려면 이 정책이 사용 설정되어야 합니다.
       정책을 True로 설정하면 기능에 대한 특정 정책을 강제로 재정의하고, 그 결과 민감한 사용자 데이터가 보관되며 Imprivata 공유 워크스테이션 모드의 세션 내 사용자 전환에서 사용되는 삭제 메커니즘에 의해 처리되지 않습니다.
@@ -3256,6 +3261,7 @@
       이 정책은 DisabledPlugins 및 DisabledPluginsExceptions를 무시합니다.
 
       이 정책을 설정하지 않으면 사용자가 시스템에 설치된 모든 플러그인을 사용 중지할 수 있습니다.</translation>
+<translation id="4549405078915181477">웹사이트에 대한 Screen Time(기기 사용 시간) 사용 설정</translation>
 <translation id="4554651132977135445">사용자 정책 루프백 처리 모드</translation>
 <translation id="4555850956567117258">사용자에 대한 원격 인증을 사용합니다.</translation>
 <translation id="4557134566541205630">기본 검색 공급자 새 탭 페이지 URL</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index a86157f..ea8478c 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -623,6 +623,7 @@
 
       การไม่ตั้งค่าจะให้เว็บไซต์ขอสิทธิ์เข้าถึงได้ แต่ผู้ใช้เปลี่ยนการตั้งค่านี้ได้</translation>
 <translation id="1678137412645922426">ควบคุมการใช้ <ph name="AES_KL_NAME" /> สำหรับการเข้ารหัสพื้นที่เก็บข้อมูลของผู้ใช้ (หากรองรับ)</translation>
+<translation id="1681688654564283886">ปิดใช้เวลาอยู่หน้าจอสำหรับเว็บไซต์</translation>
 <translation id="1682063842123336408">ต้องมีพื้นที่ว่างในดิสก์ (หน่วยเป็น GB) เพื่อติดตั้ง <ph name="PLUGIN_VM_NAME" />
 
       หากไม่ได้ตั้งค่านโยบายนี้ การติดตั้ง <ph name="PLUGIN_VM_NAME" /> จะไม่สำเร็จหากอุปกรณ์มีพื้นที่ว่างในดิสก์น้อยกว่า 20 GB (ค่าเริ่มต้น)
@@ -722,7 +723,7 @@
       ลำดับของรายการจะปรากฏในลำดับเดียวกันในส่วน "เรียงลำดับภาษาตามความต้องการของคุณ" ที่ chrome://settings/languages ผู้ใช้จะนำภาษาออกหรือเปลี่ยนลำดับภาษาที่นโยบายกำหนดไว้ไม่ได้ แต่จะเพิ่มภาษาใต้รายการที่นโยบายกำหนดไว้ได้ นอกจากนี้ยังสามารถควบคุมภาษาสำหรับ UI และการตั้งค่าการแปล/การตรวจตัวสะกดของเบราว์เซอร์ได้เต็มที่ เว้นแต่จะมีการบังคับใช้โดยนโยบายอื่น
 
       การไม่ตั้งค่านโยบายจะทำให้ผู้ใช้ดัดแปลงรายการภาษาที่ต้องการทั้งหมดได้</translation>
-<translation id="1803646570632580723">รายชื่อของแอปพลิเคชันที่ตรึงจะแสดงในตัวเรียกใช้งาน</translation>
+<translation id="1803646570632580723">รายชื่อของแอปพลิเคชันที่ปักหมุดจะแสดงในตัวเรียกใช้งาน</translation>
 <translation id="1805056271257244521">เมื่อตั้งค่านโยบายนี้เป็น "เปิดใช้" JavaScript setTimeout() ที่มีระยะหมดเวลาเป็น 0 มิลลิวินาทีจะไม่ถูกปรับเป็น 1 มิลลิวินาที
           เมื่อตั้งค่านโยบายนี้เป็น "ปิดใช้" JavaScript setTimeout() ที่มีระยะหมดเวลาเป็น 0 มิลลิวินาทีจะถูกปรับเป็น 1 มิลลิวินาที
           เมื่อไม่มีการตั้งค่าสำหรับนโยบายนี้ ให้ใช้พฤติกรรมเริ่มต้นของเบราว์เซอร์สำหรับการปรับฟังก์ชัน setTimeout()
@@ -1081,6 +1082,10 @@
 <translation id="2149957154942061013">ใช้ภายในเท่านั้น</translation>
 <translation id="2151831603578119302">เปิดใช้แป้นพิมพ์ลัดของฟีเจอร์การช่วยเหลือพิเศษ</translation>
 <translation id="2156132677421487971">กำหนดค่านโยบายต่างๆ สำหรับ <ph name="PRODUCT_NAME" /> ซึ่งเป็นฟีเจอร์ที่ให้ผู้ใช้ส่งเนื้อหาในแท็บ ไซต์ หรือเดสก์ท็อปจากเบราว์เซอร์ไปยังจอแสดงผลและระบบเสียงระยะไกลได้</translation>
+<translation id="2156179920247248678">นโยบายนี้จะเปิดใช้ <ph name="PRODUCT_NAME" /> เพื่อร่วมใช้ฟีเจอร์เวลาอยู่หน้าจอของ <ph name="MAC_OS_NAME" />
+
+      หากเปิดใช้นโยบายหรือไม่ได้ตั้งค่า ระบบจะรายงานต้นทางที่เข้าชมไปยังระบบปฏิบัติการ และต้นทางที่ถูกบล็อกในการตั้งค่าเวลาอยู่หน้าจอจะแสดงหน้าจอการบล็อก
+      หากปิดใช้นโยบาย ระบบจะไม่รายงานต้นทางที่เข้าชมไปยังระบบปฏิบัติการ และต้นทางที่ถูกบล็อกในการตั้งค่าเวลาอยู่หน้าจอจะเข้าถึงได้</translation>
 <translation id="2156755242840687300">เซิร์ฟเวอร์การพิมพ์ภายนอกที่เปิดใช้</translation>
 <translation id="2157842368188031417">นโยบายนี้ใช้กับเซสชันผู้เยี่ยมชมที่มีการจัดการเท่านั้น ต้องเปิดใช้สำหรับโหมดเวิร์กสเตชันที่ใช้ร่วมกันของ Imprivata เพื่ออนุญาตให้สลับผู้ใช้ในเซสชัน
       การตั้งค่านโยบายเป็น "จริง" จะบังคับให้ลบล้างนโยบายบางรายการสำหรับฟีเจอร์ต่างๆ ซึ่งการลบล้างนี้จะยังคงเก็บข้อมูลผู้ใช้ที่มีความละเอียดอ่อนไว้ และไม่ได้รับการจัดการโดยกลไกการล้างข้อมูลที่ใช้สำหรับการสลับผู้ใช้ในเซสชันด้วยโหมดเวิร์กสเตชันที่ใช้ร่วมกันของ Imprivata
@@ -1212,7 +1217,7 @@
 
       ไม่ควรใช้นโยบายนี้กับอุปกรณ์ที่สาธารณชนใช้
 
-      หากตั้งค่านโยบายนี้เป็น "จริง" หรือไม่ตั้งค่า ระบบจะตรึงการแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวในเซสชันผู้เยี่ยมชมที่มีการจัดการซึ่งเรียกใช้อัตโนมัติไว้จนกว่าผู้ใช้จะปิด</translation>
+      หากตั้งค่านโยบายนี้เป็น "จริง" หรือไม่ตั้งค่า ระบบจะปักหมุดการแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวในเซสชันผู้เยี่ยมชมที่มีการจัดการซึ่งเรียกใช้อัตโนมัติไว้จนกว่าผู้ใช้จะปิด</translation>
 <translation id="2281878365805647176">การตั้งค่านโยบายจะเปิดฟีเจอร์การลงชื่อเข้าใช้แบบจำกัดของ Chrome ใน <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้ ผู้ใช้จะเข้าถึงเครื่องมือของ Google ได้โดยใช้บัญชีจากโดเมนที่ระบุเท่านั้น (หากต้องการอนุญาตบัญชี gmail หรือ googlemail ให้เพิ่ม consumer_accounts ลงในรายการโดเมน) การตั้งค่านี้จะป้องกันไม่ให้ผู้ใช้ลงชื่อเข้าใช้และเพิ่มบัญชีรองในอุปกรณ์ที่จัดการซึ่งต้องมีการตรวจสอบสิทธิ์จาก Google หากบัญชีดังกล่าวไม่ได้อยู่ในโดเมนที่อนุญาตอย่างชัดแจ้ง
 
       การปล่อยให้การตั้งค่านี้ว่างหรือไม่ได้ตั้งค่าจะทำให้ผู้ใช้เข้าถึง <ph name="GOOGLE_WORKSPACE_PRODUCT_NAME" /> ด้วยบัญชีใดก็ได้
@@ -2643,7 +2648,7 @@
       ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns</translation>
 <translation id="3858128774616573616">การตั้งค่านโยบายเป็น "เปิดใช้" จะแสดงไอคอน Cast ในแถบเครื่องมือหรือในเมนูรายการเพิ่มเติม และผู้ใช้จะนำออกไม่ได้
 
-      การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ผู้ใช้ตรึงหรือนำไอคอนออกได้ผ่านทางเมนูตามบริบทของไอคอนนั้นๆ
+      การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ผู้ใช้ปักหมุดหรือนำไอคอนออกได้ผ่านทางเมนูตามบริบทของไอคอนนั้นๆ
 
       หากตั้งค่านโยบาย <ph name="ENABLE_MEDIA_ROUTER_POLICY_NAME" /> เป็น "ปิดใช้" ค่าของนโยบายนี้ก็จะไม่มีผล และไอคอนแถบเครื่องมือจะไม่แสดงขึ้นมา</translation>
 <translation id="3858658082795336534">โหมดพิมพ์ 2 ด้านเริ่มต้น</translation>
@@ -2770,7 +2775,7 @@
 
       หากตั้งค่านโยบายนี้เป็น "จริง" การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะปิดหลังผ่านไปสักครู่
 
-      หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะตรึงอยู่จนกว่าผู้ใช้จะปิดการแจ้งเตือนดังกล่าว</translation>
+      หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า การแจ้งเตือนของคำเตือนด้านความเป็นส่วนตัวจะปักหมุดอยู่จนกว่าผู้ใช้จะปิดการแจ้งเตือนดังกล่าว</translation>
 <translation id="4008395195135046807">เส้นทางการท่องเว็บจะแสดงที่ chrome://history/journeys</translation>
 <translation id="4008507541867797979">หากตั้งค่านโยบายนี้เป็น "จริง" หรือไม่ได้กำหนดค่าไว้ <ph name="PRODUCT_OS_NAME" /> จะแสดงผู้ใช้ที่มีอยู่บนหน้าจอการเข้าสู่ระบบและอนุญาตให้เลือกได้ 1 รายการ
 
@@ -3194,6 +3199,7 @@
       โปรดทราบว่านโยบายนี้จะลบล้างทั้ง DisabledPlugins และ DisabledPluginsExceptions
 
       หากไม่ได้ตั้งค่านโยบายนี้ ผู้ใช้จะปิดใช้ปลั๊กอินใดก็ตามที่ติดตั้งไว้ในระบบได้</translation>
+<translation id="4549405078915181477">เปิดใช้เวลาอยู่หน้าจอสำหรับเว็บไซต์</translation>
 <translation id="4554651132977135445">โหมดประมวลผล Loopback ของนโยบายด้านผู้ใช้</translation>
 <translation id="4555850956567117258">เปิดใช้งานการยืนยันระยะไกลสำหรับผู้ใช้</translation>
 <translation id="4557134566541205630">URL หน้าแท็บใหม่ของผู้ให้บริการการค้นหาเริ่มต้น</translation>
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index fd26210..a8dd9a5 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -627,6 +627,7 @@
 
       Politikayı ayarlamadan bırakmak web sitelerinin erişim istemesini sağlar. Kullanıcılar bu ayarı değiştirebilir.</translation>
 <translation id="1678137412645922426">Destekleniyorsa kullanıcı depolama alanı şifrelemesi için <ph name="AES_KL_NAME" /> kullanımını kontrol eder</translation>
+<translation id="1681688654564283886">Web siteleri için ekran süresini devre dışı bırak</translation>
 <translation id="1682063842123336408"><ph name="PLUGIN_VM_NAME" /> eklentisini yüklemek için boş alan (GB cinsinden) gerektir.
 
       Bu politika ayarlanmadan bırakılırsa boş disk alanınız 20 GB'tan (varsayılan değer) az olduğunda <ph name="PLUGIN_VM_NAME" /> yüklemesi başarısız olur.
@@ -1095,6 +1096,10 @@
 <translation id="2149957154942061013">Yalnızca Dahili</translation>
 <translation id="2151831603578119302">Erişilebilirlik özellikleri kısayollarını etkinleştir</translation>
 <translation id="2156132677421487971">Kullanıcıların tarayıcılarındaki sekme, site veya masaüstü içeriklerini uzak ekranlara ve ses sistemlerine göndermelerine olanak tanıyan <ph name="PRODUCT_NAME" /> özelliğine ilişkin politikaları yapılandırın.</translation>
+<translation id="2156179920247248678"><ph name="PRODUCT_NAME" />, bu politika sayesinde <ph name="MAC_OS_NAME" /> ekran süresi özelliğini kullanabilir.
+
+      Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa ziyaret edilen kaynaklar işletim sistemine bildirilir ve ekran süresi ayarlarında engellenen kaynaklarda engelleme ekranı gösterilir.
+      Politika, Devre Dışı değerine ayarlanırsa ziyaret edilen kaynaklar işletim sistemine bildirilmez ve ekran süresi ayarlarında engellenen kaynaklara erişilebilir.</translation>
 <translation id="2156755242840687300">Harici yazdırma sunucuları etkin</translation>
 <translation id="2157842368188031417">Bu politika, yalnızca yönetilen misafir oturumları için geçerlidir. Imprivata'nın paylaşılan iş istasyonu modunda oturum içi kullanıcı değişikliğine izin verilmesi için bu politikanın etkinleştirilmesi gerekir.
       Politika, Doğru değerine ayarlanırsa özelliklerle ilgili politikalardan Imprivata paylaşılan iş istasyonu modundaki oturum içi kullanıcı değişikliklerinde kullanılan temizleme mekanizması tarafından işlenmeyen ve hassas kullanıcı verilerini tutan belirli politikalar zorla geçersiz kılınır.
@@ -3228,6 +3233,7 @@
       Bu politikanın DisabledPlugins ve DisabledPluginsExceptions politikalarını geçersiz kıldığını unutmayın.
 
       Bu politika ayarlanmadan bırakılırsa kullanıcı sistemde yüklü herhangi bir eklentiyi devre dışı bırakabilir.</translation>
+<translation id="4549405078915181477">Web siteleri için ekran süresini etkinleştir</translation>
 <translation id="4554651132977135445">Kullanıcı politikası geri döngü işleme modu</translation>
 <translation id="4555850956567117258">Kullanıcı için uzaktan doğrulamayı etkinleştir</translation>
 <translation id="4557134566541205630">Varsayılan arama sağlayıcısı yeni sekme sayfası URL'si</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 8afaabbb..780cf4bf 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -617,6 +617,7 @@
 
       如果此政策未设置,系统会允许网站请求访问,但用户可以更改此设置。</translation>
 <translation id="1678137412645922426">控制是否使用“<ph name="AES_KL_NAME" />”进行用户存储加密(若支持)</translation>
+<translation id="1681688654564283886">为网站停用“设备使用时间”功能</translation>
 <translation id="1682063842123336408">安装 <ph name="PLUGIN_VM_NAME" /> 所需的可用磁盘空间 (GB)。
 
       如果此政策未设置,当设备上的可用磁盘空间少于 20 GB(默认值)时,<ph name="PLUGIN_VM_NAME" /> 安装会失败。
@@ -1078,6 +1079,9 @@
 <translation id="2149957154942061013">仅供内部使用</translation>
 <translation id="2151831603578119302">启用无障碍功能快捷方式</translation>
 <translation id="2156132677421487971">为 <ph name="PRODUCT_NAME" /> 配置相关政策。借助这项功能,用户可从浏览器将标签页、网站或桌面中的内容发送到远程显示器和音响系统。</translation>
+<translation id="2156179920247248678">此政策让 <ph name="PRODUCT_NAME" /> 能够使用 <ph name="MAC_OS_NAME" /> 的“设备使用时间”功能。
+      如果启用或未设置此政策,系统将会向操作系统报告用户已访问的源,而“设备使用时间”设置中已屏蔽的源会在用户访问时显示一个屏蔽屏幕。
+      如果停用此政策,系统将不会向操作系统报告用户已访问的源,而且“设备使用时间”设置中已屏蔽的源将可供用户访问。</translation>
 <translation id="2156755242840687300">已启用的外部打印服务器</translation>
 <translation id="2157842368188031417">此政策仅适用于受管理的访客会话。必须为 Imprivata 的共享工作站模式启用此政策,以允许在会话期间切换用户。
       如果此政策设为 True,系统将强制覆盖某些政策以实现相关功能,这些功能会保留敏感用户数据,而不会被清理机制(用于在 Imprivata 共享工作站模式下的会话期间切换用户)处理。
@@ -3192,6 +3196,7 @@
       请注意,此政策会覆盖 DisabledPlugins 和 DisabledPluginsExceptions。
 
       如果未设置此政策,则用户可以停用系统中安装的任何插件。</translation>
+<translation id="4549405078915181477">为网站启用“设备使用时间”功能</translation>
 <translation id="4554651132977135445">用户政策环回处理模式</translation>
 <translation id="4555850956567117258">为该用户启用远程认证</translation>
 <translation id="4557134566541205630">默认搜索服务提供商新标签页网址</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index a903123e..fe69992 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -620,6 +620,7 @@
 
       如果不設定,網站可要求存取已連結的 USB 裝置,但使用者可以變更這項設定。</translation>
 <translation id="1678137412645922426">控管是否可採用 <ph name="AES_KL_NAME" /> 加密使用者儲存空間 (如果支援)</translation>
+<translation id="1681688654564283886">停用網站的裝置使用時間功能</translation>
 <translation id="1682063842123336408">安裝 <ph name="PLUGIN_VM_NAME" /> 所需的可用磁碟空間 (以 GB 為單位)。
 
       如果不設定這項政策,當裝置上的可用磁碟空間小於 20 GB (預設值) 時,系統將無法安裝 <ph name="PLUGIN_VM_NAME" />。
@@ -1084,6 +1085,10 @@
 <translation id="2149957154942061013">僅供內部使用</translation>
 <translation id="2151831603578119302">啟用無障礙功能快速鍵</translation>
 <translation id="2156132677421487971">設定「<ph name="PRODUCT_NAME" />」的各項政策。這項功能可讓使用者透過瀏覽器將分頁、網站或桌面內容傳送至遠端的螢幕和音響設備。</translation>
+<translation id="2156179920247248678">你可以透過這項政策控管 <ph name="PRODUCT_NAME" /> 是否要啟用 <ph name="MAC_OS_NAME" /> 的「裝置使用時間」功能。
+
+      如果將這項政策設為啟用或不設定,系統會將已造訪的來源回報給 OS,而在「裝置使用時間」設定中設為封鎖的來源會顯示封鎖畫面。
+      如果停用這項政策,則系統不會向 OS 回報已造訪的來源,且使用者可以存取在「裝置使用時間」設定中設為封鎖的來源。</translation>
 <translation id="2156755242840687300">已啟用的外部列印伺服器</translation>
 <translation id="2157842368188031417">這項政策僅適用於受管理的訪客工作階段。你必須為 Imprivata 的共用工作站模式啟用此政策,才能讓使用者在工作階段中進行切換。
       如果將此政策設為 True,系統會強制覆寫某些功能的政策,這些功能會保留機密的使用者資料,且不會由清理機制處理 (該機制用於 Imprivata 共用工作站模式下的工作階段中使用者切換作業)。
@@ -3193,6 +3198,7 @@
       請注意,這項政策會覆寫 DisabledPlugins 和 DisabledPluginsExceptions。
 
       如果不設定這項政策,使用者將可停用系統上安裝的任何外掛程式。</translation>
+<translation id="4549405078915181477">啟用網站的裝置使用時間功能</translation>
 <translation id="4554651132977135445">使用者政策回送處理模式</translation>
 <translation id="4555850956567117258">為使用者啟用遠端認證機制</translation>
 <translation id="4557134566541205630">預設搜尋引擎新分頁網址</translation>
diff --git a/components/services/screen_ai/BUILD.gn b/components/services/screen_ai/BUILD.gn
index 57e9c55..61614e6 100644
--- a/components/services/screen_ai/BUILD.gn
+++ b/components/services/screen_ai/BUILD.gn
@@ -31,6 +31,7 @@
     "//components/component_updater",
     "//components/services/screen_ai/public/cpp:utilities",
     "//sandbox/linux:sandbox_services",
+    "//ui/accessibility:ax_base",
   ]
 
   public_deps = [ "//sandbox/policy" ]
diff --git a/components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.cc b/components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.cc
index e9b2cd7..f14a629 100644
--- a/components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.cc
+++ b/components/services/screen_ai/sandbox/screen_ai_sandbox_hook_linux.cc
@@ -10,6 +10,7 @@
 #include "components/services/screen_ai/public/cpp/utilities.h"
 #include "sandbox/linux/syscall_broker/broker_command.h"
 #include "sandbox/linux/syscall_broker/broker_file_permission.h"
+#include "ui/accessibility/accessibility_features.h"
 
 using sandbox::syscall_broker::BrokerFilePermission;
 using sandbox::syscall_broker::MakeBrokerCommandSet;
@@ -41,6 +42,11 @@
       BrokerFilePermission::ReadOnly("/dev/urandom"),
       BrokerFilePermission::ReadOnly("/proc/meminfo")};
 
+  if (features::IsScreenAIDebugModeEnabled()) {
+    permissions.push_back(
+        BrokerFilePermission::ReadWriteCreateRecursive("/tmp/"));
+  }
+
   instance->StartBrokerProcess(
       MakeBrokerCommandSet({sandbox::syscall_broker::COMMAND_ACCESS,
                             sandbox::syscall_broker::COMMAND_OPEN}),
diff --git a/components/services/screen_ai/screen_ai_service_impl.cc b/components/services/screen_ai/screen_ai_service_impl.cc
index 99e2848..d1c91d5 100644
--- a/components/services/screen_ai/screen_ai_service_impl.cc
+++ b/components/services/screen_ai/screen_ai_service_impl.cc
@@ -39,14 +39,15 @@
   if (features::IsScreenAIEnabled()) {
     if (!screen_ai_init_function_ || !annotate_function_)
       init_result = InitializationResult::kErrorInvalidLibraryFunctions;
-    else if (!screen_ai_init_function_())
+    else if (!screen_ai_init_function_(features::IsScreenAIDebugModeEnabled()))
       init_result = InitializationResult::kErrorInitializationFailed;
   }
 
   if (features::IsReadAnythingWithScreen2xEnabled()) {
     if (!screen_2x_init_function_ || !extract_main_content_function_)
       init_result = InitializationResult::kErrorInvalidLibraryFunctions;
-    else if (!screen_2x_init_function_()) {
+    else if (!screen_2x_init_function_(
+                 features::IsScreenAIDebugModeEnabled())) {
       init_result = InitializationResult::kErrorInitializationFailed;
     }
   }
diff --git a/components/services/screen_ai/screen_ai_service_impl.h b/components/services/screen_ai/screen_ai_service_impl.h
index 00a54a9..8c3744e8 100644
--- a/components/services/screen_ai/screen_ai_service_impl.h
+++ b/components/services/screen_ai/screen_ai_service_impl.h
@@ -51,14 +51,14 @@
       mojo::PendingReceiver<mojom::Screen2xMainContentExtractor>
           main_content_extractor) override;
 
-  typedef bool (*ScreenAIInitFunction)();
+  typedef bool (*ScreenAIInitFunction)(bool /*debug_mode*/);
   ScreenAIInitFunction screen_ai_init_function_;
 
   typedef bool (*AnnotateFunction)(const SkBitmap& /*image*/,
                                    std::string& /*annotation_text*/);
   AnnotateFunction annotate_function_;
 
-  typedef bool (*Screen2xInitFunction)();
+  typedef bool (*Screen2xInitFunction)(bool /*debug_mode*/);
   Screen2xInitFunction screen_2x_init_function_;
 
   typedef bool (*ExtractMainContentFunction)(
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
index c0ea5f27..0f7b9849 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
@@ -46,6 +46,9 @@
     private final Set<AccountHolder> mAccountHolders = new LinkedHashSet<>();
     private final List<AccountsChangeObserver> mObservers = new ArrayList<>();
 
+    /** Can be used to block {@link #getAccounts()} result. */
+    private @Nullable Promise<List<Account>> mBlockedGetAccountsPromise;
+
     /**
      * Creates an object of FakeAccountManagerFacade.
      */
@@ -67,13 +70,12 @@
 
     @Override
     public Promise<List<Account>> getAccounts() {
-        List<Account> accounts = new ArrayList<>();
         synchronized (mLock) {
-            for (AccountHolder accountHolder : mAccountHolders) {
-                accounts.add(accountHolder.getAccount());
+            if (mBlockedGetAccountsPromise != null) {
+                return mBlockedGetAccountsPromise;
             }
+            return Promise.fulfilled(getAccountsInternal());
         }
-        return Promise.fulfilled(accounts);
     }
 
     @Override
@@ -177,6 +179,40 @@
         return CHILD_ACCOUNT_NAME_PREFIX + baseEmail;
     }
 
+    /**
+     * Blocks callers from getting accounts through {@link #getAccounts}.
+     * After this method is called, subsequent calls to {@link #getAccounts} will return
+     * a non-fulfilled promise. Use {@link #unblockGetAccounts} to unblock this promise.
+     */
+    public void blockGetAccounts() {
+        synchronized (mLock) {
+            assert mBlockedGetAccountsPromise == null;
+            mBlockedGetAccountsPromise = new Promise<>();
+        }
+    }
+
+    /**
+     * Unblocks callers that are waiting for {@link #getAccounts} result.
+     * Use after {@link #blockGetAccounts} to unblock callers waiting for promises obtained from
+     * {@link #getAccounts}.
+     */
+    public void unblockGetAccounts() {
+        synchronized (mLock) {
+            assert mBlockedGetAccountsPromise != null;
+            mBlockedGetAccountsPromise.fulfill(getAccountsInternal());
+            mBlockedGetAccountsPromise = null;
+        }
+    }
+
+    @GuardedBy("mLock")
+    private List<Account> getAccountsInternal() {
+        List<Account> accounts = new ArrayList<>();
+        for (AccountHolder accountHolder : mAccountHolders) {
+            accounts.add(accountHolder.getAccount());
+        }
+        return accounts;
+    }
+
     @GuardedBy("mLock")
     private AccountHolder getAccountHolder(Account account) throws AuthException {
         for (AccountHolder accountHolder : mAccountHolders) {
diff --git a/components/signin/public/base/signin_switches.cc b/components/signin/public/base/signin_switches.cc
index 0611625..73245fa7 100644
--- a/components/signin/public/base/signin_switches.cc
+++ b/components/signin/public/base/signin_switches.cc
@@ -48,6 +48,9 @@
 // Features to trigger the startup sign-in promo at boot.
 const base::Feature kForceStartupSigninPromo{"ForceStartupSigninPromo",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kTangibleSync{"TangibleSync",
+                                  base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/components/signin/public/base/signin_switches.h b/components/signin/public/base/signin_switches.h
index e8ccef3..e751931 100644
--- a/components/signin/public/base/signin_switches.h
+++ b/components/signin/public/base/signin_switches.h
@@ -37,6 +37,7 @@
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
 extern const base::Feature kForceStartupSigninPromo;
+extern const base::Feature kTangibleSync;
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb
index 6a06062..0240e6ce 100644
--- a/components/strings/components_strings_af.xtb
+++ b/components/strings/components_strings_af.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">Afleweringadres</translation>
 <translation id="3402261774528610252">Die verbinding wat gebruik word om hierdie werf te laai, gebruik TLS 1.0 of TLS 1.1, wat opgeskort is en in die toekoms gedeaktiveer sal word. Nadat dit gedeaktiveer is, sal gebruikers verhinder word om hierdie werf te laai. Die bediener moet TLS 1.2 of nuwer aktiveer.</translation>
 <translation id="3405664148539009465">Pasmaak lettertipes</translation>
+<translation id="3407789382767355356">derdeparty-aanmelding</translation>
 <translation id="3409896703495473338">Bestuur sekuriteitinstellings</translation>
 <translation id="3414952576877147120">Grootte:</translation>
 <translation id="3417660076059365994">Lêers wat jy oplaai of aanheg, word na Google Cloud of derde partye gestuur om ontleed te word. Hulle kan byvoorbeeld vir sensitiewe data of wanware geskandeer word.</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 9d829ccb..c14620e 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -894,6 +894,7 @@
 <translation id="3399952811970034796">የመላኪያ አድራሻ</translation>
 <translation id="3402261774528610252">ይህን ጣቢያ ለመጫን ስራ ላይ የዋለው ግንኙነት TLS 1.0 ወይም TLS 1.1 ነው የተጠቀመው፣ እነዚህም የተቋረጡ እና ለወደፊቱ የሚሰናከሉ ናቸው። አንዴ ከተሰናከለ በኋላ ተጠቃሚዎች ይህን ጣቢያ እንዳይጭኑት ይከለከላሉ። አገልጋዩ TLS 1.2 ወይም ከዚያ በኋላ ማንቃት አለበት።</translation>
 <translation id="3405664148539009465">ቅርጸ-ቁምፊዎችን አብጅ</translation>
+<translation id="3407789382767355356">የሶስተኛ ወገን መግቢያ</translation>
 <translation id="3409896703495473338">የደህንነት ቅንብሮችን ያቀናብሩ</translation>
 <translation id="3414952576877147120">መጠን፦</translation>
 <translation id="3417660076059365994">እርስዎ የሚሰቅሏቸው ወይም ዓባሪ የሚያይዟቸው ፋይሎች ወደ Google ደመና ወይም ሦስተኛ ወገኖች ለትንታኔ ይላካሉ። ለምሳሌ፣ አደጋን ሊያስከትል ለሚችል ውሂብ ወይም ተንኮል-አዘል ዌር ሊቃኙ ይችላሉ።</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb
index 1e1cbe7..7543d1ff 100644
--- a/components/strings/components_strings_as.xtb
+++ b/components/strings/components_strings_as.xtb
@@ -1099,6 +1099,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" />ক অৱৰোধ কৰা হৈছে</translation>
 <translation id="3978338123949022456">সন্ধান কৰক ম’ড, <ph name="KEYWORD_SUFFIX" />ৰ জৰিয়তে সন্ধান কৰিবলৈ এটা প্ৰশ্ন টাইপ কৰক আৰু এণ্টাৰ টিপক</translation>
 <translation id="398470910934384994">চৰাই</translation>
+<translation id="3985750352229496475">ঠিকনাসমূহ পৰিচালনা কৰক...</translation>
 <translation id="3986705137476756801">এতিয়াৰ বাবে লাইভ কেপশ্বন অফ কৰক</translation>
 <translation id="3987940399970879459">১ এম. বি.তকৈ কম</translation>
 <translation id="3990250421422698716">লাহেকৈ অফছেটক হেঁচক</translation>
@@ -1225,6 +1226,7 @@
 <translation id="4305666528087210886">আপোনাৰ ফাইলটো এক্সেছ কৰিব পৰা নগ’ল</translation>
 <translation id="4306529830550717874">ঠিকনাটো চেভ কৰিবনে?</translation>
 <translation id="4306812610847412719">ক্লিপব'ৰ্ড</translation>
+<translation id="4310070645992025887">আপোনাৰ জাৰ্নী সন্ধান কৰক</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">অৱৰোধ কৰক (ডিফ’ল্ট)</translation>
 <translation id="4314815835985389558">ছিংক পৰিচালনা কৰক</translation>
@@ -2108,6 +2110,7 @@
 <translation id="6839929833149231406">ক্ষেত্ৰ</translation>
 <translation id="6846340164947227603">এটা ভাৰ্চুৱেল কাৰ্ড নম্বৰ ব্যৱহাৰ কৰক...</translation>
 <translation id="6852204201400771460">এপ্ পুনৰ ল’ড কৰিবনে?</translation>
+<translation id="6857776781123259569">পাছৱৰ্ডসমূহ পৰিচালনা কৰক...</translation>
 <translation id="686485648936420384">গ্ৰাহকৰ উৎস</translation>
 <translation id="6865412394715372076">এই কার্ডখন বৰ্তমান সত্যাপন কৰিব নোৱাৰি</translation>
 <translation id="6869334554832814367">ব্যক্তিগত ঋণ</translation>
@@ -2434,6 +2437,7 @@
 <translation id="7669271284792375604">এই ছাইটৰ আক্ৰমণকাৰীয়ে আপোনাক ছল-চাতুৰিৰে কিছুমান প্ৰ’গ্ৰাম ইনষ্টল কৰাবলৈ বাধ্য কৰাব পাৰে, যিবোৰে আপোনাৰ ব্ৰাউজিং অভিজ্ঞতা ক্ষতিগ্ৰস্থ কৰিব পাৰে (উদাহৰণস্বৰূপে, আপোনাৰ গৃহপৃষ্ঠা সলনি কৰি বা আপুনি চোৱা ছাইটত অধিক বিজ্ঞাপন প্ৰদর্শন কৰি)।</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{গোপনীয় হিচাপে ফ্লেগ কৰা ডেটা সম্পৰ্কে কৰা কাৰ্য (লগইন কৰাৰ পৰা ১ টা কাৰ্য কৰা হৈছে)। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" />}one{গোপনীয় হিচাপে ফ্লেগ কৰা ডেটা সম্পৰ্কে কৰা কাৰ্য (লগইন কৰাৰ পৰা # টা কাৰ্য কৰা হৈছে)। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" />}other{গোপনীয় হিচাপে ফ্লেগ কৰা ডেটা সম্পৰ্কে কৰা কাৰ্য (লগইন কৰাৰ পৰা # টা কাৰ্য কৰা হৈছে)। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">মেইলবক্স ৬</translation>
+<translation id="7675325315208090829">পৰিশোধৰ পদ্ধতিসমূহ পৰিচালনা কৰক...</translation>
 <translation id="7676643023259824263">ক্লিপব’ৰ্ডৰ পাঠ, <ph name="TEXT" /> সন্ধান কৰক</translation>
 <translation id="7679367271685653708">Chromeৰ ছেটিঙত আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস চাওক আৰু পৰিচালনা কৰক</translation>
 <translation id="7679947978757153706">বেছবল</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index 2b43308..a5a353d 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -1103,6 +1103,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> অবরুদ্ধ হয়ে রয়েছে</translation>
 <translation id="3978338123949022456">সার্চ মোড, <ph name="KEYWORD_SUFFIX" /> ব্যবহার করে সার্চ করতে একটি কোয়েরি টাইপ করে Enter কী প্রেস করুন</translation>
 <translation id="398470910934384994">পাখি</translation>
+<translation id="3985750352229496475">ঠিকানাগুলি ম্যানেজ করুন...</translation>
 <translation id="3986705137476756801">এখনকার মতো লাইভ ক্যাপশন বন্ধ করে দিন</translation>
 <translation id="3987940399970879459">১ এমবির কম</translation>
 <translation id="3990250421422698716">জগ অফসেট</translation>
@@ -1230,6 +1231,7 @@
 <translation id="4305666528087210886">আপনার ফাইল অ্যাক্সেস করা যায়নি</translation>
 <translation id="4306529830550717874">ঠিকানা সেভ করবেন?</translation>
 <translation id="4306812610847412719">ক্লিপবোর্ড</translation>
+<translation id="4310070645992025887">আপনার অ্যাক্টিভিটির সিরিজ সার্চ করুন</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">অবরুদ্ধ করুন (ডিফল্ট)</translation>
 <translation id="4314815835985389558">সিঙ্ক ম্যানেজ করুন</translation>
@@ -2113,6 +2115,7 @@
 <translation id="6839929833149231406">এলাকা</translation>
 <translation id="6846340164947227603">কোনও একটি ভার্চুয়াল কার্ড নম্বর ব্যবহার করুন...</translation>
 <translation id="6852204201400771460">আবার অ্যাপ লোড করতে চান?</translation>
+<translation id="6857776781123259569">পাসওয়ার্ড ম্যানেজ করুন…</translation>
 <translation id="686485648936420384">কনজিউমার রিসোর্স</translation>
 <translation id="6865412394715372076">এই কার্ডটি এখনই যাচাই করা যাবে না</translation>
 <translation id="6869334554832814367">পার্সোনাল লোন</translation>
@@ -2439,6 +2442,7 @@
 <translation id="7669271284792375604">Attackers on this site might try to trick you into installing programs that harm your browsing experience (for example, by changing your homepage or showing extra ads on sites you visit).</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{গোপন হিসেবে চিহ্নিত ডেটা ব্যবহার করে যে অ্যাকশন নেওয়া হয়েছে (লগ-ইন করার পরে ১টি অ্যাকশন)। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" />}one{গোপন হিসেবে চিহ্নিত ডেটা ব্যবহার করে যে অ্যাকশন নেওয়া হয়েছে (লগ-ইন করার পরে #টি অ্যাকশন)। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" />}other{গোপন হিসেবে চিহ্নিত ডেটা ব্যবহার করে যে অ্যাকশন নেওয়া হয়েছে (লগ-ইন করার পরে #টি অ্যাকশন)। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">মেলবক্স ৬</translation>
+<translation id="7675325315208090829">পেমেন্ট পদ্ধতিগুলি ম্যানেজ করুন...</translation>
 <translation id="7676643023259824263">ক্লিপবোর্ড টেক্সট <ph name="TEXT" /> সার্চ করুন</translation>
 <translation id="7679367271685653708">Chrome সেটিংস থেকে আপনার ব্রাউজিংয়ের ইতিহাস দেখুন এবং ম্যানেজ করুন</translation>
 <translation id="7679947978757153706">বেসবল</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 47eea9ab..2fd3936 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -895,6 +895,7 @@
 <translation id="3399952811970034796">Lieferadresse</translation>
 <translation id="3402261774528610252">Diese Website wurde unter Verwendung von TLS 1.0 oder TLS 1.1 geladen. Diese Versionen wurden eingestellt und werden zukünftig deaktiviert. Sobald sie deaktiviert wurden, können Nutzer diese Website nicht mehr aufrufen. Auf dem Server sollte TLS 1.2 oder höher laufen.</translation>
 <translation id="3405664148539009465">Schriftart anpassen</translation>
+<translation id="3407789382767355356">Drittanbieter-Anmeldung</translation>
 <translation id="3409896703495473338">Sicherheitseinstellungen verwalten</translation>
 <translation id="3414952576877147120">Größe:</translation>
 <translation id="3417660076059365994">Hochgeladene oder angehängte Dateien werden zur Analyse an Google Cloud oder Dritte gesendet. Sie werden beispielsweise auf sensible Daten oder Malware geprüft.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 4a35da8..b2f5cea 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -898,6 +898,7 @@
 <translation id="3399952811970034796">Delivery address</translation>
 <translation id="3402261774528610252">The connection used to load this site used TLS 1.0 or TLS 1.1, which are deprecated and will be disabled in the future. Once disabled, users will be prevented from loading this site. The server should enable TLS 1.2 or later.</translation>
 <translation id="3405664148539009465">Customise fonts</translation>
+<translation id="3407789382767355356">third-party sign-in</translation>
 <translation id="3409896703495473338">Manage security settings</translation>
 <translation id="3414952576877147120">Size:</translation>
 <translation id="3417660076059365994">Files that you upload or attach are sent to Google Cloud or third parties for analysis. For example, they might be scanned for sensitive data or malware.</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 7c31d83..dc1e8f7 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">Dirección de entrega</translation>
 <translation id="3402261774528610252">La conexión que se usa para cargar este sitio web utiliza TLS 1.0 o TLS 1.1, que están obsoletas y se inhabilitarán en el futuro. Cuando se inhabiliten, los usuarios no podrán cargar este sitio web. El servidor debería habilitar el uso de TLS 1.2 o versiones posteriores.</translation>
 <translation id="3405664148539009465">Personalizar fuentes</translation>
+<translation id="3407789382767355356">inicio de sesión de terceros</translation>
 <translation id="3409896703495473338">Gestionar ajustes de seguridad</translation>
 <translation id="3414952576877147120">Tamaño:</translation>
 <translation id="3417660076059365994">Los archivos que subas o adjuntes se enviarán a Google Cloud o a terceros para que se analicen. Por ejemplo, puede que se analicen para buscar datos sensibles o software malicioso.</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb
index 6e03463..157d838 100644
--- a/components/strings/components_strings_eu.xtb
+++ b/components/strings/components_strings_eu.xtb
@@ -1093,6 +1093,7 @@
 <translation id="3973234410852337861">Blokeatuta dago <ph name="HOST_NAME" /></translation>
 <translation id="3978338123949022456">Bilaketa modua, idatzi kontsulta bat eta sakatu "Sartu" <ph name="KEYWORD_SUFFIX" /> gako-hitzarekin bilatzeko</translation>
 <translation id="398470910934384994">Hegaztiak</translation>
+<translation id="3985750352229496475">Kudeatu helbideak…</translation>
 <translation id="3986705137476756801">Desaktibatu Istanteko azpitituluak, momentuz</translation>
 <translation id="3987940399970879459">1 MB baino gutxiago</translation>
 <translation id="3990250421422698716">Tolestura-marjina</translation>
@@ -1215,6 +1216,7 @@
 <translation id="4305666528087210886">Ezin izan da atzitu fitxategia</translation>
 <translation id="4306529830550717874">Helbidea gorde nahi duzu?</translation>
 <translation id="4306812610847412719">arbela</translation>
+<translation id="4310070645992025887">Bilatu bilaketa-ibilbideetan</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">Blokeatu (lehenetsia)</translation>
 <translation id="4314815835985389558">Kudeatu sinkronizazioa</translation>
@@ -2098,6 +2100,7 @@
 <translation id="6839929833149231406">Eskualdea</translation>
 <translation id="6846340164947227603">Erabili txartel birtualaren zenbakia…</translation>
 <translation id="6852204201400771460">Berriro kargatu nahi duzu aplikazioa?</translation>
+<translation id="6857776781123259569">Kudeatu pasahitzak…</translation>
 <translation id="686485648936420384">Kontsumo-baliabideak</translation>
 <translation id="6865412394715372076">Txartela ezin da egiaztatu une honetan</translation>
 <translation id="6869334554832814367">Mailegu pertsonalak</translation>
@@ -2424,6 +2427,7 @@
 <translation id="7669271284792375604">Webgune honetako erasotzaileak zu engainatzen saia litezke, sarea arakatzea oztopatuko dizuten programak instala ditzazun. Besteak beste, hasierako orria alda lezakete edo ikusten dituzun webguneetan iragarki gehiago erakuts litzakete programok.</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{Isilpeko gisa markatu diren datuekin gauzatutako ekintzak (ekintza bat saioa hasi denetik). <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" />}other{Isilpeko gisa markatu diren datuekin gauzatutako ekintzak (# ekintza saioa hasi denetik). <ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">6. postontzia</translation>
+<translation id="7675325315208090829">Kudeatu ordainketa-metodoak…</translation>
 <translation id="7676643023259824263">Bilatu arbeleko testua (<ph name="TEXT" />)</translation>
 <translation id="7679367271685653708">Ikusi eta kudeatu arakatze-historia Chrome-ren ezarpenetan</translation>
 <translation id="7679947978757153706">Beisbola</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index d36daca..bb8a9b3 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">Delivery Address</translation>
 <translation id="3402261774528610252">Ang koneksyong ginamit para i-load ang site na ito ay gumamit ng TLS 1.0 o TLS 1.1, na hindi na ginagamit at idi-disable sa hinaharap. Kapag na-disable, pipigilan ang mga user na i-load ang site na ito. Dapat i-enable ng server ang TLS 1.2 o mas bago.</translation>
 <translation id="3405664148539009465">I-customize ang mga font</translation>
+<translation id="3407789382767355356">third-party na pag-sign in</translation>
 <translation id="3409896703495473338">Pamahalaan ang mga setting ng seguridad</translation>
 <translation id="3414952576877147120">Laki:</translation>
 <translation id="3417660076059365994">Ipinapadala sa Google Cloud o mga third party para sa pagsusuri ang mga file na na-upload o na-attach mo. Halimbawa, posibleng i-scan ang mga ito para sa sensitibong data o malware.</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index a4869d2..2fe80e49a 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -1102,6 +1102,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> અવરોધિત છે</translation>
 <translation id="3978338123949022456">શોધ મોડ, ક્વેરી ટાઇપ કરો અને <ph name="KEYWORD_SUFFIX" /> વડે શોધવા માટે Enter કી દબાવો</translation>
 <translation id="398470910934384994">પક્ષીઓ</translation>
+<translation id="3985750352229496475">સરનામા મેનેજ કરો…</translation>
 <translation id="3986705137476756801">હાલ પૂરતું, લાઇવ કૅપ્શનની સુવિધા બંધ કરો</translation>
 <translation id="3987940399970879459">1 MB કરતાં ઓછું</translation>
 <translation id="3990250421422698716">બહાર નીકળેલા ભાગને અંદર દબાવો</translation>
@@ -1229,6 +1230,7 @@
 <translation id="4305666528087210886">તમારી ફાઇલ ઍક્સેસ કરી શકાઈ નથી</translation>
 <translation id="4306529830550717874">સરનામું સાચવીએ?</translation>
 <translation id="4306812610847412719">ક્લિપબોર્ડ</translation>
+<translation id="4310070645992025887">તમારા પ્રવાસ શોધો</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">અવરોધિત કરો (ડિફૉલ્ટ)</translation>
 <translation id="4314815835985389558">સિંક મેનેજ કરો</translation>
@@ -2113,6 +2115,7 @@
 <translation id="6839929833149231406">ક્ષેત્ર</translation>
 <translation id="6846340164947227603">વર્ચ્યુઅલ કાર્ડ નંબરનો ઉપયોગ કરો…</translation>
 <translation id="6852204201400771460">ઍપ ફરીથી લોડ કરીએ?</translation>
+<translation id="6857776781123259569">પાસવર્ડ મેનેજ કરો…</translation>
 <translation id="686485648936420384">ગ્રાહક સંસાધનો</translation>
 <translation id="6865412394715372076">હાલમાં આ કાર્ડની ચકાસણી કરી શકાતી નથી</translation>
 <translation id="6869334554832814367">વ્યક્તિગત લોન</translation>
@@ -2439,6 +2442,7 @@
 <translation id="7669271284792375604">આ સાઇટ પરના હુમલાખોરો તમને તમારા બ્રાઉઝિંગ અનુભવને નુકસાન પહોંચાડે એવા પ્રોગ્રામ ઇન્સ્ટૉલ કરવા માટે છેતરવાનો પ્રયાસ કરી શકે છે (ઉદાહરણ તરીકે, તમારું હોમપેજ બદલીને અથવા તમે મુલાકાત લો છો તે સાઇટ પર વધુ પડતી જાહેરાતો બતાવીને).</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{ગોપનીય તરીકે ચિહ્નિત કરવામાં આવેલા ડેટા પર લીધેલા પગલાં (લૉગ ઇન કર્યા પછી 1 પગલાની જાણ થઈ). <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" />}one{ગોપનીય તરીકે ચિહ્નિત કરવામાં આવેલા ડેટા પર લીધેલા પગલાં (લૉગ ઇન કર્યા પછી # પગલાની જાણ થઈ). <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" />}other{ગોપનીય તરીકે ચિહ્નિત કરવામાં આવેલા ડેટા પર લીધેલા પગલાં (લૉગ ઇન કર્યા પછી # પગલાંની જાણ થઈ). <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">મેઇલબૉક્સ 6</translation>
+<translation id="7675325315208090829">ચુકવણી પદ્ધતિઓ મેનેજ કરો…</translation>
 <translation id="7676643023259824263">ક્લિપબોર્ડ ટેક્સ્ટમાંથી શોધો, <ph name="TEXT" /></translation>
 <translation id="7679367271685653708">Chrome સેટિંગમાં તમારો બ્રાઉઝિંગ ઇતિહાસ જુઓ અને મેનેજ કરો</translation>
 <translation id="7679947978757153706">બેસબૉલ</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index a196d87..48253cc 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -897,6 +897,7 @@
 <translation id="3399952811970034796">Szállítási cím</translation>
 <translation id="3402261774528610252">A webhely betöltésére használt kapcsolat a TLS 1.0 vagy a TLS 1.1 protokollt használta, amelyek elavultak, és a jövőben le lesznek tiltva. A letiltásuk után a felhasználók nem fogják tudni betölteni ezt a webhelyet. A szerveren a TLS 1.2-es vagy újabb verzióját kell használni.</translation>
 <translation id="3405664148539009465">Betűtípusok testreszabása</translation>
+<translation id="3407789382767355356">a harmadik fél szolgáltatásokkal való bejelentkezés</translation>
 <translation id="3409896703495473338">Biztonsági beállítások kezelése</translation>
 <translation id="3414952576877147120">Méret:</translation>
 <translation id="3417660076059365994">A böngésző elemzés céljából a Google Cloudnak vagy harmadik feleknek továbbítja a feltöltött és a csatolt fájlokat. A Google Cloud vagy a harmadik fél például bizalmas adatokat vagy rosszindulatú programokat kereshet a fájlokban.</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb
index b5aaa12..db2f1ba 100644
--- a/components/strings/components_strings_km.xtb
+++ b/components/strings/components_strings_km.xtb
@@ -1105,6 +1105,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ត្រូវបានរារាំង</translation>
 <translation id="3978338123949022456">មុខងារស្វែងរក សូមវាយបញ្ចូលសំណួរ និងចុច "Enter" ដើម្បីស្វែងរកជាមួយ <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="398470910934384994">បក្សី</translation>
+<translation id="3985750352229496475">គ្រប់គ្រង​អាសយដ្ឋាន...</translation>
 <translation id="3986705137476756801">បិទអក្សររត់​ក្នុងពេលជាក់ស្ដែង​ឥឡូវនេះ</translation>
 <translation id="3987940399970879459">តិចជាង 1 MB</translation>
 <translation id="3990250421422698716">គម្លាតរុញ</translation>
@@ -1232,6 +1233,7 @@
 <translation id="4305666528087210886">មិនអាចចូលប្រើ​ឯកសារ​របស់អ្នកបានទេ</translation>
 <translation id="4306529830550717874">រក្សាទុក​អាសយដ្ឋាន​ដែរទេ?</translation>
 <translation id="4306812610847412719">ឃ្លីបបត</translation>
+<translation id="4310070645992025887">ស្វែងរកការធ្វើដំណើររបស់អ្នក</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">រារាំង (លំនាំដើម)</translation>
 <translation id="4314815835985389558">គ្រប់គ្រង​សមកាលកម្ម</translation>
@@ -2117,6 +2119,7 @@
 <translation id="6839929833149231406">តំបន់</translation>
 <translation id="6846340164947227603">ប្រើ​លេខ​បណ្ណ​​និម្មិត...</translation>
 <translation id="6852204201400771460">ផ្ទុក​កម្មវិធី​ឡើងវិញ?</translation>
+<translation id="6857776781123259569">គ្រប់គ្រង​ពាក្យសម្ងាត់...</translation>
 <translation id="686485648936420384">ធនធាន​សម្រាប់​អ្នកប្រើប្រាស់</translation>
 <translation id="6865412394715372076">មិនអាច​ផ្ទៀងផ្ទាត់កាតនេះ​​​ឥឡូវនេះ​បានទេ</translation>
 <translation id="6869334554832814367">កម្ចី​ផ្ទាល់ខ្លួន</translation>
@@ -2444,6 +2447,7 @@
 <translation id="7669271284792375604">អ្នកវាយប្រហារនៅលើទំព័រនេះ អាចព្យាយាមបញ្ជោតអ្នកឲ្យដំឡើងកម្មវិធីដែលបង្កគ្រោះថ្នាក់ដល់ការរុករករបស់អ្នក (ឧទាហរណ៍៖ ដោយផ្លាស់ប្តូរទំព័រដើមរបស់អ្នក ឬបង្ហាញការផ្សាយពាណិជ្ជកម្មបន្ថែមនៅលើទំព័រដែលអ្នកបានទៅកាន់)។</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{សកម្មភាព​ដែលបានធ្វើពាក់ព័ន្ធនឹង​ទិន្នន័យដែលបាន​សម្គាល់ថា​ជាការសម្ងាត់ (សកម្មភាព 1 ចាប់តាំងពីចូល)។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" />}other{សកម្មភាព​ដែលបានធ្វើពាក់ព័ន្ធនឹង​ទិន្នន័យដែលបាន​សម្គាល់ថា​ជាការសម្ងាត់ (សកម្មភាព # ចាប់តាំងពីចូល)។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">ប្រអប់​សំបុត្រទី 6</translation>
+<translation id="7675325315208090829">គ្រប់គ្រង​វិធីបង់ប្រាក់...</translation>
 <translation id="7676643023259824263">ស្វែងរក​អត្ថបទ​ឃ្លីបបត, <ph name="TEXT" /></translation>
 <translation id="7679367271685653708">មើល និងគ្រប់គ្រង​ប្រវត្តិរុករកតាម​អ៊ីនធឺណិត​របស់អ្នកនៅក្នុង​ការកំណត់ Chrome</translation>
 <translation id="7679947978757153706">បេស្បល</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb
index 321b8851..94c5424a 100644
--- a/components/strings/components_strings_mk.xtb
+++ b/components/strings/components_strings_mk.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">Адреса за испорака</translation>
 <translation id="3402261774528610252">Врската за вчитување на сајтов користеше TLS 1.0 или TLS 1.1, што се застарени и ќе бидат оневозможени во иднина. Штом ќе се оневозможат, корисниците нема да можат да го вчитуваат сајтов. Серверот треба да овозможи TLS 1.2 или понова верзија.</translation>
 <translation id="3405664148539009465">Приспособете ги фонтовите</translation>
+<translation id="3407789382767355356">најавување на трети страни</translation>
 <translation id="3409896703495473338">Управувај со безбедносните поставки</translation>
 <translation id="3414952576877147120">Големина:</translation>
 <translation id="3417660076059365994">Датотеките што ги прикачувате или приложувате се испраќаат до Google Cloud или трети страни за анализа. На пример, можеби ќе се скенираат за да се провери дали содржат чувствителни податоци или злонамерен софтвер.</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index 33fd3a3..d6b1c6e9 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -1099,6 +1099,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ബ്ലോക്കുചെയ്‌തിരിക്കുന്നു</translation>
 <translation id="3978338123949022456">തിരയൽ മോഡ്, <ph name="KEYWORD_SUFFIX" /> ഉപയോഗിച്ച് തിരയാൻ തിരയൽ പദം ടൈപ്പ് ചെയ്ത ശേഷം Enter അമർത്തുക</translation>
 <translation id="398470910934384994">പക്ഷികൾ</translation>
+<translation id="3985750352229496475">വിലാസങ്ങൾ മാനേജ് ചെയ്യുക...</translation>
 <translation id="3986705137476756801">തത്സമയ ക്യാപ്ഷൻ ഇപ്പോഴത്തേക്ക് ഓഫാക്കുക</translation>
 <translation id="3987940399970879459">ഒരു MB-യിൽ കുറവാണ്</translation>
 <translation id="3990250421422698716">ജോഗ് ഓഫ്‌സെറ്റ്</translation>
@@ -1224,6 +1225,7 @@
 <translation id="4305666528087210886">നിങ്ങളുടെ ഫയൽ ആക്‌സസ് ചെയ്യാനായില്ല</translation>
 <translation id="4306529830550717874">വിലാസം സംരക്ഷിക്കണോ?</translation>
 <translation id="4306812610847412719">ക്ലിപ്പ്ബോർഡ്</translation>
+<translation id="4310070645992025887">നിങ്ങളുടെ യാത്രകൾ തിരയുക</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">ബ്ലോക്ക് ചെയ്യുക (ഡിഫോൾട്ട്)</translation>
 <translation id="4314815835985389558">സമന്വയിപ്പിക്കൽ മാനേജ് ചെയ്യുക</translation>
@@ -2108,6 +2110,7 @@
 <translation id="6839929833149231406">ഏരിയ</translation>
 <translation id="6846340164947227603">വെർച്വൽ കാർഡ് നമ്പർ ഉപയോഗിക്കുക...</translation>
 <translation id="6852204201400771460">ആപ്പ് റീലോഡ് ചെയ്യണോ?</translation>
+<translation id="6857776781123259569">പാസ്‌വേഡുകൾ മാനേജ് ചെയ്യുക...</translation>
 <translation id="686485648936420384">ഉപയോക്തൃ ഉറവിടങ്ങൾ</translation>
 <translation id="6865412394715372076">ഈ കാർഡ് ഇപ്പോൾ പരിശോധിച്ചുറപ്പിക്കാനാവില്ല</translation>
 <translation id="6869334554832814367">വ്യക്തിഗത വായ്പകൾ</translation>
@@ -2432,6 +2435,7 @@
 <translation id="7669271284792375604">ഈ സൈറ്റിലെ ആക്രമണകാരികൾ, ബ്രൗസർ അനുഭവത്തെ ദോഷകരമായി ബാധിക്കുന്ന പ്രോഗ്രാമുകൾ ഇൻസ്‌റ്റാൾ ചെയ്യിക്കുന്ന വിധത്തിൽ നിങ്ങളെ കബളിപ്പിക്കാൻ ശ്രമിച്ചേക്കും (ഉദാഹരണത്തിന്, നിങ്ങളുടെ ഹോംപേജ് മാറ്റുന്നതിലൂടെയോ അല്ലെങ്കിൽ സന്ദർശിക്കുന്ന സൈറ്റുകളിൽ കൂടുതൽ പരസ്യങ്ങൾ കാണിക്കുന്നതിലൂടെയോ).</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{രഹസ്യാത്മകം എന്ന് ഫ്ലാഗ് ചെയ്ത ഡാറ്റ ഉപയോഗിച്ചുള്ള പ്രവർത്തനങ്ങൾ (ലോഗിൻ ചെയ്തത് മുതൽ ഒരു പ്രവർത്തനം). <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" />}other{രഹസ്യാത്മകം എന്ന് ഫ്ലാഗ് ചെയ്ത ഡാറ്റ ഉപയോഗിച്ചുള്ള പ്രവർത്തനങ്ങൾ (ലോഗിൻ ചെയ്തത് മുതൽ # പ്രവർത്തനങ്ങൾ). <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">മെയിൽബോക്സ് 6</translation>
+<translation id="7675325315208090829">പേയ്മെന്റ് രീതികൾ മാനേജ് ചെയ്യുക...</translation>
 <translation id="7676643023259824263">ക്ലിപ്പ്‌ബോർഡ് ടെക്‌സ്‌റ്റിനായി തിരയുക, <ph name="TEXT" /></translation>
 <translation id="7679367271685653708">Chrome ക്രമീകരണത്തിൽ നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം കാണുക, മാനേജ് ചെയ്യുക</translation>
 <translation id="7679947978757153706">ബേസ്ബോൾ</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index ab29ee02..75b0a2f 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">वितरण पत्ता</translation>
 <translation id="3402261774528610252">कनेक्शनने ही साइट लोड करण्यासाठी कालबाह्य झालेले TLS 1.0 किंवा TLS 1.1 वापरले आहेत. ते भविष्यात बंद केले जातील. बंद केल्यानंतर, वापरकर्त्यांना ही साइट लोड करण्यापासून प्रतिबंधित केले जाईल. सर्व्हर TLS 1.2 किंवा त्यापुढील आवृत्तीवर सुरू करणे आवश्यक आहे.</translation>
 <translation id="3405664148539009465">फॉंट कस्टमाइझ करा</translation>
+<translation id="3407789382767355356">तृतीय पक्ष साइन इन</translation>
 <translation id="3409896703495473338">सुरक्षा सेटिंग्ज व्यवस्थापित करा</translation>
 <translation id="3414952576877147120">आकार:</translation>
 <translation id="3417660076059365994">तुम्ही अपलोड किंवा अटॅच केलेल्या फाइल विश्लेषणासाठी Google Cloud किंवा तृतीय पक्षांकडे पाठवल्या जातात. उदाहरणार्थ, त्या संवेदनशील डेटा किंवा मालवेअरसाठी स्कॅन केल्या जाऊ शकतात.</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb
index 1ab960e..1ce16aa02 100644
--- a/components/strings/components_strings_my.xtb
+++ b/components/strings/components_strings_my.xtb
@@ -901,6 +901,7 @@
 <translation id="3399952811970034796">ပေးပို့ရန် လိပ်စာ</translation>
 <translation id="3402261774528610252">ဤဝဘ်ဆိုက်ဖွင့်ရန် အသုံးပြုသော ချိတ်ဆက်မှုက TLS 1.0 သို့မဟုတ် TLS 1.1 ကို သုံးထားသည်။ ၎င်းကို ရပ်ဆိုင်းထားပြီး နောင်တွင်ပိတ်လိုက်ပါမည်။ ပိတ်လိုက်သည့်အခါ အသုံးပြုသူများက ဤဝဘ်ဆိုက်ကို ဖွင့်နိုင်တော့မည်မဟုတ်ပါ။ ဆာဗာက TLS 1.2 နှင့်နောက်ပိုင်းကို ဖွင့်ပေးရပါမည်။</translation>
 <translation id="3405664148539009465">ဖေါင့်များ စိတ်ကြိုက်ပြင်ဆင်ရန်</translation>
+<translation id="3407789382767355356">ပြင်ပအဖွဲ့အစည်းသို့ လက်မှတ်ထိုးဝင်ခြင်း</translation>
 <translation id="3409896703495473338">လုံခြုံရေးဆက်တင်များ စီမံရန်</translation>
 <translation id="3414952576877147120">အရွယ်အစား:</translation>
 <translation id="3417660076059365994">သင်အပ်လုဒ်လုပ်သည့် (သို့) တွဲချိတ်သည့် ဖိုင်များကို ပိုင်းခြားစိတ်ဖြာရန် Google Cloud (သို့) ပြင်ပအဖွဲ့များသို့ ပို့လိုက်သည်။ ဥပမာ သတိထားရသော ဒေတာ (သို့) မဲလ်ဝဲ ရှိမရှိ ၎င်းတို့ကို စစ်ဆေးနိုင်သည်။</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb
index 06678a5..2aaa50c 100644
--- a/components/strings/components_strings_ne.xtb
+++ b/components/strings/components_strings_ne.xtb
@@ -1099,6 +1099,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> माथि रोक लगाइएको छ।</translation>
 <translation id="3978338123949022456">सर्च मोड, <ph name="KEYWORD_SUFFIX" /> मार्फत क्वेरी खोज्न उक्त क्वेरी टाइप गर्नुहोस् र इन्टर थिच्नुहोस्</translation>
 <translation id="398470910934384994">चराहरू</translation>
+<translation id="3985750352229496475">ठेगानाहरू व्यवस्थापन गर्नुहोस्...</translation>
 <translation id="3986705137476756801">अहिलेका लागि लाइभ क्याप्सन अफ गर्नुहोस्</translation>
 <translation id="3987940399970879459">१ एम.बि. भन्दा कम</translation>
 <translation id="3990250421422698716">जग अफसेट</translation>
@@ -1225,6 +1226,7 @@
 <translation id="4305666528087210886">तपाईंको फाइल हेर्न र प्रयोग गर्न सकिएन</translation>
 <translation id="4306529830550717874">ठेगाना सेभ गर्ने हो?</translation>
 <translation id="4306812610847412719">क्लिपबोर्ड</translation>
+<translation id="4310070645992025887">Journeys खोज्नुहोस्</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">रोक लगाउनुहोस् (डिफल्ट मान)</translation>
 <translation id="4314815835985389558">सिंक व्यवस्थापन गर्नुहोस्</translation>
@@ -2109,6 +2111,7 @@
 <translation id="6839929833149231406">क्षेत्र</translation>
 <translation id="6846340164947227603">कुनै भर्चुअल कार्ड नम्बर प्रयोग गर्नुहोस्...</translation>
 <translation id="6852204201400771460">एप पुनः लोड गर्ने हो?</translation>
+<translation id="6857776781123259569">पासवर्डहरू व्यवस्थापन गर्नुहोस्...</translation>
 <translation id="686485648936420384">उपभोक्ता स्रोतसाधन</translation>
 <translation id="6865412394715372076">यो कार्ड यस बखत पुष्टि गर्न सकिँदैन</translation>
 <translation id="6869334554832814367">व्यक्तिगत कर्जा</translation>
@@ -2435,6 +2438,7 @@
 <translation id="7669271284792375604">यो साइटमा रहेका आक्रमणकारीहरूले तपाईंलाई झुक्याएर (उदाहरणका लागि तपाईंको गृहपृष्ठ परिवर्तन गरेर वा तपाईं जाने साइटहरूमा अतिरिक्त विज्ञापनहरू देखाएर) तपाईंको ब्राउजिङको अनुभवलाई हानि पुर्‍याउने प्रोग्रामहरू स्थापना गर्न लगाउने प्रयास गर्न सक्छन्।</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{गोप्य डेटाका रूपमा फ्ल्याग गरिएको डेटा प्रयोग गरी गरिएका कारबाहीहरू (लग इन गरेदेखि एउटा कारबाही गरिएको छ)। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" />}other{गोप्य डेटाका रूपमा फ्ल्याग गरिएको डेटा प्रयोग गरी गरिएका कारबाहीहरू (लग इन गरेदेखि # वटा कारबाही गरिएका छन्)। <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">मेलबक्स ६</translation>
+<translation id="7675325315208090829">भुक्तानी विधिहरू व्यवस्थापन गर्नुहोस्...</translation>
 <translation id="7676643023259824263">क्लिपबोर्डसम्बन्धी पाठ <ph name="TEXT" /> को खोजी गर्नुहोस्</translation>
 <translation id="7679367271685653708">Chrome का सेटिङमा गई आफ्नो ब्राउजिङ इतिहास हेर्नुहोस् र व्यवस्थापन गर्नुहोस्</translation>
 <translation id="7679947978757153706">बेसबल</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index 1358232..b5e43962 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -893,6 +893,7 @@
 <translation id="3399952811970034796">Bezorgadres</translation>
 <translation id="3402261774528610252">De verbinding waarmee deze site is geladen, gebruikte TLS 1.0 of TLS 1.1. Deze versies zijn verouderd en worden in de toekomst niet meer gebruikt. Dan kunnen gebruikers deze site niet meer laden. Voor de server moet TLS 1.2 of hoger worden gebruikt.</translation>
 <translation id="3405664148539009465">Lettertypen aanpassen</translation>
+<translation id="3407789382767355356">externe login</translation>
 <translation id="3409896703495473338">Beveiligingsinstellingen beheren</translation>
 <translation id="3414952576877147120">Grootte:</translation>
 <translation id="3417660076059365994">Bestanden die je uploadt of bijvoegt, worden voor analyse naar Google Cloud of derden gestuurd. De bestanden kunnen bijvoorbeeld worden gescand op gevoelige gegevens of malware.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 5b2a337..532e7b7b 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">Leveringsadresse</translation>
 <translation id="3402261774528610252">Tilkoblingen som ble brukt til å laste inn dette nettstedet, brukte TLS 1.0 eller TLS 1.1, som er foreldet og kommer til å bli slått av i fremtiden. Når det er slått av, blir brukerne hindret i å laste inn dette nettstedet. Tjeneren bør slå på TLS 1.2 eller nyere.</translation>
 <translation id="3405664148539009465">Tilpass skrifttyper</translation>
+<translation id="3407789382767355356">tredjepartspålogging</translation>
 <translation id="3409896703495473338">Administrer sikkerhetsinnstillinger</translation>
 <translation id="3414952576877147120">Størrelse:</translation>
 <translation id="3417660076059365994">Filer du laster opp eller legger ved, sendes til Google Cloud eller tredjeparter for analyse. De kan for eksempel bli skannet for sensitive data eller skadelig programvare.</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb
index 24b1343f..dadbf17 100644
--- a/components/strings/components_strings_pa.xtb
+++ b/components/strings/components_strings_pa.xtb
@@ -1094,6 +1094,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> ਨੂੰ ਬਲੌਕ ਕੀਤਾ ਗਿਆ ਹੈ</translation>
 <translation id="3978338123949022456">ਖੋਜ ਮੋਡ, <ph name="KEYWORD_SUFFIX" /> ਨਾਲ ਖੋਜ ਕਰਨ ਲਈ ਪੁੱਛਗਿੱਛ ਟਾਈਪ ਕਰ ਕੇ Enter ਦਬਾਓ</translation>
 <translation id="398470910934384994">ਪੰਛੀ</translation>
+<translation id="3985750352229496475">ਪਤਿਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ...</translation>
 <translation id="3986705137476756801">ਫ਼ਿਲਹਾਲ ਲਈ ਲਾਈਵ ਸੁਰਖੀਆਂ ਬੰਦ ਕਰੋ</translation>
 <translation id="3987940399970879459">1 MB ਤੋਂ ਘੱਟ</translation>
 <translation id="3990250421422698716">ਜੌਗ ਆਫ਼ਸੈੱਟ</translation>
@@ -1216,6 +1217,7 @@
 <translation id="4305666528087210886">ਤੁਹਾਡੀ ਫ਼ਾਈਲ 'ਤੇ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ</translation>
 <translation id="4306529830550717874">ਕੀ ਤੁਸੀਂ ਪਤਾ ਰੱਖਿਅਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
 <translation id="4306812610847412719">ਕਲਿੱਪਬੋਰਡ</translation>
+<translation id="4310070645992025887">ਆਪਣੇ ਖੋਜ ਸਫ਼ਰਾਂ ਲਈ ਖੋਜ ਕਰੋ</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">ਬਲਾਕ ਕਰੋ (ਪੂਰਵ-ਨਿਰਧਾਰਤ)</translation>
 <translation id="4314815835985389558">ਸਿੰਕ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation>
@@ -2099,6 +2101,7 @@
 <translation id="6839929833149231406">ਖੇਤਰ</translation>
 <translation id="6846340164947227603">ਕੋਈ ਆਭਾਸੀ ਕਾਰਡ ਨੰਬਰ ਵਰਤੋ...</translation>
 <translation id="6852204201400771460">ਕੀ ਐਪ ਰੀਲੋਡ ਕਰਨੀ ਹੈ?</translation>
+<translation id="6857776781123259569">ਪਾਸਵਰਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ...</translation>
 <translation id="686485648936420384">ਖਪਤਕਾਰ ਸਰੋਤ</translation>
 <translation id="6865412394715372076">ਇਸ ਕਾਰਡ ਦੀ ਫਿਲਹਾਲ ਪੁਸ਼ਟੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</translation>
 <translation id="6869334554832814367">ਨਿੱਜੀ ਲੋਨ</translation>
@@ -2425,6 +2428,7 @@
 <translation id="7669271284792375604">ਇਸ ਸਾਈਟ 'ਤੇ ਹਮਲਾਵਰ ਉਹਨਾਂ ਪ੍ਰੋਗਰਾਮਾਂ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਨਾਲ ਚਾਲਬਾਜ਼ੀ ਕਰ ਸਕਦੇ ਹਨ, ਜੋ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਨੁਭਵ ਨੂੰ ਹਾਨੀ ਪਹੁੰਚਾ ਸਕਦੇ ਹਨ (ਉਦਾਹਰਨ ਲਈ, ਤੁਹਾਡਾ ਮੁੱਖ ਪੰਨਾ ਬਦਲਦੇ ਹੋਏ ਜਾਂ ਉਹਨਾਂ ਸਾਈਟਾਂ 'ਤੇ ਵਾਧੂ ਵਿਗਿਆਪਨ ਵਿਖਾਉਂਦੇ ਹੋਏ, ਜਿਨ੍ਹਾਂ 'ਤੇ ਤੁਸੀਂ ਜਾਂਦੇ ਹੋ)</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{ਗੁਪਤ ਵਜੋਂ ਫਲੈਗ ਕੀਤੇ ਗਏ ਡਾਟੇ 'ਤੇ ਕੀਤੀਆਂ ਗਈਆਂ ਕਾਰਵਾਈਆਂ (ਲੌਗ-ਇਨ ਤੋਂ ਬਾਅਦ 1 ਕਾਰਵਾਈ)। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" />}one{ਗੁਪਤ ਵਜੋਂ ਫਲੈਗ ਕੀਤੇ ਗਏ ਡਾਟੇ 'ਤੇ ਕੀਤੀਆਂ ਗਈਆਂ ਕਾਰਵਾਈਆਂ (ਲੌਗ-ਇਨ ਤੋਂ ਬਾਅਦ # ਕਾਰਵਾਈ)। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" />}other{ਗੁਪਤ ਵਜੋਂ ਫਲੈਗ ਕੀਤੇ ਗਏ ਡਾਟੇ 'ਤੇ ਕੀਤੀਆਂ ਗਈਆਂ ਕਾਰਵਾਈਆਂ (ਲੌਗ-ਇਨ ਤੋਂ ਬਾਅਦ # ਕਾਰਵਾਈਆਂ)। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">ਮੇਲਬਾਕਸ 6</translation>
+<translation id="7675325315208090829">ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ...</translation>
 <translation id="7676643023259824263">ਕਲਿੱਪਬੋਰਡ ਲਿਖਤ, <ph name="TEXT" /> ਖੋਜੋ</translation>
 <translation id="7679367271685653708">Chrome ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਆਪਣੇ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਨੂੰ ਦੇਖੋ ਅਤੇ ਉਸ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation>
 <translation id="7679947978757153706">ਬੇਸਬਾਲ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index a51fba6..7e38f2b 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -1097,6 +1097,7 @@
 <translation id="3973234410852337861">Strona <ph name="HOST_NAME" /> jest zablokowana</translation>
 <translation id="3978338123949022456">Tryb wyszukiwania. Wpisz zapytanie i naciśnij Enter, aby wyszukać w <ph name="KEYWORD_SUFFIX" /></translation>
 <translation id="398470910934384994">Ptaki</translation>
+<translation id="3985750352229496475">Zarządzaj adresami...</translation>
 <translation id="3986705137476756801">Na razie wyłącz napisy na żywo</translation>
 <translation id="3987940399970879459">Mniej niż 1 MB</translation>
 <translation id="3990250421422698716">Odsunięcie poszczególnych kopii</translation>
@@ -1219,6 +1220,7 @@
 <translation id="4305666528087210886">Nie udało się uzyskać dostępu do pliku</translation>
 <translation id="4306529830550717874">Zapisać adres?</translation>
 <translation id="4306812610847412719">schowek</translation>
+<translation id="4310070645992025887">Przeszukaj serie czynności</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">Blokuj (domyślnie)</translation>
 <translation id="4314815835985389558">Zarządzanie synchronizacją</translation>
@@ -2103,6 +2105,7 @@
 <translation id="6839929833149231406">Obszar</translation>
 <translation id="6846340164947227603">Użyj numeru karty wirtualnej...</translation>
 <translation id="6852204201400771460">Załadować ponownie aplikację?</translation>
+<translation id="6857776781123259569">Zarządzaj hasłami…</translation>
 <translation id="686485648936420384">Informacje dla konsumentów</translation>
 <translation id="6865412394715372076">Nie można teraz zweryfikować karty</translation>
 <translation id="6869334554832814367">Kredyty konsumpcyjne</translation>
@@ -2429,6 +2432,7 @@
 <translation id="7669271284792375604">Osoby atakujące tę stronę mogą podstępem próbować nakłonić Cię do zainstalowania programów utrudniających przeglądanie internetu (np. zmieniających stronę główną lub wyświetlających dodatkowe reklamy na stronach, na które wchodzisz).</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{Wykonane działania dotyczące danych oznaczonych jako poufne (od momentu zalogowania zgłoszono 1 działanie). <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" />}few{Wykonane działania dotyczące danych oznaczonych jako poufne (od momentu zalogowania zgłoszono # działania). <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" />}many{Wykonane działania dotyczące danych oznaczonych jako poufne (od momentu zalogowania zgłoszono # działań). <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" />}other{Wykonane działania dotyczące danych oznaczonych jako poufne (od momentu zalogowania zgłoszono # działania). <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">Zestaw tac odbiorczych 6</translation>
+<translation id="7675325315208090829">Zarządzaj formami płatności…</translation>
 <translation id="7676643023259824263">Wyszukaj tekst ze schowka, <ph name="TEXT" /></translation>
 <translation id="7679367271685653708">Wyświetl historię przeglądania i zarządzaj nią w ustawieniach Chrome</translation>
 <translation id="7679947978757153706">Baseball</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index e89abcf9..42a5f9a5 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -894,6 +894,7 @@
 <translation id="3399952811970034796">Адрес доставки</translation>
 <translation id="3402261774528610252">Сайт использует устаревший протокол TLS 1.0 или TLS 1.1. В будущем эти протоколы будут отключены, из-за чего пользователи не смогут зайти на сайт. На сервере нужно включить протокол TLS 1.2 или более поздней версии.</translation>
 <translation id="3405664148539009465">Настроить шрифты</translation>
+<translation id="3407789382767355356">вход через сторонние сервисы</translation>
 <translation id="3409896703495473338">Открыть настройки безопасности</translation>
 <translation id="3414952576877147120">Размер:</translation>
 <translation id="3417660076059365994">Загруженные или прикрепленные вами файлы передаются на проверку в Google Cloud или сторонние сервисы. В частности, файлы могут быть просканированы на наличие конфиденциальных данных или вредоносного ПО.</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 1642cc3..e7526cee 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -1103,6 +1103,7 @@
 <translation id="3973234410852337861"><ph name="HOST_NAME" /> బ్లాక్ చేయబడింది</translation>
 <translation id="3978338123949022456">సెర్చ్ మోడ్, <ph name="KEYWORD_SUFFIX" />‌తో సెర్చ్ చేయడానికి క్వెరీని టైప్ చేసి, 'Enter'ను నొక్కండి</translation>
 <translation id="398470910934384994">పక్షులు</translation>
+<translation id="3985750352229496475">అడ్రస్‌లను మేనేజ్ చేయండి...</translation>
 <translation id="3986705137476756801">ప్రస్తుతానికి లైవ్ క్యాప్షన్‌ను ఆఫ్ చేయి</translation>
 <translation id="3987940399970879459">1 MB కంటే తక్కువ</translation>
 <translation id="3990250421422698716">జోగ్ ఆఫ్‌సెట్</translation>
@@ -1230,6 +1231,7 @@
 <translation id="4305666528087210886">మీ ఫైల్‌ను యాక్సెస్ చేయడం సాధ్యపడలేదు</translation>
 <translation id="4306529830550717874">అడ్రస్‌ను సేవ్ చేయాలా?</translation>
 <translation id="4306812610847412719">క్లిప్‌బోర్డ్</translation>
+<translation id="4310070645992025887">మీ బ్రౌజింగ్ జర్నీలను సెర్చ్ చేయండి</translation>
 <translation id="4312613361423056926">B2</translation>
 <translation id="4312866146174492540">బ్లాక్ చేయి (డిఫాల్ట్)</translation>
 <translation id="4314815835985389558">సింక్‌ను నిర్వహించండి</translation>
@@ -2114,6 +2116,7 @@
 <translation id="6839929833149231406">ప్రాంతం</translation>
 <translation id="6846340164947227603">వర్చువల్ కార్డ్ నంబర్‌ను ఉపయోగించండి...</translation>
 <translation id="6852204201400771460">యాప్‌ను మళ్లీ లోడ్ చేయాలా?</translation>
+<translation id="6857776781123259569">పాస్‌వర్డ్‌లను మేనేజ్ చేయండి...</translation>
 <translation id="686485648936420384">కన్జ్యూమర్ రిసోర్స్‌లు</translation>
 <translation id="6865412394715372076">ప్రస్తుతం ఈ కార్డ్‌ని ధృవీకరించడం సాధ్యపడదు</translation>
 <translation id="6869334554832814367">వ్యక్తిగత రుణాలు</translation>
@@ -2440,6 +2443,7 @@
 <translation id="7669271284792375604">ఈ సైట్‌లోని దాడి చేసేవారు మీ బ్రౌజింగ్ అనుభవానికి (ఉదాహరణకు, మీ హోమ్ పేజీని మార్చడం లేదా మీరు సందర్శించే సైట్‌ల్లో అదనపు ప్రకటనలను చూపడం ద్వారా) హాని కలిగించే ప్రోగ్రామ్‌లను ఇన్‌స్టాల్ చేసే విధంగా మిమ్మల్ని మోసగించడానికి ప్రయత్నించవచ్చు.</translation>
 <translation id="7669907849388166732">{COUNT,plural, =1{గోప్యమైనవిగా ఫ్లాగ్ చేయబడిన డేటాతో చర్యలు తీసుకోబడ్డాయి (లాగిన్ చేసినప్పటి నుంచి 1 చర్య రిపోర్ట్ చేయబడింది). <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" />}other{గోప్యమైనవిగా ఫ్లాగ్ చేయబడిన డేటాతో చర్యలు తీసుకోబడ్డాయి (లాగిన్ చేసినప్పటి నుంచి # చర్యలు రిపోర్ట్ చేయబడ్డాయి). <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" />}}</translation>
 <translation id="7673278391011283842">మెయిల్‌బాక్స్ 6</translation>
+<translation id="7675325315208090829">పేమెంట్ ఆప్షన్‌లను మేనేజ్ చేయండి...</translation>
 <translation id="7676643023259824263">క్లిప్‌బోర్డ్ వచనం, <ph name="TEXT" /> కోసం వెతకండి</translation>
 <translation id="7679367271685653708">Chrome సెట్టింగ్‌లలో మీ బ్రౌజింగ్ హిస్టరీని చూడండి, మేనేజ్ చేయండి</translation>
 <translation id="7679947978757153706">బేస్‌బాల్</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index e687dfa..55f4e3bb 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -895,6 +895,7 @@
 <translation id="3399952811970034796">ที่อยู่สำหรับจัดส่ง</translation>
 <translation id="3402261774528610252">การเชื่อมต่อที่ใช้โหลดเว็บไซต์นี้ใช้ TLS 1.0 หรือ TLS 1.1 ซึ่งเลิกใช้งานแล้วและจะถูกปิดใช้ในอนาคต เมื่อปิดใช้แล้ว ระบบจะไม่ให้ผู้ใช้โหลดเว็บไซต์นี้ เซิร์ฟเวอร์ควรเปิดใช้ TLS 1.2 ขึ้นไป</translation>
 <translation id="3405664148539009465">กำหนดค่าแบบอักษร</translation>
+<translation id="3407789382767355356">การลงชื่อเข้าใช้ของบุคคลที่สาม</translation>
 <translation id="3409896703495473338">จัดการการตั้งค่าความปลอดภัย</translation>
 <translation id="3414952576877147120">ขนาด:</translation>
 <translation id="3417660076059365994">ไฟล์ที่คุณอัปโหลดหรือแนบจะส่งไปยัง Google Cloud หรือบุคคลที่สามเพื่อทำการวิเคราะห์ เช่น สแกนหาข้อมูลที่ละเอียดอ่อนหรือมัลแวร์</translation>
@@ -1850,7 +1851,7 @@
 <translation id="6047927260846328439">เนื้อหานี้อาจพยายามหลอกล่อให้คุณติดตั้งซอฟต์แวร์หรือเปิดเผยข้อมูลส่วนบุคคล <ph name="BEGIN_LINK" />แสดงเนื้อหา<ph name="END_LINK" /></translation>
 <translation id="6049004884579590341">กด |<ph name="ACCELERATOR" />| ค้างไว้เพื่อออกจากโหมดเต็มหน้าจอ</translation>
 <translation id="6049488691372270142">หน้าที่แสดง</translation>
-<translation id="6051221802930200923">คุณไม่สามารถไปที่ <ph name="SITE" /> ได้ในขณะนี้เนื่องจากเว็บไซต์ใช้การตรึงใบรับรอง โดยปกติข้อผิดพลาดของเครือข่ายและการโจมตีจะเกิดขึ้นเพียงชั่วคราว หน้านี้จึงอาจใช้งานได้ในภายหลัง</translation>
+<translation id="6051221802930200923">คุณไม่สามารถไปที่ <ph name="SITE" /> ได้ในขณะนี้เนื่องจากเว็บไซต์ใช้การปักหมุดใบรับรอง โดยปกติข้อผิดพลาดของเครือข่ายและการโจมตีจะเกิดขึ้นเพียงชั่วคราว หน้านี้จึงอาจใช้งานได้ในภายหลัง</translation>
 <translation id="6051898664905071243">จำนวนหน้า:</translation>
 <translation id="6052284303005792909">•</translation>
 <translation id="6052319569711353666">ระบบพบว่ารหัสผ่านที่คุณเพิ่งใช้มีการรั่วไหลในการละเมิดข้อมูลครั้งหนึ่ง เครื่องมือจัดการรหัสผ่านของ Google แนะนำให้เปลี่ยนรหัสผ่านนี้ทันที</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 59724481..cd5cc37 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -899,6 +899,7 @@
 <translation id="3399952811970034796">Адреса доставки</translation>
 <translation id="3402261774528610252">Цей веб-сайт використовує протоколи TLS версії 1.0 або 1.1, які вже не підтримуються. Коли їх буде вимкнено, користувачі більше не зможуть його завантажувати. На сервері має бути встановлено протокол TLS 1.2 або новішої версії.</translation>
 <translation id="3405664148539009465">Налаштувати шрифти</translation>
+<translation id="3407789382767355356">вхід через сторонні сервіси</translation>
 <translation id="3409896703495473338">Керувати налаштуваннями безпеки</translation>
 <translation id="3414952576877147120">Розмір:</translation>
 <translation id="3417660076059365994">Файли, які ви додаєте або долучаєте, надсилаються на платформу Google Cloud або стороннім сервісам на аналіз. Наприклад, їх можуть сканувати на наявність конфіденційних даних або зловмисного програмного забезпечення.</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb
index 1b22b134..ba7831e4 100644
--- a/components/strings/components_strings_zu.xtb
+++ b/components/strings/components_strings_zu.xtb
@@ -897,6 +897,7 @@
 <translation id="3399952811970034796">Ikheli lokulethwa</translation>
 <translation id="3402261774528610252">Ukuxhuma okusetshenziselwe ukulayisha le sayithi kusebenzise i-TLS 1.0 noma i-TLS 1.1, engavunyelwe futhi ekuzokhutshazwa esikhathini esizayo. Lapho isikhutshaziwe, abasebenzisi bazovinjelwa ukulayisha le sayithi. Iseva kufanele inike amandla i-TLS 1.2 noma yakamuva.</translation>
 <translation id="3405664148539009465">Enza ngendlela oyifisayo amafonti</translation>
+<translation id="3407789382767355356">ukungena ngemvume kongahlangene ngqo</translation>
 <translation id="3409896703495473338">Phatha izilungiselelo zokuvikela</translation>
 <translation id="3414952576877147120">Usayizi:</translation>
 <translation id="3417660076059365994">Amafayela owalayishayo noma owanamathiselayo athunyelwa ku-Google Cloud noma kuzinkampani zangaphandle ukuze ahlaziywe. Isibonelo, angapheqululwa mayelana nedatha ezwelayo noma uhlelo olungayilungele ikhompuyutha.</translation>
diff --git a/components/sync/base/model_type.cc b/components/sync/base/model_type.cc
index 863c2ab1a..3e28b28f 100644
--- a/components/sync/base/model_type.cc
+++ b/components/sync/base/model_type.cc
@@ -161,6 +161,9 @@
     {WORKSPACE_DESK, "WORKSPACE_DESK", "workspace_desk", "Workspace Desk",
      sync_pb::EntitySpecifics::kWorkspaceDeskFieldNumber,
      ModelTypeForHistograms::kWorkspaceDesk},
+    {HISTORY, "HISTORY", "history", "History",
+     sync_pb::EntitySpecifics::kHistoryFieldNumber,
+     ModelTypeForHistograms::kHistory},
     // ---- Proxy types ----
     {PROXY_TABS, "", "", "Tabs", -1, ModelTypeForHistograms::kProxyTabs},
     // ---- Control Types ----
@@ -172,11 +175,11 @@
 static_assert(std::size(kModelTypeInfoMap) == GetNumModelTypes(),
               "kModelTypeInfoMap should have GetNumModelTypes() elements");
 
-static_assert(38 == syncer::GetNumModelTypes(),
+static_assert(39 == syncer::GetNumModelTypes(),
               "When adding a new type, update enum SyncModelTypes in enums.xml "
               "and suffix SyncModelType in histograms.xml.");
 
-static_assert(38 == syncer::GetNumModelTypes(),
+static_assert(39 == syncer::GetNumModelTypes(),
               "When adding a new type, update kAllocatorDumpNameAllowlist in "
               "base/trace_event/memory_infra_background_allowlist.cc.");
 
@@ -298,6 +301,9 @@
     case SHARING_MESSAGE:
       specifics->mutable_sharing_message();
       break;
+    case HISTORY:
+      specifics->mutable_history();
+      break;
   }
 }
 
@@ -317,7 +323,7 @@
 }
 
 ModelType GetModelTypeFromSpecifics(const sync_pb::EntitySpecifics& specifics) {
-  static_assert(38 == syncer::GetNumModelTypes(),
+  static_assert(39 == syncer::GetNumModelTypes(),
                 "When adding new protocol types, the following type lookup "
                 "logic must be updated.");
   if (specifics.has_bookmark())
@@ -392,6 +398,8 @@
     return AUTOFILL_WALLET_OFFER;
   if (specifics.has_workspace_desk())
     return WORKSPACE_DESK;
+  if (specifics.has_history())
+    return HISTORY;
 
   // This client version doesn't understand |specifics|.
   DVLOG(1) << "Unknown datatype in sync proto.";
@@ -410,7 +418,7 @@
 }
 
 ModelTypeSet EncryptableUserTypes() {
-  static_assert(38 == syncer::GetNumModelTypes(),
+  static_assert(39 == syncer::GetNumModelTypes(),
                 "If adding an unencryptable type, remove from "
                 "encryptable_user_types below.");
   ModelTypeSet encryptable_user_types = UserTypes();
@@ -420,6 +428,7 @@
   // Commit-only types are never encrypted since they are consumed server-side.
   encryptable_user_types.RemoveAll(CommitOnlyTypes());
   // Other types that are never encrypted because consumed server-side.
+  encryptable_user_types.Remove(HISTORY);
   encryptable_user_types.Remove(HISTORY_DELETE_DIRECTIVES);
   encryptable_user_types.Remove(DEVICE_INFO);
   // Never encrypted because also written server-side.
diff --git a/components/sync/base/model_type.h b/components/sync/base/model_type.h
index a44fd69ef..07b707e 100644
--- a/components/sync/base/model_type.h
+++ b/components/sync/base/model_type.h
@@ -134,6 +134,8 @@
   // used by the server and Play Services, not Chrome itself.
   // (crbug.com/1223853)
   // WEBAUTHN_CREDENTIAL,
+  // Synced history. An entity roughly corresponds to a navigation.
+  HISTORY,
 
   // Proxy types are excluded from the sync protocol, but are still considered
   // real user types. By convention, we prefix them with 'PROXY_' to distinguish
@@ -230,7 +232,8 @@
   kSharingMessage = 48,
   kAutofillWalletOffer = 49,
   kWorkspaceDesk = 50,
-  kMaxValue = kWorkspaceDesk
+  kHistory = 51,
+  kMaxValue = kHistory
 };
 
 // Used to mark the type of EntitySpecifics that has no actual data.
@@ -252,7 +255,8 @@
       DEVICE_INFO, PRIORITY_PREFERENCES, SUPERVISED_USER_SETTINGS, APP_LIST,
       ARC_PACKAGE, PRINTERS, READING_LIST, USER_EVENTS, NIGORI, USER_CONSENTS,
       SEND_TAB_TO_SELF, SECURITY_EVENTS, WEB_APPS, WIFI_CONFIGURATIONS,
-      OS_PREFERENCES, OS_PRIORITY_PREFERENCES, SHARING_MESSAGE, WORKSPACE_DESK);
+      OS_PREFERENCES, OS_PRIORITY_PREFERENCES, SHARING_MESSAGE, WORKSPACE_DESK,
+      HISTORY);
 }
 
 // These are the normal user-controlled types. This is to distinguish from
diff --git a/components/sync/base/user_selectable_type.cc b/components/sync/base/user_selectable_type.cc
index 8c65c8d..78ae507 100644
--- a/components/sync/base/user_selectable_type.cc
+++ b/components/sync/base/user_selectable_type.cc
@@ -75,7 +75,8 @@
     case UserSelectableType::kHistory:
       return {kTypedUrlsTypeName,
               TYPED_URLS,
-              {TYPED_URLS, HISTORY_DELETE_DIRECTIVES, SESSIONS, USER_EVENTS}};
+              {TYPED_URLS, HISTORY, HISTORY_DELETE_DIRECTIVES, SESSIONS,
+               USER_EVENTS}};
     case UserSelectableType::kExtensions:
       return {
           kExtensionsTypeName, EXTENSIONS, {EXTENSIONS, EXTENSION_SETTINGS}};
diff --git a/components/sync/driver/sync_internals_util.cc b/components/sync/driver/sync_internals_util.cc
index c4d0962..b55d4671d 100644
--- a/components/sync/driver/sync_internals_util.cc
+++ b/components/sync/driver/sync_internals_util.cc
@@ -395,8 +395,6 @@
 
   Section* section_this_cycle = section_list.AddSection(
       "Transient Counters (this cycle)", /*is_sensitive=*/false);
-  Stat<int>* hierarchy_conflicts =
-      section_this_cycle->AddIntStat("Hierarchy Conflicts");
   Stat<int>* server_conflicts =
       section_this_cycle->AddIntStat("Server Conflicts");
   Stat<int>* committed_items =
@@ -557,7 +555,6 @@
 
   // Transient Counters (this cycle).
   if (is_status_valid) {
-    hierarchy_conflicts->Set(full_status.hierarchy_conflicts);
     server_conflicts->Set(full_status.server_conflicts);
     committed_items->Set(full_status.committed_count);
   }
diff --git a/components/sync/driver/sync_user_settings_impl.cc b/components/sync/driver/sync_user_settings_impl.cc
index 40af755f..94c6852 100644
--- a/components/sync/driver/sync_user_settings_impl.cc
+++ b/components/sync/driver/sync_user_settings_impl.cc
@@ -252,7 +252,7 @@
 #endif
   types.RetainAll(registered_model_types_);
 
-  static_assert(38 == GetNumModelTypes(),
+  static_assert(39 == GetNumModelTypes(),
                 "If adding a new sync data type, update the list below below if"
                 " you want to disable the new data type for local sync.");
   types.PutAll(ControlTypes());
diff --git a/components/sync/driver/test_sync_service.cc b/components/sync/driver/test_sync_service.cc
index b6b95ce..6ed5b51 100644
--- a/components/sync/driver/test_sync_service.cc
+++ b/components/sync/driver/test_sync_service.cc
@@ -22,7 +22,6 @@
   return SyncCycleSnapshot(
       /*birthday=*/"", /*bag_of_chips=*/"", ModelNeutralState(),
       ProgressMarkerMap(), /*is_silenced-*/ false,
-      /*num_hierarchy_conflicts=*/2,
       /*num_server_conflicts=*/7, /*notifications_enabled=*/false,
       /*sync_start_time=*/base::Time::Now(),
       /*poll_finish_time=*/base::Time::Now(),
diff --git a/components/sync/engine/cycle/data_type_tracker.cc b/components/sync/engine/cycle/data_type_tracker.cc
index de91438..a487129f 100644
--- a/components/sync/engine/cycle/data_type_tracker.cc
+++ b/components/sync/engine/cycle/data_type_tracker.cc
@@ -51,6 +51,7 @@
       // nudge delays.
       return kVeryBigLocalChangeNudgeDelay;
     case SESSIONS:
+    case HISTORY:
       // Sessions is the type that causes the most commit traffic. It gets a
       // custom nudge delay, tuned for a reasonable trade-off between traffic
       // and freshness.
@@ -129,6 +130,7 @@
     case EXTENSIONS:
     case SEARCH_ENGINES:
     case APPS:
+    case HISTORY:
     case DICTIONARY:
     case DEVICE_INFO:
     case PRIORITY_PREFERENCES:
diff --git a/components/sync/engine/cycle/model_neutral_state.cc b/components/sync/engine/cycle/model_neutral_state.cc
index 7135da3..fe84efbd 100644
--- a/components/sync/engine/cycle/model_neutral_state.cc
+++ b/components/sync/engine/cycle/model_neutral_state.cc
@@ -12,7 +12,6 @@
       num_updates_downloaded_total(0),
       num_tombstone_updates_downloaded_total(0),
       num_server_conflicts(0),
-      num_hierarchy_conflicts(0),
       items_committed(false) {}
 
 ModelNeutralState::ModelNeutralState(const ModelNeutralState& other) = default;
diff --git a/components/sync/engine/cycle/model_neutral_state.h b/components/sync/engine/cycle/model_neutral_state.h
index 0c386f7..d93629f 100644
--- a/components/sync/engine/cycle/model_neutral_state.h
+++ b/components/sync/engine/cycle/model_neutral_state.h
@@ -34,7 +34,6 @@
 
   // Update application and conflicts.
   int num_server_conflicts;
-  int num_hierarchy_conflicts;
 
   // Records the most recent results of GetKey, PostCommit and GetUpdates
   // commands.
diff --git a/components/sync/engine/cycle/status_controller.cc b/components/sync/engine/cycle/status_controller.cc
index 8788060..8e2c85a8 100644
--- a/components/sync/engine/cycle/status_controller.cc
+++ b/components/sync/engine/cycle/status_controller.cc
@@ -50,10 +50,6 @@
   model_neutral_.num_successful_commits++;
 }
 
-void StatusController::increment_num_hierarchy_conflicts_by(int value) {
-  model_neutral_.num_hierarchy_conflicts += value;
-}
-
 void StatusController::increment_num_server_conflicts() {
   model_neutral_.num_server_conflicts++;
 }
@@ -75,19 +71,12 @@
   return model_neutral_.last_get_key_result;
 }
 
-int StatusController::num_hierarchy_conflicts() const {
-  return model_neutral_.num_hierarchy_conflicts;
-}
-
 int StatusController::num_server_conflicts() const {
   return model_neutral_.num_server_conflicts;
 }
 
 int StatusController::TotalNumConflictingItems() const {
-  int sum = 0;
-  sum += num_hierarchy_conflicts();
-  sum += num_server_conflicts();
-  return sum;
+  return num_server_conflicts();
 }
 
 }  // namespace syncer
diff --git a/components/sync/engine/cycle/status_controller.h b/components/sync/engine/cycle/status_controller.h
index d834fdfaa..67c6e6db 100644
--- a/components/sync/engine/cycle/status_controller.h
+++ b/components/sync/engine/cycle/status_controller.h
@@ -37,7 +37,6 @@
   void clear_updated_types();
 
   // Various conflict counters.
-  int num_hierarchy_conflicts() const;
   int num_server_conflicts() const;
 
   // Aggregate sum of all conflicting items over all conflict types.
@@ -61,7 +60,6 @@
   void increment_num_tombstone_updates_downloaded_by(int value);
 
   // Update application and conflict resolution counters.
-  void increment_num_hierarchy_conflicts_by(int value);
   void increment_num_server_conflicts();
 
   // Commit counters.
diff --git a/components/sync/engine/cycle/status_controller_unittest.cc b/components/sync/engine/cycle/status_controller_unittest.cc
index 7b8352c..dcd0544 100644
--- a/components/sync/engine/cycle/status_controller_unittest.cc
+++ b/components/sync/engine/cycle/status_controller_unittest.cc
@@ -35,8 +35,7 @@
   EXPECT_EQ(0, status.TotalNumConflictingItems());
 
   status.increment_num_server_conflicts();
-  status.increment_num_hierarchy_conflicts_by(3);
-  EXPECT_EQ(4, status.TotalNumConflictingItems());
+  EXPECT_EQ(1, status.TotalNumConflictingItems());
 }
 
 }  // namespace syncer
diff --git a/components/sync/engine/cycle/sync_cycle.cc b/components/sync/engine/cycle/sync_cycle.cc
index 42632cc..8b9c18c 100644
--- a/components/sync/engine/cycle/sync_cycle.cc
+++ b/components/sync/engine/cycle/sync_cycle.cc
@@ -47,7 +47,6 @@
       context_->birthday(), context_->bag_of_chips(),
       status_controller_->model_neutral_state(), download_progress_markers,
       delegate_->IsAnyThrottleOrBackoff(),
-      status_controller_->num_hierarchy_conflicts(),
       status_controller_->num_server_conflicts(),
       context_->notifications_enabled(), status_controller_->sync_start_time(),
       status_controller_->poll_finish_time(), num_entries_by_type,
diff --git a/components/sync/engine/cycle/sync_cycle_context.h b/components/sync/engine/cycle/sync_cycle_context.h
index e9bcc21f..08f205e 100644
--- a/components/sync/engine/cycle/sync_cycle_context.h
+++ b/components/sync/engine/cycle/sync_cycle_context.h
@@ -93,10 +93,6 @@
     return &listeners_;
   }
 
-  void set_hierarchy_conflict_detected(bool value) {
-    client_status_.set_hierarchy_conflict_detected(value);
-  }
-
   void set_is_sync_feature_enabled(bool value) {
     client_status_.set_is_sync_feature_enabled(value);
   }
diff --git a/components/sync/engine/cycle/sync_cycle_snapshot.cc b/components/sync/engine/cycle/sync_cycle_snapshot.cc
index 310100b6..a7e376e 100644
--- a/components/sync/engine/cycle/sync_cycle_snapshot.cc
+++ b/components/sync/engine/cycle/sync_cycle_snapshot.cc
@@ -29,7 +29,6 @@
 
 SyncCycleSnapshot::SyncCycleSnapshot()
     : is_silenced_(false),
-      num_hierarchy_conflicts_(0),
       num_server_conflicts_(0),
       notifications_enabled_(false),
       num_entries_by_type_(GetNumModelTypes(), 0),
@@ -43,7 +42,6 @@
     const ModelNeutralState& model_neutral_state,
     const ProgressMarkerMap& download_progress_markers,
     bool is_silenced,
-    int num_hierarchy_conflicts,
     int num_server_conflicts,
     bool notifications_enabled,
     base::Time sync_start_time,
@@ -58,7 +56,6 @@
       model_neutral_state_(model_neutral_state),
       download_progress_markers_(download_progress_markers),
       is_silenced_(is_silenced),
-      num_hierarchy_conflicts_(num_hierarchy_conflicts),
       num_server_conflicts_(num_server_conflicts),
       notifications_enabled_(notifications_enabled),
       sync_start_time_(sync_start_time),
@@ -93,7 +90,6 @@
                     ProgressMarkerMapToValue(download_progress_markers_)));
   value->SetBoolKey("isSilenced", is_silenced_);
   // We don't care too much if we lose precision here, also.
-  value->SetIntKey("numHierarchyConflicts", num_hierarchy_conflicts_);
   value->SetIntKey("numServerConflicts", num_server_conflicts_);
   value->SetStringKey("getUpdatesOrigin",
                       ProtoEnumToString(get_updates_origin_));
@@ -133,10 +129,6 @@
   return is_silenced_;
 }
 
-int SyncCycleSnapshot::num_hierarchy_conflicts() const {
-  return num_hierarchy_conflicts_;
-}
-
 int SyncCycleSnapshot::num_server_conflicts() const {
   return num_server_conflicts_;
 }
diff --git a/components/sync/engine/cycle/sync_cycle_snapshot.h b/components/sync/engine/cycle/sync_cycle_snapshot.h
index 9588d1c95..0a049f0f 100644
--- a/components/sync/engine/cycle/sync_cycle_snapshot.h
+++ b/components/sync/engine/cycle/sync_cycle_snapshot.h
@@ -36,7 +36,6 @@
                     const ModelNeutralState& model_neutral_state,
                     const ProgressMarkerMap& download_progress_markers,
                     bool is_silenced,
-                    int num_hierarchy_conflicts,
                     int num_server_conflicts,
                     bool notifications_enabled,
                     base::Time sync_start_time,
@@ -58,7 +57,6 @@
   ModelNeutralState model_neutral_state() const { return model_neutral_state_; }
   const ProgressMarkerMap& download_progress_markers() const;
   bool is_silenced() const;
-  int num_hierarchy_conflicts() const;
   int num_server_conflicts() const;
   bool notifications_enabled() const;
   base::Time sync_start_time() const;
@@ -79,7 +77,6 @@
   ModelNeutralState model_neutral_state_;
   ProgressMarkerMap download_progress_markers_;
   bool is_silenced_;
-  int num_hierarchy_conflicts_;
   int num_server_conflicts_;
   bool notifications_enabled_;
   base::Time sync_start_time_;
diff --git a/components/sync/engine/cycle/sync_cycle_snapshot_unittest.cc b/components/sync/engine/cycle/sync_cycle_snapshot_unittest.cc
index 5c85431..d1134fd 100644
--- a/components/sync/engine/cycle/sync_cycle_snapshot_unittest.cc
+++ b/components/sync/engine/cycle/sync_cycle_snapshot_unittest.cc
@@ -42,19 +42,17 @@
   const std::string kBirthday = "test_birthday";
   const std::string kBagOfChips = "bagofchips\1";
   const bool kIsSilenced = true;
-  const int kNumHierarchyConflicts = 1055;
   const int kNumServerConflicts = 1057;
-  SyncCycleSnapshot snapshot(kBirthday, kBagOfChips, model_neutral,
-                             download_progress_markers, kIsSilenced,
-                             kNumHierarchyConflicts, kNumServerConflicts, false,
-                             base::Time::Now(), base::Time::Now(),
-                             std::vector<int>(GetNumModelTypes(), 0),
-                             std::vector<int>(GetNumModelTypes(), 0),
-                             sync_pb::SyncEnums::UNKNOWN_ORIGIN,
-                             /*poll_interval=*/base::Minutes(30),
-                             /*has_remaining_local_changes=*/false);
+  SyncCycleSnapshot snapshot(
+      kBirthday, kBagOfChips, model_neutral, download_progress_markers,
+      kIsSilenced, kNumServerConflicts, false, base::Time::Now(),
+      base::Time::Now(), std::vector<int>(GetNumModelTypes(), 0),
+      std::vector<int>(GetNumModelTypes(), 0),
+      sync_pb::SyncEnums::UNKNOWN_ORIGIN,
+      /*poll_interval=*/base::Minutes(30),
+      /*has_remaining_local_changes=*/false);
   std::unique_ptr<base::DictionaryValue> value(snapshot.ToValue());
-  EXPECT_EQ(16u, value->DictSize());
+  EXPECT_EQ(15u, value->DictSize());
   ExpectDictStringValue(kBirthday, *value, "birthday");
   // Base64-encoded version of |kBagOfChips|.
   ExpectDictStringValue("YmFnb2ZjaGlwcwE=", *value, "bagOfChips");
@@ -69,8 +67,6 @@
   ExpectDictValue(*expected_download_progress_markers_value, *value,
                   "downloadProgressMarkers");
   ExpectDictBooleanValue(kIsSilenced, *value, "isSilenced");
-  ExpectDictIntegerValue(kNumHierarchyConflicts, *value,
-                         "numHierarchyConflicts");
   ExpectDictIntegerValue(kNumServerConflicts, *value, "numServerConflicts");
   ExpectDictBooleanValue(false, *value, "notificationsEnabled");
   ExpectDictBooleanValue(false, *value, "hasRemainingLocalChanges");
diff --git a/components/sync/engine/debug_info_event_listener.cc b/components/sync/engine/debug_info_event_listener.cc
index f713897..cdd6acc 100644
--- a/components/sync/engine/debug_info_event_listener.cc
+++ b/components/sync/engine/debug_info_event_listener.cc
@@ -31,8 +31,6 @@
   sync_pb::SyncCycleCompletedEventInfo* sync_completed_event_info =
       event_info.mutable_sync_cycle_completed_event_info();
 
-  sync_completed_event_info->set_num_hierarchy_conflicts(
-      snapshot.num_hierarchy_conflicts());
   sync_completed_event_info->set_num_server_conflicts(
       snapshot.num_server_conflicts());
 
diff --git a/components/sync/engine/sync_status.h b/components/sync/engine/sync_status.h
index 7a90464..84083c91 100644
--- a/components/sync/engine/sync_status.h
+++ b/components/sync/engine/sync_status.h
@@ -37,9 +37,6 @@
 
   SyncProtocolError sync_protocol_error;
 
-  // Number of hierarchy conflicts counted during most recent sync cycle.
-  int hierarchy_conflicts = 0;
-
   // Number of items the server refused to commit due to conflict during most
   // recent sync cycle.
   int server_conflicts = 0;
diff --git a/components/sync/engine/sync_status_tracker.cc b/components/sync/engine/sync_status_tracker.cc
index 09130da..9c83a4e 100644
--- a/components/sync/engine/sync_status_tracker.cc
+++ b/components/sync/engine/sync_status_tracker.cc
@@ -29,7 +29,6 @@
   // whose values accumulate (e.g. lifetime counters like updates_received)
   // are not to be cleared here.
   SyncStatus status = status_;
-  status.hierarchy_conflicts = 0;
   status.server_conflicts = 0;
   status.committed_count = 0;
   return status;
@@ -38,7 +37,6 @@
 SyncStatus SyncStatusTracker::CalcSyncing(const SyncCycleEvent& event) const {
   SyncStatus status = CreateBlankStatus();
   const SyncCycleSnapshot& snapshot = event.snapshot;
-  status.hierarchy_conflicts = snapshot.num_hierarchy_conflicts();
   status.server_conflicts = snapshot.num_server_conflicts();
   status.committed_count =
       snapshot.model_neutral_state().num_successful_commits;
diff --git a/components/sync/engine/syncer.cc b/components/sync/engine/syncer.cc
index b0f78cc..ca4e4d70 100644
--- a/components/sync/engine/syncer.cc
+++ b/components/sync/engine/syncer.cc
@@ -143,8 +143,6 @@
     get_updates_processor.ApplyUpdates(download_types,
                                        cycle->mutable_status_controller());
 
-    cycle->context()->set_hierarchy_conflict_detected(
-        cycle->status_controller().num_hierarchy_conflicts() > 0);
     cycle->SendEventNotification(SyncCycleEvent::STATUS_CHANGED);
   }
 
diff --git a/components/sync/engine/syncer_unittest.cc b/components/sync/engine/syncer_unittest.cc
index 3c93ced..f1bdd70 100644
--- a/components/sync/engine/syncer_unittest.cc
+++ b/components/sync/engine/syncer_unittest.cc
@@ -206,14 +206,6 @@
     scheduler_.reset();
   }
 
-  void VerifyNoHierarchyConflictsReported(
-      const sync_pb::ClientToServerMessage& message) {
-    // Our request should have reported no hierarchy conflicts detected.
-    const sync_pb::ClientStatus& client_status = message.client_status();
-    EXPECT_TRUE(client_status.has_hierarchy_conflict_detected());
-    EXPECT_FALSE(client_status.hierarchy_conflict_detected());
-  }
-
   const std::string local_cache_guid() { return "lD16ebCGCZh+zkiZ68gWDw=="; }
 
   const std::string foreign_cache_guid() { return "kqyg7097kro6GSUod+GSg=="; }
diff --git a/components/sync/nigori/nigori_state.cc b/components/sync/nigori/nigori_state.cc
index 4b2031b..c2ebd2c1 100644
--- a/components/sync/nigori/nigori_state.cc
+++ b/components/sync/nigori/nigori_state.cc
@@ -64,7 +64,7 @@
 void UpdateNigoriSpecificsFromEncryptedTypes(
     ModelTypeSet encrypted_types,
     sync_pb::NigoriSpecifics* specifics) {
-  static_assert(38 == GetNumModelTypes(),
+  static_assert(39 == GetNumModelTypes(),
                 "If adding an encryptable type, update handling below.");
   specifics->set_encrypt_bookmarks(encrypted_types.Has(BOOKMARKS));
   specifics->set_encrypt_preferences(encrypted_types.Has(PREFERENCES));
diff --git a/components/sync/protocol/client_debug_info.proto b/components/sync/protocol/client_debug_info.proto
index 229928e..5db1d35 100644
--- a/components/sync/protocol/client_debug_info.proto
+++ b/components/sync/protocol/client_debug_info.proto
@@ -41,7 +41,7 @@
   // These new conflict counters replace the ones above.
   // TODO(crbug.com/1315573): Deprecated in M103.
   optional int32 num_encryption_conflicts = 4 [deprecated = true];
-  optional int32 num_hierarchy_conflicts = 5;
+  optional int32 num_hierarchy_conflicts = 5 [deprecated = true];
   optional int32 num_simple_conflicts = 6;  // No longer sent since M24.
   optional int32 num_server_conflicts = 7;
 
diff --git a/components/sync/protocol/proto_value_conversions_unittest.cc b/components/sync/protocol/proto_value_conversions_unittest.cc
index b21be49..46bead76f 100644
--- a/components/sync/protocol/proto_value_conversions_unittest.cc
+++ b/components/sync/protocol/proto_value_conversions_unittest.cc
@@ -57,7 +57,7 @@
 
 DEFINE_SPECIFICS_TO_VALUE_TEST(encrypted)
 
-static_assert(38 == syncer::GetNumModelTypes(),
+static_assert(39 == syncer::GetNumModelTypes(),
               "When adding a new field, add a DEFINE_SPECIFICS_TO_VALUE_TEST "
               "for your field below, and optionally a test for the specific "
               "conversions.");
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index 200f68f..4445673 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -463,7 +463,7 @@
 }
 
 VISIT_PROTO_FIELDS(const sync_pb::EntitySpecifics& proto) {
-  static_assert(38 == GetNumModelTypes(),
+  static_assert(39 == GetNumModelTypes(),
                 "When adding a new protocol type, you will likely need to add "
                 "it here as well.");
   VISIT(encrypted);
diff --git a/components/sync/protocol/sync.proto b/components/sync/protocol/sync.proto
index 5ba9e14..53efa0b 100644
--- a/components/sync/protocol/sync.proto
+++ b/components/sync/protocol/sync.proto
@@ -208,7 +208,8 @@
   // is set.  The client may not assume that any particular action will be
   // taken.  There is no guarantee the problem will be addressed in a reasonable
   // amount of time.
-  optional bool hierarchy_conflict_detected = 1;
+  // TODO(crbug.com/1315573): Deprecated in M103.
+  optional bool hierarchy_conflict_detected = 1 [deprecated = true];
 
   // Whether the client has full sync (or, sync the feature) enabled or not.
   optional bool is_sync_feature_enabled = 2;
diff --git a/components/tracing/BUILD.gn b/components/tracing/BUILD.gn
index 78e6c085..db698308 100644
--- a/components/tracing/BUILD.gn
+++ b/components/tracing/BUILD.gn
@@ -52,8 +52,12 @@
 
 component("background_tracing_utils") {
   sources = [
+    "common/background_tracing_state_manager.cc",
+    "common/background_tracing_state_manager.h",
     "common/background_tracing_utils.cc",
     "common/background_tracing_utils.h",
+    "common/pref_names.cc",
+    "common/pref_names.h",
   ]
 
   defines = [ "IS_BACKGROUND_TRACING_UTILS_IMPL" ]
@@ -61,6 +65,7 @@
   deps = [
     ":startup_tracing",
     "//base",
+    "//components/prefs",
     "//content/public/browser",
   ]
 }
@@ -84,11 +89,17 @@
     deps += [ ":startup_tracing" ]
   }
 
-  sources += [ "common/background_tracing_utils_unittest.cc" ]
+  sources += [
+    "common/background_tracing_state_manager_unittest.cc",
+    "common/background_tracing_utils_unittest.cc",
+  ]
   deps += [
     ":background_tracing_utils",
     ":startup_tracing",
+    "//components/metrics:metrics",
+    "//components/prefs:test_support",
     "//content/public/browser",
+    "//content/test:test_support",
   ]
 }
 
diff --git a/components/tracing/DEPS b/components/tracing/DEPS
index e45a7d7..43605247f 100644
--- a/components/tracing/DEPS
+++ b/components/tracing/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+ipc",
   "+components/metrics",
+  "+components/prefs",
   "+third_party/metrics_proto",
   "+content/public/browser/background_tracing_manager.h",
   "+content/public/browser/background_tracing_config.h",
@@ -11,4 +12,7 @@
   '.*browsertest\.cc': [
     "+content/public/test",
   ],
+  '.*unittest.cc': [
+    "+content/public/test",
+  ],
 }
diff --git a/components/tracing/common/background_tracing_state_manager.cc b/components/tracing/common/background_tracing_state_manager.cc
new file mode 100644
index 0000000..e8490484
--- /dev/null
+++ b/components/tracing/common/background_tracing_state_manager.cc
@@ -0,0 +1,219 @@
+// Copyright 2022 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 "components/tracing/common/background_tracing_state_manager.h"
+
+#include "base/json/values_util.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "components/tracing/common/pref_names.h"
+#include "content/public/browser/background_tracing_config.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace {
+
+constexpr char kTracingStateKey[] = "state";
+constexpr char kUploadTimesKey[] = "upload_times";
+constexpr char kScenarioKey[] = "scenario";
+constexpr char kUploadTimestampKey[] = "time";
+
+const int kMinDaysUntilNextUpload = 7;
+
+// Removes any version numbers from the scenario name.
+std::string StripScenarioName(const std::string& scenario_name) {
+  std::string stripped_scenario_name;
+  base::RemoveChars(scenario_name, "1234567890", &stripped_scenario_name);
+  return stripped_scenario_name;
+}
+
+}  // namespace
+
+namespace tracing {
+
+BackgroundTracingStateManager::BackgroundTracingStateManager() = default;
+BackgroundTracingStateManager::~BackgroundTracingStateManager() = default;
+
+BackgroundTracingStateManager& BackgroundTracingStateManager::GetInstance() {
+  static base::NoDestructor<BackgroundTracingStateManager> instance;
+  return *instance;
+}
+
+void BackgroundTracingStateManager::SetPrefServiceForTesting(
+    PrefService* local_state) {
+  if (!local_state_ && local_state)
+    local_state_ = local_state;
+}
+
+void BackgroundTracingStateManager::Initialize(PrefService* local_state) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  if (initialized_)
+    return;
+
+  initialized_ = true;
+
+  if (!local_state_ && local_state)
+    local_state_ = local_state;
+
+  DCHECK(local_state_);
+  const base::Value* dict =
+      local_state_->GetDictionary(kBackgroundTracingSessionState);
+
+  if (!dict) {
+    SaveState();
+    return;
+  }
+
+  absl::optional<int> state = dict->FindIntKey(kTracingStateKey);
+
+  if (state) {
+    if (*state >= 0 &&
+        *state <= static_cast<int>(BackgroundTracingState::LAST)) {
+      last_session_end_state_ = static_cast<BackgroundTracingState>(*state);
+    } else {
+      last_session_end_state_ = BackgroundTracingState::NOT_ACTIVATED;
+    }
+  }
+
+  const base::Value* upload_times = dict->FindListKey(kUploadTimesKey);
+  if (upload_times) {
+    for (const auto& scenario_dict : upload_times->GetListDeprecated()) {
+      DCHECK(scenario_dict.is_dict());
+      const std::string* scenario = scenario_dict.FindStringKey(kScenarioKey);
+      const base::Value* timestamp_val =
+          scenario_dict.FindKey(kUploadTimestampKey);
+      if (!scenario || !timestamp_val) {
+        continue;
+      }
+
+      absl::optional<base::Time> upload_time = base::ValueToTime(timestamp_val);
+      if (!upload_time) {
+        continue;
+      }
+
+      if ((base::Time::Now() - *upload_time) >
+          base::Days(kMinDaysUntilNextUpload)) {
+        continue;
+      }
+      scenario_last_upload_timestamp_[*scenario] = *upload_time;
+    }
+  }
+
+  // Save state to update the current session state, replacing the previous
+  // session state.
+  SaveState();
+}
+
+void BackgroundTracingStateManager::SaveState() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(initialized_);
+  SaveState(scenario_last_upload_timestamp_, state_);
+}
+
+void BackgroundTracingStateManager::SaveState(
+    const ScenarioUploadTimestampMap& scenario_upload_times,
+    BackgroundTracingState state) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetIntKey(kTracingStateKey, static_cast<int>(state));
+  base::Value upload_times(base::Value::Type::LIST);
+  for (const auto& it : scenario_upload_times) {
+    base::Value scenario(base::Value::Type::DICTIONARY);
+    scenario.SetStringKey(kScenarioKey, StripScenarioName(it.first));
+    scenario.SetKey(kUploadTimestampKey, base::TimeToValue(it.second));
+    upload_times.Append(std::move(scenario));
+  }
+
+  dict.SetKey(kUploadTimesKey, std::move(upload_times));
+
+  local_state_->Set(kBackgroundTracingSessionState, std::move(dict));
+  local_state_->CommitPendingWrite();
+}
+
+bool BackgroundTracingStateManager::DidLastSessionEndUnexpectedly() const {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(initialized_);
+  switch (last_session_end_state_) {
+    case BackgroundTracingState::NOT_ACTIVATED:
+    case BackgroundTracingState::RAN_30_SECONDS:
+    case BackgroundTracingState::FINALIZATION_STARTED:
+      return false;
+    case BackgroundTracingState::STARTED:
+      // If the browser did not run for 30 seconds after tracing started in
+      // previous session then do not start tracing in current session as a
+      // safeguard. This would be impacted by short sessions (eg: on Android),
+      // but worth the tradeoff of crashing loop on startup. Checking for
+      // previous session crash status is platform dependent and the crash
+      // status is initialized at later point than when tracing begins. So, this
+      // check is safer than waiting for crash metrics to be available. Note
+      // that this setting only checks for last session and not sessions before
+      // that. So, the next session might still crash due to tracing if the user
+      // has another tracing experiment. But, meanwhile we would be able to turn
+      // off tracing experiments based on uploaded crash metrics.
+      return true;
+  }
+}
+
+bool BackgroundTracingStateManager::DidRecentlyUploadForScenario(
+    const content::BackgroundTracingConfig& config) const {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(initialized_);
+  std::string stripped_scenario_name =
+      StripScenarioName(config.scenario_name());
+  auto it = scenario_last_upload_timestamp_.find(stripped_scenario_name);
+  if (it != scenario_last_upload_timestamp_.end()) {
+    return (base::Time::Now() - it->second) <=
+           base::Days(kMinDaysUntilNextUpload);
+  }
+  return false;
+}
+
+void BackgroundTracingStateManager::NotifyTracingStarted() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  SetState(BackgroundTracingState::STARTED);
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, base::BindOnce([]() {
+        BackgroundTracingStateManager::GetInstance().SetState(
+            BackgroundTracingState::RAN_30_SECONDS);
+      }),
+      base::Seconds(30));
+}
+
+void BackgroundTracingStateManager::NotifyFinalizationStarted() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  SetState(BackgroundTracingState::FINALIZATION_STARTED);
+}
+
+void BackgroundTracingStateManager::SetState(BackgroundTracingState new_state) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(initialized_);
+  if (state_ == new_state) {
+    return;
+  }
+  // If finalization started before 30 seconds, skip recording the new state.
+  if (new_state == BackgroundTracingState::RAN_30_SECONDS &&
+      state_ == BackgroundTracingState::FINALIZATION_STARTED) {
+    return;
+  }
+  state_ = new_state;
+  SaveState();
+}
+
+void BackgroundTracingStateManager::OnScenarioUploaded(
+    const std::string& scenario_name) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(initialized_);
+
+  scenario_last_upload_timestamp_[StripScenarioName(scenario_name)] =
+      base::Time::Now();
+  SaveState();
+}
+
+void BackgroundTracingStateManager::Reset() {
+  initialized_ = false;
+  local_state_ = nullptr;
+  state_ = BackgroundTracingState::NOT_ACTIVATED;
+  last_session_end_state_ = BackgroundTracingState::NOT_ACTIVATED;
+  scenario_last_upload_timestamp_.clear();
+}
+
+}  // namespace tracing
diff --git a/components/tracing/common/background_tracing_state_manager.h b/components/tracing/common/background_tracing_state_manager.h
new file mode 100644
index 0000000..148b1f0b
--- /dev/null
+++ b/components/tracing/common/background_tracing_state_manager.h
@@ -0,0 +1,111 @@
+// Copyright 2022 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_TRACING_COMMON_BACKGROUND_TRACING_STATE_MANAGER_H_
+#define COMPONENTS_TRACING_COMMON_BACKGROUND_TRACING_STATE_MANAGER_H_
+
+#include "base/component_export.h"
+#include "base/containers/flat_map.h"
+#include "base/memory/raw_ptr.h"
+#include "base/no_destructor.h"
+#include "base/time/time.h"
+#include "components/prefs/pref_service.h"
+
+namespace content {
+class BackgroundTracingConfig;
+}
+
+namespace tracing {
+
+class BackgroundTracingStateManagerTest;
+
+// Do not remove or change the order of enum fields since it is stored in
+// preferences.
+enum class BackgroundTracingState : int {
+  // Default state when tracing is not started in previous session, or when
+  // state is not found or invalid.
+  NOT_ACTIVATED = 0,
+  STARTED = 1,
+  RAN_30_SECONDS = 2,
+  FINALIZATION_STARTED = 3,
+  LAST = FINALIZATION_STARTED,
+};
+
+// Manages local state prefs for background tracing, and tracks state from
+// previous background tracing session(s). All the calls are expected to run on
+// UI thread.
+class COMPONENT_EXPORT(BACKGROUND_TRACING_UTILS) BackgroundTracingStateManager {
+ public:
+  using ScenarioUploadTimestampMap = base::flat_map<std::string, base::Time>;
+
+  static BackgroundTracingStateManager& GetInstance();
+
+  // Initializes state from previous session and writes current state to
+  // prefs, when called the first time. NOOP on any calls after that. It also
+  // deletes any expired entries from prefs.
+  void Initialize(PrefService* local_state);
+
+  // Used in tests when other methods of this class need to be called before
+  // Initialize().
+  void SetPrefServiceForTesting(PrefService* local_state);
+
+  // True if last session potentially crashed and it is unsafe to turn on
+  // background tracing in current session.
+  bool DidLastSessionEndUnexpectedly() const;
+
+  // True if the embedder uploaded a trace for the given |config| recently, and
+  // uploads should be throttled for the |config|.
+  bool DidRecentlyUploadForScenario(
+      const content::BackgroundTracingConfig& config) const;
+
+  // The embedder should call this method every time background tracing starts
+  // so that the state in prefs is updated. Posts a timer task to the current
+  // sequence to update the state once more to denote no crashes after a
+  // reasonable time (see DidLastSessionEndUnexpectedly()).
+  void NotifyTracingStarted();
+
+  // The embedder should call this method every time background tracing finishes
+  // so that the state in prefs is updated.
+  void NotifyFinalizationStarted();
+
+  // Updates the state to include the upload time for |scenario_name|, and
+  // saves it to prefs.
+  void OnScenarioUploaded(const std::string& scenario_name);
+
+  // Saves the given state to prefs, public for testing.
+  void SaveState(const ScenarioUploadTimestampMap& upload_times,
+                 BackgroundTracingState state);
+
+ private:
+  friend base::NoDestructor<BackgroundTracingStateManager>;
+  friend class tracing::BackgroundTracingStateManagerTest;
+
+  BackgroundTracingStateManager();
+  ~BackgroundTracingStateManager();
+
+  void SaveState();
+
+  // Updates the current tracing state and saves it to prefs.
+  void SetState(BackgroundTracingState new_state);
+
+  // Used in tests to reset the state since a singleton instance is never
+  // destroyed.
+  void Reset();
+
+  BackgroundTracingState state_ = BackgroundTracingState::NOT_ACTIVATED;
+
+  bool initialized_ = false;
+
+  raw_ptr<PrefService> local_state_ = nullptr;
+
+  // Following are valid only when |initialized_| = true.
+  BackgroundTracingState last_session_end_state_ =
+      BackgroundTracingState::NOT_ACTIVATED;
+
+  ScenarioUploadTimestampMap scenario_last_upload_timestamp_;
+};
+
+}  // namespace tracing
+
+#endif  // COMPONENTS_TRACING_COMMON_BACKGROUND_TRACING_STATE_MANAGER_H_
diff --git a/components/tracing/common/background_tracing_state_manager_unittest.cc b/components/tracing/common/background_tracing_state_manager_unittest.cc
new file mode 100644
index 0000000..260c3e2
--- /dev/null
+++ b/components/tracing/common/background_tracing_state_manager_unittest.cc
@@ -0,0 +1,205 @@
+// Copyright 2022 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 "components/tracing/common/background_tracing_state_manager.h"
+
+#include "base/json/json_writer.h"
+#include "base/json/values_util.h"
+#include "base/strings/pattern.h"
+#include "components/metrics/metrics_pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/tracing/common/pref_names.h"
+#include "content/public/browser/background_tracing_config.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace tracing {
+
+class BackgroundTracingStateManagerTest : public testing::Test {
+ public:
+  void SetUp() override {
+    pref_service_ = std::make_unique<TestingPrefServiceSimple>();
+    pref_service_->registry()->RegisterBooleanPref(
+        metrics::prefs::kMetricsReportingEnabled, false);
+    pref_service_->SetBoolean(metrics::prefs::kMetricsReportingEnabled, true);
+    tracing::RegisterPrefs(pref_service_->registry());
+    tracing::BackgroundTracingStateManager::GetInstance()
+        .SetPrefServiceForTesting(pref_service_.get());
+  }
+
+  void TearDown() override {
+    tracing::BackgroundTracingStateManager::GetInstance().Reset();
+  }
+
+  std::string GetSessionStateJson() {
+    const base::Value* state =
+        pref_service_->GetDictionary(tracing::kBackgroundTracingSessionState);
+
+    std::string json;
+    EXPECT_TRUE(base::JSONWriter::Write(*state, &json));
+    return json;
+  }
+
+  std::unique_ptr<TestingPrefServiceSimple> pref_service_;
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+};
+
+TEST_F(BackgroundTracingStateManagerTest, InitializeEmptyPrefs) {
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  EXPECT_EQ(GetSessionStateJson(), R"({"state":0,"upload_times":[]})");
+}
+
+TEST_F(BackgroundTracingStateManagerTest, InitializeInvalidState) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetIntKey("state",
+                 static_cast<int>(tracing::BackgroundTracingState::LAST) + 1);
+  pref_service_->Set(tracing::kBackgroundTracingSessionState, std::move(dict));
+
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  EXPECT_EQ(GetSessionStateJson(), R"({"state":0,"upload_times":[]})");
+}
+
+TEST_F(BackgroundTracingStateManagerTest, InitializeNoScenario) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetIntKey("state", static_cast<int>(
+                              tracing::BackgroundTracingState::NOT_ACTIVATED));
+  base::Value upload_times(base::Value::Type::LIST);
+  base::Value scenario(base::Value::Type::DICTIONARY);
+  scenario.SetKey("time", base::TimeToValue(base::Time::Now()));
+  upload_times.Append(std::move(scenario));
+  dict.SetKey("upload_times", std::move(upload_times));
+  pref_service_->Set(tracing::kBackgroundTracingSessionState, std::move(dict));
+
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  EXPECT_EQ(GetSessionStateJson(), R"({"state":0,"upload_times":[]})");
+}
+
+TEST_F(BackgroundTracingStateManagerTest, InitializeValidPrefs) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetIntKey("state", static_cast<int>(
+                              tracing::BackgroundTracingState::NOT_ACTIVATED));
+  base::Value upload_times(base::Value::Type::LIST);
+  base::Value scenario(base::Value::Type::DICTIONARY);
+  scenario.SetStringKey("scenario", "TestScenario");
+  scenario.SetKey("time", base::TimeToValue(base::Time::Now()));
+  upload_times.Append(std::move(scenario));
+  dict.SetKey("upload_times", std::move(upload_times));
+  pref_service_->Set(tracing::kBackgroundTracingSessionState, std::move(dict));
+
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  EXPECT_TRUE(base::MatchPattern(
+      GetSessionStateJson(),
+      R"({"state":0,"upload_times":[{"scenario":"TestScenario","time":"*"}]})"))
+      << "Actual: " << GetSessionStateJson();
+  ;
+}
+
+TEST_F(BackgroundTracingStateManagerTest, SaveStateValidPrefs) {
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      {{"TestScenario", base::Time::Now()}},
+      tracing::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+
+  EXPECT_TRUE(base::MatchPattern(
+      GetSessionStateJson(),
+      R"({"state":0,"upload_times":[{"scenario":"TestScenario","time":"*"}]})"))
+      << "Actual: " << GetSessionStateJson();
+  EXPECT_FALSE(tracing::BackgroundTracingStateManager::GetInstance()
+                   .DidLastSessionEndUnexpectedly());
+}
+
+TEST_F(BackgroundTracingStateManagerTest, SessionEndedUnexpectedly) {
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      {}, tracing::BackgroundTracingState::STARTED);
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  EXPECT_TRUE(tracing::BackgroundTracingStateManager::GetInstance()
+                  .DidLastSessionEndUnexpectedly());
+}
+
+TEST_F(BackgroundTracingStateManagerTest, NotUploadedRecently) {
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      {{"TestScenario", base::Time::Now() - base::Days(8)}},
+      tracing::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetStringKey("scenario_name", "TestScenario");
+  dict.SetStringKey("mode", "PREEMPTIVE_TRACING_MODE");
+  dict.SetStringKey("custom_categories", "toplevel");
+  base::Value rules_list(base::Value::Type::LIST);
+
+  {
+    base::Value rules_dict(base::Value::Type::DICTIONARY);
+    rules_dict.SetStringKey("rule", "MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED");
+    rules_dict.SetStringKey("trigger_name", "test");
+    rules_list.Append(std::move(rules_dict));
+  }
+
+  dict.SetKey("configs", std::move(rules_list));
+  std::unique_ptr<content::BackgroundTracingConfig> config(
+      content::BackgroundTracingConfig::FromDict(std::move(dict)));
+
+  EXPECT_FALSE(tracing::BackgroundTracingStateManager::GetInstance()
+                   .DidRecentlyUploadForScenario(*config));
+}
+
+TEST_F(BackgroundTracingStateManagerTest, UploadedRecently) {
+  tracing::BackgroundTracingStateManager::GetInstance().SaveState(
+      {{"TestScenario", base::Time::Now() - base::Days(1)}},
+      tracing::BackgroundTracingState::NOT_ACTIVATED);
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetStringKey("scenario_name", "TestScenario");
+  dict.SetStringKey("mode", "PREEMPTIVE_TRACING_MODE");
+  dict.SetStringKey("custom_categories", "toplevel");
+  base::Value rules_list(base::Value::Type::LIST);
+
+  {
+    base::Value rules_dict(base::Value::Type::DICTIONARY);
+    rules_dict.SetStringKey("rule", "MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED");
+    rules_dict.SetStringKey("trigger_name", "test");
+    rules_list.Append(std::move(rules_dict));
+  }
+
+  dict.SetKey("configs", std::move(rules_list));
+  std::unique_ptr<content::BackgroundTracingConfig> config(
+      content::BackgroundTracingConfig::FromDict(std::move(dict)));
+
+  EXPECT_TRUE(tracing::BackgroundTracingStateManager::GetInstance()
+                  .DidRecentlyUploadForScenario(*config));
+}
+
+TEST_F(BackgroundTracingStateManagerTest, NotifyTracingStarted) {
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  tracing::BackgroundTracingStateManager::GetInstance().NotifyTracingStarted();
+  EXPECT_TRUE(base::MatchPattern(GetSessionStateJson(),
+                                 R"({"state":1,"upload_times":[]})"))
+      << "Actual: " << GetSessionStateJson();
+}
+
+TEST_F(BackgroundTracingStateManagerTest, NotifyFinalizationStarted) {
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  tracing::BackgroundTracingStateManager::GetInstance()
+      .NotifyFinalizationStarted();
+  EXPECT_TRUE(base::MatchPattern(GetSessionStateJson(),
+                                 R"({"state":3,"upload_times":[]})"))
+      << "Actual: " << GetSessionStateJson();
+}
+
+TEST_F(BackgroundTracingStateManagerTest, OnScenarioUploaded) {
+  tracing::BackgroundTracingStateManager::GetInstance().Initialize(nullptr);
+  tracing::BackgroundTracingStateManager::GetInstance()
+      .NotifyFinalizationStarted();
+  tracing::BackgroundTracingStateManager::GetInstance().OnScenarioUploaded(
+      "TestScenario");
+  EXPECT_TRUE(base::MatchPattern(
+      GetSessionStateJson(),
+      R"({"state":3,"upload_times":[{"scenario":"TestScenario","time":"*"}]})"))
+      << "Actual: " << GetSessionStateJson();
+}
+}  // namespace tracing
diff --git a/components/tracing/common/pref_names.cc b/components/tracing/common/pref_names.cc
new file mode 100644
index 0000000..6d8ba35
--- /dev/null
+++ b/components/tracing/common/pref_names.cc
@@ -0,0 +1,17 @@
+// Copyright 2022 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 "components/tracing/common/pref_names.h"
+
+#include "components/prefs/pref_registry_simple.h"
+
+namespace tracing {
+const char kBackgroundTracingSessionState[] =
+    "background_tracing.session_state";
+
+void RegisterPrefs(PrefRegistrySimple* registry) {
+  registry->RegisterDictionaryPref(kBackgroundTracingSessionState);
+}
+
+}  // namespace tracing
diff --git a/components/tracing/common/pref_names.h b/components/tracing/common/pref_names.h
new file mode 100644
index 0000000..eb50e26
--- /dev/null
+++ b/components/tracing/common/pref_names.h
@@ -0,0 +1,22 @@
+// Copyright 2022 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_TRACING_COMMON_PREF_NAMES_H_
+#define COMPONENTS_TRACING_COMMON_PREF_NAMES_H_
+
+#include "base/component_export.h"
+
+class PrefRegistrySimple;
+
+namespace tracing {
+
+COMPONENT_EXPORT(BACKGROUND_TRACING_UTILS)
+extern const char kBackgroundTracingSessionState[];
+
+COMPONENT_EXPORT(BACKGROUND_TRACING_UTILS)
+void RegisterPrefs(PrefRegistrySimple* registry);
+
+}  // namespace tracing
+
+#endif  // COMPONENTS_TRACING_COMMON_PREF_NAMES_H_
diff --git a/components/ukm/observers/ukm_consent_state_observer_unittest.cc b/components/ukm/observers/ukm_consent_state_observer_unittest.cc
index 4d310ff7..702454f 100644
--- a/components/ukm/observers/ukm_consent_state_observer_unittest.cc
+++ b/components/ukm/observers/ukm_consent_state_observer_unittest.cc
@@ -42,7 +42,7 @@
     // SyncCycleSnapshot is initialized at all.
     SetLastCycleSnapshot(syncer::SyncCycleSnapshot(
         /*birthday=*/std::string(), /*bag_of_chips=*/std::string(),
-        syncer::ModelNeutralState(), syncer::ProgressMarkerMap(), false, 0, 0,
+        syncer::ModelNeutralState(), syncer::ProgressMarkerMap(), false, 0,
         true, base::Time::Now(), base::Time::Now(),
         std::vector<int>(syncer::GetNumModelTypes(), 0),
         std::vector<int>(syncer::GetNumModelTypes(), 0),
diff --git a/components/viz/service/display/display_perftest.cc b/components/viz/service/display/display_perftest.cc
index 5327ee59..0ee8fd42 100644
--- a/components/viz/service/display/display_perftest.cc
+++ b/components/viz/service/display/display_perftest.cc
@@ -22,7 +22,7 @@
 #include "components/viz/service/display/overlay_processor_stub.h"
 #include "components/viz/service/display/shared_bitmap_manager.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
-#include "components/viz/test/fake_output_surface.h"
+#include "components/viz/test/fake_skia_output_surface.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/perf/perf_result_reporter.h"
 
@@ -68,8 +68,8 @@
     auto scheduler = std::make_unique<DisplayScheduler>(
         &begin_frame_source_, task_runner_.get(), PendingSwapParams(1));
 
-    std::unique_ptr<FakeOutputSurface> output_surface =
-        FakeOutputSurface::Create3d();
+    std::unique_ptr<FakeSkiaOutputSurface> output_surface =
+        FakeSkiaOutputSurface::Create3d();
 
     auto overlay_processor = std::make_unique<OverlayProcessorStub>();
     // Normally display will need to take ownership of a
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc
index 3cb804a6..c6ce8e1e 100644
--- a/components/viz/service/display/display_unittest.cc
+++ b/components/viz/service/display/display_unittest.cc
@@ -169,10 +169,11 @@
   ~DisplayTest() override {}
 
   void SetUpSoftwareDisplay(const RendererSettings& settings) {
-    std::unique_ptr<FakeOutputSurface> output_surface;
+    std::unique_ptr<FakeSoftwareOutputSurface> output_surface;
     auto device = std::make_unique<TestSoftwareOutputDevice>();
     software_output_device_ = device.get();
-    output_surface = FakeOutputSurface::CreateSoftware(std::move(device));
+    output_surface =
+        std::make_unique<FakeSoftwareOutputSurface>(std::move(device));
     output_surface_ = output_surface.get();
 
     CreateDisplaySchedulerAndDisplay(settings, kArbitraryFrameSinkId,
@@ -272,7 +273,7 @@
   std::unique_ptr<BeginFrameSource> begin_frame_source_;
   std::unique_ptr<Display> display_;
   raw_ptr<TestSoftwareOutputDevice> software_output_device_ = nullptr;
-  raw_ptr<FakeOutputSurface> output_surface_ = nullptr;
+  raw_ptr<FakeSoftwareOutputSurface> output_surface_ = nullptr;
   raw_ptr<FakeSkiaOutputSurface> skia_output_surface_ = nullptr;
   raw_ptr<TestDisplayScheduler> scheduler_ = nullptr;
 };
@@ -862,7 +863,7 @@
   TestDisplayScheduler* scheduler2 = scheduler_for_display2.get();
   auto display2 = CreateDisplay(
       settings, kAnotherFrameSinkId, std::move(scheduler_for_display2),
-      FakeOutputSurface::CreateSoftware(
+      std::make_unique<FakeSoftwareOutputSurface>(
           std::make_unique<TestSoftwareOutputDevice>()));
   manager_.RegisterBeginFrameSource(begin_frame_source2.get(),
                                     kAnotherFrameSinkId);
diff --git a/components/viz/service/display/software_renderer_unittest.cc b/components/viz/service/display/software_renderer_unittest.cc
index f706e41..1c44d56 100644
--- a/components/viz/service/display/software_renderer_unittest.cc
+++ b/components/viz/service/display/software_renderer_unittest.cc
@@ -46,8 +46,8 @@
  public:
   void InitializeRenderer(
       std::unique_ptr<SoftwareOutputDevice> software_output_device) {
-    output_surface_ =
-        FakeOutputSurface::CreateSoftware(std::move(software_output_device));
+    output_surface_ = std::make_unique<FakeSoftwareOutputSurface>(
+        std::move(software_output_device));
     output_surface_->BindToClient(&output_surface_client_);
 
     shared_bitmap_manager_ = std::make_unique<TestSharedBitmapManager>();
@@ -134,7 +134,7 @@
   RendererSettings settings_;
   DebugRendererSettings debug_settings_;
   cc::FakeOutputSurfaceClient output_surface_client_;
-  std::unique_ptr<FakeOutputSurface> output_surface_;
+  std::unique_ptr<FakeSoftwareOutputSurface> output_surface_;
   std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_;
   std::unique_ptr<DisplayResourceProviderSoftware> resource_provider_;
   std::unique_ptr<ClientResourceProvider> child_resource_provider_;
diff --git a/components/viz/test/fake_output_surface.cc b/components/viz/test/fake_output_surface.cc
index 3cc2735b..7430827 100644
--- a/components/viz/test/fake_output_surface.cc
+++ b/components/viz/test/fake_output_surface.cc
@@ -18,99 +18,81 @@
 
 namespace viz {
 
-FakeOutputSurface::FakeOutputSurface(
-    scoped_refptr<ContextProvider> context_provider)
-    : OutputSurface(std::move(context_provider)) {
-  DCHECK(OutputSurface::context_provider());
-}
-
-FakeOutputSurface::FakeOutputSurface(
+FakeSoftwareOutputSurface::FakeSoftwareOutputSurface(
     std::unique_ptr<SoftwareOutputDevice> software_device)
     : OutputSurface(std::move(software_device)) {
   DCHECK(OutputSurface::software_device());
 }
 
-FakeOutputSurface::~FakeOutputSurface() = default;
+FakeSoftwareOutputSurface::~FakeSoftwareOutputSurface() = default;
 
-void FakeOutputSurface::Reshape(const ReshapeParams& params) {
-  if (context_provider()) {
-    context_provider()->ContextGL()->ResizeCHROMIUM(
-        params.size.width(), params.size.height(), params.device_scale_factor,
-        params.color_space.AsGLColorSpace(),
-        gfx::AlphaBitsForBufferFormat(params.format));
-  } else {
-    software_device()->Resize(params.size, params.device_scale_factor);
-  }
+void FakeSoftwareOutputSurface::Reshape(const ReshapeParams& params) {
+  software_device()->Resize(params.size, params.device_scale_factor);
   last_reshape_color_space_ = params.color_space;
 }
 
-void FakeOutputSurface::SwapBuffers(OutputSurfaceFrame frame) {
+void FakeSoftwareOutputSurface::SwapBuffers(OutputSurfaceFrame frame) {
   last_sent_frame_ = std::make_unique<OutputSurfaceFrame>(std::move(frame));
   ++num_sent_frames_;
 
   base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&FakeOutputSurface::SwapBuffersAck,
+      FROM_HERE, base::BindOnce(&FakeSoftwareOutputSurface::SwapBuffersAck,
                                 weak_ptr_factory_.GetWeakPtr()));
 }
 
-void FakeOutputSurface::SwapBuffersAck() {
+void FakeSoftwareOutputSurface::SwapBuffersAck() {
   base::TimeTicks now = base::TimeTicks::Now();
   client_->DidReceiveSwapBuffersAck({now, now},
                                     /*release_fence=*/gfx::GpuFenceHandle());
   client_->DidReceivePresentationFeedback({now, base::TimeDelta(), 0});
 }
 
-void FakeOutputSurface::BindFramebuffer() {
-  context_provider_->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, framebuffer_);
+void FakeSoftwareOutputSurface::BindFramebuffer() {}
+
+void FakeSoftwareOutputSurface::SetDrawRectangle(const gfx::Rect& rect) {
+  NOTREACHED();
 }
 
-void FakeOutputSurface::SetDrawRectangle(const gfx::Rect& rect) {
-  last_set_draw_rectangle_ = rect;
+void FakeSoftwareOutputSurface::SetEnableDCLayers(bool enabled) {
+  NOTREACHED();
 }
 
-void FakeOutputSurface::SetEnableDCLayers(bool enabled) {
-  context_provider_->ContextGL()->SetEnableDCLayersCHROMIUM(enabled);
+uint32_t FakeSoftwareOutputSurface::GetFramebufferCopyTextureFormat() {
+  return GL_RGB;
 }
 
-uint32_t FakeOutputSurface::GetFramebufferCopyTextureFormat() {
-  if (framebuffer_)
-    return framebuffer_format_;
-  else
-    return GL_RGB;
-}
-
-void FakeOutputSurface::BindToClient(OutputSurfaceClient* client) {
+void FakeSoftwareOutputSurface::BindToClient(OutputSurfaceClient* client) {
   DCHECK(client);
   DCHECK(!client_);
   client_ = client;
 }
 
-bool FakeOutputSurface::HasExternalStencilTest() const {
-  return has_external_stencil_test_;
+bool FakeSoftwareOutputSurface::HasExternalStencilTest() const {
+  return false;
 }
 
-bool FakeOutputSurface::IsDisplayedAsOverlayPlane() const {
-  return overlay_texture_id_ != 0;
+bool FakeSoftwareOutputSurface::IsDisplayedAsOverlayPlane() const {
+  return false;
 }
 
-unsigned FakeOutputSurface::GetOverlayTextureId() const {
-  return overlay_texture_id_;
+unsigned FakeSoftwareOutputSurface::GetOverlayTextureId() const {
+  return 0;
 }
 
-unsigned FakeOutputSurface::UpdateGpuFence() {
-  return gpu_fence_id_;
+unsigned FakeSoftwareOutputSurface::UpdateGpuFence() {
+  return 0;
 }
 
-void FakeOutputSurface::SetUpdateVSyncParametersCallback(
+void FakeSoftwareOutputSurface::SetUpdateVSyncParametersCallback(
     UpdateVSyncParametersCallback callback) {}
 
-void FakeOutputSurface::SetDisplayTransformHint(
+void FakeSoftwareOutputSurface::SetDisplayTransformHint(
     gfx::OverlayTransform transform) {
   if (support_display_transform_hint_)
     display_transform_hint_ = transform;
 }
 
-gfx::OverlayTransform FakeOutputSurface::GetDisplayTransform() {
+gfx::OverlayTransform FakeSoftwareOutputSurface::GetDisplayTransform() {
   return support_display_transform_hint_ ? display_transform_hint_
                                          : gfx::OVERLAY_TRANSFORM_NONE;
 }
@@ -118,7 +100,7 @@
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
 // of lacros-chrome is complete.
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
-void FakeOutputSurface::SetNeedsSwapSizeNotifications(
+void FakeSoftwareOutputSurface::SetNeedsSwapSizeNotifications(
     bool needs_swap_size_notifications) {}
 #endif
 
diff --git a/components/viz/test/fake_output_surface.h b/components/viz/test/fake_output_surface.h
index 78eca65..71d40d5 100644
--- a/components/viz/test/fake_output_surface.h
+++ b/components/viz/test/fake_output_surface.h
@@ -24,47 +24,16 @@
 
 namespace viz {
 
-class FakeOutputSurface : public OutputSurface {
+class FakeSoftwareOutputSurface : public OutputSurface {
  public:
-  ~FakeOutputSurface() override;
-
-  static std::unique_ptr<FakeOutputSurface> Create3d() {
-    auto provider = TestContextProvider::Create();
-    provider->BindToCurrentThread();
-    return base::WrapUnique(new FakeOutputSurface(std::move(provider)));
-  }
-
-  static std::unique_ptr<FakeOutputSurface> Create3d(
-      scoped_refptr<ContextProvider> context_provider) {
-    return base::WrapUnique(new FakeOutputSurface(context_provider));
-  }
-
-  static std::unique_ptr<FakeOutputSurface> CreateSoftware(
-      std::unique_ptr<SoftwareOutputDevice> software_device) {
-    return base::WrapUnique(new FakeOutputSurface(std::move(software_device)));
-  }
-
-  static std::unique_ptr<FakeOutputSurface> CreateOffscreen(
-      scoped_refptr<ContextProvider> context_provider) {
-    auto surface =
-        base::WrapUnique(new FakeOutputSurface(std::move(context_provider)));
-    surface->capabilities_.uses_default_gl_framebuffer = false;
-    return surface;
-  }
-
-  void set_max_frames_pending(int max) {
-    capabilities_.pending_swap_params.max_pending_swaps = max;
-  }
-
-  void set_supports_dc_layers(bool supports) {
-    capabilities_.supports_dc_layers = supports;
-  }
+  explicit FakeSoftwareOutputSurface(
+      std::unique_ptr<SoftwareOutputDevice> software_device);
+  ~FakeSoftwareOutputSurface() override;
 
   OutputSurfaceFrame* last_sent_frame() { return last_sent_frame_.get(); }
   size_t num_sent_frames() { return num_sent_frames_; }
 
-  OutputSurfaceClient* client() { return client_; }
-
+  // OutputSurface implementation.
   void BindToClient(OutputSurfaceClient* client) override;
   void EnsureBackbuffer() override {}
   void DiscardBackbuffer() override {}
@@ -90,48 +59,19 @@
       bool needs_swap_size_notifications) override;
 #endif
 
-  void set_framebuffer(GLint framebuffer, GLenum format) {
-    framebuffer_ = framebuffer;
-    framebuffer_format_ = format;
-  }
-
-  void set_gpu_fence_id(unsigned gpu_fence_id) { gpu_fence_id_ = gpu_fence_id; }
-
-  void set_overlay_texture_id(unsigned overlay_texture_id) {
-    overlay_texture_id_ = overlay_texture_id;
-  }
-
-  void set_has_external_stencil_test(bool has_test) {
-    has_external_stencil_test_ = has_test;
-  }
-
   const gfx::ColorSpace& last_reshape_color_space() {
     return last_reshape_color_space_;
   }
 
-  const gfx::Rect& last_set_draw_rectangle() {
-    return last_set_draw_rectangle_;
-  }
-
   void set_support_display_transform_hint(bool support) {
     support_display_transform_hint_ = support;
   }
 
  protected:
-  explicit FakeOutputSurface(scoped_refptr<ContextProvider> context_provider);
-  explicit FakeOutputSurface(
-      std::unique_ptr<SoftwareOutputDevice> software_device);
-
   raw_ptr<OutputSurfaceClient> client_ = nullptr;
   std::unique_ptr<OutputSurfaceFrame> last_sent_frame_;
   size_t num_sent_frames_ = 0;
-  bool has_external_stencil_test_ = false;
-  GLint framebuffer_ = 0;
-  GLenum framebuffer_format_ = 0;
-  unsigned gpu_fence_id_ = 0;
-  unsigned overlay_texture_id_ = 0;
   gfx::ColorSpace last_reshape_color_space_;
-  gfx::Rect last_set_draw_rectangle_;
 
   bool support_display_transform_hint_ = false;
   gfx::OverlayTransform display_transform_hint_ = gfx::OVERLAY_TRANSFORM_NONE;
@@ -139,7 +79,7 @@
  private:
   void SwapBuffersAck();
 
-  base::WeakPtrFactory<FakeOutputSurface> weak_ptr_factory_{this};
+  base::WeakPtrFactory<FakeSoftwareOutputSurface> weak_ptr_factory_{this};
 };
 
 }  // namespace viz
diff --git a/components/viz/test/test_output_surface_provider.cc b/components/viz/test/test_output_surface_provider.cc
index c16c8fe..383e68fa8 100644
--- a/components/viz/test/test_output_surface_provider.cc
+++ b/components/viz/test/test_output_surface_provider.cc
@@ -35,7 +35,7 @@
   if (gpu_compositing) {
     return FakeSkiaOutputSurface::Create3d();
   } else {
-    return FakeOutputSurface::CreateSoftware(
+    return std::make_unique<FakeSoftwareOutputSurface>(
         std::make_unique<SoftwareOutputDevice>());
   }
 }
diff --git a/components/viz/test/test_output_surface_provider.h b/components/viz/test/test_output_surface_provider.h
index 4598955..f4b7e4b 100644
--- a/components/viz/test/test_output_surface_provider.h
+++ b/components/viz/test/test_output_surface_provider.h
@@ -11,7 +11,7 @@
 
 namespace viz {
 
-// Test implementation that creates a FakeOutputSurface.
+// Test implementation that creates a fake OutputSurface.
 class TestOutputSurfaceProvider : public OutputSurfaceProvider {
  public:
   TestOutputSurfaceProvider();
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 29515345..962b138 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -2703,6 +2703,10 @@
   RunHtmlTest(FILE_PATH_LITERAL("param.html"));
 }
 
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityPopupApi) {
+  RunHtmlTest(FILE_PATH_LITERAL("popup-api.html"));
+}
+
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityPre) {
   RunHtmlTest(FILE_PATH_LITERAL("pre.html"));
 }
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc
index d8fa626..930f24d8 100644
--- a/content/browser/back_forward_cache_features_browsertest.cc
+++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/threading/platform_thread.h"
+#include "base/time/time.h"
 #include "content/browser/back_forward_cache_browsertest.h"
 
 #include "build/build_config.h"
@@ -1898,7 +1900,7 @@
       GetTreeResult()->GetDocumentResult(),
       MatchesDocumentResult(
           NotRestoredReasons(NotRestoredReason::kBlocklistedFeatures,
-                           NotRestoredReason::kBrowsingInstanceNotSwapped),
+                             NotRestoredReason::kBrowsingInstanceNotSwapped),
           BlockListedFeatures(
               blink::scheduler::WebSchedulerTrackedFeature::kDummy)));
 }
@@ -3378,7 +3380,7 @@
   GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
   GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
 
-  // 1) Navigate to A.
+  // Navigate to A.
   EXPECT_TRUE(NavigateToURL(shell(), url_a));
   RenderFrameHostImpl* rfh_a = current_frame_host();
   EXPECT_TRUE(ExecJs(rfh_a, R"(
@@ -3405,9 +3407,18 @@
 
     video.src = 'media/bear.webm';
 
-    var timeOnFrozen = 0.0;
-    video.addEventListener('pause', () => {
-      timeOnFrozen = video.currentTime;
+    // Android bots can be very slow and the video is only 1s long.
+    // This gives the first part of the test time to run before reaching
+    // the end of the video.
+    video.playbackRate = 0.1;
+
+    var timeOnPagehide;
+    window.addEventListener('pagehide', () => {
+      timeOnPagehide = video.currentTime;
+    });
+    var timeOnPageshow;
+    window.addEventListener('pageshow', () => {
+      timeOnPageshow = video.currentTime;
     });
   )"));
 
@@ -3427,19 +3438,31 @@
     });
   )"));
 
-  // 2) Navigate to B.
+  // Navigate to B.
   EXPECT_TRUE(NavigateToURL(shell(), url_b));
   EXPECT_TRUE(rfh_a->IsInBackForwardCache());
 
-  // 3) Navigate back to A.
+  // Sleep for 1s so that playing in BFCache can be detected.
+  base::PlatformThread::Sleep(base::Seconds(1));
+
+  // Navigate back to A.
   ASSERT_TRUE(HistoryGoBack(web_contents()));
   EXPECT_EQ(rfh_a, current_frame_host());
 
-  // Check that the media position is not changed when the page is in cache.
-  double duration1 = EvalJs(rfh_a, "timeOnFrozen;").ExtractDouble();
-  double duration2 = EvalJs(rfh_a, "video.currentTime;").ExtractDouble();
-  EXPECT_LE(0.0, duration2 - duration1);
-  EXPECT_GT(0.02, duration2 - duration1);
+  const double timeOnPagehide =
+      EvalJs(rfh_a, "timeOnPagehide;").ExtractDouble();
+  const double timeOnPageshow = EvalJs(rfh_a, "timeOnPageshow").ExtractDouble();
+
+  // Make sure the video did not reach the end. If it did, our test is not
+  // reliable.
+  ASSERT_GT(1.0, timeOnPageshow);
+
+  // Check that the duration of video played between pagehide and pageshow is
+  // small. We waited for 1s so if it didn't stop in BFCache, it should be much
+  // longer than this.
+  const double playedDuration = timeOnPageshow - timeOnPagehide;
+  EXPECT_LE(0.0, playedDuration);
+  EXPECT_GT(0.02, playedDuration);
 
   // Resume the media.
   EXPECT_TRUE(ExecJs(rfh_a, R"(
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.cc b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
index 5aa0291..cb4e3fd 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.cc
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.cc
@@ -990,8 +990,10 @@
   content::CacheStorage* GetOrCreateCacheStorage() {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(host_);
+    if (!bucket_.has_value())
+      return nullptr;
     if (!cache_storage_handle_.value())
-      cache_storage_handle_ = host_->OpenCacheStorage(storage_key_, owner_);
+      cache_storage_handle_ = host_->OpenCacheStorage(bucket_.value(), owner_);
     return cache_storage_handle_.value();
   }
 
@@ -1045,9 +1047,10 @@
 }
 
 CacheStorageHandle CacheStorageDispatcherHost::OpenCacheStorage(
-    const blink::StorageKey& storage_key,
+    const storage::BucketLocator& bucket_locator,
     storage::mojom::CacheStorageOwner owner) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  const blink::StorageKey storage_key = bucket_locator.storage_key;
   if (!context_ || !OriginCanAccessCacheStorage(storage_key.origin()))
     return CacheStorageHandle();
 
@@ -1055,7 +1058,7 @@
   if (!manager)
     return CacheStorageHandle();
 
-  return manager->OpenCacheStorage(storage_key, owner);
+  return manager->OpenCacheStorage(bucket_locator, owner);
 }
 
 }  // namespace content
diff --git a/content/browser/cache_storage/cache_storage_dispatcher_host.h b/content/browser/cache_storage/cache_storage_dispatcher_host.h
index 07f847b..091c282 100644
--- a/content/browser/cache_storage/cache_storage_dispatcher_host.h
+++ b/content/browser/cache_storage/cache_storage_dispatcher_host.h
@@ -67,8 +67,9 @@
       std::unique_ptr<CacheImpl> cache_impl,
       mojo::PendingAssociatedReceiver<blink::mojom::CacheStorageCache>
           receiver);
-  CacheStorageHandle OpenCacheStorage(const blink::StorageKey& storage_key,
-                                      storage::mojom::CacheStorageOwner owner);
+  CacheStorageHandle OpenCacheStorage(
+      const storage::BucketLocator& bucket_locator,
+      storage::mojom::CacheStorageOwner owner);
 
   // `this` is owned by `context_`.
   const raw_ptr<CacheStorageContextImpl> context_;
diff --git a/content/browser/cache_storage/cache_storage_manager.cc b/content/browser/cache_storage/cache_storage_manager.cc
index 65d3088..b90a6736 100644
--- a/content/browser/cache_storage/cache_storage_manager.cc
+++ b/content/browser/cache_storage/cache_storage_manager.cc
@@ -25,6 +25,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
+#include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "components/services/storage/public/cpp/constants.h"
 #include "content/browser/cache_storage/cache_storage.h"
 #include "content/browser/cache_storage/cache_storage.pb.h"
@@ -188,6 +189,9 @@
   return usages;
 }
 
+// Used by QuotaClient which only wants the storage keys that have data in the
+// default bucket. Keep this function to return a vector of StorageKeys, instead
+// of buckets.
 std::vector<blink::StorageKey> ListStorageKeysOnTaskRunner(
     base::FilePath root_path,
     storage::mojom::CacheStorageOwner owner) {
@@ -261,6 +265,35 @@
 }
 
 CacheStorageHandle CacheStorageManager::OpenCacheStorage(
+    const storage::BucketLocator& bucket_locator,
+    storage::mojom::CacheStorageOwner owner) {
+  // TODO(https://crbug.com/1304786): unify two OpenCacheStorage
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // Wait to create the MemoryPressureListener until the first CacheStorage
+  // object is needed.  This ensures we create the listener on the correct
+  // thread.
+  if (!memory_pressure_listener_) {
+    memory_pressure_listener_ = std::make_unique<base::MemoryPressureListener>(
+        FROM_HERE, base::BindRepeating(&CacheStorageManager::OnMemoryPressure,
+                                       base::Unretained(this)));
+  }
+
+  const blink::StorageKey& storage_key = bucket_locator.storage_key;
+  CacheStorageMap::const_iterator it =
+      cache_storage_map_.find({storage_key, owner});
+  if (it == cache_storage_map_.end()) {
+    CacheStorage* cache_storage = new CacheStorage(
+        ConstructBucketPath(root_path_, bucket_locator, owner),
+        IsMemoryBacked(), cache_task_runner_.get(), scheduler_task_runner_,
+        quota_manager_proxy_, blob_storage_context_, this, storage_key, owner);
+    cache_storage_map_[{storage_key, owner}] = base::WrapUnique(cache_storage);
+    return cache_storage->CreateHandle();
+  }
+  return it->second.get()->CreateHandle();
+}
+
+CacheStorageHandle CacheStorageManager::OpenCacheStorage(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -287,6 +320,7 @@
   return it->second.get()->CreateHandle();
 }
 
+// TODO(https://crbug.com/1304786): replace StorageKey with BucketLocator
 void CacheStorageManager::NotifyCacheListChanged(
     const blink::StorageKey& storage_key) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -294,6 +328,7 @@
     observer->OnCacheListChanged(storage_key);
 }
 
+// TODO(https://crbug.com/1304786): replace StorageKey with BucketLocator
 void CacheStorageManager::NotifyCacheContentChanged(
     const blink::StorageKey& storage_key,
     const std::string& name) {
@@ -302,6 +337,7 @@
     observer->OnCacheContentChanged(storage_key, name);
 }
 
+// TODO(https://crbug.com/1304786): replace StorageKey with BucketLocator
 void CacheStorageManager::CacheStorageUnreferenced(
     CacheStorage* cache_storage,
     const blink::StorageKey& storage_key,
@@ -347,6 +383,7 @@
                      base::WrapRefCounted(this), std::move(callback)));
 }
 
+// TODO(https://crbug.com/1304786):  Rename to or add GetAllBucketsUsageGetSizes
 void CacheStorageManager::GetAllStorageKeysUsageGetSizes(
     storage::mojom::CacheStorageControl::GetAllStorageKeysInfoCallback callback,
     std::vector<storage::mojom::StorageUsageInfoPtr> usages) {
@@ -382,6 +419,7 @@
   }
 }
 
+// TODO(https://crbug.com/1304786):  rename to or add GetBucketUsage
 void CacheStorageManager::GetStorageKeyUsage(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner,
@@ -409,6 +447,7 @@
                      std::move(callback)));
 }
 
+// TODO(https://crbug.com/1304786): Rename to or add GetBucketUsageDidGetExists
 void CacheStorageManager::GetStorageKeyUsageDidGetExists(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner,
@@ -424,6 +463,7 @@
   CacheStorage::From(cache_storage)->Size(std::move(callback));
 }
 
+// TODO(https://crbug.com/1304786): remove or keep for bucket migration
 void CacheStorageManager::GetStorageKeys(
     storage::mojom::CacheStorageOwner owner,
     storage::mojom::QuotaClient::GetStorageKeysForTypeCallback callback) {
@@ -447,6 +487,7 @@
       std::move(callback));
 }
 
+// TODO(https://crbug.com/1304786): rename to or add DeleteBucketData
 void CacheStorageManager::DeleteStorageKeyData(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner,
@@ -475,6 +516,8 @@
                      std::move(callback)));
 }
 
+// TODO(https://crbug.com/1304786): rename to or add
+// DeleteBucketDataDidGetExists
 void CacheStorageManager::DeleteStorageKeyDataDidGetExists(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner,
@@ -504,6 +547,8 @@
                      std::move(callback), base::WrapUnique(cache_storage)));
 }
 
+// TODO(https://crbug.com/1304786): rename to or add
+// DeleteBucketDataDidGetExists
 void CacheStorageManager::DeleteStorageKeyData(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner) {
@@ -516,6 +561,7 @@
   observers_.Add(std::move(observer));
 }
 
+// TODO(https://crbug.com/1304786): rename to or add DeleteBucketDidClose
 void CacheStorageManager::DeleteStorageKeyDidClose(
     const blink::StorageKey& storage_key,
     storage::mojom::CacheStorageOwner owner,
@@ -585,6 +631,23 @@
   return root_path.AppendASCII(origin_hash_hex);
 }
 
+base::FilePath CacheStorageManager::ConstructBucketPath(
+    const base::FilePath& root_path,
+    const storage::BucketLocator& bucket_locator,
+    storage::mojom::CacheStorageOwner owner) {
+  if (bucket_locator.is_default &&
+      bucket_locator.storage_key.IsFirstPartyContext()) {
+    // Default-bucket & first-party partition:
+    // {{storage_partition_path}}/Service Worker/CacheStorage/{origin_hash}/...
+    return CacheStorageManager::ConstructStorageKeyPath(
+        root_path, bucket_locator.storage_key, owner);
+  }
+  // Non-default bucket & first/third-party partition:
+  // {{storage_partition_path}}/WebStorage/{{bucket_id}}/CacheStorage/...
+  return quota_manager_proxy_->GetClientBucketPath(
+      bucket_locator, storage::QuotaClientType::kServiceWorkerCache);
+}
+
 // static
 bool CacheStorageManager::IsValidQuotaStorageKey(
     const blink::StorageKey& storage_key) {
diff --git a/content/browser/cache_storage/cache_storage_manager.h b/content/browser/cache_storage/cache_storage_manager.h
index 9135d657..44188553 100644
--- a/content/browser/cache_storage/cache_storage_manager.h
+++ b/content/browser/cache_storage/cache_storage_manager.h
@@ -14,6 +14,7 @@
 #include "base/memory/memory_pressure_listener.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
+#include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "components/services/storage/public/mojom/cache_storage_control.mojom.h"
 #include "components/services/storage/public/mojom/quota_client.mojom.h"
 #include "components/services/storage/public/mojom/storage_usage_info.mojom.h"
@@ -68,6 +69,12 @@
       const blink::StorageKey& storage_key,
       storage::mojom::CacheStorageOwner owner);
 
+  // Map a BuckeLocator to the path.
+  base::FilePath ConstructBucketPath(
+      const base::FilePath& root_path,
+      const storage::BucketLocator& bucket_locator,
+      storage::mojom::CacheStorageOwner owner);
+
   static bool IsValidQuotaStorageKey(const blink::StorageKey& storage_key);
 
   // Open the CacheStorage for the given storage_key and owner.  A reference
@@ -76,6 +83,10 @@
   CacheStorageHandle OpenCacheStorage(const blink::StorageKey& storage_key,
                                       storage::mojom::CacheStorageOwner owner);
 
+  CacheStorageHandle OpenCacheStorage(
+      const storage::BucketLocator& bucket_locator,
+      storage::mojom::CacheStorageOwner owner);
+
   // QuotaClient and Browsing Data Deletion support.
   void GetAllStorageKeysUsage(
       storage::mojom::CacheStorageOwner owner,
diff --git a/content/browser/content_security_policy_browsertest.cc b/content/browser/content_security_policy_browsertest.cc
index 03fe2590..a86e361 100644
--- a/content/browser/content_security_policy_browsertest.cc
+++ b/content/browser/content_security_policy_browsertest.cc
@@ -115,7 +115,8 @@
       "Refused to frame '' because it violates the following Content Security "
       "Policy directive: \"frame-src *\". Note that '*' matches only URLs with "
       "network schemes ('http', 'https', 'ws', 'wss'), or URLs whose scheme "
-      "matches `self`'s scheme. mailto:' must be added explicitely.\n");
+      "matches `self`'s scheme. The scheme 'mailto:' must be added "
+      "explicitly.\n");
   EXPECT_TRUE(NavigateToURL(shell(), url));
   console_observer.Wait();
 }
@@ -136,7 +137,8 @@
       "\"script-src *\". Note that 'script-src-elem' was not explicitly set, "
       "so 'script-src' is used as a fallback. Note that '*' matches only URLs "
       "with network schemes ('http', 'https', 'ws', 'wss'), or URLs whose "
-      "scheme matches `self`'s scheme. mailto:' must be added explicitely.\n");
+      "scheme matches `self`'s scheme. The scheme 'mailto:' must be added "
+      "explicitly.\n");
   EXPECT_TRUE(NavigateToURL(shell(), url));
   console_observer.Wait();
 }
diff --git a/content/browser/file_system/file_system_operation_runner_unittest.cc b/content/browser/file_system/file_system_operation_runner_unittest.cc
index f048508..17f50fc 100644
--- a/content/browser/file_system/file_system_operation_runner_unittest.cc
+++ b/content/browser/file_system/file_system_operation_runner_unittest.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/scoped_refptr.h"
@@ -59,7 +60,8 @@
   *status_out = status;
 }
 
-void DidOpenFile(base::File file, base::OnceClosure on_close_callback) {}
+void DidOpenFile(base::File file, base::ScopedClosureRunner on_close_callback) {
+}
 
 }  // namespace
 
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.cc b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
index 223c653..8da589f 100644
--- a/content/browser/file_system_access/file_system_access_file_handle_impl.cc
+++ b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
@@ -289,12 +289,9 @@
     OpenAccessHandleCallback callback,
     scoped_refptr<FileSystemAccessWriteLockManager::WriteLock> lock,
     base::File file,
-    base::OnceClosure on_close_callback) {
+    base::ScopedClosureRunner on_close_callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  base::ScopedClosureRunner scoped_on_close_callback(
-      std::move(on_close_callback));
-
   blink::mojom::FileSystemAccessErrorPtr result =
       file_system_access_error::FromFileError(file.error_details());
   if (result->status != FileSystemAccessStatus::kOk) {
@@ -321,7 +318,7 @@
       base::BindOnce(&GetFileLengthOnBlockingThread, std::move(file)),
       base::BindOnce(&FileSystemAccessFileHandleImpl::DidOpenFileAndGetLength,
                      weak_factory_.GetWeakPtr(), std::move(callback),
-                     std::move(lock), std::move(scoped_on_close_callback)));
+                     std::move(lock), std::move(on_close_callback)));
 }
 
 void FileSystemAccessFileHandleImpl::DidOpenFileAndGetLength(
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.h b/content/browser/file_system_access/file_system_access_file_handle_impl.h
index 007a706..89f0d802 100644
--- a/content/browser/file_system_access/file_system_access_file_handle_impl.h
+++ b/content/browser/file_system_access/file_system_access_file_handle_impl.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_BROWSER_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_FILE_HANDLE_IMPL_H_
 #define CONTENT_BROWSER_FILE_SYSTEM_ACCESS_FILE_SYSTEM_ACCESS_FILE_HANDLE_IMPL_H_
 
+#include "base/callback_helpers.h"
 #include "base/files/file.h"
 #include "base/files/file_error_or.h"
 #include "base/memory/weak_ptr.h"
@@ -112,7 +113,7 @@
       OpenAccessHandleCallback callback,
       scoped_refptr<FileSystemAccessWriteLockManager::WriteLock> lock,
       base::File file,
-      base::OnceClosure on_close_callback);
+      base::ScopedClosureRunner on_close_callback);
   void DidOpenFileAndGetLength(
       OpenAccessHandleCallback callback,
       scoped_refptr<FileSystemAccessWriteLockManager::WriteLock> lock,
diff --git a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
index 74451201..b64829d 100644
--- a/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store_unittest.cc
@@ -346,9 +346,9 @@
     leveldb::Status s;
     std::tie(bucket_state_handle_, s, std::ignore, data_loss_info_,
              std::ignore) =
-        idb_factory_->GetOrOpenBucketFactory(bucket_locator,
-                                             idb_context_->data_path(),
-                                             /*create_if_missing=*/true);
+        idb_factory_->GetOrOpenBucketFactory(
+            bucket_locator, idb_context_->GetDataPath(bucket_locator),
+            /*create_if_missing=*/true);
     if (!bucket_state_handle_.IsHeld()) {
       backing_store_ = nullptr;
       return;
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc
index 47e8146..1b64342 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.cc
+++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -125,7 +125,7 @@
 }
 
 IndexedDBContextImpl::IndexedDBContextImpl(
-    const base::FilePath& data_path,
+    const base::FilePath& base_data_path,
     scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
     base::Clock* clock,
     mojo::PendingRemote<storage::mojom::BlobStorageContext>
@@ -143,8 +143,8 @@
                      // BLOCK_SHUTDOWN to support clearing session-only storage.
                      base::TaskShutdownBehavior::BLOCK_SHUTDOWN}))),
       dispatcher_host_(this, std::move(io_task_runner)),
-      data_path_(data_path.empty() ? base::FilePath()
-                                   : data_path.Append(kIndexedDBDirectory)),
+      base_data_path_(base_data_path.empty() ? base::FilePath()
+                                             : base_data_path),
       force_keep_session_state_(false),
       quota_manager_proxy_(std::move(quota_manager_proxy)),
       clock_(clock),
@@ -272,7 +272,7 @@
   // InitializeFromFilesIfNeeded might not have finished, so we need to check
   // if there's a file in the directory and not exit early if so.
   const auto& storage_key_to_file_path =
-      DefaultBucketFilePerFirstPartyStorageKey(data_path_);
+      DefaultBucketFilePerFirstPartyStorageKey(GetFirstPartyDataPath());
   if (!HasBucket(*bucket_locator) &&
       storage_key_to_file_path.find(bucket_locator->storage_key) ==
           storage_key_to_file_path.end()) {
@@ -431,7 +431,7 @@
                                 .AddExtension(FILE_PATH_LITERAL("zip"));
 
   std::vector<base::FilePath> paths = GetStoragePaths(*bucket_locator);
-  zip::ZipWithFilterCallback(data_path(), zip_path,
+  zip::ZipWithFilterCallback(GetDataPath(*bucket_locator), zip_path,
                              base::BindRepeating(IsAllowedPath, paths));
 
   success = true;
@@ -619,7 +619,7 @@
 
 void IndexedDBContextImpl::GetBaseDataPathForTesting(
     GetBaseDataPathForTestingCallback callback) {
-  std::move(callback).Run(data_path());
+  std::move(callback).Run(GetFirstPartyDataPath());
 }
 
 void IndexedDBContextImpl::GetFilePathForTesting(
@@ -685,7 +685,8 @@
   IndexedDBBucketStateHandle handle;
   leveldb::Status s;
   std::tie(handle, s, std::ignore, std::ignore, std::ignore) =
-      GetIDBFactory()->GetOrOpenBucketFactory(bucket_locator, data_path(),
+      GetIDBFactory()->GetOrOpenBucketFactory(bucket_locator,
+                                              GetDataPath(bucket_locator),
                                               /*create_if_missing=*/true);
   CHECK(s.ok()) << s.ToString();
   CHECK(handle.IsHeld());
@@ -713,7 +714,8 @@
   IndexedDBBucketStateHandle handle;
   leveldb::Status s;
   std::tie(handle, s, std::ignore, std::ignore, std::ignore) =
-      GetIDBFactory()->GetOrOpenBucketFactory(bucket_locator, data_path(),
+      GetIDBFactory()->GetOrOpenBucketFactory(bucket_locator,
+                                              GetDataPath(bucket_locator),
                                               /*create_if_missing=*/true);
   CHECK(s.ok()) << s.ToString();
   CHECK(handle.IsHeld());
@@ -744,7 +746,8 @@
   IndexedDBBucketStateHandle handle;
   leveldb::Status s;
   std::tie(handle, s, std::ignore, std::ignore, std::ignore) =
-      GetIDBFactory()->GetOrOpenBucketFactory(bucket_locator, data_path(),
+      GetIDBFactory()->GetOrOpenBucketFactory(bucket_locator,
+                                              GetDataPath(bucket_locator),
                                               /*create_if_missing=*/true);
   CHECK(s.ok()) << s.ToString();
   CHECK(handle.IsHeld());
@@ -865,6 +868,31 @@
   return paths;
 }
 
+const base::FilePath IndexedDBContextImpl::GetDataPath(
+    const storage::BucketLocator& bucket_locator) const {
+  // TODO(crbug.com/1315371): Allow custom bucket names.
+  if (bucket_locator.storage_key.IsFirstPartyContext()) {
+    // First-party idb files, for legacy reasons, are stored at:
+    // {{storage_partition_path}}/IndexedDB/
+    return GetFirstPartyDataPath();
+  } else {
+    // Third-party idb files are stored at:
+    // {{storage_partition_path}}/WebStorage/{{bucket_id}}/IndexedDB/
+    // TODO(crbug.com/1218100): Support the correct third-party data path.
+    return GetFirstPartyDataPath();
+  }
+}
+
+const base::FilePath IndexedDBContextImpl::GetFirstPartyDataPath() const {
+  return base_data_path_.empty() ? base_data_path_
+                                 : base_data_path_.Append(kIndexedDBDirectory);
+}
+
+const base::FilePath IndexedDBContextImpl::GetFirstPartyDataPathForTesting()
+    const {
+  return GetFirstPartyDataPath();
+}
+
 void IndexedDBContextImpl::FactoryOpened(
     const storage::BucketLocator& bucket_locator) {
   DCHECK(IDBTaskRunner()->RunsTasksInCurrentSequence());
@@ -969,7 +997,7 @@
 
   IndexedDBFactoryImpl* factory = GetIDBFactory();
   const auto& storage_key_to_file_path =
-      DefaultBucketFilePerFirstPartyStorageKey(data_path_);
+      DefaultBucketFilePerFirstPartyStorageKey(GetFirstPartyDataPath());
   for (const auto& pair : storage_key_to_file_path) {
     const auto& bucket_locator_it =
         storage_key_to_bucket_locator_.find(pair.first);
@@ -998,13 +1026,15 @@
 base::FilePath IndexedDBContextImpl::GetBlobStorePath(
     const storage::BucketLocator& bucket_locator) const {
   DCHECK(!is_incognito());
-  return data_path_.Append(indexed_db::GetBlobStoreFileName(bucket_locator));
+  return GetDataPath(bucket_locator)
+      .Append(indexed_db::GetBlobStoreFileName(bucket_locator));
 }
 
 base::FilePath IndexedDBContextImpl::GetLevelDBPath(
     const storage::BucketLocator& bucket_locator) const {
   DCHECK(!is_incognito());
-  return data_path_.Append(indexed_db::GetLevelDBFileName(bucket_locator));
+  return GetDataPath(bucket_locator)
+      .Append(indexed_db::GetLevelDBFileName(bucket_locator));
 }
 
 int64_t IndexedDBContextImpl::ReadUsageFromDisk(
@@ -1050,7 +1080,7 @@
     return;
   }
   const auto& storage_key_to_file_path =
-      DefaultBucketFilePerFirstPartyStorageKey(data_path_);
+      DefaultBucketFilePerFirstPartyStorageKey(GetFirstPartyDataPath());
   if (storage_key_to_file_path.empty()) {
     did_initialize_from_files_ = true;
     std::move(callback).Run();
diff --git a/content/browser/indexed_db/indexed_db_context_impl.h b/content/browser/indexed_db/indexed_db_context_impl.h
index 73307fd4..702ef9b5a 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.h
+++ b/content/browser/indexed_db/indexed_db_context_impl.h
@@ -64,11 +64,11 @@
   static void ReleaseOnIDBSequence(
       scoped_refptr<IndexedDBContextImpl>&& context);
 
-  // If `data_path` is empty, nothing will be saved to disk.
+  // If `base_data_path` is empty, nothing will be saved to disk.
   // `task_runner` is optional, and only set during testing.
   // This is *not* called on the IDBTaskRunner, unlike most other functions.
   IndexedDBContextImpl(
-      const base::FilePath& data_path,
+      const base::FilePath& base_data_path,
       scoped_refptr<storage::QuotaManagerProxy> quota_manager_proxy,
       base::Clock* clock,
       mojo::PendingRemote<storage::mojom::BlobStorageContext>
@@ -195,12 +195,15 @@
   std::vector<base::FilePath> GetStoragePaths(
       const storage::BucketLocator& bucket_locator) const;
 
-  const base::FilePath& data_path() const { return data_path_; }
-  bool IsInMemoryContext() const { return data_path_.empty(); }
+  const base::FilePath GetDataPath(
+      const storage::BucketLocator& bucket_locator) const;
+  const base::FilePath GetFirstPartyDataPathForTesting() const;
+
+  bool IsInMemoryContext() const { return base_data_path_.empty(); }
   size_t GetConnectionCountSync(const storage::BucketLocator& bucket_locator);
   int GetBucketBlobFileCount(const storage::BucketLocator& bucket_locator);
 
-  bool is_incognito() const { return data_path_.empty(); }
+  bool is_incognito() const { return base_data_path_.empty(); }
 
   storage::mojom::BlobStorageContext* blob_storage_context() const {
     return blob_storage_context_ ? blob_storage_context_.get() : nullptr;
@@ -224,12 +227,6 @@
  private:
   friend class base::RefCountedThreadSafe<IndexedDBContextImpl>;
 
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, ClearLocalState);
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, ClearSessionOnlyDatabases);
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, SetForceKeepSessionState);
-  FRIEND_TEST_ALL_PREFIXES(IndexedDBTest, ForceCloseOpenDatabasesOnDelete);
-  friend class IndexedDBQuotaClientTest;
-
   class IndexedDBGetUsageAndQuotaCallback;
 
   ~IndexedDBContextImpl() override;
@@ -258,6 +255,7 @@
 
   void ShutdownOnIDBSequence();
 
+  const base::FilePath GetFirstPartyDataPath() const;
   base::FilePath GetBlobStorePath(
       const storage::BucketLocator& bucket_locator) const;
   base::FilePath GetLevelDBPath(
@@ -302,9 +300,9 @@
       file_system_access_context_;
   std::unique_ptr<IndexedDBFactoryImpl> indexeddb_factory_;
 
-  // If `data_path_` is empty then this is an incognito session and the backing
-  // store will be held in-memory rather than on-disk.
-  const base::FilePath data_path_;
+  // If `base_data_path_` is empty then this is an incognito session and the
+  // backing store will be held in-memory rather than on-disk.
+  const base::FilePath base_data_path_;
 
   // If true, nothing (not even session-only data) should be deleted on exit.
   bool force_keep_session_state_;
diff --git a/content/browser/indexed_db/indexed_db_context_unittest.cc b/content/browser/indexed_db/indexed_db_context_unittest.cc
index d8bec47..d0fd88d 100644
--- a/content/browser/indexed_db/indexed_db_context_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_context_unittest.cc
@@ -95,11 +95,13 @@
   auto example_bucket_locator = storage::BucketLocator();
   example_bucket_locator.storage_key = example_storage_key_;
   indexed_db_context_->GetIDBFactory()->GetDatabaseInfo(
-      callbacks, example_bucket_locator, indexed_db_context_->data_path());
+      callbacks, example_bucket_locator,
+      indexed_db_context_->GetDataPath(example_bucket_locator));
   auto google_bucket_locator = storage::BucketLocator();
   google_bucket_locator.storage_key = google_storage_key_;
   indexed_db_context_->GetIDBFactory()->GetDatabaseInfo(
-      callbacks, google_bucket_locator, indexed_db_context_->data_path());
+      callbacks, google_bucket_locator,
+      indexed_db_context_->GetDataPath(google_bucket_locator));
   loop.Run();
 
   // Check default bucket exists for https://example.com.
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc
index 264b0a5..be2951e 100644
--- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc
+++ b/content/browser/indexed_db/indexed_db_dispatcher_host.cc
@@ -290,7 +290,8 @@
       this->AsWeakPtr(), bucket_locator, std::move(pending_callbacks),
       IDBTaskRunner());
 
-  base::FilePath indexed_db_path = indexed_db_context_->data_path();
+  base::FilePath indexed_db_path =
+      indexed_db_context_->GetDataPath(bucket_locator);
   indexed_db_context_->GetIDBFactory()->GetDatabaseInfo(
       std::move(callbacks), bucket_locator, indexed_db_path);
 }
@@ -324,7 +325,8 @@
   auto database_callbacks = base::MakeRefCounted<IndexedDBDatabaseCallbacks>(
       indexed_db_context_, std::move(database_callbacks_remote),
       IDBTaskRunner());
-  base::FilePath indexed_db_path = indexed_db_context_->data_path();
+  base::FilePath indexed_db_path =
+      indexed_db_context_->GetDataPath(bucket_locator);
 
   auto create_transaction_callback = base::BindOnce(
       &IndexedDBDispatcherHost::CreateAndBindTransactionImpl, AsWeakPtr(),
@@ -362,7 +364,8 @@
       this->AsWeakPtr(), bucket_locator, std::move(pending_callbacks),
       IDBTaskRunner());
 
-  base::FilePath indexed_db_path = indexed_db_context_->data_path();
+  base::FilePath indexed_db_path =
+      indexed_db_context_->GetDataPath(bucket_locator);
   indexed_db_context_->GetIDBFactory()->DeleteDatabase(
       name, std::move(callbacks), bucket_locator, indexed_db_path, force_close);
 }
diff --git a/content/browser/indexed_db/indexed_db_factory_impl.cc b/content/browser/indexed_db/indexed_db_factory_impl.cc
index f940534..5fc6c675 100644
--- a/content/browser/indexed_db/indexed_db_factory_impl.cc
+++ b/content/browser/indexed_db/indexed_db_factory_impl.cc
@@ -437,7 +437,7 @@
   // of a backing store which this function will be deleting.
   storage::BucketLocator saved_bucket_locator(bucket_locator);
   DCHECK(context_);
-  base::FilePath path_base = context_->data_path();
+  base::FilePath path_base = context_->GetDataPath(saved_bucket_locator);
 
   // The message may contain the database path, which may be considered
   // sensitive data, and those strings are passed to the extension, so strip it.
diff --git a/content/browser/indexed_db/indexed_db_factory_unittest.cc b/content/browser/indexed_db/indexed_db_factory_unittest.cc
index a66ed9a4..21347951 100644
--- a/content/browser/indexed_db/indexed_db_factory_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_factory_unittest.cc
@@ -162,7 +162,7 @@
       callbacks->CallOnUpgradeNeeded(
           base::BindLambdaForTesting([&]() { loop.Quit(); }));
       factory()->Open(name, std::move(connection), bucket_locator,
-                      context()->data_path());
+                      context()->GetDataPath(bucket_locator));
       loop.Run();
     }
 
@@ -248,16 +248,16 @@
   leveldb::Status s;
 
   std::tie(bucket_state1_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator_1,
-                                        context()->data_path(),
-                                        /*create_if_missing=*/true);
+      factory()->GetOrOpenBucketFactory(
+          bucket_locator_1, context()->GetDataPath(bucket_locator_1),
+          /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state1_handle.IsHeld()) << s.ToString();
   EXPECT_TRUE(s.ok()) << s.ToString();
 
   std::tie(bucket_state2_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator_2,
-                                        context()->data_path(),
-                                        /*create_if_missing=*/true);
+      factory()->GetOrOpenBucketFactory(
+          bucket_locator_2, context()->GetDataPath(bucket_locator_2),
+          /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state2_handle.IsHeld()) << s.ToString();
   EXPECT_TRUE(s.ok()) << s.ToString();
 
@@ -280,7 +280,8 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
   bucket_state_handle.Release();
@@ -306,7 +307,8 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
   bucket_state_handle.Release();
@@ -332,7 +334,8 @@
   // Open a connection & immediately release it to cause the closing sequence to
   // start.
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
   bucket_state_handle.Release();
@@ -356,7 +359,8 @@
   // Open a connection & immediately release it to cause the closing sequence to
   // start again.
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
   bucket_state_handle.Release();
@@ -378,7 +382,8 @@
 
   // Stop sweep by opening a connection.
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
   EXPECT_FALSE(
@@ -404,7 +409,8 @@
   //  Finally, move the clock forward so the storage key should allow a sweep.
   clock.Advance(IndexedDBBucketState::kMaxEarliestBucketSweepFromNow);
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   bucket_state_handle.Release();
   factory()->GetBucketFactory(bucket_locator)->close_timer()->FireNow();
@@ -435,7 +441,8 @@
   // Open a connection & immediately release it to cause the closing sequence to
   // start.
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
 
@@ -474,7 +481,8 @@
   // Open a connection & immediately release it to cause the closing sequence to
   // start.
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
 
@@ -516,7 +524,8 @@
   // Open a connection & immediately release it to cause the closing sequence to
   // start.
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
 
@@ -535,7 +544,8 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
   EXPECT_TRUE(StorageBucketFromHandle(bucket_state_handle)
@@ -556,7 +566,8 @@
 TEST_F(IndexedDBFactoryTest, TooLongOrigin) {
   SetupContext();
 
-  base::FilePath temp_dir = context()->data_path().DirName();
+  base::FilePath temp_dir =
+      context()->GetFirstPartyDataPathForTesting().DirName();
   int limit = base::GetMaximumPathComponentLength(temp_dir);
   EXPECT_GT(limit, 0);
 
@@ -570,9 +581,10 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(too_long_bucket_locator,
-                                        context()->data_path(),
-                                        /*create_if_missing=*/true);
+      factory()->GetOrOpenBucketFactory(
+          too_long_bucket_locator,
+          context()->GetDataPath(too_long_bucket_locator),
+          /*create_if_missing=*/true);
   EXPECT_FALSE(bucket_state_handle.IsHeld());
   EXPECT_TRUE(s.IsIOError());
 }
@@ -595,7 +607,7 @@
       transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION,
       std::move(create_transaction_callback));
   factory()->Open(u"db", std::move(connection), bucket_locator,
-                  context()->data_path());
+                  context()->GetDataPath(bucket_locator));
   RunPostedTasks();
 
   // Now simulate shutdown, which should clear all factories.
@@ -613,7 +625,8 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
 
@@ -633,7 +646,8 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
 
@@ -663,7 +677,7 @@
       transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION,
       std::move(create_transaction_callback));
   factory()->Open(u"db", std::move(connection), bucket_locator,
-                  context()->data_path());
+                  context()->GetDataPath(bucket_locator));
   EXPECT_FALSE(callbacks->connection());
   RunPostedTasks();
   EXPECT_TRUE(callbacks->connection());
@@ -703,7 +717,7 @@
     callbacks->CallOnUpgradeNeeded(
         base::BindLambdaForTesting([&]() { loop.Quit(); }));
     factory()->Open(u"db", std::move(connection), bucket_locator,
-                    context()->data_path());
+                    context()->GetDataPath(bucket_locator));
     loop.Run();
   }
 
@@ -743,7 +757,7 @@
     callbacks->CallOnUpgradeNeeded(
         base::BindLambdaForTesting([&]() { loop.Quit(); }));
     factory()->Open(u"db", std::move(connection), bucket_locator,
-                    context()->data_path());
+                    context()->GetDataPath(bucket_locator));
     loop.Run();
   }
 
@@ -792,7 +806,7 @@
   bucket_locator.storage_key = storage_key;
 
   factory()->DeleteDatabase(u"db", callbacks, bucket_locator,
-                            context()->data_path(),
+                            context()->GetDataPath(bucket_locator),
                             /*force_close=*/false);
 
   // Since there are no more references the factory should be closing.
@@ -826,7 +840,7 @@
       /*expect_connection=*/false);
 
   factory()->DeleteDatabase(name, callbacks, bucket_locator,
-                            context()->data_path(),
+                            context()->GetDataPath(bucket_locator),
                             /*force_close=*/true);
 
   // Force close means the connection has been force closed, but the factory
@@ -852,7 +866,8 @@
   auto bucket_locator = storage::BucketLocator();
   bucket_locator.storage_key = storage_key;
 
-  factory()->GetDatabaseInfo(callbacks, bucket_locator, context()->data_path());
+  factory()->GetDatabaseInfo(callbacks, bucket_locator,
+                             context()->GetDataPath(bucket_locator));
 
   EXPECT_TRUE(callbacks->info_called());
   // Don't create a factory if one doesn't exist.
@@ -873,11 +888,13 @@
   leveldb::Status s;
 
   std::tie(bucket_state_handle, s, std::ignore, std::ignore, std::ignore) =
-      factory()->GetOrOpenBucketFactory(bucket_locator, context()->data_path(),
+      factory()->GetOrOpenBucketFactory(bucket_locator,
+                                        context()->GetDataPath(bucket_locator),
                                         /*create_if_missing=*/true);
   EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString();
 
-  factory()->GetDatabaseInfo(callbacks, bucket_locator, context()->data_path());
+  factory()->GetDatabaseInfo(callbacks, bucket_locator,
+                             context()->GetDataPath(bucket_locator));
 
   EXPECT_TRUE(callbacks->info_called());
   EXPECT_TRUE(factory()->GetBucketFactory(bucket_locator));
@@ -933,7 +950,7 @@
       /*transaction_id=*/1, /*version=*/1,
       std::move(create_transaction_callback));
   factory()->Open(name, std::move(connection), bucket_locator,
-                  context()->data_path());
+                  context()->GetDataPath(bucket_locator));
   EXPECT_TRUE(callbacks->error_called());
   base::RunLoop().RunUntilIdle();
 
@@ -1009,7 +1026,7 @@
       callbacks->CallOnUpgradeNeeded(
           base::BindLambdaForTesting([&]() { loop.Quit(); }));
       factory()->Open(db_name, std::move(connection), bucket_locator,
-                      context()->data_path());
+                      context()->GetDataPath(bucket_locator));
       loop.Run();
     }
     EXPECT_TRUE(callbacks->upgrade_called());
@@ -1040,7 +1057,7 @@
         failed_open_callbacks, db_callbacks2,
         transaction_id, db_version, std::move(create_transaction_callback));
     factory()->Open(db_name, std::move(connection), bucket_locator,
-                    context()->data_path());
+                    context()->GetDataPath(bucket_locator));
     EXPECT_TRUE(factory()->IsDatabaseOpen(bucket_locator, db_name));
     RunPostedTasks();
     EXPECT_TRUE(failed_open_callbacks->saw_error());
@@ -1101,7 +1118,8 @@
           base::BindLambdaForTesting([&]() { loop.Quit(); }));
 
       this->factory()->Open(u"test_db", std::move(pending_connection),
-                            bucket_locator, context()->data_path());
+                            bucket_locator,
+                            context()->GetDataPath(bucket_locator));
       loop.Run();
 
       // If an upgrade was requested, then commit the upgrade transaction.
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.cc b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
index c85dc9b..a4adb26 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_operations.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
@@ -56,47 +56,47 @@
 // static
 base::FilePath GetBlobStoreFileName(
     const storage::BucketLocator& bucket_locator) {
-  std::string storage_key_id;
   // TODO(crbug.com/1315371): Allow custom bucket names.
   if (bucket_locator.storage_key.IsFirstPartyContext()) {
-    storage_key_id =
-        storage::GetIdentifierFromOrigin(bucket_locator.storage_key.origin());
+    // First-party blob files, for legacy reasons, are stored at:
+    // {{first_party_data_path}}/{{serialized_origin}}.indexeddb.blob
+    return base::FilePath()
+        .AppendASCII(storage::GetIdentifierFromOrigin(
+            bucket_locator.storage_key.origin()))
+        .AddExtension(kIndexedDBExtension)
+        .AddExtension(kBlobExtension);
   } else {
-    // TODO(crbug.com/1218100): This is a stop-gap to prevent crashes, we need
-    // to point to a real storage bucket here not a transient one. We only
-    // hit this case when `kThirdPartyStoragePartitioning` is enabled.
-    storage_key_id = storage::GetIdentifierFromOrigin(url::Origin());
+    // Third-party blob files are stored at:
+    // {{third_party_data_path}}/indexeddb.blob
+    // TODO(crbug.com/1218100): Support the correct third-party blob path.
+    return base::FilePath()
+        .AppendASCII(storage::GetIdentifierFromOrigin(url::Origin()))
+        .AddExtension(kIndexedDBExtension)
+        .AddExtension(kBlobExtension);
   }
-  // TODO(crbug.com/1218100): Desired first and third party paths:
-  // {{storage_partition}}/IndexedDB/{{serialized_origin}}.blob/
-  // {{storage_partition}}/WebStorage/{{bucket_id}}/IndexedDB/indexeddb.blob/
-  return base::FilePath()
-      .AppendASCII(storage_key_id)
-      .AddExtension(kIndexedDBExtension)
-      .AddExtension(kBlobExtension);
 }
 
 // static
 base::FilePath GetLevelDBFileName(
     const storage::BucketLocator& bucket_locator) {
-  std::string storage_key_id;
   // TODO(crbug.com/1315371): Allow custom bucket names.
   if (bucket_locator.storage_key.IsFirstPartyContext()) {
-    storage_key_id =
-        storage::GetIdentifierFromOrigin(bucket_locator.storage_key.origin());
+    // First-party leveldb files, for legacy reasons, are stored at:
+    // {{first_party_data_path}}/{{serialized_origin}}.indexeddb.leveldb
+    return base::FilePath()
+        .AppendASCII(storage::GetIdentifierFromOrigin(
+            bucket_locator.storage_key.origin()))
+        .AddExtension(kIndexedDBExtension)
+        .AddExtension(kLevelDBExtension);
   } else {
-    // TODO(crbug.com/1218100): This is a stop-gap to prevent crashes, we need
-    // to point to a real storage bucket here not a transient one. We only
-    // hit this case when `kThirdPartyStoragePartitioning` is enabled.
-    storage_key_id = storage::GetIdentifierFromOrigin(url::Origin());
+    // Third-party leveldb files are stored at:
+    // {{unique_bucket_path}}/indexeddb.leveldb
+    // TODO(crbug.com/1218100): Support the correct third-party leveldb path.
+    return base::FilePath()
+        .AppendASCII(storage::GetIdentifierFromOrigin(url::Origin()))
+        .AddExtension(kIndexedDBExtension)
+        .AddExtension(kLevelDBExtension);
   }
-  // TODO(crbug.com/1218100): Desired first and third party paths:
-  // {{storage_partition}}/IndexedDB/{{serialized_origin}}.leveldb/
-  // {{storage_partition}}/WebStorage/{{bucket_id}}/IndexedDB/indexeddb.leveldb/
-  return base::FilePath()
-      .AppendASCII(storage_key_id)
-      .AddExtension(kIndexedDBExtension)
-      .AddExtension(kLevelDBExtension);
 }
 
 base::FilePath ComputeCorruptionFileName(
diff --git a/content/browser/indexed_db/indexed_db_quota_client_unittest.cc b/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
index f8b588b..e592c92 100644
--- a/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_quota_client_unittest.cc
@@ -73,7 +73,8 @@
   void CreateTempDir() { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
 
   void SetupTempDir() {
-    ASSERT_TRUE(base::CreateDirectory(idb_context_->data_path()));
+    ASSERT_TRUE(
+        base::CreateDirectory(idb_context_->GetFirstPartyDataPathForTesting()));
   }
 
   IndexedDBQuotaClientTest(const IndexedDBQuotaClientTest&) = delete;
diff --git a/content/browser/indexed_db/indexed_db_unittest.cc b/content/browser/indexed_db/indexed_db_unittest.cc
index 6eb7886..eee1411 100644
--- a/content/browser/indexed_db/indexed_db_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_unittest.cc
@@ -276,7 +276,7 @@
                 std::make_unique<IndexedDBPendingConnection>(
                     open_callbacks, open_db_callbacks, host_transaction_id,
                     version, std::move(create_transaction_callback1)),
-                bucket_locator, context()->data_path());
+                bucket_locator, context()->GetDataPath(bucket_locator));
   EXPECT_TRUE(base::DirectoryExists(test_path));
 
   auto create_transaction_callback2 =
@@ -285,7 +285,7 @@
                 std::make_unique<IndexedDBPendingConnection>(
                     closed_callbacks, closed_db_callbacks, host_transaction_id,
                     version, std::move(create_transaction_callback2)),
-                bucket_locator, context()->data_path());
+                bucket_locator, context()->GetDataPath(bucket_locator));
   RunPostedTasks();
   ASSERT_TRUE(closed_callbacks->connection());
   closed_callbacks->connection()->AbortTransactionsAndClose(
@@ -356,7 +356,7 @@
       transaction_id, IndexedDBDatabaseMetadata::DEFAULT_VERSION,
       std::move(create_transaction_callback1));
   factory->Open(u"db", std::move(connection), bucket_locator,
-                context()->data_path());
+                context()->GetDataPath(bucket_locator));
   RunPostedTasks();
 
   ASSERT_TRUE(callbacks->connection());
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc
index 6e9e34c..03e588b 100644
--- a/content/browser/renderer_host/back_forward_cache_impl.cc
+++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -960,9 +960,7 @@
 void BackForwardCacheImpl::StoreEntry(
     std::unique_ptr<BackForwardCacheImpl::Entry> entry) {
   TRACE_EVENT("navigation", "BackForwardCache::StoreEntry", "entry", entry);
-  BackForwardCacheCanStoreDocumentResultWithTree result =
-      CanStorePageNow(entry->render_frame_host());
-  DCHECK(result);
+  DCHECK(CanStorePageNow(entry->render_frame_host()));
 
 #if BUILDFLAG(IS_ANDROID)
   if (!IsProcessBindingEnabled()) {
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 7baa930..94fc328a 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -3170,6 +3170,15 @@
       .WithIsPdf(is_pdf_)
       .WithSandbox(is_origin_restricted_sandbox);
 
+  // Navigations within guests should always stay in the guest's
+  // StoragePartition.
+  SiteInstanceImpl* current_instance =
+      frame_tree_node_->current_frame_host()->GetSiteInstance();
+  if (current_instance->IsGuest()) {
+    url_info_init.WithStoragePartitionConfig(
+        current_instance->GetStoragePartitionConfig());
+  }
+
   if (GetWebBundleURL().is_valid()) {
     // Web Bundle navigations should use the origin of the bundle rather than
     // the target URL.
diff --git a/content/browser/renderer_host/pepper/pepper_file_io_host.cc b/content/browser/renderer_host/pepper/pepper_file_io_host.cc
index dd5be1d..7cf280e 100644
--- a/content/browser/renderer_host/pepper/pepper_file_io_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_file_io_host.cc
@@ -8,6 +8,8 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_forward.h"
+#include "base/callback_helpers.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/thread_pool.h"
@@ -84,18 +86,17 @@
 void FileCloser(base::File auto_close) {
 }
 
-void DidCloseFile(base::OnceClosure on_close_callback) {
-  if (!on_close_callback.is_null())
-    std::move(on_close_callback).Run();
+void DidCloseFile(base::ScopedClosureRunner on_close_callback) {
+  on_close_callback.RunAndReset();
 }
 
 void DidOpenFile(base::WeakPtr<PepperFileIOHost> file_host,
                  scoped_refptr<base::SequencedTaskRunner> task_runner,
                  storage::FileSystemOperation::OpenFileCallback callback,
                  base::File file,
-                 base::OnceClosure on_close_callback) {
+                 base::ScopedClosureRunner on_close_callback) {
   if (file_host) {
-    std::move(callback).Run(std::move(file), std::move(on_close_callback));
+    std::move(callback).Run(std::move(file), on_close_callback.Release());
   } else {
     task_runner->PostTaskAndReply(
         FROM_HERE, base::BindOnce(&FileCloser, std::move(file)),
@@ -106,7 +107,7 @@
 void OpenFileCallbackWrapperIO(
     storage::FileSystemOperationRunner::OpenFileCallback callback,
     base::File file,
-    base::OnceClosure on_close_callback) {
+    base::ScopedClosureRunner on_close_callback) {
   GetUIThreadTaskRunner({})->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), std::move(file),
                                 std::move(on_close_callback)));
@@ -285,7 +286,8 @@
     base::File file,
     base::OnceClosure on_close_callback) {
   if (file.IsValid()) {
-    on_close_callback_ = std::move(on_close_callback);
+    base::ScopedClosureRunner scoped_runner(std::move(on_close_callback));
+    on_close_callback_ = std::move(scoped_runner);
 
     if (FileOpenForWrite(open_flags_) && file_system_host_->ChecksQuota()) {
       check_quota_ = true;
@@ -405,9 +407,7 @@
 
 void PepperFileIOHost::DidCloseFile(base::File::Error /*error*/) {
   // Silently ignore if we fail to close the file.
-  if (!on_close_callback_.is_null()) {
-    std::move(on_close_callback_).Run();
-  }
+  on_close_callback_.RunAndReset();
 }
 
 int32_t PepperFileIOHost::OnHostMsgRequestOSFileHandle(
diff --git a/content/browser/renderer_host/pepper/pepper_file_io_host.h b/content/browser/renderer_host/pepper/pepper_file_io_host.h
index 75d8d9bf..49e3a636 100644
--- a/content/browser/renderer_host/pepper/pepper_file_io_host.h
+++ b/content/browser/renderer_host/pepper/pepper_file_io_host.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "base/callback_forward.h"
+#include "base/callback_helpers.h"
 #include "base/files/file.h"
 #include "base/files/file_proxy.h"
 #include "base/memory/raw_ptr.h"
@@ -146,7 +147,7 @@
   base::WeakPtr<PepperFileSystemBrowserHost> file_system_host_;
 
   storage::FileSystemURL file_system_url_;
-  base::OnceClosure on_close_callback_;
+  base::ScopedClosureRunner on_close_callback_;
   int64_t max_written_offset_;
   bool check_quota_;
 
diff --git a/content/browser/renderer_host/render_frame_host_csp_context.cc b/content/browser/renderer_host/render_frame_host_csp_context.cc
index f58d7b7d..b54289b 100644
--- a/content/browser/renderer_host/render_frame_host_csp_context.cc
+++ b/content/browser/renderer_host/render_frame_host_csp_context.cc
@@ -22,7 +22,6 @@
 }
 
 void RenderFrameHostCSPContext::SanitizeDataForUseInCspViolation(
-    bool is_redirect,
     network::mojom::CSPDirectiveName directive,
     GURL* blocked_url,
     network::mojom::SourceLocation* source_location) const {
diff --git a/content/browser/renderer_host/render_frame_host_csp_context.h b/content/browser/renderer_host/render_frame_host_csp_context.h
index 3f083cd..36649ad 100644
--- a/content/browser/renderer_host/render_frame_host_csp_context.h
+++ b/content/browser/renderer_host/render_frame_host_csp_context.h
@@ -28,7 +28,6 @@
   void ReportContentSecurityPolicyViolation(
       network::mojom::CSPViolationPtr violation_params) override;
   void SanitizeDataForUseInCspViolation(
-      bool is_redirect,
       network::mojom::CSPDirectiveName directive,
       GURL* blocked_url,
       network::mojom::SourceLocation* source_location) const override;
diff --git a/content/browser/renderer_host/render_frame_host_csp_context_unittest.cc b/content/browser/renderer_host/render_frame_host_csp_context_unittest.cc
index e408a26..90dc2ee1 100644
--- a/content/browser/renderer_host/render_frame_host_csp_context_unittest.cc
+++ b/content/browser/renderer_host/render_frame_host_csp_context_unittest.cc
@@ -20,8 +20,8 @@
       network::mojom::SourceLocation::New("http://a.com/login", 10u, 20u);
 
   context.SanitizeDataForUseInCspViolation(
-      /*is_redirect=*/false, network::mojom::CSPDirectiveName::FencedFrameSrc,
-      &blocked_url, source_location.get());
+      network::mojom::CSPDirectiveName::FencedFrameSrc, &blocked_url,
+      source_location.get());
 
   EXPECT_EQ(blocked_url, blocked_url.DeprecatedGetOriginAsURL());
   EXPECT_EQ(source_location->url, "http://a.com/");
@@ -29,4 +29,4 @@
   EXPECT_EQ(source_location->column, 0u);
 }
 
-}  // namespace content
\ No newline at end of file
+}  // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index c2323e5..9bb8160b3 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -724,12 +724,6 @@
 // sites are hosted by a RenderProcessHost. This class is meant to help reusing
 // RenderProcessHosts among SiteInstances, not to perform security checks for a
 // RenderProcessHost.
-//
-// TODO(alexmos): Currently, the tracking in this class and in
-// UnmatchedServiceWorkerProcessTracker is associated with a BrowserContext,
-// but it needs to also consider StoragePartitions, so that process reuse is
-// allowed only within the same StoragePartition.  For now, the tracking is
-// done only for the default StoragePartition.  See https://crbug.com/752667.
 const void* const kCommittedSiteProcessCountTrackerKey =
     "CommittedSiteProcessCountTrackerKey";
 const void* const kPendingSiteProcessCountTrackerKey =
@@ -954,40 +948,12 @@
   CountPerProcessPerSiteMap map_;
 };
 
-bool ShouldUseSiteProcessTracking(BrowserContext* browser_context,
-                                  StoragePartition* dest_partition) {
-  // TODO(alexmos): Sites should be tracked separately for each
-  // StoragePartition.  For now, track them only in the default one.
-  StoragePartition* default_partition =
-      browser_context->GetDefaultStoragePartition();
-  if (dest_partition != default_partition) {
-    MAYBEVLOG(2) << __func__
-                 << ": Site process tracking will not be available for a "
-                    "non-default partition.";
-    return false;
-  }
-
-  return true;
+bool ShouldTrackProcessForSite(const SiteInfo& site_info) {
+  return !site_info.site_url().is_empty();
 }
 
-bool ShouldTrackProcessForSite(BrowserContext* browser_context,
-                               RenderProcessHost* render_process_host,
-                               const SiteInfo& site_info) {
-  if (site_info.site_url().is_empty())
-    return false;
-
-  return ShouldUseSiteProcessTracking(
-      browser_context, render_process_host->GetStoragePartition());
-}
-
-bool ShouldFindReusableProcessHostForSite(BrowserContext* browser_context,
-                                          const SiteInfo& site_info) {
-  if (site_info.site_url().is_empty())
-    return false;
-
-  return ShouldUseSiteProcessTracking(
-      browser_context, browser_context->GetStoragePartition(
-                           site_info.storage_partition_config()));
+bool ShouldFindReusableProcessHostForSite(const SiteInfo& site_info) {
+  return !site_info.site_url().is_empty();
 }
 
 std::string GetCurrentHostMapDebugString(
@@ -1014,12 +980,6 @@
 // processes are reused for a navigation to a matching site. After a single
 // matching navigation is put into the process, all service workers for that
 // site in that process are considered 'matched.'
-//
-// TODO(alexmos): Currently, the tracking in this class and in
-// SiteProcessCountTracker is associated with a BrowserContext, but it needs to
-// also consider StoragePartitions, so that process reuse is allowed only
-// within the same StoragePartition.  For now, the tracking is done only for
-// the default StoragePartition.  See https://crbug.com/752667.
 class UnmatchedServiceWorkerProcessTracker
     : public base::SupportsUserData::Data,
       public RenderProcessHostObserver {
@@ -1030,8 +990,7 @@
                        SiteInstanceImpl* site_instance) {
     BrowserContext* browser_context = site_instance->GetBrowserContext();
     DCHECK(!site_instance->GetSiteInfo().site_url().is_empty());
-    if (!ShouldTrackProcessForSite(browser_context, render_process_host,
-                                   site_instance->GetSiteInfo()))
+    if (!ShouldTrackProcessForSite(site_instance->GetSiteInfo()))
       return;
 
     UnmatchedServiceWorkerProcessTracker* tracker =
@@ -1050,8 +1009,7 @@
   // removes the process from the tracker if it exists.
   static RenderProcessHost* MatchWithSite(SiteInstanceImpl* site_instance) {
     BrowserContext* browser_context = site_instance->GetBrowserContext();
-    if (!ShouldFindReusableProcessHostForSite(browser_context,
-                                              site_instance->GetSiteInfo()))
+    if (!ShouldFindReusableProcessHostForSite(site_instance->GetSiteInfo()))
       return nullptr;
 
     UnmatchedServiceWorkerProcessTracker* tracker =
@@ -2127,7 +2085,7 @@
 
   // Add to the delayed-shutdown tracker with the site that triggered the delay.
   if (base::FeatureList::IsEnabled(features::kSubframeShutdownDelay) &&
-      ShouldTrackProcessForSite(GetBrowserContext(), this, site_info)) {
+      ShouldTrackProcessForSite(site_info)) {
     SiteProcessCountTracker* delayed_shutdown_tracker =
         SiteProcessCountTracker::GetInstance(
             GetBrowserContext(),
@@ -2949,10 +2907,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const SiteInfo& site_info) {
-  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
-                                 site_info)) {
+  if (!ShouldTrackProcessForSite(site_info))
     return;
-  }
 
   SiteProcessCountTracker* tracker = SiteProcessCountTracker::GetInstance(
       browser_context, kCommittedSiteProcessCountTrackerKey);
@@ -2969,10 +2925,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const SiteInfo& site_info) {
-  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
-                                 site_info)) {
+  if (!ShouldTrackProcessForSite(site_info))
     return;
-  }
 
   SiteProcessCountTracker* tracker = SiteProcessCountTracker::GetInstance(
       browser_context, kCommittedSiteProcessCountTrackerKey);
@@ -2984,10 +2938,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const SiteInfo& site_info) {
-  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
-                                 site_info)) {
+  if (!ShouldTrackProcessForSite(site_info))
     return;
-  }
 
   SiteProcessCountTracker* tracker = SiteProcessCountTracker::GetInstance(
       browser_context, kPendingSiteProcessCountTrackerKey);
@@ -2999,10 +2951,8 @@
     BrowserContext* browser_context,
     RenderProcessHost* render_process_host,
     const SiteInfo& site_info) {
-  if (!ShouldTrackProcessForSite(browser_context, render_process_host,
-                                 site_info)) {
+  if (!ShouldTrackProcessForSite(site_info))
     return;
-  }
 
   SiteProcessCountTracker* tracker = SiteProcessCountTracker::GetInstance(
       browser_context, kPendingSiteProcessCountTrackerKey);
@@ -4155,13 +4105,10 @@
   if (host->GetBrowserContext() != browser_context)
     return false;
 
-  // Do not allow sharing of guest hosts. This is to prevent bugs where guest
-  // and non-guest storage gets mixed. In the future, we might consider
-  // enabling the sharing of guests, in this case this check should be removed
-  // and InSameStoragePartition should handle the possible sharing. Also
-  // deny any attempt where a guest SiteInfo tries to use a |host| that is not
-  // explicitly created for guests.
-  if (host->IsForGuestsOnly() || site_info.is_guest())
+  // Do not allow sharing of guest and non-guest hosts.  Note that we also
+  // enforce that `host` and `site_info` must belong to the same
+  // StoragePartition via the InSameStoragePartition() check below.
+  if (host->IsForGuestsOnly() != site_info.is_guest())
     return false;
 
   // If this process has a different JIT policy to the site then it can't be
@@ -5096,10 +5043,8 @@
 RenderProcessHostImpl::FindReusableProcessHostForSiteInstance(
     SiteInstanceImpl* site_instance) {
   BrowserContext* browser_context = site_instance->GetBrowserContext();
-  if (!ShouldFindReusableProcessHostForSite(browser_context,
-                                            site_instance->GetSiteInfo())) {
+  if (!ShouldFindReusableProcessHostForSite(site_instance->GetSiteInfo()))
     return nullptr;
-  }
 
   std::set<RenderProcessHost*> eligible_foreground_hosts;
   std::set<RenderProcessHost*> eligible_background_hosts;
@@ -5207,7 +5152,7 @@
   // in StopTrackingProcessForShutdownDelay() if the process was reused before
   // this task executed.
   if (base::FeatureList::IsEnabled(features::kSubframeShutdownDelay) &&
-      ShouldTrackProcessForSite(GetBrowserContext(), this, site_info)) {
+      ShouldTrackProcessForSite(site_info)) {
     SiteProcessCountTracker* delayed_shutdown_tracker =
         SiteProcessCountTracker::GetInstance(
             GetBrowserContext(),
diff --git a/content/browser/renderer_host/render_process_host_unittest.cc b/content/browser/renderer_host/render_process_host_unittest.cc
index 54acf20..cd3b464 100644
--- a/content/browser/renderer_host/render_process_host_unittest.cc
+++ b/content/browser/renderer_host/render_process_host_unittest.cc
@@ -874,6 +874,29 @@
                                                          kUrl);
   RenderProcessHost* process = site_instance->GetProcess();
   EXPECT_NE(main_test_rfh()->GetProcess(), process);
+  EXPECT_NE(main_test_rfh()->GetProcess()->GetStoragePartition(),
+            process->GetStoragePartition());
+
+  // Commit a navigation to foo.com in a new WebContents, so that there is a
+  // reusable foo.com process in the new StoragePartition.
+  std::unique_ptr<WebContents> contents(CreateTestWebContents());
+  static_cast<TestWebContents*>(contents.get())->NavigateAndCommit(kUrl);
+  RenderProcessHost* foo_process_in_new_partition =
+      contents->GetMainFrame()->GetProcess();
+
+  // Create another reusable foo.com SiteInstance in the new StoragePartition,
+  // and ensure that this SiteInstance reuse the process just created in that
+  // same StoragePartition.
+  scoped_refptr<SiteInstanceImpl> site_instance2 =
+      SiteInstanceImpl::CreateReusableInstanceForTesting(browser_context(),
+                                                         kUrl);
+  RenderProcessHost* process2 = site_instance2->GetProcess();
+  EXPECT_EQ(foo_process_in_new_partition, process2);
+  EXPECT_EQ(foo_process_in_new_partition->GetStoragePartition(),
+            process2->GetStoragePartition());
+  EXPECT_NE(main_test_rfh()->GetProcess(), process2);
+  EXPECT_NE(main_test_rfh()->GetProcess()->GetStoragePartition(),
+            process2->GetStoragePartition());
 
   SetBrowserClientForTesting(regular_client);
 }
@@ -904,6 +927,28 @@
   RenderProcessHost* process = site_instance->GetProcess();
   EXPECT_NE(sw_process, process);
 
+  // Commit a navigation to foo.com in a new WebContents, so that there is a
+  // reusable foo.com process in the new StoragePartition.
+  std::unique_ptr<WebContents> contents(CreateTestWebContents());
+  static_cast<TestWebContents*>(contents.get())->NavigateAndCommit(kUrl);
+  RenderProcessHost* foo_process_in_new_partition =
+      contents->GetMainFrame()->GetProcess();
+
+  // Create a second foo.com service worker, this time in the new
+  // StoragePartition. Ensure that it reuses the process registered for foo.com
+  // in that same StoragePartition.
+  scoped_refptr<SiteInstanceImpl> sw_site_instance2 =
+      SiteInstanceImpl::CreateForServiceWorker(
+          browser_context(),
+          UrlInfo::CreateForTesting(kUrl,
+                                    site_instance->GetStoragePartitionConfig()),
+          /*can_reuse_process=*/true);
+  RenderProcessHost* sw_process2 = sw_site_instance2->GetProcess();
+  EXPECT_EQ(sw_process2, foo_process_in_new_partition);
+  EXPECT_NE(sw_process2, sw_process);
+  EXPECT_EQ(SiteInstanceProcessAssignment::REUSED_EXISTING_PROCESS,
+            sw_site_instance2->GetLastProcessAssignmentOutcome());
+
   SetBrowserClientForTesting(regular_client);
 }
 
diff --git a/content/browser/renderer_host/scroll_into_view_browsertest.cc b/content/browser/renderer_host/scroll_into_view_browsertest.cc
new file mode 100644
index 0000000..5826322
--- /dev/null
+++ b/content/browser/renderer_host/scroll_into_view_browsertest.cc
@@ -0,0 +1,725 @@
+// Copyright 2022 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 <memory>
+#include <string>
+
+#include "base/json/json_reader.h"
+#include "base/strings/strcat.h"
+#include "base/test/bind.h"
+#include "build/build_config.h"
+#include "content/browser/renderer_host/render_widget_host_view_child_frame.h"
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/test_utils.h"
+#include "content/shell/browser/shell.h"
+#include "content/shell/browser/shell_content_browser_client.h"
+#include "content/shell/common/shell_switches.h"
+#include "content/test/content_browser_test_utils_internal.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "third_party/re2/src/re2/re2.h"
+#include "ui/events/event_constants.h"
+#include "url/gurl.h"
+
+#if defined(USE_AURA)
+#include "content/browser/renderer_host/render_widget_host_view_aura.h"
+#endif
+
+#define EXPECT_TRUE_OR_FAIL(condition) \
+  EXPECT_TRUE(condition);              \
+  if (!condition)                      \
+    return false;
+
+namespace content {
+
+namespace {
+
+// Test variants
+
+// kLocalFrame will force all remote frames in a test to be local.
+enum TestFrameType { kLocalFrame, kRemoteFrame };
+
+// Tests run with both Left-to-Right and Right-to-Left writing modes.
+enum TestWritingMode { kLTR, kRTL };
+
+// What kind of scroll into view to invoke, via JavaScript binding
+// (element.scrollIntoView), using the InputHandler
+// ScrollFocusedEditableNodeIntoRect method, or via setting an OSK inset.
+enum TestInvokeMethod { kJavaScript, kInputHandler, kAuraOnScreenKeyboard };
+
+[[maybe_unused]] std::string DescribeFrameType(
+    const testing::TestParamInfo<TestFrameType>& info) {
+  std::string frame_type;
+  switch (info.param) {
+    case kLocalFrame: {
+      frame_type = "LocalFrame";
+    } break;
+    case kRemoteFrame: {
+      frame_type = "RemoteFrame";
+    } break;
+  }
+  return frame_type;
+}
+
+blink::mojom::FrameWidgetInputHandler* GetInputHandler(FrameTreeNode* node) {
+  return node->current_frame_host()
+      ->GetRenderWidgetHost()
+      ->GetFrameWidgetInputHandler();
+}
+
+// Will block from the destructor until a ScrollFocusedEditableNodeIntoRect has
+// completed. This must be called with the root frame tree node since that's
+// where the ScrollIntoView and PageScaleAnimation will bubble to.
+class ScopedFocusScrollWaiter {
+ public:
+  explicit ScopedFocusScrollWaiter(FrameTreeNode* node) {
+    DCHECK(node->IsOutermostMainFrame());
+    GetInputHandler(node)->WaitForPageScaleAnimationForTesting(
+        run_loop_.QuitClosure());
+  }
+
+  ~ScopedFocusScrollWaiter() { run_loop_.Run(); }
+
+ private:
+  base::RunLoop run_loop_;
+};
+
+// While this is in scope, causes the TextInputManager of the given WebContents
+// to always return nullptr. This effectively blocks the IME from receiving any
+// events from the renderer. Note: RenderWidgetHostViewBase caches this value
+// so for this to work it must be constructed before the target page is
+// constructed.
+class ScopedSuppressImeEvents {
+ public:
+  explicit ScopedSuppressImeEvents(WebContentsImpl* web_contents)
+      : web_contents_(web_contents->GetWeakPtr()) {
+    web_contents->set_suppress_ime_events_for_testing(true);
+  }
+
+  ~ScopedSuppressImeEvents() {
+    if (!web_contents_)
+      return;
+
+    static_cast<WebContentsImpl*>(web_contents_.get())
+        ->set_suppress_ime_events_for_testing(false);
+  }
+
+  base::WeakPtr<WebContents> web_contents_;
+};
+
+// Test harness for ScrollIntoView related browser tests. These tests are
+// mainly concerned with behavior of scroll into view related functionality
+// across remote frames. This harness depends on
+// cross_site_scroll_into_view_factory.html, which is based on
+// cross_site_iframe_factory.html.
+//
+// cross_site_scroll_into_view_factory.html builds a frame tree from its given
+// argument, allowing only a single child frame in each frame. The inner most
+// frame adds an <input> element which can be used to call
+// ScrollFocusedEditableNodeIntoRect.
+//
+// Each test starts by performing a non-scrolling focus on the <input> element.
+// It then performs a scroll into view (either via JavaScript bindings or
+// content API) and ensures the caret is within a vertically centered band of
+// the viewport.
+class ScrollIntoViewBrowserTestBase : public ContentBrowserTest {
+ public:
+  ScrollIntoViewBrowserTestBase() = default;
+  ~ScrollIntoViewBrowserTestBase() override = default;
+
+  virtual bool IsForceLocalFrames() const = 0;
+  virtual bool IsWritingModeLTR() const = 0;
+  virtual TestInvokeMethod GetInvokeMethod() const = 0;
+
+  void SetUpOnMainThread() override {
+    ContentBrowserTest::SetUpOnMainThread();
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+
+    suppress_ime_ = std::make_unique<ScopedSuppressImeEvents>(web_contents());
+  }
+
+  void TearDownOnMainThread() override {
+    suppress_ime_.reset();
+
+    ContentBrowserTest::TearDownOnMainThread();
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    ContentBrowserTest::SetUpCommandLine(command_line);
+    IsolateAllSitesForTesting(command_line);
+
+    // Need this to control page scale factor via script.
+    command_line->AppendSwitch(switches::kExposeInternalsForTesting);
+  }
+
+  WebContentsImpl* web_contents() {
+    return static_cast<WebContentsImpl*>(shell()->web_contents());
+  }
+
+  FrameTreeNode* InnerMostFrameTreeNode() {
+    FrameTreeNode* node = web_contents()->GetPrimaryFrameTree().root();
+    while (node->child_count()) {
+      // These tests never have multiple child frames.
+      CHECK_EQ(node->child_count(), 1ul);
+
+      node = node->child_at(0);
+    }
+    return node;
+  }
+
+  FrameTreeNode* RootFrameTreeNode() {
+    return web_contents()->GetPrimaryFrameTree().root();
+  }
+
+  // Gets the bounding client rect from the element returned via the given query
+  // string (i.e. as found via document.querySelector).
+  gfx::RectF GetClientRect(FrameTreeNode* node, std::string query) {
+    auto result = EvalJs(node, JsReplace(R"JS(
+      JSON.stringify(document.querySelector($1).getBoundingClientRect());
+    )JS",
+                                         query));
+    absl::optional<base::Value> value =
+        base::JSONReader::Read(result.ExtractString());
+    CHECK(value.has_value());
+    CHECK(value->is_dict());
+
+    absl::optional<double> x = value->FindDoubleKey("x");
+    absl::optional<double> y = value->FindDoubleKey("y");
+    absl::optional<double> width = value->FindDoubleKey("width");
+    absl::optional<double> height = value->FindDoubleKey("height");
+
+    CHECK(x);
+    CHECK(y);
+    CHECK(width);
+    CHECK(height);
+
+    return gfx::RectF(*x, *y, *width, *height);
+  }
+
+  gfx::RectF GetLayoutViewportRect() {
+    return GetClientRect(RootFrameTreeNode(), ".layoutViewport");
+  }
+
+  struct VisualViewport {
+    // These are the values coming from the window.visualViewport object. Note:
+    // the width/height are _relative to the root frame_, meaning they decrease
+    // as `scale` increases.
+    double offset_left;
+    double offset_top;
+    double width;
+    double height;
+    double scale;
+    double page_left;
+    double page_top;
+
+    // This is the _unscaled_ rect computed from values above.
+    gfx::RectF rect;
+  };
+
+  VisualViewport GetVisualViewport() {
+    auto result = EvalJs(RootFrameTreeNode(), R"JS(
+      JSON.stringify({
+        offsetLeft: visualViewport.offsetLeft,
+        offsetTop: visualViewport.offsetTop,
+        width: visualViewport.width,
+        height: visualViewport.height,
+        scale: visualViewport.scale,
+        pageLeft: visualViewport.pageLeft,
+        pageTop: visualViewport.pageTop});
+    )JS");
+
+    absl::optional<base::Value> value =
+        base::JSONReader::Read(result.ExtractString());
+    CHECK(value.has_value());
+    CHECK(value->is_dict());
+
+    absl::optional<double> offset_left = value->FindDoubleKey("offsetLeft");
+    absl::optional<double> offset_top = value->FindDoubleKey("offsetTop");
+    absl::optional<double> width = value->FindDoubleKey("width");
+    absl::optional<double> height = value->FindDoubleKey("height");
+    absl::optional<double> scale = value->FindDoubleKey("scale");
+    absl::optional<double> page_left = value->FindDoubleKey("pageLeft");
+    absl::optional<double> page_top = value->FindDoubleKey("pageTop");
+
+    CHECK(offset_left);
+    CHECK(offset_top);
+    CHECK(width);
+    CHECK(height);
+    CHECK(scale);
+    CHECK(page_left);
+    CHECK(page_top);
+
+    VisualViewport values;
+    values.offset_left = *offset_left;
+    values.offset_top = *offset_top;
+    values.width = *width;
+    values.height = *height;
+    values.scale = *scale;
+    values.page_left = *page_left;
+    values.page_top = *page_top;
+
+    values.rect = gfx::RectF(
+        gfx::PointF(),
+        gfx::ScaleSize(gfx::SizeF(values.width, values.height), values.scale));
+
+    return values;
+  }
+
+  // Gets the bounding rect of the caret (taken from the <input> element in the
+  // inner-most frame) as it appears in the root most viewport.
+  //
+  // This accounts for clipping in each intervening frame.
+  //
+  // WARNING: This doesn't take transforms on the frames into account. It also
+  // makes a guess on where the caret is, based on the writing-mode of the
+  // document.
+  gfx::RectF GetCaretRectInViewport() {
+    FrameTreeNode* node = InnerMostFrameTreeNode();
+    gfx::RectF rect = GetClientRect(node, "input");
+
+    // Take either the left-most or right-most portion of the input box as an
+    // estimate of the caret; based on the writing-mode of the page.
+    constexpr float kCaretBoxWidth = 30.f;
+    if (IsWritingModeLTR()) {
+      rect.Inset(gfx::InsetsF::TLBR(0, 0, 0, rect.width() - kCaretBoxWidth));
+    } else {
+      rect.Inset(gfx::InsetsF::TLBR(0, rect.width() - kCaretBoxWidth, 0, 0));
+    }
+
+    EXPECT_EQ("", EvalJs(node, "document.querySelector('input').value"))
+        << "Caret location is assumed based on empty <input> value";
+
+    // If `node` is a child frame, we'll convert rect up the ancestor frame
+    // chain, clipping to each frame rect.
+    FrameTreeNode* frame = FrameTreeNode::From(node->parent());
+    while (frame) {
+      gfx::RectF parent_rect = GetClientRect(frame, "iframe");
+      rect.Offset(parent_rect.OffsetFromOrigin());
+
+      rect = gfx::IntersectRects(parent_rect, rect);
+
+      frame = FrameTreeNode::From(frame->parent());
+    }
+
+    gfx::RectF root_frame_rect = GetLayoutViewportRect();
+    root_frame_rect.set_origin(gfx::PointF());
+
+    rect = gfx::IntersectRects(root_frame_rect, rect);
+
+    VisualViewport visual_viewport = GetVisualViewport();
+    rect.Offset(-visual_viewport.offset_left, -visual_viewport.offset_top);
+    rect.Scale(visual_viewport.scale);
+
+    rect = gfx::IntersectRects(visual_viewport.rect, rect);
+
+    return rect;
+  }
+
+  // Returns the rect within the visual viewport where, if the caret ends up in
+  // after a scroll into view, we'll consider it a success.
+  gfx::RectF GetAcceptableCaretRect() {
+    gfx::RectF caret_in_viewport = GetCaretRectInViewport();
+    VisualViewport visual_viewport = GetVisualViewport();
+
+    gfx::RectF rect = visual_viewport.rect;
+
+    // Vertically, the caret should be roughly centered (40px of wiggleroom,
+    // e.g. for scrollbars, in either direction) in the viewport.
+    const float kVerticalInset =
+        ((rect.height() - caret_in_viewport.height()) / 2.f) - 40.f;
+
+    // Horizontally, we're less picky, as long as the caret is in the viewport.
+    // TODO(bokan): The constants used in
+    // WebViewImpl::ComputeScaleAndScrollForEditableElementRects are somewhat
+    // inscrutible and dimension dependent (which is a problem when this test
+    // runs on Android and the width depends on the device). Ideally we'd be
+    // able to ensure the caret appears in the right region of the viewport.
+    const float kHorizontalInset = 0.f;
+
+    rect.Inset(gfx::InsetsF::VH(kVerticalInset, kHorizontalInset));
+    return rect;
+  }
+
+  // Modifies the frame tree string as needed for different test parameters.
+  GURL GetMainURLForFrameTree(std::string frame_tree_string) {
+    // To make things simple, remove any whitespace or empty attribute lists.
+    re2::RE2::GlobalReplace(&frame_tree_string, "\\s*", "");
+    re2::RE2::GlobalReplace(&frame_tree_string, "{}", "");
+
+    // If we're in a local frame test variant, replace all site strings with
+    // "siteA".
+    if (IsForceLocalFrames()) {
+      re2::RE2::GlobalReplace(&frame_tree_string, "site[A-Z]", "siteA");
+    }
+
+    // For RTL tests, add {RTL} attribute on each frame.
+    if (!IsWritingModeLTR()) {
+      // Prepend RTL to any existing attribute lists.
+      re2::RE2::GlobalReplace(&frame_tree_string, "{(.*?)}", "{RTL,\\1}");
+
+      // Add an attribute list with RTL to sites without an existing list.
+      {
+        std::string regex =
+            // Match any site name (store in capture group 1).
+            "(site[A-Z])"
+
+            // That's followed by a non-{ character or line-end (store in
+            // capture group 2).
+            "([^{]|$)";
+
+        re2::RE2::GlobalReplace(&frame_tree_string, regex, "\\1{RTL}\\2");
+      }
+    }
+
+    return embedded_test_server()->GetURL(
+        "a.com", base::StrCat({"/cross_site_scroll_into_view_factory.html?",
+                               frame_tree_string}));
+  }
+
+  // Simualte a keyboard coming up, insetting the viewport by its height.
+  void SetAuraOnScreenKeyboardInset(int keyboard_height) {
+#if defined(USE_AURA)
+    RenderWidgetHostViewChildFrame* child_render_widget_host_view_child_frame =
+        static_cast<RenderWidgetHostViewChildFrame*>(InnerMostFrameTreeNode()
+                                                         ->current_frame_host()
+                                                         ->GetRenderWidgetHost()
+                                                         ->GetView());
+
+    RenderWidgetHostViewAura* parent_render_widget_host_aura =
+        static_cast<RenderWidgetHostViewAura*>(
+            child_render_widget_host_view_child_frame->GetRootView());
+
+    // Set the pointer type to simulate the keyboard appearing as a result of
+    // the user tapping on an editable element.
+    parent_render_widget_host_aura->SetLastPointerType(
+        ui::EventPointerType::kTouch);
+    parent_render_widget_host_aura->SetInsets(
+        gfx::Insets::TLBR(0, 0, keyboard_height, 0));
+#else
+    NOTREACHED();
+#endif
+  }
+
+  // For frame_tree syntax see tree_parser_util.js.
+  // These tests place two additional restrictions to make some simplifying
+  // assumptions:
+  //
+  //  * All site names must start with "site" and be followed by [A-Z].
+  //  * Allow only one or zero children. That is, siteA(siteB) is valid but
+  //    siteA(siteB, siteB) is not.
+  //
+  // For valid arguments, see comments in
+  // cross_site_scroll_into_view_factory.html
+  bool SetupTest(std::string frame_tree) {
+    const GURL kMainUrl(GetMainURLForFrameTree(frame_tree));
+
+    if (!NavigateToURL(shell(), kMainUrl))
+      return false;
+
+    VisualViewport viewport = GetVisualViewport();
+    double page_scale_factor_before = viewport.scale;
+    double page_left_before = viewport.page_left;
+    double page_top_before = viewport.page_top;
+
+    if (GetInvokeMethod() == kInputHandler ||
+        GetInvokeMethod() == kAuraOnScreenKeyboard) {
+      // Focus the input for tests that rely on scrolling to a focused element
+      // (i.e. via ScrollFocusedEditableNodeIntoRect).  Use `preventScroll` to
+      // avoid affecting the test via the automatic scrolling caused by focus.
+      //
+      // Note: normally, an IME (i.e. On-Screen Keyboard) can also attempt to
+      // scroll into view (in fact, using ScrollFocusedEditableNodeIntoRect
+      // which we're trying to test). However, in order to reliably test this
+      // across platforms this test harness suppresses IME events so that the
+      // on-screen keyboard on a platform that uses one will not activate in
+      // response to this. See ScopedSuppressImeEvents above.
+      EXPECT_TRUE_OR_FAIL(ExecJs(InnerMostFrameTreeNode(), R"JS(
+        document.querySelector('input').focus({preventScroll: true});
+      )JS"));
+    }
+
+    // The test should start with fresh scroll and scale.
+    viewport = GetVisualViewport();
+    CHECK_EQ(viewport.scale, page_scale_factor_before);
+    CHECK_EQ(viewport.page_left, page_left_before);
+    CHECK_EQ(viewport.page_top, page_top_before);
+
+    return true;
+  }
+
+  void RunTest() {
+    switch (GetInvokeMethod()) {
+      case kInputHandler: {
+        ScopedFocusScrollWaiter wait_for_scroll_done(RootFrameTreeNode());
+
+        // The gfx::Rect() param is used only to debounce repeated calls, see
+        // the TODO at https://bit.ly/3vIdTsD
+        GetInputHandler(InnerMostFrameTreeNode())
+            ->ScrollFocusedEditableNodeIntoRect(gfx::Rect());
+      } break;
+      case kAuraOnScreenKeyboard: {
+        ScopedFocusScrollWaiter wait_for_scroll_done(RootFrameTreeNode());
+        SetAuraOnScreenKeyboardInset(/*keyboard_height=*/400);
+      } break;
+      case kJavaScript: {
+        RenderFrameSubmissionObserver frame_observer(web_contents());
+        EXPECT_TRUE(ExecJs(InnerMostFrameTreeNode(), R"JS(
+          document.querySelector('input').scrollIntoView({
+            behavior: 'instant',
+            block: 'center',
+            inline: 'center'
+          })
+        )JS"));
+        frame_observer.WaitForScrollOffsetAtTop(
+            /*expected_scroll_offset_at_top=*/false);
+      } break;
+    }
+
+    gfx::RectF caret_in_viewport = GetCaretRectInViewport();
+    gfx::RectF acceptable_rect = GetAcceptableCaretRect();
+
+    EXPECT_TRUE(acceptable_rect.Contains(caret_in_viewport))
+        << "Expected caret to within [" << acceptable_rect.ToString()
+        << "] but caret is [" << caret_in_viewport.ToString() << "]";
+  }
+
+ private:
+  std::unique_ptr<ScopedSuppressImeEvents> suppress_ime_;
+};
+
+// Runs tests in all combinations of Local/Remote frames,
+// left-to-right/right-to-left writing modes, and scrollIntoView via
+// element.scrollIntoView/InputHandler.ScrollFocusedEditableNodeIntoRect. The
+// kAuraOnScreenKeyboard is intentionally omitted as it is expected to be
+// functionally equivalent to kInputHandler.
+class ScrollIntoViewBrowserTest
+    : public ScrollIntoViewBrowserTestBase,
+      public ::testing::WithParamInterface<
+          std::tuple<TestFrameType, TestWritingMode, TestInvokeMethod>> {
+ public:
+  bool IsForceLocalFrames() const override {
+    return std::get<0>(GetParam()) == kLocalFrame;
+  }
+
+  bool IsWritingModeLTR() const override {
+    return std::get<1>(GetParam()) == kLTR;
+  }
+
+  TestInvokeMethod GetInvokeMethod() const override {
+    return std::get<2>(GetParam());
+  }
+
+  static std::string DescribeParams(
+      const testing::TestParamInfo<ParamType>& info) {
+    auto [frame_type_param, writing_mode_param, invoke_method_param] =
+        info.param;
+
+    std::string frame_type;
+    switch (frame_type_param) {
+      case kLocalFrame: {
+        frame_type = "LocalFrame";
+      } break;
+      case kRemoteFrame: {
+        frame_type = "RemoteFrame";
+      } break;
+    }
+
+    std::string writing_mode;
+    switch (writing_mode_param) {
+      case kLTR: {
+        writing_mode = "LTR";
+      } break;
+      case kRTL: {
+        writing_mode = "RTL";
+      } break;
+    }
+
+    std::string invoke_method;
+    switch (invoke_method_param) {
+      case kJavaScript: {
+        invoke_method = "JavaScript";
+      } break;
+      case kInputHandler: {
+        invoke_method = "ScrollFocusedEditableNodeIntoRect";
+      } break;
+      case kAuraOnScreenKeyboard: {
+        invoke_method = "AuraOnScreenKeyboard";
+      } break;
+    }
+
+    return base::StringPrintf("%s_%s_%s", frame_type.c_str(),
+                              writing_mode.c_str(), invoke_method.c_str());
+  }
+};
+
+// See comment in SetupTest for frame tree syntax.
+
+IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInSingleNestedFrame) {
+  ASSERT_TRUE(SetupTest("siteA(siteB)"));
+  RunTest();
+}
+
+IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInLocalRoot) {
+// Flaky on Mac ARM64. https://crbug.com/1323606
+#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
+  if (!IsForceLocalFrames())
+    return;
+#endif
+  ASSERT_TRUE(SetupTest("siteA(siteB(siteA))"));
+  RunTest();
+}
+
+IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInDoublyNestedFrame) {
+// Flaky on Mac ARM64. https://crbug.com/1323606
+#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
+  if (!IsForceLocalFrames())
+    return;
+#endif
+  ASSERT_TRUE(SetupTest("siteA(siteB(siteC))"));
+  RunTest();
+}
+
+IN_PROC_BROWSER_TEST_P(
+    ScrollIntoViewBrowserTest,
+    CrossesEditableInDoublyNestedFrameLocalAndRemoteBoundaries) {
+// Flaky on Mac ARM64. https://crbug.com/1323606
+#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
+  if (!IsForceLocalFrames())
+    return;
+#endif
+  ASSERT_TRUE(SetupTest("siteA(siteA(siteB(siteB)))"));
+  RunTest();
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    ScrollIntoViewBrowserTest,
+    testing::Combine(testing::Values(kLocalFrame, kRemoteFrame),
+                     testing::Values(kLTR, kRTL),
+                     // kAuraOnScreenKeyboard is intentionally omitted as it is
+                     // expected to be functionally equivalent to
+                     // kInputHandler.
+                     testing::Values(kJavaScript, kInputHandler)),
+    ScrollIntoViewBrowserTest::DescribeParams);
+
+#if defined(USE_AURA)
+
+// Tests viewport insetting as a result of keyboard insets. Insetting is only
+// used on Aura platforms. The OSK on Android resizes the entire view.
+class InsetScrollIntoViewBrowserTest
+    : public ScrollIntoViewBrowserTestBase,
+      public ::testing::WithParamInterface<TestFrameType> {
+ public:
+  bool IsForceLocalFrames() const override { return GetParam() == kLocalFrame; }
+  bool IsWritingModeLTR() const override { return true; }
+  TestInvokeMethod GetInvokeMethod() const override {
+    return kAuraOnScreenKeyboard;
+  }
+};
+
+// Ensure that insetting the viewport causes the visual viewport to be resized
+// and focused editable scrolled into view. (https://crbug.com/927483)
+IN_PROC_BROWSER_TEST_P(InsetScrollIntoViewBrowserTest,
+                       InsetsCauseScrollToFocusedEditable) {
+  ASSERT_TRUE(SetupTest("siteA(siteB(siteC))"));
+
+  // Allow some fuzziness due to scrollbar.
+  const int kScrollbarApprox = 20;
+  ASSERT_NEAR(600, GetVisualViewport().height, kScrollbarApprox);
+  ASSERT_NEAR(600, GetLayoutViewportRect().height(), kScrollbarApprox);
+  ASSERT_EQ(1.f, GetVisualViewport().scale);
+
+  RunTest();
+
+  // The visualViewport should have been insetted but not the root frame.
+  ASSERT_NEAR(200, GetVisualViewport().height, kScrollbarApprox);
+  ASSERT_NEAR(600, GetLayoutViewportRect().height(), kScrollbarApprox);
+  ASSERT_EQ(1.f, GetVisualViewport().scale);
+
+  ASSERT_LT(GetAcceptableCaretRect().bottom(), 200);
+}
+
+INSTANTIATE_TEST_SUITE_P(/* no prefix */,
+                         InsetScrollIntoViewBrowserTest,
+                         testing::Values(kLocalFrame, kRemoteFrame),
+                         DescribeFrameType);
+
+#endif
+
+// Only Chrome Android performs a zoom when focusing an editable.
+#if BUILDFLAG(IS_ANDROID)
+
+constexpr double kMobileMinimumScale = 0.25;
+
+// Tests zooming behaviors for ScrollFocusedEditableNodeIntoRect. These tests
+// runs only on Android since that's the only platorm that uses this behavior.
+class ZoomScrollIntoViewBrowserTest
+    : public ScrollIntoViewBrowserTestBase,
+      public ::testing::WithParamInterface<TestFrameType> {
+ public:
+  bool IsForceLocalFrames() const override { return GetParam() == kLocalFrame; }
+
+  bool IsWritingModeLTR() const override { return true; }
+
+  TestInvokeMethod GetInvokeMethod() const override { return kInputHandler; }
+};
+
+// A regular "desktop" site (i.e. no viewport <meta> tag) on Chrome Android
+// should zoom in on a focused editable so that it's legible.
+IN_PROC_BROWSER_TEST_P(ZoomScrollIntoViewBrowserTest, DesktopViewportMustZoom) {
+  ASSERT_TRUE(SetupTest("siteA(siteB)"));
+
+  EXPECT_EQ(kMobileMinimumScale, GetVisualViewport().scale);
+
+  RunTest();
+
+  // Without a viewport tag, the page is considered a "desktop" page so we
+  // should enable zooming to a legible scale.
+  EXPECT_NEAR(1, GetVisualViewport().scale, 0.05);
+}
+
+// Ensure that adding a `width=device-width` viewport <meta> tag disables the
+// zooming behavior so that "mobile-friendly" pages do not zoom in on input
+// boxes.
+IN_PROC_BROWSER_TEST_P(ZoomScrollIntoViewBrowserTest,
+                       ViewportMetaDisablesZoom) {
+  ASSERT_TRUE(SetupTest("siteA{ViewportMeta}(siteB)"));
+
+  EXPECT_EQ(kMobileMinimumScale, GetVisualViewport().scale);
+
+  RunTest();
+
+  // width=device-width must prevent the zooming behavior.
+  EXPECT_EQ(kMobileMinimumScale, GetVisualViewport().scale);
+}
+
+// Similar to above, an input in a touch-action region that disables pinch-zoom
+// shouldn't cause zoom since it may trap the user at that zoom level.
+IN_PROC_BROWSER_TEST_P(ZoomScrollIntoViewBrowserTest,
+                       TouchActionNoneDisablesZoom) {
+  ASSERT_TRUE(SetupTest("siteA(siteB{TouchActionNone})"));
+
+  EXPECT_EQ(kMobileMinimumScale, GetVisualViewport().scale);
+
+  RunTest();
+
+  // touch-action: none must prevent the zooming behavior since the user may
+  // not be able to zoom back out.
+  EXPECT_EQ(kMobileMinimumScale, GetVisualViewport().scale);
+}
+
+INSTANTIATE_TEST_SUITE_P(/* no prefix */,
+                         ZoomScrollIntoViewBrowserTest,
+                         testing::Values(kLocalFrame, kRemoteFrame),
+                         DescribeFrameType);
+#endif
+
+}  // namespace
+
+}  // namespace content
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index 80f0ed0..17d0e9a 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -2517,80 +2517,6 @@
                              blink::WebInputEvent::Type::kMouseWheel));
 }
 
-// Tests that touching an OOPIF editable element correctly resizes the
-// viewport and scrolls the element into view so that the element is not
-// occluded by the on screen keyboard (https://crbug.com/927483)
-IN_PROC_BROWSER_TEST_F(SitePerProcessHitTestBrowserTest,
-                       ScrollOOPIFEditableElement) {
-  GURL main_url(embedded_test_server()->GetURL(
-      "/frame_tree/oopif_form_scroll_main.html"));
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-
-  // It is safe to obtain the root frame tree node here, as it doesn't change.
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetPrimaryFrameTree()
-                            .root();
-  ASSERT_EQ(1U, root->child_count());
-
-  // Get the first iframe, which contains the editable element
-  FrameTreeNode* child_node = root->child_at(0);
-  GURL site_url(embedded_test_server()->GetURL(
-      "baz.com", "/frame_tree/page_with_editable_elements.html"));
-  ASSERT_EQ(site_url, child_node->current_url());
-
-  // Make sure the child frame is indeed a OOPIF
-  EXPECT_TRUE(child_node->current_frame_host()->IsCrossProcessSubframe());
-
-  // Set focus on an element in the OOPIF
-  EXPECT_TRUE(ExecJs(child_node->current_frame_host(),
-                     "document.getElementById('oopif_element').focus()"));
-  MainThreadFrameObserver observer(
-      root->current_frame_host()->GetRenderWidgetHost());
-  observer.Wait();
-  // We reset the scroll to 0,0 because setting focus on element
-  // will bring it into view
-  ASSERT_TRUE(ExecJs(root->current_frame_host(),
-                     base::StringPrintf("window.scrollTo(%d, %d);", 0, 0)));
-  content::RenderFrameSubmissionObserver root_frame_observer(root);
-  gfx::PointF zero_offset;
-  root_frame_observer.WaitForScrollOffset(zero_offset);
-
-  RenderWidgetHostViewChildFrame* child_render_widget_host_view_child_frame =
-      static_cast<RenderWidgetHostViewChildFrame*>(
-          child_node->current_frame_host()->GetRenderWidgetHost()->GetView());
-
-  RenderWidgetHostViewAura* parent_render_widget_host_aura =
-      static_cast<RenderWidgetHostViewAura*>(
-          child_render_widget_host_view_child_frame->GetRootView());
-
-  gfx::Size original_viewport_size =
-      parent_render_widget_host_aura->GetVisibleViewportSize();
-  int htmlScrollHeight = EvalJs(root->current_frame_host(),
-                                "document.documentElement.scrollHeight")
-                             .ExtractInt();
-  const int inset_height = 200;
-  parent_render_widget_host_aura->SetLastPointerType(
-      ui::EventPointerType::kTouch);
-  parent_render_widget_host_aura->SetInsets(
-      gfx::Insets::TLBR(0, 0, inset_height, 0));
-
-  // After focus on editable element, we expect element to be scrolled
-  // into view. Verify that the scroll offset on the root document
-  // matches a value that would make the OOPIF element visible.
-  // When a page is scrolled to the bottom
-  // window.scrollY == htmlScrollHeight - viewportHeight;
-  // Verify that setting insets scrolled to the bottom to make
-  // editable element visible.
-  gfx::PointF final_root_offset(
-      0, htmlScrollHeight - (original_viewport_size.height() - inset_height));
-  root_frame_observer.WaitForScrollOffset(final_root_offset);
-  EXPECT_EQ(EvalJs(root->current_frame_host(), "window.scrollY").ExtractInt(),
-            htmlScrollHeight - original_viewport_size.height());
-  // Viewport should be resized by keyboard height
-  EXPECT_NE(parent_render_widget_host_aura->GetVisibleViewportSize(),
-            original_viewport_size);
-}
-
 IN_PROC_BROWSER_TEST_F(SitePerProcessHitTestBrowserTest,
                        InputEventRouterWheelCoalesceTest) {
   GURL main_url(embedded_test_server()->GetURL(
diff --git a/content/browser/site_per_process_scroll_browsertest.cc b/content/browser/site_per_process_scroll_browsertest.cc
index 34738a2..31f762e 100644
--- a/content/browser/site_per_process_scroll_browsertest.cc
+++ b/content/browser/site_per_process_scroll_browsertest.cc
@@ -248,299 +248,6 @@
   }
 };
 
-// This test verifies that scrolling an element to view works across OOPIFs. The
-// testing methodology is based on measuring bounding client rect position of
-// nested <iframe>'s after the inner-most frame scrolls into view. The
-// measurements are for two identical pages where one page does not have any
-// OOPIFs while the other has some nested OOPIFs.
-// TODO(crbug.com/827431): This test is flaking on all platforms.
-IN_PROC_BROWSER_TEST_P(SitePerProcessProgrammaticScrollTest,
-                       DISABLED_ScrollElementIntoView) {
-  const GURL url_a(
-      embedded_test_server()->GetURL("a.com", kIframeOutOfViewHTML));
-  const GURL url_b(
-      embedded_test_server()->GetURL("b.com", kIframeOutOfViewHTML));
-  const GURL url_c(
-      embedded_test_server()->GetURL("c.com", kIframeOutOfViewHTML));
-
-  // Number of <iframe>'s which will not be empty. The actual frame tree has two
-  // more nodes one for root and one for the inner-most empty <iframe>.
-  const size_t kNonEmptyIframesCount = 5;
-  const std::string kScrollIntoViewScript =
-      "document.body.scrollIntoView({'behavior' : 'instant'});";
-  const int kRectDimensionErrorTolerance = 0;
-
-  // First, recursively set the |scrollTop| and |scrollLeft| of |document.body|
-  // to its maximum and then navigate the <iframe> to |url_a|. The page will be
-  // structured as a(a(a(a(a(a(a)))))) where the inner-most <iframe> is empty.
-  ASSERT_TRUE(NavigateToURL(shell(), url_a));
-  FrameTreeNode* node = web_contents()->GetPrimaryFrameTree().root();
-  WaitForOnLoad(node);
-  std::vector<gfx::Rect> reference_page_bounds_before_scroll = {
-      GetBoundingClientRect(node->current_frame_host(), kIframeSelector)};
-  node = node->child_at(0);
-  for (size_t index = 0; index < kNonEmptyIframesCount; ++index) {
-    EXPECT_TRUE(NavigateToURLFromRenderer(node, url_a));
-    WaitForOnLoad(node);
-    // Store |document.querySelector('iframe').getBoundingClientRect()|.
-    reference_page_bounds_before_scroll.push_back(
-        GetBoundingClientRect(node->current_frame_host(), kIframeSelector));
-    node = node->child_at(0);
-  }
-  // Sanity-check: If the page is setup properly then all the <iframe>s should
-  // be out of view and their bounding rect should not intersect with the
-  // positive XY plane.
-  for (const auto& rect : reference_page_bounds_before_scroll)
-    ASSERT_FALSE(rect.Intersects(kPositiveXYPlane));
-  // Now scroll the inner-most frame into view.
-  ASSERT_TRUE(ExecJs(node, kScrollIntoViewScript));
-  // Store current client bounds origins to later compare against those from the
-  // page which contains OOPIFs.
-  node = web_contents()->GetPrimaryFrameTree().root();
-  std::vector<gfx::Rect> reference_page_bounds_after_scroll = {
-      GetBoundingClientRect(node->current_frame_host(), kIframeSelector)};
-  node = node->child_at(0);
-  for (size_t index = 0; index < kNonEmptyIframesCount; ++index) {
-    reference_page_bounds_after_scroll.push_back(
-        GetBoundingClientRect(node->current_frame_host(), kIframeSelector));
-    node = node->child_at(0);
-  }
-
-  // Repeat the same process for the page containing OOPIFs. The page is
-  // structured as b(b(a(c(a(a(a)))))) where the inner-most <iframe> is empty.
-  ASSERT_TRUE(NavigateToURL(shell(), url_b));
-  node = web_contents()->GetPrimaryFrameTree().root();
-  WaitForOnLoad(node);
-  std::vector<gfx::Rect> test_page_bounds_before_scroll = {
-      GetBoundingClientRect(node->current_frame_host(), kIframeSelector)};
-  const GURL iframe_urls[] = {url_b, url_a, url_c, url_a, url_a};
-  node = node->child_at(0);
-  for (const auto& iframe_url : iframe_urls) {
-    EXPECT_TRUE(NavigateToURLFromRenderer(node, iframe_url));
-    WaitForOnLoad(node);
-    test_page_bounds_before_scroll.push_back(
-        GetBoundingClientRect(node->current_frame_host(), kIframeSelector));
-    node = node->child_at(0);
-  }
-  // Sanity-check: The bounds should match those from non-OOPIF page.
-  for (size_t index = 0; index < kNonEmptyIframesCount; ++index) {
-    ASSERT_TRUE(test_page_bounds_before_scroll[index].ApproximatelyEqual(
-        reference_page_bounds_before_scroll[index],
-        kRectDimensionErrorTolerance));
-  }
-  // Scroll the inner most OOPIF.
-  ASSERT_TRUE(ExecJs(node, kScrollIntoViewScript));
-  // Now traverse the chain bottom to top and verify the bounds match for each
-  // <iframe>.
-  int index = kNonEmptyIframesCount;
-  RenderFrameHostImpl* current_rfh = node->current_frame_host()->GetParent();
-  while (current_rfh) {
-    gfx::Rect current_bounds =
-        GetBoundingClientRect(current_rfh, kIframeSelector);
-    gfx::Rect reference_bounds = reference_page_bounds_after_scroll[index];
-    if (current_bounds.ApproximatelyEqual(reference_bounds,
-                                          kRectDimensionErrorTolerance)) {
-      current_rfh = current_rfh->GetParent();
-      --index;
-    } else {
-      base::RunLoop run_loop;
-      base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-          FROM_HERE, run_loop.QuitClosure(), TestTimeouts::tiny_timeout());
-      run_loop.Run();
-    }
-  }
-}
-
-// This test verifies that ScrollFocusedEditableElementIntoView works correctly
-// for OOPIFs. Essentially, the test verifies that in a similar setup, the
-// resultant page scale factor is the same for OOPIF and non-OOPIF cases. This
-// also verifies that in response to the scroll command, the root-layer scrolls
-// correctly and the <input> is visible in visual viewport.
-#if BUILDFLAG(IS_ANDROID)
-// crbug.com/793616
-#define MAYBE_ScrollFocusedEditableElementIntoView \
-  DISABLED_ScrollFocusedEditableElementIntoView
-#else
-#define MAYBE_ScrollFocusedEditableElementIntoView \
-  ScrollFocusedEditableElementIntoView
-#endif
-IN_PROC_BROWSER_TEST_P(SitePerProcessProgrammaticScrollTest,
-                       MAYBE_ScrollFocusedEditableElementIntoView) {
-  GURL url_a(embedded_test_server()->GetURL("a.com", kIframeOutOfViewHTML));
-  GURL url_b(embedded_test_server()->GetURL("b.com", kIframeOutOfViewHTML));
-
-#if BUILDFLAG(IS_ANDROID)
-  // The reason for Android specific code is that
-  // AutoZoomFocusedEditableToLegibleScale is in blink's WebSettings and
-  // difficult to access from here. It so happens that the setting is on for
-  // Android.
-  // TODO(bokan): This is accessible now but this test will soon be replaced.
-  // crbug.com/1296183.
-
-  // A lower bound on the ratio of page scale factor after scroll. The actual
-  // value depends on minReadableCaretHeight / caret_bounds.Height(). The page
-  // is setup so caret height is quite small so the expected scale should be
-  // larger than 2.0.
-  float kLowerBoundOnScaleAfterScroll = 2.0;
-  float kEpsilon = 0.1;
-#endif
-
-  ASSERT_TRUE(NavigateToURL(shell(), url_a));
-  FrameTreeNode* root = web_contents()->GetPrimaryFrameTree().root();
-  WaitForOnLoad(root);
-  EXPECT_TRUE(NavigateToURLFromRenderer(root->child_at(0), url_a));
-  WaitForOnLoad(root->child_at(0));
-#if BUILDFLAG(IS_ANDROID)
-  float scale_before_scroll_nonoopif = GetVisualViewportScale(root);
-#endif
-  AddFocusedInputField(root->child_at(0));
-  // Focusing <input> causes scrollIntoView(). The following line makes sure
-  // that the <iframe> is out of view again.
-  SetWindowScroll(root, 0, 0);
-  ASSERT_FALSE(GetVisualViewport(root).Intersects(
-      GetBoundingClientRect(root->current_frame_host(), kIframeSelector)));
-  root->child_at(0)
-      ->current_frame_host()
-      ->GetRenderWidgetHost()
-      ->GetFrameWidgetInputHandler()
-      ->ScrollFocusedEditableNodeIntoRect(gfx::Rect());
-  WaitForElementVisible(root, kIframeSelector);
-#if BUILDFLAG(IS_ANDROID)
-  float scale_after_scroll_nonoopif = GetVisualViewportScale(root);
-  // Increased scale means zoom triggered correctly.
-  EXPECT_GT(scale_after_scroll_nonoopif - scale_before_scroll_nonoopif,
-            kEpsilon);
-  EXPECT_GT(scale_after_scroll_nonoopif, kLowerBoundOnScaleAfterScroll);
-#endif
-
-  // Retry the test on an OOPIF page.
-  Shell* new_shell = CreateBrowser();
-  ASSERT_TRUE(NavigateToURL(new_shell, url_b));
-  root = static_cast<WebContentsImpl*>(new_shell->web_contents())
-             ->GetPrimaryFrameTree()
-             .root();
-  WaitForOnLoad(root);
-#if BUILDFLAG(IS_ANDROID)
-  float scale_before_scroll_oopif = GetVisualViewportScale(root);
-  // Sanity-check:
-  ASSERT_NEAR(scale_before_scroll_oopif, scale_before_scroll_nonoopif,
-              kEpsilon);
-#endif
-  EXPECT_TRUE(NavigateToURLFromRenderer(root->child_at(0), url_a));
-  WaitForOnLoad(root->child_at(0));
-  AddFocusedInputField(root->child_at(0));
-  SetWindowScroll(root, 0, 0);
-  ASSERT_FALSE(GetVisualViewport(root).Intersects(
-      GetBoundingClientRect(root->current_frame_host(), kIframeSelector)));
-  root->child_at(0)
-      ->current_frame_host()
-      ->GetRenderWidgetHost()
-      ->GetFrameWidgetInputHandler()
-      ->ScrollFocusedEditableNodeIntoRect(gfx::Rect());
-  WaitForElementVisible(root, kIframeSelector);
-#if BUILDFLAG(IS_ANDROID)
-  float scale_after_scroll_oopif = GetVisualViewportScale(root);
-  EXPECT_GT(scale_after_scroll_oopif - scale_before_scroll_oopif, kEpsilon);
-  EXPECT_GT(scale_after_scroll_oopif, kLowerBoundOnScaleAfterScroll);
-  // The scale is based on the caret height and it should be the same in both
-  // OOPIF and non-OOPIF pages.
-  EXPECT_NEAR(scale_after_scroll_oopif, scale_after_scroll_nonoopif, kEpsilon);
-#endif
-  // Make sure the <input> is at least partly visible in the |visualViewport|.
-  gfx::Rect final_visual_viewport_oopif = GetVisualViewport(root);
-  gfx::Rect iframe_bounds_after_scroll_oopif =
-      GetBoundingClientRect(root->current_frame_host(), kIframeSelector);
-  gfx::Rect input_bounds_after_scroll_oopif = GetBoundingClientRect(
-      root->child_at(0)->current_frame_host(), kInputSelector);
-  input_bounds_after_scroll_oopif +=
-      iframe_bounds_after_scroll_oopif.OffsetFromOrigin();
-  ASSERT_TRUE(
-      final_visual_viewport_oopif.Intersects(input_bounds_after_scroll_oopif));
-}
-
-// Failing on Android, see crbug.com/1246843
-// Flaky on Mac, see crbug.com/1156657
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC)
-#define MAYBE_ScrollClippedFocusedEditableElementIntoView \
-  DISABLED_ScrollClippedFocusedEditableElementIntoView
-#else
-#define MAYBE_ScrollClippedFocusedEditableElementIntoView \
-  ScrollClippedFocusedEditableElementIntoView
-#endif
-IN_PROC_BROWSER_TEST_P(SitePerProcessProgrammaticScrollTest,
-                       MAYBE_ScrollClippedFocusedEditableElementIntoView) {
-  GURL url_a(embedded_test_server()->GetURL("a.com", kIframeClippedHTML));
-  GURL child_url_b(embedded_test_server()->GetURL("b.com", kInputBoxHTML));
-
-  ASSERT_TRUE(NavigateToURL(shell(), url_a));
-  FrameTreeNode* root = web_contents()->GetPrimaryFrameTree().root();
-  WaitForOnLoad(root);
-  EXPECT_TRUE(NavigateToURLFromRenderer(root->child_at(0), child_url_b));
-  WaitForOnLoad(root->child_at(0));
-
-  SetWindowScroll(root, 0, 0);
-  SetWindowScroll(root->child_at(0), 1000, 2000);
-
-  float scale_before = GetVisualViewportScale(root);
-
-  // The input_box page focuses the input box on load. This call should
-  // simulate the scroll into view we do when an input box is tapped.
-  root->child_at(0)
-      ->current_frame_host()
-      ->GetRenderWidgetHost()
-      ->GetFrameWidgetInputHandler()
-      ->ScrollFocusedEditableNodeIntoRect(gfx::Rect());
-
-  // The scroll into view is animated on the compositor. Make sure we wait
-  // until that's completed before testing the rects.
-  WaitForElementVisible(root, kIframeSelector);
-  WaitForViewportToStabilize(root);
-
-  // These rects are in the coordinate space of the root frame.
-  gfx::Rect visual_viewport_rect = GetVisualViewport(root);
-  gfx::Rect window_rect =
-      GetBoundingClientRect(root->current_frame_host(), ":root");
-  gfx::Rect iframe_rect =
-      GetBoundingClientRect(root->current_frame_host(), "iframe");
-  gfx::Rect clip_rect =
-      GetBoundingClientRect(root->current_frame_host(), "#clip");
-
-  // This is in the coordinate space of the iframe, we'll add the iframe offset
-  // after to put it into the root frame's coordinate space.
-  gfx::Rect input_rect =
-      GetBoundingClientRect(root->child_at(0)->current_frame_host(), "input");
-
-  // Make sure the input rect is visible in the iframe.
-  EXPECT_TRUE(gfx::Rect(iframe_rect.size()).Intersects(input_rect))
-      << "Input box [" << input_rect.ToString() << "] isn't visible in iframe ["
-      << gfx::Rect(iframe_rect.size()).ToString() << "]";
-
-  input_rect += iframe_rect.OffsetFromOrigin();
-
-  // Make sure the input rect is visible through the clipping layer.
-  EXPECT_TRUE(clip_rect.Intersects(input_rect))
-      << "Input box [" << input_rect.ToString() << "] isn't scrolled into view "
-      << "of the clipping layer [" << clip_rect.ToString() << "]";
-
-  // And finally, it should be visible in the layout and visual viewports.
-  EXPECT_TRUE(window_rect.Intersects(input_rect))
-      << "Input box [" << input_rect.ToString() << "] isn't visible in the "
-      << "layout viewport [" << window_rect.ToString() << "]";
-  EXPECT_TRUE(visual_viewport_rect.Intersects(input_rect))
-      << "Input box [" << input_rect.ToString() << "] isn't visible in the "
-      << "visual viewport [" << visual_viewport_rect.ToString() << "]";
-
-  float scale_after = GetVisualViewportScale(root);
-
-// Make sure we still zoom in on the input box on platforms that zoom into the
-// focused editable.
-#if BUILDFLAG(IS_ANDROID)
-  EXPECT_GT(scale_after, scale_before);
-#else
-  EXPECT_FLOAT_EQ(scale_after, scale_before);
-#endif
-}
-
 IN_PROC_BROWSER_TEST_P(SitePerProcessProgrammaticScrollTest,
                        ScrolledOutOfView) {
   GURL main_frame(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 955e757..435d1e7 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4515,6 +4515,9 @@
 }
 
 TextInputManager* WebContentsImpl::GetTextInputManager() {
+  if (suppress_ime_events_for_testing_)
+    return nullptr;
+
   if (GetOuterWebContents())
     return GetOuterWebContents()->GetTextInputManager();
 
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 4c66ff7..2bc77e9 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -1305,6 +1305,10 @@
   bool CancelPrerendering(FrameTreeNode* frame_tree_node,
                           PrerenderHost::FinalStatus final_status);
 
+  void set_suppress_ime_events_for_testing(bool suppress) {
+    suppress_ime_events_for_testing_ = suppress;
+  }
+
  private:
   using FrameTreeIterationCallback = base::RepeatingCallback<void(FrameTree*)>;
   using RenderViewHostIterationCallback =
@@ -2158,6 +2162,11 @@
   // by the TextInputManager in the outer WebContents.
   std::unique_ptr<TextInputManager> text_input_manager_;
 
+  // Tests can set this to true in order to force this web contents to always
+  // return nullptr for the above `text_input_manager_`, effectively blocking
+  // IME events from propagating out of the renderer.
+  bool suppress_ime_events_for_testing_ = false;
+
   // Stores the RenderWidgetHost that currently holds a mouse lock or nullptr if
   // there's no RenderWidgetHost holding a lock.
   raw_ptr<RenderWidgetHostImpl> mouse_lock_widget_ = nullptr;
diff --git a/content/renderer/accessibility/ax_tree_distiller.cc b/content/renderer/accessibility/ax_tree_distiller.cc
index 3143e6f6..6574da5f 100644
--- a/content/renderer/accessibility/ax_tree_distiller.cc
+++ b/content/renderer/accessibility/ax_tree_distiller.cc
@@ -130,8 +130,10 @@
   snapshot_ = std::make_unique<ui::AXTreeUpdate>();
 
   // Get page contents (via snapshot of a11y tree) for reader generation.
+  // |ui::AXMode::kHTML| is needed for URL information.
   // |ui::AXMode::kScreenReader| is needed for heading level information.
-  ui::AXMode ax_mode = ui::AXMode::kWebContents | ui::AXMode::kScreenReader;
+  ui::AXMode ax_mode =
+      ui::AXMode::kWebContents | ui::AXMode::kHTML | ui::AXMode::kScreenReader;
   AXTreeSnapshotterImpl snapshotter(render_frame_, ax_mode);
   snapshotter.Snapshot(
       /* exclude_offscreen= */ false, kMaxNodes,
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index e4ed8e21..3927479 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1316,6 +1316,7 @@
     "../browser/renderer_host/render_widget_host_view_aura_vk_browsertest.cc",
     "../browser/renderer_host/render_widget_host_view_browsertest.cc",
     "../browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc",
+    "../browser/renderer_host/scroll_into_view_browsertest.cc",
     "../browser/renderer_host/sec_fetch_browsertest.cc",
     "../browser/renderer_host/unassigned_site_instance_browsertest.cc",
     "../browser/resource_loading_browsertest.cc",
diff --git a/content/test/data/accessibility/html/popup-api-expected-blink.txt b/content/test/data/accessibility/html/popup-api-expected-blink.txt
new file mode 100644
index 0000000..03e77de
--- /dev/null
+++ b/content/test/data/accessibility/html/popup-api-expected-blink.txt
@@ -0,0 +1,57 @@
+rootWebArea
+++genericContainer ignored
+++++genericContainer ignored
+++++++genericContainer ignored invisible
+++++++++staticText ignored name='Div popup'
+++++++listBox ignored invisible
+++++++++genericContainer ignored invisible
+++++++++++staticText ignored name='Listbox role on ul'
+++++++listBox ignored invisible
+++++++++genericContainer ignored invisible
+++++++++++staticText ignored name='Listbox role on ul'
+++++++details ignored invisible
+++++++button collapsed name='Button pointing to hidden popup'
+++++++++staticText name='Button pointing to hidden popup'
+++++++++++inlineTextBox name='Button pointing to hidden popup'
+++++++genericContainer ignored invisible
+++++++++staticText ignored name='Popup'
+++++++button name='Show button pointing to hidden hint'
+++++++++staticText name='Show button pointing to hidden hint'
+++++++++++inlineTextBox name='Show button pointing to hidden hint'
+++++++genericContainer ignored invisible
+++++++++staticText ignored name='Hint'
+++++++button name='Hide button pointing to hidden async'
+++++++++staticText name='Hide button pointing to hidden async'
+++++++++++inlineTextBox name='Hide button pointing to hidden async'
+++++++genericContainer ignored invisible
+++++++++staticText ignored name='Async'
+++++++button name='Button pointing to showing popup'
+++++++++staticText name='Button pointing to showing popup'
+++++++++++inlineTextBox name='Button pointing to showing popup'
+++++++button name='Show button pointing to showing hint'
+++++++++staticText name='Show button pointing to showing hint'
+++++++++++inlineTextBox name='Show button pointing to showing hint'
+++++++genericContainer
+++++++++staticText name='Popup'
+++++++++++inlineTextBox name='Popup'
+++++++++genericContainer
+++++++++++staticText name='Hint (nested)'
+++++++++++++inlineTextBox name='Hint (nested)'
+++++++button name='Hide button pointing to showing async'
+++++++++staticText name='Hide button pointing to showing async'
+++++++++++inlineTextBox name='Hide button pointing to showing async'
+++++++genericContainer
+++++++++staticText name='Async'
+++++++++++inlineTextBox name='Async'
+++++++button name='Button pointing to non-popup'
+++++++++staticText name='Button pointing to non-popup'
+++++++++++inlineTextBox name='Button pointing to non-popup'
+++++++genericContainer
+++++++++staticText name='No popup attribute'
+++++++++++inlineTextBox name='No popup attribute'
+++++++button name='Button pointing to invalid popup value'
+++++++++staticText name='Button pointing to invalid popup value'
+++++++++++inlineTextBox name='Button pointing to invalid popup value'
+++++++genericContainer
+++++++++staticText name='Invalid popup attribute value'
+++++++++++inlineTextBox name='Invalid popup attribute value'
diff --git a/content/test/data/accessibility/html/popup-api.html b/content/test/data/accessibility/html/popup-api.html
new file mode 100644
index 0000000..7cc493c2
--- /dev/null
+++ b/content/test/data/accessibility/html/popup-api.html
@@ -0,0 +1,33 @@
+<html>
+<body>
+<div popup=popup>Div popup</div>
+<ul popup=popup role=listbox><li>Listbox role on ul</li></ul>
+<ul popup=popup role=listbox><li>Listbox role on ul</li></ul>
+<details popup=popup><summary>summary/details popup</summary></details>
+
+<button togglepopup=popup1>Button pointing to hidden popup</button>
+<div popup=popup id=popup1>Popup</div>
+<button showpopup=hint1>Show button pointing to hidden hint</button>
+<div popup=hint id=hint1>Hint</div>
+<button hidepopup=async1>Hide button pointing to hidden async</button>
+<div popup=async id=async1>Async</div>
+
+<button togglepopup=popup2>Button pointing to showing popup</button>
+<button showpopup=hint2>Show button pointing to showing hint</button>
+<div popup=popup id=popup2>Popup
+  <div popup=hint id=hint2>Hint (nested)</div>
+</div>
+<button hidepopup=async2>Hide button pointing to showing async</button>
+<div popup=async id=async2>Async</div>
+<script>
+  popup2.showPopup();
+  hint2.showPopup();
+  async2.showPopup();
+</script>
+
+<button togglepopup=noattr>Button pointing to non-popup</button>
+<div id=noattr>No popup attribute</div>
+<button togglepopup=badattr>Button pointing to invalid popup value</button>
+<div id=badattr popup=invalid_value>Invalid popup attribute value</div>
+</body>
+</html>
diff --git a/content/test/data/cross_site_scroll_into_view_factory.html b/content/test/data/cross_site_scroll_into_view_factory.html
new file mode 100644
index 0000000..702918e3
--- /dev/null
+++ b/content/test/data/cross_site_scroll_into_view_factory.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html>
+<html>
+<!-- This file is based on cross_site_iframe_factory.html. See comments in that
+file as well as tree_parser_util.js for more details and syntax information.
+
+This page creates a nested, non-branching, frame tree with each iframe being
+fully outside of its embedder's initial viewport. The inner-most frame will
+create a <input> box, also outside the frame's initial viewport.
+
+The following attributes on frames are supported:
+
+  RTL: Make's a frame's document "dir=rtl" to support testing right-to-left
+       writing modes.
+
+  ViewportMeta: Adds a viewport meta tag to a frame, making it "mobile
+        friendly". This occurs for subframes as well but only has an effect in
+        the root frame.
+
+  TouchActionNone: Adds a `touch-action: none` style to the inner-most frame's
+                   <input> box. No-op in other frames.
+
+For example:
+
+  siteA{ViewportMeta,RTL}(siteB(siteC{TouchActionNone}))
+
+ -->
+<head>
+<title>Cross-site scroll-into-view iframe factory</title>
+<style>
+  html,body {
+    width: 100%;
+    height: 100%;
+  }
+  iframe {
+    position: absolute;
+    /* 4 screens worth of inset, to make sure this is off screen on Android
+     * where minimum scale on load is 0.25 */
+    inset-inline-start: 400%;
+    inset-block-start: 400%;
+    width: 60%;
+    height: 60%;
+  }
+  input {
+    position: absolute;
+    inset-inline-start: 400%;
+    inset-block-start: 400%;
+    width: 50%;
+  }
+  .spacer {
+    /* make the document scrollable */
+    position: absolute;
+    inset-inline-start: 0;
+    inset-block-start: 0;
+    width: 1200%;
+    height: 1200%;
+  }
+
+  .touchActionNone {
+    touch-action: none;
+  }
+
+  .layoutViewport {
+    /* Used to let the test measure the size of the layout viewport; needed when
+     * testing desktop page on mobile where ICB size doesn't match layout
+     * viewport size (i.e. the "shrinks viewport contents to fit" setting) */
+    position: fixed;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    visibility: hidden;
+  }
+</style>
+</head>
+<body>
+<div class="layoutViewport"></div>
+<h2 id='siteNameHeading'></h2>
+<div class="spacer"></div>
+
+
+<script src='tree_parser_util.js'></script>
+<script>
+
+function backgroundColorForSite(site) {
+  var lightness = 0.75;
+
+  // The site names will be of the form siteA, siteB, etc so map the fifth
+  // character to an index. This could be negative, we don't really care.
+  var index = site.charCodeAt(4) - 'a'.charCodeAt(0);
+
+  // If the first character is 'a', this will the the starting color.
+  var hueOfA = 200;  // Spoiler alert: it's blue.
+
+  // Color palette generation articles suggest that spinning the hue wheel by
+  // the golden ratio yields a magically nice color distribution. Something
+  // about sunflower seeds. I am skeptical of the rigor of that claim (probably
+  // any irrational number at a slight offset from 2/3 would do) but it does
+  // look pretty.
+  var phi = 2 / (1 + Math.pow(5, .5));
+  var hue = Math.round((360 * index * phi + hueOfA) % 360);
+  return 'hsl(' + hue + ', 60%, ' + Math.round(100 * lightness) + '%)';
+}
+
+function isUrl(siteString) {
+  try {
+    var url = new URL(siteString);
+  } catch (e) {
+    if (e instanceof TypeError)
+      return false;
+  }
+  return true;
+}
+
+/**
+ * Extract the specified port number, if any. Returns empty string if not
+ * specified.
+ */
+function sitePortNumber(siteString) {
+  let index = siteString.indexOf(':');
+  if (index == -1)
+    return ""
+  return siteString.substring(index + 1);
+}
+
+/**
+ * Adds ".com" to an argument if it doesn't already have a top level domain.
+ * This cuts down on noise in the query string, letting you use single-letter
+ * names. Adds the specified port number, if any, or the default port otherwise.
+ */
+function canonicalizeSiteAndPort(siteString, defaultPort) {
+  var portNumber = sitePortNumber(siteString) || defaultPort;
+  var hostName = siteString.split(':')[0];
+  if (hostName !== "localhost" && hostName.indexOf('.') == -1)
+    hostName = hostName + '.com';
+  return hostName + (portNumber ? ':' + portNumber : "");
+}
+
+// Attributes:
+//
+// {RTL} - Applies `dir="rtl"` to a frame that has this attribute, making it a
+//         right-to-left writing mode.
+function shouldApplyRTL(attributes) {
+  for (var attribute of attributes) {
+    if (attribute == "RTL") {
+      return true;
+    }
+  }
+  return false;
+}
+
+// {ViewportMeta} - Adds <meta name="viewport" width="device-width"> to a frame
+//                  that has this attribute, making it a mobile friendly page.
+function shouldApplyViewportMeta(attributes) {
+  for (var attribute of attributes) {
+    if (attribute == "ViewportMeta") {
+      return true;
+    }
+  }
+  return false;
+}
+
+// {TouchActionNone} - Adds a `touch-action: none` style to the inner-most
+//                     frame's input. No-op on other frames.
+function shouldApplyTouchActionNone(attributes) {
+  for (var attribute of attributes) {
+    if (attribute == "TouchActionNone") {
+      return true;
+    }
+  }
+  return false;
+}
+
+function main() {
+  var goCrossSite = !window.location.protocol.startsWith('file');
+  var queryString = decodeURIComponent(window.location.search.substring(1));
+  var frameTree = TreeParserUtil.parse(queryString);
+  var currentSite = isUrl(frameTree.value)
+                      ? frameTree.value
+                      : canonicalizeSiteAndPort(frameTree.value, "");
+
+  if (shouldApplyRTL(frameTree.attributes)) {
+    document.documentElement.setAttribute('dir', 'rtl')
+  }
+
+  if (shouldApplyViewportMeta(frameTree.attributes)) {
+    const meta = document.createElement("meta");
+    meta.setAttribute("name", "viewport");
+    meta.setAttribute("content", "width=device-width");
+    document.head.appendChild(meta);
+  }
+
+  document.getElementById('siteNameHeading').appendChild(
+      document.createTextNode(currentSite));
+
+  // Apply style to the current document.
+  document.body.style.backgroundColor = backgroundColorForSite(currentSite);
+
+  if (frameTree.children.length == 0) {
+    let input = document.createElement('input');
+
+    if (shouldApplyTouchActionNone(frameTree.attributes))
+      input.classList.add('touchActionNone');
+
+    document.body.appendChild(input);
+
+    return;
+  }
+
+  // ScrollIntoView tests don't need multiple children and we don't support it.
+  console.assert(frameTree.children.length == 1);
+
+  // Compute the URL for this iframe.
+  let url = frameTree.children[0].value;
+  let siteAndPort = url;
+  if (!isUrl(url)) {
+    siteAndPort = canonicalizeSiteAndPort(url, window.location.port);
+    const subtreeString = TreeParserUtil.flatten(frameTree.children[0]);
+    url = '';
+    url += window.location.protocol + '//';              // scheme (preserved)
+    url += goCrossSite ? siteAndPort : window.location.host;    // host and port
+    url += window.location.pathname;                     // path (preserved)
+    url += '?' + encodeURIComponent(subtreeString);      // query
+  }
+
+  // Construct the iframe.
+  var iframe = document.createElement('iframe');
+  iframe.src = url;
+  iframe.id = "child";
+
+  // Add the iframe to the document.
+  document.body.appendChild(iframe);
+}
+
+main();
+</script>
+</body></html>
diff --git a/content/test/data/gpu/third_party/stats-js/LICENSE b/content/test/data/gpu/third_party/stats-js/LICENSE
new file mode 100644
index 0000000..d3f2e9b
--- /dev/null
+++ b/content/test/data/gpu/third_party/stats-js/LICENSE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2009-2016 stats.js authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/content/test/data/gpu/third_party/stats-js/README.chromium b/content/test/data/gpu/third_party/stats-js/README.chromium
new file mode 100644
index 0000000..b103a59
--- /dev/null
+++ b/content/test/data/gpu/third_party/stats-js/README.chromium
@@ -0,0 +1,13 @@
+Name: JavaScript Performance Monitor
+Short Name: stats.js
+URL: https://github.com/mrdoob/stats.js/
+Version: r17
+Date: 20220405
+Revision: 1ecb62cd10f30789b540dcdbbd473f1de6eed614
+Security Critical: no
+License: MIT
+License File: NOT_SHIPPED
+
+Description:
+  This package provides a simple info box that will help you monitor your code
+  performance.
diff --git a/content/test/data/gpu/third_party/stats-js/stats.js b/content/test/data/gpu/third_party/stats-js/stats.js
new file mode 100644
index 0000000..4875f72
--- /dev/null
+++ b/content/test/data/gpu/third_party/stats-js/stats.js
@@ -0,0 +1,179 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+	typeof define === 'function' && define.amd ? define(factory) :
+	(global.Stats = factory());
+}(this, (function () { 'use strict';
+
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+var Stats = function () {
+
+	var mode = 0;
+
+	var container = document.createElement( 'div' );
+	container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';
+	container.addEventListener( 'click', function ( event ) {
+
+		event.preventDefault();
+		showPanel( ++ mode % container.children.length );
+
+	}, false );
+
+	//
+
+	function addPanel( panel ) {
+
+		container.appendChild( panel.dom );
+		return panel;
+
+	}
+
+	function showPanel( id ) {
+
+		for ( var i = 0; i < container.children.length; i ++ ) {
+
+			container.children[ i ].style.display = i === id ? 'block' : 'none';
+
+		}
+
+		mode = id;
+
+	}
+
+	//
+
+	var beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;
+
+	var fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );
+	var msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );
+
+	if ( self.performance && self.performance.memory ) {
+
+		var memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );
+
+	}
+
+	showPanel( 0 );
+
+	return {
+
+		REVISION: 16,
+
+		dom: container,
+
+		addPanel: addPanel,
+		showPanel: showPanel,
+
+		begin: function () {
+
+			beginTime = ( performance || Date ).now();
+
+		},
+
+		end: function () {
+
+			frames ++;
+
+			var time = ( performance || Date ).now();
+
+			msPanel.update( time - beginTime, 200 );
+
+			if ( time >= prevTime + 1000 ) {
+
+				fpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );
+
+				prevTime = time;
+				frames = 0;
+
+				if ( memPanel ) {
+
+					var memory = performance.memory;
+					memPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );
+
+				}
+
+			}
+
+			return time;
+
+		},
+
+		update: function () {
+
+			beginTime = this.end();
+
+		},
+
+		// Backwards Compatibility
+
+		domElement: container,
+		setMode: showPanel
+
+	};
+
+};
+
+Stats.Panel = function ( name, fg, bg ) {
+
+	var min = Infinity, max = 0, round = Math.round;
+	var PR = round( window.devicePixelRatio || 1 );
+
+	var WIDTH = 80 * PR, HEIGHT = 48 * PR,
+			TEXT_X = 3 * PR, TEXT_Y = 2 * PR,
+			GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,
+			GRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;
+
+	var canvas = document.createElement( 'canvas' );
+	canvas.width = WIDTH;
+	canvas.height = HEIGHT;
+	canvas.style.cssText = 'width:80px;height:48px';
+
+	var context = canvas.getContext( '2d' );
+	context.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';
+	context.textBaseline = 'top';
+
+	context.fillStyle = bg;
+	context.fillRect( 0, 0, WIDTH, HEIGHT );
+
+	context.fillStyle = fg;
+	context.fillText( name, TEXT_X, TEXT_Y );
+	context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );
+
+	context.fillStyle = bg;
+	context.globalAlpha = 0.9;
+	context.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );
+
+	return {
+
+		dom: canvas,
+
+		update: function ( value, maxValue ) {
+
+			min = Math.min( min, value );
+			max = Math.max( max, value );
+
+			context.fillStyle = bg;
+			context.globalAlpha = 1;
+			context.fillRect( 0, 0, WIDTH, GRAPH_Y );
+			context.fillStyle = fg;
+			context.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );
+
+			context.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );
+
+			context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );
+
+			context.fillStyle = bg;
+			context.globalAlpha = 0.9;
+			context.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );
+
+		}
+
+	};
+
+};
+
+return Stats;
+
+})));
diff --git a/content/test/data/gpu/vc/README.md b/content/test/data/gpu/vc/README.md
index 4fa9c19..6a0e594 100644
--- a/content/test/data/gpu/vc/README.md
+++ b/content/test/data/gpu/vc/README.md
@@ -1,8 +1,9 @@
 # GPU Demo for Video Conferencing Simulation
 
 The demo files display MxN videos with a small rectangle (UI) on top of each
-video. A small video simulating the image from the local camera is displays at
-the top right corner.
+video, and 2 FPS panels to respectively indicate the whole page and the average
+video refreshment rates. A small video simulating the image from the local
+camera is displayed at the top right corner.
 
 
 ## Configurations
@@ -24,6 +25,11 @@
 Video elements are played through the default web media player. The UI are added
 with CSS icons.
 
+### webgl_videos_mxn.html
+  PLEASE RUN http-server TO SERVE THIS DEMO, OTHERWISE THIS DEMO WILL NOT START.
+The image of each video frame is uploaded and rendered by WebGL. The UI is also
+rendered by WebGL. The demo uses texImage2D API to copy the video textures into GPU.
+
 ### webgpu_videos_mxn.html
   PLEASE RUN http-server TO SERVE THIS DEMO, OTHERWISE THIS DEMO WILL NOT START.
 Chromium command line switch to enable WEBGPU: `--enable-unsafe-webgpu`
@@ -50,12 +56,17 @@
 webgpu_videos_mxn.html?codec=vp8
 ```
 
-For webgpu_videos_mxn.html only:
+For webgl_videos_mxn.html and webgpu_videos_mxn.html:
 To remove the UI icons. Use `ui=none`.
 ```
 webgpu_videos_mxn.html?ui=none
 ```
 
+To remove the FPS panels. Use `fps=none`.
+```
+webgpu_videos_mxn.html?fps=none
+```
+
 For webgpu_videos_mxn.html only:
 To disable Import Texture API and force the video texture copy through
 createImageBitmap() and then copyExternalImageToTexture(),
diff --git a/content/test/data/gpu/vc/video_utils.js b/content/test/data/gpu/vc/video_utils.js
new file mode 100644
index 0000000..59837c3
--- /dev/null
+++ b/content/test/data/gpu/vc/video_utils.js
@@ -0,0 +1,284 @@
+// Copyright 2022 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.
+
+const parsedString = (function (names) {
+  const pairs = {};
+  for (let i = 0; i < names.length; ++i) {
+    var keyValue = names[i].split('=', 2);
+    if (keyValue.length == 1)
+      pairs[keyValue[0]] = '';
+    else
+      pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
+  }
+  return pairs;
+})(window.location.search.substr(1).split('&'));
+
+function GetVideoSource(videoCount, index, codec) {
+  switch (codec) {
+    case 'vp8':
+      if (videoCount <= 4) {
+        return './teddy1_vp8_640x360_30fps.webm';
+      } else {
+        if (index < 4)
+          return './teddy3_vp8_320x180_30fps.webm';
+        else if (index < 16)
+          return './teddy2_vp8_320x180_15fps.webm';
+        else
+          return './teddy1_vp8_320x180_7fps.webm';
+      }
+      break;
+
+    case 'vp9':
+    default:
+      if (videoCount <= 4) {
+        return './teddy1_vp9_640x360_30fps.webm';
+      } else {
+        if (index < 4)
+          return './teddy3_vp9_320x180_30fps.webm';
+        else if (index < 16)
+          return './teddy2_vp9_320x180_15fps.webm';
+        else
+          return './teddy1_vp9_320x180_7fps.webm';
+      }
+      break;
+  }
+}
+
+function getArrayForVideoVertexBuffer(videos, videoRows, videoColumns) {
+  // Each video takes 6 vertices (2 triangles). Each vertice has 4 floats.
+  // Therefore, each video needs 24 floats.
+  // The small video at the corner is included in the vertex buffer.
+  const rectVerts = new Float32Array(videos.length * 24);
+
+  // Width and height of the video.
+  const maxColRow = Math.max(videoColumns, videoRows);
+  let w = 2.0 / maxColRow;
+  let h = 2.0 / maxColRow;
+  for (let row = 0; row < videoRows; ++row) {
+    for (let column = 0; column < videoColumns; ++column) {
+      const array_index = (row * videoColumns + column) * 24;
+      // X and y of the video.
+      const x = -1.0 + w * column;
+      const y = 1.0 - h * row;
+
+      rectVerts.set([
+        (x + w), y, 1.0, 0.0,
+        (x + w), (y - h), 1.0, 1.0,
+        x, (y - h), 0.0, 1.0,
+        (x + w), y, 1.0, 0.0,
+        x, (y - h), 0.0, 1.0,
+        x, y, 0.0, 0.0,
+      ], array_index);
+    }
+  }
+
+  // For the small video at the corner, the last one in |videos|.
+  w = w / videos[0].width * videos[videos.length - 1].width;
+  h = h / videos[0].height * videos[videos.length - 1].height;
+  const x = 1.0 - w;
+  const y = 1.0 - (2.0 / maxColRow) + h;
+  const array_index = (videos.length - 1) * 24;
+
+  rectVerts.set([
+    (x + w), y, 1.0, 0.0,
+    (x + w), (y - h), 1.0, 1.0,
+    x, (y - h), 0.0, 1.0,
+    (x + w), y, 1.0, 0.0,
+    x, (y - h), 0.0, 1.0,
+    x, y, 0.0, 0.0,
+  ], array_index);
+
+  return rectVerts;
+}
+
+function getArrayForIconVertexBuffer(videos, videoRows, videoColumns) {
+  // Each icon takes 6 vertices (2 triangles). Each vertice has 2 floats.
+  // Therefore, each video needs 12 floats.
+  const rectVerts = new Float32Array(videos.length * 12);
+
+  // Width and height of the video.
+  const maxColRow = Math.max(videoColumns, videoRows);
+  let w = 2.0 / maxColRow;
+  let h = 2.0 / maxColRow;
+  // Width and height of the icon.
+  let wIcon = w / videos[0].width * videos[0].height / 8.0;
+  let hIcon = h / 8.0;
+
+  for (let row = 0; row < videoRows; ++row) {
+    for (let column = 0; column < videoColumns; ++column) {
+      const array_index = (row * videoColumns + column) * 12;
+      // X and y of the video.
+      const x = -1.0 + w * column;
+      const y = 1.0 - h * row;
+      // X and y of the icon.
+      const xIcon = x + w - wIcon * 2;
+      const yIcon = y - hIcon;
+
+      rectVerts.set([
+        (xIcon + wIcon), yIcon,
+        (xIcon + wIcon), (yIcon - hIcon),
+        xIcon, (yIcon - hIcon),
+        (xIcon + wIcon), yIcon,
+        xIcon, (yIcon - hIcon),
+        xIcon, yIcon,
+      ], array_index);
+    }
+  }
+
+  // For the icon of the small video at the corner, the last one in |videos|.
+  // Width and height of the small video.
+  w = w / videos[0].width * videos[videos.length - 1].width;
+  h = h / videos[0].height * videos[videos.length - 1].height;
+  // Width and height of the small icon.
+  wIcon = w / videos[0].width * videos[0].height / 8.0;
+  hIcon = h / 8.0;
+
+  // X and y of the small video.
+  const x = 1.0 - w;
+  const y = 1.0 - (2.0 / maxColRow) + h;
+  // X and y of the small icon.
+  const xIcon = x + w - wIcon * 2;
+  const yIcon = y - hIcon;
+
+  array_index = (videos.length - 1) * 12;
+  rectVerts.set([
+    (xIcon + wIcon), yIcon,
+    (xIcon + wIcon), (yIcon - hIcon),
+    xIcon, (yIcon - hIcon),
+    (xIcon + wIcon), yIcon,
+    xIcon, (yIcon - hIcon),
+    xIcon, yIcon,
+  ], array_index);
+
+  return rectVerts;
+}
+
+function getArrayForAnimationVertexBuffer(videos, videoRows, videoColumns) {
+  // Create voice bar animation and borders of the last video.
+  // (1) Generate 10 different lengths of voice bar. Each bar takes 2 triangles,
+  // which are 6 vertices.
+  // (2) Generate borders, consisting of 4 lines. Each line takes 2 vertices.
+  // Each vertice has 2 floats.
+  // Total are 10*6*2 + 4*2*2  = 120 + 16 = 136 floats.
+  const rectVerts = new Float32Array(136);
+
+  // (1) Voice bars.
+  // X, Y, width and height of the first video.
+  const maxColRow = Math.max(videoColumns, videoRows);
+  const w = 2.0 / maxColRow;
+  const h = 2.0 / maxColRow;
+  const x = -1.0;
+  const y = 1.0;
+
+  // Width and height of the icon.
+  const wIcon = w / videos[0].width * videos[0].height / 8.0;
+  const hIcon = h / 8.0;
+
+  // X, Y, width and height of the animated bar.
+  const wPixel = w / videos[0].width;
+  const wBar = wPixel * 5;
+  const xBar = x + w - wIcon * 1.5 - (wPixel * 2);
+  const delta = (hIcon - (wPixel * 4)) / 10;
+
+  // 10 different length for animation.
+  const bar_count = 10;
+  for (let i = 0; i < bar_count; ++i) {
+    const array_index = i * 12;
+    const hBar = (i+1) * delta;
+    const yBar = y - hIcon * 2 + hBar;
+
+    rectVerts.set([
+      (xBar + wBar), yBar,
+      (xBar + wBar), (yBar - hBar),
+      xBar, (yBar - hBar),
+      (xBar + wBar), yBar,
+      xBar, (yBar - hBar),
+      xBar, yBar,
+    ], array_index);
+  }
+
+  // (2) Borders of the first video
+  const array_index = 10 * 12;
+  rectVerts.set([
+    x, y, (x + w), y,
+    (x + w), y, (x + w), (y - h),
+    (x + w), (y - h), x, (y - h),
+    x, (y - h), x, y,
+  ], array_index);
+
+  return rectVerts;
+}
+
+function getArrayForFPSVertexBuffer(fpsCount) {
+  // Each FPS takes 6 vertices (2 triangles). Each vertice has 4 floats.
+  // Therefore, each FPS needs 24 floats.
+  const rectVerts = new Float32Array(fpsCount * 24);
+
+  const fpsRows = 16;
+  const fpsColumns = 16;
+  let w = 2.0 / fpsColumns;
+  let h = 2.0 / fpsRows;
+  for (let row = 0; row < fpsRows; ++row) {
+    for (let column = 0; column < fpsColumns; ++column) {
+      const count = (row * fpsColumns + column);
+      if (count >= fpsCount) {
+        return rectVerts;
+      }
+      const array_index = count * 24;
+      const x = -1.0 + w * column;
+      const y = 1.0 - h * row;
+
+      rectVerts.set([
+        (x + w), y, 1.0, 0.0,
+        (x + w), (y - h), 1.0, 1.0,
+        x, (y - h), 0.0, 1.0,
+        (x + w), y, 1.0, 0.0,
+        x, (y - h), 0.0, 1.0,
+        x, y, 0.0, 0.0,
+      ], array_index);
+    }
+  }
+
+  return rectVerts;
+}
+
+const fpsPanels = [];
+const kUiFPSPanel = 0;
+const kVideoFPSPanel = 1;
+function initializeFPSPanels() {
+  fpsPanels.push(new Stats.Panel('UI', '#0ff', '#002'));
+  fpsPanels.push(new Stats.Panel('Video', '#0f0', '#020'));
+}
+
+// If rAF is running at 60 fps, skip every other frame so the demo is
+// running at 30 fps.
+// 30 fps is 33 milliseconds/frame. To prevent skipping frames accidentally
+// when rAF is running near 30fps with small delta, use 32 ms instead of 33 ms
+// for comparison.
+const kFrameTime30Fps = 32;
+
+// The time of last FPS update.
+let fpsPrevTime = performance.now();
+// How many UI refreshments have been made since last update.
+let uiFrames = 0;
+// How many new video frames have been imported or copied since last update.
+let totalVideoFrames = 0;
+
+function updateFPS(timestamp, videos) {
+  // Update every 1 second.
+  if (timestamp >= fpsPrevTime + 1000) {
+    const fpsElapsed = timestamp - fpsPrevTime;
+    let fps = uiFrames * 1000 / fpsElapsed;
+    fpsPanels[kUiFPSPanel].update(fps, kFrameTime30Fps);
+
+    fps = totalVideoFrames * 1000 / fpsElapsed;
+    // Average fps per video element.
+    fps /= videos.length;
+    fpsPanels[kVideoFPSPanel].update(fps, kFrameTime30Fps);
+
+    fpsPrevTime = timestamp;
+    uiFrames = 0;
+    totalVideoFrames = 0;
+  }
+}
diff --git a/content/test/data/gpu/vc/webgl_video.js b/content/test/data/gpu/vc/webgl_video.js
new file mode 100644
index 0000000..3a4c9327
--- /dev/null
+++ b/content/test/data/gpu/vc/webgl_video.js
@@ -0,0 +1,346 @@
+// Copyright 2022 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.
+
+function webglInit(canvasWidth, canvasHeight) {
+  const container = document.getElementById('container');
+  const canvas = container.appendChild(document.createElement('canvas'));
+  canvas.width = canvasWidth;
+  canvas.height = canvasHeight;
+
+  const gl = canvas.getContext('webgl');
+  if (!gl) {
+    console.warn('WebGL not supported. canvas.getContext("webgl") fails!');
+    return null;
+  }
+
+  return gl;
+}
+
+const webglShaders = {
+  vertex: `
+attribute vec2 aVertPos;
+attribute vec2 aTexCoord;
+varying mediump vec2 vTexCoord;
+void main(void) {
+  gl_Position = vec4(aVertPos, 0.0, 1.0);
+  vTexCoord = aTexCoord;
+}
+`,
+
+  fragment: `
+precision mediump float;
+varying mediump vec2 vTexCoord;
+uniform sampler2D uSampler;
+void main(void) {
+  gl_FragColor = texture2D(uSampler, vTexCoord);
+}
+`,
+
+  vertex_icons: `
+attribute vec2 aVertPos;
+void main(void) {
+  gl_Position = vec4(aVertPos, 0.0, 1.0);
+}
+`,
+
+  fragment_output_blue: `
+void main(void) {
+  gl_FragColor = vec4(0.11328125, 0.4296875, 0.84375, 1.0);
+}
+`,
+  fragment_output_light_blue: `
+void main(void) {
+  gl_FragColor = vec4(0.3515625, 0.50390625, 0.75390625, 1.0);
+}
+`,
+
+  fragment_output_white: `
+void main(void) {
+  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
+}
+`,
+};
+
+function setupShader(gl, type, source) {
+  const shader = gl.createShader(type);
+  gl.shaderSource(shader, source);
+  gl.compileShader(shader);
+
+  if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
+    console.log('An error occurred compiling the shaders: '
+      + gl.getShaderInfoLog(shader));
+    gl.deleteShader(shader);
+    return null;
+  }
+  return shader;
+}
+
+function setupProgram(gl, vertexSource, fragmentSource) {
+  const vertexShader = setupShader(gl, gl.VERTEX_SHADER, vertexSource);
+  const fragmentShader = setupShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
+
+  const program = gl.createProgram();
+  gl.attachShader(program, vertexShader);
+  gl.attachShader(program, fragmentShader);
+  gl.linkProgram(program);
+
+  if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
+    console.log('Unable to initialize the shader program: '
+      + gl.getProgramInfoLog(program));
+    return null;
+  }
+  return program;
+}
+
+function setupProgramForVideo(gl, vertexSource, fragmentSource) {
+  const program = setupProgram(gl, vertexSource, fragmentSource);
+  return program;
+}
+
+const webglPrograms = {
+  video: null,
+  icon: null,
+  animation: null,
+  border: null
+};
+
+function initializePrograms(gl) {
+  webglPrograms.video = setupProgramForVideo(gl, webglShaders.vertex,
+    webglShaders.fragment);
+  webglPrograms.icon = setupProgram(gl, webglShaders.vertex_icons,
+    webglShaders.fragment_output_blue);
+  webglPrograms.animation = setupProgram(gl, webglShaders.vertex_icons,
+    webglShaders.fragment_output_white);
+  webglPrograms.border = setupProgram(gl, webglShaders.vertex_icons,
+    webglShaders.fragment_output_light_blue);
+}
+
+function createVertexBufferForVideos(gl, videos, videoRows, videoColumns) {
+  const rectVerts = getArrayForVideoVertexBuffer(videos, videoRows,
+    videoColumns);
+  const verticesBuffer = gl.createBuffer();
+  gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer);
+  gl.bufferData(gl.ARRAY_BUFFER, rectVerts, gl.STATIC_DRAW);
+
+  return verticesBuffer;
+}
+
+function bindVertexBufferForTextureQuad(gl, vertexBuffer) {
+  gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
+  const pos = gl.getAttribLocation(webglPrograms.video, "aVertPos");
+  gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 16, 0);
+  gl.enableVertexAttribArray(pos);
+
+  const coord = gl.getAttribLocation(webglPrograms.video, "aTexCoord");
+  gl.vertexAttribPointer(coord, 2, gl.FLOAT, false, 16, 8);
+  gl.enableVertexAttribArray(coord);
+}
+
+function bindVertexBufferForVideos(gl) {
+  bindVertexBufferForTextureQuad(gl, webglVertexBuffers.video);
+}
+
+function createVertexBufferForIcons(gl, videos, videoRows, videoColumns) {
+  const rectVerts = getArrayForIconVertexBuffer(videos, videoRows,
+    videoColumns);
+  const verticesBuffer = gl.createBuffer();
+  gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer);
+  gl.bufferData(gl.ARRAY_BUFFER, rectVerts, gl.STATIC_DRAW);
+
+  return verticesBuffer;
+}
+
+function bindVertexBufferForIcons(gl) {
+  gl.bindBuffer(gl.ARRAY_BUFFER, webglVertexBuffers.icon);
+  const pos = gl.getAttribLocation(webglPrograms.icon, "aVertPos");
+  gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
+  gl.enableVertexAttribArray(pos);
+}
+
+function createVertexBufferForAnimation(
+            gl, videos, videoRows, videoColumns) {
+  const rectVerts = getArrayForAnimationVertexBuffer(videos, videoRows,
+    videoColumns);
+  const verticesBuffer = gl.createBuffer();
+  gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer);
+  gl.bufferData(gl.ARRAY_BUFFER, rectVerts, gl.STATIC_DRAW);
+
+  return verticesBuffer;
+}
+
+function bindVertexBufferForAnimation(gl) {
+  gl.bindBuffer(gl.ARRAY_BUFFER, webglVertexBuffers.animation);
+  let pos = gl.getAttribLocation(webglPrograms.animation, "aVertPos");
+  gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
+  gl.enableVertexAttribArray(pos);
+
+  pos = gl.getAttribLocation(webglPrograms.border, "aVertPos");
+  gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 8, 0);
+  gl.enableVertexAttribArray(pos);
+}
+
+function createVertexBufferForFPS(gl) {
+  const rectVerts = getArrayForFPSVertexBuffer(fpsPanels.length);
+  const verticesBuffer = gl.createBuffer();
+  gl.bindBuffer(gl.ARRAY_BUFFER, verticesBuffer);
+  gl.bufferData(gl.ARRAY_BUFFER, rectVerts, gl.STATIC_DRAW);
+
+  return verticesBuffer;
+}
+
+function bindVertexBufferForFPS(gl) {
+  bindVertexBufferForTextureQuad(gl, webglVertexBuffers.fps);
+}
+
+const webglVertexBuffers = {
+  video: null,
+  icon: null,
+  animation: null,
+};
+
+function initializeVertexBuffers(gl, videos, videoRows, videoColumns, addFPS) {
+  webglVertexBuffers.video = createVertexBufferForVideos(gl, videos, videoRows,
+    videoColumns);
+  webglVertexBuffers.icon = createVertexBufferForIcons(gl, videos, videoRows,
+    videoColumns);
+  webglVertexBuffers.animation = createVertexBufferForAnimation(gl, videos,
+    videoRows, videoColumns);
+  if (addFPS) {
+    webglVertexBuffers.fps = createVertexBufferForFPS(gl);
+  }
+}
+
+const webglVideoTextures = [];
+function initializeVideoTextures(gl, count) {
+  for (let i = 0; i < count; ++i) {
+    const texture = gl.createTexture();
+    gl.activeTexture(gl.TEXTURE0);
+    gl.bindTexture(gl.TEXTURE_2D, texture);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
+    webglVideoTextures.push(texture);
+  }
+}
+
+function updateTexture(gl, texture, source) {
+  const level = 0;
+  const internalFormat = gl.RGBA;
+  const srcFormat = gl.RGBA;
+  const srcType = gl.UNSIGNED_BYTE;
+  gl.activeTexture(gl.TEXTURE0);
+  gl.bindTexture(gl.TEXTURE_2D, texture);
+  gl.texImage2D(gl.TEXTURE_2D, level, internalFormat, srcFormat, srcType,
+    source);
+}
+
+const webglFPSTextures = [];
+function initializeFPSTextures(gl, count) {
+  for (let i = 0; i < count; ++i) {
+    const texture = gl.createTexture();
+    gl.activeTexture(gl.TEXTURE0);
+    gl.bindTexture(gl.TEXTURE_2D, texture);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
+    webglFPSTextures.push(texture);
+  }
+}
+
+function webglDrawVideoFrames(gl, videos, videoRows, videoColumns,
+                               addUI, addFPS) {
+  initializePrograms(gl);
+  initializeVideoTextures(gl, videos.length);
+  if (addFPS) {
+    initializeFPSPanels();
+    initializeFPSTextures(gl, fpsPanels.length);
+  }
+  initializeVertexBuffers(gl, videos, videoRows, videoColumns, addFPS);
+
+  // videos #0-#3 : 30 fps.
+  // videos #3-#15: 15 fps.
+  // videos #16+: 7 fps.
+  // Not every video frame is ready in rAF callback. Only draw videos that
+  // are ready.
+  var videoIsReady = new Array(videos.length);
+
+  function UpdateIsVideoReady(video) {
+    videoIsReady[video.id] = true;
+    video.requestVideoFrameCallback(function () {
+      UpdateIsVideoReady(video);
+    });
+  }
+
+  for (const video of videos) {
+    video.requestVideoFrameCallback(function () {
+      UpdateIsVideoReady(video);
+    });
+  }
+
+  let lastTimestamp = performance.now();
+  let index_voice_bar = 0;
+
+  const oneFrame = () => {
+    const timestamp = performance.now();
+    const elapsed = timestamp - lastTimestamp;
+    if (elapsed < kFrameTime30Fps) {
+      window.requestAnimationFrame(oneFrame);
+      return;
+    }
+    lastTimestamp = timestamp;
+
+    uiFrames++;
+
+    gl.clearColor(1.0, 1.0, 1.0, 1.0);
+    gl.clear(gl.COLOR_BUFFER_BIT);
+
+    gl.useProgram(webglPrograms.video);
+    gl.uniform1i(gl.getUniformLocation(webglPrograms.video, "uSampler"), 0);
+    bindVertexBufferForVideos(gl);
+    for (let i = 0; i < videos.length; ++i) {
+      if (videoIsReady[videos[i].id]) {
+        updateTexture(gl, webglVideoTextures[i], videos[i]);
+        videoIsReady[i] = false;
+        totalVideoFrames++;
+      }
+      gl.activeTexture(gl.TEXTURE0);
+      gl.bindTexture(gl.TEXTURE_2D, webglVideoTextures[i]);
+      gl.drawArrays(gl.TRIANGLES, 6 * i, 6);
+    }
+    // Add UI on Top of all videos.
+    if (addUI) {
+      gl.useProgram(webglPrograms.icon);
+      bindVertexBufferForIcons(gl);
+      gl.drawArrays(gl.TRIANGLES, 0, 6 * videos.length);
+
+      // Animated voice bar on the last video.
+      index_voice_bar++;
+      if (index_voice_bar >= 10)
+        index_voice_bar = 0;
+      gl.useProgram(webglPrograms.animation);
+      bindVertexBufferForAnimation(gl);
+      gl.drawArrays(gl.TRIANGLES, index_voice_bar * 6, 6);
+
+      gl.useProgram(webglPrograms.border);
+      gl.bindBuffer(gl.ARRAY_BUFFER, webglVertexBuffers.animation);
+      gl.drawArrays(gl.LINES, 60, 8);
+    }
+
+    if (addFPS) {
+      updateFPS(timestamp, videos);
+      // Re-use the video program to draw FPS panels.
+      gl.useProgram(webglPrograms.video);
+
+      bindVertexBufferForFPS(gl);
+      for (let i = 0; i < fpsPanels.length; ++i) {
+        updateTexture(gl, webglFPSTextures[i], fpsPanels[i].dom);
+        gl.drawArrays(gl.TRIANGLES, 6 * i, 6);
+      }
+    }
+
+    window.requestAnimationFrame(oneFrame);
+  };
+
+  window.requestAnimationFrame(oneFrame);
+}
diff --git a/content/test/data/gpu/vc/webgl_videos_mxn.html b/content/test/data/gpu/vc/webgl_videos_mxn.html
new file mode 100644
index 0000000..38c0b7d5
--- /dev/null
+++ b/content/test/data/gpu/vc/webgl_videos_mxn.html
@@ -0,0 +1,117 @@
+<!--
+Copyright(c) 2022 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.
+-->
+<html>
+<head>
+  <title>WebGL MxN Video playbacks</title>
+  <style>
+    #message {
+      position: absolute;
+      width: 1600px;
+      height: 900px;
+      top: 200px;
+      left: 400px;
+    }
+  </style>
+  <script type="text/javascript" src="../third_party/stats-js/stats.js"></script>
+  <script type="text/javascript" src="video_utils.js"></script>
+  <script type="text/javascript" src="webgl_video.js"></script>
+  <script>
+    const _defaultRows = 7;
+    const _defaultColumns = 7;
+    const _totalVideoWidth = 1600;
+    const _totalVideoHeight = 900;
+    var hasUIOnTop = true;
+    var hasFPSOnTop = true;
+    var codec = 'vp9';
+
+    async function startMxNVideos() {
+      const container = document.getElementById('container');
+      const p = document.getElementById('message');
+
+      // Initialize WebGL
+
+      const gl = await webglInit(_totalVideoWidth, _totalVideoHeight);
+      if (!gl) {
+        p.innerHTML = "WebGL not supported!";
+        return;
+      }
+
+      // Get the UI rendering options from the string.
+      const uiOption = parsedString['ui'];
+      if (uiOption == 'none')
+        hasUIOnTop = false;
+
+      const fpsOption = parsedString['fps'];
+      if (fpsOption == 'none')
+        hasFPSOnTop = false;
+
+      codecString = parsedString['codec']
+      if (codecString == 'vp8')
+        codec = 'vp8';
+      else if (codecString != 'vp9' && codecString != undefined)
+        console.warn('Unsupported video codec format! Switch to default VP9.');
+
+      // Get the number of video rows and columns from the string.
+      var videoRows = parsedString['rows'];
+      var videoColumns = parsedString['columns'];
+      if (videoRows == undefined)
+        videoRows = _defaultRows;
+      if (videoColumns == undefined)
+        videoColumns = _defaultColumns;
+
+      // Limite the number of videos to 20x20.
+      // The video will not load when the number is too big.
+      const maxColRow = Math.max(videoRows, videoColumns);
+      if (maxColRow > 20) {
+        p.innerHTML = "Cannot support videos more than 20 x 20 !" + "<br />" +
+          "Please change the number of rows/columns.";
+        return;
+      }
+
+      // Calculate the video onscreen size
+      const videoWidth = _totalVideoWidth / maxColRow;
+      const videoHeight = _totalVideoHeight / maxColRow;
+
+      // Create MxN videos and a small video (size = 89x50) at the upper right
+      // corner to similate the one from the local camera.
+      p.innerHTML = "Uploading videos...";
+      var videos = [];
+      const videoCount = videoRows * videoColumns;
+      for (let i = 0; i < videoCount + 1; i++) {
+        const video = document.createElement('video');
+        video.id = i;
+        video.loop = true;
+        video.autoplay = true;
+        video.muted = true;
+        video.display = "none";
+        video.src = GetVideoSource(videoCount, i, codec);
+        video.width = videoWidth;
+        video.height = videoHeight;
+        video.crossorigin = "anonymous";
+        videos.push(video);
+      }
+      // For the small video at the upper right corner.
+      videos[videoRows * videoColumns].width = videoWidth / 3;
+      videos[videoRows * videoColumns].height = videoHeight / 3;
+      // Use the 640x360 source to simulate the local camera.
+      videos[videoRows * videoColumns].src = GetVideoSource(1, 1, codec);
+
+      await Promise.all(videos.map(video => video.play()));
+      p.remove();
+
+      // Simulate video playback by WebGL rendering.
+      webglDrawVideoFrames(gl, videos, videoRows, videoColumns,
+        hasUIOnTop , hasFPSOnTop);
+    }
+
+  </script>
+</head>
+<body onload="startMxNVideos()">
+  <div id="container" style="position:absolute; top:0px; left:0px">
+    <p id="message"></p>
+  </div>
+</body>
+</html>
diff --git a/content/test/data/gpu/vc/webgpu_video.js b/content/test/data/gpu/vc/webgpu_video.js
index d3703d1..9793237 100644
--- a/content/test/data/gpu/vc/webgpu_video.js
+++ b/content/test/data/gpu/vc/webgpu_video.js
@@ -96,51 +96,9 @@
 `,
 };
 
-function createVertexBuffer(device, videos, videoRows, videoColumns) {
-  // Each video takes 6 vertices (2 triangles). Each vertice has 4 floats.
-  // Therefore, each video needs 24 floats.
-  // The small video at the corner is included in the vertex buffer.
-  const rectVerts = new Float32Array(videos.length * 24);
-
-  // Width and height of the video.
-  const maxColRow = Math.max(videoColumns, videoRows);
-  let w = 2.0 / maxColRow;
-  let h = 2.0 / maxColRow;
-  for (let row = 0; row < videoRows; ++row) {
-    for (let column = 0; column < videoColumns; ++column) {
-      const array_index = (row * videoColumns + column) * 24;
-      // X and y of the video.
-      const x = -1.0 + w * column;
-      const y = 1.0 - h * row;
-
-      rectVerts.set([
-        (x + w), y, 1.0, 0.0,
-        (x + w), (y - h), 1.0, 1.0,
-        x, (y - h), 0.0, 1.0,
-        (x + w), y, 1.0, 0.0,
-        x, (y - h), 0.0, 1.0,
-        x, y, 0.0, 0.0,
-      ], array_index);
-    }
-  }
-
-  // For the small video at the corner, the last one in |videos|.
-  w = w / videos[0].width * videos[videos.length - 1].width;
-  h = h / videos[0].height * videos[videos.length - 1].height;
-  const x = 1.0 - w;
-  const y = 1.0 - (2.0 / maxColRow) + h;
-  const array_index = (videos.length - 1) * 24;
-
-  rectVerts.set([
-    (x + w), y, 1.0, 0.0,
-    (x + w), (y - h), 1.0, 1.0,
-    x, (y - h), 0.0, 1.0,
-    (x + w), y, 1.0, 0.0,
-    x, (y - h), 0.0, 1.0,
-    x, y, 0.0, 0.0,
-  ], array_index);
-
-
+function createVertexBufferForVideos(device, videos, videoRows, videoColumns) {
+  const rectVerts = getArrayForVideoVertexBuffer(videos, videoRows,
+    videoColumns);
   const verticesBuffer = device.createBuffer({
     size: rectVerts.byteLength,
     usage: GPUBufferUsage.VERTEX,
@@ -154,64 +112,8 @@
 }
 
 function createVertexBufferForIcons(device, videos, videoRows, videoColumns) {
-  // Each icon takes 6 vertices (2 triangles). Each vertice has 2 floats.
-  // Therefore, each video needs 12 floats.
-  const rectVerts = new Float32Array(videos.length * 12);
-
-  // Width and height of the video.
-  const maxColRow = Math.max(videoColumns, videoRows);
-  let w = 2.0 / maxColRow;
-  let h = 2.0 / maxColRow;
-  // Width and height of the icon.
-  let wIcon = w / videos[0].width * videos[0].height / 8.0;
-  let hIcon = h / 8.0;
-
-  for (let row = 0; row < videoRows; ++row) {
-    for (let column = 0; column < videoColumns; ++column) {
-      const array_index = (row * videoColumns + column) * 12;
-      // X and y of the video.
-      const x = -1.0 + w * column;
-      const y = 1.0 - h * row;
-      // X and y of the icon.
-      const xIcon = x + w - wIcon * 2;
-      const yIcon = y - hIcon;
-
-      rectVerts.set([
-        (xIcon + wIcon), yIcon,
-        (xIcon + wIcon), (yIcon - hIcon),
-        xIcon, (yIcon - hIcon),
-        (xIcon + wIcon), yIcon,
-        xIcon, (yIcon - hIcon),
-        xIcon, yIcon,
-      ], array_index);
-    }
-  }
-
-  // For the icon of the small video at the corner, the last one in |videos|.
-  // Width and height of the small video.
-  w = w / videos[0].width * videos[videos.length - 1].width;
-  h = h / videos[0].height * videos[videos.length - 1].height;
-  // Width and height of the small icon.
-  wIcon = w / videos[0].width * videos[0].height / 8.0;
-  hIcon = h / 8.0;
-
-  // X and y of the small video.
-  const x = 1.0 - w;
-  const y = 1.0 - (2.0 / maxColRow) + h;
-  // X and y of the small icon.
-  const xIcon = x + w - wIcon * 2;
-  const yIcon = y - hIcon;
-
-  array_index = (videos.length - 1) * 12;
-  rectVerts.set([
-    (xIcon + wIcon), yIcon,
-    (xIcon + wIcon), (yIcon - hIcon),
-    xIcon, (yIcon - hIcon),
-    (xIcon + wIcon), yIcon,
-    xIcon, (yIcon - hIcon),
-    xIcon, yIcon,
-  ], array_index);
-
+  const rectVerts = getArrayForIconVertexBuffer(videos, videoRows,
+    videoColumns);
   const verticesBuffer = device.createBuffer({
     size: rectVerts.byteLength,
     usage: GPUBufferUsage.VERTEX,
@@ -226,58 +128,22 @@
 
 function createVertexBufferForAnimation(
             device, videos, videoRows, videoColumns) {
-  // Create voice bar animation and borders of the last video.
-  // (1) Generate 10 differnt lengths of voice bar. Each bar takes 2 triangles,
-  // which are 6 vertices.
-  // (2) Generate borders, consisting of 4 lines. Each line takes 2 vertices.
-  // Each vertice has 2 floats.
-  // Total are 10*6*2 + 4*2*2  = 120 + 16 = 136 floats.
-  const rectVerts = new Float32Array(136);
+  const rectVerts = getArrayForAnimationVertexBuffer(videos, videoRows,
+    videoColumns);
+  const verticesBuffer = device.createBuffer({
+    size: rectVerts.byteLength,
+    usage: GPUBufferUsage.VERTEX,
+    mappedAtCreation: true,
+  });
 
-  // (1) Voice bars.
-  // X, Y, width and height of the first video.
-  const maxColRow = Math.max(videoColumns, videoRows);
-  const w = 2.0 / maxColRow;
-  const h = 2.0 / maxColRow;
-  const x = -1.0;
-  const y = 1.0;
+  new Float32Array(verticesBuffer.getMappedRange()).set(rectVerts);
+  verticesBuffer.unmap();
 
-  // Width and height of the icon.
-  const wIcon = w / videos[0].width * videos[0].height / 8.0;
-  const hIcon = h / 8.0;
+  return verticesBuffer;
+}
 
-  // X, Y, width and height of the animated bar.
-  const wPixel = w / videos[0].width;
-  const wBar = wPixel * 5;
-  const xBar = x + w - wIcon * 1.5 - (wPixel * 2);
-  const delta = (hIcon - (wPixel * 4)) / 10;
-
-  // 10 different length for animation.
-  const bar_count = 10;
-  for (let i = 0; i < bar_count; ++i) {
-    const array_index = i * 12;
-    const hBar = (i+1) * delta;
-    const yBar = y - hIcon * 2 + hBar;
-
-    rectVerts.set([
-      (xBar + wBar), yBar,
-      (xBar + wBar), (yBar - hBar),
-      xBar, (yBar - hBar),
-      (xBar + wBar), yBar,
-      xBar, (yBar - hBar),
-      xBar, yBar,
-    ], array_index);
-  }
-
-  // (2) Borders of the first video
-  const array_index = 10 * 12;
-  rectVerts.set([
-    x, y, (x + w), y,
-    (x + w), y, (x + w), (y - h),
-    (x + w), (y - h), x, (y - h),
-    x, (y - h), x, y,
-  ], array_index);
-
+function createVertexBufferForFPS(device) {
+  const rectVerts = getArrayForFPSVertexBuffer(fpsPanels.length);
   const verticesBuffer = device.createBuffer({
     size: rectVerts.byteLength,
     usage: GPUBufferUsage.VERTEX,
@@ -291,11 +157,13 @@
 }
 
 function webGpuDrawVideoFrames(gpuSetting, videos, videoRows, videoColumns,
-                               addUI, useImportTextureApi) {
+                               addUI, addFPS, useImportTextureApi) {
+  initializeFPSPanels();
+
   const {adapter, device, context, canvas} = gpuSetting;
 
-  const verticesBuffer = createVertexBuffer(device, videos, videoRows,
-                         videoColumns);
+  const vertexBufferForVideos = createVertexBufferForVideos(device, videos,
+    videoRows, videoColumns);
 
   const swapChainFormat = context.getPreferredFormat(adapter);
 
@@ -305,7 +173,7 @@
     usage: GPUTextureUsage.RENDER_ATTACHMENT,
   });
 
-  let fragmentShaderModeul;
+  let fragmentShaderModule;
   if (useImportTextureApi) {
     fragmentShaderModule = device.createShaderModule({
       code: wgslShaders.fragment_external_texture,
@@ -317,7 +185,7 @@
   }
 
 
-  const pipeline = device.createRenderPipeline({
+  const pipelineForVideos = device.createRenderPipeline({
     vertex: {
       module: device.createShaderModule({
         code: wgslShaders.vertex,
@@ -353,7 +221,7 @@
     },
   });
 
-  const renderPassDescriptor = {
+  const renderPassDescriptorForVideo = {
     colorAttachments: [
       {
         view: undefined, // Assigned later
@@ -369,7 +237,7 @@
   });
 
   const videoTextures = [];
-  const bindGroups = [];
+  const videoBindGroups = [];
 
   if (!useImportTextureApi) {
     for (let i = 0; i < videos.length; ++i) {
@@ -384,8 +252,8 @@
             GPUTextureUsage.RENDER_ATTACHMENT,
       });
 
-      bindGroups[i] = device.createBindGroup({
-        layout: pipeline.getBindGroupLayout(0),
+      videoBindGroups[i] = device.createBindGroup({
+        layout: pipelineForVideos.getBindGroupLayout(0),
         entries: [
           {
             binding: 0,
@@ -461,6 +329,72 @@
   const pipelineForVideoBorders =
       device.createRenderPipeline(renderPipelineDescriptorForIcon);
 
+  const vertexBufferForFPS = createVertexBufferForFPS(device);
+  const pipelineForFPS = device.createRenderPipeline({
+    vertex: {
+      module: device.createShaderModule({
+        code: wgslShaders.vertex,
+      }),
+      entryPoint: 'main',
+      buffers: [{
+        arrayStride: 16,
+        attributes: [
+          {
+            // position
+            shaderLocation: 0,
+            offset: 0,
+            format: 'float32x2',
+          },
+          {
+            // uv
+            shaderLocation: 1,
+            offset: 8,
+            format: 'float32x2',
+          }
+        ],
+      }],
+    },
+    fragment: {
+      module: device.createShaderModule({
+        code: wgslShaders.fragment,
+      }),
+      entryPoint: 'main',
+      targets: [{
+        format: swapChainFormat,
+      }]
+    },
+    primitive: {
+      topology: 'triangle-list',
+    },
+  });
+  const fpsTextures = [];
+  const fpsBindGroups = [];
+  for (let i = 0; i < fpsPanels.length; ++i) {
+    fpsTextures[i] = device.createTexture({
+      size: {
+        width: fpsPanels[i].dom.width,
+        height: fpsPanels[i].dom.height,
+        depthOrArrayLayers: 1,
+      },
+      format: 'rgba8unorm',
+      usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING |
+        GPUTextureUsage.RENDER_ATTACHMENT,
+    });
+
+    fpsBindGroups[i] = device.createBindGroup({
+      layout: pipelineForFPS.getBindGroupLayout(0),
+      entries: [
+        {
+          binding: 0,
+          resource: sampler,
+        },
+        {
+          binding: 1,
+          resource: fpsTextures[i].createView(),
+        },
+      ],
+    });
+  }
 
   // For drawing icons and animated voice bar. Add UI to the command encoder.
   let index_voice_bar = 0;
@@ -490,6 +424,26 @@
     passEncoder.draw(/*vertexCount=*/ 8, 1, /*firstVertex=*/ 60);
   }
 
+ function addFPSCommands(device, passEncoder) {
+    // FPS Panels
+   passEncoder.setPipeline(pipelineForFPS);
+   passEncoder.setVertexBuffer(0, vertexBufferForFPS);
+   for (let i = 0; i < fpsPanels.length; ++i) {
+     device.queue.copyExternalImageToTexture(
+       { source: fpsPanels[i].dom, origin: { x: 0, y: 0 }},
+       { texture: fpsTextures[i] },
+       {
+         width: fpsPanels[i].dom.width,
+         height: fpsPanels[i].dom.height,
+         depthOrArrayLayers: 1
+       },
+     );
+     const firstVertex = i * 6;
+     passEncoder.setBindGroup(0, fpsBindGroups[i]);
+     passEncoder.draw(6, 1, firstVertex, 0);
+   }
+ }
+
   // videos #0-#3 : 30 fps.
   // videos #3-#15: 15 fps.
   // videos #16+: 7 fps.
@@ -510,33 +464,29 @@
     });
   }
 
-  // If rAF is running at 60 fps, skip every other frame so the demo is
-  // running at 30 fps.
-  // 30 fps is 33 milliseconds/frame. To prevent skipping frames accidentally
-  // when rAF is running near 30fps with small delta, use 32 ms instead of 33 ms
-  // for comparison.
-  const frameTime30Fps = 32;
   let lastTimestamp = performance.now();
 
   const oneFrame = () => {
     const timestamp = performance.now();
     const elapsed = timestamp - lastTimestamp;
-    if (elapsed < frameTime30Fps) {
+    if (elapsed < kFrameTime30Fps) {
       window.requestAnimationFrame(oneFrame);
       return;
     }
     lastTimestamp = timestamp;
 
+    uiFrames++;
+
     const swapChainTexture = context.getCurrentTexture();
-    renderPassDescriptor.colorAttachments[0].view = swapChainTexture
+    renderPassDescriptorForVideo.colorAttachments[0].view = swapChainTexture
       .createView();
 
     const commandEncoder = device.createCommandEncoder();
 
     const passEncoder =
-      commandEncoder.beginRenderPass(renderPassDescriptor);
-    passEncoder.setPipeline(pipeline);
-    passEncoder.setVertexBuffer(0, verticesBuffer);
+      commandEncoder.beginRenderPass(renderPassDescriptorForVideo);
+    passEncoder.setPipeline(pipelineForVideos);
+    passEncoder.setVertexBuffer(0, vertexBufferForVideos);
 
     Promise.all(videos.map(video =>
       (videoIsReady[video.id] ? createImageBitmap(video) : null))).
@@ -553,12 +503,13 @@
                 },
             );
             videoIsReady[i] = false;
+            totalVideoFrames++;
           }
         }
 
         for (let i = 0; i < videos.length; ++i) {
           const firstVertex = i * 6;
-          passEncoder.setBindGroup(0, bindGroups[i]);
+          passEncoder.setBindGroup(0, videoBindGroups[i]);
           passEncoder.draw(6, 1, firstVertex, 0);
         }
 
@@ -566,7 +517,12 @@
         if (addUI) {
           addUICommands(passEncoder);
         }
-        passEncoder.endPass();
+        // Add FPS panels on Top of all videos.
+        if (addFPS) {
+          updateFPS(timestamp, videos);
+          addFPSCommands(device, passEncoder);
+        }
+        passEncoder.end();
         device.queue.submit([commandEncoder.finish()]);
 
         // TODO(crbug.com/1289482): Workaround for backpressure mechanism
@@ -581,32 +537,36 @@
     // Target frame rate: 30 fps. rAF might run at 60 fps.
     const timestamp = performance.now();
     const elapsed = timestamp - lastTimestamp;
-    if (elapsed < frameTime30Fps) {
+    if (elapsed < kFrameTime30Fps) {
       window.requestAnimationFrame(oneFrameWithImportTextureApi);
       return;
     }
     lastTimestamp = timestamp;
 
+    uiFrames++;
+
     // Always import all videos. The video textures are destroyed before the
     // next frame.
+    // TODO(crbugs.com/1310172): Only import expired video frames.
     for (let i = 0; i < videos.length; ++i) {
       videoTextures[i] =
-          device.importExternalTexture(externalTextureDescriptor[i]);
+        device.importExternalTexture(externalTextureDescriptor[i]);
+      totalVideoFrames++;
     }
 
     const swapChainTexture = context.getCurrentTexture();
-    renderPassDescriptor.colorAttachments[0].view = swapChainTexture
+    renderPassDescriptorForVideo.colorAttachments[0].view = swapChainTexture
       .createView();
 
     const commandEncoder = device.createCommandEncoder();
     const passEncoder =
-      commandEncoder.beginRenderPass(renderPassDescriptor);
-    passEncoder.setPipeline(pipeline);
-    passEncoder.setVertexBuffer(0, verticesBuffer);
+      commandEncoder.beginRenderPass(renderPassDescriptorForVideo);
+    passEncoder.setPipeline(pipelineForVideos);
+    passEncoder.setVertexBuffer(0, vertexBufferForVideos);
 
     for (let i = 0; i < videos.length; ++i) {
-      bindGroups[i] = device.createBindGroup({
-        layout: pipeline.getBindGroupLayout(0),
+      videoBindGroups[i] = device.createBindGroup({
+        layout: pipelineForVideos.getBindGroupLayout(0),
         entries: [
           {
             binding: 0,
@@ -619,7 +579,7 @@
         ],
       });
       const firstVertex = i * 6;
-      passEncoder.setBindGroup(0, bindGroups[i]);
+      passEncoder.setBindGroup(0, videoBindGroups[i]);
       passEncoder.draw(6, 1, firstVertex, 0);
     }
 
@@ -627,7 +587,12 @@
     if (addUI) {
       addUICommands(passEncoder);
     }
-    passEncoder.endPass();
+    // Add FPS panels on Top of all videos.
+    if (addFPS) {
+      updateFPS(timestamp, videos);
+      addFPSCommands(device, passEncoder);
+    }
+    passEncoder.end();
     device.queue.submit([commandEncoder.finish()]);
 
     const functionDuration = performance.now() - timestamp;
diff --git a/content/test/data/gpu/vc/webgpu_videos_mxn.html b/content/test/data/gpu/vc/webgpu_videos_mxn.html
index f965f25b..ba7b0a0 100644
--- a/content/test/data/gpu/vc/webgpu_videos_mxn.html
+++ b/content/test/data/gpu/vc/webgpu_videos_mxn.html
@@ -15,6 +15,8 @@
       left: 400px;
     }
   </style>
+  <script type="text/javascript" src="../third_party/stats-js/stats.js"></script>
+  <script type="text/javascript" src="video_utils.js"></script>
   <script type="text/javascript" src="webgpu_video.js"></script>
   <script>
     const _defaultRows = 7;
@@ -22,52 +24,10 @@
     const _totalVideoWidth = 1600;
     const _totalVideoHeight = 900;
     var hasUIOnTop = true;
+    var hasFPSOnTop = true;
     var useImportTextureApi = true;
     var codec = 'vp9';
 
-    const parsedString = (function (names) {
-      const pairs = {};
-      for (let i = 0; i < names.length; ++i) {
-        var keyValue = names[i].split('=', 2);
-        if (keyValue.length == 1)
-          pairs[keyValue[0]] = '';
-        else
-          pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
-      }
-      return pairs;
-    })(window.location.search.substr(1).split('&'));
-
-    function GetVideoSource(videoCount, index, codec) {
-      switch (codec) {
-        case 'vp8':
-          if (videoCount <= 4) {
-            return './teddy1_vp8_640x360_30fps.webm';
-          } else {
-            if (index < 4)
-              return './teddy3_vp8_320x180_30fps.webm';
-            else if (index < 16)
-              return './teddy2_vp8_320x180_15fps.webm';
-            else
-              return './teddy1_vp8_320x180_7fps.webm';
-          }
-          break;
-
-        case 'vp9':
-        default:
-          if (videoCount <= 4) {
-            return './teddy1_vp9_640x360_30fps.webm';
-          } else {
-            if (index < 4)
-              return './teddy3_vp9_320x180_30fps.webm';
-            else if (index < 16)
-              return './teddy2_vp9_320x180_15fps.webm';
-            else
-              return './teddy1_vp9_320x180_7fps.webm';
-          }
-          break;
-      }
-    }
-
     async function startMxNVideos() {
       const container = document.getElementById('container');
       const p = document.getElementById('message');
@@ -87,6 +47,10 @@
       if (uiOption == 'none')
         hasUIOnTop = false;
 
+      const fpsOption = parsedString['fps'];
+      if (fpsOption == 'none')
+        hasFPSOnTop = false;
+
       const api = parsedString['import_texture_api']
       if (api == '0')
         useImportTextureApi = false;
@@ -149,7 +113,7 @@
 
       // Simulate video playback by WebGpu rendering.
       webGpuDrawVideoFrames(gpuSetting, videos, videoRows, videoColumns,
-        hasUIOnTop , useImportTextureApi);
+        hasUIOnTop , hasFPSOnTop, useImportTextureApi);
     }
 
   </script>
diff --git a/extensions/BUILD.gn b/extensions/BUILD.gn
index ace74d6..23325ef 100644
--- a/extensions/BUILD.gn
+++ b/extensions/BUILD.gn
@@ -283,10 +283,15 @@
   ]
 
   if (is_fuchsia) {
-    use_cfv2 = false
+    use_cfv1 = false
+
+    # TODO(https://crbug.com/1185811): Investigate removing the requirement for
+    # job_policy_ambient_mark_vmo_exec for the sake of V8's allocator in tests.
+    test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
+
     additional_manifest_fragments = [
-      "//build/config/fuchsia/test/jit_capabilities.test-cmx",
-      "//build/config/fuchsia/test/network_capabilities.test-cmx",
+      "//build/config/fuchsia/test/network.shard.test-cml",
+      "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
     ]
   }
 }
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index 187d0460..1f86622 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -773,6 +773,8 @@
     "mock_screen.h",
     "preload_check_test_util.cc",
     "preload_check_test_util.h",
+    "script_result_queue.cc",
+    "script_result_queue.h",
     "service_worker/service_worker_test_utils.cc",
     "service_worker/service_worker_test_utils.h",
     "test_event_router_observer.cc",
diff --git a/extensions/browser/api/test/test_api.cc b/extensions/browser/api/test/test_api.cc
index afa33a3..c65e5493 100644
--- a/extensions/browser/api/test/test_api.cc
+++ b/extensions/browser/api/test/test_api.cc
@@ -112,6 +112,18 @@
     Respond(std::move(response_));
 }
 
+TestSendScriptResultFunction::TestSendScriptResultFunction() = default;
+TestSendScriptResultFunction::~TestSendScriptResultFunction() = default;
+
+ExtensionFunction::ResponseAction TestSendScriptResultFunction::Run() {
+  std::unique_ptr<api::test::SendScriptResult::Params> params(
+      api::test::SendScriptResult::Params::Create(args()));
+  EXTENSION_FUNCTION_VALIDATE(params);
+
+  TestApiObserverRegistry::GetInstance()->NotifyScriptResult(*params->result);
+  return RespondNow(NoArguments());
+}
+
 // static
 void TestGetConfigFunction::set_test_config_state(
     base::DictionaryValue* value) {
diff --git a/extensions/browser/api/test/test_api.h b/extensions/browser/api/test/test_api.h
index 445b5bb1..5b671ba 100644
--- a/extensions/browser/api/test/test_api.h
+++ b/extensions/browser/api/test/test_api.h
@@ -85,6 +85,18 @@
   ResponseValue response_;
 };
 
+class TestSendScriptResultFunction : public TestExtensionFunction {
+ public:
+  TestSendScriptResultFunction();
+  DECLARE_EXTENSION_FUNCTION("test.sendScriptResult", UNKNOWN)
+
+ private:
+  ~TestSendScriptResultFunction() override;
+
+  // ExtensionFunction:
+  ResponseAction Run() override;
+};
+
 class TestGetConfigFunction : public TestExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("test.getConfig", UNKNOWN)
diff --git a/extensions/browser/api/test/test_api_observer.h b/extensions/browser/api/test/test_api_observer.h
index 1d59899..c56bee1 100644
--- a/extensions/browser/api/test/test_api_observer.h
+++ b/extensions/browser/api/test/test_api_observer.h
@@ -9,6 +9,10 @@
 
 #include "base/observer_list_types.h"
 
+namespace base {
+class Value;
+}
+
 namespace content {
 class BrowserContext;
 }
@@ -32,6 +36,9 @@
   // If the observer will reply to |function|, returns true.
   virtual bool OnTestMessage(TestSendMessageFunction* function,
                              const std::string& message);
+
+  // Called on chrome.test.sendScriptResult().
+  virtual void OnScriptResult(const base::Value& script_result) {}
 };
 
 }  // namespace extensions
diff --git a/extensions/browser/api/test/test_api_observer_registry.cc b/extensions/browser/api/test/test_api_observer_registry.cc
index 33f874a..f6db429 100644
--- a/extensions/browser/api/test/test_api_observer_registry.cc
+++ b/extensions/browser/api/test/test_api_observer_registry.cc
@@ -50,6 +50,12 @@
   return any_listener_will_respond;
 }
 
+void TestApiObserverRegistry::NotifyScriptResult(
+    const base::Value& result_value) {
+  for (auto& observer : observers_)
+    observer.OnScriptResult(result_value);
+}
+
 void TestApiObserverRegistry::AddObserver(TestApiObserver* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/extensions/browser/api/test/test_api_observer_registry.h b/extensions/browser/api/test/test_api_observer_registry.h
index a96b8cb..72956ec3 100644
--- a/extensions/browser/api/test/test_api_observer_registry.h
+++ b/extensions/browser/api/test/test_api_observer_registry.h
@@ -11,6 +11,10 @@
 #include "base/observer_list.h"
 #include "extensions/browser/api/test/test_api_observer.h"
 
+namespace base {
+class Value;
+}
+
 namespace content {
 class BrowserContext;
 }
@@ -39,6 +43,9 @@
   bool NotifyTestMessage(TestSendMessageFunction* function,
                          const std::string& message);
 
+  // Notifies observers of a result sent via sendScriptResult.
+  void NotifyScriptResult(const base::Value& result_value);
+
   void AddObserver(TestApiObserver* observer);
   void RemoveObserver(TestApiObserver* observer);
 
diff --git a/extensions/browser/api/virtual_keyboard/DIR_METADATA b/extensions/browser/api/virtual_keyboard/DIR_METADATA
index 9784c0dc..caac77f 100644
--- a/extensions/browser/api/virtual_keyboard/DIR_METADATA
+++ b/extensions/browser/api/virtual_keyboard/DIR_METADATA
@@ -1,4 +1 @@
-monorail {
-  component: "OS>Inputs"  # for Chrome/Chromium OS only.
-  # For OSes other than Chrome/Chromium OS, please use "UI>Input>VirtualKeyboard".
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/extensions/browser/api/virtual_keyboard_private/DIR_METADATA b/extensions/browser/api/virtual_keyboard_private/DIR_METADATA
index 1ae4c22..caac77f 100644
--- a/extensions/browser/api/virtual_keyboard_private/DIR_METADATA
+++ b/extensions/browser/api/virtual_keyboard_private/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/extensions/browser/browsertest_util.cc b/extensions/browser/browsertest_util.cc
index 99888bc..384b6cf 100644
--- a/extensions/browser/browsertest_util.cc
+++ b/extensions/browser/browsertest_util.cc
@@ -15,6 +15,7 @@
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_util.h"
 #include "extensions/browser/process_manager.h"
+#include "extensions/browser/script_result_queue.h"
 #include "extensions/common/manifest_handlers/background_info.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -44,8 +45,17 @@
 base::Value BackgroundScriptExecutor::ExecuteScript(
     const ExtensionId& extension_id,
     const std::string& script,
+    ResultCapture result_capture,
     ScriptUserActivation script_user_activation) {
-  ExecuteScriptAsync(extension_id, script, script_user_activation);
+  if (result_capture == ResultCapture::kNone) {
+    AddTestFailure(
+        "Cannot wait for a result with no result capture. "
+        "Use ExecuteScriptAsync() instead");
+    return base::Value();
+  }
+
+  ExecuteScriptAsync(extension_id, script, result_capture,
+                     script_user_activation);
   return WaitForResult();
 }
 
@@ -54,17 +64,21 @@
     content::BrowserContext* browser_context,
     const ExtensionId& extension_id,
     const std::string& script,
+    ResultCapture result_capture,
     ScriptUserActivation script_user_activation) {
   return BackgroundScriptExecutor(browser_context)
-      .ExecuteScript(extension_id, script, script_user_activation);
+      .ExecuteScript(extension_id, script, result_capture,
+                     script_user_activation);
 }
 
 bool BackgroundScriptExecutor::ExecuteScriptAsync(
     const ExtensionId& extension_id,
     const std::string& script,
+    ResultCapture result_capture,
     ScriptUserActivation script_user_activation) {
   extension_ = registry_->enabled_extensions().GetByID(extension_id);
   script_ = script;
+  result_capture_method_ = result_capture;
   if (!extension_) {
     AddTestFailure("No enabled extension with id: " + extension_id);
     return false;
@@ -72,6 +86,9 @@
 
   if (BackgroundInfo::IsServiceWorkerBased(extension_)) {
     background_type_ = BackgroundType::kServiceWorker;
+    DCHECK_NE(ResultCapture::kWindowDomAutomationController,
+              result_capture_method_)
+        << "Cannot use domAutomationController in a worker.";
     DCHECK_EQ(ScriptUserActivation::kDontActivate, script_user_activation)
         << "Cannot provide a user gesture to service worker scripts";
     return ExecuteScriptInServiceWorker();
@@ -95,20 +112,22 @@
     const std::string& script,
     ScriptUserActivation script_user_activation) {
   return BackgroundScriptExecutor(browser_context)
-      .ExecuteScriptAsync(extension_id, script, script_user_activation);
+      .ExecuteScriptAsync(extension_id, script, ResultCapture::kNone,
+                          script_user_activation);
 }
 
 base::Value BackgroundScriptExecutor::WaitForResult() {
   DCHECK(background_type_);
+  DCHECK_NE(ResultCapture::kNone, result_capture_method_)
+      << "Trying to wait for a result when no result was expected.";
 
-  if (background_type_ == BackgroundType::kServiceWorker) {
-    base::RunLoop run_loop;
-    quit_closure_ = run_loop.QuitClosure();
-    run_loop.Run();
-    return std::move(result_);
+  if (result_capture_method_ == ResultCapture::kSendScriptResult) {
+    DCHECK(script_result_queue_);
+    return script_result_queue_->GetNextResult();
   }
 
-  DCHECK_EQ(BackgroundType::kPage, *background_type_);
+  DCHECK_EQ(ResultCapture::kWindowDomAutomationController,
+            result_capture_method_);
   DCHECK(message_queue_);
   std::string next_message;
   if (!message_queue_->WaitForMessage(&next_message)) {
@@ -131,21 +150,21 @@
     AddTestFailure("Incorrect number of workers registered for extension");
     return false;
   }
+
+  if (result_capture_method_ == ResultCapture::kSendScriptResult)
+    script_result_queue_ = std::make_unique<ScriptResultQueue>();
+
   content::ServiceWorkerContext* service_worker_context =
       util::GetStoragePartitionForExtensionId(extension_->id(),
                                               browser_context_)
           ->GetServiceWorkerContext();
   service_worker_context->ExecuteScriptForTest(  // IN-TEST
-      script_, worker_ids[0].version_id,
-      base::BindOnce(&BackgroundScriptExecutor::OnServiceWorkerResult,
-                     weak_factory_.GetWeakPtr()));
+      script_, worker_ids[0].version_id, base::DoNothing());
   return true;
 }
 
 bool BackgroundScriptExecutor::ExecuteScriptInBackgroundPage(
     ScriptUserActivation script_user_activation) {
-  message_queue_ = std::make_unique<content::DOMMessageQueue>();
-
   ExtensionHost* host =
       process_manager_->GetBackgroundHostForExtension(extension_->id());
   if (!host) {
@@ -153,6 +172,18 @@
     return false;
   }
 
+  switch (result_capture_method_) {
+    case ResultCapture::kNone:
+      break;
+    case ResultCapture::kSendScriptResult:
+      script_result_queue_ = std::make_unique<ScriptResultQueue>();
+      break;
+    case ResultCapture::kWindowDomAutomationController:
+      message_queue_ =
+          std::make_unique<content::DOMMessageQueue>(host->host_contents());
+      break;
+  }
+
   if (script_user_activation == ScriptUserActivation::kActivate) {
     content::ExecuteScriptAsync(host->host_contents(), script_);
   } else {
@@ -161,15 +192,6 @@
   return true;
 }
 
-void BackgroundScriptExecutor::OnServiceWorkerResult(
-    base::Value result,
-    const absl::optional<std::string>& error) {
-  ASSERT_FALSE(error) << *error;
-  result_ = std::move(result);
-  if (quit_closure_)
-    std::move(quit_closure_).Run();
-}
-
 void BackgroundScriptExecutor::AddTestFailure(const std::string& message) {
   ADD_FAILURE() << "Background script execution failed: " << message
                 << ". Extension: "
@@ -206,8 +228,13 @@
 
   DCHECK_EQ(ScriptUserActivation::kActivate, script_user_activation);
 
-  base::Value value = BackgroundScriptExecutor::ExecuteScript(
-      context, extension_id, script, script_user_activation);
+  BackgroundScriptExecutor script_executor(context);
+  // Legacy scripts were written to pass the (string) result via
+  // window.domAutomationController.send().
+  base::Value value = script_executor.ExecuteScript(
+      extension_id, script,
+      BackgroundScriptExecutor::ResultCapture::kWindowDomAutomationController,
+      script_user_activation);
   if (!value.is_string()) {
     ADD_FAILURE() << "Bad return value: " << value.type()
                   << "; script: " << GetScriptToLog(script);
diff --git a/extensions/browser/browsertest_util.h b/extensions/browser/browsertest_util.h
index beb0543..865e0b3 100644
--- a/extensions/browser/browsertest_util.h
+++ b/extensions/browser/browsertest_util.h
@@ -8,8 +8,6 @@
 #include <memory>
 #include <string>
 
-#include "base/callback_forward.h"
-#include "base/memory/weak_ptr.h"
 #include "base/values.h"
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/common/extension_id.h"
@@ -23,6 +21,7 @@
 class Extension;
 class ExtensionRegistry;
 class ProcessManager;
+class ScriptResultQueue;
 
 namespace browsertest_util {
 
@@ -36,19 +35,28 @@
 // A helper class to execute a script in an extension's background context,
 // either its service worker or its (possibly lazy) background page.
 // Returning results:
-//  Currently, results are returned differently for service worker-based and
-//  background page-based extensions.
-//  - The result for a service worker-based extension is the result of the
-//    final line of the execution - the same as you might get if you were to
-//    enter the script into devtools.
-//  - The result for a background page-based extension is instead returned via
-//    domAutomationController.send().
-// TODO(https://crbug.com/1319642): This should change. This class isn't as
-// helpful if the same script cannot be used in both service worker-based and
-// background page-based extensions.
+//  Return results with chrome.test.sendScriptResult(). This can be called
+//  either synchronously or asynchronously from the injected script.
+//  For compatibility with legacy scripts, background page contexts can choose
+//  send results via window.domAutomationController.send(). New code should not
+//  do this.
 // This class is designed for single-use executions.
 class BackgroundScriptExecutor {
  public:
+  // The manner in which the script will use to send the result.
+  enum class ResultCapture {
+    // No result will be captured. The caller only cares about injecting the
+    // script and may wait for another signal of execution.
+    kNone,
+    // Result sent with chrome.test.sendScriptResult().
+    kSendScriptResult,
+    // Result sent with window.domAutomationController.send().
+    // DON'T USE. This is only here for backwards compatibility with tests that
+    // were written before chrome.test.sendScriptResult() exists, and this
+    // doesn't work with service worker contexts.
+    kWindowDomAutomationController,
+  };
+
   explicit BackgroundScriptExecutor(content::BrowserContext* browser_context);
   ~BackgroundScriptExecutor();
 
@@ -58,12 +66,14 @@
   // service worker-based extensions.
   base::Value ExecuteScript(const ExtensionId& extension_id,
                             const std::string& script,
+                            ResultCapture result_capture,
                             ScriptUserActivation script_user_activation =
                                 ScriptUserActivation::kDontActivate);
   // Static variant of the above.
   static base::Value ExecuteScript(content::BrowserContext* browser_context,
                                    const ExtensionId& extension_id,
                                    const std::string& script,
+                                   ResultCapture result_capture,
                                    ScriptUserActivation script_user_activation =
                                        ScriptUserActivation::kDontActivate);
 
@@ -73,9 +83,12 @@
   // `kDontActivate` for service worker-based extensions.
   bool ExecuteScriptAsync(const ExtensionId& extension_id,
                           const std::string& script,
+                          ResultCapture result_capture,
                           ScriptUserActivation script_user_activation =
                               ScriptUserActivation::kDontActivate);
-  // Static variant of the above.
+  // Static variant of the above. Inherently, this cannot handle a result
+  // (because it is not returned synchronously and there's no exposed instance
+  // of BackgroundScriptExecutor).
   static bool ExecuteScriptAsync(content::BrowserContext* browser_context,
                                  const ExtensionId& extension_id,
                                  const std::string& script,
@@ -99,10 +112,6 @@
   bool ExecuteScriptInBackgroundPage(
       ScriptUserActivation script_user_activation);
 
-  // Method invoked when the service worker script has finished executing.
-  void OnServiceWorkerResult(base::Value result,
-                             const absl::optional<std::string>& error);
-
   // Method to ADD_FAILURE() to the currently-running test with the given
   // `message` and other debugging info, like the injected script and associated
   // extension.
@@ -119,23 +128,22 @@
   // ExecuteScript*().
   absl::optional<BackgroundType> background_type_;
 
+  // The method the script will use to send the result.
+  ResultCapture result_capture_method_ = ResultCapture::kNone;
+
   // The DOMMessageQueue used for retrieving results from background page-based
-  // extensions.
+  // extensions with `ResultCapture::kWindowDomAutomationController`.
   std::unique_ptr<content::DOMMessageQueue> message_queue_;
 
-  // The returned result; only used for service worker-based extensions.
-  base::Value result_;
-  // A quit closure for a running RunLoop; only used for service worker-based
-  // extensions.
-  base::OnceClosure quit_closure_;
+  // The ScriptResultQueue for retrieving results from contexts using
+  // `ResultCapture::kSendScriptResult`.
+  std::unique_ptr<ScriptResultQueue> script_result_queue_;
 
   // The associated Extension.
   const Extension* extension_ = nullptr;
 
-  // The script to inject.
+  // The script to inject; cached mostly for logging purposes.
   std::string script_;
-
-  base::WeakPtrFactory<BackgroundScriptExecutor> weak_factory_{this};
 };
 
 // Waits until |script| calls "window.domAutomationController.send(result)",
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index 561a71d..7cdf5a80 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1714,6 +1714,7 @@
   ENTERPRISEREPORTINGPRIVATE_ENQUEUERECORD = 1651,
   FILEMANAGERPRIVATE_SENDFEEDBACK = 1652,
   DECLARATIVENETREQUEST_TESTMATCHOUTCOME = 1653,
+  FILEMANAGERPRIVATE_CANCELMOUNTING = 1654,
   // Last entry: Add new entries above, then run:
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/script_result_queue.cc b/extensions/browser/script_result_queue.cc
new file mode 100644
index 0000000..80ba360
--- /dev/null
+++ b/extensions/browser/script_result_queue.cc
@@ -0,0 +1,41 @@
+// Copyright 2022 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 "extensions/browser/script_result_queue.h"
+
+#include "base/run_loop.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+
+ScriptResultQueue::ScriptResultQueue() {
+  test_api_observation_.Observe(
+      extensions::TestApiObserverRegistry::GetInstance());
+}
+ScriptResultQueue::~ScriptResultQueue() = default;
+
+void ScriptResultQueue::OnScriptResult(const base::Value& script_result) {
+  results_.push_back(script_result.Clone());
+  if (quit_closure_)
+    std::move(quit_closure_).Run();
+}
+
+base::Value ScriptResultQueue::GetNextResult() {
+  if (next_result_index_ >= results_.size()) {
+    base::RunLoop run_loop;
+    quit_closure_ = run_loop.QuitClosure();
+    run_loop.Run();
+  }
+  if (next_result_index_ >= results_.size()) {
+    // This can happen if the run loop times out. Handle it gracefully to avoid
+    // crashing the test runner.
+    ADD_FAILURE() << "Could not get next result at index "
+                  << next_result_index_;
+    return base::Value();
+  }
+
+  return results_[next_result_index_++].Clone();
+}
+
+}  // namespace extensions
diff --git a/extensions/browser/script_result_queue.h b/extensions/browser/script_result_queue.h
new file mode 100644
index 0000000..aa51a732
--- /dev/null
+++ b/extensions/browser/script_result_queue.h
@@ -0,0 +1,50 @@
+// Copyright 2022 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 EXTENSIONS_BROWSER_SCRIPT_RESULT_QUEUE_H_
+#define EXTENSIONS_BROWSER_SCRIPT_RESULT_QUEUE_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/scoped_observation.h"
+#include "base/values.h"
+#include "extensions/browser/api/test/test_api_observer.h"
+#include "extensions/browser/api/test/test_api_observer_registry.h"
+
+namespace extensions {
+
+// Intercepts results sent via chrome.test.sendScriptResult().
+// TODO(devlin): Add details of this class and sendScriptResult() to
+// //extensions/docs/extension_tests.md.
+class ScriptResultQueue : public TestApiObserver {
+ public:
+  ScriptResultQueue();
+  ~ScriptResultQueue() override;
+
+  // TestApiObserver:
+  void OnScriptResult(const base::Value& script_result) override;
+
+  // Returns the next result, optionally waiting for it to come in.
+  base::Value GetNextResult();
+
+  const std::vector<base::Value>& results() const { return results_; }
+
+ private:
+  // The index of the next result to return.
+  size_t next_result_index_ = 0u;
+
+  // The collection of all script results this queue has seen.
+  std::vector<base::Value> results_;
+
+  // Quit closure to call when waiting for a result.
+  base::OnceClosure quit_closure_;
+
+  base::ScopedObservation<TestApiObserverRegistry, TestApiObserver>
+      test_api_observation_{this};
+};
+
+}  // namespace extensions
+
+#endif  // EXTENSIONS_BROWSER_SCRIPT_RESULT_QUEUE_H_
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn
index 21575366..abffae1 100644
--- a/extensions/common/BUILD.gn
+++ b/extensions/common/BUILD.gn
@@ -223,6 +223,8 @@
     "api/sockets/sockets_manifest_handler.h",
     "api/sockets/sockets_manifest_permission.cc",
     "api/sockets/sockets_manifest_permission.h",
+    "command.cc",
+    "command.h",
     "common_manifest_handlers.cc",
     "common_manifest_handlers.h",
     "common_param_traits.h",
@@ -541,6 +543,7 @@
     "api/declarative_net_request/dnr_manifest_unittest.cc",
     "api/printer_provider/usb_printer_manifest_unittest.cc",
     "api/sockets/sockets_manifest_permission_unittest.cc",
+    "command_unittest.cc",
     "component_extension_url_pattern_unittest.cc",
     "csp_validator_unittest.cc",
     "error_utils_unittest.cc",
diff --git a/extensions/common/api/test.json b/extensions/common/api/test.json
index 07fbbf53..84086e4d 100644
--- a/extensions/common/api/test.json
+++ b/extensions/common/api/test.json
@@ -132,6 +132,17 @@
         }
       },
       {
+        "name": "sendScriptResult",
+        "type": "function",
+        "description": "Sends a result back to the browser as a result of script executing; this is handy for communicating results from browser-driven script execution.",
+        "parameters": [{"type": "any", "name": "result"}],
+        "returns_async": {
+          "name": "callback",
+          "optional": true,
+          "parameters": []
+        }
+      },
+      {
         "name": "callbackAdded",
         "type": "function",
         "nocompile": true,
diff --git a/chrome/common/extensions/command.cc b/extensions/common/command.cc
similarity index 94%
rename from chrome/common/extensions/command.cc
rename to extensions/common/command.cc
index 3442d4d..c6bb6ed 100644
--- a/chrome/common/extensions/command.cc
+++ b/extensions/common/command.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/common/extensions/command.h"
+#include "extensions/common/command.h"
 
 #include <stddef.h>
 
@@ -132,19 +132,13 @@
       modifiers |= ui::EF_SHIFT_DOWN;
     } else if (tokens[i].size() == 1 ||  // A-Z, 0-9.
                tokens[i] == values::kKeyComma ||
-               tokens[i] == values::kKeyPeriod ||
-               tokens[i] == values::kKeyUp ||
-               tokens[i] == values::kKeyDown ||
-               tokens[i] == values::kKeyLeft ||
-               tokens[i] == values::kKeyRight ||
-               tokens[i] == values::kKeyIns ||
-               tokens[i] == values::kKeyDel ||
-               tokens[i] == values::kKeyHome ||
-               tokens[i] == values::kKeyEnd ||
-               tokens[i] == values::kKeyPgUp ||
+               tokens[i] == values::kKeyPeriod || tokens[i] == values::kKeyUp ||
+               tokens[i] == values::kKeyDown || tokens[i] == values::kKeyLeft ||
+               tokens[i] == values::kKeyRight || tokens[i] == values::kKeyIns ||
+               tokens[i] == values::kKeyDel || tokens[i] == values::kKeyHome ||
+               tokens[i] == values::kKeyEnd || tokens[i] == values::kKeyPgUp ||
                tokens[i] == values::kKeyPgDwn ||
-               tokens[i] == values::kKeySpace ||
-               tokens[i] == values::kKeyTab ||
+               tokens[i] == values::kKeySpace || tokens[i] == values::kKeyTab ||
                tokens[i] == values::kKeyMediaNextTrack ||
                tokens[i] == values::kKeyMediaPlayPause ||
                tokens[i] == values::kKeyMediaPrevTrack ||
@@ -309,9 +303,8 @@
 ui::Accelerator Command::StringToAccelerator(const std::string& accelerator,
                                              const std::string& command_name) {
   std::u16string error;
-  ui::Accelerator parsed =
-      ParseImpl(accelerator, Command::CommandPlatform(), 0,
-                IsNamedCommand(command_name), &error);
+  ui::Accelerator parsed = ParseImpl(accelerator, Command::CommandPlatform(), 0,
+                                     IsNamedCommand(command_name), &error);
   return parsed;
 }
 
@@ -346,7 +339,7 @@
       accelerator.key_code() <= ui::VKEY_9) {
     shortcut += '0' + (accelerator.key_code() - ui::VKEY_0);
   } else if (accelerator.key_code() >= ui::VKEY_A &&
-           accelerator.key_code() <= ui::VKEY_Z) {
+             accelerator.key_code() <= ui::VKEY_Z) {
     shortcut += 'A' + (accelerator.key_code() - ui::VKEY_A);
   } else {
     switch (accelerator.key_code()) {
@@ -489,8 +482,8 @@
       return false;
     }
 
-    suggestions[iter->first] = NormalizeShortcutSuggestion(iter->second,
-                                                           iter->first);
+    suggestions[iter->first] =
+        NormalizeShortcutSuggestion(iter->second, iter->first);
   }
 
   std::string platform = CommandPlatform();
@@ -508,7 +501,7 @@
   // errors for platforms other than the current one) but use only what we need.
   std::map<const std::string, std::string>::const_iterator iter =
       suggestions.begin();
-  for ( ; iter != suggestions.end(); ++iter) {
+  for (; iter != suggestions.end(); ++iter) {
     ui::Accelerator accelerator;
     if (!iter->second.empty()) {
       // Note that we pass iter->first to pretend we are on a platform we're not
diff --git a/chrome/common/extensions/command.h b/extensions/common/command.h
similarity index 91%
rename from chrome/common/extensions/command.h
rename to extensions/common/command.h
index d3fbe69..69955928 100644
--- a/chrome/common/extensions/command.h
+++ b/extensions/common/command.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_COMMON_EXTENSIONS_COMMAND_H_
-#define CHROME_COMMON_EXTENSIONS_COMMAND_H_
+#ifndef EXTENSIONS_COMMON_COMMAND_H_
+#define EXTENSIONS_COMMON_COMMAND_H_
 
 #include <map>
 #include <string>
@@ -59,9 +59,7 @@
   void set_accelerator(const ui::Accelerator& accelerator) {
     accelerator_ = accelerator;
   }
-  void set_global(bool global) {
-    global_ = global;
-  }
+  void set_global(bool global) { global_ = global; }
 
  private:
   std::string command_name_;
@@ -75,4 +73,4 @@
 
 }  // namespace extensions
 
-#endif  // CHROME_COMMON_EXTENSIONS_COMMAND_H_
+#endif  // EXTENSIONS_COMMON_COMMAND_H_
diff --git a/chrome/common/extensions/command_unittest.cc b/extensions/common/command_unittest.cc
similarity index 97%
rename from chrome/common/extensions/command_unittest.cc
rename to extensions/common/command_unittest.cc
index fc3d8b46..fda6153d 100644
--- a/chrome/common/extensions/command_unittest.cc
+++ b/extensions/common/command_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/common/extensions/command.h"
+#include "extensions/common/command.h"
 
 #include <stddef.h>
 
@@ -95,8 +95,8 @@
 
 TEST(CommandTest, ExtensionCommandParsing) {
   const ui::Accelerator none = ui::Accelerator();
-  const ui::Accelerator shift_f = ui::Accelerator(ui::VKEY_F,
-                                                  ui::EF_SHIFT_DOWN);
+  const ui::Accelerator shift_f =
+      ui::Accelerator(ui::VKEY_F, ui::EF_SHIFT_DOWN);
 #if BUILDFLAG(IS_MAC)
   int ctrl = ui::EF_COMMAND_DOWN;
 #else
@@ -245,7 +245,9 @@
   ui::Accelerator accelerator(ui::VKEY_D,
                               ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
 #endif
-  EXPECT_EQ(accelerator, command.accelerator());
+  EXPECT_EQ(accelerator, command.accelerator())
+      << Command::AcceleratorToString(command.accelerator()) << " vs "
+      << Command::AcceleratorToString(accelerator);
 
   // Misspell a platform.
   key_dict->SetStringKey("windosw", "Ctrl+M");
diff --git a/extensions/renderer/localization_peer.cc b/extensions/renderer/localization_peer.cc
index 52fa4a0..b6e5e1d7 100644
--- a/extensions/renderer/localization_peer.cc
+++ b/extensions/renderer/localization_peer.cc
@@ -66,7 +66,8 @@
 }
 
 void ExtensionLocalizationPeer::OnReceivedResponse(
-    network::mojom::URLResponseHeadPtr head) {
+    network::mojom::URLResponseHeadPtr head,
+    base::TimeTicks response_arrival_at_renderer) {
   response_head_ = std::move(head);
 }
 
diff --git a/extensions/renderer/localization_peer.h b/extensions/renderer/localization_peer.h
index 90d1529..021aa06c 100644
--- a/extensions/renderer/localization_peer.h
+++ b/extensions/renderer/localization_peer.h
@@ -59,7 +59,9 @@
   bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
                           network::mojom::URLResponseHeadPtr head,
                           std::vector<std::string>*) override;
-  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) override;
+  void OnReceivedResponse(
+      network::mojom::URLResponseHeadPtr head,
+      base::TimeTicks response_arrival_at_renderer) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
diff --git a/extensions/renderer/localization_peer_unittest.cc b/extensions/renderer/localization_peer_unittest.cc
index 1d963a82..ee443038 100644
--- a/extensions/renderer/localization_peer_unittest.cc
+++ b/extensions/renderer/localization_peer_unittest.cc
@@ -75,8 +75,8 @@
                bool(const net::RedirectInfo& redirect_info,
                     network::mojom::URLResponseHeadPtr head,
                     std::vector<std::string>*));
-  MOCK_METHOD1(OnReceivedResponse,
-               void(network::mojom::URLResponseHeadPtr head));
+  MOCK_METHOD2(OnReceivedResponse,
+               void(network::mojom::URLResponseHeadPtr head, base::TimeTicks));
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override {
     body_handle_ = std::move(body);
@@ -214,7 +214,7 @@
   EXPECT_CALL(*original_peer_, OnReceivedDataInternal(std::string()));
   EXPECT_CALL(*sender_, Send(_)).Times(0);
 
-  EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
+  EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _));
   network::URLLoaderCompletionStatus status(net::OK);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status));
 
@@ -229,7 +229,7 @@
   const std::string kExpectedData = "some text";
   EXPECT_CALL(*sender_, Send(_));
 
-  EXPECT_CALL(*original_peer_, OnReceivedResponse(_)).Times(1);
+  EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)).Times(1);
   EXPECT_CALL(*original_peer_, OnReceivedDataInternal(kExpectedData)).Times(1);
   network::URLLoaderCompletionStatus status(net::OK);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status)).Times(1);
@@ -241,7 +241,7 @@
   // Test if Send gets called again (it shouldn't be) when first call returned
   // an empty dictionary.
   SetUpExtensionLocalizationPeer("text/css", GURL(kExtensionUrl_1));
-  EXPECT_CALL(*original_peer_, OnReceivedResponse(_)).Times(1);
+  EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _)).Times(1);
   EXPECT_CALL(*original_peer_, OnReceivedDataInternal(kExpectedData)).Times(1);
   EXPECT_CALL(*original_peer_, OnCompletedRequest(status)).Times(1);
   SetData(kExpectedData);
@@ -264,7 +264,7 @@
 
   // __MSG_text__ gets replaced with "new text".
   std::string data("some new text");
-  EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
+  EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _));
   EXPECT_CALL(*original_peer_, OnReceivedDataInternal(data));
 
   network::URLLoaderCompletionStatus status(net::OK);
@@ -291,7 +291,7 @@
   EXPECT_CALL(*sender_, Send(_)).Times(0);
 
   // __MSG_missing_message__ is missing, so message stays the same.
-  EXPECT_CALL(*original_peer_, OnReceivedResponse(_));
+  EXPECT_CALL(*original_peer_, OnReceivedResponse(_, _));
   EXPECT_CALL(*original_peer_, OnReceivedDataInternal(message));
 
   network::URLLoaderCompletionStatus status(net::OK);
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index 4e94ca6..ee0811f9 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -3988,6 +3988,30 @@
       "features": [
         "use_virtualized_gl_contexts"
       ]
+    },
+    {
+      "id": 394,
+      "cr_bugs": [1318380],
+      "description": "Don't use video processor super resolution on Intel Gen9 and older GPUs and non-Intel GPUs.",
+      "os": {
+        "type" : "win"
+      },
+      "exceptions": [
+        {
+          "vendor_id": "0x8086",
+          "intel_gpu_generation": {
+            "op": ">",
+            "value": "9"
+          },
+          "driver_version": {
+            "op": ">",
+            "value": "27.20.100.8681"
+          }
+        }
+      ],
+      "features": [
+          "disable_vp_super_resolution"
+      ]
     }
   ]
 }
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt
index 3f14f7c..d36e9b03 100644
--- a/gpu/config/gpu_workaround_list.txt
+++ b/gpu/config/gpu_workaround_list.txt
@@ -59,6 +59,7 @@
 disable_texture_storage
 disable_timestamp_queries
 disable_vp_scaling
+disable_vp_super_resolution
 disable_webgl_rgb_multisampling_usage
 disallow_large_instanced_draw
 disallow_vp9_resilient_dxva_decoding
diff --git a/gpu/ipc/service/image_transport_surface_win.cc b/gpu/ipc/service/image_transport_surface_win.cc
index af15f10..1aea035 100644
--- a/gpu/ipc/service/image_transport_surface_win.cc
+++ b/gpu/ipc/service/image_transport_surface_win.cc
@@ -32,6 +32,8 @@
   settings.disable_nv12_dynamic_textures =
       workarounds.disable_nv12_dynamic_textures;
   settings.disable_vp_scaling = workarounds.disable_vp_scaling;
+  settings.disable_vp_super_resolution =
+      workarounds.disable_vp_super_resolution;
   settings.use_angle_texture_offset = features::IsUsingSkiaRenderer();
   settings.force_root_surface_full_damage =
       features::IsUsingSkiaRenderer() &&
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index 5375aaf..49fb35e 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -811,7 +811,7 @@
     ]
   }
 
-  # TODO(https://crbug.com/1107396): These tests flakily timeout on fuchsia.
+  # TODO(crbug.com/1318548): Enable on Fuchsia when no longer flakily timeout.
   if (!is_fuchsia) {
     sources += [
       "test/headless_compositor_browsertest.cc",
diff --git "a/infra/config/generated/builders/ci/Win x64 Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Win x64 Builder \050dbg\051/properties.json"
index 6a2b1c4..90d44f0 100644
--- "a/infra/config/generated/builders/ci/Win x64 Builder \050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win x64 Builder \050dbg\051/properties.json"
@@ -1,4 +1,83 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder (dbg)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64 (dbg)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder (dbg)",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder (dbg)",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64 (dbg)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win10_chromium_x64_dbg_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 250,
diff --git "a/infra/config/generated/builders/ci/Win10 Tests x64 \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Win10 Tests x64 \050dbg\051/properties.json"
index 25eb08b2..1d20625a 100644
--- "a/infra/config/generated/builders/ci/Win10 Tests x64 \050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 Tests x64 \050dbg\051/properties.json"
@@ -1,4 +1,76 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder (dbg)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64 (dbg)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder (dbg)",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64 (dbg)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win10_chromium_x64_dbg_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/win10_chromium_x64_dbg_ng/properties.json b/infra/config/generated/builders/try/win10_chromium_x64_dbg_ng/properties.json
index d4fde02b..9a0c7730 100644
--- a/infra/config/generated/builders/try/win10_chromium_x64_dbg_ng/properties.json
+++ b/infra/config/generated/builders/try/win10_chromium_x64_dbg_ng/properties.json
@@ -1,4 +1,77 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder (dbg)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64 (dbg)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder (dbg)",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder (dbg)",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64 (dbg)",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/subprojects/chromium/ci/chromium.win.star b/infra/config/subprojects/chromium/ci/chromium.win.star
index 4b1e3d5..542d6217 100644
--- a/infra/config/subprojects/chromium/ci/chromium.win.star
+++ b/infra/config/subprojects/chromium/ci/chromium.win.star
@@ -61,6 +61,20 @@
 
 ci.builder(
     name = "Win x64 Builder (dbg)",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.DEBUG,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     builderless = True,
     console_view_entry = consoles.console_view_entry(
         category = "debug|builder",
@@ -75,6 +89,21 @@
 
 ci.builder(
     name = "Win10 Tests x64 (dbg)",
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.DEBUG,
+            target_bits = 64,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "debug|tester",
         short_name = "10",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
index 514ccf4..b391f75d 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -118,6 +118,10 @@
 
 try_.builder(
     name = "win10_chromium_x64_dbg_ng",
+    mirrors = [
+        "ci/Win x64 Builder (dbg)",
+        "ci/Win10 Tests x64 (dbg)",
+    ],
     os = os.WINDOWS_10,
 )
 
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
index 829e3d9a..3ccb056 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_az.xtb
@@ -83,6 +83,7 @@
 <translation id="632825460376924298">Chromium girişinə icazə verin</translation>
 <translation id="6337530241089703714">Chromium datanızınız bu cihazdan silinməsi və ya saxlanmasını seçin</translation>
 <translation id="6424492062988593837">Chromium yeniləndi! Yeni versiya əlçatandır.</translation>
+<translation id="6625409903340039086">Chromium indi idarə olunan hesabınız üçün istifadəçi siyasətlərini dəstəkləyir</translation>
 <translation id="6752854822223394465">Təşkilatınız Chromium'u ayarlayır...</translation>
 <translation id="6820823224820483452">Chromium bütün parolları yoxlaya bilmədi. Sabah yenidən cəhd edin.</translation>
 <translation id="7006920032187763988">Parol Menecerində saxladığınız parolları iPad'dakı digər tətbiqlərdə istifadə edə bilərsiniz.</translation>
@@ -104,6 +105,7 @@
 <translation id="7674213385180944843">Ayarlar &gt; Gizlilik &gt; Kamera &gt; Chromium tətbiqini açın və kameranı aktiv edin.</translation>
 <translation id="7746854981345936341">Chromium məsləhəti. Geri, İrəli və Axtariş kimi bəzi düymələr artıq ekranın aşağısında yerləşir.</translation>
 <translation id="7763454117143368771">Təhlükəli saytlardan qorunmaq və parollarınızı qorumaq üçün defolt brauzeriniz olaraq Chromium istifadə edin</translation>
+<translation id="7812317783196516890"><ph name="DOMAIN" /> tərəfindən idarə olunan hesaba daxil olmusunuz və onunla datanızı sinxronizasiya edirsiniz. Bu hesabın administratoru indi Chromimum'un davranışını dəyişə biləcək həmin hesaba xas istifadəçi siyasətlərini ayarlaya bilər.</translation>
 <translation id="786327964234957808">Sinxronizasiya hesablarını <ph name="USER_EMAIL1" /> hesabından <ph name="USER_EMAIL2" /> hesabına keçirirsiniz. Mövcud Chromium datanız <ph name="DOMAIN" /> tərəfindən idarə olunur. Datanızı bu cihazdan siləcək, lakin data <ph name="USER_EMAIL1" /> hesabında qalacaq.</translation>
 <translation id="7890287942691234100">Chromium skanerindən istifadə etməyə başlayın</translation>
 <translation id="7928628054454574139">Digər tətbiqlərdə istənilən vaxt keçidlərə toxunduqda Chromium açılsın</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb
index 413bdb33..b462044 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_az.xtb
@@ -7,6 +7,7 @@
 <translation id="1479202195792305274">Google Hesabınız ilə daxil olduqda Chrome parollarınızı yoxlaya bilər.</translation>
 <translation id="1493827051843127077">Tablar, parollar və ödəniş məlumatlarınızı bütün cihazlarınızda sinxronlaşdırmaq üçün defolt olaraq Chrome'u ayarlayın</translation>
 <translation id="1504372625950710826">Chrome güncəlləmələri yoxlaya bilmədi. İnternet bağlantınızı yoxlayın.</translation>
+<translation id="1511320244449497906"><ph name="DOMAIN" /> tərəfindən idarə olunan hesaba daxil olmusunuz və onunla datanızı sinxronizasiya edirsiniz. Bu hesabın administratoru indi Chrome'un davranışını dəyişə biləcək həmin hesaba xas istifadəçi siyasətlərini ayarlaya bilər.</translation>
 <translation id="1682483655351012182">Chrome Datasını Sinxronizasiya Edin</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1812249337131447686">İstifadə statistikası və qəza hesabatlarını Google'a göndərməklə Chrome'u təkmilləşdirməyə kömək edin</translation>
@@ -109,6 +110,7 @@
 <translation id="7780154209050837198">Chrome'dan maksimum yararlanmaq üçün Google Hesabınızla Chrome'a daxil olun.</translation>
 <translation id="7855730255114109580">Google Chrome güncəldir</translation>
 <translation id="8022947259858476807">Defolt olaraq keçidləri açmaq, vidcetlərdən axtarış etmək və digər tətbiqlərdə parolları avtomatik doldurmaq üçün Chrome istifadə edin</translation>
+<translation id="81358522153858150">Chrome indi idarə olunan hesabınız üçün istifadəçi siyasətlərini dəstəkləyir</translation>
 <translation id="8160472928944011082">Chrome güncəllənə bilmir</translation>
 <translation id="8263079278049777200">Bu sayta, Google hesabınıza və Chrome'a daxil olun. Sinxronlaşdırmanı daha sonra aktiv edə bilərsiniz.</translation>
 <translation id="8357607116237445042">Chrome datanızınız bu cihazdan silinməsi və ya saxlanmasını seçin</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb
index 8086455..85a5e34 100644
--- a/ios/chrome/app/strings/resources/ios_strings_af.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Jou boekmerke, geskiedenis, wagwoorde en meer sal nie meer met jou Google-rekening gesinkroniseer word nie.</translation>
 <translation id="4844899002472726590">Sien en wysig die onderwerpe waarin jy belangstel</translation>
 <translation id="4854345657858711387">Stel 'n wagkode</translation>
+<translation id="4858786880085262208">Gradeer waar moontlik op na HTTPS. Veilige webwerwe kan dalk inhoud inbed wat nie veilig is nie.</translation>
 <translation id="4860895144060829044">Bel</translation>
 <translation id="4872323082491632254">Gaan wagwoorde na</translation>
 <translation id="4881695831933465202">Maak oop</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Nuwe oortjie-bladsy</translation>
 <translation id="7781829728241885113">Gister</translation>
 <translation id="778855399387580014">Begin 'n soektog in 'n nuwe Chrome-oortjie.</translation>
+<translation id="7790892308048519147">Probeer om veilige verbindings te gebruik</translation>
 <translation id="7791543448312431591">Voeg by</translation>
 <translation id="7807060072011926525">Verskaf deur Google</translation>
 <translation id="7839985698273989086">Vanlyn bladsy</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index e08ccff..1f3a8af 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">የእርስዎ እልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ተጨማሪ ነገሮች ከእንግዲህ ከGoogle መለያዎ ጋር አይሰምሩም።</translation>
 <translation id="4844899002472726590">የሚፈልጓቸውን ርዕሶች ይመልከቱ እና ያርትዑ</translation>
 <translation id="4854345657858711387">የይለፍ ኮድ ያዘጋጁ</translation>
+<translation id="4858786880085262208">ሲቻል ወደ ኤችቲቲፒኤስ ያሳድጉ። ደህንነታቸው የተጠበቁ ጣቢያዎች ደህንነቱ ያልተጠበቀ ይዘትን ሊያካትቱ ይችላሉ።</translation>
 <translation id="4860895144060829044">ደውል</translation>
 <translation id="4872323082491632254">የይለፍ ቃላትዎን ይፈትሹ</translation>
 <translation id="4881695831933465202">ክፍት የሚሆንባቸው</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">የአዲስ ትር ገጽ</translation>
 <translation id="7781829728241885113">ትናንት</translation>
 <translation id="778855399387580014">በአዲስ የChrome ትር ውስጥ ፍለጋ ጀምር።</translation>
+<translation id="7790892308048519147">ደህንነቱ የተጠበቀ ግንኙነቶችን ለመጠቀም ይሞክሩ</translation>
 <translation id="7791543448312431591">ያክሉ</translation>
 <translation id="7807060072011926525">በGoogle የቀረበ</translation>
 <translation id="7839985698273989086">ከመስመር ውጭ ገጽ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 820935b1..af36327e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -227,6 +227,7 @@
 <translation id="2898963176829412617">مجلد جديد...</translation>
 <translation id="2916171785467530738">‏الإكمال التلقائي لعناوين URL وعمليات البحث</translation>
 <translation id="291754862089661335">ضَع رمز الاستجابة السريعة أو الرمز الشريطي في هذا الإطار</translation>
+<translation id="2920866371965792875">للاطّلاع على التحديثات في هذا الموقع الإلكتروني، يُرجى النقر هنا.</translation>
 <translation id="2921219216347069551">تتعذر مشاركة الصفحة</translation>
 <translation id="2923448633003185837">لصق وانتقال</translation>
 <translation id="292639812446257861">وضع علامة كغير مقروءة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb
index 1f1bcee..d8560cc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_az.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -190,6 +190,7 @@
 <translation id="2690858294534178585">Kamera istifadə olunur</translation>
 <translation id="2691653761409724435">Oflayn şəkildə əlçatan deyil</translation>
 <translation id="2695507686909505111">Səhifə tərcümə edildi</translation>
+<translation id="2697526135132990015">Çıxış edin və datanı silin</translation>
 <translation id="2700241355396984822">İcazələri ayarlamaq üçün seçimlər</translation>
 <translation id="2702801445560668637">Siyahı oxunur</translation>
 <translation id="2704491540504985681">Endirmələr</translation>
@@ -365,6 +366,7 @@
 <translation id="4121993058175073134">Növbəti raport datasını göndərmək üçün Ayarlar tətbiqində e-poçt hesabınızı sazlayın.</translation>
 <translation id="4124987746317609294">Vaxt Aralığı</translation>
 <translation id="4133265950310064865">Təkmil Qoruma</translation>
+<translation id="4148023517926189160">Bu vebsayt faylı endirmək və onu təqviminizə əlavə etmək istəyir.</translation>
 <translation id="4152011295694446843">Əlfəcinləri burada tapa bilərsiniz</translation>
 <translation id="4172051516777682613">Həmişə göstərin</translation>
 <translation id="418156467088430727">Oflayn versiyaya yeni tabda baxın</translation>
@@ -692,6 +694,7 @@
 <translation id="6760509555861141183">Son Taba qayıdın</translation>
 <translation id="6762812039470893796">Bütün seçimləri silin</translation>
 <translation id="6780034285637185932">Poçt İndeksi</translation>
+<translation id="6781260999953472352">Sinxronizasiya aktiv edilsin?</translation>
 <translation id="6785453220513215166">Qəza haqqında hesabat göndərilir...</translation>
 <translation id="6797885426782475225">Səsli Axtarış</translation>
 <translation id="6801927553864092214">Məxfi axtarış etmək üçün Anonim tab açın</translation>
@@ -804,6 +807,7 @@
 <translation id="7807060072011926525">Google tərəfindən təmin edilib</translation>
 <translation id="7839985698273989086">Oflayn Səhifə</translation>
 <translation id="7840771868269352570">Seçdiyiniz elementlər silinəcək.</translation>
+<translation id="784551991304901159">Məzmunu görmək üçün menyudan "Aktiv edin" seçimini edin</translation>
 <translation id="7853202427316060426">Fəalliyyət</translation>
 <translation id="7856733331829174190">Yüklənmədi</translation>
 <translation id="7859704718976024901">Brauzer Tarixçəsi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb
index 71b7ea5e..8df80458 100644
--- a/ios/chrome/app/strings/resources/ios_strings_be.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Новая папка…</translation>
 <translation id="2916171785467530738">Аўтазапаўненне ў полі пошуку і URL-адраса</translation>
 <translation id="291754862089661335">Змясціце QR-код або штрыхкод у гэтай рамцы</translation>
+<translation id="2920866371965792875">Каб бачыць навіны з гэтага сайта, падпішыцеся на яго тут.</translation>
 <translation id="2921219216347069551">Не ўдалося абагуліць</translation>
 <translation id="2923448633003185837">Уставіць і перайсці</translation>
 <translation id="292639812446257861">Пазначыць як непрачытаныя</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index 7daabb3..d2bae013f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Нова папка…</translation>
 <translation id="2916171785467530738">Автоматично довършване на заявки за търсене и URL адреси</translation>
 <translation id="291754862089661335">Поставете кода за бърза реакция или баркода в тази рамка</translation>
+<translation id="2920866371965792875">За да виждате актуална информация от този сайт, последвайте го тук.</translation>
 <translation id="2921219216347069551">Стр. не може да се сподели</translation>
 <translation id="2923448633003185837">Поставяне и старт</translation>
 <translation id="292639812446257861">Означаване като непрочетено</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index a28a0de5..270c17fd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Carpeta nova…</translation>
 <translation id="2916171785467530738">Completa automàticament les cerques i els URL</translation>
 <translation id="291754862089661335">Situa el codi QR o el codi de barres dins d'aquest marc</translation>
+<translation id="2920866371965792875">Per veure actualitzacions d'aquest lloc web, segueix-lo aquí.</translation>
 <translation id="2921219216347069551">No es pot compartir la pàgina</translation>
 <translation id="2923448633003185837">Enganxa i ves-hi</translation>
 <translation id="292639812446257861">Marca com a no llegit</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
index 1fc4dd9..9c530575 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Ffolder Newydd…</translation>
 <translation id="2916171785467530738">Awtogwblhau Chwiliadau a Chyfeiriadau URL</translation>
 <translation id="291754862089661335">Gosod cod QR neu god bar yn y ffrâm hon</translation>
+<translation id="2920866371965792875">I weld diweddariadau o'r wefan hon, dilynwch hi yma.</translation>
 <translation id="2921219216347069551">Methu â Rhannu'r Dudalen</translation>
 <translation id="2923448633003185837">Gludo a mynd</translation>
 <translation id="292639812446257861">Marcio fel heb ei Ddarllen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 950f00d9..ffa7704 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Ny mappe...</translation>
 <translation id="2916171785467530738">Autofuldfør søgninger og webadresser</translation>
 <translation id="291754862089661335">Placer QR-kode eller stregkode i denne ramme</translation>
+<translation id="2920866371965792875">Hvis du vil se opdateringer fra dette website, kan du følge det her.</translation>
 <translation id="2921219216347069551">Siden kan ikke deles</translation>
 <translation id="2923448633003185837">Indsæt og fortsæt</translation>
 <translation id="292639812446257861">Markér som ulæst</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 4665deb..734f4f5f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Neuer Ordner…</translation>
 <translation id="2916171785467530738">Suchanfragen und URLs automatisch vervollständigen</translation>
 <translation id="291754862089661335">Positioniere den QR-Code oder Barcode in diesem Bereich</translation>
+<translation id="2920866371965792875">Wenn du Neuigkeiten von dieser Website sehen möchtest, klicke hier, um ihr zu folgen.</translation>
 <translation id="2921219216347069551">Seite kann nicht geteilt werden</translation>
 <translation id="2923448633003185837">Einfügen und los</translation>
 <translation id="292639812446257861">Als ungelesen markieren</translation>
@@ -450,6 +451,7 @@
 <translation id="4840495572919996524">Deine Lesezeichen, der Verlauf, deine Passwörter und andere Einstellungen werden nicht mehr mit deinem Google-Konto synchronisiert.</translation>
 <translation id="4844899002472726590">Hier kannst du Themen sehen und bearbeiten, die dich interessieren</translation>
 <translation id="4854345657858711387">Passcode einrichten</translation>
+<translation id="4858786880085262208">Auf HTTPS umstellen, falls möglich. Sichere Websites können Inhalte einbetten, die nicht sicher sind.</translation>
 <translation id="4860895144060829044">Anrufen</translation>
 <translation id="4872323082491632254">Passwörter prüfen</translation>
 <translation id="4881695831933465202">Öffnen</translation>
@@ -799,6 +801,7 @@
 <translation id="7781069478569868053">"Neuer Tab"-Seite</translation>
 <translation id="7781829728241885113">Gestern</translation>
 <translation id="778855399387580014">Eine Suche in einem neuen Chrome-Tab starten.</translation>
+<translation id="7790892308048519147">Versuchen, sichere Verbindungen zu nutzen</translation>
 <translation id="7791543448312431591">Hinzufügen</translation>
 <translation id="7807060072011926525">Von Google bereitgestellt</translation>
 <translation id="7839985698273989086">Offlineseite</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 793eb6b..b371d8b5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Νέος φάκελος…</translation>
 <translation id="2916171785467530738">Αυτόματη συμπλήρωση αναζητήσεων και URL</translation>
 <translation id="291754862089661335">Τοποθετήστε τον κώδικα QR ή τον γραμμωτό κώδικα σε αυτό το πλαίσιο</translation>
+<translation id="2920866371965792875">Για να βλέπετε ενημερώσεις από αυτόν τον ιστότοπο, ακολουθήστε τον εδώ.</translation>
 <translation id="2921219216347069551">Κοιν.χ. σελ. αδύνατη</translation>
 <translation id="2923448633003185837">Επικόλληση και μετάβαση</translation>
 <translation id="292639812446257861">Επισ. ως μη αναγνωσμένων</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
index 13995d4..da651ac 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Your bookmarks, history, passwords and more will no longer be synced to your Google Account.</translation>
 <translation id="4844899002472726590">See and edit the topics that you're interested in</translation>
 <translation id="4854345657858711387">Set A Passcode</translation>
+<translation id="4858786880085262208">Upgrade to HTTPS, when possible. Secure sites might embed content that isn't secure.</translation>
 <translation id="4860895144060829044">Call</translation>
 <translation id="4872323082491632254">Check passwords</translation>
 <translation id="4881695831933465202">Open</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">New Tab Page</translation>
 <translation id="7781829728241885113">Yesterday</translation>
 <translation id="778855399387580014">Start a search in a new Chrome tab.</translation>
+<translation id="7790892308048519147">Try to use secure connections</translation>
 <translation id="7791543448312431591">Add</translation>
 <translation id="7807060072011926525">Provided by Google</translation>
 <translation id="7839985698273989086">Offline page</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
index 81acf2ec..cd0658cb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Nueva carpeta…</translation>
 <translation id="2916171785467530738">Autocompletar búsquedas y URL</translation>
 <translation id="291754862089661335">Coloca el código QR o de barras en este recuadro</translation>
+<translation id="2920866371965792875">Para ver las actualizaciones del sitio, síguelo aquí.</translation>
 <translation id="2921219216347069551">Error al compartir</translation>
 <translation id="2923448633003185837">Pegar y acceder</translation>
 <translation id="292639812446257861">Marcar como no leídas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index e423cd7..6957874 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Nueva carpeta…</translation>
 <translation id="2916171785467530738">Autocompletar búsquedas y URLs</translation>
 <translation id="291754862089661335">Coloca el código QR o de barras en este marco</translation>
+<translation id="2920866371965792875">Para ver las novedades de este sitio, síguelo aquí.</translation>
 <translation id="2921219216347069551">Error al compartir página</translation>
 <translation id="2923448633003185837">Pegar y acceder</translation>
 <translation id="292639812446257861">Marcar como no leídas</translation>
@@ -450,6 +451,7 @@
 <translation id="4840495572919996524">Tus marcadores, el historial, las contraseñas y otros datos dejarán de sincronizarse con tu cuenta de Google.</translation>
 <translation id="4844899002472726590">Consulta y edita los temas que te interesan</translation>
 <translation id="4854345657858711387">Establecer una contraseña</translation>
+<translation id="4858786880085262208">Cambia a HTTPS cuando sea posible. Los sitios seguros podrían insertar contenido que no es seguro.</translation>
 <translation id="4860895144060829044">Llamar</translation>
 <translation id="4872323082491632254">Comprobar contraseñas</translation>
 <translation id="4881695831933465202">Abrir</translation>
@@ -799,6 +801,7 @@
 <translation id="7781069478569868053">Página Nueva pestaña</translation>
 <translation id="7781829728241885113">Ayer</translation>
 <translation id="778855399387580014">Inicia una búsqueda en una nueva pestaña de Chrome.</translation>
+<translation id="7790892308048519147">Intentar usar conexiones seguras</translation>
 <translation id="7791543448312431591">Añadir</translation>
 <translation id="7807060072011926525">Proporcionado por Google</translation>
 <translation id="7839985698273989086">Página sin conexión</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
index d391b98..b5dd66c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Karpeta berria…</translation>
 <translation id="2916171785467530738">Bete automatikoki bilaketak eta URLak</translation>
 <translation id="291754862089661335">Ezarri QR kodea edo barra-kodea marko honetan</translation>
+<translation id="2920866371965792875">Webguneari buruzko informazio eguneratua ikusteko, jarrai iezaiozu hemen.</translation>
 <translation id="2921219216347069551">Ezin da partekatu orria</translation>
 <translation id="2923448633003185837">Itsatsi eta listo</translation>
 <translation id="292639812446257861">Markatu irakurri gabeko gisa</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index cb09a1a..c1f0c87 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Uusi kansio…</translation>
 <translation id="2916171785467530738">Hakujen ja URL-osoitteiden automaattinen täydennys</translation>
 <translation id="291754862089661335">Aseta QR- tai viivakoodi tämän kehyksen sisälle.</translation>
+<translation id="2920866371965792875">Jos haluat päivityksiä tältä sivustolta, seuraa sitä täältä.</translation>
 <translation id="2921219216347069551">Sivun jako epäonnist</translation>
 <translation id="2923448633003185837">Liitä ja siirry</translation>
 <translation id="292639812446257861">Merkitse lukemattomaksi</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 3e86efe0..53e964c8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Ang iyong mga bookmark, history, mga password, at higit pa ay hindi na masi-sync sa Google Account mo.</translation>
 <translation id="4844899002472726590">Tingnan at i-edit ang mga paksa kung saan ka interesado</translation>
 <translation id="4854345657858711387">Magtakda ng Passcode</translation>
+<translation id="4858786880085262208">Mag-upgrade sa HTTPS, kapag posible. Posibleng mag-embed ng content na hindi secure ang mga secure na site.</translation>
 <translation id="4860895144060829044">Tawagan</translation>
 <translation id="4872323082491632254">Suriin ang Mga Password</translation>
 <translation id="4881695831933465202">Buksan</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Page ng Bagong Tab</translation>
 <translation id="7781829728241885113">Kahapon</translation>
 <translation id="778855399387580014">Start a search in a new Chrome tab.</translation>
+<translation id="7790892308048519147">Subukang gumamit ng mga secure na koneksyon</translation>
 <translation id="7791543448312431591">Idagdag</translation>
 <translation id="7807060072011926525">Ibinibigay ng Google</translation>
 <translation id="7839985698273989086">Offline na Page</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
index 50940e7..d8ff076 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Nouveau dossier...</translation>
 <translation id="2916171785467530738">Saisie semi-automatique des recherches et des URL</translation>
 <translation id="291754862089661335">Placer le code QR ou le code à barres dans ce cadre</translation>
+<translation id="2920866371965792875">Pour voir des mises à jour de ce site, suivez-le ici.</translation>
 <translation id="2921219216347069551">Partage page imposs.</translation>
 <translation id="2923448633003185837">Coller et rechercher</translation>
 <translation id="292639812446257861">Marquer comme non lu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 81e25cb..899baee 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Nouveau dossier…</translation>
 <translation id="2916171785467530738">Saisir semi-automatiquement les recherches et les URL</translation>
 <translation id="291754862089661335">Positionnez le code QR ou le code-barres dans ce cadre</translation>
+<translation id="2920866371965792875">Appuyez ici pour suivre l'actualité de ce site.</translation>
 <translation id="2921219216347069551">Impossible de partager page</translation>
 <translation id="2923448633003185837">Coller et rechercher</translation>
 <translation id="292639812446257861">Marquer comme non lues</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
index c5500e2..ce2960c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Cartafol novo...</translation>
 <translation id="2916171785467530738">Completar buscas e URL automaticamente</translation>
 <translation id="291754862089661335">Coloca o código QR ou o código de barras neste marco</translation>
+<translation id="2920866371965792875">Para ver novidades deste sitio, comeza a seguilo aquí.</translation>
 <translation id="2921219216347069551">Non se pode compartir a páxina</translation>
 <translation id="2923448633003185837">Pegar e acceder</translation>
 <translation id="292639812446257861">Marcar como non lidos</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index 206442a..ade958d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Könyvjelzői, előzményei, jelszavai és más beállításai többé nem lesznek szinkronizálva a Google-fiókjával.</translation>
 <translation id="4844899002472726590">Megtekintheti és szerkesztheti az Önt érdeklő témákat</translation>
 <translation id="4854345657858711387">Biztonsági kód beállítása</translation>
+<translation id="4858786880085262208">Lehetőség szerint váltson HTTPS-re. Biztonságos webhelyek beágyazhatnak nem biztonságos tartalmakat.</translation>
 <translation id="4860895144060829044">Hívás</translation>
 <translation id="4872323082491632254">Jelszavak ellenőrzése</translation>
 <translation id="4881695831933465202">Megnyitás</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Új lap oldal</translation>
 <translation id="7781829728241885113">Tegnap</translation>
 <translation id="778855399387580014">Keresés indítása új Chrome-lapon.</translation>
+<translation id="7790892308048519147">Igyekezzen biztonságos kapcsolatot használni</translation>
 <translation id="7791543448312431591">Hozzáadás</translation>
 <translation id="7807060072011926525">A Google biztosítja</translation>
 <translation id="7839985698273989086">Offline oldal</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
index 1250139..d33a8749 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Նոր պանակ…</translation>
 <translation id="2916171785467530738">Որոնման հարցումների և URL-ների ինքնալրացում</translation>
 <translation id="291754862089661335">Դիրքավորեք QR-կոդը կամ գծակոդը այս շրջանակի մեջ</translation>
+<translation id="2920866371965792875">Հետևեք կայքին՝ դրա նորությունների մասին տեղեկանալու համար։</translation>
 <translation id="2921219216347069551">Չհաջողվեց համօգտագործել էջը</translation>
 <translation id="2923448633003185837">Տեղադրել և անցնել</translation>
 <translation id="292639812446257861">Նշել որպես չկարդացված</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 5dc7ffb..54c3147 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Folder Baru…</translation>
 <translation id="2916171785467530738">Lengkapi Otomatis Penelusuran dan URL</translation>
 <translation id="291754862089661335">Letakkan kode QR atau kode batang dalam bingkai ini</translation>
+<translation id="2920866371965792875">Untuk melihat info terbaru dari situs ini, klik di sini untuk mengikutinya.</translation>
 <translation id="2921219216347069551">Gagal Berbagi Halaman</translation>
 <translation id="2923448633003185837">Tempel dan Buka</translation>
 <translation id="292639812446257861">Tandai Belum Dibaca</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb
index ad8a03a..57487c55 100644
--- a/ios/chrome/app/strings/resources/ios_strings_is.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Ný mappa…</translation>
 <translation id="2916171785467530738">Fylla sjálfvirkt út leitir og vefslóðir</translation>
 <translation id="291754862089661335">Staðsettu QR-kóða eða strikamerkið innan rammans</translation>
+<translation id="2920866371965792875">Til að sjá uppfærslur frá þessu vefsvæði skaltu fylgja því hér.</translation>
 <translation id="2921219216347069551">Ekki er hægt að deila síðu</translation>
 <translation id="2923448633003185837">Líma og opna</translation>
 <translation id="292639812446257861">Merkja sem ólesið</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
index edfd85d..499230f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Жаңа қалта…</translation>
 <translation id="2916171785467530738">Іздеулер мен URL мекенжайларын автотолтыру</translation>
 <translation id="291754862089661335">QR кодын не штрих-кодты осы кадрға қойыңыз</translation>
+<translation id="2920866371965792875">Сайттан жаңалықтар алу үшін осы жерден жазылыңыз.</translation>
 <translation id="2921219216347069551">Бетті бөлісу мүмкін емес</translation>
 <translation id="2923448633003185837">Қою және өту</translation>
 <translation id="292639812446257861">Оқылмаған етіп белгілеу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb
index d93b967..b5ad59b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_km.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">ថតឯកសារថ្មី…</translation>
 <translation id="2916171785467530738">បំពេញ​ការស្វែងរក និង URL ដោយស្វ័យប្រវត្តិ</translation>
 <translation id="291754862089661335">ដាក់លេខកូដ QR ឬបារកូដទៅក្នុងស៊ុមនេះ</translation>
+<translation id="2920866371965792875">ដើម្បីមើល​ព័ត៌មានថ្មីៗ​ពី​គេហទំព័រ​នេះ សូម​តាមដាន​វា​នៅត្រង់នេះ។</translation>
 <translation id="2921219216347069551">មិនអាចចែករំលែកទំព័រ</translation>
 <translation id="2923448633003185837">ដាក់ចូល ហើយ​រុករក</translation>
 <translation id="292639812446257861">សម្គាល់ថាមិនទាន់អាន</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 31941826..0d091e8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">새 폴더 만들기…</translation>
 <translation id="2916171785467530738">검색어 및 URL 자동 완성</translation>
 <translation id="291754862089661335">프레임 안에 QR 코드나 바코드를 위치시키세요.</translation>
+<translation id="2920866371965792875">이 사이트에서 최신 소식을 받아 보려면 여기를 클릭하여 사이트를 팔로우하세요.</translation>
 <translation id="2921219216347069551">페이지를 공유할 수 없음</translation>
 <translation id="2923448633003185837">붙여넣어 바로가기</translation>
 <translation id="292639812446257861">읽지않음으로 표시</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
index b87414b..882edf29 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Обележувачите, историјата, лозинките и другo веќе нема да се синхронизираат со сметката на Google.</translation>
 <translation id="4844899002472726590">Гледајте и менувајте ги темите што ве интересираат</translation>
 <translation id="4854345657858711387">Поставете лозинка</translation>
+<translation id="4858786880085262208">Надградете на HTTPS, кога е можно. Безбедните сајтови може да вметнуваат содржини што не се безбедни.</translation>
 <translation id="4860895144060829044">Повикајте</translation>
 <translation id="4872323082491632254">Проверувај лозинки</translation>
 <translation id="4881695831933465202">Отвори</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Страница во нова картичка</translation>
 <translation id="7781829728241885113">Вчера</translation>
 <translation id="778855399387580014">Започнете пребарување во нова картичка на Chrome.</translation>
+<translation id="7790892308048519147">Пробајте да користите безбедни врски</translation>
 <translation id="7791543448312431591">Додај</translation>
 <translation id="7807060072011926525">Обезбедено од Google</translation>
 <translation id="7839985698273989086">Офлајн страница</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 106b09a..d3a91e0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -452,6 +452,7 @@
 <translation id="4840495572919996524">तुमचे बुकमार्क, इतिहास, पासवर्ड आणि बरेच काही आता तुमच्या Google खातेमध्ये सिंक केले जाणार नाही</translation>
 <translation id="4844899002472726590">तुम्हाला स्वारस्य असलेले विषय पहा आणि ते संपादित करा</translation>
 <translation id="4854345657858711387">पासकोड सेट करा</translation>
+<translation id="4858786880085262208">शक्य असेल, तेव्हा HTTPS वर अपग्रेड करा. सुरक्षित साइट कदाचित सुरक्षित नसलेला आशय एम्बेड करू शकतात.</translation>
 <translation id="4860895144060829044">कॉल करा</translation>
 <translation id="4872323082491632254">पासवर्ड तपासा</translation>
 <translation id="4881695831933465202">उघडा</translation>
@@ -802,6 +803,7 @@
 <translation id="7781069478569868053">नवीन टॅब पृष्‍ठ</translation>
 <translation id="7781829728241885113">काल</translation>
 <translation id="778855399387580014">एका नवीन Chrome टॅबमध्ये शोध सुरू करा.</translation>
+<translation id="7790892308048519147">सुरक्षित कनेक्शन वापरण्याचा प्रयत्न करा</translation>
 <translation id="7791543448312431591">जोडा</translation>
 <translation id="7807060072011926525">Google द्वारे पुरवलेली</translation>
 <translation id="7839985698273989086">ऑफलाइन पेज</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 4bedf45..8014d13 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Folder Baharu…</translation>
 <translation id="2916171785467530738">Autolengkap Carian dan URL</translation>
 <translation id="291754862089661335">Letakkan kod QR atau kod bar dalam bingkai ini</translation>
+<translation id="2920866371965792875">Untuk melihat kemaskinian daripada laman ini, ikuti laman di dini.</translation>
 <translation id="2921219216347069551">Tidak Boleh Berkongsi Halaman</translation>
 <translation id="2923448633003185837">Tampal dan Pergi</translation>
 <translation id="292639812446257861">Tandakan Belum Dibaca</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb
index a30a8a64..c30da10f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_my.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">သင်၏ လိပ်စာများ၊ မှတ်တမ်း၊ စကားဝှက်နှင့် အခြားအရာများကို သင်၏ Google အကောင့်သို့ စင့်ခ်လုပ်တော့မည် မဟုတ်ပါ။</translation>
 <translation id="4844899002472726590">သင်စိတ်ဝင်စားသော အကြောင်းအရာများကို ကြည့်နိုင်၊ တည်းဖြတ်နိုင်သည်</translation>
 <translation id="4854345657858711387">လျှို့ဝှက်ကုဒ်တစ်ခု သတ်မှတ်ပါ</translation>
+<translation id="4858786880085262208">အဆင်ပြေပါက HTTPS သို့ အဆင့်မြှင့်ပါ။ လုံခြုံသောဝဘ်ဆိုက်များသည် ဘေးကင်းမှုမရှိသော အကြောင်းအရာများကို မြှုပ်သွင်းထားနိုင်သည်။</translation>
 <translation id="4860895144060829044">ဖုန်းခေါ်ရန်</translation>
 <translation id="4872323082491632254">စကားဝှက်များ စစ်ဆေးခြင်း</translation>
 <translation id="4881695831933465202">ဖွင့်</translation>
@@ -799,6 +800,7 @@
 <translation id="7781069478569868053">တဘ် စာမျက်နှာ အသစ်</translation>
 <translation id="7781829728241885113">မနေ့က</translation>
 <translation id="778855399387580014">Chrome တဘ်အသစ်တွင် ရှာဖွေမှု စတင်ပါ။</translation>
+<translation id="7790892308048519147">လုံခြုံသည့်ချိတ်ဆက်မှုများကို သုံးကြည့်ပါ</translation>
 <translation id="7791543448312431591">ထည့်ရန်</translation>
 <translation id="7807060072011926525">Google က ပံ့ပိုးထားသည်</translation>
 <translation id="7839985698273989086">အော့ဖ်လိုင်း စာမျက်နှာ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 3c5b12d..901a1a83 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Je bookmarks, geschiedenis, wachtwoorden en meer worden niet meer gesynchroniseerd met je Google-account.</translation>
 <translation id="4844899002472726590">De onderwerpen bekijken en bewerken waarin je bent geïnteresseerd</translation>
 <translation id="4854345657858711387">Een toegangscode instellen</translation>
+<translation id="4858786880085262208">Upgrade naar HTTPS als dat mogelijk is. Beveiligde sites hebben misschien ingesloten content die niet beveiligd is.</translation>
 <translation id="4860895144060829044">Bellen</translation>
 <translation id="4872323082491632254">Wachtwoorden checken</translation>
 <translation id="4881695831933465202">Openen</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Pagina 'Nieuw tabblad'</translation>
 <translation id="7781829728241885113">Gisteren</translation>
 <translation id="778855399387580014">Start een zoekopdracht op een nieuw Chrome-tabblad.</translation>
+<translation id="7790892308048519147">Beveiligde verbindingen gebruiken</translation>
 <translation id="7791543448312431591">Toevoegen</translation>
 <translation id="7807060072011926525">Geleverd door Google</translation>
 <translation id="7839985698273989086">Offline pagina</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 6aa7e74..0eb9773 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Bokmerkene, loggen, passord med mer synkroniseres ikke lenger med Google-kontoen din.</translation>
 <translation id="4844899002472726590">Se og rediger emnene du er interessert i</translation>
 <translation id="4854345657858711387">Angi en adgangskode</translation>
+<translation id="4858786880085262208">Oppgrader til HTTPS når det er mulig. Sikre nettsteder kan bygge inn innhold som ikke er sikkert.</translation>
 <translation id="4860895144060829044">Ring</translation>
 <translation id="4872323082491632254">Kontrollér passordene</translation>
 <translation id="4881695831933465202">Åpne</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Ny fane-siden</translation>
 <translation id="7781829728241885113">I går</translation>
 <translation id="778855399387580014">Start et søk i en ny Chrome-fane.</translation>
+<translation id="7790892308048519147">Prøv å bruke sikre tilkoblinger</translation>
 <translation id="7791543448312431591">Legg til</translation>
 <translation id="7807060072011926525">Levert av Google</translation>
 <translation id="7839985698273989086">Side utenfor internett</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb
index e725274..12948af 100644
--- a/ios/chrome/app/strings/resources/ios_strings_or.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">ନୂତନ ଫୋଲ୍ଡର…</translation>
 <translation id="2916171785467530738">ସର୍ଚ୍ଚ ଓ URLଗୁଡ଼ିକୁ ସ୍ୱଚାଳିତ ଭାବେ ସମ୍ପୂର୍ଣ୍ଣ ହେବାକୁ ଦିଅନ୍ତୁ</translation>
 <translation id="291754862089661335">QR କୋଡ୍‌ କିମ୍ବା ବାର୍‌କୋଡ୍‌କୁ ଏହି ଫ୍ରେମ୍‌ରେ ଆଣନ୍ତୁ</translation>
+<translation id="2920866371965792875">ଏହି ସାଇଟରୁ ଅପଡେଟଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ ଏହାକୁ ଏଠାରେ ଅନୁସରଣ କରନ୍ତୁ।</translation>
 <translation id="2921219216347069551">ପୃଷ୍ଠା ସେୟାର୍ କରିପାରିବ ନାହିଁ</translation>
 <translation id="2923448633003185837">ପେଷ୍ଟ କରନ୍ତୁ ଓ ଯାଆନ୍ତୁ</translation>
 <translation id="292639812446257861">"ପଢ଼ା ଯାଇନାହିଁ" ଭାବରେ ଚିହ୍ନିତ କରନ୍ତୁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
index 2d560c6..a3f5297b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Nova pasta…</translation>
 <translation id="2916171785467530738">Pesquisas de preenchimento automático e URLs</translation>
 <translation id="291754862089661335">Posicione o código QR ou o código de barras nesta moldura</translation>
+<translation id="2920866371965792875">Para ver atualizações deste site, siga-o aqui.</translation>
 <translation id="2921219216347069551">Impossível Partilhar Página</translation>
 <translation id="2923448633003185837">Colar e ir</translation>
 <translation id="292639812446257861">Marcar como não lidas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index e1a9ee9..5d1b6d2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Ваши закладки, пароли, история и другие данные больше не будут синхронизироваться с аккаунтом Google.</translation>
 <translation id="4844899002472726590">Просмотр и изменение тем, которые вас интересуют</translation>
 <translation id="4854345657858711387">Установите код доступа</translation>
+<translation id="4858786880085262208">По возможности использовать HTTPS. Безопасные сайты могут содержать небезопасный встроенный контент.</translation>
 <translation id="4860895144060829044">Позвонить</translation>
 <translation id="4872323082491632254">Проверка паролей</translation>
 <translation id="4881695831933465202">Открыть</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Страница быстрого доступа</translation>
 <translation id="7781829728241885113">Вчера</translation>
 <translation id="778855399387580014">Запускайте поиск в новой вкладке Chrome.</translation>
+<translation id="7790892308048519147">Использовать безопасное соединение</translation>
 <translation id="7791543448312431591">Добавить</translation>
 <translation id="7807060072011926525">Данные от Google</translation>
 <translation id="7839985698273989086">Офлайн-версия страницы</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb
index efaa192..80885b04 100644
--- a/ios/chrome/app/strings/resources/ios_strings_si.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">නව ෆෝල්ඩරය...</translation>
 <translation id="2916171785467530738">සෙවීම් සහ URL ලිපින ස්වයංව සම්පූර්ණ කරන්න</translation>
 <translation id="291754862089661335">මෙම රාමුව තුළ QR කේතය හෝ තීරු කේතය ස්ථානගත කරන්න</translation>
+<translation id="2920866371965792875">මෙම අඩවියෙන් යාවත්කාලීන බැලීමට, එය මෙහි අනුගමනය කරන්න.</translation>
 <translation id="2921219216347069551">පිටුව බෙදා ගැනීමට නොහැකිය</translation>
 <translation id="2923448633003185837">අලවා යන්න</translation>
 <translation id="292639812446257861">නොකියවූ ලෙස ලකුණු කරන්න</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index ab69b16..18e4056 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Nova mapa …</translation>
 <translation id="2916171785467530738">Samodejno dokončanje iskanj in URL-jev</translation>
 <translation id="291754862089661335">Kodo QR ali črtno kodo postavite v ta okvir</translation>
+<translation id="2920866371965792875">Če želite, da se vam prikazujejo obvestila s tega spletnega mesta, ga spremljajte tukaj.</translation>
 <translation id="2921219216347069551">Deljenje te strani z drugimi ni mogoče</translation>
 <translation id="2923448633003185837">Prilepi in nadaljuj</translation>
 <translation id="292639812446257861">Označi kot neprebrano</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
index 75bf31db..0f600215 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Dosje e re...</translation>
 <translation id="2916171785467530738">Plotësimi automatik i kërkimeve dhe i URL-ve</translation>
 <translation id="291754862089661335">Pozicionoje kodin QR ose barkodin në këtë kornizë</translation>
+<translation id="2920866371965792875">Për të parë përditësimet nga ky sajt, ndiqe atë këtu.</translation>
 <translation id="2921219216347069551">Nuk mund të ndajë faqen</translation>
 <translation id="2923448633003185837">Ngjit dhe vazhdo</translation>
 <translation id="292639812446257861">Shëno si të palexuara</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
index 0d91ae07..064529bff 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -168,7 +168,7 @@
 <translation id="2421044535038393232">Nastavi izmene</translation>
 <translation id="2434405374328098816">Već ste sačuvali lozinku za „<ph name="USERNAME" />“ na <ph name="WEBSITE" /></translation>
 <translation id="2435457462613246316">Prikaži lozinku</translation>
-<translation id="2469960372084740698">Želite li da isključite Bezbednosno pregledanje?</translation>
+<translation id="2469960372084740698">Želite da isključite Bezbednosno pregledanje?</translation>
 <translation id="2473876017985765807">Već ste sačuvali lozinku za <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Nije izabrano</translation>
 <translation id="2497852260688568942">Administrator je onemogućio sinhronizaciju</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index ebe6c27..6e294b7f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -168,7 +168,7 @@
 <translation id="2421044535038393232">Настави изменe</translation>
 <translation id="2434405374328098816">Већ сте сачували лозинку за „<ph name="USERNAME" />“ на <ph name="WEBSITE" /></translation>
 <translation id="2435457462613246316">Прикажи лозинку</translation>
-<translation id="2469960372084740698">Желите ли да искључите Безбедносно прегледање?</translation>
+<translation id="2469960372084740698">Желите да искључите Безбедносно прегледање?</translation>
 <translation id="2473876017985765807">Већ сте сачували лозинку за <ph name="WEBSITE" /></translation>
 <translation id="2476359652512522418">Није изабрано</translation>
 <translation id="2497852260688568942">Администратор је онемогућио синхронизацију</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index 51442ab6..72d5ff6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Ny mapp ...</translation>
 <translation id="2916171785467530738">Autoslutför sökningar och webbadresser</translation>
 <translation id="291754862089661335">Passa in QR-koden eller streckkoden i den här rutan</translation>
+<translation id="2920866371965792875">Följ här för att få nyheter från den här sidan</translation>
 <translation id="2921219216347069551">Kan inte dela sidan</translation>
 <translation id="2923448633003185837">Klistra in och öppna</translation>
 <translation id="292639812446257861">Markera som oläst</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 0feaada..da8692e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Folda Mpya…</translation>
 <translation id="2916171785467530738">Jaza kiotomatiki URL na hoja za Utafutaji</translation>
 <translation id="291754862089661335">Weka msimbo wa QR au msimbo upau katika fremu hii</translation>
+<translation id="2920866371965792875">Ili uone taarifa kutoka kwenye tovuti hii, ifuate hapa.</translation>
 <translation id="2921219216347069551">Haiwezi Kushiriki Ukurasa</translation>
 <translation id="2923448633003185837">Bandika na Utafute</translation>
 <translation id="292639812446257861">Tia Alama Kuwa Hujasoma</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 6eccde4..562c334 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">โฟลเดอร์ใหม่…</translation>
 <translation id="2916171785467530738">เติมข้อความค้นหาและ URL อัตโนมัติ</translation>
 <translation id="291754862089661335">จัดตำแหน่งโค้ด QR หรือบาร์โค้ดให้อยู่ในกรอบนี้</translation>
+<translation id="2920866371965792875">ติดตามเว็บไซต์นี้เพื่อดูข้อมูลอัปเดตได้ที่นี่</translation>
 <translation id="2921219216347069551">ไม่สามารถแชร์เว็บ</translation>
 <translation id="2923448633003185837">วางแล้วไป</translation>
 <translation id="292639812446257861">ทำเครื่องหมายว่ายังไม่ได้อ่าน</translation>
@@ -450,6 +451,7 @@
 <translation id="4840495572919996524">บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และอื่นๆ จะไม่ซิงค์กับบัญชี Google อีกต่อไป</translation>
 <translation id="4844899002472726590">ดูและแก้ไขหัวข้อที่คุณสนใจ</translation>
 <translation id="4854345657858711387">ตั้งพาสโค้ด</translation>
+<translation id="4858786880085262208">อัปเกรดเป็น HTTPS เมื่อทำได้ เว็บไซต์ที่ปลอดภัยอาจฝังเนื้อหาที่ไม่ปลอดภัย</translation>
 <translation id="4860895144060829044">โทร</translation>
 <translation id="4872323082491632254">ตรวจสอบรหัสผ่าน</translation>
 <translation id="4881695831933465202">เปิด</translation>
@@ -799,6 +801,7 @@
 <translation id="7781069478569868053">หน้าแท็บใหม่</translation>
 <translation id="7781829728241885113">เมื่อวานนี้</translation>
 <translation id="778855399387580014">เริ่มการค้นหาในแท็บใหม่ของ Chrome</translation>
+<translation id="7790892308048519147">พยายามใช้การเชื่อมต่อที่ปลอดภัย</translation>
 <translation id="7791543448312431591">เพิ่ม</translation>
 <translation id="7807060072011926525">ให้บริการโดย Google</translation>
 <translation id="7839985698273989086">หน้าแบบออฟไลน์</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 4995515..6e67e106 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">Yeni Klasör…</translation>
 <translation id="2916171785467530738">Aramaları ve URL'leri Otomatik Tamamlama</translation>
 <translation id="291754862089661335">QR kodunu veya barkodu bu çerçeveye yerleştirin</translation>
+<translation id="2920866371965792875">Bu sitedeki güncellemeleri görmek için siteyi buradan takip edin.</translation>
 <translation id="2921219216347069551">Sayfa Paylaşılamıyor</translation>
 <translation id="2923448633003185837">Yapıştır ve git</translation>
 <translation id="292639812446257861">Okunmadı Olarak İşaretle</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index b8fa02b1..5e9d6ad 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Закладки, історія, паролі тощо більше не синхронізуватимуться з обліковим записом Google.</translation>
 <translation id="4844899002472726590">Переглядайте й редагуйте цікаві вам теми</translation>
 <translation id="4854345657858711387">Налаштуйте код доступу</translation>
+<translation id="4858786880085262208">За можливості використовуйте протокол HTTPS. На безпечних сайтах може бути вбудовано незахищений контент.</translation>
 <translation id="4860895144060829044">Зателефонувати</translation>
 <translation id="4872323082491632254">Перевірка паролів</translation>
 <translation id="4881695831933465202">Відкрити</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Сторінка нової вкладки</translation>
 <translation id="7781829728241885113">Учора</translation>
 <translation id="778855399387580014">Пошук у новій вкладці Chrome.</translation>
+<translation id="7790892308048519147">Намагатися використовувати надійні з’єднання</translation>
 <translation id="7791543448312431591">Додати</translation>
 <translation id="7807060072011926525">Надано компанією Google</translation>
 <translation id="7839985698273989086">Офлайн-сторінка</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 3652304..b376a061c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">新建文件夹…</translation>
 <translation id="2916171785467530738">自动补全搜索字词和网址</translation>
 <translation id="291754862089661335">将 QR 码或条形码放到此框内</translation>
+<translation id="2920866371965792875">若要查看来自此网站的最新讯息,请从这里关注它。</translation>
 <translation id="2921219216347069551">无法分享网页</translation>
 <translation id="2923448633003185837">粘贴并转到</translation>
 <translation id="292639812446257861">标记为未读</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
index 91cfca9..c5590ce 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">新資料夾…</translation>
 <translation id="2916171785467530738">自動完成搜尋和網址</translation>
 <translation id="291754862089661335">將二維條碼或條碼放置此頁框中</translation>
+<translation id="2920866371965792875">如要查看此網站的最新資訊,請按這裡追蹤網站。</translation>
 <translation id="2921219216347069551">無法分享網頁</translation>
 <translation id="2923448633003185837">貼上並前往</translation>
 <translation id="292639812446257861">標示為未閱讀</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
index 2f27dca..9676d32e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -226,6 +226,7 @@
 <translation id="2898963176829412617">新資料夾…</translation>
 <translation id="2916171785467530738">自動完成搜尋字詞與網址</translation>
 <translation id="291754862089661335">將這個方框對準 QR 圖碼或條碼</translation>
+<translation id="2920866371965792875">如要查看這個網站的最新資訊,請按這裡追蹤網站。</translation>
 <translation id="2921219216347069551">無法分享網頁</translation>
 <translation id="2923448633003185837">貼上並前往</translation>
 <translation id="292639812446257861">標示為未讀取</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
index 2b80a4b..67a246c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -451,6 +451,7 @@
 <translation id="4840495572919996524">Amabhukhimakhi akho, umlando, amaphasiwedi, nokuningi ngeke kusavunyelaniswa ku-akhawunti yakho ye-Google.</translation>
 <translation id="4844899002472726590">Bona futhi hlela izihloko onentshisekelo kuzo</translation>
 <translation id="4854345657858711387">Setha ikhodi yokudlula</translation>
+<translation id="4858786880085262208">Thuthukela ku-HTTPS, uma kunokwenzeka. Amasayithi avikelekile angase ashumeke okuqukethwe okungavikelekile.</translation>
 <translation id="4860895144060829044">Shaya</translation>
 <translation id="4872323082491632254">Hlola amaphasiwedi</translation>
 <translation id="4881695831933465202">Vula</translation>
@@ -800,6 +801,7 @@
 <translation id="7781069478569868053">Ikhasi lethebhu elisha</translation>
 <translation id="7781829728241885113">Izolo</translation>
 <translation id="778855399387580014">Qala usesho kuthebhu elisha le-Chrome.</translation>
+<translation id="7790892308048519147">Zama ukusebenzisa uxhumo oluphephile</translation>
 <translation id="7791543448312431591">Engeza</translation>
 <translation id="7807060072011926525">Kuhlinzekwe yi-Google</translation>
 <translation id="7839985698273989086">Ikhasi Elingaxhunyiwe kwi-Intanethi</translation>
diff --git a/ios/chrome/browser/follow/follow_menu_updater.h b/ios/chrome/browser/follow/follow_menu_updater.h
index f6c6f7a..9da39ca 100644
--- a/ios/chrome/browser/follow/follow_menu_updater.h
+++ b/ios/chrome/browser/follow/follow_menu_updater.h
@@ -5,13 +5,18 @@
 #ifndef IOS_CHROME_BROWSER_FOLLOW_FOLLOW_MENU_UPDATER_H_
 #define IOS_CHROME_BROWSER_FOLLOW_FOLLOW_MENU_UPDATER_H_
 
+@class FollowWebPageURLs;
+
 // Protocol defining a updater for follow menu item.
 @protocol FollowMenuUpdater
 
-// Updates the follow menu item with follow |status|, |title| and |enabled|.
-- (void)updateFollowMenuItemWithFollowStatus:(BOOL)status
-                                       title:(NSString*)title
-                                     enabled:(BOOL)enable;
+// Updates the follow menu item with follow |webPageURLs|, |status|, |title| and
+// |enabled|.
+- (void)updateFollowMenuItemWithFollowWebPageURLs:
+            (FollowWebPageURLs*)webPageURLs
+                                           status:(BOOL)status
+                                            title:(NSString*)title
+                                          enabled:(BOOL)enabled;
 
 @end
 
diff --git a/ios/chrome/browser/follow/follow_tab_helper.mm b/ios/chrome/browser/follow/follow_tab_helper.mm
index 2a6d3ab8..130439bc 100644
--- a/ios/chrome/browser/follow/follow_tab_helper.mm
+++ b/ios/chrome/browser/follow/follow_tab_helper.mm
@@ -28,6 +28,14 @@
 #error "This file requires ARC support."
 #endif
 
+namespace {
+
+// The prefix of domain name that can be removed. It is used when generating the
+// follow item text.
+const std::string kRemovablePrefix = "www.";
+
+}  // namespace.
+
 FollowTabHelper::~FollowTabHelper() {
   DCHECK(!web_state_);
 }
@@ -128,6 +136,10 @@
   NSString* title = nil;
   std::string domainName =
       web::GetMainFrame(web_state_)->GetSecurityOrigin().host();
+  if (domainName.substr(0, kRemovablePrefix.length()) == kRemovablePrefix) {
+    domainName =
+        domainName.substr(kRemovablePrefix.length(), domainName.length());
+  }
   if (!status) {
     title = l10n_util::GetNSStringF(IDS_IOS_TOOLS_MENU_FOLLOW,
                                     base::UTF8ToUTF16(domainName));
@@ -136,11 +148,12 @@
                                     base::UTF8ToUTF16(domainName));
   }
 
-  bool enable = GetFollowActionState(web_state_) == FollowActionStateEnabled;
+  bool enabled = GetFollowActionState(web_state_) == FollowActionStateEnabled;
 
-  [follow_menu_updater_ updateFollowMenuItemWithFollowStatus:status
-                                                       title:title
-                                                     enabled:enable];
+  [follow_menu_updater_ updateFollowMenuItemWithFollowWebPageURLs:web_page_urls
+                                                           status:status
+                                                            title:title
+                                                          enabled:enabled];
   should_update_follow_item_ = false;
 }
 
diff --git a/ios/chrome/browser/sync/sync_service_factory_unittest.cc b/ios/chrome/browser/sync/sync_service_factory_unittest.cc
index 3a87fe57..6b73e6c 100644
--- a/ios/chrome/browser/sync/sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/sync_service_factory_unittest.cc
@@ -51,7 +51,7 @@
  protected:
   // Returns the collection of default datatypes.
   syncer::ModelTypeSet DefaultDatatypes() {
-    static_assert(38 == syncer::GetNumModelTypes(),
+    static_assert(39 == syncer::GetNumModelTypes(),
                   "When adding a new type, you probably want to add it here as "
                   "well (assuming it is already enabled).");
 
@@ -66,6 +66,7 @@
     datatypes.Put(syncer::AUTOFILL_WALLET_OFFER);
     datatypes.Put(syncer::BOOKMARKS);
     datatypes.Put(syncer::DEVICE_INFO);
+    // TODO(crbug.com/1318028): Add HISTORY once it has a Controller.
     datatypes.Put(syncer::HISTORY_DELETE_DIRECTIVES);
     datatypes.Put(syncer::PREFERENCES);
     datatypes.Put(syncer::PRIORITY_PREFERENCES);
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
index 21d7239..662a215 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
@@ -132,7 +132,7 @@
                                                      GURL(kChromeUINewTabURL))];
       break;
     case PopupMenuActionFollow:
-      // TODO(crbug.com/1264872): add action.
+      [self.delegate updateFollowStatus];
       break;
     case PopupMenuActionBookmarks:
       RecordAction(UserMetricsAction("MobileMenuAllBookmarks"));
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler_delegate.h b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler_delegate.h
index 0607b39..4a0180c 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler_delegate.h
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler_delegate.h
@@ -22,6 +22,10 @@
 - (void)recordDownloadsMetricsPerProfile;
 // Starts a reverse image search for the image currently in the pasteboard.
 - (void)searchCopiedImage;
+// Updates the follow status of the on browsing website. Called when the follow
+// menu option has been tapped. Follows or unfollows the website according to
+// the current follow status of the website.
+- (void)updateFollowStatus;
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_ACTION_HANDLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
index 36db1877..1777bf2 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -321,6 +321,11 @@
             .triggerFollowUpAction;
     self.bubblePresenter.incognitoTabTipBubblePresenter.triggerFollowUpAction =
         NO;
+    if (IsWebChannelsEnabled()) {
+      ios::GetChromeBrowserProvider()
+          .GetFollowProvider()
+          ->SetFollowEventDelegate(self.browser);
+    }
   }
 
   OverlayPresenter* overlayPresenter = OverlayPresenter::FromBrowser(
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index c72fa77..bdab22c 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -69,6 +69,7 @@
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/components/webui/web_ui_url_constants.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
+#import "ios/public/provider/chrome/browser/follow/follow_provider.h"
 #import "ios/public/provider/chrome/browser/text_zoom/text_zoom_api.h"
 #import "ios/public/provider/chrome/browser/user_feedback/user_feedback_provider.h"
 #include "ios/web/common/features.h"
@@ -189,6 +190,12 @@
 // Whether the web content is currently being blocked.
 @property(nonatomic, assign) BOOL contentBlocked;
 
+// URLs for the current webpage, which are used to update the follow status.
+@property(nonatomic, strong) FollowWebPageURLs* webPageURLs;
+
+// YES if the current website has been followed.
+@property(nonatomic, assign) BOOL followStatus;
+
 #pragma mark*** Specific Items ***
 
 @property(nonatomic, strong) PopupMenuToolsItem* openNewIncognitoTabItem;
@@ -245,8 +252,9 @@
   if (_webState) {
     _webState->RemoveObserver(_webStateObserver.get());
     _webStateObserver.reset();
-    if (IsWebChannelsEnabled()) {
+    if (self.followItem) {
       FollowTabHelper::FromWebState(_webState)->remove_follow_menu_updater();
+      self.webPageURLs = nil;
     }
     _webState = nullptr;
   }
@@ -505,7 +513,7 @@
     switch (self.type) {
       case PopupMenuTypeToolsMenu:
         [self createToolsMenuItems];
-        if (self.webState && IsWebChannelsEnabled()) {
+        if (self.webState && self.followItem) {
           FollowTabHelper::FromWebState(self.webState)
               ->set_follow_menu_updater(self);
         }
@@ -640,6 +648,12 @@
       }));
 }
 
+- (void)updateFollowStatus {
+  DCHECK(IsWebChannelsEnabled());
+  ios::GetChromeBrowserProvider().GetFollowProvider()->UpdateFollowStatus(
+      self.webPageURLs, !self.followStatus);
+}
+
 #pragma mark - IOSLanguageDetectionTabHelperObserving
 
 - (void)iOSLanguageDetectionTabHelper:
@@ -665,15 +679,21 @@
 
 #pragma mark - FollowMenuUpdater
 
-- (void)updateFollowMenuItemWithFollowStatus:(BOOL)status
-                                       title:(NSString*)title
-                                     enabled:(BOOL)enable {
+- (void)updateFollowMenuItemWithFollowWebPageURLs:
+            (FollowWebPageURLs*)webPageURLs
+                                           status:(BOOL)status
+                                            title:(NSString*)title
+                                          enabled:(BOOL)enabled {
   DCHECK(IsWebChannelsEnabled());
-  self.followItem.enabled = enable;
+  self.webPageURLs = webPageURLs;
+  self.followStatus = status;
+  self.followItem.enabled = enabled;
   self.followItem.title = title;
-  self.followItem.image = [[UIImage
-      imageNamed:status ? @"popup_menu_unfollow" : @"popup_menu_follow"]
-      imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+  self.followItem.image =
+      [[UIImage imageNamed:self.followStatus ? @"popup_menu_unfollow"
+                                             : @"popup_menu_follow"]
+          imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
+
   [self.popupMenu itemsHaveChanged:@[ self.followItem ]];
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm
index fa0896b3..903470d 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.h"
 
 #include "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/ui/icons/chrome_symbol.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/grid/grid_constants.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.h"
@@ -247,10 +248,15 @@
                            target:nil
                            action:nil];
 
-  _smallNewTabButton = [[TabGridNewTabButton alloc]
-      initWithRegularImage:[UIImage imageNamed:@"new_tab_toolbar_button"]
-            incognitoImage:[UIImage
-                               imageNamed:@"new_tab_toolbar_button_incognito"]];
+  if (UseSymbols()) {
+    _smallNewTabButton = [[TabGridNewTabButton alloc] init];
+  } else {
+    _smallNewTabButton = [[TabGridNewTabButton alloc]
+        initWithRegularImage:[UIImage imageNamed:@"new_tab_toolbar_button"]
+              incognitoImage:
+                  [UIImage imageNamed:@"new_tab_toolbar_button_incognito"]];
+  }
+
   _smallNewTabButton.translatesAutoresizingMaskIntoConstraints = NO;
   _smallNewTabButton.page = self.page;
 
@@ -288,11 +294,22 @@
   ];
 
   // For other layout, display a floating new tab button.
-  UIImage* incognitoImage =
-      [UIImage imageNamed:@"new_tab_floating_button_incognito"];
-  _largeNewTabButton = [[TabGridNewTabButton alloc]
-      initWithRegularImage:[UIImage imageNamed:@"new_tab_floating_button"]
-            incognitoImage:incognitoImage];
+  if (UseSymbols()) {
+    _largeNewTabButton = [[TabGridNewTabButton alloc] init];
+  } else {
+    UIImage* incognitoImage =
+        [UIImage imageNamed:@"new_tab_floating_button_incognito"];
+    _largeNewTabButton = [[TabGridNewTabButton alloc]
+        initWithRegularImage:[UIImage imageNamed:@"new_tab_floating_button"]
+              incognitoImage:incognitoImage];
+
+    // When a11y font size is used, long press on UIBarButtonItem will show a
+    // built-in a11y modal panel with image and title if set. The image will be
+    // normalized into a bi-color image, so the incognito image is suitable
+    // because it has a transparent "+". Use the larger image for higher
+    // resolution.
+    _newTabButtonItem.image = incognitoImage;
+  }
   _largeNewTabButton.translatesAutoresizingMaskIntoConstraints = NO;
   _largeNewTabButton.page = self.page;
 
@@ -310,12 +327,6 @@
                        constant:-kTabGridFloatingButtonHorizontalInset],
   ];
 
-  // When a11y font size is used, long press on UIBarButtonItem will show a
-  // built-in a11y modal panel with image and title if set. The image will be
-  // normalized into a bi-color image, so the incognito image is suitable
-  // because it has a transparent "+". Use the larger image for higher
-  // resolution.
-  _newTabButtonItem.image = incognitoImage;
   _newTabButtonItem.title = _largeNewTabButton.accessibilityLabel;
 }
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.h
index 08f198bf..eb144ff 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.h
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.h
@@ -15,9 +15,7 @@
 
 // Init with image for regular/incognito page.
 - (instancetype)initWithRegularImage:(UIImage*)regularImage
-                      incognitoImage:(UIImage*)incognitoImage
-    NS_DESIGNATED_INITIALIZER;
-- (instancetype)init NS_UNAVAILABLE;
+                      incognitoImage:(UIImage*)incognitoImage;
 - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
 - (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
 
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.mm
index 33f9b98..472e622e 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.mm
@@ -4,7 +4,11 @@
 
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_new_tab_button.h"
 
+#include "base/check.h"
+#import "ios/chrome/browser/ui/icons/chrome_symbol.h"
 #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/chrome/common/ui/util/pointer_interaction_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -13,18 +17,47 @@
 #error "This file requires ARC support."
 #endif
 
-@interface TabGridNewTabButton () {
-  UIImage* _regularImage;
-  UIImage* _incognitoImage;
-}
+namespace {
+
+// The size of the symbol image.
+NSInteger kSymbolNewTabPointSize = 24;
+
+}  // namespace
+
+@interface TabGridNewTabButton ()
+
+// Images for the open new tab button.
+@property(nonatomic, strong) UIImage* regularImage;
+@property(nonatomic, strong) UIImage* incognitoImage;
+
+// Image for the open new tab button.
+@property(nonatomic, strong) UIImage* tabGridNewTabImage;
+
+// View used as a background for the open new tab button.
+@property(nonatomic, strong) UIView* circleBackgroundView;
+
 @end
 
 @implementation TabGridNewTabButton
 
+- (instancetype)init {
+  self = [super initWithFrame:CGRectZero];
+  if (self) {
+    DCHECK(UseSymbols());
+    _tabGridNewTabImage = CustomSymbolWithPointSize(kPlusCircleFillSymbol,
+                                                    kSymbolNewTabPointSize);
+    self.pointerInteractionEnabled = YES;
+    self.pointerStyleProvider = CreateLiftEffectCirclePointerStyleProvider();
+    [self configureCircleBackgroundView];
+  }
+  return self;
+}
+
 - (instancetype)initWithRegularImage:(UIImage*)regularImage
                       incognitoImage:(UIImage*)incognitoImage {
   self = [super initWithFrame:CGRectZero];
   if (self) {
+    DCHECK(!UseSymbols());
     _regularImage = regularImage;
     _incognitoImage = incognitoImage;
 
@@ -37,6 +70,34 @@
 #pragma mark - Public
 
 - (void)setPage:(TabGridPage)page {
+  UseSymbols() ? [self setSymbolPage:page] : [self setIconPage:page];
+}
+
+#pragma mark - Private
+
+// Adds a circle background view below the image.
+- (void)configureCircleBackgroundView {
+  UIView* circleBackgroundView = [[UIView alloc] init];
+  circleBackgroundView.translatesAutoresizingMaskIntoConstraints = NO;
+  circleBackgroundView.userInteractionEnabled = NO;
+  circleBackgroundView.layer.cornerRadius =
+      self.tabGridNewTabImage.size.width / 2;
+
+  // Make sure that the circleBackgroundView is below the image.
+  [self insertSubview:circleBackgroundView belowSubview:self.imageView];
+  AddSameCenterConstraints(self.imageView, circleBackgroundView);
+  [NSLayoutConstraint activateConstraints:@[
+    [circleBackgroundView.widthAnchor
+        constraintEqualToAnchor:self.imageView.widthAnchor],
+    [circleBackgroundView.heightAnchor
+        constraintEqualToAnchor:self.imageView.heightAnchor],
+  ]];
+
+  self.circleBackgroundView = circleBackgroundView;
+}
+
+// Sets page using icon images.
+- (void)setIconPage:(TabGridPage)page {
   // self.page is inited to 0 (i.e. TabGridPageIncognito) so do not early return
   // here, otherwise when app is launched in incognito mode the image will be
   // missing.
@@ -61,4 +122,26 @@
   [self setImage:renderedImage forState:UIControlStateNormal];
 }
 
+// Sets page using a symbol image.
+- (void)setSymbolPage:(TabGridPage)page {
+  switch (page) {
+    case TabGridPageIncognitoTabs:
+      self.accessibilityLabel =
+          l10n_util::GetNSString(IDS_IOS_TAB_GRID_CREATE_NEW_INCOGNITO_TAB);
+      self.tintColor = UIColor.whiteColor;
+      self.circleBackgroundView.backgroundColor = UIColor.clearColor;
+      break;
+    case TabGridPageRegularTabs:
+      self.accessibilityLabel =
+          l10n_util::GetNSString(IDS_IOS_TAB_GRID_CREATE_NEW_TAB);
+      self.tintColor = [UIColor colorNamed:kBlueColor];
+      self.circleBackgroundView.backgroundColor = UIColor.whiteColor;
+      break;
+    case TabGridPageRemoteTabs:
+      break;
+  }
+  _page = page;
+  [self setImage:self.tabGridNewTabImage forState:UIControlStateNormal];
+}
+
 @end
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index f8d1134..e76e3fb 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8e4baf00518147c4ae584bdcfeebc46aa1208d73
\ No newline at end of file
+5eb56b0a250c783cae7fa626d1d957cd0d0c027f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 732119b1..a3de518 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-c6e91b0fe879a99ecd725cd4a503ce4cdb23df62
\ No newline at end of file
+5776ed271c326f3cee9b2adbb6bfa46f8352474d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 3d26888..76546d03 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-42b95e99afec29b717d6ad49a521c2242c0c91d4
\ No newline at end of file
+be9611cbfd6f02f87ca1abad9974a5948ff9b2a2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index e1146f4c..3fe4db1 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-1f4d0d3e67ce703d0304962fb8af42ab3f8cf16b
\ No newline at end of file
+5403f2bec21d12839e8355c79196175fef510007
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index f88451d..7ea7c9c 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-89dd2475a4f80c05277ffbc5e3bd71c37bb2947f
\ No newline at end of file
+cfed0e6b026bb4ed5b7fede321ea5243c6e8c0da
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index bd616e4..e7a525b 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4a70185828c877996909909249cc7091c76e64d9
\ No newline at end of file
+d769cde15ca9b7adcc97c919e1e41c2be5e9fb30
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 99ba1f4..3d6b897 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-c4542dc6a864c93690b3b5ca7d4386d4b0cf378f
\ No newline at end of file
+846e7bc904d6eb626083e274862db6acf5ac7008
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 92cb6b3..6290aee4 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-ddcae9179adb338e969084f64327459d7eb777c4
\ No newline at end of file
+30f351d3b1fc1520e47d7b978e2b37c41098fcd8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index bc891f77..45baabf 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ccafd1dfe992b338c9cb3bbb3d797bde783e475a
\ No newline at end of file
+7cc69c7d649883758a4559b5c967e739350e1499
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 92bb3ef..d974068c 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-43e2f422598d551209e0479dfa417c76008d23ac
\ No newline at end of file
+735d051dc5992901794b0c1e45f4854b4cd2dbb9
\ No newline at end of file
diff --git a/media/capture/video/win/video_capture_device_mf_win.cc b/media/capture/video/win/video_capture_device_mf_win.cc
index ad012c1..8b145c6 100644
--- a/media/capture/video/win/video_capture_device_mf_win.cc
+++ b/media/capture/video/win/video_capture_device_mf_win.cc
@@ -871,6 +871,10 @@
   // This is observed but undocumented behavior, which might change.
   // |maybe_fake| is used as a tie breaker between otherwise identical
   // formats.
+  // TODO(crbug.com/1323677): Do a less minimal fix and add unit tests.
+  if (capabilities->empty()) {
+    return hr;
+  }
   auto prev_capability = capabilities->begin();
   auto cur_capability = prev_capability;
   ++cur_capability;
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index 3845e43c..ff26f81f 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -1382,8 +1382,7 @@
   // to move the callback used to be a CancelableOnceCallback. By the way, for
   // this to happen the action (to cancel B) has to be synchronous to the
   // notification for request A.
-  WorkItemList pending_items;
-  pending_items.swap(pending_op->pending_queue);
+  WorkItemList pending_items = std::move(pending_op->pending_queue);
   DeletePendingOp(pending_op);
 
   item->NotifyTransaction(result, entry);
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 5d1d7a0..b54e6e5 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -1989,11 +1989,8 @@
             "Net.QuicSession.TimedOutWithOpenStreams.HasUnackedPackets",
             connection()->sent_packet_manager().HasInFlightPackets());
         UMA_HISTOGRAM_COUNTS_1M(
-            "Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveRTOCount",
-            connection()->sent_packet_manager().GetConsecutiveRtoCount());
-        UMA_HISTOGRAM_COUNTS_1M(
-            "Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveTLPCount",
-            connection()->sent_packet_manager().GetConsecutiveTlpCount());
+            "Net.QuicSession.TimedOutWithOpenStreams.ConsecutivePTOCount",
+            connection()->sent_packet_manager().GetConsecutivePtoCount());
         base::UmaHistogramSparse(
             "Net.QuicSession.TimedOutWithOpenStreams.LocalPort",
             connection()->self_address().port());
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index c2f530d2..58d76e1 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -67,7 +67,7 @@
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_stream_peer.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/simple_quic_framer.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_test_utils.h"
+#include "net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "url/gurl.h"
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc
index 8020bd0..38ea8a7 100644
--- a/net/quic/quic_network_transaction_unittest.cc
+++ b/net/quic/quic_network_transaction_unittest.cc
@@ -3286,7 +3286,7 @@
                        client_maker_->MakeConnectionClosePacket(
                            packet_num++, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
                            "No recent network activity after 4s. Timeout:4s"));
-  } else if (version_.UsesTls() || GetQuicRestartFlag(quic_default_on_pto2)) {
+  } else {
     // Settings were sent in the request packet so there is only 1 packet to
     // retransmit.
     // QuicConnection::OnRetransmissionTimeout skips a packet number when
@@ -3312,29 +3312,6 @@
                        client_maker_->MakeConnectionClosePacket(
                            packet_num++, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
                            "No recent network activity after 4s. Timeout:4s"));
-  } else {
-    // Settings were sent in the request packet so there is only 1 packet to
-    // retransmit.
-    // TLP 1
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // TLP 2
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // RTO 1
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // RTO 2
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // RTO 3
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-
-    quic_data.AddWrite(SYNCHRONOUS,
-                       client_maker_->MakeConnectionClosePacket(
-                           packet_num++, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
-                           "No recent network activity after 4s. Timeout:4s"));
   }
 
   quic_data.AddRead(ASYNC, ERR_IO_PENDING);
@@ -3509,7 +3486,7 @@
                        client_maker_->MakeConnectionClosePacket(
                            packet_num++, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
                            "No recent network activity after 4s. Timeout:4s"));
-  } else if (version_.UsesTls() || GetQuicRestartFlag(quic_default_on_pto2)) {
+  } else {
     // Settings were sent in the request packet so there is only 1 packet to
     // retransmit.
     // QuicConnection::OnRetransmissionTimeout skips a packet number when
@@ -3535,27 +3512,6 @@
                        client_maker_->MakeConnectionClosePacket(
                            packet_num++, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
                            "No recent network activity after 4s. Timeout:4s"));
-  } else {
-    // TLP 1
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // TLP 2
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // RTO 1
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // RTO 2
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-    // RTO 3
-    quic_data.AddWrite(SYNCHRONOUS, client_maker_->MakeRetransmissionPacket(
-                                        1, packet_num++, true));
-
-    quic_data.AddWrite(SYNCHRONOUS,
-                       client_maker_->MakeConnectionClosePacket(
-                           packet_num++, true, quic::QUIC_NETWORK_IDLE_TIMEOUT,
-                           "No recent network activity after 4s. Timeout:4s"));
   }
 
   quic_data.AddRead(ASYNC, ERR_IO_PENDING);
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index f8b99432..015cdc6 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -79,7 +79,7 @@
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_spdy_session_peer.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_test_utils.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_test_utils.h"
+#include "net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -14326,10 +14326,10 @@
   EXPECT_TRUE(HasActiveJob(scheme_host_port_, privacy_mode_));
 
   // The pending task is scheduled for handshake timeout retransmission,
-  // which is 2 * 400ms with crypto frames and 1.5 * 400ms otherwise.
+  // which is 3 * 400ms with crypto frames and 1.5 * 400ms otherwise.
   base::TimeDelta handshake_timeout =
       QuicVersionUsesCryptoFrames(version_.transport_version)
-          ? (GetQuicRestartFlag(quic_default_on_pto2) ? 3 : 2) * kInitialRtt
+          ? 3 * kInitialRtt
           : 1.5 * kInitialRtt;
   EXPECT_EQ(handshake_timeout, task_runner->NextPendingTaskDelay());
 
diff --git a/net/reporting/reporting_delivery_agent.cc b/net/reporting/reporting_delivery_agent.cc
index 53d434f..edc9f2a 100644
--- a/net/reporting/reporting_delivery_agent.cc
+++ b/net/reporting/reporting_delivery_agent.cc
@@ -17,6 +17,7 @@
 #include "base/json/json_writer.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/time/tick_clock.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
@@ -46,17 +47,17 @@
 }
 
 std::string SerializeReports(const ReportList& reports, base::TimeTicks now) {
-  base::ListValue reports_value;
+  base::Value::List reports_value;
 
   for (const ReportingReport* report : reports) {
-    std::unique_ptr<base::DictionaryValue> report_value =
-        std::make_unique<base::DictionaryValue>();
+    base::Value::Dict report_value;
 
-    report_value->SetInteger("age", (now - report->queued).InMilliseconds());
-    report_value->SetString("type", report->type);
-    report_value->SetString("url", report->url.spec());
-    report_value->SetString("user_agent", report->user_agent);
-    report_value->SetKey("body", report->body->Clone());
+    report_value.Set("age", base::saturated_cast<int>(
+                                (now - report->queued).InMilliseconds()));
+    report_value.Set("type", report->type);
+    report_value.Set("url", report->url.spec());
+    report_value.Set("user_agent", report->user_agent);
+    report_value.Set("body", report->body->Clone());
 
     reports_value.Append(std::move(report_value));
   }
diff --git a/net/spdy/spdy_http_utils_unittest.cc b/net/spdy/spdy_http_utils_unittest.cc
index 5a44373..53558b8 100644
--- a/net/spdy/spdy_http_utils_unittest.cc
+++ b/net/spdy/spdy_http_utils_unittest.cc
@@ -10,7 +10,7 @@
 
 #include "net/http/http_request_info.h"
 #include "net/third_party/quiche/src/quiche/spdy/core/spdy_framer.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_test_utils.h"
+#include "net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace net {
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 545e4dd..498da62c 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -66,7 +66,7 @@
 #include "net/test/test_data_directory.h"
 #include "net/test/test_with_task_environment.h"
 #include "net/third_party/quiche/src/quiche/spdy/core/spdy_protocol.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_test_utils.h"
+#include "net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.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/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc
index a462698..074393d 100644
--- a/net/spdy/spdy_session_unittest.cc
+++ b/net/spdy/spdy_session_unittest.cc
@@ -60,7 +60,7 @@
 #include "net/test/gtest_util.h"
 #include "net/test/test_data_directory.h"
 #include "net/test/test_with_task_environment.h"
-#include "net/third_party/quiche/src/quiche/spdy/core/spdy_test_utils.h"
+#include "net/third_party/quiche/src/quiche/spdy/test_tools/spdy_test_utils.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/platform_test.h"
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn
index b29ac01e..bf915ae6 100644
--- a/net/third_party/quiche/BUILD.gn
+++ b/net/third_party/quiche/BUILD.gn
@@ -220,10 +220,6 @@
     "src/quiche/http2/http2_constants.h",
     "src/quiche/http2/http2_structures.cc",
     "src/quiche/http2/http2_structures.h",
-    "src/quiche/http2/platform/api/http2_bug_tracker.h",
-    "src/quiche/http2/platform/api/http2_flag_utils.h",
-    "src/quiche/http2/platform/api/http2_flags.h",
-    "src/quiche/http2/platform/api/http2_logging.h",
     "src/quiche/quic/core/congestion_control/bandwidth_sampler.cc",
     "src/quiche/quic/core/congestion_control/bandwidth_sampler.h",
     "src/quiche/quic/core/congestion_control/bbr2_drain.cc",
@@ -635,7 +631,6 @@
     "src/quiche/quic/core/uber_received_packet_manager.h",
     "src/quiche/quic/platform/api/quic_bug_tracker.h",
     "src/quiche/quic/platform/api/quic_client_stats.h",
-    "src/quiche/quic/platform/api/quic_containers.h",
     "src/quiche/quic/platform/api/quic_export.h",
     "src/quiche/quic/platform/api/quic_exported_stats.h",
     "src/quiche/quic/platform/api/quic_flag_utils.h",
@@ -801,7 +796,6 @@
       "src/quiche/quic/masque/masque_utils.cc",
       "src/quiche/quic/masque/masque_utils.h",
       "src/quiche/quic/platform/api/quic_epoll.h",
-      "src/quiche/quic/platform/api/quic_stream_buffer_allocator.h",
       "src/quiche/quic/platform/api/quic_udp_socket_platform_api.h",
       "src/quiche/quic/tools/quic_client.cc",
       "src/quiche/quic/tools/quic_client.h",
@@ -1337,21 +1331,13 @@
     "src/quiche/http2/core/priority_write_scheduler_test.cc",
     "src/quiche/http2/decoder/decode_buffer_test.cc",
     "src/quiche/http2/decoder/decode_http2_structures_test.cc",
-    "src/quiche/http2/decoder/frame_decoder_state_test_util.cc",
-    "src/quiche/http2/decoder/frame_decoder_state_test_util.h",
-    "src/quiche/http2/decoder/http2_frame_decoder_listener_test_util.cc",
-    "src/quiche/http2/decoder/http2_frame_decoder_listener_test_util.h",
     "src/quiche/http2/decoder/http2_frame_decoder_test.cc",
     "src/quiche/http2/decoder/http2_structure_decoder_test.cc",
-    "src/quiche/http2/decoder/http2_structure_decoder_test_util.cc",
-    "src/quiche/http2/decoder/http2_structure_decoder_test_util.h",
     "src/quiche/http2/decoder/payload_decoders/altsvc_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/continuation_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/data_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/goaway_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/headers_payload_decoder_test.cc",
-    "src/quiche/http2/decoder/payload_decoders/payload_decoder_base_test_util.cc",
-    "src/quiche/http2/decoder/payload_decoders/payload_decoder_base_test_util.h",
     "src/quiche/http2/decoder/payload_decoders/ping_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/priority_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/priority_update_payload_decoder_test.cc",
@@ -1360,56 +1346,64 @@
     "src/quiche/http2/decoder/payload_decoders/settings_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/unknown_payload_decoder_test.cc",
     "src/quiche/http2/decoder/payload_decoders/window_update_payload_decoder_test.cc",
-    "src/quiche/http2/hpack/decoder/hpack_block_collector.cc",
-    "src/quiche/http2/hpack/decoder/hpack_block_collector.h",
     "src/quiche/http2/hpack/decoder/hpack_block_collector_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_decoder_state_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_decoder_string_buffer_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_decoder_tables_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_decoder_test.cc",
-    "src/quiche/http2/hpack/decoder/hpack_entry_collector.cc",
-    "src/quiche/http2/hpack/decoder/hpack_entry_collector.h",
     "src/quiche/http2/hpack/decoder/hpack_entry_collector_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_entry_decoder_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_entry_type_decoder_test.cc",
-    "src/quiche/http2/hpack/decoder/hpack_string_collector.cc",
-    "src/quiche/http2/hpack/decoder/hpack_string_collector.h",
     "src/quiche/http2/hpack/decoder/hpack_string_decoder_test.cc",
     "src/quiche/http2/hpack/decoder/hpack_whole_entry_buffer_test.cc",
     "src/quiche/http2/hpack/http2_hpack_constants_test.cc",
     "src/quiche/http2/hpack/huffman/hpack_huffman_decoder_test.cc",
     "src/quiche/http2/hpack/huffman/hpack_huffman_encoder_test.cc",
     "src/quiche/http2/hpack/huffman/hpack_huffman_transcoder_test.cc",
-    "src/quiche/http2/hpack/tools/hpack_block_builder.cc",
-    "src/quiche/http2/hpack/tools/hpack_block_builder.h",
-    "src/quiche/http2/hpack/tools/hpack_block_builder_test.cc",
-    "src/quiche/http2/hpack/tools/hpack_example.cc",
-    "src/quiche/http2/hpack/tools/hpack_example.h",
     "src/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc",
     "src/quiche/http2/hpack/varint/hpack_varint_encoder_test.cc",
     "src/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc",
     "src/quiche/http2/http2_constants_test.cc",
-    "src/quiche/http2/http2_constants_test_util.cc",
-    "src/quiche/http2/http2_constants_test_util.h",
     "src/quiche/http2/http2_structures_test.cc",
-    "src/quiche/http2/http2_structures_test_util.cc",
-    "src/quiche/http2/http2_structures_test_util.h",
+    "src/quiche/http2/test_tools/frame_decoder_state_test_util.cc",
+    "src/quiche/http2/test_tools/frame_decoder_state_test_util.h",
     "src/quiche/http2/test_tools/frame_parts.cc",
     "src/quiche/http2/test_tools/frame_parts.h",
     "src/quiche/http2/test_tools/frame_parts_collector.cc",
     "src/quiche/http2/test_tools/frame_parts_collector.h",
     "src/quiche/http2/test_tools/frame_parts_collector_listener.cc",
     "src/quiche/http2/test_tools/frame_parts_collector_listener.h",
+    "src/quiche/http2/test_tools/hpack_block_builder.cc",
+    "src/quiche/http2/test_tools/hpack_block_builder.h",
+    "src/quiche/http2/test_tools/hpack_block_builder_test.cc",
+    "src/quiche/http2/test_tools/hpack_block_collector.cc",
+    "src/quiche/http2/test_tools/hpack_block_collector.h",
+    "src/quiche/http2/test_tools/hpack_entry_collector.cc",
+    "src/quiche/http2/test_tools/hpack_entry_collector.h",
+    "src/quiche/http2/test_tools/hpack_example.cc",
+    "src/quiche/http2/test_tools/hpack_example.h",
+    "src/quiche/http2/test_tools/hpack_string_collector.cc",
+    "src/quiche/http2/test_tools/hpack_string_collector.h",
+    "src/quiche/http2/test_tools/http2_constants_test_util.cc",
+    "src/quiche/http2/test_tools/http2_constants_test_util.h",
+    "src/quiche/http2/test_tools/http2_frame_builder.cc",
+    "src/quiche/http2/test_tools/http2_frame_builder.h",
+    "src/quiche/http2/test_tools/http2_frame_decoder_listener_test_util.cc",
+    "src/quiche/http2/test_tools/http2_frame_decoder_listener_test_util.h",
     "src/quiche/http2/test_tools/http2_random.cc",
     "src/quiche/http2/test_tools/http2_random.h",
     "src/quiche/http2/test_tools/http2_random_test.cc",
-    "src/quiche/http2/tools/http2_frame_builder.cc",
-    "src/quiche/http2/tools/http2_frame_builder.h",
-    "src/quiche/http2/tools/random_decoder_test.cc",
-    "src/quiche/http2/tools/random_decoder_test.h",
-    "src/quiche/http2/tools/random_util.cc",
-    "src/quiche/http2/tools/random_util.h",
+    "src/quiche/http2/test_tools/http2_structure_decoder_test_util.cc",
+    "src/quiche/http2/test_tools/http2_structure_decoder_test_util.h",
+    "src/quiche/http2/test_tools/http2_structures_test_util.cc",
+    "src/quiche/http2/test_tools/http2_structures_test_util.h",
+    "src/quiche/http2/test_tools/payload_decoder_base_test_util.cc",
+    "src/quiche/http2/test_tools/payload_decoder_base_test_util.h",
+    "src/quiche/http2/test_tools/random_decoder_test.cc",
+    "src/quiche/http2/test_tools/random_decoder_test.h",
+    "src/quiche/http2/test_tools/random_util.cc",
+    "src/quiche/http2/test_tools/random_util.h",
     "src/quiche/quic/core/congestion_control/bandwidth_sampler_test.cc",
     "src/quiche/quic/core/congestion_control/bbr2_simulator_test.cc",
     "src/quiche/quic/core/congestion_control/bbr_sender_test.cc",
@@ -1572,8 +1566,6 @@
     "src/quiche/spdy/core/hpack/hpack_output_stream_test.cc",
     "src/quiche/spdy/core/hpack/hpack_round_trip_test.cc",
     "src/quiche/spdy/core/hpack/hpack_static_table_test.cc",
-    "src/quiche/spdy/core/mock_spdy_framer_visitor.cc",
-    "src/quiche/spdy/core/mock_spdy_framer_visitor.h",
     "src/quiche/spdy/core/spdy_alt_svc_wire_format_test.cc",
     "src/quiche/spdy/core/spdy_frame_builder_test.cc",
     "src/quiche/spdy/core/spdy_framer_test.cc",
@@ -1583,11 +1575,11 @@
     "src/quiche/spdy/core/spdy_pinnable_buffer_piece_test.cc",
     "src/quiche/spdy/core/spdy_prefixed_buffer_reader_test.cc",
     "src/quiche/spdy/core/spdy_protocol_test.cc",
-    "src/quiche/spdy/core/spdy_protocol_test_utils.cc",
-    "src/quiche/spdy/core/spdy_protocol_test_utils.h",
     "src/quiche/spdy/core/spdy_simple_arena_test.cc",
-    "src/quiche/spdy/core/spdy_test_utils.cc",
-    "src/quiche/spdy/core/spdy_test_utils.h",
+    "src/quiche/spdy/test_tools/mock_spdy_framer_visitor.cc",
+    "src/quiche/spdy/test_tools/mock_spdy_framer_visitor.h",
+    "src/quiche/spdy/test_tools/spdy_test_utils.cc",
+    "src/quiche/spdy/test_tools/spdy_test_utils.h",
   ]
 
   configs += [ ":quiche_internal_config" ]
diff --git a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h
index cb70472..46e97ba0 100644
--- a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h
+++ b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_impl.h
@@ -17,7 +17,7 @@
 namespace quiche {
 namespace test {
 
-class QuicheTest : public ::testing::Test {
+class QuicheTestImpl : public ::testing::Test {
  private:
   QuicFlagChecker checker_;
   QuicFlagSaverImpl saver_;  // Save/restore all QUIC flag values.
diff --git a/sandbox/linux/syscall_broker/remote_syscall_arg_handler.cc b/sandbox/linux/syscall_broker/remote_syscall_arg_handler.cc
index 256586e..8b5a709 100644
--- a/sandbox/linux/syscall_broker/remote_syscall_arg_handler.cc
+++ b/sandbox/linux/syscall_broker/remote_syscall_arg_handler.cc
@@ -11,6 +11,8 @@
 #include <sys/uio.h>
 #include <unistd.h>
 
+#include <algorithm>
+
 #include "base/bits.h"
 #include "base/check_op.h"
 #include "base/containers/span.h"
diff --git a/services/BUILD.gn b/services/BUILD.gn
index 179e03ed..8cfb515 100644
--- a/services/BUILD.gn
+++ b/services/BUILD.gn
@@ -85,15 +85,12 @@
   }
 
   if (is_fuchsia) {
-    # Enable the test HTTP server for use by NetworkServiceTestWithService.*
-    use_test_server = true
-    use_cfv2 = false
-    additional_manifest_fragments = [
-      # TODO(crbug.com/1185811): Figure out why jit_capabilities is needed.
-      "//build/config/fuchsia/test/jit_capabilities.test-cmx",
+    use_cfv1 = false
 
-      "//build/config/fuchsia/test/network_capabilities.test-cmx",
-    ]
+    test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
+
+    additional_manifest_fragments =
+        [ "//build/config/fuchsia/test/network.shard.test-cml" ]
   }
 }
 
diff --git a/services/network/public/cpp/content_security_policy/content_security_policy.cc b/services/network/public/cpp/content_security_policy/content_security_policy.cc
index 8cc7a856..d5f266c 100644
--- a/services/network/public/cpp/content_security_policy/content_security_policy.cc
+++ b/services/network/public/cpp/content_security_policy/content_security_policy.cc
@@ -190,7 +190,6 @@
                      const CSPDirectiveName effective_directive_name,
                      const CSPDirectiveName directive_name,
                      const GURL& url,
-                     bool has_followed_redirect,
                      const mojom::SourceLocationPtr& source_location) {
   // For security reasons, some urls must not be disclosed. This includes the
   // blocked url and the source location of the error. Care must be taken to
@@ -203,8 +202,7 @@
   auto safe_source_location =
       source_location ? source_location->Clone() : mojom::SourceLocation::New();
 
-  context->SanitizeDataForUseInCspViolation(has_followed_redirect,
-                                            directive_name, &blocked_url,
+  context->SanitizeDataForUseInCspViolation(directive_name, &blocked_url,
                                             safe_source_location.get());
 
   std::stringstream message;
@@ -233,8 +231,8 @@
   if (policy->directives[effective_directive_name]->allow_star) {
     message << " Note that '*' matches only URLs with network schemes ('http', "
                "'https', 'ws', 'wss'), or URLs whose scheme matches `self`'s "
-               "scheme. "
-            << blocked_url_scheme << ":' must be added explicitely.";
+               "scheme. The scheme '"
+            << blocked_url_scheme << ":' must be added explicitly.";
   }
 
   message << "\n";
@@ -243,8 +241,7 @@
       ToString(effective_directive_name), ToString(directive_name),
       message.str(), blocked_url, policy->report_endpoints,
       policy->use_reporting_api, policy->header->header_value,
-      policy->header->type, has_followed_redirect,
-      std::move(safe_source_location)));
+      policy->header->type, std::move(safe_source_location)));
 }
 
 const GURL ExtractInnerURL(const GURL& url) {
@@ -1272,7 +1269,7 @@
                          directive_name == CSPDirectiveName::FencedFrameSrc
                      ? url
                      : url_before_redirects),
-          has_followed_redirect, source_location);
+          source_location);
     }
 
     return allowed ||
diff --git a/services/network/public/cpp/content_security_policy/csp_context.cc b/services/network/public/cpp/content_security_policy/csp_context.cc
index c82a942..243b9af6 100644
--- a/services/network/public/cpp/content_security_policy/csp_context.cc
+++ b/services/network/public/cpp/content_security_policy/csp_context.cc
@@ -72,7 +72,6 @@
 }
 
 void CSPContext::SanitizeDataForUseInCspViolation(
-    bool has_followed_redirect,
     mojom::CSPDirectiveName directive,
     GURL* blocked_url,
     network::mojom::SourceLocation* source_location) const {}
diff --git a/services/network/public/cpp/content_security_policy/csp_context.h b/services/network/public/cpp/content_security_policy/csp_context.h
index 35c379cc..cec3e27 100644
--- a/services/network/public/cpp/content_security_policy/csp_context.h
+++ b/services/network/public/cpp/content_security_policy/csp_context.h
@@ -68,7 +68,6 @@
   // without the round trip in the renderer process.
   // See https://crbug.com/721329
   virtual void SanitizeDataForUseInCspViolation(
-      bool has_followed_redirect,
       mojom::CSPDirectiveName directive,
       GURL* blocked_url,
       mojom::SourceLocation* source_location) const;
diff --git a/services/network/public/cpp/content_security_policy/csp_context_unittest.cc b/services/network/public/cpp/content_security_policy/csp_context_unittest.cc
index 9043c45..e7ac4816 100644
--- a/services/network/public/cpp/content_security_policy/csp_context_unittest.cc
+++ b/services/network/public/cpp/content_security_policy/csp_context_unittest.cc
@@ -38,7 +38,6 @@
   }
 
   void SanitizeDataForUseInCspViolation(
-      bool is_redirect,
       CSPDirectiveName directive,
       GURL* blocked_url,
       network::mojom::SourceLocation* source_location) const override {
@@ -352,7 +351,8 @@
             "violates the following Content Security Policy directive: "
             "\"frame-src *\". Note that '*' matches only URLs with network "
             "schemes ('http', 'https', 'ws', 'wss'), or URLs whose scheme "
-            "matches `self`'s scheme. data:' must be added explicitely.\n");
+            "matches `self`'s scheme. The scheme 'data:' must be added "
+            "explicitly.\n");
 }
 
 }  // namespace network
diff --git a/services/network/public/mojom/content_security_policy.mojom b/services/network/public/mojom/content_security_policy.mojom
index 8667fa6..be78fe0a 100644
--- a/services/network/public/mojom/content_security_policy.mojom
+++ b/services/network/public/mojom/content_security_policy.mojom
@@ -235,9 +235,6 @@
   // "report".
   ContentSecurityPolicyType type;
 
-  // Whether or not the violation happens after a redirect.
-  bool after_redirect;
-
   // The source code location that triggered the blocked navigation.
   SourceLocation source_location;
 };
diff --git a/storage/browser/file_system/file_system_operation_runner.cc b/storage/browser/file_system/file_system_operation_runner.cc
index 70672c6..629b346 100644
--- a/storage/browser/file_system/file_system_operation_runner.cc
+++ b/storage/browser/file_system/file_system_operation_runner.cc
@@ -13,8 +13,11 @@
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/callback_helpers.h"
 #include "base/containers/contains.h"
 #include "base/memory/ptr_util.h"
+#include "base/task/bind_post_task.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/url_request/url_request_context.h"
 #include "storage/browser/blob/shareable_file_reference.h"
@@ -664,7 +667,14 @@
                        std::move(on_close_callback)));
     return;
   }
-  std::move(callback).Run(std::move(file), std::move(on_close_callback));
+  base::ScopedClosureRunner scoped_on_close_callback;
+  if (on_close_callback) {
+    // Wrap `on_close_callback` to ensure it always runs, and on the IO thread.
+    scoped_on_close_callback = base::ScopedClosureRunner(base::BindPostTask(
+        base::SequencedTaskRunnerHandle::Get(), std::move(on_close_callback)));
+  }
+
+  std::move(callback).Run(std::move(file), std::move(scoped_on_close_callback));
   FinishOperation(id);
 }
 
diff --git a/storage/browser/file_system/file_system_operation_runner.h b/storage/browser/file_system/file_system_operation_runner.h
index b93bfd2..97802e2 100644
--- a/storage/browser/file_system/file_system_operation_runner.h
+++ b/storage/browser/file_system/file_system_operation_runner.h
@@ -12,6 +12,7 @@
 #include <set>
 #include <vector>
 
+#include "base/callback_helpers.h"
 #include "base/component_export.h"
 #include "base/containers/id_map.h"
 #include "base/memory/raw_ptr.h"
@@ -41,7 +42,12 @@
   using SnapshotFileCallback = FileSystemOperation::SnapshotFileCallback;
   using StatusCallback = FileSystemOperation::StatusCallback;
   using WriteCallback = FileSystemOperation::WriteCallback;
-  using OpenFileCallback = FileSystemOperation::OpenFileCallback;
+  // Implementers of FileSystemOperation::OpenFile() pass `on_close_callback` as
+  // a OnceClosure, but pass consumers a ScopedClosureRunner to ensure the
+  // callback is always run, and on the correct sequence (the I/O thread).
+  using OpenFileCallback =
+      base::OnceCallback<void(base::File file,
+                              base::ScopedClosureRunner on_close_callback)>;
   using ErrorBehavior = FileSystemOperation::ErrorBehavior;
   using CopyFileProgressCallback =
       FileSystemOperation::CopyFileProgressCallback;
diff --git a/storage/browser/quota/quota_database.cc b/storage/browser/quota/quota_database.cc
index 3e77290..44e6f30 100644
--- a/storage/browser/quota/quota_database.cc
+++ b/storage/browser/quota/quota_database.cc
@@ -832,9 +832,15 @@
       }));
 
   // Migrate an existing database from the old path.
-  if (!db_file_path_.empty()) {
-    if (!MoveLegacyDatabase())
+  if (!db_file_path_.empty() && !MoveLegacyDatabase()) {
+    if (!ResetStorage()) {
+      is_disabled_ = true;
+      db_.reset();
+      meta_table_.reset();
       return QuotaError::kDatabaseError;
+    }
+    // ResetStorage() has succeeded and database is already open.
+    return QuotaError::kNone;
   }
 
   if (!OpenDatabase() || !EnsureDatabaseVersion()) {
@@ -857,8 +863,10 @@
 bool QuotaDatabase::MoveLegacyDatabase() {
   // Migration was added on 04/2022 (https://crrev.com/c/3513545).
   // Cleanup after enough time has passed.
-  if (!base::PathExists(legacy_db_file_path_))
+  if (base::PathExists(db_file_path_) ||
+      !base::PathExists(legacy_db_file_path_)) {
     return true;
+  }
 
   if (!base::CreateDirectory(db_file_path_.DirName()) ||
       !base::CopyFile(legacy_db_file_path_, db_file_path_)) {
@@ -1013,6 +1021,12 @@
   sql::Database::Delete(legacy_db_file_path_);
   sql::Database::Delete(db_file_path_);
 
+  // Explicit file deletion to try and get consistent deletion across platforms.
+  base::DeleteFile(legacy_db_file_path_);
+  base::DeleteFile(db_file_path_);
+  base::DeleteFile(sql::Database::JournalPath(legacy_db_file_path_));
+  base::DeleteFile(sql::Database::JournalPath(db_file_path_));
+
   storage_directory_->Doom();
   storage_directory_->ClearDoomed();
 
diff --git a/storage/browser/quota/quota_database_unittest.cc b/storage/browser/quota/quota_database_unittest.cc
index dabf40499bb..dee16533 100644
--- a/storage/browser/quota/quota_database_unittest.cc
+++ b/storage/browser/quota/quota_database_unittest.cc
@@ -1006,11 +1006,54 @@
     auto db = CreateDatabase(/*is_incognito=*/false);
     auto result = db->GetBucket(params.storage_key, params.name, kTemp);
     EXPECT_TRUE(result.ok());
-    EXPECT_FALSE(base::PathExists(kLegacyFilePath));
     EXPECT_TRUE(base::PathExists(DbPath()));
   }
 }
 
+// Test for crbug.com/1322375.
+//
+// base::CreateDirectory behaves differently on Mac and allows directory
+// migration to succeed when we expect failure.
+#if !BUILDFLAG(IS_MAC)
+TEST_F(QuotaDatabaseTest, QuotaDatabaseDirectoryMigrationError) {
+  const base::FilePath kLegacyFilePath =
+      ProfilePath().AppendASCII(kDatabaseName);
+  BucketInitParams google_params(
+      StorageKey::CreateFromStringForTesting("http://google/"));
+  BucketInitParams example_params(
+      StorageKey::CreateFromStringForTesting("http://example/"));
+  BucketId example_id;
+  // Create database, add bucket and close by leaving scope.
+  {
+    auto db = CreateDatabase(/*is_incognito=*/false);
+    // Create two buckets to check that ids are different after database reset.
+    auto result = db->GetOrCreateBucket(google_params);
+    ASSERT_TRUE(result.ok());
+    result = db->GetOrCreateBucket(example_params);
+    ASSERT_TRUE(result.ok());
+    example_id = result->id;
+  }
+  {
+    // Delete database files to force a bad migration state.
+    base::DeleteFile(DbPath());
+    base::DeleteFile(sql::Database::JournalPath(DbPath()));
+
+    // Create a directory with the database file path to force directory
+    // migration to fail.
+    base::CreateDirectory(kLegacyFilePath);
+  }
+  {
+    // Open database to trigger migration. Migration failure forces a database
+    // reset.
+    auto db = CreateDatabase(/*is_incognito=*/false);
+    auto result = db->GetOrCreateBucket(example_params);
+    ASSERT_TRUE(result.ok());
+    // Validate database reset by checking that bucket id doesn't match.
+    EXPECT_NE(result->id, example_id);
+  }
+}
+#endif  // !BUILDFLAG(IS_MAC)
+
 TEST_F(QuotaDatabaseTest, GetOrCreateBucket_CorruptedDatabase) {
   QuotaDatabase db(ProfilePath());
   BucketInitParams params(
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index b748173..4e10c51 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1911,7 +1911,7 @@
       {
         "args": [],
         "cros_board": "atlas",
-        "cros_img": "atlas-release/R102-14682.0.0",
+        "cros_img": "atlas-release/R103-14778.0.0",
         "name": "lacros_all_tast_tests ATLAS_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -1927,7 +1927,7 @@
       {
         "args": [],
         "cros_board": "atlas",
-        "cros_img": "atlas-release/R102-14695.11.0",
+        "cros_img": "atlas-release/R103-14767.0.0",
         "name": "lacros_all_tast_tests ATLAS_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -1942,40 +1942,8 @@
       },
       {
         "args": [],
-        "cros_board": "atlas",
-        "cros_img": "atlas-release/R101-14588.51.0",
-        "name": "lacros_all_tast_tests ATLAS_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "ATLAS_RELEASE_BETA"
-      },
-      {
-        "args": [],
-        "cros_board": "atlas",
-        "cros_img": "atlas-release/R100-14526.89.0",
-        "name": "lacros_all_tast_tests ATLAS_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "ATLAS_RELEASE_STABLE"
-      },
-      {
-        "args": [],
         "cros_board": "eve",
-        "cros_img": "eve-release/R102-14682.0.0",
+        "cros_img": "eve-release/R103-14778.0.0",
         "name": "lacros_all_tast_tests EVE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -1991,7 +1959,7 @@
       {
         "args": [],
         "cros_board": "eve",
-        "cros_img": "eve-release/R102-14695.11.0",
+        "cros_img": "eve-release/R103-14767.0.0",
         "name": "lacros_all_tast_tests EVE_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2003,38 +1971,6 @@
         "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
         "timeout_sec": 10800,
         "variant_id": "EVE_RELEASE_DEV"
-      },
-      {
-        "args": [],
-        "cros_board": "eve",
-        "cros_img": "eve-release/R101-14588.51.0",
-        "name": "lacros_all_tast_tests EVE_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "EVE_RELEASE_BETA"
-      },
-      {
-        "args": [],
-        "cros_board": "eve",
-        "cros_img": "eve-release/R100-14526.89.0",
-        "name": "lacros_all_tast_tests EVE_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "EVE_RELEASE_STABLE"
       }
     ]
   },
@@ -2084,7 +2020,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R102-14682.0.0",
+        "cros_img": "hana-release/R103-14778.0.0",
         "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2100,7 +2036,7 @@
       {
         "args": [],
         "cros_board": "hana",
-        "cros_img": "hana-release/R102-14695.11.0",
+        "cros_img": "hana-release/R103-14767.0.0",
         "name": "lacros_all_tast_tests HANA_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2115,40 +2051,8 @@
       },
       {
         "args": [],
-        "cros_board": "hana",
-        "cros_img": "hana-release/R101-14588.67.0",
-        "name": "lacros_all_tast_tests HANA_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "HANA_RELEASE_BETA"
-      },
-      {
-        "args": [],
-        "cros_board": "hana",
-        "cros_img": "hana-release/R101-14583.0.0",
-        "name": "lacros_all_tast_tests HANA_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "HANA_RELEASE_STABLE"
-      },
-      {
-        "args": [],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R102-14682.0.0",
+        "cros_img": "jacuzzi-release/R103-14778.0.0",
         "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2164,7 +2068,7 @@
       {
         "args": [],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R102-14695.11.0",
+        "cros_img": "jacuzzi-release/R103-14767.0.0",
         "name": "lacros_all_tast_tests JACUZZI_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2178,43 +2082,11 @@
         "variant_id": "JACUZZI_RELEASE_DEV"
       },
       {
-        "args": [],
-        "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R101-14588.67.0",
-        "name": "lacros_all_tast_tests JACUZZI_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "JACUZZI_RELEASE_BETA"
-      },
-      {
-        "args": [],
-        "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R100-14526.89.0",
-        "name": "lacros_all_tast_tests JACUZZI_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
-        "test": "lacros_all_tast_tests",
-        "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/",
-        "timeout_sec": 10800,
-        "variant_id": "JACUZZI_RELEASE_STABLE"
-      },
-      {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
         ],
         "cros_board": "hana",
-        "cros_img": "hana-release/R102-14682.0.0",
+        "cros_img": "hana-release/R103-14778.0.0",
         "name": "ozone_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2231,7 +2103,7 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
         ],
         "cros_board": "hana",
-        "cros_img": "hana-release/R102-14695.11.0",
+        "cros_img": "hana-release/R103-14767.0.0",
         "name": "ozone_unittests HANA_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2247,42 +2119,8 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
         ],
-        "cros_board": "hana",
-        "cros_img": "hana-release/R101-14588.67.0",
-        "name": "ozone_unittests HANA_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "ozone_unittests",
-        "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "HANA_RELEASE_BETA"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
-        ],
-        "cros_board": "hana",
-        "cros_img": "hana-release/R101-14583.0.0",
-        "name": "ozone_unittests HANA_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "ozone_unittests",
-        "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "HANA_RELEASE_STABLE"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
-        ],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R102-14682.0.0",
+        "cros_img": "jacuzzi-release/R103-14778.0.0",
         "name": "ozone_unittests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2299,7 +2137,7 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
         ],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R102-14695.11.0",
+        "cros_img": "jacuzzi-release/R103-14767.0.0",
         "name": "ozone_unittests JACUZZI_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2313,44 +2151,10 @@
       },
       {
         "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
-        ],
-        "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R101-14588.67.0",
-        "name": "ozone_unittests JACUZZI_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "ozone_unittests",
-        "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "JACUZZI_RELEASE_BETA"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.ozone_unittests.filter"
-        ],
-        "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R100-14526.89.0",
-        "name": "ozone_unittests JACUZZI_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "ozone_unittests",
-        "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "JACUZZI_RELEASE_STABLE"
-      },
-      {
-        "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
         ],
         "cros_board": "hana",
-        "cros_img": "hana-release/R102-14682.0.0",
+        "cros_img": "hana-release/R103-14778.0.0",
         "name": "viz_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2367,7 +2171,7 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
         ],
         "cros_board": "hana",
-        "cros_img": "hana-release/R102-14695.11.0",
+        "cros_img": "hana-release/R103-14767.0.0",
         "name": "viz_unittests HANA_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2383,42 +2187,8 @@
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
         ],
-        "cros_board": "hana",
-        "cros_img": "hana-release/R101-14588.67.0",
-        "name": "viz_unittests HANA_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "HANA_RELEASE_BETA"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
-        ],
-        "cros_board": "hana",
-        "cros_img": "hana-release/R101-14583.0.0",
-        "name": "viz_unittests HANA_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "HANA_RELEASE_STABLE"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
-        ],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R102-14682.0.0",
+        "cros_img": "jacuzzi-release/R103-14778.0.0",
         "name": "viz_unittests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
@@ -2435,7 +2205,7 @@
           "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
         ],
         "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R102-14695.11.0",
+        "cros_img": "jacuzzi-release/R103-14767.0.0",
         "name": "viz_unittests JACUZZI_RELEASE_DEV",
         "resultdb": {
           "enable": true,
@@ -2446,40 +2216,6 @@
         "test_id_prefix": "ninja://components/viz:viz_unittests/",
         "timeout_sec": 3600,
         "variant_id": "JACUZZI_RELEASE_DEV"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
-        ],
-        "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R101-14588.67.0",
-        "name": "viz_unittests JACUZZI_RELEASE_BETA",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "JACUZZI_RELEASE_BETA"
-      },
-      {
-        "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/lacros-arm.viz_unittests.filter"
-        ],
-        "cros_board": "jacuzzi",
-        "cros_img": "jacuzzi-release/R100-14526.89.0",
-        "name": "viz_unittests JACUZZI_RELEASE_STABLE",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {},
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/",
-        "timeout_sec": 3600,
-        "variant_id": "JACUZZI_RELEASE_STABLE"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 72aa159..5e722406 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -8188,7 +8188,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -8273,7 +8273,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -8698,7 +8698,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -8783,7 +8783,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index a8a49c6..e35c54e 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -46162,7 +46162,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46247,7 +46247,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46672,7 +46672,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -46757,7 +46757,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47186,7 +47186,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47271,7 +47271,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47696,7 +47696,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -47781,7 +47781,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -48278,7 +48278,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -48363,7 +48363,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -48788,7 +48788,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -48873,7 +48873,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49370,7 +49370,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49455,7 +49455,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49880,7 +49880,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M101",
-              "revision": "version:101.0.4951.60"
+              "revision": "version:101.0.4951.63"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -49965,7 +49965,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M102",
-              "revision": "version:102.0.5005.43"
+              "revision": "version:102.0.5005.46"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 04bf8927..aad98ce1 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5890,21 +5890,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -5916,7 +5916,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "args": [
@@ -6036,21 +6036,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -6062,7 +6062,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index b49fff31..d59d7a3 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -87922,28 +87922,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "args": [
@@ -88043,28 +88043,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "isolate_profile_data": true,
@@ -89439,20 +89439,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -89465,7 +89465,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "args": [
@@ -89585,20 +89585,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -89611,7 +89611,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "merge": {
@@ -91144,20 +91144,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -91170,7 +91170,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "args": [
@@ -91290,20 +91290,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5047.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -91316,7 +91316,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       },
       {
         "merge": {
@@ -92051,20 +92051,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5047.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5052.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v103.0.5047.0",
-              "revision": "version:103.0.5047.0"
+              "location": "lacros_version_skew_tests_v103.0.5052.0",
+              "revision": "version:103.0.5052.0"
             }
           ],
           "dimension_sets": [
@@ -92077,7 +92077,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 103.0.5047.0"
+        "variant_id": "Lacros version skew testing ash 103.0.5052.0"
       }
     ]
   },
diff --git a/testing/buildbot/filters/lacros-arm.viz_unittests.filter b/testing/buildbot/filters/lacros-arm.viz_unittests.filter
index 165fe8a..84055fb 100644
--- a/testing/buildbot/filters/lacros-arm.viz_unittests.filter
+++ b/testing/buildbot/filters/lacros-arm.viz_unittests.filter
@@ -3,7 +3,9 @@
 -ExternalStencilPixelTest.StencilTestDisabled/GL
 -ExternalStencilPixelTest.StencilTestEnabled/GL
 -RendererPixelTestWithOverdrawFeedback.TranslucentRectangles/GL
+-VideoRendererPixelHiLoTest.ClippedYUVRect/1
 -VideoRendererPixelHiLoTest.ClippedYUVRect/GL_true
 -VideoRendererPixelHiLoTest.ClippedYUVRect/SkiaGL_true
+-VideoRendererPixelHiLoTest.SimpleYUVRect/1
 -VideoRendererPixelHiLoTest.SimpleYUVRect/GL_true
 -VideoRendererPixelHiLoTest.SimpleYUVRect/SkiaGL_true
\ No newline at end of file
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json
index f45dcaa..f081d766 100644
--- a/testing/buildbot/internal.chromeos.fyi.json
+++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1126,7 +1126,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R102-14682.0.0",
+        "cros_img": "octopus-release/R103-14778.0.0",
         "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1138,7 +1138,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R102-14695.11.0",
+        "cros_img": "octopus-release/R103-14767.0.0",
         "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_DEV",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1150,7 +1150,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R101-14588.67.0",
+        "cros_img": "octopus-release/R102-14695.25.0",
         "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_BETA",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1174,7 +1174,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R102-14682.0.0",
+        "cros_img": "octopus-release/R103-14778.0.0",
         "name": "ozone_unittests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1185,7 +1185,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R102-14695.11.0",
+        "cros_img": "octopus-release/R103-14767.0.0",
         "name": "ozone_unittests OCTOPUS_RELEASE_DEV",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1196,7 +1196,7 @@
       {
         "args": [],
         "cros_board": "octopus",
-        "cros_img": "octopus-release/R101-14588.67.0",
+        "cros_img": "octopus-release/R102-14695.25.0",
         "name": "ozone_unittests OCTOPUS_RELEASE_BETA",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1226,7 +1226,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R102-14682.0.0",
+        "cros_img": "strongbad-release/R103-14778.0.0",
         "name": "lacros_all_tast_tests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1238,7 +1238,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R102-14695.11.0",
+        "cros_img": "strongbad-release/R103-14767.0.0",
         "name": "lacros_all_tast_tests strongbad_RELEASE_DEV",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1250,7 +1250,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R101-14588.67.0",
+        "cros_img": "strongbad-release/R102-14695.25.0",
         "name": "lacros_all_tast_tests STRONGBAD_RELEASE_BETA",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
@@ -1274,7 +1274,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R102-14682.0.0",
+        "cros_img": "strongbad-release/R103-14778.0.0",
         "name": "ozone_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1285,7 +1285,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R102-14695.11.0",
+        "cros_img": "strongbad-release/R103-14767.0.0",
         "name": "ozone_unittests strongbad_RELEASE_DEV",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1296,7 +1296,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R101-14588.67.0",
+        "cros_img": "strongbad-release/R102-14695.25.0",
         "name": "ozone_unittests STRONGBAD_RELEASE_BETA",
         "swarming": {},
         "test": "ozone_unittests",
@@ -1318,7 +1318,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R102-14682.0.0",
+        "cros_img": "strongbad-release/R103-14778.0.0",
         "name": "viz_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "viz_unittests",
@@ -1329,7 +1329,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R102-14695.11.0",
+        "cros_img": "strongbad-release/R103-14767.0.0",
         "name": "viz_unittests strongbad_RELEASE_DEV",
         "swarming": {},
         "test": "viz_unittests",
@@ -1340,7 +1340,7 @@
       {
         "args": [],
         "cros_board": "strongbad",
-        "cros_img": "strongbad-release/R101-14588.67.0",
+        "cros_img": "strongbad-release/R102-14695.25.0",
         "name": "viz_unittests STRONGBAD_RELEASE_BETA",
         "swarming": {},
         "test": "viz_unittests",
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index b8c6f3d5..5168bf30 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -7473,12 +7473,8 @@
         'variants': [
           'CROS_HANA_RELEASE_LKGM',
           'CROS_HANA_RELEASE_DEV',
-          'CROS_HANA_RELEASE_BETA',
-          'CROS_HANA_RELEASE_STABLE',
           'CROS_JACUZZI_RELEASE_LKGM',
           'CROS_JACUZZI_RELEASE_DEV',
-          'CROS_JACUZZI_RELEASE_BETA',
-          'CROS_JACUZZI_RELEASE_STABLE',
         ]
       },
     },
@@ -7501,12 +7497,8 @@
         'variants': [
           'CROS_ATLAS_RELEASE_LKGM',
           'CROS_ATLAS_RELEASE_DEV',
-          'CROS_ATLAS_RELEASE_BETA',
-          'CROS_ATLAS_RELEASE_STABLE',
           'CROS_EVE_RELEASE_LKGM',
           'CROS_EVE_RELEASE_DEV',
-          'CROS_EVE_RELEASE_BETA',
-          'CROS_EVE_RELEASE_STABLE',
         ]
       },
     },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 3e1e353..fa21931 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5047.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5052.0/test_ash_chrome',
     ],
-    'identifier': 'Lacros version skew testing ash 103.0.5047.0',
+    'identifier': 'Lacros version skew testing ash 103.0.5052.0',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v103.0.5047.0',
-          'revision': 'version:103.0.5047.0',
+          'location': 'lacros_version_skew_tests_v103.0.5052.0',
+          'revision': 'version:103.0.5052.0',
         },
       ],
     },
@@ -479,7 +479,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M102',
-          'revision': 'version:102.0.5005.43',
+          'revision': 'version:102.0.5005.46',
         }
       ],
     },
@@ -503,7 +503,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M101',
-          'revision': 'version:101.0.4951.60',
+          'revision': 'version:101.0.4951.63',
         }
       ],
     },
@@ -623,7 +623,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M102',
-          'revision': 'version:102.0.5005.43',
+          'revision': 'version:102.0.5005.46',
         }
       ],
     },
@@ -647,7 +647,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M101',
-          'revision': 'version:101.0.4951.60',
+          'revision': 'version:101.0.4951.63',
         }
       ],
     },
@@ -767,7 +767,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M102',
-          'revision': 'version:102.0.5005.43',
+          'revision': 'version:102.0.5005.46',
         }
       ],
     },
@@ -791,7 +791,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M101',
-          'revision': 'version:101.0.4951.60',
+          'revision': 'version:101.0.4951.63',
         }
       ],
     },
@@ -895,8 +895,8 @@
   'CROS_ATLAS_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'atlas',
-      'cros_chrome_version': '102.0.4992.0',
-      'cros_img': 'atlas-release/R102-14682.0.0',
+      'cros_chrome_version': '103.0.5042.0',
+      'cros_img': 'atlas-release/R103-14778.0.0',
     },
     'enabled': True,
     'identifier': 'ATLAS_RELEASE_LKGM',
@@ -904,35 +904,17 @@
   'CROS_ATLAS_RELEASE_DEV': {
     'skylab': {
       'cros_board': 'atlas',
-      'cros_chrome_version': '102.0.5005.6',
-      'cros_img': 'atlas-release/R102-14695.11.0',
+      'cros_chrome_version': '103.0.5037.0',
+      'cros_img': 'atlas-release/R103-14767.0.0',
     },
     'enabled': True,
     'identifier': 'ATLAS_RELEASE_DEV',
   },
-  'CROS_ATLAS_RELEASE_BETA': {
-    'skylab': {
-      'cros_board': 'atlas',
-      'cros_chrome_version': '101.0.4951.32',
-      'cros_img': 'atlas-release/R101-14588.51.0',
-    },
-    'enabled': True,
-    'identifier': 'ATLAS_RELEASE_BETA',
-  },
-  'CROS_ATLAS_RELEASE_STABLE': {
-    'skylab': {
-      'cros_board': 'atlas',
-      'cros_chrome_version': '100.0.4896.133',
-      'cros_img': 'atlas-release/R100-14526.89.0',
-    },
-    'enabled': True,
-    'identifier': 'ATLAS_RELEASE_STABLE',
-  },
   'CROS_EVE_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'eve',
-      'cros_chrome_version': '102.0.4992.0',
-      'cros_img': 'eve-release/R102-14682.0.0',
+      'cros_chrome_version': '103.0.5042.0',
+      'cros_img': 'eve-release/R103-14778.0.0',
     },
     'enabled': True,
     'identifier': 'EVE_RELEASE_LKGM',
@@ -940,30 +922,12 @@
   'CROS_EVE_RELEASE_DEV': {
     'skylab': {
       'cros_board': 'eve',
-      'cros_chrome_version': '102.0.5005.6',
-      'cros_img': 'eve-release/R102-14695.11.0',
+      'cros_chrome_version': '103.0.5037.0',
+      'cros_img': 'eve-release/R103-14767.0.0',
     },
     'enabled': True,
     'identifier': 'EVE_RELEASE_DEV',
   },
-  'CROS_EVE_RELEASE_BETA': {
-    'skylab': {
-      'cros_board': 'eve',
-      'cros_chrome_version': '101.0.4951.32',
-      'cros_img': 'eve-release/R101-14588.51.0',
-    },
-    'enabled': True,
-    'identifier': 'EVE_RELEASE_BETA',
-  },
-  'CROS_EVE_RELEASE_STABLE': {
-    'skylab': {
-      'cros_board': 'eve',
-      'cros_chrome_version': '100.0.4896.133',
-      'cros_img': 'eve-release/R100-14526.89.0',
-    },
-    'enabled': True,
-    'identifier': 'EVE_RELEASE_STABLE',
-  },
   'CROS_EVE_FULL': {
     'skylab': {
       'cros_board': 'eve',
@@ -976,8 +940,8 @@
   'CROS_HANA_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'hana',
-      'cros_chrome_version': '102.0.4992.0',
-      'cros_img': 'hana-release/R102-14682.0.0',
+      'cros_chrome_version': '103.0.5042.0',
+      'cros_img': 'hana-release/R103-14778.0.0',
     },
     'enabled': True,
     'identifier': 'HANA_RELEASE_LKGM',
@@ -985,35 +949,17 @@
   'CROS_HANA_RELEASE_DEV': {
     'skylab': {
       'cros_board': 'hana',
-      'cros_chrome_version': '102.0.5005.6',
-      'cros_img': 'hana-release/R102-14695.11.0',
+      'cros_chrome_version': '103.0.5037.0',
+      'cros_img': 'hana-release/R103-14767.0.0',
     },
     'enabled': True,
     'identifier': 'HANA_RELEASE_DEV',
   },
-  'CROS_HANA_RELEASE_BETA': {
-    'skylab': {
-      'cros_board': 'hana',
-      'cros_chrome_version': '101.0.4951.41',
-      'cros_img': 'hana-release/R101-14588.67.0',
-    },
-    'enabled': True,
-    'identifier': 'HANA_RELEASE_BETA',
-  },
-  'CROS_HANA_RELEASE_STABLE': {
-    'skylab': {
-      'cros_board': 'hana',
-      'cros_chrome_version': '101.0.4943.0',
-      'cros_img': 'hana-release/R101-14583.0.0',
-    },
-    'enabled': True,
-    'identifier': 'HANA_RELEASE_STABLE',
-  },
   'CROS_JACUZZI_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'jacuzzi',
-      'cros_chrome_version': '102.0.4992.0',
-      'cros_img': 'jacuzzi-release/R102-14682.0.0',
+      'cros_chrome_version': '103.0.5042.0',
+      'cros_img': 'jacuzzi-release/R103-14778.0.0',
     },
     'enabled': True,
     'identifier': 'JACUZZI_RELEASE_LKGM',
@@ -1021,30 +967,12 @@
   'CROS_JACUZZI_RELEASE_DEV': {
     'skylab': {
       'cros_board': 'jacuzzi',
-      'cros_chrome_version': '102.0.5005.6',
-      'cros_img': 'jacuzzi-release/R102-14695.11.0',
+      'cros_chrome_version': '103.0.5037.0',
+      'cros_img': 'jacuzzi-release/R103-14767.0.0',
     },
     'enabled': True,
     'identifier': 'JACUZZI_RELEASE_DEV',
   },
-  'CROS_JACUZZI_RELEASE_BETA': {
-    'skylab': {
-      'cros_board': 'jacuzzi',
-      'cros_chrome_version': '101.0.4951.41',
-      'cros_img': 'jacuzzi-release/R101-14588.67.0',
-    },
-    'enabled': True,
-    'identifier': 'JACUZZI_RELEASE_BETA',
-  },
-  'CROS_JACUZZI_RELEASE_STABLE': {
-    'skylab': {
-      'cros_board': 'jacuzzi',
-      'cros_chrome_version': '100.0.4896.133',
-      'cros_img': 'jacuzzi-release/R100-14526.89.0',
-    },
-    'enabled': True,
-    'identifier': 'JACUZZI_RELEASE_STABLE',
-  },
   'CROS_OCTOPUS_FULL': {
     'skylab': {
       'cros_board': 'octopus',
@@ -1057,8 +985,8 @@
   'CROS_OCTOPUS_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'octopus',
-      'cros_chrome_version': '102.0.4992.0',
-      'cros_img': 'octopus-release/R102-14682.0.0',
+      'cros_chrome_version': '103.0.5042.0',
+      'cros_img': 'octopus-release/R103-14778.0.0',
     },
     'enabled': True,
     'identifier': 'OCTOPUS_RELEASE_LKGM',
@@ -1066,8 +994,8 @@
   'CROS_OCTOPUS_RELEASE_DEV': {
     'skylab': {
       'cros_board': 'octopus',
-      'cros_chrome_version': '102.0.5005.6',
-      'cros_img': 'octopus-release/R102-14695.11.0',
+      'cros_chrome_version': '103.0.5037.0',
+      'cros_img': 'octopus-release/R103-14767.0.0',
     },
     'enabled': True,
     'identifier': 'OCTOPUS_RELEASE_DEV',
@@ -1075,8 +1003,8 @@
   'CROS_OCTOPUS_RELEASE_BETA': {
     'skylab': {
       'cros_board': 'octopus',
-      'cros_chrome_version': '101.0.4951.41',
-      'cros_img': 'octopus-release/R101-14588.67.0',
+      'cros_chrome_version': '102.0.5005.22',
+      'cros_img': 'octopus-release/R102-14695.25.0',
     },
     'enabled': True,
     'identifier': 'OCTOPUS_RELEASE_BETA',
@@ -1093,8 +1021,8 @@
   'CROS_STRONGBAD_RELEASE_LKGM': {
     'skylab': {
       'cros_board': 'strongbad',
-      'cros_chrome_version': '102.0.4992.0',
-      'cros_img': 'strongbad-release/R102-14682.0.0',
+      'cros_chrome_version': '103.0.5042.0',
+      'cros_img': 'strongbad-release/R103-14778.0.0',
     },
     'enabled': True,
     'identifier': 'STRONGBAD_RELEASE_LKGM',
@@ -1102,8 +1030,8 @@
   'CROS_STRONGBAD_RELEASE_DEV': {
     'skylab': {
       'cros_board': 'strongbad',
-      'cros_chrome_version': '102.0.5005.6',
-      'cros_img': 'strongbad-release/R102-14695.11.0',
+      'cros_chrome_version': '103.0.5037.0',
+      'cros_img': 'strongbad-release/R103-14767.0.0',
     },
     'enabled': True,
     'identifier': 'strongbad_RELEASE_DEV',
@@ -1111,8 +1039,8 @@
   'CROS_STRONGBAD_RELEASE_BETA': {
     'skylab': {
       'cros_board': 'strongbad',
-      'cros_chrome_version': '101.0.4951.41',
-      'cros_img': 'strongbad-release/R101-14588.67.0',
+      'cros_chrome_version': '102.0.5005.22',
+      'cros_img': 'strongbad-release/R102-14695.25.0',
     },
     'enabled': True,
     'identifier': 'STRONGBAD_RELEASE_BETA',
diff --git a/testing/libfuzzer/proto/skia_image_filter_proto_converter.cc b/testing/libfuzzer/proto/skia_image_filter_proto_converter.cc
index 55e94d1..d3384b87 100644
--- a/testing/libfuzzer/proto/skia_image_filter_proto_converter.cc
+++ b/testing/libfuzzer/proto/skia_image_filter_proto_converter.cc
@@ -125,11 +125,10 @@
 };
 
 // Copied from SkVertices.cpp.
-enum VerticesConstants {
-  kMode_Mask = 0x0FF,
-  kHasTexs_Mask = 0x100,
-  kHasColors_Mask = 0x200,
-};
+using VerticesConstants = int;
+constexpr VerticesConstants kMode_Mask = 0x0FF;
+constexpr VerticesConstants kHasTexs_Mask = 0x100;
+constexpr VerticesConstants kHasColors_Mask = 0x200;
 
 // Copied from SerializationOffsets in SkPath.h. Named PathSerializationOffsets
 // to avoid conflicting with PathRefSerializationOffsets. Both enums were named
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 479912f..bf5935d 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -47,25 +47,6 @@
             ]
         }
     ],
-    "AndroidContextualSearchM95": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_With_Partial_Translate_20210930",
-                    "params": {
-                        "promo_card_max_shown": "3"
-                    },
-                    "enable_features": [
-                        "ContextualSearchNewSettings",
-                        "ContextualSearchTranslations"
-                    ]
-                }
-            ]
-        }
-    ],
     "AndroidDynamicPerformanceFramework": [
         {
             "platforms": [
@@ -2717,6 +2698,23 @@
             ]
         }
     ],
+    "DeferredShaping": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Preperiod_Enabled"
+                }
+            ]
+        }
+    ],
     "DelayFirstParkingOfStrings": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index cd45fbb..1688d8d 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -1458,5 +1458,9 @@
 const base::Feature kDispatchPopstateSync{"DispatchPopstateSync",
                                           base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Exposes non-standard stats in the WebRTC getStats() API.
+const base::Feature kWebRtcExposeNonStandardStats{
+    "WebRtc-ExposeNonStandardStats", 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 342f4e5..1996bdf 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -743,10 +743,13 @@
 BLINK_COMMON_EXPORT extern const base::Feature
     kAllowSourceSwitchOnPausedVideoMediaStream;
 
-// Kill switch for firing popstate immediately, instaed of deferring it until
+// Kill switch for firing popstate immediately, instead of deferring it until
 // after onload.
 BLINK_COMMON_EXPORT extern const base::Feature kDispatchPopstateSync;
 
+// If enabled, expose non-standard stats in the WebRTC getStats API.
+BLINK_COMMON_EXPORT extern const base::Feature kWebRtcExposeNonStandardStats;
+
 }  // 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 6e7ca36d..b117843 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -795,7 +795,6 @@
       RTCPeerConnectionSdpSemanticsPlanB
       RtcpMuxPolicyNegotiate
       RTPDataChannel
-      SelectionAddRangeIntersect
       SharedArrayBufferConstructedWithoutIsolation
       TextToSpeech_DisallowedByAutoplay
       V8SharedArrayBufferConstructedInExtensionWithoutIsolation
diff --git a/third_party/blink/public/mojom/input/input_handler.mojom b/third_party/blink/public/mojom/input/input_handler.mojom
index faf5832b..5d20657 100644
--- a/third_party/blink/public/mojom/input/input_handler.mojom
+++ b/third_party/blink/public/mojom/input/input_handler.mojom
@@ -352,8 +352,23 @@
   // Tells the renderer to scroll the currently focused node into rect only if
   // the currently focused node is a Text node (textfield, text area or content
   // editable divs).
+  // TODO(bokan): This method scrolls the currently focused node into the
+  // viewport, not the given `rect`. The parameter is used only to suppress
+  // redundant calls but could probably be removed the API name fixed.
+  // https://crbug.com/1323115
   ScrollFocusedEditableNodeIntoRect(gfx.mojom.Rect rect);
 
+  // Replies when the next PageScaleAnimation has completed. Can only be called
+  // on the outermost main frame. Can be used to reliably wait for a
+  // ScrollFocusedEditableNodeIntoRect to complete since that may create a
+  // PageScaleAnimation which can take several frames to complete.
+  // ScrollFocusedEditableNodeIntoRect cannot use a reply callback for this
+  // since it may be called on a subframe but the scroll will be completed in
+  // another renderer when it bubbles up to the root. Additionally, the caller
+  // may not be the one to have called ScrollFocusedEditableNodeIntoRect; for
+  // example, a test that simulates tapping an input box.
+  WaitForPageScaleAnimationForTesting() => ();
+
   // Requests the renderer to move the caret selection toward the point.
   MoveCaret(gfx.mojom.Point point);
 };
diff --git a/third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom b/third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom
index cd84647..9806c2a9 100644
--- a/third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom
+++ b/third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom
@@ -30,6 +30,24 @@
   Behavior rect_partial = kClosestEdge;
 };
 
+struct FocusedEditableParams {
+  // The location and size of the focused editable element whose caret is being
+  // used as the rect to ScrollIntoView. The location is relative to the caret
+  // rect which is being used to ScrollIntoView. The location must be stored
+  // relative to the caret (rather than typical absolute, relative to frame,
+  // coordinates) since each scroll will change the caret absolute position
+  // which is transformed by ScrollIntoView but this out-of-bound rect isn't.
+  // The absolute rect for the editable can then be reconstructed at the end of
+  // the ScrollIntoView from the caret rect.
+  gfx.mojom.Vector2dF relative_location;
+  gfx.mojom.SizeF size;
+
+  // This can be set to false to indicate that zooming shouldn't occur, e.g.
+  // because the editable may block pinch gestures. e.g if the textbox is
+  // within a touch-action: none container the user can't zoom back out.
+  bool can_zoom = true;
+};
+
 struct ScrollIntoViewParams {
   ScrollAlignment align_x;
   ScrollAlignment align_y;
@@ -38,22 +56,12 @@
   ScrollBehavior behavior = ScrollBehavior.kAuto;
   bool is_for_scroll_sequence = false;
 
-  // If true, once the root frame scrolls into view it will zoom into the scroll
-  // rect.
-  bool zoom_into_rect = false;
-
-  // The following bounds are normalized to the scrolling rect, i.e., to
-  // retrieve the approximate bounds in root layer's document, the relative
-  // bounds should be scaled by the width and height of the scrolling rect in x
-  // and y coordinates respectively (and then offset by the rect's location).
-  gfx.mojom.RectF relative_element_bounds;
-  gfx.mojom.RectF relative_caret_bounds;
-
-  // If true, avoid recursing the ScrollIntoView into the layout viewport of
-  // the main frame. This is so that we can then do a smooth page scale
-  // animation that zooms both layout and visual viewport into a focused
-  // editable element.
-  bool stop_at_main_frame_layout_viewport = false;
+  // If present, indicates that the scroll into view is a result of focusing an
+  // editable element. Unlike regular scroll into view, after revealing the
+  // caret in the top most document, the viewport will perform an animated
+  // scroll and zoom to make the editable a legible size and has special logic
+  // for placement of the caret and editable for convenient input.
+  FocusedEditableParams? for_focused_editable;
 
   // Whether a ScrollIntoView should bubble from an iframe to a parent that
   // isn't same-origin. This defaults to true since that's the behavior of JS
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 49756ebe..9f686f7 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -1256,7 +1256,7 @@
   kHTMLTableCellElementColspan = 1783,
   kHTMLTableCellElementColspanGreaterThan1000 = 1784,
   kHTMLTableCellElementColspanGreaterThan8190 = 1785,
-  kSelectionAddRangeIntersect = 1786,
+  kOBSOLETE_SelectionAddRangeIntersect = 1786,
   kPostMessageFromInsecureToSecureToplevel = 1787,
   // The above items are available in M57 branch.
 
diff --git a/third_party/blink/public/platform/web_request_peer.h b/third_party/blink/public/platform/web_request_peer.h
index b1b38fa..5b00743 100644
--- a/third_party/blink/public/platform/web_request_peer.h
+++ b/third_party/blink/public/platform/web_request_peer.h
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/memory/ref_counted.h"
+#include "base/time/time.h"
 #include "mojo/public/cpp/base/big_buffer.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "services/network/public/mojom/url_response_head.mojom-forward.h"
@@ -51,8 +52,11 @@
       std::vector<std::string>* removed_headers) = 0;
 
   // Called when response headers are available (after all redirects have
-  // been followed).
-  virtual void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) = 0;
+  // been followed). `response_arrival` represents the timing at which the
+  // response arrived at the renderer.
+  virtual void OnReceivedResponse(
+      network::mojom::URLResponseHeadPtr head,
+      base::TimeTicks response_arrival_at_renderer = base::TimeTicks()) = 0;
 
   // Called when the response body becomes available.
   virtual void OnStartLoadingResponseBody(
diff --git a/third_party/blink/public/platform/web_resource_request_sender.h b/third_party/blink/public/platform/web_resource_request_sender.h
index 00d251f..930a406 100644
--- a/third_party/blink/public/platform/web_resource_request_sender.h
+++ b/third_party/blink/public/platform/web_resource_request_sender.h
@@ -146,7 +146,9 @@
   virtual void OnUploadProgress(int64_t position, int64_t size);
 
   // Called when response headers are available.
-  virtual void OnReceivedResponse(network::mojom::URLResponseHeadPtr);
+  virtual void OnReceivedResponse(
+      network::mojom::URLResponseHeadPtr,
+      base::TimeTicks response_arrival_timing_at_renderer);
 
   // Called when metadata generated by the renderer is retrieved from the
   // cache.
diff --git a/third_party/blink/public/platform/web_url_response.h b/third_party/blink/public/platform/web_url_response.h
index 3f4837b..bce15a98 100644
--- a/third_party/blink/public/platform/web_url_response.h
+++ b/third_party/blink/public/platform/web_url_response.h
@@ -282,6 +282,7 @@
   BLINK_PLATFORM_EXPORT bool RequestIncludeCredentials() const;
 
   BLINK_PLATFORM_EXPORT void SetWasFetchedViaCache(bool);
+  BLINK_PLATFORM_EXPORT void SetArrivalTimeAtRenderer(base::TimeTicks arrival);
 
 #if INSIDE_BLINK
  protected:
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc
index 9198f77..7952a239 100644
--- a/third_party/blink/renderer/core/css/style_engine.cc
+++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -2635,6 +2635,8 @@
 
 void StyleEngine::RecalcStyleForNonLayoutNGContainerDescendants(
     Element& container) {
+  DCHECK(InRebuildLayoutTree());
+
   if (!RuntimeEnabledFeatures::CSSContainerQueriesEnabled())
     return;
 
@@ -2654,6 +2656,7 @@
 
   if (cq_data->SkippedStyleRecalc()) {
     DecrementSkippedContainerRecalc();
+    AllowMarkForReattachFromRebuildLayoutTreeScope allow_reattach(*this);
     RecalcStyleForContainer(container, {});
   }
 }
@@ -2990,6 +2993,11 @@
   layout_tree_rebuild_root_.Update(ancestor, dirty_node);
 }
 
+bool StyleEngine::MarkReattachAllowed() const {
+  return !InRebuildLayoutTree() ||
+         allow_mark_for_reattach_from_rebuild_layout_tree_;
+}
+
 bool StyleEngine::SupportsDarkColorScheme() {
   return (page_color_schemes_ &
           static_cast<ColorSchemeFlags>(ColorSchemeFlag::kDark)) &&
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h
index 95705bd..f25bf55 100644
--- a/third_party/blink/renderer/core/css/style_engine.h
+++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -341,6 +341,8 @@
   void UpdateStyleRecalcRoot(ContainerNode* ancestor, Node* dirty_node);
   void UpdateLayoutTreeRebuildRoot(ContainerNode* ancestor, Node* dirty_node);
 
+  bool MarkReattachAllowed() const;
+
   CSSFontSelector* GetFontSelector() { return font_selector_; }
 
   void RemoveFontFaceRules(const HeapVector<Member<const StyleRuleFontFace>>&);
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index c495e47..f42f925 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3176,12 +3176,23 @@
 void Element::AttachLayoutTree(AttachContext& context) {
   DCHECK(GetDocument().InStyleRecalc());
 
+  StyleEngine& style_engine = GetDocument().GetStyleEngine();
+
   const ComputedStyle* style = GetComputedStyle();
   bool being_rendered =
       context.parent && style && !style->IsEnsuredInDisplayNone();
+
   if (!being_rendered && !ChildNeedsReattachLayoutTree()) {
-    Node::AttachLayoutTree(context);
-    return;
+    // We may have skipped recalc for this Element if it's a container query
+    // container. This recalc must be resumed now, since we're not going to
+    // create a LayoutObject for the Element after all.
+    style_engine.RecalcStyleForNonLayoutNGContainerDescendants(*this);
+    // The above recalc may have marked some descendant for reattach, which
+    // would set the child-needs flag.
+    if (!ChildNeedsReattachLayoutTree()) {
+      Node::AttachLayoutTree(context);
+      return;
+    }
   }
 
   AttachContext children_context(context);
@@ -3227,9 +3238,7 @@
     // instance because the parent LayoutObject returns false for
     // IsChildAllowed, we need to complete the skipped style recalc for size
     // query containers as we would not have an NGBlockNode to resume from.
-    GetDocument()
-        .GetStyleEngine()
-        .RecalcStyleForNonLayoutNGContainerDescendants(*this);
+    style_engine.RecalcStyleForNonLayoutNGContainerDescendants(*this);
   }
 
   bool skip_container_descendants = SkippedContainerStyleRecalc();
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index e3c26a68..908534c 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -1336,6 +1336,7 @@
 
 void Node::SetNeedsReattachLayoutTree() {
   DCHECK(GetDocument().InStyleRecalc());
+  DCHECK(GetDocument().GetStyleEngine().MarkReattachAllowed());
   DCHECK(IsElementNode() || IsTextNode());
   DCHECK(InActiveDocument());
   SetFlag(kNeedsReattachLayoutTree);
diff --git a/third_party/blink/renderer/core/editing/dom_selection.cc b/third_party/blink/renderer/core/editing/dom_selection.cc
index fbf907c..798fe21 100644
--- a/third_party/blink/renderer/core/editing/dom_selection.cc
+++ b/third_party/blink/renderer/core/editing/dom_selection.cc
@@ -42,7 +42,6 @@
 #include "third_party/blink/renderer/core/editing/selection_template.h"
 #include "third_party/blink/renderer/core/editing/set_selection_options.h"
 #include "third_party/blink/renderer/core/editing/visible_selection.h"
-#include "third_party/blink/renderer/core/frame/deprecation/deprecation.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
@@ -634,20 +633,6 @@
       new_range->startContainer()->GetTreeScope()) {
     return;
   }
-
-  if (original_range->compareBoundaryPoints(Range::kStartToEnd, new_range,
-                                            ASSERT_NO_EXCEPTION) < 0 ||
-      new_range->compareBoundaryPoints(Range::kStartToEnd, original_range,
-                                       ASSERT_NO_EXCEPTION) < 0) {
-    return;
-  }
-
-  // TODO(tkent): "Merge the ranges if they intersect" was removed. We show a
-  // warning message for a while, and continue to collect the usage data.
-  // <https://code.google.com/p/chromium/issues/detail?id=353069>.
-  Deprecation::CountDeprecation(
-      tree_scope_->GetDocument().GetExecutionContext(),
-      WebFeature::kSelectionAddRangeIntersect);
 }
 
 // https://www.w3.org/TR/selection-api/#dom-selection-deletefromdocument
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 9704d8d8..381c52bf 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -154,6 +154,7 @@
 #include "third_party/blink/renderer/core/paint/paint_timing.h"
 #include "third_party/blink/renderer/core/paint/paint_timing_detector.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
+#include "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
 #include "third_party/blink/renderer/core/scroll/scrollbar_theme.h"
 #include "third_party/blink/renderer/core/timing/dom_window_performance.h"
 #include "third_party/blink/renderer/core/timing/window_performance.h"
@@ -644,6 +645,9 @@
   if (!use_anchor) {
     clamped_point =
         visual_viewport.ClampDocumentOffsetAtScale(target_position, new_scale);
+
+    // TODO(bokan): Why special case duration zero? PageScaleAnimation should
+    // work ok for that.
     if (duration.is_zero()) {
       SetPageScaleFactor(new_scale);
 
@@ -2036,35 +2040,40 @@
   core_frame->GetPage()->GetFocusController().SetFocusedFrame(core_frame);
 }
 
-bool WebViewImpl::ShouldZoomToLegibleScale(const Element& element) {
+void WebViewImpl::FinishScrollFocusedEditableIntoView(
+    const gfx::RectF& caret_rect_in_root_frame,
+    mojom::blink::ScrollIntoViewParamsPtr params) {
+  DCHECK(MainFrameImpl());
+  DCHECK(!IsFencedFrameRoot());
+  DCHECK(!caret_rect_in_root_frame.IsEmpty());
+  DCHECK(params->for_focused_editable);
+
+  // Zoom if:
+  // (1) Zoom to legible scale is enabled (i.e. Android)
+  // (2) We're on a non-mobile-friendly page
+  // (3) The element doesn't explicitly block pinch-zoom gestures so the user
+  //     can zoom back out.
   bool zoom_into_legible_scale =
       web_settings_->AutoZoomFocusedEditableToLegibleScale() &&
-      !GetPage()->GetVisualViewport().ShouldDisableDesktopWorkarounds();
+      !GetPage()->GetVisualViewport().ShouldDisableDesktopWorkarounds() &&
+      params->for_focused_editable->can_zoom;
 
-  if (zoom_into_legible_scale) {
-    // When deciding whether to zoom in on a focused text box, we should
-    // decide not to zoom in if the user won't be able to zoom out. e.g if the
-    // textbox is within a touch-action: none container the user can't zoom
-    // back out.
-    TouchAction action =
-        touch_action_util::ComputeEffectiveTouchAction(element);
-    if (!(static_cast<int>(action) & static_cast<int>(TouchAction::kPinchZoom)))
-      zoom_into_legible_scale = false;
-  }
+  // Reconstruct the editable element's absolute rect from the caret-relative
+  // location.
+  gfx::RectF editable_rect_in_root_frame =
+      scroll_into_view_util::FocusedEditableBoundsFromParams(
+          caret_rect_in_root_frame, params);
 
-  return zoom_into_legible_scale;
-}
+  DCHECK(!editable_rect_in_root_frame.IsEmpty());
 
-void WebViewImpl::ZoomAndScrollToFocusedEditableElementRect(
-    const gfx::Rect& element_bounds_in_document,
-    const gfx::Rect& caret_bounds_in_document,
-    bool zoom_into_legible_scale) {
   float scale;
   gfx::Point scroll;
   bool need_animation = false;
   ComputeScaleAndScrollForEditableElementRects(
-      element_bounds_in_document, caret_bounds_in_document,
-      zoom_into_legible_scale, scale, scroll, need_animation);
+      gfx::ToEnclosedRect(editable_rect_in_root_frame),
+      gfx::ToEnclosedRect(caret_rect_in_root_frame), zoom_into_legible_scale,
+      scale, scroll, need_animation);
+
   if (need_animation) {
     StartPageScaleAnimation(scroll, false, scale,
                             kScrollAndScaleAnimationDuration);
@@ -2079,11 +2088,11 @@
 }
 
 void WebViewImpl::ComputeScaleAndScrollForEditableElementRects(
-    const gfx::Rect& element_bounds_in_document,
-    const gfx::Rect& caret_bounds_in_document,
+    const gfx::Rect& element_bounds_in_root_frame,
+    const gfx::Rect& caret_bounds_in_root_frame,
     bool zoom_into_legible_scale,
     float& new_scale,
-    gfx::Point& new_scroll,
+    gfx::Point& new_scroll_position,
     bool& need_animation) {
   VisualViewport& visual_viewport = GetPage()->GetVisualViewport();
 
@@ -2091,15 +2100,20 @@
       GetPage()->GlobalRootScrollerController();
   Node* root_scroller = controller.GlobalRootScroller();
 
+  gfx::Rect element_bounds_in_document =
+      MainFrameImpl()->GetFrameView()->RootFrameToDocument(
+          element_bounds_in_root_frame);
+  gfx::Rect caret_bounds_in_document =
+      MainFrameImpl()->GetFrameView()->RootFrameToDocument(
+          caret_bounds_in_root_frame);
+
   gfx::Rect element_bounds_in_content = element_bounds_in_document;
   gfx::Rect caret_bounds_in_content = caret_bounds_in_document;
 
   // If the page has a non-default root scroller then we need to scroll that
   // rather than the "real" viewport. However, the given coordinates are in the
   // real viewport's document space rather than the root scroller's so we
-  // perform the conversion here.  TODO(bokan): Convert this function to take
-  // coordinates in absolute/root-frame coordinates to make this more
-  // consistent. https://crbug.com/931447.
+  // perform the conversion here.
   if (root_scroller != MainFrameImpl()->GetFrame()->GetDocument() &&
       controller.RootScrollerArea()) {
     ScrollOffset offset = controller.RootScrollerArea()->GetScrollOffset();
@@ -2156,6 +2170,9 @@
   gfx::SizeF target_viewport_size(visual_viewport.Size());
   target_viewport_size.Scale(1 / new_scale);
 
+  // TODO(bokan): The logic below is all tailored assuming LTR writing mode.
+  // Ideally, it'd perform its computations based on writing mode.
+  ScrollOffset scroll_offset;
   if (element_bounds_in_content.width() <= target_viewport_size.width()) {
     // Field is narrower than screen. Try to leave padding on left so field's
     // label is visible, but it's more important to ensure entire field is
@@ -2163,31 +2180,37 @@
     int ideal_left_padding = target_viewport_size.width() * leftBoxRatio;
     int max_left_padding_keeping_box_onscreen =
         target_viewport_size.width() - element_bounds_in_content.width();
-    new_scroll.set_x(element_bounds_in_content.x() -
-                     std::min<int>(ideal_left_padding,
-                                   max_left_padding_keeping_box_onscreen));
+    scroll_offset.set_x(element_bounds_in_content.x() -
+                        std::min<int>(ideal_left_padding,
+                                      max_left_padding_keeping_box_onscreen));
   } else {
     // Field is wider than screen. Try to left-align field, unless caret would
     // be offscreen, in which case right-align the caret.
-    new_scroll.set_x(std::max<int>(
+    scroll_offset.set_x(std::max<int>(
         element_bounds_in_content.x(),
         caret_bounds_in_content.x() + caret_bounds_in_content.width() +
             caretPadding - target_viewport_size.width()));
   }
   if (element_bounds_in_content.height() <= target_viewport_size.height()) {
     // Field is shorter than screen. Vertically center it.
-    new_scroll.set_y(
+    scroll_offset.set_y(
         element_bounds_in_content.y() -
         (target_viewport_size.height() - element_bounds_in_content.height()) /
             2);
   } else {
     // Field is taller than screen. Try to top align field, unless caret would
     // be offscreen, in which case bottom-align the caret.
-    new_scroll.set_y(std::max<int>(
+    scroll_offset.set_y(std::max<int>(
         element_bounds_in_content.y(),
         caret_bounds_in_content.y() + caret_bounds_in_content.height() +
             caretPadding - target_viewport_size.height()));
   }
+
+  // The output scroll will be used by the compositor so we must convert the
+  // scroll-origin relative (i.e. writing-mode dependent) ScrollOffset with a
+  // top-left relative scroll position.
+  new_scroll_position =
+      ToFlooredPoint(root_viewport->ScrollOffsetToPosition(scroll_offset));
 }
 
 void WebViewImpl::AdvanceFocus(bool reverse) {
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index 51ab4f0..2f8e971a 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -357,18 +357,17 @@
   // TODO(https://crbug.com/1139104): Remove this.
   std::string GetNullFrameReasonForBug1139104() const;
 
-  // Changes the zoom and scroll for zooming into an editable element
-  // with bounds |element_bounds_in_document| and caret bounds
-  // |caret_bounds_in_document|.
-  void ZoomAndScrollToFocusedEditableElementRect(
-      const gfx::Rect& element_bounds_in_document,
-      const gfx::Rect& caret_bounds_in_document,
-      bool zoom_into_legible_scale);
-
-  bool StartPageScaleAnimation(const gfx::Point& target_position,
-                               bool use_anchor,
-                               float new_scale,
-                               base::TimeDelta duration);
+  // Finishes a ScrollIntoView for a focused editable element by performing a
+  // view-level reveal. That is, when an embedder requests to reveal a focused
+  // editable, the editable is first ScrollIntoView'ed in the layout tree to
+  // ensure it's visible in the outermost document but stops short of scrolling
+  // the outermost frame. This method will then perform a platform-specific
+  // reveal of the editable, e.g. by animating a scroll and zoom in to a
+  // legible scale. This should only be called in a WebView where the main
+  // frame is local and outermost.
+  void FinishScrollFocusedEditableIntoView(
+      const gfx::RectF& caret_rect_in_root_frame,
+      mojom::blink::ScrollIntoViewParamsPtr params);
 
   // Handles context menu events orignated via the the keyboard. These
   // include the VK_APPS virtual key and the Shift+F10 combine. Code is
@@ -501,8 +500,6 @@
     return *chrome_client_.Get();
   }
 
-  bool ShouldZoomToLegibleScale(const Element&);
-
   // Allows main frame updates to occur if they were previously blocked. They
   // are blocked during loading a navigation, to allow Blink to proceed without
   // being interrupted by useless work until enough progress is made that it
@@ -689,20 +686,34 @@
   void RemoveFocusAndTextInputState();
 
   // Finds the zoom and scroll parameters for zooming into an editable element
-  // with bounds |element_bounds_in_document| and caret bounds
-  // |caret_bounds_in_document|. If the original element belongs to the local
-  // root of MainFrameImpl(), then the bounds are exactly those of the element
-  // and caret. Otherwise (when the editable element is inside an OOPIF), the
-  // bounds are projection of the original element's bounds in the main frame
-  // which is inside the layout area of some remote frame in this frame tree.
+  // with bounds |element_bounds_in_root_frame| and caret bounds
+  // |caret_bounds_in_root_frame|.
   void ComputeScaleAndScrollForEditableElementRects(
-      const gfx::Rect& element_bounds_in_document,
-      const gfx::Rect& caret_bounds_in_document,
+      const gfx::Rect& element_bounds_in_root_frame,
+      const gfx::Rect& caret_bounds_in_root_frame,
       bool zoom_into_legible_scale,
-      float& scale,
-      gfx::Point& scroll,
+      float& new_scale,
+      gfx::Point& new_scroll_position,
       bool& need_animation);
 
+  // Starts a page scale (and scroll!) animation on the compositor thread that
+  // will smoothly animate the viewport position and zoom. Returns true if an
+  // animation was queued, false if an animation was not needed.
+  //
+  // * target_position - A position in root document coordinates ("position"
+  // meaning it's relative to the top-left of the document).  This is the
+  // location that scroll will animate to.
+  // * use_anchor: If true, the animation `target_position` is used as an
+  // "anchor". `target_position` must already be visible in the viewport and
+  // scroll/zoom will be animated such that the anchor will be kept fixed in
+  // the viewport (if possible).
+  // * new_scale: The target page scale factor to animate to.
+  // * duration: The animation's duration.
+  bool StartPageScaleAnimation(const gfx::Point& target_position,
+                               bool use_anchor,
+                               float new_scale,
+                               base::TimeDelta duration);
+
   // Sends any outstanding TrackedFeaturesUpdate messages to the browser.
   void ReportActiveSchedulerTrackedFeatures();
 
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 5cff3fa2..4ec74cd 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
@@ -820,7 +820,6 @@
 // https://www.w3.org/TR/CSP3/#strip-url-for-use-in-reports
 static String StripURLForUseInReport(const SecurityOrigin* security_origin,
                                      const KURL& url,
-                                     RedirectStatus redirect_status,
                                      CSPDirectiveName effective_type) {
   if (!url.IsValid())
     return String();
@@ -837,8 +836,7 @@
   // and 'object-src' violations down to an origin. https://crbug.com/633306
   bool can_safely_expose_url =
       security_origin->CanRequest(url) ||
-      (redirect_status == RedirectStatus::kNoRedirect &&
-       effective_type != CSPDirectiveName::FrameSrc &&
+      (effective_type != CSPDirectiveName::FrameSrc &&
        effective_type != CSPDirectiveName::ObjectSrc &&
        effective_type != CSPDirectiveName::FencedFrameSrc);
 
@@ -867,7 +865,6 @@
     CSPDirectiveName effective_type,
     const KURL& blocked_url,
     const String& header,
-    RedirectStatus redirect_status,
     ContentSecurityPolicyType header_type,
     ContentSecurityPolicyViolationType violation_type,
     std::unique_ptr<SourceLocation> source_location,
@@ -877,15 +874,15 @@
     // If this load was blocked via 'frame-ancestors', then the URL of
     // |document| has not yet been initialized. In this case, we'll set both
     // 'documentURI' and 'blockedURI' to the blocked document's URL.
-    String stripped_url = StripURLForUseInReport(
-        delegate->GetSecurityOrigin(), blocked_url, RedirectStatus::kNoRedirect,
-        CSPDirectiveName::DefaultSrc);
+    String stripped_url =
+        StripURLForUseInReport(delegate->GetSecurityOrigin(), blocked_url,
+                               CSPDirectiveName::DefaultSrc);
     init->setDocumentURI(stripped_url);
     init->setBlockedURI(stripped_url);
   } else {
-    String stripped_url = StripURLForUseInReport(
-        delegate->GetSecurityOrigin(), delegate->Url(),
-        RedirectStatus::kNoRedirect, CSPDirectiveName::DefaultSrc);
+    String stripped_url =
+        StripURLForUseInReport(delegate->GetSecurityOrigin(), delegate->Url(),
+                               CSPDirectiveName::DefaultSrc);
     init->setDocumentURI(stripped_url);
     switch (violation_type) {
       case ContentSecurityPolicyViolationType::kInlineViolation:
@@ -903,8 +900,7 @@
         // blocked_url at this point is always the original url (before
         // redirects).
         init->setBlockedURI(StripURLForUseInReport(
-            delegate->GetSecurityOrigin(), blocked_url,
-            RedirectStatus::kNoRedirect, effective_type));
+            delegate->GetSecurityOrigin(), blocked_url, effective_type));
         break;
       case ContentSecurityPolicyViolationType::kTrustedTypesSinkViolation:
         init->setBlockedURI("trusted-types-sink");
@@ -963,9 +959,8 @@
     // violation. It is the URL pre-redirect. So it is safe to expose it in
     // reports without leaking any new informations to the document. See
     // https://crrev.com/c/2187792.
-    String source_file =
-        StripURLForUseInReport(delegate->GetSecurityOrigin(), source_url,
-                               RedirectStatus::kNoRedirect, effective_type);
+    String source_file = StripURLForUseInReport(delegate->GetSecurityOrigin(),
+                                                source_url, effective_type);
 
     init->setSourceFile(source_file);
     init->setLineNumber(source_location->LineNumber());
@@ -1010,7 +1005,6 @@
     ContentSecurityPolicyViolationType violation_type,
     std::unique_ptr<SourceLocation> source_location,
     LocalFrame* context_frame,
-    RedirectStatus redirect_status,
     Element* element,
     const String& source,
     const String& source_prefix,
@@ -1045,7 +1039,7 @@
   // report.
   source_location = GatherSecurityPolicyViolationEventData(
       violation_data, relevant_delegate, directive_text, effective_type,
-      blocked_url, header, redirect_status, header_type, violation_type,
+      blocked_url, header, header_type, violation_type,
       std::move(source_location), source, source_prefix);
 
   // TODO(mkwst): Obviously, we shouldn't hit this check, as extension-loaded
@@ -1152,7 +1146,7 @@
                       policy->header->type,
                       ContentSecurityPolicyViolationType::kURLViolation,
                       std::unique_ptr<SourceLocation>(),
-                      /*contextFrame=*/nullptr, redirect_status);
+                      /*contextFrame=*/nullptr);
     }
   }
 }
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.h b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
index 73dd6f8..c8086b7a 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.h
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
@@ -320,7 +320,6 @@
       ContentSecurityPolicyViolationType,
       std::unique_ptr<SourceLocation>,
       LocalFrame* = nullptr,
-      RedirectStatus = RedirectStatus::kFollowedRedirect,
       Element* = nullptr,
       const String& source = g_empty_string,
       const String& source_prefix = g_empty_string,
diff --git a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
index a989dea..e4a6b94 100644
--- a/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
+++ b/third_party/blink/renderer/core/frame/csp/csp_directive_list.cc
@@ -171,7 +171,6 @@
     CSPDirectiveName effective_type,
     const String& console_message,
     const KURL& blocked_url,
-    ResourceRequest::RedirectStatus redirect_status,
     ContentSecurityPolicyViolationType violation_type =
         ContentSecurityPolicyViolationType::kURLViolation,
     const String& sample = String(),
@@ -188,7 +187,6 @@
                           csp.header->header_value, csp.header->type,
                           violation_type, std::unique_ptr<SourceLocation>(),
                           nullptr,  // localFrame
-                          redirect_status,
                           nullptr,  // Element*
                           sample, sample_prefix, issue_id);
 }
@@ -217,7 +215,7 @@
                           csp.header->header_value, csp.header->type,
                           ContentSecurityPolicyViolationType::kInlineViolation,
                           std::move(source_location), nullptr,  // localFrame
-                          RedirectStatus::kNoRedirect, element, source);
+                          element, source);
 }
 
 void ReportEvalViolation(
@@ -242,12 +240,11 @@
         mojom::ConsoleMessageLevel::kError, report_message);
     policy->LogToConsole(console_message);
   }
-  policy->ReportViolation(directive_text, effective_type, message, blocked_url,
-                          csp.report_endpoints, csp.use_reporting_api,
-                          csp.header->header_value, csp.header->type,
-                          ContentSecurityPolicyViolationType::kEvalViolation,
-                          std::unique_ptr<SourceLocation>(), nullptr,
-                          RedirectStatus::kNoRedirect, nullptr, content);
+  policy->ReportViolation(
+      directive_text, effective_type, message, blocked_url,
+      csp.report_endpoints, csp.use_reporting_api, csp.header->header_value,
+      csp.header->type, ContentSecurityPolicyViolationType::kEvalViolation,
+      std::unique_ptr<SourceLocation>(), nullptr, nullptr, content);
 }
 
 void ReportWasmEvalViolation(
@@ -275,8 +272,7 @@
       directive_text, effective_type, message, blocked_url,
       csp.report_endpoints, csp.use_reporting_api, csp.header->header_value,
       csp.header->type, ContentSecurityPolicyViolationType::kWasmEvalViolation,
-      std::unique_ptr<SourceLocation>(), nullptr, RedirectStatus::kNoRedirect,
-      nullptr, content);
+      std::unique_ptr<SourceLocation>(), nullptr, nullptr, content);
 }
 
 bool CheckEval(const network::mojom::blink::CSPSourceList* directive) {
@@ -614,8 +610,8 @@
     suffix = suffix +
              " Note that '*' matches only URLs with network schemes ('http', "
              "'https', 'ws', 'wss'), or URLs whose scheme matches `self`'s "
-             "scheme. " +
-             url.Protocol() + ":' must be added explicitely.";
+             "scheme. The scheme '" +
+             url.Protocol() + ":' must be added explicitly.";
   }
 
   String raw_directive =
@@ -625,7 +621,7 @@
                       "' because it violates the following Content Security "
                       "Policy directive: \"" +
                       raw_directive + "\"." + suffix + "\n",
-                  url_before_redirects, redirect_status);
+                  url_before_redirects);
   return CSPDirectiveListIsReportOnly(csp);
 }
 
@@ -658,7 +654,6 @@
       ContentSecurityPolicy::GetDirectiveName(
           CSPDirectiveName::RequireTrustedTypesFor),
       CSPDirectiveName::RequireTrustedTypesFor, message, KURL(),
-      RedirectStatus::kNoRedirect,
       ContentSecurityPolicyViolationType::kTrustedTypesSinkViolation, sample,
       sample_prefix, issue_id);
   return CSPDirectiveListIsReportOnly(csp);
@@ -898,8 +893,7 @@
       csp, policy, "trusted-types", CSPDirectiveName::TrustedTypes,
       String::Format(message, policy_name.Utf8().c_str(),
                      raw_directive.Utf8().c_str()),
-      KURL(), RedirectStatus::kNoRedirect,
-      ContentSecurityPolicyViolationType::kTrustedTypesPolicyViolation,
+      KURL(), ContentSecurityPolicyViolationType::kTrustedTypesPolicyViolation,
       policy_name, String(), issue_id);
 
   return CSPDirectiveListIsReportOnly(csp);
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc
index f4c3408..1a361df1 100644
--- a/third_party/blink/renderer/core/frame/deprecation/deprecation.cc
+++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.cc
@@ -241,9 +241,6 @@
     case WebFeature::kRTCConstraintEnableRtpDataChannelsTrue:
       return DeprecationInfo::WithTranslation(
           feature, DeprecationIssueType::kRTPDataChannel);
-    case WebFeature::kSelectionAddRangeIntersect:
-      return DeprecationInfo::WithTranslation(
-          feature, DeprecationIssueType::kSelectionAddRangeIntersect);
     case WebFeature::kV8SharedArrayBufferConstructedWithoutIsolation:
       return DeprecationInfo::WithTranslation(
           feature,
diff --git a/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc b/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
index fed4c10..e0d527f 100644
--- a/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_mojo_handler.cc
@@ -801,10 +801,7 @@
       violation->blocked_url, violation->report_endpoints,
       violation->use_reporting_api, violation->header, violation->type,
       ContentSecurityPolicyViolationType::kURLViolation,
-      std::move(source_location), context_frame,
-      violation->after_redirect ? RedirectStatus::kFollowedRedirect
-                                : RedirectStatus::kNoRedirect,
-      nullptr /* Element */);
+      std::move(source_location), context_frame, nullptr /* Element */);
 }
 
 void LocalFrameMojoHandler::DidUpdateFramePolicy(
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index 9da4f0c..377e3a82 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -54,6 +54,7 @@
 #include "third_party/blink/renderer/core/page/plugin_script_forbidden_scope.h"
 #include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
+#include "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
 #include "third_party/blink/renderer/core/timing/dom_window_performance.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_request.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_vector.h"
@@ -82,14 +83,6 @@
   return *map;
 }
 
-gfx::RectF DeNormalizeRect(const gfx::RectF& normalized,
-                           const gfx::Rect& base) {
-  gfx::RectF result = normalized;
-  result.Scale(base.width(), base.height());
-  result.Offset(base.OffsetFromOrigin());
-  return result;
-}
-
 }  // namespace
 
 // static
@@ -718,46 +711,13 @@
     return;
   }
 
-  // Schedule the scroll.
+  scroll_into_view_util::ConvertParamsToParentFrame(
+      params, rect_to_scroll, *owner_object, *owner_object->View());
+
   PhysicalRect absolute_rect = owner_object->LocalToAncestorRect(
       PhysicalRect::EnclosingRect(rect_to_scroll), owner_object->View());
 
-  if (!params->zoom_into_rect ||
-      !owner_object->GetDocument().GetFrame()->LocalFrameRoot().IsMainFrame()) {
-    owner_object->ScrollRectToVisible(absolute_rect, std::move(params));
-    return;
-  }
-
-  // ZoomAndScrollToFocusedEditableElementRect will scroll only the layout and
-  // visual viewports. Ensure the element is actually visible in the viewport
-  // scrolling layer. (i.e. isn't clipped by some other content).
-  auto relative_element_bounds = params->relative_element_bounds;
-  auto relative_caret_bounds = params->relative_caret_bounds;
-
-  params->stop_at_main_frame_layout_viewport = true;
-  absolute_rect =
-      owner_object->ScrollRectToVisible(absolute_rect, std::move(params));
-
-  gfx::Rect rect_in_document =
-      owner_object->GetDocument()
-          .GetFrame()
-          ->LocalFrameRoot()
-          .View()
-          ->RootFrameToDocument(ToEnclosingRect(
-              owner_element->GetDocument().View()->ConvertToRootFrame(
-                  absolute_rect)));
-  gfx::Rect element_bounds_in_document = gfx::ToEnclosingRect(
-      DeNormalizeRect(relative_element_bounds, rect_in_document));
-  gfx::Rect caret_bounds_in_document = gfx::ToEnclosingRect(
-      DeNormalizeRect(relative_caret_bounds, rect_in_document));
-
-  // This is due to something such as scroll focused editable element into
-  // view on Android which also requires an automatic zoom into legible scale.
-  // This is handled by main frame's WebView.
-  WebViewImpl* web_view =
-      To<WebViewImpl>(WebFrame::FromCoreFrame(this)->View());
-  web_view->ZoomAndScrollToFocusedEditableElementRect(
-      element_bounds_in_document, caret_bounds_in_document, true);
+  owner_object->ScrollRectToVisible(absolute_rect, std::move(params));
 }
 
 void RemoteFrame::IntrinsicSizingInfoOfChildChanged(
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc
index 2056456..5180e24f 100644
--- a/third_party/blink/renderer/core/frame/web_frame_test.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -12625,8 +12625,8 @@
   EXPECT_GT(clip->scrollTop(), 0);
 }
 
-//  This test ensures that we scroll to the correct scale when the focused
-//  element has a selection rather than a carret.
+// This test ensures that we scroll to the correct scale when the focused
+// element has a selection rather than a caret.
 TEST_F(WebFrameSimTest, ScrollFocusedSelectionIntoView) {
   UseAndroidSettings();
   WebView().MainFrameViewWidget()->Resize(gfx::Size(400, 600));
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index 775f7a5..b888480 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -94,6 +94,7 @@
 #include "third_party/blink/renderer/core/html/portal/portal_contents.h"
 #include "third_party/blink/renderer/core/input/context_menu_allowed_scope.h"
 #include "third_party/blink/renderer/core/input/event_handler.h"
+#include "third_party/blink/renderer/core/input/touch_action_util.h"
 #include "third_party/blink/renderer/core/layout/hit_test_location.h"
 #include "third_party/blink/renderer/core/layout/hit_test_request.h"
 #include "third_party/blink/renderer/core/layout/layout_box.h"
@@ -158,19 +159,6 @@
 
 using ::ui::mojom::blink::DragOperation;
 
-const int kCaretPadding = 10;
-const float kIdealPaddingRatio = 0.3f;
-
-// Returns a rect which is offset and scaled accordingly to |base_rect|'s
-// location and size.
-gfx::RectF NormalizeRect(const gfx::Rect& to_normalize,
-                         const gfx::Rect& base_rect) {
-  gfx::RectF result(to_normalize);
-  result.Offset(base_rect.OffsetFromOrigin());
-  result.Scale(1.0 / base_rect.width(), 1.0 / base_rect.height());
-  return result;
-}
-
 void ForEachLocalFrameControlledByWidget(
     LocalFrame* frame,
     const base::RepeatingCallback<void(WebLocalFrameImpl*)>& callback) {
@@ -1356,6 +1344,9 @@
     if (focused_frame->AutofillClient())
       focused_frame->AutofillClient()->DidCompleteFocusChangeInFrame();
   }
+
+  if (page_scale_animation_for_testing_callback_)
+    std::move(page_scale_animation_for_testing_callback_).Run();
 }
 
 void WebFrameWidgetImpl::ScheduleAnimation() {
@@ -1482,10 +1473,9 @@
         /*is_pinch_gesture_active=*/false);
   }
 
-  // TODO(crbug.com/939118): ScrollFocusedNodeIntoViewForWidget does not work
-  // when the focused node is inside an OOPIF. This code path where
-  // scroll_focused_node_into_view is set is used only for WebView, crbug
-  // 939118 tracks fixing webviews to not use scroll_focused_node_into_view.
+  // TODO(crbug.com/939118): This code path where scroll_focused_node_into_view
+  // is set is used only for WebView, crbug 939118 tracks fixing webviews to
+  // not use scroll_focused_node_into_view.
   if (visual_properties.scroll_focused_node_into_view)
     ScrollFocusedEditableElementIntoView();
 }
@@ -1927,50 +1917,59 @@
   if (!element->GetLayoutObject())
     return false;
 
+  // The page scale animation started by ZoomAndScrollToFocusedEditableRect
+  // will scroll only the visual and layout viewports. Call ScrollRectToVisible
+  // first to ensure the editable is visible within the document (i.e. scroll
+  // it into view in any subscrollers). By setting `for_focused_editable`,
+  // ScrollRectToVisible will stop bubbling when it reaches the layout viewport
+  // so that can be animated by the PageScaleAnimation.
+  mojom::blink::ScrollIntoViewParamsPtr params =
+      ScrollAlignment::CreateScrollIntoViewParams(
+          ScrollAlignment::CenterIfNeeded(), ScrollAlignment::CenterIfNeeded(),
+          mojom::blink::ScrollType::kProgrammatic,
+          /*make_visible_in_visual_viewport=*/false,
+          mojom::blink::ScrollBehavior::kInstant);
+  params->for_focused_editable = mojom::blink::FocusedEditableParams::New();
+  params->for_focused_editable->relative_location = gfx::Vector2dF();
+  params->for_focused_editable->size = gfx::SizeF();
+
+  // When deciding whether to zoom in on a focused text box, we should
+  // decide not to zoom in if the user won't be able to zoom out. e.g if the
+  // textbox is within a touch-action: none container the user can't zoom
+  // back out.
+  TouchAction action = touch_action_util::ComputeEffectiveTouchAction(*element);
+  params->for_focused_editable->can_zoom =
+      static_cast<int>(action) & static_cast<int>(TouchAction::kPinchZoom);
+
+  PhysicalRect absolute_element_bounds;
+  PhysicalRect absolute_caret_bounds;
+
   if (edit_context) {
-    // Scroll the |EditContext| into view.
     gfx::Rect control_bounds_in_physical_pixels;
     gfx::Rect selection_bounds_in_physical_pixels;
     edit_context->GetLayoutBounds(&control_bounds_in_physical_pixels,
                                   &selection_bounds_in_physical_pixels);
 
-    LocalFrameView* main_frame_view = LocalRootImpl()->GetFrame()->View();
-
-    View()->ZoomAndScrollToFocusedEditableElementRect(
-        main_frame_view->RootFrameToDocument(
-            element->GetDocument().View()->ConvertToRootFrame(
-                control_bounds_in_physical_pixels)),
-        main_frame_view->RootFrameToDocument(
-            element->GetDocument().View()->ConvertToRootFrame(
-                selection_bounds_in_physical_pixels)),
-        View()->ShouldZoomToLegibleScale(*element));
-
-    return true;
+    absolute_element_bounds = PhysicalRect(control_bounds_in_physical_pixels);
+    absolute_caret_bounds = PhysicalRect(selection_bounds_in_physical_pixels);
+  } else {
+    absolute_element_bounds =
+        PhysicalRect(element->GetLayoutObject()->AbsoluteBoundingBoxRect());
+    absolute_caret_bounds = PhysicalRect(
+        element->GetDocument().GetFrame()->Selection().ComputeRectToScroll(
+            kRevealExtent));
   }
 
-  PhysicalRect rect_to_scroll;
-  auto params =
-      GetScrollParamsForFocusedEditableElement(*element, rect_to_scroll);
-  element->GetLayoutObject()->ScrollRectToVisible(rect_to_scroll,
+  gfx::Vector2dF editable_offset_from_caret(absolute_element_bounds.offset -
+                                            absolute_caret_bounds.offset);
+  gfx::SizeF editable_size(absolute_element_bounds.size);
+
+  params->for_focused_editable->relative_location = editable_offset_from_caret;
+  params->for_focused_editable->size = editable_size;
+
+  element->GetLayoutObject()->ScrollRectToVisible(absolute_caret_bounds,
                                                   std::move(params));
 
-  // Second phase for main frames is to schedule a zoom animation.
-  if (ForMainFrame()) {
-    LocalFrameView* main_frame_view = LocalRootImpl()->GetFrame()->View();
-
-    View()->ZoomAndScrollToFocusedEditableElementRect(
-        main_frame_view->RootFrameToDocument(
-            element->GetDocument().View()->ConvertToRootFrame(
-                element->GetLayoutObject()->AbsoluteBoundingBoxRect())),
-        main_frame_view->RootFrameToDocument(
-            element->GetDocument().View()->ConvertToRootFrame(
-                element->GetDocument()
-                    .GetFrame()
-                    ->Selection()
-                    .ComputeRectToScroll(kDoNotRevealExtent))),
-        View()->ShouldZoomToLegibleScale(*element));
-  }
-
   return true;
 }
 
@@ -3739,6 +3738,13 @@
   local_frame->ScrollFocusedEditableElementIntoRect(rect_in_dips);
 }
 
+void WebFrameWidgetImpl::WaitForPageScaleAnimationForTesting(
+    WaitForPageScaleAnimationForTestingCallback callback) {
+  DCHECK(ForMainFrame());
+  DCHECK(LocalRootImpl()->GetFrame()->IsOutermostMainFrame());
+  page_scale_animation_for_testing_callback_ = std::move(callback);
+}
+
 void WebFrameWidgetImpl::ZoomToFindInPageRect(
     const gfx::Rect& rect_in_root_frame) {
   if (ForMainFrame()) {
@@ -4367,77 +4373,6 @@
   }
 }
 
-mojom::blink::ScrollIntoViewParamsPtr
-WebFrameWidgetImpl::GetScrollParamsForFocusedEditableElement(
-    const Element& element,
-    PhysicalRect& out_rect_to_scroll) {
-  // For main frames, scrolling takes place in two phases.
-  if (ForMainFrame()) {
-    // Since the page has been resized, the layout may have changed. The page
-    // scale animation started by ZoomAndScrollToFocusedEditableRect will scroll
-    // only the visual and layout viewports. We'll call ScrollRectToVisible with
-    // the stop_at_main_frame_layout_viewport param to ensure the element is
-    // actually visible in the page.
-    mojom::blink::ScrollIntoViewParamsPtr params =
-        ScrollAlignment::CreateScrollIntoViewParams(
-            ScrollAlignment::CenterIfNeeded(),
-            ScrollAlignment::CenterIfNeeded(),
-            mojom::blink::ScrollType::kProgrammatic, false,
-            mojom::blink::ScrollBehavior::kInstant);
-    params->stop_at_main_frame_layout_viewport = true;
-    out_rect_to_scroll =
-        PhysicalRect(element.GetLayoutObject()->AbsoluteBoundingBoxRect());
-    return params;
-  }
-
-  LocalFrameView& frame_view = *element.GetDocument().View();
-  gfx::Rect absolute_element_bounds =
-      element.GetLayoutObject()->AbsoluteBoundingBoxRect();
-  gfx::Rect absolute_caret_bounds =
-      element.GetDocument().GetFrame()->Selection().AbsoluteCaretBounds();
-  // Ideally, the chosen rectangle includes the element box and caret bounds
-  // plus some margin on the left. If this does not work (i.e., does not fit
-  // inside the frame view), then choose a subrect which includes the caret
-  // bounds. It is preferable to also include element bounds' location and left
-  // align the scroll. If this cant be satisfied, the scroll will be right
-  // aligned.
-  gfx::Rect maximal_rect =
-      UnionRects(absolute_element_bounds, absolute_caret_bounds);
-
-  // Set the ideal margin.
-  int width =
-      static_cast<int>(kIdealPaddingRatio * absolute_element_bounds.width());
-  maximal_rect.set_x(maximal_rect.right() - width);
-  maximal_rect.set_height(width);
-
-  bool maximal_rect_fits_in_frame =
-      !(frame_view.Size() - maximal_rect.size()).IsEmpty();
-
-  if (!maximal_rect_fits_in_frame) {
-    gfx::Rect frame_rect(maximal_rect.origin(), frame_view.Size());
-    maximal_rect.Intersect(frame_rect);
-    gfx::Point point_forced_to_be_visible =
-        absolute_caret_bounds.bottom_right() +
-        gfx::Vector2d(kCaretPadding, kCaretPadding);
-    if (!maximal_rect.Contains(point_forced_to_be_visible)) {
-      // Move the rect towards the point until the point is barely contained.
-      maximal_rect.Offset(point_forced_to_be_visible -
-                          maximal_rect.bottom_right());
-    }
-  }
-
-  mojom::blink::ScrollIntoViewParamsPtr params =
-      ScrollAlignment::CreateScrollIntoViewParams();
-  params->zoom_into_rect = View()->ShouldZoomToLegibleScale(element);
-  params->relative_element_bounds = NormalizeRect(
-      IntersectRects(absolute_element_bounds, maximal_rect), maximal_rect);
-  params->relative_caret_bounds = NormalizeRect(
-      IntersectRects(absolute_caret_bounds, maximal_rect), maximal_rect);
-  params->behavior = mojom::blink::ScrollBehavior::kInstant;
-  out_rect_to_scroll = PhysicalRect(maximal_rect);
-  return params;
-}
-
 bool WebFrameWidgetImpl::ShouldAutoDetermineCompositingToLCDTextSetting() {
   return true;
 }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index 0464058..5cf4f91 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -789,6 +789,8 @@
   void MoveRangeSelectionExtent(const gfx::Point& extent_in_dips) override;
   void ScrollFocusedEditableNodeIntoRect(
       const gfx::Rect& rect_in_dips) override;
+  void WaitForPageScaleAnimationForTesting(
+      WaitForPageScaleAnimationForTestingCallback callback) override;
   void MoveCaret(const gfx::Point& point_in_dips) override;
 #if BUILDFLAG(IS_ANDROID)
   void SelectAroundCaret(mojom::blink::SelectionGranularity granularity,
@@ -823,14 +825,6 @@
 
   void RecordManipulationTypeCounts(cc::ManipulationInfo info);
 
-  // Finds the parameters required for scrolling the focused editable |element|
-  // into view. |out_rect_to_scroll| is used for recursive scrolling of the
-  // element into view and contains all or part of element's bounding box and
-  // always includes the caret and is with respect to absolute coordinates.
-  mojom::blink::ScrollIntoViewParamsPtr
-  GetScrollParamsForFocusedEditableElement(const Element& element,
-                                           PhysicalRect& out_rect_to_scroll);
-
   enum DragAction { kDragEnter, kDragOver };
   // Consolidate some common code between starting a drag over a target and
   // updating a drag over a target. If we're starting a drag, |isEntering|
@@ -1094,6 +1088,9 @@
   // Whether this widget is for a child local root, or otherwise a main frame.
   const bool is_for_child_local_root_;
 
+  WaitForPageScaleAnimationForTestingCallback
+      page_scale_animation_for_testing_callback_;
+
   // This stores the last hidden page popup. If a GestureTap attempts to open
   // the popup that is closed by its previous GestureTapDown, the popup remains
   // closed.
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.h b/third_party/blink/renderer/core/html/forms/html_button_element.h
index 8cfd2e3..0829f822 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.h
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-class HTMLButtonElement final : public HTMLFormControlElement {
+class CORE_EXPORT HTMLButtonElement final : public HTMLFormControlElement {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
index 9f2fa76..0e52426 100644
--- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
@@ -629,10 +629,6 @@
     case DeprecationIssueType::kRTPDataChannel:
       type = protocol::Audits::DeprecationIssueTypeEnum::RTPDataChannel;
       break;
-    case DeprecationIssueType::kSelectionAddRangeIntersect:
-      type = protocol::Audits::DeprecationIssueTypeEnum::
-          SelectionAddRangeIntersect;
-      break;
     case DeprecationIssueType::kSharedArrayBufferConstructedWithoutIsolation:
       type = protocol::Audits::DeprecationIssueTypeEnum::
           SharedArrayBufferConstructedWithoutIsolation;
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
index adf3cf7..7db7e0cd 100644
--- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
+++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
@@ -91,7 +91,6 @@
   kRTCPeerConnectionSdpSemanticsPlanB,
   kRtcpMuxPolicyNegotiate,
   kRTPDataChannel,
-  kSelectionAddRangeIntersect,
   kSharedArrayBufferConstructedWithoutIsolation,
   kTextToSpeech_DisallowedByAutoplay,
   kV8SharedArrayBufferConstructedInExtensionWithoutIsolation,
diff --git a/third_party/blink/renderer/core/inspector/inspector_contrast.cc b/third_party/blink/renderer/core/inspector/inspector_contrast.cc
index 695a72c..a661029cf3 100644
--- a/third_party/blink/renderer/core/inspector/inspector_contrast.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_contrast.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/css/css_computed_style_declaration.h"
 #include "third_party/blink/renderer/core/css/css_gradient_value.h"
 #include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
+#include "third_party/blink/renderer/core/display_lock/display_lock_document_state.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/flat_tree_traversal.h"
 #include "third_party/blink/renderer/core/dom/node.h"
@@ -139,6 +140,7 @@
   if (!layout_view)
     return;
 
+  document_->GetDisplayLockDocumentState().UnlockShapingDeferredElements();
   if (!layout_view->GetFrameView()->UpdateLifecycleToPrePaintClean(
           DocumentUpdateReason::kInspector)) {
     return;
@@ -271,6 +273,10 @@
     return colors;
   }
 
+  if (RuntimeEnabledFeatures::DeferredShapingEnabled()) {
+    document_->GetDisplayLockDocumentState().UnlockShapingDeferredElements();
+    document_->UpdateStyleAndLayout(DocumentUpdateReason::kInspector);
+  }
   PhysicalRect content_bounds = GetNodeRect(text_node);
   LocalFrameView* view = text_node->GetDocument().View();
   if (!view)
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 bfff940..62e0dd7f 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -2523,7 +2523,7 @@
           mojom::blink::ScrollType::kProgrammatic,
           true /* make_visible_in_visual_viewport */,
           mojom::blink::ScrollBehavior::kInstant,
-          true /* is_for_scroll_sequence */, false /* zoom_into_rect */));
+          true /* is_for_scroll_sequence */));
   return Response::Success();
 }
 
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni
index 101e28b..8c47b80 100644
--- a/third_party/blink/renderer/core/layout/build.gni
+++ b/third_party/blink/renderer/core/layout/build.gni
@@ -537,6 +537,7 @@
   "ng/ng_disable_side_effects_scope.cc",
   "ng/ng_disable_side_effects_scope.h",
   "ng/ng_early_break.h",
+  "ng/ng_fieldset_break_token_data.h",
   "ng/ng_fieldset_layout_algorithm.cc",
   "ng/ng_fieldset_layout_algorithm.h",
   "ng/ng_floats_utils.cc",
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index e890e67..0fda044 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -3983,10 +3983,17 @@
 Node* LayoutBlockFlow::NodeForHitTest() const {
   NOT_DESTROYED();
   // If we are in the margins of block elements that are part of a
-  // continuation we're actually still inside the enclosing element
+  // block-in-inline we're actually still inside the enclosing element
   // that was split. Use the appropriate inner node.
-  return IsAnonymousBlockContinuation() ? Continuation()->NodeForHitTest()
-                                        : LayoutBlock::NodeForHitTest();
+  if (UNLIKELY(IsBlockInInline())) {
+    DCHECK(RuntimeEnabledFeatures::LayoutNGBlockInInlineEnabled());
+    DCHECK(Parent());
+    DCHECK(Parent()->IsLayoutInline());
+    return Parent()->NodeForHitTest();
+  }
+  if (UNLIKELY(IsAnonymousBlockContinuation()))
+    return Continuation()->NodeForHitTest();
+  return LayoutBlock::NodeForHitTest();
 }
 
 bool LayoutBlockFlow::HitTestChildren(HitTestResult& result,
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index e8571ce..1e7772cc 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -107,6 +107,7 @@
 #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h"
 #include "third_party/blink/renderer/core/paint/rounded_border_geometry.h"
 #include "third_party/blink/renderer/core/resize_observer/resize_observer_size.h"
+#include "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
 #include "third_party/blink/renderer/core/style/computed_style_base_constants.h"
 #include "third_party/blink/renderer/core/style/shadow_list.h"
 #include "third_party/blink/renderer/platform/geometry/float_rounded_rect.h"
@@ -1185,7 +1186,7 @@
 
 PhysicalRect LayoutBox::ScrollRectToVisibleLocally(
     const PhysicalRect& absolute_rect,
-    const mojom::blink::ScrollIntoViewParamsPtr& params) {
+    mojom::blink::ScrollIntoViewParamsPtr& params) {
   NOT_DESTROYED();
   DCHECK(params->type == mojom::blink::ScrollType::kProgrammatic ||
          params->type == mojom::blink::ScrollType::kUser);
@@ -1207,8 +1208,9 @@
     // if the stop_at_main_frame_layout_viewport option is set. We do this so
     // that we can allow a smooth "scroll and zoom" animation to do the final
     // scroll in cases like scrolling a focused editable box into view.
-    if (params->stop_at_main_frame_layout_viewport &&
-        current_box->IsGlobalRootScroller())
+    // TODO(bokan): This may need to account for fenced frames.
+    // https://crbug.com/1314858
+    if (params->for_focused_editable && current_box->IsGlobalRootScroller())
       break;
 
     ScrollableArea* area_to_scroll = nullptr;
@@ -1253,6 +1255,10 @@
     // If the next box to scroll is in another frame, we need to convert the
     // scroll box to the new frame's absolute coordinates.
     if (next_box && next_box->View() != current_box->View()) {
+      scroll_into_view_util::ConvertParamsToParentFrame(
+          params, gfx::RectF(absolute_rect_to_scroll), *current_box->View(),
+          *next_box->View());
+
       absolute_rect_to_scroll = current_box->View()->LocalToAncestorRect(
           absolute_rect_to_scroll, next_box->View(),
           kTraverseDocumentBoundaries);
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index 8c7c8fd..af55932 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -890,10 +890,17 @@
   // Reveals the given rect, given in absolute coordinates, by scrolling this
   // LayoutBox and then all its ancestors up to the local root frame. To
   // continue the reveal through remote ancestors, use
-  // LayoutObject::ScrollRectToVisible.
+  // LayoutObject::ScrollRectToVisible. Returns the updated absolute rect, in
+  // the absolute coordinates of the frame in which the scroll stopped (either
+  // due to reaching a local root or a frame which isn't allowed to bubble
+  // scrolls.
+  // TODO(bokan): Having just a rect as the return value is awkward since the
+  // coordinate space it'll be relative to isn't predictable; the bubbling can
+  // stop at an arbitrary frame.
+  // TODO(bokan): Move this into scroll_into_view_util.h.
   PhysicalRect ScrollRectToVisibleLocally(
       const PhysicalRect& absolute_rect,
-      const mojom::blink::ScrollIntoViewParamsPtr&);
+      mojom::blink::ScrollIntoViewParamsPtr&);
 
   LayoutRectOutsets MarginBoxOutsets() const {
     NOT_DESTROYED();
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index 2cbe51f..3d33a8fd 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -824,7 +824,7 @@
 LayoutBox* LayoutInline::CreateAnonymousBoxToSplit(
     const LayoutBox* box_to_split) const {
   NOT_DESTROYED();
-  DCHECK(box_to_split->IsAnonymous());
+  DCHECK(box_to_split->IsBlockInInline());
   DCHECK(IsA<LayoutBlockFlow>(box_to_split));
   DCHECK(RuntimeEnabledFeatures::LayoutNGBlockInInlineEnabled());
   DCHECK(!ForceLegacyLayout());
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index 234f938..41748e8 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -100,6 +100,7 @@
 #include "third_party/blink/renderer/core/layout/ng/table/layout_ng_table.h"
 #include "third_party/blink/renderer/core/layout/ng/table/layout_ng_table_cell.h"
 #include "third_party/blink/renderer/core/page/autoscroll_controller.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/paint/fragment_data_iterator.h"
 #include "third_party/blink/renderer/core/paint/image_element_timing.h"
@@ -1025,13 +1026,13 @@
          view->IsHorizontalWritingMode();
 }
 
-PhysicalRect LayoutObject::ScrollRectToVisible(
+void LayoutObject::ScrollRectToVisible(
     const PhysicalRect& absolute_rect,
     mojom::blink::ScrollIntoViewParamsPtr params) {
   NOT_DESTROYED();
   LayoutBox* enclosing_box = EnclosingBox();
   if (!enclosing_box)
-    return absolute_rect;
+    return;
 
   GetFrame()->GetSmoothScrollSequencer().AbortAnimations();
   GetFrame()->GetSmoothScrollSequencer().SetScrollType(params->type);
@@ -1040,21 +1041,31 @@
   PhysicalRect updated_absolute_rect =
       enclosing_box->ScrollRectToVisibleLocally(absolute_rect, params);
 
-  // Continue the scroll via IPC if there's a remote ancestor.
-  // TODO(bokan): This probably needs to happen fenced frames in at least some
-  // cases. crbug.com/1314858.
-  LocalFrame& local_root = GetFrame()->LocalFrameRoot();
-  if (!local_root.IsMainFrame()) {
-    LocalFrameView* view = local_root.View();
-    if (view->AllowedToPropagateScrollIntoView(params)) {
-      view->ScrollRectToVisibleInRemoteParent(updated_absolute_rect,
-                                              std::move(params));
-    }
-  }
-
   GetFrame()->GetSmoothScrollSequencer().RunQueuedAnimations();
 
-  return updated_absolute_rect;
+  LocalFrame& local_root = GetFrame()->LocalFrameRoot();
+  LocalFrameView* local_root_view = local_root.View();
+
+  if (!local_root_view)
+    return;
+
+  if (!local_root.IsMainFrame()) {
+    // Continue the scroll via IPC if there's a remote ancestor.
+    // TODO(bokan): This probably needs to happen fenced frames in at least some
+    // cases. crbug.com/1314858.
+    if (local_root_view->AllowedToPropagateScrollIntoView(params)) {
+      local_root_view->ScrollRectToVisibleInRemoteParent(updated_absolute_rect,
+                                                         std::move(params));
+    }
+  } else if (params->for_focused_editable) {
+    // If we're scrolling a focused editable into view, once we reach the main
+    // frame we need to perform an animated scroll and zoom to bring the
+    // editable into a legible size.
+    gfx::RectF caret_rect_in_root_frame(updated_absolute_rect);
+    DCHECK(!caret_rect_in_root_frame.IsEmpty());
+    local_root.GetPage()->GetChromeClient().FinishScrollFocusedEditableIntoView(
+        caret_rect_in_root_frame, std::move(params));
+  }
 }
 
 LayoutBox* LayoutObject::EnclosingBox() const {
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 6b5f132..d3e1b0b 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -435,13 +435,10 @@
 
   // Takes the given rect, assumed to be in absolute coordinates, and scrolls
   // this Element and all it's containers such that the child content of this
-  // Element at that rect is visible in the viewport. Returns the new absolute
-  // rect of the target rect after all scrolls are completed, in the coordinate
-  // space of the local root frame.
-  // TODO(nburris): The returned rect is actually in document coordinates, not
-  // root frame coordinates.
-  PhysicalRect ScrollRectToVisible(const PhysicalRect&,
-                                   mojom::blink::ScrollIntoViewParamsPtr);
+  // Element at that rect is visible in the viewport.
+  // TODO(bokan): Move this to scroll_into_view_util.h.
+  void ScrollRectToVisible(const PhysicalRect&,
+                           mojom::blink::ScrollIntoViewParamsPtr);
 
   // Convenience function for getting to the nearest enclosing box of a
   // LayoutObject.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_break_token_data.h b/third_party/blink/renderer/core/layout/ng/ng_block_break_token_data.h
index 7c7bec11..8abeb939 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_break_token_data.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_break_token_data.h
@@ -14,6 +14,7 @@
  public:
   enum NGBreakTokenDataType {
     kBlockBreakTokenData,
+    kFieldsetBreakTokenData,
     kFlexBreakTokenData,
     kGridBreakTokenData,
     kTableRowBreakTokenData
@@ -37,6 +38,7 @@
 
   virtual ~NGBlockBreakTokenData() = default;
 
+  bool IsFieldsetType() const { return Type() == kFieldsetBreakTokenData; }
   bool IsFlexType() const { return Type() == kFlexBreakTokenData; }
   bool IsGridType() const { return Type() == kGridBreakTokenData; }
   bool IsTableRowType() const { return Type() == kTableRowBreakTokenData; }
@@ -47,7 +49,7 @@
   LayoutUnit consumed_block_size_legacy_adjustment;
 
   unsigned sequence_number = 0;
-  unsigned type : 2;
+  unsigned type : 3;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
index 1c462c5..69f89e6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space.h
@@ -523,6 +523,12 @@
     return HasRareData() && rare_data_->is_inside_balanced_columns;
   }
 
+  // Return true if forced breaks inside should be ignored. This is needed by
+  // out-of-flow positioned elements during column balancing.
+  bool ShouldIgnoreForcedBreaks() const {
+    return HasRareData() && rare_data_->should_ignore_forced_breaks;
+  }
+
   // Return true if we're participating in the same block formatting context as
   // the one established by the nearest ancestor multicol container.
   bool IsInColumnBfc() const {
@@ -829,6 +835,7 @@
               static_cast<unsigned>(kFragmentNone)),
           requires_content_before_breaking(false),
           is_inside_balanced_columns(false),
+          should_ignore_forced_breaks(false),
           is_in_column_bfc(false),
           min_block_size_should_encompass_intrinsic_size(false),
           min_break_appeal(kBreakAppealLastResort),
@@ -852,6 +859,7 @@
           requires_content_before_breaking(
               other.requires_content_before_breaking),
           is_inside_balanced_columns(other.is_inside_balanced_columns),
+          should_ignore_forced_breaks(other.should_ignore_forced_breaks),
           is_in_column_bfc(other.is_in_column_bfc),
           min_block_size_should_encompass_intrinsic_size(
               other.min_block_size_should_encompass_intrinsic_size),
@@ -928,6 +936,7 @@
           requires_content_before_breaking !=
               other.requires_content_before_breaking ||
           is_inside_balanced_columns != other.is_inside_balanced_columns ||
+          should_ignore_forced_breaks != other.should_ignore_forced_breaks ||
           is_in_column_bfc != other.is_in_column_bfc ||
           min_break_appeal != other.min_break_appeal ||
           propagate_child_break_values != other.propagate_child_break_values)
@@ -962,7 +971,8 @@
           is_restricted_block_size_table_cell || hide_table_cell_if_empty ||
           block_direction_fragmentation_type != kFragmentNone ||
           requires_content_before_breaking || is_inside_balanced_columns ||
-          is_in_column_bfc || min_break_appeal != kBreakAppealLastResort ||
+          should_ignore_forced_breaks || is_in_column_bfc ||
+          min_break_appeal != kBreakAppealLastResort ||
           propagate_child_break_values || is_at_fragmentainer_start)
         return false;
 
@@ -1209,6 +1219,7 @@
     unsigned block_direction_fragmentation_type : 2;
     unsigned requires_content_before_breaking : 1;
     unsigned is_inside_balanced_columns : 1;
+    unsigned should_ignore_forced_breaks : 1;
     unsigned is_in_column_bfc : 1;
     unsigned min_block_size_should_encompass_intrinsic_size : 1;
     unsigned min_break_appeal : kNGBreakAppealBitsNeeded;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
index eb83e520..a23f688e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h
@@ -200,6 +200,10 @@
     space_.EnsureRareData()->is_inside_balanced_columns = true;
   }
 
+  void SetShouldIgnoreForcedBreaks() {
+    space_.EnsureRareData()->should_ignore_forced_breaks = true;
+  }
+
   void SetIsInColumnBfc() { space_.EnsureRareData()->is_in_column_bfc = true; }
 
   void SetMinBlockSizeShouldEncompassIntrinsicSize() {
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_break_token_data.h b/third_party/blink/renderer/core/layout/ng/ng_fieldset_break_token_data.h
new file mode 100644
index 0000000..0604587
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_break_token_data.h
@@ -0,0 +1,32 @@
+// Copyright 2022 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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_FIELDSET_BREAK_TOKEN_DATA_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_FIELDSET_BREAK_TOKEN_DATA_H_
+
+#include "third_party/blink/renderer/core/layout/ng/ng_block_break_token_data.h"
+
+namespace blink {
+
+struct NGFieldsetBreakTokenData final : NGBlockBreakTokenData {
+  explicit NGFieldsetBreakTokenData(const NGBlockBreakTokenData* other_data)
+      : NGBlockBreakTokenData(kFieldsetBreakTokenData, other_data) {}
+
+  void Trace(Visitor* visitor) const override {
+    NGBlockBreakTokenData::Trace(visitor);
+  }
+
+  LayoutUnit legend_block_size_contribution;
+};
+
+template <>
+struct DowncastTraits<NGFieldsetBreakTokenData> {
+  static bool AllowFrom(const NGBlockBreakTokenData& token_data) {
+    return token_data.IsFieldsetType();
+  }
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_NG_FIELDSET_BREAK_TOKEN_DATA_H_
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 ab26378..3af70e5 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
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_fieldset_break_token_data.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h"
@@ -81,6 +82,12 @@
   intrinsic_block_size_ =
       IsResumingLayout(BreakToken()) ? LayoutUnit() : Borders().block_start;
 
+  if (InvolvedInBlockFragmentation(container_builder_)) {
+    container_builder_.SetBreakTokenData(
+        MakeGarbageCollected<NGFieldsetBreakTokenData>(
+            container_builder_.GetBreakTokenData()));
+  }
+
   NGBreakStatus break_status = LayoutChildren();
   if (break_status == NGBreakStatus::kNeedsEarlierBreak) {
     // We need to abort the layout. No fragment will be generated.
@@ -195,20 +202,9 @@
       DCHECK_NE(border_box_size_.block_size, kIndefiniteSize);
       LayoutUnit legend_size_contribution;
       if (IsResumingLayout(BreakToken())) {
-        // The legend has been laid out in previous fragments, and
-        // adjusted_padding_box_size will need to be adjusted further to account
-        // for block size taken up by the legend.
-        //
-        // To calculate its size contribution to the border block-start area,
-        // take the difference between the previously consumed block-size of the
-        // fieldset excluding its specified block-start border, and the consumed
-        // block-size of the contents wrapper.
-        LayoutUnit content_consumed_block_size =
-            content_break_token ? content_break_token->ConsumedBlockSize()
-                                : LayoutUnit();
-        legend_size_contribution = consumed_block_size_ -
-                                   Borders().block_start -
-                                   content_consumed_block_size;
+        const auto* token_data =
+            To<NGFieldsetBreakTokenData>(BreakToken()->TokenData());
+        legend_size_contribution = token_data->legend_block_size_contribution;
       } else {
         // We're at the first fragment. The current layout position
         // (intrinsic_block_size_) is at the outer block-end edge of the legend
@@ -217,6 +213,12 @@
             intrinsic_block_size_ - Borders().block_start;
       }
 
+      if (InvolvedInBlockFragmentation(container_builder_)) {
+        auto* token_data = To<NGFieldsetBreakTokenData>(
+            container_builder_.GetBreakTokenData());
+        token_data->legend_block_size_contribution = legend_size_contribution;
+      }
+
       adjusted_padding_box_size.block_size = std::max(
           adjusted_padding_box_size.block_size - legend_size_contribution,
           Padding().BlockSum());
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
index b7e8ea7..037548a9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
@@ -69,6 +69,8 @@
 
 bool IsForcedBreakValue(const NGConstraintSpace& constraint_space,
                         EBreakBetween break_value) {
+  if (constraint_space.ShouldIgnoreForcedBreaks())
+    return false;
   if (break_value == EBreakBetween::kColumn)
     return constraint_space.BlockFragmentationType() == kFragmentColumn;
   // TODO(mstensho): The innermost fragmentation type doesn't tell us everything
@@ -269,6 +271,20 @@
   if (parent_space.IsInsideBalancedColumns())
     builder->SetIsInsideBalancedColumns();
 
+  // We lack the required machinery to resume layout inside out-of-flow
+  // positioned elements during regular layout. OOFs are handled by regular
+  // layout during the initial column balacning pass, while it's handled
+  // specially during actual layout - at the outermost fragmentation context in
+  // NGOutOfFlowLayoutPart (so this is only an issue when calculating the
+  // initial column block-size). So just disallow breaks (we only need to worry
+  // about forced breaks, as soft breaks are impossible in the initial column
+  // balancing pass). This might result in over-stretched columns in some
+  // strange cases, but probably something we can live with.
+  if ((parent_space.IsInitialColumnBalancingPass() &&
+       child.IsOutOfFlowPositioned()) ||
+      parent_space.ShouldIgnoreForcedBreaks())
+    builder->SetShouldIgnoreForcedBreaks();
+
   if (parent_space.IsInColumnBfc() && !is_new_fc)
     builder->SetIsInColumnBfc();
   builder->SetMinBreakAppeal(parent_space.MinBreakAppeal());
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
index 6c908638b..872fe9a2 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
@@ -286,7 +286,8 @@
   // scrollbars should be hidden if overflow=hidden.
   return StyleRef().OverflowX() == EOverflow::kHidden ||
          StyleRef().OverflowX() == EOverflow::kAuto ||
-         StyleRef().OverflowX() == EOverflow::kScroll || IsDocumentElement();
+         StyleRef().OverflowX() == EOverflow::kScroll ||
+         StyleRef().OverflowX() == EOverflow::kClip || IsDocumentElement();
 }
 
 void LayoutSVGRoot::RecalcVisualOverflow() {
diff --git a/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc b/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
index a3fc1ca2..c201db3 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_layout_support.cc
@@ -239,6 +239,7 @@
 
 bool SVGLayoutSupport::IsOverflowHidden(const ComputedStyle& style) {
   return style.OverflowX() == EOverflow::kHidden ||
+         style.OverflowX() == EOverflow::kClip ||
          style.OverflowX() == EOverflow::kScroll;
 }
 
diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h
index e6a869c4..547ebe57 100644
--- a/third_party/blink/renderer/core/page/chrome_client.h
+++ b/third_party/blink/renderer/core/page/chrome_client.h
@@ -40,6 +40,7 @@
 #include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h"
+#include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/html/forms/external_date_time_chooser.h"
 #include "third_party/blink/renderer/core/html/forms/popup_menu.h"
@@ -256,6 +257,18 @@
       CompositorElementId scrollable_area_element_id,
       WebInputEvent::Type injected_type) {}
 
+  // Finishes a ScrollIntoView for a focused editable element by performing a
+  // view-level reveal. That is, when an embedder requests to reveal a focused
+  // editable, the editable is first ScrollIntoView'ed in the layout tree to
+  // ensure it's visible in the outermost document but stops short of scrolling
+  // the outermost frame. This method will then perform a platform-specific
+  // reveal of the editable, e.g. by animating a scroll and zoom in to a
+  // legible scale. This should only be called in a WebView where the main
+  // frame is local and outermost.
+  virtual void FinishScrollFocusedEditableIntoView(
+      const gfx::RectF& caret_rect_in_root_frame,
+      mojom::blink::ScrollIntoViewParamsPtr params) {}
+
   // Set the browser's behavior when overscroll happens, e.g. whether to glow
   // or navigate. This may only be called for the main frame, and takes it as
   // reference to make it clear that callers may only call this while a local
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index dd2f4da5..8d9c6f4c 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -331,6 +331,16 @@
       device, delta, granularity, scrollable_area_element_id, injected_type);
 }
 
+void ChromeClientImpl::FinishScrollFocusedEditableIntoView(
+    const gfx::RectF& caret_rect_in_root_frame,
+    mojom::blink::ScrollIntoViewParamsPtr params) {
+  DCHECK(web_view_);
+  DCHECK(web_view_->MainFrameImpl());
+  DCHECK(!web_view_->IsFencedFrameRoot());
+  web_view_->FinishScrollFocusedEditableIntoView(caret_rect_in_root_frame,
+                                                 std::move(params));
+}
+
 void ChromeClientImpl::SetOverscrollBehavior(
     LocalFrame& main_frame,
     const cc::OverscrollBehavior& overscroll_behavior) {
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h
index d7d03c9e..6796e96 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.h
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.h
@@ -110,6 +110,9 @@
                                 ui::ScrollGranularity granularity,
                                 CompositorElementId scrollable_area_element_id,
                                 WebInputEvent::Type injected_type) override;
+  void FinishScrollFocusedEditableIntoView(
+      const gfx::RectF& caret_rect_in_root_frame,
+      mojom::blink::ScrollIntoViewParamsPtr params) override;
   bool ShouldReportDetailedMessageForSourceAndSeverity(
       LocalFrame&,
       mojom::blink::ConsoleMessageLevel log_level,
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_into_view_test.cc b/third_party/blink/renderer/core/page/scrolling/scroll_into_view_test.cc
index 16d6d391..b1c158ad 100644
--- a/third_party/blink/renderer/core/page/scrolling/scroll_into_view_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scroll_into_view_test.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/public/mojom/frame/find_in_page.mojom-blink.h"
 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
 #include "third_party/blink/public/web/web_script_source.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_focus_options.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_scroll_into_view_options.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_scroll_to_options.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_union_boolean_scrollintoviewoptions.h"
@@ -548,9 +549,11 @@
   ASSERT_EQ(Window().scrollY(), content->OffsetTop());
 }
 
-// This test ensures the stop-at-layout viewport option works correctly when a
-// non-default root scroller is set as the layout viewport.
-TEST_F(ScrollIntoViewTest, StopAtLayoutViewportOption) {
+// This test ensures the for_focused_editable option works correctly to
+// prevent scrolling a non-default root scroller from the page revealing
+// ScrollIntoView (the layout viewport scroll will be animated, potentially
+// with zoom, from WebViewImpl::FinishScrollFocusedEditableIntoView.
+TEST_F(ScrollIntoViewTest, StopAtLayoutViewportForFocusedEditable) {
   ScopedImplicitRootScrollerForTest implicit_root_scroller(true);
 
   v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
@@ -585,7 +588,7 @@
     </style>
     <div id='root'>
       <div id='inner'>
-        <div id='target'></div>
+        <input id='target'>
       <div>
     </div>
   )HTML");
@@ -603,15 +606,30 @@
     ASSERT_EQ(root, rs_controller.GlobalRootScroller());
   }
 
+  Element* editable = GetDocument().getElementById("target");
+
+  // Ensure the input is focused, as it normally would be when ScrollIntoView
+  // is invoked with this param.
+  {
+    FocusOptions* focus_options = FocusOptions::Create();
+    focus_options->setPreventScroll(true);
+    editable->Focus(focus_options);
+  }
+
   // Use ScrollRectToVisible on the #target element, specifying
-  // stop_at_main_frame_layout_viewport.
-  LayoutObject* target =
-      GetDocument().getElementById("target")->GetLayoutObject();
+  // for_focused_editable.
+  LayoutObject* target = editable->GetLayoutObject();
   auto params = ScrollAlignment::CreateScrollIntoViewParams(
       ScrollAlignment::LeftAlways(), ScrollAlignment::TopAlways(),
       mojom::blink::ScrollType::kProgrammatic, false,
       mojom::blink::ScrollBehavior::kInstant);
-  params->stop_at_main_frame_layout_viewport = true;
+
+  params->for_focused_editable = mojom::blink::FocusedEditableParams::New();
+  params->for_focused_editable->relative_location = gfx::Vector2dF();
+  params->for_focused_editable->size =
+      gfx::SizeF(target->AbsoluteBoundingBoxRect().size());
+  params->for_focused_editable->can_zoom = false;
+
   target->ScrollRectToVisible(PhysicalRect(target->AbsoluteBoundingBoxRect()),
                               std::move(params));
 
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
index 1da582c0..d7fdc45 100644
--- a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
+++ b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
@@ -18,6 +18,7 @@
 #include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
+#include "third_party/blink/renderer/core/frame/visual_viewport.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/core/html/html_element.h"
 #include "third_party/blink/renderer/core/html/html_iframe_element.h"
@@ -1757,6 +1758,116 @@
   EXPECT_FALSE(Compositor().LayerTreeHost()->CommitRequested());
 }
 
+TEST_P(CompositingSimTest, ImplSideScaleSkipsCommit) {
+  InitializeWithHTML(R"HTML(
+    <div>Empty Page</div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  ASSERT_FALSE(Compositor().LayerTreeHost()->CommitRequested());
+  ASSERT_EQ(1.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  // Simulate a page scale delta (i.e. user pinch-zoomed) on the compositor.
+  cc::CompositorCommitData commit_data;
+  commit_data.page_scale_delta = 2.f;
+
+  {
+    auto sync = Compositor().LayerTreeHost()->SimulateSyncingDeltasForTesting();
+    Compositor().LayerTreeHost()->ApplyCompositorChanges(&commit_data);
+  }
+
+  // The transform tree's page scale factor isn't computed until we perform a
+  // lifecycle update.
+  ASSERT_EQ(1.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  // Update just the blink lifecycle because a full frame would clear the bit
+  // for whether a commit was requested.
+  UpdateAllLifecyclePhases();
+
+  EXPECT_EQ(2.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  // A main frame is needed to call UpdateLayers which updates property trees,
+  // re-calculating cached to/from-screen transforms.
+  EXPECT_TRUE(Compositor().LayerTreeHost()->RequestedMainFramePending());
+
+  // A full commit is not needed.
+  EXPECT_FALSE(Compositor().LayerTreeHost()->CommitRequested());
+}
+
+// Ensure that updates to page scale coming from the main thread update the
+// page scale factor on the transform tree.
+TEST_P(CompositingSimTest, MainThreadScaleUpdatesTransformTree) {
+  InitializeWithHTML(R"HTML(
+    <div>Empty Page</div>
+  )HTML");
+  Compositor().BeginFrame();
+
+  ASSERT_EQ(1.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  VisualViewport& viewport = WebView().GetPage()->GetVisualViewport();
+
+  // This test checks that the transform tree's page scale factor is correctly
+  // updated when scale is set with an existing property tree.
+  ASSERT_TRUE(viewport.GetPageScaleNode());
+  viewport.SetScale(2.f);
+
+  // The scale factor on the layer tree should be updated immediately.
+  ASSERT_EQ(2.f, Compositor().LayerTreeHost()->page_scale_factor());
+
+  // The transform tree's page scale factor isn't computed until we perform a
+  // lifecycle update.
+  ASSERT_EQ(1.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  Compositor().BeginFrame();
+
+  EXPECT_EQ(2.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  // Ensure the transform node is also correctly updated.
+  const cc::TransformNode* scale_node =
+      GetPropertyTrees()->transform_tree().FindNodeFromElementId(
+          viewport.GetPageScaleNode()->GetCompositorElementId());
+  ASSERT_TRUE(scale_node);
+  EXPECT_TRUE(scale_node->local.IsScale2d());
+  EXPECT_EQ(gfx::Vector2dF(2, 2), scale_node->local.To2dScale());
+}
+
+// Similar to above but ensure the transform tree is correctly setup when scale
+// already exists when building the tree.
+TEST_P(CompositingSimTest, BuildTreeSetsScaleOnTransformTree) {
+  SimRequest main_resource("https://origin-a.com/a.html", "text/html");
+  LoadURL("https://origin-a.com/a.html");
+  main_resource.Complete(R"HTML(
+      <!DOCTYPE html>
+      <div>Empty Page</div>
+  )HTML");
+
+  VisualViewport& viewport = WebView().GetPage()->GetVisualViewport();
+
+  // This test checks that the transform tree's page scale factor is correctly
+  // set when scale is set before property trees have been built.
+  ASSERT_FALSE(viewport.GetPageScaleNode());
+  viewport.SetScale(2.f);
+
+  // The scale factor on the layer tree should be updated immediately.
+  ASSERT_EQ(2.f, Compositor().LayerTreeHost()->page_scale_factor());
+
+  // The transform tree's page scale factor isn't computed until we perform a
+  // lifecycle update.
+  ASSERT_EQ(1.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  Compositor().BeginFrame();
+
+  EXPECT_EQ(2.f, GetPropertyTrees()->transform_tree().page_scale_factor());
+
+  // Ensure the transform node is also correctly updated.
+  const cc::TransformNode* scale_node =
+      GetPropertyTrees()->transform_tree().FindNodeFromElementId(
+          viewport.GetPageScaleNode()->GetCompositorElementId());
+  ASSERT_TRUE(scale_node);
+  EXPECT_TRUE(scale_node->local.IsScale2d());
+  EXPECT_EQ(gfx::Vector2dF(2, 2), scale_node->local.To2dScale());
+}
+
 TEST_P(CompositingSimTest, FrameAttribution) {
   InitializeWithHTML(R"HTML(
     <div id='child' style='will-change: transform;'>test</div>
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index af19571..79135ed 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1195,6 +1195,7 @@
       if (const auto* layout_box = GetLayoutBox())
         fragment.physical_fragment = layout_box->GetPhysicalFragment(0);
     }
+    fragment.fragment_idx = 0;
   }
 
   ClipRectsContext clip_rects_context(this, fragment.fragment_data,
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 828ff64..c7c03585 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -754,10 +754,6 @@
     return false;
   if (direct_compositing_reasons & CompositingReasonsForTransformProperty())
     return true;
-  // TODO(pdr): Check for the presence of a transform instead of the value.
-  // Checking for an identity matrix will cause the property tree structure
-  // to change during animations if the animation passes through the
-  // identity matrix.
   return !object.LocalToSVGParentTransform().IsIdentity();
 }
 
@@ -822,8 +818,8 @@
 
       // TODO(pdr): There is additional logic in
       // FragmentPaintPropertyTreeBuilder::UpdateTransform that likely needs to
-      // be included here, such as setting animation_is_axis_aligned, which may
-      // be the only important difference remaining.
+      // be included here, such as setting animation_is_axis_aligned and setting
+      // additional compositing reasons (kAdditionalCompositingTrigger).
       state.direct_compositing_reasons =
           direct_compositing_reasons & CompositingReasonsForTransformProperty();
       state.flags.flattens_inherited_transform =
@@ -864,7 +860,7 @@
 
   if (properties_->Transform()) {
     context_.current.transform = properties_->Transform();
-    context_.should_flatten_inherited_transform = false;
+    context_.should_flatten_inherited_transform = true;
     context_.rendering_context_id = 0;
   }
 }
@@ -1981,9 +1977,7 @@
 
   if (properties_->ReplacedContentTransform()) {
     context_.current.transform = properties_->ReplacedContentTransform();
-    // TODO(pdr): SVG does not support 3D transforms so this should be
-    // should_flatten_inherited_transform = true.
-    context_.should_flatten_inherited_transform = false;
+    context_.should_flatten_inherited_transform = true;
     context_.rendering_context_id = 0;
   }
 
diff --git a/third_party/blink/renderer/core/scroll/build.gni b/third_party/blink/renderer/core/scroll/build.gni
index 0ec9419..90f0de85 100644
--- a/third_party/blink/renderer/core/scroll/build.gni
+++ b/third_party/blink/renderer/core/scroll/build.gni
@@ -17,6 +17,8 @@
   "scroll_animator_compositor_coordinator.h",
   "scroll_customization.cc",
   "scroll_customization.h",
+  "scroll_into_view_util.cc",
+  "scroll_into_view_util.h",
   "scroll_state_data.h",
   "scroll_types.h",
   "scrollable_area.cc",
diff --git a/third_party/blink/renderer/core/scroll/scroll_alignment.cc b/third_party/blink/renderer/core/scroll/scroll_alignment.cc
index 25ca6f8..04082a6 100644
--- a/third_party/blink/renderer/core/scroll/scroll_alignment.cc
+++ b/third_party/blink/renderer/core/scroll/scroll_alignment.cc
@@ -257,7 +257,6 @@
     bool make_visible_in_visual_viewport,
     mojom::blink::ScrollBehavior scroll_behavior,
     bool is_for_scroll_sequence,
-    bool zoom_into_rect,
     bool cross_origin_boundaries) {
   auto params = mojom::blink::ScrollIntoViewParams::New();
   params->align_x = mojom::blink::ScrollAlignment::New(align_x);
@@ -266,7 +265,6 @@
   params->make_visible_in_visual_viewport = make_visible_in_visual_viewport;
   params->behavior = scroll_behavior;
   params->is_for_scroll_sequence = is_for_scroll_sequence;
-  params->zoom_into_rect = zoom_into_rect;
   params->cross_origin_boundaries = cross_origin_boundaries;
   return params;
 }
diff --git a/third_party/blink/renderer/core/scroll/scroll_alignment.h b/third_party/blink/renderer/core/scroll/scroll_alignment.h
index 692f1ec..3f57775 100644
--- a/third_party/blink/renderer/core/scroll/scroll_alignment.h
+++ b/third_party/blink/renderer/core/scroll/scroll_alignment.h
@@ -90,7 +90,6 @@
       mojom::blink::ScrollBehavior scroll_behavior =
           mojom::blink::ScrollBehavior::kAuto,
       bool is_for_scroll_sequence = false,
-      bool zoom_into_rect = false,
       bool cross_origin_boundaries = true);
 
   static mojom::blink::ScrollIntoViewParamsPtr CreateScrollIntoViewParams(
diff --git a/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc b/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc
new file mode 100644
index 0000000..ada3443
--- /dev/null
+++ b/third_party/blink/renderer/core/scroll/scroll_into_view_util.cc
@@ -0,0 +1,52 @@
+// Copyright 2022 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 "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
+
+#include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
+#include "third_party/blink/renderer/core/layout/layout_object.h"
+#include "third_party/blink/renderer/core/layout/layout_view.h"
+#include "ui/gfx/geometry/rect_f.h"
+
+namespace blink::scroll_into_view_util {
+
+gfx::RectF FocusedEditableBoundsFromParams(
+    const gfx::RectF& caret_rect,
+    const mojom::blink::ScrollIntoViewParamsPtr& params) {
+  DCHECK(params->for_focused_editable);
+  DCHECK(!params->for_focused_editable->size.IsEmpty());
+
+  gfx::PointF editable_location =
+      caret_rect.origin() + params->for_focused_editable->relative_location;
+  return gfx::RectF(editable_location, params->for_focused_editable->size);
+}
+
+void ConvertParamsToParentFrame(mojom::blink::ScrollIntoViewParamsPtr& params,
+                                const gfx::RectF& caret_rect_in_src,
+                                LayoutObject& src_frame,
+                                LayoutView& dest_frame) {
+  if (!params->for_focused_editable)
+    return;
+
+  // The source frame will be a LayoutView if the conversion is local or a
+  // LayoutEmbeddedContent if we're crossing a remote boundary.
+  DCHECK(src_frame.IsLayoutView() || src_frame.IsLayoutEmbeddedContent());
+
+  gfx::RectF editable_bounds_in_src =
+      FocusedEditableBoundsFromParams(caret_rect_in_src, params);
+
+  PhysicalRect editable_bounds_in_dest = src_frame.LocalToAncestorRect(
+      PhysicalRect::EnclosingRect(editable_bounds_in_src), &dest_frame,
+      kTraverseDocumentBoundaries);
+
+  PhysicalRect caret_rect_in_dest = src_frame.LocalToAncestorRect(
+      PhysicalRect::EnclosingRect(caret_rect_in_src), &dest_frame,
+      kTraverseDocumentBoundaries);
+
+  params->for_focused_editable->relative_location = gfx::Vector2dF(
+      editable_bounds_in_dest.offset - caret_rect_in_dest.offset);
+  params->for_focused_editable->size = gfx::SizeF(editable_bounds_in_dest.size);
+}
+
+}  // namespace blink::scroll_into_view_util
diff --git a/third_party/blink/renderer/core/scroll/scroll_into_view_util.h b/third_party/blink/renderer/core/scroll/scroll_into_view_util.h
new file mode 100644
index 0000000..2535132
--- /dev/null
+++ b/third_party/blink/renderer/core/scroll/scroll_into_view_util.h
@@ -0,0 +1,41 @@
+// Copyright 2022 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 THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLL_INTO_VIEW_UTIL_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLL_INTO_VIEW_UTIL_H_
+
+#include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink-forward.h"
+
+namespace gfx {
+class RectF;
+}
+
+namespace blink {
+
+class LayoutObject;
+class LayoutView;
+
+namespace scroll_into_view_util {
+
+// ScrollFocusedEditableIntoView uses the caret rect for ScrollIntoView but
+// stores enough information in `params` so that the editable element's bounds
+// can be reconstructed. Given `caret_rect`, this will return the editable
+// element's rect (in whatever coordinate space `caret_rect` is in).
+gfx::RectF FocusedEditableBoundsFromParams(
+    const gfx::RectF& caret_rect,
+    const mojom::blink::ScrollIntoViewParamsPtr& params);
+
+// Whenever ScrollIntoView bubbles up across a frame boundary, the origin for
+// the absolute coordinate space changes. This function will convert any
+// parameters in `params` into the updated coordinate space.
+void ConvertParamsToParentFrame(mojom::blink::ScrollIntoViewParamsPtr& params,
+                                const gfx::RectF& caret_rect_in_src,
+                                LayoutObject& src_frame,
+                                LayoutView& dest_frame);
+
+}  // namespace scroll_into_view_util
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_SCROLL_SCROLL_INTO_VIEW_UTIL_H_
diff --git a/third_party/blink/renderer/core/timing/performance_event_timing.cc b/third_party/blink/renderer/core/timing/performance_event_timing.cc
index f69ba44..502ede3f 100644
--- a/third_party/blink/renderer/core/timing/performance_event_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_event_timing.cc
@@ -6,6 +6,8 @@
 
 #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
 #include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
+#include "third_party/blink/renderer/core/frame/frame.h"
 #include "third_party/blink/renderer/core/performance_entry_names.h"
 #include "third_party/blink/renderer/core/timing/performance.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
@@ -101,7 +103,8 @@
   visitor->Trace(target_);
 }
 
-std::unique_ptr<TracedValue> PerformanceEventTiming::ToTracedValue() const {
+std::unique_ptr<TracedValue> PerformanceEventTiming::ToTracedValue(
+    Frame* frame) const {
   auto traced_value = std::make_unique<TracedValue>();
   traced_value->SetString("type", name());
   traced_value->SetInteger("timeStamp", startTime());
@@ -111,6 +114,8 @@
   traced_value->SetBoolean("cancelable", cancelable());
   // If int overflows occurs, the static_cast may not work correctly.
   traced_value->SetInteger("interactionId", static_cast<int>(interactionId()));
+  traced_value->SetInteger("nodeId", DOMNodeIds::IdForNode(target_));
+  traced_value->SetString("frame", String::FromUTF8(ToTraceValue(frame)));
   return traced_value;
 }
 
diff --git a/third_party/blink/renderer/core/timing/performance_event_timing.h b/third_party/blink/renderer/core/timing/performance_event_timing.h
index 9d99887..4aac5b65f 100644
--- a/third_party/blink/renderer/core/timing/performance_event_timing.h
+++ b/third_party/blink/renderer/core/timing/performance_event_timing.h
@@ -12,6 +12,8 @@
 
 namespace blink {
 
+class Frame;
+
 class CORE_EXPORT PerformanceEventTiming final : public PerformanceEntry {
   DEFINE_WRAPPERTYPEINFO();
 
@@ -55,7 +57,7 @@
 
   void Trace(Visitor*) const override;
 
-  std::unique_ptr<TracedValue> ToTracedValue() const;
+  std::unique_ptr<TracedValue> ToTracedValue(Frame* frame) const;
 
  private:
   AtomicString entry_type_;
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 3d9b6a1..b3b3795 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -545,9 +545,26 @@
       !IsEventTimingBufferFull()) {
     AddEventTimingBuffer(*entry);
   }
-  TRACE_EVENT2("devtools.timeline", "EventTiming", "data",
-               entry->ToTracedValue(), "frame",
-               ToTraceValue(DomWindow()->GetFrame()));
+  bool tracing_enabled;
+  TRACE_EVENT_CATEGORY_GROUP_ENABLED("devtools.timeline", &tracing_enabled);
+  if (tracing_enabled) {
+    base::TimeTicks unsafe_start_time =
+        GetTimeOriginInternal() + base::Milliseconds(entry->startTime());
+    // At this point in the code, the duration has been rounded. Estimate the
+    // end time as the maximum of the processing end + 4ms or the render time.
+    base::TimeTicks unsafe_end_time = std::max(
+        unsafe_start_time + base::Milliseconds(entry->duration()),
+        GetTimeOriginInternal() + base::Milliseconds(entry->processingEnd()) +
+            base::Milliseconds(4));
+    unsigned hash = WTF::StringHash::GetHash(entry->name());
+    WTF::AddFloatToHash(hash, entry->startTime());
+    TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1(
+        "devtools.timeline", "EventTiming", hash, unsafe_start_time, "data",
+        entry->ToTracedValue(DomWindow()->GetFrame()));
+
+    TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
+        "devtools.timeline", "EventTiming", hash, unsafe_end_time);
+  }
 }
 
 void WindowPerformance::MaybeNotifyInteractionAndAddEventTimingBuffer(
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc
index 76f0ef13..5a49a4b 100644
--- a/third_party/blink/renderer/core/timing/window_performance_test.cc
+++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_keyboard_event_init.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_pointer_event_init.h"
 #include "third_party/blink/renderer/core/dom/document_init.h"
+#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
 #include "third_party/blink/renderer/core/events/input_event.h"
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/core/events/pointer_event.h"
@@ -116,10 +117,14 @@
                             base::TimeTicks start_time,
                             base::TimeTicks processing_start,
                             base::TimeTicks processing_end,
-                            PointerId pointer_id) {
+                            PointerId pointer_id,
+                            EventTarget* target = nullptr) {
     PointerEventInit* init = PointerEventInit::Create();
     init->setPointerId(pointer_id);
     PointerEvent* pointer_event = PointerEvent::Create(type, init);
+    if (target) {
+      pointer_event->SetTarget(target);
+    }
     performance_->RegisterEventTiming(*pointer_event, start_time,
                                       processing_start, processing_end);
   }
@@ -935,24 +940,24 @@
   EXPECT_EQ(*url, "url");
 }
 
-TEST_F(WindowPerformanceTest, InteractionIdInTrace) {
+TEST_F(WindowPerformanceTest, EventTimingTraceEvents) {
   using trace_analyzer::Query;
   trace_analyzer::Start("*");
   base::TimeTicks start_time = GetTimeOrigin() + base::Seconds(1);
   base::TimeTicks processing_start = start_time + base::Milliseconds(10);
   base::TimeTicks processing_end = processing_start + base::Milliseconds(10);
   RegisterPointerEvent("pointerdown", start_time, processing_start,
-                       processing_end, 4);
+                       processing_end, 4, GetWindow()->document());
 
   base::TimeTicks start_time2 = start_time + base::Microseconds(200);
   RegisterPointerEvent("pointerup", start_time2, processing_start,
-                       processing_end, 4);
+                       processing_end, 4, GetWindow()->document());
   base::TimeTicks swap_time = start_time + base::Microseconds(100);
   SimulateSwapPromise(swap_time);
 
   base::TimeTicks start_time3 = start_time2 + base::Microseconds(2000);
   RegisterPointerEvent("click", start_time3, processing_start, processing_end,
-                       4);
+                       4, GetWindow()->document());
 
   base::TimeTicks swap_time2 = start_time + base::Microseconds(4000);
   SimulateSwapPromise(swap_time2);
@@ -962,7 +967,7 @@
   trace_analyzer::TraceEventVector events;
   Query q = Query::EventNameIs("EventTiming");
   analyzer->FindEvents(q, &events);
-  EXPECT_EQ(3u, events.size());
+  EXPECT_EQ(6u, events.size());
   EXPECT_EQ("devtools.timeline", events[0]->category);
   EXPECT_EQ("devtools.timeline", events[1]->category);
 
@@ -972,6 +977,13 @@
   std::string* event_name = arg_dict.FindString("type");
   ASSERT_TRUE(event_name);
   EXPECT_EQ(*event_name, "pointerdown");
+  std::string* frame_trace_value = arg_dict.FindString("frame");
+  EXPECT_EQ(*frame_trace_value, ToTraceValue(GetFrame()));
+  EXPECT_EQ(arg_dict.FindInt("nodeId"),
+            DOMNodeIds::IdForNode(GetWindow()->document()));
+  EXPECT_EQ(events[0]->id, events[3]->id);
+  EXPECT_LT(events[0]->timestamp, events[3]->timestamp);
+  ASSERT_FALSE(events[3]->HasDictArg("data"));
 
   ASSERT_TRUE(events[1]->HasDictArg("data"));
   arg_dict = events[1]->GetKnownArgAsDict("data");
@@ -979,6 +991,13 @@
   event_name = arg_dict.FindString("type");
   ASSERT_TRUE(event_name);
   EXPECT_EQ(*event_name, "pointerup");
+  frame_trace_value = arg_dict.FindString("frame");
+  EXPECT_EQ(*frame_trace_value, ToTraceValue(GetFrame()));
+  EXPECT_EQ(arg_dict.FindInt("nodeId"),
+            DOMNodeIds::IdForNode(GetWindow()->document()));
+  EXPECT_EQ(events[1]->id, events[4]->id);
+  EXPECT_LT(events[1]->timestamp, events[4]->timestamp);
+  ASSERT_FALSE(events[4]->HasDictArg("data"));
 
   ASSERT_TRUE(events[2]->HasDictArg("data"));
   arg_dict = events[2]->GetKnownArgAsDict("data");
@@ -986,6 +1005,13 @@
   event_name = arg_dict.FindString("type");
   ASSERT_TRUE(event_name);
   EXPECT_EQ(*event_name, "click");
+  frame_trace_value = arg_dict.FindString("frame");
+  EXPECT_EQ(*frame_trace_value, ToTraceValue(GetFrame()));
+  EXPECT_EQ(arg_dict.FindInt("nodeId"),
+            DOMNodeIds::IdForNode(GetWindow()->document()));
+  EXPECT_EQ(events[2]->id, events[5]->id);
+  EXPECT_LT(events[2]->timestamp, events[5]->timestamp);
+  ASSERT_FALSE(events[5]->HasDictArg("data"));
 }
 
 TEST_F(WindowPerformanceTest, InteractionID) {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index a62d90b..229b610 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -66,6 +66,7 @@
 #include "third_party/blink/renderer/core/html/canvas/image_data.h"
 #include "third_party/blink/renderer/core/html/custom/element_internals.h"
 #include "third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h"
+#include "third_party/blink/renderer/core/html/forms/html_button_element.h"
 #include "third_party/blink/renderer/core/html/forms/html_field_set_element.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
 #include "third_party/blink/renderer/core/html/forms/html_label_element.h"
@@ -1835,6 +1836,18 @@
                : kExpandedCollapsed;
   }
 
+  // For buttons that contain the |togglepopup|, |showpopup|, or |hidepopup|
+  // popup triggering attributes, and the pointed-to element is a valid popup
+  // with type kPopup, then set aria-expanded=false when the popup is hidden,
+  // and aria-expanded=true when it is showing.
+  if (auto* button = DynamicTo<HTMLButtonElement>(element)) {
+    if (auto* popup = button->togglePopupElement()) {
+      if (popup->PopupType() == PopupValueType::kPopup) {
+        return popup->popupOpen() ? kExpandedExpanded : kExpandedCollapsed;
+      }
+    }
+  }
+
   if (IsA<HTMLSummaryElement>(*element)) {
     if (element->parentNode() &&
         IsA<HTMLDetailsElement>(element->parentNode())) {
diff --git a/third_party/blink/renderer/platform/exported/web_url_response.cc b/third_party/blink/renderer/platform/exported/web_url_response.cc
index 5552363..03ddc69 100644
--- a/third_party/blink/renderer/platform/exported/web_url_response.cc
+++ b/third_party/blink/renderer/platform/exported/web_url_response.cc
@@ -265,6 +265,10 @@
   resource_response_->SetWasFetchedViaServiceWorker(value);
 }
 
+void WebURLResponse::SetArrivalTimeAtRenderer(base::TimeTicks value) {
+  resource_response_->SetArrivalTimeAtRenderer(value);
+}
+
 network::mojom::FetchResponseSource
 WebURLResponse::GetServiceWorkerResponseSource() const {
   return resource_response_->GetServiceWorkerResponseSource();
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
index fa12e18..9926830 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -197,7 +197,6 @@
                                   cc_transform);
   cc_transform->transform_changed = true;
   property_trees->transform_tree_mutable().set_needs_update(true);
-  host.SetNeedsCommit();
   return true;
 }
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index dc7dea6..f4af76f 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -357,6 +357,7 @@
   ProcessCodeCacheResponse(response_time, std::move(data), resource_loader);
   // Reset the deferred value to its original state.
   DCHECK(resource_loader);
+  resource_loader->code_cache_arrival_time_ = base::TimeTicks::Now();
   resource_loader->SetDefersLoading(freeze_mode_);
 }
 
@@ -660,6 +661,7 @@
         fetcher_->GetProperties().FreezeMode());
   }
 
+  request_start_time_ = base::TimeTicks::Now();
   if (is_cache_aware_loading_activated_) {
     // Override cache policy for cache-aware loading. If this request fails, a
     // reload with original request will be triggered in DidFail().
@@ -979,6 +981,18 @@
     const ResourceResponse& response) {
   const ResourceRequestHead& request = resource_->GetResourceRequest();
 
+  const auto response_arrival = response.ArrivalTimeAtRenderer();
+  const auto code_cache_arrival = code_cache_arrival_time_;
+  const auto request_start = request_start_time_;
+  if (response.WasCached() && !code_cache_arrival.is_null() &&
+      !response_arrival.is_null()) {
+    DCHECK(!request_start_time_.is_null());
+    base::UmaHistogramTimes("Blink.Loading.CodeCacheArrivalAtRenderer",
+                            code_cache_arrival - request_start);
+    base::UmaHistogramTimes("Blink.Loading.CachedResponseArrivalAtRenderer",
+                            response_arrival - request_start);
+  }
+
   if (response.HasAuthorizationCoveredByWildcardOnPreflight()) {
     fetcher_->GetUseCounter().CountDeprecation(
         mojom::WebFeature::kAuthorizationCoveredByWildcard);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
index 6540b77..aa4f85e 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
@@ -282,6 +282,9 @@
       feature_handle_for_scheduler_;
 
   base::TimeTicks response_end_time_for_error_cases_;
+
+  base::TimeTicks request_start_time_;
+  base::TimeTicks code_cache_arrival_time_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_response.h b/third_party/blink/renderer/platform/loader/fetch/resource_response.h
index 8ceefd1..ceccaa9ac 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_response.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_response.h
@@ -226,6 +226,13 @@
     was_fetched_via_service_worker_ = value;
   }
 
+  base::TimeTicks ArrivalTimeAtRenderer() const {
+    return arrival_time_at_renderer_;
+  }
+  void SetArrivalTimeAtRenderer(base::TimeTicks value) {
+    arrival_time_at_renderer_ = value;
+  }
+
   network::mojom::FetchResponseSource GetServiceWorkerResponseSource() const {
     return service_worker_response_source_;
   }
@@ -598,6 +605,9 @@
   // removed.
   int64_t decoded_body_length_ = 0;
 
+  // Represents when the response arrives at the renderer.
+  base::TimeTicks arrival_time_at_renderer_;
+
   // This is propagated from the browser process's PrefetchURLLoader on
   // cross-origin prefetch responses. It is used to pass the token along to
   // preload header requests from these responses.
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc
index 432d4cb..823adb1 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client.cc
@@ -53,17 +53,21 @@
     : public DeferredMessage {
  public:
   explicit DeferredOnReceiveResponse(
-      network::mojom::URLResponseHeadPtr response_head)
-      : response_head_(std::move(response_head)) {}
+      network::mojom::URLResponseHeadPtr response_head,
+      base::TimeTicks response_arrival)
+      : response_head_(std::move(response_head)),
+        response_arrival_(response_arrival) {}
 
   void HandleMessage(
       WebResourceRequestSender* resource_request_sender) override {
-    resource_request_sender->OnReceivedResponse(std::move(response_head_));
+    resource_request_sender->OnReceivedResponse(std::move(response_head_),
+                                                response_arrival_);
   }
   bool IsCompletionMessage() const override { return false; }
 
  private:
   network::mojom::URLResponseHeadPtr response_head_;
+  const base::TimeTicks response_arrival_;
 };
 
 class MojoURLLoaderClient::DeferredOnReceiveRedirect final
@@ -326,13 +330,15 @@
                last_loaded_url_.GetString().Utf8());
 
   has_received_response_head_ = true;
+  base::TimeTicks response_arrival_timing = base::TimeTicks::Now();
 
   base::WeakPtr<MojoURLLoaderClient> weak_this = weak_factory_.GetWeakPtr();
   if (NeedsStoringMessage()) {
-    StoreAndDispatch(
-        std::make_unique<DeferredOnReceiveResponse>(std::move(response_head)));
+    StoreAndDispatch(std::make_unique<DeferredOnReceiveResponse>(
+        std::move(response_head), response_arrival_timing));
   } else {
-    resource_request_sender_->OnReceivedResponse(std::move(response_head));
+    resource_request_sender_->OnReceivedResponse(std::move(response_head),
+                                                 response_arrival_timing);
   }
 
   if (!weak_this)
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc
index 821ed2e..ba981646 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/mojo_url_loader_client_unittest.cc
@@ -57,7 +57,8 @@
     }
   }
 
-  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) override {
+  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head,
+                          base::TimeTicks response_arrival_time) override {
     EXPECT_FALSE(context_->cancelled);
     EXPECT_FALSE(context_->received_response);
     EXPECT_FALSE(context_->complete);
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc
index 4d43533..5e6de69d 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.cc
@@ -199,7 +199,8 @@
 }
 
 void SyncLoadContext::OnReceivedResponse(
-    network::mojom::URLResponseHeadPtr head) {
+    network::mojom::URLResponseHeadPtr head,
+    base::TimeTicks response_arrival_at_renderer) {
   DCHECK(!Completed());
   response_->head = std::move(head);
 }
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.h b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.h
index 183527b..07c3fd0 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.h
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context.h
@@ -99,7 +99,9 @@
   bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
                           network::mojom::URLResponseHeadPtr head,
                           std::vector<std::string>*) override;
-  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) override;
+  void OnReceivedResponse(
+      network::mojom::URLResponseHeadPtr head,
+      base::TimeTicks response_arrival_at_renderer) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context_unittest.cc
index fc830824..29516e7 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/sync_load_context_unittest.cc
@@ -141,7 +141,8 @@
     context->resource_request_sender_ = std::move(mock_resource_request_sender);
 
     // Simulate the response.
-    context->OnReceivedResponse(network::mojom::URLResponseHead::New());
+    context->OnReceivedResponse(network::mojom::URLResponseHead::New(),
+                                base::TimeTicks());
     mojo::ScopedDataPipeProducerHandle producer_handle;
     mojo::ScopedDataPipeConsumerHandle consumer_handle;
     EXPECT_EQ(MOJO_RESULT_OK,
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
index adf5be9..c47a8ace 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender.cc
@@ -413,7 +413,8 @@
 }
 
 void WebResourceRequestSender::OnReceivedResponse(
-    network::mojom::URLResponseHeadPtr response_head) {
+    network::mojom::URLResponseHeadPtr response_head,
+    base::TimeTicks response_arrival) {
   TRACE_EVENT0("loading", "WebResourceRequestSender::OnReceivedResponse");
   if (!request_info_)
     return;
@@ -439,7 +440,8 @@
     request_info_->peer = std::move(new_peer);
   }
 
-  request_info_->peer->OnReceivedResponse(response_head.Clone());
+  request_info_->peer->OnReceivedResponse(response_head.Clone(),
+                                          response_arrival);
   if (!request_info_)
     return;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc
index 0951f91..5d6ea12 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_resource_request_sender_unittest.cc
@@ -105,7 +105,8 @@
                             std::vector<std::string>*) override {
       return false;
     }
-    void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) override {
+    void OnReceivedResponse(network::mojom::URLResponseHeadPtr head,
+                            base::TimeTicks response_arrival) override {
       response_head_ = std::move(head);
     }
     void OnStartLoadingResponseBody(
@@ -141,7 +142,8 @@
     last_load_timing_ = head->load_timing;
     return true;
   }
-  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) override {
+  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head,
+                          base::TimeTicks response_arrival) override {
     last_load_timing_ = head->load_timing;
     received_response_ = true;
     if (cancel_on_receive_response_) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_url_loader.cc b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_url_loader.cc
index 9a276813..37a2cc68 100644
--- a/third_party/blink/renderer/platform/loader/fetch/url_loader/web_url_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/url_loader/web_url_loader.cc
@@ -261,7 +261,9 @@
   bool OnReceivedRedirect(const net::RedirectInfo& redirect_info,
                           network::mojom::URLResponseHeadPtr head,
                           std::vector<std::string>* removed_headers) override;
-  void OnReceivedResponse(network::mojom::URLResponseHeadPtr head) override;
+  void OnReceivedResponse(
+      network::mojom::URLResponseHeadPtr head,
+      base::TimeTicks response_arrival_at_renderer) override;
   void OnStartLoadingResponseBody(
       mojo::ScopedDataPipeConsumerHandle body) override;
   void OnTransferSizeUpdated(int transfer_size_diff) override;
@@ -547,7 +549,8 @@
 }
 
 void WebURLLoader::Context::OnReceivedResponse(
-    network::mojom::URLResponseHeadPtr head) {
+    network::mojom::URLResponseHeadPtr head,
+    base::TimeTicks response_arrival_at_renderer) {
   if (!client_)
     return;
 
@@ -564,6 +567,7 @@
   WebURLResponse response;
   PopulateURLResponse(url_, *head, &response, has_devtools_request_id_,
                       request_id_);
+  response.SetArrivalTimeAtRenderer(response_arrival_at_renderer);
 
   client_->DidReceiveResponse(response);
 
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc b/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
index 0fba237..e3e211b 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats.cc
@@ -13,6 +13,7 @@
 #include "base/strings/string_piece.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/platform/peerconnection/rtc_scoped_refptr_cross_thread_copier.h"
 #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
@@ -78,6 +79,10 @@
 std::vector<const webrtc::RTCStatsMemberInterface*> FilterMembers(
     std::vector<const webrtc::RTCStatsMemberInterface*> stats_members,
     const Vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
+  if (base::FeatureList::IsEnabled(
+          blink::features::kWebRtcExposeNonStandardStats)) {
+    return stats_members;
+  }
   // Note that using "is_standarized" avoids having to maintain an allowlist of
   // every single standardized member, as we do at the "stats object" level
   // with "RTCStatsAllowlist".
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc
index e19d0aaf..de35b63 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_stats_test.cc
@@ -6,7 +6,9 @@
 
 #include "third_party/blink/renderer/platform/peerconnection/rtc_stats.h"
 
+#include "base/test/scoped_feature_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/renderer/platform/peerconnection/rtc_stats.h"
 #include "third_party/webrtc/api/stats/rtc_stats_report.h"
 #include "third_party/webrtc/api/stats/rtcstats_objects.h"
@@ -112,6 +114,27 @@
   EXPECT_EQ("non_standardized", stats->GetMember(1)->GetName());
 }
 
+TEST(RTCStatsTest, IncludeAllMembersFeatureFlag) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(
+      blink::features::kWebRtcExposeNonStandardStats);
+
+  rtc::scoped_refptr<webrtc::RTCStatsReport> webrtc_report =
+      webrtc::RTCStatsReport::Create(7);
+  AllowStatsForTesting(TestStats::kType);
+  webrtc_report->AddStats(std::make_unique<TestStats>("id", 0));
+
+  // Include both standard and non-standard member.
+  RTCStatsReportPlatform report(
+      webrtc_report.get(), Vector<webrtc::NonStandardGroupId>{
+                               webrtc::NonStandardGroupId::kGroupIdForTesting});
+  std::unique_ptr<RTCStats> stats = report.GetStats("id");
+  ASSERT_NE(nullptr, stats);
+  ASSERT_EQ(2u, stats->MembersCount());
+  EXPECT_EQ("standardized", stats->GetMember(0)->GetName());
+  EXPECT_EQ("non_standardized", stats->GetMember(1)->GetName());
+}
+
 TEST(RTCStatsTest, CopyHandle) {
   rtc::scoped_refptr<webrtc::RTCStatsReport> webrtc_report =
       webrtc::RTCStatsReport::Create(17);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 322f2f2..bffd17b8 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -821,7 +821,8 @@
       // crbug.com/1259085
       name: "DeferredShaping",
       depends_on: ["LayoutNG"],
-      // The status is managed by the corresponding base::Feature.
+      status: "test",
+      // The status is also managed by the corresponding base::Feature.
     },
     {
       name: "DeflateRawCompressionFormat",
diff --git a/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.cc b/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.cc
index 750baf2b..22653eec 100644
--- a/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.cc
+++ b/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.cc
@@ -359,6 +359,31 @@
       main_thread_frame_widget_input_handler_, rect));
 }
 
+void FrameWidgetInputHandlerImpl::WaitForPageScaleAnimationForTesting(
+    WaitForPageScaleAnimationForTestingCallback callback) {
+  // Ensure the Mojo callback is invoked from the thread on which the message
+  // was received.
+  if (ThreadedCompositingEnabled()) {
+    callback = base::BindOnce(
+        [](scoped_refptr<base::SingleThreadTaskRunner> callback_task_runner,
+           WaitForPageScaleAnimationForTestingCallback callback) {
+          callback_task_runner->PostTask(FROM_HERE,
+                                         base::BindOnce(std::move(callback)));
+        },
+        base::ThreadTaskRunnerHandle::Get(), std::move(callback));
+  }
+
+  RunOnMainThread(base::BindOnce(
+      [](base::WeakPtr<mojom::blink::FrameWidgetInputHandler> handler,
+         WaitForPageScaleAnimationForTestingCallback callback) {
+        if (handler)
+          handler->WaitForPageScaleAnimationForTesting(std::move(callback));
+        else
+          std::move(callback).Run();
+      },
+      main_thread_frame_widget_input_handler_, std::move(callback)));
+}
+
 void FrameWidgetInputHandlerImpl::MoveCaret(const gfx::Point& point) {
   RunOnMainThread(base::BindOnce(
       [](base::WeakPtr<mojom::blink::FrameWidgetInputHandler> handler,
diff --git a/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.h b/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.h
index d83df28..9392c3a 100644
--- a/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.h
+++ b/third_party/blink/renderer/platform/widget/input/frame_widget_input_handler_impl.h
@@ -94,6 +94,8 @@
       blink::mojom::SelectionMenuBehavior selection_menu_behavior) override;
   void MoveRangeSelectionExtent(const gfx::Point& extent) override;
   void ScrollFocusedEditableNodeIntoRect(const gfx::Rect& rect) override;
+  void WaitForPageScaleAnimationForTesting(
+      WaitForPageScaleAnimationForTestingCallback callback) override;
   void MoveCaret(const gfx::Point& point) override;
 
  private:
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 32f756a..71a22ca 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -527,6 +527,7 @@
             'root_scroller_util::.+',
             'scheduler::.+',
             'scroll_customization::.+',
+            'scroll_into_view_util::.+',
             'scroll_timeline_util::.+',
             'style_change_extra_data::.+',
             'style_change_reason::.+',
diff --git a/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py b/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py
index 86aa9e6..2d7cd6f 100644
--- a/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py
+++ b/third_party/blink/tools/blinkpy/web_tests/controllers/single_test_runner.py
@@ -623,7 +623,7 @@
             use_luci = not gold_properties.local_pixel_tests
             img_path = self._filesystem.join(
                 str(self._port.skia_gold_temp_dir()),
-                '%s.png' % self._test_name.replace(self._filesystem.sep, '_'))
+                '%s.png' % self._test_name.replace('/', '_'))
             self._filesystem.write_binary_file(img_path, driver_output.image)
             status, error = gold_session.RunComparison(name=self._test_name,
                                                        png_file=img_path,
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 91b9d21..ffe9139 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -13,6 +13,9 @@
 # Tests that fail in legacy but pass in NG
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001.html [ Failure ]
+crbug.com/626703 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001a.tentative.html [ Failure ]
+crbug.com/626703 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002.tentative.html [ Failure ]
 crbug.com/626703 external/wpt/fetch/metadata/generated/css-images.https.sub.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/fetch/metadata/generated/css-images.sub.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/fetch/metadata/generated/element-link-icon.https.sub.html [ Timeout ]
@@ -1276,6 +1279,9 @@
 ### Tests that pass in ng and fail in Legacy
 
 # external/wpt/css/CSS2/normal-flow/
+crbug.com/716930 external/wpt/css/CSS2/normal-flow/block-in-inline-float-in-layer-001.html [ Failure ]
+crbug.com/711807 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001f.xht [ Failure ]
+crbug.com/711807 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Failure ]
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/max-width-applies-to-013.xht [ Failure ]
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/max-width-applies-to-014.xht [ Failure ]
 crbug.com/626703 external/wpt/css/CSS2/normal-flow/min-height-applies-to-014.xht [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 0886060..4374f19 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -900,6 +900,7 @@
 crbug.com/711704 external/wpt/css/CSS2/floats/floats-rule7-outside-left-001.xht [ Failure ]
 crbug.com/711704 external/wpt/css/CSS2/floats/floats-rule7-outside-right-001.xht [ Failure ]
 crbug.com/711704 external/wpt/css/CSS2/floats/floats-wrap-bfc-006.xht [ Failure ]
+crbug.com/1322774 external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html [ Failure ]
 
 crbug.com/711709 external/wpt/css/CSS2/floats-clear/floating-replaced-height-008.xht [ Skip ]
 crbug.com/711709 external/wpt/css/CSS2/floats-clear/floats-108.xht [ Skip ]
@@ -932,8 +933,6 @@
 crbug.com/711805 external/wpt/css/CSS2/positioning/position-relative-035.xht [ Skip ]
 crbug.com/711805 external/wpt/css/CSS2/positioning/position-relative-036.xht [ Skip ]
 
-crbug.com/711807 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-001f.xht [ Failure ]
-crbug.com/711807 external/wpt/css/CSS2/normal-flow/block-in-inline-insert-002f.xht [ Failure ]
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/inline-block-002.xht [ Skip ]
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/inline-block-003.xht [ Skip ]
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/inline-block-004.xht [ Skip ]
@@ -947,8 +946,6 @@
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/replaced-intrinsic-001.xht [ Failure ]
 crbug.com/711807 external/wpt/css/CSS2/normal-flow/replaced-intrinsic-002.xht [ Failure ]
 
-crbug.com/716930 external/wpt/css/CSS2/normal-flow/block-in-inline-float-in-layer-001.html [ Failure ]
-
 #### external/wpt/css/css-sizing
 crbug.com/1261306 external/wpt/css/css-sizing/aspect-ratio/flex-aspect-ratio-004.html [ Failure ]
 crbug.com/970201 external/wpt/css/css-sizing/slice-intrinsic-size.html [ Failure ]
@@ -6877,6 +6874,8 @@
 # Temp disable MST transfer tests until Browser feature can be enabled in tests
 crbug.com/1288839 external/wpt/mediacapture-streams/MediaStreamTrack-iframe-transfer.https.html [ Skip ]
 crbug.com/1288839 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-iframe-transfer.https.html [ Skip ]
+crbug.com/1288839 external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html [ Skip ]
+crbug.com/1288839 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html [ Skip ]
 
 # Sheriff 2022-04-22
 crbug.com/1318695 http/tests/devtools/elements/highlight/highlight-multiple-css-grid.js [ Failure Pass ]
@@ -6892,9 +6891,6 @@
 # Sheriff 2022-04-25
 crbug.com/1319320 rootscroller/root-scroller-apply-filter-to-parent.html [ Failure Pass ]
 
-# Temporarily allow pass or failure while new WebRTC stats are added and rolled into Chromium.
-crbug.com/webrtc/13984 external/wpt/webrtc-stats/supported-stats.html [ Failure Pass ]
-
 # Sheriff 2022-04-25
 crbug.com/1319808 virtual/wbn-from-network/external/wpt/web-bundle/subresource-loading/script-reuse-web-bundle-resource.https.tentative.html [ Skip ]
 
@@ -6930,3 +6926,8 @@
 # Sheriff 2022-05-06
 crbug.com/1322072 external/wpt/fetch/content-type/script.window.html [ Failure Pass ]
 crbug.com/1286883 [ Mac ] fast/canvas/OffscreenCanvas-Bitmaprenderer-toBlob.html [ Failure Pass ]
+
+# Sheriff 2022-05-09
+crbug.com/1323626 [ Mac11-arm64 ] compositing/lots-of-img-layers.html [ Failure Pass ]
+crbug.com/1323626 [ Mac11-arm64 ] compositing/lots-of-img-layers-with-opacity.html [ Failure Pass ]
+crbug.com/1323627 [ Mac11-arm64 ] virtual/gpu-rasterization/images/color-profile-svg-foreign-object.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index 16b82e9..be4f8b0 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: 41096e0790d6427a354f1b447b36eb1f45128d69
+Version: c680b63714bb17748a049c9bcb37878b41ffc9ff
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 91eb9f8..f66ed08b 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -1794,6 +1794,13 @@
         {}
        ]
       ],
+      "nested-multicol-fieldset-tall-trailing-padding.html": [
+       "b155a4d7f42283c18e6ea113dc2000393752c72a",
+       [
+        null,
+        {}
+       ]
+      ],
       "nested-multicol-with-float-between.html": [
        "3a583ed0dafa947165f514d00c1dc3e327876632",
        [
@@ -38451,6 +38458,58 @@
         {}
        ]
       ],
+      "floats-wrap-bfc-with-margin-001.html": [
+       "cc344f0fd580191af444b9d9ef2b469abd1a8fda",
+       [
+        null,
+        [
+         [
+          "/css/CSS2/floats/floats-wrap-bfc-with-margin-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "floats-wrap-bfc-with-margin-001a.tentative.html": [
+       "9aa6b69ab7545a3a172d3d19d2ac4d6f0e52737b",
+       [
+        null,
+        [
+         [
+          "/css/CSS2/floats/floats-wrap-bfc-with-margin-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "floats-wrap-bfc-with-margin-002.tentative.html": [
+       "9c10f2cccf6a97d652d8b2db89a77cd5a9db3bb6",
+       [
+        null,
+        [
+         [
+          "/css/CSS2/floats/floats-wrap-bfc-with-margin-002-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "floats-wrap-bfc-with-margin-003.tentative.html": [
+       "f69a11002dd957cc03295844b7f7ae5f4e7263af",
+       [
+        null,
+        [
+         [
+          "/css/CSS2/floats/floats-wrap-bfc-with-margin-003-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "floats-wrap-top-below-bfc-001l.xht": [
        "17bec33eb143ce14f13c439e83f433c3fef74fdd",
        [
@@ -148174,7 +148233,7 @@
       ]
      ],
      "backdrop-animate-002.html": [
-      "4d897a0637b3b38bc3679792c81fbde492ca8ece",
+      "1facc170fccf1a200b0c0c30ba6491cd4c411a93",
       [
        null,
        [
@@ -253102,6 +253161,18 @@
        "20ae62757d41bc51c29192e8be71ad7be0fc5b78",
        []
       ],
+      "floats-wrap-bfc-with-margin-001-ref.html": [
+       "8e079b1f178400224da985693b403f67f25c455d",
+       []
+      ],
+      "floats-wrap-bfc-with-margin-002-ref.html": [
+       "03b7d86acbc2df227dab3c65bf6dd674ab62d6f0",
+       []
+      ],
+      "floats-wrap-bfc-with-margin-003-ref.html": [
+       "ac45eb30bf43748284a1c7a19061f8df56fa5dca",
+       []
+      ],
       "floats-wrap-top-below-001l-notref.xht": [
        "0953df73d203c1bb3e8d1dba0a3b7a2cde465e18",
        []
@@ -278008,7 +278079,7 @@
       []
      ],
      "backdrop-animate-002-ref.html": [
-      "b4f0ebd4b8072368a336942fe9cf24c6d56c6c4a",
+      "b020f0d17af22ac579c46e5360adc2ac80995dd3",
       []
      ],
      "before-after-dynamic-custom-property-001-ref.html": [
@@ -324643,7 +324714,7 @@
        []
       ],
       "partitioned-service-worker-nested-iframe-child.html": [
-       "0362b584cc7bdb5008c1025acfc9b51a8ab277f0",
+       "d05fef48bf0e56d9ecb96339818a348bfe497e3e",
        []
       ],
       "partitioned-service-worker-nested-iframe-parent.html": [
@@ -330736,7 +330807,7 @@
       []
      ],
      "usb-helpers.js": [
-      "8b8365093cd073d95e51a365e3a1552d592f1726",
+      "1197c43e44e6727b9f3c8fe709bc0fc7c6dd6b6f",
       []
      ]
     },
@@ -336989,7 +337060,7 @@
      ]
     ],
     "idbfactory-open-opaque-origin.html": [
-     "f69c47d31ad0baf1e91cdb40ab59a330a71a889f",
+     "2c2889fbf7d11515afe088f59db878478b24bb66",
      [
       null,
       {}
@@ -365492,6 +365563,20 @@
         {}
        ]
       ],
+      "block-in-inline-hittest-margin.html": [
+       "053630706a109aaca8821a2a04509e51c5842898",
+       [
+        null,
+        {}
+       ]
+      ],
+      "block-in-inline-hittest-relpos-zindex.html": [
+       "221b70d44b30ebe0bb32d0949706f5b06afaa633",
+       [
+        null,
+        {}
+       ]
+      ],
       "block-in-inline-insert-018.html": [
        "39118d610b79a0b479a6da1becb5295e01dc9911",
        [
@@ -395878,6 +395963,13 @@
        {}
       ]
      ],
+     "only-child.html": [
+      "590c07ba2b519ee61127be68774de94f6d39031c",
+      [
+       null,
+       {}
+      ]
+     ],
      "parsing": {
       "parse-attribute.html": [
        "a8fcfb24f5a9b1350adda6e59af814f1111325c1",
@@ -465116,6 +465208,13 @@
          {}
         ]
        ],
+       "scrolling-below-viewport-image-lazy-loading-in-iframe.html": [
+        "3c26323426391a60cfe9dd0feee2bab496ce69e3",
+        [
+         null,
+         {}
+        ]
+       ],
        "sizes": {
         "implicit-sizes-ignores-width.html": [
          "db61db351eacb5f38ce6767a55a61e588f5580e5",
@@ -465942,7 +466041,7 @@
         ]
        ],
        "selection-not-application-textarea.html": [
-        "e8e82791880e163f513cf64d5df3049e6c7c3b15",
+        "48c6313f3241ff7f7afd2e188e90257860a2f355",
         [
          null,
          {}
@@ -515888,7 +515987,7 @@
       ]
      ],
      "partitioned.tentative.https.html": [
-      "4004aed06dbc5081942ccdffa68a45693066fe99",
+      "17a375f9c7320291e64178695cfce8c21fae1773",
       [
        null,
        {}
@@ -559150,7 +559249,7 @@
      ]
     ],
     "protected-interface-classes.https.any.js": [
-     "cfc6f6925667aaa53870734ca72ab25f6a0cc599",
+     "027c2c418c81a5e8a301217fd0c88b3d605821c3",
      [
       "webusb/protected-interface-classes.https.any.html",
       {
@@ -559503,7 +559602,7 @@
      ]
     ],
     "usbDevice.https.any.js": [
-     "527d238d69b703b1fcf5d8a001d02e9f87b5689a",
+     "b1b0c133ce160a314ea392514ac5b38e4cac136d",
      [
       "webusb/usbDevice.https.any.html",
       {
diff --git a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-opaque-origin.html b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-opaque-origin.html
index f69c47d..2c2889fb 100644
--- a/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-opaque-origin.html
+++ b/third_party/blink/web_tests/external/wpt/IndexedDB/idbfactory-open-opaque-origin.html
@@ -33,6 +33,8 @@
   '  window.onmessage = () => {' +
   '    try {' +
   '      indexedDB.deleteDatabase("opaque-origin-test");' +
+  '    } catch {}' +
+  '    try {' +
   '      const r = indexedDB.open("opaque-origin-test");' +
   '      r.onupgradeneeded = () => { r.transaction.abort(); };' +
   '      window.parent.postMessage({result: "no exception"}, "*");' +
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001-ref.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001-ref.html
new file mode 100644
index 0000000..8e079b1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001-ref.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Reference Case</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<script>
+  const MARGIN_VALS = [-30, -20, -17,
+                       // Values -16 through -1 are non-interoperable and are
+                       // split off to a separate test.
+                       0, 5, 10, 14
+                       // Values over 15 are non-interoperable and are
+                       // split off to a separate test.
+                      ];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      // In this test, the negative values are specifically the ones that
+      // are expected to cause wrapping.
+      const isExpectingToWrap = (v < 0);
+      let container = newDivWithClassAndParent("container", group);
+      if (isExpectingToWrap) {
+        container.style.flexWrap = "wrap";
+      }
+      if ((floatVal == "right") != (directionVal == "rtl")) {
+        // In the corresponding piece of the testcase, the float is floated to
+        // the inline-end side (for the given writing-mode). We use a
+        // "row-reverse" flex container as our mockup for that here.
+        container.style.flexDirection = "row-reverse";
+      }
+
+      let float = newDivWithClassAndParent("float", container);
+      float.style.cssFloat = floatVal;
+
+      let bfc = newDivWithClassAndParent("bfc", container);
+      if (isExpectingToWrap) {
+        // If we wrap, then we expect the testcase to resolve the BFC's
+        // content-box width to be: 30px (container's available space)
+        // minus 2px (for bfc's border), plus the absolute value of whatever
+        // (negative) margin value we're testing here.
+        bfc.style.width = (30 - 2 - v)  + "px";
+      }
+
+      // Set the actual margin value that we're testing here, EXCEPT if we're
+      // not-expecting-to-wrap and the bfc's margin is going to "overlap" the
+      // float in the testcase.  (In this latter case, the margin doesn't
+      // impact the testcase's rendering, so we take care not to set it here.)
+      if (isExpectingToWrap || marginPropSuffix != floatVal) {
+        bfc.style[marginPropName] = v + "px";
+      }
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 500px;
+  border: 1px solid black;
+}
+.container {
+  display: inline-flex;
+  align-content: start;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+  /* We use "flex: 1" (on a flex item) to mock up the fill-available-space
+   * block-layout behavior in the testcase. */
+  flex: 1 auto;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001.html
new file mode 100644
index 0000000..cc344f0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Test: If a BFC's inline-axis margin is sufficiently negative such
+  that it inflates its border-box to be too large to fit alongside a float,
+  then it should be pushed below the float</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visuren.html#floats">
+<meta name="assert" content="The border box of ... an element in the normal flow that establishes a new block formatting context ... must not overlap the margin box of any floats in the same block formatting context as the element itself. If necessary, implementations should clear the said element by placing it below any preceding floats">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visudet.html#blockwidth">
+<!-- For a BFC with 'width:auto', negative total inline-axis margins will
+     effectively set a lower-bound for the used border-box width, to satisfy
+     the equation in CSS2.1 10.3.3. This test exercises scenarios where this
+     mechanism "props up" the BFC's border-box enough to make its border-box
+     collide width the float's margin-box, resulting in it needing to be moved
+     down below the float. -->
+<link rel="match" href="floats-wrap-bfc-with-margin-001-ref.html">
+<script>
+  const MARGIN_VALS = [-30, -20, -17,
+                       // Values -16 through -1 are non-interoperable and are
+                       // split off to a separate test.
+                       0, 5, 10, 14
+                       // Values over 15 are non-interoperable and are
+                       // split off to a separate test.
+                      ];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      let container = newDivWithClassAndParent("container", group);
+      let float = newDivWithClassAndParent("float", container);
+      float.style.cssFloat = floatVal;
+
+      let bfc = newDivWithClassAndParent("bfc", container);
+      bfc.style[marginPropName] = v + "px";
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 500px;
+  border: 1px solid black;
+}
+.container {
+  /* This is the container that holds our float+bfc.  We make it an
+     inline-block so that we can test a bunch of these in a row.  */
+  display: inline-block;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  /* We'll set the float property elsewhere (to 'right' or 'left'). */
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  /* Each .float's margin-box (which the corresponding .bfc's border-box cannot
+   * overlap) is 14px wide:
+   *   7px content + 2px horizontal border + 5px horizontal margin
+   * Note that we're intentionally using a nonzero 'margin' here, to be sure
+   * the UA is using the float's margin-box (and not one of its other
+   * boxes) for this non-overlapping calculation. */
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  /* Each .bfc's border-box width is 2px (from the border) plus whatever we
+   * resolve 'width:auto' to, which is influenced by the particular choice of
+   * 'margin' values (and the available space). */
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001a.tentative.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001a.tentative.html
new file mode 100644
index 0000000..9aa6b69
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-001a.tentative.html
@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Test: If a BFC's inline-axis margin is sufficiently negative such
+  that it inflates its border-box to be too large to fit alongside a float,
+  then it should be pushed below the float</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visuren.html#floats">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#stretch-fit-sizing">
+<meta name="assert" content="The border box of ... an element in the normal flow that establishes a new block formatting context ... must not overlap the margin box of any floats in the same block formatting context as the element itself. If necessary, implementations should clear the said element by placing it below any preceding floats">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visudet.html#blockwidth">
+<!-- For a BFC with 'width:auto', negative total inline-axis margins will
+     effectively set a lower-bound for the used border-box width, to satisfy
+     the equation in CSS2.1 10.3.3. This test exercises scenarios where this
+     mechanism "props up" the BFC's border-box enough to make its border-box
+     collide width the float's margin-box, resulting in it needing to be moved
+     down below the float. -->
+<!-- NOTE: This testcase-variant actually has "width:stretch" (and
+     vendor-prefixed equivalents) rather than "auto", but I think the effect
+     should be the same, since the "stretch" and "auto" sizing keywords are
+     equivalent in most cases. (Though: in practice, WebKit and Gecko are both
+     more-eager-to-wrap here, with their vendor-prefixed "stretch" values, as
+     compared to with "auto"... I'm not sure whether or not there's a good
+     reason for that, so this test is named with ".tentative" for now.) -->
+<link rel="match" href="floats-wrap-bfc-with-margin-001-ref.html">
+<script>
+  const MARGIN_VALS = [-30, -20, -17,
+                       // Values -16 through -1 are non-interoperable and are
+                       // split off to a separate test.
+                       0, 5, 10, 14
+                       // Values over 15 are non-interoperable and are
+                       // split off to a separate test.
+                      ];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      let container = newDivWithClassAndParent("container", group);
+      let float = newDivWithClassAndParent("float", container);
+      float.style.cssFloat = floatVal;
+
+      let bfc = newDivWithClassAndParent("bfc", container);
+      bfc.style[marginPropName] = v + "px";
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 500px;
+  border: 1px solid black;
+}
+.container {
+  /* This is the container that holds our float+bfc.  We make it an
+     inline-block so that we can test a bunch of these in a row.  */
+  display: inline-block;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  /* We'll set the float property elsewhere (to 'right' or 'left'). */
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  /* Each .float's margin-box (which the corresponding .bfc's border-box cannot
+   * overlap) is 14px wide:
+   *   7px content + 2px horizontal border + 5px horizontal margin
+   * Note that we're intentionally using a nonzero 'margin' here, to be sure
+   * the UA is using the float's margin-box (and not one of its other
+   * boxes) for this non-overlapping calculation. */
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  /* Each .bfc's border-box width is 2px (from the border) plus whatever we
+   * resolve 'width:auto' to, which is influenced by the particular choice of
+   * 'margin' values (and the available space). */
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+
+  /* https://drafts.csswg.org/css-sizing-4/#stretch-fit-sizing */
+  width: -moz-available;
+  width: -webkit-fill-available;
+  width: stretch;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002-ref.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002-ref.html
new file mode 100644
index 0000000..03b7d86a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002-ref.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Reference Case</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<script>
+  const MARGIN_VALS = [-16, -15, -10, -1, 0];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      // In this test, none of the MARGIN_VALS are expected to
+      // make us wrap.
+      let container = newDivWithClassAndParent("container", group);
+      if ((floatVal == "right") != (directionVal == "rtl")) {
+        // In the corresponding piece of the testcase, the float is floated to
+        // the inline-end side (for the given writing-mode). We use a
+        // "row-reverse" flex container as our mockup for that here.
+        container.style.flexDirection = "row-reverse";
+      }
+
+      let float = newDivWithClassAndParent("float", container);
+      float.style.cssFloat = floatVal;
+
+      let bfc = newDivWithClassAndParent("bfc", container);
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 500px;
+  border: 1px solid black;
+}
+.container {
+  display: inline-flex;
+  align-content: start;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+  /* We use "flex: 1" (on a flex item) to mock up the fill-available-space
+   * block-layout behavior in the testcase. */
+  flex: 1 auto;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002.tentative.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002.tentative.html
new file mode 100644
index 0000000..9c10f2c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-002.tentative.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Test: If a BFC's inline-axis margin is sufficiently negative such
+  that it inflates its border-box to be too large to fit alongside a float,
+  then it should be pushed below the float</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visuren.html#floats">
+<meta name="assert" content="The border box of ... an element in the normal flow that establishes a new block formatting context ... must not overlap the margin box of any floats in the same block formatting context as the element itself. If necessary, implementations should clear the said element by placing it below any preceding floats">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visudet.html#blockwidth">
+<!-- For a BFC with 'width:auto', negative total inline-axis margins will
+     effectively set a lower-bound for the used border-box width, to satisfy
+     the equation in CSS2.1 10.3.3. This test exercises scenarios where this
+     mechanism "props up" the BFC's border-box, but not enough to make its
+     border-box collide width the float's margin-box; so it does not need to
+     be moved down below the float. -->
+<!-- NOTE: Eventually this test might want to merge with the -001 test.
+     The test logic should be exactly the same, except that here we're testing
+     some values (in MARGIN_VALS) that aren't currently interoperable, per
+     the WebKit bug at https://bugs.webkit.org/show_bug.cgi?id=239976 -->
+<link rel="match" href="floats-wrap-bfc-with-margin-002-ref.html">
+<script>
+  const MARGIN_VALS = [-16, -15, -10, -1, 0];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      let container = newDivWithClassAndParent("container", group);
+      let float = newDivWithClassAndParent("float", container);
+      float.style.cssFloat = floatVal;
+
+      let bfc = newDivWithClassAndParent("bfc", container);
+      bfc.style[marginPropName] = v + "px";
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 500px;
+  border: 1px solid black;
+}
+.container {
+  /* This is the container that holds our float+bfc.  We make it an
+     inline-block so that we can test a bunch of these in a row.  */
+  display: inline-block;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  /* We'll set the float property elsewhere (to 'right' or 'left'). */
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  /* Each .float's margin-box (which the corresponding .bfc's border-box cannot
+   * overlap) is 14px wide:
+   *   7px content + 2px horizontal border + 5px horizontal margin
+   * Note that we're intentionally using a nonzero 'margin' here, to be sure
+   * the UA is using the float's margin-box (and not one of its other
+   * boxes) for this non-overlapping calculation. */
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  /* Each .bfc's border-box width is 2px (from the border) plus whatever we
+   * resolve 'width:auto' to, which is influenced by the particular choice of
+   * 'margin' values (and the available space). */
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003-ref.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003-ref.html
new file mode 100644
index 0000000..ac45eb30
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003-ref.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Reference Case</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<script>
+  const MARGIN_VALS = [15, 22, 28];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+  // This comes from .float width + horizontal border and padding:
+  const FLOAT_MARGIN_BOX_WIDTH = 14;
+  // This comes from 30 (container) - 14 (float mbox width) - 2 (bfc border):
+  const AVAIL_WIDTH_NO_WRAPPING = 14;
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      const isMarginSideFloatSide = (marginPropSuffix == floatVal);
+      // initial-char comparison to match [l]eft/[l]tr and [r]ight/[r]tl:
+      const isMarginSideLineStartSide = (marginPropSuffix[0] == directionVal[0]);
+      const isFloatSideLineStartSide = (floatVal[0] == directionVal[0]);
+
+      let container = newDivWithClassAndParent("container", group);
+      if (!isFloatSideLineStartSide) {
+        // In the corresponding piece of the testcase, the float is floated to
+        // the inline-end side (for the given writing-mode). We use a
+        // "row-reverse" flex container as our mockup for that here.
+        container.style.flexDirection = "row-reverse";
+      }
+
+      let float = newDivWithClassAndParent("float", container);
+      let bfc = newDivWithClassAndParent("bfc", container);
+
+      // Set the actual margin value that we're testing here, based on which
+      // case this group is in. See comment in testcase for explanation of the
+      // three cases.
+      let marginValToUse;
+      if (isMarginSideFloatSide) {
+        // Case (A): in the testcase, the margin simply overlaps the float.
+        // In our mockup here, they don't actually overlap; so we subtract
+        // the portion that overlaps in the testcase, which is the float's
+        // margin-box width:
+        marginValToUse = v - FLOAT_MARGIN_BOX_WIDTH;
+      } else if (isMarginSideLineStartSide) {
+        // Case (B): we push the BFC down below the float (which we emulate
+        // here with a wrapped flexbox), and we use the full specified margin:
+        container.style.flexWrap = "wrap";
+        marginValToUse = v;
+      } else {
+        // Case (C): we let the BFC be smooshed against the float, and the
+        // margin effectively behaves as if it were clamped to the available
+        // space (so we just clamp it to that value here).
+        marginValToUse = AVAIL_WIDTH_NO_WRAPPING;
+      }
+      bfc.style[marginPropName] = marginValToUse + "px";
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 300px;
+  border: 1px solid black;
+}
+.container {
+  display: inline-flex;
+  align-content: start;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+  /* We use "flex: 1" (on a flex item) to mock up the fill-available-space
+   * block-layout behavior in the testcase. */
+  flex: 1 auto;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html
new file mode 100644
index 0000000..f69a110
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/floats-wrap-bfc-with-margin-003.tentative.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<meta charset="utf-8">
+<title>CSS Test: BFCs with large margin, placed next to a float</title>
+<link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visuren.html#floats">
+<link rel="help" href="https://www.w3.org/TR/CSS21/visudet.html#blockwidth">
+<link rel="match" href="floats-wrap-bfc-with-margin-003-ref.html">
+<!-- This test exercises the layout of an auto-width BFC with a large positive
+     margin on one side, positioned alongside a float. (Here, "large" = larger
+     than the space that's left when the float's width and the BFC's border
+     are subtracted away from the available space.)
+
+     The scenarios here break down into 3 cases, described below as A/B/C with
+     expected outcomes for each (with expectations based on the observed and
+     interoperably-implemented behavior of Gecko, WebKit, and Blink, aside
+     from some known bugs listed further down[1]):
+
+     (A) If the BFC's margin is on the same side as the float, then that margin
+     can simply overlap the float. In this case, nothing needs to overflow or
+     wrap, and there may even be some space remaining for the BFC's auto-width
+     content box (rendered as aqua).
+
+     (B) If the BFC's margin is on the "line-start" side and the float is on
+     the "line-end" side, then the BFC's margin pushes it into the float's
+     margin-box-area such that it impermissably "collides".  So, the BFC
+     instead gets moved down below the float to avoid this collision.  With
+     this moved-down placement, there may be space remaining for the BFC's
+     auto-width content-box -- precisely the same amount of space as in case A.
+
+     (C) If the BFC's margin is on the "line-end" side and the float is on the
+     "line-start" side, then the BFC is placed adjacent to the float, and its
+     large margin simply runs off the line-end edge of its containing
+     block. The BFC's content-box is 0 width (since there's no free space left
+     over).
+
+     Note: the expected-outcome in case B and C feels somewhat asymmetrical,
+     and in fact Gecko is the only engine that pushes the BFC down in case B.
+     But Blink/WebKit's alternative behavior for case B involves the BFC
+     overlapping the float, which clearly violates the spec, as discussed in
+     their bugs linked below. So I'm making the test expect Gecko's existing
+     and non-spec-violating behavior for case B, at this point. (I'm guessing
+     the asymmetry comes from how overflowing margins are handled at the
+     line-start vs. line-end edge, which makes some sense.)
+
+     Here's how this test's groups (black-bordered sections) map to these cases:
+     * This test's 1st, 4th, 5th, and 8th groups are "case A".
+     * This test's 3rd and 6th groups are in "case B".
+     * This test's 2nd and 7th groups are in "case C".
+
+     [1] Known bugs referenced above, which cause parts of this test to fail in
+     WebKit and Blink:
+     https://bugs.webkit.org/show_bug.cgi?id=240128
+     https://bugs.chromium.org/p/chromium/issues/detail?id=1322774
+     https://bugs.chromium.org/p/chromium/issues/detail?id=1323004
+-->
+<script>
+  const MARGIN_VALS = [15, 22, 28];
+  const HORIZ_SIDES = ["left", "right"]; // Used for 'float:*' and 'margin-*'.
+  const DIRECTION_VALS = ["ltr", "rtl"];
+
+  function newDivWithClassAndParent(className, parent) {
+    let elem = document.createElement("div");
+    if (className) {
+      elem.classList.add(className);
+    }
+    parent.appendChild(elem);
+    return elem;
+  }
+  function generateGroup(directionVal, floatVal, marginPropSuffix) {
+    let group = newDivWithClassAndParent("group", document.body);
+    group.style.direction = directionVal;
+    const marginPropName = "margin-" + marginPropSuffix;
+
+    for (let v of MARGIN_VALS) {
+      let container = newDivWithClassAndParent("container", group);
+      let float = newDivWithClassAndParent("float", container);
+      float.style.cssFloat = floatVal;
+
+      let bfc = newDivWithClassAndParent("bfc", container);
+      bfc.style[marginPropName] = v + "px";
+    }
+  }
+  function go() {
+    for (let directionVal of DIRECTION_VALS) {
+      for (let floatVal of HORIZ_SIDES) {
+        for (let marginPropSuffix of HORIZ_SIDES) {
+          generateGroup(directionVal, floatVal, marginPropSuffix);
+        }
+      }
+    }
+    // Note: the "reftest-wait" usage here isn't strictly necessary; it just
+    // helps ensure that we actually make it through all of the above JS and
+    // populate this document with the content that we want to render.
+    // (Specifically: if we e.g. throw a JS exception somewhere early in both
+    // the testcase and reference case, then the "reftest-wait" class will
+    // never be removed; and that will cause the test run to be classified
+    // as a failure, rather than a trivial "pass" with a visual comparison of
+    // two blank documents.)
+    document.documentElement.removeAttribute("class");
+  }
+</script>
+<style>
+.group {
+  width: 300px;
+  border: 1px solid black;
+}
+.container {
+  /* This is the container that holds our float+bfc.  We make it an
+     inline-block so that we can test a bunch of these in a row.  */
+  display: inline-block;
+  vertical-align: top;
+  width: 30px;
+  height: 40px;
+  /* This border and margin are just cosmetic, to avoid overlap between
+   * adjacent containers within a row. */
+  border: 1px solid gray;
+  margin-left: 30px;
+}
+
+.float {
+  /* We'll set the float property elsewhere (to 'right' or 'left'). */
+  width: 7px;
+  height: 8px;
+  background: fuchsia;
+  border: 1px solid purple;
+  /* Each .float's margin-box (which the corresponding .bfc's border-box cannot
+   * overlap) is 14px wide:
+   *   7px content + 2px horizontal border + 5px horizontal margin
+   * Note that we're intentionally using a nonzero 'margin' here, to be sure
+   * the UA is using the float's margin-box (and not one of its other
+   * boxes) for this non-overlapping calculation. */
+  margin: 1px 3px 1px 2px;
+}
+.bfc {
+  /* Each .bfc's border-box width is 2px (from the border) plus whatever we
+   * resolve 'width:auto' to, which is influenced by the particular choice of
+   * 'margin' values (and the available space). */
+  display: flow-root;
+  background: aqua;
+  height: 15px;
+  border: 1px solid blue;
+}
+</style>
+<body onload="go()">
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/block-in-inline-hittest-margin.html b/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/block-in-inline-hittest-margin.html
new file mode 100644
index 0000000..0536307
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/block-in-inline-hittest-margin.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<!DOCTYPE html>
+<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+.target {
+  background: blue;
+  width: 100px;
+  height: 100px;
+  margin: 100px;
+}
+</style>
+<body>
+  <a href="#">
+    <div class="target"></div>
+  </a>
+<script>
+const root = document.body;
+const target = root.querySelector('.target');
+const target_bounds = target.getBoundingClientRect();
+const x = target_bounds.x - 20;  // "-20" for the margin area.
+const y = target_bounds.y + target_bounds.height / 2;
+const result = document.elementFromPoint(x, y);
+const a = root.querySelector('a');
+test(() => {
+  assert_equals(result, a);
+}, target.style.cssText);
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html b/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html
new file mode 100644
index 0000000..221b70d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/CSS2/normal-flow/block-in-inline-hittest-relpos-zindex.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+section {
+  margin-bottom: 5px;
+}
+.target {
+  background: blue;
+  width: 100px;
+  height: 10px;
+}
+</style>
+<body>
+  <section>
+    <a href="#">
+      <div class="target"></div>
+    </a>
+  </section>
+  <section>
+    <a href="#">
+      <div class="target" style="z-index: 1"></div>
+    </a>
+  </section>
+  <section>
+    <a href="#">
+      <div class="target" style="z-index: -1"></div>
+    </a>
+  </section>
+  <section>
+    <a href="#">
+      <div class="target" style="position: relative"></div>
+    </a>
+  </section>
+  <section>
+    <a href="#">
+      <div class="target" style="position: relative; z-index: 1"></div>
+    </a>
+  </section>
+  <section>
+    <a href="#">
+      <div class="target" style="position: relative; z-index: -1"></div>
+    </a>
+  </section>
+<script>
+function isAncestorOf(target, ancestor) {
+  for (; target; target = target.parentElement) {
+    if (target === ancestor)
+      return true;
+  }
+  return false;
+}
+
+for (const root of document.getElementsByTagName('section')) {
+  const target = root.querySelector('.target');
+  const target_bounds = target.getBoundingClientRect();
+  const x = target_bounds.x + target_bounds.width / 2;
+  const y = target_bounds.y + target_bounds.height / 2;
+  const result = document.elementFromPoint(x, y);
+  const a = root.querySelector('a');
+  test(() => {
+    // For the `<a>` link to work, the `result` must be `a` or its descendant.
+    assert_true(isAncestorOf(result, a));
+  }, target.style.cssText);
+}
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/container-in-canvas-crash.html b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/container-in-canvas-crash.html
new file mode 100644
index 0000000..215c6a04
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/container-queries/crashtests/container-in-canvas-crash.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<title>Don't crash with a container query container inside canvas</title>
+<link rel="help" href="https://drafts.csswg.org/css-contain-3">
+<link rel="help" href="https://crbug.com/1321471">
+<canvas>
+  <div>
+    <div style="container-type: size">
+      <div>Test</div>
+    </div>
+  </div>
+</canvas>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/forced-break-in-oof-in-column-balancing-nested.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/forced-break-in-oof-in-column-balancing-nested.html
new file mode 100644
index 0000000..02b3295
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/forced-break-in-oof-in-column-balancing-nested.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1322319">
+<div style="columns:2;">
+  <div style="columns:2; position:relative; column-fill:auto; height:10px;">
+    <div style="position:absolute;">
+      <div></div>
+      <div style="break-before:column;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/forced-break-in-oof-in-column-balancing.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/forced-break-in-oof-in-column-balancing.html
new file mode 100644
index 0000000..31cafba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/forced-break-in-oof-in-column-balancing.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1322319">
+<div style="columns:2;">
+  <div style="position:relative; height:10px;">
+    <div style="position:absolute;">
+      <div style="height:1px;"></div>
+      <div style="break-before:column;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/nested-multicol-fieldset-tall-trailing-padding.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/nested-multicol-fieldset-tall-trailing-padding.html
new file mode 100644
index 0000000..b155a4d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/nested-multicol-fieldset-tall-trailing-padding.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1318137">
+<div style="columns:2; height:100px; column-fill:auto;">
+  <div style="height:10px;"></div>
+  <div style="columns:1; height:100px; column-fill:auto;">
+    <fieldset style="height:100px; border:none; padding:0; margin:0; padding-top:1px; padding-bottom:20px;">
+      <legend></legend>
+      x
+    </fieldset>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002-ref.html
index b4f0ebd..b020f0d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002-ref.html
@@ -5,6 +5,7 @@
 #target::backdrop {
   opacity: 0.1;
   background-color: green;
+  will-change: transform;
 }
 </style>
 <script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html
index 4d897a0..1facc17 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html
@@ -1,9 +1,15 @@
 <!DOCTYPE html>
+<html class="reftest-wait">
 <meta charset="utf-8">
 <title>CSS Test: A Web Animations on ::backdrop</title>
 <link rel="help" href="https://fullscreen.spec.whatwg.org/#::backdrop-pseudo-element">
 <link rel="match" href="backdrop-animate-002-ref.html">
 <dialog id="target">Dialog contents</dialog>
+<style>
+#target::backdrop {
+  will-change: transform;
+}
+</style>
 <script>
 const target = document.getElementById("target");
 target.showModal();
@@ -14,4 +20,9 @@
   pseudoElement: "::backdrop",
   duration: Infinity
 });
+requestAnimationFrame(() => {
+  requestAnimationFrame(() => {
+    document.documentElement.classList.remove("reftest-wait");
+  });
+});
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-transforms/inline-with-filter-and-hidden-backface.html b/third_party/blink/web_tests/external/wpt/css/css-transforms/inline-with-filter-and-hidden-backface.html
new file mode 100644
index 0000000..dda7885
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-transforms/inline-with-filter-and-hidden-backface.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1321302">
+<span id="elm" style="filter:blur(1px); backface-visibility:hidden;">x</span>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(()=> {
+    assert_equals(elm, document.elementFromPoint(10, 10));
+  }, "Hit test");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/only-child.html b/third_party/blink/web_tests/external/wpt/css/selectors/only-child.html
new file mode 100644
index 0000000..590c07b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/only-child.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Selectors :only-child</title>
+<link rel="help" href="https://drafts.csswg.org/selectors-4/#the-only-child-pseudo">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<!--
+  See also child-indexed-pseudo-class.html.
+-->
+<body>
+
+<div>
+  <div id="target1">Whitespace nodes should be ignored.</div>
+</div>
+
+<div>
+  <div id="target2">A comment node should be ignored.</div>
+  <!-- -->
+</div>
+
+<div>
+  <div id="target3">Non-whitespace text node should be ignored.</div>
+  .
+</div>
+
+<div>
+  <blockquote></blockquote>
+  <div id="target4" data-expected="false">There is another child element.</div>
+</div>
+
+<div>
+  <div id="target5"></div>
+</div>
+
+<script>
+for (let i = 1; i <= 4; ++i) {
+  let target = document.querySelector(`#target${i}`);
+  test(() => {
+    if (target.dataset.expected == 'false')
+      assert_false(target.matches(':only-child'));
+    else
+      assert_true(target.matches(':only-child'));
+  }, target.textContent);
+}
+
+test(() => {
+  const target = document.querySelector('#target5');
+  assert_true(target.matches(':only-child'));
+
+  const another = target.parentNode.appendChild(document.createElement('div'));
+  assert_false(target.matches(':only-child'));
+  assert_false(another.matches(':only-child'));
+
+  another.remove();
+  assert_true(target.matches(':only-child'));
+}, 'Dynamic addition and removal');
+
+</script>
+
diff --git a/third_party/blink/web_tests/external/wpt/fetch/content-type/script.window.js b/third_party/blink/web_tests/external/wpt/fetch/content-type/script.window.js
index 88584ce9..31598957 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/content-type/script.window.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/content-type/script.window.js
@@ -26,10 +26,10 @@
       script.onload = t.step_func_done(() => {
         assert_equals(self.stringFromExecutedScript, testData.encoding === "windows-1252" ? "€" : "€");
       });
-      script.onerror = t.unreached_func();
+      script.onerror = t.unreached_func("onerror");
     } else {
       script.onerror = t.step_func_done();
-      script.onload = t.unreached_func();
+      script.onload = t.unreached_func("onload");
     }
   }, (singleHeader ? "combined" : "separate") + " " + testData.contentType.join(" "));
 }
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/scrolling-below-viewport-image-lazy-loading-in-iframe.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/scrolling-below-viewport-image-lazy-loading-in-iframe.html
new file mode 100644
index 0000000..3c26323
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-img-element/scrolling-below-viewport-image-lazy-loading-in-iframe.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<title>Scrolling a lazy loaded image into view in an iframe</title>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<iframe onload="async_test(this.contentWindow.run)" srcdoc="
+<!DOCTYPE html>
+<script src='/resources/testharness.js'></script>
+<script src='/resources/testharnessreport.js'></script>
+<script src='../resources/common.js'></script>
+
+<h1>Scroll down...</h1>
+<p>Scroll down...</p>
+<p>Scroll down...</p>
+<img id='below_iframe_viewport_img' src='resources/image.png' loading='lazy'
+   onload='below_iframe_viewport_img.resolve();' onerror='below_iframe_viewport_img.reject();'>
+
+<script>
+  const scroll_trigger_img = new ElementLoadPromise('visible');
+  const below_iframe_viewport_img = new ElementLoadPromise('below_iframe_viewport_img');
+
+  function run(t) {
+    below_iframe_viewport_img.element().scrollIntoView();
+    below_iframe_viewport_img.promise
+      .then(t.step_func(() => {
+        assert_not_equals(below_iframe_viewport_img.element().width, 0, 'width should be greater than zero after scrolling');
+        assert_not_equals(below_iframe_viewport_img.element().height, 0, 'height should be greater than zero after scrolling');
+        t.done();
+    }))
+    .catch(t.unreached_func('The below_iframe_viewport image should load'));
+  };
+</script>
+"></iframe>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea.html
index e8e82791..48c6313 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea.html
@@ -31,6 +31,10 @@
     el.setSelectionRange(0, 1);
     assert_equals(el.selectionStart, 0, "final selectionStart");
     assert_equals(el.selectionEnd, 1, "final selectionEnd");
-    assert_equals(el.selectionDirection, "forward", "final selectionDirection");
+    assert_in_array(el.selectionDirection, ["none", "forward"]);
+
+    const finalDirection = el.selectionDirection;
+    el.finalDirection = "forward";
+    assert_equals(el.selectionDirection, finalDirection);
   }, "text field selection for the input textarea");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html
new file mode 100644
index 0000000..f38768a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/MediaStreamTrack-transfer-video.https.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<title>MediaStreamTrack transfer to iframe</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script>
+promise_test(async () => {
+  const iframe = document.createElement("iframe");
+  const stream = await navigator.mediaDevices.getUserMedia({video: true});
+  const track = stream.getVideoTracks()[0];
+  const result = new Promise((resolve, reject) => {
+    window.onmessage = (e) => {
+      if (e.data.result === 'Failure') {
+        reject('Failed: ' + e.data.error);
+      } else {
+        resolve();
+      }
+    };
+  });
+  iframe.addEventListener("load", () => {
+    iframe.contentWindow.postMessage(track);
+  });
+  iframe.src = "support/iframe-MediaStreamTrack-transfer-video.html";
+  document.body.appendChild(iframe);
+  return result;
+});
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-streams/support/iframe-MediaStreamTrack-transfer-video.html b/third_party/blink/web_tests/external/wpt/mediacapture-streams/support/iframe-MediaStreamTrack-transfer-video.html
new file mode 100644
index 0000000..9f37ba0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mediacapture-streams/support/iframe-MediaStreamTrack-transfer-video.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>iframe</title>
+    <script>
+      function onMsg(e) {
+          if(e.data instanceof MediaStreamTrack) {
+              const track = e.data;
+              video = document.getElementById("myvideo");
+              video.srcObject = new MediaStream ([track]);
+              video.play();
+
+              parent.postMessage({result: 'Success'});
+          } else {
+              parent.postMessage({
+                  result: 'Failure',
+                  error: `${e.data} is not a MediaStreamTrack`
+              });
+        }
+      }
+      window.addEventListener("message", onMsg);
+    </script>
+  </head>
+  <body>
+    <video id="myvideo"></video>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/svg/render/reftests/nested-svg-overflow-clip.html b/third_party/blink/web_tests/external/wpt/svg/render/reftests/nested-svg-overflow-clip.html
new file mode 100644
index 0000000..b6f7e6d5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/render/reftests/nested-svg-overflow-clip.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<link rel="match" href="rect-ref.html">
+<style>
+svg {
+  overflow: visible;
+}
+</style>
+<svg style="width: 100px; height: 100px">
+  <svg style="overflow: clip;">
+    <rect height="250" width="250" fill="green">
+  </svg>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/render/reftests/overflow-clip.html b/third_party/blink/web_tests/external/wpt/svg/render/reftests/overflow-clip.html
new file mode 100644
index 0000000..24e5ef5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/render/reftests/overflow-clip.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="match" href="rect-ref.html">
+<style>
+svg {
+  overflow: visible;
+}
+</style>
+<svg style="overflow: clip; width: 100px; height: 100px">
+  <rect width="200" height="200" fill="green">
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/render/reftests/rect-ref.html b/third_party/blink/web_tests/external/wpt/svg/render/reftests/rect-ref.html
new file mode 100644
index 0000000..a6e6f37
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/render/reftests/rect-ref.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<svg xmlns="http://www.w3.org/2000/svg">
+  <rect width="100" height="100" fill="green" />
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-transport-stats.https.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-transport-stats.https.html
new file mode 100644
index 0000000..2240bc4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCPeerConnection-transport-stats.https.html
@@ -0,0 +1,45 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>RTCPeerConnection a=setup SDP parameter test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="./third_party/sdp/sdp.js"></script>
+<script>
+'use strict';
+
+// Tests for correct behavior of the transport-stats.
+promise_test(async t => {
+  const pc1 = new RTCPeerConnection();
+  t.add_cleanup(() => pc1.close());
+  pc1.createDataChannel('wpt');
+  await pc1.setLocalDescription();
+  const stats = await pc1.getStats();
+  let transportStats;
+  stats.forEach(report => {
+    if (report.type === 'transport') {
+      transportStats = report;
+    }
+  });
+  assert_equals(transportStats.dtlsState, 'new');
+  assert_equals(transportStats.dtlsRole, 'unknown');
+}, 'DTLS statistics on transport-stats after setLocalDescription');
+
+promise_test(async t => {
+  const pc1 = new RTCPeerConnection();
+  t.add_cleanup(() => pc1.close());
+  pc1.createDataChannel('wpt');
+  await pc1.setLocalDescription();
+  const sections = SDPUtils.splitSections(pc1.localDescription.sdp);
+  const iceParameters = SDPUtils.getIceParameters(sections[1], sections[0]);
+  const stats = await pc1.getStats();
+  let transportStats;
+  stats.forEach(report => {
+    if (report.type === 'transport') {
+      transportStats = report;
+    }
+  });
+  assert_equals(transportStats.iceRole, 'controlling');
+  assert_equals(transportStats.iceLocalUsernameFragment, iceParameters.usernameFragment);
+  assert_equals(transportStats.selectedCandidatePairChanges, 0);
+}, 'ICE statistics on transport-stats after setLocalDescription');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/webusb/protected-interface-classes.https.any.js b/third_party/blink/web_tests/external/wpt/webusb/protected-interface-classes.https.any.js
index cfc6f692..027c2c4 100644
--- a/third_party/blink/web_tests/external/wpt/webusb/protected-interface-classes.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webusb/protected-interface-classes.https.any.js
@@ -2,7 +2,7 @@
 // META: script=/webusb/resources/usb-helpers.js
 'use strict';
 
-async function runTestForInterfaceClass(interfaceClass) {
+async function runTestForInterfaceClass(t, interfaceClass) {
   await navigator.usb.test.initialize();
 
   const fakeDeviceTemplate = {
@@ -59,31 +59,31 @@
   await device.open();
   await device.selectConfiguration(1);
 
-  try {
-    await device.claimInterface(0);
-    assert_unreached('Should not be able to claim a protected interface.');
-  } catch (e) {
-    assert_equals(e.name, 'SecurityError');
-    assert_equals(e.message,
-                  'The requested interface implements a protected class.');
-  }
-
+  await promise_rejects_dom(t, 'SecurityError', device.claimInterface(0));
   await device.claimInterface(1);
+
   await device.close();
   fakeDevice.disconnect();
 }
 
-usb_test(() => runTestForInterfaceClass(0x01),
-         'Protected audio interface cannot be claimed');
-usb_test(() => runTestForInterfaceClass(0x03),
-         'Protected HID interface cannot be claimed');
-usb_test(() => runTestForInterfaceClass(0x08),
-         'Protected mass storage interface cannot be claimed');
-usb_test(() => runTestForInterfaceClass(0x0B),
-         'Protected smart card interface cannot be claimed');
-usb_test(() => runTestForInterfaceClass(0x0E),
-         'Protected video interface cannot be claimed');
-usb_test(() => runTestForInterfaceClass(0x10),
-         'Protected audio/video interface cannot be claimed');
-usb_test(() => runTestForInterfaceClass(0xE0),
-         'Protected wireless controller interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0x01),
+    'Protected audio interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0x03),
+    'Protected HID interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0x08),
+    'Protected mass storage interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0x0B),
+    'Protected smart card interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0x0E),
+    'Protected video interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0x10),
+    'Protected audio/video interface cannot be claimed');
+usb_test(
+    (t) => runTestForInterfaceClass(t, 0xE0),
+    'Protected wireless controller interface cannot be claimed');
diff --git a/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js b/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js
index 8b836509..1197c43e4 100644
--- a/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js
+++ b/third_party/blink/web_tests/external/wpt/webusb/resources/usb-helpers.js
@@ -17,7 +17,7 @@
 })();
 
 function usb_test(func, name, properties) {
-  promise_test(async () => {
+  promise_test(async (t) => {
     assert_implements(navigator.usb, 'missing navigator.usb');
     if (navigator.usb.test === undefined) {
       // Try loading a polyfill for the WebUSB Testing API.
@@ -29,7 +29,7 @@
 
     await navigator.usb.test.initialize();
     try {
-      await func();
+      await func(t);
     } finally {
       await navigator.usb.test.reset();
     }
@@ -68,16 +68,6 @@
   return promise;
 }
 
-function assertRejectsWithError(promise, name, message) {
-  return promise.then(() => {
-    assert_unreached('expected promise to reject with ' + name);
-  }, error => {
-    assert_equals(error.name, name);
-    if (message !== undefined)
-      assert_equals(error.message, message);
-  });
-}
-
 function assertDeviceInfoEquals(usbDevice, deviceInit) {
   for (var property in deviceInit) {
     if (property == 'activeConfigurationValue') {
diff --git a/third_party/blink/web_tests/external/wpt/webusb/usbDevice.https.any.js b/third_party/blink/web_tests/external/wpt/webusb/usbDevice.https.any.js
index 527d238d..b1b0c13 100644
--- a/third_party/blink/web_tests/external/wpt/webusb/usbDevice.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webusb/usbDevice.https.any.js
@@ -4,50 +4,6 @@
 // META: script=/webusb/resources/usb-helpers.js
 'use strict';
 
-function assertRejectsWithNotFoundError(promise) {
-  return assertRejectsWithError(promise, 'NotFoundError');
-}
-
-function assertRejectsWithTypeError(promise) {
-  return assertRejectsWithError(promise, 'TypeError');
-}
-
-function assertRejectsWithNotOpenError(promise) {
-  return assertRejectsWithError(
-      promise, 'InvalidStateError', 'The device must be opened first.');
-}
-
-function assertRejectsWithNotConfiguredError(promise) {
-  return assertRejectsWithError(
-      promise, 'InvalidStateError',
-      'The device must have a configuration selected.');
-}
-
-function assertRejectsWithNotClaimedError(promise) {
-  return assertRejectsWithError(
-      promise, 'InvalidStateError',
-      'The specified interface has not been claimed.');
-}
-
-function assertRejectsWithEndpointNotFoundError(promise) {
-  return assertRejectsWithError(
-      promise, 'NotFoundError',
-      'The specified endpoint is not part of a claimed and selected ' +
-      'alternate interface.');
-}
-
-function assertRejectsWithDeviceStateChangeInProgressError(promise) {
-  return assertRejectsWithError(
-    promise, 'InvalidStateError',
-    'An operation that changes the device state is in progress.');
-}
-
-function assertRejectsWithInterfaceStateChangeInProgressError(promise) {
-  return assertRejectsWithError(
-    promise, 'InvalidStateError',
-    'An operation that changes interface state is in progress.');
-}
-
 function detachBuffer(buffer) {
   if (self.GLOBAL.isWindow())
     window.postMessage('', '*', [buffer]);
@@ -55,10 +11,10 @@
     self.postMessage('', [buffer]);
 }
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return waitForDisconnect(fakeDevice)
-      .then(() => assertRejectsWithNotFoundError(device.open()));
+        .then(() => promise_rejects_dom(t, 'NotFoundError', device.open()));
   });
 }, 'open rejects when called on a disconnected device');
 
@@ -97,107 +53,122 @@
   });
 }, 'open and close can be called multiple times');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   await Promise.all([
     device.open(),
-    assertRejectsWithDeviceStateChangeInProgressError(device.open()),
-    assertRejectsWithDeviceStateChangeInProgressError(device.close()),
+    promise_rejects_dom(t, 'InvalidStateError', device.open()),
+    promise_rejects_dom(t, 'InvalidStateError', device.close()),
   ]);
   await Promise.all([
     device.close(),
-    assertRejectsWithDeviceStateChangeInProgressError(device.open()),
-    assertRejectsWithDeviceStateChangeInProgressError(device.close()),
+    promise_rejects_dom(t, 'InvalidStateError', device.open()),
+    promise_rejects_dom(t, 'InvalidStateError', device.close()),
   ]);
 }, 'open and close cannot be called again while open or close are in progress');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   await device.open();
   return Promise.all([
     device.selectConfiguration(1),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.claimInterface(0)),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.releaseInterface(0)),
-    assertRejectsWithDeviceStateChangeInProgressError(device.open()),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.selectConfiguration(1)),
-    assertRejectsWithDeviceStateChangeInProgressError(device.reset()),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.selectAlternateInterface(0, 0)),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.controlTransferOut({
-          requestType: 'standard',
-          recipient: 'interface',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x0000,
-        })),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.controlTransferOut({
-          requestType: 'standard',
-          recipient: 'interface',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x0000,
-        }, new Uint8Array([1, 2, 3]))),
-    assertRejectsWithDeviceStateChangeInProgressError(
-        device.controlTransferIn({
-          requestType: 'standard',
-          recipient: 'interface',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x0000
-        }, 0)),
-    assertRejectsWithDeviceStateChangeInProgressError(device.close()),
+    promise_rejects_dom(t, 'InvalidStateError', device.claimInterface(0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.releaseInterface(0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.open()),
+    promise_rejects_dom(t, 'InvalidStateError', device.selectConfiguration(1)),
+    promise_rejects_dom(t, 'InvalidStateError', device.reset()),
+    promise_rejects_dom(
+        t, 'InvalidStateError', device.selectAlternateInterface(0, 0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.controlTransferOut({
+      requestType: 'standard',
+      recipient: 'interface',
+      request: 0x42,
+      value: 0x1234,
+      index: 0x0000,
+    })),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.controlTransferOut(
+            {
+              requestType: 'standard',
+              recipient: 'interface',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x0000,
+            },
+            new Uint8Array([1, 2, 3]))),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.controlTransferIn(
+            {
+              requestType: 'standard',
+              recipient: 'interface',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x0000
+            },
+            0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.close()),
   ]);
 }, 'device operations reject if an device state change is in progress');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.close()));
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(() => promise_rejects_dom(t, 'NotFoundError', device.close()));
   });
 }, 'close rejects when called on a disconnected device');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.selectConfiguration(1)));
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.selectConfiguration(1)));
   });
 }, 'selectConfiguration rejects when called on a disconnected device');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device }) => Promise.all([
-      assertRejectsWithNotOpenError(device.selectConfiguration(1)),
-      assertRejectsWithNotOpenError(device.claimInterface(0)),
-      assertRejectsWithNotOpenError(device.releaseInterface(0)),
-      assertRejectsWithNotOpenError(device.selectAlternateInterface(0, 1)),
-      assertRejectsWithNotOpenError(device.controlTransferIn({
-          requestType: 'vendor',
-          recipient: 'device',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x5678
-      }, 7)),
-      assertRejectsWithNotOpenError(device.controlTransferOut({
-          requestType: 'vendor',
-          recipient: 'device',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x5678
-      }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
-      assertRejectsWithNotOpenError(device.clearHalt('in', 1)),
-      assertRejectsWithNotOpenError(device.transferIn(1, 8)),
-      assertRejectsWithNotOpenError(
-          device.transferOut(1, new ArrayBuffer(8))),
-      assertRejectsWithNotOpenError(device.isochronousTransferIn(1, [8])),
-      assertRejectsWithNotOpenError(
-          device.isochronousTransferOut(1, new ArrayBuffer(8), [8])),
-      assertRejectsWithNotOpenError(device.reset())
+usb_test((t) => {
+  return getFakeDevice().then(({device}) => Promise.all([
+    promise_rejects_dom(t, 'InvalidStateError', device.selectConfiguration(1)),
+    promise_rejects_dom(t, 'InvalidStateError', device.claimInterface(0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.releaseInterface(0)),
+    promise_rejects_dom(
+        t, 'InvalidStateError', device.selectAlternateInterface(0, 1)),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.controlTransferIn(
+            {
+              requestType: 'vendor',
+              recipient: 'device',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x5678
+            },
+            7)),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.controlTransferOut(
+            {
+              requestType: 'vendor',
+              recipient: 'device',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x5678
+            },
+            new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
+    promise_rejects_dom(t, 'InvalidStateError', device.clearHalt('in', 1)),
+    promise_rejects_dom(t, 'InvalidStateError', device.transferIn(1, 8)),
+    promise_rejects_dom(
+        t, 'InvalidStateError', device.transferOut(1, new ArrayBuffer(8))),
+    promise_rejects_dom(
+        t, 'InvalidStateError', device.isochronousTransferIn(1, [8])),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.isochronousTransferOut(1, new ArrayBuffer(8), [8])),
+    promise_rejects_dom(t, 'InvalidStateError', device.reset())
   ]));
 }, 'methods requiring it reject when the device is not open');
 
@@ -232,34 +203,40 @@
   await device.close();
 }, 'a device configuration value can be set again');
 
-usb_test(() => {
+usb_test((t) => {
   return getFakeDevice().then(({ device }) => {
     assert_equals(device.configuration, null);
     return device.open()
         .then(
-            () => assertRejectsWithError(
-                device.selectConfiguration(10), 'NotFoundError',
-                'The configuration value provided is not supported by the device.'))
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.selectConfiguration(10)))
         .then(() => device.close());
   });
 }, 'selectConfiguration rejects on invalid configurations');
 
-usb_test(() => {
+usb_test((t) => {
   return getFakeDevice().then(({ device }) => {
     assert_equals(device.configuration, null);
-    return device.open().then(() => Promise.all([
-        assertRejectsWithNotConfiguredError(device.claimInterface(0)),
-        assertRejectsWithNotConfiguredError(device.releaseInterface(0)),
-        assertRejectsWithNotConfiguredError(device.selectAlternateInterface(0, 1)),
-        assertRejectsWithNotConfiguredError(device.clearHalt('in', 1)),
-        assertRejectsWithNotConfiguredError(device.transferIn(1, 8)),
-        assertRejectsWithNotConfiguredError(
-            device.transferOut(1, new ArrayBuffer(8))),
-        assertRejectsWithNotConfiguredError(
-            device.isochronousTransferIn(1, [8])),
-        assertRejectsWithNotConfiguredError(
-            device.isochronousTransferOut(1, new ArrayBuffer(8), [8])),
-    ])).then(() => device.close());
+    return device.open()
+        .then(() => Promise.all([
+          promise_rejects_dom(t, 'InvalidStateError', device.claimInterface(0)),
+          promise_rejects_dom(
+              t, 'InvalidStateError', device.releaseInterface(0)),
+          promise_rejects_dom(
+              t, 'InvalidStateError', device.selectAlternateInterface(0, 1)),
+          promise_rejects_dom(
+              t, 'InvalidStateError', device.clearHalt('in', 1)),
+          promise_rejects_dom(t, 'InvalidStateError', device.transferIn(1, 8)),
+          promise_rejects_dom(
+              t, 'InvalidStateError',
+              device.transferOut(1, new ArrayBuffer(8))),
+          promise_rejects_dom(
+              t, 'InvalidStateError', device.isochronousTransferIn(1, [8])),
+          promise_rejects_dom(
+              t, 'InvalidStateError',
+              device.isochronousTransferOut(1, new ArrayBuffer(8), [8])),
+        ]))
+        .then(() => device.close());
   });
 }, 'methods requiring it reject when the device is unconfigured');
 
@@ -333,47 +310,49 @@
   await device.close();
 }, 'an interface can be released multiple times');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   await device.open();
   await device.selectConfiguration(1);
   return Promise.all([
     device.claimInterface(0),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.claimInterface(0)),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.releaseInterface(0)),
-    assertRejectsWithInterfaceStateChangeInProgressError(device.open()),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.selectConfiguration(1)),
-    assertRejectsWithInterfaceStateChangeInProgressError(device.reset()),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.selectAlternateInterface(0, 0)),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.controlTransferOut({
-          requestType: 'standard',
-          recipient: 'interface',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x0000,
-        })),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.controlTransferOut({
-          requestType: 'standard',
-          recipient: 'interface',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x0000,
-        }, new Uint8Array([1, 2, 3]))),
-    assertRejectsWithInterfaceStateChangeInProgressError(
-        device.controlTransferIn({
-          requestType: 'standard',
-          recipient: 'interface',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x0000
-        }, 0)),
-    assertRejectsWithInterfaceStateChangeInProgressError(device.close()),
+    promise_rejects_dom(t, 'InvalidStateError', device.claimInterface(0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.releaseInterface(0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.open()),
+    promise_rejects_dom(t, 'InvalidStateError', device.selectConfiguration(1)),
+    promise_rejects_dom(t, 'InvalidStateError', device.reset()),
+    promise_rejects_dom(
+        t, 'InvalidStateError', device.selectAlternateInterface(0, 0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.controlTransferOut({
+      requestType: 'standard',
+      recipient: 'interface',
+      request: 0x42,
+      value: 0x1234,
+      index: 0x0000,
+    })),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.controlTransferOut(
+            {
+              requestType: 'standard',
+              recipient: 'interface',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x0000,
+            },
+            new Uint8Array([1, 2, 3]))),
+    promise_rejects_dom(
+        t, 'InvalidStateError',
+        device.controlTransferIn(
+            {
+              requestType: 'standard',
+              recipient: 'interface',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x0000
+            },
+            0)),
+    promise_rejects_dom(t, 'InvalidStateError', device.close()),
   ]);
 }, 'device operations reject if an interface state change is in progress');
 
@@ -387,38 +366,38 @@
   assert_false(device.configuration.interfaces[0].claimed);
 }, 'interfaces are released on close');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device }) => {
-    const message = 'The interface number provided is not supported by the ' +
-                    'device in its current configuration.';
+usb_test((t) => {
+  return getFakeDevice().then(({device}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => Promise.all([
-          assertRejectsWithError(
-              device.claimInterface(2), 'NotFoundError', message),
-          assertRejectsWithError(
-              device.releaseInterface(2), 'NotFoundError', message),
-      ]))
-      .then(() => device.close());
+        .then(() => device.selectConfiguration(1))
+        .then(() => Promise.all([
+          promise_rejects_dom(t, 'NotFoundError', device.claimInterface(2)),
+          promise_rejects_dom(t, 'NotFoundError', device.releaseInterface(2)),
+        ]))
+        .then(() => device.close());
   });
 }, 'a non-existent interface cannot be claimed or released');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.claimInterface(0)));
+        .then(() => device.selectConfiguration(1))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.claimInterface(0)));
   });
 }, 'claimInterface rejects when called on a disconnected device');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => device.claimInterface(0))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.releaseInterface(0)));
+        .then(() => device.selectConfiguration(1))
+        .then(() => device.claimInterface(0))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.releaseInterface(0)));
   });
 }, 'releaseInterface rejects when called on a disconnected device');
 
@@ -456,26 +435,27 @@
     'can select an alternate interface on a setting with non-sequential ' +
         'alternative setting value');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device}) => {
     return device.open()
-      .then(() => device.selectConfiguration(2))
-      .then(() => device.claimInterface(0))
-      .then(() => assertRejectsWithError(
-          device.selectAlternateInterface(0, 2), 'NotFoundError',
-          'The alternate setting provided is not supported by the device in ' +
-          'its current configuration.'))
-      .then(() => device.close());
+        .then(() => device.selectConfiguration(2))
+        .then(() => device.claimInterface(0))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.selectAlternateInterface(0, 2)))
+        .then(() => device.close());
   });
 }, 'cannot select a non-existent alternate interface');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(2))
-      .then(() => device.claimInterface(0))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.selectAlternateInterface(0, 1)));
+        .then(() => device.selectConfiguration(2))
+        .then(() => device.claimInterface(0))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.selectAlternateInterface(0, 1)));
   });
 }, 'selectAlternateInterface rejects when called on a disconnected device');
 
@@ -535,7 +515,7 @@
   await device.close();
 }, 'device-scope IN control transfers don\'t require configuration');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   let usbRequestTypes = ['standard', 'class', 'vendor'];
   let usbRecipients = ['interface', 'endpoint'];
@@ -543,19 +523,23 @@
   await Promise.all(usbRequestTypes.flatMap(requestType => {
     return usbRecipients.map(recipient => {
       let index = recipient === 'interface' ? 0x5600 : 0x5681;
-      return assertRejectsWithNotConfiguredError(device.controlTransferIn({
-        requestType: requestType,
-        recipient: recipient,
-        request: 0x42,
-        value: 0x1234,
-        index: index
-      }, 7));
+      return promise_rejects_dom(
+          t, 'InvalidStateError',
+          device.controlTransferIn(
+              {
+                requestType: requestType,
+                recipient: recipient,
+                request: 0x42,
+                value: 0x1234,
+                index: index
+              },
+              7));
     });
   }));
   await device.close();
 }, 'interface-scope IN control transfers require configuration');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   let usbRequestTypes = ['standard', 'class', 'vendor'];
   let usbRecipients = ['interface', 'endpoint'];
@@ -563,37 +547,50 @@
   await device.selectConfiguration(1);
   await Promise.all(usbRequestTypes.flatMap(requestType => {
     return [
-      assertRejectsWithNotClaimedError(device.controlTransferIn({
-        requestType: requestType,
-        recipient: 'interface',
-        request: 0x42,
-        value: 0x1234,
-        index: 0x5600
-      }, 7)),
-      assertRejectsWithNotFoundError(device.controlTransferIn({
-        requestType: requestType,
-        recipient: 'endpoint',
-        request: 0x42,
-        value: 0x1234,
-        index: 0x5681
-      }, 7))
+      promise_rejects_dom(
+          t, 'InvalidStateError',
+          device.controlTransferIn(
+              {
+                requestType: requestType,
+                recipient: 'interface',
+                request: 0x42,
+                value: 0x1234,
+                index: 0x5600
+              },
+              7)),
+      promise_rejects_dom(
+          t, 'NotFoundError',
+          device.controlTransferIn(
+              {
+                requestType: requestType,
+                recipient: 'endpoint',
+                request: 0x42,
+                value: 0x1234,
+                index: 0x5681
+              },
+              7))
     ];
   }));
   await device.close();
 }, 'interface-scope IN control transfers require claiming the interface');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.controlTransferIn({
-          requestType: 'vendor',
-          recipient: 'device',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x5678
-        }, 7)));
+        .then(() => device.selectConfiguration(1))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError',
+                device.controlTransferIn(
+                    {
+                      requestType: 'vendor',
+                      recipient: 'device',
+                      request: 0x42,
+                      value: 0x1234,
+                      index: 0x5678
+                    },
+                    7)));
   });
 }, 'controlTransferIn rejects when called on a disconnected device');
 
@@ -662,7 +659,7 @@
   await device.close();
 }, 'device-scope OUT control transfers don\'t require configuration');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   let usbRequestTypes = ['standard', 'class', 'vendor'];
   let usbRecipients = ['interface', 'endpoint'];
@@ -679,17 +676,21 @@
         value: 0x1234,
         index: index
       };
-      return dataTypes.map(data => {
-        return assertRejectsWithNotConfiguredError(
-            device.controlTransferOut(transferParams, data));
-      }).push(assertRejectsWithNotConfiguredError(
-          device.controlTransferOut(transferParams)));
+      return dataTypes
+          .map(data => {
+            return promise_rejects_dom(
+                t, 'InvalidStateError',
+                device.controlTransferOut(transferParams, data));
+          })
+          .push(promise_rejects_dom(
+              t, 'InvalidStateError',
+              device.controlTransferOut(transferParams)));
     });
   }));
   await device.close();
 }, 'interface-scope OUT control transfers require configuration');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   let usbRequestTypes = ['standard', 'class', 'vendor'];
   let usbRecipients = ['interface', 'endpoint'];
@@ -700,9 +701,8 @@
   await Promise.all(usbRequestTypes.flatMap(requestType => {
     return usbRecipients.flatMap(recipient => {
       let index = recipient === 'interface' ? 0x5600 : 0x5681;
-      let assertion = recipient === 'interface'
-          ? assertRejectsWithNotClaimedError
-          : assertRejectsWithEndpointNotFoundError;
+      let error =
+          recipient === 'interface' ? 'InvalidStateError' : 'NotFoundError';
       let transferParams = {
         requestType: requestType,
         recipient: recipient,
@@ -710,94 +710,133 @@
         value: 0x1234,
         index: index
       };
-      return dataTypes.map(data => {
-        return assertion(device.controlTransferOut(transferParams, data));
-      }).push(assertion(device.controlTransferOut(transferParams)));
+      return dataTypes
+          .map(data => {
+            return promise_rejects_dom(
+                t, error, device.controlTransferOut(transferParams, data));
+          })
+          .push(promise_rejects_dom(
+              t, error, device.controlTransferOut(transferParams)));
     });
   }));
   await device.close();
 }, 'interface-scope OUT control transfers an interface claim');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.controlTransferOut({
-          requestType: 'vendor',
-          recipient: 'device',
-          request: 0x42,
-          value: 0x1234,
-          index: 0x5678
-        }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))));
+        .then(() => device.selectConfiguration(1))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError',
+                device.controlTransferOut(
+                    {
+                      requestType: 'vendor',
+                      recipient: 'device',
+                      request: 0x42,
+                      value: 0x1234,
+                      index: 0x5678
+                    },
+                    new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))));
   });
 }, 'controlTransferOut rejects when called on a disconnected device');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   await device.open();
   await device.selectConfiguration(1);
   await device.claimInterface(0);
-  assertRejectsWithTypeError(device.controlTransferOut({
-    requestType: 'invalid',
-    recipient: 'device',
-    request: 0x42,
-    value: 0x1234,
-    index: 0x5678
-  }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8])));
-  assertRejectsWithTypeError(device.controlTransferIn({
-    requestType: 'invalid',
-    recipient: 'device',
-    request: 0x42,
-    value: 0x1234,
-    index: 0x5678
-  }, 0));
+  await Promise.all([
+    promise_rejects_js(
+        t, TypeError,
+        device.controlTransferOut(
+            {
+              requestType: 'invalid',
+              recipient: 'device',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x5678
+            },
+            new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
+    promise_rejects_js(
+        t, TypeError,
+        device.controlTransferIn(
+            {
+              requestType: 'invalid',
+              recipient: 'device',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x5678
+            },
+            0)),
+  ]);
   await device.close();
 }, 'control transfers with a invalid request type reject');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   await device.open();
   await device.selectConfiguration(1);
   await device.claimInterface(0);
-  assertRejectsWithTypeError(device.controlTransferOut({
-    requestType: 'vendor',
-    recipient: 'invalid',
-    request: 0x42,
-    value: 0x1234,
-    index: 0x5678
-  }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8])));
-  assertRejectsWithTypeError(device.controlTransferIn({
-    requestType: 'vendor',
-    recipient: 'invalid',
-    request: 0x42,
-    value: 0x1234,
-    index: 0x5678
-  }, 0));
+  await Promise.all([
+    promise_rejects_js(
+        t, TypeError,
+        device.controlTransferOut(
+            {
+              requestType: 'vendor',
+              recipient: 'invalid',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x5678
+            },
+            new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
+    promise_rejects_js(
+        t, TypeError,
+        device.controlTransferIn(
+            {
+              requestType: 'vendor',
+              recipient: 'invalid',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x5678
+            },
+            0)),
+  ]);
 }, 'control transfers with a invalid recipient type reject');
 
-usb_test(async () => {
+usb_test(async (t) => {
   let { device } = await getFakeDevice();
   await device.open();
   await device.selectConfiguration(1);
   await device.claimInterface(0);
-  assertRejectsWithNotFoundError(device.controlTransferOut({
-    requestType: 'vendor',
-    recipient: 'interface',
-    request: 0x42,
-    value: 0x1234,
-    index: 0x0002  // Last byte of index is interface number.
-  }, new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8])));
-  assertRejectsWithNotFoundError(device.controlTransferIn({
-    requestType: 'vendor',
-    recipient: 'interface',
-    request: 0x42,
-    value: 0x1234,
-    index: 0x0002  // Last byte of index is interface number.
-  }, 0));
+  await Promise.all([
+    promise_rejects_dom(
+        t, 'NotFoundError',
+        device.controlTransferOut(
+            {
+              requestType: 'vendor',
+              recipient: 'interface',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x0002  // Last byte of index is interface number.
+            },
+            new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]))),
+    promise_rejects_dom(
+        t, 'NotFoundError',
+        device.controlTransferIn(
+            {
+              requestType: 'vendor',
+              recipient: 'interface',
+              request: 0x42,
+              value: 0x1234,
+              index: 0x0002  // Last byte of index is interface number.
+            },
+            0)),
+  ]);
 }, 'control transfers to a non-existant interface reject');
 
-usb_test(() => {
+usb_test((t) => {
   return getFakeDevice().then(({ device }) => {
     let interfaceRequest = {
         requestType: 'vendor',
@@ -815,23 +854,22 @@
     };
     let data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => Promise.all([
-          assertRejectsWithError(
-              device.controlTransferIn(interfaceRequest, 7),
-              'InvalidStateError'),
-          assertRejectsWithError(
-              device.controlTransferIn(endpointRequest, 7),
-              'NotFoundError'),
-          assertRejectsWithError(
-              device.controlTransferOut(interfaceRequest, data),
-              'InvalidStateError'),
-          assertRejectsWithError(
-              device.controlTransferOut(endpointRequest, data),
-              'NotFoundError'),
-      ]))
-      .then(() => device.claimInterface(0))
-      .then(() => Promise.all([
+        .then(() => device.selectConfiguration(1))
+        .then(() => Promise.all([
+          promise_rejects_dom(
+              t, 'InvalidStateError',
+              device.controlTransferIn(interfaceRequest, 7)),
+          promise_rejects_dom(
+              t, 'NotFoundError', device.controlTransferIn(endpointRequest, 7)),
+          promise_rejects_dom(
+              t, 'InvalidStateError',
+              device.controlTransferOut(interfaceRequest, data)),
+          promise_rejects_dom(
+              t, 'NotFoundError',
+              device.controlTransferOut(endpointRequest, data)),
+        ]))
+        .then(() => device.claimInterface(0))
+        .then(() => Promise.all([
           device.controlTransferIn(interfaceRequest, 7).then(result => {
             assert_true(result instanceof USBInTransferResult);
             assert_equals(result.status, 'ok');
@@ -852,8 +890,8 @@
           }),
           device.controlTransferOut(interfaceRequest, data),
           device.controlTransferOut(endpointRequest, data),
-      ]))
-      .then(() => device.close());
+        ]))
+        .then(() => device.close());
   });
 }, 'requests to interfaces and endpoint require an interface claim');
 
@@ -908,35 +946,39 @@
   });
 }, 'can clear a halt condition');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice(t).then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => device.claimInterface(0))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.clearHalt('in', 1)));
+        .then(() => device.selectConfiguration(1))
+        .then(() => device.claimInterface(0))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.clearHalt('in', 1)));
   });
 }, 'clearHalt rejects when called on a disconnected device');
 
-usb_test(() => {
+usb_test((t) => {
   return getFakeDevice().then(({ device }) => {
     let data = new DataView(new ArrayBuffer(1024));
     for (let i = 0; i < 1024; ++i)
       data.setUint8(i, i & 0xff);
-    const rangeError = 'The specified endpoint number is out of range.';
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => device.claimInterface(0))
-      .then(() => Promise.all([
-          assertRejectsWithEndpointNotFoundError(device.transferIn(2, 8)), // Unclaimed
-          assertRejectsWithEndpointNotFoundError(device.transferIn(3, 8)), // Non-existent
-          assertRejectsWithError(
-              device.transferIn(16, 8), 'IndexSizeError', rangeError),
-          assertRejectsWithEndpointNotFoundError(device.transferOut(2, data)), // Unclaimed
-          assertRejectsWithEndpointNotFoundError(device.transferOut(3, data)), // Non-existent
-          assertRejectsWithError(
-              device.transferOut(16, data), 'IndexSizeError', rangeError),
-      ]));
+        .then(() => device.selectConfiguration(1))
+        .then(() => device.claimInterface(0))
+        .then(() => Promise.all([
+          promise_rejects_dom(
+              t, 'NotFoundError', device.transferIn(2, 8)),  // Unclaimed
+          promise_rejects_dom(
+              t, 'NotFoundError', device.transferIn(3, 8)),  // Non-existent
+          promise_rejects_dom(t, 'IndexSizeError', device.transferIn(16, 8)),
+          promise_rejects_dom(
+              t, 'NotFoundError', device.transferOut(2, data)),  // Unclaimed
+          promise_rejects_dom(
+              t, 'NotFoundError', device.transferOut(3, data)),  // Non-existent
+          promise_rejects_dom(
+              t, 'IndexSizeError', device.transferOut(16, data)),
+        ]));
   });
 }, 'transfers to unavailable endpoints are rejected');
 
@@ -975,13 +1017,15 @@
   });
 }, 'can issue IN bulk transfer');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(1))
-      .then(() => device.claimInterface(1))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.transferIn(2, 1024)));
+        .then(() => device.selectConfiguration(1))
+        .then(() => device.claimInterface(1))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError', device.transferIn(2, 1024)));
   });
 }, 'transferIn rejects if called on a disconnected device');
 
@@ -1005,7 +1049,7 @@
   });
 }, 'can issue OUT bulk transfer');
 
-usb_test(() => {
+usb_test((t) => {
   return getFakeDevice().then(({ device, fakeDevice }) => {
     return device.open()
       .then(() => device.selectConfiguration(1))
@@ -1015,7 +1059,9 @@
         for (let i = 0; i < 1024; ++i)
           data.setUint8(i, i & 0xff);
         return waitForDisconnect(fakeDevice)
-          .then(() => assertRejectsWithNotFoundError(device.transferOut(2, data)));
+            .then(
+                () => promise_rejects_dom(
+                    t, 'NotFoundError', device.transferOut(2, data)));
       });
   });
 }, 'transferOut rejects if called on a disconnected device');
@@ -1082,15 +1128,18 @@
   });
 }, 'can issue IN isochronous transfer');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => device.selectConfiguration(2))
-      .then(() => device.claimInterface(0))
-      .then(() => device.selectAlternateInterface(0, 1))
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.isochronousTransferIn(
-          1, [64, 64, 64, 64, 64, 64, 64, 64])));
+        .then(() => device.selectConfiguration(2))
+        .then(() => device.claimInterface(0))
+        .then(() => device.selectAlternateInterface(0, 1))
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(
+            () => promise_rejects_dom(
+                t, 'NotFoundError',
+                device.isochronousTransferIn(
+                    1, [64, 64, 64, 64, 64, 64, 64, 64])));
   });
 }, 'isochronousTransferIn rejects when called on a disconnected device');
 
@@ -1124,7 +1173,7 @@
   });
 }, 'can issue OUT isochronous transfer');
 
-usb_test(() => {
+usb_test((t) => {
   return getFakeDevice().then(({ device, fakeDevice }) => {
     return device.open()
       .then(() => device.selectConfiguration(2))
@@ -1137,8 +1186,11 @@
             data.setUint8(i * j, j & 0xff);
         }
         return waitForDisconnect(fakeDevice)
-          .then(() => assertRejectsWithNotFoundError(device.isochronousTransferOut(
-              1, data, [64, 64, 64, 64, 64, 64, 64, 64])));
+            .then(
+                () => promise_rejects_dom(
+                    t, 'NotFoundError',
+                    device.isochronousTransferOut(
+                        1, data, [64, 64, 64, 64, 64, 64, 64, 64])));
       });
   });
 }, 'isochronousTransferOut rejects when called on a disconnected device');
@@ -1188,10 +1240,10 @@
   });
 }, 'can reset the device');
 
-usb_test(() => {
-  return getFakeDevice().then(({ device, fakeDevice }) => {
+usb_test((t) => {
+  return getFakeDevice().then(({device, fakeDevice}) => {
     return device.open()
-      .then(() => waitForDisconnect(fakeDevice))
-      .then(() => assertRejectsWithNotFoundError(device.reset()));
+        .then(() => waitForDisconnect(fakeDevice))
+        .then(() => promise_rejects_dom(t, 'NotFoundError', device.reset()));
   });
 }, 'resetDevice rejects when called on a disconnected device');
diff --git a/third_party/blink/web_tests/fast/css/only-child-pseudo-class.html b/third_party/blink/web_tests/fast/css/only-child-pseudo-class.html
deleted file mode 100644
index b7db4d7..0000000
--- a/third_party/blink/web_tests/fast/css/only-child-pseudo-class.html
+++ /dev/null
@@ -1,142 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-
-<html>
-	<head>
-		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
-		<title>:only-child</title>
-		
-		<style type='text/css'>
-		<!--
-
-			body { background: #fff; color: 000; font-family: Arial, Helvetica, sans-serif; }
-			pre { background: #fff; padding: 0.5em; }
-			li { background: #aaa; padding: 1em; width: 80%; margin: 0 0 3em; }
-			.test { display: block; padding: 0.75em; }
-			.base, .defaultgreen { background-color: #090; }
-			.defaultred { background-color: #900; }
-						
-			.defaultred :only-child {
-				background-color: #090;
-			}
-
-			.defaultgreen :only-child {
-				background-color: #900;
-			}
-
-		-->			
-		</style>
-	</head>
-
-	<body>
-		<p>This page is part of the <a href="http://www.css3.info">CSS3.info</a> <a href="http://www.css3.info/selectors-test/">CSS selectors test</a>. See more info on <a href="http://www.css3.info/preview/attribute-selectors.html">CSS3 selectors</a>.</p>
-		
-		<div class='base'></div>
-			
-		<ol>
-			<li>
-				<div class='defaultred'>
-					<div class='test required'></div>
-				</div>
-				
-				<pre>div :only-child {
-}
-
-&lt;div&gt;
-   &lt;div&gt;&lt;/div&gt;
-&lt;/div&gt;</pre>
-
-				<p>
-					The CSS selector should match the inner div element, because it is the only child of the outer div element
-				</p>
-			</li>
-
-			<li>
-				<div class='defaultred'>
-					<div class='test'></div>
-					<!-- Just a comment -->
-				</div>
-				
-				<pre>div :only-child {
-}
-
-&lt;div&gt;
-   &lt;div&gt;&lt;/div&gt;
-   &lt;!-- Just a comment --&gt;
-&lt;/div&gt;</pre>
-
-				<p>
-					The CSS selector should match the inner div element, because it is the only child of the outer div element
-				</p>
-			</li>			
-				
-			<li>
-				<div class='defaultred'>
-					<div class='test'></div>
-					.
-				</div>
-				
-				<pre>div :only-child {
-}
-
-&lt;div&gt;
-   &lt;div&gt;&lt;/div&gt;
-   How about regular text...
-&lt;/div&gt;</pre>
-
-				<p>
-					The CSS selector should match the inner div element, because it is the only child of the outer div element
-				</p>
-			</li>			
-				
-			<li>
-				<div class='defaultgreen'>
-					<div class='test default required'></div>
-					<blockquote></blockquote>
-				</div>
-				
-				<pre>div :only-child {
-}
-
-&lt;div&gt; 
-   &lt;div&gt;&lt;/div&gt;
-   &lt;blockquote&gt;&lt;/blockquote&gt;
-&lt;/div&gt;</pre>
-
-				<p>
-					The CSS selector should not match the inner div element, because it not the only child
-				</p>
-			</li>
-
-
-			<li>
-				<div class='defaultgreen'>
-					<div id='appendChild' class='test default'></div>
-				</div>
-
-				<script type="text/javascript">
-				<!--
-
-					var ib = document.getElementById('appendChild');
-					ib.parentNode.appendChild(document.createElement("div"));
-				
-				//-->
-				</script>
-				
-				<pre>div :only-child {
-}
-
-&lt;div&gt;
-   &lt;div id='appendChild'&gt;&lt;/div&gt;
-&lt;/div&gt;
-
-var ib = document.getElementById('appendChild');
-ib.parentElement.appendChild(document.createElement("div"));</pre>
-
-				<p>
-					The CSS selector should not match the original div element, because it is
-					not the only child anymore after another child is append by the Javascript code. 
-				</p>
-			</li>
-		</ol>
-	</body>
-</html>
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug10269-2-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug10269-2-expected.png
new file mode 100644
index 0000000..f7e205a
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug10269-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug10296-1-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug10296-1-expected.png
new file mode 100644
index 0000000..dfc4cce
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/bugs/bug10296-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/other/cell_widths-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/other/cell_widths-expected.png
new file mode 100644
index 0000000..9678999
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla/other/cell_widths-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/bugs/bug10140-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/bugs/bug10140-expected.png
new file mode 100644
index 0000000..25de2f5
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/bugs/bug10140-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/core/captions3-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/core/captions3-expected.png
new file mode 100644
index 0000000..cd39778
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/tables/mozilla_expected_failures/core/captions3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/misc/transforms-usecounter-3d-scene.html b/third_party/blink/web_tests/http/tests/misc/transforms-usecounter-3d-scene.html
index 7d5a6d2..41ab463 100644
--- a/third_party/blink/web_tests/http/tests/misc/transforms-usecounter-3d-scene.html
+++ b/third_party/blink/web_tests/http/tests/misc/transforms-usecounter-3d-scene.html
@@ -37,16 +37,14 @@
   for (const transform of kTransforms) {
     let iframe, idoc;
     promise_test((test) => {
-      return Promise.resolve(true).then(() => {
+      return new Promise((resolve, reject) => {
         iframe = document.createElement("iframe");
         document.body.appendChild(iframe);
         idoc = iframe.contentDocument;
         idoc.body.innerHTML = kCommonStyle + scene.markup;
         idoc.getElementById("transform").style.transform = transform.value;
-        return new Promise((resolve, reject) => {
-          // wait for it to paint
-          runAfterLayoutAndPaint(() => { resolve(true); });
-        });
+        // wait for it to paint
+        runAfterLayoutAndPaint(() => { resolve(true); });
       }).then(() => {
         assert_equals(internals.isUseCounted(idoc, kTransform3dScene),
                       scene.is_3d && transform.is_3d);
@@ -62,7 +60,7 @@
   let k3DScene = kScenes.find(scene => scene.is_3d);
   let k3DTransform = kTransforms.find(transform => transform.is_3d);
   let iframe, idoc, div;
-  return Promise.resolve(true).then(() => {
+  return new Promise((resolve, reject) => {
     div = document.createElement("div");
     div.style.height = "10000px";
     document.body.appendChild(div);
@@ -71,10 +69,8 @@
     idoc = iframe.contentDocument;
     idoc.body.innerHTML = kCommonStyle + k3DScene.markup;
     idoc.getElementById("transform").style.transform = k3DTransform.value;
-    return new Promise((resolve, reject) => {
-      // wait for it to paint
-      runAfterLayoutAndPaint(() => { resolve(true); });
-    });
+    // wait for it to paint
+    runAfterLayoutAndPaint(() => { resolve(true); });
   }).then(() => {
     assert_true(internals.isUseCounted(idoc, kTransform3dScene));
     document.body.removeChild(iframe);
@@ -87,21 +83,19 @@
 // offscreen.
 promise_test((test) => {
   let iframe, div;
-  return Promise.resolve(true).then(() => {
+  return new Promise((resolve, reject) => {
     div = document.createElement("div");
     div.style.height = "10000px";
     document.body.appendChild(div);
     iframe = document.createElement("iframe");
     iframe.src = "http://localhost:8080/misc/resources/transform-usecounter-3d-iframe.html";
     document.body.appendChild(iframe);
-    return new Promise((resolve, reject) => {
-      iframe.addEventListener("load", function(event) {
-        // wait for it to paint
-        runAfterLayoutAndPaint(() => {
-          iframe.contentWindow.postMessage(kTransform3dScene, "*");
-          window.addEventListener("message", function(event) {
-            resolve(event.data);
-          });
+    iframe.addEventListener("load", function(event) {
+      // wait for it to paint
+      runAfterLayoutAndPaint(() => {
+        iframe.contentWindow.postMessage(kTransform3dScene, "*");
+        window.addEventListener("message", function(event) {
+          resolve(event.data);
         });
       });
     });
diff --git a/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-4-expected.png
index f94d507..57ff916 100644
--- a/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-4-expected.png
+++ b/third_party/blink/web_tests/platform/fuchsia/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/fetch/content-type/script.window-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/fetch/content-type/script.window-expected.txt
index d2ddfa3..c425ce7 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/fetch/content-type/script.window-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/fetch/content-type/script.window-expected.txt
@@ -6,12 +6,12 @@
 PASS separate "text/javascript"
 PASS separate text/ javascript
 PASS separate text /javascript
-FAIL separate x/x text/javascript assert_unreached: Reached unreachable code
-FAIL combined x/x text/javascript assert_unreached: Reached unreachable code
-FAIL separate x/x;charset=windows-1252 text/javascript assert_unreached: Reached unreachable code
-FAIL combined x/x;charset=windows-1252 text/javascript assert_unreached: Reached unreachable code
-FAIL separate text/javascript x/x assert_unreached: Reached unreachable code
-FAIL combined text/javascript x/x assert_unreached: Reached unreachable code
+FAIL separate x/x text/javascript assert_unreached: onerror Reached unreachable code
+FAIL combined x/x text/javascript assert_unreached: onerror Reached unreachable code
+FAIL separate x/x;charset=windows-1252 text/javascript assert_unreached: onerror Reached unreachable code
+FAIL combined x/x;charset=windows-1252 text/javascript assert_unreached: onerror Reached unreachable code
+FAIL separate text/javascript x/x assert_unreached: onload Reached unreachable code
+FAIL combined text/javascript x/x assert_unreached: onload Reached unreachable code
 PASS separate text/javascript; charset=windows-1252 text/javascript
 PASS combined text/javascript; charset=windows-1252 text/javascript
 PASS separate text/javascript;" x/x
@@ -28,7 +28,7 @@
 PASS combined text/javascript;charset=windows-1252  text/javascript
 FAIL separate text/javascript;charset=windows-1252;" \" x/x assert_equals: expected "€" but got "€"
 PASS combined text/javascript;charset=windows-1252;" \" x/x
-FAIL separate x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: Reached unreachable code
-FAIL combined x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: Reached unreachable code
+FAIL separate x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: onerror Reached unreachable code
+FAIL combined x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: onerror Reached unreachable code
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/webrtc-stats/supported-stats-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/webrtc-stats/supported-stats-expected.txt
index c056ba7..aa828f0 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/webrtc-stats/supported-stats-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/webrtc-stats/supported-stats-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 310 tests; 204 PASS, 106 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 311 tests; 208 PASS, 103 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS getStats succeeds
 PASS Validating stats
 PASS codec's payloadType
@@ -38,7 +38,7 @@
 PASS inbound-rtp's firCount
 PASS inbound-rtp's pliCount
 FAIL inbound-rtp's sliCount assert_true: Is sliCount present expected true got false
-FAIL inbound-rtp's totalProcessingDelay assert_true: Is totalProcessingDelay present expected true got false
+PASS inbound-rtp's totalProcessingDelay
 FAIL inbound-rtp's estimatedPlayoutTimestamp assert_true: Is estimatedPlayoutTimestamp present expected true got false
 PASS inbound-rtp's jitterBufferDelay
 PASS inbound-rtp's jitterBufferEmittedCount
@@ -231,8 +231,8 @@
 PASS transport's bytesSent
 PASS transport's bytesReceived
 FAIL transport's rtcpTransportStatsId assert_true: Is rtcpTransportStatsId present expected true got false
-FAIL transport's iceRole assert_true: Is iceRole present expected true got false
-FAIL transport's iceLocalUsernameFragment assert_true: Is iceLocalUsernameFragment present expected true got false
+PASS transport's iceRole
+PASS transport's iceLocalUsernameFragment
 PASS transport's dtlsState
 FAIL transport's iceState assert_true: Is iceState present expected true got false
 PASS transport's selectedCandidatePairId
@@ -240,6 +240,7 @@
 PASS transport's remoteCertificateId
 PASS transport's tlsVersion
 PASS transport's dtlsCipher
+PASS transport's dtlsRole
 PASS transport's srtpCipher
 FAIL transport's tlsGroup assert_true: Is tlsGroup present expected true got false
 PASS transport's selectedCandidatePairChanges
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png b/third_party/blink/web_tests/platform/linux/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
index f94dc3a4..cc425f7 100644
--- a/third_party/blink/web_tests/platform/linux/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
+++ b/third_party/blink/web_tests/platform/linux/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/linux/fast/css/only-child-pseudo-class-expected.png
deleted file mode 100644
index 1d185c5..0000000
--- a/third_party/blink/web_tests/platform/linux/fast/css/only-child-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10269-2-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10269-2-expected.png
index f7e205a..3a95c67 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10269-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10269-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10296-1-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10296-1-expected.png
index dfc4cce..6d9d8bc 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10296-1-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug10296-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug2479-4-expected.png
index 7f449834..03729b37 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug2479-4-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla/other/cell_widths-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla/other/cell_widths-expected.png
index 9678999..a8fdc413 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla/other/cell_widths-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla/other/cell_widths-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla/other/wa_table_thtd_rowspan-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
index 5b8b0969..5017f165 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug10140-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug10140-expected.png
index 25de2f5..8293780 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug10140-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug10140-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug91057-expected.png
index ce31755..e2ad23ea 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug91057-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/bugs/bug91057-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/core/captions3-expected.png b/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/core/captions3-expected.png
index cd39778..b9fa913 100644
--- a/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/core/captions3-expected.png
+++ b/third_party/blink/web_tests/platform/linux/tables/mozilla_expected_failures/core/captions3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/bugs/bug2479-4-expected.png
index 00102e7..c30b15c 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/bugs/bug2479-4-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/other/wa_table_thtd_rowspan-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
index 4c2205f..1ccbbefd 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla_expected_failures/bugs/bug91057-expected.png
index 707cccc..1e5c1c8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla_expected_failures/bugs/bug91057-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/tables/mozilla_expected_failures/bugs/bug91057-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
new file mode 100644
index 0000000..1c9bc73
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea-expected.txt
rename to third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/html/semantics/forms/textfieldselection/selection-not-application-textarea-expected.txt
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug10269-2-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug10269-2-expected.png
new file mode 100644
index 0000000..f350d46
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug10269-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug10296-1-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug10296-1-expected.png
new file mode 100644
index 0000000..8862770
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug10296-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug2479-4-expected.png
index 4dfcb6b..5f6c941 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug2479-4-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/other/cell_widths-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/other/cell_widths-expected.png
new file mode 100644
index 0000000..884603fb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla/other/cell_widths-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla_expected_failures/bugs/bug10140-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla_expected_failures/bugs/bug10140-expected.png
new file mode 100644
index 0000000..bfcf9009
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla_expected_failures/bugs/bug10140-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla_expected_failures/core/captions3-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla_expected_failures/core/captions3-expected.png
new file mode 100644
index 0000000..9443a6c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/tables/mozilla_expected_failures/core/captions3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/fetch/content-type/script.window-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/fetch/content-type/script.window-expected.txt
index 1967a51..b564c6a8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/fetch/content-type/script.window-expected.txt
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/fetch/content-type/script.window-expected.txt
@@ -6,12 +6,12 @@
 PASS separate "text/javascript"
 PASS separate text/ javascript
 PASS separate text /javascript
-FAIL separate x/x text/javascript assert_unreached: Reached unreachable code
-FAIL combined x/x text/javascript assert_unreached: Reached unreachable code
-FAIL separate x/x;charset=windows-1252 text/javascript assert_unreached: Reached unreachable code
-FAIL combined x/x;charset=windows-1252 text/javascript assert_unreached: Reached unreachable code
-FAIL separate text/javascript x/x assert_unreached: Reached unreachable code
-FAIL combined text/javascript x/x assert_unreached: Reached unreachable code
+FAIL separate x/x text/javascript assert_unreached: onerror Reached unreachable code
+FAIL combined x/x text/javascript assert_unreached: onerror Reached unreachable code
+FAIL separate x/x;charset=windows-1252 text/javascript assert_unreached: onerror Reached unreachable code
+FAIL combined x/x;charset=windows-1252 text/javascript assert_unreached: onerror Reached unreachable code
+FAIL separate text/javascript x/x assert_unreached: onload Reached unreachable code
+FAIL combined text/javascript x/x assert_unreached: onload Reached unreachable code
 PASS separate text/javascript; charset=windows-1252 text/javascript
 PASS combined text/javascript; charset=windows-1252 text/javascript
 PASS separate text/javascript;" x/x
@@ -25,10 +25,10 @@
 PASS separate text/javascript;charset=windows-1252 error text/javascript
 PASS combined text/javascript;charset=windows-1252 error text/javascript
 PASS separate text/javascript;charset=windows-1252  text/javascript
-FAIL combined text/javascript;charset=windows-1252  text/javascript assert_unreached: Reached unreachable code
+FAIL combined text/javascript;charset=windows-1252  text/javascript assert_unreached: onerror Reached unreachable code
 FAIL separate text/javascript;charset=windows-1252;" \" x/x assert_equals: expected "€" but got "€"
 PASS combined text/javascript;charset=windows-1252;" \" x/x
-FAIL separate x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: Reached unreachable code
-FAIL combined x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: Reached unreachable code
+FAIL separate x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: onerror Reached unreachable code
+FAIL combined x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: onerror Reached unreachable code
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png b/third_party/blink/web_tests/platform/mac/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
index 1c9bc73..d930e7b6 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png
deleted file mode 100644
index 51db7277..0000000
--- a/third_party/blink/web_tests/platform/mac/fast/css/only-child-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10269-2-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10269-2-expected.png
index f350d46..0c8c4015 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10269-2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10269-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10296-1-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10296-1-expected.png
index 8862770..26b3ba2 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10296-1-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug10296-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug2479-4-expected.png
index 08d0fee..b2e44b7b 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug2479-4-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla/other/cell_widths-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla/other/cell_widths-expected.png
index 884603fb..c2f5f77 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla/other/cell_widths-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla/other/cell_widths-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla/other/wa_table_thtd_rowspan-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
index 73433b8..aaee46a0 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla/other/wa_table_thtd_rowspan-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.png
index bfcf9009..5ef8510 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug10140-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug91057-expected.png
index f497684..244d490 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug91057-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/bugs/bug91057-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/core/captions3-expected.png b/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/core/captions3-expected.png
index 9443a6c..3c0346e 100644
--- a/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/core/captions3-expected.png
+++ b/third_party/blink/web_tests/platform/mac/tables/mozilla_expected_failures/core/captions3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png b/third_party/blink/web_tests/platform/win/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
index c3269103..b1de178a 100644
--- a/third_party/blink/web_tests/platform/win/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
+++ b/third_party/blink/web_tests/platform/win/external/wpt/css/CSS2/backgrounds/background-attachment-004-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/css/only-child-pseudo-class-expected.png b/third_party/blink/web_tests/platform/win/fast/css/only-child-pseudo-class-expected.png
deleted file mode 100644
index 4b8719d..0000000
--- a/third_party/blink/web_tests/platform/win/fast/css/only-child-pseudo-class-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug10269-2-expected.png b/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug10269-2-expected.png
index 4c5cb4e..9fb5048 100644
--- a/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug10269-2-expected.png
+++ b/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug10269-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug2479-4-expected.png b/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug2479-4-expected.png
index 5d65496d..acfc251 100644
--- a/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug2479-4-expected.png
+++ b/third_party/blink/web_tests/platform/win/tables/mozilla/bugs/bug2479-4-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/tables/mozilla/other/cell_widths-expected.png b/third_party/blink/web_tests/platform/win/tables/mozilla/other/cell_widths-expected.png
index 8cbc199f..fd751f9 100644
--- a/third_party/blink/web_tests/platform/win/tables/mozilla/other/cell_widths-expected.png
+++ b/third_party/blink/web_tests/platform/win/tables/mozilla/other/cell_widths-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug10140-expected.png b/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug10140-expected.png
index 4c7a883..01cf120 100644
--- a/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug10140-expected.png
+++ b/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug10140-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug91057-expected.png b/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug91057-expected.png
index bc85f8a..46e2e58 100644
--- a/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug91057-expected.png
+++ b/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/bugs/bug91057-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/core/captions3-expected.png b/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/core/captions3-expected.png
index 2330ac3..32f9fad 100644
--- a/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/core/captions3-expected.png
+++ b/third_party/blink/web_tests/platform/win/tables/mozilla_expected_failures/core/captions3-expected.png
Binary files differ
diff --git a/third_party/closure_compiler/externs/file_manager_private.js b/third_party/closure_compiler/externs/file_manager_private.js
index cc4412ef..15c9ae6 100644
--- a/third_party/closure_compiler/externs/file_manager_private.js
+++ b/third_party/closure_compiler/externs/file_manager_private.js
@@ -89,9 +89,9 @@
   ERROR_UNKNOWN_FILESYSTEM: 'error_unknown_filesystem',
   ERROR_UNSUPPORTED_FILESYSTEM: 'error_unsupported_filesystem',
   ERROR_INVALID_ARCHIVE: 'error_invalid_archive',
-  ERROR_AUTHENTICATION: 'error_authentication',
-  ERROR_PATH_UNMOUNTED: 'error_path_unmounted',
   ERROR_NEED_PASSWORD: 'error_need_password',
+  ERROR_IN_PROGRESS: 'error_in_progress',
+  ERROR_CANCELLED: 'error_cancelled',
 };
 
 /** @enum {string} */
diff --git a/third_party/google_input_tools/DIR_METADATA b/third_party/google_input_tools/DIR_METADATA
index ca0e79f..caac77f 100644
--- a/third_party/google_input_tools/DIR_METADATA
+++ b/third_party/google_input_tools/DIR_METADATA
@@ -1,3 +1 @@
-monorail: {
-  component: "OS>Inputs"
-}
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/third_party/material_web_components/BUILD.gn b/third_party/material_web_components/BUILD.gn
index 151ba66..3543bca 100644
--- a/third_party/material_web_components/BUILD.gn
+++ b/third_party/material_web_components/BUILD.gn
@@ -5,9 +5,11 @@
 import("//tools/typescript/ts_library.gni")
 import("//ui/webui/resources/tools/generate_grd.gni")
 
+# This file is generated by //third_party/material_web_components/reproduce.sh
+
 generate_grd("build_grdp") {
   grd_prefix = "material_web_components"
-  out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp"
+  out_grd = "${target_gen_dir}/${grd_prefix}_resources.grdp"
 
   # TODO(b/229804752): Clean up and find the minimal set of necessary resources.
   input_files = [
@@ -106,7 +108,7 @@
     "@material/mwc-icon/mwc-icon.js",
   ]
 
-  input_files_base_dir = rebase_path("./components-chromium/node_modules", "//")
+  input_files_base_dir = rebase_path("components-chromium/node_modules", "//")
   resource_path_prefix = "mwc"
 }
 
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/animation/index.js b/third_party/material_web_components/components-chromium/node_modules/@material/animation/index.js
index 55d3d225..e90fc75 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/animation/index.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/animation/index.js
@@ -23,5 +23,5 @@
 import * as util from './util.js';
 export { util }; // New namespace
 export * from './animationframe.js';
-export * from './util'; // Old namespace for backward compatibility
+export * from './util.js'; // Old namespace for backward compatibility
 //# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/animation/node_modules/tslib/modules/index.js b/third_party/material_web_components/components-chromium/node_modules/@material/animation/node_modules/tslib/modules/index.js
index c2b61498..506f5cc4 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/animation/node_modules/tslib/modules/index.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/animation/node_modules/tslib/modules/index.js
@@ -1,4 +1,4 @@
-import tslib from '../tslib.js';
+import tslib from '../tslib.es6.js';
 const {
     __extends,
     __assign,
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/base/component.js b/third_party/material_web_components/components-chromium/node_modules/@material/base/component.js
index c3861b5..da67746 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/base/component.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/base/component.js
@@ -20,7 +20,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-import { __read, __spread } from "./node_modules/tslib/tslib.es6.js";
+import { __read, __spread } from './node_modules/tslib/tslib.es6.js';
 import { MDCFoundation } from './foundation.js';
 var MDCComponent = /** @class */ (function () {
     function MDCComponent(root, foundation) {
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/base/node_modules/tslib/modules/index.js b/third_party/material_web_components/components-chromium/node_modules/@material/base/node_modules/tslib/modules/index.js
index c2b61498..506f5cc4 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/base/node_modules/tslib/modules/index.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/base/node_modules/tslib/modules/index.js
@@ -1,4 +1,4 @@
-import tslib from '../tslib.js';
+import tslib from '../tslib.es6.js';
 const {
     __extends,
     __assign,
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/dom/node_modules/tslib/modules/index.js b/third_party/material_web_components/components-chromium/node_modules/@material/dom/node_modules/tslib/modules/index.js
index c2b61498..506f5cc4 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/dom/node_modules/tslib/modules/index.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/dom/node_modules/tslib/modules/index.js
@@ -1,4 +1,4 @@
-import tslib from '../tslib.js';
+import tslib from '../tslib.es6.js';
 const {
     __extends,
     __assign,
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button-base.js b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button-base.js
index 169aa11..2828ed7 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button-base.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button-base.js
@@ -1,4 +1,4 @@
-import { __decorate } from "../../tslib/tslib.es6.js";
+import { __decorate } from '../../tslib/tslib.es6.js';
 /**
 @license
 Copyright 2019 Google Inc. All Rights Reserved.
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button.js b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button.js
index 952954ce..29a028a 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-button/mwc-button.js
@@ -1,4 +1,4 @@
-import { __decorate } from "../../tslib/tslib.es6.js";
+import { __decorate } from '../../tslib/tslib.es6.js';
 /**
 @license
 Copyright 2018 Google Inc. All Rights Reserved.
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-icon/mwc-icon.js b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-icon/mwc-icon.js
index 711c4876..443edbb 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-icon/mwc-icon.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-icon/mwc-icon.js
@@ -1,4 +1,4 @@
-import { __decorate } from "../../tslib/tslib.es6.js";
+import { __decorate } from '../../tslib/tslib.es6.js';
 /**
 @license
 Copyright 2018 Google Inc. All Rights Reserved.
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple-base.js b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple-base.js
index 0bd646a..7f2d789 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple-base.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple-base.js
@@ -1,4 +1,4 @@
-import { __decorate } from "../../tslib/tslib.es6.js";
+import { __decorate } from '../../tslib/tslib.es6.js';
 /**
 @license
 Copyright 2018 Google Inc. All Rights Reserved.
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple.js b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple.js
index a24e42a..9c8c822 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/mwc-ripple/mwc-ripple.js
@@ -1,4 +1,4 @@
-import { __decorate } from "../../tslib/tslib.es6.js";
+import { __decorate } from '../../tslib/tslib.es6.js';
 /**
 @license
 Copyright 2018 Google Inc. All Rights Reserved.
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/ripple/component.js b/third_party/material_web_components/components-chromium/node_modules/@material/ripple/component.js
index 01cf217..50ab60e 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/ripple/component.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/ripple/component.js
@@ -20,7 +20,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-import { __extends } from "./node_modules/tslib/tslib.es6.js";
+import { __extends } from './node_modules/tslib/tslib.es6.js';
 import { MDCComponent } from '../base/component.js';
 import { applyPassive } from '../dom/events.js';
 import { matches } from '../dom/ponyfill.js';
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/ripple/foundation.js b/third_party/material_web_components/components-chromium/node_modules/@material/ripple/foundation.js
index 83df664..6a0daf8 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/ripple/foundation.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/ripple/foundation.js
@@ -20,7 +20,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-import { __assign, __extends } from "./node_modules/tslib/tslib.es6.js";
+import { __assign, __extends } from './node_modules/tslib/tslib.es6.js';
 import { MDCFoundation } from '../base/foundation.js';
 import { cssClasses, numbers, strings } from './constants.js';
 import { getNormalizedEventCoords } from './util.js';
diff --git a/third_party/material_web_components/components-chromium/node_modules/@material/ripple/node_modules/tslib/modules/index.js b/third_party/material_web_components/components-chromium/node_modules/@material/ripple/node_modules/tslib/modules/index.js
index c2b61498..506f5cc4 100644
--- a/third_party/material_web_components/components-chromium/node_modules/@material/ripple/node_modules/tslib/modules/index.js
+++ b/third_party/material_web_components/components-chromium/node_modules/@material/ripple/node_modules/tslib/modules/index.js
@@ -1,4 +1,4 @@
-import tslib from '../tslib.js';
+import tslib from '../tslib.es6.js';
 const {
     __extends,
     __assign,
diff --git a/third_party/material_web_components/components-chromium/node_modules/tslib/modules/index.js b/third_party/material_web_components/components-chromium/node_modules/tslib/modules/index.js
index 75a89c59..23d00c56 100644
--- a/third_party/material_web_components/components-chromium/node_modules/tslib/modules/index.js
+++ b/third_party/material_web_components/components-chromium/node_modules/tslib/modules/index.js
@@ -1,4 +1,4 @@
-import tslib from '../tslib.js';
+import tslib from '../tslib.es6.js';
 const {
     __extends,
     __assign,
diff --git a/third_party/material_web_components/package-lock.json b/third_party/material_web_components/package-lock.json
index 3db12c4a..b50426b 100644
--- a/third_party/material_web_components/package-lock.json
+++ b/third_party/material_web_components/package-lock.json
@@ -10,7 +10,11 @@
       "dependencies": {
         "@material/mwc-button": "0.20.0"
       },
-      "devDependencies": {}
+      "devDependencies": {
+        "acorn": "6.4.2",
+        "argparse": "2.0.1",
+        "resolve": "1.22.0"
+      }
     },
     "node_modules/@material/animation": {
       "version": "9.0.0-canary.1c156d69d.0",
@@ -128,6 +132,55 @@
         "@material/feature-targeting": "9.0.0-canary.1c156d69d.0"
       }
     },
+    "node_modules/acorn": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true,
+      "license": "Python-2.0"
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+      "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/lit-element": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.4.0.tgz",
@@ -141,6 +194,42 @@
       "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.3.0.tgz",
       "integrity": "sha512-0Q1bwmaFH9O14vycPHw8C/IeHMk/uSDldVLIefu/kfbTBGIc44KGH6A8p1bDfxUfHdc8q6Ct7kQklWoHgr4t1Q=="
     },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "node_modules/resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/tslib": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
@@ -272,6 +361,42 @@
         "@material/feature-targeting": "9.0.0-canary.1c156d69d.0"
       }
     },
+    "acorn": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+      "dev": true
+    },
+    "argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "is-core-module": {
+      "version": "2.9.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+      "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
     "lit-element": {
       "version": "2.4.0",
       "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.4.0.tgz",
@@ -285,6 +410,29 @@
       "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.3.0.tgz",
       "integrity": "sha512-0Q1bwmaFH9O14vycPHw8C/IeHMk/uSDldVLIefu/kfbTBGIc44KGH6A8p1bDfxUfHdc8q6Ct7kQklWoHgr4t1Q=="
     },
+    "path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.22.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
+      "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.8.1",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      }
+    },
+    "supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "dev": true
+    },
     "tslib": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
diff --git a/third_party/material_web_components/package.json b/third_party/material_web_components/package.json
index 5dc308a9..e30f814 100644
--- a/third_party/material_web_components/package.json
+++ b/third_party/material_web_components/package.json
@@ -5,5 +5,9 @@
   "dependencies": {
     "@material/mwc-button": "0.20.0"
   },
-  "devDependencies": {}
+  "devDependencies": {
+    "acorn": "6.4.2",
+    "argparse": "2.0.1",
+    "resolve": "1.22.0"
+  }
 }
diff --git a/third_party/material_web_components/reproduce.sh b/third_party/material_web_components/reproduce.sh
index b6cb6727..297a2e7 100755
--- a/third_party/material_web_components/reproduce.sh
+++ b/third_party/material_web_components/reproduce.sh
@@ -21,21 +21,6 @@
 check_dep "which rsync" "rsync" "installing rsync"
 check_dep "which egrep" "egrep" "installing egrep"
 
-INSTALLED_PACKAGES=`npm ls -g`
-
-check_npm_dep() {
-  echo "$INSTALLED_PACKAGES" | grep " $1@" > /dev/null
-  if [ $? -ne 0 ]; then
-    echo >&2 "This script requires $1."
-    echo >&2 "Have you tried sudo npm install -g $1?"
-    echo >&2 "You will also need to set your NODE_PATH"
-    exit 1
-  fi
-}
-
-check_npm_dep "resolve"
-check_npm_dep "argparse"
-
 pushd "$(dirname "$0")" > /dev/null
 
 rm -rf node_modules
@@ -43,14 +28,15 @@
 npm install --only=prod
 
 rsync -c --delete --delete-excluded -r -v --prune-empty-dirs \
-    --include-from="rsync_include.txt" \
     --exclude-from="rsync_exclude.txt" \
     "node_modules/" \
     "components-chromium/node_modules/"
 
+npm install
+
 # Resolve imports as relative paths so we can load them in chrome://resources/.
 find components-chromium/ \
-   \( -name "*.js"  \) \
+   \( -name "*.js"  \) -type f \
    -exec node resolve_imports.js {} +
 
 new=$(git status --porcelain components-chromium | grep '^??' | \
@@ -75,4 +61,45 @@
   echo
 fi
 
+cat > BUILD.gn << EOF
+# Copyright 2022 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("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+# This file is generated by //third_party/material_web_components/reproduce.sh
+
+generate_grd("build_grdp") {
+  grd_prefix = "material_web_components"
+  out_grd = "\${target_gen_dir}/\${grd_prefix}_resources.grdp"
+
+  # TODO(b/229804752): Clean up and find the minimal set of necessary resources.
+  input_files = [
+EOF
+for x in `find components-chromium/node_modules  | grep js$ | cut -f3- -d/`; do
+  echo "    \"$x\"," >> BUILD.gn
+done
+cat >> BUILD.gn << EOF
+  ]
+
+  input_files_base_dir = rebase_path("components-chromium/node_modules", "//")
+  resource_path_prefix = "mwc"
+}
+
+ts_library("library") {
+  composite = true
+  tsconfig_base = "tsconfig_base.json"
+
+  # TODO(b/229804752): Clean up and find the minimal set of necessary resources.
+  definitions = [
+EOF
+for x in `find components-chromium/node_modules -type f  | grep d.ts$`; do
+  echo "    \"$x\"," >> BUILD.gn
+done
+cat >> BUILD.gn << EOF
+  ]
+}
+EOF
 popd > /dev/null
diff --git a/third_party/material_web_components/resolve_imports.js b/third_party/material_web_components/resolve_imports.js
index b60cefc..c1e93f86 100644
--- a/third_party/material_web_components/resolve_imports.js
+++ b/third_party/material_web_components/resolve_imports.js
@@ -12,40 +12,61 @@
 const resolve = require('resolve');
 const fs = require('fs');
 const { ArgumentParser } = require('argparse');
+const acorn = require('acorn')
 
 const parser = new ArgumentParser();
 parser.add_argument('--basedir');
 parser.add_argument('files', { nargs: '+' })
 const args = parser.parse_args();
 const inputFiles = args.files;
+
 for (const inputFile of inputFiles) {
   const inputDir = path.dirname(inputFile);
-  const data =
-      fs.readFileSync(inputFile, {encoding: 'utf8'}).split('\n');
+  const data = fs.readFileSync(inputFile, {encoding: 'utf8'})
+  const ast = acorn.parse(data, {sourceType: 'module'});
 
-  // Investigate JS parsing if this is insufficient.
-  const importRegex = /^((?:export [*{]|import ).*["'])(.*)(["'];)$/;
-  const output = [];
+  const NODE_TYPES_TO_RESOLVE = [
+    'ImportDeclaration',
+    'ExportAllDeclaration',
+    'ExportNamedDeclaration',
+  ];
 
-  for (let line of data) {
-    const match = line.match(importRegex);
-    if (match) {
-      const importPath = match[2];
-      let resolved = resolve.sync(importPath, {basedir: args.basedir || inputDir});
-      resolved = path.relative(inputDir, resolved);
-
-      // Resolves to the module version of tslib since resolve.sync only
-      // parses to the "main" field in the package.json.
-      resolved = resolved.replace('tslib.js', 'tslib.es6.js');
-
-      if (!resolved.startsWith('.')) {
-        resolved = './' + resolved;
-      }
-
-      line = line.replace(importRegex, `$1${resolved}$3`);
+  const resolveNodes =
+      ast.body.filter(n => NODE_TYPES_TO_RESOLVE.includes(n.type));
+  const replacements = [];
+  for (let i of resolveNodes) {
+    const source = i.source;
+    if (!source) {
+      continue;
     }
-    output.push(line);
+
+    let resolved =
+        resolve.sync(source.value, {basedir: args.basedir || inputDir});
+    resolved = path.relative(inputDir, resolved);
+
+    // Special handling for tslib since resolve.sync only resolves to the "main"
+    // field in the package.json, and we need the ES6 version.
+    resolved = resolved.replace('tslib.js', 'tslib.es6.js');
+
+    if (!resolved.startsWith('.')) {
+      resolved = './' + resolved;
+    }
+
+    replacements.push({
+      start: source.start,
+      end: source.end,
+      original: source.raw,
+      replacement: `'${resolved}'`,
+    });
   }
 
-  fs.writeFileSync(inputFile, output.join('\n'));
+  const output = [];
+  let curr = 0;
+  for (const r of replacements) {
+    output.push(data.substring(curr, r.start));
+    output.push(r.replacement);
+    curr = r.end;
+  }
+  output.push(data.substring(curr, data.length));
+  fs.writeFileSync(inputFile, output.join(''));
 }
diff --git a/third_party/material_web_components/rsync_exclude.txt b/third_party/material_web_components/rsync_exclude.txt
index d79ea41e..f1806bd 100644
--- a/third_party/material_web_components/rsync_exclude.txt
+++ b/third_party/material_web_components/rsync_exclude.txt
@@ -2,10 +2,16 @@
 *.js.map
 *.d.ts.map
 *.css.map
-*.ts
 *.scss
 manifest.json
 *.md
 .npmignore
 */test/
 */tests/
+
+# Dev Dependencies
+acorn/
+argparse/
+
+# lit-html
+lit-html/src/directives
diff --git a/third_party/material_web_components/rsync_include.txt b/third_party/material_web_components/rsync_include.txt
deleted file mode 100644
index cd4efd8..0000000
--- a/third_party/material_web_components/rsync_include.txt
+++ /dev/null
@@ -1 +0,0 @@
-*.d.ts
diff --git a/third_party/wayland-protocols/BUILD.gn b/third_party/wayland-protocols/BUILD.gn
index b268d0d1fb..e54c4fa 100644
--- a/third_party/wayland-protocols/BUILD.gn
+++ b/third_party/wayland-protocols/BUILD.gn
@@ -104,6 +104,10 @@
   sources = [ "unstable/keyboard/keyboard-extension-unstable-v1.xml" ]
 }
 
+wayland_protocol("keyboard_shortcuts_inhibit_protocol") {
+  sources = [ "src/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml" ]
+}
+
 wayland_protocol("input_timestamps_protocol") {
   sources = [ "src/unstable/input-timestamps/input-timestamps-unstable-v1.xml" ]
 }
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 89d656f..3020034 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -36,7 +36,7 @@
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
 CLANG_REVISION = 'llvmorg-15-init-9576-g75f9e83a'
-CLANG_SUB_REVISION = 1
+CLANG_SUB_REVISION = 2
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
 RELEASE_VERSION = '15.0.0'
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d366b12..24a2f9f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -19428,24 +19428,46 @@
 </enum>
 
 <enum name="CrosDisksClientMountError">
-  <int value="0" label="Success"/>
-  <int value="1" label="Unknown"/>
-  <int value="2" label="Internal"/>
-  <int value="3" label="Invalid argument"/>
-  <int value="4" label="Invalid path"/>
-  <int value="5" label="Path already mounted"/>
-  <int value="6" label="Path not mounted"/>
-  <int value="7" label="Directory creation failed"/>
-  <int value="8" label="Invalid mount options"/>
-  <int value="9" label="Invalid unmount options"/>
-  <int value="10" label="Insufficient permissions"/>
-  <int value="11" label="Mount program not found"/>
-  <int value="12" label="Mount program failed"/>
-  <int value="13" label="Invalid device path"/>
-  <int value="14" label="Unknown filesystem"/>
-  <int value="15" label="Unsupported filesystem"/>
-  <int value="16" label="Invalid archive"/>
-  <int value="17" label="Need password"/>
+  <int value="0" label="Success">MOUNT_ERROR_NONE</int>
+  <int value="1" label="Unknown">MOUNT_ERROR_UNKNOWN</int>
+  <int value="2" label="Internal">MOUNT_ERROR_INTERNAL</int>
+  <int value="3" label="Invalid argument">MOUNT_ERROR_INVALID_ARGUMENT</int>
+  <int value="4" label="Invalid path">MOUNT_ERROR_INVALID_PATH</int>
+  <int value="5" label="Path already mounted">
+    MOUNT_ERROR_PATH_ALREADY_MOUNTED
+  </int>
+  <int value="6" label="Path not mounted">MOUNT_ERROR_PATH_NOT_MOUNTED</int>
+  <int value="7" label="Directory creation failed">
+    MOUNT_ERROR_DIRECTORY_CREATION_FAILED
+  </int>
+  <int value="8" label="Invalid mount options">
+    MOUNT_ERROR_INVALID_MOUNT_OPTIONS
+  </int>
+  <int value="9" label="Invalid unmount options">
+    MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS
+  </int>
+  <int value="10" label="Insufficient permissions">
+    MOUNT_ERROR_INSUFFICIENT_PERMISSIONS
+  </int>
+  <int value="11" label="Mount program not found">
+    MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND
+  </int>
+  <int value="12" label="Mount program failed">
+    MOUNT_ERROR_MOUNT_PROGRAM_FAILED
+  </int>
+  <int value="13" label="Invalid device path">
+    MOUNT_ERROR_INVALID_DEVICE_PATH
+  </int>
+  <int value="14" label="Unknown filesystem">
+    MOUNT_ERROR_UNKNOWN_FILESYSTEM
+  </int>
+  <int value="15" label="Unsupported filesystem">
+    MOUNT_ERROR_UNSUPPORTED_FILESYSTEM
+  </int>
+  <int value="16" label="Invalid archive">MOUNT_ERROR_INVALID_ARCHIVE</int>
+  <int value="17" label="Need password">MOUNT_ERROR_NEED_PASSWORD</int>
+  <int value="18" label="In progress">MOUNT_ERROR_IN_PROGRESS</int>
+  <int value="19" label="Cancelled">MOUNT_ERROR_CANCELLED</int>
 </enum>
 
 <enum name="CrosDisksDeviceMediaType">
@@ -19472,75 +19494,246 @@
 </enum>
 
 <enum name="CrosDisksMountTypeError">
-  <int value="0" label="Invalid - Success"/>
-  <int value="1" label="Invalid - Unknown"/>
-  <int value="2" label="Invalid - Internal"/>
-  <int value="3" label="Invalid - Invalid argument"/>
-  <int value="4" label="Invalid - Invalid path"/>
-  <int value="5" label="Invalid - Path already mounted"/>
-  <int value="6" label="Invalid - Path not mounted"/>
-  <int value="7" label="Invalid - Directory creation failed"/>
-  <int value="8" label="Invalid - Invalid mount options"/>
-  <int value="9" label="Invalid - Invalid unmount options"/>
-  <int value="10" label="Invalid - Insufficient permissions"/>
-  <int value="11" label="Invalid - Mount program not found"/>
-  <int value="12" label="Invalid - Mount program failed"/>
-  <int value="13" label="Invalid - Invalid device path"/>
-  <int value="14" label="Invalid - Unknown filesystem"/>
-  <int value="15" label="Invalid - Unsupported filesystem"/>
-  <int value="16" label="Invalid - Invalid archive"/>
-  <int value="100" label="Device - Success"/>
-  <int value="101" label="Device - Unknown"/>
-  <int value="102" label="Device - Internal"/>
-  <int value="103" label="Device - Invalid argument"/>
-  <int value="104" label="Device - Invalid path"/>
-  <int value="105" label="Device - Path already mounted"/>
-  <int value="106" label="Device - Path not mounted"/>
-  <int value="107" label="Device - Directory creation failed"/>
-  <int value="108" label="Device - Invalid mount options"/>
-  <int value="109" label="Device - Invalid unmount options"/>
-  <int value="110" label="Device - Insufficient permissions"/>
-  <int value="111" label="Device - Mount program not found"/>
-  <int value="112" label="Device - Mount program failed"/>
-  <int value="113" label="Device - Invalid device path"/>
-  <int value="114" label="Device - Unknown filesystem"/>
-  <int value="115" label="Device - Unsupported filesystem"/>
-  <int value="116" label="Device - Invalid archive"/>
-  <int value="200" label="Archive - Success"/>
-  <int value="201" label="Archive - Unknown"/>
-  <int value="202" label="Archive - Internal"/>
-  <int value="203" label="Archive - Invalid argument"/>
-  <int value="204" label="Archive - Invalid path"/>
-  <int value="205" label="Archive - Path already mounted"/>
-  <int value="206" label="Archive - Path not mounted"/>
-  <int value="207" label="Archive - Directory creation failed"/>
-  <int value="208" label="Archive - Invalid mount options"/>
-  <int value="209" label="Archive - Invalid unmount options"/>
-  <int value="210" label="Archive - Insufficient permissions"/>
-  <int value="211" label="Archive - Mount program not found"/>
-  <int value="212" label="Archive - Mount program failed"/>
-  <int value="213" label="Archive - Invalid device path"/>
-  <int value="214" label="Archive - Unknown filesystem"/>
-  <int value="215" label="Archive - Unsupported filesystem"/>
-  <int value="216" label="Archive - Invalid archive"/>
-  <int value="217" label="Archive - Need password"/>
-  <int value="300" label="Network - Success"/>
-  <int value="301" label="Network - Unknown"/>
-  <int value="302" label="Network - Internal"/>
-  <int value="303" label="Network - Invalid argument"/>
-  <int value="304" label="Network - Invalid path"/>
-  <int value="305" label="Network - Path already mounted"/>
-  <int value="306" label="Network - Path not mounted"/>
-  <int value="307" label="Network - Directory creation failed"/>
-  <int value="308" label="Network - Invalid mount options"/>
-  <int value="309" label="Network - Invalid unmount options"/>
-  <int value="310" label="Network - Insufficient permissions"/>
-  <int value="311" label="Network - Mount program not found"/>
-  <int value="312" label="Network - Mount program failed"/>
-  <int value="313" label="Network - Invalid device path"/>
-  <int value="314" label="Network - Unknown filesystem"/>
-  <int value="315" label="Network - Unsupported filesystem"/>
-  <int value="316" label="Network - Invalid archive"/>
+  <int value="0" label="Invalid - Success">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_NONE
+  </int>
+  <int value="1" label="Invalid - Unknown">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_UNKNOWN
+  </int>
+  <int value="2" label="Invalid - Internal">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INTERNAL
+  </int>
+  <int value="3" label="Invalid - Invalid argument">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INVALID_ARGUMENT
+  </int>
+  <int value="4" label="Invalid - Invalid path">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INVALID_PATH
+  </int>
+  <int value="5" label="Invalid - Path already mounted">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_PATH_ALREADY_MOUNTED
+  </int>
+  <int value="6" label="Invalid - Path not mounted">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_PATH_NOT_MOUNTED
+  </int>
+  <int value="7" label="Invalid - Directory creation failed">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_DIRECTORY_CREATION_FAILED
+  </int>
+  <int value="8" label="Invalid - Invalid mount options">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INVALID_MOUNT_OPTIONS
+  </int>
+  <int value="9" label="Invalid - Invalid unmount options">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS
+  </int>
+  <int value="10" label="Invalid - Insufficient permissions">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INSUFFICIENT_PERMISSIONS
+  </int>
+  <int value="11" label="Invalid - Mount program not found">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND
+  </int>
+  <int value="12" label="Invalid - Mount program failed">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_MOUNT_PROGRAM_FAILED
+  </int>
+  <int value="13" label="Invalid - Invalid device path">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INVALID_DEVICE_PATH
+  </int>
+  <int value="14" label="Invalid - Unknown filesystem">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_UNKNOWN_FILESYSTEM
+  </int>
+  <int value="15" label="Invalid - Unsupported filesystem">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_UNSUPPORTED_FILESYSTEM
+  </int>
+  <int value="16" label="Invalid - Invalid archive">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_INVALID_ARCHIVE
+  </int>
+  <int value="17" label="Invalid - Need password">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_NEED_PASSWORD
+  </int>
+  <int value="18" label="Invalid - In progress">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_IN_PROGRESS
+  </int>
+  <int value="19" label="Invalid - Cancelled">
+    100 * MOUNT_TYPE_INVALID + MOUNT_ERROR_CANCELLED
+  </int>
+  <int value="100" label="Device - Success">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_NONE
+  </int>
+  <int value="101" label="Device - Unknown">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_UNKNOWN
+  </int>
+  <int value="102" label="Device - Internal">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INTERNAL
+  </int>
+  <int value="103" label="Device - Invalid argument">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INVALID_ARGUMENT
+  </int>
+  <int value="104" label="Device - Invalid path">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INVALID_PATH
+  </int>
+  <int value="105" label="Device - Path already mounted">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_PATH_ALREADY_MOUNTED
+  </int>
+  <int value="106" label="Device - Path not mounted">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_PATH_NOT_MOUNTED
+  </int>
+  <int value="107" label="Device - Directory creation failed">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_DIRECTORY_CREATION_FAILED
+  </int>
+  <int value="108" label="Device - Invalid mount options">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INVALID_MOUNT_OPTIONS
+  </int>
+  <int value="109" label="Device - Invalid unmount options">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS
+  </int>
+  <int value="110" label="Device - Insufficient permissions">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INSUFFICIENT_PERMISSIONS
+  </int>
+  <int value="111" label="Device - Mount program not found">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND
+  </int>
+  <int value="112" label="Device - Mount program failed">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_MOUNT_PROGRAM_FAILED
+  </int>
+  <int value="113" label="Device - Invalid device path">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INVALID_DEVICE_PATH
+  </int>
+  <int value="114" label="Device - Unknown filesystem">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_UNKNOWN_FILESYSTEM
+  </int>
+  <int value="115" label="Device - Unsupported filesystem">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_UNSUPPORTED_FILESYSTEM
+  </int>
+  <int value="116" label="Device - Invalid archive">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_INVALID_ARCHIVE
+  </int>
+  <int value="117" label="Device - Needs password">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_NEED_PASSWORD
+  </int>
+  <int value="118" label="Device - In progress">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_IN_PROGRESS
+  </int>
+  <int value="119" label="Device - Cancelled">
+    100 * MOUNT_TYPE_DEVICE + MOUNT_ERROR_CANCELLED
+  </int>
+  <int value="200" label="Archive - Success">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_NONE
+  </int>
+  <int value="201" label="Archive - Unknown">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_UNKNOWN
+  </int>
+  <int value="202" label="Archive - Internal">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INTERNAL
+  </int>
+  <int value="203" label="Archive - Invalid argument">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INVALID_ARGUMENT
+  </int>
+  <int value="204" label="Archive - Invalid path">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INVALID_PATH
+  </int>
+  <int value="205" label="Archive - Path already mounted">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_PATH_ALREADY_MOUNTED
+  </int>
+  <int value="206" label="Archive - Path not mounted">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_PATH_NOT_MOUNTED
+  </int>
+  <int value="207" label="Archive - Directory creation failed">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_DIRECTORY_CREATION_FAILED
+  </int>
+  <int value="208" label="Archive - Invalid mount options">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INVALID_MOUNT_OPTIONS
+  </int>
+  <int value="209" label="Archive - Invalid unmount options">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS
+  </int>
+  <int value="210" label="Archive - Insufficient permissions">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INSUFFICIENT_PERMISSIONS
+  </int>
+  <int value="211" label="Archive - Mount program not found">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND
+  </int>
+  <int value="212" label="Archive - Mount program failed">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_MOUNT_PROGRAM_FAILED
+  </int>
+  <int value="213" label="Archive - Invalid device path">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INVALID_DEVICE_PATH
+  </int>
+  <int value="214" label="Archive - Unknown filesystem">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_UNKNOWN_FILESYSTEM
+  </int>
+  <int value="215" label="Archive - Unsupported filesystem">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_UNSUPPORTED_FILESYSTEM
+  </int>
+  <int value="216" label="Archive - Invalid archive">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_INVALID_ARCHIVE
+  </int>
+  <int value="217" label="Archive - Need password">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_NEED_PASSWORD
+  </int>
+  <int value="218" label="Archive - In progress">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_IN_PROGRESS
+  </int>
+  <int value="219" label="Archive - Cancelled">
+    100 * MOUNT_TYPE_ARCHIVE + MOUNT_ERROR_CANCELLED
+  </int>
+  <int value="300" label="Network - Success">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_NONE
+  </int>
+  <int value="301" label="Network - Unknown">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_UNKNOWN
+  </int>
+  <int value="302" label="Network - Internal">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INTERNAL
+  </int>
+  <int value="303" label="Network - Invalid argument">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INVALID_ARGUMENT
+  </int>
+  <int value="304" label="Network - Invalid path">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INVALID_PATH
+  </int>
+  <int value="305" label="Network - Path already mounted">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_PATH_ALREADY_MOUNTED
+  </int>
+  <int value="306" label="Network - Path not mounted">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_PATH_NOT_MOUNTED
+  </int>
+  <int value="307" label="Network - Directory creation failed">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_DIRECTORY_CREATION_FAILED
+  </int>
+  <int value="308" label="Network - Invalid mount options">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INVALID_MOUNT_OPTIONS
+  </int>
+  <int value="309" label="Network - Invalid unmount options">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS
+  </int>
+  <int value="310" label="Network - Insufficient permissions">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INSUFFICIENT_PERMISSIONS
+  </int>
+  <int value="311" label="Network - Mount program not found">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_MOUNT_PROGRAM_NOT_FOUND
+  </int>
+  <int value="312" label="Network - Mount program failed">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_MOUNT_PROGRAM_FAILED
+  </int>
+  <int value="313" label="Network - Invalid device path">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INVALID_DEVICE_PATH
+  </int>
+  <int value="314" label="Network - Unknown filesystem">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_UNKNOWN_FILESYSTEM
+  </int>
+  <int value="315" label="Network - Unsupported filesystem">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_UNSUPPORTED_FILESYSTEM
+  </int>
+  <int value="316" label="Network - Invalid archive">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_INVALID_ARCHIVE
+  </int>
+  <int value="317" label="Network - Needs password">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_NEED_PASSWORD
+  </int>
+  <int value="318" label="Network - In progress">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_IN_PROGRESS
+  </int>
+  <int value="319" label="Network - Cancelled">
+    100 * MOUNT_TYPE_NETWORK_STORAGE + MOUNT_ERROR_CANCELLED
+  </int>
 </enum>
 
 <enum name="CrosEnableDriveOfflineOutcome">
@@ -31055,7 +31248,7 @@
   <int value="193" label="ALARMS_CLEAR"/>
   <int value="194" label="SYNCFILESYSTEM_GETFILESYNCSTATUS"/>
   <int value="195" label="SOCKET_GETINFO"/>
-  <int value="196" label="WEBSTOREPRIVATE_INSTALLBUNDLE"/>
+  <int value="196" label="DELETED_WEBSTOREPRIVATE_INSTALLBUNDLE"/>
   <int value="197" label="BROWSERACTION_ENABLE"/>
   <int value="198" label="METRICSPRIVATE_RECORDMEDIUMTIME"/>
   <int value="199" label="PAGEACTION_SETTITLE"/>
@@ -32567,6 +32760,7 @@
   <int value="1651" label="ENTERPRISEREPORTINGPRIVATE_ENQUEUERECORD"/>
   <int value="1652" label="FILEMANAGERPRIVATE_SENDFEEDBACK"/>
   <int value="1653" label="DECLARATIVENETREQUEST_TESTMATCHOUTCOME"/>
+  <int value="1654" label="FILEMANAGERPRIVATE_CANCELMOUNTING"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -35598,7 +35792,7 @@
   <int value="1783" label="HTMLTableCellElementColspan"/>
   <int value="1784" label="HTMLTableCellElementColspanGreaterThan1000"/>
   <int value="1785" label="HTMLTableCellElementColspanGreaterThan8190"/>
-  <int value="1786" label="SelectionAddRangeIntersect"/>
+  <int value="1786" label="OBSOLETE_SelectionAddRangeIntersect"/>
   <int value="1787" label="PostMessageFromInsecureToSecureToplevel"/>
   <int value="1788" label="V8MediaSession_Metadata_AttributeGetter"/>
   <int value="1789" label="V8MediaSession_Metadata_AttributeSetter"/>
@@ -52942,6 +53136,7 @@
   <int value="-1827599944" label="QueryTilesLocalOrdering:enabled"/>
   <int value="-1826649921" label="ContextualSuggestionsButton:disabled"/>
   <int value="-1826309726" label="ArcCustomTabsExperiment:disabled"/>
+  <int value="-1825184776" label="TangibleSync:disabled"/>
   <int value="-1824539611" label="U2fPermissionPrompt:disabled"/>
   <int value="-1823193038" label="QuietNotificationPrompts:disabled"/>
   <int value="-1823073826" label="TabGroupsSave:disabled"/>
@@ -53993,6 +54188,7 @@
   <int value="-1142933895" label="ReduceDisplayNotifications:disabled"/>
   <int value="-1142034548" label="BuiltInModuleKvStorage:enabled"/>
   <int value="-1141780291" label="DisplayChangeModal:disabled"/>
+  <int value="-1140923360" label="DeprecateAssistantStylusFeatures:disabled"/>
   <int value="-1138851579" label="QuerySearchBurnInPeriod:disabled"/>
   <int value="-1137696948" label="enable-chromeos-account-manager"/>
   <int value="-1137442543" label="enable-slimming-paint"/>
@@ -54664,6 +54860,7 @@
   <int value="-697887799"
       label="AutofillSaveCardDialogUnlabeledExpirationDate:disabled"/>
   <int value="-697751423" label="disable-quickoffice-component-app"/>
+  <int value="-697321483" label="DeprecateAssistantStylusFeatures:enabled"/>
   <int value="-696693295" label="Canvas2DImageChromium:disabled"/>
   <int value="-696225611" label="UseSerialBusEnumerator:disabled"/>
   <int value="-695764575" label="NearbySharingBackgroundScanning:enabled"/>
@@ -58273,6 +58470,7 @@
   <int value="1775730290" label="OmniboxKeywordSearchButton:enabled"/>
   <int value="1776136073" label="ExtensionsMenuAccessControl:enabled"/>
   <int value="1776163541" label="DesktopPWAsWebBundles:enabled"/>
+  <int value="1776221137" label="TangibleSync:enabled"/>
   <int value="1776475705" label="show-composited-layer-borders"/>
   <int value="1777059507" label="trust-autofill-server-name-types"/>
   <int value="1777241671" label="EnableAriaElementReflection:disabled"/>
@@ -75194,6 +75392,13 @@
   <int value="3" label="Browser"/>
 </enum>
 
+<enum name="PrintOopResult">
+  <int value="0" label="Successful"/>
+  <int value="1" label="Cancelled"/>
+  <int value="2" label="Access Denied"/>
+  <int value="3" label="Failed"/>
+</enum>
+
 <enum name="PrintPreviewFailureType">
 <!-- This must be kept current with PrintPreviewErrorBuckets in
      components/printing/renderer/print_render_frame_helper.h. -->
@@ -88853,6 +89058,7 @@
   <int value="48" label="Sharing Message"/>
   <int value="49" label="Autofill Wallet Offer"/>
   <int value="50" label="Workspace Desk"/>
+  <int value="51" label="History"/>
 </enum>
 
 <enum name="SyncModelTypeStoreInitResult">
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 3db65083..aa5cc82 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -307,6 +307,17 @@
   <token key="TabletOrClamshell" variants="TabletOrClamshellMode"/>
 </histogram>
 
+<histogram name="Apps.AppList.AppListSortDiscoveryDurationAfterActivation"
+    units="ms" expires_after="M107">
+  <owner>andrewxu@chromium.org</owner>
+  <owner>tbarzic@chromium.org</owner>
+  <summary>
+    The time duration between the earliest user session activation with the app
+    list sort enabled and the first sort usage. This metric is recorded when app
+    list sort is triggered.
+  </summary>
+</histogram>
+
 <histogram name="Apps.AppList.AppSearchProvider.QueryTime" units="ms"
     expires_after="2022-12-24">
   <owner>tbarzic@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 5c2e6d6..f3e4106 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1748,6 +1748,28 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.Loading.CachedResponseArrivalAtRenderer"
+    units="Milliseconds" expires_after="2022-11-01">
+  <owner>yhirano@chromium.org</owner>
+  <owner>loadingg-dev@chromium.org</owner>
+  <summary>
+    The amount of time taken to get a cached response. Recorded when the
+    response arrives, and recorded only when both of the response and the code
+    cache were cached.
+  </summary>
+</histogram>
+
+<histogram name="Blink.Loading.CodeCacheArrivalAtRenderer" units="Milliseconds"
+    expires_after="2022-11-01">
+  <owner>yhirano@chromium.org</owner>
+  <owner>loading-dev@chromium.org</owner>
+  <summary>
+    The amount of time taken to get a code cache. Recorded when the response
+    arrives, and recorded only when both of the response and the code cache were
+    cached.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Blink.MainFrame.UpdateTime" units="microseconds"
     expires_after="2022-09-11">
 <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" -->
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index f5b6bbe..427288b 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1575,12 +1575,12 @@
 </histogram>
 
 <histogram base="true" name="ChromeOS.SystemTray.AnimationSmoothness" units="%"
-    expires_after="2022-04-13">
+    expires_after="2023-04-13">
 <!-- Name completed by histogram suffixes
      name="SystemTrayTransitionType" -->
 
   <owner>amehfooz@chromium.org</owner>
-  <owner>tengs@chromium.org</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     Tracks the animation smoothness for the collapse / expand animation of the
     system tray.
@@ -1588,9 +1588,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.BlockedNotifiersAfterUpdate"
-    units="notifiers" expires_after="2022-05-10">
+    units="notifiers" expires_after="2023-05-10">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     Tracks the number of blocked notifiers in the system tray after the user
     blocks one or multiple notifiers. Note that this metric records the number
@@ -1599,18 +1599,18 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.BlockedNotifiersOnOpen" units="notifiers"
-    expires_after="2022-05-10">
+    expires_after="2023-05-10">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     Tracks the number of blocked notifiers in the system tray when it is opened.
   </summary>
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.FeaturePodCountOnOpen" units="count"
-    expires_after="2022-04-01">
+    expires_after="2023-04-01">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     The number of feature pods (e.g. WiFi, Bluetooth, IME, Accessibility, etc.)
     in the system tray quick settings when it is opened, including pods that
@@ -1621,9 +1621,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.FirstInteraction"
-    enum="CrosSystemTrayFirstInteraction" expires_after="2022-04-01">
+    enum="CrosSystemTrayFirstInteraction" expires_after="2023-04-01">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     Records the first interaction the user has with the system tray, which can
     be a click/tap on the quick settings or message center bubble. Note that
@@ -1633,9 +1633,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.Interaction"
-    enum="CrosSystemTrayInteraction" expires_after="2022-04-01">
+    enum="CrosSystemTrayInteraction" expires_after="2023-04-01">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     An enum value how system tray bubble is interacted e.g. by tap (touch
     screen), or click (mouse, trackpad, etc.) Reported every time the region
@@ -1644,9 +1644,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.IsExpandedOnOpen" enum="Boolean"
-    expires_after="2022-05-10">
-  <owner>tengs@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+    expires_after="2023-05-10">
+  <owner>amehfooz@chromium.org</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     If the value is true, SystemTray is expanded when it's opened. Otherwise,
     it's closed when it's opened.
@@ -1654,9 +1654,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.NotificationsRemovedByClearAll"
-    units="notifications" expires_after="2022-04-01">
+    units="notifications" expires_after="2023-04-01">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     Records the number of notifications that are removed in a single clear all
     action by the user.
@@ -1673,9 +1673,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.ShelfPodCount" units="count"
-    expires_after="2022-04-01">
-  <owner>tengs@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+    expires_after="2023-04-01">
+  <owner>amehfooz@chromium.org</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     The number of status area item pods (e.g. IME, Palette, Dictation, etc.) in
     the shelf status area whenever a pod appears/disappears. This histogram is
@@ -1685,9 +1685,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.Tablet.FeaturePodCountOnOpen"
-    units="count" expires_after="2022-05-10">
+    units="count" expires_after="2023-05-10">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     The number of feature pods (e.g. WiFi, Bluetooth, IME, Accessibility, etc.)
     in the system tray quick settings when it is opened, including pods that
@@ -1697,9 +1697,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.Tablet.ShelfPodCount" units="count"
-    expires_after="2022-04-01">
-  <owner>tengs@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+    expires_after="2023-04-01">
+  <owner>amehfooz@chromium.org</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     The number of status area item pods (e.g. IME, Palette, Dictation, etc.) in
     the shelf status area whenever a pod appears/disappears. This histogram is
@@ -1719,9 +1719,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.TimeToClick2" units="ms"
-    expires_after="2022-04-01">
-  <owner>tengs@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+    expires_after="2023-04-01">
+  <owner>amehfooz@chromium.org</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     The amount of time a user took after opening the system tray bubble, to
     clicking on an item in the system tray bubble.
@@ -1729,9 +1729,9 @@
 </histogram>
 
 <histogram name="ChromeOS.SystemTray.ToggleExpanded"
-    enum="CrosSystemTrayToggleExpanded" expires_after="2022-05-10">
+    enum="CrosSystemTrayToggleExpanded" expires_after="2023-05-10">
   <owner>amehfooz@chromium.org</owner>
-  <owner>gzadina@google.com</owner>
+  <owner>cros-status-area@google.com</owner>
   <summary>
     An enum value how system tray bubble is expanded or collapsed. It can be
     toggled by the button and touch gesture.
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml
index 11189460..897cc9b6 100644
--- a/tools/metrics/histograms/metadata/cras/histograms.xml
+++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -184,7 +184,7 @@
   </summary>
 </histogram>
 
-<histogram name="Cras.DeviceVolume" units="level" expires_after="2022-05-01">
+<histogram name="Cras.DeviceVolume" units="level" expires_after="2022-11-01">
 <!-- Name completed by histogram_suffixes
      name="Cras.DeviceType" -->
 
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
index c278898..4e9b262 100644
--- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -354,6 +354,19 @@
   </summary>
 </histogram>
 
+<histogram name="Cryptohome.MaskedDownloadsItems" units="items"
+    expires_after="2022-10-01">
+  <owner>benreich@chromium.org</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
+  <summary>
+    If the Downloads bind mount fails, files may be saved to ~/MyFiles/Downloads
+    directly and upon next login an attempt will be made to move these back into
+    ~/Downloads to perform a bind mount. This metric records the number of items
+    (as direct children of ~/MyFiles/Downloads) that get migrated on the next
+    successful cryptohome mount.
+  </summary>
+</histogram>
+
 <histogram name="Cryptohome.MigrationUI.ConsumedBatteryPercent" units="%"
     expires_after="2020-07-01">
   <owner>fukino@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/fingerprint/histograms.xml b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
index 18d7de2..40f33b1 100644
--- a/tools/metrics/histograms/metadata/fingerprint/histograms.xml
+++ b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
@@ -192,11 +192,14 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.MatchIgnoredDueToPowerButtonPress"
-    enum="BooleanIgnored" expires_after="2022-05-01">
+    enum="BooleanIgnored" expires_after="2023-04-05">
   <owner>ravisadineni@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
-    Whether fingerprint touch was ignored due to parallel power button press.
+    ChromeOS only. Record when a fingerprint touch was ignored due to parallel
+    power button press. Fingerprint matches will be ignored for a duration of
+    kAuthIgnoreTimeoutmsecs (1000 ms) after each power button press. This only
+    applies to fingerprint sensors that reside on a power button.
   </summary>
 </histogram>
 
@@ -230,20 +233,27 @@
 </histogram>
 
 <histogram name="Fingerprint.Unlock.ReadPositiveMatchSecret.Success"
-    enum="BooleanSuccess" expires_after="2022-05-01">
+    enum="BooleanSuccess" expires_after="2023-04-05">
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
-    Whether successfully read positive match secret from FPMCU when needed.
+    ChromeOS Only. After a positive fingerprint match has been identified,
+    record when a positive match secret is read from FPMCU. Note that this does
+    not indicate that the match was was validated, only that the secret was
+    read. Fingerprint.Unlock.Match.PositiveMatchSecretCorrect may be used to
+    track validation.
   </summary>
 </histogram>
 
 <histogram name="Fingerprint.Unlock.RecordFormatVersion"
-    enum="FingerprintRecordFormatVersion" expires_after="2022-05-01">
+    enum="FingerprintRecordFormatVersion" expires_after="2023-04-05">
   <owner>hesling@chromium.org</owner>
   <owner>chromeos-fingerprint@google.com</owner>
   <summary>
-    Format version of a fingerprint template record read from storage.
+    Format version of a fingerprint template record read from storage. ChromeOS
+    Only. Records the format version of each fingerprint template record prior
+    to uploading to the FPMCU. Format version will not be recorded if there are
+    no available record slots.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 794df36..73847a5 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -3884,6 +3884,16 @@
   </summary>
 </histogram>
 
+<histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutivePTOCount"
+    units="units" expires_after="2023-05-11">
+  <owner>dschinazi@chromium.org</owner>
+  <owner>src/net/quic/OWNERS</owner>
+  <summary>
+    If a QUIC connection timed out with open streams, this contains a count of
+    consecutive PTOs.
+  </summary>
+</histogram>
+
 <histogram name="Net.QuicSession.TimedOutWithOpenStreams.ConsecutiveRTOCount"
     units="units" expires_after="2023-05-11">
   <owner>dschinazi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index 11f8be7e..0003b32 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -353,6 +353,22 @@
   </summary>
 </histogram>
 
+<histogram name="Printing.Oop.PrintResult" enum="PrintOopResult"
+    expires_after="2022-11-07">
+  <owner>awscreen@chromium.org</owner>
+  <owner>thestig@chromium.org</owner>
+  <summary>
+    Records the final result of a print job where the interactions with the
+    system printing APIs are performed out-of-process in the PrintBackend
+    service.
+
+    This covers printing initiated from Print Preview as well as from a system
+    print dialog for platforms which provide that.
+
+    Recorded upon completion of each print job by PrintJobWorkerOop.
+  </summary>
+</histogram>
+
 <histogram
     name="Printing.PrintBackend.DriversRequiringElevatedPrivilegeEncountered"
     enum="BooleanFound" expires_after="2022-10-09">
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index 0cc24a1..377f053 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -36,6 +36,7 @@
   <variant name=".DICTIONARY" summary="DICTIONARY"/>
   <variant name=".EXTENSION" summary="EXTENSION"/>
   <variant name=".EXTENSION_SETTING" summary="EXTENSION_SETTING"/>
+  <variant name=".HISTORY" summary="HISTORY"/>
   <variant name=".HISTORY_DELETE_DIRECTIVE" summary="HISTORY_DELETE_DIRECTIVE"/>
   <variant name=".MANAGED_USER_SETTING" summary="MANAGED_USER_SETTING"/>
   <variant name=".NIGORI" summary="NIGORI"/>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index edd5b07..91ae973 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -14,7 +14,7 @@
         },
         "mac": {
             "hash": "68f0778893292e5d0513b913ac1b25d8eaf76e06",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/a82f6c1e87407b000f3b45a8665ad88cdb77ecdb/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/dd233aed4e705bdb27ab26ae01189ab1e9e3728e/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "3e81a4ac3c75b1905c72f6ef7d05f0613e043480",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/a82f6c1e87407b000f3b45a8665ad88cdb77ecdb/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/dd233aed4e705bdb27ab26ae01189ab1e9e3728e/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc
index 7d3a420..a4d9d670 100644
--- a/ui/accessibility/accessibility_features.cc
+++ b/ui/accessibility/accessibility_features.cc
@@ -206,6 +206,15 @@
   return base::FeatureList::IsEnabled(::features::kScreenAI);
 }
 
+// This feature is only for debug purposes and for security/privacy reasons,
+// should be never enabled by default .
+const base::Feature kScreenAIDebugMode{"ScreenAIDebugMode",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
+bool IsScreenAIDebugModeEnabled() {
+  return base::FeatureList::IsEnabled(::features::kScreenAIDebugMode);
+}
+
 const base::Feature kPdfOcr{"PdfOcr", base::FEATURE_DISABLED_BY_DEFAULT};
 
 bool IsPdfOcrEnabled() {
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h
index 8a4052b..868275ca 100644
--- a/ui/accessibility/accessibility_features.h
+++ b/ui/accessibility/accessibility_features.h
@@ -185,6 +185,9 @@
 // IsReadAnythingWithScreen2xEnabled.
 AX_BASE_EXPORT bool IsScreenAIEnabled();
 
+// If enabled, ScreenAI library writes some debug data in /tmp.
+AX_BASE_EXPORT bool IsScreenAIDebugModeEnabled();
+
 // Enables a feature whereby inaccessible (i.e. untagged) PDFs are made
 // accessible using an optical character recognition service. Due to the size of
 // the OCR component, this feature targets desktop versions of Chrome for now.
diff --git a/ui/base/ime/DIR_METADATA b/ui/base/ime/DIR_METADATA
index d50dc86..e0756fd7 100644
--- a/ui/base/ime/DIR_METADATA
+++ b/ui/base/ime/DIR_METADATA
@@ -7,6 +7,7 @@
 #   https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/proto/dir_metadata.proto
 
 monorail {
-  component: "OS>Inputs"  # for Chrome/Chromium OS only.
-  # For OSes other than Chrome/Chromium OS, please use "UI>Input>Text>IME".
+  # For non-Chrome/Chromium OS:
+  component: "UI>Input>Text>IME"
+  # For Chrome/Chromium OS, please see //ui/base/ime/ash/COMMON_METADATA.
 }
diff --git a/ui/base/ime/ash/COMMON_METADATA b/ui/base/ime/ash/COMMON_METADATA
new file mode 100644
index 0000000..134df975
--- /dev/null
+++ b/ui/base/ime/ash/COMMON_METADATA
@@ -0,0 +1,5 @@
+buganizer {
+  component_id: 95887
+}
+os: CHROME_OS
+team_email: "essential-inputs-team@google.com"
diff --git a/ui/base/ime/ash/DIR_METADATA b/ui/base/ime/ash/DIR_METADATA
new file mode 100644
index 0000000..caac77f
--- /dev/null
+++ b/ui/base/ime/ash/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/base/ime/ash/COMMON_METADATA"
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
index 8e885462..639db3c 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -763,7 +763,7 @@
 <translation id="7547009467130558110">รองเท้าผ้าใบ</translation>
 <translation id="7547780573915868306">ลิทัวเนีย</translation>
 <translation id="7547811415869834682">ดัตช์</translation>
-<translation id="7551643184018910560">ตรึงที่ชั้นวาง</translation>
+<translation id="7551643184018910560">ปักหมุดที่ชั้นวาง</translation>
 <translation id="7553492409867692754">ให้สิทธิ์แอป Linux เข้าถึงไฟล์ในโฟลเดอร์ "<ph name="FOLDER_NAME" />"</translation>
 <translation id="7575645593344061397">กำลังคืนค่า "<ph name="FILENAME" />"...</translation>
 <translation id="7589661784326793847">รอสักครู่</translation>
@@ -790,7 +790,7 @@
 <translation id="7765158879357617694">ย้าย</translation>
 <translation id="7774365994322694683">นก</translation>
 <translation id="7788080748068240085">หากต้องการบันทึก "<ph name="FILE_NAME" />" เป็นแบบออฟไลน์ คุณจะต้องเพิ่มพื้นที่ว่างอีก <ph name="TOTAL_FILE_SIZE" /> โดยทำดังนี้:<ph name="MARKUP_1" />
-    <ph name="MARKUP_2" />เลิกตรึงไฟล์ที่คุณไม่ต้องการเข้าถึงแบบออฟไลน์อีกต่อไป<ph name="MARKUP_3" />
+    <ph name="MARKUP_2" />เลิกปักหมุดไฟล์ที่คุณไม่ต้องการเข้าถึงแบบออฟไลน์อีกต่อไป<ph name="MARKUP_3" />
     <ph name="MARKUP_4" />ลบไฟล์จากโฟลเดอร์ "ดาวน์โหลด"<ph name="MARKUP_5" /></translation>
 <translation id="7794058097940213561">ฟอร์แมตอุปกรณ์</translation>
 <translation id="7799329977874311193">เอกสาร HTML</translation>
@@ -864,7 +864,7 @@
 <translation id="8308481408797647857">ที่เก็บถาวร Tar ซึ่งบีบอัดโดย XZ</translation>
 <translation id="8312871300878166382">วางลงในโฟลเดอร์</translation>
 <translation id="8329978297633540474">ข้อความล้วน</translation>
-<translation id="8335587457941836791">เลิกตรึงในชั้นวาง</translation>
+<translation id="8335587457941836791">เลิกปักหมุดในชั้นวาง</translation>
 <translation id="8335837413233998004">เบลารุส</translation>
 <translation id="8336153091935557858">เมื่อวานนี้ <ph name="YESTERDAY_DAYTIME" /></translation>
 <translation id="8342318071240498787">มีไฟล์หรือไดเรกทอรีที่มีชื่อเดียวกันนี้อยู่แล้ว</translation>
@@ -880,7 +880,7 @@
 <translation id="8452135315243592079">ไม่มีซิมการ์ด</translation>
 <translation id="8456681095658380701">ชื่อไม่ถูกต้อง</translation>
 <translation id="8459404855768962328">การคัดลอกรายการนี้จะเป็นการแชร์กับทุกคนที่ดูโฟลเดอร์ที่แชร์ "<ph name="DESTINATION_NAME" />" ได้</translation>
-<translation id="8461467696380332069">คลิกขวาที่ไฟล์แล้วเลือก "ตรึงที่ชั้นวาง" เพื่อให้เข้าถึงไฟล์ในชั้นวางได้อย่างรวดเร็ว</translation>
+<translation id="8461467696380332069">คลิกขวาที่ไฟล์แล้วเลือก "ปักหมุดที่ชั้นวาง" เพื่อให้เข้าถึงไฟล์ในชั้นวางได้อย่างรวดเร็ว</translation>
 <translation id="8461914792118322307">พร็อกซี</translation>
 <translation id="8463494891489624050">เวียดนาม (VIQR)</translation>
 <translation id="8466234950814670489">ไฟล์ Tar</translation>
@@ -918,7 +918,7 @@
 <translation id="8719721339511222681">เลือก <ph name="ENTRY_NAME" /> ไว้</translation>
 <translation id="872537912056138402">โครเอเชีย</translation>
 <translation id="8743164338060742337">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="NETWORK_PROVIDER_NAME" /> ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, จัดการโดยผู้ดูแลระบบ, เชื่อมต่อ</translation>
-<translation id="8750438273876807512">แตะไฟล์ค้างไว้แล้วแตะ <ph name="ICON" /> จากนั้นเลือก "ตรึงที่ชั้นวาง" เพื่อให้เข้าถึงไฟล์ในชั้นวางได้อย่างรวดเร็ว</translation>
+<translation id="8750438273876807512">แตะไฟล์ค้างไว้แล้วแตะ <ph name="ICON" /> จากนั้นเลือก "ปักหมุดที่ชั้นวาง" เพื่อให้เข้าถึงไฟล์ในชั้นวางได้อย่างรวดเร็ว</translation>
 <translation id="8787254343425541995">อนุญาตให้ใช้พร็อกซีสำหรับเครือข่ายที่แชร์ไว้</translation>
 <translation id="8790981080411996443">คนกำลังรดน้ำต้นไม้</translation>
 <translation id="8798099450830957504">ค่าเริ่มต้น</translation>
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn
index 4969373..f00da26 100644
--- a/ui/display/BUILD.gn
+++ b/ui/display/BUILD.gn
@@ -162,6 +162,7 @@
     "//base",
     "//testing/gmock",
     "//ui/display/types",
+    "//ui/display/util",
     "//ui/events/devices",
     "//ui/gfx",
     "//ui/gfx:test_support",
diff --git a/ui/display/manager/display_manager_utilities_unittest.cc b/ui/display/manager/display_manager_utilities_unittest.cc
index 4e2bc127..47611c6 100644
--- a/ui/display/manager/display_manager_utilities_unittest.cc
+++ b/ui/display/manager/display_manager_utilities_unittest.cc
@@ -6,29 +6,12 @@
 
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/display.h"
+#include "ui/display/test/display_test_util.h"
 #include "ui/display/types/display_constants.h"
 #include "ui/display/util/display_util.h"
 
 namespace display {
 
-namespace {
-
-class ScopedSetInternalDisplayId {
- public:
-  ScopedSetInternalDisplayId(int64_t);
-  ~ScopedSetInternalDisplayId();
-};
-
-ScopedSetInternalDisplayId::ScopedSetInternalDisplayId(int64_t id) {
-  SetInternalDisplayIds({id});
-}
-
-ScopedSetInternalDisplayId::~ScopedSetInternalDisplayId() {
-  SetInternalDisplayIds({});
-}
-
-}  // namespace
-
 TEST(DisplayUtilitiesTest, GenerateDisplayIdList) {
   DisplayIdList list;
   {
@@ -58,7 +41,7 @@
     EXPECT_EQ(1000, list[2]);
   }
   {
-    ScopedSetInternalDisplayId set_internal(100);
+    ScopedSetInternalDisplayIds set_internal(100);
     int64_t ids[] = {10, 100};
     list = GenerateDisplayIdList(std::begin(ids), std::end(ids));
     EXPECT_EQ(100, list[0]);
@@ -77,7 +60,7 @@
     EXPECT_EQ(1000, list[2]);
   }
   {
-    ScopedSetInternalDisplayId set_internal(10);
+    ScopedSetInternalDisplayIds set_internal(10);
     int64_t ids[] = {10, 100};
     list = GenerateDisplayIdList(std::begin(ids), std::end(ids));
     EXPECT_EQ(10, list[0]);
@@ -104,7 +87,7 @@
     EXPECT_EQ("1,10,16", DisplayIdListToString(list));
   }
   {
-    ScopedSetInternalDisplayId set_internal(16);
+    ScopedSetInternalDisplayIds set_internal(16);
     int64_t ids[] = {10, 1, 16};
     DisplayIdList list = GenerateDisplayIdList(std::begin(ids), std::end(ids));
     EXPECT_EQ("16,1,10", DisplayIdListToString(list));
diff --git a/ui/display/test/display_test_util.h b/ui/display/test/display_test_util.h
index ccb8a5e..9d9ad65 100644
--- a/ui/display/test/display_test_util.h
+++ b/ui/display/test/display_test_util.h
@@ -6,10 +6,27 @@
 #define UI_DISPLAY_TEST_DISPLAY_TEST_UTIL_H_
 
 #include "ui/display/display.h"
+#include "ui/display/util/display_util.h"
 
 namespace display {
 
-void PrintTo(const Display& display, ::std::ostream* os) {
+// Use this class instead of calling `SetInternalDisplayIds()` in unit tests to
+// avoid leaking the state to other tests.
+class ScopedSetInternalDisplayIds {
+ public:
+  explicit ScopedSetInternalDisplayIds(const base::flat_set<int64_t> ids) {
+    SetInternalDisplayIds(ids);
+  }
+  explicit ScopedSetInternalDisplayIds(int64_t id) {
+    SetInternalDisplayIds({id});
+  }
+  ScopedSetInternalDisplayIds(const ScopedSetInternalDisplayIds&) = delete;
+  ScopedSetInternalDisplayIds operator=(const ScopedSetInternalDisplayIds&) =
+      delete;
+  ~ScopedSetInternalDisplayIds() { SetInternalDisplayIds({}); }
+};
+
+inline void PrintTo(const Display& display, ::std::ostream* os) {
   *os << display.ToString();
 }
 
diff --git a/ui/display/util/display_util_unittest.cc b/ui/display/util/display_util_unittest.cc
index 3780880..eda1ce1e 100644
--- a/ui/display/util/display_util_unittest.cc
+++ b/ui/display/util/display_util_unittest.cc
@@ -6,6 +6,7 @@
 
 #include "base/test/metrics/histogram_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/display/test/display_test_util.h"
 #include "ui/display/util/edid_parser.h"
 
 namespace display {
@@ -339,31 +340,35 @@
 TEST(DisplayUtilTest, CompareDisplayIdsWithMultipleDisplays) {
   // Internal display is always first.
   EXPECT_TRUE(CompareDisplayIds(10, 12));
-  SetInternalDisplayIds({10});
-  EXPECT_TRUE(CompareDisplayIds(10, 12));
-  EXPECT_TRUE(CompareDisplayIds(10, 9));
-  EXPECT_TRUE(CompareDisplayIds(10, 15));
-  EXPECT_FALSE(CompareDisplayIds(12, 10));
-  EXPECT_FALSE(CompareDisplayIds(12, 9));
-  EXPECT_TRUE(CompareDisplayIds(12, 15));
-
-  SetInternalDisplayIds({12});
-  EXPECT_FALSE(CompareDisplayIds(10, 12));
-  EXPECT_FALSE(CompareDisplayIds(10, 9));
-  EXPECT_TRUE(CompareDisplayIds(10, 15));
-  EXPECT_TRUE(CompareDisplayIds(12, 10));
-  EXPECT_TRUE(CompareDisplayIds(12, 9));
-  EXPECT_TRUE(CompareDisplayIds(12, 15));
-
+  {
+    ScopedSetInternalDisplayIds set_internal(10);
+    EXPECT_TRUE(CompareDisplayIds(10, 12));
+    EXPECT_TRUE(CompareDisplayIds(10, 9));
+    EXPECT_TRUE(CompareDisplayIds(10, 15));
+    EXPECT_FALSE(CompareDisplayIds(12, 10));
+    EXPECT_FALSE(CompareDisplayIds(12, 9));
+    EXPECT_TRUE(CompareDisplayIds(12, 15));
+  }
+  {
+    ScopedSetInternalDisplayIds set_internal(12);
+    EXPECT_FALSE(CompareDisplayIds(10, 12));
+    EXPECT_FALSE(CompareDisplayIds(10, 9));
+    EXPECT_TRUE(CompareDisplayIds(10, 15));
+    EXPECT_TRUE(CompareDisplayIds(12, 10));
+    EXPECT_TRUE(CompareDisplayIds(12, 9));
+    EXPECT_TRUE(CompareDisplayIds(12, 15));
+  }
   // Internal displays are always first but compares values between internal
   // displays.
-  SetInternalDisplayIds({12, 10});
-  EXPECT_TRUE(CompareDisplayIds(10, 12));
-  EXPECT_TRUE(CompareDisplayIds(10, 9));
-  EXPECT_TRUE(CompareDisplayIds(10, 15));
-  EXPECT_FALSE(CompareDisplayIds(12, 10));
-  EXPECT_TRUE(CompareDisplayIds(12, 9));
-  EXPECT_TRUE(CompareDisplayIds(12, 15));
+  {
+    ScopedSetInternalDisplayIds set_internal({12, 10});
+    EXPECT_TRUE(CompareDisplayIds(10, 12));
+    EXPECT_TRUE(CompareDisplayIds(10, 9));
+    EXPECT_TRUE(CompareDisplayIds(10, 15));
+    EXPECT_FALSE(CompareDisplayIds(12, 10));
+    EXPECT_TRUE(CompareDisplayIds(12, 9));
+    EXPECT_TRUE(CompareDisplayIds(12, 15));
+  }
 }
 
 }  // namespace display
diff --git a/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js b/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js
index cce00c6..1120f02 100644
--- a/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js
+++ b/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js
@@ -1255,6 +1255,7 @@
  */
 test.util.sync.setPreferences = preferences => {
   chrome.fileManagerPrivate.setPreferences(preferences);
+  return true;
 };
 
 /**
@@ -1267,6 +1268,7 @@
  */
 test.util.sync.recordEnumMetric = (name, value, validValues) => {
   metrics.recordEnum(name, value, validValues);
+  return true;
 };
 
 /**
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js
index 0094663..f95acde 100644
--- a/ui/file_manager/file_manager/common/js/util.js
+++ b/ui/file_manager/file_manager/common/js/util.js
@@ -1077,6 +1077,8 @@
           return str('MEDIA_VIEW_VIDEOS_ROOT_LABEL');
         case VolumeManagerCommon.MediaViewRootType.AUDIO:
           return str('MEDIA_VIEW_AUDIO_ROOT_LABEL');
+        case VolumeManagerCommon.MediaViewRootType.DOCUMENTS:
+          return str('MEDIA_VIEW_DOCUMENTS_ROOT_LABEL');
       }
       console.error('Unsupported media view root type: ' + mediaViewRootType);
       return locationInfo.volumeInfo.label;
diff --git a/ui/file_manager/file_manager/common/js/volume_manager_types.js b/ui/file_manager/file_manager/common/js/volume_manager_types.js
index 4cf389a..964deae 100644
--- a/ui/file_manager/file_manager/common/js/volume_manager_types.js
+++ b/ui/file_manager/file_manager/common/js/volume_manager_types.js
@@ -206,6 +206,7 @@
   INVALID_ARGUMENT: 'error_invalid_argument',
   INVALID_PATH: 'error_invalid_path',
   ALREADY_MOUNTED: 'error_path_already_mounted',
+  CANCELLED: 'error_cancelled',
   PATH_NOT_MOUNTED: 'error_path_not_mounted',
   DIRECTORY_CREATION_FAILED: 'error_directory_creation_failed',
   INVALID_MOUNT_OPTIONS: 'error_invalid_mount_options',
@@ -399,6 +400,7 @@
   IMAGES: 'images_root',
   VIDEOS: 'videos_root',
   AUDIO: 'audio_root',
+  DOCUMENTS: 'documents_root',
 };
 Object.freeze(VolumeManagerCommon.MediaViewRootType);
 
diff --git a/ui/gl/dc_layer_tree.cc b/ui/gl/dc_layer_tree.cc
index a06317f..e378551 100644
--- a/ui/gl/dc_layer_tree.cc
+++ b/ui/gl/dc_layer_tree.cc
@@ -33,9 +33,11 @@
 
 DCLayerTree::DCLayerTree(bool disable_nv12_dynamic_textures,
                          bool disable_vp_scaling,
+                         bool disable_vp_super_resolution,
                          bool no_downscaled_overlay_promotion)
     : disable_nv12_dynamic_textures_(disable_nv12_dynamic_textures),
       disable_vp_scaling_(disable_vp_scaling),
+      disable_vp_super_resolution_(disable_vp_super_resolution),
       no_downscaled_overlay_promotion_(no_downscaled_overlay_promotion),
       ink_renderer_(std::make_unique<DelegatedInkRenderer>()) {}
 
diff --git a/ui/gl/dc_layer_tree.h b/ui/gl/dc_layer_tree.h
index 7100483c..3b08095 100644
--- a/ui/gl/dc_layer_tree.h
+++ b/ui/gl/dc_layer_tree.h
@@ -71,6 +71,7 @@
 
   DCLayerTree(bool disable_nv12_dynamic_textures,
               bool disable_vp_scaling,
+              bool disable_vp_super_resolution,
               bool no_downscaled_overlay_promotion);
 
   DCLayerTree(const DCLayerTree&) = delete;
@@ -105,6 +106,10 @@
 
   bool disable_vp_scaling() const { return disable_vp_scaling_; }
 
+  bool disable_vp_super_resolution() const {
+    return disable_vp_super_resolution_;
+  }
+
   bool no_downscaled_overlay_promotion() const {
     return no_downscaled_overlay_promotion_;
   }
@@ -153,6 +158,7 @@
 
   const bool disable_nv12_dynamic_textures_;
   const bool disable_vp_scaling_;
+  const bool disable_vp_super_resolution_;
   const bool no_downscaled_overlay_promotion_;
 
   HWND window_;
diff --git a/ui/gl/direct_composition_surface_win.cc b/ui/gl/direct_composition_surface_win.cc
index 5808c97..6c524088 100644
--- a/ui/gl/direct_composition_surface_win.cc
+++ b/ui/gl/direct_composition_surface_win.cc
@@ -399,6 +399,7 @@
       layer_tree_(std::make_unique<DCLayerTree>(
           settings.disable_nv12_dynamic_textures,
           settings.disable_vp_scaling,
+          settings.disable_vp_super_resolution,
           settings.no_downscaled_overlay_promotion)) {
   ui::GpuSwitchingManager::GetInstance()->AddObserver(this);
 }
diff --git a/ui/gl/direct_composition_surface_win.h b/ui/gl/direct_composition_surface_win.h
index 9864e80..beb4172 100644
--- a/ui/gl/direct_composition_surface_win.h
+++ b/ui/gl/direct_composition_surface_win.h
@@ -42,6 +42,7 @@
   struct Settings {
     bool disable_nv12_dynamic_textures = false;
     bool disable_vp_scaling = false;
+    bool disable_vp_super_resolution = false;
     size_t max_pending_frames = 2;
     bool use_angle_texture_offset = false;
     bool force_root_surface_full_damage = false;
diff --git a/ui/gl/gl_switches.cc b/ui/gl/gl_switches.cc
index 4a92078c..2125948 100644
--- a/ui/gl/gl_switches.cc
+++ b/ui/gl/gl_switches.cc
@@ -231,6 +231,10 @@
 const base::FeatureParam<int> kVerifyDrawOffsetY{
     &kDirectCompositionVerifyDrawOffset, "verify_draw_offset_y", 0};
 
+// Allow overlay swapchain to use Intel video processor for super resolution.
+const base::Feature kIntelVpSuperResolution{"IntelVpSuperResolution",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Default to using ANGLE's OpenGL backend
 const base::Feature kDefaultANGLEOpenGL{"DefaultANGLEOpenGL",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ui/gl/gl_switches.h b/ui/gl/gl_switches.h
index 0e47d04..466650f6 100644
--- a/ui/gl/gl_switches.h
+++ b/ui/gl/gl_switches.h
@@ -101,6 +101,7 @@
 GL_EXPORT extern const base::FeatureParam<int> kVerifyDrawOffsetX;
 GL_EXPORT extern const base::FeatureParam<int> kVerifyDrawOffsetY;
 GL_EXPORT extern const base::Feature kDirectCompositionSoftwareOverlays;
+GL_EXPORT extern const base::Feature kIntelVpSuperResolution;
 GL_EXPORT extern const base::Feature kDefaultANGLEOpenGL;
 GL_EXPORT extern const base::Feature kDefaultANGLEMetal;
 GL_EXPORT extern const base::Feature kDefaultANGLEVulkan;
diff --git a/ui/gl/swap_chain_presenter.cc b/ui/gl/swap_chain_presenter.cc
index d1df17d3..049fa2a 100644
--- a/ui/gl/swap_chain_presenter.cc
+++ b/ui/gl/swap_chain_presenter.cc
@@ -175,6 +175,78 @@
   transform->Scale(swap_chain_scale_x, swap_chain_scale_y);
 }
 
+const GUID GUID_INTEL_VPE_INTERFACE = {
+    0xedd1d4b9,
+    0x8659,
+    0x4cbc,
+    {0xa4, 0xd6, 0x98, 0x31, 0xa2, 0x16, 0x3a, 0xc3}};
+
+enum : UINT {
+  kIntelVpeFnVersion = 0x01,
+  kIntelVpeFnMode = 0x20,
+  kIntelVpeFnScaling = 0x37,
+};
+
+enum : UINT {
+  kIntelVpeVersion3 = 0x0003,
+};
+
+enum : UINT {
+  kIntelVpeModeNone = 0x0,
+  kIntelVpeModePreproc = 0x01,
+};
+
+enum : UINT {
+  kIntelVpeScalingDefault = 0x0,
+  kIntelVpeScalingSuperResolution = 0x2,
+};
+
+struct IntelVpeExt {
+  UINT function;
+  void* param;
+};
+
+void ToggleIntelVpSuperResolution(
+    Microsoft::WRL::ComPtr<ID3D11VideoContext> video_context,
+    Microsoft::WRL::ComPtr<ID3D11VideoProcessor> video_processor,
+    bool is_on_battery_power) {
+  TRACE_EVENT1("gpu", "ToggleIntelVpSuperResolution", "on",
+               !is_on_battery_power);
+
+  IntelVpeExt ext = {};
+  UINT param = 0;
+  ext.param = &param;
+
+  ext.function = kIntelVpeFnVersion;
+  param = kIntelVpeVersion3;
+  HRESULT hr = video_context->VideoProcessorSetOutputExtension(
+      video_processor.Get(), &GUID_INTEL_VPE_INTERFACE, sizeof(ext), &ext);
+  if (FAILED(hr)) {
+    DLOG(ERROR) << "VideoProcessorSetOutputExtension failed with error 0x"
+                << std::hex << hr;
+  }
+
+  ext.function = kIntelVpeFnMode;
+  param = is_on_battery_power ? kIntelVpeModeNone : kIntelVpeModePreproc;
+  hr = video_context->VideoProcessorSetOutputExtension(
+      video_processor.Get(), &GUID_INTEL_VPE_INTERFACE, sizeof(ext), &ext);
+  if (FAILED(hr)) {
+    DLOG(ERROR) << "VideoProcessorSetOutputExtension failed with error 0x"
+                << std::hex << hr;
+  }
+
+  ext.function = kIntelVpeFnScaling;
+  param = is_on_battery_power ? kIntelVpeScalingDefault
+                              : kIntelVpeScalingSuperResolution;
+
+  hr = video_context->VideoProcessorSetStreamExtension(
+      video_processor.Get(), 0, &GUID_INTEL_VPE_INTERFACE, sizeof(ext), &ext);
+  if (FAILED(hr)) {
+    DLOG(ERROR) << "VideoProcessorSetStreamExtension failed with error 0x"
+                << std::hex << hr;
+  }
+}
+
 }  // namespace
 
 SwapChainPresenter::PresentationHistory::PresentationHistory() = default;
@@ -1401,6 +1473,12 @@
       DCHECK(output_view_);
     }
 
+    if (!layer_tree_->disable_vp_super_resolution() &&
+        base::FeatureList::IsEnabled(features::kIntelVpSuperResolution)) {
+      ToggleIntelVpSuperResolution(video_context, video_processor,
+                                   is_on_battery_power_);
+    }
+
     hr = video_context->VideoProcessorBlt(video_processor.Get(),
                                           output_view_.Get(), 0, 1, &stream);
     if (FAILED(hr)) {
diff --git a/ui/gtk/BUILD.gn b/ui/gtk/BUILD.gn
index 30e7c6b19..e289070 100644
--- a/ui/gtk/BUILD.gn
+++ b/ui/gtk/BUILD.gn
@@ -139,7 +139,6 @@
     "//ui/gfx/geometry",
     "//ui/native_theme",
     "//ui/shell_dialogs",
-    "//ui/shell_dialogs",
     "//ui/strings",
     "//ui/views",
     "//url",
diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
index bb12f7f0..e2b78831 100644
--- a/ui/ozone/platform/wayland/BUILD.gn
+++ b/ui/ozone/platform/wayland/BUILD.gn
@@ -226,6 +226,7 @@
     "//third_party/wayland-protocols:gtk_shell_protocol",
     "//third_party/wayland-protocols:idle_inhibit_protocol",
     "//third_party/wayland-protocols:keyboard_extension_protocol",
+    "//third_party/wayland-protocols:keyboard_shortcuts_inhibit_protocol",
     "//third_party/wayland-protocols:linux_dmabuf_protocol",
     "//third_party/wayland-protocols:linux_explicit_synchronization_protocol",
     "//third_party/wayland-protocols:org_kde_kwin_idle",
diff --git a/ui/ozone/platform/wayland/common/wayland_object.cc b/ui/ozone/platform/wayland/common/wayland_object.cc
index f4edd99..b7625c6 100644
--- a/ui/ozone/platform/wayland/common/wayland_object.cc
+++ b/ui/ozone/platform/wayland/common/wayland_object.cc
@@ -13,6 +13,7 @@
 #include <idle-client-protocol.h>
 #include <idle-inhibit-unstable-v1-client-protocol.h>
 #include <keyboard-extension-unstable-v1-client-protocol.h>
+#include <keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h>
 #include <linux-dmabuf-unstable-v1-client-protocol.h>
 #include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
 #include <overlay-prioritizer-client-protocol.h>
@@ -182,6 +183,8 @@
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zcr_alpha_compositing_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_idle_inhibit_manager_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_idle_inhibitor_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_keyboard_shortcuts_inhibit_manager_v1)
+IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_keyboard_shortcuts_inhibitor_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_linux_buffer_release_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_linux_buffer_params_v1)
 IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_linux_dmabuf_v1)
diff --git a/ui/ozone/platform/wayland/common/wayland_object.h b/ui/ozone/platform/wayland/common/wayland_object.h
index 57a6785b..ef28758 100644
--- a/ui/ozone/platform/wayland/common/wayland_object.h
+++ b/ui/ozone/platform/wayland/common/wayland_object.h
@@ -164,6 +164,8 @@
 DECLARE_WAYLAND_OBJECT_TRAITS(zcr_text_input_extension_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_idle_inhibit_manager_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_idle_inhibitor_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zwp_keyboard_shortcuts_inhibit_manager_v1)
+DECLARE_WAYLAND_OBJECT_TRAITS(zwp_keyboard_shortcuts_inhibitor_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_linux_buffer_release_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_linux_buffer_params_v1)
 DECLARE_WAYLAND_OBJECT_TRAITS(zwp_linux_dmabuf_v1)
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
index cb2720d4..43f7d25 100644
--- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
+++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
@@ -25,6 +25,7 @@
 void WaylandBufferBackingShm::RequestBufferHandle(
     base::OnceCallback<void(wl::Object<wl_buffer>)> callback) {
   DCHECK(!callback.is_null());
+  DCHECK(fd_.is_valid());
 
 // Given that buffers for canvas surfaces are submitted with alpha disabled,
 // using a format with alpha channel results in popup surfaces that have black
@@ -40,6 +41,8 @@
 #endif
   std::move(callback).Run(connection_->shm()->CreateBuffer(fd_, length_, size(),
                                                            with_alpha_channel));
+  if (UseExplicitSyncRelease())
+    auto close = std::move(fd_);
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
index fbb261d5..5b656e22 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.cc
+++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
@@ -86,6 +86,7 @@
 constexpr uint32_t kMaxXdgDecorationVersion = 1;
 constexpr uint32_t kMaxExtendedDragVersion = 1;
 constexpr uint32_t kMaxXdgOutputManagerVersion = 3;
+constexpr uint32_t kMaxKeyboardShortcutsInhibitManagerVersion = 1;
 
 int64_t ConvertTimespecToMicros(const struct timespec& ts) {
   // On 32-bit systems, the calculation cannot overflow int64_t.
@@ -517,6 +518,17 @@
     // We will create the keyboard when get them in that case.
     if (connection->seat_)
       connection->seat_->RefreshKeyboard();
+  } else if (!connection->keyboard_shortcuts_inhibit_manager_v1_ &&
+             strcmp(interface, "zwp_keyboard_shortcuts_inhibit_manager_v1") ==
+                 0) {
+    connection->keyboard_shortcuts_inhibit_manager_v1_ =
+        wl::Bind<zwp_keyboard_shortcuts_inhibit_manager_v1>(
+            registry, name,
+            std::min(version, kMaxKeyboardShortcutsInhibitManagerVersion));
+    if (!connection->keyboard_shortcuts_inhibit_manager_v1_) {
+      LOG(ERROR) << "Failed to bind zwp_keyboard_shortcuts_inhibit_manager_v1";
+      return;
+    }
   } else if (!connection->text_input_manager_v1_ &&
              strcmp(interface, "zwp_text_input_manager_v1") == 0) {
     connection->text_input_manager_v1_ = wl::Bind<zwp_text_input_manager_v1>(
diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
index 893108e..82ca03f 100644
--- a/ui/ozone/platform/wayland/host/wayland_connection.h
+++ b/ui/ozone/platform/wayland/host/wayland_connection.h
@@ -125,6 +125,10 @@
   xdg_wm_base* shell() const { return shell_.get(); }
   zxdg_shell_v6* shell_v6() const { return shell_v6_.get(); }
   wp_presentation* presentation() const { return presentation_.get(); }
+  zwp_keyboard_shortcuts_inhibit_manager_v1*
+  keyboard_shortcuts_inhibit_manager_v1() const {
+    return keyboard_shortcuts_inhibit_manager_v1_.get();
+  }
   zwp_text_input_manager_v1* text_input_manager_v1() const {
     return text_input_manager_v1_.get();
   }
@@ -359,6 +363,8 @@
   wl::Object<wp_viewporter> viewporter_;
   wl::Object<zcr_alpha_compositing_v1> alpha_compositing_;
   wl::Object<zcr_keyboard_extension_v1> keyboard_extension_v1_;
+  wl::Object<zwp_keyboard_shortcuts_inhibit_manager_v1>
+      keyboard_shortcuts_inhibit_manager_v1_;
   wl::Object<zwp_text_input_manager_v1> text_input_manager_v1_;
   wl::Object<zcr_text_input_extension_v1> text_input_extension_v1_;
   wl::Object<zwp_linux_explicit_synchronization_v1>
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
index 8af158b..5bcafde 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -443,10 +443,9 @@
   }
 }
 
-void WaylandFrameManager::OnExplicitBufferRelease(
-    WaylandSurface* surface,
-    struct wl_buffer* wl_buffer,
-    absl::optional<int32_t> fence) {
+void WaylandFrameManager::OnExplicitBufferRelease(WaylandSurface* surface,
+                                                  struct wl_buffer* wl_buffer,
+                                                  base::ScopedFD fence) {
   DCHECK(wl_buffer);
 
   // Releases may not necessarily come in order, so search the submitted
@@ -459,14 +458,12 @@
       // linux_explicit_synchronization is used.
       result->second->OnExplicitRelease(surface);
 
-      if (fence.has_value()) {
-        base::ScopedFD fd{fence.value()};
-        // Accumulate release fences into a single fence.
+      if (fence.is_valid()) {
         if (frame->merged_release_fence_fd.is_valid()) {
-          frame->merged_release_fence_fd.reset(
-              sync_merge("", frame->merged_release_fence_fd.get(), fd.get()));
+          frame->merged_release_fence_fd.reset(sync_merge(
+              "", frame->merged_release_fence_fd.get(), fence.get()));
         } else {
-          frame->merged_release_fence_fd = std::move(fd);
+          frame->merged_release_fence_fd = std::move(fence);
         }
         DCHECK(frame->merged_release_fence_fd.is_valid());
       }
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.h b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
index 51953760..789fc5ed 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.h
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
@@ -135,7 +135,7 @@
                                 gfx::GpuFenceHandle release_fence_handle);
   void OnExplicitBufferRelease(WaylandSurface* surface,
                                struct wl_buffer* wl_buffer,
-                               absl::optional<int32_t> fence);
+                               base::ScopedFD fence);
   void OnWlBufferRelease(WaylandSurface* surface, struct wl_buffer* wl_buffer);
 
   // wl_callback_listener
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.cc b/ui/ozone/platform/wayland/host/wayland_surface.cc
index e59e2a5..6491f749 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.cc
+++ b/ui/ozone/platform/wayland/host/wayland_surface.cc
@@ -5,6 +5,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_surface.h"
 
 #include <alpha-compositing-unstable-v1-client-protocol.h>
+#include <keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h>
 #include <linux-explicit-synchronization-unstable-v1-client-protocol.h>
 #include <overlay-prioritizer-client-protocol.h>
 #include <surface-augmenter-client-protocol.h>
@@ -27,6 +28,7 @@
 #include "ui/ozone/platform/wayland/host/wayland_buffer_handle.h"
 #include "ui/ozone/platform/wayland/host/wayland_connection.h"
 #include "ui/ozone/platform/wayland/host/wayland_output.h"
+#include "ui/ozone/platform/wayland/host/wayland_seat.h"
 #include "ui/ozone/platform/wayland/host/wayland_subsurface.h"
 #include "ui/ozone/platform/wayland/host/wayland_window.h"
 
@@ -76,7 +78,13 @@
       root_window_(root_window),
       surface_(connection->CreateSurface()) {}
 
-WaylandSurface::~WaylandSurface() = default;
+WaylandSurface::~WaylandSurface() {
+  if (explicit_release_callback_.is_null())
+    return;
+  for (auto& release : linux_buffer_releases_) {
+    explicit_release_callback_.Run(release.second.buffer, base::ScopedFD());
+  }
+}
 
 uint32_t WaylandSurface::GetSurfaceId() const {
   if (!surface_)
@@ -657,14 +665,25 @@
   apply_state_immediately_ = true;
 }
 
+void WaylandSurface::InhibitKeyboardShortcuts() {
+  if (auto* keyboard_shortcuts_inhibit_manager =
+          connection_->keyboard_shortcuts_inhibit_manager_v1()) {
+    keyboard_shortcuts_inhibitor_ =
+        wl::Object<zwp_keyboard_shortcuts_inhibitor_v1>(
+            zwp_keyboard_shortcuts_inhibit_manager_v1_inhibit_shortcuts(
+                keyboard_shortcuts_inhibit_manager, surface_.get(),
+                connection_->seat()->wl_object()));
+  }
+}
+
 void WaylandSurface::ExplicitRelease(
     struct zwp_linux_buffer_release_v1* linux_buffer_release,
-    absl::optional<int32_t> fence) {
+    base::ScopedFD fence) {
   auto iter = linux_buffer_releases_.find(linux_buffer_release);
   DCHECK(iter != linux_buffer_releases_.end());
   DCHECK(iter->second.buffer);
   if (!explicit_release_callback_.is_null())
-    explicit_release_callback_.Run(iter->second.buffer, fence);
+    explicit_release_callback_.Run(iter->second.buffer, std::move(fence));
   linux_buffer_releases_.erase(iter);
 }
 
@@ -769,8 +788,9 @@
     void* data,
     struct zwp_linux_buffer_release_v1* linux_buffer_release,
     int32_t fence) {
+  auto fd = base::ScopedFD(fence);
   static_cast<WaylandSurface*>(data)->ExplicitRelease(linux_buffer_release,
-                                                      fence);
+                                                      std::move(fd));
 }
 
 // static
@@ -778,7 +798,7 @@
     void* data,
     struct zwp_linux_buffer_release_v1* linux_buffer_release) {
   static_cast<WaylandSurface*>(data)->ExplicitRelease(linux_buffer_release,
-                                                      absl::nullopt);
+                                                      base::ScopedFD());
 }
 
 }  // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_surface.h b/ui/ozone/platform/wayland/host/wayland_surface.h
index 7db63467..4583971 100644
--- a/ui/ozone/platform/wayland/host/wayland_surface.h
+++ b/ui/ozone/platform/wayland/host/wayland_surface.h
@@ -10,6 +10,7 @@
 
 #include "base/callback.h"
 #include "base/containers/flat_map.h"
+#include "base/files/scoped_file.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/gfx/geometry/rect.h"
@@ -21,6 +22,7 @@
 #include "ui/gfx/overlay_transform.h"
 #include "ui/ozone/platform/wayland/common/wayland_object.h"
 
+struct zwp_keyboard_shortcuts_inhibitor_v1;
 struct zwp_linux_buffer_release_v1;
 struct zcr_blending_v1;
 
@@ -35,7 +37,7 @@
 class WaylandSurface {
  public:
   using ExplicitReleaseCallback =
-      base::RepeatingCallback<void(wl_buffer*, absl::optional<int32_t>)>;
+      base::RepeatingCallback<void(wl_buffer*, base::ScopedFD)>;
 
   WaylandSurface(WaylandConnection* connection, WaylandWindow* ro_window);
   WaylandSurface(const WaylandSurface&) = delete;
@@ -171,6 +173,10 @@
   // effect immediately.
   void SetApplyStateImmediately();
 
+  // Requests to wayland compositor to send key events even if it matches
+  // with the compositor's accelerator keys.
+  void InhibitKeyboardShortcuts();
+
  private:
   FRIEND_TEST_ALL_PREFIXES(WaylandWindowTest,
                            DoesNotCreateSurfaceSyncOnCommitWithoutBuffers);
@@ -281,6 +287,7 @@
   wl::Object<wl_surface> surface_;
   wl::Object<wp_viewport> viewport_;
   wl::Object<zcr_blending_v1> blending_;
+  wl::Object<zwp_keyboard_shortcuts_inhibitor_v1> keyboard_shortcuts_inhibitor_;
   wl::Object<zwp_linux_surface_synchronization_v1> surface_sync_;
   wl::Object<overlay_prioritized_surface> overlay_priority_surface_;
   wl::Object<augmented_surface> augmented_surface_;
@@ -299,7 +306,7 @@
   std::vector<uint32_t> entered_outputs_;
 
   void ExplicitRelease(struct zwp_linux_buffer_release_v1* linux_buffer_release,
-                       absl::optional<int32_t> fence);
+                       base::ScopedFD fence);
 
   // wl_surface_listener
   static void Enter(void* data,
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc
index 83a7ee52..a447843 100644
--- a/ui/ozone/platform/wayland/host/wayland_window.cc
+++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -579,6 +579,9 @@
     return false;
   }
 
+  if (properties.inhibit_keyboard_shortcuts)
+    root_surface_->InhibitKeyboardShortcuts();
+
   // Update visual size in tests immediately if the test config is set.
   // Otherwise, such tests as interactive_ui_tests fail.
   if (!update_visual_size_immediately_)
diff --git a/ui/platform_window/platform_window_init_properties.h b/ui/platform_window/platform_window_init_properties.h
index 4e89b99..7e12663 100644
--- a/ui/platform_window/platform_window_init_properties.h
+++ b/ui/platform_window/platform_window_init_properties.h
@@ -137,6 +137,12 @@
   int32_t restore_window_id;
 #endif
 
+#if defined(USE_OZONE)
+  // Specifies whether the current window requests key-events that matches
+  // system shortcuts.
+  bool inhibit_keyboard_shortcuts = false;
+#endif
+
   bool enable_compositing_based_throttling = false;
 
   size_t compositor_memory_limit_mb = 0;
diff --git a/ui/strings/translations/app_locale_settings_am.xtb b/ui/strings/translations/app_locale_settings_am.xtb
index 0a14aa7..002db46 100644
--- a/ui/strings/translations/app_locale_settings_am.xtb
+++ b/ui/strings/translations/app_locale_settings_am.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
 <translation id="IDS_UI_FONT_FAMILY_XP">abyssinica sil</translation>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Ethiopic, sans-serif, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Ethiopic, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_ar.xtb b/ui/strings/translations/app_locale_settings_ar.xtb
index 737f3c2a..fe3bfbd8 100644
--- a/ui/strings/translations/app_locale_settings_ar.xtb
+++ b/ui/strings/translations/app_locale_settings_ar.xtb
@@ -2,7 +2,7 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
 <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Arabic UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Arabic UI, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_bn.xtb b/ui/strings/translations/app_locale_settings_bn.xtb
index 70696f7f..6afac85 100644
--- a/ui/strings/translations/app_locale_settings_bn.xtb
+++ b/ui/strings/translations/app_locale_settings_bn.xtb
@@ -3,17 +3,17 @@
 <translationbundle lang="bn">
 <if expr="is_win">
   <translation id="IDS_UI_FONT_FAMILY">Vrinda</translation>
-  <translation id="IDS_UI_FONT_FAMILY_XP">Vrinda</translation> 
+  <translation id="IDS_UI_FONT_FAMILY_XP">Vrinda</translation>
   <translation id="IDS_UI_FONT_SIZE_SCALER_XP">160</translation>
   <translation id="IDS_UI_FONT_SIZE_SCALER">120</translation>
   <translation id="IDS_WEB_FONT_SIZE_XP">110%</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Vrinda</translation>
   <translation id="IDS_WEB_FONT_FAMILY_XP">Vrinda</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
   <translation id="IDS_WEB_FONT_FAMILY">Lohit Bengali</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Bengali UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Bengali UI, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_he.xtb b/ui/strings/translations/app_locale_settings_he.xtb
index 1667b73..0e06e1d35 100644
--- a/ui/strings/translations/app_locale_settings_he.xtb
+++ b/ui/strings/translations/app_locale_settings_he.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="he">
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Hebrew, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Hebrew, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_hi.xtb b/ui/strings/translations/app_locale_settings_hi.xtb
index ae906cd..bc08f96 100644
--- a/ui/strings/translations/app_locale_settings_hi.xtb
+++ b/ui/strings/translations/app_locale_settings_hi.xtb
@@ -4,7 +4,7 @@
 <translation id="IDS_UI_FONT_SIZE_SCALER_XP">140</translation>
 <translation id="IDS_UI_FONT_SIZE_SCALER">125</translation>
 <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Devanagari UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Devanagari UI,sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_ja.xtb b/ui/strings/translations/app_locale_settings_ja.xtb
index 347d222..5d65c473 100644
--- a/ui/strings/translations/app_locale_settings_ja.xtb
+++ b/ui/strings/translations/app_locale_settings_ja.xtb
@@ -12,10 +12,10 @@
 <if expr="is_ios">
   <translation id="IDS_WEB_FONT_FAMILY">Helvetica,Hiragino Kaku Gothic ProN,sans-serif</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
   <translation id="IDS_WEB_FONT_FAMILY">VL PGothic,Sazanami Gothic,Kochi Gothic,sans-serif</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK JP, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK JP, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_kn.xtb b/ui/strings/translations/app_locale_settings_kn.xtb
index ded61d0..398c3647 100644
--- a/ui/strings/translations/app_locale_settings_kn.xtb
+++ b/ui/strings/translations/app_locale_settings_kn.xtb
@@ -6,7 +6,7 @@
   <translation id="IDS_UI_FONT_SIZE_SCALER_XP">142</translation>
   <translation id="IDS_UI_FONT_SIZE_SCALER">130</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Kannada UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Kannada UI, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_ko.xtb b/ui/strings/translations/app_locale_settings_ko.xtb
index d414730e..1ec67fcc 100644
--- a/ui/strings/translations/app_locale_settings_ko.xtb
+++ b/ui/strings/translations/app_locale_settings_ko.xtb
@@ -12,10 +12,10 @@
 <if expr="is_ios">
   <translation id="IDS_WEB_FONT_FAMILY">Helvetica,Apple SD Gothic Neo,AppleGothic,sans-serif</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
   <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK KR,NanumGothic,UnDotum,Baekmuk Gulim,sans-serif</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK KR, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK KR, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_ml.xtb b/ui/strings/translations/app_locale_settings_ml.xtb
index b601b78..3c0fe2d 100644
--- a/ui/strings/translations/app_locale_settings_ml.xtb
+++ b/ui/strings/translations/app_locale_settings_ml.xtb
@@ -3,16 +3,16 @@
 <translationbundle lang="ml">
 <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
 <if expr="is_win">
-  <translation id="IDS_UI_FONT_FAMILY_XP">kartika</translation> 
+  <translation id="IDS_UI_FONT_FAMILY_XP">kartika</translation>
   <translation id="IDS_UI_FONT_SIZE_SCALER_XP">150</translation>
   <translation id="IDS_UI_FONT_SIZE_SCALER">120</translation>
   <translation id="IDS_WEB_FONT_FAMILY">'Segoe UI',Arial,AnjaliOldLipi,Rachana,Kartika</translation>
   <translation id="IDS_WEB_FONT_FAMILY_XP">Arial,AnjaliOldLipi,Rachana,Kartika</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
   <translation id="IDS_WEB_FONT_FAMILY">Arial,AnjaliOldLipi,Rachana,Kartika,sans-serif</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Malayalam UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Malayalam UI, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_mr.xtb b/ui/strings/translations/app_locale_settings_mr.xtb
index 7d134b7a7..c2a65b8 100644
--- a/ui/strings/translations/app_locale_settings_mr.xtb
+++ b/ui/strings/translations/app_locale_settings_mr.xtb
@@ -4,7 +4,7 @@
 <translation id="IDS_UI_FONT_SIZE_SCALER_XP">140</translation>
 <translation id="IDS_UI_FONT_SIZE_SCALER">125</translation>
 <translation id="IDS_MINIMUM_UI_FONT_SIZE">10</translation>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Devanagari UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Devanagari UI,sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_ta.xtb b/ui/strings/translations/app_locale_settings_ta.xtb
index 818ab75a..0774a8b 100644
--- a/ui/strings/translations/app_locale_settings_ta.xtb
+++ b/ui/strings/translations/app_locale_settings_ta.xtb
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Tamil UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Tamil UI,sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_te.xtb b/ui/strings/translations/app_locale_settings_te.xtb
index ce221b0..eb83bd8 100644
--- a/ui/strings/translations/app_locale_settings_te.xtb
+++ b/ui/strings/translations/app_locale_settings_te.xtb
@@ -6,7 +6,7 @@
 <translation id="IDS_UI_FONT_SIZE_SCALER_XP">145</translation>
 <translation id="IDS_UI_FONT_SIZE_SCALER">130</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Telugu UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Telugu UI, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_th.xtb b/ui/strings/translations/app_locale_settings_th.xtb
index 84e290df..d021fab 100644
--- a/ui/strings/translations/app_locale_settings_th.xtb
+++ b/ui/strings/translations/app_locale_settings_th.xtb
@@ -6,10 +6,10 @@
   <translation id="IDS_WEB_FONT_FAMILY">Tahoma,sans-serif</translation>
   <translation id="IDS_WEB_FONT_FAMILY_XP">Tahoma,sans-serif</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
   <translation id="IDS_WEB_FONT_FAMILY">Norasi,Waree,Garuda,Loma,sans-serif</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans Thai UI, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans Thai UI,sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_zh-CN.xtb b/ui/strings/translations/app_locale_settings_zh-CN.xtb
index 4d0f101..ab4204c3 100644
--- a/ui/strings/translations/app_locale_settings_zh-CN.xtb
+++ b/ui/strings/translations/app_locale_settings_zh-CN.xtb
@@ -12,10 +12,10 @@
 <if expr="is_ios">
   <translation id="IDS_WEB_FONT_FAMILY">Helvetica,PingFang SC,STHeiti,sans-serif</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
   <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation>
 </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK SC, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK SC, sans-serif</translation>
 </if>
diff --git a/ui/strings/translations/app_locale_settings_zh-TW.xtb b/ui/strings/translations/app_locale_settings_zh-TW.xtb
index 28a2035..4e6881fb 100644
--- a/ui/strings/translations/app_locale_settings_zh-TW.xtb
+++ b/ui/strings/translations/app_locale_settings_zh-TW.xtb
@@ -12,10 +12,10 @@
 <if expr="is_ios">
   <translation id="IDS_WEB_FONT_FAMILY">Helvetica,PingFang TC,Heiti TC,sans-serif</translation>
 </if>
-<if expr="is_linux and not chromeos_ash or chromeos_lacros">
+<if expr="is_linux and not chromeos_ash and not chromeos_lacros">
     <translation id="IDS_WEB_FONT_FAMILY">Noto Sans CJK SC, WenQuanYi Zen Hei, sans-serif</translation>
   </if>
-<if expr="chromeos_ash">
+<if expr="chromeos_ash or chromeos_lacros">
   <translation id="IDS_UI_FONT_FAMILY_CROS">Roboto, Noto Sans CJK TC, 13px</translation>
   <translation id="IDS_WEB_FONT_FAMILY">Roboto, Noto Sans CJK TC, sans-serif</translation>
 </if>
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index 426bffc..a76e3c3 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -154,6 +154,7 @@
         properties.parent_widget = host->GetAcceleratedWidget();
     }
   }
+  properties.inhibit_keyboard_shortcuts = params.inhibit_keyboard_shortcuts;
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS)
diff --git a/ui/views/widget/root_view_unittest.cc b/ui/views/widget/root_view_unittest.cc
index 782dc49..f0186dea 100644
--- a/ui/views/widget/root_view_unittest.cc
+++ b/ui/views/widget/root_view_unittest.cc
@@ -27,8 +27,40 @@
 
 namespace views {
 namespace test {
+namespace {
 
-using RootViewTest = ViewsTestBase;
+struct RootViewTestStateInit {
+  gfx::Rect bounds;
+  Widget::InitParams::Type type = Widget::InitParams::TYPE_WINDOW_FRAMELESS;
+};
+
+class RootViewTestState {
+ public:
+  explicit RootViewTestState(ViewsTestBase* delegate,
+                             RootViewTestStateInit init = {}) {
+    Widget::InitParams init_params = delegate->CreateParams(init.type);
+    init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
+    if (init.bounds != gfx::Rect())
+      init_params.bounds = init.bounds;
+    widget_.Init(std::move(init_params));
+    widget_.Show();
+    widget_.SetContentsView(std::make_unique<View>());
+  }
+
+  Widget* widget() { return &widget_; }
+
+  internal::RootView* GetRootView() {
+    return static_cast<internal::RootView*>(widget_.GetRootView());
+  }
+
+  template <typename T>
+  T* AddChildView(std::unique_ptr<T> view) {
+    return widget_.GetContentsView()->AddChildView(std::move(view));
+  }
+
+ private:
+  Widget widget_;
+};
 
 class DeleteOnKeyEventView : public View {
  public:
@@ -50,29 +82,24 @@
   raw_ptr<bool> set_on_key_;
 };
 
+}  // namespace
+
+using RootViewTest = ViewsTestBase;
+
 // Verifies deleting a View in OnKeyPressed() doesn't crash and that the
 // target is marked as destroyed in the returned EventDispatchDetails.
 TEST_F(RootViewTest, DeleteViewDuringKeyEventDispatch) {
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.Show();
+  RootViewTestState state(this);
+  internal::RootView* root_view = state.GetRootView();
 
   bool got_key_event = false;
-
-  View* content = widget.SetContentsView(std::make_unique<View>());
-
-  View* child = new DeleteOnKeyEventView(&got_key_event);
-  content->AddChildView(child);
+  View* child = state.AddChildView(
+      std::make_unique<DeleteOnKeyEventView>(&got_key_event));
 
   // Give focus to |child| so that it will be the target of the key event.
   child->SetFocusBehavior(View::FocusBehavior::ALWAYS);
   child->RequestFocus();
 
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
   ViewTargeter* view_targeter = new ViewTargeter(root_view);
   root_view->SetEventTargeter(base::WrapUnique(view_targeter));
 
@@ -124,17 +151,11 @@
 TEST_F(RootViewTest, ContextMenuFromKeyEvent) {
   // This behavior is intentionally unsupported on macOS.
 #if !BUILDFLAG(IS_MAC)
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
+  RootViewTestState state(this);
+  internal::RootView* root_view = state.GetRootView();
 
   TestContextMenuController controller;
-  View* focused_view = widget.SetContentsView(std::make_unique<View>());
+  View* focused_view = root_view->GetContentsView();
   focused_view->set_context_menu_controller(&controller);
   focused_view->SetFocusBehavior(View::FocusBehavior::ALWAYS);
   focused_view->RequestFocus();
@@ -200,52 +221,31 @@
 };
 
 TEST_F(RootViewTest, EventHandlersResetWhenDeleted) {
-  // Set up a widget + rootview
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = gfx::Rect(100, 100);
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-  View* contents_view = widget.SetContentsView(std::make_unique<View>());
+  RootViewTestState state(this, {.bounds = {100, 100}});
+  internal::RootView* root_view = state.GetRootView();
 
-  // Set up a child view to handle events
-  View* event_handler =
-      contents_view->AddChildView(std::make_unique<views::View>());
+  // Set up a child view to handle events.
+  View* event_handler = state.AddChildView(std::make_unique<View>());
   root_view->SetMouseAndGestureHandler(event_handler);
   ASSERT_EQ(event_handler, root_view->gesture_handler_for_testing());
 
-  // Delete the child and expect that there is no longer a mouse handler
-  contents_view->RemoveChildViewT(event_handler);
+  // Delete the child and expect that there is no longer a mouse handler.
+  root_view->GetContentsView()->RemoveChildViewT(event_handler);
   EXPECT_EQ(nullptr, root_view->gesture_handler_for_testing());
 }
 
 TEST_F(RootViewTest, EventHandlersNotResetWhenReparented) {
-  // Set up a widget + rootview
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = gfx::Rect(100, 100);
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-  View* contents_view = widget.SetContentsView(std::make_unique<View>());
+  RootViewTestState state(this, {.bounds = {100, 100}});
+  internal::RootView* root_view = state.GetRootView();
 
   // Set up a child view to handle events
-  View* event_handler =
-      contents_view->AddChildView(std::make_unique<views::View>());
+  View* event_handler = state.AddChildView(std::make_unique<View>());
   root_view->SetMouseAndGestureHandler(event_handler);
   ASSERT_EQ(event_handler, root_view->gesture_handler_for_testing());
 
-  // Reparent the child within the hierarchyand expect that it's still the mouse
-  // handler
-  View* other_parent =
-      contents_view->AddChildView(std::make_unique<views::View>());
+  // Reparent the child within the hierarchy and expect that it's still the
+  // mouse handler.
+  View* other_parent = state.AddChildView(std::make_unique<View>());
   other_parent->AddChildView(event_handler);
   EXPECT_EQ(event_handler, root_view->gesture_handler_for_testing());
 }
@@ -257,25 +257,17 @@
 // released. We may remove this test in the future if the implementation of the
 // product code changes.
 TEST_F(RootViewTest, GestureHandlerResetAfterMouseReleased) {
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = gfx::Rect(100, 100);
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-  View* contents_view = widget.SetContentsView(std::make_unique<View>());
+  RootViewTestState state(this, {.bounds = {100, 100}});
+  internal::RootView* root_view = state.GetRootView();
 
   // Create a child view to handle gestures.
   View* gesture_handler =
-      contents_view->AddChildView(std::make_unique<GestureHandlingView>());
+      state.AddChildView(std::make_unique<GestureHandlingView>());
   gesture_handler->SetBoundsRect(gfx::Rect(gfx::Size{50, 50}));
 
   // Create a child view to handle mouse events.
   View* mouse_handler =
-      contents_view->AddChildView(std::make_unique<MouseHandlingView>());
+      state.AddChildView(std::make_unique<MouseHandlingView>());
   mouse_handler->SetBoundsRect(
       gfx::Rect(gesture_handler->bounds().bottom_right(), gfx::Size{50, 50}));
 
@@ -316,18 +308,14 @@
 // installed on the RootView only if the event is targetted at a view which can
 // show a context menu.
 TEST_F(RootViewTest, ContextMenuFromLongPress) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = gfx::Rect(100, 100);
-  widget.Init(std::move(init_params));
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
+  RootViewTestState state(
+      this, {.bounds = {100, 100}, .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
+  View* parent_view = root_view->GetContentsView();
 
   // Create a view capable of showing the context menu with two children one of
   // which handles all gesture events (e.g. a button).
   TestContextMenuController controller;
-  View* parent_view = widget.SetContentsView(std::make_unique<View>());
   parent_view->set_context_menu_controller(&controller);
 
   View* gesture_handling_child_view = new GestureHandlingView;
@@ -388,19 +376,15 @@
 
 // Tests that context menus are not shown for disabled views on a long press.
 TEST_F(RootViewTest, ContextMenuFromLongPressOnDisabledView) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = gfx::Rect(100, 100);
-  widget.Init(std::move(init_params));
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
+  RootViewTestState state(
+      this, {.bounds = {100, 100}, .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
+  View* parent_view = root_view->GetContentsView();
 
   // Create a view capable of showing the context menu with two children one of
   // which handles all gesture events (e.g. a button). Also mark this view
   // as disabled.
   TestContextMenuController controller;
-  View* parent_view = widget.SetContentsView(std::make_unique<View>());
   parent_view->set_context_menu_controller(&controller);
   parent_view->SetEnabled(false);
 
@@ -540,21 +524,14 @@
 
 // Verifies deleting a View in OnMouseExited() doesn't crash.
 TEST_F(RootViewTest, DeleteViewOnMouseExitDispatch) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.SetBounds(gfx::Rect(10, 10, 500, 500));
-
-  View* content = widget.SetContentsView(std::make_unique<View>());
-
+  RootViewTestState state(this, {.bounds = {10, 10, 500, 500},
+                                 .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
   bool view_destroyed = false;
-  View* child = new DeleteViewOnEvent(ui::ET_MOUSE_EXITED, &view_destroyed);
-  content->AddChildView(child);
-  child->SetBounds(10, 10, 500, 500);
 
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
+  View* child = state.AddChildView(std::make_unique<DeleteViewOnEvent>(
+      ui::ET_MOUSE_EXITED, &view_destroyed));
+  child->SetBounds(10, 10, 500, 500);
 
   // Generate a mouse move event which ensures that |mouse_moved_handler_|
   // is set in the RootView class.
@@ -571,29 +548,22 @@
   root_view->OnMouseExited(exit_event);
 
   EXPECT_TRUE(view_destroyed);
-  EXPECT_TRUE(content->children().empty());
+  EXPECT_TRUE(root_view->GetContentsView()->children().empty());
 }
 
 // Verifies deleting a View in OnMouseEntered() doesn't crash.
 TEST_F(RootViewTest, DeleteViewOnMouseEnterDispatch) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.SetBounds(gfx::Rect(10, 10, 500, 500));
-
-  View* content = widget.SetContentsView(std::make_unique<View>());
-
+  RootViewTestState state(this, {.bounds = {10, 10, 500, 500},
+                                 .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
   bool view_destroyed = false;
-  View* child = new DeleteViewOnEvent(ui::ET_MOUSE_ENTERED, &view_destroyed);
-  content->AddChildView(child);
+
+  View* child = state.AddChildView(std::make_unique<DeleteViewOnEvent>(
+      ui::ET_MOUSE_ENTERED, &view_destroyed));
 
   // Make |child| smaller than the containing Widget and RootView.
   child->SetBounds(100, 100, 100, 100);
 
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-
   // Move the mouse within |widget| but outside of |child|.
   ui::MouseEvent moved_event(ui::ET_MOUSE_MOVED, gfx::Point(15, 15),
                              gfx::Point(15, 15), ui::EventTimeForNow(), 0, 0);
@@ -609,18 +579,15 @@
   root_view->OnMouseMoved(moved_event2);
 
   EXPECT_TRUE(view_destroyed);
-  EXPECT_TRUE(content->children().empty());
+  EXPECT_TRUE(root_view->GetContentsView()->children().empty());
 }
 
 // Verifies removing a View in OnMouseEntered() doesn't crash.
 TEST_F(RootViewTest, RemoveViewOnMouseEnterDispatch) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.SetBounds(gfx::Rect(10, 10, 500, 500));
-
-  View* content = widget.SetContentsView(std::make_unique<View>());
+  RootViewTestState state(this, {.bounds = {10, 10, 500, 500},
+                                 .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
+  View* content = root_view->GetContentsView();
 
   // |child| gets removed without being deleted, so make it a local
   // to prevent test memory leak.
@@ -631,9 +598,6 @@
   // Make |child| smaller than the containing Widget and RootView.
   child.SetBounds(100, 100, 100, 100);
 
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-
   // Move the mouse within |widget| but outside of |child|.
   ui::MouseEvent moved_event(ui::ET_MOUSE_MOVED, gfx::Point(15, 15),
                              gfx::Point(15, 15), ui::EventTimeForNow(), 0, 0);
@@ -653,18 +617,12 @@
 // Verifies clearing the root view's |mouse_move_handler_| in OnMouseExited()
 // doesn't crash.
 TEST_F(RootViewTest, ClearMouseMoveHandlerOnMouseExitDispatch) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.SetBounds(gfx::Rect(10, 10, 500, 500));
+  RootViewTestState state(this, {.bounds = {10, 10, 500, 500},
+                                 .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
 
-  View* content = widget.SetContentsView(std::make_unique<View>());
-
-  View* root_view = widget.GetRootView();
-
-  View* child = new NestedEventOnEvent(ui::ET_MOUSE_EXITED, root_view);
-  content->AddChildView(child);
+  View* child = state.AddChildView(
+      std::make_unique<NestedEventOnEvent>(ui::ET_MOUSE_EXITED, root_view));
   // Make |child| smaller than the containing Widget and RootView.
   child->SetBounds(100, 100, 100, 100);
 
@@ -688,18 +646,12 @@
 // it's the first enabled view encountered walking up the target tree.
 TEST_F(RootViewTest,
        ClearMouseMoveHandlerOnMouseExitDispatchWithContentViewDisabled) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.SetBounds(gfx::Rect(10, 10, 500, 500));
+  RootViewTestState state(this, {.bounds = {10, 10, 500, 500},
+                                 .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
 
-  View* content = widget.SetContentsView(std::make_unique<View>());
-
-  View* root_view = widget.GetRootView();
-
-  View* child = new NestedEventOnEvent(ui::ET_MOUSE_EXITED, root_view);
-  content->AddChildView(child);
+  View* child = state.AddChildView(
+      std::make_unique<NestedEventOnEvent>(ui::ET_MOUSE_EXITED, root_view));
 
   // Make |child| smaller than the containing Widget and RootView.
   child->SetBounds(100, 100, 100, 100);
@@ -712,7 +664,7 @@
 
   // This will make RootView::OnMouseMoved skip the content view when looking
   // for a handler for the mouse event, and instead use the root view.
-  content->SetEnabled(false);
+  root_view->GetContentsView()->SetEnabled(false);
   // Move the mouse outside of |child| which should dispatch a mouse exit event
   // to |mouse_move_handler_| (currently |child|), which will in turn generate a
   // nested event that clears |mouse_move_handler_|. This should not crash
@@ -725,18 +677,12 @@
 // Verifies clearing the root view's |mouse_move_handler_| in OnMouseEntered()
 // doesn't crash.
 TEST_F(RootViewTest, ClearMouseMoveHandlerOnMouseEnterDispatch) {
-  Widget widget;
-  Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  widget.Init(std::move(init_params));
-  widget.SetBounds(gfx::Rect(10, 10, 500, 500));
+  RootViewTestState state(this, {.bounds = {10, 10, 500, 500},
+                                 .type = Widget::InitParams::TYPE_POPUP});
+  internal::RootView* root_view = state.GetRootView();
 
-  View* content = widget.SetContentsView(std::make_unique<View>());
-
-  View* root_view = widget.GetRootView();
-
-  View* child = new NestedEventOnEvent(ui::ET_MOUSE_ENTERED, root_view);
-  content->AddChildView(child);
+  View* child = state.AddChildView(
+      std::make_unique<NestedEventOnEvent>(ui::ET_MOUSE_ENTERED, root_view));
 
   // Make |child| smaller than the containing Widget and RootView.
   child->SetBounds(100, 100, 100, 100);
@@ -909,16 +855,8 @@
 // Tests that AnnounceText sets up the correct text value on the hidden view,
 // and that the resulting hidden view actually stays hidden.
 TEST_F(RootViewTest, AnnounceTextTest) {
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = {100, 100, 100, 100};
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-  root_view->SetContentsView(new View());
+  RootViewTestState state(this, {.bounds = {100, 100, 100, 100}});
+  internal::RootView* root_view = state.GetRootView();
 
   EXPECT_EQ(1U, root_view->children().size());
   const std::u16string kText = u"Text";
@@ -937,16 +875,8 @@
 #endif  // !BUILDFLAG(IS_MAC)
 
 TEST_F(RootViewTest, MouseEventDispatchedToClosestEnabledView) {
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = {100, 100, 100, 100};
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-  root_view->SetContentsView(new View());
+  RootViewTestState state(this, {.bounds = {100, 100, 100, 100}});
+  internal::RootView* root_view = state.GetRootView();
 
   View* const contents_view = root_view->GetContentsView();
   EventCountView* const v1 =
@@ -996,16 +926,8 @@
 // was handled. However, it should *not* if the first click was unhandled.
 // Regression test for https://crbug.com/1055674.
 TEST_F(RootViewTest, DoubleClickHandledIffFirstClickHandled) {
-  Widget widget;
-  Widget::InitParams init_params =
-      CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
-  init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
-  init_params.bounds = {100, 100, 100, 100};
-  widget.Init(std::move(init_params));
-  widget.Show();
-  internal::RootView* root_view =
-      static_cast<internal::RootView*>(widget.GetRootView());
-  root_view->SetContentsView(new View());
+  RootViewTestState state(this, {.bounds = {100, 100, 100, 100}});
+  internal::RootView* root_view = state.GetRootView();
 
   View* const contents_view = root_view->GetContentsView();
   EventCountView* const v1 =
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h
index 0100fd5d..906d3576 100644
--- a/ui/views/widget/widget.h
+++ b/ui/views/widget/widget.h
@@ -404,6 +404,13 @@
     // properties in |init_properties_container| will be moved to the native
     // widget.
     ui::PropertyHandler init_properties_container;
+
+#if defined(USE_OZONE)
+    // Only used by Wayland for root level windows. Specifies whether this
+    // window should request the wayland compositor to send key events,
+    // even if it matches with the compositor's keyboard shortcuts.
+    bool inhibit_keyboard_shortcuts = false;
+#endif
   };
 
   // Represents a lock held on the widget's ShouldPaintAsActive() state. As
diff --git a/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts b/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts
index 521385a..f35a328 100644
--- a/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts
+++ b/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts
@@ -11,10 +11,10 @@
 const ANCHOR_HIGHLIGHT_CLASS = 'iph-anchor-highlight';
 
 enum Position {
-  Above = 'above',
-  Below = 'below',
-  Left = 'left',
-  Right = 'right',
+  ABOVE = 'above',
+  BELOW = 'below',
+  LEFT = 'left',
+  RIGHT = 'right',
 }
 
 export interface IPHBubbleElement {
@@ -61,7 +61,7 @@
        * bubble's arrow points. Must be one of 'above', 'below', 'left' or
        * 'right'. Required.
        */
-      position: {type: Position, value: Position.Above},
+      position: {type: Position, value: Position.ABOVE},
     };
   }
 
@@ -130,28 +130,28 @@
     const anchorTop = anchorRect.top - parentRect.top;
     let iphLeft: string, iphTop: string, iphTransform: string;
     switch (this.position) {
-      case Position.Above:
+      case Position.ABOVE:
         // Anchor the iph bubble to the top center of the anchor element.
         iphTop = `${anchorTop - offset}px`;
         iphLeft = `${anchorLeft + anchorRect.width / 2}px`;
         // Horizontally center the iph bubble.
         iphTransform = `translate(-50%, -100%)`;
         break;
-      case Position.Below:
+      case Position.BELOW:
         // Anchor the iph bubble to the bottom center of the anchor element.
         iphTop = `${anchorTop + anchorRect.height + offset}px`;
         iphLeft = `${anchorLeft + anchorRect.width / 2}px`;
         // Horizontally center the iph bubble.
         iphTransform = `translateX(-50%)`;
         break;
-      case Position.Left:
+      case Position.LEFT:
         // Anchor the iph bubble to the center left of the anchor element.
         iphTop = `${anchorTop + anchorRect.height / 2}px`;
         iphLeft = `${anchorLeft - offset}px`;
         // Vertically center the iph bubble.
         iphTransform = `translate(-100%, -50%)`;
         break;
-      case Position.Right:
+      case Position.RIGHT:
         // Anchor the iph bubble to the center right of the anchor element.
         iphTop = `${anchorTop + anchorRect.height / 2}px`;
         iphLeft = `${anchorLeft + anchorRect.width + offset}px`;