diff --git a/DEPS b/DEPS
index 0d752db3..73bbc08 100644
--- a/DEPS
+++ b/DEPS
@@ -190,7 +190,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:d10ff2af1182ccaad573bc5acb84a36f4c280876',
+  'luci_go': 'git_revision:b36efc79b549f8aeb29ce40079891e1acb6c6bb2',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -222,11 +222,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '3d49efa8e1775512b47a5363b208c26d13d82bff',
+  'skia_revision': '230a2514d6998866afacb5f3aa796e28447ed25c',
   # 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': '7744dce208a555494e4a33e24fadc71ea20b3895',
+  'v8_revision': '10df900d12a671fb7a17514c0b62203df2ebaf2b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -234,7 +234,7 @@
   # 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': '9ddaa68604ae0563743909fa1d27b56a47777fee',
+  'angle_revision': '5fb3a549f6a976c03cf7f94a7114d06d8e2c35d9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -269,7 +269,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': '96c11240b652b05d2708e73c9ce837dfea2208cc',
+  'nacl_revision': '99d0376791a10d3e8d16d0884b0222853567d7cc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -301,7 +301,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': '8ca22702d4bfb957d532f0bc25131d39f7e14609',
+  'devtools_frontend_revision': '947b4d23d6bbfb5521c1cb49d1788059531aa2a8',
   # 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.
@@ -581,7 +581,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '57b98fffd5567c587cc24639b8582a8995e5575a',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '1afa18ee17b71d17e9e23bf0584be0600c975667',
       'condition': 'checkout_ios',
   },
 
@@ -738,7 +738,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'YiuL0FMMTU_K_n0aBAT3GBA4dMfL8JHhn6dkcz5SFgAC',
+          'version': 'S6dCY92KZR4uySXoIPzDOReE8nJYQNPXboKDPsSdhpYC',
       },
     ],
     'condition': 'checkout_android',
@@ -1360,7 +1360,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'c647483ca5ff97691d327dc2224995e47d3dc899',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'b72f3ccca5e6ec7e47a05a947156e6378d08b2a7',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1592,7 +1592,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'b5cc3b2500c0ba9e8a1381b357e1a6c341c9f297',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '63cc46c1f5b0ed5012465f391d5fd7c5717aeab4',
+    Var('webrtc_git') + '/src.git' + '@' + '261af57d751d38be5cf234e4c146f8849d37e621',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1619,7 +1619,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'v3HXOS7MJkC2TfycHGZS1dHlQ_BosbzqLeuDXXLbxMUC',
+          'version': 'up6EUcZzuFZnm2JCEV1eW0TwCEAZjPcqtS2CsZN-3qAC',
         },
       ],
       'dep_type': 'cipd',
@@ -1629,7 +1629,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': '5vRobMZ1N26UvonRAdJZ66IEfzd3vF8r6z8j4Nqrhc8C',
+          'version': 'pLY1rCmGsL8vtV0wWxgqY3sOWkwIxuRh6PMIn_0BDcAC',
         },
       ],
       'dep_type': 'cipd',
@@ -1639,7 +1639,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'nx0V9Budj8K1DfPIdKA9oakeQE7SPTMIvVwqzX0DkF4C',
+          'version': 'eR_S1Urlw9be4WKiQcXwEcBn9KiDrWknodT82I6vw-kC',
         },
       ],
       'dep_type': 'cipd',
@@ -1653,7 +1653,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b908e564b6c733b1bca87f5740e73f954fc7b093',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bdc84d211a2b7a85a7b08ebfe4fcd67688e25571',
     'condition': 'checkout_src_internal',
   },
 
@@ -1683,7 +1683,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': '6Sq1hUX203irl6wSqJdF_YGYnIfvJ4wMJccLhRrAyjoC',
+        'version': 'jzPmlIFX_8ujI4LD-boxkoDuNOMBHQSXv0CK-7wQ9eEC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 67e5ad6..7551075 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -50,8 +50,12 @@
     "accelerometer/accelerometer_constants.h",
     "accelerometer/accelerometer_file_reader.cc",
     "accelerometer/accelerometer_file_reader.h",
+    "accelerometer/accelerometer_provider_mojo.cc",
+    "accelerometer/accelerometer_provider_mojo.h",
     "accelerometer/accelerometer_reader.cc",
     "accelerometer/accelerometer_reader.h",
+    "accelerometer/accelerometer_samples_observer.cc",
+    "accelerometer/accelerometer_samples_observer.h",
     "accelerometer/accelerometer_types.cc",
     "accelerometer/accelerometer_types.h",
     "accessibility/accessibility_controller_impl.cc",
@@ -1868,6 +1872,8 @@
     "//chromeos/components/quick_answers",
     "//chromeos/components/quick_answers/public/cpp:prefs",
     "//chromeos/components/sensors:buildflags",
+    "//chromeos/components/sensors:sensors",
+    "//chromeos/components/sensors/mojom",
     "//chromeos/crosapi/cpp",
     "//chromeos/dbus",
     "//chromeos/dbus/audio",
@@ -2007,23 +2013,6 @@
 
     deps += [ "//chromeos/assistant/internal/ambient" ]
   }
-
-  if (use_iioservice) {
-    sources -= [
-      "accelerometer/accelerometer_file_reader.cc",
-      "accelerometer/accelerometer_file_reader.h",
-    ]
-    sources += [
-      "accelerometer/accelerometer_provider_mojo.cc",
-      "accelerometer/accelerometer_provider_mojo.h",
-      "accelerometer/accelerometer_samples_observer.cc",
-      "accelerometer/accelerometer_samples_observer.h",
-    ]
-    deps += [
-      "//chromeos/components/sensors:sensors",
-      "//chromeos/components/sensors/mojom",
-    ]
-  }
 }
 
 action("dbus_service_files") {
@@ -2054,6 +2043,8 @@
     "accelerators/accelerator_unittest.cc",
     "accelerators/magnifier_key_scroller_unittest.cc",
     "accelerators/spoken_feedback_toggler_unittest.cc",
+    "accelerometer/accelerometer_provider_mojo_unittest.cc",
+    "accelerometer/accelerometer_samples_observer_unittest.cc",
     "accessibility/accessibility_controller_unittest.cc",
     "accessibility/autoclick/autoclick_drag_event_rewriter_unittest.cc",
     "accessibility/autoclick/autoclick_unittest.cc",
@@ -2516,6 +2507,9 @@
     "//chromeos/components/feature_usage",
     "//chromeos/components/phonehub:test_support",
     "//chromeos/components/quick_answers:quick_answers",
+    "//chromeos/components/sensors:sensors",
+    "//chromeos/components/sensors:test_support",
+    "//chromeos/components/sensors/mojom",
     "//chromeos/dbus:test_support",
     "//chromeos/dbus/audio",
     "//chromeos/dbus/hammerd",
@@ -2633,18 +2627,6 @@
     "//content/public/browser",
     "//content/public/common",
   ]
-
-  if (use_iioservice) {
-    sources += [
-      "accelerometer/accelerometer_provider_mojo_unittest.cc",
-      "accelerometer/accelerometer_samples_observer_unittest.cc",
-    ]
-    deps += [
-      "//chromeos/components/sensors:sensors",
-      "//chromeos/components/sensors:test_support",
-      "//chromeos/components/sensors/mojom",
-    ]
-  }
 }
 
 # TODO(oshima): Remove or migrate to new ash_ui_perftests
diff --git a/ash/components/account_manager/account_manager_factory.cc b/ash/components/account_manager/account_manager_factory.cc
index 83938875..a281b5c 100644
--- a/ash/components/account_manager/account_manager_factory.cc
+++ b/ash/components/account_manager/account_manager_factory.cc
@@ -9,7 +9,7 @@
 
 #include "base/macros.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 
 namespace ash {
 
@@ -23,18 +23,21 @@
   return GetAccountManagerHolder(profile_path).account_manager.get();
 }
 
-crosapi::AccountManagerAsh* AccountManagerFactory::GetAccountManagerAsh(
+crosapi::AccountManagerMojoService*
+AccountManagerFactory::GetAccountManagerMojoService(
     const std::string& profile_path) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  return GetAccountManagerHolder(profile_path).account_manager_ash.get();
+  return GetAccountManagerHolder(profile_path)
+      .account_manager_mojo_service.get();
 }
 
 AccountManagerFactory::AccountManagerHolder::AccountManagerHolder(
     std::unique_ptr<account_manager::AccountManager> account_manager,
-    std::unique_ptr<crosapi::AccountManagerAsh> account_manager_ash)
+    std::unique_ptr<crosapi::AccountManagerMojoService>
+        account_manager_mojo_service)
     : account_manager(std::move(account_manager)),
-      account_manager_ash(std::move(account_manager_ash)) {}
+      account_manager_mojo_service(std::move(account_manager_mojo_service)) {}
 
 AccountManagerFactory::AccountManagerHolder::~AccountManagerHolder() = default;
 
@@ -44,13 +47,14 @@
   auto it = account_managers_.find(profile_path);
   if (it == account_managers_.end()) {
     auto account_manager = std::make_unique<account_manager::AccountManager>();
-    auto account_manager_ash =
-        std::make_unique<crosapi::AccountManagerAsh>(account_manager.get());
+    auto account_manager_mojo_service =
+        std::make_unique<crosapi::AccountManagerMojoService>(
+            account_manager.get());
     it = account_managers_
-             .emplace(std::piecewise_construct,
-                      std::forward_as_tuple(profile_path),
-                      std::forward_as_tuple(std::move(account_manager),
-                                            std::move(account_manager_ash)))
+             .emplace(
+                 std::piecewise_construct, std::forward_as_tuple(profile_path),
+                 std::forward_as_tuple(std::move(account_manager),
+                                       std::move(account_manager_mojo_service)))
              .first;
   }
   return it->second;
diff --git a/ash/components/account_manager/account_manager_factory.h b/ash/components/account_manager/account_manager_factory.h
index 716d07e..248a6a7 100644
--- a/ash/components/account_manager/account_manager_factory.h
+++ b/ash/components/account_manager/account_manager_factory.h
@@ -17,7 +17,7 @@
 }  // namespace account_manager
 
 namespace crosapi {
-class AccountManagerAsh;
+class AccountManagerMojoService;
 }  // namespace crosapi
 
 namespace ash {
@@ -42,28 +42,31 @@
   account_manager::AccountManager* GetAccountManager(
       const std::string& profile_path);
 
-  // Returns the |AccountManagerAsh| corresponding to the given |profile_path|.
-  crosapi::AccountManagerAsh* GetAccountManagerAsh(
+  // Returns the |AccountManagerMojoService| corresponding to the given
+  // |profile_path|.
+  crosapi::AccountManagerMojoService* GetAccountManagerMojoService(
       const std::string& profile_path);
 
  private:
   struct AccountManagerHolder {
     AccountManagerHolder(
         std::unique_ptr<account_manager::AccountManager> account_manager,
-        std::unique_ptr<crosapi::AccountManagerAsh> account_manager_ash);
+        std::unique_ptr<crosapi::AccountManagerMojoService>
+            account_manager_mojo_service);
     AccountManagerHolder(const AccountManagerHolder&) = delete;
     AccountManagerHolder& operator=(const AccountManagerHolder&) = delete;
     ~AccountManagerHolder();
 
     const std::unique_ptr<account_manager::AccountManager> account_manager;
-    const std::unique_ptr<crosapi::AccountManagerAsh> account_manager_ash;
+    const std::unique_ptr<crosapi::AccountManagerMojoService>
+        account_manager_mojo_service;
   };
 
   const AccountManagerHolder& GetAccountManagerHolder(
       const std::string& profile_path);
 
   // A mapping from Profile path to an |AccountManagerHolder|. Acts a cache of
-  // Account Managers and AccountManagerAsh objects.
+  // Account Managers and AccountManagerMojoService objects.
   std::unordered_map<std::string, AccountManagerHolder> account_managers_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 4cbf3b8..cb734385 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -482,7 +482,7 @@
 // Enables mounting various archive formats in Files App.
 // https://crbug.com/1216245
 const base::Feature kFilesArchivemount{"FilesArchivemount",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
+                                       base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable the updated banner framework.
 // https://crbug.com/1228128
@@ -1096,6 +1096,11 @@
 const base::Feature kVirtualKeyboardMultipaste{
     "VirtualKeyboardMultipaste", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enable or disable showing multipaste suggestions in virtual keyboard on
+// Chrome OS.
+const base::Feature kVirtualKeyboardMultipasteSuggestion{
+    "VirtualKeyboardMultipasteSuggestion", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enable or disable the chrome://vm page
 const base::Feature kVmStatusPage{"VmStatusPage",
                                   base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index bf35045..b0c35075 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -378,6 +378,9 @@
 extern const base::Feature kSmartLockUIRevamp;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kSplitSettingsSync;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kStylusBatteryStatus;
+COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kSyncConsentOptional;
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kSyncSettingsCategorization;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kSystemLatinPhysicalTyping;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -409,6 +412,8 @@
 extern const base::Feature kVirtualKeyboardBorderedKey;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kVirtualKeyboardMultipaste;
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kVirtualKeyboardMultipasteSuggestion;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kVmStatusPage;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kWakeOnWifiAllowed;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kWallpaperWebUI;
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
index 51e06197..269451f 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
@@ -126,6 +126,7 @@
 <translation id="526651782186312376">تحديد النص حتى بداية السطر</translation>
 <translation id="5316716239522500219">نسخ الشاشات</translation>
 <translation id="539072479502328326">تفعيل وضع "المكبّر الذي تم إرساؤه" أو إيقافه</translation>
+<translation id="5466615362193675484">تبديل القائمة لتفعيل وضع قفل ميزة تغيير الحجم</translation>
 <translation id="5541719484267030947">أثناء سحب علامة التبويب، اضغط على <ph name="ESC" /></translation>
 <translation id="5554139136362089836">البحث في الصفحة الحالية</translation>
 <translation id="5563050856984839829">اضغط على <ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> وانقر على رابط</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb
index 2e1a12f..3fc3c9b4 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb
@@ -126,6 +126,7 @@
 <translation id="526651782186312376">শাৰীটোৰ আৰম্ভণিৰ ফালৰ পাঠ বাছনি কৰক</translation>
 <translation id="5316716239522500219">আইনা মনিটৰ</translation>
 <translation id="539072479502328326">ড'ক কৰা বিৱৰ্ধক অন বা অফ কৰক</translation>
+<translation id="5466615362193675484">লক ম’ডৰ আকাৰ সলনি কৰাৰ মেনু ট’গল কৰক</translation>
 <translation id="5541719484267030947">টেবটো টানি আনোতে, <ph name="ESC" /> টিপক</translation>
 <translation id="5554139136362089836">বৰ্তমানৰ পৃষ্ঠাটো সন্ধান কৰক</translation>
 <translation id="5563050856984839829"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> টিপক আৰু এটা লিংকত ক্লিক কৰক</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
index 0c1db85..2b6aef1 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
@@ -126,7 +126,7 @@
 <translation id="526651782186312376">Memilih teks ke awal baris</translation>
 <translation id="5316716239522500219">Cerminkan monitor</translation>
 <translation id="539072479502328326">Mengaktifkan atau menonaktifkan kaca pembesar tersemat</translation>
-<translation id="5466615362193675484">Beralih menu untuk mengubah ukuran mode kunci</translation>
+<translation id="5466615362193675484">Menampilkan/menyembunyikan menu mode kunci pengubahan ukuran</translation>
 <translation id="5541719484267030947">Saat menyeret tab, tekan <ph name="ESC" /></translation>
 <translation id="5554139136362089836">Menelusuri halaman aktif</translation>
 <translation id="5563050856984839829">Tekan <ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" />, lalu klik link</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb
index 0a6a182..b6bc19f 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb
@@ -126,6 +126,7 @@
 <translation id="526651782186312376">בחירת הטקסט עד תחילת השורה</translation>
 <translation id="5316716239522500219">שיקוף צגים</translation>
 <translation id="539072479502328326">הפעלה או השבתה של הזכוכית המגדלת במצב עגינה</translation>
+<translation id="5466615362193675484">החלפת מצב לתפריט כדי לשנות את גודל מצב הנעילה</translation>
 <translation id="5541719484267030947">הקשה על <ph name="ESC" /> תוך כדי גרירת הכרטיסייה</translation>
 <translation id="5554139136362089836">חיפוש בדף הנוכחי</translation>
 <translation id="5563050856984839829">הקשה על <ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> ולחיצה על קישור</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb
index 21e563e..4323d7a3 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb
@@ -126,6 +126,7 @@
 <translation id="526651782186312376">Selecionar o texto até o início da linha</translation>
 <translation id="5316716239522500219">Espelhar monitores</translation>
 <translation id="539072479502328326">Ativar ou desativar a lupa em área fixa</translation>
+<translation id="5466615362193675484">Alterne o menu para o modo de bloqueio de redimensionamento</translation>
 <translation id="5541719484267030947">Ao arrastar a guia, pressione <ph name="ESC" /></translation>
 <translation id="5554139136362089836">Pesquisar na página atual</translation>
 <translation id="5563050856984839829">Pressione <ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> e clique em um link</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
index 5b759bd..35d8223 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
@@ -126,6 +126,7 @@
 <translation id="526651782186312376">Metni satırın başına kadar seçer</translation>
 <translation id="5316716239522500219">Monitörleri yansıt</translation>
 <translation id="539072479502328326">Yerleştirilmiş büyüteç işlevini açar veya kapatır.</translation>
+<translation id="5466615362193675484">Kilit modunu yeniden boyutlandırma menüsünü açıp kapatır</translation>
 <translation id="5541719484267030947">Sekmeyi sürüklerken <ph name="ESC" /> tuşuna basın</translation>
 <translation id="5554139136362089836">Geçerli sayfada arama yapar</translation>
 <translation id="5563050856984839829"><ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> tuşlarına basın ve bir bağlantıyı tıklayın</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 80d79aa9..e73cd1b 100644
--- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb
+++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb
@@ -127,6 +127,7 @@
 <translation id="526651782186312376">選取文字至本行開頭</translation>
 <translation id="5316716239522500219">顯示器鏡像</translation>
 <translation id="539072479502328326">開啟或關閉停駐放大鏡</translation>
+<translation id="5466615362193675484">切換選單即可查看調整鎖定尺寸模式</translation>
 <translation id="5541719484267030947">在拖曳分頁時按下 <ph name="ESC" /> 鍵</translation>
 <translation id="5554139136362089836">搜尋目前網頁</translation>
 <translation id="5563050856984839829">按住 <ph name="CTRL" /><ph name="SEPARATOR" /><ph name="SHIFT" /> 鍵,然後按一下連結</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index bdb0df0..2a0ae06 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -16,6 +16,7 @@
 <translation id="1056775291175587022">ما من شبكات</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
 <translation id="1073899992769346247">استبدِل البطارية أو أعِد شحنها.</translation>
+<translation id="1077253978657569125">نريد تحسين هذه الميزة.</translation>
 <translation id="108486256082349153">خلوي: <ph name="ADDRESS" /></translation>
 <translation id="1087110696012418426">مساء الخير <ph name="GIVEN_NAME" />،</translation>
 <translation id="109942774857561566">أشعر بالملل</translation>
@@ -1032,6 +1033,7 @@
 <translation id="9080132581049224423">يُرجى التمرير السريع إلى الأعلى للانتقال إلى الصفحة الرئيسية.</translation>
 <translation id="9080206825613744995">الميكروفون قيد الاستخدام</translation>
 <translation id="9084606467167974638">تبديل موضع القائمة</translation>
+<translation id="9087578468327036362">الإبلاغ عن هذا الطلب</translation>
 <translation id="9089416786594320554">أساليب الإدخال</translation>
 <translation id="9091626656156419976">تمت إزالة عرض <ph name="DISPLAY_NAME" /></translation>
 <translation id="9098969848082897657">كتم صوت الهاتف</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index 42ab3127..c3904a1 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -16,6 +16,7 @@
 <translation id="1056775291175587022">নেটৱৰ্ক নাই</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
 <translation id="1073899992769346247">বেটাৰীটো সলনি কৰক অথবা ৰিচাৰ্জ কৰক</translation>
+<translation id="1077253978657569125">আমি এইটো উন্নত কৰিবলৈ বিচাৰোঁ!</translation>
 <translation id="108486256082349153">চেলুলাৰ: <ph name="ADDRESS" /></translation>
 <translation id="1087110696012418426">শুভ অপৰাহ্ন <ph name="GIVEN_NAME" />,</translation>
 <translation id="109942774857561566">মই বিৰক্ত হৈছোঁ</translation>
@@ -1028,6 +1029,7 @@
 <translation id="9080132581049224423">গৃহ স্ক্ৰীনলৈ যাবলৈ ওপৰৰ ফালে ছোৱাইপ কৰক</translation>
 <translation id="9080206825613744995">মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰি থকা হৈছে</translation>
 <translation id="9084606467167974638">মেনুৰ দিশ ট'গল কৰক</translation>
+<translation id="9087578468327036362">এই প্ৰশ্নটোৰ অভিযোগ দিয়ক</translation>
 <translation id="9089416786594320554">ইনপুট পদ্ধতি</translation>
 <translation id="9091626656156419976">ডিছপ্লে' <ph name="DISPLAY_NAME" /> আঁতৰোৱা হ'ল</translation>
 <translation id="9098969848082897657">ফ’নটো নীৰৱ কৰক</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 33d5432..362205f 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -16,6 +16,7 @@
 <translation id="1056775291175587022">אין רשתות</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
 <translation id="1073899992769346247">צריך להחליף את הסוללה או לטעון אותה</translation>
+<translation id="1077253978657569125">אנחנו רוצים לשפר את התכונה הזו!</translation>
 <translation id="108486256082349153">סלולרי: <ph name="ADDRESS" /></translation>
 <translation id="1087110696012418426">אחה"צ טובים <ph name="GIVEN_NAME" />,</translation>
 <translation id="109942774857561566">משעמם לי</translation>
@@ -1034,6 +1035,7 @@
 <translation id="9080132581049224423">כדי לחזור לדף הבית, מחליקים כלפי מעלה</translation>
 <translation id="9080206825613744995">המיקרופון נמצא בשימוש.</translation>
 <translation id="9084606467167974638">שינוי מיקום התפריט</translation>
+<translation id="9087578468327036362">דיווח על השאילתה הזו</translation>
 <translation id="9089416786594320554">שיטות קלט</translation>
 <translation id="9091626656156419976">הוסרה התצוגה של <ph name="DISPLAY_NAME" /></translation>
 <translation id="9098969848082897657">השתקת הטלפון</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index e4d85e8..fc52734 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -16,6 +16,7 @@
 <translation id="1056775291175587022">Nenhuma rede</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
 <translation id="1073899992769346247">Substitua ou recarregue a bateria</translation>
+<translation id="1077253978657569125">Queremos melhorar isso.</translation>
 <translation id="108486256082349153">Celular: <ph name="ADDRESS" /></translation>
 <translation id="1087110696012418426">Boa tarde, <ph name="GIVEN_NAME" />,</translation>
 <translation id="109942774857561566">Que tédio</translation>
@@ -1032,6 +1033,7 @@
 <translation id="9080132581049224423">Deslize para cima para ir para a tela inicial</translation>
 <translation id="9080206825613744995">O microfone está sendo usado.</translation>
 <translation id="9084606467167974638">Alternar posição do menu</translation>
+<translation id="9087578468327036362">Denuncie essa consulta</translation>
 <translation id="9089416786594320554">Métodos de entrada</translation>
 <translation id="9091626656156419976">Tela <ph name="DISPLAY_NAME" /> removida</translation>
 <translation id="9098969848082897657">Silenciar smartphone</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index b698c1ac..361f059 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -16,6 +16,7 @@
 <translation id="1056775291175587022">Ağ yok</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
 <translation id="1073899992769346247">Pili değiştirin veya şarj edin</translation>
+<translation id="1077253978657569125">Bu özelliği iyileştirmek istiyoruz.</translation>
 <translation id="108486256082349153">Cep telefonu: <ph name="ADDRESS" /></translation>
 <translation id="1087110696012418426">İyi günler <ph name="GIVEN_NAME" />,</translation>
 <translation id="109942774857561566">Canım sıkıldı</translation>
@@ -1033,6 +1034,7 @@
 <translation id="9080132581049224423">Ana ekrana gitmek için yukarı kaydırın</translation>
 <translation id="9080206825613744995">Mikrofon kullanımda.</translation>
 <translation id="9084606467167974638">Menü konumunu değiştir</translation>
+<translation id="9087578468327036362">Bu sorguyu bildirir</translation>
 <translation id="9089416786594320554">Giriş yöntemleri</translation>
 <translation id="9091626656156419976"><ph name="DISPLAY_NAME" /> adlı ekran kaldırıldı</translation>
 <translation id="9098969848082897657">Telefonu sessize al</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index ba7a6c0..e11a382 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -16,6 +16,7 @@
 <translation id="1056775291175587022">沒有網路</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />:<ph name="RESOLUTION" /></translation>
 <translation id="1073899992769346247">請更換電池或進行充電</translation>
+<translation id="1077253978657569125">我們想改善這項服務!</translation>
 <translation id="108486256082349153">行動裝置:<ph name="ADDRESS" /></translation>
 <translation id="1087110696012418426">午安,<ph name="GIVEN_NAME" />:</translation>
 <translation id="109942774857561566">我好無聊</translation>
@@ -1032,6 +1033,7 @@
 <translation id="9080132581049224423">向上滑動即可開啟主畫面</translation>
 <translation id="9080206825613744995">麥克風正在使用中。</translation>
 <translation id="9084606467167974638">切換選單位置</translation>
+<translation id="9087578468327036362">請回報這項查詢</translation>
 <translation id="9089416786594320554">輸入法</translation>
 <translation id="9091626656156419976">「<ph name="DISPLAY_NAME" />」螢幕已移除</translation>
 <translation id="9098969848082897657">將手機設為靜音</translation>
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index a512d73..379c394 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -414,16 +414,6 @@
     }
   }
 
-  bundle_data("chrome_framework_services") {
-    sources = [ "$root_out_dir/AlertNotificationService.xpc" ]
-
-    outputs = [ "{{bundle_contents_dir}}/XPCServices/{{source_file_part}}" ]
-
-    public_deps = [
-      "//chrome/browser/ui/cocoa/notifications:alert_notification_xpc_service",
-    ]
-  }
-
   tweak_info_plist("chrome_app_plist") {
     info_plist = "app/app-Info.plist"
     args = [
@@ -1102,7 +1092,6 @@
       "Helpers",
       "Libraries",
       "Resources",
-      "XPCServices",
     ]
 
     if (is_chrome_branded) {
@@ -1132,7 +1121,6 @@
       ":chrome_framework_helpers",
       ":chrome_framework_plugins",
       ":chrome_framework_resources",
-      ":chrome_framework_services",
       ":keystone_registration_framework",
       ":swiftshader_library",
       ":widevine_cdm_library",
@@ -1219,7 +1207,6 @@
     # the list of _dsyms in :chrome_dsym_archive.
     _chrome_symbols_sources = [
       "$root_out_dir/$chrome_product_full_name.app/Contents/MacOS/$chrome_product_full_name",
-      "$root_out_dir/AlertNotificationService.xpc/Contents/MacOS/AlertNotificationService",
       "$root_out_dir/chrome_crashpad_handler",
       "$root_out_dir/libEGL.dylib",
       "$root_out_dir/libGLESv2.dylib",
@@ -1254,7 +1241,6 @@
       deps = [
         ":chrome_app",
         ":chrome_framework",
-        "//chrome/browser/ui/cocoa/notifications:alert_notification_xpc_service",
         "//components/crash/core/app:chrome_crashpad_handler",
         "//third_party/angle:libEGL",
         "//third_party/angle:libGLESv2",
@@ -1277,7 +1263,6 @@
       # directory it cannot be listed as a source file). The targets that
       # generate both the dSYM and binary image are listed in deps.
       _dsyms = [
-        "$root_out_dir/AlertNotificationService.dSYM",
         "$root_out_dir/$chrome_framework_name.dSYM",
         "$root_out_dir/$chrome_product_full_name.dSYM",
         "$root_out_dir/chrome_crashpad_handler.dSYM",
@@ -1291,7 +1276,6 @@
       deps = [
         ":chrome_app",
         ":chrome_framework",
-        "//chrome/browser/ui/cocoa/notifications:alert_notification_xpc_service",
         "//components/crash/core/app:chrome_crashpad_handler",
         "//third_party/angle:libEGL",
         "//third_party/angle:libGLESv2",
diff --git a/chrome/VERSION b/chrome/VERSION
index e0339c0..ebef090 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=94
 MINOR=0
-BUILD=4579
+BUILD=4581
 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/BUILD.gn b/chrome/android/features/autofill_assistant/BUILD.gn
index 1f343a3..0a16e07 100644
--- a/chrome/android/features/autofill_assistant/BUILD.gn
+++ b/chrome/android/features/autofill_assistant/BUILD.gn
@@ -320,6 +320,7 @@
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTestUtil.java",
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/BottomSheetOnboardingCoordinatorTest.java",
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/InChromeTriggeringTest.java",
+    "javatests/src/org/chromium/chrome/browser/autofill_assistant/MiniActionTestUtil.java",
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/PasswordChangeFixtureParameters.java",
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/PasswordChangeFixtureTest.java",
     "javatests/src/org/chromium/chrome/browser/autofill_assistant/PasswordChangeFixtureTestUtils.java",
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInputActionIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInputActionIntegrationTest.java
index 6cfbd93e..28773d0a 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInputActionIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantInputActionIntegrationTest.java
@@ -18,6 +18,13 @@
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistant;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntil;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addClickSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addJsClickSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addKeyboardSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addKeyboardWithFocusSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addKeyboardWithSelectSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addSetValueSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addTapSteps;
 import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toClientId;
 import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toCssSelector;
 
@@ -37,34 +44,22 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipType;
 import org.chromium.chrome.browser.autofill_assistant.proto.ClientIdProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ElementConditionProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.JsClickProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.KeyEvent;
-import org.chromium.chrome.browser.autofill_assistant.proto.KeyboardValueFillStrategy;
 import org.chromium.chrome.browser.autofill_assistant.proto.ProcessedActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ProcessedActionStatusProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto.Choice;
 import org.chromium.chrome.browser.autofill_assistant.proto.ReleaseElementsProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ScrollIntoViewProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SelectFieldValueProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SelectOptionElementProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SelectOptionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SelectorProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SendChangeEventProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SendClickEventProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SendKeyEventProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SendKeystrokeEventsProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SendTapEventProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SetElementAttributeProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SetFormFieldValueProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SetFormFieldValueProto.KeyPress;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.TextFilter;
-import org.chromium.chrome.browser.autofill_assistant.proto.TextValue;
 import org.chromium.chrome.browser.autofill_assistant.proto.WaitForDocumentToBecomeInteractiveProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.WaitForDomProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.WaitForElementToBecomeStableProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -107,14 +102,7 @@
     public void fillFormFieldWithValue() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
-        SelectorProto element_set_value = toCssSelector("#input1");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_set_value)
-                                         .addValue(KeyPress.newBuilder().setText("Value"))
-                                         .setFillStrategy(KeyboardValueFillStrategy.SET_VALUE))
-                         .build());
+        addSetValueSteps(toCssSelector("#input1"), "Value", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Set value")
@@ -136,15 +124,7 @@
     public void fillFormFieldWithKeystrokes() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
-        SelectorProto element_set_value = toCssSelector("#input1");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_set_value)
-                                         .addValue(KeyPress.newBuilder().setText("Value"))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy.SIMULATE_KEY_PRESSES))
-                         .build());
+        addKeyboardSteps(toCssSelector("#input1"), "Value", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Set value")
@@ -166,15 +146,7 @@
     public void fillFormFieldWithKeystrokesAndFocus() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
-        SelectorProto element_set_value = toCssSelector("#input1");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_set_value)
-                                         .addValue(KeyPress.newBuilder().setText("Value"))
-                                         .setFillStrategy(KeyboardValueFillStrategy
-                                                                  .SIMULATE_KEY_PRESSES_FOCUS))
-                         .build());
+        addKeyboardWithFocusSteps(toCssSelector("#input1"), "Value", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Set value")
@@ -196,16 +168,7 @@
     public void fillFormFieldWithKeystrokesAndSelect() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
-        SelectorProto element_set_value = toCssSelector("#input1");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_set_value)
-                                         .addValue(KeyPress.newBuilder().setText("Value"))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy
-                                                         .SIMULATE_KEY_PRESSES_SELECT_VALUE))
-                         .build());
+        addKeyboardWithSelectSteps(toCssSelector("#input1"), "Value", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Set value")
@@ -227,14 +190,7 @@
     public void clearFormFieldWithValue() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
-        SelectorProto element_set_value = toCssSelector("#input1");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_set_value)
-                                         .addValue(KeyPress.newBuilder().setText(""))
-                                         .setFillStrategy(KeyboardValueFillStrategy.SET_VALUE))
-                         .build());
+        addSetValueSteps(toCssSelector("#input1"), "", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Clear value")
@@ -243,15 +199,7 @@
                                                             .setType(ChipType.HIGHLIGHTED_ACTION)
                                                             .setText("Continue"))))
                          .build());
-        SelectorProto element_keystrokes = toCssSelector("#input2");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_keystrokes)
-                                         .addValue(KeyPress.newBuilder().setText(""))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy.SIMULATE_KEY_PRESSES))
-                         .build());
+        addKeyboardSteps(toCssSelector("#input2"), "", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Clear value Keystrokes")
@@ -279,54 +227,21 @@
     public void clearFormFieldWithKeystrokes() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
-        SelectorProto element_set_value = toCssSelector("#input1");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_set_value)
-                                         .addValue(KeyPress.newBuilder().setText(""))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy
-                                                         .SIMULATE_KEY_PRESSES_SELECT_VALUE))
-                         .build());
+        addKeyboardWithSelectSteps(toCssSelector("#input1"), "", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Empty value")
-                                            .addChoices(Choice.newBuilder().setChip(
-                                                    ChipProto.newBuilder()
-                                                            .setType(ChipType.HIGHLIGHTED_ACTION)
-                                                            .setText("Continue"))))
-                         .build());
-        SelectorProto element_keystrokes = toCssSelector("#input2");
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element_keystrokes)
-                                         .addValue(KeyPress.newBuilder().setText("\b"))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy
-                                                         .SIMULATE_KEY_PRESSES_SELECT_VALUE))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setPrompt(PromptProto.newBuilder()
-                                            .setMessage("Backspace")
                                             .addChoices(Choice.newBuilder()))
                          .build());
 
         AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list);
 
         assertThat(getElementValue(mTestRule.getWebContents(), "input1"), is("helloworld1"));
-        assertThat(getElementValue(mTestRule.getWebContents(), "input2"), is("helloworld2"));
 
         runScript(script);
 
         waitUntilViewMatchesCondition(withText("Empty value"), isCompletelyDisplayed());
-        waitUntilViewMatchesCondition(withText("Continue"), isCompletelyDisplayed());
         assertThat(getElementValue(mTestRule.getWebContents(), "input1"), is(""));
-        onView(withText("Continue")).perform(click());
-
-        waitUntilViewMatchesCondition(withText("Backspace"), isCompletelyDisplayed());
-        assertThat(getElementValue(mTestRule.getWebContents(), "input2"), is(""));
     }
 
     @Test
@@ -405,22 +320,8 @@
     @MediumTest
     public void clickingOnElementToHide() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
-        ClientIdProto clientId = toClientId("e");
 
-        SelectorProto element_click = toCssSelector("#touch_area_one");
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element_click)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendClickEvent(SendClickEventProto.newBuilder().setClientId(clientId))
-                         .build());
+        addClickSteps(toCssSelector("#touch_area_one"), list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("Click").addChoices(
                                  Choice.newBuilder().setChip(
@@ -428,20 +329,7 @@
                                                  .setType(ChipType.HIGHLIGHTED_ACTION)
                                                  .setText("Continue"))))
                          .build());
-        SelectorProto element_tap = toCssSelector("#touch_area_five");
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element_tap)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendTapEvent(SendTapEventProto.newBuilder().setClientId(clientId))
-                         .build());
+        addTapSteps(toCssSelector("#touch_area_five"), list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("Tap").addChoices(
                                  Choice.newBuilder().setChip(
@@ -449,20 +337,7 @@
                                                  .setType(ChipType.HIGHLIGHTED_ACTION)
                                                  .setText("Continue"))))
                          .build());
-        SelectorProto element_js = toCssSelector("#touch_area_six");
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element_js)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setJsClick(JsClickProto.newBuilder().setClientId(clientId))
-                         .build());
+        addJsClickSteps(toCssSelector("#touch_area_six"), list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("JS").addChoices(
                                  Choice.newBuilder()))
@@ -527,6 +402,10 @@
                 ActionProto.newBuilder()
                         .setSendClickEvent(SendClickEventProto.newBuilder().setClientId(clientId))
                         .build());
+        actions.add(ActionProto.newBuilder()
+                            .setReleaseElements(
+                                    ReleaseElementsProto.newBuilder().addClientIds(clientId))
+                            .build());
 
         AutofillAssistantTestService testService = new AutofillAssistantTestService(
                 Collections.singletonList(new AutofillAssistantTestScript(TEST_SCRIPT, actions)));
@@ -548,125 +427,6 @@
 
     @Test
     @MediumTest
-    public void setTextWithMiniActions() throws Exception {
-        ArrayList<ActionProto> list = new ArrayList<>();
-
-        SelectorProto element = toCssSelector("#input1");
-        ClientIdProto clientId = toClientId("e");
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDocumentToBecomeInteractive(
-                                 WaitForDocumentToBecomeInteractiveProto.newBuilder()
-                                         .setClientId(clientId)
-                                         .setTimeoutInMs(1000))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setWaitForElementToBecomeStable(
-                                 WaitForElementToBecomeStableProto.newBuilder()
-                                         .setClientId(clientId)
-                                         .setStableCheckMaxRounds(10)
-                                         .setStableCheckIntervalMs(200))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setCheckElementIsOnTop(
-                                 CheckElementIsOnTopProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSetElementAttribute(
-                                 SetElementAttributeProto.newBuilder()
-                                         .setClientId(clientId)
-                                         .addAttribute("value")
-                                         .setValue(TextValue.newBuilder().setText("")))
-                         .build());
-        list.add(
-                ActionProto.newBuilder()
-                        .setSendChangeEvent(SendChangeEventProto.newBuilder().setClientId(clientId))
-                        .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendClickEvent(SendClickEventProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendKeystrokeEvents(
-                                 SendKeystrokeEventsProto.newBuilder()
-                                         .setClientId(clientId)
-                                         .setDelayInMs(0)
-                                         .setValue(TextValue.newBuilder().setText("Value")))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setReleaseElements(
-                                 ReleaseElementsProto.newBuilder().addClientIds(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setPrompt(PromptProto.newBuilder().setMessage("Done").addChoices(
-                                 Choice.newBuilder()))
-                         .build());
-
-        AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list);
-
-        assertThat(getElementValue(mTestRule.getWebContents(), "input1"), is("helloworld1"));
-
-        runScript(script);
-
-        waitUntilViewMatchesCondition(withText("Done"), isCompletelyDisplayed());
-        assertThat(getElementValue(mTestRule.getWebContents(), "input1"), is("Value"));
-    }
-
-    @Test
-    @MediumTest
-    public void clearTextWithMiniActions() throws Exception {
-        ArrayList<ActionProto> list = new ArrayList<>();
-
-        SelectorProto element = toCssSelector("#input1");
-        ClientIdProto clientId = toClientId("e");
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSelectFieldValue(
-                                 SelectFieldValueProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendKeyEvent(
-                                 SendKeyEventProto.newBuilder().setClientId(clientId).setKeyEvent(
-                                         KeyEvent.newBuilder()
-                                                 .addCommand("SelectAll")
-                                                 .addCommand("DeleteBackward")
-                                                 .setKey("Backspace")))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setReleaseElements(
-                                 ReleaseElementsProto.newBuilder().addClientIds(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setPrompt(PromptProto.newBuilder().setMessage("Done").addChoices(
-                                 Choice.newBuilder()))
-                         .build());
-
-        AutofillAssistantTestScript script = new AutofillAssistantTestScript(TEST_SCRIPT, list);
-
-        assertThat(getElementValue(mTestRule.getWebContents(), "input1"), is("helloworld1"));
-
-        runScript(script);
-
-        waitUntilViewMatchesCondition(withText("Done"), isCompletelyDisplayed());
-        assertThat(getElementValue(mTestRule.getWebContents(), "input1"), is(""));
-    }
-
-    @Test
-    @MediumTest
     public void selectOptionWithMiniActions() throws Exception {
         ArrayList<ActionProto> list = new ArrayList<>();
 
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantKeyboardIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantKeyboardIntegrationTest.java
index 21f88d6..d027814 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantKeyboardIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantKeyboardIntegrationTest.java
@@ -19,7 +19,9 @@
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.tapElement;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilKeyboardMatchesCondition;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
-import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toClientId;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addClickSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addKeyboardSteps;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addKeyboardWithSelectSteps;
 import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toCssSelector;
 import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toIFrameCssSelector;
 
@@ -37,22 +39,15 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipType;
-import org.chromium.chrome.browser.autofill_assistant.proto.ClientIdProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ElementAreaProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ElementAreaProto.Rectangle;
 import org.chromium.chrome.browser.autofill_assistant.proto.ElementConditionProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.KeyboardValueFillStrategy;
 import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto.Choice;
-import org.chromium.chrome.browser.autofill_assistant.proto.ScrollIntoViewProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SelectorProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SendClickEventProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SetFormFieldValueProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SetFormFieldValueProto.KeyPress;
 import org.chromium.chrome.browser.autofill_assistant.proto.ShowCastProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.WaitForDomProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
@@ -97,23 +92,10 @@
     @Test
     @MediumTest
     public void keyboardDoesNotShowOnElementClick() throws Exception {
-        SelectorProto element = toCssSelector("#profile_name");
-        ClientIdProto clientId = toClientId("e");
-
         ArrayList<ActionProto> list = new ArrayList<>();
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendClickEvent(SendClickEventProto.newBuilder().setClientId(clientId))
-                         .build());
+
+        SelectorProto nameSelector = toCssSelector("#profile_name");
+        addClickSteps(nameSelector, list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("Clicked").addChoices(
                                  Choice.newBuilder().setChip(
@@ -123,11 +105,11 @@
                          .build());
         list.add(ActionProto.newBuilder()
                          .setShowCast(ShowCastProto.newBuilder()
-                                              .setElementToPresent(element)
+                                              .setElementToPresent(nameSelector)
                                               .setTouchableElementArea(
                                                       ElementAreaProto.newBuilder().addTouchable(
                                                               Rectangle.newBuilder().addElements(
-                                                                      element))))
+                                                                      nameSelector))))
                          .build());
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
@@ -159,17 +141,10 @@
     @Test
     @MediumTest
     public void keyboardDoesNotShowOnKeyStrokes() throws Exception {
-        SelectorProto element = toCssSelector("#profile_name");
-
         ArrayList<ActionProto> list = new ArrayList<>();
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element)
-                                         .addValue(KeyPress.newBuilder().setText("John Doe"))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy.SIMULATE_KEY_PRESSES))
-                         .build());
+
+        SelectorProto nameSelector = toCssSelector("#profile_name");
+        addKeyboardSteps(nameSelector, "John Doe", list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("Filled").addChoices(
                                  Choice.newBuilder().setChip(
@@ -177,16 +152,8 @@
                                                  .setType(ChipType.HIGHLIGHTED_ACTION)
                                                  .setText("Continue"))))
                          .build());
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .setElement(element)
-                                         .addValue(KeyPress.newBuilder().setText("Jane Doe"))
-                                         .setFillStrategy(
-                                                 KeyboardValueFillStrategy
-                                                         .SIMULATE_KEY_PRESSES_SELECT_VALUE))
-                         .build());
-        list.add(ActionProto.newBuilder()
+        addKeyboardWithSelectSteps(nameSelector, "Jane Doe", list);
+        list.add((ActionProto) ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
                                             .setMessage("Overwritten")
                                             .addChoices(Choice.newBuilder().setChip(
@@ -196,11 +163,11 @@
                          .build());
         list.add(ActionProto.newBuilder()
                          .setShowCast(ShowCastProto.newBuilder()
-                                              .setElementToPresent(element)
+                                              .setElementToPresent(nameSelector)
                                               .setTouchableElementArea(
                                                       ElementAreaProto.newBuilder().addTouchable(
                                                               Rectangle.newBuilder().addElements(
-                                                                      element))))
+                                                                      nameSelector))))
                          .build());
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
@@ -239,23 +206,10 @@
     @MediumTest
     @DisabledTest(message = "https://crbug.com/1216453")
     public void keyboardDoesNotShowOnElementClickInIFrame() throws Exception {
-        SelectorProto element = toIFrameCssSelector("#iframe", "#name");
-        ClientIdProto clientId = toClientId("e");
-
         ArrayList<ActionProto> list = new ArrayList<>();
-        list.add(ActionProto.newBuilder()
-                         .setWaitForDom(
-                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
-                                         ElementConditionProto.newBuilder()
-                                                 .setMatch(element)
-                                                 .setClientId(clientId)))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setSendClickEvent(SendClickEventProto.newBuilder().setClientId(clientId))
-                         .build());
+
+        SelectorProto nameSelector = toIFrameCssSelector("#iframe", "#name");
+        addClickSteps(nameSelector, list);
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder().setMessage("Clicked").addChoices(
                                  Choice.newBuilder().setChip(
@@ -265,11 +219,11 @@
                          .build());
         list.add(ActionProto.newBuilder()
                          .setShowCast(ShowCastProto.newBuilder()
-                                              .setElementToPresent(element)
+                                              .setElementToPresent(nameSelector)
                                               .setTouchableElementArea(
                                                       ElementAreaProto.newBuilder().addTouchable(
                                                               Rectangle.newBuilder().addElements(
-                                                                      element))))
+                                                                      nameSelector))))
                          .build());
         list.add(ActionProto.newBuilder()
                          .setPrompt(PromptProto.newBuilder()
@@ -302,16 +256,16 @@
     @Test
     @MediumTest
     public void doNotHideChipsWhileKeyboardShowingForWebsiteTextInput() throws Exception {
-        SelectorProto element = toCssSelector("#profile_name");
-
         ArrayList<ActionProto> list = new ArrayList<>();
+
+        SelectorProto nameSelector = toCssSelector("#profile_name");
         list.add(ActionProto.newBuilder()
                          .setShowCast(ShowCastProto.newBuilder()
-                                              .setElementToPresent(element)
+                                              .setElementToPresent(nameSelector)
                                               .setTouchableElementArea(
                                                       ElementAreaProto.newBuilder().addTouchable(
                                                               Rectangle.newBuilder().addElements(
-                                                                      element))))
+                                                                      nameSelector))))
                          .build());
         list.add(ActionProto.newBuilder()
                          .setPrompt(
@@ -323,7 +277,7 @@
                                                                  "Done"))
                                                          .setShowOnlyWhen(
                                                                  ElementConditionProto.newBuilder()
-                                                                         .setMatch(element)))
+                                                                         .setMatch(nameSelector)))
                                          .addChoices(Choice.newBuilder().setChip(
                                                  ChipProto.newBuilder()
                                                          .setType(ChipType.CANCEL_ACTION)
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPasswordManagerIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPasswordManagerIntegrationTest.java
index cbc6c484..2408c21 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPasswordManagerIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPasswordManagerIntegrationTest.java
@@ -13,6 +13,7 @@
 
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.getElementValue;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
+import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addSetValueSteps;
 import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toCssSelector;
 
 import android.support.test.InstrumentationRegistry;
@@ -29,12 +30,14 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.GeneratePasswordForFormFieldProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.PasswordManagerValue;
+import org.chromium.chrome.browser.autofill_assistant.proto.PasswordManagerValue.CredentialType;
 import org.chromium.chrome.browser.autofill_assistant.proto.PresaveGeneratedPasswordProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SaveGeneratedPasswordProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.SetFormFieldValueProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.TextValue;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -96,6 +99,24 @@
                                 getWebContents().getLastCommittedUrl(), username));
     }
 
+    private static TextValue buildUsernameValue() {
+        return TextValue.newBuilder()
+                .setPasswordManagerValue(PasswordManagerValue.newBuilder().setCredentialType(
+                        CredentialType.USERNAME))
+                .build();
+    }
+
+    private static TextValue buildPasswordValue() {
+        return TextValue.newBuilder()
+                .setPasswordManagerValue(PasswordManagerValue.newBuilder().setCredentialType(
+                        CredentialType.PASSWORD))
+                .build();
+    }
+
+    private static TextValue buildClientMemoryValue(String clientMemoryKey) {
+        return TextValue.newBuilder().setClientMemoryKey(clientMemoryKey).build();
+    }
+
     /**
      * Run a password change flow (fill a form with username, old password, new
      * password).
@@ -106,13 +127,7 @@
         ArrayList<ActionProto> list = new ArrayList<>();
 
         // Sets username
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .addValue(SetFormFieldValueProto.KeyPress.newBuilder()
-                                                           .setUseUsername(true))
-                                         .setElement(toCssSelector("#username")))
-                         .build());
+        addSetValueSteps(toCssSelector("#username"), buildUsernameValue(), list);
         // Generates new password
         list.add(ActionProto.newBuilder()
                          .setGeneratePasswordForFormField(
@@ -129,22 +144,12 @@
                          .build());
 
         // Sets new password
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .addValue(SetFormFieldValueProto.KeyPress.newBuilder()
-                                                           .setClientMemoryKey("memory-key"))
-                                         .setElement(toCssSelector("#new-password")))
-                         .build());
+        addSetValueSteps(
+                toCssSelector("#new-password"), buildClientMemoryValue("memory-key"), list);
 
         // Sets password confirmation
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .addValue(SetFormFieldValueProto.KeyPress.newBuilder()
-                                                           .setClientMemoryKey("memory-key"))
-                                         .setElement(toCssSelector("#password-conf")))
-                         .build());
+        addSetValueSteps(
+                toCssSelector("#password-conf"), buildClientMemoryValue("memory-key"), list);
 
         // Saves generated password
         list.add(ActionProto.newBuilder()
@@ -153,13 +158,7 @@
                          .build());
 
         // Fills login password field with saved password
-        list.add(ActionProto.newBuilder()
-                         .setSetFormValue(
-                                 SetFormFieldValueProto.newBuilder()
-                                         .addValue(SetFormFieldValueProto.KeyPress.newBuilder()
-                                                           .setUsePassword(true))
-                                         .setElement(toCssSelector("#login-password")))
-                         .build());
+        addSetValueSteps(toCssSelector("#login-password"), buildPasswordValue(), list);
 
         // Shows prompt
         list.add(ActionProto.newBuilder()
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/MiniActionTestUtil.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/MiniActionTestUtil.java
new file mode 100644
index 0000000..4dfb804
--- /dev/null
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/MiniActionTestUtil.java
@@ -0,0 +1,217 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toClientId;
+
+import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.CheckElementIsOnTopProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.ClientIdProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.ElementConditionProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.FocusFieldProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.JsClickProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.KeyEvent;
+import org.chromium.chrome.browser.autofill_assistant.proto.ReleaseElementsProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.ScrollIntoViewProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SelectFieldValueProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SelectorProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SendChangeEventProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SendClickEventProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SendKeyEventProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SendKeystrokeEventsProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SendTapEventProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.SetElementAttributeProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.TextValue;
+import org.chromium.chrome.browser.autofill_assistant.proto.WaitForDocumentToBecomeInteractiveProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.WaitForDomProto;
+import org.chromium.chrome.browser.autofill_assistant.proto.WaitForElementToBecomeStableProto;
+
+import java.util.List;
+
+class MiniActionTestUtil {
+    private static void addWaitForDomStep(
+            SelectorProto selector, ClientIdProto clientId, List<ActionProto> list) {
+        list.add(ActionProto.newBuilder()
+                         .setWaitForDom(
+                                 WaitForDomProto.newBuilder().setTimeoutMs(1000).setWaitCondition(
+                                         ElementConditionProto.newBuilder()
+                                                 .setMatch(selector)
+                                                 .setClientId(clientId)))
+                         .build());
+    }
+
+    private static void addReleaseElementStep(ClientIdProto clientId, List<ActionProto> list) {
+        list.add(ActionProto.newBuilder()
+                         .setReleaseElements(
+                                 ReleaseElementsProto.newBuilder().addClientIds(clientId))
+                         .build());
+    }
+
+    private static void addClickOrTapPrepareSteps(ClientIdProto clientId, List<ActionProto> list) {
+        list.add(ActionProto.newBuilder()
+                         .setWaitForDocumentToBecomeInteractive(
+                                 WaitForDocumentToBecomeInteractiveProto.newBuilder()
+                                         .setClientId(clientId)
+                                         .setTimeoutInMs(1000))
+                         .build());
+        list.add(ActionProto.newBuilder()
+                         .setScrollIntoView(ScrollIntoViewProto.newBuilder().setClientId(clientId))
+                         .build());
+        list.add(ActionProto.newBuilder()
+                         .setWaitForElementToBecomeStable(
+                                 WaitForElementToBecomeStableProto.newBuilder()
+                                         .setClientId(clientId)
+                                         .setStableCheckMaxRounds(10)
+                                         .setStableCheckIntervalMs(200))
+                         .build());
+        list.add(ActionProto.newBuilder()
+                         .setCheckElementIsOnTop(
+                                 CheckElementIsOnTopProto.newBuilder().setClientId(clientId))
+                         .build());
+    }
+
+    static void addClickSteps(ClientIdProto clientId, List<ActionProto> list) {
+        addClickOrTapPrepareSteps(clientId, list);
+        list.add(ActionProto.newBuilder()
+                         .setSendClickEvent(SendClickEventProto.newBuilder().setClientId(clientId))
+                         .build());
+    }
+
+    static void addClickSteps(SelectorProto selector, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        addClickSteps(clientId, list);
+        addReleaseElementStep(clientId, list);
+    }
+
+    static void addTapSteps(ClientIdProto clientId, List<ActionProto> list) {
+        addClickOrTapPrepareSteps(clientId, list);
+        list.add(ActionProto.newBuilder()
+                         .setSendTapEvent(SendTapEventProto.newBuilder().setClientId(clientId))
+                         .build());
+    }
+
+    static void addTapSteps(SelectorProto selector, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        addTapSteps(clientId, list);
+        addReleaseElementStep(clientId, list);
+    }
+
+    static void addJsClickSteps(SelectorProto selector, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        list.add(ActionProto.newBuilder()
+                         .setJsClick(JsClickProto.newBuilder().setClientId(clientId))
+                         .build());
+        addReleaseElementStep(clientId, list);
+    }
+
+    static void addSetValueSteps(
+            ClientIdProto clientId, TextValue textValue, List<ActionProto> list) {
+        list.add(ActionProto.newBuilder()
+                         .setSetElementAttribute(SetElementAttributeProto.newBuilder()
+                                                         .setClientId(clientId)
+                                                         .addAttribute("value")
+                                                         .setValue(textValue))
+                         .build());
+        list.add(
+                ActionProto.newBuilder()
+                        .setSendChangeEvent(SendChangeEventProto.newBuilder().setClientId(clientId))
+                        .build());
+    }
+
+    static void addSetValueSteps(ClientIdProto clientId, String value, List<ActionProto> list) {
+        addSetValueSteps(clientId, TextValue.newBuilder().setText(value).build(), list);
+    }
+
+    static void addSetValueSteps(
+            SelectorProto selector, TextValue textValue, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        addSetValueSteps(clientId, textValue, list);
+        addReleaseElementStep(clientId, list);
+    }
+
+    static void addSetValueSteps(SelectorProto selector, String value, List<ActionProto> list) {
+        addSetValueSteps(selector, TextValue.newBuilder().setText(value).build(), list);
+    }
+
+    static void addKeyboardSteps(
+            SelectorProto selector, TextValue textValue, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        addSetValueSteps(clientId, "", list);
+        if (!textValue.hasText() || !textValue.getText().isEmpty()) {
+            addClickSteps(clientId, list);
+            list.add(ActionProto.newBuilder()
+                             .setSendKeystrokeEvents(SendKeystrokeEventsProto.newBuilder()
+                                                             .setClientId(clientId)
+                                                             .setDelayInMs(0)
+                                                             .setValue(textValue))
+                             .build());
+        }
+        addReleaseElementStep(clientId, list);
+    }
+
+    static void addKeyboardSteps(SelectorProto selector, String value, List<ActionProto> list) {
+        addKeyboardSteps(selector, TextValue.newBuilder().setText(value).build(), list);
+    }
+
+    static void addKeyboardWithSelectSteps(
+            SelectorProto selector, String value, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        list.add(ActionProto.newBuilder()
+                         .setSelectFieldValue(
+                                 SelectFieldValueProto.newBuilder().setClientId(clientId))
+                         .build());
+        list.add(ActionProto.newBuilder()
+                         .setSendKeyEvent(
+                                 SendKeyEventProto.newBuilder().setClientId(clientId).setKeyEvent(
+                                         KeyEvent.newBuilder()
+                                                 .addCommand("SelectAll")
+                                                 .addCommand("DeleteBackward")
+                                                 .setKey("Backspace")))
+                         .build());
+        if (!value.isEmpty() && !"\b".equals(value)) {
+            list.add(ActionProto.newBuilder()
+                             .setSendKeystrokeEvents(
+                                     SendKeystrokeEventsProto.newBuilder()
+                                             .setClientId(clientId)
+                                             .setDelayInMs(0)
+                                             .setValue(TextValue.newBuilder().setText(value)))
+                             .build());
+        }
+        addReleaseElementStep(clientId, list);
+    }
+
+    static void addKeyboardWithFocusSteps(
+            SelectorProto selector, String value, List<ActionProto> list) {
+        ClientIdProto clientId = toClientId("e");
+
+        addWaitForDomStep(selector, clientId, list);
+        addSetValueSteps(clientId, "", list);
+        if (!value.isEmpty()) {
+            list.add(ActionProto.newBuilder()
+                             .setFocusField(FocusFieldProto.newBuilder().setClientId(clientId))
+                             .build());
+            list.add(ActionProto.newBuilder()
+                             .setSendKeystrokeEvents(
+                                     SendKeystrokeEventsProto.newBuilder()
+                                             .setClientId(clientId)
+                                             .setDelayInMs(0)
+                                             .setValue(TextValue.newBuilder().setText(value)))
+                             .build());
+        }
+        addReleaseElementStep(clientId, list);
+    }
+}
diff --git a/chrome/android/java/res/xml/legal_information_preferences.xml b/chrome/android/java/res/xml/legal_information_preferences.xml
index 8f1c579..9d5c710 100644
--- a/chrome/android/java/res/xml/legal_information_preferences.xml
+++ b/chrome/android/java/res/xml/legal_information_preferences.xml
@@ -19,7 +19,7 @@
         android:title="@string/chrome_additional_terms_of_service_title"
         app:url="@string/chrome_additional_terms_of_service_url" />
     <org.chromium.chrome.browser.about_settings.HyperlinkPreference
-        android:key="privacy_notice"
-        android:title="@string/privacy_notice_title"
-        app:url="@string/chrome_privacy_notice_url" />
+        android:key="privacy_policy"
+        android:title="@string/privacy_policy_title"
+        app:url="@string/chrome_privacy_policy_url" />
 </PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
index 8d038f0..95e5575 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureController.java
@@ -513,12 +513,20 @@
 
         @Override
         public void onContentChanged(Tab tab) {
-            if (tab == mTab) return;
+            if (tab != mTab) return;
             // While webContentsWillSwap() probably did this, doesn't hurt to do it again.
             cleanupWebContentsObserver();
             // Now that we have a new WebContents, start listening.
             registerWebContentsObserver();
         }
+
+        @Override
+        public void onDestroyed(Tab tab) {
+            if (tab != mTab) return;
+            cleanupWebContentsObserver();
+            // Don't bother to clean up here -- it clears the observers anyway,
+            // and TabChangeObserver will do it anyway.
+        }
     }
 
     /** A class to dismiss the Activity when the tab changes. */
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index b09d9c8..24da81a 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-93.0.4577.3_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-93.0.4577.5_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 5061657..670485e 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -3757,7 +3757,7 @@
     <ph name="BEGIN_BOLD">&lt;b&gt;</ph>Keep in mind:<ph name="END_BOLD">&lt;/b&gt;</ph> A similar voice or recording might be able to access your personal results, too. You can remove Voice Match permission later by turning it off in Assistant Settings.
   </message>
   <message name="IDS_ASSISTANT_VOICE_MATCH_MESSAGE_CHILD" desc="Message for Assistant voice match screen, when a child account is in use.">
-    Voice Match helps Google Assistant identify <ph name="SUPERVISED_USER_NAME">$2<ex>Child 1</ex></ph>’s voice on your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> and tell it apart from others.
+    Voice Match helps Google Assistant identify <ph name="SUPERVISED_USER_NAME">$2<ex>Child 1</ex></ph>’s voice on your <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> and tell them apart from others.
     <ph name="BR">&lt;br&gt;&lt;br&gt;</ph>
     The Assistant takes clips of your child’s voice to form a unique voice model, which is only stored on their device(s). Your child’s voice model may be sent temporarily to Google to better identify their voice.
     <ph name="BR">&lt;br&gt;&lt;br&gt;</ph>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_VOICE_MATCH_MESSAGE_CHILD.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_VOICE_MATCH_MESSAGE_CHILD.png.sha1
index 30fb44b..6c2028a0 100644
--- a/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_VOICE_MATCH_MESSAGE_CHILD.png.sha1
+++ b/chrome/app/chromeos_strings_grdp/IDS_ASSISTANT_VOICE_MATCH_MESSAGE_CHILD.png.sha1
@@ -1 +1 @@
-7a0efb0e3842d064332ce10e7c64bc0500f94295
\ No newline at end of file
+0089c17203881fac880d03cb240acf6000ad659e
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index c57649a..3097e34 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -72,6 +72,7 @@
 <translation id="107278043869924952">استخدام رقم التعريف الشخصي بالإضافة إلى كلمة المرور</translation>
 <translation id="1076176485976385390">التنقُّل بين الصفحات باستخدام مؤشر النص</translation>
 <translation id="1076698951459398590">تفعيل المظهر</translation>
+<translation id="1076766328672150609">يمكن لطفلك استخدام رقم تعريف شخصي لفتح قفل الجهاز.</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1076882167394279216">تعذَّر تنزيل قاموس التدقيق الإملائي للغة <ph name="LANGUAGE" />. يُرجى إعادة المحاولة.</translation>
 <translation id="1079766198702302550">حظر الدخول إلى الكاميرا دومًا</translation>
@@ -260,6 +261,7 @@
 <translation id="1275718070701477396">محدد</translation>
 <translation id="1276994519141842946">تعذّر إلغاء تثبيت <ph name="APP_NAME" />.</translation>
 <translation id="1277020343994096713">يجب إنشاء رقم تعريف شخصي جديد يختلف عن رقم التعريف الشخصي الحالي.</translation>
+<translation id="1278859221870828664">‏مراجعة التطبيقات والخدمات في Google Play</translation>
 <translation id="127946606521051357">هناك جهاز قريب يشارك محتوى</translation>
 <translation id="1280965841156951489">تعديل الملفات</translation>
 <translation id="1285320974508926690">عدم ترجمة هذا الموقع مطلقًا</translation>
@@ -804,6 +806,7 @@
 <translation id="1834503245783133039">تعذّر التنزيل: <ph name="FILE_NAME" /></translation>
 <translation id="1835261175655098052">‏جارٍ ترقية نظام التشغيل Linux</translation>
 <translation id="1838374766361614909">محو البحث</translation>
+<translation id="1839540115464516994">العرض في <ph name="LOCATION" /></translation>
 <translation id="1841545962859478868">قد يراقب مشرف الجهاز ما يلي:</translation>
 <translation id="1841616161104323629">سجِلّ الجهاز مفقود.</translation>
 <translation id="1841705068325380214">تم إيقاف <ph name="EXTENSION_NAME" /></translation>
@@ -1097,6 +1100,8 @@
 <translation id="2154710561487035718">‏نسخ عنوان URL</translation>
 <translation id="2155772377859296191">‏تبدو كـ <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">مشغّل الخدمات: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156557113115192526">عدم السؤال مرّة أخرى عند فتح تنسيق الملف هذا في هذا التطبيق:
+<ph name="FILE_FORMAT" /></translation>
 <translation id="2156877321344104010">تشغيل اختبار "التحقق من الأمان" مرة أخرى</translation>
 <translation id="2157474325782140681">‏للحصول على ميزات إضافية، يُرجى استخدام محطة إرساء Dell المصمّمة للعمل مع جهاز Chromebook هذا.</translation>
 <translation id="215753907730220065">إنهاء وضع ملء الشاشة</translation>
@@ -1272,6 +1277,7 @@
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2337236196941929873">‏يتيح هذا الإعداد التحميل المُسبق لصفحات الويب التي يظن متصفّح Chrome أنّك قد تزورها. ولتنفيذ ذلك، قد يستخدم Chrome ملفات تعريف الارتباط، في حال كنت تسمح بها، وقد يُشفّر الصفحات ويرسلها من خلال Google لإخفاء هويتك عن المواقع الإلكترونية.</translation>
 <translation id="2340239562261172947">لا يمكن تنزيل الملف <ph name="FILE_NAME" /> بشكل آمن.</translation>
+<translation id="2342180549977909852">يمكن لطفلك استخدام رقم (رقم تعريف شخصي) بدلاً من كلمة مرور لفتح قفل هذا الجهاز. ويمكنك لاحقًا ضبط رقم تعريف شخصي من خلال "الإعدادات".</translation>
 <translation id="2342740338116612727">تمت إضافة الإشارات المرجعية</translation>
 <translation id="2343747224442182863">التركيز على علامة التبويب هذه</translation>
 <translation id="2345723121311404059">صفحة واحدة على <ph name="PRINTER_NAME" /></translation>
@@ -1733,6 +1739,7 @@
 <translation id="2828375943530438449">الرجوع من صفحة تسجيل الدخول إلى الصفحة السابقة</translation>
 <translation id="2828650939514476812">‏الاتصال بشبكة Wi-Fi</translation>
 <translation id="2831430281393059038">توافق الجهاز</translation>
+<translation id="2832124733806557606">يمكن لطفلك استخدام رقم تعريف شخصي لفتح قفل الجهاز أو تسجيل الدخول عليه</translation>
 <translation id="2835547721736623118">خدمة "التعرُّف على الكلام"</translation>
 <translation id="2836269494620652131">تعطل</translation>
 <translation id="2836635946302913370">تم إيقاف تسجيل الدخول باستخدام اسم المستخدم هذا بواسطة المشرف.</translation>
@@ -1748,6 +1755,7 @@
 <translation id="2849035674501872372">بحث</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
 <translation id="284975061945174219">تعذّرت إزالة البرامج.</translation>
+<translation id="2849767214114481738">تمت إضافة رقم التعريف الشخصي</translation>
 <translation id="2849936225196189499">مهمة</translation>
 <translation id="2850541429955027218">إضافة مظهر</translation>
 <translation id="2851634818064021665">يلزمك الحصول على إذن لزيارة هذا الموقع</translation>
@@ -1856,6 +1864,7 @@
 <translation id="2960208947600937804">‏حدث خطأ أثناء إعداد نظام التشغيل Linux. يُرجى التواصل مع المشرف.</translation>
 <translation id="296026337010986570">‏انتهى الإجراء، وتمت إزالة البرامج الضارة. لتفعيل الإضافات مرة أخرى، يُرجى الانتقال إلى &lt;a href="chrome://extensions"&gt;الإضافات&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (الإضافة متوفرة)</translation>
+<translation id="2961210776189273067">العنوان</translation>
 <translation id="2961695502793809356">انقر للانتقال إلى الأمام واضغط لمشاهدة السجل</translation>
 <translation id="2962131322798295505">Wallpaper Picker</translation>
 <translation id="2963151496262057773">المكوّن الإضافي التالي غير مستجيب: <ph name="PLUGIN_NAME" />‏، هل تريد إيقافه؟</translation>
@@ -2212,6 +2221,7 @@
 <translation id="338323348408199233">‏حظر الزيارات بدون شبكة افتراضية خاصة (VPN)</translation>
 <translation id="3385092118218578224"><ph name="DISPLAY_ZOOM" />%</translation>
 <translation id="338583716107319301">فاصل</translation>
+<translation id="3387023983419383865">،</translation>
 <translation id="3387614642886316601">استخدام التدقيق الإملائي المُحسَّن</translation>
 <translation id="3387829698079331264">المواقع الإلكترونية التي لا يُسمح لها بمعرفة متى تستخدم جهازك بشكل نشط</translation>
 <translation id="3388094447051599208">دُرج الإخراج في الطابعة شبه ممتلئ</translation>
@@ -2565,6 +2575,7 @@
 <translation id="3747077776423672805">‏لإزالة التطبيقات، انتقِل إلى "الإعدادات" &gt; "متجر Google Play" &gt; إدارة إعدادات Android المفضّلة &gt; "التطبيقات" أو "مدير التطبيقات". ثم انقر على التطبيق الذي تريد إلغاء تثبيته (عليك التمرير السريع لليمين أو اليسار للعثور على التطبيق)، ثم انقر على "إلغاء التثبيت" أو "إيقاف".</translation>
 <translation id="3747220812138541072">عرض اقتراحات نصية مضمّنة تظهر أثناء الكتابة</translation>
 <translation id="3748706263662799310">الإبلاغ عن خطأ</translation>
+<translation id="3752253558646317685">اطلب من طفلك مواصلة رفع إصبعه لحفظ بصمة الإصبع.</translation>
 <translation id="3752582316358263300">حسنًا...</translation>
 <translation id="3753033997400164841">حفظ كلمة المرور مرة واحدة وإتاحتها على جميع الأجهزة</translation>
 <translation id="3755411799582650620">بإمكان هاتفك <ph name="PHONE_NAME" /> أن يلغي قفل جهاز<ph name="DEVICE_TYPE" /> أيضًا.</translation>
@@ -3024,6 +3035,7 @@
 <translation id="425573743389990240">بطارية تفريغ شحن البطارية بوحدة الوات (القيمة السالب تعني أنه جارٍ شحن البطارية)</translation>
 <translation id="4256316378292851214">حف&amp;ظ الفيديو باسم...</translation>
 <translation id="4258348331913189841">أنظمة الملفات</translation>
+<translation id="4258786365875464621">يريد تطبيق <ph name="APP_ORIGIN" /> فتح هذه الملفات:</translation>
 <translation id="4259388776256904261">قد يستغرق هذا الإعداد بعض الوقت.</translation>
 <translation id="4260182282978351200">‏قد يكون الملف <ph name="FILE_NAME" /> خطيرًا. هل تريد إرساله إلى برنامج "الحماية المتقدّمة" من Google لفحصه؟ ما عليك سوى الضغط على Shift+F6 للانتقال إلى منطقة شريط عمليات التنزيل.</translation>
 <translation id="4263223596040212967">يُرجى التحقق من تنسيق لوحة المفاتيح وإعادة المحاولة.</translation>
@@ -3054,6 +3066,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{عرض}zero{عرض محتوى الإشعارات}two{عرض محتوى الإشعارَين}few{عرض محتوى الإشعارات}many{عرض محتوى الإشعارات}other{عرض محتوى الإشعارات}}</translation>
 <translation id="4289372044984810120">يمكنك إدارة حساباتك هنا. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">نظرة عامة</translation>
+<translation id="4289732974614035569">اختيار رقم تعريف شخصي</translation>
 <translation id="4290791284969893584">بعد إغلاق صفحة، قد لا تكتمل المهام التي بدأتها عليها.</translation>
 <translation id="4295072614469448764">أصبح التطبيق متاحًا في الوحدة الطرفية وقد تجد رمزًا له في مشغِّل التطبيقات.</translation>
 <translation id="4295839147292213505">يمكنك إرسال رسائل نصية من جهاز الكمبيوتر ومشاركة اتصالك بالإنترنت والرد على إشعارات المحادثات وفتح قفل جهاز <ph name="DEVICE_TYPE" /> باستخدام هاتفك.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
@@ -3651,6 +3664,7 @@
 <translation id="4943368462779413526">كرة القدم</translation>
 <translation id="4943691134276646401">يجب ربط "<ph name="CHROME_EXTENSION_NAME" />" بمنفذ تسلسلي</translation>
 <translation id="4944310289250773232">تتم استضافة خدمة المصادقة هذه من قِبل <ph name="SAML_DOMAIN" />.</translation>
+<translation id="4945439665401275950">لإعداد بصمة الإصبع، اطلب من طفلك لمس مستشعر زر التشغيل. ويتم تخزين بيانات بصمة إصبع طفلك بشكل آمن وتظلّ محفوظة على جهاز <ph name="DEVICE_TYPE" /> هذا.</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{ملفّ واحد}zero{# ملفّ}two{ملفّان}few{# ملفّات}many{# ملفًّا}other{# ملف}}</translation>
 <translation id="495170559598752135">إجراءات</translation>
 <translation id="4953808748584563296">الصورة الرمزية التلقائية البرتقالية</translation>
@@ -4770,6 +4784,7 @@
 <translation id="6232017090690406397">البطارية</translation>
 <translation id="6232116551750539448">انقطع الاتصال بـ <ph name="NAME" /></translation>
 <translation id="6233154960150021497">الخيار التلقائي لاستخدام الصوت بدلاً من لوحة المفاتيح</translation>
+<translation id="6233455992368963267">‏سيتم إرسال الكلام باللغة <ph name="LANGUAGE" /> إلى Google لإجراء عمليّة المعالجة.</translation>
 <translation id="6234108445915742946">‏بنود خدمة Chrome ستتغيّر في 31 آذار (مارس)</translation>
 <translation id="6234474535228214774">التثبيت معلّق</translation>
 <translation id="6237474966939441970">تطبيق تدوين الملاحظات باستخدام قلم الشاشة</translation>
@@ -4863,7 +4878,9 @@
 <translation id="6318125393809743217">‏إدراج ملف policies.json في إعدادات السياسة</translation>
 <translation id="6318407754858604988">بدأ التنزيل</translation>
 <translation id="6318944945640833942">تعذّر العثور على طابعة. يُرجى إدخال عنوان الطابعة مرة أخرى.</translation>
+<translation id="6319081871916332821">تتم معالجة اللغة <ph name="LANGUAGE" /> محليًّا وبلا اتصال بالإنترنت.</translation>
 <translation id="6321407676395378991">تفعيل شاشة التوقف</translation>
+<translation id="6322370287306604163">فتح القفل بشكل أسرع من خلال بصمة الإصبع</translation>
 <translation id="6322653941595359182">‏إرسال رسائل نصيّة واستلامها من جهاز Chromebook</translation>
 <translation id="6324916366299863871">تعديل الاختصار</translation>
 <translation id="6325191661371220117">إيقاف التشغيل التلقائي</translation>
@@ -5016,6 +5033,7 @@
 <translation id="6497789971060331894">التمرير العكسي عبر الماوس</translation>
 <translation id="6498249116389603658">&amp;جميع اللغات</translation>
 <translation id="6499143127267478107">حل المضيف في النص البرمجي للخادم الوكيل...</translation>
+<translation id="6501086852992132091">يريد تطبيق <ph name="APP_ORIGIN" /> فتح هذا الملف:</translation>
 <translation id="650266656685499220">‏لإنشاء ألبومات، انتقِل إلى "صور Google".</translation>
 <translation id="6503077044568424649">الأكثر زيارة</translation>
 <translation id="650457560773015827">زر الماوس الأيسر</translation>
@@ -5034,6 +5052,7 @@
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
         <ph name="EVENT_NAME" /></translation>
+<translation id="6519689855001245063">جارٍ التحقق من الأهليّة</translation>
 <translation id="6520876759015997832">‏نتيجة البحث <ph name="LIST_POSITION" /> من <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. يُرجى الضغط على Enter للانتقال إلى القسم.</translation>
 <translation id="6521214596282732365">تستخدِم المواقع الإلكترونية عادةً أشكال الخط من جهازك للسماح لك بإنشاء محتوى عالي الدقة باستخدام أدوات التصميم والرسم على الإنترنت.</translation>
 <translation id="652492607360843641">أنت متصل بشبكة من نوع <ph name="NETWORK_TYPE" />.</translation>
@@ -5257,6 +5276,7 @@
 <translation id="6785518634832172390">يجب ألا يزيد رقم التعريف الشخصي عن 12 حرفًا.</translation>
 <translation id="6786747875388722282">الإضافات</translation>
 <translation id="6787097042755590313">علامة تبويب أخرى</translation>
+<translation id="6787631759192429908">هل تريد فتح الملفات؟</translation>
 <translation id="6787839852456839824">اختصارات لوحة المفاتيح</translation>
 <translation id="6788210894632713004">إضافة تم فك حزمتها</translation>
 <translation id="6789592661892473991">تقسيم أفقي</translation>
@@ -5325,6 +5345,7 @@
 <translation id="6846178040388691741">تريد الإضافة "<ph name="EXTENSION_NAME" />" طباعة <ph name="FILE_NAME" /> باستخدام <ph name="PRINTER_NAME" />.</translation>
 <translation id="6847125920277401289">إخلاء بعض المساحة للمواصلة</translation>
 <translation id="6848388270925200958">تمتلك الآن بعض البطاقات التي يمكن استخدامها فقط على هذا الجهاز</translation>
+<translation id="6848716236260083778">لإعداد بصمة الإصبع، اطلب من طفلك لمس مستشعر بصمات الإصبع. ويتم تخزين بيانات بصمة إصبع طفلك بشكل آمن وتظلّ محفوظة على جهاز <ph name="DEVICE_TYPE" /> هذا.</translation>
 <translation id="6850286078059909152">لون النص</translation>
 <translation id="6851181413209322061">‏يمكنك إرسال بيانات الاستخدام والتشخيص. ويُرسل هذا الجهاز حاليًا بيانات استخدام التطبيق وبيانات التشخيص وبيانات الجهاز تلقائيًا إلى Google. ولن يتم استخدام هذه البيانات للتعرّف على حسابك الفرعي، بل ستُستخدَم لتعزيز استقرار النظام والتطبيقات وإجراء المزيد من التحسينات. وسيستفيد أيضًا مطوّرو التطبيقات والشركاء في Google، مثل مطوّري البرامج المتوافقة مع Android، من بعض البيانات المجمّعة. ويفرض المالك هذا الإعداد. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات" لحسابك الفرعي، قد يتم حفظ هذه البيانات في حسابك على Google.</translation>
 <translation id="6851497530878285708">تم تفعيل التطبيق</translation>
@@ -5671,6 +5692,7 @@
 <translation id="7243632151880336635">المحو والخروج</translation>
 <translation id="7243784282103630670">‏حدث خطأ أثناء ترقية نظام التشغيل Linux. ستتم استعادة الحاوية باستخدام النسخة الاحتياطية.</translation>
 <translation id="7245628041916450754">‏<ph name="WIDTH" /> x <ph name="HEIGHT" /> (الأفضل)</translation>
+<translation id="7246079707145287765">عرض علامة التبويب <ph name="TAB_ORIGIN" /></translation>
 <translation id="7246230585855757313">أعِد إدخال مفتاح الأمان وحاول مجددًا</translation>
 <translation id="7249777306773517303">يتولى <ph name="DOMAIN" /> إدارة هذا الجهاز ويتطلّب منك تسجيل الدخول في كل مرة.</translation>
 <translation id="7250616558727237648">لم يستجِب الجهاز الذي تحاول المشاركة معه لطلبك. يُرجى إعادة المحاولة.</translation>
@@ -5717,6 +5739,7 @@
 <translation id="7297726121602187087">أخضر داكن</translation>
 <translation id="7298195798382681320">موصى بها</translation>
 <translation id="7299337219131431707">تفعيل ميزة "تصفح الضيف"</translation>
+<translation id="7301470816294041580">‏يمكنك طرح السؤال "Ok Google، ما هو اسم هذه الأغنية؟" أو "Ok Google، ما الذي تعرضه شاشتي؟".</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{‏قد يمنع هذا التطبيق تشغيل Chrome بشكلٍ صحيح.}zero{‏قد تمنع هذه التطبيقات تشغيل Chrome بشكلٍ صحيح.}two{‏قد يمنع هذان التطبيقان تشغيل Chrome بشكلٍ صحيح.}few{‏قد تمنع هذه التطبيقات تشغيل Chrome بشكلٍ صحيح.}many{‏قد تمنع هذه التطبيقات تشغيل Chrome بشكلٍ صحيح.}other{‏قد تمنع هذه التطبيقات تشغيل Chrome بشكلٍ صحيح.}}</translation>
 <translation id="7303281435234579599">عفوًا، لقد حدث خطأ أثناء إعداد الوضع التجريبي.</translation>
 <translation id="7303900363563182677">تم حظر هذا الموقع من الاطلاع على النصوص والصور التي تم نسخها إلى الحافظة.</translation>
@@ -5821,6 +5844,7 @@
 <translation id="740810853557944681">إضافة خادم طباعة</translation>
 <translation id="7409549334477097887">كبير جدًا</translation>
 <translation id="7409735910987429903">قد ترسل المواقع الإلكترونية نوافذ منبثقة لعرض الإعلانات أو تستخدم عمليات إعادة التوجيه لتوجيهك إلى مواقع إلكترونية قد لا ترغب في زيارتها.</translation>
+<translation id="7409854300652085600">تم استيراد الإشارات المرجعية.</translation>
 <translation id="7410344089573941623">السؤال عند رغبة <ph name="HOST" /> في الدخول إلى الكاميرا والميكروفون التابعين لك</translation>
 <translation id="741204030948306876">نعم، موافق</translation>
 <translation id="7412226954991670867">‏ذاكرة GPU</translation>
@@ -5956,6 +5980,8 @@
 <translation id="7552846755917812628">جرّب النصائح التالية:</translation>
 <translation id="7553012839257224005">‏جارٍ التحقُّق من حاوية نظام التشغيل Linux</translation>
 <translation id="7553242001898162573">إدخال كلمة المرور</translation>
+<translation id="7553347517399115470">عدم السؤال مرّة أخرى عند فتح تنسيقات الملفات هذه في هذا التطبيق:
+<ph name="FILE_FORMATS" /></translation>
 <translation id="755472745191515939">لا يسمح المشرف باستخدام هذه اللغة.</translation>
 <translation id="7554791636758816595">علامة تبويب جديدة</translation>
 <translation id="7556033326131260574">‏لم يتمكن Smart Lock من التحقق من حسابك. اكتب كلمة المرور للدخول.</translation>
@@ -6570,6 +6596,7 @@
 <translation id="8162307956032783161">تحديد مفتاح التبديل: التالي</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{نقل علامة تبويب واحدة إلى نافذة جديدة}zero{نقل علامات تبويب إلى نافذة جديدة}two{نقل علامتَي تبويب إلى نافذة جديدة}few{نقل علامات تبويب إلى نافذة جديدة}many{نقل علامات تبويب إلى نافذة جديدة}other{نقل علامات تبويب إلى نافذة جديدة}}</translation>
 <translation id="8165997195302308593">‏إعادة توجيه منفذ Crostini</translation>
+<translation id="8166081708154635403">هل تريد فتح ملف؟</translation>
 <translation id="816704878106051517">{COUNT,plural, =1{رقم هاتف واحد}zero{# رقم هاتف}two{رقما هاتف}few{# أرقام هاتف}many{# رقم هاتف}other{# رقم هاتف}}</translation>
 <translation id="8168435359814927499">المحتوى</translation>
 <translation id="8169165065843881617">{NUM_TABS,plural, =1{إضافة علامة التبويب إلى قائمة القراءة}zero{إضافة علامات التبويب إلى قائمة القراءة}two{إضافة علامتَي التبويب إلى قائمة القراءة}few{إضافة علامات التبويب إلى قائمة القراءة}many{إضافة علامات التبويب إلى قائمة القراءة}other{إضافة علامات التبويب إلى قائمة القراءة}}</translation>
@@ -6739,6 +6766,7 @@
 <translation id="835238322900896202">حدث خطأ أثناء إلغاء التثبيت. يُرجى إلغاء التثبيت من خلال الوحدة الطرفية.</translation>
 <translation id="8352772353338965963">يمكنك إضافة حساب إلى الدخول المتعدد. يمكن الدخول إلى جميع الحسابات التي تم تسجيل الدخول إليها بدون كلمة مرور، لذا فإن هذه الميزة لا يجب استخدامها إلا مع الحسابات الموثوق بها.</translation>
 <translation id="8353683614194668312">يمكنه:</translation>
+<translation id="8354034204605718473">تمت إضافة رقم التعريف الشخصي لطفلك</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8357388086258943206">‏حدث خطأ أثناء تثبيت نظام التشغيل Linux</translation>
 <translation id="8358685469073206162">هل تريد استعادة الصفحات؟</translation>
@@ -6972,6 +7000,7 @@
 <translation id="8645920082661222035">توقُّع الأحداث الخطيرة قبل حدوثها والتحذير منها</translation>
 <translation id="8646209145740351125">إيقاف المزامنة</translation>
 <translation id="864637694230589560">تُرسِل المواقع الإلكترونية عادةً الإشعارات لإعلامك بالأخبار العاجلة أو رسائل الدردشة.</translation>
+<translation id="8647385344110255847">‏عند حصول طفلك على إذن منك، سيتمكّن من استخدام Google Play لتثبيت التطبيقات.</translation>
 <translation id="8647834505253004544">ليس عنوان ويب صالحًا</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> أو <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">درجة حرارة ألوان الإضاءة الليلية</translation>
@@ -7119,6 +7148,7 @@
 <translation id="8783834180813871000">اكتب رمز إقران البلوتوث، ثم اضغط على "رجوع" أو "إدخال".</translation>
 <translation id="8784626084144195648">تم تثبيت المعدل</translation>
 <translation id="8785622406424941542">قلم الشاشة</translation>
+<translation id="8786824282808281903">عندما يظهر هذا الرمز لطفلك، يمكن استخدام بصمة الإصبع لتحديد الهوية أو الموافقة على عمليات الشراء.</translation>
 <translation id="8787575090331305835">{NUM_TABS,plural, =1{مجموعة لم تتم تسميتها تحتوي على علامة تبويب واحدة}zero{مجموعة لم تتم تسميتها تحتوي على # علامة تبويب}two{مجموعة لم تتم تسميتها تحتوي على علامتَي تبويب}few{مجموعة لم تتم تسميتها تحتوي على # علامات تبويب}many{مجموعة لم تتم تسميتها تحتوي على # علامة تبويب}other{مجموعة لم تتم تسميتها تحتوي على # علامة تبويب}}</translation>
 <translation id="8791534160414513928">إرسال طلب "عدم التعقب" مع زيارات التصفح</translation>
 <translation id="8792626944327216835">الميكروفون</translation>
@@ -7364,6 +7394,7 @@
 <translation id="9031811691986152304">إعادة المحاولة</translation>
 <translation id="9033765790910064284">متابعة على أي حال</translation>
 <translation id="9033857511263905942">ل&amp;صق</translation>
+<translation id="903480517321259405">يُرجى كتابة رقم التعريف الشخصي مرّة أخرى</translation>
 <translation id="9037640663275993951">الجهاز غير مسموح به.</translation>
 <translation id="9037818663270399707">اتصالك بهذا الموقع الإلكتروني ليس خاصًا لجميع حركة بيانات الشبكة.</translation>
 <translation id="9037965129289936994">عرض الصفحة الأصلية</translation>
@@ -7390,6 +7421,10 @@
 <translation id="9064039204504614208">يمكنك النقر على أحد مفاتيح التبديل لتخصيصه للإجراء "<ph name="ACTION" />"، مع إمكانية تخصيص عدة مفاتيح تبديل له أيضًا.</translation>
 <translation id="9064275926664971810">تفعيل الملء التلقائي لملء النماذج بنقرة واحدة</translation>
 <translation id="9065203028668620118">تعديل</translation>
+<translation id="9066394310994446814">‏يتم عرض هذا العنصر لك استنادًا إلى نشاطك السابق على خدمات Google. يمكنك الاطّلاع على بياناتك وحذفها وتغيير إعداداتك على الرابط <ph name="BEGIN_LINK1" />myactivity.google.com<ph name="END_LINK1" />.
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        يمكنك معرفة نوع البيانات التي تجمعها Google وسبب جمعها على الرابط <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />.</translation>
 <translation id="9066782832737749352">تحويل النَّص إلى الكلام</translation>
 <translation id="9068878141610261315">نوع الملف غير متوافق.</translation>
 <translation id="9070342919388027491">تم نقل علامة التبويب إلى اليسار.</translation>
@@ -7498,6 +7533,7 @@
 <translation id="917510707618656279">طلب الإذن عند محاولة موقع إلكتروني الوصول إلى أجهزة البلوتوث</translation>
 <translation id="9176476835295860688">‏يمكنك إرسال بيانات الاستخدام والتشخيص. يرسل هذا الجهاز حاليًا بيانات استخدام التطبيق والجهاز والتشخيص تلقائيًا إلى Google. سيساعد ذلك في استقرار عمل النظام والتطبيقات، بالإضافة إلى التحسينات الأخرى. كما ستساعد بعض البيانات المجمّعة تطبيقات Google وشركائها، مثل مطوّري برامج نظام التشغيل Android. ويفرض المالك هذا <ph name="BEGIN_LINK1" />الإعداد<ph name="END_LINK1" />. في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات"، قد يتم حفظ هذه البيانات في حسابك على Google. <ph name="BEGIN_LINK2" />مزيد من المعلومات<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - جهاز البلوتوث متصل</translation>
+<translation id="9176817945195089764">‏<ph name="DOMAIN" /> ليست مؤسسة صالحة. يُرجى التواصل مع المشرف. وإذا كنت مشرفًا، يمكنك إعداد مؤسستك بالانتقال إلى: g.co/ChromeEnterpriseAccount.</translation>
 <translation id="9179524979050048593">اسم المستخدم في شاشة تسجيل الدخول</translation>
 <translation id="9180281769944411366">‏قد تستغرق هذه العملية بضع دقائق. جارٍ بدء تشغيل حاوية نظام التشغيل Linux.</translation>
 <translation id="9180380851667544951">يمكن للموقع الإلكتروني مشاركة شاشتك.</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index 3b13eb3..f2cceb1 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -72,6 +72,7 @@
 <translation id="107278043869924952">পাছৱৰ্ডৰ সলনি পিন ব্যৱহাৰ কৰক</translation>
 <translation id="1076176485976385390">পাঠৰ এটা কাৰ্ছৰৰ জৰিয়তে পৃষ্ঠাসমূহ নেভিগে’ট কৰক</translation>
 <translation id="1076698951459398590">থীম সক্ষম কৰক</translation>
+<translation id="1076766328672150609">ডিভাইচটো আনলক কৰিবলৈ আপোনাৰ শিশুৱে এটা পিন ব্যৱহাৰ কৰিব পাৰে।</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1076882167394279216"><ph name="LANGUAGE" />ৰ বানান পৰীক্ষাৰ অভিধান ডাউনল'ড কৰিব পৰা নগ'ল। পুনৰ চেষ্টা কৰক।</translation>
 <translation id="1079766198702302550">সদায় কেমেৰাৰ এক্সেছ অৱৰোধ কৰক</translation>
@@ -259,6 +260,7 @@
 <translation id="1275718070701477396">বাছনি কৰা আছে</translation>
 <translation id="1276994519141842946"><ph name="APP_NAME" /> ইনষ্টল কৰিব পৰা নগ’ল</translation>
 <translation id="1277020343994096713">আপোনাৰ বৰ্তমান পিনটোতকৈ পৃথক এটা নতুন পিন সৃষ্টি কৰক</translation>
+<translation id="1278859221870828664">Google Play এপ্‌ আৰু সেৱাসমূহৰ পৰ্যালোচনা কৰক</translation>
 <translation id="127946606521051357">ওচৰৰ ডিভাইচে শ্বেয়াৰ কৰি আছে</translation>
 <translation id="1280965841156951489">ফাইলসমূহ সম্পাদনা কৰক</translation>
 <translation id="1285320974508926690">এই ছাইটটো কেতিয়াও অনুবাদ নকৰিব</translation>
@@ -745,6 +747,7 @@
 <translation id="1779652936965200207">অনুগ্ৰহ কৰি এই পাছকীটো "<ph name="DEVICE_NAME" />"ত দিয়ক:</translation>
 <translation id="177989070088644880">এপ্‌ (<ph name="ANDROID_PACKAGE_NAME" />)</translation>
 <translation id="1780152987505130652">গোটটো বন্ধ কৰক</translation>
+<translation id="1780273119488802839">বুকমাৰ্ক আমদানি কৰি থকা হৈছে...</translation>
 <translation id="1781291988450150470">বৰ্তমানৰ পিন</translation>
 <translation id="1781398670452016618"><ph name="DOMAIN" />ৰ বাবে আপুনি এতিয়াই এটা ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰিব লাগিব আৰু এটা আপডে’ট ডাউনল’ড কৰিব লাগিব।</translation>
 <translation id="1781502536226964113">নতুন টেবৰ পৃষ্ঠাটো খোলক</translation>
@@ -808,6 +811,7 @@
 <translation id="1834503245783133039">ডাউনল’ড কৰিবপৰা নগ’ল: <ph name="FILE_NAME" /></translation>
 <translation id="1835261175655098052">Linux আপগ্ৰে’ড কৰি থকা হৈছে</translation>
 <translation id="1838374766361614909">সন্ধান কৰা বস্তুবোৰ মচক</translation>
+<translation id="1839540115464516994"><ph name="LOCATION" />ত দেখুৱাওক</translation>
 <translation id="1841545962859478868">ডিভাইচৰ প্ৰশাসকে এইবোৰ নিৰীক্ষণ কৰিব পাৰে:</translation>
 <translation id="1841616161104323629">ডিভাইচৰ ৰেকৰ্ড নাই।</translation>
 <translation id="1841705068325380214"><ph name="EXTENSION_NAME" /> অক্ষম কৰা আছে</translation>
@@ -1102,6 +1106,8 @@
 <translation id="2154710561487035718">URL প্ৰতিলিপি কৰক</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> যেন লাগিছে</translation>
 <translation id="2156294658807918600">সেৱা কৰ্মী: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156557113115192526">এই এপ্‌টোত এই ফৰ্মেটৰ ফাইল খোলোঁতে পুনৰ নুসুধিব:
+<ph name="FILE_FORMAT" /></translation>
 <translation id="2156877321344104010">সুৰক্ষা পৰীক্ষা পুনৰ চলাওক</translation>
 <translation id="2157474325782140681">অতিৰিক্ত সুবিধাসমূহ পাবলৈ এই Chromebookৰ সৈতে কাম কৰিবলৈ ডিজাইন কৰা এটা Dell ড’কিং ষ্টেচন ব্যৱহাৰ কৰক।</translation>
 <translation id="215753907730220065">পূৰ্ণ স্ক্ৰীণৰ পৰা বাহিৰ হওক</translation>
@@ -1280,6 +1286,7 @@
 <translation id="2336381494582898602">পাৱাৰৱাশ্ব</translation>
 <translation id="2337236196941929873">Chromeএ যিবোৰ পৃষ্ঠালৈ আপুনি যাব পাৰে বুলি ভাবে সেইবোৰ আগতীয়াকৈ ল’ড কৰে। এয়া কৰিবলৈ Chromeএ কুকি ব্যৱহাৰ কৰিব পাৰে যদিহে আপুনি কুকিৰ অনুমতি দিয়ে, আৰু ছাইটবোৰৰ পৰা আপোনাৰ পৰিচয় লুকুৱাবলৈ পৃষ্ঠাবোৰ এনক্ৰিপ্ট কৰিব পাৰে আৰু সেইবোৰ Googleৰ জৰিয়তে প্ৰেৰণ কৰিব পাৰে।</translation>
 <translation id="2340239562261172947"><ph name="FILE_NAME" />ক সুৰক্ষিতভাৱে ডাউনল’ড কৰিব নোৱাৰি</translation>
+<translation id="2342180549977909852">এই ডিভাইচটো আনলক কৰিবলৈ আপোনাৰ শিশুৱে পাছৱৰ্ডৰ সলনি এটা নম্বৰ (পিন) ব্যৱহাৰ কৰিব পাৰে। পাছত পিন ছেট কৰিবলৈ ছেটিঙলৈ যাওক।</translation>
 <translation id="2342740338116612727">বুকমাৰ্ক যোগ কৰা হ’ল</translation>
 <translation id="2343747224442182863">এই টেবটোত ফ'কাছ কৰক</translation>
 <translation id="2345723121311404059"><ph name="PRINTER_NAME" />লৈ ১ পৃষ্ঠা</translation>
@@ -1739,6 +1746,7 @@
 <translation id="2828375943530438449">ছাইন ইন কৰাৰ পৰা উভতি যাওক</translation>
 <translation id="2828650939514476812">ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰক</translation>
 <translation id="2831430281393059038">ডিভাইচটো সমৰ্থিত</translation>
+<translation id="2832124733806557606">ডিভাইচটোত ছাইন ইন কৰিবলৈ অথবা সেইটো আনলক কৰিবলৈ আপোনাৰ শিশুৱে এটা পিন ব্যৱহাৰ কৰিব পাৰে।</translation>
 <translation id="2835547721736623118">কণ্ঠস্বৰ চিনাক্তকৰণ সেৱা</translation>
 <translation id="2836269494620652131">ক্ৰেশ্ব</translation>
 <translation id="2836635946302913370">আপোনাৰ প্ৰশাসকে এই ব্যৱহাৰকাৰীৰ নামটোৰে ছাইন ইন কৰাটো অক্ষম কৰি থৈছে।</translation>
@@ -1754,6 +1762,7 @@
 <translation id="2849035674501872372">ওপৰলৈ চাওক</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
 <translation id="284975061945174219">পৰিষ্কাৰ কৰিব পৰা নগ’ল</translation>
+<translation id="2849767214114481738">আপোনাৰ পিন যোগ দিয়া হৈছে</translation>
 <translation id="2849936225196189499">জটিল</translation>
 <translation id="2850541429955027218">থীম যোগ কৰক</translation>
 <translation id="2851634818064021665">এই ছাইটটো চাবলৈ আপোনাক অনুমতিৰ প্ৰয়োজন</translation>
@@ -1862,6 +1871,7 @@
 <translation id="2960208947600937804">Linux কনফিগাৰ কৰি থাকোঁতে এটা আসোঁৱাহ হৈছে। আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।</translation>
 <translation id="296026337010986570">হ’ল! ক্ষতিকাৰক ছফ্টৱেৰ আঁতৰোৱা হ’ল। এক্সটেনশ্বন পুনৰাই অন কৰিবলৈ &lt;a href="chrome://extensions"&gt;Extensions&lt;/a&gt;লৈ যাওক।</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (এক্সটেনশ্বন প্ৰদান কৰা হৈছে)</translation>
+<translation id="2961210776189273067">শিৰোনাম</translation>
 <translation id="2961695502793809356">আগলৈ যাবলৈ ক্লিক কৰক, ইতিহাস চাবলৈ ধৰি ৰাখক</translation>
 <translation id="2962131322798295505">ৱালপেপাৰ বাছনিকৰ্তা</translation>
 <translation id="2963151496262057773">এই প্লাগইনে সঁহাৰি জনোৱা নাই: <ph name="PLUGIN_NAME" /> আপুনি এইটো বন্ধ কৰিব খোজেনে?</translation>
@@ -2217,6 +2227,7 @@
 <translation id="338323348408199233">ভিপিএন নোহোৱাকৈয়ে ট্ৰেফিক অৱৰোধ কৰক</translation>
 <translation id="3385092118218578224"><ph name="DISPLAY_ZOOM" />%</translation>
 <translation id="338583716107319301">পৃথকীকাৰক</translation>
+<translation id="3387023983419383865">,</translation>
 <translation id="3387614642886316601">উন্নত বানান পৰীক্ষক ব্যৱহাৰ কৰক</translation>
 <translation id="3387829698079331264">আপুনি নিজৰ ডিভাইচটো কেতিয়া সক্ৰিয়ভাৱে ব্যৱহাৰ কৰি থাকে সেয়া জানিবলৈ দিয়া নহয়</translation>
 <translation id="3388094447051599208">আউটপুট ট্ৰে’খন প্ৰায় ভৰি পৰিছে</translation>
@@ -2570,6 +2581,7 @@
 <translation id="3747077776423672805">এপ্‌সমূহ আঁতৰাবলৈ ছেটিংসমূহ &gt; Google Play Store &gt; Androidৰ অগ্ৰাধিকাৰসমূহ পৰিচালনা কৰক&gt; এপ্‌সমূহ অথবা এপ্লিকেশ্বন পৰিচালকলৈ যাওক। তাৰ পাছত আপুনি আনইনষ্টল কৰিব খোজা এপ্‌টোত টিপক (আপুনি এপ্‌টো বিচাৰিবলৈ সোঁ অথবা বাওঁফাললৈ ছোৱাইপ কৰিব লগা হ’ব পাৰে)। তাৰ পাছত আনইনষ্টল কৰক অথবা অক্ষম কৰকত টিপক।</translation>
 <translation id="3747220812138541072">আপুনি টাইপ কৰিলে প্ৰদর্শিত হোৱা ইনলাইন লিখাৰ পৰামর্শ দেখুৱাওক</translation>
 <translation id="3748706263662799310">এটা বাগৰ অভিযোগ দিয়ক</translation>
+<translation id="3752253558646317685">ফিংগাৰপ্ৰিণ্টটো ছেভ কৰিবলৈ আপোনাৰ শিশুক নিজৰ আঙুলিটো উঠাই থাকিবলৈ দিয়ক</translation>
 <translation id="3752582316358263300">ঠিক আছে...</translation>
 <translation id="3753033997400164841">এবাৰ ষ্ট’ৰ কৰক। সকলোতে ব্যৱহাৰ কৰক</translation>
 <translation id="3755411799582650620">আপোনাৰ <ph name="PHONE_NAME" />এ এতিয়া <ph name="DEVICE_TYPE" />ও আনলক কৰিব পাৰে।</translation>
@@ -3029,6 +3041,7 @@
 <translation id="425573743389990240">চ্চাৰ্জ খৰচ হোৱাৰ হাৰ ৱাট এককত ( ঋণাত্মক মানে বেটাৰী চ্চার্জ হৈ থকাটো বুজাব)</translation>
 <translation id="4256316378292851214">ডিডিঅ’ ছে&amp;ভ কৰাৰ বিকল্প...</translation>
 <translation id="4258348331913189841">ফাইলৰ ছিষ্টেম</translation>
+<translation id="4258786365875464621"><ph name="APP_ORIGIN" />এ এই ফাইলসমূহ খুলিব বিচাৰিছে:</translation>
 <translation id="4259388776256904261">এইটোৰ বাবে কিছু সময় লাগিব পাৰে</translation>
 <translation id="4260182282978351200"><ph name="FILE_NAME" /> বিপজ্জনক হ’ব পাৰে। স্কেন কৰিবলৈ Googleৰ সুৰক্ষা সম্পৰ্কীয় উন্নত সুবিধাটোলৈ পঠিয়াবনে? ডাউনল’ড বাৰৰ ক্ষেত্ৰলৈ যাবলৈ শ্বিফ্ট+F6 টিপক।</translation>
 <translation id="4263223596040212967">আপোনাৰ কীব'ৰ্ডৰ লে’আউট পৰীক্ষা কৰক আৰু আকৌ চেষ্টা কৰক</translation>
@@ -3059,6 +3072,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{দেখুৱাওক}one{আটাইবোৰ দেখুৱাওক}other{আটাইবোৰ দেখুৱাওক}}</translation>
 <translation id="4289372044984810120">আপোনাৰ একাউণ্টসমূহ ইয়াত পৰিচালনা কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">ৰূপৰেখা</translation>
+<translation id="4289732974614035569">পিন বাছনি কৰক</translation>
 <translation id="4290791284969893584">এখন পৃষ্ঠা বন্ধ কৰাৰ পাছত আপুনি আৰম্ভ কৰা কাৰ্যসমূহ সম্পূৰ্ণ নহ'বও পাৰে</translation>
 <translation id="4295072614469448764">আপোনাৰ টাৰ্মিনেলত এপ্ আছে। আপোনাৰ লঞ্চাৰটোএ এটা আইকন থাকিব পাৰে।</translation>
 <translation id="4295839147292213505">আপুনি নিজৰ কম্পিউটাৰৰ পৰা পাঠ বাৰ্তা পঠিয়াব পাৰে, আপোনাৰ ইণ্টাৰনেট সংযোগ শ্বেয়াৰ কৰিব পাৰে, বাৰ্তালাপৰ জাননীত প্ৰত্যুত্তৰ দিব আৰু আপোনাৰ ফ'নৰ জৰিয়তে নিজৰ <ph name="DEVICE_TYPE" /> আনলক কৰিব পাৰে।<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation>
@@ -3656,6 +3670,7 @@
 <translation id="4943368462779413526">ফুটবল</translation>
 <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />"এ এটা ছিৰিয়েল প’ৰ্টৰ সৈতে সংযোগ কৰিব বিচাৰে</translation>
 <translation id="4944310289250773232">এই বিশ্বাসযোগ্যতা প্ৰমাণীকৰণ সেৱা <ph name="SAML_DOMAIN" />এ হ'ষ্ট কৰে</translation>
+<translation id="4945439665401275950">ফিংগাৰপ্ৰিণ্ট ছেট আপ কৰিবলৈ আপোনাৰ শিশুক পাৱাৰ বুটামটো স্পৰ্শ কৰিবলৈ দিয়ক। আপোনাৰ শিশুৰ ফিংগাৰপ্ৰিণ্টৰ ডেটা সুৰক্ষিতভাৱে ষ্ট’ৰ কৰা হয় আৰু সেইখিনি সদায় এই <ph name="DEVICE_TYPE" />ত থাকে।</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{এটা ফাইল}one{# টা ফাইল}other{# টা ফাইল}}</translation>
 <translation id="495170559598752135">কাৰ্যসমূহ</translation>
 <translation id="4953808748584563296">ডিফ’ল্ট কমলা অৱতাৰ</translation>
@@ -4773,6 +4788,7 @@
 <translation id="6232017090690406397">বেটাৰী</translation>
 <translation id="6232116551750539448"><ph name="NAME" />ৰ সৈতে সংযোগ বিচ্ছিন্ন হৈছে</translation>
 <translation id="6233154960150021497">ডিফ'ল্ট হৈছে কীব'ৰ্ডৰ পৰিৱৰ্তে কণ্ঠধ্বনিৰ ব্যৱহাৰ কৰা</translation>
+<translation id="6233455992368963267"><ph name="LANGUAGE" />ৰ কথন প্ৰক্ৰিয়াকৰণৰ বাবে Googleলৈ পঠিওৱা হয়।</translation>
 <translation id="6234108445915742946">৩১ মাৰ্চৰ পৰা Chromeৰ সেৱাৰ চর্তাৱলী সলনি হ’ব</translation>
 <translation id="6234474535228214774">ইনষ্টল বাকী আছে</translation>
 <translation id="6237474966939441970">ষ্টাইলাছ টোকা লোৱা এপ্‌</translation>
@@ -4866,7 +4882,9 @@
 <translation id="6318125393809743217">নীতিৰ কনফিগাৰেশ্বনসমূহৰ সৈতে এটা policies.json ফাইল অন্তৰ্ভুক্ত কৰক।</translation>
 <translation id="6318407754858604988">ডাউনল’ড আৰম্ভ হৈছে</translation>
 <translation id="6318944945640833942">কোনো প্ৰিণ্টাৰ চিনাক্ত কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি প্ৰিণ্টাৰৰ ঠিকনা পুনৰ দিয়ক।</translation>
+<translation id="6319081871916332821"><ph name="LANGUAGE" /> স্থানীয়ভাৱে প্ৰক্ৰিয়াকৰণ কৰা হৈছে আৰু ই অফলাইনত কাম কৰে।</translation>
 <translation id="6321407676395378991">স্ক্ৰীন ছেভাৰ অন কৰক</translation>
+<translation id="6322370287306604163">ফিংগাৰপ্ৰিণ্টৰ জৰিয়তে দ্ৰুতভাৱে আনলক কৰক</translation>
 <translation id="6322653941595359182">আপোনাৰ Chromebookৰ পৰা পাঠ বাৰ্তা পঠিয়াওক আৰু গ্ৰহণ কৰক</translation>
 <translation id="6324916366299863871">শ্বৰ্টকাট সম্পাদনা কৰক</translation>
 <translation id="6325191661371220117">স্বয়ংক্ৰিয়ভাৱে লঞ্চ হোৱা সুবিধাটো অক্ষম কৰক</translation>
@@ -5018,6 +5036,7 @@
 <translation id="6497789971060331894">মাউছ ওলোটাকৈ স্ক্র’ল কৰাৰ সুবিধা</translation>
 <translation id="6498249116389603658">&amp;আপোনাৰ সকলো ভাষা</translation>
 <translation id="6499143127267478107">প্ৰক্সি স্ক্ৰিপ্টত হ'ষ্টৰ সমাধান কৰি থকা হৈছে ...</translation>
+<translation id="6501086852992132091"><ph name="APP_ORIGIN" />এ এই ফাইলটো খুলিব বিচাৰিছে:</translation>
 <translation id="650266656685499220">এলবাম সৃষ্টি কৰিবলৈ Google Photosলৈ যাওক</translation>
 <translation id="6503077044568424649">সকলোতকৈ বেছিকৈ চোৱা</translation>
 <translation id="650457560773015827">বাওঁফালৰ বুটাম</translation>
@@ -5036,6 +5055,7 @@
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
         <ph name="EVENT_NAME" /></translation>
+<translation id="6519689855001245063">যোগ্যতা পৰীক্ষা কৰি থকা হৈছে</translation>
 <translation id="6520876759015997832">সন্ধানৰ ফলাফল <ph name="LIST_SIZE" />ৰ ভিতৰত <ph name="LIST_POSITION" />: <ph name="SEARCH_RESULT_TEXT" />। শাখাটোলৈ যাবলৈ এণ্টাৰ টিপক।</translation>
 <translation id="6521214596282732365">ছাইটে সচৰাচৰ আপোনাৰ ফণ্ট ব্যৱহাৰ কৰে যাতে আপুনি অনলাইন ডিজাইন আৰু গ্ৰাফিক্স সঁজুলি ব্যৱহাৰ কৰি উচ্চমানৰ সমল সৃষ্টি কৰিব পাৰে</translation>
 <translation id="652492607360843641">আপুনি <ph name="NETWORK_TYPE" /> নেটৱৰ্কৰ সৈতে সংযোজিত হৈ আছে।</translation>
@@ -5257,6 +5277,7 @@
 <translation id="6785518634832172390">পিনটোত ১২ টা অথবা তাতকৈ কম অংক থাকিব লাগিব</translation>
 <translation id="6786747875388722282">এক্সটেনশ্বনসমূহ</translation>
 <translation id="6787097042755590313">অন্য টেব</translation>
+<translation id="6787631759192429908">ফাইলসমূহ খুলিব বিচাৰিছে নেকি?</translation>
 <translation id="6787839852456839824">কীব’ৰ্ডৰ শ্বৰ্টকাটসমূহ</translation>
 <translation id="6788210894632713004">আনপেক কৰি থোৱা এক্সটেনশ্বন</translation>
 <translation id="6789592661892473991">আনুভূমিকভাৱে বিভাজন কৰক</translation>
@@ -5325,6 +5346,7 @@
 <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />"এ <ph name="PRINTER_NAME" />ৰ জৰিয়তে <ph name="FILE_NAME" /> প্ৰিণ্ট কৰিব বিচাৰিছে।</translation>
 <translation id="6847125920277401289">অব্যাহত ৰাখিবলৈ ঠাই খালী কৰক</translation>
 <translation id="6848388270925200958">এই মুহূৰ্তত আপোনাৰ লগত কেইখনমান কাৰ্ড আছে যিবোৰ কেৱল এই ডিভাইচটোতহে ব্যৱহাৰ কৰিব পাৰি</translation>
+<translation id="6848716236260083778">ফিংগাৰপ্ৰিণ্ট ছেট আপ কৰিবলৈ আপোনাৰ শিশুক ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰিবলৈ দিয়ক। আপোনাৰ শিশুৰ ফিংগাৰপ্ৰিণ্টৰ ডেটা সুৰক্ষিতভাৱে ষ্ট’ৰ কৰা হয় আৰু সেইখিনি সদায় এই <ph name="DEVICE_TYPE" />ত থাকে।</translation>
 <translation id="6850286078059909152">পাঠৰ ৰং</translation>
 <translation id="6851181413209322061">ব্যৱহাৰ আৰু ডায়গনষ্টিক ডেটা পঠিয়াওক। এই ডিভাইচটোৱে বর্তমান স্বয়ংক্ৰিয়ভাৱে Googleলৈ ডায়গন’ষ্টিক, ডিভাইচ আৰু এপ্ ব্যৱহাৰৰ ডেটা পঠিয়াই আছে। এই ডেটাখিনি আপোনাৰ শিশুক চিনাক্ত কৰিবলৈ ব্যৱহাৰ কৰা নহয় আৰু ই ছিষ্টেম আৰু এপৰ স্থিৰতা আৰু অন্য উন্নয়নত সহায় কৰিব। কিছুমান একত্ৰিত ডেটাই Google এপ্‌ আৰু Android বিকাশকৰ্তাৰ দৰে অংশীদাৰকো সহায় কৰিব। এই ছেটিংটো গৰাকীয়ে বলৱৎ কৰিছে। যদি আপোনাৰ শিশুৰ বাবে অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপ অন কৰা হৈছে, তেন্তে এই ডেটা তেওঁৰ Google একাউণ্টটোত ছেভ কৰা হ’ব পাৰে।</translation>
 <translation id="6851497530878285708">এপ্ সক্ষম কৰা হ’ল</translation>
@@ -5670,6 +5692,7 @@
 <translation id="7243632151880336635">মচক আৰু ছাইন আউট কৰক</translation>
 <translation id="7243784282103630670">Linux আপগ্ৰে’ড কৰাৰ সময়ত এটা আসোঁৱাহ হৈছে। আমি আপোনাৰ বেক আপ ব্যৱহাৰ কৰি কণ্টেইনাৰটো পুনঃস্থাপন কৰিম।</translation>
 <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (উত্তম)</translation>
+<translation id="7246079707145287765"><ph name="TAB_ORIGIN" /> টেবটো চাওক</translation>
 <translation id="7246230585855757313">আপোনাৰ সুৰক্ষা চাবিটো পুনৰাই দি চেষ্টা কৰক</translation>
 <translation id="7249777306773517303">এই ডিভাইচটো <ph name="DOMAIN" />এ পৰিচালনা কৰে আৰু আপুনি প্ৰতিবাৰতে ছাইন ইন কৰাৰ প্ৰয়োজন হয়।</translation>
 <translation id="7250616558727237648">আপুনি যিটো ডিভাইচৰ সৈতে শ্বেয়াৰ কৰি আছে সেইটোৱে সঁহাৰি জনোৱা নাছিল। অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক।</translation>
@@ -5716,6 +5739,7 @@
 <translation id="7297726121602187087">গাঢ় সেউজীয়া</translation>
 <translation id="7298195798382681320">চুপাৰিছ কৰা</translation>
 <translation id="7299337219131431707">অতিথিয়ে ব্ৰাউজ কৰাৰ সুবিধাটো সক্ষম কৰক</translation>
+<translation id="7301470816294041580">আপুনি সুধিব পাৰে “Hey Google, এইটো কি গান?” অথবা “Hey Google, মোৰ স্ক্ৰীনত কি ওলাই আছে?”</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{এই এপ্লিকেশ্বনটোৱে Chromeক সঠিকভাৱে কাম কৰাৰ পৰা বাধা প্ৰদান কৰিব পাৰে৷}one{এই এপ্লিকেশ্বনসমূহে Chromeক সঠিকভাৱে কাম কৰাৰ পৰা বাধা প্ৰদান কৰিব পাৰে৷}other{এই এপ্লিকেশ্বনসমূহে Chromeক সঠিকভাৱে কাম কৰাৰ পৰা বাধা প্ৰদান কৰিব পাৰে৷}}</translation>
 <translation id="7303281435234579599">ওঁহ! ডেম’ ম’ড ছেট কৰোঁতে কিবা এটা ভুল হৈছে।</translation>
 <translation id="7303900363563182677">ক্লিপব’ৰ্ডলৈ প্ৰতিলিপি হোৱা পাঠ আৰু প্ৰতিচ্ছবিসমূহ চাব নোৱাৰাকৈ এই ছাইটটোক অৱৰোধ কৰা হৈছে</translation>
@@ -5820,6 +5844,7 @@
 <translation id="740810853557944681">এটা প্ৰিণ্ট ছার্ভাৰ যোগ দিয়ক</translation>
 <translation id="7409549334477097887">অতিৰিক্তভাৱে ডাঙৰ</translation>
 <translation id="7409735910987429903">আপুনি যিবোৰ ৱেবছাইট হয়তো চাবলৈ নিবিচাৰে, ছাইটসমূহে সেইবোৰ ৱেবছাইটলৈ আপোনাক নিবলৈ বিজ্ঞাপন দেখুওৱাৰ বাবে পপ-আপ পঠিয়াব আৰু ৰিডাইৰেক্টসমূহ ব্যৱহাৰ কৰিব পাৰে</translation>
+<translation id="7409854300652085600">বুকমাৰ্কসমূহ আমদানি কৰা হ’ল।</translation>
 <translation id="7410344089573941623"><ph name="HOST" />এ আপোনাৰ কেমেৰা আৰু মাইক্ৰ’ফ’ন ব্যৱহাৰ কৰিব বিচাৰিলে সোধক</translation>
 <translation id="741204030948306876">হয়, মই সন্মত</translation>
 <translation id="7412226954991670867">GPU মেম’ৰী</translation>
@@ -5954,6 +5979,8 @@
 <translation id="7551643184018910560">শ্বেল্‌ফত পিন কৰক</translation>
 <translation id="7553012839257224005">Linux কণ্টেইনাৰটো পৰীক্ষা কৰি থকা হৈছে</translation>
 <translation id="7553242001898162573">আপোনাৰ পাছৱৰ্ড দিয়ক</translation>
+<translation id="7553347517399115470">এই এপ্‌টোত এইসমূহ ফৰ্মেটৰ ফাইল খোলোঁতে পুনৰ নুসুধিব:
+<ph name="FILE_FORMATS" /></translation>
 <translation id="755472745191515939">আপোনাৰ প্ৰশাসকে এই ভাষাটোৰ অনুমতি নিদিয়ে</translation>
 <translation id="7554791636758816595">নতুন টেব</translation>
 <translation id="7556033326131260574">স্মার্ট লকে আপোনাৰ একাউণ্টটো সত্যাপন কৰিব নোৱাৰিলে। লক খুলিবলৈ আপোনাৰ পাছৱর্ডটো টাইপ কৰক।</translation>
@@ -6565,6 +6592,7 @@
 <translation id="8162307956032783161">ছুইচ্ছ আৱণ্টন কৰক: পৰৱৰ্তী</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{টেবটো নতুন ৱিণ্ড’লৈ স্থানান্তৰ কৰক}one{টেবসমূহ নতুন ৱিণ্ড’লৈ স্থানান্তৰ কৰক}other{টেবসমূহ নতুন ৱিণ্ড’লৈ স্থানান্তৰ কৰক}}</translation>
 <translation id="8165997195302308593">Crostiniৰ প’ৰ্ট ফৰৱাৰ্ডিং</translation>
+<translation id="8166081708154635403">ফাইল খুলিব নেকি?</translation>
 <translation id="816704878106051517">{COUNT,plural, =1{এটা ফ’ন নম্বৰ}one{# টা ফ’ন নম্বৰ}other{# টা ফ’ন নম্বৰ}}</translation>
 <translation id="8168435359814927499">সমল</translation>
 <translation id="8169165065843881617">{NUM_TABS,plural, =1{পঢ়াৰ সূচীত টেব যোগ দিয়ক}one{পঢ়াৰ সূচীত টেব যোগ দিয়ক}other{পঢ়াৰ সূচীত টেব যোগ দিয়ক}}</translation>
@@ -6734,6 +6762,7 @@
 <translation id="835238322900896202">আনইনষ্টল কৰাৰ সময়ত কোনো আসোঁৱাহ হৈছে। অনুগ্ৰহ কৰি, টাৰ্মিনেলৰ জৰিয়তে আনইনষ্টল কৰক।</translation>
 <translation id="8352772353338965963">একাধিক ছাইন-ইন কৰিবলৈ এটা একাউণ্ট যোগ কৰক। ছাইন ইন কৰি থোৱা সকলো একাউণ্ট পাছৱৰ্ড অবিহনেই এক্সেছ কৰিব পাৰি, সেয়েহে এই সুবিধাটো কেৱল বিশ্বাসযোগ্য একাউণ্টৰ সৈতেহে ব্যৱহাৰ কৰা উচিত।</translation>
 <translation id="8353683614194668312">ই এই কার্য কৰিব পাৰে:</translation>
+<translation id="8354034204605718473">আপোনাৰ শিশুৰ পিন যোগ দিয়া হৈছে</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8357388086258943206">Linux ইনষ্টল কৰোঁতে আসোঁৱাহ হৈছে</translation>
 <translation id="8358685469073206162">পৃষ্ঠাবোৰ পুনঃস্থাপন কৰিবনে?</translation>
@@ -6966,6 +6995,7 @@
 <translation id="8645920082661222035">বিপজ্জনক ঘটনাবোৰৰ সম্পর্কে অনুমান কৰে আৰু সেইবোৰ ঘটাৰ পূর্বে আপোনাক সকীয়নি দিয়ে</translation>
 <translation id="8646209145740351125">ছিংক অক্ষম কৰক</translation>
 <translation id="864637694230589560">ছাইটসমূহে সাধাৰণতে আপোনাক শেহতীয়া প্ৰধান বাতৰি আৰু চাট বাৰ্তাৰ বিষয়ে জনাবলৈ জাননী পঠিয়ায়</translation>
+<translation id="8647385344110255847">আপোনাৰ অনুমতি সাপেক্ষে আপোনাৰ শিশুৱে এপ্‌ ইনষ্টল কৰিবলৈ Google Play ব্যৱহাৰ কৰিব পাৰে</translation>
 <translation id="8647834505253004544">ৱেব ঠিকনাটো মান্য নহয়</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> বা <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">ৰাতিৰ লাইটৰ ৰঙৰ তাপমাত্ৰা</translation>
@@ -7110,6 +7140,7 @@
 <translation id="8783834180813871000">ব্লুটুথ পেয়াৰিং ক’ডটো টাইপ কৰক আৰু তাৰ পাছত ৰিটাৰ্ন অথবা এণ্টাৰ হেঁচক।</translation>
 <translation id="8784626084144195648">বিন কৰা গড়</translation>
 <translation id="8785622406424941542">ষ্টাইলাছ</translation>
+<translation id="8786824282808281903">আপোনাৰ শিশুৱে এই চিহ্নটো দেখিলে চিনাক্তকৰণৰ বাবে অথবা ক্ৰয়ৰ অনুমোদন জনাবলৈ ফিংগাৰপ্ৰিণ্ট ব্যৱহাৰ কৰিব পাৰি।</translation>
 <translation id="8787575090331305835">{NUM_TABS,plural, =1{নামবিহীন গোট - ১ টা টেব}one{নামবিহীন গোট - # টা টেব}other{নামবিহীন গোট - # টা টেব}}</translation>
 <translation id="8791534160414513928">আপোনাৰ ব্ৰাউজিং ট্ৰেফিকৰ জৰিয়তে "ট্ৰেক নকৰিব" বুলি অনুৰোধ পঠিয়াওক</translation>
 <translation id="8792626944327216835">মাইক্ৰ'ফ'ন</translation>
@@ -7355,6 +7386,7 @@
 <translation id="9031811691986152304">পুনৰ চেষ্টা কৰক</translation>
 <translation id="9033765790910064284">যি হ’লেও অব্যাহত ৰাখক</translation>
 <translation id="9033857511263905942">&amp;পেষ্ট কৰক</translation>
+<translation id="903480517321259405">পিনটো পুনৰ টাইপ কৰক</translation>
 <translation id="9037640663275993951">ডিভাইচটোৰ অনুমতি নাই</translation>
 <translation id="9037818663270399707">সকলো নেটৱৰ্কৰ ট্ৰেফিকৰ বাবে আপোনাৰ সংযোগটো ব্যক্তিগত নহয়</translation>
 <translation id="9037965129289936994">প্ৰকৃত সমল দেখুৱাওক</translation>
@@ -7382,6 +7414,10 @@
 আপুনি এই কাৰ্যটোৰ বাবে একাধিক ছুইচ আবণ্টন কৰিব পাৰে</translation>
 <translation id="9064275926664971810">এবাৰ ক্লিক কৰিয়েই ফর্মবোৰ পূৰাবলৈ স্বয়ংক্রিয়ভাৱে পূৰ কৰা সুবিধাটো সক্ষম কৰক</translation>
 <translation id="9065203028668620118">সম্পাদনা কৰক</translation>
+<translation id="9066394310994446814">Googleৰ সেৱা ব্যৱহাৰ কৰি আপুনি পূৰ্বতে কৰা কাৰ্যকলাপৰ ওপৰত ভিত্তি কৰি এই বস্তুটো দেখা পাইছে। আপুনি <ph name="BEGIN_LINK1" />myactivity.google.com<ph name="END_LINK1" />ত আপোনাৰ ডেটা চাব পাৰে, সেয়া মচিব পাৰে আৰু আপোনাৰ একাউণ্টৰ ছেটিং সলনি কৰিব পাৰে।
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        Googleএ সংগ্ৰহ কৰা ডেটা আৰু সেয়া কিয় সংগ্ৰহ কৰা হয় সেই বিষয়ে <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />ত জানক।</translation>
 <translation id="9066782832737749352">পাঠৰ পৰা কথন</translation>
 <translation id="9068878141610261315">অসমৰ্থিত ফাইলৰ প্ৰকাৰ</translation>
 <translation id="9070342919388027491">টেবটো বাওঁফালে নিয়া হ'ল</translation>
@@ -7490,6 +7526,7 @@
 <translation id="917510707618656279">কোনো ছাইটে ব্লুটুথ ডিভাইচসমূহ এক্সেছ কৰিবলৈ বিচাৰিলে সোধক</translation>
 <translation id="9176476835295860688">ব্যৱহাৰ আৰু ডায়গন’ষ্টিক ডেটা পঠিয়াওক। ডিভাইচটোৱে বর্তমান স্বয়ংক্ৰিয়ভাৱে Googleলৈ ডায়েগন’ষ্টিক, ডিভাইচ আৰু এপ্‌ ব্যৱহাৰৰ ডেটা পঠিয়াই আছে। এইটোৱে ছিষ্টেম তথা এপৰ স্থিৰতা বৃদ্ধি কৰাত আৰু অন্য উন্নয়নত সহায় কৰিব। কিছুমান একত্ৰিত তথ্যই Google এপ্‌ আৰু Android বিকাশকৰ্তাৰ দৰে অংশীদাৰকো সহায় কৰিব। এই <ph name="BEGIN_LINK1" />ছেটিং<ph name="END_LINK1" />টো গৰাকীয়ে বলপূৰ্বকভাৱে সন্নিবিষ্ট কৰিছে। যদি আপোনাৰ অতিৰিক্ত ৱেব আৰু এপ্‌ কাৰ্যকলাপ ছেটিংটো সক্ষম কৰা থাকে, তেন্তে এই ডেটা আপোনাৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে। <ph name="BEGIN_LINK2" />অধিক জানক<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - ব্লুটুথ ডিভাইচ সংযোগ কৰা হ'ল</translation>
+<translation id="9176817945195089764"><ph name="DOMAIN" /> মান্য প্ৰতিষ্ঠান নহয়। আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক। আপুনি যদি প্ৰশাসক, আপুনি ইয়ালৈ গৈ নিজৰ প্ৰতিষ্ঠান ছেট আপ কৰিব পাৰে: g.co/ChromeEnterpriseAccount</translation>
 <translation id="9179524979050048593">ছাইন-ইন স্ক্ৰীনৰ ব্যৱহাৰকাৰীৰ নাম</translation>
 <translation id="9180281769944411366">এই প্ৰক্ৰিয়াৰ বাবে কেইমিনিটমান সময় লাগিব পাৰে। Linux কণ্টেনাৰ আৰম্ভ কৰি থকা হৈছে।</translation>
 <translation id="9180380851667544951">আপোনাৰ স্ক্ৰীণ শ্বেয়াৰ কৰিব পৰা ছাইট</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 445ff91..1e3e726 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -2953,6 +2953,7 @@
 <translation id="4136203100490971508">Начная падсветка выключыцца аўтаматычна пасля ўзыходу сонца</translation>
 <translation id="41365691917097717">Калі працягнуць, будзе ўключана адладка ADB для стварэння і тэсціравання праграм для Android. Звярніце ўвагу, што, уключыўшы ADB, вы дазваляеце ўсталёўваць праграмы для Android, якія не былі спраўджаны Google, а для выключэння ADB патрабуецца скід налад да заводскіх значэнняў.</translation>
 <translation id="4138267921960073861">Паказваць фота і імёны карыстальнікаў на экране ўваходу</translation>
+<translation id="4138598238327913711">Пакуль што праверка граматыкі даступная толькі для англійскай мовы</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – падключана прылада HID</translation>
 <translation id="4142052906269098341">Ажыццяўляйце разблакіроўку прылады <ph name="DEVICE_TYPE" /> з дапамогай тэлефона. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Захаванне ў профіль выяўленых прынтараў або дадаванне новага прынтара. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 5624b47..2b5699e 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -220,6 +220,7 @@
 <translation id="1232569758102978740">Untitled</translation>
 <translation id="1233497634904001272">Touch your security key again to complete the request.</translation>
 <translation id="1233721473400465416">Locale</translation>
+<translation id="1234736487471201993">Create QR code for this image</translation>
 <translation id="1234808891666923653">Service Workers</translation>
 <translation id="1235458158152011030">Known networks</translation>
 <translation id="123578888592755962">Disk full</translation>
@@ -262,6 +263,7 @@
 <translation id="1278859221870828664">Review Google Play apps and services</translation>
 <translation id="127946606521051357">Device nearby is sharing</translation>
 <translation id="1280965841156951489">Edit files</translation>
+<translation id="1282465000333679776">Share system audio</translation>
 <translation id="1285320974508926690">Never translate this site</translation>
 <translation id="1285484354230578868">Store data in your Google Drive account</translation>
 <translation id="1285625592773741684">Current data usage setting is mobile data</translation>
@@ -627,6 +629,7 @@
 <translation id="1660763353352708040">Power adaptor issue</translation>
 <translation id="1661156625580498328">Enforce AES encryption (recommended).</translation>
 <translation id="16620462294541761">Sorry, your password could not be verified. Please try again.</translation>
+<translation id="1662777896967868795">On – will turn off automatically at sunrise</translation>
 <translation id="166278006618318542">Subject Public Key Algorithm</translation>
 <translation id="1666232093776384142">Disable data access protection for peripherals</translation>
 <translation id="1668435968811469751">Enrol manually</translation>
@@ -754,6 +757,7 @@
 <translation id="1781398670452016618"><ph name="DOMAIN" /> requires you to connect to Wi-Fi now and download an update.</translation>
 <translation id="1781502536226964113">Open the New Tab page</translation>
 <translation id="1781771911845953849">Accounts and sync</translation>
+<translation id="1781979858217752599">Share window audio</translation>
 <translation id="1782101999402987960">Updates are blocked by your administrator</translation>
 <translation id="1782196717298160133">Finding your phone</translation>
 <translation id="1784707308176068866">Run in the background when requested by a cooperating native application</translation>
@@ -1143,6 +1147,7 @@
 <translation id="2187895286714876935">Server Certificate Import Error</translation>
 <translation id="2187906491731510095">Extensions updated</translation>
 <translation id="2188881192257509750">Open <ph name="APPLICATION" /></translation>
+<translation id="2189787291884708275">Share tab audio</translation>
 <translation id="2190069059097339078">Wi-Fi Credentials Getter</translation>
 <translation id="219008588003277019">Native Client module: <ph name="NEXE_NAME" /></translation>
 <translation id="2190355936436201913">(empty)</translation>
@@ -1605,6 +1610,9 @@
 <translation id="2691385045260836588">Model</translation>
 <translation id="2691440343905273290">Change input settings</translation>
 <translation id="2693176596243495071">Oops!  An unknown error occurred. Please try again later or contact your administrator if the issue persists.</translation>
+<translation id="2693640212062142966">Voice Match helps your Google Assistant identify your voice on your <ph name="DEVICE_TYPE" /> and tell you apart from others. To save battery, 'Hey Google' is only on when your device is connected to a power source. To make changes, go to Settings.
+    <ph name="BR" />
+    <ph name="BEGIN_BOLD" />Remember:<ph name="END_BOLD" /> A similar voice or recording might be able to access your personal results, too. You can remove Voice Match permission later by turning it off in Assistant settings.</translation>
 <translation id="2699911226086014512">PIN operation failed with code <ph name="RETRIES" />.</translation>
 <translation id="2701330563083355633">Shared from <ph name="DEVICE_NAME" /></translation>
 <translation id="2701737434167469065">Sign in, <ph name="EMAIL" /></translation>
@@ -2114,6 +2122,7 @@
 <translation id="3246107497225150582">{0,plural, =1{Update device within a day}other{Update device within # days}}</translation>
 <translation id="324849028894344899"><ph name="WINDOW_TITLE" /> – Network error</translation>
 <translation id="3248902735035392926">Safety matters. Take a moment and <ph name="BEGIN_LINK" />check your extensions now<ph name="END_LINK" /></translation>
+<translation id="3251714896659475029">Let <ph name="SUPERVISED_USER_NAME" /> access Google Assistant with 'Hey Google'</translation>
 <translation id="3251759466064201842">&lt;Not part of certificate&gt;</translation>
 <translation id="325238099842880997">Set digital ground rules to help children play, explore and do schoolwork at home</translation>
 <translation id="3253448572569133955">Unknown account</translation>
@@ -2531,6 +2540,7 @@
 <translation id="3694027410380121301">Select previous tab</translation>
 <translation id="369489984217678710">Passwords and other sign-in data</translation>
 <translation id="369522892592566391">{NUM_FILES,plural, =0{Security checks are complete. Your data will be uploaded.}=1{Security checks are complete. Your file will be uploaded.}other{Security checks are complete. Your files will be uploaded.}}</translation>
+<translation id="3696576298374669274">Show service logs</translation>
 <translation id="3699624789011381381">Email address</translation>
 <translation id="3699920817649120894">Turn off sync and personalisation?</translation>
 <translation id="3700888195348409686">Presenting (<ph name="PAGE_ORIGIN" />)</translation>
@@ -2590,6 +2600,7 @@
 <translation id="3755411799582650620">Your <ph name="PHONE_NAME" /> can now unlock this <ph name="DEVICE_TYPE" /> too.</translation>
 <translation id="375636864092143889">Site is using your microphone</translation>
 <translation id="3756578970075173856">Set PIN</translation>
+<translation id="3756795331760037744">Allow Google Assistant to use info on <ph name="SUPERVISED_USER_NAME" />’s screen to help</translation>
 <translation id="3757733214359997190">No sites found</translation>
 <translation id="375841316537350618">Downloading proxy script...</translation>
 <translation id="3758842566811519622">Cookies set</translation>
@@ -2981,6 +2992,7 @@
 <translation id="4154664944169082762">Fingerprints</translation>
 <translation id="4157869833395312646">Microsoft Server Gated Cryptography</translation>
 <translation id="4158364720893025815">Pass</translation>
+<translation id="4159163871835771155">To get tailored responses when <ph name="SUPERVISED_USER_NAME" /> asks questions, let Assistant use info on <ph name="SUPERVISED_USER_NAME" />’s screen. This may include info about songs or videos that are playing.</translation>
 <translation id="4159681666905192102">This is an account for kids managed by <ph name="CUSTODIAN_EMAIL" /> and <ph name="SECOND_CUSTODIAN_EMAIL" />.</translation>
 <translation id="4163560723127662357">Unknown keyboard</translation>
 <translation id="4167686856635546851">Sites usually use Javascript to display interactive features, like video games or web forms</translation>
@@ -3466,6 +3478,7 @@
 <translation id="4699172675775169585">Cached images and files</translation>
 <translation id="4699357559218762027">(auto-launched)</translation>
 <translation id="4701025263201366865">Parent sign-in</translation>
+<translation id="4707582759326616943">Drag to search images with Google Lens</translation>
 <translation id="4708794300267213770">Show lock screen when waking from sleep</translation>
 <translation id="4708849949179781599">Quit <ph name="PRODUCT_NAME" /></translation>
 <translation id="4711638718396952945">Restore settings</translation>
@@ -3492,6 +3505,7 @@
 <translation id="4742970037960872810">Remove highlight</translation>
 <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Find out how to update applications<ph name="END_LINK" /></translation>
 <translation id="4744981231093950366">{NUM_TABS,plural, =1{Unmute site}other{Unmute sites}}</translation>
+<translation id="474609389162964566">Access your Assistant with 'Hey Google'</translation>
 <translation id="4746351372139058112">Messages</translation>
 <translation id="4748783296226936791">Sites usually connect to HID devices for features that use uncommon keyboards, game controllers and other devices</translation>
 <translation id="4750394297954878236">Suggestions</translation>
@@ -3552,6 +3566,7 @@
 <translation id="4824958205181053313">Cancel sync?</translation>
 <translation id="4827675678516992122">Couldn't connect</translation>
 <translation id="4827784381479890589">Enhanced spell check in Chrome browser (text is sent to Google for spelling suggestions)</translation>
+<translation id="4827904420700932487">Create QR code for this Image</translation>
 <translation id="482952334869563894">USB devices from vendor <ph name="VENDOR_ID" /></translation>
 <translation id="4829768588131278040">Set up PIN</translation>
 <translation id="4830121310592638841">Ask when a site wants to open and place windows on your screens</translation>
@@ -3589,6 +3604,7 @@
 <translation id="4864369630010738180">Signing in...</translation>
 <translation id="4864805589453749318">Select the parent who is granting permission to add a school account.</translation>
 <translation id="486635084936119914">Open certain file types automatically after downloading</translation>
+<translation id="4868281708609571334">Teach Google Assistant to recognise <ph name="SUPERVISED_USER_NAME" />’s voice</translation>
 <translation id="48704129375571883">Add additional features</translation>
 <translation id="4870758487381879312">Enter admin-provided password to get configuration info</translation>
 <translation id="4870903493621965035">No paired devices</translation>
@@ -3741,6 +3757,7 @@
 <translation id="5029568752722684782">Clear copy</translation>
 <translation id="5029873138381728058">Failed to check VMs</translation>
 <translation id="503155457707535043">Apps downloading</translation>
+<translation id="5032430150487044192">Can't create QR code</translation>
 <translation id="5033137252639132982">Not allowed to use motion sensors</translation>
 <translation id="5033266061063942743">Geometric shapes</translation>
 <translation id="5036662165765606524">Do not allow any site to download multiple files automatically</translation>
@@ -3898,6 +3915,7 @@
 <translation id="520621735928254154">Certificate import error</translation>
 <translation id="5206787458656075734">{COUNT,plural, =1{Successfully changed the compromised password. You have # more compromised password. Chrome recommends checking this password now.}other{Successfully changed the compromised password. You have # more compromised passwords. Chrome recommends checking these passwords now.}}</translation>
 <translation id="5207949376430453814">Highlight text caret</translation>
+<translation id="5208548918290612795">Storing <ph name="WEB_DRIVE" /> authentication token</translation>
 <translation id="520902706163766447">Enable a pop-up bubble in Top Chrome UI to search over currently open tabs.</translation>
 <translation id="5209320130288484488">No devices found</translation>
 <translation id="5210365745912300556">Close tab</translation>
@@ -4160,6 +4178,7 @@
 <translation id="5499313591153584299">This file may be harmful for your computer.</translation>
 <translation id="5499453227627332024">An upgrade is available for your Linux container. You can also upgrade later from the Settings app.</translation>
 <translation id="549957179819296104">New icon</translation>
+<translation id="5500168250243071806"><ph name="BEGIN_LINK_SEARCH" />Search history<ph name="END_LINK_SEARCH" /> and <ph name="BEGIN_LINK_GOOGLE" />other forms of activity<ph name="END_LINK_GOOGLE" /> may be saved in your Google Account when you're signed in. You can delete them at any time.</translation>
 <translation id="5500709606820808700">Safety check ran today</translation>
 <translation id="5501322521654567960">Left-aligned side panel</translation>
 <translation id="5501809658163361512">{COUNT,plural, =1{Failed to receive <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}other{Failed to receive <ph name="ATTACHMENTS" /> from <ph name="DEVICE_NAME" />}}</translation>
@@ -4246,6 +4265,7 @@
 <translation id="5585912436068747822">Formatting failed</translation>
 <translation id="5588033542900357244">(<ph name="RATING_COUNT" />)</translation>
 <translation id="558918721941304263">Loading apps...</translation>
+<translation id="5590265327628802792">It looks like <ph name="SUPERVISED_USER_NAME" /> has already set up Google Assistant on another device. <ph name="SUPERVISED_USER_NAME" /> can get even more out of Assistant by turning on 'Screen context'.</translation>
 <translation id="5592595402373377407">Not enough data available yet.</translation>
 <translation id="5595485650161345191">Edit address</translation>
 <translation id="5596627076506792578">More options</translation>
@@ -4326,6 +4346,7 @@
 <translation id="5684661240348539843">Asset Identifier</translation>
 <translation id="5687326903064479980">Time Zone</translation>
 <translation id="5689516760719285838">Location</translation>
+<translation id="5689531695336322499">It looks like <ph name="SUPERVISED_USER_NAME" /> already set up Voice Match with Assistant on another device. These previous recordings were used to make a voice model on this device.</translation>
 <translation id="56907980372820799">Link data</translation>
 <translation id="5691581861107245578">Get emoji suggestions based on what you're typing</translation>
 <translation id="5691772641933328258">Fingerprint not recognised</translation>
@@ -4348,6 +4369,7 @@
 <translation id="5707185214361380026">Failed to load extension from:</translation>
 <translation id="5708171344853220004">Microsoft Principal Name</translation>
 <translation id="5709557627224531708">Set Chrome as your default browser</translation>
+<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="5715711091495208045">Plug-in Broker: <ph name="PLUGIN_NAME" /></translation>
@@ -4767,6 +4789,7 @@
 <translation id="6195693561221576702">This device cannot be set up in offline demo mode.</translation>
 <translation id="6196640612572343990">Block third-party cookies</translation>
 <translation id="6196854373336333322">The extension "<ph name="EXTENSION_NAME" />" has taken control of your proxy settings, which means it can change, break or eavesdrop on anything you do online. If you aren't sure why this change happened, you probably don't want it.</translation>
+<translation id="6197128521826316819">Create QR code for this page</translation>
 <translation id="6198102561359457428">Sign out then sign in again...</translation>
 <translation id="6198252989419008588">Change PIN</translation>
 <translation id="6200047250927636406">Discard file</translation>
@@ -4801,6 +4824,7 @@
 <translation id="6233455992368963267"><ph name="LANGUAGE" /> speech is sent to Google for processing.</translation>
 <translation id="6234108445915742946">Chrome's Terms of Service are changing on 31 March</translation>
 <translation id="6234474535228214774">Install pending</translation>
+<translation id="6235208551686043831">Device camera has turned on. Please place your eSIM QR code in front of the camera.</translation>
 <translation id="6237474966939441970">Stylus note-taking app</translation>
 <translation id="6237816943013845465">Allows you to adjust your screen resolution</translation>
 <translation id="6238624845858322552">Connect to Bluetooth device</translation>
@@ -4868,6 +4892,9 @@
 <translation id="6294759976468837022">Auto-scan speed</translation>
 <translation id="6295158916970320988">All sites</translation>
 <translation id="6295855836753816081">Saving...</translation>
+<translation id="6298800237463568825">Voice Match helps your Google Assistant identify your voice on your <ph name="DEVICE_TYPE" /> and tell you apart from others.
+    <ph name="BR" />
+    <ph name="BEGIN_BOLD" />Remember:<ph name="END_BOLD" /> A similar voice or recording might be able to access your personal results, too. You can remove Voice Match permission later by turning it off in Assistant settings.</translation>
 <translation id="6298962879096096191">Use Google Play to install Android apps</translation>
 <translation id="6300177430812514606">Not allowed to finish sending or receiving data</translation>
 <translation id="630065524203833229">E&amp;xit</translation>
@@ -5081,6 +5108,7 @@
 <translation id="6532663472409656417">Enterprise enrolled</translation>
 <translation id="6535331821390304775">Always allow <ph name="ORIGIN" /> to open links of this type in the associated app</translation>
 <translation id="653659894138286600">Scan documents and images</translation>
+<translation id="6537016096312202316">Drag over images to search with Google Lens</translation>
 <translation id="6537613839935722475">The name can use letters, numbers and hyphens (-)</translation>
 <translation id="6537880577641744343">Commander</translation>
 <translation id="6538098297809675636">Error detecting code</translation>
@@ -5214,6 +5242,9 @@
 <translation id="6686665106869989887">Tab moved right</translation>
 <translation id="6686817083349815241">Save your password</translation>
 <translation id="6687079240787935001">Hide <ph name="MODULE_TITLE" /></translation>
+<translation id="6689714331348768690">Ask <ph name="SUPERVISED_USER_NAME" /> to come to the computer. Your child will be reading a few phrases on this screen to create their voice model.
+    <ph name="BR" />
+    If <ph name="SUPERVISED_USER_NAME" /> needs help with reading, have your child repeat after you. Whisper away from the mic so that the Assistant learns your child’s voice instead of yours.</translation>
 <translation id="6690659332373509948">Unable to parse file: <ph name="FILE_NAME" /></translation>
 <translation id="6691331417640343772">Manage synced data on Google Dashboard</translation>
 <translation id="6691541770654083180">Earth</translation>
@@ -5262,6 +5293,7 @@
 <translation id="6745592621698551453">Update now</translation>
 <translation id="6746124502594467657">Move down</translation>
 <translation id="674632704103926902">Enable tap dragging</translation>
+<translation id="6748054820659621153">Search your screen with Google Lens</translation>
 <translation id="6748465660675848252">You may proceed, but only your synced data and settings will be restored. All local data will be lost.</translation>
 <translation id="6749006854028927059">Sites can't use your cookies to see your browsing activity across different sites, for example, to personalise ads. Features on some sites may break.</translation>
 <translation id="6750757184909117990">Disable mobile</translation>
@@ -5626,6 +5658,7 @@
 <translation id="7136639886842764730"><ph name="DOMAIN" /> requires you to update your <ph name="DEVICE_TYPE" /> immediately.</translation>
 <translation id="7136694880210472378">Make default</translation>
 <translation id="7136993520339022828">There's an error. Please try again by choosing other images.</translation>
+<translation id="7138515695467025690">Off – will turn on automatically at sunset</translation>
 <translation id="7138678301420049075">Other</translation>
 <translation id="7139627972753429585"><ph name="APP_NAME" /> is using your microphone</translation>
 <translation id="7141105143012495934">Sign-in failed because your account details could not be retrieved. Please contact your administrator or try again.</translation>
@@ -5676,6 +5709,13 @@
 <translation id="720715819012336933">{NUM_PAGES,plural, =1{Exit page}other{Exit pages}}</translation>
 <translation id="7207457272187520234">Send usage and diagnostic data. This device is currently automatically sending diagnostic, device and app usage data to Google. This will help system and app stability and other improvements. Some aggregate data will also help Google apps and partners, such as Android developers. This setting is enforced by the owner. If your additional Web &amp; App Activity setting is turned on, this data may be saved to your Google Account.</translation>
 <translation id="7207631048330366454">Search apps</translation>
+<translation id="7210488993538120146">Voice Match helps Google Assistant identify <ph name="SUPERVISED_USER_NAME" />’s voice on your <ph name="DEVICE_TYPE" /> and tell it apart from others.
+    <ph name="BR" />
+    The Assistant takes clips of your child’s voice to form a unique voice model, which is only stored on their device(s). Your child’s voice model may be sent temporarily to Google to identify their voice better.
+    <ph name="BR" />
+    If you decide later that Voice Match isn’t right for your child, simply remove it in their Assistant settings. To view or delete the audio clips your child records during Voice Match setup, go to g.co/assistant/match from your child’s account.
+    <ph name="BR" />
+    <ph name="BEGIN_BOLD" />Note:<ph name="END_BOLD" /> A similar voice or recording might be able to access <ph name="SUPERVISED_USER_NAME" />’s personal results. To save battery, 'Hey Google' is only on when this device is connected to a power source.</translation>
 <translation id="7210499381659830293">Extension printers</translation>
 <translation id="7211783048245131419">No switch has been assigned yet</translation>
 <translation id="7212097698621322584">Enter your current PIN to change it. If you don’t know your PIN, you’ll need to reset the security key, then create a new PIN.</translation>
@@ -5923,6 +5963,7 @@
 <translation id="7475671414023905704">Netscape Lost Password URL</translation>
 <translation id="7476454130948140105">Battery too low for update (<ph name="BATTERY_PERCENT" />%)</translation>
 <translation id="7476989672001283112">Automatically blocked <ph name="PERMISSION" /> and <ph name="COUNT" /> more</translation>
+<translation id="7477748600276493962">Create QR code for this page</translation>
 <translation id="7477793887173910789">Control your music, videos and more</translation>
 <translation id="7478485216301680444">Kiosk application could not be installed.</translation>
 <translation id="7478623944308207463">Your apps and settings will sync across all Chrome OS devices where you are signed in with your Google Account. For browser sync options, go to <ph name="LINK_BEGIN" />Chrome settings<ph name="LINK_END" />.</translation>
@@ -6098,6 +6139,7 @@
 <translation id="7652954539215530680">Create a PIN</translation>
 <translation id="7654941827281939388">This account is already being used on this computer.</translation>
 <translation id="7655411746932645568">Sites can ask to connect to serial ports</translation>
+<translation id="7657218410916651670"><ph name="BEGIN_LINK_GOOGLE" />Other forms of activity<ph name="END_LINK_GOOGLE" /> may be saved in your Google Account when you're signed in. You can delete them at any time.</translation>
 <translation id="7658239707568436148">Cancel</translation>
 <translation id="7659154729610375585">Exit Incognito mode anyway?</translation>
 <translation id="7659297516559011665">Passwords on this device only</translation>
@@ -6180,6 +6222,7 @@
 <translation id="7734486794139738745">I only use one switch</translation>
 <translation id="7734541938181328224">Review icon updates</translation>
 <translation id="7737115349420013392">Pairing with "<ph name="DEVICE_NAME" />" ...</translation>
+<translation id="7737846262459425222">You can change this at any time in Settings &gt; Google Assistant &gt; Screen context.</translation>
 <translation id="7737948071472253612">Not allowed to use your camera</translation>
 <translation id="7740996059027112821">Standard</translation>
 <translation id="7741307896921365578">Enables a browser-level side panel for a useful and persistent way to access your reading list and bookmarks.</translation>
@@ -6241,6 +6284,7 @@
 <translation id="7792388396321542707">Stop sharing</translation>
 <translation id="779308894558717334">Light green</translation>
 <translation id="7793098747275782155">Dark blue</translation>
+<translation id="7797246427375693110">On – will turn off automatically at <ph name="TIME" /></translation>
 <translation id="7797571222998226653">Off</translation>
 <translation id="7798844538707273832">Automatically blocked <ph name="PERMISSION" /></translation>
 <translation id="7799299114731150374">Wallpaper set successfully</translation>
@@ -6393,6 +6437,7 @@
 <translation id="7942349550061667556">Red</translation>
 <translation id="7943368935008348579">Download PDFs</translation>
 <translation id="7943837619101191061">Add Location...</translation>
+<translation id="7944772052836377867">Sync needs to verify that it's you</translation>
 <translation id="7945031593909029181">"<ph name="CHROME_EXTENSION_NAME" />" wants to connect</translation>
 <translation id="7946586320617670168">Origin must be secure</translation>
 <translation id="794676567536738329">Confirm Permission</translation>
@@ -6433,12 +6478,14 @@
 <translation id="7980084013673500153">Asset ID: <ph name="ASSET_ID" /></translation>
 <translation id="7981313251711023384">Preload pages for faster browsing and searching</translation>
 <translation id="798145602633458219">Append the suggestion <ph name="SUGGESTION_NAME" /> to search box</translation>
+<translation id="7981662863948574132">Show device EID and QR code pop-up</translation>
 <translation id="7982083145464587921">Please restart your device to fix this error.</translation>
 <translation id="7982789257301363584">Network</translation>
 <translation id="7984068253310542383">Mirror <ph name="DISPLAY_NAME" /></translation>
 <translation id="7986295104073916105">Read and change saved password settings</translation>
 <translation id="7987814697832569482">Always connect through this VPN</translation>
 <translation id="7988355189918024273">Enable accessibility features</translation>
+<translation id="7990394755527173834">To set up an Android phone to be used as a security key with this computer for the first time, open Chrome on your phone and go to Settings &gt; Passwords &gt; Use phone as a security key. Then tap 'Connect new device' and scan this QR code.</translation>
 <translation id="7991296728590311172">Switch Access settings</translation>
 <translation id="7997826902155442747">Process Priority</translation>
 <translation id="7999229196265990314">Created the following files:
@@ -6798,6 +6845,7 @@
 <translation id="8376137163494131156">Tell us what's happening with Google Cast.</translation>
 <translation id="8376384591331888629">Including third-party cookies on this site</translation>
 <translation id="8378714024927312812">Managed by your organisation</translation>
+<translation id="8379156816349755485">Upon signing in, a unique authentication token will be stored and used for all future eligible downloads.</translation>
 <translation id="8379878387931047019">This device doesn't support the type of security key requested by this website</translation>
 <translation id="8379991678458444070">Get back here fast by bookmarking this tab</translation>
 <translation id="8382913212082956454">Copy &amp;email address</translation>
@@ -6969,6 +7017,7 @@
 <translation id="8597845839771543242">Property format:</translation>
 <translation id="8599681327221583254">One or more policies are not configured correctly. Please contact your administrator</translation>
 <translation id="8601206103050338563">TLS WWW Client Authentication</translation>
+<translation id="8601611099293226919">Search your screen with Google Lens</translation>
 <translation id="8602851771975208551">Another program on your computer added an app that may change the way Chrome works.</translation>
 <translation id="8605428685123651449">SQLite memory</translation>
 <translation id="8608618451198398104">Add a Kerberos ticket</translation>
@@ -7074,6 +7123,7 @@
 <translation id="8705331520020532516">Serial Number</translation>
 <translation id="8705580154597116082">Wi-Fi available via phone</translation>
 <translation id="8705629851992224300">Your security key couldn't be read</translation>
+<translation id="8706111173576263877">QR code has been scanned.</translation>
 <translation id="8708000541097332489">Clear on exit</translation>
 <translation id="870805141700401153">Microsoft Individual Code Signing</translation>
 <translation id="8708671767545720562">&amp;More Information</translation>
@@ -7098,6 +7148,7 @@
 <translation id="8725178340343806893">Favourites/bookmarks</translation>
 <translation id="8726206820263995930">Error when fetching policy settings from the server: <ph name="CLIENT_ERROR" />.</translation>
 <translation id="8727154974495727220">When your <ph name="DEVICE_TYPE" /> is set up, press the Assistant button or say "Ok Google" to get help at any time. Go to Assistant settings to make changes.</translation>
+<translation id="8729133765463465108">Use camera to scan QR code</translation>
 <translation id="8730621377337864115">Done</translation>
 <translation id="8731629443331803108"><ph name="SITE_NAME" /> wants to: <ph name="PERMISSION" /></translation>
 <translation id="8731787661154643562">Port number</translation>
@@ -7287,6 +7338,7 @@
 <translation id="8907787635362884532">Publisher: <ph name="APP_ORIGIN" /></translation>
 <translation id="8907906903932240086">Chrome can check your computer for harmful software</translation>
 <translation id="8909298138148012791"><ph name="APP_NAME" /> has been uninstalled</translation>
+<translation id="8909782404367982052">Drag to search images with Google Lens</translation>
 <translation id="8909833622202089127">Site is tracking your location</translation>
 <translation id="8910222113987937043">Changes to your bookmarks, history, passwords and other settings will no longer be synced to your Google Account. However, your existing data will remain stored in your Google Account and can be managed on <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation>
 <translation id="8912362522468806198">Google Account</translation>
@@ -7333,6 +7385,7 @@
 <translation id="8962083179518285172">Hide Details</translation>
 <translation id="8962918469425892674">This site is using motion or light sensors.</translation>
 <translation id="8965037249707889821">Enter old password</translation>
+<translation id="89667524227025535">Scan a QR code using your device camera or enter the activation code provided by your operator</translation>
 <translation id="8966809848145604011">Other profiles</translation>
 <translation id="8966870118594285808">Reopen a tab if you accidentally closed it</translation>
 <translation id="8967427617812342790">Add to reading list</translation>
@@ -7425,6 +7478,7 @@
 <translation id="9055636786322918818">Enforce RC4 encryption. Using this option increases your risk, as the RC4 ciphers are insecure.</translation>
 <translation id="9056810968620647706">No matches were found.</translation>
 <translation id="9057354806206861646">Update schedule</translation>
+<translation id="9057599413476594385">Drag over images to search with Google Lens</translation>
 <translation id="9062468308252555888">14x</translation>
 <translation id="9063208415146866933">Error from line <ph name="ERROR_LINE_START" /> to <ph name="ERROR_LINE_END" /></translation>
 <translation id="9063800855227801443">Can't capture confidential content</translation>
@@ -7592,6 +7646,7 @@
 <translation id="936646668635477464">Camera and microphone</translation>
 <translation id="936801553271523408">System diagnostic data</translation>
 <translation id="93766956588638423">Repair extension</translation>
+<translation id="938568644810664664">Try 'Hey Google, what song is this?' or 'Hey Google, what's on my screen?'</translation>
 <translation id="939252827960237676">Failed to save screenshot</translation>
 <translation id="939598580284253335">Enter passphrase</translation>
 <translation id="939736085109172342">New folder</translation>
@@ -7634,6 +7689,7 @@
 <translation id="98515147261107953">Landscape</translation>
 <translation id="987068745968718743">Parallels desktop: <ph name="PLUGIN_VM_NAME" /></translation>
 <translation id="987264212798334818">General</translation>
+<translation id="987363316774788151">Off – will turn on automatically at <ph name="TIME" /></translation>
 <translation id="987897973846887088">No images available</translation>
 <translation id="988320949174893488">Occasional stutter</translation>
 <translation id="988978206646512040">Empty passphrase is not allowed</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 3870f81c..9ef6ee0 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2963,6 +2963,7 @@
 <translation id="4136203100490971508">«نور شب» هنگام طلوع آفتاب به‌طور خودکار خاموش می‌شود</translation>
 <translation id="41365691917097717">‏با ادامه دادن، اشکال‌زدایی ADB (پل اشکال‌زدایی Android) برای ایجاد و آزمایش برنامه‌های Android فعال می‌شود. توجه داشته باشید که این کنش نصب برنامه‌های Android را که Google تأیید نکرده است مجاز می‌کند و برای غیرفعال شدن به بازنشانی کارخانه‌ای نیاز دارد.</translation>
 <translation id="4138267921960073861">نمایش نام‌های کاربری و عکس‌ها در صفحه ورود به سیستم</translation>
+<translation id="4138598238327913711">درحال‌حاضر، بررسی دستور زبان فقط برای زبان انگلیسی دردسترس است</translation>
 <translation id="413915106327509564">‏<ph name="WINDOW_TITLE" /> - متصل به دستگاه HID</translation>
 <translation id="4142052906269098341">قفل <ph name="DEVICE_TYPE" /> را با تلفنتان باز کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">چاپگرهای شناسایی‌شده را در نمایه‌تان ذخیره کنید یا چاپگر جدیدی اضافه کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 970200d..fd85d5e 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -2963,6 +2963,7 @@
 <translation id="4136203100490971508">Az Éjszakai fény automatikusan kikapcsol napkeltekor</translation>
 <translation id="41365691917097717">A folytatással engedélyezi az ADB-hibakeresés számára az Android-alkalmazások létrehozását és tesztelését. Ne feledje, hogy ez a művelet engedélyezi a Google által nem jóváhagyott Android-alkalmazások telepítését, és az eszköz letiltásához szükség van az eszköz gyári beállításainak visszaállítására.</translation>
 <translation id="4138267921960073861">Felhasználónevek és képek megjelenítése a bejelentkezési oldalon</translation>
+<translation id="4138598238327913711">A nyelvhelyesség ellenőrzése jelenleg csak angol nyelven áll rendelkezésre.</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – HID-eszköz csatlakoztatva</translation>
 <translation id="4142052906269098341">Feloldhatja <ph name="DEVICE_TYPE" /> eszközét telefonjával. <ph name="LINK_BEGIN" />További információ.<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Elmentheti az észlelt nyomtatókat a profiljába, vagy hozzáadhat új nyomtatót. <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" />.</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb
index f94e03b8..9731933 100644
--- a/chrome/app/resources/generated_resources_hy.xtb
+++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -2952,6 +2952,7 @@
 <translation id="4136203100490971508">Լույսը բացվելուն պես գիշերային ռեժիմը ավտոմատ կանջատվի</translation>
 <translation id="41365691917097717">Եթե շարունակեք, ADB վրիպազերծումը կմիանա և Android-ի համար հավելվածներ կստեղծվեն ու կփորձարկվեն: Նկատի ունեցեք, որ այս գործողությունը թույլ է տալիս այն Android հավելվածների տեղադրումը, որոնք չեն ստուգվել Google-ի կողմից։ Դրա համար անհրաժեշտ է վերականգնել սարքի գործարանային կարգավորումները։</translation>
 <translation id="4138267921960073861">Մուտքի էկրանին ցույց տալ օգտանունները և լուսանկարները</translation>
+<translation id="4138598238327913711">Քերականության ստուգումը ներկայումս հասանելի է միայն անգլերեն լեզվով</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – միացված է HID սարք</translation>
 <translation id="4142052906269098341">Ապակողպեք <ph name="DEVICE_TYPE" /> սարքը ձեր հեռախոսով։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Պահեք հայտնաբերված տպիչները ձեր պրոֆիլում կամ ավելացրեք նորերը։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index d4a9d97..d3f27a95 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2584,7 +2584,7 @@
 <translation id="3747077776423672805">Untuk menghapus aplikasi, buka Setelan &gt; Google Play Store &gt; Kelola preferensi Android &gt; Aplikasi atau Pengelola aplikasi. Kemudian, ketuk aplikasi yang ingin di-uninstal (Anda mungkin perlu menggeser ke kanan atau ke kiri untuk menemukan aplikasi). Setelah itu, ketuk Uninstal atau Nonaktifkan.</translation>
 <translation id="3747220812138541072">Tampilkan saran penulisan yang muncul sebaris saat Anda mengetik</translation>
 <translation id="3748706263662799310">Laporkan bug</translation>
-<translation id="3752253558646317685">Minta anak Anda mengangkat jari untuk menyimpan sidik jari</translation>
+<translation id="3752253558646317685">Minta anak Anda mengangkat dan menyentuhkan jari secara berulang untuk menyimpan sidik jari</translation>
 <translation id="3752582316358263300">Oke...</translation>
 <translation id="3753033997400164841">Simpan sekali. Gunakan di mana saja</translation>
 <translation id="3755411799582650620"><ph name="PHONE_NAME" /> Anda sekarang dapat membuka kunci <ph name="DEVICE_TYPE" /> ini juga.</translation>
@@ -2966,6 +2966,7 @@
 <translation id="4136203100490971508">Fitur Cahaya Malam akan otomatis dinonaktifkan saat matahari terbit</translation>
 <translation id="41365691917097717">Dengan melanjutkan, proses debug ADB akan diaktifkan untuk membuat dan menguji aplikasi Android. Perhatikan bahwa tindakan ini dapat menginstal aplikasi Android yang belum diverifikasi oleh Google, dan perlu reset ke setelan pabrik untuk menonaktifkannya.</translation>
 <translation id="4138267921960073861">Tampilkan nama pengguna dan foto pada layar masuk</translation>
+<translation id="4138598238327913711">Pemeriksaan tata bahasa saat ini hanya tersedia untuk bahasa Inggris</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - perangkat HID tersambung</translation>
 <translation id="4142052906269098341">Buka kunci <ph name="DEVICE_TYPE" /> Anda dengan ponsel. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Simpan printer yang terdeteksi ke profil Anda, atau tambahkan printer baru. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
@@ -5752,7 +5753,7 @@
 <translation id="7297726121602187087">Hijau tua</translation>
 <translation id="7298195798382681320">Direkomendasikan</translation>
 <translation id="7299337219131431707">Aktifkan penjelajahan Tamu</translation>
-<translation id="7301470816294041580">Anda dapat menanyakan “Ok Google, lagu apa ini?” atau “Ok Google, apa yang ada di layar saya?”</translation>
+<translation id="7301470816294041580">Anda dapat menanyakan “Ok Google, lagu apa ini?” atau “Ok Google, konten apa yang ada di layar saya?”</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Aplikasi ini dapat membuat Chrome tidak berfungsi dengan semestinya.}other{Aplikasi ini dapat membuat Chrome tidak berfungsi dengan semestinya.}}</translation>
 <translation id="7303281435234579599">Maaf, terjadi masalah saat menyiapkan mode demo.</translation>
 <translation id="7303900363563182677">Situs ini telah diblokir dari melihat teks dan gambar yang disalin ke papan klip</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 87322a4..52d2911 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -72,6 +72,7 @@
 <translation id="107278043869924952">יש להשתמש בקוד אימות בנוסף לסיסמה</translation>
 <translation id="1076176485976385390">ניווט בדפים באמצעות סמן הטקסט</translation>
 <translation id="1076698951459398590">הפעלת עיצוב</translation>
+<translation id="1076766328672150609">לילד או לילדה שלך יש אפשרות להשתמש בקוד אימות כדי לבטל את נעילת המכשיר הזה.</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1076882167394279216">לא ניתן היה להוריד מילון בדיקת איות ב<ph name="LANGUAGE" />. יש לנסות שוב.</translation>
 <translation id="1079766198702302550">תמיד לחסום גישה למצלמה</translation>
@@ -260,6 +261,7 @@
 <translation id="1275718070701477396">נבחר</translation>
 <translation id="1276994519141842946">לא ניתן היה להסיר את <ph name="APP_NAME" /></translation>
 <translation id="1277020343994096713">יש ליצור קוד אימות חדש ששונה מקוד האימות הנוכחי</translation>
+<translation id="1278859221870828664">‏בדיקת השירותים והאפליקציות של Google Play</translation>
 <translation id="127946606521051357">מכשיר בקרבת מקום מנסה לבצע שיתוף</translation>
 <translation id="1280965841156951489">אישור לערוך קבצים</translation>
 <translation id="1285320974508926690">איני רוצה לקבל תרגום של אתר זה</translation>
@@ -810,6 +812,7 @@
 <translation id="1834503245783133039">ההורדה נכשלה: <ph name="FILE_NAME" /></translation>
 <translation id="1835261175655098052">‏Linux שודרגה</translation>
 <translation id="1838374766361614909">ניקוי חיפוש</translation>
+<translation id="1839540115464516994">הצגה ב-<ph name="LOCATION" /></translation>
 <translation id="1841545962859478868">ייתכן שמנהל המכשיר עוקב אחרי:</translation>
 <translation id="1841616161104323629">רשומת מכשיר חסרה.</translation>
 <translation id="1841705068325380214"><ph name="EXTENSION_NAME" /> מושבת</translation>
@@ -1104,6 +1107,8 @@
 <translation id="2154710561487035718">העתקת כתובת אתר</translation>
 <translation id="2155772377859296191">‏נראה כמו <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">‏קובץ שירות (service worker): <ph name="SCRIPT_URL" /></translation>
+<translation id="2156557113115192526">לא צריך לשאול שוב בפתיחת פורמט הקובץ הזה באפליקציה הזו:
+<ph name="FILE_FORMAT" /></translation>
 <translation id="2156877321344104010">הפעלה חוזרת של הטיימר לדיווח אוטומטי</translation>
 <translation id="2157474325782140681">‏כדי להשתמש בתכונות נוספות, יש להשתמש בתחנת עגינה של Dell שתוכננה לפעול עם ה-Chromebook הזה.</translation>
 <translation id="215753907730220065">יציאה ממסך מלא</translation>
@@ -1282,6 +1287,7 @@
 <translation id="2336381494582898602">שחזור הגדרות יצרן</translation>
 <translation id="2337236196941929873">‏דפדפן Chrome יטען מראש דפים שסביר שייעשה בהם שימוש. כדי לבצע את הפעולה, דפדפן Chrome עשוי להשתמש בקובצי cookie (אם בחרת לאפשר אותם), ועשוי גם להצפין ולשלוח דפים דרך Google, כך שהזהות שלך תוסתר מפני אתרים.</translation>
 <translation id="2340239562261172947">לא ניתן להוריד את <ph name="FILE_NAME" /> בצורה מאובטחת</translation>
+<translation id="2342180549977909852">לילד או לילדה שלך יש אפשרות להשתמש במספר (קוד אימות) במקום בסיסמה כדי לבטל את נעילת המכשיר הזה. ניתן להגדיר את הקוד מאוחר יותר ב'הגדרות'.</translation>
 <translation id="2342740338116612727">סימניות נוספו</translation>
 <translation id="2343747224442182863">הדגשת הכרטיסייה הזו</translation>
 <translation id="2345723121311404059">עמוד אחד אל <ph name="PRINTER_NAME" /></translation>
@@ -1743,6 +1749,7 @@
 <translation id="2828375943530438449">חזרה מדף הכניסה</translation>
 <translation id="2828650939514476812">‏התחברות אל רשת Wi-Fi</translation>
 <translation id="2831430281393059038">המכשיר נתמך</translation>
+<translation id="2832124733806557606">לילד או לילדה שלך יש אפשרות להשתמש בקוד אימות כדי להיכנס למכשיר הזה או לבטל את הנעילה שלו.</translation>
 <translation id="2835547721736623118">שירות של זיהוי דיבור</translation>
 <translation id="2836269494620652131">קריסה</translation>
 <translation id="2836635946302913370">הכניסה עם שם משתמש זה הושבתה על ידי מנהל המערכת.</translation>
@@ -1758,6 +1765,7 @@
 <translation id="2849035674501872372">יש להרים את המבט</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
 <translation id="284975061945174219">הניקוי נכשל</translation>
+<translation id="2849767214114481738">קוד האימות שלך נוסף</translation>
 <translation id="2849936225196189499">קריטי</translation>
 <translation id="2850541429955027218">הוספת העיצוב</translation>
 <translation id="2851634818064021665">יש צורך בהרשאה כדי להיכנס אל האתר הזה</translation>
@@ -1866,6 +1874,7 @@
 <translation id="2960208947600937804">‏אירעה שגיאה במהלך ההגדרה של Linux. יש לפנות אל מנהל המערכת.</translation>
 <translation id="296026337010986570">‏סיימנו! התוכנות המזיקות הוסרו. כדי להפעיל מחדש את התוספים, צריך לעבור אל &lt;a href="chrome://extensions"&gt;תוספים&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (ניתנה הארכה)</translation>
+<translation id="2961210776189273067">תואר</translation>
 <translation id="2961695502793809356">יש ללחוץ כדי לעבור קדימה, ללחוץ ולהחזיק כדי לראות את ההיסטוריה</translation>
 <translation id="2962131322798295505">Wallpaper Picker</translation>
 <translation id="2963151496262057773">הפלאגין הבא אינו מגיב: <ph name="PLUGIN_NAME" /> האם ברצונך לכבות אותו?</translation>
@@ -2221,6 +2230,7 @@
 <translation id="338323348408199233">‏חסימה של תנועת גולשים ללא VPN</translation>
 <translation id="3385092118218578224">%<ph name="DISPLAY_ZOOM" /></translation>
 <translation id="338583716107319301">מפריד</translation>
+<translation id="3387023983419383865">,</translation>
 <translation id="3387614642886316601">שימוש בבדיקת איות משופרת</translation>
 <translation id="3387829698079331264">אין הרשאה לדעת מתי המכשיר הזה משמש אותך באופן פעיל</translation>
 <translation id="3388094447051599208">מגש הפלט כמעט מלא</translation>
@@ -2574,6 +2584,7 @@
 <translation id="3747077776423672805">‏כדי להסיר אפליקציות, צריך לעבור אל 'הגדרות' &gt; 'חנות Google Play' &gt; 'ניהול העדפות Android' &gt;'אפליקציות' או 'מנהל אפליקציות'. לאחר מכן צריך להקיש על האפליקציה שרוצים להסיר (ייתכן שיהיה צורך להחליק ימינה או שמאלה כדי למצוא את האפליקציה). לסיום, יש להקיש על 'הסרת התקנה' או 'השבתה'.</translation>
 <translation id="3747220812138541072">הצגת הצעות להשלמה אוטומטית בתוך השורה במהלך ההקלדה</translation>
 <translation id="3748706263662799310">דיווח על באג</translation>
+<translation id="3752253558646317685">כדי לשמור את טביעת האצבע, על הילד או הילדה להרים ולהחזיר את האצבע כמה פעמים</translation>
 <translation id="3752582316358263300">אישור...</translation>
 <translation id="3753033997400164841">מאחסנים סיסמה פעם אחת. משתמשים בה בכל מקום.</translation>
 <translation id="3755411799582650620">ה-<ph name="PHONE_NAME" /> יכול כעת לבטל גם את הנעילה של <ph name="DEVICE_TYPE" /> זה.</translation>
@@ -3036,6 +3047,7 @@
 <translation id="425573743389990240">שיעור פריקת סוללה בוואט (המשמעות של ערך שלילי היא שהסוללה בטעינה)</translation>
 <translation id="4256316378292851214">שמי&amp;רת סרטון וידאו כ...</translation>
 <translation id="4258348331913189841">מערכות קבצים</translation>
+<translation id="4258786365875464621">האפליקציה <ph name="APP_ORIGIN" /> מבקשת לפתוח את הקבצים האלה:</translation>
 <translation id="4259388776256904261">הפעולה עשויה להימשך זמן מה</translation>
 <translation id="4260182282978351200">‏הקובץ <ph name="FILE_NAME" /> עלול להיות מסוכן. האם לשלוח אותו לסריקה באמצעות ההגנה המתקדמת של Google? אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation>
 <translation id="4263223596040212967">כדאי לבדוק את פריסת המקלדת ולנסות שוב.</translation>
@@ -3066,6 +3078,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{הצגה}two{הצגת הכול}many{הצגת הכול}other{הצגת הכול}}</translation>
 <translation id="4289372044984810120">כאן אפשר לנהל את החשבונות שלך. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">סקירה כללית</translation>
+<translation id="4289732974614035569">בחירת קוד אימות</translation>
 <translation id="4290791284969893584">לאחר סגירת דף, ייתכן שמשימות שהתחלת לא יסתיימו</translation>
 <translation id="4295072614469448764">האפליקציה זמינה במסוף שלך. בחלק מהמקרים מופיע סמל במרכז האפליקציות.</translation>
 <translation id="4295839147292213505">ניתן לשלוח הודעות טקסט מהמחשב, לשתף את החיבור לאינטרנט, להשיב להתראות על שיחות ולבטל את הנעילה של <ph name="DEVICE_TYPE" /> באמצעות הטלפון.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
@@ -3664,6 +3677,7 @@
 <translation id="4943368462779413526">פוטבול</translation>
 <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" רוצה להתחבר אל יציאה טורית</translation>
 <translation id="4944310289250773232">שירות האימות הזה מתארח בדומיין <ph name="SAML_DOMAIN" /></translation>
+<translation id="4945439665401275950">כדי להגדיר טביעת אצבע, על הילד או הילדה לגעת בלחצן ההפעלה. נתוני טביעות האצבע של הילד או הילדה מאוחסנים באופן מאובטח ואף פעם לא נשלחים מה-<ph name="DEVICE_TYPE" /> הזה.</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{קובץ}two{# קבצים}many{# קבצים}other{# קבצים}}</translation>
 <translation id="495170559598752135">פעולות</translation>
 <translation id="4953808748584563296">דמות ברירת מחדל כתומה</translation>
@@ -4783,6 +4797,7 @@
 <translation id="6232017090690406397">סוללה</translation>
 <translation id="6232116551750539448">החיבור אל <ph name="NAME" /> נותק</translation>
 <translation id="6233154960150021497">שימוש בקול במקום במקלדת כברירת מחדל</translation>
+<translation id="6233455992368963267">‏דיבור ב<ph name="LANGUAGE" /> נשלח אל Google לעיבוד.</translation>
 <translation id="6234108445915742946">‏התנאים וההגבלות של Chrome ישתנו ב-31 במרץ</translation>
 <translation id="6234474535228214774">ההתקנה בהמתנה</translation>
 <translation id="6237474966939441970">אפליקציה לכתיבת הערות בעזרת סטיילוס</translation>
@@ -4876,7 +4891,9 @@
 <translation id="6318125393809743217">‏הכללה של קובץ policies.json עם הגדרות המדיניות.</translation>
 <translation id="6318407754858604988">ההורדה התחילה</translation>
 <translation id="6318944945640833942">לא אותרה מדפסת. יש להזין שוב את כתובת המדפסת.</translation>
+<translation id="6319081871916332821">העיבוד של <ph name="LANGUAGE" /> נעשה באופן מקומי ונשאר בזיכרון המכשיר.</translation>
 <translation id="6321407676395378991">הפעלת שומר מסך</translation>
+<translation id="6322370287306604163">ביטול נעילה מהיר יותר באמצעות טביעת אצבע</translation>
 <translation id="6322653941595359182">‏אפשר לשלוח ולקבל הודעות טקסט דרך ה-Chromebook</translation>
 <translation id="6324916366299863871">עריכת קיצור דרך</translation>
 <translation id="6325191661371220117">השבתת הפעלה אוטומטית</translation>
@@ -5029,6 +5046,7 @@
 <translation id="6497789971060331894">גלילה הפוכה עם העכבר</translation>
 <translation id="6498249116389603658">&amp;כל השפות שלך</translation>
 <translation id="6499143127267478107">‏הבירור של כתובת של שרת מארח בסקריפט של שרת Proxy מתבצע...</translation>
+<translation id="6501086852992132091">האפליקציה <ph name="APP_ORIGIN" /> מבקשת לפתוח את הקובץ הזה:</translation>
 <translation id="650266656685499220">‏כדי ליצור אלבומים, יש לעבור ל-Google Photos</translation>
 <translation id="6503077044568424649">הכי פופולריים</translation>
 <translation id="650457560773015827">הלחצן השמאלי</translation>
@@ -5047,6 +5065,7 @@
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
         <ph name="EVENT_NAME" /></translation>
+<translation id="6519689855001245063">בדיקת זכאות</translation>
 <translation id="6520876759015997832">‏תוצאת חיפוש <ph name="LIST_POSITION" /> מתוך <ph name="LIST_SIZE" />:‏ <ph name="SEARCH_RESULT_TEXT" />. כדי לעבור לקטע הזה, יש להקיש על Enter.</translation>
 <translation id="6521214596282732365">לרוב, אתרים משתמשים בגופנים שלך, כך שניתן ליצור תוכן באיכות גבוהה באמצעות כלי עיצוב וגרפיקה שזמינים אונליין</translation>
 <translation id="652492607360843641">התחברת אל רשת <ph name="NETWORK_TYPE" />.</translation>
@@ -5270,6 +5289,7 @@
 <translation id="6785518634832172390">קוד האימות לא יכול לכלול יותר מ-12 תווים</translation>
 <translation id="6786747875388722282">תוספים</translation>
 <translation id="6787097042755590313">כרטיסייה אחרת</translation>
+<translation id="6787631759192429908">לפתוח את הקבצים?</translation>
 <translation id="6787839852456839824">מקשי קיצור</translation>
 <translation id="6788210894632713004">‏תוסף Unpacked</translation>
 <translation id="6789592661892473991">פיצול אופקי</translation>
@@ -5338,6 +5358,7 @@
 <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" רוצה להדפיס את <ph name="FILE_NAME" /> באמצעות <ph name="PRINTER_NAME" />.</translation>
 <translation id="6847125920277401289">יש לפנות מקום אחסון כדי להמשיך</translation>
 <translation id="6848388270925200958">נכון לעכשיו, יש לך כרטיסים שאפשר להשתמש בהם רק במכשיר הזה.</translation>
+<translation id="6848716236260083778">כדי להגדיר טביעת אצבע, על הילד או הילדה לגעת בחיישן טביעות האצבע. נתוני טביעות האצבע של הילד או הילדה מאוחסנים באופן מאובטח ואף פעם לא נשלחים מה-<ph name="DEVICE_TYPE" /> הזה.</translation>
 <translation id="6850286078059909152">צבע טקסט</translation>
 <translation id="6851181413209322061">‏שליחת מידע לגבי אופן השימוש בנתונים וניתוח הביצועים. המכשיר הזה שולח עכשיו אל Google באופן אוטומטי נתוני אבחון, נתוני מכשיר ונתוני שימוש באפליקציות. נתונים אלה לא ישמשו כדי לזהות את הילד או הילדה שלך, והם יעזרו לנו לשמור על היציבות של המערכת ושל האפליקציות ולבצע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לשפר את האפליקציות של Google וכן יעזרו לשותפים של Google, כמו מפתחים של Android. ההגדרה הזו נאכפת על-ידי הבעלים. אם ההגדרה 'פעילות באתרי אינטרנט ובאפליקציות נוספים' הופעלה עבור הילד או הילדה שלך, ייתכן שהנתונים יישמרו בחשבון Google שלהם.</translation>
 <translation id="6851497530878285708">האפליקציה הופעלה</translation>
@@ -5684,6 +5705,7 @@
 <translation id="7243632151880336635">זה מספיק, ברצוני לצאת</translation>
 <translation id="7243784282103630670">‏קרתה שגיאה בעת השדרוג של Linux. נשחזר את המאגר באמצעות הגיבוי שלך.</translation>
 <translation id="7245628041916450754">‏<ph name="WIDTH" /> ‏x ‏<ph name="HEIGHT" /> (הטובה ביותר)</translation>
+<translation id="7246079707145287765">הצגת הכרטיסייה <ph name="TAB_ORIGIN" /></translation>
 <translation id="7246230585855757313">יש להכניס מחדש את מפתח האבטחה ולנסות שוב</translation>
 <translation id="7249777306773517303">המכשיר הזה מנוהל על ידי <ph name="DOMAIN" />, וכדי להשתמש בו יש להיכנס לחשבון בכל פעם.</translation>
 <translation id="7250616558727237648">המכשיר שעמו מתבצע השיתוף לא הגיב. אפשר לנסות שוב.</translation>
@@ -5730,6 +5752,7 @@
 <translation id="7297726121602187087">ירוק כהה</translation>
 <translation id="7298195798382681320">מומלצים</translation>
 <translation id="7299337219131431707">הפעלה של גלישה כאורח</translation>
+<translation id="7301470816294041580">‏אפשר לשאול "Hey Google, what song is this?‎" או "Hey Google, what's on my screen?‎"</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{‏האפליקציה הזו עלולה למנוע מ-Chrome לפעול כמו שצריך.}two{‏האפליקציות האלה עלולות למנוע מ-Chrome לפעול כמו שצריך.}many{‏האפליקציות האלה עלולות למנוע מ-Chrome לפעול כמו שצריך.}other{‏האפליקציות האלה עלולות למנוע מ-Chrome לפעול כמו שצריך.}}</translation>
 <translation id="7303281435234579599">משהו השתבש במהלך הגדרת מצב ההדגמה.</translation>
 <translation id="7303900363563182677">האתר הזה לא יכול לגשת אל טקסט ותמונות שהועתקו ללוח העריכה</translation>
@@ -5834,6 +5857,7 @@
 <translation id="740810853557944681">הוספה של שרת הדפסה</translation>
 <translation id="7409549334477097887">גדול מאוד</translation>
 <translation id="7409735910987429903">אתרים עשויים להציג חלונות קופצים עם מודעות, או להשתמש בהפניות אוטומטיות כדי להוביל אותך לאתרים שלא כדאי לבקר בהם</translation>
+<translation id="7409854300652085600">הסימניות יובאו.</translation>
 <translation id="7410344089573941623">לבקש ממני רשות אם <ph name="HOST" /> רוצה גישה למצלמה ולמיקרופון</translation>
 <translation id="741204030948306876">כן, אני רוצה</translation>
 <translation id="7412226954991670867">‏זיכרון GPU</translation>
@@ -5969,6 +5993,8 @@
 <translation id="7552846755917812628">אולי הטיפים האלו יעזרו לך:</translation>
 <translation id="7553012839257224005">‏המערכת בודקת את הקונטיינר של Linux</translation>
 <translation id="7553242001898162573">הזנת הסיסמה</translation>
+<translation id="7553347517399115470">לא צריך לשאול שוב בפתיחת קבצים מהפורמטים האלה באפליקציה הזו:
+<ph name="FILE_FORMATS" /></translation>
 <translation id="755472745191515939">השפה הזו לא מאושרת על ידי מנהל המערכת</translation>
 <translation id="7554791636758816595">כרטיסייה חדשה</translation>
 <translation id="7556033326131260574">‏מערכת Smart Lock לא הצליחה לאמת את חשבונך. כדי להיכנס, יש להזין את הסיסמה.</translation>
@@ -6584,6 +6610,7 @@
 <translation id="8162307956032783161">הקצאת מתג: הבא</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{העברת כרטיסייה לחלון חדש}two{העברת כרטיסיות לחלון חדש}many{העברת כרטיסיות לחלון חדש}other{העברת כרטיסיות לחלון חדש}}</translation>
 <translation id="8165997195302308593">‏העברה ליציאה אחרת ב-Crostini</translation>
+<translation id="8166081708154635403">לפתוח את קובץ?</translation>
 <translation id="816704878106051517">{COUNT,plural, =1{מספר טלפון}two{# מספרי טלפון}many{# מספרי טלפון}other{# מספרי טלפון}}</translation>
 <translation id="8168435359814927499">תוכן</translation>
 <translation id="8169165065843881617">{NUM_TABS,plural, =1{הוספת הכרטיסייה לרשימת הקריאה}two{הוספת הכרטיסיות לרשימת הקריאה}many{הוספת הכרטיסיות לרשימת הקריאה}other{הוספת הכרטיסיות לרשימת הקריאה}}</translation>
@@ -6753,6 +6780,7 @@
 <translation id="835238322900896202">אירעה שגיאה במהלך הסרת ההתקנה. יש להסיר את ההתקנה באמצעות המסוף.</translation>
 <translation id="8352772353338965963">יש להוסיף חשבון לכניסה עם מספר חשבונות. כל החשבונות שאליהם נכנסת נגישים ללא סיסמה, לכן יש להשתמש בתכונה זו עם חשבונות אמינים בלבד.</translation>
 <translation id="8353683614194668312">יכול:</translation>
+<translation id="8354034204605718473">קוד האימות של הילד או הילדה נוסף</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8357388086258943206">‏שגיאה בהתקנת Linux</translation>
 <translation id="8358685469073206162">האם לשחזר את הדפים?</translation>
@@ -6986,6 +7014,7 @@
 <translation id="8645920082661222035">המערכת חוזה אירועים מסוכנים ומזהירה אותך לגביהם לפני שהם מתרחשים</translation>
 <translation id="8646209145740351125">השבתת סנכרון</translation>
 <translation id="864637694230589560">בדרך כלל, אתרים שולחים התראות כדי לאפשר לך להתעדכן במבזקי החדשות או לקבל הודעות בצ'אט</translation>
+<translation id="8647385344110255847">‏באישורך, לילד או לילדה תהיה אפשרות להתקין אפליקציות מ-Google Play</translation>
 <translation id="8647834505253004544">כתובת האינטרנט לא חוקית</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> או <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">טמפרטורת הצבע של תאורת לילה</translation>
@@ -7131,6 +7160,7 @@
 <translation id="8783834180813871000">‏עליך להקליד את קוד ההתאמה ל-Bluetooth ולאחר מכן ללחוץ על Return או Enter.</translation>
 <translation id="8784626084144195648">ממוצע צבור</translation>
 <translation id="8785622406424941542">סטיילוס</translation>
+<translation id="8786824282808281903">כשהסמל הזה יוצג לילד או לילדה, ניתן יהיה להשתמש בטביעת אצבע לצורך זיהוי או כדי לאשר רכישות.</translation>
 <translation id="8787575090331305835">{NUM_TABS,plural, =1{קבוצה ללא שם – כרטיסייה אחת}two{קבוצה ללא שם – # כרטיסיות}many{קבוצה ללא שם – # כרטיסיות}other{קבוצה ללא שם – # כרטיסיות}}</translation>
 <translation id="8791534160414513928">‏שליחת בקשת 'לא לעקוב (DNT)' יחד עם תנועת הגלישה שלך</translation>
 <translation id="8792626944327216835">מיקרופון</translation>
@@ -7376,6 +7406,7 @@
 <translation id="9031811691986152304">לנסות שוב</translation>
 <translation id="9033765790910064284">אני רוצה להמשיך בכל זאת</translation>
 <translation id="9033857511263905942">&amp;הדבקה</translation>
+<translation id="903480517321259405">יש להקליד שוב את קוד האימות</translation>
 <translation id="9037640663275993951">המכשיר לא מורשה</translation>
 <translation id="9037818663270399707">החיבור שלך אינו פרטי בכל התנועה ברשת</translation>
 <translation id="9037965129289936994">הצגת מקור</translation>
@@ -7403,6 +7434,10 @@
 ניתן להקצות לה מספר מתגים</translation>
 <translation id="9064275926664971810">הפעלת האפשרות של 'מילוי אוטומטי' למלא טפסים בלחיצה אחת</translation>
 <translation id="9065203028668620118">עריכה</translation>
+<translation id="9066394310994446814">‏הפריט הזה מוצג לך על סמך הפעילות הקודמת שלך בשירותי Google. בכתובת <ph name="BEGIN_LINK1" />myactivity.google.com<ph name="END_LINK1" /> מוצגים הנתונים שלך, ואפשר למחוק אותם או לשנות את ההגדרות.
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        ניתן למצוא מידע על הנתונים שנאספים על ידי Google והסיבות לכך בכתובת <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />.</translation>
 <translation id="9066782832737749352">טקסט לדיבור</translation>
 <translation id="9068878141610261315">סוג הקובץ לא נתמך</translation>
 <translation id="9070342919388027491">הכרטיסייה הועברה ימינה</translation>
@@ -7511,6 +7546,7 @@
 <translation id="917510707618656279">‏צריך לבקש ממני אישור כשאתר רוצה לגשת למכשירי Bluetooth</translation>
 <translation id="9176476835295860688">‏שליחה של נתוני אבחון ונתונים על השימוש. המכשיר הזה שולח עכשיו אל Google באופן אוטומטי נתוני אבחון ונתונים לגבי השימוש במכשיר ובאפליקציות. נתונים אלה יעזרו לשמור על יציבות המערכת והאפליקציות, כמו גם לביצוע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לאפליקציות ולשותפים של Google, כמו מפתחי Android. ה<ph name="BEGIN_LINK1" />הגדרה<ph name="END_LINK1" /> הזו נאכפת על-ידי הבעלים. אם הופעלה האפשרות 'פעילות באתרי אינטרנט ובאפליקציות נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלך. <ph name="BEGIN_LINK2" />מידע נוסף<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349">‏<ph name="WINDOW_TITLE" /> - מכשיר Bluetooth מחובר</translation>
+<translation id="9176817945195089764">‏הארגון <ph name="DOMAIN" /> אינו ארגון תקין. עליך לפנות למנהל המערכת. מנהלי מערכת יכולים להגדיר את הארגון שלהם בכתובת: g.co/ChromeEnterpriseAccount</translation>
 <translation id="9179524979050048593">הצגת שם המשתמש במסך הכניסה</translation>
 <translation id="9180281769944411366">‏הפעולה עשויה להימשך מספר דקות. מתבצעת הפעלה של הקונטיינר של Linux.</translation>
 <translation id="9180380851667544951">האתר רשאי לשתף את המסך</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 9398eb4f..9c5aa20 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -801,7 +801,7 @@
 <translation id="1826516787628120939">확인 중</translation>
 <translation id="1827738518074806965">아트 갤러리</translation>
 <translation id="1828378091493947763">이 기기에서 지원되지 않는 플러그인입니다.</translation>
-<translation id="1828879788654007962">{COUNT,plural, =0{모두 열기(O)}=1{북마크 열기(O)}other{{COUNT}개 모두 열기(O)}}</translation>
+<translation id="1828879788654007962">{COUNT,plural, =0{모두 열기(O)}=1{북마크 열기(O)}other{{COUNT}개 모두 열기(&amp;O)}}</translation>
 <translation id="1828901632669367785">시스템 대화상자를 사용하여 인쇄...</translation>
 <translation id="1829129547161959350">펭귄</translation>
 <translation id="1829192082282182671">축소(&amp;O)</translation>
@@ -2953,6 +2953,7 @@
 <translation id="4136203100490971508">일출 시 야간 조명이 자동으로 꺼짐</translation>
 <translation id="41365691917097717">계속하면 Android 앱 생성과 테스트에 ADB 디버깅을 사용 설정합니다. 이렇게 하면 Google에서 확인하지 않은 Android 앱을 설치할 수 있게 되며, 사용 중지하려면 초기화가 필요합니다.</translation>
 <translation id="4138267921960073861">로그인 화면에 사용자 이름과 사진 표시</translation>
+<translation id="4138598238327913711">문법 검사 기능은 현재 영어로만 제공됩니다.</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID 기기 연결됨</translation>
 <translation id="4142052906269098341">휴대전화를 사용해 <ph name="DEVICE_TYPE" />을 잠금 해제하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">감지된 프린터를 프로필에 저장하거나 새 프린터를 추가합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 4d9613f..8beee18 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2969,6 +2969,7 @@
 <translation id="4136203100490971508">Nakties šviesa bus išjungta automatiškai saulei tekant</translation>
 <translation id="41365691917097717">Tęsdami įgalinsite ADB derinimą, naudojamą „Android“ programoms kurti ir testuoti. Atminkite, kad atlikus šį veiksmą bus leidžiama įdiegti „Android“ programas, kurios nebuvo patvirtintos „Google“, o norint išjungti ADB, reikės atkurti gamyklinius nustatymus.</translation>
 <translation id="4138267921960073861">Rodyti naudotojų vardus ir nuotraukas prisijungimo ekrane</translation>
+<translation id="4138598238327913711">Gramatikos tikrinimo funkcija šiuo metu pasiekiama tik anglų kalba</translation>
 <translation id="413915106327509564">„<ph name="WINDOW_TITLE" />“ – prijungtas HID įrenginys</translation>
 <translation id="4142052906269098341">Atrakinkite „<ph name="DEVICE_TYPE" />“ naudodami telefoną <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Išsaugokite aptiktus spausdintuvus profilyje arba pridėkite naują spausdintuvą. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb
index c4d0275..ea01357 100644
--- a/chrome/app/resources/generated_resources_mk.xtb
+++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -2967,6 +2967,7 @@
 <translation id="4136203100490971508">Ноќното светло ќе се исклучи автоматски на изгрејсонце</translation>
 <translation id="41365691917097717">Ако продолжите, ќе се овозможи отстранување грешки на ADB за создавање и тестирање апликации на Android. Имајте предвид дека дејствово овозможува инсталирање апликации за Android што не се потврдени од Google, а за оневозможувањето е потребно фабричко ресетирање.</translation>
 <translation id="4138267921960073861">Прикажи кориснички имиња и фотографии на екранот за најавување</translation>
+<translation id="4138598238327913711">Проверка на граматиката е достапна само за англиски во моментов</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - поврзан е HID-уред</translation>
 <translation id="4142052906269098341">Отклучете го вашиот <ph name="DEVICE_TYPE" /> со телефонот. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Зачувајте ги откриените печатачи во вашиот профил или додајте нов печатач. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index ce7b8f3..90703e6 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -72,6 +72,7 @@
 <translation id="107278043869924952">Usar um PIN além da senha</translation>
 <translation id="1076176485976385390">Navegar pelas páginas com um cursor de texto</translation>
 <translation id="1076698951459398590">Ativar tema</translation>
+<translation id="1076766328672150609">A criança pode usar um PIN para desbloquear o dispositivo.</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1076882167394279216">Não foi possível fazer o download do dicionário de verificação ortográfica de <ph name="LANGUAGE" />. Tente novamente.</translation>
 <translation id="1079766198702302550">Sempre bloquear o acesso à câmera</translation>
@@ -259,6 +260,7 @@
 <translation id="1275718070701477396">Selecionado</translation>
 <translation id="1276994519141842946">Não foi possível desinstalar o app <ph name="APP_NAME" /></translation>
 <translation id="1277020343994096713">Crie um PIN diferente do atual</translation>
+<translation id="1278859221870828664">Revise os apps e serviços do Google Play</translation>
 <translation id="127946606521051357">Um dispositivo por perto está compartilhando</translation>
 <translation id="1280965841156951489">Editar arquivos</translation>
 <translation id="1285320974508926690">Nunca traduzir este site</translation>
@@ -812,6 +814,7 @@
 <translation id="1834503245783133039">Falha no download: <ph name="FILE_NAME" /></translation>
 <translation id="1835261175655098052">Fazendo upgrade do Linux</translation>
 <translation id="1838374766361614909">Limpar pesquisa</translation>
+<translation id="1839540115464516994">Mostrar no <ph name="LOCATION" /></translation>
 <translation id="1841545962859478868">O administrador do dispositivo pode monitorar o seguinte:</translation>
 <translation id="1841616161104323629">Registro do dispositivo não encontrado.</translation>
 <translation id="1841705068325380214">A extensão <ph name="EXTENSION_NAME" /> está desativada</translation>
@@ -1106,6 +1109,8 @@
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2155772377859296191">Resolução: <ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service worker: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156557113115192526">Não perguntar novamente ao abrir este formato de arquivo no app:
+<ph name="FILE_FORMAT" /></translation>
 <translation id="2156877321344104010">Fazer a confirmação de segurança novamente</translation>
 <translation id="2157474325782140681">Para ter outros recursos, use uma base de encaixe Dell compatível com este Chromebook.</translation>
 <translation id="215753907730220065">Sair do modo tela cheia</translation>
@@ -1284,6 +1289,7 @@
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2337236196941929873">Pré-carrega as páginas que o Chrome acredita que você acessará. Para fazer isso, o navegador poderá usar cookies, se você os permitir, e poderá criptografar e enviar páginas pelo Google para ocultar sua identidade dos sites.</translation>
 <translation id="2340239562261172947">Não é possível fazer o download de <ph name="FILE_NAME" /> por motivos de segurança</translation>
+<translation id="2342180549977909852">A criança pode usar um número (PIN) em vez de uma senha para desbloquear este dispositivo. Para definir um PIN mais tarde, acesse Configurações.</translation>
 <translation id="2342740338116612727">Favoritos adicionados</translation>
 <translation id="2343747224442182863">Focar esta guia</translation>
 <translation id="2345723121311404059">1 página para <ph name="PRINTER_NAME" /></translation>
@@ -1744,6 +1750,7 @@
 <translation id="2828375943530438449">Voltar da página de login</translation>
 <translation id="2828650939514476812">Conectar à rede Wi-Fi</translation>
 <translation id="2831430281393059038">O dispositivo é compatível</translation>
+<translation id="2832124733806557606">A criança pode usar um PIN para fazer login ou desbloquear o dispositivo.</translation>
 <translation id="2835547721736623118">Serviço de reconhecimento de fala</translation>
 <translation id="2836269494620652131">Falha</translation>
 <translation id="2836635946302913370">O login com este nome foi desativado pelo administrador.</translation>
@@ -1759,6 +1766,7 @@
 <translation id="2849035674501872372">Pesquisar</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
 <translation id="284975061945174219">Falha ao limpar</translation>
+<translation id="2849767214114481738">Seu PIN foi adicionado</translation>
 <translation id="2849936225196189499">Crítico</translation>
 <translation id="2850541429955027218">Adicionar tema</translation>
 <translation id="2851634818064021665">Você precisa de permissão para visitar este site</translation>
@@ -1867,6 +1875,7 @@
 <translation id="2960208947600937804">Algo deu errado na configuração do Linux. Entre em contato com seu administrador.</translation>
 <translation id="296026337010986570">Pronto! Software perigoso removido. Para reativar as extensões, visite &lt;a href="chrome://extensions"&gt;Extensões&lt;/a&gt;.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (extensão fornecida)</translation>
+<translation id="2961210776189273067">Título</translation>
 <translation id="2961695502793809356">Clique para avançar, mantenha pressionado para ver o histórico</translation>
 <translation id="2962131322798295505">Seletor de plano de fundo</translation>
 <translation id="2963151496262057773">Este plug-in não responde: <ph name="PLUGIN_NAME" />. Quer interrompê-lo?</translation>
@@ -2223,6 +2232,7 @@
 <translation id="338323348408199233">Bloquear tráfego sem VPN</translation>
 <translation id="3385092118218578224"><ph name="DISPLAY_ZOOM" />%</translation>
 <translation id="338583716107319301">Separador</translation>
+<translation id="3387023983419383865">,</translation>
 <translation id="3387614642886316601">Usar a verificação ortográfica aprimorada</translation>
 <translation id="3387829698079331264">Sem autorização para saber quando você está usando o dispositivo ativamente</translation>
 <translation id="3388094447051599208">A bandeja de saída está quase cheia</translation>
@@ -2576,6 +2586,7 @@
 <translation id="3747077776423672805">Para remover apps, acesse "Configurações" &gt; "Google Play Store" &gt; "Gerenciar preferências do Android" &gt; "Apps" ou "Gerenciador de aplicativos". Depois, toque no app que você quer desinstalar (talvez seja necessário deslizar para a direita ou esquerda para encontrar o app). Em seguida, toque em "Desinstalar" ou "Desativar".</translation>
 <translation id="3747220812138541072">Mostrar sugestões de escrita in-line enquanto você digita</translation>
 <translation id="3748706263662799310">Informar um bug</translation>
+<translation id="3752253558646317685">Peça para a criança levantar o dedo algumas vezes para salvar a impressão digital</translation>
 <translation id="3752582316358263300">OK...</translation>
 <translation id="3753033997400164841">Salve uma vez. Use em qualquer lugar</translation>
 <translation id="3755411799582650620">Seu <ph name="PHONE_NAME" /> agora pode desbloquear este <ph name="DEVICE_TYPE" /> também.</translation>
@@ -3039,6 +3050,7 @@
 <translation id="425573743389990240">Taxa de descarga da bateria em Watts (um valor negativo significa que a bateria está sendo carregada)</translation>
 <translation id="4256316378292851214">Sal&amp;var vídeo como...</translation>
 <translation id="4258348331913189841">Sistemas de arquivos</translation>
+<translation id="4258786365875464621"><ph name="APP_ORIGIN" /> quer abrir estes arquivos:</translation>
 <translation id="4259388776256904261">Isso pode demorar um pouco</translation>
 <translation id="4260182282978351200">O arquivo <ph name="FILE_NAME" /> pode ser perigoso. Enviar para verificação no Proteção Avançada do Google? Pressione Shift+F6 para voltar à área da barra de downloads.</translation>
 <translation id="4263223596040212967">Verifique o layout do seu teclado e tente novamente.</translation>
@@ -3069,6 +3081,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Mostrar}one{Mostrar tudo}other{Mostrar tudo}}</translation>
 <translation id="4289372044984810120">Gerencie suas contas aqui. <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">Visão geral</translation>
+<translation id="4289732974614035569">Escolha um PIN</translation>
 <translation id="4290791284969893584">Após fechar uma página, as tarefas iniciadas talvez não sejam encerradas</translation>
 <translation id="4295072614469448764">O aplicativo está disponível no seu terminal. Também pode haver um ícone no acesso rápido.</translation>
 <translation id="4295839147292213505">Você pode enviar mensagens de texto pelo computador, compartilhar sua conexão de Internet, responder a notificações de conversa e desbloquear seu <ph name="DEVICE_TYPE" /> com o smartphone.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
@@ -3667,6 +3680,7 @@
 <translation id="4943368462779413526">Futebol americano</translation>
 <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" quer se conectar a uma porta serial</translation>
 <translation id="4944310289250773232">Este serviço de autenticação é hospedado por <ph name="SAML_DOMAIN" /></translation>
+<translation id="4945439665401275950">Para configurar a impressão digital, peça para a criança tocar no botão liga/desliga. Os dados de impressão digital da criança são armazenados de forma segura e nunca saem do <ph name="DEVICE_TYPE" />.</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{um arquivo}one{# arquivo}other{# arquivos}}</translation>
 <translation id="495170559598752135">Ações</translation>
 <translation id="4953808748584563296">Avatar laranja padrão</translation>
@@ -4787,6 +4801,7 @@
 <translation id="6232017090690406397">Bateria</translation>
 <translation id="6232116551750539448">A conexão com <ph name="NAME" /> foi perdida</translation>
 <translation id="6233154960150021497">Usar voz em vez de teclado por padrão</translation>
+<translation id="6233455992368963267">A fala em <ph name="LANGUAGE" /> é enviada ao Google para processamento.</translation>
 <translation id="6234108445915742946">Os Termos de Serviço do Chrome serão atualizados em 31 de março</translation>
 <translation id="6234474535228214774">Instalação pendente</translation>
 <translation id="6237474966939441970">App de anotações com a stylus</translation>
@@ -4880,7 +4895,9 @@
 <translation id="6318125393809743217">Incluir um arquivo policies.json com as configurações das políticas.</translation>
 <translation id="6318407754858604988">Download iniciado</translation>
 <translation id="6318944945640833942">Não foi possível detectar uma impressora. Insira o endereço da impressora novamente.</translation>
+<translation id="6319081871916332821">O <ph name="LANGUAGE" /> é processado localmente e funciona off-line.</translation>
 <translation id="6321407676395378991">Ativar o protetor de tela</translation>
+<translation id="6322370287306604163">Desbloqueie mais rapidamente com a impressão digital</translation>
 <translation id="6322653941595359182">Enviar e receber mensagens de texto no Chromebook</translation>
 <translation id="6324916366299863871">Editar atalho</translation>
 <translation id="6325191661371220117">Desativar inicialização automática</translation>
@@ -5033,6 +5050,7 @@
 <translation id="6497789971060331894">Rolagem reversa do mouse</translation>
 <translation id="6498249116389603658">&amp;Todos os seus idiomas</translation>
 <translation id="6499143127267478107">Resolvendo host no script de proxy...</translation>
+<translation id="6501086852992132091"><ph name="APP_ORIGIN" /> quer abrir este arquivo:</translation>
 <translation id="650266656685499220">Para criar álbuns, acesse o Google Fotos</translation>
 <translation id="6503077044568424649">Mais visitados</translation>
 <translation id="650457560773015827">Botão esquerdo</translation>
@@ -5051,6 +5069,7 @@
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
         <ph name="EVENT_NAME" /></translation>
+<translation id="6519689855001245063">Verificando a qualificação</translation>
 <translation id="6520876759015997832">Resultado da pesquisa <ph name="LIST_POSITION" /> de <ph name="LIST_SIZE" />: <ph name="SEARCH_RESULT_TEXT" />. Pressione Enter para navegar até a seção.</translation>
 <translation id="6521214596282732365">Geralmente, os sites usam suas fontes para que você possa criar conteúdo de alta fidelidade usando ferramentas on-line gráficas e de design</translation>
 <translation id="652492607360843641">Você está conectado a uma rede <ph name="NETWORK_TYPE" />.</translation>
@@ -5274,6 +5293,7 @@
 <translation id="6785518634832172390">O PIN precisa ter 12 dígitos ou menos</translation>
 <translation id="6786747875388722282">Extensões</translation>
 <translation id="6787097042755590313">Outra guia</translation>
+<translation id="6787631759192429908">Abrir arquivos?</translation>
 <translation id="6787839852456839824">Atalhos do teclado</translation>
 <translation id="6788210894632713004">Extensão descompactada</translation>
 <translation id="6789592661892473991">Divisão horizontal</translation>
@@ -5342,6 +5362,7 @@
 <translation id="6846178040388691741"><ph name="EXTENSION_NAME" /> quer imprimir <ph name="FILE_NAME" /> com <ph name="PRINTER_NAME" />.</translation>
 <translation id="6847125920277401289">Liberar espaço para continuar</translation>
 <translation id="6848388270925200958">No momento, você tem alguns cartões que só podem ser usados neste dispositivo</translation>
+<translation id="6848716236260083778">Para configurar a impressão digital, peça para a criança tocar no sensor. Os dados de impressão digital da criança são armazenados de forma segura e nunca saem do <ph name="DEVICE_TYPE" />.</translation>
 <translation id="6850286078059909152">Cor do texto</translation>
 <translation id="6851181413209322061">Envie dados de uso e diagnóstico. No momento, este dispositivo está enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles não serão usados para identificar a criança e ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e nossos parceiros, como os desenvolvedores Android. Essa configuração é aplicada pelo proprietário, Se a opção "Atividade na Web e de apps adicional" estiver ativada para a criança, esses dados poderão ser salvos na Conta do Google dela.</translation>
 <translation id="6851497530878285708">App ativado</translation>
@@ -5688,6 +5709,7 @@
 <translation id="7243632151880336635">Limpar e sair</translation>
 <translation id="7243784282103630670">Algo deu errado no upgrade do Linux. Faremos a restauração do contêiner usando seu backup.</translation>
 <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Melhor)</translation>
+<translation id="7246079707145287765">Ver guia <ph name="TAB_ORIGIN" /></translation>
 <translation id="7246230585855757313">Reinsira sua chave de segurança e tente novamente</translation>
 <translation id="7249777306773517303">Este dispositivo é gerenciado por <ph name="DOMAIN" /> e requer que o login seja feito todas as vezes.</translation>
 <translation id="7250616558727237648">O dispositivo com que você está compartilhando não respondeu. Tente novamente.</translation>
@@ -5734,6 +5756,7 @@
 <translation id="7297726121602187087">Verde-escuro</translation>
 <translation id="7298195798382681320">Recomendada</translation>
 <translation id="7299337219131431707">Ativar a navegação como visitante</translation>
+<translation id="7301470816294041580">Você pode perguntar "Ok Google, que música é essa?" ou "Ok Google, o que está na minha tela?"</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Este aplicativo pode impedir que o Chrome funcione adequadamente.}one{Este aplicativo pode impedir que o Chrome funcione adequadamente.}other{Estes aplicativos podem impedir que o Chrome funcione adequadamente.}}</translation>
 <translation id="7303281435234579599">Algo deu errado ao configurar o modo de demonstração.</translation>
 <translation id="7303900363563182677">Este site foi impedido de ver textos e imagens copiados para a área de transferência</translation>
@@ -5838,6 +5861,7 @@
 <translation id="740810853557944681">Adicionar um servidor de impressão</translation>
 <translation id="7409549334477097887">Muito grande</translation>
 <translation id="7409735910987429903">Os sites podem exibir pop-ups para mostrar anúncios ou usar redirecionamentos para levar você até sites que talvez não queira acessar</translation>
+<translation id="7409854300652085600">Favoritos importados.</translation>
 <translation id="7410344089573941623">Perguntar se <ph name="HOST" /> deseja acessar sua câmera e seu microfone</translation>
 <translation id="741204030948306876">Sim</translation>
 <translation id="7412226954991670867">Memória GPU</translation>
@@ -5973,6 +5997,8 @@
 <translation id="7552846755917812628">Tente seguir estas dicas:</translation>
 <translation id="7553012839257224005">Verificando o contêiner Linux</translation>
 <translation id="7553242001898162573">Digite sua senha</translation>
+<translation id="7553347517399115470">Não perguntar novamente ao abrir estes formatos de arquivo no app:
+<ph name="FILE_FORMATS" /></translation>
 <translation id="755472745191515939">O administrador não permite o uso desse idioma</translation>
 <translation id="7554791636758816595">Nova guia</translation>
 <translation id="7556033326131260574">O Smart Lock não conseguiu verificar sua conta. Digite sua senha para entrar.</translation>
@@ -6587,6 +6613,7 @@
 <translation id="8162307956032783161">Atribuir interruptor: Próxima</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Mover guia para uma nova janela}one{Mover guia para uma nova janela}other{Mover guias para uma nova janela}}</translation>
 <translation id="8165997195302308593">Encaminhamento de portas do Crostini</translation>
+<translation id="8166081708154635403">Abrir arquivo?</translation>
 <translation id="816704878106051517">{COUNT,plural, =1{um número de telefone}one{# número de telefone}other{# números de telefone}}</translation>
 <translation id="8168435359814927499">Conteúdo</translation>
 <translation id="8169165065843881617">{NUM_TABS,plural, =1{Adicionar guia à lista de leitura}one{Adicionar guia à lista de leitura}other{Adicionar guias à lista de leitura}}</translation>
@@ -6756,6 +6783,7 @@
 <translation id="835238322900896202">Ocorreu um erro durante a desinstalação. Desinstale novamente usando o terminal.</translation>
 <translation id="8352772353338965963">Adicione uma conta de login múltiplo. Todas as contas conectadas podem ser acessadas sem uma senha; portanto esse recurso só deve ser usado com contas confiáveis.</translation>
 <translation id="8353683614194668312">Ele pode:</translation>
+<translation id="8354034204605718473">O PIN da criança foi adicionado</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8357388086258943206">Erro ao instalar o Linux</translation>
 <translation id="8358685469073206162">Restaurar páginas?</translation>
@@ -6989,6 +7017,7 @@
 <translation id="8645920082661222035">Prevê eventos perigosos e alerta você antes que eles aconteçam</translation>
 <translation id="8646209145740351125">Desativar a sincronização</translation>
 <translation id="864637694230589560">Os sites geralmente enviam notificações para avisar sobre as últimas notícias ou mensagens de chat</translation>
+<translation id="8647385344110255847">Com sua permissão, a criança pode usar o Google Play para instalar apps</translation>
 <translation id="8647834505253004544">Não é um endereço da Web válido</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> ou <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">Temperatura da cor do "Modo noturno"</translation>
@@ -7133,6 +7162,7 @@
 <translation id="8783834180813871000">Digite o código de pareamento do Bluetooth e pressione "Voltar" ou "Enter".</translation>
 <translation id="8784626084144195648">Média de pré-processamento</translation>
 <translation id="8785622406424941542">Stylus</translation>
+<translation id="8786824282808281903">Quando a criança vir este ícone, a impressão digital poderá ser usada para identificação ou aprovação de compras.</translation>
 <translation id="8787575090331305835">{NUM_TABS,plural, =1{Grupo sem nome: 1 guia}one{Grupo sem nome: # guia}other{Grupo sem nome: # guias}}</translation>
 <translation id="8791534160414513928">Enviar a observação "Não rastrear" em seu tráfego de navegação</translation>
 <translation id="8792626944327216835">microfone</translation>
@@ -7378,6 +7408,7 @@
 <translation id="9031811691986152304">tentar novamente</translation>
 <translation id="9033765790910064284">Continuar mesmo assim</translation>
 <translation id="9033857511263905942">&amp;Colar</translation>
+<translation id="903480517321259405">Digite o PIN novamente</translation>
 <translation id="9037640663275993951">O dispositivo não é permitido</translation>
 <translation id="9037818663270399707">Sua conexão não é particular em todo o tráfego de rede</translation>
 <translation id="9037965129289936994">Mostrar original</translation>
@@ -7405,6 +7436,10 @@
 Você pode atribuir vários interruptores a essa ação.</translation>
 <translation id="9064275926664971810">Ativar o Preenchimento automático e preencher formulários com um clique</translation>
 <translation id="9065203028668620118">Editar</translation>
+<translation id="9066394310994446814">Você está vendo esse item com base na sua atividade anterior nos Serviços do Google. Você pode ver seus dados, excluí-los e mudar suas configurações em <ph name="BEGIN_LINK1" />myactivity.google.com<ph name="END_LINK1" />.
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        Saiba mais sobre os dados que o Google coleta e por que em <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />.</translation>
 <translation id="9066782832737749352">Conversão de texto em voz</translation>
 <translation id="9068878141610261315">Tipo de arquivo incompatível</translation>
 <translation id="9070342919388027491">Guia movida para a esquerda</translation>
@@ -7513,6 +7548,7 @@
 <translation id="917510707618656279">Perguntar quando um site quiser acessar dispositivos Bluetooth</translation>
 <translation id="9176476835295860688">Envie dados de uso e diagnóstico. No momento, este dispositivo está enviando automaticamente ao Google dados de diagnóstico, de uso de apps e do dispositivo. Eles ajudarão a melhorar o sistema, a estabilidade de apps e muito mais. Alguns dados agregados também ajudarão os apps do Google e os nossos parceiros, como os desenvolvedores Android. Essa <ph name="BEGIN_LINK1" />configuração<ph name="END_LINK1" /> é aplicada pelo proprietário. Se a configuração "Atividade na Web e de apps adicional" estiver ativada, esses dados poderão ser salvos na sua Conta do Google. <ph name="BEGIN_LINK2" />Saiba mais<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Dispositivo Bluetooth conectado</translation>
+<translation id="9176817945195089764"><ph name="DOMAIN" /> não é uma organização válida. Entre em contato com seu administrador. Se você é um administrador, pode configurar sua organização acessando g.co/ChromeEnterpriseAccount</translation>
 <translation id="9179524979050048593">Nome de usuário na tela de login</translation>
 <translation id="9180281769944411366">O processo pode levar alguns minutos. Iniciando o contêiner Linux.</translation>
 <translation id="9180380851667544951">O site pode compartilhar sua tela</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 29665d78..f6a1fa9d 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -2952,6 +2952,7 @@
 <translation id="4136203100490971508">Ночная подсветка будет автоматически отключаться на рассвете</translation>
 <translation id="41365691917097717">Продолжив, вы включите отладку с ADB для создания и тестирования приложений для Android. Обратите внимание, что это позволит устанавливать приложения для Android, которые не были проверены Google. Для отключения инструмента потребуется сбросить настройки устройства до заводских.</translation>
 <translation id="4138267921960073861">Показывать имена и фотографии пользователей на экране входа</translation>
+<translation id="4138598238327913711">Проверка грамматики пока доступна только на английском языке.</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – подключено HID-устройство</translation>
 <translation id="4142052906269098341">Снимать блокировку <ph name="DEVICE_TYPE" /> с помощью телефона. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Сохраните найденные принтеры в своем профиле или добавьте новый принтер. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb
index 9436ab5..52251ce 100644
--- a/chrome/app/resources/generated_resources_si.xtb
+++ b/chrome/app/resources/generated_resources_si.xtb
@@ -2955,6 +2955,7 @@
 <translation id="4136203100490971508">රාත්‍රී ආලෝකය හිරු නැගීමේදී ස්වයංක්‍රීයව ක්‍රියාවිරහිත වනු ඇත</translation>
 <translation id="41365691917097717">ඉදිරියට යාම Android යෙදුම් සෑදීම සහ පරීක්‍ෂා කිරීම සඳහා ADB නිදොස් කිරීම සබල කරයි. මෙම ක්‍රියාව Google විසින් සත්‍යාපිත නොවන Android යෙදුම් ස්ථාපන කිරීමට ඉඩ දෙන අතර, අබල කිරීමට කර්මාන්තශාලා යළි සැකසුමක් අවශ්‍ය වන බව සලකන්න.</translation>
 <translation id="4138267921960073861">සයින්-ඉන් තිරයෙහි භාවිතනම, සහ ඡායාරූපය පෙන්වන්න</translation>
+<translation id="4138598238327913711">ව්‍යාකරණ පරීක්ෂාව දැනට ඉංග්‍රීසි භාෂාව සඳහා පමණක් ලබා ගත හැකිය</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID උපාංගය සම්බන්ධයි</translation>
 <translation id="4142052906269098341">ඔබේ දුරකථනය මඟින් ඔබේ <ph name="DEVICE_TYPE" /> අගුලු හරින්න. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">අනාවරණ කළ මුද්‍රක ඔබේ පැතිකඩට සුරකින්න, නැති නම් නව මුද්‍රකයක් එක් කරන්න. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb
index 0901c7a..6fdf6446 100644
--- a/chrome/app/resources/generated_resources_sq.xtb
+++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -257,7 +257,7 @@
 <translation id="1275718070701477396">Përzgjedhur</translation>
 <translation id="1276994519141842946"><ph name="APP_NAME" /> nuk mund të çinstalohej</translation>
 <translation id="1277020343994096713">Krijo një kod të ri PIN që është i ndryshëm nga kodi yt aktual PIN</translation>
-<translation id="1278859221870828664">Shqyrto aplikacionet dhe shërbmet e Google Play</translation>
+<translation id="1278859221870828664">Shqyrto aplikacionet dhe shërbimet e Google Play</translation>
 <translation id="127946606521051357">Pajisja në afërsi po ndan</translation>
 <translation id="1280965841156951489">Modifiko skedarët</translation>
 <translation id="1285320974508926690">Asnjëherë mos e përkthe këtë sajt</translation>
@@ -1731,7 +1731,7 @@
 <translation id="2828375943530438449">Kthehu nga identifikimi</translation>
 <translation id="2828650939514476812">Lidhu me rrjetin Wi-Fi</translation>
 <translation id="2831430281393059038">Pajisja mbështetet</translation>
-<translation id="2832124733806557606">Fëmija yt mund të përdorë një PIN për t'u identifikuar ose shkyçur pajisjen.</translation>
+<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="2835547721736623118">Shërbimi i njohjes së ligjërimit</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>
@@ -3658,7 +3658,7 @@
 <translation id="4943368462779413526">Futboll</translation>
 <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" dëshiron të lidhet me një portë serie</translation>
 <translation id="4944310289250773232">Ky shërbim vërtetimi strehohet nga <ph name="SAML_DOMAIN" /></translation>
-<translation id="4945439665401275950">Për të konfiguruar gjurmë gishti, vëre fëmijën tënd të prekë butonin e energjisë. Të dhënat e gjurmës së gishtit të fëmijës tënd ruhen në mënyrë të sigurt dhe nuk largohen kurrë nga kjo <ph name="DEVICE_TYPE" />.</translation>
+<translation id="4945439665401275950">Për të konfiguruar gjurmë gishti, vëre fëmijën tënd të prekë butonin e energjisë. Të dhënat e gjurmës së gishtit të fëmijës tënd ruhen në mënyrë të sigurt dhe nuk largohen kurrë nga ky <ph name="DEVICE_TYPE" />.</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{një skedar}other{# skedarë}}</translation>
 <translation id="495170559598752135">Veprimet</translation>
 <translation id="4953808748584563296">Avatari i parazgjedhur portokalli</translation>
@@ -5339,7 +5339,7 @@
 <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />" dëshiron të printojë <ph name="FILE_NAME" /> me <ph name="PRINTER_NAME" />.</translation>
 <translation id="6847125920277401289">Liro hapësirë për të vazhduar</translation>
 <translation id="6848388270925200958">Në këtë moment, ke disa karta që mund të përdoren vetëm në këtë pajisje</translation>
-<translation id="6848716236260083778">Për të konfiguruar gjurmë gishti, vëre fëmijën tënd të prekë sensorin e gjurmës së gishtit. Të dhënat e gjurmës së gishtit të fëmijës tënd ruhen në mënyrë të sigurt dhe nuk largohen kurrë nga kjo <ph name="DEVICE_TYPE" />.</translation>
+<translation id="6848716236260083778">Për të konfiguruar gjurmë gishti, vëre fëmijën tënd të prekë sensorin e gjurmës së gishtit. Të dhënat e gjurmës së gishtit të fëmijës tënd ruhen në mënyrë të sigurt dhe nuk largohen kurrë nga ky <ph name="DEVICE_TYPE" />.</translation>
 <translation id="6850286078059909152">Ngjyra e tekstit</translation>
 <translation id="6851181413209322061">Dërgo të dhënat e përdorimit dhe të diagnostikimit. Aktualisht kjo pajisje po dërgon automatikisht te Google të dhënat e diagnostikimit dhe të përdorimit të pajisjes dhe të aplikacioneve. Këto nuk do të përdoren për të identifikuar fëmijën tënd dhe do të ndihmojnë për qëndrueshmërinë e sistemit dhe të aplikacioneve dhe për përmirësime të tjera. Disa të dhëna të përmbledhura do të ndihmojnë po ashtu aplikacionet dhe partnerët e Google, si p.sh. zhvilluesit e Android. Ky cilësim zbatohet nga zotëruesi. Nëse "Aktiviteti shtesë i uebit dhe i aplikacioneve" është i aktivizuar për fëmijën tënd, këto të dhëna mund të ruhen në "Llogarinë e Google" të fëmijës.</translation>
 <translation id="6851497530878285708">Aplikacioni u aktivizua</translation>
@@ -7521,7 +7521,7 @@
 <translation id="917510707618656279">Pyet kur një sajt dëshiron të ketë qasje te pajisjet Bluetooth</translation>
 <translation id="9176476835295860688">Dërgo të dhënat e përdorimit dhe të diagnostikimit. Aktualisht kjo pajisje po dërgon automatikisht te Google të dhënat e diagnostikimit dhe të përdorimit të pajisjes dhe të aplikacioneve. Këto do të ndihmojnë për qëndrueshmërinë e sistemit dhe të aplikacioneve dhe për përmirësime të tjera. Disa të dhëna të përmbledhura do të ndihmojnë po ashtu aplikacionet dhe partnerët e Google, si p.sh. zhvilluesit e Android. Ky <ph name="BEGIN_LINK1" />cilësim<ph name="END_LINK1" /> zbatohet nga zotëruesi. Nëse cilësimi i "Aktivitetit shtesë të uebit dhe të aplikacioneve" është i aktivizuar, këto të dhëna mund të ruhen në "Llogarinë tënde të Google". <ph name="BEGIN_LINK2" />Mëso më shumë<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - u lidh një pajisje Bluetooth</translation>
-<translation id="9176817945195089764"><ph name="DOMAIN" /> nuk është organizatë e vlefshme. Kontakto me administatorin tënd. Nëse je administator, mund ta konfigurosh organizatën tënde duke vizituar: g.co/ChromeEnterpriseAccount</translation>
+<translation id="9176817945195089764"><ph name="DOMAIN" /> nuk është organizatë e vlefshme. Kontakto me administatorin tënd. Nëse je administrator, mund ta konfigurosh organizatën tënde duke vizituar: g.co/ChromeEnterpriseAccount</translation>
 <translation id="9179524979050048593">Emri i përdoruesit të ekranit të identifikimit</translation>
 <translation id="9180281769944411366">Procesi mund të zgjasë disa minuta. Po hapet kontejneri i Linux.</translation>
 <translation id="9180380851667544951">Sajti mund të ndajë ekranin tënd</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index afac5b0..20f6f3e 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2966,6 +2966,7 @@
 <translation id="4136203100490971508">Nattljuset släcks automatiskt vid soluppgången</translation>
 <translation id="41365691917097717">Om du fortsätter aktiveras felsökning med ADB för Android-appar som du skapar och testar. Observera att den här åtgärden tillåter att Android-appar som inte har verifierats av Google installeras. Du måste återställa enheten till standardinställningarna för att inaktivera detta.</translation>
 <translation id="4138267921960073861">Visa användarnamn och foton på inloggningssidan</translation>
+<translation id="4138598238327913711">För närvarande är grammatikkontrollen bara tillgänglig på engelska</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> – ansluten till HID-enhet</translation>
 <translation id="4142052906269098341">Lås upp <ph name="DEVICE_TYPE" /> med mobilen. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Spara identifierade skrivare i profilen eller lägg till en ny skrivare. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index e34fc45..5dac23f9 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -2960,6 +2960,7 @@
 <translation id="4136203100490971508">Kipengele cha Mwanga wa Usiku kitazimwa kiotomatiki wakati wa macheo</translation>
 <translation id="41365691917097717">Hatua ya kuendelea itawasha utatuzi wa ADB wa kusanidi na kujaribu programu za Android. Kumbuka kwamba hatua hii inaruhusu usakinishaji wa programu za Android ambazo hazijathibitishwa na Google na zinahitaji urejeshe mipangilio ambayo kifaa ilitoka nayo kiwandani ili kuzima.</translation>
 <translation id="4138267921960073861">Onyesha majina ya watumiaji na picha kwenye skrini ya kuingia</translation>
+<translation id="4138598238327913711">Kwa sasa, kipengele cha kukagua sarufi kinapatikana kwa lugha ya Kiingereza pekee</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - Kifaa cha HID kimeunganishwa</translation>
 <translation id="4142052906269098341">Fungua <ph name="DEVICE_TYPE" /> yako ukitumia simu yako. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Hifadhi printa zilizotambuliwa kwenye wasifu wako au uweke printa mpya. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 75913a9..13cf00003 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -72,6 +72,7 @@
 <translation id="107278043869924952">Şifrenin yanı sıra PIN kullan</translation>
 <translation id="1076176485976385390">Sayfalarda metin imleciyle gezin</translation>
 <translation id="1076698951459398590">Temayı Etkinleştir</translation>
+<translation id="1076766328672150609">Çocuğunuz, cihazın kilidini açmak için PIN kullanabilir.</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1076882167394279216"><ph name="LANGUAGE" /> dili için yazım denetimi sözlüğü indirilemedi. Tekrar deneyin.</translation>
 <translation id="1079766198702302550">Kamera erişimini her zaman engelle</translation>
@@ -256,6 +257,7 @@
 <translation id="1275718070701477396">Seçili</translation>
 <translation id="1276994519141842946"><ph name="APP_NAME" /> kaldırılamadı</translation>
 <translation id="1277020343994096713">Şu anki PIN kodunuzdan farklı yeni bir PIN oluşturun</translation>
+<translation id="1278859221870828664">Google Play uygulama ve hizmetlerini inceleyin</translation>
 <translation id="127946606521051357">Yakındaki bir cihaz içerik paylaşıyor</translation>
 <translation id="1280965841156951489">Dosyaları düzenle</translation>
 <translation id="1285320974508926690">Bu siteyi hiçbir zaman çevirme</translation>
@@ -800,6 +802,7 @@
 <translation id="1834503245783133039">İndirme işlemi başarısız oldu: <ph name="FILE_NAME" /></translation>
 <translation id="1835261175655098052">Linux Yeni Sürüme Geçiriliyor</translation>
 <translation id="1838374766361614909">Aramayı temizle</translation>
+<translation id="1839540115464516994">Şurada göster: <ph name="LOCATION" /></translation>
 <translation id="1841545962859478868">Cihaz yöneticisi aşağıdakileri izleyebilir:</translation>
 <translation id="1841616161104323629">Eksik cihaz kaydı.</translation>
 <translation id="1841705068325380214"><ph name="EXTENSION_NAME" /> devre dışı bırakıldı</translation>
@@ -1093,6 +1096,7 @@
 <translation id="2154710561487035718">URL'yi Kopyala</translation>
 <translation id="2155772377859296191"><ph name="WIDTH" /> x <ph name="HEIGHT" /> şeklinde görünür</translation>
 <translation id="2156294658807918600">Hizmet Çalışanı: <ph name="SCRIPT_URL" /></translation>
+<translation id="2156557113115192526">Bu uygulamada şu dosya biçimini açarken tekrar sorma: <ph name="FILE_FORMAT" /></translation>
 <translation id="2156877321344104010">Güvenlik kontrolünü tekrar çalıştır</translation>
 <translation id="2157474325782140681">Ek özelliklerden yararlanmak için bu Chromebook ile uyumlu olacak şekilde tasarlanmış bir Dell yuva istasyonu kullanın.</translation>
 <translation id="215753907730220065">Tam Ekrandan Çık</translation>
@@ -1268,6 +1272,7 @@
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2337236196941929873">Chrome'un ziyaret edebileceğinizi düşündüğü sayfaları önceden yükler. Bunu yapmak için Chrome, çerezleri kullanabilir (çerezlere izin veriyorsanız) ve kimliğinizi sitelerden gizlemek için sayfaları şifreleyip Google üzerinden gönderebilir.</translation>
 <translation id="2340239562261172947"><ph name="FILE_NAME" /> güvenli bir şekilde indirilemiyor</translation>
+<translation id="2342180549977909852">Çocuğunuz, bu cihazın kilidini açmak için şifre yerine bir sayı (PIN) kullanabilir. PIN'i daha sonra ayarlamak için Ayarlar'a gidin.</translation>
 <translation id="2342740338116612727">Yer işaretleri eklendi</translation>
 <translation id="2343747224442182863">Bu Sekmeyi Odakla</translation>
 <translation id="2345723121311404059"><ph name="PRINTER_NAME" /> adlı yazıcıya 1 sayfa</translation>
@@ -1727,6 +1732,7 @@
 <translation id="2828375943530438449">Oturum açma sayfasından önceki sayfaya dön</translation>
 <translation id="2828650939514476812">Kablosuz ağa bağlan</translation>
 <translation id="2831430281393059038">Cihaz destekleniyor</translation>
+<translation id="2832124733806557606">Çocuğunuz, cihazda oturum açmak veya cihazın kilidini açmak için PIN kullanabilir.</translation>
 <translation id="2835547721736623118">Konuşma tanıma hizmeti</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>
@@ -1742,6 +1748,7 @@
 <translation id="2849035674501872372">Araştır</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
 <translation id="284975061945174219">Temizleme işlemi başarısız oldu</translation>
+<translation id="2849767214114481738">PIN'iniz eklendi</translation>
 <translation id="2849936225196189499">Önemli</translation>
 <translation id="2850541429955027218">Tema ekle</translation>
 <translation id="2851634818064021665">Bu siteyi ziyaret etmek için izninizin olması gerekir</translation>
@@ -1850,6 +1857,7 @@
 <translation id="2960208947600937804">Linux yapılandırılırken bir hata oluştu. Yöneticinizle iletişime geçin.</translation>
 <translation id="296026337010986570">Bitti! Zararlı yazılım kaldırıldı. Uzantıları tekrar açmak için &lt;a href="chrome://extensions"&gt;Uzantılar&lt;/a&gt; sayfasını ziyaret edin.</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (süresi uzatıldı)</translation>
+<translation id="2961210776189273067">Unvan</translation>
 <translation id="2961695502793809356">İlerlemek için tıkla, geçmişi görmek için tıklayıp tut</translation>
 <translation id="2962131322798295505">Duvar Kağıdı Seçici</translation>
 <translation id="2963151496262057773">Aşağıdaki eklenti yanıt vermiyor: <ph name="PLUGIN_NAME" />Durdurmak ister misiniz?</translation>
@@ -2205,6 +2213,7 @@
 <translation id="338323348408199233">VPN dışı trafiği engelle</translation>
 <translation id="3385092118218578224">%<ph name="DISPLAY_ZOOM" /></translation>
 <translation id="338583716107319301">Ayırıcı</translation>
+<translation id="3387023983419383865">,</translation>
 <translation id="3387614642886316601">Gelişmiş yazım denetimini kullan</translation>
 <translation id="3387829698079331264">Cihazınızı etkin olarak kullandığınızı bilmesine izin verilmeyen siteler</translation>
 <translation id="3388094447051599208">Çıkış tepsisi neredeyse dolu</translation>
@@ -2558,6 +2567,7 @@
 <translation id="3747077776423672805">Uygulamaları kaldırmak için Ayarlar &gt; Google Play Store &gt; Android tercihlerini yönet &gt; Uygulamalar veya Uygulama yöneticisi'ne gidin. Daha sonra, yüklemesini kaldırmak istediğiniz uygulamaya dokunun (uygulamayı bulmak için sağa veya sola doğru hızlıca kaydırmanız gerekebilir). Ardından, Kaldır veya Devre Dışı Bırak'a dokunun.</translation>
 <translation id="3747220812138541072">Yazma esnasında satır içi yazım önerileri gösterilir</translation>
 <translation id="3748706263662799310">Hata bildir</translation>
+<translation id="3752253558646317685">Parmak izini kaydetmek için çocuğunuzun parmağını kaldırıp dokundurmaya devam etmesi gerekir</translation>
 <translation id="3752582316358263300">Tamam...</translation>
 <translation id="3753033997400164841">Bir kere depolayın. Her yerde kullanın</translation>
 <translation id="3755411799582650620"><ph name="PHONE_NAME" /> cihazınız bu <ph name="DEVICE_TYPE" /> cihazın kilidini de açabilir.</translation>
@@ -2939,6 +2949,7 @@
 <translation id="4136203100490971508">Gece Işığı güneş doğduğunda otomatik olarak kapatılır</translation>
 <translation id="41365691917097717">Devam edilirse ADB hata ayıklama işlevi, Android uygulaması oluşturmak ve test etmek için etkinleştirilir. Bu işlemin Google tarafından doğrulanmamış Android uygulamalarının yüklenmesine izin verdiğini, fabrika ayarlarına sıfırlama işlemi yapılmadan devre dışı bırakılamayacağını unutmayın.</translation>
 <translation id="4138267921960073861">Oturum açma ekranında kullanıcı adlarını ve fotoğrafları göster</translation>
+<translation id="4138598238327913711">Dil bilgisi denetimi şu anda yalnızca İngilizce dilinde kullanılabilir</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" /> - HID cihazı bağlandı</translation>
 <translation id="4142052906269098341"><ph name="DEVICE_TYPE" /> cihazınızın kilidini telefonunuzla açın. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Algılanan yazıcıları profilinize kaydedin veya yeni bir yazıcı ekleyin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
@@ -3020,6 +3031,7 @@
 <translation id="425573743389990240">Vat Cinsinden Pil Boşalma Oranı (Negatif değer, pilin şarj edilmekte olduğu anlamına gelir)</translation>
 <translation id="4256316378292851214">Video Olarak Kay&amp;det...</translation>
 <translation id="4258348331913189841">Dosya sistemleri</translation>
+<translation id="4258786365875464621"><ph name="APP_ORIGIN" /> şu dosyaları açmak istiyor:</translation>
 <translation id="4259388776256904261">Bu işlem biraz zaman alabilir</translation>
 <translation id="4260182282978351200"><ph name="FILE_NAME" /> tehlikeli olabilir. Dosya taranmak üzere Google Gelişmiş Koruma'ya gönderilsin mi? İndirme çubuğu alanına gitmek için Üst Karakter+F6 tuşlarına basın.</translation>
 <translation id="4263223596040212967">Klavye düzeninizi kontrol edip tekrar deneyin.</translation>
@@ -3050,6 +3062,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Göster}other{Tümünü Göster}}</translation>
 <translation id="4289372044984810120">Hesaplarınızı buradan yönetin. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">Genel bakış</translation>
+<translation id="4289732974614035569">PIN seçin</translation>
 <translation id="4290791284969893584">Bir sayfa kapatıldıktan sonra, başladığınız görevler tamamlanmayabilir</translation>
 <translation id="4295072614469448764">Uygulama sizin terminalinizde mevcut. Ayrıca Başlatıcınızda bir simge olabilir.</translation>
 <translation id="4295839147292213505">Telefonunuzu kullanarak bilgisayarınızdan kısa mesaj gönderebilir, internet bağlantınızı paylaşabilir ve <ph name="DEVICE_TYPE" /> cihazınızın kilidini açabilirsiniz.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
@@ -3647,6 +3660,7 @@
 <translation id="4943368462779413526">Futbol</translation>
 <translation id="4943691134276646401">"<ph name="CHROME_EXTENSION_NAME" />" bir seri bağlantı noktasına bağlanmak istiyor</translation>
 <translation id="4944310289250773232">Bu kimlik doğrulama hizmeti <ph name="SAML_DOMAIN" /> tarafından barındırılıyor.</translation>
+<translation id="4945439665401275950">Parmak izini ayarlamak için çocuğunuzun güç düğmesine dokunması gerekir. Çocuğunuzun parmak izi verileri güvenli bir şekilde depolanır ve her zaman <ph name="DEVICE_TYPE" /> cihazınızda tutulur.</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{bir dosya}other{# dosya}}</translation>
 <translation id="495170559598752135">İşlemler</translation>
 <translation id="4953808748584563296">Varsayılan turuncu avatar</translation>
@@ -4767,6 +4781,7 @@
 <translation id="6232017090690406397">Pil</translation>
 <translation id="6232116551750539448"><ph name="NAME" /> bağlantısı kaybedildi</translation>
 <translation id="6233154960150021497">Varsayılan olarak klavye yerine sesi kullan</translation>
+<translation id="6233455992368963267"><ph name="LANGUAGE" /> konuşmalar, işlenmek üzere Google'a gönderilir.</translation>
 <translation id="6234108445915742946">Chrome'un Hizmet Şartları 31 Mart'ta değişiyor</translation>
 <translation id="6234474535228214774">Yükleme bekleniyor</translation>
 <translation id="6237474966939441970">Ekran kalemiyle not alma uygulaması</translation>
@@ -4860,7 +4875,9 @@
 <translation id="6318125393809743217">Politika yapılandırmaları içeren bir policies.json dosyası dahil edin.</translation>
 <translation id="6318407754858604988">İndirme işlemi başladı</translation>
 <translation id="6318944945640833942">Yazıcı algılanamadı. Lütfen yazıcı adresini tekrar girin.</translation>
+<translation id="6319081871916332821"><ph name="LANGUAGE" />, yerel olarak işlenir ve çevrimdışı olarak çalışır.</translation>
 <translation id="6321407676395378991">Ekran koruyucuyu aç</translation>
+<translation id="6322370287306604163">Parmak iziyle kilidi daha hızlı açın</translation>
 <translation id="6322653941595359182">Chromebook'unuzdan kısa mesaj gönderin ve alın</translation>
 <translation id="6324916366299863871">Kısayolu düzenleyin</translation>
 <translation id="6325191661371220117">Otomatik başlatmayı devre dışı bırak</translation>
@@ -5013,6 +5030,7 @@
 <translation id="6497789971060331894">Fare ters kaydırma</translation>
 <translation id="6498249116389603658">&amp;Tüm dilleriniz</translation>
 <translation id="6499143127267478107">Proxy komut dosyasındaki ana makine çözümleniyor...</translation>
+<translation id="6501086852992132091"><ph name="APP_ORIGIN" /> şu dosyayı açmak istiyor:</translation>
 <translation id="650266656685499220">Albüm oluşturmak için Google Fotoğraflar'a gidin</translation>
 <translation id="6503077044568424649">En çok ziyaret edilenler</translation>
 <translation id="650457560773015827">Sol düğme</translation>
@@ -5031,6 +5049,7 @@
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
         <ph name="EVENT_NAME" /></translation>
+<translation id="6519689855001245063">Uygunluk durumu kontrol ediliyor</translation>
 <translation id="6520876759015997832"><ph name="LIST_POSITION" />/<ph name="LIST_SIZE" /> arama sonucu: <ph name="SEARCH_RESULT_TEXT" />. Bölüme gitmek için Enter'a basın.</translation>
 <translation id="6521214596282732365">Online tasarım ve grafik araçlarıyla yüksek kaliteli içerikler oluşturabilmeniz için siteler genellikle sizin yazı tiplerinizi kullanır</translation>
 <translation id="652492607360843641"><ph name="NETWORK_TYPE" /> bir ağa bağlısınız.</translation>
@@ -5254,6 +5273,7 @@
 <translation id="6785518634832172390">PIN en fazla 12 basamaklı olmalıdır</translation>
 <translation id="6786747875388722282">Uzantılar</translation>
 <translation id="6787097042755590313">Diğer Sekmesi</translation>
+<translation id="6787631759192429908">Dosyalar açılsın mı?</translation>
 <translation id="6787839852456839824">Klavye kısayolları</translation>
 <translation id="6788210894632713004">Paketlenmemiş uzantı</translation>
 <translation id="6789592661892473991">Yatay Böl</translation>
@@ -5322,6 +5342,7 @@
 <translation id="6846178040388691741">"<ph name="EXTENSION_NAME" />", <ph name="FILE_NAME" /> dosyasını <ph name="PRINTER_NAME" /> adlı yazıcıda yazdırmak istiyor.</translation>
 <translation id="6847125920277401289">Devam etmek için yer boşaltın</translation>
 <translation id="6848388270925200958">Şu anda, yalnızca bu cihazda kullanılabilen kartlarınız var</translation>
+<translation id="6848716236260083778">Parmak izini ayarlamak için çocuğunuzun parmak izi sensörüne dokunması gerekir. Çocuğunuzun parmak izi verileri güvenli bir şekilde depolanır ve her zaman <ph name="DEVICE_TYPE" /> cihazınızda tutulur.</translation>
 <translation id="6850286078059909152">Metin rengi</translation>
 <translation id="6851181413209322061">Kullanım ve teşhis verilerini gönder. Bu cihaz şu anda teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a gönderiyor. Bu veriler, çocuğunuzun kimliğini tespit etmek için kullanılmaz; sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Bu ayar, cihazın sahibi tarafından zorunlu kılınmıştır. Çocuğunuz için ek Web ve Uygulama Etkinliği açıksa bu veriler çocuğunuzun Google Hesabına kaydedilebilir.</translation>
 <translation id="6851497530878285708">Uygulama Etkinleştirildi</translation>
@@ -5668,6 +5689,7 @@
 <translation id="7243632151880336635">Temizle ve Oturumu Kapat</translation>
 <translation id="7243784282103630670">Linux yeni sürüme geçirilirken bir hata oluştu. Yedeklediğiniz veriler kullanılarak kapsayıcı geri yüklenecek.</translation>
 <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (En iyi)</translation>
+<translation id="7246079707145287765"><ph name="TAB_ORIGIN" /> sekmesini göster</translation>
 <translation id="7246230585855757313">Güvenlik anahtarınızı yeniden takıp tekrar deneyin</translation>
 <translation id="7249777306773517303">Bu cihaz, <ph name="DOMAIN" /> tarafından yönetilmekte olup her defasında oturum açmanızı gerektirmektedir.</translation>
 <translation id="7250616558727237648">Dosya paylaştığınız cihaz yanıt vermedi. Lütfen tekrar deneyin.</translation>
@@ -5714,6 +5736,7 @@
 <translation id="7297726121602187087">Koyu yeşil</translation>
 <translation id="7298195798382681320">Önerilenler</translation>
 <translation id="7299337219131431707">Misafir olarak göz atmayı etkinleştir</translation>
+<translation id="7301470816294041580">"Ok Google, bu hangi şarkı?" veya "Ok Google, ekranımda ne var?" gibi sorular sorabilirsiniz.</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Bu uygulama Chrome'un düzgün çalışmasını engelleyebilir.}other{Bu uygulamalar Chrome'un düzgün çalışmasını engelleyebilir.}}</translation>
 <translation id="7303281435234579599">Hay aksi! Demo modu kurulurken bir hata oluştu.</translation>
 <translation id="7303900363563182677">Bu sitenin panoya kopyalanan metin ve resimleri görmesi engellendi</translation>
@@ -5818,6 +5841,7 @@
 <translation id="740810853557944681">Yazdırma sunucusu ekleyin</translation>
 <translation id="7409549334477097887">Çok büyük</translation>
 <translation id="7409735910987429903">Siteler reklam göstermek için pop-up'lar gönderebilir veya yönlendirmeler kullanarak sizi ziyaret etmek istemeyebileceğiniz web sitelerine yönlendirebilir</translation>
+<translation id="7409854300652085600">Yer işaretleri içe aktarıldı.</translation>
 <translation id="7410344089573941623"><ph name="HOST" /> sitesi kamerama ve mikrofonuma erişmek isterse sor</translation>
 <translation id="741204030948306876">Evet, istiyorum</translation>
 <translation id="7412226954991670867">GPU Belleği</translation>
@@ -5953,6 +5977,8 @@
 <translation id="7552846755917812628">Aşağıdaki ipuçlarını deneyin:</translation>
 <translation id="7553012839257224005">Linux kapsayıcı kontrol ediliyor</translation>
 <translation id="7553242001898162573">Şifrenizi girin</translation>
+<translation id="7553347517399115470">Bu uygulamada şu dosya biçimlerini açarken tekrar sorma:
+<ph name="FILE_FORMATS" /></translation>
 <translation id="755472745191515939">Yöneticiniz bu dile izin vermiyor</translation>
 <translation id="7554791636758816595">Yeni Sekme</translation>
 <translation id="7556033326131260574">Smart Lock, hesabınızı doğrulayamadı. Giriş yapmak için şifrenizi yazın.</translation>
@@ -6565,6 +6591,7 @@
 <translation id="8162307956032783161">Anahtar atayın: Sonraki</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{Sekmeyi Yeni Pencereye Taşı}other{Sekmeleri Yeni Pencereye Taşı}}</translation>
 <translation id="8165997195302308593">Crostini bağlantı noktasını yönlendir</translation>
+<translation id="8166081708154635403">Dosya açılsın mı?</translation>
 <translation id="816704878106051517">{COUNT,plural, =1{bir telefon numarası}other{# telefon numarası}}</translation>
 <translation id="8168435359814927499">İçerik</translation>
 <translation id="8169165065843881617">{NUM_TABS,plural, =1{Okuma Listesine Sekme Ekle}other{Okuma Listesine Sekme Ekle}}</translation>
@@ -6734,6 +6761,7 @@
 <translation id="835238322900896202">Yükleme kaldırma işlemi sırasında bir hata oluştu. Lütfen Terminali kullanarak yüklemeyi kaldırın.</translation>
 <translation id="8352772353338965963">Çoklu oturum açmaya bir hesap ekleyin. Oturum açılmış tüm hesaplara şifresiz erişilebileceği için bu özellik sadece güvenilir hesaplarla kullanılmalıdır.</translation>
 <translation id="8353683614194668312">Şunları yapabilir:</translation>
+<translation id="8354034204605718473">Çocuğunuzun PIN'i eklendi</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8357388086258943206">Linux yüklenirken hata oluştu</translation>
 <translation id="8358685469073206162">Sayfalar geri yüklensin mi?</translation>
@@ -6967,6 +6995,7 @@
 <translation id="8645920082661222035">Tehlikeli etkinlikleri meydana gelmeden önce tahmin ederek sizi uyarır</translation>
 <translation id="8646209145740351125">Senkronizasyonu devre dışı bırak</translation>
 <translation id="864637694230589560">Siteler genellikle son dakika haberleri veya sohbet mesajları konusunda sizi bilgilendirmek için bildirim gönderir</translation>
+<translation id="8647385344110255847">İzin vermeniz halinde çocuğunuz uygulama yüklemek için Google Play'i kullanabilir</translation>
 <translation id="8647834505253004544">Geçerli bir web adresi değil</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> veya <ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">Gece Işığı renk sıcaklığı</translation>
@@ -7110,6 +7139,7 @@
 <translation id="8783834180813871000">Bluetoth eşleme kodunu yazıp Return veya Enter tuşuna basın.</translation>
 <translation id="8784626084144195648">Gruplu Ortalama</translation>
 <translation id="8785622406424941542">Ekran kalemi</translation>
+<translation id="8786824282808281903">Çocuğunuz bu simgeyi gördüğünde, kimlik doğrulamak veya satın alma işlemlerini onaylamak için parmak izi kullanılabilir.</translation>
 <translation id="8787575090331305835">{NUM_TABS,plural, =1{Adsız Grup - 1 Sekme}other{Adsız Grup - # Sekme}}</translation>
 <translation id="8791534160414513928">Göz atma trafiğimle birlikte bir "Do Not Track" isteği gönder</translation>
 <translation id="8792626944327216835">mikrofon</translation>
@@ -7355,6 +7385,7 @@
 <translation id="9031811691986152304">tekrar deneyin</translation>
 <translation id="9033765790910064284">Yine de devam et</translation>
 <translation id="9033857511263905942">&amp;Yapıştır</translation>
+<translation id="903480517321259405">PIN'i tekrar yazın</translation>
 <translation id="9037640663275993951">Cihaza izin verilmiyor</translation>
 <translation id="9037818663270399707">Bağlantınız tüm ağ trafiği için gizli değil</translation>
 <translation id="9037965129289936994">Orijinali Göster</translation>
@@ -7382,6 +7413,10 @@
 Bu işleme birden fazla anahtar atayabilirsiniz</translation>
 <translation id="9064275926664971810">Formları tek bir tıklamayla doldurmak için Otomatik Doldur özelliğini etkinleştirir</translation>
 <translation id="9065203028668620118">Düzenle</translation>
+<translation id="9066394310994446814">Bunu, daha önce Google hizmetlerini kullandığınız için görüyorsunuz. Verilerinizi <ph name="BEGIN_LINK1" />myactivity.google.com<ph name="END_LINK1" /> adresinde görebilir, silebilir ve değiştirebilirsiniz.
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        Google'ın hangi verileri neden topladığıyla ilgili bilgi edinmek için <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" /> sayfasına bakın.</translation>
 <translation id="9066782832737749352">Metin-Konuşma</translation>
 <translation id="9068878141610261315">Desteklenmeyen dosya türü</translation>
 <translation id="9070342919388027491">Sekme sola taşındı</translation>
@@ -7490,6 +7525,7 @@
 <translation id="917510707618656279">Bir site Bluetooth cihazlara erişmek istediğinde sor</translation>
 <translation id="9176476835295860688">Kullanım ve teşhis verilerini gönder. Bu cihaz şu anda teşhis, cihaz ve uygulama kullanımı verilerini otomatik olarak Google'a gönderiyor. Bu veriler, sistem ve uygulama kararlılığı ile diğer özellikleri iyileştirmeye yardımcı olur. Bazı birleştirilmiş veriler, Google uygulamalarına ve iş ortaklarına da (ör. Android geliştiricileri) yardımcı olur. Bu <ph name="BEGIN_LINK1" />ayar<ph name="END_LINK1" />, cihazın sahibi tarafından zorunlu kılınmıştır. Ek Web ve Uygulama Etkinliği açıksa bu veriler Google hesabınıza kaydedilebilir. <ph name="BEGIN_LINK2" />Daha Fazla Bilgi<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Bluetooth cihaz bağlı</translation>
+<translation id="9176817945195089764"><ph name="DOMAIN" />, geçerli bir kuruluş değil. Yöneticinizle iletişime geçin. Yöneticiyseniz g.co/ChromeEnterpriseAccount adresinden kuruluşunuzu kaydedebilirsiniz.</translation>
 <translation id="9179524979050048593">Oturum açma ekranı kullanıcı adı</translation>
 <translation id="9180281769944411366">Bu işlem birkaç dakika sürebilir. Linux kapsayıcısı başlatılıyor.</translation>
 <translation id="9180380851667544951">Site, ekranınızı paylaşabilir</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 193f1aa..a4ecc48 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2969,6 +2969,7 @@
 <translation id="4136203100490971508">Нічний екран вимкнеться автоматично на світанку</translation>
 <translation id="41365691917097717">Якщо продовжити, буде ввімкнено налагодження ADB для створення й тестування додатків для Android. Зауважте, що цією дією ви дозволяєте встановлювати додатки для Android, які не були перевірені Google. Щоб вимкнути цю функцію, доведеться скинути налаштування.</translation>
 <translation id="4138267921960073861">Показувати імена користувачів і фото на екрані входу</translation>
+<translation id="4138598238327913711">Перевірка граматики наразі доступна лише англійською мовою</translation>
 <translation id="413915106327509564"><ph name="WINDOW_TITLE" />: підключено пристрій HID</translation>
 <translation id="4142052906269098341">Розблоковуйте <ph name="DEVICE_TYPE" /> за допомогою телефона. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
 <translation id="4142518881503042940">Збережіть виявлені принтери у своєму профілі або додайте новий. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index a3e8e87..f57012e 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -72,6 +72,7 @@
 <translation id="107278043869924952">使用 PIN 碼和密碼</translation>
 <translation id="1076176485976385390">使用文字游標瀏覽頁面</translation>
 <translation id="1076698951459398590">啟用主題</translation>
+<translation id="1076766328672150609">你的孩子可以使用 PIN 碼來解鎖裝置。</translation>
 <translation id="1076818208934827215">Microsoft Internet Explorer</translation>
 <translation id="1076882167394279216">無法下載<ph name="LANGUAGE" />的拼字檢查字典,請再試一次。</translation>
 <translation id="1079766198702302550">一律封鎖存取攝影機</translation>
@@ -256,6 +257,7 @@
 <translation id="1275718070701477396">已選取</translation>
 <translation id="1276994519141842946">無法解除安裝「<ph name="APP_NAME" />」</translation>
 <translation id="1277020343994096713">新設定的 PIN 碼不能與目前的 PIN 碼相同</translation>
+<translation id="1278859221870828664">檢查 Google Play 應用程式和服務</translation>
 <translation id="127946606521051357">附近的裝置正在分享資料</translation>
 <translation id="1280965841156951489">編輯檔案</translation>
 <translation id="1285320974508926690">一律不翻譯此網站</translation>
@@ -736,6 +738,7 @@
 <translation id="1779652936965200207">請在「<ph name="DEVICE_NAME" />」上輸入以下密碼金鑰:</translation>
 <translation id="177989070088644880">應用程式 (<ph name="ANDROID_PACKAGE_NAME" />)</translation>
 <translation id="1780152987505130652">關閉群組</translation>
+<translation id="1780273119488802839">正在匯入書籤...</translation>
 <translation id="1781291988450150470">目前的 PIN 碼</translation>
 <translation id="1781398670452016618"><ph name="DOMAIN" /> 要求你立即連線到 Wi-Fi 下載更新。</translation>
 <translation id="1781502536226964113">開啟新分頁</translation>
@@ -799,6 +802,7 @@
 <translation id="1834503245783133039">下載失敗:<ph name="FILE_NAME" /></translation>
 <translation id="1835261175655098052">正在升級 Linux</translation>
 <translation id="1838374766361614909">清除搜尋</translation>
+<translation id="1839540115464516994">在「<ph name="LOCATION" />」中顯示</translation>
 <translation id="1841545962859478868">裝置管理員可能會監控下列項目:</translation>
 <translation id="1841616161104323629">沒有裝置記錄。</translation>
 <translation id="1841705068325380214">「<ph name="EXTENSION_NAME" />」已停用</translation>
@@ -1092,6 +1096,8 @@
 <translation id="2154710561487035718">複製網址</translation>
 <translation id="2155772377859296191">螢幕解析度:<ph name="WIDTH" /> x <ph name="HEIGHT" /></translation>
 <translation id="2156294658807918600">Service Worker:<ph name="SCRIPT_URL" /></translation>
+<translation id="2156557113115192526">在這個應用程式中開啟以下檔案格式時不要再詢問:
+<ph name="FILE_FORMAT" /></translation>
 <translation id="2156877321344104010">再次執行安全檢查</translation>
 <translation id="2157474325782140681">如要取得其他功能,請使用這部 Chromebook 的專用座架。</translation>
 <translation id="215753907730220065">結束全螢幕</translation>
@@ -1267,6 +1273,7 @@
 <translation id="2336381494582898602">Powerwash</translation>
 <translation id="2337236196941929873">預先載入 Chrome 認為你可能造訪的網頁。為此,Chrome 可能會使用 Cookie (如果你允許的話),也可能加密網頁並透過 Google 傳送,以便向網站隱藏你的身分。</translation>
 <translation id="2340239562261172947">無法安全下載「<ph name="FILE_NAME" />」</translation>
+<translation id="2342180549977909852">你的孩子可以使用一組數字 (PIN 碼) 來解鎖這部裝置,這組數字與密碼不同。如要稍後再設定 PIN 碼,請前往「設定」。</translation>
 <translation id="2342740338116612727">已新增書籤</translation>
 <translation id="2343747224442182863">將焦點移至這個分頁</translation>
 <translation id="2345723121311404059">將 1 個網頁傳送至「<ph name="PRINTER_NAME" />」列印</translation>
@@ -1727,6 +1734,7 @@
 <translation id="2828375943530438449">從「登入」頁面返回</translation>
 <translation id="2828650939514476812">連線至 Wi-Fi 網路</translation>
 <translation id="2831430281393059038">須支援裝置</translation>
+<translation id="2832124733806557606">你的孩子可以使用 PIN 碼登入裝置,或將裝置解鎖。</translation>
 <translation id="2835547721736623118">語音辨識服務</translation>
 <translation id="2836269494620652131">當機</translation>
 <translation id="2836635946302913370">管理員已禁止使用這個使用者名稱登入。</translation>
@@ -1742,6 +1750,7 @@
 <translation id="2849035674501872372">查詢</translation>
 <translation id="284970761985428403"><ph name="ASCII_NAME" /> (<ph name="UNICODE_NAME" />)</translation>
 <translation id="284975061945174219">清理失敗</translation>
+<translation id="2849767214114481738">已新增 PIN 碼</translation>
 <translation id="2849936225196189499">重要</translation>
 <translation id="2850541429955027218">新增主題</translation>
 <translation id="2851634818064021665">你必須獲得授權,才能造訪這個網站</translation>
@@ -1850,6 +1859,7 @@
 <translation id="2960208947600937804">設定 Linux 時發生錯誤,請與你的系統管理員聯絡。</translation>
 <translation id="296026337010986570">大功告成!有害軟體已移除。如要重新開啟擴充功能,請造訪&lt;a href="chrome://extensions"&gt;擴充功能&lt;/a&gt;。</translation>
 <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (擴充功能已提供)</translation>
+<translation id="2961210776189273067">稱謂</translation>
 <translation id="2961695502793809356">按一下到下一頁,按住可查看記錄</translation>
 <translation id="2962131322798295505">桌布挑選器</translation>
 <translation id="2963151496262057773">下列外掛程式無回應:<ph name="PLUGIN_NAME" /> 您要停止執行嗎?</translation>
@@ -2205,6 +2215,7 @@
 <translation id="338323348408199233">封鎖沒有 VPN 連線的流量</translation>
 <translation id="3385092118218578224"><ph name="DISPLAY_ZOOM" />%</translation>
 <translation id="338583716107319301">分隔線</translation>
+<translation id="3387023983419383865">、</translation>
 <translation id="3387614642886316601">使用進階拼字檢查功能</translation>
 <translation id="3387829698079331264">不得偵測你使用裝置的時間</translation>
 <translation id="3388094447051599208">輸出紙匣幾乎已滿</translation>
@@ -2558,6 +2569,7 @@
 <translation id="3747077776423672805">如要移除應用程式,請依序前往 [設定] &gt; [Google Play 商店] &gt; [管理 Android 偏好設定] &gt; [應用程式] 或 [應用程式管理員],然後輕觸你要解除安裝的應用程式 (你可能需要向左或向右滑動才能找出所需應用程式)。接著,輕觸 [解除安裝] 或 [停用]。</translation>
 <translation id="3747220812138541072">在你輸入文字的同時,系統會顯示內嵌的書寫建議</translation>
 <translation id="3748706263662799310">回報錯誤</translation>
+<translation id="3752253558646317685">讓孩子不斷抬起再放下手指,藉此儲存指紋</translation>
 <translation id="3752582316358263300">確定...</translation>
 <translation id="3753033997400164841">只要儲存一次,即可在所有裝置上使用。</translation>
 <translation id="3755411799582650620">你的 <ph name="PHONE_NAME" /> 現在也可以解鎖這台 <ph name="DEVICE_TYPE" />。</translation>
@@ -3019,6 +3031,7 @@
 <translation id="425573743389990240">電池放電速率 (瓦特) (如為負值,表示電池正在充電)</translation>
 <translation id="4256316378292851214">另存影片(&amp;V)...</translation>
 <translation id="4258348331913189841">檔案系統</translation>
+<translation id="4258786365875464621"><ph name="APP_ORIGIN" /> 想要開啟這些檔案:</translation>
 <translation id="4259388776256904261">請稍待片刻</translation>
 <translation id="4260182282978351200"><ph name="FILE_NAME" /> 可能含有危險內容。要傳送至 Google 進階保護進行掃描嗎?按下 Shift + F6 鍵即可返回下載內容列區域。</translation>
 <translation id="4263223596040212967">請檢查你的鍵盤配置,然後再試一次。</translation>
@@ -3049,6 +3062,7 @@
 <translation id="4287502603002637393">{MUTED_NOTIFICATIONS_COUNT,plural, =1{顯示}other{全部顯示}}</translation>
 <translation id="4289372044984810120">請在這裡管理帳戶。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="4289540628985791613">總覽</translation>
+<translation id="4289732974614035569">選擇 PIN 碼</translation>
 <translation id="4290791284969893584">關閉網頁後,你已啟動的工作可能無法完成</translation>
 <translation id="4295072614469448764">應用程式已出現在你的終端機上,且可能在啟動器中顯示圖示。</translation>
 <translation id="4295839147292213505">你可以從電腦傳送訊息、分享網際網路連線、回覆對話通知,以及使用手機解鎖 <ph name="DEVICE_TYPE" />。<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
@@ -3646,6 +3660,7 @@
 <translation id="4943368462779413526">足球</translation>
 <translation id="4943691134276646401">「<ph name="CHROME_EXTENSION_NAME" />」要求與序列埠連線</translation>
 <translation id="4944310289250773232">這是由 <ph name="SAML_DOMAIN" /> 代管的驗證服務</translation>
+<translation id="4945439665401275950">如要設定指紋,請讓孩子輕觸電源按鈕。孩子的指紋資料會安全儲存在這部 <ph name="DEVICE_TYPE" /> 上,絕不會外洩。</translation>
 <translation id="495164417696120157">{COUNT,plural, =1{1 個檔案}other{# 個檔案}}</translation>
 <translation id="495170559598752135">動作</translation>
 <translation id="4953808748584563296">預設的橘色顯示圖片</translation>
@@ -4765,6 +4780,7 @@
 <translation id="6232017090690406397">電池</translation>
 <translation id="6232116551750539448">「<ph name="NAME" />」的連線已中斷</translation>
 <translation id="6233154960150021497">預設使用語音,而不使用鍵盤</translation>
+<translation id="6233455992368963267">系統會將<ph name="LANGUAGE" />語音內容傳送給 Google 進行處理。</translation>
 <translation id="6234108445915742946">Chrome《服務條款》將於 3 月 31 日變更</translation>
 <translation id="6234474535228214774">等待安裝中</translation>
 <translation id="6237474966939441970">觸控筆做筆記應用程式</translation>
@@ -4858,7 +4874,9 @@
 <translation id="6318125393809743217">納入包含政策設定的 policies.json 檔案。</translation>
 <translation id="6318407754858604988">已開始下載</translation>
 <translation id="6318944945640833942">偵測不到印表機,請再次輸入印表機位址。</translation>
+<translation id="6319081871916332821"><ph name="LANGUAGE" />語音內容會在本機進行處理,並支援離線運作。</translation>
 <translation id="6321407676395378991">開啟螢幕保護程式</translation>
+<translation id="6322370287306604163">使用指紋快速解鎖</translation>
 <translation id="6322653941595359182">透過你的 Chromebook 收發簡訊</translation>
 <translation id="6324916366299863871">編輯捷徑</translation>
 <translation id="6325191661371220117">停用自動啟動功能</translation>
@@ -5011,6 +5029,7 @@
 <translation id="6497789971060331894">滑鼠反向捲動</translation>
 <translation id="6498249116389603658">所選全部語言(&amp;A)</translation>
 <translation id="6499143127267478107">正在解析 Proxy 指令碼主機...</translation>
+<translation id="6501086852992132091"><ph name="APP_ORIGIN" /> 想要開啟這個檔案:</translation>
 <translation id="650266656685499220">如要建立相簿,請前往 Google 相簿</translation>
 <translation id="6503077044568424649">最常造訪</translation>
 <translation id="650457560773015827">左鍵</translation>
@@ -5029,6 +5048,7 @@
 <translation id="6519437681804756269">[<ph name="TIMESTAMP" />]
         <ph name="FILE_INFO" />
         <ph name="EVENT_NAME" /></translation>
+<translation id="6519689855001245063">正在檢查資格</translation>
 <translation id="6520876759015997832">第 <ph name="LIST_POSITION" /> 項搜尋結果,共 <ph name="LIST_SIZE" /> 項:<ph name="SEARCH_RESULT_TEXT" />。按下 Enter 鍵即可前往這個部分。</translation>
 <translation id="6521214596282732365">網站通常會使用你的字型,方便你透過線上的設計及圖像工具建立具有高度一致性的內容</translation>
 <translation id="652492607360843641">你已連上<ph name="NETWORK_TYPE" />網路。</translation>
@@ -5252,6 +5272,7 @@
 <translation id="6785518634832172390">PIN 碼不能超過 12 個數字</translation>
 <translation id="6786747875388722282">擴充功能</translation>
 <translation id="6787097042755590313">其他分頁</translation>
+<translation id="6787631759192429908">要開啟檔案嗎?</translation>
 <translation id="6787839852456839824">鍵盤快速鍵</translation>
 <translation id="6788210894632713004">未封裝擴充功能</translation>
 <translation id="6789592661892473991">水平分割</translation>
@@ -5320,6 +5341,7 @@
 <translation id="6846178040388691741">「<ph name="EXTENSION_NAME" />」要求使用「<ph name="PRINTER_NAME" />」列印「<ph name="FILE_NAME" />」。</translation>
 <translation id="6847125920277401289">釋出空間以便繼續操作</translation>
 <translation id="6848388270925200958">目前你有一些卡片只能在這部裝置上使用</translation>
+<translation id="6848716236260083778">如要設定指紋,請讓孩子輕觸指紋感應器。孩子的指紋資料會安全儲存在這部 <ph name="DEVICE_TYPE" /> 上,絕不會外洩。</translation>
 <translation id="6850286078059909152">文字顏色</translation>
 <translation id="6851181413209322061">傳送使用狀況與診斷資料。這部裝置目前會自動將診斷資料、裝置和應用程式的使用資料傳送給 Google。這些資料將有助於系統和應用程式提高穩定性及做出其他改善,並不會用於識別貴子女的身分。此外,部分匯總資料還能協助 Google 應用程式和合作夥伴 (例如 Android 開發人員) 改善自己的產品和服務。這項設定是由裝置擁有者強制執行。如果貴子女的「其他網路和應用程式活動」設定為開啟,這些資料可能會儲存在他們的 Google 帳戶中。</translation>
 <translation id="6851497530878285708">應用程式已啟用</translation>
@@ -5666,6 +5688,7 @@
 <translation id="7243632151880336635">清除並登出</translation>
 <translation id="7243784282103630670">升級 Linux 時發生錯誤。系統將使用你的備份資料還原容器。</translation>
 <translation id="7245628041916450754"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (最佳)</translation>
+<translation id="7246079707145287765">查看分頁 <ph name="TAB_ORIGIN" /></translation>
 <translation id="7246230585855757313">請重新插入安全金鑰,然後再試一次</translation>
 <translation id="7249777306773517303">這部裝置是由 <ph name="DOMAIN" /> 所管理,你每次使用時都必須登入。</translation>
 <translation id="7250616558727237648">你要分享檔案的目標裝置沒有回應,請再試一次。</translation>
@@ -5712,6 +5735,7 @@
 <translation id="7297726121602187087">深綠色</translation>
 <translation id="7298195798382681320">建議採用</translation>
 <translation id="7299337219131431707">啟用訪客瀏覽</translation>
+<translation id="7301470816294041580">你可以詢問「Ok Google,這是什麼歌?」或「Ok Google,螢幕上顯示的是什麼?」</translation>
 <translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{這個應用程式可能會造成 Chrome 無法正常運作。}other{這些應用程式可能會造成 Chrome 無法正常運作。}}</translation>
 <translation id="7303281435234579599">糟糕!設定示範模式時出了點狀況。</translation>
 <translation id="7303900363563182677">這個網站無法讀取已複製到剪貼簿的文字和圖片</translation>
@@ -5816,6 +5840,7 @@
 <translation id="740810853557944681">新增列印伺服器</translation>
 <translation id="7409549334477097887">特大</translation>
 <translation id="7409735910987429903">網站可能會傳送彈出式視窗以顯示廣告,或是透過重新導向將你帶往不想造訪的網站</translation>
+<translation id="7409854300652085600">已匯入書籤。</translation>
 <translation id="7410344089573941623">當 <ph name="HOST" /> 要求存取攝影機和麥克風時詢問我。</translation>
 <translation id="741204030948306876">是,我要啟用</translation>
 <translation id="7412226954991670867">GPU 記憶體</translation>
@@ -5951,6 +5976,8 @@
 <translation id="7552846755917812628">嘗試按照下列提示操作:</translation>
 <translation id="7553012839257224005">正在檢查 Linux 容器</translation>
 <translation id="7553242001898162573">請輸入您的密碼</translation>
+<translation id="7553347517399115470">在這個應用程式中開啟這些檔案格式時不要再詢問:
+<ph name="FILE_FORMATS" /></translation>
 <translation id="755472745191515939">管理員已禁止使用這種語言</translation>
 <translation id="7554791636758816595">新分頁</translation>
 <translation id="7556033326131260574">Smart Lock 無法驗證您的帳戶,請輸入您的密碼。</translation>
@@ -6565,6 +6592,7 @@
 <translation id="8162307956032783161">指派開關:下一個</translation>
 <translation id="8162984717805647492">{NUM_TABS,plural, =1{將分頁移到新視窗}other{將分頁移到新視窗}}</translation>
 <translation id="8165997195302308593">Crostini 連接埠轉送</translation>
+<translation id="8166081708154635403">要開啟檔案嗎?</translation>
 <translation id="816704878106051517">{COUNT,plural, =1{1 組電話號碼}other{# 組電話號碼}}</translation>
 <translation id="8168435359814927499">內容</translation>
 <translation id="8169165065843881617">{NUM_TABS,plural, =1{將分頁新增至閱讀清單}other{將分頁新增至閱讀清單}}</translation>
@@ -6734,6 +6762,7 @@
 <translation id="835238322900896202">解除安裝時發生錯誤,請透過終端機解除安裝。</translation>
 <translation id="8352772353338965963">新增可多重登入的帳戶。這些帳戶的使用者不需提供密碼即可存取所有已登入的帳戶。因此,建議你只讓信任的帳戶使用這項功能。</translation>
 <translation id="8353683614194668312">可用權限:</translation>
+<translation id="8354034204605718473">已新增孩子的 PIN 碼</translation>
 <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation>
 <translation id="8357388086258943206">安裝 Linux 時發生錯誤</translation>
 <translation id="8358685469073206162">你要還原網頁嗎?</translation>
@@ -6967,6 +6996,7 @@
 <translation id="8645920082661222035">可預測不安全事件,並在這類事件發生前顯示警告訊息</translation>
 <translation id="8646209145740351125">停用同步功能</translation>
 <translation id="864637694230589560">網站通常會傳送通知,讓你掌握最新消息或留意即時通訊訊息</translation>
+<translation id="8647385344110255847">只要你同意,孩子就可以透過 Google Play 安裝應用程式</translation>
 <translation id="8647834505253004544">網址無效</translation>
 <translation id="8648252583955599667"><ph name="GET_HELP_LINK" />或<ph name="RE_SCAN_LINK" /></translation>
 <translation id="8648408795949963811">夜燈模式色溫</translation>
@@ -7110,6 +7140,7 @@
 <translation id="8783834180813871000">輸入藍牙配對碼,然後按下返回鍵或 Enter 鍵。</translation>
 <translation id="8784626084144195648">二進位化平均</translation>
 <translation id="8785622406424941542">觸控筆</translation>
+<translation id="8786824282808281903">如果你的孩子看到這個圖示,就表示他們可以透過指紋進行身分認證或購買交易。</translation>
 <translation id="8787575090331305835">{NUM_TABS,plural, =1{未命名的群組 - 1 個分頁}other{未命名的群組 - # 個分頁}}</translation>
 <translation id="8791534160414513928">將「不追蹤」要求與瀏覽流量一併送出</translation>
 <translation id="8792626944327216835">麥克風</translation>
@@ -7355,6 +7386,7 @@
 <translation id="9031811691986152304">再試一次</translation>
 <translation id="9033765790910064284">仍要繼續</translation>
 <translation id="9033857511263905942">貼上(&amp;P)</translation>
+<translation id="903480517321259405">重新輸入 PIN 碼</translation>
 <translation id="9037640663275993951">不允許使用裝置</translation>
 <translation id="9037818663270399707">你的連線有部分網路流量不屬於私人連線</translation>
 <translation id="9037965129289936994">顯示原文</translation>
@@ -7382,6 +7414,10 @@
 你可以針對該動作指派多個外接切換裝置</translation>
 <translation id="9064275926664971810">啟用自動填入功能,輕鬆一按即可填妥表單</translation>
 <translation id="9065203028668620118">編輯</translation>
+<translation id="9066394310994446814">這是根據你使用 Google 服務的活動記錄而顯示的項目。你可以前往 <ph name="BEGIN_LINK1" />myactivity.google.com<ph name="END_LINK1" /> 查看或刪除自己的資料,也可以變更設定。
+        <ph name="BREAK" />
+        <ph name="BREAK" />
+        如要瞭解 Google 會收集哪些資料,以及收集這些資料的原因,請前往 <ph name="BEGIN_LINK2" />policies.google.com<ph name="END_LINK2" />。</translation>
 <translation id="9066782832737749352">文字轉語音</translation>
 <translation id="9068878141610261315">不支援的檔案類型</translation>
 <translation id="9070342919388027491">分頁已移動到左側</translation>
@@ -7490,6 +7526,7 @@
 <translation id="917510707618656279">網站必須先詢問你,才能存取藍牙裝置</translation>
 <translation id="9176476835295860688">傳送使用狀況與診斷資料。這個裝置目前會自動將診斷資料以及裝置和應用程式的使用狀況資料傳送給 Google。這些資料將有助於系統和應用程式提高穩定性及做出其他改善。部分匯總資料還能夠為 Google 應用程式和合作夥伴 (例如 Android 開發人員) 提供幫助。這項<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />是由裝置擁有者執行。如果你的「其他網路和應用程式活動」設定為開啟,系統可能會將這些資料儲存到你的 Google 帳戶。<ph name="BEGIN_LINK2" />瞭解詳情<ph name="END_LINK2" /></translation>
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - 已連上藍牙裝置</translation>
+<translation id="9176817945195089764"><ph name="DOMAIN" /> 不是有效的機構。請與管理員聯絡。如果你是管理員,可以前往 g.co/ChromeEnterpriseAccount 進行機構設定。</translation>
 <translation id="9179524979050048593">登入畫面上的使用者名稱</translation>
 <translation id="9180281769944411366">正在啟動 Linux 容器,過程可能需要幾分鐘。</translation>
 <translation id="9180380851667544951">網站可以分享你的螢幕畫面</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5e70a1e..40a5667 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2131,6 +2131,7 @@
     "//components/renderer_context_menu",
     "//components/reporting/client:report_queue",
     "//components/reporting/client:report_queue_configuration",
+    "//components/reporting/client:report_queue_factory",
     "//components/reporting/client:report_queue_provider",
     "//components/reporting/encryption:encryption_module",
     "//components/reporting/encryption:encryption_module_interface",
@@ -3609,12 +3610,6 @@
       "enterprise/connectors/connectors_prefs.h",
       "enterprise/connectors/connectors_service.cc",
       "enterprise/connectors/connectors_service.h",
-      "enterprise/connectors/device_trust/device_trust_factory.cc",
-      "enterprise/connectors/device_trust/device_trust_factory.h",
-      "enterprise/connectors/device_trust/device_trust_service.cc",
-      "enterprise/connectors/device_trust/device_trust_service.h",
-      "enterprise/connectors/device_trust/signal_reporter.cc",
-      "enterprise/connectors/device_trust/signal_reporter.h",
       "enterprise/connectors/enterprise_connectors_policy_handler.cc",
       "enterprise/connectors/enterprise_connectors_policy_handler.h",
       "enterprise/connectors/file_system/access_token_fetcher.cc",
@@ -4267,7 +4262,6 @@
       "//chrome/services/media_gallery_util/public/cpp",
       "//components/accuracy_tips",
       "//components/constrained_window",
-      "//components/enterprise/common/proto:device_trust_report_event_proto",
       "//components/feedback",
       "//components/feedback/content:factory",
       "//components/image_fetcher/core",
@@ -5202,8 +5196,6 @@
       "notifications/alert_dispatcher_mac.h",
       "notifications/alert_dispatcher_mojo.h",
       "notifications/alert_dispatcher_mojo.mm",
-      "notifications/alert_dispatcher_xpc.h",
-      "notifications/alert_dispatcher_xpc.mm",
       "notifications/mac_notification_provider_factory.h",
       "notifications/mac_notification_provider_factory.mm",
       "notifications/notification_alert_service_bridge.h",
@@ -5284,6 +5276,24 @@
     deps += [ "//chrome/browser/privacy:traffic_annotation_proto" ]
   }
 
+  if (is_linux || is_win || is_mac || is_chromeos_ash) {
+    sources += [
+      "enterprise/connectors/device_trust/device_trust_factory.cc",
+      "enterprise/connectors/device_trust/device_trust_factory.h",
+      "enterprise/connectors/device_trust/device_trust_service.cc",
+      "enterprise/connectors/device_trust/device_trust_service.h",
+      "enterprise/connectors/device_trust/device_trust_utils.cc",
+      "enterprise/connectors/device_trust/device_trust_utils.h",
+      "enterprise/connectors/device_trust/navigation_throttle.cc",
+      "enterprise/connectors/device_trust/navigation_throttle.h",
+      "enterprise/connectors/device_trust/signal_reporter.cc",
+      "enterprise/connectors/device_trust/signal_reporter.h",
+    ]
+    deps += [
+      "//components/enterprise/common/proto:device_trust_report_event_proto",
+    ]
+  }
+
   if (is_linux || is_win || is_mac) {
     sources += [
       "enterprise/connectors/device_trust/attestation_service.cc",
@@ -5294,8 +5304,6 @@
       "enterprise/connectors/device_trust/device_trust_key_pair.h",
       "enterprise/connectors/device_trust/google_keys.cc",
       "enterprise/connectors/device_trust/google_keys.h",
-      "enterprise/connectors/device_trust/navigation_throttle.cc",
-      "enterprise/connectors/device_trust/navigation_throttle.h",
     ]
     deps += [
       "//chrome/browser/enterprise/connectors/device_trust:attestation_ca_proto",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 43e8348..4d643d0 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -4062,6 +4062,12 @@
      flag_descriptions::kVirtualKeyboardMultipasteName,
      flag_descriptions::kVirtualKeyboardMultipasteDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kVirtualKeyboardMultipaste)},
+    {"enable-cros-virtual-keyboard-multipaste-suggestion",
+     flag_descriptions::kVirtualKeyboardMultipasteSuggestionName,
+     flag_descriptions::kVirtualKeyboardMultipasteSuggestionDescription,
+     kOsCrOS,
+     FEATURE_VALUE_TYPE(
+         chromeos::features::kVirtualKeyboardMultipasteSuggestion)},
     {"enable-experimental-accessibility-dictation-extension",
      flag_descriptions::kExperimentalAccessibilityDictationExtensionName,
      flag_descriptions::kExperimentalAccessibilityDictationExtensionDescription,
@@ -6155,10 +6161,6 @@
      flag_descriptions::kNewMacNotificationAPIName,
      flag_descriptions::kNewMacNotificationAPIDescription, kOsMac,
      FEATURE_VALUE_TYPE(features::kNewMacNotificationAPI)},
-    {"notifications-via-helper-app",
-     flag_descriptions::kNotificationsViaHelperAppName,
-     flag_descriptions::kNotificationsViaHelperAppDescription, kOsMac,
-     FEATURE_VALUE_TYPE(features::kNotificationsViaHelperApp)},
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
index 0d288a22..e9b60a9 100644
--- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
+++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -1604,8 +1604,9 @@
         nullptr, ui::VKEY_ESCAPE, false, false, false, false));
   });
 
-  std::string button_title =
-      features::IsSplitSettingsSyncEnabled() ? "Got it" : "Accept and continue";
+  std::string button_title = features::IsSyncConsentOptionalEnabled()
+                                 ? "Got it"
+                                 : "Accept and continue";
   sm_.ExpectSpeech(button_title);
 
   // Check that profile switched to the active user.
diff --git a/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc b/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc
index 739e091..4a4f149 100644
--- a/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc
+++ b/chrome/browser/ash/account_manager/account_manager_facade_factory_ash.cc
@@ -15,19 +15,19 @@
 #include "chrome/browser/browser_process_platform_part_chromeos.h"
 #include "components/account_manager_core/account_manager_facade_impl.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 
 namespace {
 
-crosapi::AccountManagerAsh* GetAccountManagerAsh(
+crosapi::AccountManagerMojoService* GetAccountManagerMojoService(
     const std::string& profile_path) {
-  crosapi::AccountManagerAsh* account_manager_ash =
+  crosapi::AccountManagerMojoService* account_manager_mojo_service =
       g_browser_process->platform_part()
           ->GetAccountManagerFactory()
-          ->GetAccountManagerAsh(profile_path);
-  DCHECK(account_manager_ash);
+          ->GetAccountManagerMojoService(profile_path);
+  DCHECK(account_manager_mojo_service);
 
-  return account_manager_ash;
+  return account_manager_mojo_service;
 }
 
 }  // namespace
@@ -42,7 +42,7 @@
   auto it = account_manager_facade_map->find(profile_path);
   if (it == account_manager_facade_map->end()) {
     mojo::Remote<crosapi::mojom::AccountManager> remote;
-    GetAccountManagerAsh(profile_path)
+    GetAccountManagerMojoService(profile_path)
         ->BindReceiver(remote.BindNewPipeAndPassReceiver());
     // This is set to a sentinel value which will pass all minimum version
     // checks.
diff --git a/chrome/browser/ash/account_manager/account_manager_util.cc b/chrome/browser/ash/account_manager/account_manager_util.cc
index beaa796..6c188ac 100644
--- a/chrome/browser/ash/account_manager/account_manager_util.cc
+++ b/chrome/browser/ash/account_manager/account_manager_util.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profiles_state.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "components/account_manager_core/chromeos/account_manager_ui.h"
 #include "components/user_manager/user_manager.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -65,12 +65,13 @@
                               chromeos::kDefaultNetworkRetryDelayMS)),
       std::move(initialization_callback));
 
-  crosapi::AccountManagerAsh* account_manager_ash =
+  crosapi::AccountManagerMojoService* account_manager_mojo_service =
       g_browser_process->platform_part()
           ->GetAccountManagerFactory()
-          ->GetAccountManagerAsh(/*profile_path=*/cryptohome_root_dir.value());
+          ->GetAccountManagerMojoService(
+              /*profile_path=*/cryptohome_root_dir.value());
 
-  account_manager_ash->SetAccountManagerUI(
+  account_manager_mojo_service->SetAccountManagerUI(
       std::make_unique<ash::AccountManagerUIImpl>());
 }
 
diff --git a/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc b/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc
index d57a1fc..c143467 100644
--- a/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc
+++ b/chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer.cc
@@ -15,7 +15,7 @@
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
 #include "chrome/browser/ash/arc/enterprise/cert_store/arc_cert_installer_utils.h"
-#include "chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h"
+#include "chrome/browser/ash/policy/remote_commands/user_command_arc_job.h"
 #include "chrome/browser/net/nss_context.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/net/x509_certificate_model_nss.h"
diff --git a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc
index e0e27e53..8c13ff0 100644
--- a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc
+++ b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.cc
@@ -86,26 +86,18 @@
       chromeos::ExternalFileURLToVirtualPath(url));
 }
 
-// Retrieves the file size on the IO thread, and runs the callback on the UI
+// Retrieves file's metadata on the IO thread, and runs the callback on the UI
 // thread.
-void GetFileSizeOnIOThread(scoped_refptr<storage::FileSystemContext> context,
-                           const storage::FileSystemURL& url,
-                           ArcFileSystemBridge::GetFileSizeCallback callback) {
+void GetMetadataOnIOThread(
+    scoped_refptr<storage::FileSystemContext> context,
+    const storage::FileSystemURL& url,
+    int flags,
+    storage::FileSystemOperation::GetMetadataCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   context->operation_runner()->GetMetadata(
-      url,
-      storage::FileSystemOperation::GET_METADATA_FIELD_IS_DIRECTORY |
-          storage::FileSystemOperation::GET_METADATA_FIELD_SIZE,
-      base::BindOnce([](base::File::Error result,
-                        const base::File::Info& file_info) -> int64_t {
-        if (result == base::File::FILE_OK && !file_info.is_directory &&
-            file_info.size >= 0) {
-          return file_info.size;
-        }
-        return -1;
-      })
-          .Then(base::BindPostTask(content::GetUIThreadTaskRunner({}),
-                                   std::move(callback))));
+      url, flags,
+      base::BindPostTask(content::GetUIThreadTaskRunner({}),
+                         std::move(callback)));
 }
 
 // TODO(risan): Write test.
@@ -222,14 +214,53 @@
 
 void ArcFileSystemBridge::GetFileSizeInternal(const GURL& url_decoded,
                                               GetFileSizeCallback callback) {
+  GetMetadata(url_decoded,
+              storage::FileSystemOperation::GET_METADATA_FIELD_IS_DIRECTORY |
+                  storage::FileSystemOperation::GET_METADATA_FIELD_SIZE,
+              base::BindOnce([](base::File::Error result,
+                                const base::File::Info& file_info) -> int64_t {
+                if (result == base::File::FILE_OK && !file_info.is_directory &&
+                    file_info.size >= 0) {
+                  return file_info.size;
+                }
+                return -1;
+              }).Then(std::move(callback)));
+}
+
+void ArcFileSystemBridge::GetLastModified(const GURL& url,
+                                          GetLastModifiedCallback callback) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  GURL url_decoded = DecodeFromChromeContentProviderUrl(url);
+  if (url_decoded.is_empty() || !IsUrlAllowed(url_decoded)) {
+    LOG(ERROR) << "Invalid URL: " << url << " " << url_decoded;
+    std::move(callback).Run(absl::nullopt);
+    return;
+  }
+
+  GetMetadata(url_decoded,
+              storage::FileSystemOperation::GET_METADATA_FIELD_LAST_MODIFIED,
+              base::BindOnce([](base::File::Error result,
+                                const base::File::Info& file_info)
+                                 -> absl::optional<base::Time> {
+                if (result != base::File::FILE_OK) {
+                  return absl::nullopt;
+                }
+                return absl::make_optional(file_info.last_modified);
+              }).Then(std::move(callback)));
+}
+
+void ArcFileSystemBridge::GetMetadata(
+    const GURL& url_decoded,
+    int flags,
+    storage::FileSystemOperation::GetMetadataCallback callback) {
   scoped_refptr<storage::FileSystemContext> context =
       GetFileSystemContext(profile_, url_decoded);
   file_manager::util::FileSystemURLAndHandle file_system_url_and_handle =
       GetFileSystemURL(*context, url_decoded);
   content::GetIOThreadTaskRunner({})->PostTask(
-      FROM_HERE,
-      base::BindOnce(&GetFileSizeOnIOThread, std::move(context),
-                     file_system_url_and_handle.url, std::move(callback)));
+      FROM_HERE, base::BindOnce(&GetMetadataOnIOThread, std::move(context),
+                                file_system_url_and_handle.url, flags,
+                                std::move(callback)));
   // TODO(https://crbug.com/963027): This is currently leaking the isolated
   // file system, the file system should somehow be revoked when the url
   // returned by GetFileSystemURL is no longer needed.
diff --git a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h
index 27c0a8e..c02e963 100644
--- a/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h
+++ b/chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h
@@ -21,6 +21,7 @@
 #include "components/arc/mojom/file_system.mojom-forward.h"
 #include "components/arc/session/connection_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "storage/browser/file_system/file_system_operation.h"
 #include "storage/browser/file_system/watcher_manager.h"
 
 class BrowserContextKeyedServiceFactory;
@@ -85,6 +86,8 @@
                    GetFileNameCallback callback) override;
   void GetFileSize(const std::string& url,
                    GetFileSizeCallback callback) override;
+  void GetLastModified(const GURL& url,
+                       GetLastModifiedCallback callback) override;
   void GetFileType(const std::string& url,
                    GetFileTypeCallback callback) override;
   void OnDocumentChanged(int64_t watcher_id,
@@ -120,6 +123,11 @@
   void GetFileSizeInternal(const GURL& url_decoded,
                            GetFileSizeCallback callback);
 
+  // Used to implement GetFileSize() and GetLastModified().
+  void GetMetadata(const GURL& url_decoded,
+                   int flags,
+                   storage::FileSystemOperation::GetMetadataCallback callback);
+
   // Used to implement GetVirtualFileId().
   void GetVirtualFileIdInternal(const GURL& url_decoded,
                                 GetVirtualFileIdCallback callback);
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 b7e4589..b7276b7 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
@@ -43,6 +43,7 @@
 constexpr char kTestUrl[] = "externalfile:abc:test-filesystem:/hello.txt";
 constexpr char kTestFileType[] = "text/plain";
 constexpr int64_t kTestFileSize = 55;
+constexpr char kTestFileLastModified[] = "Fri, 25 Apr 2014 01:47:53";
 constexpr char kExtensionId[] = "abc";
 constexpr char kFileSystemId[] = "test-filesystem";
 
@@ -180,6 +181,24 @@
   run_loop.Run();
 }
 
+TEST_F(ArcFileSystemBridgeTest, GetLastModified) {
+  base::Time expected;
+  ASSERT_TRUE(base::Time::FromUTCString(kTestFileLastModified, &expected));
+
+  base::RunLoop run_loop;
+  arc_file_system_bridge_->GetLastModified(
+      EncodeToChromeContentProviderUrl(GURL(kTestUrl)),
+      base::BindOnce(
+          [](base::RunLoop* run_loop, const base::Time& expected,
+             const absl::optional<base::Time> result) {
+            ASSERT_TRUE(result.has_value());
+            EXPECT_EQ(expected, result.value());
+            run_loop->Quit();
+          },
+          &run_loop, expected));
+  run_loop.Run();
+}
+
 TEST_F(ArcFileSystemBridgeTest, GetFileType) {
   base::RunLoop run_loop;
   arc_file_system_bridge_->GetFileType(
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc
index 270e8fa7..0b786cc 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.cc
+++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -67,7 +67,7 @@
 #include "chromeos/services/machine_learning/public/cpp/service_connection.h"
 #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/device_service.h"
 #include "content/public/browser/media_session_service.h"
@@ -163,14 +163,14 @@
 void CrosapiAsh::BindAccountManager(
     mojo::PendingReceiver<mojom::AccountManager> receiver) {
   // Given `GetAshProfile()` assumptions, there is 1 and only 1
-  // `AccountManagerAsh` that can/should be contacted - the one attached to the
-  // regular `Profile` in ash-chrome for the active `User`.
-  crosapi::AccountManagerAsh* const account_manager_ash =
+  // `AccountManagerMojoService` that can/should be contacted - the one attached
+  // to the regular `Profile` in ash-chrome for the active `User`.
+  crosapi::AccountManagerMojoService* const account_manager_mojo_service =
       g_browser_process->platform_part()
           ->GetAccountManagerFactory()
-          ->GetAccountManagerAsh(
+          ->GetAccountManagerMojoService(
               /*profile_path=*/GetAshProfile()->GetPath().value());
-  account_manager_ash->BindReceiver(std::move(receiver));
+  account_manager_mojo_service->BindReceiver(std::move(receiver));
 }
 
 void CrosapiAsh::BindBrowserServiceHost(
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
index d9b8eda..3a0f16f 100644
--- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -193,7 +193,7 @@
   screen->OnStateChanged(nullptr);
 
   const std::string button_name =
-      chromeos::features::IsSplitSettingsSyncEnabled()
+      chromeos::features::IsSyncConsentOptionalEnabled()
           ? "acceptButton"
           : "nonSplitSettingsAcceptButton";
   test::OobeJS().ExpectEnabledPath({"sync-consent", button_name});
diff --git a/chrome/browser/ash/login/quick_unlock/auth_token.cc b/chrome/browser/ash/login/quick_unlock/auth_token.cc
index ffba2d0..de85052 100644
--- a/chrome/browser/ash/login/quick_unlock/auth_token.cc
+++ b/chrome/browser/ash/login/quick_unlock/auth_token.cc
@@ -9,7 +9,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/login/auth/user_context.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 
 const int AuthToken::kTokenExpirationSeconds = 5 * 60;
@@ -44,4 +44,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/auth_token.h b/chrome/browser/ash/login/quick_unlock/auth_token.h
index c77b8e6..119d5dd 100644
--- a/chrome/browser/ash/login/quick_unlock/auth_token.h
+++ b/chrome/browser/ash/login/quick_unlock/auth_token.h
@@ -15,7 +15,9 @@
 
 namespace chromeos {
 class UserContext;
+}
 
+namespace ash {
 namespace quick_unlock {
 
 // Security token with an identifyier string and a predetermined life time,
@@ -59,14 +61,14 @@
 };
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 // TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
 // source migration is finished.
-namespace ash {
+namespace chromeos {
 namespace quick_unlock {
-using ::chromeos::quick_unlock::AuthToken;
+using ::ash::quick_unlock::AuthToken;
 }
-}  // namespace ash
+}  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_AUTH_TOKEN_H_
diff --git a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc
index dad7ec3..46d9f2b 100644
--- a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc
+++ b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.cc
@@ -16,9 +16,8 @@
 #include "content/public/browser/device_service.h"
 #include "services/device/public/mojom/fingerprint.mojom.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 namespace {
 
 constexpr char kFingerprintUMAFeatureName[] = "Fingerprint";
@@ -143,4 +142,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h
index 245c782..490d6bd 100644
--- a/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h
+++ b/chrome/browser/ash/login/quick_unlock/fingerprint_storage.h
@@ -13,10 +13,9 @@
 class PrefRegistrySimple;
 class Profile;
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 class FingerprintMetricsReporter;
-class QuickUnlockStorage;
 
 // The result of fingerprint auth attempt on the lock screen. These values are
 // persisted to logs. Entries should not be renumbered and numeric values
@@ -92,14 +91,14 @@
 };
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 // TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
 // source migration is finished.
-namespace ash {
+namespace chromeos {
 namespace quick_unlock {
-using ::chromeos::quick_unlock::FingerprintUnlockResult;
+using ::ash::quick_unlock::FingerprintUnlockResult;
 }
-}  // namespace ash
+}  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_FINGERPRINT_STORAGE_H_
diff --git a/chrome/browser/ash/login/quick_unlock/fingerprint_storage_unittest.cc b/chrome/browser/ash/login/quick_unlock/fingerprint_storage_unittest.cc
index b50794e..3ab4723 100644
--- a/chrome/browser/ash/login/quick_unlock/fingerprint_storage_unittest.cc
+++ b/chrome/browser/ash/login/quick_unlock/fingerprint_storage_unittest.cc
@@ -15,7 +15,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 namespace {
 
@@ -111,4 +111,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/pin_backend.cc b/chrome/browser/ash/login/quick_unlock/pin_backend.cc
index 7cd7ffc6..2747139 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_backend.cc
+++ b/chrome/browser/ash/login/quick_unlock/pin_backend.cc
@@ -26,9 +26,8 @@
 #include "components/user_manager/known_user.h"
 #include "crypto/random.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 namespace {
 
 constexpr int kSaltByteSize = 16;
@@ -219,7 +218,7 @@
   // If the preference is not user controllable, the auto submit dialog
   // isn't available in Settings, so we return a failure.
   if (!PrefService(account_id)
-           ->IsUserModifiablePreference(prefs::kPinUnlockAutosubmitEnabled)) {
+           ->IsUserModifiablePreference(::prefs::kPinUnlockAutosubmitEnabled)) {
     PostResponse(std::move(did_set), false);
     return;
   }
@@ -233,7 +232,7 @@
   } else {
     user_manager::known_user::SetUserPinLength(account_id, 0);
     PrefService(account_id)
-        ->SetBoolean(prefs::kPinUnlockAutosubmitEnabled, false);
+        ->SetBoolean(::prefs::kPinUnlockAutosubmitEnabled, false);
     PostResponse(std::move(did_set), true);
   }
 }
@@ -346,7 +345,7 @@
   // example, via policy. Disabling auto submit through Settings clears it
   // immediately.
   if (!PrefService(account_id)
-           ->GetBoolean(prefs::kPinUnlockAutosubmitEnabled)) {
+           ->GetBoolean(::prefs::kPinUnlockAutosubmitEnabled)) {
     user_manager::known_user::SetUserPinLength(account_id, 0);
     return 0;
   }
@@ -393,14 +392,12 @@
   user_manager::known_user::SetUserPinLength(account_id,
                                              success ? pin_length : 0);
   PrefService(account_id)
-      ->SetBoolean(prefs::kPinUnlockAutosubmitEnabled, success);
+      ->SetBoolean(::prefs::kPinUnlockAutosubmitEnabled, success);
   PostResponse(std::move(result), success);
 }
 
 PrefService* PinBackend::PrefService(const AccountId& account_id) {
-  return chromeos::ProfileHelper::Get()
-      ->GetProfileByAccountId(account_id)
-      ->GetPrefs();
+  return ProfileHelper::Get()->GetProfileByAccountId(account_id)->GetPrefs();
 }
 
 void PinBackend::UpdatePinAutosubmitOnSet(const AccountId& account_id,
@@ -413,7 +410,8 @@
   user_manager::known_user::PinAutosubmitSetBackfillNotNeeded(account_id);
 
   const bool autosubmit_enabled =
-      PrefService(account_id)->GetBoolean(prefs::kPinUnlockAutosubmitEnabled) &&
+      PrefService(account_id)
+          ->GetBoolean(::prefs::kPinUnlockAutosubmitEnabled) &&
       pin_length <= kPinAutosubmitMaxPinLength;
 
   // Explicitly set the user pref to false if the PIN is longer than 12 digits
@@ -421,7 +419,7 @@
   // tries to enable the toggle with a long pin an error is shown.
   if (pin_length > kPinAutosubmitMaxPinLength) {
     PrefService(account_id)
-        ->SetBoolean(prefs::kPinUnlockAutosubmitEnabled, false);
+        ->SetBoolean(::prefs::kPinUnlockAutosubmitEnabled, false);
   }
 
   // Expose the true PIN length if enabled
@@ -433,7 +431,7 @@
   if (!features::IsPinAutosubmitFeatureEnabled())
     return;
   user_manager::known_user::SetUserPinLength(account_id, 0);
-  PrefService(account_id)->ClearPref(prefs::kPinUnlockAutosubmitEnabled);
+  PrefService(account_id)->ClearPref(::prefs::kPinUnlockAutosubmitEnabled);
 }
 
 void PinBackend::UpdatePinAutosubmitOnSuccessfulTryAuth(
@@ -447,7 +445,8 @@
   PinAutosubmitBackfill(account_id, pin_length);
 
   const bool autosubmit_enabled =
-      PrefService(account_id)->GetBoolean(prefs::kPinUnlockAutosubmitEnabled) &&
+      PrefService(account_id)
+          ->GetBoolean(::prefs::kPinUnlockAutosubmitEnabled) &&
       pin_length <= kPinAutosubmitMaxPinLength;
   if (autosubmit_enabled)
     user_manager::known_user::SetUserPinLength(account_id, pin_length);
@@ -467,17 +466,17 @@
 
   // Dont backfill if there is a user value set for the pref.
   if (PrefService(account_id)
-          ->GetUserPrefValue(prefs::kPinUnlockAutosubmitEnabled) != nullptr)
+          ->GetUserPrefValue(::prefs::kPinUnlockAutosubmitEnabled) != nullptr)
     return;
 
   // Disabled if not allowed by policy. Since 'kPinUnlockAutosubmitEnabled'
   // is enabled by default, it is only false when recommended/mandatory by
   // policy.
   if (!PrefService(account_id)
-           ->GetBoolean(prefs::kPinUnlockAutosubmitEnabled)) {
+           ->GetBoolean(::prefs::kPinUnlockAutosubmitEnabled)) {
     RecordUMAHistogram(BackfillEvent::kDisabledDueToPolicy);
     PrefService(account_id)
-        ->SetBoolean(prefs::kPinUnlockAutosubmitEnabled, false);
+        ->SetBoolean(::prefs::kPinUnlockAutosubmitEnabled, false);
     return;
   }
 
@@ -485,13 +484,13 @@
   if (pin_length != kPinAutosubmitBackfillLength) {
     RecordUMAHistogram(BackfillEvent::kDisabledDueToPinLength);
     PrefService(account_id)
-        ->SetBoolean(prefs::kPinUnlockAutosubmitEnabled, false);
+        ->SetBoolean(::prefs::kPinUnlockAutosubmitEnabled, false);
   } else {
     RecordUMAHistogram(BackfillEvent::kEnabled);
     PrefService(account_id)
-        ->SetBoolean(prefs::kPinUnlockAutosubmitEnabled, true);
+        ->SetBoolean(::prefs::kPinUnlockAutosubmitEnabled, true);
   }
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/pin_backend.h b/chrome/browser/ash/login/quick_unlock/pin_backend.h
index 6a14308f..3aeb80b 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_backend.h
+++ b/chrome/browser/ash/login/quick_unlock/pin_backend.h
@@ -15,10 +15,8 @@
 class Profile;
 class ScopedKeepAlive;
 
-namespace chromeos {
-
+namespace ash {
 namespace quick_unlock {
-
 class PinStorageCryptohome;
 
 // Provides high-level access to the user's PIN. The underlying storage can be
@@ -177,14 +175,14 @@
 };
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 // TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
 // source migration is finished.
-namespace ash {
+namespace chromeos {
 namespace quick_unlock {
-using ::chromeos::quick_unlock::PinBackend;
+using ::ash::quick_unlock::PinBackend;
 }
-}  // namespace ash
+}  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_PIN_BACKEND_H_
diff --git a/chrome/browser/ash/login/quick_unlock/pin_migration_browsertest.cc b/chrome/browser/ash/login/quick_unlock/pin_migration_browsertest.cc
index f68ce05..e3f3686 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_migration_browsertest.cc
+++ b/chrome/browser/ash/login/quick_unlock/pin_migration_browsertest.cc
@@ -16,7 +16,7 @@
 #include "content/public/test/browser_test.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 namespace {
 
@@ -100,4 +100,4 @@
 
 }  // namespace
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc
index 5d08165..ace83cc4 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc
+++ b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.cc
@@ -20,23 +20,22 @@
 #include "components/account_id/account_id.h"
 #include "components/user_manager/known_user.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 namespace {
 
 // Read the salt from local state.
 std::string GetSalt(const AccountId& account_id) {
   std::string salt;
-  user_manager::known_user::GetStringPref(
-      account_id, ash::prefs::kQuickUnlockPinSalt, &salt);
+  user_manager::known_user::GetStringPref(account_id,
+                                          prefs::kQuickUnlockPinSalt, &salt);
   return salt;
 }
 
 // Write the salt to local state.
 void WriteSalt(const AccountId& account_id, const std::string& salt) {
-  user_manager::known_user::SetStringPref(
-      account_id, ash::prefs::kQuickUnlockPinSalt, salt);
+  user_manager::known_user::SetStringPref(account_id,
+                                          prefs::kQuickUnlockPinSalt, salt);
 }
 
 template <typename ReplyType>
@@ -290,4 +289,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.h b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.h
index 8042c9d..ca05e48 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.h
+++ b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome.h
@@ -9,15 +9,13 @@
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
 #include "chromeos/login/auth/user_context.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 class AccountId;
 
-namespace chromeos {
-
-class UserContext;
-
+namespace ash {
 namespace quick_unlock {
 
 class PinStorageCryptohome {
@@ -62,6 +60,14 @@
 };
 
 }  // namespace quick_unlock
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
+// source migration is finished.
+namespace chromeos {
+namespace quick_unlock {
+using ::ash::quick_unlock::PinStorageCryptohome;
+}
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_PIN_STORAGE_CRYPTOHOME_H_
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc
index 19704403..c3d30365 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc
+++ b/chrome/browser/ash/login/quick_unlock/pin_storage_cryptohome_unittest.cc
@@ -21,9 +21,8 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 namespace {
 
 constexpr char kDummyPin[] = "123456";
@@ -35,7 +34,7 @@
 
   // testing::Test:
   void SetUp() override {
-    quick_unlock::EnabledForTesting(true);
+    EnabledForTesting(true);
     SystemSaltGetter::Initialize();
     CryptohomeMiscClient::InitializeFake();
     UserDataAuthClient::InitializeFake();
@@ -47,8 +46,8 @@
     UserDataAuthClient::Shutdown();
     CryptohomeMiscClient::Shutdown();
     SystemSaltGetter::Shutdown();
-    quick_unlock::EnabledForTesting(false);
-    quick_unlock::IsFingerprintEnabled(nullptr);
+    EnabledForTesting(false);
+    IsFingerprintEnabled(nullptr);
   }
 
   bool IsPinSet() const {
@@ -227,4 +226,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.cc
index 002476c..04f37c4 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.cc
+++ b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.cc
@@ -10,12 +10,12 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 
 // static
 void PinStoragePrefs::RegisterProfilePrefs(PrefRegistrySimple* registry) {
-  registry->RegisterStringPref(ash::prefs::kQuickUnlockPinSalt, "");
+  registry->RegisterStringPref(prefs::kQuickUnlockPinSalt, "");
   registry->RegisterStringPref(prefs::kQuickUnlockPinSecret, "");
 }
 
@@ -41,17 +41,17 @@
   const std::string secret =
       PinBackend::ComputeSecret(pin, salt, Key::KEY_TYPE_PASSWORD_PLAIN);
 
-  pref_service_->SetString(ash::prefs::kQuickUnlockPinSalt, salt);
+  pref_service_->SetString(prefs::kQuickUnlockPinSalt, salt);
   pref_service_->SetString(prefs::kQuickUnlockPinSecret, secret);
 }
 
 void PinStoragePrefs::RemovePin() {
-  pref_service_->SetString(ash::prefs::kQuickUnlockPinSalt, "");
+  pref_service_->SetString(prefs::kQuickUnlockPinSalt, "");
   pref_service_->SetString(prefs::kQuickUnlockPinSecret, "");
 }
 
 std::string PinStoragePrefs::PinSalt() const {
-  return pref_service_->GetString(ash::prefs::kQuickUnlockPinSalt);
+  return pref_service_->GetString(prefs::kQuickUnlockPinSalt);
 }
 
 std::string PinStoragePrefs::PinSecret() const {
@@ -76,4 +76,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h
index 8a3b35a..9978fd9 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h
+++ b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs.h
@@ -14,7 +14,7 @@
 class PrefRegistrySimple;
 class PrefService;
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 
 class PinStoragePrefs {
@@ -62,6 +62,6 @@
 };
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_PIN_STORAGE_PREFS_H_
diff --git a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs_unittest.cc b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs_unittest.cc
index 48ccf76..c6ec2a1 100644
--- a/chrome/browser/ash/login/quick_unlock/pin_storage_prefs_unittest.cc
+++ b/chrome/browser/ash/login/quick_unlock/pin_storage_prefs_unittest.cc
@@ -14,7 +14,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 namespace {
 
@@ -72,7 +72,7 @@
 TEST_F(PinStoragePrefsUnitTest, PinStorageWritesToPrefs) {
   PrefService* prefs = profile_->GetPrefs();
 
-  EXPECT_EQ("", prefs->GetString(ash::prefs::kQuickUnlockPinSalt));
+  EXPECT_EQ("", prefs->GetString(prefs::kQuickUnlockPinSalt));
   EXPECT_EQ("", prefs->GetString(prefs::kQuickUnlockPinSecret));
 
   PinStoragePrefsTestApi pin_storage_test(PinStoragePrefs());
@@ -80,7 +80,7 @@
   PinStoragePrefs()->SetPin("1111");
   EXPECT_TRUE(PinStoragePrefs()->IsPinSet());
   EXPECT_EQ(pin_storage_test.PinSalt(),
-            prefs->GetString(ash::prefs::kQuickUnlockPinSalt));
+            prefs->GetString(prefs::kQuickUnlockPinSalt));
   EXPECT_EQ(pin_storage_test.PinSecret(),
             prefs->GetString(prefs::kQuickUnlockPinSecret));
   EXPECT_NE("", pin_storage_test.PinSalt());
@@ -88,7 +88,7 @@
 
   PinStoragePrefs()->RemovePin();
   EXPECT_FALSE(PinStoragePrefs()->IsPinSet());
-  EXPECT_EQ("", prefs->GetString(ash::prefs::kQuickUnlockPinSalt));
+  EXPECT_EQ("", prefs->GetString(prefs::kQuickUnlockPinSalt));
   EXPECT_EQ("", prefs->GetString(prefs::kQuickUnlockPinSecret));
 }
 
@@ -156,4 +156,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.cc
index f6854c65..3f83b1c 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.cc
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.cc
@@ -11,7 +11,7 @@
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 
 // static
@@ -59,4 +59,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.h b/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.h
index 073c7b1..07050077 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.h
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_factory.h
@@ -15,9 +15,8 @@
 class User;
 }
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 class QuickUnlockStorage;
 
 // Singleton that owns all QuickUnlockStorage instances and associates them with
@@ -53,14 +52,14 @@
 };
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 // TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
 // source migration is finished.
-namespace ash {
+namespace chromeos {
 namespace quick_unlock {
-using ::chromeos::quick_unlock::QuickUnlockFactory;
+using ::ash::quick_unlock::QuickUnlockFactory;
 }
-}  // namespace ash
+}  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_FACTORY_H_
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.cc
index 4a57719..29ca967c 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.cc
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.cc
@@ -15,9 +15,8 @@
 #include "chrome/browser/profiles/profile.h"
 #include "components/prefs/pref_service.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 namespace {
 
 base::TimeDelta GetStrongAuthTimeout(PrefService* pref_service) {
@@ -101,4 +100,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h
index d5d8801c4..c13f664 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h
@@ -12,7 +12,7 @@
 
 class Profile;
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 class AuthToken;
 class FingerprintStorage;
@@ -97,14 +97,14 @@
 };
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 // TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
 // source migration is finished.
-namespace ash {
+namespace chromeos {
 namespace quick_unlock {
-using ::chromeos::quick_unlock::QuickUnlockStorage;
+using ::ash::quick_unlock::QuickUnlockStorage;
 }
-}  // namespace ash
+}  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_STORAGE_H_
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc
index 85173c9..168c8966 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_storage_unittest.cc
@@ -19,7 +19,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 namespace {
 
@@ -176,4 +176,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
index 08bc29e..b3847b3 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
@@ -23,10 +23,10 @@
 #include "content/public/browser/web_ui_data_source.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
-
 namespace {
+
 // Quick unlock is enabled regardless of flags.
 bool enable_for_testing_ = false;
 bool disable_pin_by_policy_for_testing_ = false;
@@ -222,4 +222,4 @@
 }
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h
index 9cf7858..547894b 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.h
@@ -17,7 +17,7 @@
 class PrefService;
 class Profile;
 
-namespace chromeos {
+namespace ash {
 namespace quick_unlock {
 
 // Enumeration specifying the possible intervals before a strong auth
@@ -82,19 +82,21 @@
 void AddFingerprintResources(content::WebUIDataSource* html_source);
 
 }  // namespace quick_unlock
-}  // namespace chromeos
+}  // namespace ash
 
 // TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos
 // source migration is finished.
-namespace ash {
+namespace chromeos {
 namespace quick_unlock {
-using ::chromeos::quick_unlock::DisablePinByPolicyForTesting;
-using ::chromeos::quick_unlock::EnabledForTesting;
-using ::chromeos::quick_unlock::IsPinDisabledByPolicy;
-using ::chromeos::quick_unlock::IsPinEnabled;
-using ::chromeos::quick_unlock::PasswordConfirmationFrequency;
-using ::chromeos::quick_unlock::PasswordConfirmationFrequencyToTimeDelta;
+using ::ash::quick_unlock::AddFingerprintResources;
+using ::ash::quick_unlock::DisablePinByPolicyForTesting;
+using ::ash::quick_unlock::EnabledForTesting;
+using ::ash::quick_unlock::FingerprintLocation;
+using ::ash::quick_unlock::GetFingerprintLocation;
+using ::ash::quick_unlock::IsFingerprintEnabled;
+using ::ash::quick_unlock::IsPinDisabledByPolicy;
+using ::ash::quick_unlock::IsPinEnabled;
 }  // namespace quick_unlock
-}  // namespace ash
+}  // namespace chromeos
 
 #endif  // CHROME_BROWSER_ASH_LOGIN_QUICK_UNLOCK_QUICK_UNLOCK_UTILS_H_
diff --git a/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc b/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc
index 42a6c06..151a474b 100644
--- a/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc
+++ b/chrome/browser/ash/login/screens/fingerprint_setup_screen.cc
@@ -120,7 +120,7 @@
 }
 
 bool FingerprintSetupScreen::MaybeSkip(WizardContext* context) {
-  if (!chromeos::quick_unlock::IsFingerprintEnabled(
+  if (!quick_unlock::IsFingerprintEnabled(
           ProfileManager::GetActiveUserProfile()) ||
       chrome_user_manager_util::IsPublicSessionOrEphemeralLogin()) {
     exit_callback_.Run(Result::NOT_APPLICABLE);
diff --git a/chrome/browser/ash/login/screens/pin_setup_screen.cc b/chrome/browser/ash/login/screens/pin_setup_screen.cc
index c6626cc..322f76c 100644
--- a/chrome/browser/ash/login/screens/pin_setup_screen.cc
+++ b/chrome/browser/ash/login/screens/pin_setup_screen.cc
@@ -175,11 +175,11 @@
   token_lifetime_timeout_.Start(
       FROM_HERE,
       base::TimeDelta::FromSeconds(
-          chromeos::quick_unlock::AuthToken::kTokenExpirationSeconds),
+          quick_unlock::AuthToken::kTokenExpirationSeconds),
       base::BindOnce(&PinSetupScreen::OnTokenTimedOut,
                      weak_ptr_factory_.GetWeakPtr()));
-  chromeos::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
-      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(
+  quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+      quick_unlock::QuickUnlockFactory::GetForProfile(
           ProfileManager::GetActiveUserProfile());
   quick_unlock_storage->MarkStrongAuth();
   std::unique_ptr<UserContext> user_context =
@@ -198,9 +198,8 @@
   if (view_)
     view_->Show(token, is_child_account);
 
-  chromeos::quick_unlock::PinBackend::GetInstance()->HasLoginSupport(
-      base::BindOnce(&PinSetupScreen::OnHasLoginSupport,
-                     weak_ptr_factory_.GetWeakPtr()));
+  quick_unlock::PinBackend::GetInstance()->HasLoginSupport(base::BindOnce(
+      &PinSetupScreen::OnHasLoginSupport, weak_ptr_factory_.GetWeakPtr()));
 }
 
 void PinSetupScreen::HideImpl() {
diff --git a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
index 7dc3d2e8..c7c6dfa6 100644
--- a/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_browsertest.cc
@@ -144,7 +144,7 @@
 
   void SetUpOnMainThread() override {
     OobeBaseTest::SetUpOnMainThread();
-    if (features::IsSplitSettingsSyncEnabled()) {
+    if (features::IsSyncConsentOptionalEnabled()) {
       expected_consent_ids_ = {
           IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE,
           IDS_LOGIN_SYNC_CONSENT_SCREEN_SUBTITLE,
@@ -339,12 +339,12 @@
   EXPECT_TRUE(settings->IsSyncEverythingEnabled());
 }
 
-// Tests of the consent recorder with SplitSettingsSync disabled. The
-// SplitSettingsSync suite below has its own consent recorder tests.
+// Tests of the consent recorder with SyncConsentOptional disabled. The
+// SyncConsentOptional suite below has its own consent recorder tests.
 class SyncConsentRecorderTest : public SyncConsentTest {
  public:
   SyncConsentRecorderTest() {
-    features_.InitAndDisableFeature(features::kSplitSettingsSync);
+    features_.InitAndDisableFeature(features::kSyncConsentOptional);
   }
   ~SyncConsentRecorderTest() override = default;
 
@@ -458,13 +458,13 @@
                          testing::Bool());
 
 // Additional tests of the consent dialog that are only applicable when the
-// SplitSettingsSync flag enabled.
-class SyncConsentSplitSettingsSyncTest : public SyncConsentTest {
+// SyncConsentOptional flag enabled.
+class SyncConsentOptionalTest : public SyncConsentTest {
  public:
-  SyncConsentSplitSettingsSyncTest() {
-    sync_feature_list_.InitAndEnableFeature(features::kSplitSettingsSync);
+  SyncConsentOptionalTest() {
+    sync_feature_list_.InitAndEnableFeature(features::kSyncConsentOptional);
   }
-  ~SyncConsentSplitSettingsSyncTest() override = default;
+  ~SyncConsentOptionalTest() override = default;
 
  private:
   base::test::ScopedFeatureList sync_feature_list_;
@@ -476,7 +476,7 @@
 #else
 #define MAYBE_DefaultFlow DefaultFlow
 #endif
-IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest, MAYBE_DefaultFlow) {
+IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, MAYBE_DefaultFlow) {
   LoginToSyncConsentScreen();
   WaitForScreenShown();
 
@@ -529,8 +529,11 @@
   EXPECT_THAT(consent_recorded_waiter.consent_description_ids_,
               testing::UnorderedElementsAreArray(expected_ids));
 
-  // OS sync is on.
-  EXPECT_TRUE(prefs->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled));
+  // OS sync should be on if SplitSettingsSync is enabled.
+  // TODO(https://crbug.com/1229582): Migrate to SyncSettingsCategorization and
+  // create an additional test suite when SyncSettingsCategorization enabled.
+  EXPECT_EQ(prefs->GetBoolean(syncer::prefs::kOsSyncFeatureEnabled),
+            features::IsSplitSettingsSyncEnabled());
 
   // Browser sync is on.
   auto* identity_manager = IdentityManagerFactory::GetForProfile(profile);
@@ -564,7 +567,7 @@
 #else
 #define MAYBE_DisableSync DisableSync
 #endif
-IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest, MAYBE_DisableSync) {
+IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, MAYBE_DisableSync) {
   LoginToSyncConsentScreen();
 
   // Wait for content to load.
@@ -606,7 +609,7 @@
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSyncOobeCompleted));
 }
 
-IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest, LanguageSwitch) {
+IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, LanguageSwitch) {
   SwitchLanguage("es");
   LoginToSyncConsentScreen();
 
@@ -626,7 +629,7 @@
       Eq(GetLocalizedConsentString(IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2)));
 }
 
-IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest, LanguageVariant) {
+IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, LanguageVariant) {
   SwitchLanguage("en-GB");
   LoginToSyncConsentScreen();
 
@@ -646,16 +649,18 @@
       Eq(GetLocalizedConsentString(IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT2)));
 }
 
-IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest,
-                       SkippedNotBrandedBuild) {
+IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, SkippedNotBrandedBuild) {
   auto autoreset = WizardController::ForceBrandedBuildForTesting(false);
   LoginToSyncConsentScreen();
   WaitForScreenExit();
   EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NOT_APPLICABLE);
 
-  // OS sync is on.
+  // OS sync should be on if SplitSettingsSync is enabled.
+  // TODO(https://crbug.com/1229582): Migrate to SyncSettingsCategorization and
+  // create an additional test suite when SyncSettingsCategorization enabled.
   syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
+  if (features::IsSplitSettingsSyncEnabled())
+    EXPECT_TRUE(settings->IsOsSyncFeatureEnabled());
 
   // Browser sync is on.
   EXPECT_TRUE(settings->IsSyncRequested());
@@ -672,17 +677,20 @@
                                        true, 1);
 }
 
-IN_PROC_BROWSER_TEST_F(SyncConsentSplitSettingsSyncTest,
-                       SkippedSyncDisabledByPolicy) {
+IN_PROC_BROWSER_TEST_F(SyncConsentOptionalTest, SkippedSyncDisabledByPolicy) {
   SyncConsentScreen* screen = GetSyncConsentScreen();
   screen->SetProfileSyncDisabledByPolicyForTesting(true);
   LoginToSyncConsentScreen();
   WaitForScreenExit();
   EXPECT_EQ(screen_result_.value(), SyncConsentScreen::Result::NOT_APPLICABLE);
 
-  // OS sync is off.
+  // OS sync should be off if SplitSettingsSync is enabled. The function DCHECKs
+  // if SplitSettingsSync is disabled.
+  // TODO(https://crbug.com/1229582): Migrate to SyncSettingsCategorization and
+  // create an additional test suite when SyncSettingsCategorization enabled.
   syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
+  if (features::IsSplitSettingsSyncEnabled())
+    EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
 
   // Browser sync is off.
   EXPECT_FALSE(settings->IsSyncRequested());
@@ -704,7 +712,7 @@
 class SyncConsentActiveDirectoryTest : public OobeBaseTest {
  public:
   SyncConsentActiveDirectoryTest() {
-    sync_feature_list_.InitAndEnableFeature(features::kSplitSettingsSync);
+    sync_feature_list_.InitAndEnableFeature(features::kSyncConsentOptional);
   }
   ~SyncConsentActiveDirectoryTest() override = default;
 
@@ -726,7 +734,8 @@
 
   // OS sync is off.
   syncer::SyncUserSettings* settings = GetSyncUserSettings();
-  EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
+  if (features::IsSplitSettingsSyncEnabled())
+    EXPECT_FALSE(settings->IsOsSyncFeatureEnabled());
 
   // Browser sync is off.
   EXPECT_FALSE(settings->IsSyncRequested());
diff --git a/chrome/browser/ash/login/screens/sync_consent_screen.cc b/chrome/browser/ash/login/screens/sync_consent_screen.cc
index 134b933..83e0727 100644
--- a/chrome/browser/ash/login/screens/sync_consent_screen.cc
+++ b/chrome/browser/ash/login/screens/sync_consent_screen.cc
@@ -183,6 +183,8 @@
   UpdateScreen();
 }
 
+// TODO(https://crbug.com/1229582) Break SplitSettings names into
+// SyncConsentOptional and SyncSettingsCategorization in the whole file.
 void SyncConsentScreen::OnNonSplitSettingsContinue(
     const bool opted_in,
     const bool review_sync,
@@ -203,7 +205,7 @@
     const std::vector<int>& consent_description,
     int consent_confirmation,
     SyncConsentScreenHandler::UserChoice choice) {
-  DCHECK(features::IsSplitSettingsSyncEnabled());
+  DCHECK(features::IsSyncConsentOptionalEnabled());
   if (is_hidden())
     return;
   base::UmaHistogramEnumeration("OOBE.SyncConsentScreen.UserChoice", choice);
@@ -216,7 +218,7 @@
 }
 
 void SyncConsentScreen::UpdateSyncSettings(bool enable_sync) {
-  DCHECK(features::IsSplitSettingsSyncEnabled());
+  DCHECK(features::IsSyncConsentOptionalEnabled());
   // For historical reasons, Chrome OS always has a "sync-consented" primary
   // account in IdentityManager and always has browser sync "enabled". If the
   // user disables the browser sync toggle we disable all browser data types,
@@ -229,7 +231,9 @@
   syncer::SyncService* sync_service = GetSyncService(profile_);
   if (sync_service) {
     syncer::SyncUserSettings* sync_settings = sync_service->GetUserSettings();
-    sync_settings->SetOsSyncFeatureEnabled(enable_sync);
+    // TODO(crbug.com/1229582) Revisit this logic.
+    if (features::IsSplitSettingsSyncEnabled())
+      sync_settings->SetOsSyncFeatureEnabled(enable_sync);
     if (!enable_sync) {
       syncer::UserSelectableTypeSet empty_set;
       sync_settings->SetSelectedTypes(/*sync_everything=*/false, empty_set);
@@ -271,10 +275,11 @@
     case SyncScreenBehavior::kSkipAndEnableNonBrandedBuild:
     case SyncScreenBehavior::kSkipAndEnableEmphemeralUser:
     case SyncScreenBehavior::kSkipAndEnableScreenPolicy:
-      // Prior to SplitSettingsSync, sync is autostarted during SyncService
-      // with "sync everything" toggle off. We need to turn it on here. For
-      // SplitSettingsSync, we also need to update other sync-related flags.
-      if (features::IsSplitSettingsSyncEnabled()) {
+      // Prior to SyncConsentOptional, sync is autostarted during SyncService
+      // creation with "sync everything" toggle off. We need to turn it on here.
+      // For SyncConsentOptional, we also need to update other sync-related
+      // flags.
+      if (features::IsSyncConsentOptionalEnabled()) {
         UpdateSyncSettings(/*enable_sync=*/true);
       } else {
         SetSyncEverythingEnabled(/*enabled=*/true);
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index bcfa22d3..a9380b35 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -1406,7 +1406,7 @@
         accounts_mutator->SeedAccountInfo(gaia_id, user->GetDisplayEmail());
 
     // 3. Set it as the Primary Account.
-    if (features::IsSplitSettingsSyncEnabled()) {
+    if (features::IsSyncConsentOptionalEnabled()) {
       // In theory this should only be done for new profiles. However, if user
       // profile prefs failed to save or the prefs are corrupted by a crash then
       // the IdentityManager will start up without a primary account. See test
@@ -1423,7 +1423,7 @@
           gaia_id);
     } else {
       // Set a primary account here because the profile might have been
-      // created with the feature SplitSettingsSync enabled. Then the
+      // created with the feature SyncConsentOptional enabled. Then the
       // profile might only have an unconsented primary account.
       identity_manager->GetPrimaryAccountMutator()->SetPrimaryAccount(
           account_id, ConsentLevel::kSync);
diff --git a/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc b/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc
index 41dcec1..e2eff6c 100644
--- a/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc
+++ b/chrome/browser/ash/policy/core/browser_policy_connector_chromeos.cc
@@ -53,10 +53,10 @@
 #include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider.h"
 #include "chrome/browser/ash/policy/invalidation/affiliated_invalidation_service_provider_impl.h"
 #include "chrome/browser/ash/policy/networking/device_network_configuration_updater.h"
+#include "chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
 #include "chrome/browser/ash/settings/device_settings_service.h"
 #include "chrome/browser/ash/system/timezone_util.h"
-#include "chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h"
 #include "chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_reboot_handler.h"
 #include "chrome/browser/chromeos/policy/scheduled_task_handler/device_scheduled_update_checker.h"
 #include "chrome/browser/chromeos/policy/scheduled_task_handler/scheduled_task_executor_impl.h"
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_chromeos.cc b/chrome/browser/ash/policy/core/device_cloud_policy_manager_chromeos.cc
index c3993e0..653f42e 100644
--- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_chromeos.cc
@@ -28,8 +28,8 @@
 #include "chrome/browser/ash/login/enrollment/auto_enrollment_controller.h"
 #include "chrome/browser/ash/policy/core/device_cloud_policy_store_chromeos.h"
 #include "chrome/browser/ash/policy/core/policy_pref_names.h"
+#include "chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h"
 #include "chrome/browser/chromeos/policy/rsu/lookup_key_uploader.h"
 #include "chrome/browser/chromeos/policy/server_backed_state/server_backed_state_keys_broker.h"
 #include "chrome/browser/chromeos/policy/status_collector/device_status_collector.h"
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc b/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc
index 51cdd22a..5240fb1 100644
--- a/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/ash/policy/core/user_cloud_policy_manager_chromeos.cc
@@ -28,8 +28,8 @@
 #include "chrome/browser/ash/login/users/chrome_user_manager_impl.h"
 #include "chrome/browser/ash/policy/core/policy_oauth2_token_fetcher.h"
 #include "chrome/browser/ash/policy/login/wildcard_login_checker.h"
+#include "chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h"
 #include "chrome/browser/chromeos/policy/reporting/arc_app_install_event_log_uploader.h"
 #include "chrome/browser/chromeos/policy/reporting/extension_install_event_log_uploader.h"
 #include "chrome/browser/enterprise/reporting/report_scheduler_desktop.h"
diff --git a/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc b/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc
index 446fd5c..15e18e5 100644
--- a/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc
+++ b/chrome/browser/ash/policy/dlp/data_transfer_dlp_controller_browsertest.cc
@@ -134,7 +134,7 @@
 class MockDlpRulesManager : public DlpRulesManagerImpl {
  public:
   explicit MockDlpRulesManager(PrefService* local_state)
-      : DlpRulesManagerImpl(local_state) {}
+      : DlpRulesManagerImpl(local_state, /* dm_token_value= */ "") {}
   ~MockDlpRulesManager() override = default;
 };
 
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.cc b/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.cc
index fbe8e7aa..09044d1 100644
--- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.cc
@@ -6,21 +6,19 @@
 
 #include "base/bind_post_task.h"
 #include "base/no_destructor.h"
+#include "base/strings/string_piece.h"
 #include "chrome/browser/ash/policy/dlp/dlp_reporting_manager.h"
+#include "chrome/browser/ash/policy/dlp/dlp_rules_manager.h"
 #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/prefs/pref_service.h"
-#include "components/reporting/client/report_queue_configuration.h"
-#include "components/reporting/util/backoff_settings.h"
 #include "components/user_manager/user_manager.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/base/backoff_entry.h"
 
 namespace policy {
 
@@ -68,61 +66,12 @@
   if (!local_state)
     return nullptr;
 
-  DlpRulesManagerImpl* manager = new DlpRulesManagerImpl(local_state);
-  if (manager->reporting_manager_)
-    BuildReportingQueue(profile,
-                        manager->reporting_manager_->GetReportQueueSetter());
-  return manager;
-}
-
-// static
-void DlpRulesManagerFactory::BuildReportingQueue(Profile* profile,
-                                                 SuccessCallback success_cb) {
   auto dm_token = GetDMToken(profile, /*only_affiliated=*/false);
   if (!dm_token.is_valid()) {
     LOG(ERROR) << "DlpReporting has invalid DMToken. Reporting disabled.";
-    return;
+    return nullptr;
   }
 
-  auto config_result = reporting::ReportQueueConfiguration::Create(
-      dm_token.value(), reporting::Destination::DLP_EVENTS,
-      base::BindRepeating([]() { return reporting::Status::StatusOK(); }));
-  if (!config_result.ok()) {
-    LOG(ERROR) << "ReportQueueConfiguration must be valid";
-    return;
-  }
-
-  // Asynchronously create and try to set ReportQueue.
-  auto try_set_cb = CreateTrySetCallback(dm_token, std::move(success_cb),
-                                         reporting::GetBackoffEntry());
-  base::ThreadPool::PostTask(
-      FROM_HERE, base::BindOnce(reporting::ReportQueueProvider::CreateQueue,
-                                std::move(config_result.ValueOrDie()),
-                                std::move(try_set_cb)));
+  return new DlpRulesManagerImpl(local_state, dm_token.value());
 }
-
-// static
-void DlpRulesManagerFactory::TrySetReportQueue(
-    SuccessCallback success_cb,
-    reporting::StatusOr<std::unique_ptr<reporting::ReportQueue>>
-        report_queue_result) {
-  if (!report_queue_result.ok()) {
-    LOG(ERROR) << "ReportQueue could not be created";
-    return;
-  }
-  std::move(success_cb).Run(std::move(report_queue_result.ValueOrDie()));
-}
-
-// static
-reporting::ReportQueueProvider::CreateReportQueueCallback
-DlpRulesManagerFactory::CreateTrySetCallback(
-    policy::DMToken dm_token,
-    SuccessCallback success_cb,
-    std::unique_ptr<net::BackoffEntry> backoff_entry) {
-  return base::BindPostTask(
-      content::GetUIThreadTaskRunner({}),
-      base::BindOnce(&DlpRulesManagerFactory::TrySetReportQueue,
-                     std::move(success_cb)));
-}
-
 }  // namespace policy
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h b/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h
index 8983673..4c9c92b 100644
--- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h
+++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h
@@ -5,33 +5,16 @@
 #ifndef CHROME_BROWSER_ASH_POLICY_DLP_DLP_RULES_MANAGER_FACTORY_H_
 #define CHROME_BROWSER_ASH_POLICY_DLP_DLP_RULES_MANAGER_FACTORY_H_
 
-#include "base/callback_helpers.h"
 #include "base/no_destructor.h"
-#include "chrome/browser/ash/policy/dlp/dlp_rules_manager.h"
-#include "chrome/browser/policy/dm_token_utils.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-#include "components/reporting/client/report_queue_provider.h"
-#include "components/reporting/util/status.h"
-
-class Profile;
-
-namespace net {
-class BackoffEntry;
-}  // namespace net
-
-namespace reporting {
-class ReportQueue;
-}  // namespace reporting
 
 namespace policy {
+class DlpRulesManager;
 
 // Initializes an instance of DlpRulesManager when a primary managed profile is
 // being created, e.g. when managed user signs in.
 class DlpRulesManagerFactory : public BrowserContextKeyedServiceFactory {
  public:
-  using SuccessCallback =
-      base::OnceCallback<void(std::unique_ptr<reporting::ReportQueue>)>;
-
   static DlpRulesManagerFactory* GetInstance();
   // Returns nullptr if there is no primary profile, e.g. the session is not
   // started.
@@ -47,18 +30,6 @@
   bool ServiceIsCreatedWithBrowserContext() const override;
   KeyedService* BuildServiceInstanceFor(
       content::BrowserContext* context) const override;
-
-  // TODO(1198500, marcgrimme, refactor into it's own class and share code
-  // with PrintJobReportingServiceFactory.
-  static void BuildReportingQueue(Profile* profile, SuccessCallback success_cb);
-  static void TrySetReportQueue(
-      SuccessCallback success_cb,
-      reporting::StatusOr<std::unique_ptr<reporting::ReportQueue>>
-          report_queue_result);
-  static reporting::ReportQueueProvider::CreateReportQueueCallback
-  CreateTrySetCallback(policy::DMToken dm_token,
-                       SuccessCallback success_cb,
-                       std::unique_ptr<net::BackoffEntry> backoff_entry);
 };
 
 }  // namespace policy
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.cc b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.cc
index a5b4e83..5c94664 100644
--- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.cc
@@ -14,6 +14,7 @@
 #include "base/containers/contains.h"
 #include "base/containers/fixed_flat_map.h"
 #include "base/feature_list.h"
+#include "base/strings/string_piece.h"
 #include "base/values.h"
 #include "chrome/browser/ash/policy/dlp/data_transfer_dlp_controller.h"
 #include "chrome/browser/ash/policy/dlp/dlp_histogram_helper.h"
@@ -27,6 +28,7 @@
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
+#include "components/reporting/client/report_queue_factory.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 #include "url/origin.h"
@@ -336,7 +338,8 @@
   return level_url_pair.first;
 }
 
-DlpRulesManagerImpl::DlpRulesManagerImpl(PrefService* local_state) {
+DlpRulesManagerImpl::DlpRulesManagerImpl(PrefService* local_state,
+                                         base::StringPiece dm_token_value) {
   pref_change_registrar_.Init(local_state);
   pref_change_registrar_.Add(
       policy_prefs::kDlpRulesList,
@@ -344,8 +347,12 @@
                           base::Unretained(this)));
   OnPolicyUpdate();
 
-  if (IsReportingEnabled())
-    reporting_manager_ = std::make_unique<DlpReportingManager>();
+  if (!IsReportingEnabled())
+    return;
+  reporting_manager_ = std::make_unique<DlpReportingManager>();
+  reporting::ReportQueueFactory::Create(
+      dm_token_value, reporting::Destination::DLP_EVENTS,
+      reporting_manager_->GetReportQueueSetter());
 }
 
 bool DlpRulesManagerImpl::IsReportingEnabled() const {
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.h b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.h
index 6dfe5f1..e9a0256 100644
--- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.h
+++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl.h
@@ -11,6 +11,7 @@
 #include <memory>
 #include <set>
 
+#include "base/strings/string_piece_forward.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/url_matcher/url_matcher.h"
 
@@ -56,7 +57,8 @@
  protected:
   friend class DlpRulesManagerFactory;
 
-  explicit DlpRulesManagerImpl(PrefService* local_state);
+  DlpRulesManagerImpl(PrefService* local_state,
+                      base::StringPiece dm_token_value);
 
  private:
   void OnPolicyUpdate();
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc
index a8ef870..4e343b5 100644
--- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_browsertest.cc
@@ -6,6 +6,7 @@
 #include "base/values.h"
 #include "chrome/browser/ash/policy/core/user_policy_test_helper.h"
 #include "chrome/browser/ash/policy/dlp/dlp_policy_constants.h"
+#include "chrome/browser/ash/policy/dlp/dlp_rules_manager.h"
 #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_factory.h"
 #include "chrome/browser/ash/policy/dlp/dlp_rules_manager_test_utils.h"
 #include "chrome/browser/ash/policy/login/login_policy_test_base.h"
diff --git a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_unittest.cc b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_unittest.cc
index 74bed70..69ef680 100644
--- a/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_unittest.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_rules_manager_impl_unittest.cc
@@ -47,7 +47,7 @@
 class MockDlpRulesManager : public DlpRulesManagerImpl {
  public:
   explicit MockDlpRulesManager(PrefService* local_state)
-      : DlpRulesManagerImpl(local_state) {}
+      : DlpRulesManagerImpl(local_state, /* dm_token_value= */ "") {}
 };
 
 }  // namespace
diff --git a/chrome/browser/chromeos/policy/remote_commands/OWNERS b/chrome/browser/ash/policy/remote_commands/OWNERS
similarity index 100%
rename from chrome/browser/chromeos/policy/remote_commands/OWNERS
rename to chrome/browser/ash/policy/remote_commands/OWNERS
diff --git a/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.cc b/chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.cc
similarity index 93%
rename from chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.cc
rename to chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.cc
index 974a250..f53c032 100644
--- a/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.cc
+++ b/chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h"
+#include "chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.h"
 
 #include <memory>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h b/chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.h
similarity index 82%
rename from chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h
rename to chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.h
index f013bc8..7fd033e 100644
--- a/chrome/browser/chromeos/policy/remote_commands/affiliated_remote_commands_invalidator.h
+++ b/chrome/browser/ash/policy/remote_commands/affiliated_remote_commands_invalidator.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_AFFILIATED_REMOTE_COMMANDS_INVALIDATOR_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_AFFILIATED_REMOTE_COMMANDS_INVALIDATOR_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_AFFILIATED_REMOTE_COMMANDS_INVALIDATOR_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_AFFILIATED_REMOTE_COMMANDS_INVALIDATOR_H_
 
 #include <memory>
 
@@ -44,4 +44,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_AFFILIATED_REMOTE_COMMANDS_INVALIDATOR_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_AFFILIATED_REMOTE_COMMANDS_INVALIDATOR_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc b/chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc
rename to chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc
index 97e2d6f..970aeed 100644
--- a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd_host_delegate.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.h"
+#include "chrome/browser/ash/policy/remote_commands/crd_host_delegate.h"
 
 #include "base/bind.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "chrome/browser/ash/policy/remote_commands/crd_logging.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/policy/remote_commands/crd_logging.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/api/messaging/native_message_host.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.h b/chrome/browser/ash/policy/remote_commands/crd_host_delegate.h
similarity index 90%
rename from chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.h
rename to chrome/browser/ash/policy/remote_commands/crd_host_delegate.h
index be72b826..d09364fd 100644
--- a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.h
+++ b/chrome/browser/ash/policy/remote_commands/crd_host_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 CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_CRD_HOST_DELEGATE_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_CRD_HOST_DELEGATE_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_HOST_DELEGATE_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_HOST_DELEGATE_H_
 
 #include <memory>
 #include <string>
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h"
 #include "extensions/browser/api/messaging/native_message_host.h"
 
 namespace policy {
@@ -92,4 +92,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_CRD_HOST_DELEGATE_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_HOST_DELEGATE_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate_unittest.cc b/chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/crd_host_delegate_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc
index 7b45e03..1278ccf 100644
--- a/chrome/browser/chromeos/policy/remote_commands/crd_host_delegate_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd_host_delegate_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.h"
+#include "chrome/browser/ash/policy/remote_commands/crd_host_delegate.h"
 
 #include "base/bind.h"
 #include "base/json/json_reader.h"
@@ -14,7 +14,7 @@
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/policy/remote_commands/future_value.h"
+#include "chrome/browser/ash/policy/remote_commands/future_value.h"
 #include "remoting/host/it2me/it2me_constants.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/crd_logging.h b/chrome/browser/ash/policy/remote_commands/crd_logging.h
similarity index 62%
rename from chrome/browser/chromeos/policy/remote_commands/crd_logging.h
rename to chrome/browser/ash/policy/remote_commands/crd_logging.h
index 7e8e22d1..aaf9092 100644
--- a/chrome/browser/chromeos/policy/remote_commands/crd_logging.h
+++ b/chrome/browser/ash/policy/remote_commands/crd_logging.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_CRD_LOGGING_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_CRD_LOGGING_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_LOGGING_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_LOGGING_H_
 
 #include "base/logging.h"
 
@@ -11,4 +11,4 @@
 #define CRD_DVLOG(level) DVLOG(level) << "CRD: "
 #define CRD_LOG(level) LOG(level) << "CRD: "
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_CRD_LOGGING_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_CRD_LOGGING_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.cc
index a169ae3..4062f84 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.h"
 
 #include <memory>
 #include <utility>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h b/chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.h
similarity index 73%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.h
index 79b73e7..1882d0a4 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
 
 #include "base/macros.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
@@ -29,4 +29,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_FETCH_STATUS_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.cc
index 604934d..e6d67329 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.h"
 
 #include <memory>
 #include <string>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.h b/chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.h
similarity index 83%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.h
index 9f2976c..9ec27e7 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_AVAILABLE_ROUTINES_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_AVAILABLE_ROUTINES_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_AVAILABLE_ROUTINES_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_AVAILABLE_ROUTINES_JOB_H_
 
 #include <vector>
 
@@ -47,4 +47,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_AVAILABLE_ROUTINES_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_AVAILABLE_ROUTINES_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job_unittest.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job_unittest.cc
index 23c7139..66ceec2 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.h"
 
 #include <memory>
 #include <vector>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.cc
index f43a4528..4df76c5 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.h"
 
 #include <memory>
 #include <string>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.h b/chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.h
similarity index 86%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.h
index bafbdd9..9e85cfa 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_ROUTINE_UPDATE_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_ROUTINE_UPDATE_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_ROUTINE_UPDATE_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_ROUTINE_UPDATE_JOB_H_
 
 #include <cstdint>
 
@@ -54,4 +54,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_ROUTINE_UPDATE_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_GET_ROUTINE_UPDATE_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job_unittest.cc
similarity index 99%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job_unittest.cc
index 1c5b2de..cad5194 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.h"
 
 #include <limits>
 #include <memory>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_reboot_job.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_reboot_job.cc
index 03c98ce..de1ecea3 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_reboot_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_reboot_job.h"
 
 #include <algorithm>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h b/chrome/browser/ash/policy/remote_commands/device_command_reboot_job.h
similarity index 78%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_reboot_job.h
index 5075013..b987de9 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_reboot_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REBOOT_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REBOOT_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REBOOT_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REBOOT_JOB_H_
 
 #include "base/macros.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
@@ -37,4 +37,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REBOOT_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REBOOT_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc
similarity index 95%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc
index b9b8710..6cba74e 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.h"
 
 #include <algorithm>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.h b/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.h
similarity index 82%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.h
index a96db90..9a05556 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REFRESH_MACHINE_CERTIFICATE_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REFRESH_MACHINE_CERTIFICATE_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REFRESH_MACHINE_CERTIFICATE_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REFRESH_MACHINE_CERTIFICATE_JOB_H_
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -47,4 +47,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REFRESH_MACHINE_CERTIFICATE_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REFRESH_MACHINE_CERTIFICATE_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.cc
index 0248274..1a9d335 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.h"
 
 #include <utility>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.h b/chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.h
similarity index 76%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.h
index 5bb3453..b2f3264 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REMOTE_POWERWASH_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REMOTE_POWERWASH_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REMOTE_POWERWASH_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REMOTE_POWERWASH_JOB_H_
 
 #include "base/macros.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
@@ -34,4 +34,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REMOTE_POWERWASH_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_REMOTE_POWERWASH_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc
index e9637e4..b2cc956 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.h"
 
 #include <memory>
 #include <utility>
@@ -14,7 +14,7 @@
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h"
+#include "chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "components/policy/core/common/cloud/mock_cloud_policy_client.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.cc
similarity index 99%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.cc
index 56a1cac..9f6dfdf46 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.h"
 
 #include <memory>
 #include <string>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.h b/chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.h
similarity index 88%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.h
index d1f4bc6..3b53fde 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_RUN_ROUTINE_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_RUN_ROUTINE_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_RUN_ROUTINE_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_RUN_ROUTINE_JOB_H_
 
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
@@ -54,4 +54,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_RUN_ROUTINE_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_RUN_ROUTINE_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_run_routine_job_unittest.cc
similarity index 99%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_run_routine_job_unittest.cc
index 2964a84..8518fe3 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_run_routine_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.h"
 
 #include <limits>
 #include <memory>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.cc
index b4f93007b..516f6ff5 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h"
 
 #include <fstream>
 #include <utility>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h
similarity index 94%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h
index b2e0296..d65ea34 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SCREENSHOT_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SCREENSHOT_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SCREENSHOT_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SCREENSHOT_JOB_H_
 
 #include <stddef.h>
 
@@ -139,4 +139,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SCREENSHOT_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SCREENSHOT_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc
index 7028322..fdff62b 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_screenshot_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h"
 
 #include <map>
 #include <utility>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.cc
similarity index 95%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.cc
index c37f3711..c2ef424 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.h"
 
 #include <memory>
 #include <utility>
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.h
similarity index 77%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.h
index ad7e4e5..9c847b5 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SET_VOLUME_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SET_VOLUME_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SET_VOLUME_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SET_VOLUME_JOB_H_
 
 #include <string>
 
@@ -35,4 +35,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SET_VOLUME_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_SET_VOLUME_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_unittest.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_unittest.cc
index b1e4281..2904813f 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_set_volume_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.h"
 
 #include <memory>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc
similarity index 98%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc
index 8f99edce..19eb920 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h"
 
 #include <memory>
 #include <utility>
@@ -16,7 +16,7 @@
 #include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h"
 #include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
 #include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h"
-#include "chrome/browser/chromeos/policy/remote_commands/crd_logging.h"
+#include "chrome/browser/ash/policy/remote_commands/crd_logging.h"
 #include "chrome/browser/device_identity/device_oauth2_token_service.h"
 #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
 #include "components/policy/core/common/features.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h
similarity index 94%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h
index 6550c13..da5b576 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_START_CRD_SESSION_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_START_CRD_SESSION_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_START_CRD_SESSION_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_START_CRD_SESSION_JOB_H_
 
 #include <string>
 
@@ -164,4 +164,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_START_CRD_SESSION_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_START_CRD_SESSION_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc
similarity index 99%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc
index f4e8bf71..f9c712a 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_unittest.cc
@@ -2,12 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h"
-#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
-#include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h"
-#include "chrome/browser/ash/settings/device_settings_test_helper.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h"
 
 #include <map>
 #include <utility>
@@ -18,11 +13,16 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "chrome/browser/chromeos/policy/remote_commands/future_value.h"
+#include "chrome/browser/ash/app_mode/arc/arc_kiosk_app_manager.h"
+#include "chrome/browser/ash/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h"
+#include "chrome/browser/ash/policy/remote_commands/future_value.h"
+#include "chrome/browser/ash/settings/device_settings_test_helper.h"
 #include "chrome/browser/device_identity/device_oauth2_token_service.h"
 #include "chrome/browser/device_identity/device_oauth2_token_service_factory.h"
 #include "chrome/browser/prefs/browser_prefs.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc b/chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.cc
index 135c061..835f338 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.h"
 
 #include "base/bind.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h b/chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.h
similarity index 77%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h
rename to chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.h
index 16d8774..a6da9cd 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h
+++ b/chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_WIPE_USERS_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_WIPE_USERS_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_WIPE_USERS_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_WIPE_USERS_JOB_H_
 
 #include "base/macros.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
@@ -34,4 +34,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_WIPE_USERS_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMAND_WIPE_USERS_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job_unittest.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job_unittest.cc
index 93dbbc7..e7d84ff 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.h"
 
 #include <memory>
 #include <utility>
@@ -16,9 +16,9 @@
 #include "base/task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
+#include "chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h"
 #include "chrome/browser/ash/system/user_removal_manager.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc b/chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.cc
similarity index 69%
rename from chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc
rename to chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.cc
index fb0a9cd..a9a28af 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.cc
+++ b/chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.cc
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h"
+#include "chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h"
 
 #include "base/notreached.h"
 #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_chromeos.h"
-#include "chrome/browser/chromeos/policy/remote_commands/crd_host_delegate.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_fetch_status_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_get_available_routines_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_get_routine_update_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_reboot_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_refresh_machine_certificate_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_remote_powerwash_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_run_routine_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_set_volume_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_start_crd_session_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_wipe_users_job.h"
-#include "chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.h"
+#include "chrome/browser/ash/policy/remote_commands/crd_host_delegate.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_fetch_status_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_get_available_routines_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_get_routine_update_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_reboot_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_refresh_machine_certificate_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_remote_powerwash_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_run_routine_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_set_volume_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_start_crd_session_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_wipe_users_job.h"
+#include "chrome/browser/ash/policy/remote_commands/screenshot_delegate.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
 #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h b/chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h
similarity index 78%
rename from chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h
rename to chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h
index f216e007..1605f5d 100644
--- a/chrome/browser/chromeos/policy/remote_commands/device_commands_factory_chromeos.h
+++ b/chrome/browser/ash/policy/remote_commands/device_commands_factory_chromeos.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMANDS_FACTORY_CHROMEOS_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMANDS_FACTORY_CHROMEOS_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMANDS_FACTORY_CHROMEOS_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMANDS_FACTORY_CHROMEOS_H_
 
 #include <memory>
 
@@ -37,4 +37,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_DEVICE_COMMANDS_FACTORY_CHROMEOS_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_DEVICE_COMMANDS_FACTORY_CHROMEOS_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/future_value.h b/chrome/browser/ash/policy/remote_commands/future_value.h
similarity index 95%
rename from chrome/browser/chromeos/policy/remote_commands/future_value.h
rename to chrome/browser/ash/policy/remote_commands/future_value.h
index a149ba2..f495964 100644
--- a/chrome/browser/chromeos/policy/remote_commands/future_value.h
+++ b/chrome/browser/ash/policy/remote_commands/future_value.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_FUTURE_VALUE_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_FUTURE_VALUE_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_FUTURE_VALUE_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_FUTURE_VALUE_H_
 
 #include <memory>
 #include <string>
@@ -150,4 +150,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_FUTURE_VALUE_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_FUTURE_VALUE_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc b/chrome/browser/ash/policy/remote_commands/screenshot_delegate.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc
rename to chrome/browser/ash/policy/remote_commands/screenshot_delegate.cc
index 0bdf76e..38b0900 100644
--- a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc
+++ b/chrome/browser/ash/policy/remote_commands/screenshot_delegate.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.h"
+#include "chrome/browser/ash/policy/remote_commands/screenshot_delegate.h"
 
 #include <string>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.h b/chrome/browser/ash/policy/remote_commands/screenshot_delegate.h
similarity index 81%
rename from chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.h
rename to chrome/browser/ash/policy/remote_commands/screenshot_delegate.h
index 112d01ea..433c357 100644
--- a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.h
+++ b/chrome/browser/ash/policy/remote_commands/screenshot_delegate.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_SCREENSHOT_DELEGATE_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_SCREENSHOT_DELEGATE_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_SCREENSHOT_DELEGATE_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_SCREENSHOT_DELEGATE_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/chromeos/policy/remote_commands/device_command_screenshot_job.h"
+#include "chrome/browser/ash/policy/remote_commands/device_command_screenshot_job.h"
 #include "chrome/browser/chromeos/policy/uploading/upload_job.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/native_widget_types.h"
@@ -46,4 +46,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_SCREENSHOT_DELEGATE_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_SCREENSHOT_DELEGATE_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc b/chrome/browser/ash/policy/remote_commands/user_command_arc_job.cc
similarity index 96%
rename from chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc
rename to chrome/browser/ash/policy/remote_commands/user_command_arc_job.cc
index 2801b4f3..eab49a1 100644
--- a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/user_command_arc_job.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h"
+#include "chrome/browser/ash/policy/remote_commands/user_command_arc_job.h"
 
 #include <utility>
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h b/chrome/browser/ash/policy/remote_commands/user_command_arc_job.h
similarity index 80%
rename from chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h
rename to chrome/browser/ash/policy/remote_commands/user_command_arc_job.h
index 37b3fdbd..09363465 100644
--- a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h
+++ b/chrome/browser/ash/policy/remote_commands/user_command_arc_job.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_USER_COMMAND_ARC_JOB_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_USER_COMMAND_ARC_JOB_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_COMMAND_ARC_JOB_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_COMMAND_ARC_JOB_H_
 
 #include <string>
 
@@ -38,4 +38,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_USER_COMMAND_ARC_JOB_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_COMMAND_ARC_JOB_H_
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/user_command_arc_job_unittest.cc
similarity index 97%
rename from chrome/browser/chromeos/policy/remote_commands/user_command_arc_job_unittest.cc
rename to chrome/browser/ash/policy/remote_commands/user_command_arc_job_unittest.cc
index e71661a..4de767e 100644
--- a/chrome/browser/chromeos/policy/remote_commands/user_command_arc_job_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/user_command_arc_job_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h"
+#include "chrome/browser/ash/policy/remote_commands/user_command_arc_job.h"
 
 #include <memory>
 #include <string>
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.cc b/chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.cc
similarity index 85%
rename from chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.cc
rename to chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.cc
index cdf834e..c3abd788 100644
--- a/chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.cc
+++ b/chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h"
+#include "chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.h"
 
 #include "base/notreached.h"
-#include "chrome/browser/chromeos/policy/remote_commands/user_command_arc_job.h"
+#include "chrome/browser/ash/policy/remote_commands/user_command_arc_job.h"
 #include "components/policy/core/common/remote_commands/remote_command_job.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 
diff --git a/chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h b/chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.h
similarity index 75%
rename from chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h
rename to chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.h
index cd3260f..67d16a0 100644
--- a/chrome/browser/chromeos/policy/remote_commands/user_commands_factory_chromeos.h
+++ b/chrome/browser/ash/policy/remote_commands/user_commands_factory_chromeos.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_USER_COMMANDS_FACTORY_CHROMEOS_H_
-#define CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_USER_COMMANDS_FACTORY_CHROMEOS_H_
+#ifndef CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_COMMANDS_FACTORY_CHROMEOS_H_
+#define CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_COMMANDS_FACTORY_CHROMEOS_H_
 
 #include <memory>
 
@@ -32,4 +32,4 @@
 
 }  // namespace policy
 
-#endif  // CHROME_BROWSER_CHROMEOS_POLICY_REMOTE_COMMANDS_USER_COMMANDS_FACTORY_CHROMEOS_H_
+#endif  // CHROME_BROWSER_ASH_POLICY_REMOTE_COMMANDS_USER_COMMANDS_FACTORY_CHROMEOS_H_
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc b/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc
index 736e1022..fe320bb6f 100644
--- a/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc
+++ b/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc
@@ -127,7 +127,7 @@
       ash::AssistantState::Get()->settings_enabled().value_or(false));
   source->AddBoolean("playStoreEnabled",
                      arc::IsArcPlayStoreEnabledForProfile(profile));
-  source->AddBoolean("pinEnabled", chromeos::quick_unlock::IsPinEnabled());
+  source->AddBoolean("pinEnabled", ash::quick_unlock::IsPinEnabled());
 
   // Data about what type of account/login this is.
   user_manager::UserManager* user_manager = user_manager::UserManager::Get();
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc
index 5decdd8..35f2c03 100644
--- a/chrome/browser/autofill/form_structure_browsertest.cc
+++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -177,7 +177,9 @@
     : DataDrivenTest(GetTestDataDir()) {
   feature_list_.InitWithFeatures(
       // Enabled
-      {// TODO(crbug.com/1098943): Remove once experiment is over.
+      {// TODO(crbug.com/1187842): Remove once experiment is over.
+       features::kAutofillAcrossIframes,
+       // TODO(crbug.com/1098943): Remove once experiment is over.
        features::kAutofillEnableSupportForMoreStructureInNames,
        // TODO(crbug.com/1125978): Remove once launched.
        features::kAutofillEnableSupportForMoreStructureInAddresses,
@@ -257,8 +259,7 @@
   return std::move(response);
 }
 
-// Times out on all platforms.  http://crbug.com/1216328
-IN_PROC_BROWSER_TEST_P(FormStructureBrowserTest, DISABLED_DataDrivenHeuristics) {
+IN_PROC_BROWSER_TEST_P(FormStructureBrowserTest, DataDrivenHeuristics) {
   // Prints the path of the test to be executed.
   LOG(INFO) << GetParam().MaybeAsASCII();
   bool is_expected_to_pass =
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 8983617..5dc5ab6 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -612,11 +612,9 @@
             embedder_support::prefs::kOriginTrialDisabledFeatures);
     if (override_disabled_feature_list) {
       std::vector<base::StringPiece> disabled_features;
-      base::StringPiece disabled_feature;
       for (const auto& item : override_disabled_feature_list->GetList()) {
-        if (item.GetAsString(&disabled_feature)) {
-          disabled_features.push_back(disabled_feature);
-        }
+        if (item.is_string())
+          disabled_features.push_back(item.GetString());
       }
       if (!disabled_features.empty()) {
         const std::string override_disabled_features =
@@ -633,11 +631,9 @@
         embedder_support::prefs::kOriginTrialDisabledTokens);
     if (disabled_token_list) {
       std::vector<base::StringPiece> disabled_tokens;
-      base::StringPiece disabled_token;
       for (const auto& item : disabled_token_list->GetList()) {
-        if (item.GetAsString(&disabled_token)) {
-          disabled_tokens.push_back(disabled_token);
-        }
+        if (item.is_string())
+          disabled_tokens.push_back(item.GetString());
       }
       if (!disabled_tokens.empty()) {
         const std::string disabled_token_switch =
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 83b5078..7cfda31c 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -439,11 +439,11 @@
 #include "components/crash/content/browser/crash_handler_host_linux.h"
 #endif
 
-// TODO(crbug/1169547) Remove `BUILDFLAG(IS_CHROMEOS_LACROS)` once the
-// migration is complete.
-#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN)
+#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) || \
+    BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/enterprise/connectors/device_trust/navigation_throttle.h"
-#endif  // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN)
+#endif  // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) ||
+        // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // TODO(crbug.com/939205):  Once the upcoming App Service is available, use a
 // single navigation throttle to display the intent picker on all platforms.
@@ -4008,11 +4008,13 @@
         &throttles);
   }
 
-#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN)
+#if defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) || \
+    BUILDFLAG(IS_CHROMEOS_ASH)
   MaybeAddThrottle(enterprise_connectors::DeviceTrustNavigationThrottle::
                        MaybeCreateThrottleFor(handle),
                    &throttles);
-#endif  // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN)
+#endif  // defined(OS_LINUX) || defined(OS_MAC) || defined(OS_WIN) ||
+        // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if !defined(OS_ANDROID)
   MaybeAddThrottle(DevToolsWindow::MaybeCreateNavigationThrottle(handle),
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index e106434..a55dd3f 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -356,6 +356,7 @@
     "//components/renderer_context_menu",
     "//components/reporting/client:report_queue",
     "//components/reporting/client:report_queue_configuration",
+    "//components/reporting/client:report_queue_factory",
     "//components/reporting/client:report_queue_provider",
     "//components/reporting/proto:interface_proto",
     "//components/reporting/storage:storage_module",
@@ -2135,6 +2136,41 @@
     "../ash/policy/off_hours/off_hours_policy_applier.h",
     "../ash/policy/off_hours/off_hours_proto_parser.cc",
     "../ash/policy/off_hours/off_hours_proto_parser.h",
+    "../ash/policy/remote_commands/affiliated_remote_commands_invalidator.cc",
+    "../ash/policy/remote_commands/affiliated_remote_commands_invalidator.h",
+    "../ash/policy/remote_commands/crd_host_delegate.cc",
+    "../ash/policy/remote_commands/crd_host_delegate.h",
+    "../ash/policy/remote_commands/crd_logging.h",
+    "../ash/policy/remote_commands/device_command_fetch_status_job.cc",
+    "../ash/policy/remote_commands/device_command_fetch_status_job.h",
+    "../ash/policy/remote_commands/device_command_get_available_routines_job.cc",
+    "../ash/policy/remote_commands/device_command_get_available_routines_job.h",
+    "../ash/policy/remote_commands/device_command_get_routine_update_job.cc",
+    "../ash/policy/remote_commands/device_command_get_routine_update_job.h",
+    "../ash/policy/remote_commands/device_command_reboot_job.cc",
+    "../ash/policy/remote_commands/device_command_reboot_job.h",
+    "../ash/policy/remote_commands/device_command_refresh_machine_certificate_job.cc",
+    "../ash/policy/remote_commands/device_command_refresh_machine_certificate_job.h",
+    "../ash/policy/remote_commands/device_command_remote_powerwash_job.cc",
+    "../ash/policy/remote_commands/device_command_remote_powerwash_job.h",
+    "../ash/policy/remote_commands/device_command_run_routine_job.cc",
+    "../ash/policy/remote_commands/device_command_run_routine_job.h",
+    "../ash/policy/remote_commands/device_command_screenshot_job.cc",
+    "../ash/policy/remote_commands/device_command_screenshot_job.h",
+    "../ash/policy/remote_commands/device_command_set_volume_job.cc",
+    "../ash/policy/remote_commands/device_command_set_volume_job.h",
+    "../ash/policy/remote_commands/device_command_start_crd_session_job.cc",
+    "../ash/policy/remote_commands/device_command_start_crd_session_job.h",
+    "../ash/policy/remote_commands/device_command_wipe_users_job.cc",
+    "../ash/policy/remote_commands/device_command_wipe_users_job.h",
+    "../ash/policy/remote_commands/device_commands_factory_chromeos.cc",
+    "../ash/policy/remote_commands/device_commands_factory_chromeos.h",
+    "../ash/policy/remote_commands/screenshot_delegate.cc",
+    "../ash/policy/remote_commands/screenshot_delegate.h",
+    "../ash/policy/remote_commands/user_command_arc_job.cc",
+    "../ash/policy/remote_commands/user_command_arc_job.h",
+    "../ash/policy/remote_commands/user_commands_factory_chromeos.cc",
+    "../ash/policy/remote_commands/user_commands_factory_chromeos.h",
     "../ash/power/auto_screen_brightness/adapter.cc",
     "../ash/power/auto_screen_brightness/adapter.h",
     "../ash/power/auto_screen_brightness/als_file_reader.cc",
@@ -2856,41 +2892,6 @@
     "platform_keys/platform_keys_service_factory.cc",
     "platform_keys/platform_keys_service_factory.h",
     "platform_keys/platform_keys_service_nss.cc",
-    "policy/remote_commands/affiliated_remote_commands_invalidator.cc",
-    "policy/remote_commands/affiliated_remote_commands_invalidator.h",
-    "policy/remote_commands/crd_host_delegate.cc",
-    "policy/remote_commands/crd_host_delegate.h",
-    "policy/remote_commands/crd_logging.h",
-    "policy/remote_commands/device_command_fetch_status_job.cc",
-    "policy/remote_commands/device_command_fetch_status_job.h",
-    "policy/remote_commands/device_command_get_available_routines_job.cc",
-    "policy/remote_commands/device_command_get_available_routines_job.h",
-    "policy/remote_commands/device_command_get_routine_update_job.cc",
-    "policy/remote_commands/device_command_get_routine_update_job.h",
-    "policy/remote_commands/device_command_reboot_job.cc",
-    "policy/remote_commands/device_command_reboot_job.h",
-    "policy/remote_commands/device_command_refresh_machine_certificate_job.cc",
-    "policy/remote_commands/device_command_refresh_machine_certificate_job.h",
-    "policy/remote_commands/device_command_remote_powerwash_job.cc",
-    "policy/remote_commands/device_command_remote_powerwash_job.h",
-    "policy/remote_commands/device_command_run_routine_job.cc",
-    "policy/remote_commands/device_command_run_routine_job.h",
-    "policy/remote_commands/device_command_screenshot_job.cc",
-    "policy/remote_commands/device_command_screenshot_job.h",
-    "policy/remote_commands/device_command_set_volume_job.cc",
-    "policy/remote_commands/device_command_set_volume_job.h",
-    "policy/remote_commands/device_command_start_crd_session_job.cc",
-    "policy/remote_commands/device_command_start_crd_session_job.h",
-    "policy/remote_commands/device_command_wipe_users_job.cc",
-    "policy/remote_commands/device_command_wipe_users_job.h",
-    "policy/remote_commands/device_commands_factory_chromeos.cc",
-    "policy/remote_commands/device_commands_factory_chromeos.h",
-    "policy/remote_commands/screenshot_delegate.cc",
-    "policy/remote_commands/screenshot_delegate.h",
-    "policy/remote_commands/user_command_arc_job.cc",
-    "policy/remote_commands/user_command_arc_job.h",
-    "policy/remote_commands/user_commands_factory_chromeos.cc",
-    "policy/remote_commands/user_commands_factory_chromeos.h",
     "policy/reporting/app_install_event_log_manager_wrapper.cc",
     "policy/reporting/app_install_event_log_manager_wrapper.h",
     "policy/reporting/arc_app_install_event_log.cc",
@@ -3500,6 +3501,7 @@
     "../ash/policy/dlp/dlp_content_manager_test_helper.h",
     "../ash/policy/handlers/minimum_version_policy_test_helpers.cc",
     "../ash/policy/handlers/minimum_version_policy_test_helpers.h",
+    "../ash/policy/remote_commands/future_value.h",
     "../ash/settings/scoped_testing_cros_settings.cc",
     "../ash/settings/scoped_testing_cros_settings.h",
     "android_sms/fake_android_sms_app_manager.cc",
@@ -3519,7 +3521,6 @@
     "platform_keys/key_permissions/mock_key_permissions_service.h",
     "platform_keys/mock_platform_keys_service.cc",
     "platform_keys/mock_platform_keys_service.h",
-    "policy/remote_commands/future_value.h",
     "printing/printing_stubs.cc",
     "printing/printing_stubs.h",
     "printing/test_cups_print_job_manager.cc",
@@ -3988,6 +3989,16 @@
     "../ash/policy/off_hours/device_off_hours_controller_unittest.cc",
     "../ash/policy/off_hours/off_hours_policy_applier_unittest.cc",
     "../ash/policy/off_hours/off_hours_proto_parser_unittest.cc",
+    "../ash/policy/remote_commands/crd_host_delegate_unittest.cc",
+    "../ash/policy/remote_commands/device_command_get_available_routines_job_unittest.cc",
+    "../ash/policy/remote_commands/device_command_get_routine_update_job_unittest.cc",
+    "../ash/policy/remote_commands/device_command_remote_powerwash_job_unittest.cc",
+    "../ash/policy/remote_commands/device_command_run_routine_job_unittest.cc",
+    "../ash/policy/remote_commands/device_command_screenshot_job_unittest.cc",
+    "../ash/policy/remote_commands/device_command_set_volume_job_unittest.cc",
+    "../ash/policy/remote_commands/device_command_start_crd_session_unittest.cc",
+    "../ash/policy/remote_commands/device_command_wipe_users_job_unittest.cc",
+    "../ash/policy/remote_commands/user_command_arc_job_unittest.cc",
     "../ash/power/auto_screen_brightness/adapter_unittest.cc",
     "../ash/power/auto_screen_brightness/als_file_reader_unittest.cc",
     "../ash/power/auto_screen_brightness/als_reader_unittest.cc",
@@ -4206,16 +4217,6 @@
     "phonehub/browser_tabs_model_provider_impl_unittest.cc",
     "platform_keys/key_permissions/arc_key_permissions_manager_delegate_unittest.cc",
     "platform_keys/key_permissions/key_permissions_service_impl_unittest.cc",
-    "policy/remote_commands/crd_host_delegate_unittest.cc",
-    "policy/remote_commands/device_command_get_available_routines_job_unittest.cc",
-    "policy/remote_commands/device_command_get_routine_update_job_unittest.cc",
-    "policy/remote_commands/device_command_remote_powerwash_job_unittest.cc",
-    "policy/remote_commands/device_command_run_routine_job_unittest.cc",
-    "policy/remote_commands/device_command_screenshot_job_unittest.cc",
-    "policy/remote_commands/device_command_set_volume_job_unittest.cc",
-    "policy/remote_commands/device_command_start_crd_session_unittest.cc",
-    "policy/remote_commands/device_command_wipe_users_job_unittest.cc",
-    "policy/remote_commands/user_command_arc_job_unittest.cc",
     "policy/reporting/app_install_event_log_manager_wrapper_unittest.cc",
     "policy/reporting/arc_app_install_event_log_collector_unittest.cc",
     "policy/reporting/arc_app_install_event_log_manager_unittest.cc",
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
index d631e77..c30ad04 100644
--- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
+++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.cc
@@ -45,9 +45,9 @@
 using CredentialRequirements = quick_unlock_private::CredentialRequirements;
 using QuickUnlockMode = quick_unlock_private::QuickUnlockMode;
 
-using AuthToken = chromeos::quick_unlock::AuthToken;
+using AuthToken = ash::quick_unlock::AuthToken;
 using QuickUnlockModeList = std::vector<QuickUnlockMode>;
-using QuickUnlockStorage = chromeos::quick_unlock::QuickUnlockStorage;
+using QuickUnlockStorage = ash::quick_unlock::QuickUnlockStorage;
 
 using ActiveModeCallback = base::OnceCallback<void(const QuickUnlockModeList&)>;
 
@@ -82,7 +82,7 @@
 void ComputeActiveModes(Profile* profile, ActiveModeCallback result) {
   user_manager::User* user =
       chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
-  chromeos::quick_unlock::PinBackend::GetInstance()->IsSet(
+  ash::quick_unlock::PinBackend::GetInstance()->IsSet(
       user->GetAccountId(),
       base::BindOnce(
           [](ActiveModeCallback result, bool is_set) {
@@ -202,7 +202,7 @@
 }
 
 AuthToken* GetActiveProfileAuthToken(content::BrowserContext* browser_context) {
-  return chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(
+  return ash::quick_unlock::QuickUnlockFactory::GetForProfile(
              GetActiveProfile(browser_context))
       ->GetAuthToken();
 }
@@ -276,7 +276,7 @@
 
   Profile* profile = GetActiveProfile(browser_context());
   QuickUnlockStorage* quick_unlock_storage =
-      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(profile);
+      ash::quick_unlock::QuickUnlockFactory::GetForProfile(profile);
   quick_unlock_storage->MarkStrongAuth();
   result->token = quick_unlock_storage->CreateAuthToken(user_context);
   result->lifetime_seconds = AuthToken::kTokenExpirationSeconds;
@@ -342,7 +342,7 @@
   user_manager::User* user =
       chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
 
-  chromeos::quick_unlock::PinBackend::GetInstance()->SetPinAutoSubmitEnabled(
+  ash::quick_unlock::PinBackend::GetInstance()->SetPinAutoSubmitEnabled(
       user->GetAccountId(), params->pin, params->enabled,
       base::BindOnce(&QuickUnlockPrivateSetPinAutosubmitEnabledFunction::
                          HandleSetPinAutoSubmitResult,
@@ -376,7 +376,7 @@
   user_manager::User* user =
       chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
 
-  chromeos::quick_unlock::PinBackend::GetInstance()->CanAuthenticate(
+  ash::quick_unlock::PinBackend::GetInstance()->CanAuthenticate(
       user->GetAccountId(),
       base::BindOnce(&QuickUnlockPrivateCanAuthenticatePinFunction::
                          HandleCanAuthenticateResult,
@@ -402,7 +402,7 @@
 ExtensionFunction::ResponseAction
 QuickUnlockPrivateGetAvailableModesFunction::Run() {
   QuickUnlockModeList modes;
-  if (!chromeos::quick_unlock::IsPinDisabledByPolicy(
+  if (!ash::quick_unlock::IsPinDisabledByPolicy(
           GetActiveProfile(browser_context())->GetPrefs())) {
     modes.push_back(quick_unlock_private::QUICK_UNLOCK_MODE_PIN);
   }
@@ -539,7 +539,7 @@
   // on the UI, but users can still reach here via dev tools.
   for (size_t i = 0; i < params_->modes.size(); ++i) {
     if (params_->modes[i] == QuickUnlockMode::QUICK_UNLOCK_MODE_PIN &&
-        chromeos::quick_unlock::IsPinDisabledByPolicy(pref_service)) {
+        ash::quick_unlock::IsPinDisabledByPolicy(pref_service)) {
       return RespondNow(Error(kPinDisabledByPolicy));
     }
   }
@@ -606,13 +606,13 @@
     user_manager::User* user =
         chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
     if (pin_credential.empty()) {
-      chromeos::quick_unlock::PinBackend::GetInstance()->Remove(
+      ash::quick_unlock::PinBackend::GetInstance()->Remove(
           user->GetAccountId(), params_->token,
           base::BindOnce(
               &QuickUnlockPrivateSetModesFunction::PinRemoveCallComplete,
               this));
     } else {
-      chromeos::quick_unlock::PinBackend::GetInstance()->Set(
+      ash::quick_unlock::PinBackend::GetInstance()->Set(
           user->GetAccountId(), params_->token, pin_credential,
           base::BindOnce(
               &QuickUnlockPrivateSetModesFunction::PinSetCallComplete, this));
diff --git a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc
index 6074c07..13ee636 100644
--- a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc
+++ b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.cc
@@ -68,9 +68,6 @@
 // |kCpuRestrictCoresCondition|.
 constexpr int kCpuRestrictCoresCondition = 2;
 
-constexpr char kRestoredAppWindowCountHistogram[] =
-    "Apps.RestoreArcWindowCount";
-
 constexpr char kRestoredArcAppResultHistogram[] = "Apps.RestoreArcAppsResult";
 
 constexpr char kArcGhostWindowLaunchHistogram[] = "Apps.ArcGhostWindowLaunch";
@@ -117,7 +114,7 @@
       handler_->profile_));
 
   LoadRestoreData();
-  if (!HasRestoreData())
+  if (app_ids_.empty())
     return;
 
   window_handler_ = FullRestoreArcTaskHandler::GetForProfile(handler_->profile_)
@@ -136,8 +133,10 @@
 }
 
 void ArcAppLaunchHandler::OnAppUpdate(const apps::AppUpdate& update) {
-  if (!HasRestoreData() || !update.ReadinessChanged())
+  if (!update.ReadinessChanged() ||
+      update.AppType() != apps::mojom::AppType::kArc) {
     return;
+  }
 
   if (!apps_util::IsInstalled(update.Readiness())) {
     RemoveWindowsForApp(update.AppId());
@@ -148,8 +147,10 @@
   if (update.Readiness() != apps::mojom::Readiness::kReady)
     return;
 
-  if (is_shelf_ready_ && base::Contains(app_ids_, update.AppId()))
+  if (is_shelf_ready_ && base::Contains(app_ids_, update.AppId())) {
+    AddWindows(update.AppId());
     PrepareAppLaunching(update.AppId());
+  }
 }
 
 void ArcAppLaunchHandler::OnAppRegistryCacheWillBeDestroyed(
@@ -158,6 +159,9 @@
 }
 
 void ArcAppLaunchHandler::OnAppConnectionReady() {
+  base::UmaHistogramCounts100(kRestoredAppWindowCountHistogram,
+                              windows_.size() + no_stack_windows_.size());
+
   if (!HasRestoreData())
     return;
 
@@ -279,41 +283,27 @@
 
 void ArcAppLaunchHandler::LoadRestoreData() {
   DCHECK(handler_);
-  apps::AppRegistryCache& cache =
-      apps::AppServiceProxyFactory::GetForProfile(handler_->profile_)
-          ->AppRegistryCache();
-
-  for (const auto& it : handler_->restore_data_->app_id_to_launch_list()) {
-    bool should_restore = false;
-    cache.ForOneApp(it.first, [&should_restore](const apps::AppUpdate& update) {
-      if (update.AppType() == apps::mojom::AppType::kArc &&
-          apps_util::IsInstalled(update.Readiness())) {
-        should_restore = true;
-      }
-    });
-
-    if (!should_restore)
-      continue;
-
+  for (const auto& it : handler_->restore_data_->app_id_to_launch_list())
     app_ids_.insert(it.first);
-    for (const auto& data_it : it.second) {
-      if (data_it.second->activation_index.has_value()) {
-        windows_[data_it.second->activation_index.value()] = {it.first,
-                                                              data_it.first};
-      } else {
-        no_stack_windows_.push_back({it.first, data_it.first});
-      }
+}
+
+void ArcAppLaunchHandler::AddWindows(const std::string& app_id) {
+  DCHECK(handler_);
+  auto it = handler_->restore_data_->app_id_to_launch_list().find(app_id);
+  for (const auto& data_it : it->second) {
+    if (data_it.second->activation_index.has_value()) {
+      windows_[data_it.second->activation_index.value()] = {app_id,
+                                                            data_it.first};
+    } else {
+      no_stack_windows_.push_back({app_id, data_it.first});
     }
   }
-
-  base::UmaHistogramCounts100(kRestoredAppWindowCountHistogram,
-                              windows_.size() + no_stack_windows_.size());
 }
 
 void ArcAppLaunchHandler::PrepareLaunchApps() {
   is_shelf_ready_ = true;
 
-  if (!HasRestoreData())
+  if (app_ids_.empty())
     return;
 
   apps::AppRegistryCache& cache =
@@ -325,13 +315,16 @@
   std::set<std::string> app_ids;
   cache.ForEachApp([&app_ids, this](const apps::AppUpdate& update) {
     if (update.Readiness() == apps::mojom::Readiness::kReady &&
-        app_ids_.find(update.AppId()) != app_ids_.end()) {
+        update.AppType() == apps::mojom::AppType::kArc &&
+        base::Contains(app_ids_, update.AppId())) {
       app_ids.insert(update.AppId());
     }
   });
 
-  for (const auto& app_id : app_ids)
+  for (const auto& app_id : app_ids) {
+    AddWindows(app_id);
     PrepareAppLaunching(app_id);
+  }
 }
 
 void ArcAppLaunchHandler::PrepareAppLaunching(const std::string& app_id) {
diff --git a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h
index bc63999f..27e333c 100644
--- a/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h
+++ b/chrome/browser/chromeos/full_restore/arc_app_launch_handler.h
@@ -53,6 +53,9 @@
   kMaxValue = kNotFinish,
 };
 
+constexpr char kRestoredAppWindowCountHistogram[] =
+    "Apps.RestoreArcWindowCount";
+
 // The restoration process might be blocked by some issues, e.g. the memory
 // pressure, CPU rate, etc. However we don't want to have the restoration
 // process taking too long to interact the normal usage. So if the restoration
@@ -113,6 +116,9 @@
   // `no_stack_windows_` and `app_ids_`.
   void LoadRestoreData();
 
+  // Adds the restore windows to `windows_` or `no_stack_windows_`.
+  void AddWindows(const std::string& app_id);
+
   // Creates ghost windows or displays spin icons for all ARC apps to be
   // restored.
   void PrepareLaunchApps();
@@ -167,9 +173,9 @@
 
   FullRestoreAppLaunchHandler* handler_ = nullptr;
 
-  // The app id list to be restored. When the ARC app is ready in
-  // AppRegistryCache, launch the ghost window or spin the icon and remove it
-  // from `app_ids`.
+  // The app id list from the restore data. If the app has been added the
+  // AppRegistryCache, the app will be removed from `app_ids_` to
+  // prevent restoring the app multiple times.
   std::set<std::string> app_ids_;
 
   // The map from the window stack to the app id and the window id. This map is
diff --git a/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc
index ab25997..4fc63e51 100644
--- a/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc
+++ b/chrome/browser/chromeos/full_restore/full_restore_app_launch_handler_browsertest.cc
@@ -15,6 +15,7 @@
 #include "ash/shell.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_event.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
@@ -24,6 +25,7 @@
 #include "chrome/browser/ash/arc/arc_util.h"
 #include "chrome/browser/ash/arc/session/arc_session_manager.h"
 #include "chrome/browser/ash/web_applications/system_web_app_integration_test.h"
+#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/full_restore/arc_app_launch_handler.h"
 #include "chrome/browser/chromeos/full_restore/full_restore_arc_task_handler.h"
 #include "chrome/browser/chromeos/full_restore/full_restore_service.h"
@@ -58,6 +60,8 @@
 #include "components/full_restore/full_restore_utils.h"
 #include "components/full_restore/window_info.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_source.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "content/public/test/test_utils.h"
@@ -793,6 +797,14 @@
 
   WaitForAppLaunchInfoSaved();
 
+  // Simulate the system shutdown process, and the window is closed.
+  FullRestoreService::GetForProfile(profile())->Observe(
+      chrome::NOTIFICATION_APP_TERMINATING,
+      content::Source<extensions::AppWindow>(app_window),
+      content::NotificationDetails());
+  CloseAppWindow(app_window);
+  WaitForAppLaunchInfoSaved();
+
   // Read from the restore data.
   auto app_launch_handler =
       std::make_unique<FullRestoreAppLaunchHandler>(profile());
@@ -1360,8 +1372,14 @@
 
   WaitForAppLaunchInfoSaved();
 
-  Restore();
+  // Simulate the system shutdown process, and the window is closed.
+  FullRestoreService::GetForProfile(profile())->Observe(
+      chrome::NOTIFICATION_APP_TERMINATING,
+      content::Source<aura::Window>(window), content::NotificationDetails());
   widget->CloseNow();
+  WaitForAppLaunchInfoSaved();
+
+  Restore();
 
   app_host()->OnTaskDestroyed(kTaskId1);
 
@@ -1936,6 +1954,11 @@
     return arc_app_launch_handler_->app_ids_;
   }
 
+  void OnAppConnectionReady() {
+    DCHECK(arc_app_launch_handler_);
+    arc_app_launch_handler_->OnAppConnectionReady();
+  }
+
   void VerifyWindows(int32_t index,
                      const std::string& app_id,
                      int32_t window_id) {
@@ -1996,6 +2019,7 @@
 
   WaitForAppLaunchInfoSaved();
 
+  base::HistogramTester histogram_tester;
   Restore();
   widget1->CloseNow();
 
@@ -2016,6 +2040,10 @@
   VerifyRestoreData(app_id1, kTaskId1);
   VerifyNoRestoreData(app_id2);
 
+  OnAppConnectionReady();
+  EXPECT_EQ(
+      1, histogram_tester.GetBucketCount(kRestoredAppWindowCountHistogram, 1));
+
   // Remove app_id1, and verify windows and restore data for `app_id1` have been
   // removed.
   RemoveApp(app_id1);
@@ -2023,6 +2051,12 @@
   VerifyNoRestoreData(app_id1);
   VerifyNoRestoreData(app_id2);
 
+  // Modify `app_id1` status to be ready to simulate `app_id1` is installed.
+  UpdateApp(app_id1, apps::mojom::Readiness::kReady);
+  EXPECT_FALSE(HasRestoreData(app_id1));
+  EXPECT_TRUE(GetAppIds().empty());
+  VerifyNoRestoreData(app_id1);
+
   StopInstance();
 }
 
@@ -2064,45 +2098,168 @@
 
   WaitForAppLaunchInfoSaved();
 
-  // Modify apps status before restoring, so that apps can't be restored, to
-  // verify the saved restore data.
+  // Modify apps status before restoring, so that apps can't be restored.
   UpdateApp(app_id1, apps::mojom::Readiness::kDisabledByPolicy);
   UpdateApp(app_id2, apps::mojom::Readiness::kDisabledByPolicy);
+  base::HistogramTester histogram_tester;
   Restore();
   widget1->CloseNow();
 
   app_host()->OnTaskDestroyed(kTaskId1);
   app_host()->OnTaskDestroyed(kTaskId2);
 
-  EXPECT_TRUE(HasRestoreData());
-  VerifyWindows(activation_index1, app_id1, kTaskId1);
-  VerifyNoStackWindows(app_id2, kTaskId2);
-
   std::set<std::string> app_ids = GetAppIds();
+  EXPECT_EQ(2u, app_ids.size());
   EXPECT_TRUE(base::Contains(app_ids, app_id1));
   EXPECT_TRUE(base::Contains(app_ids, app_id2));
-  VerifyRestoreData(app_id1, kTaskId1);
-  VerifyRestoreData(app_id2, kTaskId2);
+  EXPECT_FALSE(HasRestoreData());
 
-  // Modify the app_id1 status to be ready to prepare launching app_id1.
+  // Modify `app_id1` status to be ready to prepare launching `app_id1`.
   UpdateApp(app_id1, apps::mojom::Readiness::kReady);
   app_ids = GetAppIds();
   EXPECT_FALSE(base::Contains(app_ids, app_id1));
   EXPECT_TRUE(base::Contains(app_ids, app_id2));
+  VerifyWindows(activation_index1, app_id1, kTaskId1);
 
+  // Modify `app_id2` status to be ready to prepare launching `app_id2`.
   UpdateApp(app_id2, apps::mojom::Readiness::kReady);
   app_ids = GetAppIds();
   EXPECT_FALSE(base::Contains(app_ids, app_id1));
   EXPECT_FALSE(base::Contains(app_ids, app_id2));
+  VerifyNoStackWindows(app_id2, kTaskId2);
 
   // Verify the restore data and windows for `app_id1` and `app_id2` are not
   // removed.
   VerifyRestoreData(app_id1, kTaskId1);
   VerifyRestoreData(app_id2, kTaskId2);
 
+  OnAppConnectionReady();
+  EXPECT_EQ(
+      1, histogram_tester.GetBucketCount(kRestoredAppWindowCountHistogram, 2));
+
+  StopInstance();
+}
+
+// Verify the saved windows in ArcAppLaunchHandler when only restore one of the
+// apps.
+IN_PROC_BROWSER_TEST_F(ArcAppLaunchHandlerArcAppBrowserTest, RestoreOneApp) {
+  SetProfile();
+  InstallTestApps(kTestAppPackage, true);
+
+  const std::string app_id1 = GetTestApp1Id(kTestAppPackage);
+  const std::string app_id2 = GetTestApp2Id(kTestAppPackage);
+
+  int32_t session_id1 =
+      ::full_restore::FullRestoreSaveHandler::GetInstance()->GetArcSessionId();
+
+  SaveAppLaunchInfo(app_id1, session_id1);
+
+  // Simulate creating kTaskId1. The task id needs to match the |window_app_id|
+  // arg of CreateExoWindow.
+  int32_t kTaskId1 = 100;
+  CreateTask(app_id1, kTaskId1, session_id1);
+
+  // Create the window for the app1.
+  views::Widget* widget1 = CreateExoWindow("org.chromium.arc.100");
+  aura::Window* window1 = widget1->GetNativeWindow();
+
+  WaitForAppLaunchInfoSaved();
+
+  int32_t activation_index1 = 11;
+  SaveWindowInfo(window1, activation_index1,
+                 chromeos::WindowStateType::kNormal);
+
+  WaitForAppLaunchInfoSaved();
+
+  base::HistogramTester histogram_tester;
+  Restore();
+  widget1->CloseNow();
+  app_host()->OnTaskDestroyed(kTaskId1);
+
+  EXPECT_TRUE(GetAppIds().empty());
+  EXPECT_TRUE(HasRestoreData());
+  VerifyWindows(activation_index1, app_id1, kTaskId1);
+
+  // Verify the restore data and windows for `app_id1` are not removed.
+  VerifyRestoreData(app_id1, kTaskId1);
+  VerifyNoRestoreData(app_id2);
+
+  OnAppConnectionReady();
+  EXPECT_EQ(
+      1, histogram_tester.GetBucketCount(kRestoredAppWindowCountHistogram, 1));
+
+  StopInstance();
+}
+
+// Verify the saved windows in ArcAppLaunchHandler when one of apps is ready
+// late.
+IN_PROC_BROWSER_TEST_F(ArcAppLaunchHandlerArcAppBrowserTest, AppIsReadyLate) {
+  SetProfile();
+  InstallTestApps(kTestAppPackage, true);
+
+  const std::string app_id1 = GetTestApp1Id(kTestAppPackage);
+  const std::string app_id2 = GetTestApp2Id(kTestAppPackage);
+
+  int32_t session_id1 =
+      ::full_restore::FullRestoreSaveHandler::GetInstance()->GetArcSessionId();
+  int32_t session_id2 =
+      ::full_restore::FullRestoreSaveHandler::GetInstance()->GetArcSessionId();
+
+  SaveAppLaunchInfo(app_id1, session_id1);
+  SaveAppLaunchInfo(app_id2, session_id2);
+
+  // Simulate creating kTaskId1. The task id needs to match the |window_app_id|
+  // arg of CreateExoWindow.
+  int32_t kTaskId1 = 100;
+  CreateTask(app_id1, kTaskId1, session_id1);
+
+  // Create the window for the app1.
+  views::Widget* widget1 = CreateExoWindow("org.chromium.arc.100");
+  aura::Window* window1 = widget1->GetNativeWindow();
+
+  // Simulate creating kTaskId2 for the app2.
+  int32_t kTaskId2 = 101;
+  CreateTask(app_id2, kTaskId2, session_id2);
+
+  WaitForAppLaunchInfoSaved();
+
+  int32_t activation_index1 = 11;
+  SaveWindowInfo(window1, activation_index1,
+                 chromeos::WindowStateType::kNormal);
+
+  WaitForAppLaunchInfoSaved();
+
+  // Remove `app_id2` before restoring, so that `app_id2` can't be restored.
+  RemoveApp(app_id2);
+  base::HistogramTester histogram_tester;
+  Restore();
+  widget1->CloseNow();
+
+  app_host()->OnTaskDestroyed(kTaskId1);
+  app_host()->OnTaskDestroyed(kTaskId2);
+
+  std::set<std::string> app_ids = GetAppIds();
+  EXPECT_EQ(1u, app_ids.size());
+  EXPECT_TRUE(base::Contains(app_ids, app_id2));
+  EXPECT_TRUE(HasRestoreData());
+  VerifyWindows(activation_index1, app_id1, kTaskId1);
+
+  OnAppConnectionReady();
+  EXPECT_EQ(
+      1, histogram_tester.GetBucketCount(kRestoredAppWindowCountHistogram, 1));
+
+  // Modify `app_id2` status to be ready to prepare launching `app_id2`.
+  UpdateApp(app_id2, apps::mojom::Readiness::kReady);
+  EXPECT_TRUE(GetAppIds().empty());
+  EXPECT_TRUE(HasRestoreData());
   VerifyWindows(activation_index1, app_id1, kTaskId1);
   VerifyNoStackWindows(app_id2, kTaskId2);
 
+  // Verify the restore data and windows for `app_id1` and `app_id2` are not
+  // removed.
+  VerifyRestoreData(app_id1, kTaskId1);
+  VerifyRestoreData(app_id2, kTaskId2);
+
   StopInstance();
 }
 
@@ -2159,6 +2316,20 @@
         ->profile_path_to_restore_data_.clear();
   }
 
+  void ModifyAppReadiness(apps::mojom::Readiness readiness) {
+    auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile());
+    std::vector<apps::mojom::AppPtr> deltas;
+    apps::AppRegistryCache& cache = proxy->AppRegistryCache();
+    apps::mojom::AppPtr app = apps::mojom::App::New();
+    app->app_id =
+        *GetManager().GetAppIdForSystemApp(web_app::SystemAppType::HELP);
+    app->app_type = apps::mojom::AppType::kWeb;
+    app->readiness = readiness;
+    deltas.push_back(std::move(app));
+    cache.OnApps(std::move(deltas), apps::mojom::AppType::kWeb,
+                 false /* should_notify_initialized */);
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -2201,6 +2372,61 @@
   EXPECT_EQ(window_id, restore_window_id);
 }
 
+// Verify the restoration if the SWA is not available when set
+// restore, and the restoration can work if the SWA is added later.
+IN_PROC_BROWSER_TEST_P(FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest,
+                       NoSWAWhenRestore) {
+  Browser* app_browser = LaunchSystemWebApp();
+  ASSERT_TRUE(app_browser);
+  ASSERT_NE(browser(), app_browser);
+
+  // Get the window id.
+  aura::Window* window = app_browser->window()->GetNativeWindow();
+  int32_t window_id = window->GetProperty(::full_restore::kWindowIdKey);
+
+  WaitForAppLaunchInfoSaved();
+
+  // Close app_browser so that the SWA can be relaunched.
+  web_app::CloseAndWait(app_browser);
+
+  // Modify the app readiness to uninstall to simulate the app is not installed
+  // during the system startup phase.
+  ModifyAppReadiness(apps::mojom::Readiness::kUninstalledByUser);
+
+  // Create FullRestoreAppLaunchHandler.
+  auto app_launch_handler =
+      std::make_unique<FullRestoreAppLaunchHandler>(profile());
+
+  // Set should restore.
+  app_launch_handler->SetShouldRestore();
+
+  // Wait for the restoration.
+  content::RunAllTasksUntilIdle();
+
+  // Verify the app is not restored because the app is not installed.
+  Browser* restore_app_browser = GetBrowserForWindowId(window_id);
+  ASSERT_FALSE(restore_app_browser);
+
+  // Modify the app readiness to kReady to simulate the app is installed.
+  ModifyAppReadiness(apps::mojom::Readiness::kReady);
+
+  // Wait for the restoration.
+  content::RunAllTasksUntilIdle();
+
+  // Get the restored browser for the system web app to verify the app is
+  // restored.
+  restore_app_browser = GetBrowserForWindowId(window_id);
+  ASSERT_TRUE(restore_app_browser);
+  ASSERT_NE(browser(), restore_app_browser);
+
+  // Get the restore window id.
+  window = restore_app_browser->window()->GetNativeWindow();
+  int32_t restore_window_id =
+      window->GetProperty(::full_restore::kRestoreWindowIdKey);
+
+  EXPECT_EQ(window_id, restore_window_id);
+}
+
 IN_PROC_BROWSER_TEST_P(FullRestoreAppLaunchHandlerSystemWebAppsBrowserTest,
                        WindowProperties) {
   Browser* app_browser = LaunchSystemWebApp();
diff --git a/chrome/browser/chromeos/input_method/grammar_manager_unittest.cc b/chrome/browser/chromeos/input_method/grammar_manager_unittest.cc
index 2e24c07c..e058d7c 100644
--- a/chrome/browser/chromeos/input_method/grammar_manager_unittest.cc
+++ b/chrome/browser/chromeos/input_method/grammar_manager_unittest.cc
@@ -31,7 +31,7 @@
 
   bool RequestTextCheck(Profile* profile,
                         const std::u16string& text,
-                        TextCheckCompleteCallback callback) const override {
+                        TextCheckCompleteCallback callback) override {
     std::vector<ui::GrammarFragment> grammar_results;
     for (int i = 0; i < text.size(); i++) {
       if (text.substr(i, 5) == u"error") {
diff --git a/chrome/browser/chromeos/input_method/grammar_service_client.cc b/chrome/browser/chromeos/input_method/grammar_service_client.cc
index cb47ec1..09bfdbd 100644
--- a/chrome/browser/chromeos/input_method/grammar_service_client.cc
+++ b/chrome/browser/chromeos/input_method/grammar_service_client.cc
@@ -30,51 +30,73 @@
 
 GrammarServiceClient::GrammarServiceClient() {
   weak_this_ = weak_factory_.GetWeakPtr();
-  machine_learning::ServiceConnection::GetInstance()
-      ->GetMachineLearningService()
-      .LoadGrammarChecker(
-          grammar_checker_.BindNewPipeAndPassReceiver(),
-          base::BindOnce(&GrammarServiceClient::OnLoadGrammarCheckerDone,
-                         weak_this_));
-  machine_learning::ServiceConnection::GetInstance()
-      ->GetMachineLearningService()
-      .LoadTextClassifier(
-          text_classifier_.BindNewPipeAndPassReceiver(),
-          base::BindOnce(&GrammarServiceClient::OnLoadTextClassifierDone,
-                         weak_this_));
 }
 
 GrammarServiceClient::~GrammarServiceClient() = default;
 
-void GrammarServiceClient::OnLoadGrammarCheckerDone(LoadModelResult result) {
+void GrammarServiceClient::OnLoadGrammarCheckerDone(
+    machine_learning::mojom::GrammarCheckerQueryPtr query,
+    const std::string& query_text,
+    TextCheckCompleteCallback callback,
+    machine_learning::mojom::LoadModelResult result) {
   grammar_checker_loaded_ = result == LoadModelResult::OK;
+  if (!grammar_checker_loaded_) {
+    std::move(callback).Run(false, {});
+    return;
+  }
+  grammar_checker_->Check(
+      std::move(query),
+      base::BindOnce(&GrammarServiceClient::ParseGrammarCheckerResult,
+                     weak_this_, query_text, std::move(callback)));
 }
 
-void GrammarServiceClient::OnLoadTextClassifierDone(LoadModelResult result) {
+void GrammarServiceClient::OnLoadTextClassifierDone(
+    const std::string& query_text,
+    TextCheckCompleteCallback callback,
+    machine_learning::mojom::LoadModelResult result) {
   text_classifier_loaded_ = result == LoadModelResult::OK;
+  if (!text_classifier_loaded_) {
+    std::move(callback).Run(false, {});
+    return;
+  }
+  text_classifier_->FindLanguages(
+      query_text, base::BindOnce(&GrammarServiceClient::OnLanguageDetectionDone,
+                                 weak_this_, query_text, std::move(callback)));
 }
 
 bool GrammarServiceClient::RequestTextCheck(
     Profile* profile,
     const std::u16string& text,
-    TextCheckCompleteCallback callback) const {
+    TextCheckCompleteCallback callback) {
   if (!profile || !IsAvailable(profile) || text.size() > kMaxQueryLength ||
       text.size() < kMinQueryLength) {
     std::move(callback).Run(false, {});
     return false;
   }
 
-  text_classifier_->FindLanguages(
-      base::UTF16ToUTF8(text),
-      base::BindOnce(&GrammarServiceClient::OnLanguageDetectionDone, weak_this_,
-                     base::UTF16ToUTF8(text), std::move(callback)));
+  if (text_classifier_loaded_) {
+    text_classifier_->FindLanguages(
+        base::UTF16ToUTF8(text),
+        base::BindOnce(&GrammarServiceClient::OnLanguageDetectionDone,
+                       weak_this_, base::UTF16ToUTF8(text),
+                       std::move(callback)));
+  } else {
+    machine_learning::ServiceConnection::GetInstance()
+        ->GetMachineLearningService()
+        .LoadTextClassifier(
+            text_classifier_.BindNewPipeAndPassReceiver(),
+            base::BindOnce(&GrammarServiceClient::OnLoadTextClassifierDone,
+                           weak_this_, base::UTF16ToUTF8(text),
+                           std::move(callback)));
+  }
+
   return true;
 }
 
 void GrammarServiceClient::OnLanguageDetectionDone(
     const std::string& query_text,
     TextCheckCompleteCallback callback,
-    std::vector<machine_learning::mojom::TextLanguagePtr> languages) const {
+    std::vector<machine_learning::mojom::TextLanguagePtr> languages) {
   if (languages.empty() ||
       languages[0]->confidence < kLanguageConfidenceThreshold ||
       languages[0]->locale != kEnglishLocale) {
@@ -86,10 +108,20 @@
   query->text = query_text;
   query->language = languages[0]->locale;
 
-  grammar_checker_->Check(
-      std::move(query),
-      base::BindOnce(&GrammarServiceClient::ParseGrammarCheckerResult,
-                     weak_this_, query_text, std::move(callback)));
+  if (grammar_checker_loaded_) {
+    grammar_checker_->Check(
+        std::move(query),
+        base::BindOnce(&GrammarServiceClient::ParseGrammarCheckerResult,
+                       weak_this_, query_text, std::move(callback)));
+  } else {
+    machine_learning::ServiceConnection::GetInstance()
+        ->GetMachineLearningService()
+        .LoadGrammarChecker(
+            grammar_checker_.BindNewPipeAndPassReceiver(),
+            base::BindOnce(&GrammarServiceClient::OnLoadGrammarCheckerDone,
+                           weak_this_, std::move(query), query_text,
+                           std::move(callback)));
+  }
 }
 
 void GrammarServiceClient::ParseGrammarCheckerResult(
@@ -130,12 +162,8 @@
   DCHECK(pref);
   // If prefs don't allow spell checking, if the profile is off the record, the
   // grammar service should be unavailable.
-  if (!pref->GetBoolean(spellcheck::prefs::kSpellCheckEnable) ||
-      profile->IsOffTheRecord())
-    return false;
-
-  return text_classifier_loaded_ && text_classifier_.is_bound() &&
-         grammar_checker_loaded_ && grammar_checker_.is_bound();
+  return pref->GetBoolean(spellcheck::prefs::kSpellCheckEnable) &&
+         !profile->IsOffTheRecord();
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/grammar_service_client.h b/chrome/browser/chromeos/input_method/grammar_service_client.h
index 15c4923..74dcf1d 100644
--- a/chrome/browser/chromeos/input_method/grammar_service_client.h
+++ b/chrome/browser/chromeos/input_method/grammar_service_client.h
@@ -58,19 +58,24 @@
   // and calls a provided callback method.
   virtual bool RequestTextCheck(Profile* profile,
                                 const std::u16string& text,
-                                TextCheckCompleteCallback callback) const;
+                                TextCheckCompleteCallback callback);
 
  private:
   void OnLoadGrammarCheckerDone(
+      machine_learning::mojom::GrammarCheckerQueryPtr query,
+      const std::string& query_text,
+      TextCheckCompleteCallback callback,
       machine_learning::mojom::LoadModelResult result);
 
   void OnLoadTextClassifierDone(
+      const std::string& query_text,
+      TextCheckCompleteCallback callback,
       machine_learning::mojom::LoadModelResult result);
 
   void OnLanguageDetectionDone(
       const std::string& query_text,
       TextCheckCompleteCallback callback,
-      std::vector<machine_learning::mojom::TextLanguagePtr> languages) const;
+      std::vector<machine_learning::mojom::TextLanguagePtr> languages);
 
   // Parse the result returned from grammar check service.
   void ParseGrammarCheckerResult(
diff --git a/chrome/browser/chromeos/multidevice_setup/auth_token_validator_factory.cc b/chrome/browser/chromeos/multidevice_setup/auth_token_validator_factory.cc
index 3daee76..6f1d78b 100644
--- a/chrome/browser/chromeos/multidevice_setup/auth_token_validator_factory.cc
+++ b/chrome/browser/chromeos/multidevice_setup/auth_token_validator_factory.cc
@@ -37,7 +37,7 @@
 KeyedService* AuthTokenValidatorFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
   return new AuthTokenValidatorImpl(
-      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(
+      quick_unlock::QuickUnlockFactory::GetForProfile(
           Profile::FromBrowserContext(context)));
 }
 
diff --git a/chrome/browser/chromeos/multidevice_setup/auth_token_validator_impl.h b/chrome/browser/chromeos/multidevice_setup/auth_token_validator_impl.h
index f3777d8..754de12 100644
--- a/chrome/browser/chromeos/multidevice_setup/auth_token_validator_impl.h
+++ b/chrome/browser/chromeos/multidevice_setup/auth_token_validator_impl.h
@@ -5,15 +5,12 @@
 #ifndef CHROME_BROWSER_CHROMEOS_MULTIDEVICE_SETUP_AUTH_TOKEN_VALIDATOR_IMPL_H_
 #define CHROME_BROWSER_CHROMEOS_MULTIDEVICE_SETUP_AUTH_TOKEN_VALIDATOR_IMPL_H_
 
+// TODO(https://crbug.com/1164001): move to forward declaration.
+#include "chrome/browser/ash/login/quick_unlock/quick_unlock_storage.h"
 #include "chromeos/services/multidevice_setup/public/cpp/auth_token_validator.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace chromeos {
-
-namespace quick_unlock {
-class QuickUnlockStorage;
-}  // namespace quick_unlock
-
 namespace multidevice_setup {
 
 // Concrete AuthTokenValidator implementation.
diff --git a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
index 1dbbcb6..76f641a 100644
--- a/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_history_service_factory.cc
@@ -12,6 +12,7 @@
 #include "chrome/browser/chromeos/printing/history/print_job_database_impl.h"
 #include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
 #include "chrome/browser/chromeos/printing/history/print_job_history_service_impl.h"
+#include "chrome/browser/chromeos/printing/history/print_job_reporting_service.h"
 #include "chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
diff --git a/chrome/browser/chromeos/printing/history/print_job_reporting_service.h b/chrome/browser/chromeos/printing/history/print_job_reporting_service.h
index 7483806..744611b 100644
--- a/chrome/browser/chromeos/printing/history/print_job_reporting_service.h
+++ b/chrome/browser/chromeos/printing/history/print_job_reporting_service.h
@@ -8,8 +8,8 @@
 #include <memory>
 
 #include "base/callback.h"
+#include "base/strings/string_piece_forward.h"
 #include "chrome/browser/chromeos/printing/history/print_job_history_service.h"
-#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/reporting/client/report_queue.h"
 
@@ -19,7 +19,8 @@
 class PrintJobReportingService : public KeyedService,
                                  public PrintJobHistoryService::Observer {
  public:
-  static std::unique_ptr<PrintJobReportingService> Create();
+  static std::unique_ptr<PrintJobReportingService> Create(
+      base::StringPiece dm_token_value);
 
   ~PrintJobReportingService() override = default;
 
diff --git a/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.cc b/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.cc
index 20674f0d..9997a8d2 100644
--- a/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.cc
@@ -9,12 +9,10 @@
 #include "base/bind.h"
 #include "base/bind_post_task.h"
 #include "base/callback.h"
+#include "chrome/browser/chromeos/printing/history/print_job_reporting_service.h"
+#include "chrome/browser/policy/dm_token_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "components/reporting/client/report_queue_configuration.h"
-#include "components/reporting/util/backoff_settings.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
 
 namespace chromeos {
 
@@ -42,9 +40,15 @@
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
 
-  auto reporting_service = PrintJobReportingService::Create();
-  ReportQueueFactory::Create(profile,
-                             reporting_service->GetReportQueueSetter());
+  policy::DMToken dm_token =
+      policy::GetDMToken(profile, /*only_affiliated=*/false);
+  // TODO(1229994, marcgrimme) remove the logs as part of refactoring.
+  if (!dm_token.is_valid()) {
+    LOG(ERROR) << "DMToken must be valid";
+    return nullptr;
+  }
+
+  auto reporting_service = PrintJobReportingService::Create(dm_token.value());
 
   return reporting_service.release();
 }
@@ -53,80 +57,4 @@
   return true;
 }
 
-// static
-void ReportQueueFactory::Create(Profile* profile, SuccessCallback success_cb) {
-  policy::DMToken dm_token =
-      policy::GetDMToken(profile, /*only_affiliated=*/false);
-  if (!dm_token.is_valid()) {
-    VLOG(1) << "DMToken must be valid";
-    return;
-  }
-
-  auto config_result = reporting::ReportQueueConfiguration::Create(
-      dm_token.value(), reporting::Destination::PRINT_JOBS,
-      base::BindRepeating([]() { return reporting::Status::StatusOK(); }));
-  if (!config_result.ok()) {
-    VLOG(1) << "ReportQueueConfiguration must be valid";
-    return;
-  }
-
-  // Asynchronously create and try to set ReportQueue.
-  auto try_set_cb = CreateTrySetCallback(dm_token, std::move(success_cb),
-                                         reporting::GetBackoffEntry());
-  base::ThreadPool::PostTask(
-      FROM_HERE, base::BindOnce(reporting::ReportQueueProvider::CreateQueue,
-                                std::move(config_result.ValueOrDie()),
-                                std::move(try_set_cb)));
-}
-
-void ReportQueueFactory::Retry(policy::DMToken dm_token,
-                               std::unique_ptr<net::BackoffEntry> backoff_entry,
-                               SuccessCallback success_cb) {
-  auto config_result = reporting::ReportQueueConfiguration::Create(
-      dm_token.value(), reporting::Destination::PRINT_JOBS,
-      base::BindRepeating([]() { return reporting::Status::StatusOK(); }));
-  if (!config_result.ok()) {
-    VLOG(1) << "ReportQueueConfiguration must be valid";
-    return;
-  }
-
-  // Asynchronously create and try to set ReportQueue.
-  backoff_entry->InformOfRequest(/*succeeded=*/false);
-  base::TimeDelta time_until_release = backoff_entry->GetTimeUntilRelease();
-  auto try_set_cb = CreateTrySetCallback(dm_token, std::move(success_cb),
-                                         std::move(backoff_entry));
-  base::ThreadPool::PostDelayedTask(
-      FROM_HERE,
-      base::BindOnce(reporting::ReportQueueProvider::CreateQueue,
-                     std::move(config_result.ValueOrDie()),
-                     std::move(try_set_cb)),
-      time_until_release);
-}
-
-reporting::ReportQueueProvider::CreateReportQueueCallback
-ReportQueueFactory::CreateTrySetCallback(
-    policy::DMToken dm_token,
-    SuccessCallback success_cb,
-    std::unique_ptr<net::BackoffEntry> backoff_entry) {
-  auto retry_cb = base::BindOnce(&ReportQueueFactory::Retry, dm_token,
-                                 std::move(backoff_entry));
-  return base::BindPostTask(
-      content::GetUIThreadTaskRunner({}),
-      base::BindOnce(&ReportQueueFactory::TrySetReportQueue,
-                     std::move(success_cb), std::move(retry_cb)));
-}
-
-// static
-void ReportQueueFactory::TrySetReportQueue(
-    SuccessCallback success_cb,
-    base::OnceCallback<void(SuccessCallback)> retry_cb,
-    reporting::StatusOr<std::unique_ptr<reporting::ReportQueue>>
-        report_queue_result) {
-  if (!report_queue_result.ok()) {
-    VLOG(1) << "ReportQueue could not be created";
-    return;
-  }
-  std::move(success_cb).Run(std::move(report_queue_result.ValueOrDie()));
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.h b/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.h
index 054a9c7b..85659bf 100644
--- a/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.h
+++ b/chrome/browser/chromeos/printing/history/print_job_reporting_service_factory.h
@@ -5,21 +5,15 @@
 #ifndef CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_REPORTING_SERVICE_FACTORY_H_
 #define CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_REPORTING_SERVICE_FACTORY_H_
 
-#include <memory>
-
 #include "base/memory/singleton.h"
-#include "chrome/browser/chromeos/printing/history/print_job_reporting_service.h"
-#include "chrome/browser/policy/dm_token_utils.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-#include "components/reporting/client/report_queue.h"
-#include "components/reporting/client/report_queue_provider.h"
-#include "net/base/backoff_entry.h"
 
 namespace content {
 class BrowserContext;
 }  // namespace content
 
 namespace chromeos {
+class PrintJobReportingService;
 
 // Singleton that owns all PrintJobReportingServices and associates them with
 // Profiles.
@@ -49,30 +43,6 @@
   bool ServiceIsNULLWhileTesting() const override;
 };
 
-class ReportQueueFactory {
- public:
-  using SuccessCallback =
-      base::OnceCallback<void(std::unique_ptr<reporting::ReportQueue>)>;
-
-  static void Create(Profile* profile, SuccessCallback done_cb);
-
- private:
-  static void Retry(policy::DMToken dm_token,
-                    std::unique_ptr<net::BackoffEntry> backoff_entry,
-                    SuccessCallback success_cb);
-
-  static void TrySetReportQueue(
-      SuccessCallback success_cb,
-      base::OnceCallback<void(SuccessCallback)> failure_cb,
-      reporting::StatusOr<std::unique_ptr<reporting::ReportQueue>>
-          report_queue_result);
-
-  static reporting::ReportQueueProvider::CreateReportQueueCallback
-  CreateTrySetCallback(policy::DMToken dm_token,
-                       SuccessCallback success_cb,
-                       std::unique_ptr<net::BackoffEntry> backoff_entry);
-};
-
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_PRINTING_HISTORY_PRINT_JOB_REPORTING_SERVICE_FACTORY_H_
diff --git a/chrome/browser/chromeos/printing/history/print_job_reporting_service_impl.cc b/chrome/browser/chromeos/printing/history/print_job_reporting_service_impl.cc
index 6ff7914..e64e87f3 100644
--- a/chrome/browser/chromeos/printing/history/print_job_reporting_service_impl.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_reporting_service_impl.cc
@@ -11,11 +11,14 @@
 #include "base/callback_list.h"
 #include "base/containers/queue.h"
 #include "base/memory/weak_ptr.h"
+#include "base/strings/string_piece.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
+#include "chrome/browser/chromeos/printing/history/print_job_info.pb.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "components/policy/proto/device_management_backend.pb.h"
+#include "components/reporting/client/report_queue_factory.h"
 #include "components/reporting/proto/record_constants.pb.h"
 #include "components/reporting/util/status.h"
 #include "components/reporting/util/status.pb.h"
@@ -30,13 +33,18 @@
 
 class PrintJobReportingServiceImpl : public PrintJobReportingService {
  public:
-  PrintJobReportingServiceImpl() : cros_settings_(CrosSettings::Get()) {
+  explicit PrintJobReportingServiceImpl(base::StringPiece dm_token_value)
+      : cros_settings_(CrosSettings::Get()) {
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
     UpdateShouldReport();
     should_report_subscription_ = cros_settings_->AddSettingsObserver(
         kReportDevicePrintJobs,
         base::BindRepeating(&PrintJobReportingServiceImpl::UpdateShouldReport,
                             weak_factory_.GetWeakPtr()));
+
+    reporting::ReportQueueFactory::Create(dm_token_value,
+                                          reporting::Destination::PRINT_JOBS,
+                                          GetReportQueueSetter());
   }
 
   ~PrintJobReportingServiceImpl() override = default;
@@ -196,8 +204,9 @@
   base::WeakPtrFactory<PrintJobReportingServiceImpl> weak_factory_{this};
 };
 
-std::unique_ptr<PrintJobReportingService> PrintJobReportingService::Create() {
-  return std::make_unique<PrintJobReportingServiceImpl>();
+std::unique_ptr<PrintJobReportingService> PrintJobReportingService::Create(
+    base::StringPiece dm_token_value) {
+  return std::make_unique<PrintJobReportingServiceImpl>(dm_token_value);
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/printing/history/print_job_reporting_service_unittest.cc b/chrome/browser/chromeos/printing/history/print_job_reporting_service_unittest.cc
index d3001dc..d38d072 100644
--- a/chrome/browser/chromeos/printing/history/print_job_reporting_service_unittest.cc
+++ b/chrome/browser/chromeos/printing/history/print_job_reporting_service_unittest.cc
@@ -273,7 +273,8 @@
     user_manager->AddKioskAppUser(account_id);
     user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
         std::move(user_manager));
-    print_job_reporting_service_ = PrintJobReportingService::Create();
+    print_job_reporting_service_ =
+        PrintJobReportingService::Create(/* dm_token_value= */ "");
   }
 
   void ChangeReportingSetting(bool should_report) {
@@ -357,7 +358,8 @@
 TEST_F(PrintJobReportingServiceTest, ShouldReportPolicyInitiallyEnabled) {
   ChangeReportingSetting(true);
   // Create the reporting service after setting the policy to true.
-  print_job_reporting_service_ = PrintJobReportingService::Create();
+  print_job_reporting_service_ =
+      PrintJobReportingService::Create(/* dm_token_value= */ "");
   SetReportQueue();
 
   print_job_reporting_service_->OnPrintJobFinished(JobInfo1());
@@ -370,7 +372,8 @@
 TEST_F(PrintJobReportingServiceTest, ShouldReportPolicyInitiallyDisabled) {
   ChangeReportingSetting(false);
   // Create the reporting service after setting the policy to false.
-  print_job_reporting_service_ = PrintJobReportingService::Create();
+  print_job_reporting_service_ =
+      PrintJobReportingService::Create(/* dm_token_value= */ "");
   SetReportQueue();
 
   print_job_reporting_service_->OnPrintJobFinished(JobInfo1());
diff --git a/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc b/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
index b425918..1a5c8b1 100644
--- a/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
+++ b/chrome/browser/devtools/device/adb/adb_client_socket_browsertest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/run_loop.h"
+#include "build/build_config.h"
 #include "chrome/browser/devtools/device/adb/adb_device_provider.h"
 #include "chrome/browser/devtools/device/adb/mock_adb_server.h"
 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
@@ -146,7 +147,13 @@
 
 // Combine all tests into one. Splitting up into multiple tests can be flaky
 // due to failure to bind a hardcoded port. crbug.com/566057
-IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, TestCombined) {
+// The tests seems to be stable on Windows bots only:
+#if defined(OS_WIN)
+#define MAYBE_TestCombined TestCombined
+#else
+#define MAYBE_TestCombined DISABLED_TestCombined
+#endif
+IN_PROC_BROWSER_TEST_F(AdbClientSocketTest, MAYBE_TestCombined) {
   StartMockAdbServer(FlushWithoutSize);
   StartTest();
   CheckDevices();
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation_protos/device_trust_attestation_ca.proto b/chrome/browser/enterprise/connectors/device_trust/attestation_protos/device_trust_attestation_ca.proto
index bcf7478..5dcb79b5 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation_protos/device_trust_attestation_ca.proto
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation_protos/device_trust_attestation_ca.proto
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// This file is an exact copy of
+// This file is based on a copy of
 // third_party/cros_system_api/dbus/attestation/attestation_ca.proto
 // third_party/cros_system_api is only for ChromeOS.
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation_service.cc
index e708794d..d1ad3bf 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation_service.cc
@@ -4,10 +4,6 @@
 
 #include "chrome/browser/enterprise/connectors/device_trust/attestation_service.h"
 
-#include "base/base64.h"
-#include "base/bind.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
 #include "base/task/task_traits.h"
@@ -16,6 +12,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/connectors/device_trust/crypto_utility.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_key_pair.h"
+#include "chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
 #include "components/policy/core/common/cloud/machine_level_user_cloud_policy_manager.h"
@@ -77,56 +74,6 @@
       signed_challenge.signature());
 }
 
-std::string AttestationService::JsonChallengeToProtobufChallenge(
-    const std::string& challenge) {
-  SignedData signed_challenge;
-  // Get challenge and decode it.
-  absl::optional<base::Value> data = base::JSONReader::Read(
-      challenge, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS);
-
-  // If json is malformed or it doesn't include the needed fields return
-  // an empty string.
-  if (!data || !data.value().FindPath("challenge.data") ||
-      !data.value().FindPath("challenge.signature"))
-    return std::string();
-
-  if (!base::Base64Decode(data.value().FindPath("challenge.data")->GetString(),
-                          signed_challenge.mutable_data()))
-    LOG(ERROR) << "Error during decoding base64 challenge data.";
-  if (!base::Base64Decode(
-          data.value().FindPath("challenge.signature")->GetString(),
-          signed_challenge.mutable_signature()))
-    LOG(ERROR) << "Error during decoding base64 challenge signature.";
-
-  std::string serialized_signed_challenge;
-  if (!signed_challenge.SerializeToString(&serialized_signed_challenge)) {
-    LOG(ERROR) << __func__ << ": Failed to serialize signed data.";
-    return std::string();
-  }
-  return serialized_signed_challenge;
-}
-
-std::string AttestationService::ProtobufChallengeToJsonChallenge(
-    const std::string& challenge_response) {
-  base::Value signed_data(base::Value::Type::DICTIONARY);
-
-  SignedData signed_data_proto;
-  signed_data_proto.ParseFromString(challenge_response);
-  std::string encoded;
-  base::Base64Encode(signed_data_proto.data(), &encoded);
-  signed_data.SetKey("data", base::Value(encoded));
-
-  base::Base64Encode(signed_data_proto.signature(), &encoded);
-  signed_data.SetKey("signature", base::Value(encoded));
-
-  base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetKey("challengeResponse", std::move(signed_data));
-
-  std::string json;
-  base::JSONWriter::Write(dict, &json);
-  return json;
-}
-
 std::string AttestationService::ExportPublicKey() {
   std::vector<uint8_t> public_key_info;
   if (!key_pair_->ExportPublicKey(&public_key_info))
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation_service.h
index 4c15498..d957116f 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation_service.h
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation_service.h
@@ -34,36 +34,6 @@
   void SignEnterpriseChallenge(const SignEnterpriseChallengeRequest& request,
                                SignEnterpriseChallengeReply* result);
 
-  // Take the challenge that comes from the Idp in json format and generate a
-  // SignedData proto.
-  // The expected format of the challenge is the following:
-  // {
-  //    "challenge": {
-  //        object (SignedData)
-  //    }
-  // }
-  // SignedData has the following scheme:
-  // {
-  //    "data": string (base64 encoded string),
-  //    "signature": string (base64 encoded string),
-  // }
-  std::string JsonChallengeToProtobufChallenge(const std::string& challenge);
-
-  // Take a challenge_response proto and return the json version of it.
-  // The format is the following:
-  // {
-  //    "challengeResponse": {
-  //        object (SignedData)
-  //    }
-  // }
-  // SignedData has the following scheme:
-  // {
-  //    "data": string (base64 encoded string),
-  //    "signature": string (base64 encoded string),
-  // }
-  std::string ProtobufChallengeToJsonChallenge(
-      const std::string& challenge_response);
-
   // Verify challenge comes from Verify Access.
   bool ChallengeComesFromVerifiedAccess(
       const std::string& serialized_signed_data,
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation_service_unittest.cc
index 1077081..0bbbf61 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation_service_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/base64.h"
 #include "base/json/json_reader.h"
 #include "base/values.h"
+#include "chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
@@ -66,8 +67,7 @@
   SignEnterpriseChallengeRequest request;
   SignEnterpriseChallengeReply result;
   // Get the challenge from the SignedData json and create request.
-  request.set_challenge(
-      attestation_service_.JsonChallengeToProtobufChallenge(challenge));
+  request.set_challenge(JsonChallengeToProtobufChallenge(challenge));
   // If challenge is equal to empty string, then
   // `JsonChallengeToProtobufChallenge()` failed.
   EXPECT_NE(request.challenge(), std::string());
@@ -78,8 +78,7 @@
   EXPECT_NE(result.challenge_response(), std::string());
 
   absl::optional<base::Value> challenge_response = base::JSONReader::Read(
-      attestation_service_.ProtobufChallengeToJsonChallenge(
-          result.challenge_response()),
+      ProtobufChallengeToJsonChallenge(result.challenge_response()),
       base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS);
 
   EXPECT_NE(challenge_response.value()
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
index 8b597ec..8a999f6 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
@@ -4,9 +4,14 @@
 
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_service.h"
 
+#include "base/base64.h"
 #include "chrome/browser/enterprise/connectors/connectors_prefs.h"
+#include "chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h"
 #include "chrome/browser/enterprise/connectors/device_trust/signal_reporter.h"
 #include "chrome/browser/profiles/profile.h"
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/attestation/tpm_challenge_key_with_timeout.h"
+#endif
 
 namespace enterprise_connectors {
 
@@ -24,6 +29,7 @@
 
 DeviceTrustService::DeviceTrustService(Profile* profile)
     : prefs_(profile->GetPrefs()),
+      profile_(profile),
       signal_report_callback_(
           base::BindOnce(&DeviceTrustService::OnSignalReported,
                          base::Unretained(this))) {
@@ -144,13 +150,37 @@
 std::string DeviceTrustService::GetAttestationCredentialForTesting() const {
   return attestation_service_->ExportPublicKey();
 }
+#endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 
 void DeviceTrustService::BuildChallengeResponse(const std::string& challenge,
                                                 AttestationCallback callback) {
+#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
   attestation_service_->BuildChallengeResponseForVAChallenge(
       challenge, std::move(callback));
-}
+#else
+  tpm_key_challenger_ =
+      std::make_unique<ash::attestation::TpmChallengeKeyWithTimeout>();
+  tpm_key_challenger_->BuildResponse(
+      base::TimeDelta::FromSeconds(15), ash::attestation::KEY_DEVICE, profile_,
+      base::BindOnce(&DeviceTrustService::ReturnResult,
+                     weak_factory_.GetWeakPtr(), std::move(callback)),
+      JsonChallengeToProtobufChallenge(challenge), /*register_key=*/false,
+      /*key_name_for_spkac=*/"");
 #endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
+}
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+void DeviceTrustService::ReturnResult(
+    AttestationCallback callback,
+    const ash::attestation::TpmChallengeKeyResult& result) {
+  if (!result.IsSuccess())
+    LOG(WARNING) << "Device attestation error: " << result.GetErrorMessage();
+
+  std::string encoded_response;
+  base::Base64Encode(result.challenge_response, &encoded_response);
+  std::move(callback).Run(encoded_response);
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 base::CallbackListSubscription
 DeviceTrustService::RegisterTrustedUrlPatternsChangedCallback(
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
index c9fb155..abc0af7 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
@@ -12,10 +12,12 @@
 #include "components/policy/core/browser/configuration_policy_handler.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_service.h"
-
 #if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 #include "chrome/browser/enterprise/connectors/device_trust/attestation_service.h"
 #endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/ash/attestation/tpm_challenge_key_with_timeout.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #include <memory>
 
@@ -58,11 +60,11 @@
 
 #if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
   std::string GetAttestationCredentialForTesting() const;
-  // Starts flow that actually builds a response. This method is called
-  // from a non_UI thread.
+#endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
+
+  // Starts flow that actually builds a response.
   void BuildChallengeResponse(const std::string& challenge,
                               AttestationCallback callback);
-#endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 
   // Register a callback that listens for changes in the trust URL patterns.
   base::CallbackListSubscription RegisterTrustedUrlPatternsChangedCallback(
@@ -82,6 +84,7 @@
   base::RepeatingCallback<bool()> MakePolicyCheck();
 
   PrefService* prefs_;
+  Profile* profile_;
 
   // Caches whether the device trust service is enabled or not.  This is used
   // to implement IsEnabled() so the method does not need to access the prefs.
@@ -100,6 +103,15 @@
 #endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 
   TrustedUrlPatternsChangedCallbackList callbacks_;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Run the callback that may resume the navigation with the challenge
+  // response. In case the challenge response was not successfully built. An
+  // empty challenge response will be used.
+  void ReturnResult(AttestationCallback callback,
+                    const ash::attestation::TpmChallengeKeyResult& result);
+  std::unique_ptr<ash::attestation::TpmChallengeKeyWithTimeout>
+      tpm_key_challenger_;
+#endif  // IS_CHROMEOS_ASH
 
   base::WeakPtrFactory<DeviceTrustService> weak_factory_{this};
 };
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_utils.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_utils.cc
new file mode 100644
index 0000000..38006ff
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_utils.cc
@@ -0,0 +1,80 @@
+// Copyright (c) 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h"
+
+#include "base/base64.h"
+#include "base/bind.h"
+#include "base/json/json_reader.h"
+#include "base/json/json_writer.h"
+#include "base/logging.h"
+#include "base/values.h"
+#include "build/build_config.h"
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chromeos/dbus/attestation/attestation_ca.pb.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
+#include "chrome/browser/enterprise/connectors/device_trust/device_trust_attestation_ca.pb.h"
+#endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
+
+namespace enterprise_connectors {
+
+std::string JsonChallengeToProtobufChallenge(const std::string& challenge) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  attestation::SignedData signed_challenge;
+#else
+  SignedData signed_challenge;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  // Get challenge and decode it.
+  absl::optional<base::Value> data = base::JSONReader::Read(
+      challenge, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS);
+
+  // If json is malformed or it doesn't include the needed fields return
+  // an empty string.
+  if (!data || !data.value().FindPath("challenge.data") ||
+      !data.value().FindPath("challenge.signature"))
+    return std::string();
+
+  if (!base::Base64Decode(data.value().FindPath("challenge.data")->GetString(),
+                          signed_challenge.mutable_data()))
+    LOG(ERROR) << "Error during decoding base64 challenge data.";
+  if (!base::Base64Decode(
+          data.value().FindPath("challenge.signature")->GetString(),
+          signed_challenge.mutable_signature()))
+    LOG(ERROR) << "Error during decoding base64 challenge signature.";
+
+  std::string serialized_signed_challenge;
+  if (!signed_challenge.SerializeToString(&serialized_signed_challenge)) {
+    LOG(ERROR) << __func__ << ": Failed to serialize signed data.";
+    return std::string();
+  }
+  return serialized_signed_challenge;
+}
+
+std::string ProtobufChallengeToJsonChallenge(
+    const std::string& challenge_response) {
+  base::Value signed_data(base::Value::Type::DICTIONARY);
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  attestation::SignedData signed_data_proto;
+#else
+  SignedData signed_data_proto;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+  signed_data_proto.ParseFromString(challenge_response);
+  std::string encoded;
+  base::Base64Encode(signed_data_proto.data(), &encoded);
+  signed_data.SetKey("data", base::Value(encoded));
+
+  base::Base64Encode(signed_data_proto.signature(), &encoded);
+  signed_data.SetKey("signature", base::Value(encoded));
+
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetKey("challengeResponse", std::move(signed_data));
+
+  std::string json;
+  base::JSONWriter::Write(dict, &json);
+  return json;
+}
+
+}  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h b/chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h
new file mode 100644
index 0000000..7d363ff
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_utils.h
@@ -0,0 +1,44 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_DEVICE_TRUST_UTILS_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_DEVICE_TRUST_UTILS_H_
+
+#include <string>
+
+namespace enterprise_connectors {
+
+// Take the challenge that comes from the Idp in json format and generate a
+// SignedData proto.
+// The expected format of the challenge is the following:
+// {
+//    "challenge": {
+//        object (SignedData)
+//    }
+// }
+// SignedData has the following scheme:
+// {
+//    "data": string (base64 encoded string),
+//    "signature": string (base64 encoded string),
+// }
+std::string JsonChallengeToProtobufChallenge(const std::string& challenge);
+
+// Take a challenge_response proto and return the json version of it.
+// The format is the following:
+// {
+//    "challengeResponse": {
+//        object (SignedData)
+//    }
+// }
+// SignedData has the following scheme:
+// {
+//    "data": string (base64 encoded string),
+//    "signature": string (base64 encoded string),
+// }
+std::string ProtobufChallengeToJsonChallenge(
+    const std::string& challenge_response);
+
+}  // namespace enterprise_connectors
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_DEVICE_TRUST_UTILS_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/navigation_throttle.cc b/chrome/browser/enterprise/connectors/device_trust/navigation_throttle.cc
index 56b2b6de..1a54447 100644
--- a/chrome/browser/enterprise/connectors/device_trust/navigation_throttle.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/navigation_throttle.cc
@@ -8,7 +8,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/connectors/connectors_prefs.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_factory.h"
-#include "chrome/browser/enterprise/connectors/device_trust/device_trust_interface.pb.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/policy/core/browser/url_util.h"
@@ -76,7 +75,7 @@
     matcher_->RemoveConditionSets({id});
   }
 
-  if (device_trust_service_->IsEnabled()) {
+  if (device_trust_service_ && device_trust_service_->IsEnabled()) {
     // Add the new endpoints to the conditions.
     policy::url_util::AddFilters(matcher_.get(), true /* allowed */, &id,
                                  origins);
@@ -106,8 +105,7 @@
   if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS())
     return PROCEED;
 
-  DCHECK(device_trust_service_);
-  if (!device_trust_service_->IsEnabled())
+  if (!device_trust_service_ || !device_trust_service_->IsEnabled())
     return PROCEED;
 
   DCHECK(matcher_);
diff --git a/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc
index aa93e83..febe0a8 100644
--- a/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/navigation_throttle.h"
 
 #include "base/values.h"
+#include "build/build_config.h"
 #include "chrome/browser/enterprise/connectors/connectors_prefs.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
@@ -25,6 +26,7 @@
 const base::Value kOrigins[]{base::Value("https://www.example.com"),
                              base::Value("example2.example.com")};
 
+#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 constexpr char challenge[] =
     "{"
     "\"challenge\": {"
@@ -40,6 +42,7 @@
     "nuJn3H6583SsiaTbKgyHKmObbGdt0GVWLQ==\""
     "}"
     "}";
+#endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 
 }  // namespace
 
@@ -106,6 +109,9 @@
       net::HttpUtil::AssembleRawHeaders(raw_response_headers));
 }
 
+// TODO(b/194041030): Enable for Chrome OS after navigation is deferred before
+// the challenge response is created.
+#if defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 TEST_F(DeviceTrustNavigationThrottleTest, BuildChallengeResponseFromHeader) {
   EnableDeviceTrust();
   GURL url("https://www.example.com/");
@@ -118,5 +124,6 @@
 
   EXPECT_EQ(NavigationThrottle::DEFER, throttle->WillStartRequest().action());
 }
+#endif  // defined(OS_LINUX) || defined(OS_WIN) || defined(OS_MAC)
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 56c80cb..b03e48a 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -342,9 +342,9 @@
               ->GetAccountId());
   if (user_cannot_manually_enter_password)
     return true;
-  chromeos::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
-      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(profile_);
-  const chromeos::quick_unlock::AuthToken* auth_token =
+  ash::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+      ash::quick_unlock::QuickUnlockFactory::GetForProfile(profile_);
+  const ash::quick_unlock::AuthToken* auth_token =
       quick_unlock_storage->GetAuthToken();
   if (!auth_token || !auth_token->GetAge())
     return false;
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
index 94e5324..f34902e8 100644
--- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
+++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -557,6 +557,10 @@
   features.Append(GenerateFeatureFlag(
       "multipaste", base::FeatureList::IsEnabled(
                         chromeos::features::kVirtualKeyboardMultipaste)));
+  features.Append(GenerateFeatureFlag(
+      "multipaste-suggestion",
+      base::FeatureList::IsEnabled(
+          chromeos::features::kVirtualKeyboardMultipasteSuggestion)));
 
   results->SetKey("features", std::move(features));
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 4f53efd..371f93e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1678,6 +1678,11 @@
     "expiry_milestone": 95
   },
   {
+    "name": "enable-cros-virtual-keyboard-multipaste-suggestion",
+    "owners": [ "jiwan", "essential-inputs-team@google.com" ],
+    "expiry_milestone": 98
+  },
+  {
     "name": "enable-data-reduction-proxy-server-experiment",
     "owners": [ "//components/data_reduction_proxy/OWNERS" ],
     // This flag is used for frequent manual testing and should not be removed.
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index bc8ab16..94dfc703 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -913,11 +913,6 @@
     "Enables the usage of Apple's new notification API which will run on macOS "
     "10.14+";
 
-const char kNotificationsViaHelperAppName[] = "Notifications via helper app";
-const char kNotificationsViaHelperAppDescription[] =
-    "Enables the notification helper app to display alerts on macOS instead of "
-    "the XPC service";
-
 const char kWinrtGeolocationImplementationName[] =
     "WinRT Geolocation Implementation";
 const char kWinrtGeolocationImplementationDescription[] =
@@ -5190,6 +5185,12 @@
 const char kVirtualKeyboardMultipasteDescription[] =
     "Show virtual keyboard with multipaste UI";
 
+const char kVirtualKeyboardMultipasteSuggestionName[] =
+    "Virtual Keyboard MultiPaste Suggestion";
+const char kVirtualKeyboardMultipasteSuggestionDescription[] =
+    "Show multipaste items in virtual keyboard suggestion bar if they are "
+    "copied recently";
+
 const char kVmStatusPageName[] = "VM status page";
 const char kVmStatusPageDescription[] = "Enable VM status page";
 
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index bf02e1c6..d04b473 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -540,9 +540,6 @@
 extern const char kNewMacNotificationAPIName[];
 extern const char kNewMacNotificationAPIDescription[];
 
-extern const char kNotificationsViaHelperAppName[];
-extern const char kNotificationsViaHelperAppDescription[];
-
 extern const char kWinrtGeolocationImplementationName[];
 extern const char kWinrtGeolocationImplementationDescription[];
 
@@ -2999,6 +2996,9 @@
 extern const char kVirtualKeyboardMultipasteName[];
 extern const char kVirtualKeyboardMultipasteDescription[];
 
+extern const char kVirtualKeyboardMultipasteSuggestionName[];
+extern const char kVirtualKeyboardMultipasteSuggestionDescription[];
+
 extern const char kVmStatusPageName[];
 extern const char kVmStatusPageDescription[];
 
diff --git a/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc b/chrome/browser/media/webrtc/webrtc_mediadevices_browsertest.cc
similarity index 93%
rename from chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc
rename to chrome/browser/media/webrtc/webrtc_mediadevices_browsertest.cc
index 94b3c7f..0eb7218 100644
--- a/chrome/browser/media/webrtc/webrtc_getmediadevices_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_mediadevices_browsertest.cc
@@ -48,11 +48,10 @@
 // It needs to be a browser test (and not content browser test) to be able to
 // test that labels are cleared or not depending on if access to devices has
 // been granted.
-class WebRtcGetMediaDevicesBrowserTest
-    : public WebRtcTestBase,
-      public testing::WithParamInterface<bool> {
+class WebRtcMediaDevicesBrowserTest : public WebRtcTestBase,
+                                      public testing::WithParamInterface<bool> {
  public:
-  WebRtcGetMediaDevicesBrowserTest()
+  WebRtcMediaDevicesBrowserTest()
       : has_audio_output_devices_initialized_(false),
         has_audio_output_devices_(false) {}
 
@@ -158,7 +157,7 @@
   base::test::ScopedFeatureList audio_service_features_;
 };
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        EnumerateDevicesWithoutAccess) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -175,7 +174,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        EnumerateDevicesWithAccess) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -194,7 +193,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        DeviceIdSameGroupIdDiffersAfterReload) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -224,7 +223,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        DeviceIdSameGroupIdDiffersAcrossTabs) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -258,7 +257,7 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        DeviceIdDiffersAfterClearingCookies) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -287,7 +286,7 @@
   CheckEnumerationsAreDifferent(devices, devices2);
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        DeviceIdDiffersAcrossTabsWithCookiesDisabled) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -314,7 +313,7 @@
   CheckEnumerationsAreDifferent(devices, devices2);
 }
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesBrowserTest,
                        DeviceIdDiffersSameTabAfterReloadWithCookiesDisabled) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL url(embedded_test_server()->GetURL(kMainWebrtcTestHtmlPage));
@@ -338,14 +337,14 @@
   CheckEnumerationsAreDifferent(devices, devices2);
 }
 
-class WebRtcGetMediaDevicesPrerenderingBrowserTest
-    : public WebRtcGetMediaDevicesBrowserTest {
+class WebRtcMediaDevicesPrerenderingBrowserTest
+    : public WebRtcMediaDevicesBrowserTest {
  public:
-  WebRtcGetMediaDevicesPrerenderingBrowserTest()
+  WebRtcMediaDevicesPrerenderingBrowserTest()
       : prerender_helper_(base::BindRepeating(
-            &WebRtcGetMediaDevicesPrerenderingBrowserTest::web_contents,
+            &WebRtcMediaDevicesPrerenderingBrowserTest::web_contents,
             base::Unretained(this))) {}
-  ~WebRtcGetMediaDevicesPrerenderingBrowserTest() override = default;
+  ~WebRtcMediaDevicesPrerenderingBrowserTest() override = default;
 
   content::test::PrerenderTestHelper* prerender_helper() {
     return &prerender_helper_;
@@ -359,7 +358,7 @@
   content::test::PrerenderTestHelper prerender_helper_;
 };
 
-IN_PROC_BROWSER_TEST_F(WebRtcGetMediaDevicesPrerenderingBrowserTest,
+IN_PROC_BROWSER_TEST_F(WebRtcMediaDevicesPrerenderingBrowserTest,
                        EnumerateDevicesInPrerendering) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
index 5fb725b..ce6dd5c 100644
--- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
+++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -224,11 +224,18 @@
   base::UmaHistogramBoolean("Windows.ApplockerRunning", IsApplockerRunning());
 #endif  // defined(OS_WIN)
 
+  // TODO(crbug.com/1216328) Remove logging.
+  LOG(ERROR) << "crbug.com/1216328: Checking Bluetooth availability started. "
+                "Please report if there is no report that this ends.";
   bluetooth_utility::ReportBluetoothAvailability();
+  LOG(ERROR) << "crbug.com/1216328: Checking Bluetooth availability ended.";
 
   // Record whether Chrome is the default browser or not.
+  LOG(ERROR) << "crbug.com/1216328: Checking default browser status started. "
+                "Please report if there is no report that this ends.";
   shell_integration::DefaultWebClientState default_state =
       shell_integration::GetDefaultBrowser();
+  LOG(ERROR) << "crbug.com/1216328: Checking default browser status ended.";
   base::UmaHistogramEnumeration("DefaultBrowser.State", default_state,
                                 shell_integration::NUM_DEFAULT_STATES);
 
diff --git a/chrome/browser/notifications/alert_dispatcher_xpc.h b/chrome/browser/notifications/alert_dispatcher_xpc.h
deleted file mode 100644
index 12106c1a..0000000
--- a/chrome/browser/notifications/alert_dispatcher_xpc.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_NOTIFICATIONS_ALERT_DISPATCHER_XPC_H_
-#define CHROME_BROWSER_NOTIFICATIONS_ALERT_DISPATCHER_XPC_H_
-
-#import <Foundation/Foundation.h>
-
-#import "chrome/browser/notifications/alert_dispatcher_mac.h"
-
-// Implementation of the AlertDispatcher interface to display notifications via
-// an XPC Service.
-// TODO(crbug.com/1170731): Remove this in favor of a helper app.
-@interface AlertDispatcherXPC : NSObject <AlertDispatcher>
-@end
-
-#endif  // CHROME_BROWSER_NOTIFICATIONS_ALERT_DISPATCHER_XPC_H_
diff --git a/chrome/browser/notifications/alert_dispatcher_xpc.mm b/chrome/browser/notifications/alert_dispatcher_xpc.mm
deleted file mode 100644
index ab4c2b0..0000000
--- a/chrome/browser/notifications/alert_dispatcher_xpc.mm
+++ /dev/null
@@ -1,194 +0,0 @@
-// Copyright 2021 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 "chrome/browser/notifications/alert_dispatcher_xpc.h"
-
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/callback_helpers.h"
-#include "base/containers/flat_set.h"
-#include "base/logging.h"
-#include "base/mac/bundle_locations.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/mac/scoped_nsobject.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/strings/sys_string_conversions.h"
-#include "chrome/browser/notifications/notification_platform_bridge_mac_utils.h"
-#import "chrome/browser/ui/cocoa/notifications/notification_delivery.h"
-#include "chrome/browser/ui/cocoa/notifications/xpc_mach_port.h"
-#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h"
-#include "components/crash/core/app/crashpad.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-#include "third_party/crashpad/crashpad/client/crashpad_client.h"
-
-namespace {
-
-// This enum backs an UMA histogram, so it should be treated as append-only.
-enum class XPCConnectionEvent {
-  kInterrupted = 0,
-  kInvalidated = 1,
-  kMaxValue = kInvalidated,
-};
-
-void RecordXPCEvent(XPCConnectionEvent event) {
-  base::UmaHistogramEnumeration("Notifications.XPCConnectionEvent", event);
-}
-
-}  // namespace
-
-@implementation AlertDispatcherXPC {
-  // The connection to the XPC server in charge of delivering alerts.
-  base::scoped_nsobject<NSXPCConnection> _xpcConnection;
-
-  // YES if the remote object has had |-setMachExceptionPort:| called
-  // since the service was last started, interrupted, or invalidated.
-  // If NO, then -serviceProxy will set the exception port.
-  BOOL _setExceptionPort;
-}
-
-- (instancetype)init {
-  if ((self = [super init])) {
-    _xpcConnection.reset([[NSXPCConnection alloc]
-        initWithServiceName:
-            [NSString
-                stringWithFormat:notification_constants::kAlertXPCServiceName,
-                                 [base::mac::OuterBundle() bundleIdentifier]]]);
-    _xpcConnection.get().remoteObjectInterface =
-        [NSXPCInterface interfaceWithProtocol:@protocol(NotificationDelivery)];
-
-    _xpcConnection.get().interruptionHandler = ^{
-      // We will be getting this handler both when the XPC server crashes or
-      // when it decides to close the connection.
-      LOG(WARNING) << "AlertNotificationService: XPC connection interrupted.";
-      RecordXPCEvent(XPCConnectionEvent::kInterrupted);
-      _setExceptionPort = NO;
-    };
-
-    _xpcConnection.get().invalidationHandler = ^{
-      // This means that the connection should be recreated if it needs
-      // to be used again.
-      LOG(WARNING) << "AlertNotificationService: XPC connection invalidated.";
-      RecordXPCEvent(XPCConnectionEvent::kInvalidated);
-      _setExceptionPort = NO;
-    };
-
-    _xpcConnection.get().exportedInterface =
-        [NSXPCInterface interfaceWithProtocol:@protocol(NotificationReply)];
-    _xpcConnection.get().exportedObject = self;
-    [_xpcConnection resume];
-  }
-
-  return self;
-}
-
-// AlertDispatcher:
-- (void)dispatchNotification:(NSDictionary*)data {
-  [[self serviceProxy] deliverNotification:data];
-}
-
-- (void)closeNotificationWithId:(NSString*)notificationId
-                      profileId:(NSString*)profileId
-                      incognito:(BOOL)incognito {
-  [[self serviceProxy] closeNotificationWithId:notificationId
-                                     profileId:profileId
-                                     incognito:incognito];
-}
-
-- (void)closeNotificationsWithProfileId:(NSString*)profileId
-                              incognito:(BOOL)incognito {
-  [[self serviceProxy] closeNotificationsWithProfileId:profileId
-                                             incognito:incognito];
-}
-
-- (void)closeAllNotifications {
-  [[self serviceProxy] closeAllNotifications];
-}
-
-- (void)getDisplayedAlertsForProfileId:(NSString*)profileId
-                             incognito:(BOOL)incognito
-                              callback:
-                                  (GetDisplayedNotificationsCallback)callback {
-  // Move |callback| into block storage so we can use it from the block below.
-  __block GetDisplayedNotificationsCallback blockCallback = std::move(callback);
-  auto reply = ^(NSArray* alerts) {
-    std::set<std::string> displayedNotifications;
-
-    for (NSString* alert in alerts)
-      displayedNotifications.insert(base::SysNSStringToUTF8(alert));
-
-    content::GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE, base::BindOnce(std::move(blockCallback),
-                                  std::move(displayedNotifications),
-                                  /*supports_synchronization=*/true));
-  };
-
-  [[self serviceProxy] getDisplayedAlertsForProfileId:profileId
-                                            incognito:incognito
-                                                reply:reply];
-}
-
-- (void)getAllDisplayedAlertsWithCallback:
-    (GetAllDisplayedNotificationsCallback)callback {
-  // Move |callback| into block storage so we can use it from the block below.
-  __block GetAllDisplayedNotificationsCallback blockCallback =
-      std::move(callback);
-  auto reply = ^(NSArray* alerts) {
-    std::vector<MacNotificationIdentifier> alertIds;
-    alertIds.reserve([alerts count]);
-
-    for (NSDictionary* toast in alerts) {
-      std::string notificationId = base::SysNSStringToUTF8(
-          toast[notification_constants::kNotificationId]);
-      std::string profileId = base::SysNSStringToUTF8(
-          toast[notification_constants::kNotificationProfileId]);
-      bool incognito =
-          [toast[notification_constants::kNotificationIncognito] boolValue];
-
-      alertIds.push_back(
-          {std::move(notificationId), std::move(profileId), incognito});
-    }
-
-    // Create set from std::vector to avoid N^2 insertion runtime.
-    base::flat_set<MacNotificationIdentifier> alertSet(std::move(alertIds));
-
-    content::GetUIThreadTaskRunner({})->PostTask(
-        FROM_HERE,
-        base::BindOnce(std::move(blockCallback), std::move(alertSet)));
-  };
-
-  [[self serviceProxy] getAllDisplayedAlertsWithReply:reply];
-}
-
-// NotificationReply:
-- (void)notificationClick:(NSDictionary*)notificationResponseData {
-  ProcessMacNotificationResponse(notificationResponseData);
-}
-
-// Private methods:
-
-// Retrieves the connection's remoteObjectProxy. Always use this as opposed
-// to going directly through the connection, since this will ensure that the
-// service has its exception port configured for crash reporting.
-- (id<NotificationDelivery>)serviceProxy {
-  id<NotificationDelivery> proxy = [_xpcConnection remoteObjectProxy];
-
-  if (!_setExceptionPort) {
-    base::mac::ScopedMachSendRight exceptionPort(
-        crash_reporter::GetCrashpadClient().GetHandlerMachPort());
-    base::scoped_nsobject<CrXPCMachPort> xpcPort(
-        [[CrXPCMachPort alloc] initWithMachSendRight:std::move(exceptionPort)]);
-    [proxy setUseUNNotification:NO machExceptionPort:xpcPort];
-    _setExceptionPort = YES;
-  }
-
-  return proxy;
-}
-
-@end
diff --git a/chrome/browser/notifications/notification_alert_service_bridge.mm b/chrome/browser/notifications/notification_alert_service_bridge.mm
index a7796b6..a55c1ce 100644
--- a/chrome/browser/notifications/notification_alert_service_bridge.mm
+++ b/chrome/browser/notifications/notification_alert_service_bridge.mm
@@ -121,11 +121,6 @@
   return self;
 }
 
-- (void)setUseUNNotification:(BOOL)useUNNotification
-           machExceptionPort:(CrXPCMachPort*)port {
-  NOTREACHED();
-}
-
 - (void)deliverNotification:(NSDictionary*)notificationData {
   NSString* notificationId =
       notificationData[notification_constants::kNotificationId];
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.h b/chrome/browser/notifications/notification_platform_bridge_mac.h
index 4a336a17..17426c0c 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac.h
+++ b/chrome/browser/notifications/notification_platform_bridge_mac.h
@@ -17,7 +17,6 @@
 @class NotificationCenterDelegate;
 @class NSDictionary;
 @class NSUserNotificationCenter;
-@class NSXPCConnection;
 
 namespace message_center {
 class Notification;
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm
index 7b48e6b..7fdca1a 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
@@ -21,7 +21,6 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #import "chrome/browser/notifications/alert_dispatcher_mojo.h"
-#import "chrome/browser/notifications/alert_dispatcher_xpc.h"
 #include "chrome/browser/notifications/mac_notification_provider_factory.h"
 #include "chrome/browser/notifications/notification_common.h"
 #include "chrome/browser/notifications/notification_display_service_impl.h"
@@ -51,22 +50,6 @@
 }
 @end
 
-namespace {
-
-base::scoped_nsobject<NSObject<AlertDispatcher>> CreateAlertDispatcher() {
-  base::scoped_nsobject<NSObject<AlertDispatcher>> alert_dispatcher;
-  if (base::FeatureList::IsEnabled(features::kNotificationsViaHelperApp)) {
-    auto provider_factory = std::make_unique<MacNotificationProviderFactory>();
-    alert_dispatcher.reset([[AlertDispatcherMojo alloc]
-        initWithProviderFactory:std::move(provider_factory)]);
-  } else {
-    alert_dispatcher.reset([[AlertDispatcherXPC alloc] init]);
-  }
-  return alert_dispatcher;
-}
-
-}  // namespace
-
 // /////////////////////////////////////////////////////////////////////////////
 NotificationPlatformBridgeMac::NotificationPlatformBridgeMac(
     NSUserNotificationCenter* notification_center,
@@ -88,8 +71,10 @@
 // static
 std::unique_ptr<NotificationPlatformBridge>
 NotificationPlatformBridge::Create() {
-  base::scoped_nsobject<NSObject<AlertDispatcher>> alert_dispatcher =
-      CreateAlertDispatcher();
+  auto provider_factory = std::make_unique<MacNotificationProviderFactory>();
+  base::scoped_nsobject<NSObject<AlertDispatcher>> alert_dispatcher(
+      [[AlertDispatcherMojo alloc]
+          initWithProviderFactory:std::move(provider_factory)]);
 
   if (@available(macOS 10.14, *)) {
     if (base::FeatureList::IsEnabled(features::kNewMacNotificationAPI)) {
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm b/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
index 629dd31e..767dd33 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac_unittest.mm
@@ -242,9 +242,6 @@
 }
 
 TEST_F(NotificationPlatformBridgeMacTest, TestDisplayProgress) {
-  if (!MacOSSupportsXPCAlerts())
-    return;
-
   std::unique_ptr<Notification> notification =
       CreateBanner("Title", "Context", "https://gmail.com", nullptr, nullptr);
   const int kSamplePercent = 10;
@@ -361,9 +358,6 @@
 }
 
 TEST_F(NotificationPlatformBridgeMacTest, TestDisplayAlert) {
-  if (!MacOSSupportsXPCAlerts())
-    return;
-
   base::HistogramTester histogram_tester;
   std::unique_ptr<Notification> alert =
       CreateAlert("Title", "Context", "https://gmail.com", "Button 1", nullptr);
@@ -379,9 +373,6 @@
 }
 
 TEST_F(NotificationPlatformBridgeMacTest, TestDisplayBannerAndAlert) {
-  if (!MacOSSupportsXPCAlerts())
-    return;
-
   std::unique_ptr<Notification> alert =
       CreateAlert("Title", "Context", "https://gmail.com", "Button 1", nullptr);
   std::unique_ptr<Notification> banner = CreateBanner(
@@ -398,9 +389,6 @@
 }
 
 TEST_F(NotificationPlatformBridgeMacTest, TestCloseAlert) {
-  if (!MacOSSupportsXPCAlerts())
-    return;
-
   std::unique_ptr<Notification> alert =
       CreateAlert("Title", "Context", "https://gmail.com", "Button 1", nullptr);
   std::unique_ptr<NotificationPlatformBridgeMac> bridge(
@@ -416,9 +404,6 @@
 }
 
 TEST_F(NotificationPlatformBridgeMacTest, TestQuitRemovesBannersAndAlerts) {
-  if (!MacOSSupportsXPCAlerts())
-    return;
-
   std::unique_ptr<Notification> notification = CreateBanner(
       "Title", "Context", "https://gmail.com", "Button 1", nullptr);
   std::unique_ptr<Notification> alert =
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_utils.h b/chrome/browser/notifications/notification_platform_bridge_mac_utils.h
index 7d437de..7266f73 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac_utils.h
+++ b/chrome/browser/notifications/notification_platform_bridge_mac_utils.h
@@ -33,9 +33,6 @@
 // (click close, etc.).
 void ProcessMacNotificationResponse(NSDictionary* response);
 
-// Returns if alerts via XPC are supported on this machine.
-bool MacOSSupportsXPCAlerts();
-
 // Returns if the given |notification| should be shown as an alert.
 bool IsAlertNotificationMac(const message_center::Notification& notification);
 
diff --git a/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm b/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm
index 2d50db6..dc82a48d 100644
--- a/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm
+++ b/chrome/browser/notifications/notification_platform_bridge_mac_utils.mm
@@ -8,7 +8,6 @@
 #include "base/i18n/number_formatting.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/system/sys_info.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/notification_display_service_impl.h"
 #include "chrome/browser/notifications/notification_platform_bridge_mac_metrics.h"
@@ -56,17 +55,6 @@
                      reply, byUser));
 }
 
-// Implements the version check to determine if alerts are supported. Do not
-// call this method directly as SysInfo::OperatingSystemVersionNumbers might be
-// an expensive call. Instead use SupportsAlerts which caches this value.
-bool MacOSSupportsXPCAlertsImpl() {
-  int32_t major, minor, bugfix;
-  base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &bugfix);
-  // Allow alerts on all versions except 10.15.0, 10.15.1 & 10.15.2.
-  // See crbug.com/1007418 for details.
-  return major != 10 || minor != 15 || bugfix > 2;
-}
-
 }  // namespace
 
 std::u16string CreateMacNotificationTitle(
@@ -240,19 +228,7 @@
                      absl::nullopt /* reply */, true /* byUser */));
 }
 
-bool MacOSSupportsXPCAlerts() {
-  // Cache result as SysInfo::OperatingSystemVersionNumbers might be expensive.
-  static bool supportsAlerts = MacOSSupportsXPCAlertsImpl();
-  return supportsAlerts;
-}
-
 bool IsAlertNotificationMac(const message_center::Notification& notification) {
-  // If we show alerts via an XPC service, check if that's possible.
-  bool should_use_xpc =
-      !base::FeatureList::IsEnabled(features::kNotificationsViaHelperApp);
-  if (should_use_xpc && !MacOSSupportsXPCAlerts())
-    return false;
-
   // Check if the |notification| should be shown as alert.
   return notification.never_timeout() ||
          notification.type() == message_center::NOTIFICATION_TYPE_PROGRESS;
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index e3c8631..646b7f6 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -146,18 +146,6 @@
 namespace {
 const int kNumberLoadTestParts = 10;
 
-// `base::test::WithFeatureOverride` for `chrome_pdf::features::kPdfUnseasoned`.
-// This should be the first class a test fixture inherits from.
-//
-// This class should be used only for tests that are identical or substantially
-// identical in Pepper and Pepper-free modes. Otherwise, it makes more sense to
-// define separate test fixtures for each mode.
-class WithUnseasonedOverride : public base::test::WithFeatureOverride {
- public:
-  WithUnseasonedOverride()
-      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfUnseasoned) {}
-};
-
 #if defined(OS_MAC)
 const int kDefaultKeyModifier = blink::WebInputEvent::kMetaKey;
 #else
@@ -406,8 +394,20 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-class PDFExtensionTestWithUnseasonedOverride : public WithUnseasonedOverride,
-                                               public PDFExtensionTest {};
+// Parameterized version of `PDFExtensionTest` for testing identical behavior
+// with the unseasoned PDF feature disabled and enabled.
+//
+// If a behavior is specific to one of these states, consider testing with
+// `PDFExtensionUnseasonedDisabledTest` or `PDFExtensionUnseasonedEnabledTest`
+// instead. Tests can also be conditional on `IsParamFeatureEnabled()`, but only
+// use this if the tests are almost identical.
+class PDFExtensionTestWithUnseasonedOverride
+    : public base::test::WithFeatureOverride,
+      public PDFExtensionTest {
+ public:
+  PDFExtensionTestWithUnseasonedOverride()
+      : base::test::WithFeatureOverride(chrome_pdf::features::kPdfUnseasoned) {}
+};
 
 class PDFExtensionTestWithTestGuestViewManager
     : public PDFExtensionTestWithUnseasonedOverride {
@@ -906,9 +906,6 @@
   ~PDFExtensionJSTest() override = default;
 };
 
-class PDFExtensionJSTestWithUnseasonedOverride : public WithUnseasonedOverride,
-                                                 public PDFExtensionJSTest {};
-
 IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Basic) {
   RunTestsInJsModule("basic_test.js", "test.pdf");
 
@@ -920,81 +917,75 @@
   RunTestsInJsModule("basic_plugin_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Viewport) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Viewport) {
   RunTestsInJsModule("viewport_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Layout3) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Layout3) {
   RunTestsInJsModule("layout_test.js", "test-layout3.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Layout4) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Layout4) {
   RunTestsInJsModule("layout_test.js", "test-layout4.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Bookmark) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Bookmark) {
   RunTestsInJsModule("bookmarks_test.js", "test-bookmarks-with-zoom.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Navigator) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Navigator) {
   RunTestsInJsModule("navigator_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, ParamsParser) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ParamsParser) {
   RunTestsInJsModule("params_parser_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, ZoomManager) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ZoomManager) {
   RunTestsInJsModule("zoom_manager_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       GestureDetector) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, GestureDetector) {
   RunTestsInJsModule("gesture_detector_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       TouchHandling) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, TouchHandling) {
   RunTestsInJsModule("touch_handling_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Elements) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Elements) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("material_elements_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       DownloadControls) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, DownloadControls) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("download_controls_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Title) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Title) {
   RunTestsInJsModule("title_test.js", "test-title.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       WhitespaceTitle) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, WhitespaceTitle) {
   RunTestsInJsModule("whitespace_title_test.js", "test-whitespace-title.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, PageChange) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, PageChange) {
   RunTestsInJsModule("page_change_test.js", "test-bookmarks.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Metrics) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Metrics) {
   RunTestsInJsModule("metrics_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerPasswordDialog) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerPasswordDialog) {
   RunTestsInJsModule("viewer_password_dialog_test.js", "encrypted.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ArrayBufferAllocator) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ArrayBufferAllocator) {
   // Run several times to see if there are issues with unloading.
   RunTestsInJsModule("beep_test.js", "array_buffer.pdf");
   RunTestsInJsModule("beep_test.js", "array_buffer.pdf");
@@ -1008,42 +999,37 @@
   RunTestsInJsModule("redirects_fail_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerToolbar) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerToolbar) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("viewer_toolbar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerPdfSidenav) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerPdfSidenav) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("viewer_pdf_sidenav_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerThumbnailBar) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerThumbnailBar) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("viewer_thumbnail_bar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerThumbnail) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerThumbnail) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("viewer_thumbnail_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Fullscreen) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Fullscreen) {
   // Use a PDF document with multiple pages, to exercise navigating between
   // pages.
   RunTestsInJsModule("fullscreen_test.js", "test-bookmarks.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerPropertiesDialog) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerPropertiesDialog) {
   // The properties dialog formats some values based on locale.
   base::test::ScopedRestoreICUDefaultLocale scoped_locale{"en_US"};
   // This will apply to the new processes spawned within RunTestsInJsModule(),
@@ -1052,15 +1038,14 @@
   RunTestsInJsModule("viewer_properties_dialog_test.js", "document_info.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       PostMessageProxy) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, PostMessageProxy) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("post_message_proxy_test.js", "test.pdf");
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride, Printing) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, Printing) {
   RunTestsInJsModule("printing_icon_test.js", "test.pdf");
 }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
@@ -1073,20 +1058,17 @@
 #else
 #define MAYBE_AnnotationsFeatureEnabled AnnotationsFeatureEnabled
 #endif
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       MAYBE_AnnotationsFeatureEnabled) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, MAYBE_AnnotationsFeatureEnabled) {
   RunTestsInJsModule("annotations_feature_enabled_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       AnnotationsToolbar) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, AnnotationsToolbar) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("annotations_toolbar_test.js", "test.pdf");
 }
 
-IN_PROC_BROWSER_TEST_P(PDFExtensionJSTestWithUnseasonedOverride,
-                       ViewerToolbarDropdown) {
+IN_PROC_BROWSER_TEST_F(PDFExtensionJSTest, ViewerToolbarDropdown) {
   // Although this test file does not require a PDF to be loaded, loading the
   // elements without loading a PDF is difficult.
   RunTestsInJsModule("viewer_toolbar_dropdown_test.js", "test.pdf");
@@ -3505,5 +3487,3 @@
 INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
     PDFExtensionTestWithTestGuestViewManager);
 INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(PDFPluginDisabledTest);
-INSTANTIATE_FEATURE_OVERRIDE_TEST_SUITE(
-    PDFExtensionJSTestWithUnseasonedOverride);
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 9415600..69791f0 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1267,13 +1267,13 @@
   chromeos::NetworkMetadataStore::RegisterPrefs(registry);
   ash::ReleaseNotesStorage::RegisterProfilePrefs(registry);
   chromeos::HelpAppNotificationController::RegisterProfilePrefs(registry);
-  chromeos::quick_unlock::FingerprintStorage::RegisterProfilePrefs(registry);
-  chromeos::quick_unlock::PinStoragePrefs::RegisterProfilePrefs(registry);
+  ash::quick_unlock::FingerprintStorage::RegisterProfilePrefs(registry);
+  ash::quick_unlock::PinStoragePrefs::RegisterProfilePrefs(registry);
   chromeos::Preferences::RegisterProfilePrefs(registry);
   chromeos::EnterprisePrintersProvider::RegisterProfilePrefs(registry);
   ash::parent_access::ParentAccessService::RegisterProfilePrefs(registry);
   chromeos::quick_answers::prefs::RegisterProfilePrefs(registry);
-  chromeos::quick_unlock::RegisterProfilePrefs(registry);
+  ash::quick_unlock::RegisterProfilePrefs(registry);
   chromeos::RegisterSamlProfilePrefs(registry);
   ash::ScreenTimeController::RegisterProfilePrefs(registry);
   SecondaryAccountConsentLogger::RegisterPrefs(registry);
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
index bdcc7f48..61c72b9 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -138,7 +138,7 @@
 class MockDlpRulesManager : public policy::DlpRulesManagerImpl {
  public:
   explicit MockDlpRulesManager(PrefService* local_state)
-      : DlpRulesManagerImpl(local_state) {}
+      : DlpRulesManagerImpl(local_state, /* dm_token_value= */ "") {}
 };
 #endif
 
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
index d02934c..7b66191 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ar.xtb
@@ -183,6 +183,7 @@
 <translation id="2243633977138166243">‏للتنقُّل، اضغط على السهم المتّجه لليسار أو السهم المتّجه لليمين، ويمكنك الضغط على مفتاح Enter للتفعيل.</translation>
 <translation id="224426591676115802">لا يتوفّر صوت للغة: <ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">جارٍ إيقاف "وضع التعلُّم"</translation>
+<translation id="2247870315273396641">معاينة الصوت</translation>
 <translation id="225732394367814946">زيادة تقييم النطق</translation>
 <translation id="2267538686624070261">جارٍ تجاهل الخطأ الإملائي</translation>
 <translation id="2267945578749931355">الحرف التالي</translation>
@@ -199,6 +200,7 @@
 <translation id="2390264819538553347">‏للتقدم، اضغط على Enter، وللرجوع للخلف، اضغط على Backspace.</translation>
 <translation id="2398579267367951220">‏اكتب للبحث في الصفحة. اضغط على enter للحصول على النتيجة سريعًا، أو اضغط على السهم المتّجه للأسفل أو للأعلى لتصفّح النتائج، أو استمر بالكتابة لتغيير البحث، أو اضغط على escape للإلغاء.</translation>
 <translation id="240709722712693803">بنفسجي مزرق</translation>
+<translation id="2410298923485357543">استخدام صوت طبيعي عند اتصال الجهاز بالإنترنت</translation>
 <translation id="2416512023405990736">مربع اختيار غير محدد</translation>
 <translation id="2417569100218200841">معلومات المحتوى</translation>
 <translation id="2417948780551741035">تعليقات ختامية</translation>
@@ -300,6 +302,7 @@
 <translation id="3046838483509668188">‏خيارات ChromeVox</translation>
 <translation id="3060756054951570867">تم فتح القائمة <ph name="TITLE" /></translation>
 <translation id="3060880924447482063">التمرير سريعًا جهة اليمين أو اليسار للانتقال حسب العنصر</translation>
+<translation id="3061302636956643119">‏سيتم إرسال النص إلى Google لإجراء عمليّة المعالجة.</translation>
 <translation id="3070245424257836917">التمرير السريع بثلاثة أصابع إلى الأعلى</translation>
 <translation id="307516670110542567">الإرشادات السريعة</translation>
 <translation id="3078345202707391975">عنوان المستوى الثاني التالي</translation>
@@ -937,6 +940,7 @@
 <translation id="7693840228159394336">زر الاختيار السابق</translation>
 <translation id="7701040980221191251">لا يوجد</translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7713139339518499741">صوت طبيعي</translation>
 <translation id="7714340021005120797">ليس هناك مربع تحرير وسرد تالٍ.</translation>
 <translation id="772146615414628379">‏تهانينا! لقد تعلمت أساسيات استخدام ChromeVox بنجاح. تذكّر أنه يمكنك فتح قائمة طلبات ChromeVox في أي وقت من خلال الضغط على مفتاح البحث+نقطة. لمعرفة المزيد حول ChromeVox ونظام التشغيل Chrome، ما عليك سوى الانتقال إلى المقالات التالية.
     إذا انتهيت من البرنامج التعليمي، استخدِم ChromeVox للانتقال إلى زر "إغلاق" والنقر عليه.</translation>
@@ -967,6 +971,7 @@
 <translation id="7939428177581522200">تمت الإضافة إلى التحديد</translation>
 <translation id="794091007957014205">{COUNT,plural, =1{علامة على}zero{# at signs}two{علامتا على (#)}few{# علامات على}many{# علامة على}other{# من علامات على}}</translation>
 <translation id="7942349550061667556">أحمر</translation>
+<translation id="7945703887991230167">الصوت المفضّل</translation>
 <translation id="7948364528129376623">ليس هناك رابط تالٍ تم الانتقال إليه.</translation>
 <translation id="7952460583030260752">مَراجع الطلبات</translation>
 <translation id="7965147473449754028">تم غلق القائمة</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
index 51263dac..dd30610 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
@@ -182,6 +182,7 @@
 <translation id="2243633977138166243">নেভিগে'ট কৰিবলৈ বাওঁফালৰ অথবা সোঁফালৰ এৰ' টিপক, সক্ৰিয় কৰিবলৈ এণ্টাৰ টিপক</translation>
 <translation id="224426591676115802">এই ভাষাটোৰ বাবে কোনো কণ্ঠধ্বনি উপলব্ধ নহয়: <ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">শিক্ষণ ম’ড বন্ধ কৰি থকা হৈছে</translation>
+<translation id="2247870315273396641">কণ্ঠধ্বনিৰ পূৰ্বদৰ্শন</translation>
 <translation id="225732394367814946">কথনৰ হাৰ বঢ়াওক</translation>
 <translation id="2267538686624070261">বানান ভুলবোৰ বাদ দি থকা হৈছে</translation>
 <translation id="2267945578749931355">পৰৱৰ্তী বৰ্ণ</translation>
@@ -198,6 +199,7 @@
 <translation id="2390264819538553347">আগবাঢ়িবলৈ এণ্টাৰ দবাওক; উভতি যাবলৈ বেকস্পেছ দবাওক।</translation>
 <translation id="2398579267367951220">পৃষ্ঠাখনত সন্ধান কৰিবলৈ টাইপ কৰক। ফলাফললৈ পোনপটীয়াকৈ যাবলৈ এণ্টাৰ টিপক, ফলাফল ব্ৰাউজ কৰিবলৈ আপ অথবা ডাউন এৰ’সমূহ টিপক, আপোনাৰ সন্ধান সলনি কৰিবলৈ টাইপ কৰি থাকক অথবা বাতিল কৰিবলৈ এস্কে’প টিপক।</translation>
 <translation id="240709722712693803">নীলা বেঙুনীয়া</translation>
+<translation id="2410298923485357543">ডিভাইচটো অনলাইন হৈ থাকিলে স্বাভাৱিক কণ্ঠধ্বনি ব্যৱহাৰ কৰক</translation>
 <translation id="2416512023405990736">টিক চিহ্ন নিদিয়া চ্চেকবক্স</translation>
 <translation id="2417569100218200841">সমলৰ তথ্য</translation>
 <translation id="2417948780551741035">এণ্ডন‘টছ</translation>
@@ -299,6 +301,7 @@
 <translation id="3046838483509668188">ChromeVoxৰ বিকল্পসমূহ</translation>
 <translation id="3060756054951570867"><ph name="TITLE" />মেনু খোলা হৈছে</translation>
 <translation id="3060880924447482063">বস্তু অনুসৰি আঁতৰাবলৈ বাওঁ বা সোঁফালে ছোৱাইপ কৰক</translation>
+<translation id="3061302636956643119">প্ৰক্ৰিয়াকৰণ কৰিবলৈ পাঠ Googleলৈ পঠিওৱা হ’ব।</translation>
 <translation id="3070245424257836917">তিনিটা আঙুলি ওপৰলৈ ছোৱাইপ কৰক</translation>
 <translation id="307516670110542567">ক্ষিপ্ৰ অ'ৰিয়েণ্টশ্বন</translation>
 <translation id="3078345202707391975">পৰৱর্তী স্তৰ ২ৰ শিৰোনাম</translation>
@@ -936,6 +939,7 @@
 <translation id="7693840228159394336">পূৰ্বৱৰ্তী ৰেডিঅ’ বুটাম</translation>
 <translation id="7701040980221191251">নাই</translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7713139339518499741">স্বাভাৱিক কণ্ঠধ্বনি</translation>
 <translation id="7714340021005120797">কোনো পৰৱর্তী কম্ব’ বাকচ নাই</translation>
 <translation id="772146615414628379">অভিনন্দন! আপুনি ChromeVox ব্যৱহাৰ কৰাৰ বাবে আৱশ্যকীয় কথাবোৰ জানিলে। মনত ৰাখিব যে আপুনি যিকোনো সময়তে ছাৰ্চ+পিৰিয়ড টিপি ChromeVox নিৰ্দেশনা মেনু খুলিব পাৰে। ChromeVox আৰু Chrome OSৰ বিষয়ে আৰু অধিক জানিবলৈ তলত উল্লেখ কৰা লেখাসমূহ চাওক।
     যদি আপোনাৰ প্ৰশিক্ষণ সম্পূর্ণ হৈছে তেন্তে বন্ধ কৰা বুটামটোলৈ যাবলৈ ChromeVox ব্যৱহাৰ কৰক আৰু ইয়াক ক্লিক কৰক।</translation>
@@ -966,6 +970,7 @@
 <translation id="7939428177581522200">বাছনিত যোগ কৰা হ’ল</translation>
 <translation id="794091007957014205">{COUNT,plural, =1{এট}one{#টা এট চিহ্ন}other{#টা এট চিহ্ন}}</translation>
 <translation id="7942349550061667556">ৰঙা</translation>
+<translation id="7945703887991230167">অগ্ৰাধিকাৰ দিয়া কণ্ঠধ্বনি</translation>
 <translation id="7948364528129376623">কোনো পৰৱর্তী চোৱা লিংক নাই</translation>
 <translation id="7952460583030260752">নিৰ্দেশনাৰ প্ৰসঙ্গ</translation>
 <translation id="7965147473449754028">মেনু বন্ধ কৰা হ’ল</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb
index 3aef76d..e0fd2fa 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb
@@ -182,6 +182,7 @@
 <translation id="2243633977138166243">‏כדי לנווט, יש ללחוץ על החץ שמאלה או על החץ ימינה. כדי להפעיל, יש ללחוץ על Enter</translation>
 <translation id="224426591676115802">אין קול ב<ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">יציאה ממצב למידה</translation>
+<translation id="2247870315273396641">תצוגה מקדימה של הקול</translation>
 <translation id="225732394367814946">הגברת קצב הדיבור</translation>
 <translation id="2267538686624070261">יציאה משגיאת איות</translation>
 <translation id="2267945578749931355">התו הבא</translation>
@@ -198,6 +199,7 @@
 <translation id="2390264819538553347">‏כדי להתקדם יש להקיש על Enter וכדי לחזור יש להקיש על backspace.</translation>
 <translation id="2398579267367951220">‏יש להקליד כדי לחפש בדף. יש להקיש על Enter כדי לעבור אל התוצאה ועל מקשי החיצים למעלה ולמטה כדי לדפדף בתוצאות. אפשר להמשיך להקליד כדי לשנות את החיפוש או להקיש על Esc כדי לבטל.</translation>
 <translation id="240709722712693803">סיגל</translation>
+<translation id="2410298923485357543">שימוש בקול טבעי כשהמכשיר מחובר לאינטרנט</translation>
 <translation id="2416512023405990736">תיבת סימון שלא סומנה</translation>
 <translation id="2417569100218200841">פרטי תוכן</translation>
 <translation id="2417948780551741035">הערות סיום</translation>
@@ -299,6 +301,7 @@
 <translation id="3046838483509668188">‏אפשרויות של ChromeVox</translation>
 <translation id="3060756054951570867">תפריט <ph name="TITLE" /> נפתח</translation>
 <translation id="3060880924447482063">מחליקים שמאלה או ימינה כדי לעבור פריט אחר פריט</translation>
+<translation id="3061302636956643119">‏הטקסט יישלח אל Google לעיבוד.</translation>
 <translation id="3070245424257836917">החלקה מעלה עם שלוש אצבעות</translation>
 <translation id="307516670110542567">ההדרכה המהירה</translation>
 <translation id="3078345202707391975">הכותרת הבאה של רמה 2</translation>
@@ -937,6 +940,7 @@
 <translation id="7693840228159394336">לחצן הבחירה הקודם</translation>
 <translation id="7701040980221191251">אין</translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7713139339518499741">קול טבעי</translation>
 <translation id="7714340021005120797">אין עוד תיבות משולבות</translation>
 <translation id="772146615414628379">‏מזל טוב! למדת את כל המידע הבסיסי שיאפשר לך להשתמש ב-ChromeVox. חשוב לזכור שאפשר לפתוח את תפריט הפקודות של ChromeVox בכל שלב על ידי הקשה על Search+מקש הנקודה. כדי לקבל מידע נוסף על ChromeVox ו-Chrome OS, אפשר לעיין במאמרים הבאים.
     אם סיימת עם המדריך, אפשר להשתמש ב-ChromeVox כדי לנווט ללחצן 'סגירה' וללחוץ עליו.</translation>
@@ -967,6 +971,7 @@
 <translation id="7939428177581522200">נוסף לבחירה</translation>
 <translation id="794091007957014205">{COUNT,plural, =1{סימן @}two{# סימני @}many{# סימני @}other{# סימני @}}</translation>
 <translation id="7942349550061667556">אדום</translation>
+<translation id="7945703887991230167">הקול המועדף</translation>
 <translation id="7948364528129376623">אין עוד קישורים שהפעלת</translation>
 <translation id="7952460583030260752">הפניות לפקודות</translation>
 <translation id="7965147473449754028">התפריט נסגר</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb
index 45309a26..99eeb69 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_pt-BR.xtb
@@ -182,6 +182,7 @@
 <translation id="2243633977138166243">Pressione a seta para a esquerda ou para a direita para navegar e Enter para ativar</translation>
 <translation id="224426591676115802">Não há voz disponível para o idioma: <ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">Parando o modo de aprendizado</translation>
+<translation id="2247870315273396641">Prévia da voz</translation>
 <translation id="225732394367814946">Acelerar ritmo da voz</translation>
 <translation id="2267538686624070261">Saindo de erro de ortografia</translation>
 <translation id="2267945578749931355">Próximo caractere</translation>
@@ -198,6 +199,7 @@
 <translation id="2390264819538553347">Para avançar, pressione Enter. Para voltar, pressione Backspace.</translation>
 <translation id="2398579267367951220">Digite para pesquisar na página. Pressione Enter para ir para o resultado, as setas para cima ou para baixo para navegar pelos resultados, Esc para cancelar ou continue digitando para mudar a pesquisa.</translation>
 <translation id="240709722712693803">Violeta-azulado</translation>
+<translation id="2410298923485357543">Usar voz natural quando o dispositivo estiver on-line</translation>
 <translation id="2416512023405990736">Uma caixa de seleção desmarcada</translation>
 <translation id="2417569100218200841">Informações sobre o conteúdo</translation>
 <translation id="2417948780551741035">Notas finais</translation>
@@ -299,6 +301,7 @@
 <translation id="3046838483509668188">Opções do ChromeVox</translation>
 <translation id="3060756054951570867">Menu <ph name="TITLE" /> aberto</translation>
 <translation id="3060880924447482063">Deslize para a esquerda ou direita para mover por item</translation>
+<translation id="3061302636956643119">O texto será enviado ao Google para processamento.</translation>
 <translation id="3070245424257836917">Deslize para cima usando três dedos</translation>
 <translation id="307516670110542567">Orientação rápida</translation>
 <translation id="3078345202707391975">Próximo cabeçalho de nível 2</translation>
@@ -937,6 +940,7 @@
 <translation id="7693840228159394336">Botão de opção anterior</translation>
 <translation id="7701040980221191251">Nenhuma</translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7713139339518499741">Voz natural</translation>
 <translation id="7714340021005120797">Nenhuma caixa de combinação a seguir</translation>
 <translation id="772146615414628379">Parabéns! Você aprendeu as noções básicas do ChromeVox. Você pode abrir o menu de comandos do ChromeVox a qualquer momento pressionando a tecla de pesquisa mais ponto. Para saber mais sobre o ChromeVox e o Chrome OS, acesse os artigos a seguir.
     Se você não quiser mais ver o tutorial, use o ChromeVox para navegar até o botão "Fechar" e clique nele.</translation>
@@ -967,6 +971,7 @@
 <translation id="7939428177581522200">adicionados a seleção</translation>
 <translation id="794091007957014205">{COUNT,plural, =1{sinal de arroba}one{# indicadores de arroba}other{# indicadores de arroba}}</translation>
 <translation id="7942349550061667556">Vermelho</translation>
+<translation id="7945703887991230167">Voz preferida</translation>
 <translation id="7948364528129376623">Nenhum link visitado a seguir</translation>
 <translation id="7952460583030260752">Referências de comandos</translation>
 <translation id="7965147473449754028">menu fechado</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
index aa26b749..2119c196 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_tr.xtb
@@ -182,6 +182,7 @@
 <translation id="2243633977138166243">Ekranda gezinmek için sol veya sağ oka, etkinleştirmek için enter tuşuna basın</translation>
 <translation id="224426591676115802">Şu dil için ses yok: <ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">Öğrenme Modu durduruluyor</translation>
+<translation id="2247870315273396641">Ses önizlemesi</translation>
 <translation id="225732394367814946">Konuşma hızını artır</translation>
 <translation id="2267538686624070261">Yazım hatasından çıkılıyor</translation>
 <translation id="2267945578749931355">Sonraki Karakter</translation>
@@ -198,6 +199,7 @@
 <translation id="2390264819538553347">İlerlemek için enter tuşuna, geri gitmek için geri tuşuna basın.</translation>
 <translation id="2398579267367951220">Sayfada aramak için yazmaya başlayın. Sonuca atlamak için enter tuşuna, sonuçlara göz atmak için yukarı veya aşağı oka basın. Aramanızı değiştirmek için yazmaya devam edin veya iptal etmek için escape tuşuna basın.</translation>
 <translation id="240709722712693803">Menekşe Rengi</translation>
+<translation id="2410298923485357543">Cihaz internete bağlıyken doğal ses kullan</translation>
 <translation id="2416512023405990736">İşaretlenmemiş onay kutusu</translation>
 <translation id="2417569100218200841">İçerik bilgileri</translation>
 <translation id="2417948780551741035">Son notlar</translation>
@@ -299,6 +301,7 @@
 <translation id="3046838483509668188">ChromeVox Seçenekleri</translation>
 <translation id="3060756054951570867"><ph name="TITLE" /> menüsü açıldı</translation>
 <translation id="3060880924447482063">Öğeler arasında geçiş yapmak için sola veya sağa hızlıca kaydırın.</translation>
+<translation id="3061302636956643119">Metin, işlenmek üzere Google'a gönderilecek.</translation>
 <translation id="3070245424257836917">Üç parmağınızı yukarı kaydırın</translation>
 <translation id="307516670110542567">Hızlı oryantasyon</translation>
 <translation id="3078345202707391975">Sonraki 2. düzey başlık</translation>
@@ -936,6 +939,7 @@
 <translation id="7693840228159394336">Önceki radyo düğmesi</translation>
 <translation id="7701040980221191251">Yok</translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7713139339518499741">Doğal ses</translation>
 <translation id="7714340021005120797">Sonraki birleşik giriş kutusu yok</translation>
 <translation id="772146615414628379">Tebrikler! ChromeVox kullanımıyla ilgili temel bilgileri başarıyla öğrendiniz. ChromeVox komut menüsünü Arama+Nokta tuşlarına basarak istediğiniz zaman açabileceğinizi unutmayın. ChromeVox ve Chrome OS hakkında daha da fazla bilgi edinmek için aşağıdaki makaleleri inceleyin.
     Eğitimle işiniz bittiğinde, ChromeVox'ı kullanarak Kapat düğmesine gidip düğmeyi tıklayın.</translation>
@@ -966,6 +970,7 @@
 <translation id="7939428177581522200">seçime eklendi</translation>
 <translation id="794091007957014205">{COUNT,plural, =1{kuyruklu a işareti}other{# kuyruklu a işareti}}</translation>
 <translation id="7942349550061667556">Kırmızı</translation>
+<translation id="7945703887991230167">Tercih edilen ses</translation>
 <translation id="7948364528129376623">Ziyaret edilmiş başka sonraki bağlantı yok</translation>
 <translation id="7952460583030260752">Komut referansları</translation>
 <translation id="7965147473449754028">menü kapandı</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb
index debffee..1a6c249 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-TW.xtb
@@ -182,6 +182,7 @@
 <translation id="2243633977138166243">按下向左或向右鍵即可瀏覽;按下 Enter 鍵即可啟用</translation>
 <translation id="224426591676115802">下列語言沒有可用的語音服務:<ph name="LANGUAGE" /></translation>
 <translation id="2247700577781885251">正在停止學習模式</translation>
+<translation id="2247870315273396641">預先聆聽語音</translation>
 <translation id="225732394367814946">加快說話速度</translation>
 <translation id="2267538686624070261">退出拼字錯誤區塊</translation>
 <translation id="2267945578749931355">下一個字元</translation>
@@ -198,6 +199,7 @@
 <translation id="2390264819538553347">如要前往下一頁,請按下 Enter 鍵;如要返回上一頁,請按下 Backspace 鍵。</translation>
 <translation id="2398579267367951220">輸入要在頁面中搜尋的字詞。按下 Enter 鍵可跳至搜尋結果;按向上或向下箭頭可瀏覽搜尋結果;繼續輸入可變更搜尋字詞;按下 Escape 鍵可取消搜尋。</translation>
 <translation id="240709722712693803">藍紫</translation>
+<translation id="2410298923485357543">在裝置連上網路時使用自然語音</translation>
 <translation id="2416512023405990736">未勾選的核取方塊</translation>
 <translation id="2417569100218200841">內容資訊</translation>
 <translation id="2417948780551741035">章節附註</translation>
@@ -299,6 +301,7 @@
 <translation id="3046838483509668188">ChromeVox 選項</translation>
 <translation id="3060756054951570867">「<ph name="TITLE" />」選單已開啟</translation>
 <translation id="3060880924447482063">向左或向右滑動即可逐項瀏覽</translation>
+<translation id="3061302636956643119">系統會將文字傳送給 Google 進行處理。</translation>
 <translation id="3070245424257836917">以三指向上滑動</translation>
 <translation id="307516670110542567">快速導覽</translation>
 <translation id="3078345202707391975">下一個第 2 階標題</translation>
@@ -937,6 +940,7 @@
 <translation id="7693840228159394336">上一個圓形按鈕</translation>
 <translation id="7701040980221191251">無</translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7713139339518499741">自然語音</translation>
 <translation id="7714340021005120797">沒有下一個下拉式方塊</translation>
 <translation id="772146615414628379">恭喜!你已成功掌握 ChromeVox 的基本用法。提醒你,隨時按下搜尋鍵 + 英文句點鍵即可開啟 ChromeVox 指令選單。如要進一步瞭解 ChromeVox 和 Chrome 作業系統,請參閱下列文章。
    如要結束教學課程,請使用 ChromeVox 找到 [關閉] 按鈕,按一下即可結束。</translation>
@@ -967,6 +971,7 @@
 <translation id="7939428177581522200">已加入選取範圍</translation>
 <translation id="794091007957014205">{COUNT,plural, =1{@ 符號}other{# 個 @ 符號}}</translation>
 <translation id="7942349550061667556">紅色</translation>
+<translation id="7945703887991230167">偏好語音</translation>
 <translation id="7948364528129376623">沒有下一個造訪過的連結</translation>
 <translation id="7952460583030260752">指令參照</translation>
 <translation id="7965147473449754028">選單已關閉</translation>
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn
index 36b8aab..4034c79 100644
--- a/chrome/browser/resources/settings/BUILD.gn
+++ b/chrome/browser/resources/settings/BUILD.gn
@@ -41,7 +41,7 @@
       "//ui/webui/resources:preprocess",
     ]
 
-    if (!is_chromeos) {
+    if (!is_chromeos_ash) {
       deps += [ "//ui/webui/resources/cr_components/customize_themes:build_ts" ]
     }
 
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc
index 56b27e9e..6be3927 100644
--- a/chrome/browser/sync/sync_service_factory.cc
+++ b/chrome/browser/sync/sync_service_factory.cc
@@ -152,7 +152,7 @@
     // those two cases. Bug 88109.
     bool is_auto_start = browser_defaults::kSyncAutoStarts;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    if (chromeos::features::IsSplitSettingsSyncEnabled())
+    if (chromeos::features::IsSyncConsentOptionalEnabled())
       is_auto_start = false;
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
     // TODO(https://crbug.com/1194983): Figure out how split sync settings will
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 0d4ca7f..91f6c0ec 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -2114,6 +2114,10 @@
       "ash/shelf/arc_playstore_shortcut_shelf_item_controller.h",
       "ash/shelf/arc_shelf_spinner_item_controller.cc",
       "ash/shelf/arc_shelf_spinner_item_controller.h",
+      "ash/shelf/browser_app_status_observer.cc",
+      "ash/shelf/browser_app_status_observer.h",
+      "ash/shelf/browser_apps_tracker.cc",
+      "ash/shelf/browser_apps_tracker.h",
       "ash/shelf/browser_shortcut_shelf_item_controller.cc",
       "ash/shelf/browser_shortcut_shelf_item_controller.h",
       "ash/shelf/browser_status_monitor.cc",
@@ -2760,7 +2764,7 @@
       "//chrome/browser/ui/webui/settings/chromeos/constants:mojom",
       "//chrome/browser/ui/webui/settings/chromeos/os_apps_page/mojom",
       "//chrome/browser/ui/webui/settings/chromeos/search:mojo_bindings",
-      "//chrome/browser/web_applications/preinstalled_web_apps",
+      "//chrome/browser/web_applications",
       "//chrome/services/file_util/public/cpp",
       "//chromeos",
       "//chromeos/assistant:buildflags",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 1303088..5f5baecca 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1644,11 +1644,11 @@
       <message name="IDS_CHROME_ADDITIONAL_TERMS_OF_SERVICE_URL" desc="URL for Chrome and Chrome OS additional terms of service" translateable="false">
         https://www.google.com/chrome/terms/
       </message>
-      <message name="IDS_PRIVACY_NOTICE_TITLE" desc="Title for the Chrome privacy notice">
-        Chrome Privacy Notice
+      <message name="IDS_PRIVACY_POLICY_TITLE" desc="Title for the Chrome privacy policy">
+        Chrome Privacy Policy
       </message>
-      <message name="IDS_CHROME_PRIVACY_NOTICE_URL" desc="URL for the Chrome privacy notice" translateable="false">
-        https://www.google.com/intl/$LOCALE/chrome/browser/privacy/
+      <message name="IDS_CHROME_PRIVACY_POLICY_URL" desc="URL for the Chrome privacy policy" translateable="false">
+        https://policies.google.com/privacy
       </message>
       <message name="IDS_FAMILY_LINK_PRIVACY_POLICY_URL" desc="URL for the Family Link privacy policy" translateable="false">
         https://families.google.com/intl/$LOCALE/familylink/privacy/child-policy/
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_POLICY_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_POLICY_TITLE.png.sha1
new file mode 100644
index 0000000..e574b1a
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_POLICY_TITLE.png.sha1
@@ -0,0 +1 @@
+a11ffdbf3d5234ccb829ad57c183482c670070d2
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
index ef16bfad..a8fc9c1 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -304,6 +304,7 @@
 <translation id="2942036813789421260">علامة تبويب المعاينة مغلقة</translation>
 <translation id="2956410042958133412">تتم إدارة هذا الحساب بواسطة <ph name="PARENT_NAME_1" /> و <ph name="PARENT_NAME_2" />.</translation>
 <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{صفحة واحدة (<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" />) غير مقروءة}zero{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> صفحة غير مقروءة}two{صفحتان (<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" />) غير مقروءتَين}few{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> صفحات غير مقروءة}many{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> صفحة غير مقروءة}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> صفحة غير مقروءة}}</translation>
+<translation id="2961210776189273067">العنوان</translation>
 <translation id="2979025552038692506">علامة تبويب محددة للتصفح المتخفي</translation>
 <translation id="2979448359891869301">يتعذّر توسيع نافذة لقطة الشاشة. حاوِل مرة أخرى عندما يتوفّر قدر كافٍ من الذاكرة.</translation>
 <translation id="2979639724566107830">فتح الإشارة في نافذة جديدة</translation>
@@ -615,6 +616,7 @@
 <translation id="497421865427891073">انتقال للأمام</translation>
 <translation id="4988210275050210843">جارٍ تنزيل الملف (<ph name="MEGABYTES" />).</translation>
 <translation id="4988526792673242964">الصفحات</translation>
+<translation id="5001388021414335527">متابعة هذا الموقع الإلكتروني هنا</translation>
 <translation id="5004416275253351869">‏عناصر التحكم بالنشاط على Google</translation>
 <translation id="5005498671520578047">نسخ كلمة المرور</translation>
 <translation id="5011311129201317034">يريد <ph name="SITE" /> الاتصال</translation>
@@ -983,6 +985,7 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{مشاركة عنصر واحد محدد}zero{مشاركة # عنصر محدد}two{مشاركة عنصرين (#) محددين}few{مشاركة # عناصر محددة}many{مشاركة # عنصرًا محددًا}other{مشاركة # عنصر محدد}}</translation>
 <translation id="7359002509206457351">الوصول إلى طرق الدفع</translation>
 <translation id="7375125077091615385">النوع:</translation>
+<translation id="7386842512861524348">‏الاتصال بهذا الموقع الإلكتروني آمن، ما لم يخبرك Chrome بغير ذلك.</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" /></translation>
 <translation id="7400418766976504921">‏عنوان URL</translation>
 <translation id="7403691278183511381">‏أول تجربة تشغيل لمتصفح Chrome</translation>
@@ -1140,6 +1143,7 @@
 <translation id="8284326494547611709">الترجمة والشرح</translation>
 <translation id="829672787777123339">جارٍ الاتصال بجهازك…</translation>
 <translation id="8310344678080805313">علامات التبويب القياسية</translation>
+<translation id="831192587911042850">تعمل هذه الميزة على إضافة الموقع الإلكتروني الحالي إلى قائمة المواقع الإلكترونية التي تتابعها.</translation>
 <translation id="8327155640814342956">‏للحصول على أفضل تجربة للتصفّح، يُرجى الفتح لتحديث Chrome.</translation>
 <translation id="834313815369870491">مواقع إلكترونية لا أريد ترجمتها مطلقًا</translation>
 <translation id="8349013245300336738">الترتيب حسب مقدار البيانات المُستخدَمة</translation>
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 b29ebc48..83c181a9 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
@@ -304,6 +304,7 @@
 <translation id="2942036813789421260">পূৰ্বদৰ্শন টেবটো বন্ধ কৰা আছে</translation>
 <translation id="2956410042958133412"><ph name="PARENT_NAME_1" /> আৰু <ph name="PARENT_NAME_2" />এ এই একাউণ্টটো পৰিচালনা কৰে।</translation>
 <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> খন নপঢ়া পৃষ্ঠা}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> খন নপঢ়া পৃষ্ঠা}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> খন নপঢ়া পৃষ্ঠা}}</translation>
+<translation id="2961210776189273067">শিৰোনাম</translation>
 <translation id="2979025552038692506">বাছনি কৰা ইনকগনিট’ টেব</translation>
 <translation id="2979448359891869301">দীঘল স্ক্ৰীনশ্বট ল’ব নোৱাৰি। আপোনাৰ ফ’নটো ব্যস্ত নথকা সময়ত পুনৰ চেষ্টা কৰক।</translation>
 <translation id="2979639724566107830">নতুন ৱিণ্ড'ত খোলক</translation>
@@ -615,6 +616,7 @@
 <translation id="497421865427891073">আগুৱাই যাওক</translation>
 <translation id="4988210275050210843">ফাইল ডাউনল’ড কৰি থকা হৈছে (<ph name="MEGABYTES" />)।</translation>
 <translation id="4988526792673242964">পৃষ্ঠা</translation>
+<translation id="5001388021414335527">ইয়াত এই ছাইটটো ফ’ল’ কৰক</translation>
 <translation id="5004416275253351869">Googleৰ কাৰ্যকলাপৰ নিয়ন্ত্ৰণ</translation>
 <translation id="5005498671520578047">পাছৱর্ডটোৰ প্ৰতিলিপি কৰক</translation>
 <translation id="5011311129201317034"><ph name="SITE" />এ সংযোগ কৰিব বিচাৰিছে</translation>
@@ -982,6 +984,7 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{বাছনি কৰা ১টা বস্তু শ্বেয়াৰ কৰক}one{বাছনি কৰা #টা বস্তু শ্বেয়াৰ কৰক}other{বাছনি কৰা #টা বস্তু শ্বেয়াৰ কৰক}}</translation>
 <translation id="7359002509206457351">পৰিশোধৰ পদ্ধতি এক্সেছ কৰক</translation>
 <translation id="7375125077091615385">ধৰণ:</translation>
+<translation id="7386842512861524348">Chromeএ আপোনাক নোকোৱা পৰ্যন্ত ছাইটৰ সংযোগটো সুৰক্ষিত।</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" />।</translation>
 <translation id="7400418766976504921">URL</translation>
 <translation id="7403691278183511381">Chrome প্ৰথমবাৰ চলোৱাৰ অভিজ্ঞতা</translation>
@@ -1139,6 +1142,7 @@
 <translation id="8284326494547611709">কেপশ্বন</translation>
 <translation id="829672787777123339">আপোনাৰ ডিভাইচটোৰ সৈতে সংযোগ কৰি থকা হৈছে…</translation>
 <translation id="8310344678080805313">মান্য টেব</translation>
+<translation id="831192587911042850">বৰ্তমানৰ ৱেবছাইটটোক আপুনি ফ’ল’ কৰি থকা ৱেবছাইটসমূহৰ সূচীত যোগ দিয়ে।</translation>
 <translation id="8327155640814342956">সকলোতকৈ ভালকৈ ব্ৰাউজিং কৰাৰ অভিজ্ঞতা পাবলৈ Chrome আপডে'ট কৰক</translation>
 <translation id="834313815369870491">কেতিয়াও অনুবাদ কৰিব নলগীয়া ছাইট</translation>
 <translation id="8349013245300336738">ব্যৱহাৰ কৰা ডেটাৰ পৰিমাণ অনুসৰি সজাওক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
index 89214ab..b00a4c3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -337,6 +337,7 @@
 <translation id="3207960819495026254">Bookmarked</translation>
 <translation id="3208584281581115441">Check now</translation>
 <translation id="3211426585530211793">Deleted <ph name="ITEM_TITLE" /></translation>
+<translation id="3214996641768123781"><ph name="BEGIN_LINK1" />Search history<ph name="END_LINK1" /> and <ph name="BEGIN_LINK2" />other forms of activity<ph name="END_LINK2" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.</translation>
 <translation id="321773570071367578">If you forgot your passphrase or want to change this setting, <ph name="BEGIN_LINK" />reset sync<ph name="END_LINK" /></translation>
 <translation id="3220943972464248773">To sync your passwords, verify that it's you</translation>
 <translation id="3227557059438308877">Google Chrome as a security key</translation>
@@ -621,7 +622,9 @@
 <translation id="5005498671520578047">Copy password</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> wants to connect</translation>
 <translation id="5016205925109358554">Serif</translation>
+<translation id="5032430150487044192">Can't create QR code</translation>
 <translation id="5039804452771397117">Allow</translation>
+<translation id="5054455334322721892"><ph name="BEGIN_LINK1" />Other forms of activity<ph name="END_LINK1" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.</translation>
 <translation id="5061533557687621530">To check the weather, tap the mic and say 'What’s the weather today?'</translation>
 <translation id="5087580092889165836">Add card</translation>
 <translation id="5091249083535528968">Extended usage data</translation>
@@ -740,6 +743,7 @@
 <translation id="5814131985548525293">Type here or tap the voice icon to start</translation>
 <translation id="583281660410589416">Unknown</translation>
 <translation id="5833984609253377421">Share link</translation>
+<translation id="5834764604050996579">To scan a QR code, let Chrome use your camera</translation>
 <translation id="5836192821815272682">Downloading Chrome update…</translation>
 <translation id="5853623416121554550">paused</translation>
 <translation id="5854512288214985237">No statistics or crash reports are sent to Google</translation>
@@ -920,6 +924,7 @@
 <translation id="6867400383614725881">New Incognito tab</translation>
 <translation id="6869056123412990582">computer</translation>
 <translation id="6882836635272038266">Standard protection against websites, downloads and extensions that are known to be dangerous.</translation>
+<translation id="6883204995689174413">Share</translation>
 <translation id="688738109438487280">Add existing data to <ph name="TO_ACCOUNT" />.</translation>
 <translation id="6891726759199484455">Unlock to copy your password</translation>
 <translation id="6896758677409633944">Copy</translation>
@@ -940,6 +945,7 @@
 <translation id="7022756207310403729">Open in browser</translation>
 <translation id="702463548815491781">Recommended when TalkBack or Switch Access are on</translation>
 <translation id="7027549951530753705">Restored <ph name="ITEM_TITLE" /></translation>
+<translation id="7029390216614421513">Position QR code/barcode in this frame.</translation>
 <translation id="7029809446516969842">Passwords</translation>
 <translation id="7054588988317389591">Get image descriptions?</translation>
 <translation id="7055152154916055070">Redirect blocked:</translation>
@@ -954,8 +960,10 @@
 <translation id="7138678301420049075">Other</translation>
 <translation id="7146622961999026732">These sites and apps seem important to you:</translation>
 <translation id="7149893636342594995">Last 24 Hours</translation>
+<translation id="7155317020660659215">To scan a QR code, change your settings so that Chrome can use your camera</translation>
 <translation id="7173114856073700355">Open settings</translation>
 <translation id="7177466738963138057">You can change this later in Settings</translation>
+<translation id="7177873915659574692">Can't create QR code. URL is more than <ph name="CHARACTER_LIMIT" /> characters.</translation>
 <translation id="7180611975245234373">Refresh</translation>
 <translation id="7187993566681480880">Keeps you safe on Chrome and may be used to improve your security in other Google apps when you are signed in.</translation>
 <translation id="718926126787620637">List of bookmark folders opened at full height</translation>
@@ -1000,6 +1008,7 @@
 <translation id="7454641608352164238">Not enough space</translation>
 <translation id="7475192538862203634">If you’re seeing this frequently, try these <ph name="BEGIN_LINK" />suggestions<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD card not found. Some of your files may be missing.</translation>
+<translation id="7476384249953022816">To clear Incognito browsing history from your device, close all tabs</translation>
 <translation id="7479104141328977413">Tab management</translation>
 <translation id="7481312909269577407">Forward</translation>
 <translation id="7481864133709957613">To search from this page, touch &amp; hold words instead of tapping them</translation>
@@ -1082,6 +1091,7 @@
 <translation id="7929962904089429003">Opening the menu</translation>
 <translation id="7930998711684428189">Warns you if passwords are exposed in a data breach.</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> is out of date.</translation>
+<translation id="7944772052836377867">Sync needs to verify that it's you</translation>
 <translation id="7947953824732555851">Accept and sign in</translation>
 <translation id="7961015016161918242">Never</translation>
 <translation id="7961926449547174351">You have disabled storage access. Please go to settings to enable it.</translation>
@@ -1113,6 +1123,7 @@
 <translation id="8084114998886531721">Saved password</translation>
 <translation id="8084285576995584326">Control your Google Account data</translation>
 <translation id="808747664143081553">Connected to device</translation>
+<translation id="8088176524274673045">To share with people nearby, let them scan this QR code</translation>
 <translation id="8103578431304235997">Incognito Tab</translation>
 <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation>
 <translation id="8109613176066109935">To get your bookmarks on all your devices, turn on sync</translation>
@@ -1221,6 +1232,7 @@
 <translation id="8788265440806329501">Navigation history is closed</translation>
 <translation id="8788968922598763114">Reopen the last closed tab</translation>
 <translation id="8798449543960971550">Read</translation>
+<translation id="8805097383171548551">To scan a QR code, use a device with a camera.</translation>
 <translation id="8812260976093120287">On some websites, you can pay with above supported payment apps on your device.</translation>
 <translation id="881688628773363275">Preview tab content is not viewable.</translation>
 <translation id="8820817407110198400">Bookmarks</translation>
@@ -1266,6 +1278,7 @@
 <translation id="9070377983101773829">Start voice search</translation>
 <translation id="9074336505530349563">To get personalised content suggested by Google, sign in and turn on sync</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
+<translation id="9081543426177426948">Sites that you visit aren’t saved in Incognito</translation>
 <translation id="9086302186042011942">Syncing</translation>
 <translation id="9086455579313502267">Unable to access the network</translation>
 <translation id="9100505651305367705">Offer to show articles in simplified view, when supported</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
index fb9cd82..974c6a3 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -304,6 +304,7 @@
 <translation id="2942036813789421260">כרטיסיית התצוגה המקדימה סגורה</translation>
 <translation id="2956410042958133412">החשבון הזה מנוהל על ידי <ph name="PARENT_NAME_1" /> ו-<ph name="PARENT_NAME_2" />.</translation>
 <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{דף אחד (<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" />) שלא נקרא}two{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> דפים שלא נקראו}many{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> דפים שלא נקראו}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> דפים שלא נקראו}}</translation>
+<translation id="2961210776189273067">תואר</translation>
 <translation id="2979025552038692506">כרטיסיית המצב האנונימי שנבחרה</translation>
 <translation id="2979448359891869301">לא ניתן להרחיב את צילום המסך. יש לנסות שוב כשיהיה יותר מקום בזיכרון הטלפון.</translation>
 <translation id="2979639724566107830">פתיחה בחלון חדש</translation>
@@ -615,6 +616,7 @@
 <translation id="497421865427891073">ניווט קדימה</translation>
 <translation id="4988210275050210843">מתבצעת הורדה של קובץ (<ph name="MEGABYTES" />).</translation>
 <translation id="4988526792673242964">דפים</translation>
+<translation id="5001388021414335527">כאן ניתן לעקוב אחר האתר הזה</translation>
 <translation id="5004416275253351869">‏בקרת הפעילות בחשבון Google</translation>
 <translation id="5005498671520578047">העתקת הסיסמה</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> מבקש להתחבר אל</translation>
@@ -983,6 +985,7 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{שיתוף פריט אחד שנבחר}two{שיתוף # פריטים שנבחרו}many{שיתוף # פריטים שנבחרו}other{שיתוף # פריטים שנבחרו}}</translation>
 <translation id="7359002509206457351">גישה לאמצעי תשלום</translation>
 <translation id="7375125077091615385">סוג:</translation>
+<translation id="7386842512861524348">‏חיבור האתר מאובטח אלא אם תתקבל הודעה שונה מ-Chrome</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" />.</translation>
 <translation id="7400418766976504921">כתובת אתר</translation>
 <translation id="7403691278183511381">‏חוויית ההפעלה הראשונה של Chrome</translation>
@@ -1140,6 +1143,7 @@
 <translation id="8284326494547611709">כתוביות</translation>
 <translation id="829672787777123339">מתבצע חיבור למכשיר…</translation>
 <translation id="8310344678080805313">כרטיסיות רגילות</translation>
+<translation id="831192587911042850">הוספת אתר האינטרנט שפתוח כרגע לרשימת אתרי האינטרנט שבמעקב.</translation>
 <translation id="8327155640814342956">‏כדי ליהנות מחוויית הגלישה הטובה ביותר, יש לפתוח את Chrome כדי לעדכן אותו</translation>
 <translation id="834313815369870491">אין לתרגם את האתרים אף פעם</translation>
 <translation id="8349013245300336738">מיון לפי כמות הנתונים שבהם נעשה שימוש</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
index a83deb7..7074922 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -304,6 +304,7 @@
 <translation id="2942036813789421260">A guia "Visualizar" está fechada</translation>
 <translation id="2956410042958133412">Esta conta é gerenciada por <ph name="PARENT_NAME_1" /> e <ph name="PARENT_NAME_2" />.</translation>
 <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> página não lida}one{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> página não lida}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> páginas não lidas}}</translation>
+<translation id="2961210776189273067">Título</translation>
 <translation id="2979025552038692506">Guia anônima selecionada</translation>
 <translation id="2979448359891869301">Não é possível alongar a captura de tela. Tente novamente quando o smartphone não estiver usando muitos recursos.</translation>
 <translation id="2979639724566107830">Abrir em uma nova janela</translation>
@@ -616,6 +617,7 @@
 <translation id="497421865427891073">Avançar</translation>
 <translation id="4988210275050210843">Fazendo o download do arquivo (<ph name="MEGABYTES" />).</translation>
 <translation id="4988526792673242964">Páginas</translation>
+<translation id="5001388021414335527">Siga este site</translation>
 <translation id="5004416275253351869">Controles de atividade do Google</translation>
 <translation id="5005498671520578047">Copiar senha</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> deseja se conectar</translation>
@@ -984,6 +986,7 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{Compartilhar 1 item selecionado}one{Compartilhar # item selecionado}other{Compartilhar # itens selecionados}}</translation>
 <translation id="7359002509206457351">Acessar formas de pagamento</translation>
 <translation id="7375125077091615385">Tipo:</translation>
+<translation id="7386842512861524348">A conexão do site é segura, a menos que o Chrome informe o contrário.</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" />.</translation>
 <translation id="7400418766976504921">URL</translation>
 <translation id="7403691278183511381">Tela de apresentação do Chrome</translation>
@@ -1141,6 +1144,7 @@
 <translation id="8284326494547611709">Legendas</translation>
 <translation id="829672787777123339">Conectando ao seu dispositivo…</translation>
 <translation id="8310344678080805313">Guias padrão</translation>
+<translation id="831192587911042850">Adiciona o site atual à lista de sites que você está seguindo.</translation>
 <translation id="8327155640814342956">Para ter a melhor experiência de navegação, abra para atualizar o Chrome</translation>
 <translation id="834313815369870491">Nunca traduzir estes sites</translation>
 <translation id="8349013245300336738">Classificar por quantidade de dados usados</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
index df80383..b517745 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -304,6 +304,7 @@
 <translation id="2942036813789421260">Önizleme sekmesi kapalı</translation>
 <translation id="2956410042958133412">Bu hesap <ph name="PARENT_NAME_1" /> ve <ph name="PARENT_NAME_2" /> tarafından yönetiliyor.</translation>
 <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{Okunmamış <ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> sayfa}other{Okunmamış <ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> sayfa}}</translation>
+<translation id="2961210776189273067">Unvan</translation>
 <translation id="2979025552038692506">Seçili Gizli Sekme</translation>
 <translation id="2979448359891869301">Ekran görüntüsü büyütülemiyor. Telefonunuz yoğun değilken tekrar deneyin.</translation>
 <translation id="2979639724566107830">Yeni pencerede aç</translation>
@@ -615,6 +616,7 @@
 <translation id="497421865427891073">İlerle</translation>
 <translation id="4988210275050210843">Dosya indiriliyor (<ph name="MEGABYTES" />).</translation>
 <translation id="4988526792673242964">Sayfalar</translation>
+<translation id="5001388021414335527">Siteyi buradan takip edin</translation>
 <translation id="5004416275253351869">Google etkinlik kontrolleri</translation>
 <translation id="5005498671520578047">Şifreyi kopyalayın</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> bağlanmak istiyor</translation>
@@ -983,6 +985,7 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 seçili öğeyi paylaş}other{# seçili öğeyi paylaş}}</translation>
 <translation id="7359002509206457351">Ödeme yöntemlerine erişim</translation>
 <translation id="7375125077091615385">Tür:</translation>
+<translation id="7386842512861524348">Chrome tarafından aksi belirtilmediği sürece sitenin bağlantısı güvenlidir.</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" />.</translation>
 <translation id="7400418766976504921">URL</translation>
 <translation id="7403691278183511381">Chrome İlk Çalıştırma Deneyimi</translation>
@@ -1140,6 +1143,7 @@
 <translation id="8284326494547611709">Altyazılar</translation>
 <translation id="829672787777123339">Cihazınıza bağlanılıyor…</translation>
 <translation id="8310344678080805313">Standart sekmeler</translation>
+<translation id="831192587911042850">Mevcut web sitesini, takip ettiğiniz web sitelerinin listesine ekler.</translation>
 <translation id="8327155640814342956">Web'e en iyi göz atma deneyimi için Chrome'u açıp güncelleyin</translation>
 <translation id="834313815369870491">Siteleri asla çevirme</translation>
 <translation id="8349013245300336738">Kullanılan veri miktarına göre sırala</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
index 7d07223..6d9d97e 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -304,6 +304,7 @@
 <translation id="2942036813789421260">預覽分頁已關閉</translation>
 <translation id="2956410042958133412">這個帳戶受 <ph name="PARENT_NAME_1" /> 和 <ph name="PARENT_NAME_2" /> 管理。</translation>
 <translation id="2961208450284224863">{READING_LIST_UNREAD_PAGE_COUNT,plural, =1{<ph name="READING_LIST_UNREAD_PAGE_COUNT_ONE" /> 個未讀取的網頁}other{<ph name="READING_LIST_UNREAD_PAGE_COUNT_MANY" /> 個未讀取的網頁}}</translation>
+<translation id="2961210776189273067">稱謂</translation>
 <translation id="2979025552038692506">選取的無痕式分頁</translation>
 <translation id="2979448359891869301">無法擴展螢幕截圖範圍。請在手機負載降低時再試一次。</translation>
 <translation id="2979639724566107830">於新視窗中開啟</translation>
@@ -615,6 +616,7 @@
 <translation id="497421865427891073">往前</translation>
 <translation id="4988210275050210843">正在下載檔案 (<ph name="MEGABYTES" />)。</translation>
 <translation id="4988526792673242964">網頁</translation>
+<translation id="5001388021414335527">在這裡追蹤這個網站</translation>
 <translation id="5004416275253351869">Google 活動控制項</translation>
 <translation id="5005498671520578047">複製密碼</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> 要求連線</translation>
@@ -983,6 +985,7 @@
 <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{分享 1 個選取的項目}other{分享 # 個選取的項目}}</translation>
 <translation id="7359002509206457351">存取付款方式</translation>
 <translation id="7375125077091615385">類型:</translation>
+<translation id="7386842512861524348">如果 Chrome 未另行通知,表示網站連線安全無虞。</translation>
 <translation id="7396940094317457632"><ph name="FILE_NAME" />。</translation>
 <translation id="7400418766976504921">網址</translation>
 <translation id="7403691278183511381">Chrome 初次使用體驗</translation>
@@ -1140,6 +1143,7 @@
 <translation id="8284326494547611709">字幕</translation>
 <translation id="829672787777123339">正在連線至裝置…</translation>
 <translation id="8310344678080805313">標準分頁</translation>
+<translation id="831192587911042850">將目前的網站加到你追蹤的網站清單中。</translation>
 <translation id="8327155640814342956">為獲得最佳瀏覽體驗,請開啟 Chrome 進行更新</translation>
 <translation id="834313815369870491">一律不翻譯的網站</translation>
 <translation id="8349013245300336738">依使用資料量排序</translation>
diff --git a/chrome/browser/ui/ash/in_session_auth_dialog_client.cc b/chrome/browser/ui/ash/in_session_auth_dialog_client.cc
index a1a8ab9..f9b9df70 100644
--- a/chrome/browser/ui/ash/in_session_auth_dialog_client.cc
+++ b/chrome/browser/ui/ash/in_session_auth_dialog_client.cc
@@ -65,8 +65,8 @@
 
 bool InSessionAuthDialogClient::IsFingerprintAuthAvailable(
     const AccountId& account_id) {
-  chromeos::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
-      chromeos::quick_unlock::QuickUnlockFactory::GetForAccountId(account_id);
+  ash::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+      ash::quick_unlock::QuickUnlockFactory::GetForAccountId(account_id);
   return quick_unlock_storage &&
          quick_unlock_storage->fingerprint_storage()->IsFingerprintAvailable();
 }
@@ -95,7 +95,7 @@
     const AccountId& account_id,
     base::OnceCallback<void(bool)> callback) {
   // PinBackend may be using cryptohome backend or prefs backend.
-  chromeos::quick_unlock::PinBackend::GetInstance()->CanAuthenticate(
+  ash::quick_unlock::PinBackend::GetInstance()->CanAuthenticate(
       account_id, std::move(callback));
 }
 
@@ -125,7 +125,7 @@
   pending_auth_state_.emplace(std::move(callback));
 
   if (authenticated_by_pin) {
-    chromeos::quick_unlock::PinBackend::GetInstance()->TryAuthenticate(
+    ash::quick_unlock::PinBackend::GetInstance()->TryAuthenticate(
         user_context.GetAccountId(), *user_context.GetKey(),
         base::BindOnce(&InSessionAuthDialogClient::OnPinAttemptDone,
                        weak_factory_.GetWeakPtr(), user_context));
@@ -142,10 +142,10 @@
     bool success) {
   if (success) {
     // Mark strong auth if this is cryptohome based pin.
-    if (chromeos::quick_unlock::PinBackend::GetInstance()->ShouldUseCryptohome(
+    if (ash::quick_unlock::PinBackend::GetInstance()->ShouldUseCryptohome(
             user_context.GetAccountId())) {
-      chromeos::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
-          chromeos::quick_unlock::QuickUnlockFactory::GetForAccountId(
+      ash::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+          ash::quick_unlock::QuickUnlockFactory::GetForAccountId(
               user_context.GetAccountId());
       if (quick_unlock_storage)
         quick_unlock_storage->MarkStrongAuth();
@@ -175,8 +175,8 @@
 
 void InSessionAuthDialogClient::OnPasswordAuthSuccess(
     const UserContext& user_context) {
-  chromeos::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
-      chromeos::quick_unlock::QuickUnlockFactory::GetForAccountId(
+  ash::quick_unlock::QuickUnlockStorage* quick_unlock_storage =
+      ash::quick_unlock::QuickUnlockFactory::GetForAccountId(
           user_context.GetAccountId());
   if (quick_unlock_storage)
     quick_unlock_storage->MarkStrongAuth();
diff --git a/chrome/browser/ui/ash/shelf/browser_app_status_observer.cc b/chrome/browser/ui/ash/shelf/browser_app_status_observer.cc
new file mode 100644
index 0000000..08714ba6
--- /dev/null
+++ b/chrome/browser/ui/ash/shelf/browser_app_status_observer.cc
@@ -0,0 +1,12 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/ash/shelf/browser_app_status_observer.h"
+
+void BrowserAppStatusObserver::OnBrowserAppAdded(
+    const BrowserAppInstance& instance) {}
+void BrowserAppStatusObserver::OnBrowserAppUpdated(
+    const BrowserAppInstance& instance) {}
+void BrowserAppStatusObserver::OnBrowserAppRemoved(
+    const BrowserAppInstance& instance) {}
diff --git a/chrome/browser/ui/ash/shelf/browser_app_status_observer.h b/chrome/browser/ui/ash/shelf/browser_app_status_observer.h
new file mode 100644
index 0000000..92cd410
--- /dev/null
+++ b/chrome/browser/ui/ash/shelf/browser_app_status_observer.h
@@ -0,0 +1,50 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_ASH_SHELF_BROWSER_APP_STATUS_OBSERVER_H_
+#define CHROME_BROWSER_UI_ASH_SHELF_BROWSER_APP_STATUS_OBSERVER_H_
+
+#include <string>
+
+class Browser;
+
+namespace content {
+class WebContents;
+}
+
+// An instance of a browser-based app. Can represent either of:
+// - apps running inside Browser->WebContents,
+// - actual browser instances (a single browser window). In this case `contents`
+//   will be null and app ID will be set to |extension_misc::kChromeAppId|.
+struct BrowserAppInstance {
+  BrowserAppInstance(BrowserAppInstance&&) = default;
+  BrowserAppInstance& operator=(BrowserAppInstance&&) = default;
+  BrowserAppInstance(const BrowserAppInstance&) = delete;
+  BrowserAppInstance& operator=(const BrowserAppInstance&) = delete;
+
+  std::string app_id;
+  Browser* browser;
+  content::WebContents* contents;
+  bool visible;
+  bool active;
+};
+
+// Observer interface to listen to |BrowserAppsTracker| events.
+class BrowserAppStatusObserver {
+ public:
+  virtual ~BrowserAppStatusObserver() = default;
+
+  // Called when a new app instance is started: a tab or a window is open, a tab
+  // navigates to a URL with an app.
+  virtual void OnBrowserAppAdded(const BrowserAppInstance& instance);
+  // Called when the app's window, app's tab, or a window containing the app's
+  // tab changes properties (visibility, active state), or a tab gets moved
+  // between browsers.
+  virtual void OnBrowserAppUpdated(const BrowserAppInstance& instance);
+  // Called when an app instance is stopped: a tab or window is closed, a new
+  // windowed app is open, a tab navigates to a URL with an app.
+  virtual void OnBrowserAppRemoved(const BrowserAppInstance& instance);
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_SHELF_BROWSER_APP_STATUS_OBSERVER_H_
diff --git a/chrome/browser/ui/ash/shelf/browser_apps_tracker.cc b/chrome/browser/ui/ash/shelf/browser_apps_tracker.cc
new file mode 100644
index 0000000..423cefe0
--- /dev/null
+++ b/chrome/browser/ui/ash/shelf/browser_apps_tracker.cc
@@ -0,0 +1,462 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/ash/shelf/browser_apps_tracker.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/containers/contains.h"
+#include "base/macros.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
+#include "extensions/common/constants.h"
+#include "ui/wm/public/activation_client.h"
+
+namespace {
+
+Browser* GetBrowserWithTabStripModel(TabStripModel* tab_strip_model) {
+  for (auto* browser : *BrowserList::GetInstance()) {
+    if (browser->tab_strip_model() == tab_strip_model)
+      return browser;
+  }
+  return nullptr;
+}
+
+std::string GetAppId(content::WebContents* contents) {
+  // TODO(crbug.com/1203992): this object isn't strictly necessary, we only
+  // really need GetAppIdForTab() function from shelf_controller_helper.cc
+  Profile* profile = Profile::FromBrowserContext(contents->GetBrowserContext());
+  return ShelfControllerHelper(profile).GetAppID(contents);
+}
+
+bool IsBrowserVisible(Browser* browser) {
+  aura::Window* window = browser->window()->GetNativeWindow();
+  return window->IsVisible();
+}
+
+bool IsBrowserActive(Browser* browser) {
+  aura::Window* window = browser->window()->GetNativeWindow();
+  auto* client = wm::GetActivationClient(window->GetRootWindow());
+  return client && window == client->GetActiveWindow();
+}
+
+bool IsAppVisible(Browser* browser, content::WebContents* contents) {
+  return IsBrowserVisible(browser);
+}
+
+bool IsAppActive(Browser* browser, content::WebContents* contents) {
+  return IsBrowserActive(browser) &&
+         browser->tab_strip_model()->GetActiveWebContents() == contents;
+}
+
+}  // namespace
+
+// Helper class to notify BrowserAppsTracker when WebContents navigation
+// finishes.
+class BrowserAppsTracker::WebContentsObserver
+    : public content::WebContentsObserver {
+ public:
+  explicit WebContentsObserver(content::WebContents* contents,
+                               BrowserAppsTracker* owner)
+      : content::WebContentsObserver(contents), owner_(owner) {}
+  WebContentsObserver(const WebContentsObserver&) = delete;
+  WebContentsObserver& operator=(const WebContentsObserver&) = delete;
+  ~WebContentsObserver() override = default;
+
+  // content::WebContentsObserver
+  void DidFinishNavigation(content::NavigationHandle* handle) override {
+    // TODO(crbug.com/1229189): Replace this callback with
+    // WebContentObserver::PrimaryPageChanged() when fixed.
+    if (handle->IsInPrimaryMainFrame() && handle->HasCommitted()) {
+      owner_->OnTabNavigationFinished(web_contents());
+    }
+  }
+
+ private:
+  BrowserAppsTracker* owner_;
+};
+
+const base::Feature BrowserAppsTracker::kEnabled{
+    "EnableBrowserAppsTracker", base::FEATURE_DISABLED_BY_DEFAULT};
+
+BrowserAppsTracker::BrowserAppsTracker(wm::ActivationClient* activation_client)
+    : browser_tab_strip_tracker_(this, nullptr),
+      activation_client_(activation_client) {
+  DCHECK(activation_client_);
+  activation_client_->AddObserver(this);
+}
+
+BrowserAppsTracker::~BrowserAppsTracker() {
+  activation_client_->RemoveObserver(this);
+}
+
+void BrowserAppsTracker::Initialize() {
+  browser_tab_strip_tracker_.Init();
+}
+
+void BrowserAppsTracker::OnTabStripModelChanged(
+    TabStripModel* tab_strip_model,
+    const TabStripModelChange& change,
+    const TabStripSelectionChange& selection) {
+  Browser* browser = GetBrowserWithTabStripModel(tab_strip_model);
+  DCHECK(browser);
+
+  switch (change.type()) {
+    case TabStripModelChange::kInserted:
+      OnTabStripModelChangeInsert(browser, *change.GetInsert(), selection);
+      break;
+    case TabStripModelChange::kRemoved:
+      OnTabStripModelChangeRemove(browser, *change.GetRemove(), selection);
+      break;
+    case TabStripModelChange::kReplaced:
+      OnTabStripModelChangeReplace(browser, *change.GetReplace());
+      break;
+    case TabStripModelChange::kMoved:
+      // Ignored.
+      break;
+    case TabStripModelChange::kSelectionOnly:
+      OnTabStripModelChangeSelection(browser, selection);
+      break;
+  }
+}
+
+void BrowserAppsTracker::OnWindowVisibilityChanged(aura::Window* window,
+                                                   bool visible) {
+  DCHECK(window);
+  OnBrowserWindowUpdated(window);
+}
+
+void BrowserAppsTracker::OnWindowActivated(
+    wm::ActivationChangeObserver::ActivationReason reason,
+    aura::Window* gained_active,
+    aura::Window* lost_active) {
+  if (gained_active) {
+    OnBrowserWindowUpdated(gained_active);
+  }
+  if (lost_active) {
+    OnBrowserWindowUpdated(lost_active);
+  }
+}
+
+void BrowserAppsTracker::OnTabStripModelChangeInsert(
+    Browser* browser,
+    const TabStripModelChange::Insert& insert,
+    const TabStripSelectionChange& selection) {
+  if (selection.old_contents) {
+    // A tab got deactivated on insertion.
+    OnTabUpdated(browser, selection.old_contents);
+  }
+  for (const auto& inserted_tab : insert.contents) {
+    auto& known_tabs = browser_to_tab_map_[browser];
+    if (known_tabs.size() == 0) {
+      OnBrowserAdded(browser);
+      BrowserWindow* window = browser->window();
+      if (window && window->GetNativeWindow()) {
+        browser_window_observations_.AddObservation(window->GetNativeWindow());
+      }
+    }
+    content::WebContents* contents = inserted_tab.contents;
+    known_tabs.insert(contents);
+    bool tab_is_new = !base::Contains(webcontents_to_observer_map_, contents);
+#if DCHECK_IS_ON()
+    if (tab_is_new) {
+      DCHECK(!base::Contains(tabs_in_transit_, contents));
+    } else {
+      // The tab must be in the set of tabs in transit.
+      DCHECK(tabs_in_transit_.erase(contents) == 1);
+    }
+#endif
+    if (tab_is_new) {
+      webcontents_to_observer_map_[contents] =
+          std::make_unique<BrowserAppsTracker::WebContentsObserver>(contents,
+                                                                    this);
+      OnTabCreated(browser, contents);
+    }
+    OnTabAttached(browser, contents);
+  }
+}
+
+void BrowserAppsTracker::OnTabStripModelChangeRemove(
+    Browser* browser,
+    const TabStripModelChange::Remove& remove,
+    const TabStripSelectionChange& selection) {
+  for (const auto& removed_tab : remove.contents) {
+    auto& known_tabs = browser_to_tab_map_[browser];
+    DCHECK(known_tabs.size() > 0);
+    content::WebContents* contents = removed_tab.contents;
+    known_tabs.erase(contents);
+    bool tab_will_be_closed = false;
+    switch (removed_tab.remove_reason) {
+      case TabStripModelChange::RemoveReason::kDeleted:
+      case TabStripModelChange::RemoveReason::kCached:
+#if DCHECK_IS_ON()
+        DCHECK(!base::Contains(tabs_in_transit_, contents));
+#endif
+        tab_will_be_closed = true;
+        break;
+      case TabStripModelChange::RemoveReason::kInsertedIntoOtherTabStrip:
+        // The tab will be reinserted immediately into another browser, so
+        // this event is ignored.
+        if (browser->is_type_devtools()) {
+          // TODO(crbug.com/1221967): when a dev tools window is docked, and
+          // its WebContents is removed, it will not be reinserted into
+          // another tab strip, so it should be treated as closed.
+          tab_will_be_closed = true;
+        } else {
+          // The tab must not be already in the set of tabs in transit.
+#if DCHECK_IS_ON()
+          DCHECK(tabs_in_transit_.insert(contents).second);
+#endif
+        }
+        break;
+    }
+    if (tab_will_be_closed) {
+      OnTabClosing(browser, contents);
+    }
+    if (tab_will_be_closed) {
+      DCHECK(base::Contains(webcontents_to_observer_map_, contents));
+      webcontents_to_observer_map_.erase(contents);
+    }
+    if (known_tabs.empty()) {
+      BrowserWindow* window = browser->window();
+      DCHECK(window && window->GetNativeWindow());
+      browser_window_observations_.RemoveObservation(window->GetNativeWindow());
+      OnBrowserRemoved(browser);
+      browser_to_tab_map_.erase(browser);
+    }
+  }
+  if (selection.new_contents) {
+    // A tab got activated on removal.
+    OnTabUpdated(browser, selection.new_contents);
+  }
+}
+
+void BrowserAppsTracker::OnTabStripModelChangeReplace(
+    Browser* browser,
+    const TabStripModelChange::Replace& replace) {
+  // Simulate closing the old tab and opening a new tab.
+  OnTabClosing(browser, replace.old_contents);
+  OnTabCreated(browser, replace.new_contents);
+  OnTabAttached(browser, replace.new_contents);
+}
+
+void BrowserAppsTracker::OnTabStripModelChangeSelection(
+    Browser* browser,
+    const TabStripSelectionChange& selection) {
+  if (!selection.active_tab_changed()) {
+    return;
+  }
+  if (selection.new_contents) {
+    OnTabUpdated(browser, selection.new_contents);
+  }
+  if (selection.old_contents) {
+    OnTabUpdated(browser, selection.old_contents);
+  }
+}
+
+void BrowserAppsTracker::OnBrowserAdded(Browser* browser) {
+  if (browser->is_type_normal()) {
+    CreateChromeInstance(browser);
+  }
+}
+
+void BrowserAppsTracker::OnBrowserRemoved(Browser* browser) {
+  if (base::Contains(chrome_instances_, browser)) {
+    RemoveChromeInstance(browser);
+  }
+}
+
+void BrowserAppsTracker::OnTabCreated(Browser* browser,
+                                      content::WebContents* contents) {
+  std::string app_id = GetAppId(contents);
+  if (!app_id.empty()) {
+    CreateAppInstance(std::move(app_id), browser, contents);
+  }
+}
+
+void BrowserAppsTracker::OnTabAttached(Browser* browser,
+                                       content::WebContents* contents) {
+  std::string app_id = GetAppId(contents);
+  if (!app_id.empty()) {
+    auto it = app_instances_.find(contents);
+    DCHECK(it != app_instances_.end());
+    auto& app_instance = it->second;
+    // All app ID changes should be handled in OnTabUpdated.
+    DCHECK_EQ(app_instance.app_id, app_id);
+    MaybeUpdateAppInstance(app_instance, browser);
+  }
+}
+
+void BrowserAppsTracker::OnTabUpdated(Browser* browser,
+                                      content::WebContents* contents) {
+  std::string new_app_id = GetAppId(contents);
+  auto it = app_instances_.find(contents);
+  if (it != app_instances_.end()) {
+    auto& app_instance = it->second;
+    if (app_instance.app_id != new_app_id) {
+      // If app ID changed on navigation, remove the old app.
+      RemoveAppInstance(contents);
+      // Add the new app instance, if navigated to another app.
+      if (!new_app_id.empty()) {
+        CreateAppInstance(std::move(new_app_id), browser, contents);
+      }
+    } else {
+      // App ID did not change, but other attributes may have.
+      MaybeUpdateAppInstance(app_instance, browser);
+    }
+  } else if (!new_app_id.empty()) {
+    // Tab previously had no app ID, but navigated to a URL that does.
+    CreateAppInstance(std::move(new_app_id), browser, contents);
+  } else {
+    // Tab without an app has changed, we don't care about it.
+  }
+}
+
+void BrowserAppsTracker::OnTabClosing(Browser* browser,
+                                      content::WebContents* contents) {
+  if (base::Contains(app_instances_, contents)) {
+    RemoveAppInstance(contents);
+  }
+}
+
+void BrowserAppsTracker::OnTabNavigationFinished(
+    content::WebContents* contents) {
+  Browser* browser = chrome::FindBrowserWithWebContents(contents);
+  if (browser) {
+    OnTabUpdated(browser, contents);
+  }
+}
+
+void BrowserAppsTracker::OnBrowserWindowUpdated(aura::Window* window) {
+  // We only want to send window events for the browsers we track to avoid
+  // sending window events before a "browser added" event.
+  Browser* browser = FindTrackedBrowserByWindow(window);
+  if (!browser) {
+    return;
+  }
+
+  auto it = chrome_instances_.find(browser);
+  if (it != chrome_instances_.end()) {
+    MaybeUpdateChromeInstance(it->second);
+  }
+
+  TabStripModel* tab_strip_model = browser->tab_strip_model();
+  for (int i = 0; i < tab_strip_model->count(); i++) {
+    content::WebContents* contents = tab_strip_model->GetWebContentsAt(i);
+    OnTabUpdated(browser, contents);
+  }
+}
+
+Browser* BrowserAppsTracker::FindTrackedBrowserByWindow(aura::Window* window) {
+  for (const auto& pair : browser_to_tab_map_) {
+    Browser* browser = pair.first;
+    if (browser->window() && browser->window()->GetNativeWindow() == window) {
+      return browser;
+    }
+  }
+  return nullptr;
+}
+
+void BrowserAppsTracker::CreateAppInstance(std::string app_id,
+                                           Browser* browser,
+                                           content::WebContents* contents) {
+  // TODO(crbug.com/1203992): generate WebContents ID here
+  CreateInstance(app_instances_, contents,
+                 BrowserAppInstance{
+                     std::move(app_id),
+                     browser,
+                     contents,
+                     IsAppVisible(browser, contents),
+                     IsAppActive(browser, contents),
+                 });
+}
+
+void BrowserAppsTracker::MaybeUpdateAppInstance(BrowserAppInstance& instance,
+                                                Browser* browser) {
+  MaybeUpdateInstance(instance, browser);
+}
+
+void BrowserAppsTracker::RemoveAppInstance(content::WebContents* contents) {
+  RemoveInstance(app_instances_, contents);
+}
+
+void BrowserAppsTracker::CreateChromeInstance(Browser* browser) {
+  CreateInstance(chrome_instances_, browser,
+                 BrowserAppInstance{
+                     extension_misc::kChromeAppId,
+                     browser,
+                     nullptr,
+                     IsBrowserVisible(browser),
+                     IsBrowserActive(browser),
+                 });
+}
+
+void BrowserAppsTracker::MaybeUpdateChromeInstance(
+    BrowserAppInstance& instance) {
+  // Browser does not change for Chrome instances.
+  MaybeUpdateInstance(instance, instance.browser);
+}
+
+void BrowserAppsTracker::RemoveChromeInstance(Browser* browser) {
+  RemoveInstance(chrome_instances_, browser);
+}
+
+template <typename KeyT>
+void BrowserAppsTracker::CreateInstance(
+    std::map<KeyT, BrowserAppInstance>& instances,
+    const KeyT& key,
+    BrowserAppInstance&& instance) {
+  DCHECK(!base::Contains(instances, key));
+  auto it = instances.insert(std::make_pair(key, std::move(instance)));
+  auto& app_instance = it.first->second;
+  for (auto& observer : observers_) {
+    observer.OnBrowserAppAdded(app_instance);
+  }
+}
+
+void BrowserAppsTracker::MaybeUpdateInstance(BrowserAppInstance& instance,
+                                             Browser* browser) {
+  DCHECK(browser);
+  bool visible;
+  bool active;
+  if (instance.contents) {
+    visible = IsAppVisible(browser, instance.contents);
+    active = IsAppActive(browser, instance.contents);
+  } else {
+    visible = IsBrowserVisible(browser);
+    active = IsBrowserActive(browser);
+  }
+  if (instance.browser == browser && instance.visible == visible &&
+      instance.active == active) {
+    return;
+  }
+  instance.browser = browser;
+  instance.visible = visible;
+  instance.active = active;
+
+  for (auto& observer : observers_) {
+    observer.OnBrowserAppUpdated(instance);
+  }
+}
+
+template <typename KeyT>
+void BrowserAppsTracker::RemoveInstance(
+    std::map<KeyT, BrowserAppInstance>& instances,
+    const KeyT& key) {
+  DCHECK(base::Contains(instances, key));
+  auto it = instances.find(key);
+  auto app_instance = std::move(it->second);
+  instances.erase(it);
+  for (auto& observer : observers_) {
+    observer.OnBrowserAppRemoved(app_instance);
+  }
+}
diff --git a/chrome/browser/ui/ash/shelf/browser_apps_tracker.h b/chrome/browser/ui/ash/shelf/browser_apps_tracker.h
new file mode 100644
index 0000000..87e144b8
--- /dev/null
+++ b/chrome/browser/ui/ash/shelf/browser_apps_tracker.h
@@ -0,0 +1,173 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_ASH_SHELF_BROWSER_APPS_TRACKER_H_
+#define CHROME_BROWSER_UI_ASH_SHELF_BROWSER_APPS_TRACKER_H_
+
+#include <map>
+#include <memory>
+#include <set>
+
+#include "base/check.h"
+#include "base/feature_list.h"
+#include "base/observer_list.h"
+#include "base/scoped_multi_source_observation.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/ash/shelf/browser_app_status_observer.h"
+#include "chrome/browser/ui/ash/shelf/shelf_controller_helper.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_tab_strip_tracker.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_observer.h"
+#include "ui/wm/public/activation_change_observer.h"
+
+class Browser;
+
+namespace wm {
+class ActivationClient;
+}
+
+// BrowserAppsTracker monitors changes to Browsers, TabStripModels and browsers'
+// native windows to maintain a list of running apps and notify its registered
+// observers of any changes:
+// - apps running in WebContents (web apps, hosted apps, V1 packaged apps)
+// - browser instances (registered with app ID |extension_misc::kChromeAppId|).
+class BrowserAppsTracker : public TabStripModelObserver,
+                           public aura::WindowObserver,
+                           public wm::ActivationChangeObserver {
+ public:
+  static const base::Feature kEnabled;
+
+  explicit BrowserAppsTracker(wm::ActivationClient* activation_client);
+  ~BrowserAppsTracker() override;
+  BrowserAppsTracker(const BrowserAppsTracker&) = delete;
+  BrowserAppsTracker& operator=(const BrowserAppsTracker&) = delete;
+
+  // Causes BrowserAppStatusObserver events to fire for all existing browsers.
+  void Initialize();
+
+  void AddObserver(BrowserAppStatusObserver* observer) {
+    observers_.AddObserver(observer);
+  }
+
+  void RemoveObserver(BrowserAppStatusObserver* observer) {
+    observers_.RemoveObserver(observer);
+  }
+
+  // TabStripModelObserver overrides:
+  void OnTabStripModelChanged(
+      TabStripModel* tab_strip_model,
+      const TabStripModelChange& change,
+      const TabStripSelectionChange& selection) override;
+
+  // aura::WindowObserver overrides:
+  void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
+
+  // ActivationChangeObserver overrides:
+  void OnWindowActivated(wm::ActivationChangeObserver::ActivationReason reason,
+                         aura::Window* gained_active,
+                         aura::Window* lost_active) override;
+
+ private:
+  class WebContentsObserver;
+
+  // Called by TabStripModelChanged().
+  void OnTabStripModelChangeInsert(Browser* browser,
+                                   const TabStripModelChange::Insert& insert,
+                                   const TabStripSelectionChange& selection);
+  void OnTabStripModelChangeRemove(Browser* browser,
+                                   const TabStripModelChange::Remove& remove,
+                                   const TabStripSelectionChange& selection);
+  void OnTabStripModelChangeReplace(
+      Browser* browser,
+      const TabStripModelChange::Replace& replace);
+  void OnTabStripModelChangeSelection(Browser* browser,
+                                      const TabStripSelectionChange& selection);
+
+  // Called by OnTabStripModelChange* functions.
+  void OnBrowserAdded(Browser* browser);
+  void OnBrowserRemoved(Browser* browser);
+  void OnTabCreated(Browser* browser, content::WebContents* contents);
+  void OnTabAttached(Browser* browser, content::WebContents* contents);
+  void OnTabUpdated(Browser* browser, content::WebContents* contents);
+  void OnTabClosing(Browser* browser, content::WebContents* contents);
+
+  // Called by |BrowserAppsTracker::WebContentsObserver|.
+  void OnTabNavigationFinished(content::WebContents* contents);
+
+  // Called on browser window changes. Sends update events for all open tabs.
+  void OnBrowserWindowUpdated(aura::Window* window);
+
+  Browser* FindTrackedBrowserByWindow(aura::Window* window);
+
+  // Creates an app instance for the app running in |WebContents|. Handles both
+  // apps in tabs and windows.
+  void CreateAppInstance(std::string app_id,
+                         Browser* browser,
+                         content::WebContents* contents);
+
+  // Updates the app instance with the new attributes and notifies observers, if
+  // it was updated.
+  void MaybeUpdateAppInstance(BrowserAppInstance& instance, Browser* browser);
+
+  // Removes the app instance and notifies observers.
+  void RemoveAppInstance(content::WebContents* contents);
+
+  // Creates an app instance for a Chrome browser window.
+  void CreateChromeInstance(Browser* browser);
+
+  // Updates the browser instance with the new attributes and notifies
+  // observers, if it was updated.
+  void MaybeUpdateChromeInstance(BrowserAppInstance& instance);
+
+  // Removes the browser instance and notifies observers.
+  void RemoveChromeInstance(Browser* browser);
+
+  template <typename KeyT>
+  void CreateInstance(std::map<KeyT, BrowserAppInstance>& instances,
+                      const KeyT& key,
+                      BrowserAppInstance&& instance);
+
+  // Updates the instance (app or browser) with the new attributes and notifies
+  // observers, if it was updated.
+  void MaybeUpdateInstance(BrowserAppInstance& instance, Browser* browser);
+
+  // Removes the instance given a map (app or browser) and notifies observers.
+  template <typename KeyT>
+  void RemoveInstance(std::map<KeyT, BrowserAppInstance>& instances,
+                      const KeyT& key);
+
+  std::map<content::WebContents*, std::unique_ptr<WebContentsObserver>>
+      webcontents_to_observer_map_;
+
+  // Keep track of known tabs per browser as represented by TabStripModel events
+  // so we know when the first tab is inserted and the last tab is removed per
+  // browser.
+  std::map<Browser*, std::set<content::WebContents*>> browser_to_tab_map_;
+
+  // A set of observed browser windows.
+  base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver>
+      browser_window_observations_{this};
+
+  BrowserTabStripTracker browser_tab_strip_tracker_;
+  wm::ActivationClient* activation_client_;
+
+#if DCHECK_IS_ON()
+  // Tabs that are removed from one browser and are getting reinserted into
+  // another.
+  std::set<content::WebContents*> tabs_in_transit_;
+#endif
+
+  // A map of all apps running in either tabs or windows.
+  std::map<content::WebContents*, BrowserAppInstance> app_instances_;
+
+  // A map of Chrome browser windows.
+  std::map<Browser*, BrowserAppInstance> chrome_instances_;
+
+  base::ObserverList<BrowserAppStatusObserver, true>::Unchecked observers_;
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_SHELF_BROWSER_APPS_TRACKER_H_
diff --git a/chrome/browser/ui/ash/shelf/browser_apps_tracker_browsertest.cc b/chrome/browser/ui/ash/shelf/browser_apps_tracker_browsertest.cc
new file mode 100644
index 0000000..bdfdf1c
--- /dev/null
+++ b/chrome/browser/ui/ash/shelf/browser_apps_tracker_browsertest.cc
@@ -0,0 +1,576 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/shell.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/ash/shelf/browser_app_status_observer.h"
+#include "chrome/browser/ui/ash/shelf/browser_apps_tracker.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_navigator.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/web_applications/components/web_app_id.h"
+#include "chrome/browser/web_applications/components/web_application_info.h"
+#include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
+#include "chrome/common/chrome_switches.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/browser/page_navigator.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "extensions/common/constants.h"
+#include "ui/wm/public/activation_client.h"
+
+// default implementation of RunTestOnMainThread() and TestBody()
+#include "content/public/test/browser_test.h"
+
+namespace {
+
+using extension_misc::kChromeAppId;
+
+// Generated from start URL "https://a.example.org/".
+// See |web_app::GenerateAppId|.
+constexpr char kAppAId[] = "dhehpanpcmiafdmbldplnfenbijejdfe";
+
+// Generated from start URL "https://b.example.org/".
+constexpr char kAppBId[] = "abhkhfladdfdlfmhaokoglcllbamaili";
+
+struct Event {
+  static Event Create(const std::string name,
+                      const BrowserAppInstance& instance) {
+    return {
+        name,
+        instance.app_id,
+        instance.browser,
+        instance.contents,
+        instance.visible,
+        instance.active,
+    };
+  }
+  std::string name;
+  std::string app_id;
+  Browser* browser;
+  content::WebContents* contents;
+  bool visible;
+  bool active;
+};
+
+// Make test sequence easier to scan
+constexpr bool kVisible = true;
+constexpr bool kHidden = false;
+constexpr bool kActive = true;
+constexpr bool kInactive = false;
+
+bool operator==(const Event& e1, const Event& e2) {
+  return e1.name == e2.name && e1.app_id == e2.app_id &&
+         e1.browser == e2.browser && e1.contents == e2.contents &&
+         e1.visible == e2.visible && e1.active == e2.active;
+}
+
+bool operator!=(const Event& e1, const Event& e2) {
+  return !(e1 == e2);
+}
+
+std::ostream& operator<<(std::ostream& os, const Event& e) {
+  if (e.name == "") {
+    return os << "none";
+  }
+  os << e.name << "(app_id=" << e.app_id << ", browser=" << e.browser;
+  if (e.contents) {
+    os << ", tab=" << e.contents;
+  }
+  os << ", " << (e.visible ? "visible" : "hidden");
+  os << ", " << (e.active ? "active" : "inactive");
+  return os << ")";
+}
+
+class Recorder : public BrowserAppStatusObserver {
+ public:
+  explicit Recorder(BrowserAppsTracker* tracker) : tracker_(tracker) {
+    DCHECK(tracker);
+    tracker_->AddObserver(this);
+  }
+
+  ~Recorder() override { tracker_->RemoveObserver(this); }
+
+  void OnBrowserAppAdded(const BrowserAppInstance& instance) override {
+    calls_.push_back(Event::Create("added", instance));
+  }
+
+  void OnBrowserAppUpdated(const BrowserAppInstance& instance) override {
+    calls_.push_back(Event::Create("updated", instance));
+  }
+
+  void OnBrowserAppRemoved(const BrowserAppInstance& instance) override {
+    calls_.push_back(Event::Create("removed", instance));
+  }
+
+  void Verify(const std::vector<Event>& expected_calls) {
+    EXPECT_EQ(calls_.size(), expected_calls.size());
+    for (int i = 0; i < std::max(calls_.size(), expected_calls.size()); ++i) {
+      EXPECT_EQ(Get(calls_, i), Get(expected_calls, i)) << "call #" << i;
+    }
+  }
+
+ private:
+  static const Event Get(const std::vector<Event>& calls, int i) {
+    if (i < calls.size()) {
+      return calls[i];
+    }
+    return {};
+  }
+
+  BrowserAppsTracker* tracker_;
+  std::vector<Event> calls_;
+};
+
+}  // namespace
+
+class BrowserAppsTrackerTest : public InProcessBrowserTest {
+ protected:
+  Browser* CreateBrowser() {
+    Profile* profile = ProfileManager::GetPrimaryUserProfile();
+    Browser::CreateParams params(profile, true /* user_gesture */);
+    Browser* browser = Browser::Create(params);
+    browser->window()->Show();
+    return browser;
+  }
+
+  Browser* CreateAppBrowser(const std::string& app_id) {
+    Profile* profile = ProfileManager::GetPrimaryUserProfile();
+    auto params = Browser::CreateParams::CreateForApp(
+        "_crx_" + app_id, true /* trusted_source */,
+        gfx::Rect(), /* window_bounts */
+        profile, true /* user_gesture */);
+    Browser* browser = Browser::Create(params);
+    browser->window()->Show();
+    return browser;
+  }
+
+  content::WebContents* NavigateAndWait(Browser* browser,
+                                        const std::string& url,
+                                        WindowOpenDisposition disposition) {
+    NavigateParams params(browser, GURL(url),
+                          ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
+    params.disposition = disposition;
+    Navigate(&params);
+    auto* contents = params.navigated_or_inserted_contents;
+    content::TestNavigationObserver observer(contents);
+    observer.Wait();
+    return contents;
+  }
+
+  void NavigateActiveTab(Browser* browser, const std::string& url) {
+    NavigateAndWait(browser, url, WindowOpenDisposition::CURRENT_TAB);
+  }
+
+  content::WebContents* InsertBackgroundTab(Browser* browser,
+                                            const std::string& url) {
+    return NavigateAndWait(browser, url,
+                           WindowOpenDisposition::NEW_BACKGROUND_TAB);
+  }
+
+  content::WebContents* InsertForegroundTab(Browser* browser,
+                                            const std::string& url) {
+    return NavigateAndWait(browser, url,
+                           WindowOpenDisposition::NEW_FOREGROUND_TAB);
+  }
+
+  web_app::AppId InstallWebApp(const std::string& start_url) {
+    auto info = std::make_unique<WebApplicationInfo>();
+    info->start_url = GURL(start_url);
+    Profile* profile = ProfileManager::GetPrimaryUserProfile();
+    return web_app::test::InstallWebApp(profile, std::move(info));
+  }
+
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+    tracker_ = std::make_unique<BrowserAppsTracker>(
+        ash::Shell::Get()->activation_client());
+    tracker_->Initialize();
+
+    ASSERT_EQ(kAppAId, InstallWebApp("https://a.example.org"));
+    ASSERT_EQ(kAppBId, InstallWebApp("https://b.example.org"));
+  }
+
+  void TearDownOnMainThread() override {
+    tracker_.reset();
+    InProcessBrowserTest::TearDownOnMainThread();
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    InProcessBrowserTest ::SetUpCommandLine(command_line);
+    command_line->AppendSwitch(switches::kNoStartupWindow);
+  }
+
+ protected:
+  std::unique_ptr<BrowserAppsTracker> tracker_;
+};
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, InsertAndCloseTabs) {
+  Browser* browser = nullptr;
+  content::WebContents* tab_app1 = nullptr;
+  content::WebContents* tab_app2 = nullptr;
+
+  // Open a foreground tab with a website.
+  {
+    SCOPED_TRACE("insert an initial foreground tab");
+    Recorder recorder(tracker_.get());
+
+    browser = CreateBrowser();
+    tab_app1 = InsertForegroundTab(browser, "https://a.example.org");
+    recorder.Verify({
+        {"added", kChromeAppId, browser, nullptr, kVisible, kActive},
+        {"added", kAppAId, browser, tab_app1, kVisible, kActive},
+    });
+  }
+
+  // Open a second tab in foreground.
+  {
+    SCOPED_TRACE("insert a second foreground tab");
+    Recorder recorder(tracker_.get());
+
+    tab_app2 = InsertForegroundTab(browser, "https://b.example.org");
+    recorder.Verify({
+        {"updated", kAppAId, browser, tab_app1, kVisible, kInactive},
+        {"added", kAppBId, browser, tab_app2, kVisible, kActive},
+    });
+  }
+
+  // Open a third tab in foreground with no app.
+  {
+    SCOPED_TRACE("insert a third foreground tab without app");
+    Recorder recorder(tracker_.get());
+
+    InsertForegroundTab(browser, "https://c.example.org");
+    recorder.Verify({
+        {"updated", kAppBId, browser, tab_app2, kVisible, kInactive},
+    });
+  }
+
+  // Open two more tabs in foreground and close them.
+  {
+    SCOPED_TRACE("insert and close two more tabs");
+    Recorder recorder(tracker_.get());
+
+    auto* tab_app4 = InsertForegroundTab(browser, "https://a.example.org");
+    auto* tab_app5 = InsertForegroundTab(browser, "https://b.example.org");
+    // Close in reverse order.
+    int i = browser->tab_strip_model()->GetIndexOfWebContents(tab_app5);
+    browser->tab_strip_model()->CloseWebContentsAt(
+        i, TabStripModel::CLOSE_USER_GESTURE);
+    i = browser->tab_strip_model()->GetIndexOfWebContents(tab_app4);
+    browser->tab_strip_model()->CloseWebContentsAt(
+        i, TabStripModel::CLOSE_USER_GESTURE);
+
+    recorder.Verify({
+        // tab 4 opened: no events for tab 3 as it has no app
+        {"added", kAppAId, browser, tab_app4, kVisible, kActive},
+        // tab 5 opened: tab 4 deactivates
+        {"updated", kAppAId, browser, tab_app4, kVisible, kInactive},
+        {"added", kAppBId, browser, tab_app5, kVisible, kActive},
+        // tab 5 closed: tab 4 reactivates
+        {"removed", kAppBId, browser, tab_app5, kVisible, kActive},
+        {"updated", kAppAId, browser, tab_app4, kVisible, kActive},
+        // tab closed: no events for tab 3 as it has no app
+        {"removed", kAppAId, browser, tab_app4, kVisible, kActive},
+    });
+  }
+
+  // Close the browser.
+  {
+    SCOPED_TRACE("close browser");
+    Recorder recorder(tracker_.get());
+
+    browser->tab_strip_model()->CloseAllTabs();
+    recorder.Verify({
+        {"removed", kAppBId, browser, tab_app2, kVisible, kInactive},
+        {"removed", kAppAId, browser, tab_app1, kVisible, kInactive},
+        {"removed", kChromeAppId, browser, nullptr, kVisible, kActive},
+    });
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, ForegroundTabNavigate) {
+  // Setup: one foreground tab with no app.
+  auto* browser = CreateBrowser();
+  auto* tab = InsertForegroundTab(browser, "https://c.example.org");
+
+  // Navigate the foreground tab to app A.
+  {
+    SCOPED_TRACE("navigate tab to app A");
+    Recorder recorder(tracker_.get());
+
+    NavigateActiveTab(browser, "https://a.example.org");
+    recorder.Verify({
+        {"added", kAppAId, browser, tab, kVisible, kActive},
+    });
+  }
+
+  // Navigate the foreground tab to app B.
+  {
+    SCOPED_TRACE("navigate tab to app B");
+    Recorder recorder(tracker_.get());
+
+    NavigateActiveTab(browser, "https://b.example.org");
+    recorder.Verify({
+        {"removed", kAppAId, browser, tab, kVisible, kActive},
+        {"added", kAppBId, browser, tab, kVisible, kActive},
+    });
+  }
+
+  // Navigate the foreground tab to a different subdomain with no app.
+  {
+    SCOPED_TRACE("navigate tab from app B to a non-app subdomain");
+    Recorder recorder(tracker_.get());
+
+    NavigateActiveTab(browser, "https://c.example.org");
+    recorder.Verify({
+        {"removed", kAppBId, browser, tab, kVisible, kActive},
+    });
+  }
+
+  // Navigate the foreground tab from a non-app subdomain to app B.
+  {
+    SCOPED_TRACE("navigate tab from a non-app subdomain to app B");
+    Recorder recorder(tracker_.get());
+
+    NavigateActiveTab(browser, "https://b.example.org");
+    recorder.Verify({
+        {"added", kAppBId, browser, tab, kVisible, kActive},
+    });
+  }
+
+  // Navigate the foreground tab to a different domain with no app.
+  {
+    SCOPED_TRACE("navigate tab from app B to a non-app domain");
+    Recorder recorder(tracker_.get());
+
+    NavigateActiveTab(browser, "https://example.com");
+    recorder.Verify({
+        {"removed", kAppBId, browser, tab, kVisible, kActive},
+    });
+  }
+
+  // Navigate the foreground tab from a non-app domain to app B.
+  {
+    SCOPED_TRACE("navigate tab from a non-app domain to app B");
+    Recorder recorder(tracker_.get());
+
+    NavigateActiveTab(browser, "https://b.example.org");
+    recorder.Verify({
+        {"added", kAppBId, browser, tab, kVisible, kActive},
+    });
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, WindowedWebApp) {
+  Browser* browser = nullptr;
+  content::WebContents* tab = nullptr;
+
+  // Open app A in a window.
+  {
+    SCOPED_TRACE("create a windowed app");
+    Recorder recorder(tracker_.get());
+
+    browser = CreateAppBrowser(kAppAId);
+    tab = InsertForegroundTab(browser, "https://a.example.org");
+    recorder.Verify({
+        {"added", kAppAId, browser, tab, kVisible, kActive},
+    });
+  }
+
+  // Close the browser.
+  {
+    SCOPED_TRACE("close browser");
+    Recorder recorder(tracker_.get());
+
+    browser->tab_strip_model()->CloseAllTabs();
+    recorder.Verify({
+        {"removed", kAppAId, browser, tab, kVisible, kActive},
+    });
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, SwitchTabs) {
+  // Setup: one foreground tab and one background tab.
+  auto* browser = CreateBrowser();
+  auto* tab0 = InsertForegroundTab(browser, "https://a.example.org");
+  auto* tab1 = InsertForegroundTab(browser, "https://b.example.org");
+  InsertForegroundTab(browser, "https://c.example.org");
+
+  // Switch tabs: no app -> app A
+  {
+    SCOPED_TRACE("switch tabs to app A");
+    Recorder recorder(tracker_.get());
+
+    browser->tab_strip_model()->ActivateTabAt(0);
+    recorder.Verify({
+        {"updated", kAppAId, browser, tab0, kVisible, kActive},
+    });
+  }
+
+  // Switch tabs: app A -> app B
+  {
+    SCOPED_TRACE("switch tabs to app B");
+    Recorder recorder(tracker_.get());
+
+    browser->tab_strip_model()->ActivateTabAt(1);
+    recorder.Verify({
+        {"updated", kAppBId, browser, tab1, kVisible, kActive},
+        {"updated", kAppAId, browser, tab0, kVisible, kInactive},
+    });
+  }
+
+  // Switch tabs: app B -> no app
+  {
+    SCOPED_TRACE("switch tabs to no app");
+    Recorder recorder(tracker_.get());
+
+    browser->tab_strip_model()->ActivateTabAt(2);
+    recorder.Verify({
+        {"updated", kAppBId, browser, tab1, kVisible, kInactive},
+    });
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, WindowVisibility) {
+  // Setup: one foreground tab and one background tab.
+  auto* browser = CreateBrowser();
+  auto* bg_tab = InsertForegroundTab(browser, "https://a.example.org");
+  auto* fg_tab = InsertForegroundTab(browser, "https://b.example.org");
+  InsertForegroundTab(browser, "https://c.example.org");
+  auto* window = browser->window()->GetNativeWindow();
+  auto* activation_client = ash::Shell::Get()->activation_client();
+  // Prevent spurious deactivation events.
+  activation_client->DeactivateWindow(window);
+  ASSERT_EQ(activation_client->GetActiveWindow(), nullptr);
+
+  // Hide the window.
+  {
+    SCOPED_TRACE("hide window");
+    Recorder recorder(tracker_.get());
+
+    window->Hide();
+    recorder.Verify({
+        {"updated", kChromeAppId, browser, nullptr, kHidden, kInactive},
+        {"updated", kAppAId, browser, bg_tab, kHidden, kInactive},
+        {"updated", kAppBId, browser, fg_tab, kHidden, kInactive},
+    });
+  }
+
+  // Show the window.
+  {
+    SCOPED_TRACE("show window");
+    Recorder recorder(tracker_.get());
+
+    window->Show();
+    recorder.Verify({
+        {"updated", kChromeAppId, browser, nullptr, kVisible, kInactive},
+        {"updated", kAppAId, browser, bg_tab, kVisible, kInactive},
+        {"updated", kAppBId, browser, fg_tab, kVisible, kInactive},
+    });
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, WindowActivation) {
+  // Setup: two browsers with two tabs each.
+  auto* browser1 = CreateBrowser();
+  InsertForegroundTab(browser1, "https://a.example.org");
+  InsertForegroundTab(browser1, "https://c.example.org");
+  auto* fg_tab1 = InsertForegroundTab(browser1, "https://b.example.org");
+  auto* window1 = browser1->window()->GetNativeWindow();
+
+  auto* browser2 = CreateBrowser();
+  InsertForegroundTab(browser2, "https://a.example.org");
+  InsertForegroundTab(browser2, "https://c.example.org");
+  auto* fg_tab2 = InsertForegroundTab(browser2, "https://b.example.org");
+  auto* window2 = browser2->window()->GetNativeWindow();
+
+  auto* activation_client = ash::Shell::Get()->activation_client();
+  ASSERT_EQ(activation_client->GetActiveWindow(), window2);
+
+  // Activate window 1.
+  {
+    SCOPED_TRACE("activate window 1");
+    Recorder recorder(tracker_.get());
+
+    activation_client->ActivateWindow(window1);
+    recorder.Verify({
+        // activated first
+        {"updated", kChromeAppId, browser1, nullptr, kVisible, kActive},
+        {"updated", kAppBId, browser1, fg_tab1, kVisible, kActive},
+        // then deactivated
+        {"updated", kChromeAppId, browser2, nullptr, kVisible, kInactive},
+        {"updated", kAppBId, browser2, fg_tab2, kVisible, kInactive},
+    });
+  }
+
+  // Activate window 2.
+  {
+    SCOPED_TRACE("activate window 2");
+    Recorder recorder(tracker_.get());
+
+    activation_client->ActivateWindow(window2);
+    recorder.Verify({
+        // activated first
+        {"updated", kChromeAppId, browser2, nullptr, kVisible, kActive},
+        {"updated", kAppBId, browser2, fg_tab2, kVisible, kActive},
+        // then deactivated
+        {"updated", kChromeAppId, browser1, nullptr, kVisible, kInactive},
+        {"updated", kAppBId, browser1, fg_tab1, kVisible, kInactive},
+    });
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserAppsTrackerTest, TabDrag) {
+  // Setup: two browsers: one with two, another with three tabs.
+  auto* browser1 = CreateBrowser();
+  InsertForegroundTab(browser1, "https://a.example.org");
+  auto* fg_tab1 = InsertForegroundTab(browser1, "https://b.example.org");
+  auto* window1 = browser1->window()->GetNativeWindow();
+
+  auto* browser2 = CreateBrowser();
+  InsertForegroundTab(browser2, "https://a.example.org");
+  auto* bg_tab2 = InsertForegroundTab(browser2, "https://a.example.org");
+  auto* fg_tab2 = InsertForegroundTab(browser2, "https://b.example.org");
+  auto* window2 = browser2->window()->GetNativeWindow();
+
+  auto* activation_client = ash::Shell::Get()->activation_client();
+  ASSERT_EQ(activation_client->GetActiveWindow(), window2);
+
+  // Drag the active tab of browser 2 and rop it into the last position in
+  // browser 1.
+  SCOPED_TRACE("tab drag and drop");
+  Recorder recorder(tracker_.get());
+
+  // We skip a step where a detached tab gets inserted into a temporary browser
+  // but the sequence there is identical.
+
+  // Detach.
+  int src_index = browser2->tab_strip_model()->GetIndexOfWebContents(fg_tab2);
+  auto detached =
+      browser2->tab_strip_model()->DetachWebContentsAtForInsertion(src_index);
+
+  // Target browser window goes into foreground right before drop.
+  activation_client->ActivateWindow(window1);
+
+  // Attach.
+  int dst_index = browser1->tab_strip_model()->count();
+  browser1->tab_strip_model()->InsertWebContentsAt(
+      dst_index, std::move(detached), TabStripModel::ADD_ACTIVE);
+  recorder.Verify({
+      // background tab in the dragged-from browser gets activated when the
+      // active tab is detached
+      {"updated", kAppAId, browser2, bg_tab2, kVisible, kActive},
+      // dragged-into browser window goes into foreground
+      {"updated", kChromeAppId, browser1, nullptr, kVisible, kActive},
+      {"updated", kAppBId, browser1, fg_tab1, kVisible, kActive},
+      // dragged-from browser goes into background
+      {"updated", kChromeAppId, browser2, nullptr, kVisible, kInactive},
+      {"updated", kAppAId, browser2, bg_tab2, kVisible, kInactive},
+      // previously foreground tab in the dragged-into browser goes into
+      // background when the dragged tab is attached to the new browser
+      {"updated", kAppBId, browser1, fg_tab1, kVisible, kInactive},
+      // dragged tab gets reparented and becomes active in the new browser
+      {"updated", kAppBId, browser1, fg_tab2, kVisible, kActive},
+  });
+}
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
index f69f5c1..ed7c3e7 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.cc
@@ -19,6 +19,7 @@
 #include "ash/public/cpp/shelf_types.h"
 #include "ash/public/cpp/window_animation_types.h"
 #include "ash/public/cpp/window_properties.h"
+#include "ash/shell.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/containers/contains.h"
@@ -61,6 +62,7 @@
 #include "chrome/browser/ui/ash/shelf/app_shortcut_shelf_item_controller.h"
 #include "chrome/browser/ui/ash/shelf/app_window_shelf_controller.h"
 #include "chrome/browser/ui/ash/shelf/app_window_shelf_item_controller.h"
+#include "chrome/browser/ui/ash/shelf/browser_apps_tracker.h"
 #include "chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.h"
 #include "chrome/browser/ui/ash/shelf/browser_status_monitor.h"
 #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h"
@@ -253,6 +255,10 @@
   app_window_controllers_.emplace_back(std::move(app_service_controller));
   // Create the browser monitor which will inform the shelf of status changes.
   browser_status_monitor_ = std::make_unique<BrowserStatusMonitor>(this);
+  if (base::FeatureList::IsEnabled(BrowserAppsTracker::kEnabled)) {
+    browser_apps_tracker_ = std::make_unique<BrowserAppsTracker>(
+        ash::Shell::Get()->activation_client());
+  }
 }
 
 ChromeShelfController::~ChromeShelfController() {
@@ -299,6 +305,9 @@
 
   UpdatePinnedAppsFromSync();
   browser_status_monitor_->Initialize();
+  if (base::FeatureList::IsEnabled(BrowserAppsTracker::kEnabled)) {
+    browser_apps_tracker_->Initialize();
+  }
 }
 
 ash::ShelfID ChromeShelfController::CreateAppItem(
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.h b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.h
index 657907f..a2b6e31 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller.h
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller.h
@@ -28,6 +28,7 @@
 class AppIconLoader;
 class AppServiceAppWindowShelfController;
 class AppWindowShelfController;
+class BrowserAppsTracker;
 class BrowserShortcutShelfItemController;
 class BrowserStatusMonitor;
 class ChromeShelfControllerUserSwitchObserver;
@@ -442,6 +443,9 @@
   // The owned browser status monitor.
   std::unique_ptr<BrowserStatusMonitor> browser_status_monitor_;
 
+  // The owned browser apps tracker.
+  std::unique_ptr<BrowserAppsTracker> browser_apps_tracker_;
+
   // A special observer class to detect user switches.
   std::unique_ptr<ChromeShelfControllerUserSwitchObserver>
       user_switch_observer_;
diff --git a/chrome/browser/ui/cocoa/notifications/BUILD.gn b/chrome/browser/ui/cocoa/notifications/BUILD.gn
index eee1a057..f949b65 100644
--- a/chrome/browser/ui/cocoa/notifications/BUILD.gn
+++ b/chrome/browser/ui/cocoa/notifications/BUILD.gn
@@ -2,55 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/mac/rules.gni")
-import("//build/util/branding.gni")
-
-mac_app_bundle("alert_notification_xpc_service") {
-  output_name = "AlertNotificationService"
-  package_type = "xpc"
-
-  info_plist = "xpc-Info.plist"
-  extra_substitutions = [ "CHROME_BUNDLE_ID=$chrome_mac_bundle_id" ]
-
-  sources = [
-    "alert_notification_service.h",
-    "alert_notification_service.mm",
-    "alert_nsnotification_service.h",
-    "alert_nsnotification_service.mm",
-    "service_delegate.h",
-    "service_delegate.mm",
-    "xpc_service_main.mm",
-    "xpc_transaction_handler.h",
-    "xpc_transaction_handler.mm",
-  ]
-
-  deps = [
-    ":common",
-    "//base",
-    "//chrome/services/mac_notifications/public/cpp:constants",
-    "//third_party/crashpad/crashpad/client",
-  ]
-
-  frameworks = [
-    "AppKit.framework",
-    "Foundation.framework",
-  ]
-  weak_frameworks = [
-    "UserNotifications.framework",  # macOS 10.14
-  ]
-
-  ldflags = []
-  if (is_component_build) {
-    ldflags += [
-      # The XPC service is in Chromium.app/Contents/Frameworks/Chromium \
-      # Framework.framework/Versions/A/XPCServices/ \
-      # AlertNotificationService.xpc/Contents/MacOS/
-      # so set rpath up to the base.
-      "-Wl,-rpath,@loader_path/../../../../../../../../../../",
-    ]
-  }
-}
-
 static_library("common") {
   sources = [
     "notification_builder_base.h",
@@ -64,8 +15,6 @@
     "unnotification_builder_mac.mm",
     "unnotification_response_builder_mac.h",
     "unnotification_response_builder_mac.mm",
-    "xpc_mach_port.h",
-    "xpc_mach_port.mm",
   ]
 
   deps = [
diff --git a/chrome/browser/ui/cocoa/notifications/alert_notification_service.h b/chrome/browser/ui/cocoa/notifications/alert_notification_service.h
deleted file mode 100644
index 999b5ee..0000000
--- a/chrome/browser/ui/cocoa/notifications/alert_notification_service.h
+++ /dev/null
@@ -1,22 +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.
-
-#ifndef CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_ALERT_NOTIFICATION_SERVICE_H_
-#define CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_ALERT_NOTIFICATION_SERVICE_H_
-
-#import <Foundation/Foundation.h>
-
-#import "chrome/browser/ui/cocoa/notifications/notification_delivery.h"
-
-@class XPCTransactionHandler;
-
-// Implementation of the NotificationDelivery protocol that can display
-// notifications of type alert.
-@interface AlertNotificationService : NSObject <NotificationDelivery>
-- (instancetype)initWithTransactionHandler:(XPCTransactionHandler*)handler
-                             xpcConnection:(NSXPCConnection*)connection;
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_ALERT_NOTIFICATION_SERVICE_H_
diff --git a/chrome/browser/ui/cocoa/notifications/alert_notification_service.mm b/chrome/browser/ui/cocoa/notifications/alert_notification_service.mm
deleted file mode 100644
index df95905a..0000000
--- a/chrome/browser/ui/cocoa/notifications/alert_notification_service.mm
+++ /dev/null
@@ -1,131 +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.
-
-#import "chrome/browser/ui/cocoa/notifications/alert_notification_service.h"
-
-#include "base/mac/scoped_nsobject.h"
-#include "base/notreached.h"
-#include "base/strings/string_number_conversions.h"
-#import "chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.h"
-#import "chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h"
-#include "third_party/crashpad/crashpad/client/crashpad_client.h"
-#include "third_party/crashpad/crashpad/client/crashpad_info.h"
-#include "third_party/crashpad/crashpad/client/simple_string_dictionary.h"
-
-namespace {
-
-crashpad::SimpleStringDictionary* GetCrashpadAnnotations() {
-  static crashpad::SimpleStringDictionary* annotations = []() {
-    auto* annotations = new crashpad::SimpleStringDictionary();
-    annotations->SetKeyValue("ptype", "AlertNotificationService.xpc");
-    annotations->SetKeyValue("pid", base::NumberToString(getpid()).c_str());
-    return annotations;
-  }();
-  return annotations;
-}
-
-}  // namespace
-
-@implementation AlertNotificationService {
-  base::scoped_nsobject<XPCTransactionHandler> _transactionHandler;
-  base::scoped_nsobject<NSXPCConnection> _connection;
-  base::scoped_nsobject<NSObject<NotificationDelivery>> _notificationDelivery;
-
-  // Ensures that the XPC service has been configured for crash reporting.
-  // Other messages should not be sent to a new instance of the service
-  // before -setMachExceptionPort: is called.
-  // Because XPC callouts occur on a concurrent dispatch queue, this must be
-  // accessed in a @synchronized(self) block.
-  BOOL _didSetExceptionPort;
-}
-
-- (instancetype)initWithTransactionHandler:(XPCTransactionHandler*)handler
-                             xpcConnection:(NSXPCConnection*)connection {
-  if ((self = [super init])) {
-    _transactionHandler.reset([handler retain]);
-    _connection.reset([connection retain]);
-  }
-  return self;
-}
-
-- (void)setUseUNNotification:(BOOL)useUNNotification
-           machExceptionPort:(CrXPCMachPort*)port {
-  base::mac::ScopedMachSendRight sendRight([port takeRight]);
-  if (!sendRight.is_valid()) {
-    NOTREACHED();
-    return;
-  }
-
-  @synchronized(self) {
-    if (_didSetExceptionPort) {
-      return;
-    }
-
-    [_transactionHandler setUseUNNotification:useUNNotification];
-    _notificationDelivery.reset([[AlertNSNotificationService alloc]
-        initWithTransactionHandler:_transactionHandler
-                     xpcConnection:_connection]);
-
-    crashpad::CrashpadClient client;
-    _didSetExceptionPort = client.SetHandlerMachPort(std::move(sendRight));
-    DCHECK(_didSetExceptionPort);
-
-    crashpad::CrashpadInfo::GetCrashpadInfo()->set_simple_annotations(
-        GetCrashpadAnnotations());
-  }
-}
-
-- (void)deliverNotification:(NSDictionary*)notificationData {
-  DCHECK(_didSetExceptionPort);
-  DCHECK(_notificationDelivery);
-
-  [_notificationDelivery deliverNotification:notificationData];
-}
-
-- (void)closeNotificationWithId:(NSString*)notificationId
-                      profileId:(NSString*)profileId
-                      incognito:(BOOL)incognito {
-  DCHECK(_didSetExceptionPort);
-  DCHECK(_notificationDelivery);
-
-  [_notificationDelivery closeNotificationWithId:notificationId
-                                       profileId:profileId
-                                       incognito:incognito];
-}
-
-- (void)closeNotificationsWithProfileId:(NSString*)profileId
-                              incognito:(BOOL)incognito {
-  DCHECK(_didSetExceptionPort);
-  DCHECK(_notificationDelivery);
-
-  [_notificationDelivery closeNotificationsWithProfileId:profileId
-                                               incognito:incognito];
-}
-
-- (void)closeAllNotifications {
-  DCHECK(_didSetExceptionPort);
-  DCHECK(_notificationDelivery);
-
-  [_notificationDelivery closeAllNotifications];
-}
-
-- (void)getDisplayedAlertsForProfileId:(NSString*)profileId
-                             incognito:(BOOL)incognito
-                                 reply:(void (^)(NSArray*))reply {
-  DCHECK(_didSetExceptionPort);
-  DCHECK(_notificationDelivery);
-
-  [_notificationDelivery getDisplayedAlertsForProfileId:profileId
-                                              incognito:incognito
-                                                  reply:reply];
-}
-
-- (void)getAllDisplayedAlertsWithReply:(void (^)(NSArray*))reply {
-  DCHECK(_didSetExceptionPort);
-  DCHECK(_notificationDelivery);
-
-  [_notificationDelivery getAllDisplayedAlertsWithReply:reply];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.h b/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.h
deleted file mode 100644
index 058ff958..0000000
--- a/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.h
+++ /dev/null
@@ -1,24 +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.
-
-#ifndef CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_ALERT_NSNOTIFICATION_SERVICE_H_
-#define CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_ALERT_NSNOTIFICATION_SERVICE_H_
-
-#import <Foundation/Foundation.h>
-
-#import "chrome/browser/ui/cocoa/notifications/notification_delivery.h"
-
-@class XPCTransactionHandler;
-
-// Implementation of the NotificationDelivery protocol that can display
-// notifications of type alert. This uses the legacy NSUserNotificationCenter
-// API and is meant for use on macOS versions 10.10 - 10.14. Versions 10.14 and
-// above are meant to be supported using UNUserNotificationCenter.
-@interface AlertNSNotificationService
-    : NSObject <NotificationDelivery, NSUserNotificationCenterDelegate>
-- (instancetype)initWithTransactionHandler:(XPCTransactionHandler*)handler
-                             xpcConnection:(NSXPCConnection*)connection;
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_ALERT_NSNOTIFICATION_SERVICE_H_
diff --git a/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm b/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm
deleted file mode 100644
index 63d20e8..0000000
--- a/chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.mm
+++ /dev/null
@@ -1,184 +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 "chrome/browser/ui/cocoa/notifications/alert_nsnotification_service.h"
-
-#import "base/mac/scoped_nsobject.h"
-#include "base/notreached.h"
-#import "chrome/browser/ui/cocoa/notifications/notification_builder_mac.h"
-#import "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h"
-#import "chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h"
-#include "chrome/services/mac_notifications/public/cpp/notification_constants_mac.h"
-
-@class NSUserNotificationCenter;
-
-@implementation AlertNSNotificationService {
-  base::scoped_nsobject<XPCTransactionHandler> _transactionHandler;
-  base::scoped_nsobject<NSXPCConnection> _connection;
-}
-
-- (instancetype)initWithTransactionHandler:(XPCTransactionHandler*)handler
-                             xpcConnection:(NSXPCConnection*)connection {
-  if ((self = [super init])) {
-    [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
-    _transactionHandler.reset([handler retain]);
-    _connection.reset([connection retain]);
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:nil];
-  [super dealloc];
-}
-
-- (void)setUseUNNotification:(BOOL)useUNNotification
-           machExceptionPort:(CrXPCMachPort*)port {
-  NOTREACHED();
-}
-
-- (void)deliverNotification:(NSDictionary*)notificationData {
-  base::scoped_nsobject<NotificationBuilder> builder(
-      [[NotificationBuilder alloc] initWithDictionary:notificationData]);
-
-  NSUserNotification* toast = [builder buildUserNotification];
-  [[NSUserNotificationCenter defaultUserNotificationCenter]
-      deliverNotification:toast];
-  [_transactionHandler openTransactionIfNeeded];
-}
-
-- (void)closeNotificationWithId:(NSString*)notificationId
-                      profileId:(NSString*)profileId
-                      incognito:(BOOL)incognito {
-  NSUserNotificationCenter* notificationCenter =
-      [NSUserNotificationCenter defaultUserNotificationCenter];
-  NSArray* deliveredNotifications = [notificationCenter deliveredNotifications];
-  for (NSUserNotification* toast in deliveredNotifications) {
-    NSString* toastId =
-        (toast.userInfo)[notification_constants::kNotificationId];
-    NSString* toastProfileId =
-        (toast.userInfo)[notification_constants::kNotificationProfileId];
-    BOOL toastIncognito =
-        [(toast.userInfo)[notification_constants::kNotificationIncognito]
-            boolValue];
-
-    if ([notificationId isEqualToString:toastId] &&
-        [profileId isEqualToString:toastProfileId] &&
-        incognito == toastIncognito) {
-      [notificationCenter removeDeliveredNotification:toast];
-      [_transactionHandler closeTransactionIfNeeded];
-      break;
-    }
-  }
-}
-
-- (void)closeNotificationsWithProfileId:(NSString*)profileId
-                              incognito:(BOOL)incognito {
-  NSUserNotificationCenter* notificationCenter =
-      [NSUserNotificationCenter defaultUserNotificationCenter];
-  NSArray* deliveredNotifications = [notificationCenter deliveredNotifications];
-  BOOL removedNotifications = NO;
-
-  for (NSUserNotification* toast in deliveredNotifications) {
-    NSString* toastProfileId =
-        (toast.userInfo)[notification_constants::kNotificationProfileId];
-    BOOL toastIncognito =
-        [(toast.userInfo)[notification_constants::kNotificationIncognito]
-            boolValue];
-
-    if ([profileId isEqualToString:toastProfileId] &&
-        incognito == toastIncognito) {
-      [notificationCenter removeDeliveredNotification:toast];
-      removedNotifications = YES;
-    }
-  }
-
-  if (removedNotifications)
-    [_transactionHandler closeTransactionIfNeeded];
-}
-
-- (void)closeAllNotifications {
-  [[NSUserNotificationCenter defaultUserNotificationCenter]
-      removeAllDeliveredNotifications];
-  [_transactionHandler closeTransactionIfNeeded];
-}
-
-- (void)getDisplayedAlertsForProfileId:(NSString*)profileId
-                             incognito:(BOOL)incognito
-                                 reply:(void (^)(NSArray*))reply {
-  NSUserNotificationCenter* notificationCenter =
-      [NSUserNotificationCenter defaultUserNotificationCenter];
-  NSArray* deliveredNotifications = [notificationCenter deliveredNotifications];
-  NSMutableArray* notificationIds =
-      [NSMutableArray arrayWithCapacity:[deliveredNotifications count]];
-  for (NSUserNotification* toast in deliveredNotifications) {
-    NSString* toastProfileId =
-        (toast.userInfo)[notification_constants::kNotificationProfileId];
-    BOOL toastIncognito =
-        [(toast.userInfo)[notification_constants::kNotificationIncognito]
-            boolValue];
-
-    if ([profileId isEqualToString:toastProfileId] &&
-        incognito == toastIncognito) {
-      [notificationIds
-          addObject:(toast.userInfo)[notification_constants::kNotificationId]];
-    }
-  }
-  reply(notificationIds);
-}
-
-- (void)getAllDisplayedAlertsWithReply:(void (^)(NSArray*))reply {
-  NSUserNotificationCenter* notificationCenter =
-      [NSUserNotificationCenter defaultUserNotificationCenter];
-  NSArray* deliveredNotifications = [notificationCenter deliveredNotifications];
-  NSMutableArray* notificationIds =
-      [NSMutableArray arrayWithCapacity:[deliveredNotifications count]];
-  for (NSUserNotification* toast in deliveredNotifications) {
-    NSString* toastId =
-        (toast.userInfo)[notification_constants::kNotificationId];
-    NSString* toastProfileId =
-        (toast.userInfo)[notification_constants::kNotificationProfileId];
-    NSNumber* toastIncognito =
-        (toast.userInfo)[notification_constants::kNotificationIncognito];
-
-    [notificationIds addObject:@{
-      notification_constants::kNotificationId : toastId,
-      notification_constants::kNotificationProfileId : toastProfileId,
-      notification_constants::kNotificationIncognito : toastIncognito
-    }];
-  }
-  reply(notificationIds);
-}
-
-- (void)userNotificationCenter:(NSUserNotificationCenter*)center
-       didActivateNotification:(NSUserNotification*)notification {
-  NSDictionary* response =
-      [NotificationResponseBuilder buildActivatedDictionary:notification
-                                                  fromAlert:YES];
-  [[_connection remoteObjectProxy] notificationClick:response];
-}
-
-// _NSUserNotificationCenterDelegatePrivate:
-- (void)userNotificationCenter:(NSUserNotificationCenter*)center
-               didDismissAlert:(NSUserNotification*)notification {
-  NSDictionary* response =
-      [NotificationResponseBuilder buildDismissedDictionary:notification
-                                                  fromAlert:YES];
-  [[_connection remoteObjectProxy] notificationClick:response];
-  [_transactionHandler closeTransactionIfNeeded];
-}
-
-// _NSUserNotificationCenterDelegatePrivate:
-- (void)userNotificationCenter:(NSUserNotificationCenter*)center
-    didRemoveDeliveredNotifications:(NSArray*)notifications {
-  for (NSUserNotification* notification in notifications) {
-    NSDictionary* response =
-        [NotificationResponseBuilder buildDismissedDictionary:notification
-                                                    fromAlert:YES];
-    [[_connection remoteObjectProxy] notificationClick:response];
-  }
-  [_transactionHandler closeTransactionIfNeeded];
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/notifications/notification_delivery.h b/chrome/browser/ui/cocoa/notifications/notification_delivery.h
index 72732cf1..ed5b960 100644
--- a/chrome/browser/ui/cocoa/notifications/notification_delivery.h
+++ b/chrome/browser/ui/cocoa/notifications/notification_delivery.h
@@ -7,20 +7,12 @@
 
 #import <Foundation/Foundation.h>
 
-#import "chrome/browser/ui/cocoa/notifications/xpc_mach_port.h"
-
 // Collection of protocols used for XPC communication between chrome
 // and the alert notification xpc service.
 
 // Protocol for the XPC notification service.
 @protocol NotificationDelivery
 
-// Sets the Mach exception handler port to use for the XPCService, and sets
-// which notification API to be used. This method must be called first before
-// using the other methods in this protocol.
-- (void)setUseUNNotification:(BOOL)useUNNotification
-           machExceptionPort:(CrXPCMachPort*)port;
-
 // |notificationData| is generated using a NofiticationBuilder object.
 - (void)deliverNotification:(NSDictionary*)notificationData;
 
diff --git a/chrome/browser/ui/cocoa/notifications/service_delegate.h b/chrome/browser/ui/cocoa/notifications/service_delegate.h
deleted file mode 100644
index a56cacd..0000000
--- a/chrome/browser/ui/cocoa/notifications/service_delegate.h
+++ /dev/null
@@ -1,13 +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.
-
-#ifndef CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_SERVICE_DELEGATE_H_
-#define CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_SERVICE_DELEGATE_H_
-
-#import <Foundation/Foundation.h>
-
-@interface ServiceDelegate : NSObject <NSXPCListenerDelegate>
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_SERVICE_DELEGATE_H_
diff --git a/chrome/browser/ui/cocoa/notifications/service_delegate.mm b/chrome/browser/ui/cocoa/notifications/service_delegate.mm
deleted file mode 100644
index 320e9c6..0000000
--- a/chrome/browser/ui/cocoa/notifications/service_delegate.mm
+++ /dev/null
@@ -1,62 +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.
-
-#import "chrome/browser/ui/cocoa/notifications/service_delegate.h"
-
-#import <AppKit/AppKit.h>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/notifications/alert_notification_service.h"
-#import "chrome/browser/ui/cocoa/notifications/notification_delivery.h"
-#import "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h"
-#import "chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h"
-
-@implementation ServiceDelegate {
-  // Helper to manage the XPC transaction reference count with respect to
-  // still-visible notifications.
-  base::scoped_nsobject<XPCTransactionHandler> _transactionHandler;
-
-  // Client connection accepted from the browser process, to which messages
-  // are sent in response to notification actions.
-  base::scoped_nsobject<NSXPCConnection> _connection;
-}
-
-- (instancetype)init {
-  if ((self = [super init])) {
-    _transactionHandler.reset([[XPCTransactionHandler alloc] init]);
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [super dealloc];
-}
-
-- (BOOL)listener:(NSXPCListener*)listener
-    shouldAcceptNewConnection:(NSXPCConnection*)newConnection {
-  newConnection.exportedInterface =
-      [NSXPCInterface interfaceWithProtocol:@protocol(NotificationDelivery)];
-  [newConnection.exportedInterface
-         setClasses:[NSSet setWithObjects:[NSArray class], [NSData class],
-                                          [NSDictionary class], [NSImage class],
-                                          [NSNumber class], [NSString class],
-                                          nil]
-        forSelector:@selector(deliverNotification:)
-      argumentIndex:0
-            ofReply:NO];
-
-  base::scoped_nsobject<AlertNotificationService> object(
-      [[AlertNotificationService alloc]
-          initWithTransactionHandler:_transactionHandler
-                       xpcConnection:newConnection]);
-  newConnection.exportedObject = object.get();
-  newConnection.remoteObjectInterface =
-      [NSXPCInterface interfaceWithProtocol:@protocol(NotificationReply)];
-  _connection.reset(newConnection, base::scoped_policy::RETAIN);
-  [newConnection resume];
-
-  return YES;
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/notifications/xpc-Info.plist b/chrome/browser/ui/cocoa/notifications/xpc-Info.plist
deleted file mode 100644
index cd0123e..0000000
--- a/chrome/browser/ui/cocoa/notifications/xpc-Info.plist
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-        <key>CFBundleDevelopmentRegion</key>
-        <string>en</string>
-        <key>CFBundleDisplayName</key>
-        <string>${EXECUTABLE_NAME}</string>
-        <key>CFBundleExecutable</key>
-        <string>${EXECUTABLE_NAME}</string>
-        <key>CFBundleIdentifier</key>
-        <string>${CHROME_BUNDLE_ID}.framework.${EXECUTABLE_NAME}</string>
-        <key>CFBundleInfoDictionaryVersion</key>
-        <string>6.0</string>
-        <key>CFBundleName</key>
-        <string>${EXECUTABLE_NAME}</string>
-        <key>CFBundlePackageType</key>
-        <string>XPC!</string>
-        <key>CFBundleShortVersionString</key>
-        <string>1.0</string>
-        <key>CFBundleSignature</key>
-        <string>????</string>
-        <key>CFBundleVersion</key>
-        <string>1</string>
-        <key>XPCService</key>
-        <dict>
-                <key>ServiceType</key>
-                <string>Application</string>
-        </dict>
-        <key>NSUserNotificationAlertStyle</key>
-        <string>alert</string>
-</dict>
-</plist>
diff --git a/chrome/browser/ui/cocoa/notifications/xpc_mach_port.h b/chrome/browser/ui/cocoa/notifications/xpc_mach_port.h
deleted file mode 100644
index cdf4041..0000000
--- a/chrome/browser/ui/cocoa/notifications/xpc_mach_port.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_XPC_MACH_PORT_H_
-#define CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_XPC_MACH_PORT_H_
-
-#import <Foundation/Foundation.h>
-
-#include "base/mac/scoped_mach_port.h"
-
-// An XPC transit type for Mach send rights. While this class conforms to
-// NSSecureCoding, it is only valid to use the NSCoding methods for XPC.
-//
-// The public XPC APIs do not proivde any way to transfer Mach ports. Using the
-// C-based API, the functions for setting/creating an XPC Mach port object can
-// simply be forward-declared. But the Foundation API does not provide any way
-// to pass a Mach port as part of a message. The OS_xpc_object Obj-C types
-// do not conform to NSSecureCoding either, so they cannot be used to transport
-// ports via the Foundation-level API.
-//
-// Instead, this class encodes Mach port OOL data using the private
-// NSXPCEncoder and NSXPCDecoder APIs. These APIs expose methods by which
-// xpc_objct_t's (and their OS_object-bridged-siblings) can be encoded into a
-// Foundation-level XPC message.
-@interface CrXPCMachPort : NSObject<NSSecureCoding>
-
-// Creates a new transit Mach port by taking ownership of the |sendRight|.
-- (instancetype)initWithMachSendRight:(base::mac::ScopedMachSendRight)sendRight;
-
-// Relinquishes ownership of the Mach port to the caller.
-- (base::mac::ScopedMachSendRight)takeRight;
-
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_XPC_MACH_PORT_H_
diff --git a/chrome/browser/ui/cocoa/notifications/xpc_mach_port.mm b/chrome/browser/ui/cocoa/notifications/xpc_mach_port.mm
deleted file mode 100644
index a09863c8..0000000
--- a/chrome/browser/ui/cocoa/notifications/xpc_mach_port.mm
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "chrome/browser/ui/cocoa/notifications/xpc_mach_port.h"
-
-#include "base/check.h"
-#include "base/mac/scoped_nsobject.h"
-
-@class OS_xpc_mach_send;
-
-extern "C" {
-
-OS_xpc_mach_send* xpc_mach_send_create(mach_port_t);
-mach_port_t xpc_mach_send_copy_right(OS_xpc_mach_send*);
-
-}  // extern "C"
-
-// Give the compiler declarations for the NSXPCCoder methods.
-@protocol ForwardDeclareXPCCoder
-- (void)encodeXPCObject:(id)object forKey:(id)key;
-- (id)decodeXPCObjectForKey:(id)key;
-@end
-
-namespace {
-
-NSString* const kCrSendRight = @"org.chromium.xpc.MachSendRight";
-
-}  // namespace
-
-@implementation CrXPCMachPort {
-  base::mac::ScopedMachSendRight _port;
-}
-
-- (instancetype)initWithMachSendRight:
-    (base::mac::ScopedMachSendRight)sendRight {
-  if ((self = [super init])) {
-    DCHECK(sendRight.is_valid());
-    _port = std::move(sendRight);
-  }
-  return self;
-}
-
-- (base::mac::ScopedMachSendRight)takeRight {
-  return std::move(_port);
-}
-
-// NSCoding:
-- (instancetype)initWithCoder:(NSCoder*)coder {
-  DCHECK([coder isKindOfClass:NSClassFromString(@"NSXPCDecoder")]);
-  if ((self = [super init])) {
-    id coderAsId = coder;
-
-    OS_xpc_mach_send* xpcObject =
-        [coderAsId decodeXPCObjectForKey:kCrSendRight];
-    if (!xpcObject)
-      return nil;
-
-    _port.reset(xpc_mach_send_copy_right(xpcObject));
-  }
-  return self;
-}
-
-- (void)encodeWithCoder:(NSCoder*)coder {
-  DCHECK([coder isKindOfClass:NSClassFromString(@"NSXPCEncoder")]);
-  DCHECK(_port.is_valid());
-
-  id coderAsId = coder;
-
-  base::scoped_nsobject<OS_xpc_mach_send> xpcObject(
-      xpc_mach_send_create(_port.get()));
-  [coderAsId encodeXPCObject:xpcObject forKey:kCrSendRight];
-}
-
-// NSSecureCoding:
-+ (BOOL)supportsSecureCoding {
-  return YES;
-}
-
-@end
diff --git a/chrome/browser/ui/cocoa/notifications/xpc_service_main.mm b/chrome/browser/ui/cocoa/notifications/xpc_service_main.mm
deleted file mode 100644
index 10fa0b8..0000000
--- a/chrome/browser/ui/cocoa/notifications/xpc_service_main.mm
+++ /dev/null
@@ -1,28 +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.
-
-#import <Foundation/Foundation.h>
-#include <xpc/xpc.h>
-
-#include "base/mac/scoped_nsobject.h"
-#import "chrome/browser/ui/cocoa/notifications/service_delegate.h"
-
-// The main method of the notification alert xpc service.
-// It is initiaized by Chrome on demand whenever a notification of type alert
-// needs to be displayed.
-// The connection will then remain open in order to receive notification
-// clicks and so until all notifications of type alert are closed.
-int main(int argc, const char* argv[]) {
-  @autoreleasepool {
-    base::scoped_nsobject<ServiceDelegate> delegate(
-        [[ServiceDelegate alloc] init]);
-
-    NSXPCListener* listener = [NSXPCListener serviceListener];
-    listener.delegate = delegate.get();
-
-    [listener resume];
-
-    return 0;
-  }
-}
diff --git a/chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h b/chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h
deleted file mode 100644
index 6efe5b5..0000000
--- a/chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h
+++ /dev/null
@@ -1,23 +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.
-
-#ifndef CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_XPC_TRANSACTION_HANDLER_H_
-#define CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_XPC_TRANSACTION_HANDLER_H_
-
-#import <Foundation/Foundation.h>
-
-// Keeps track of whether a XPC transaction is opened.
-@interface XPCTransactionHandler : NSObject
-
-// Sets which API to use, NSUserNotificationCenter or UNUserNotificationCenter.
-- (void)setUseUNNotification:(BOOL)useUNNotification;
-
-// Only open a new transaction if one is not already opened.
-- (void)openTransactionIfNeeded;
-
-// Close the transaction if no alerts are being displayed.
-- (void)closeTransactionIfNeeded;
-@end
-
-#endif  // CHROME_BROWSER_UI_COCOA_NOTIFICATIONS_XPC_TRANSACTION_HANDLER_H_
diff --git a/chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.mm b/chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.mm
deleted file mode 100644
index 8b7e219a..0000000
--- a/chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.mm
+++ /dev/null
@@ -1,48 +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.
-
-#import <AppKit/AppKit.h>
-#import <Foundation/Foundation.h>
-
-#include "base/notreached.h"
-#import "chrome/browser/ui/cocoa/notifications/xpc_transaction_handler.h"
-
-@class NSUserNotificationCenter;
-
-@implementation XPCTransactionHandler {
-  BOOL _transactionOpen;
-  BOOL _useUNNotification;
-}
-
-- (void)setUseUNNotification:(BOOL)useUNNotification {
-  _useUNNotification = useUNNotification;
-}
-
-- (void)openTransactionIfNeeded {
-  @synchronized(self) {
-    if (_transactionOpen) {
-      return;
-    }
-    xpc_transaction_begin();
-    _transactionOpen = YES;
-  }
-}
-
-- (void)closeTransactionIfNeeded {
-  @synchronized(self) {
-    if (_useUNNotification) {
-      NOTIMPLEMENTED();
-      return;
-    }
-
-    NSUserNotificationCenter* notificationCenter =
-        [NSUserNotificationCenter defaultUserNotificationCenter];
-    NSUInteger showing = [[notificationCenter deliveredNotifications] count];
-    if (showing == 0 && _transactionOpen) {
-      xpc_transaction_end();
-      _transactionOpen = NO;
-    }
-  }
-}
-@end
diff --git a/chrome/browser/ui/views/chrome_typography_provider.cc b/chrome/browser/ui/views/chrome_typography_provider.cc
index 4667cbd68..b1e1be3 100644
--- a/chrome/browser/ui/views/chrome_typography_provider.cc
+++ b/chrome/browser/ui/views/chrome_typography_provider.cc
@@ -173,10 +173,7 @@
   constexpr int kHeadlineHeight = 32;
   constexpr int kTitleHeight = 22;
   constexpr int kBodyHeight = 20;  // For both large and small.
-
-  // Button text should always use the minimum line height for a font to avoid
-  // unnecessarily influencing the height of a button.
-  constexpr int kButtonAbsoluteHeight = 0;
+  constexpr int kControlHeight = 16;
 
 // The platform-specific heights (i.e. gfx::Font::GetHeight()) that result when
 // asking for the target size constants in ChromeTypographyProvider::GetFont()
@@ -214,6 +211,9 @@
       GetFont(views::style::CONTEXT_DIALOG_BODY_TEXT, kTemplateStyle)
           .GetHeight() -
       kBodyTextLargePlatformHeight + kBodyHeight;
+  static const int control_height =
+      GetFont(CONTEXT_DIALOG_BODY_TEXT_SMALL, kTemplateStyle).GetHeight() -
+      kBodyTextSmallPlatformHeight + kControlHeight;
   static const int default_height =
       GetFont(CONTEXT_DIALOG_BODY_TEXT_SMALL, kTemplateStyle).GetHeight() -
       kBodyTextSmallPlatformHeight + kBodyHeight;
@@ -221,8 +221,9 @@
   switch (context) {
     case views::style::CONTEXT_BUTTON:
     case views::style::CONTEXT_BUTTON_MD:
+    case views::style::CONTEXT_TEXTFIELD:
     case CONTEXT_TOOLBAR_BUTTON:
-      return kButtonAbsoluteHeight;
+      return control_height;
     case views::style::CONTEXT_DIALOG_TITLE:
       return title_height;
     case views::style::CONTEXT_DIALOG_BODY_TEXT:
diff --git a/chrome/browser/ui/views/layout_provider_unittest.cc b/chrome/browser/ui/views/layout_provider_unittest.cc
index fbf1c8f8..70ab2b8 100644
--- a/chrome/browser/ui/views/layout_provider_unittest.cc
+++ b/chrome/browser/ui/views/layout_provider_unittest.cc
@@ -343,7 +343,8 @@
   } kExpectedIncreases[] = {{CONTEXT_HEADLINE, 4, 8},
                             {views::style::CONTEXT_DIALOG_TITLE, 1, 4},
                             {views::style::CONTEXT_DIALOG_BODY_TEXT, 2, 4},
-                            {CONTEXT_DIALOG_BODY_TEXT_SMALL, 4, 5}};
+                            {CONTEXT_DIALOG_BODY_TEXT_SMALL, 4, 5},
+                            {views::style::CONTEXT_BUTTON_MD, 0, 1}};
 
   for (size_t i = 0; i < base::size(kExpectedIncreases); ++i) {
     SCOPED_TRACE(testing::Message() << "Testing index: " << i);
@@ -353,13 +354,6 @@
     EXPECT_GE(increase.max, line_spacing - font.GetHeight());
     EXPECT_LE(increase.min, line_spacing - font.GetHeight());
   }
-
-  // Buttons should specify zero line height (i.e. use the font's height) so
-  // buttons have flexibility to configure their own spacing.
-  EXPECT_EQ(0,
-            views::style::GetLineHeight(views::style::CONTEXT_BUTTON, kStyle));
-  EXPECT_EQ(
-      0, views::style::GetLineHeight(views::style::CONTEXT_BUTTON_MD, kStyle));
 }
 
 // Ensure that line heights reported in a default bot configuration match the
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
index 62a02c9f..5d660a0 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.cc
@@ -145,8 +145,9 @@
         l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_BLOCKED_MESSAGE));
     auto link = std::make_unique<views::Link>(
         l10n_util::GetStringUTF16(IDS_COOKIE_CONTROLS_NOT_WORKING_TITLE));
+    link->SetID(VIEW_ID_COOKIE_CONTROLS_NOT_WORKING_LINK);
     link->SetCallback(
-        base::BindRepeating(&CookieControlsBubbleView::NotWorkingLinkClicked,
+        base::BindRepeating(&CookieControlsBubbleView::OnNotWorkingLinkClicked,
                             base::Unretained(this)));
     extra_view_ = SetExtraView(std::move(link));
     blocked_cookies_.reset();
@@ -207,7 +208,7 @@
       l10n_util::GetStringUTF16(IDS_BLOCKED_COOKIES_INFO));
   cookie_link->SetMultiLine(true);
   cookie_link->SetCallback(
-      base::BindRepeating(&CookieControlsBubbleView::ShowCookiesLinkClicked,
+      base::BindRepeating(&CookieControlsBubbleView::OnShowCookiesLinkClicked,
                           base::Unretained(this)));
   cookie_link->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   show_cookies_link_ = AddChildView(std::move(cookie_link));
@@ -281,13 +282,13 @@
   }
 }
 
-void CookieControlsBubbleView::ShowCookiesLinkClicked() {
+void CookieControlsBubbleView::OnShowCookiesLinkClicked() {
   base::RecordAction(UserMetricsAction("CookieControls.Bubble.CookiesInUse"));
   TabDialogs::FromWebContents(web_contents())->ShowCollectedCookies();
   GetWidget()->Close();
 }
 
-void CookieControlsBubbleView::NotWorkingLinkClicked() {
+void CookieControlsBubbleView::OnNotWorkingLinkClicked() {
   DCHECK_EQ(status_, CookieControlsStatus::kEnabled);
   base::RecordAction(UserMetricsAction("CookieControls.Bubble.NotWorking"));
   // Don't go through the controller as this is an intermediary state that
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
index fc136841..fc476f8 100644
--- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h
@@ -31,6 +31,11 @@
                                  public views::TooltipIcon::Observer,
                                  public content_settings::CookieControlsView {
  public:
+  enum DialogViewID {
+    VIEW_ID_NONE = 0,
+    VIEW_ID_COOKIE_CONTROLS_NOT_WORKING_LINK,
+  };
+
   static void ShowBubble(views::View* anchor_view,
                          views::Button* highlighted_button,
                          content::WebContents* web_contents,
@@ -69,8 +74,8 @@
   gfx::Size CalculatePreferredSize() const override;
   void AddedToWidget() override;
 
-  void ShowCookiesLinkClicked();
-  void NotWorkingLinkClicked();
+  void OnShowCookiesLinkClicked();
+  void OnNotWorkingLinkClicked();
   void OnDialogAccepted();
 
   // views::TooltipIcon::Observer:
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc
new file mode 100644
index 0000000..1eccdab
--- /dev/null
+++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc
@@ -0,0 +1,169 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/memory/scoped_refptr.h"
+#include "chrome/browser/content_settings/cookie_settings_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/location_bar/location_bar.h"
+#include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
+#include "chrome/browser/ui/views/location_bar/cookie_controls_bubble_view.h"
+#include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "components/content_settings/core/browser/cookie_settings.h"
+#include "components/content_settings/core/common/pref_names.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/dns/mock_host_resolver.h"
+#include "ui/views/controls/link.h"
+#include "ui/views/view.h"
+#include "url/gurl.h"
+
+class CookieControlsBubbleViewTest : public DialogBrowserTest {
+ public:
+  CookieControlsBubbleViewTest() = default;
+
+  CookieControlsBubbleViewTest(const CookieControlsBubbleViewTest&) = delete;
+  CookieControlsBubbleViewTest& operator=(const CookieControlsBubbleViewTest&) =
+      delete;
+
+  void SetUpOnMainThread() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
+    ASSERT_TRUE(embedded_test_server()->Start());
+
+    cookie_controls_icon_ =
+        BrowserView::GetBrowserViewForBrowser(browser())
+            ->toolbar_button_provider()
+            ->GetPageActionIconView(PageActionIconType::kCookieControls);
+    ASSERT_TRUE(cookie_controls_icon_);
+  }
+
+  void ShowUi(const std::string& name) override {
+    NavigateToUrlWithThirdPartyCookies();
+    ASSERT_TRUE(cookie_controls_icon()->GetVisible());
+    cookie_controls_icon_->ExecuteForTesting();
+
+    auto* bubble = static_cast<CookieControlsBubbleView*>(
+        cookie_controls_icon_->GetBubble());
+
+    if (name == "NotWorkingClicked") {
+      views::View* link = bubble->parent()->GetViewByID(
+          CookieControlsBubbleView::VIEW_ID_COOKIE_CONTROLS_NOT_WORKING_LINK);
+      ASSERT_TRUE(link);
+      link->OnKeyPressed(
+          ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_SPACE, ui::EF_NONE));
+    }
+  }
+
+  void AcceptBubble() {
+    auto* bubble = static_cast<CookieControlsBubbleView*>(
+        cookie_controls_icon_->GetBubble());
+    ASSERT_TRUE(bubble);
+    bubble->Accept();
+  }
+
+  void NavigateToUrlWithThirdPartyCookies() {
+    ui_test_utils::NavigateToURL(
+        browser(), embedded_test_server()->GetURL("a.com", "/iframe.html"));
+
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    EXPECT_TRUE(NavigateIframeToURL(
+        web_contents, "test",
+        embedded_test_server()->GetURL("b.com", "/setcookie.html")));
+  }
+
+  void SetThirdPartyCookieBlocking(bool enabled) {
+    browser()->profile()->GetPrefs()->SetInteger(
+        prefs::kCookieControlsMode,
+        static_cast<int>(
+            enabled ? content_settings::CookieControlsMode::kBlockThirdParty
+                    : content_settings::CookieControlsMode::kOff));
+  }
+
+  scoped_refptr<content_settings::CookieSettings> cookie_settings() {
+    return CookieSettingsFactory::GetForProfile(browser()->profile());
+  }
+
+  PageActionIconView* cookie_controls_icon() { return cookie_controls_icon_; }
+
+ private:
+  PageActionIconView* cookie_controls_icon_;
+};
+
+// Test that cookie icon is not shown when cookies are not blocked.
+IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest, NoCookiesBlocked) {
+  NavigateToUrlWithThirdPartyCookies();
+  EXPECT_FALSE(cookie_controls_icon()->GetVisible());
+}
+
+// Test opening cookie controls bubble and clicking on "not working" link.
+// Check that accepting the bubble unblocks 3p cookies for this origin.
+IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest, NotWorkingClicked) {
+  // Block 3p cookies.
+  SetThirdPartyCookieBlocking(true);
+  GURL origin = embedded_test_server()->GetURL("a.com", "/");
+  EXPECT_FALSE(cookie_settings()->IsThirdPartyAccessAllowed(origin, nullptr));
+
+  // Open bubble.
+  ShowUi("NotWorkingClicked");
+
+  // Allow cookies for this site by accepting bubble.
+  AcceptBubble();
+  EXPECT_TRUE(cookie_settings()->IsThirdPartyAccessAllowed(origin, nullptr));
+}
+
+// Test opening cookie controls bubble while 3p cookies are allowed for this
+// page. Check that accepting the bubble blocks cookies again.
+IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest, BlockingDisabled) {
+  // Block 3p cookies in general but allow them for this site.
+  SetThirdPartyCookieBlocking(true);
+  GURL origin = embedded_test_server()->GetURL("a.com", "/");
+  cookie_settings()->SetThirdPartyCookieSetting(
+      origin, ContentSetting::CONTENT_SETTING_ALLOW);
+  EXPECT_TRUE(cookie_settings()->IsThirdPartyAccessAllowed(origin, nullptr));
+
+  // Show bubble.
+  ShowUi("");
+
+  // Block cookies again by accepting the bubble.
+  AcceptBubble();
+  EXPECT_FALSE(cookie_settings()->IsThirdPartyAccessAllowed(origin, nullptr));
+}
+
+// ==================== Pixel tests ====================
+
+// Test opening cookie controls bubble.
+IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest, InvokeUi_CookiesBlocked) {
+  SetThirdPartyCookieBlocking(true);
+  ShowAndVerifyUi();
+}
+
+// Test opening cookie controls bubble and clicking on "not working" link.
+IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest,
+                       InvokeUi_NotWorkingClicked) {
+  // Block 3p cookies.
+  SetThirdPartyCookieBlocking(true);
+
+  // Open bubble.
+  ShowAndVerifyUi();
+}
+
+// Test opening cookie controls bubble while 3p cookies are allowed for this
+// page.
+IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest,
+                       InvokeUi_BlockingDisabled) {
+  // Block 3p cookies in general but allow them for this site.
+  SetThirdPartyCookieBlocking(true);
+  GURL origin = embedded_test_server()->GetURL("a.com", "/");
+  cookie_settings()->SetThirdPartyCookieSetting(
+      origin, ContentSetting::CONTENT_SETTING_ALLOW);
+
+  // Show bubble.
+  ShowAndVerifyUi();
+}
diff --git a/chrome/browser/ui/views/menu_interactive_uitest.cc b/chrome/browser/ui/views/menu_interactive_uitest.cc
index b7db619..c83599f 100644
--- a/chrome/browser/ui/views/menu_interactive_uitest.cc
+++ b/chrome/browser/ui/views/menu_interactive_uitest.cc
@@ -6,6 +6,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/win/windows_version.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -200,6 +201,13 @@
 // currently.
 #ifdef OS_WIN
 IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) {
+  // This test is extremely flaky on WIN10_20H2, so disable.
+  // TODO(crbug.com/1225346) Investigate why it's so flaky on that version of
+  // Windows.
+  if (base::win::OSInfo::GetInstance()->version() >=
+      base::win::Version::WIN10_20H2) {
+    GTEST_SKIP() << "Skipping test for WIN10_20H2 and greater";
+  }
   // Going into full screen mode prevents pre-test focus and mouse position
   // state from affecting test, and helps ui_controls function correctly.
   chrome::ToggleFullscreenMode(browser());
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 697cd9d2..a38c684 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -392,7 +392,7 @@
   // Configure shared resources
   AddProductLogoResources(source);
 
-  chromeos::quick_unlock::AddFingerprintResources(source);
+  quick_unlock::AddFingerprintResources(source);
   AddSyncConsentResources(source);
   AddArcScreensResources(source);
   AddAssistantScreensResources(source);
diff --git a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
index d5f7f1d..00c45a1 100644
--- a/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/sync_consent_screen_handler.cc
@@ -70,6 +70,8 @@
 
 constexpr StaticOobeScreenId SyncConsentScreenView::kScreenId;
 
+// TODO(https://crbug.com/1229582) Break SplitSettings names into
+// SyncConsentOptional and SyncSettingsCategorization in the whole file.
 SyncConsentScreenHandler::SyncConsentScreenHandler(
     JSCallsContainer* js_calls_container)
     : BaseScreenHandler(kScreenId, js_calls_container) {
@@ -167,7 +169,7 @@
   base::DictionaryValue data;
   data.SetBoolean("isChildAccount", user_manager->IsLoggedInAsChildUser());
   data.SetBoolean("splitSettingsSyncEnabled",
-                  chromeos::features::IsSplitSettingsSyncEnabled());
+                  chromeos::features::IsSyncConsentOptionalEnabled());
   ShowScreenWithData(kScreenId, &data);
 }
 
@@ -197,7 +199,7 @@
     const bool review_sync,
     const login::StringList& consent_description,
     const std::string& consent_confirmation) {
-  DCHECK(!chromeos::features::IsSplitSettingsSyncEnabled());
+  DCHECK(!chromeos::features::IsSyncConsentOptionalEnabled());
   std::vector<int> consent_description_ids;
   int consent_confirmation_id;
   GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
@@ -228,7 +230,7 @@
     const login::StringList& consent_description,
     const std::string& consent_confirmation,
     UserChoice choice) {
-  DCHECK(chromeos::features::IsSplitSettingsSyncEnabled());
+  DCHECK(chromeos::features::IsSyncConsentOptionalEnabled());
   std::vector<int> consent_description_ids;
   int consent_confirmation_id;
   GetConsentIDs(known_string_ids_, consent_description, consent_confirmation,
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
index cf2df88..df598d2 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
@@ -535,7 +535,7 @@
 bool MultideviceHandler::IsAuthTokenValid(const std::string& auth_token) {
   Profile* profile = Profile::FromWebUI(web_ui());
   quick_unlock::QuickUnlockStorage* quick_unlock_storage =
-      chromeos::quick_unlock::QuickUnlockFactory::GetForProfile(profile);
+      quick_unlock::QuickUnlockFactory::GetForProfile(profile);
   return quick_unlock_storage->GetAuthToken() &&
          auth_token == quick_unlock_storage->GetAuthToken()->Identifier();
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/people_section.cc b/chrome/browser/ui/webui/settings/chromeos/people_section.cc
index b0d3a36..0e24b42 100644
--- a/chrome/browser/ui/webui/settings/chromeos/people_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/people_section.cc
@@ -438,13 +438,11 @@
   };
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
-  html_source->AddBoolean("quickUnlockEnabled",
-                          chromeos::quick_unlock::IsPinEnabled());
+  html_source->AddBoolean("quickUnlockEnabled", quick_unlock::IsPinEnabled());
   html_source->AddBoolean("quickUnlockPinAutosubmitFeatureEnabled",
                           chromeos::features::IsPinAutosubmitFeatureEnabled());
-  html_source->AddBoolean(
-      "quickUnlockDisabledByPolicy",
-      chromeos::quick_unlock::IsPinDisabledByPolicy(pref_service));
+  html_source->AddBoolean("quickUnlockDisabledByPolicy",
+                          quick_unlock::IsPinDisabledByPolicy(pref_service));
   html_source->AddBoolean("lockScreenNotificationsEnabled",
                           ash::features::IsLockScreenNotificationsEnabled());
   html_source->AddBoolean(
@@ -486,13 +484,13 @@
   html_source->AddBoolean("fingerprintUnlockEnabled",
                           are_fingerprint_settings_allowed);
   if (are_fingerprint_settings_allowed) {
-    chromeos::quick_unlock::AddFingerprintResources(html_source);
+    quick_unlock::AddFingerprintResources(html_source);
   }
 
   int instruction_id, aria_label_id;
   bool aria_label_includes_device = false;
-  using FingerprintLocation = chromeos::quick_unlock::FingerprintLocation;
-  switch (chromeos::quick_unlock::GetFingerprintLocation()) {
+  using FingerprintLocation = quick_unlock::FingerprintLocation;
+  switch (quick_unlock::GetFingerprintLocation()) {
     case FingerprintLocation::TABLET_POWER_BUTTON:
       instruction_id =
           IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER_POWER_BUTTON;
@@ -1069,7 +1067,7 @@
 }
 
 bool PeopleSection::AreFingerprintSettingsAllowed() {
-  return chromeos::quick_unlock::IsFingerprintEnabled(profile());
+  return quick_unlock::IsFingerprintEnabled(profile());
 }
 
 void PeopleSection::UpdateRemoveFingerprintSearchTags() {
diff --git a/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc b/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
index ec801f1..f039aeb 100644
--- a/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/privacy_section.cc
@@ -360,7 +360,7 @@
 }
 
 bool PrivacySection::AreFingerprintSettingsAllowed() {
-  return chromeos::quick_unlock::IsFingerprintEnabled(profile());
+  return quick_unlock::IsFingerprintEnabled(profile());
 }
 
 void PrivacySection::UpdateRemoveFingerprintSearchTags() {
diff --git a/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc b/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc
index 049fda9..3e06874 100644
--- a/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc
@@ -67,9 +67,9 @@
 }
 
 void QuickUnlockHandler::UpdateQuickUnlockDisabledByPolicy() {
-  FireWebUIListener("quick-unlock-disabled-by-policy-changed",
-                    base::Value(chromeos::quick_unlock::IsPinDisabledByPolicy(
-                        pref_service_)));
+  FireWebUIListener(
+      "quick-unlock-disabled-by-policy-changed",
+      base::Value(quick_unlock::IsPinDisabledByPolicy(pref_service_)));
 }
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
index ea1b0072..31a596c 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -32,7 +32,7 @@
 #include "chromeos/dbus/util/version_loader.h"
 #include "components/account_manager_core/account.h"
 #include "components/account_manager_core/account_manager_facade.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/account_info.h"
@@ -93,7 +93,7 @@
  public:
   ChildSigninHelper(
       account_manager::AccountManager* account_manager,
-      crosapi::AccountManagerAsh* account_manager_ash,
+      crosapi::AccountManagerMojoService* account_manager_mojo_service,
       const base::RepeatingClosure& close_dialog_closure,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       const std::string& gaia_id,
@@ -105,7 +105,7 @@
       const std::string& parent_obfuscated_gaia_id,
       const std::string& re_auth_proof_token)
       : SigninHelper(account_manager,
-                     account_manager_ash,
+                     account_manager_mojo_service,
                      close_dialog_closure,
                      url_loader_factory,
                      gaia_id,
@@ -172,7 +172,7 @@
  public:
   EduCoexistenceChildSigninHelper(
       account_manager::AccountManager* account_manager,
-      crosapi::AccountManagerAsh* account_manager_ash,
+      crosapi::AccountManagerMojoService* account_manager_mojo_service,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       const std::string& gaia_id,
       const std::string& email,
@@ -181,7 +181,7 @@
       PrefService* pref_service,
       const content::WebUI* web_ui)
       : SigninHelper(account_manager,
-                     account_manager_ash,
+                     account_manager_mojo_service,
                      // EduCoexistenceChildSigninHelper will not be closing the
                      // dialog. Therefore, passing a void callback.
                      base::DoNothing(),
@@ -327,10 +327,10 @@
                               ->GetAccountManagerFactory()
                               ->GetAccountManager(profile->GetPath().value());
 
-  crosapi::AccountManagerAsh* account_manager_ash =
+  crosapi::AccountManagerMojoService* account_manager_mojo_service =
       g_browser_process->platform_part()
           ->GetAccountManagerFactory()
-          ->GetAccountManagerAsh(profile->GetPath().value());
+          ->GetAccountManagerMojoService(profile->GetPath().value());
 
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
@@ -352,15 +352,15 @@
 
       // ChildSigninHelper deletes itself after its work is done.
       new ChildSigninHelper(
-          account_manager, account_manager_ash, close_dialog_closure_,
+          account_manager, account_manager_mojo_service, close_dialog_closure_,
           profile->GetURLLoaderFactory(), gaia_id, email, auth_code,
           GetAccountDeviceId(GetSigninScopedDeviceIdForProfile(profile),
                              gaia_id),
           identity_manager, profile->GetPrefs(), *parentId, *rapt);
     } else {
       new EduCoexistenceChildSigninHelper(
-          account_manager, account_manager_ash, profile->GetURLLoaderFactory(),
-          gaia_id, email, auth_code,
+          account_manager, account_manager_mojo_service,
+          profile->GetURLLoaderFactory(), gaia_id, email, auth_code,
           GetAccountDeviceId(GetSigninScopedDeviceIdForProfile(profile),
                              gaia_id),
           profile->GetPrefs(), web_ui());
@@ -371,7 +371,7 @@
 
   // SigninHelper deletes itself after its work is done.
   new SigninHelper(
-      account_manager, account_manager_ash, close_dialog_closure_,
+      account_manager, account_manager_mojo_service, close_dialog_closure_,
       profile->GetURLLoaderFactory(), gaia_id, email, auth_code,
       GetAccountDeviceId(GetSigninScopedDeviceIdForProfile(profile), gaia_id));
 }
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos.cc b/chrome/browser/ui/webui/signin/signin_helper_chromeos.cc
index 5a9c91d..e7a7b39 100644
--- a/chrome/browser/ui/webui/signin/signin_helper_chromeos.cc
+++ b/chrome/browser/ui/webui/signin/signin_helper_chromeos.cc
@@ -7,14 +7,14 @@
 #include "components/account_manager_core/account.h"
 #include "components/account_manager_core/account_addition_result.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "google_apis/gaia/gaia_auth_fetcher.h"
 
 namespace chromeos {
 
 SigninHelper::SigninHelper(
     account_manager::AccountManager* account_manager,
-    crosapi::AccountManagerAsh* account_manager_ash,
+    crosapi::AccountManagerMojoService* account_manager_mojo_service,
     const base::RepeatingClosure& close_dialog_closure,
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     const std::string& gaia_id,
@@ -22,7 +22,7 @@
     const std::string& auth_code,
     const std::string& signin_scoped_device_id)
     : account_manager_(account_manager),
-      account_manager_ash_(account_manager_ash),
+      account_manager_mojo_service_(account_manager_mojo_service),
       close_dialog_closure_(close_dialog_closure),
       email_(email),
       url_loader_factory_(std::move(url_loader_factory)),
@@ -59,8 +59,9 @@
 void SigninHelper::OnClientOAuthFailure(const GoogleServiceAuthError& error) {
   // TODO(sinhak): Display an error.
 
-  // Notify `AccountManagerAsh` about account addition failure and send `error`.
-  account_manager_ash_->OnAccountAdditionFinished(
+  // Notify `AccountManagerMojoService` about account addition failure and send
+  // `error`.
+  account_manager_mojo_service_->OnAccountAdditionFinished(
       account_manager::AccountAdditionResult(
           account_manager::AccountAdditionResult::Status::kNetworkError,
           error));
@@ -70,9 +71,9 @@
 void SigninHelper::UpsertAccount(const std::string& refresh_token) {
   account_manager_->UpsertAccount(account_key_, email_, refresh_token);
 
-  // Notify `AccountManagerAsh` about successful account addition and send
-  // the account.
-  account_manager_ash_->OnAccountAdditionFinished(
+  // Notify `AccountManagerMojoService` about successful account addition and
+  // send the account.
+  account_manager_mojo_service_->OnAccountAdditionFinished(
       account_manager::AccountAdditionResult(
           account_manager::AccountAdditionResult::Status::kSuccess,
           account_manager::Account{account_key_, email_}));
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos.h b/chrome/browser/ui/webui/signin/signin_helper_chromeos.h
index c8b898f..1146aec 100644
--- a/chrome/browser/ui/webui/signin/signin_helper_chromeos.h
+++ b/chrome/browser/ui/webui/signin/signin_helper_chromeos.h
@@ -7,7 +7,7 @@
 
 #include "components/account_manager_core/account.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "google_apis/gaia/gaia_auth_consumer.h"
 #include "google_apis/gaia/gaia_auth_fetcher.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -28,7 +28,7 @@
  public:
   SigninHelper(
       account_manager::AccountManager* account_manager,
-      crosapi::AccountManagerAsh* account_manager_ash,
+      crosapi::AccountManagerMojoService* account_manager_mojo_service,
       const base::RepeatingClosure& close_dialog_closure,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       const std::string& gaia_id,
@@ -63,8 +63,8 @@
  private:
   // A non-owning pointer to Chrome OS AccountManager.
   account_manager::AccountManager* const account_manager_;
-  // A non-owning pointer to AccountManagerAsh.
-  crosapi::AccountManagerAsh* const account_manager_ash_;
+  // A non-owning pointer to AccountManagerMojoService.
+  crosapi::AccountManagerMojoService* const account_manager_mojo_service_;
   // A closure to close the hosting dialog window.
   base::RepeatingClosure close_dialog_closure_;
   // The user's AccountKey for which |this| object has been created.
diff --git a/chrome/browser/upgrade_detector/get_installed_version_linux_unittest.cc b/chrome/browser/upgrade_detector/get_installed_version_linux_unittest.cc
index f5a3b6f1..7e2269a 100644
--- a/chrome/browser/upgrade_detector/get_installed_version_linux_unittest.cc
+++ b/chrome/browser/upgrade_detector/get_installed_version_linux_unittest.cc
@@ -119,7 +119,8 @@
 
 // Tests that the expected instance is returned when the child process reports a
 // valid version.
-TEST_F(GetInstalledVersionLinuxTest, WithVersion) {
+// TODO(crbug.com/1230474): Reenable. Failed consistently on  Linux Tests (dbg).
+TEST_F(GetInstalledVersionLinuxTest, DISABLED_WithVersion) {
   AddChildCommandLineSwitches(ChildMode::kWithVersion);
   InstalledAndCriticalVersion versions = GetInstalledVersion();
   ASSERT_TRUE(versions.installed_version.IsValid());
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index c596497a..2200d532 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/chromeos/ui_mode.gni")
+import("//chrome/browser/buildflags.gni")
 
 group("web_app_group") {
   public_configs = [ "//build/config/compiler:wexit_time_destructors" ]
@@ -46,6 +47,10 @@
     "preinstalled_web_app_manager.h",
     "preinstalled_web_app_utils.cc",
     "preinstalled_web_app_utils.h",
+    "preinstalled_web_apps/preinstalled_web_app_definition_utils.cc",
+    "preinstalled_web_apps/preinstalled_web_app_definition_utils.h",
+    "preinstalled_web_apps/preinstalled_web_apps.cc",
+    "preinstalled_web_apps/preinstalled_web_apps.h",
     "protocol_handler_manager.cc",
     "system_web_apps/system_web_app_background_task.cc",
     "system_web_apps/system_web_app_background_task.h",
@@ -109,12 +114,14 @@
   # web_applications must not depend on //chrome/browser/extensions and //extensions
   deps = [
     ":web_app_group",
+    "//base",
+    "//build:branding_buildflags",
     "//build:chromeos_buildflags",
     "//chrome/browser:browser_process",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/web_applications/components",
-    "//chrome/browser/web_applications/preinstalled_web_apps",
     "//chrome/common",
+    "//chrome/common:non_code_constants",
     "//components/content_settings/core/browser",
 
     # TODO(crbug.com/1225132): Clean up this legacy crx dependency.
@@ -134,10 +141,41 @@
     "//services/metrics/public/cpp:ukm_builders",
     "//services/preferences/public/cpp",
     "//skia",
+    "//ui/base",
     "//ui/base/idle",
     "//ui/events/devices:devices",
   ]
 
+  if (is_chrome_branded) {
+    sources += [
+      "preinstalled_web_apps/gmail.cc",
+      "preinstalled_web_apps/gmail.h",
+      "preinstalled_web_apps/google_docs.cc",
+      "preinstalled_web_apps/google_docs.h",
+      "preinstalled_web_apps/google_drive.cc",
+      "preinstalled_web_apps/google_drive.h",
+      "preinstalled_web_apps/google_sheets.cc",
+      "preinstalled_web_apps/google_sheets.h",
+      "preinstalled_web_apps/google_slides.cc",
+      "preinstalled_web_apps/google_slides.h",
+      "preinstalled_web_apps/youtube.cc",
+      "preinstalled_web_apps/youtube.h",
+    ]
+
+    if (is_chromeos_ash) {
+      sources += [
+        "preinstalled_web_apps/google_calendar.cc",
+        "preinstalled_web_apps/google_calendar.h",
+        "preinstalled_web_apps/google_chat.cc",
+        "preinstalled_web_apps/google_chat.h",
+        "preinstalled_web_apps/google_meet.cc",
+        "preinstalled_web_apps/google_meet.h",
+      ]
+    }
+
+    deps += [ "//chrome/browser/resources:preinstalled_web_apps_resources" ]
+  }
+
   if (is_chromeos_ash) {
     deps += [
       "//ash/constants",
@@ -297,6 +335,7 @@
     "manifest_update_task_unittest.cc",
     "preinstalled_web_app_manager_unittest.cc",
     "preinstalled_web_app_utils_unittest.cc",
+    "preinstalled_web_apps/preinstalled_web_app_definition_utils_unittest.cc",
     "system_web_apps/test/system_web_app_manager_unittest.cc",
     "web_app_database_unittest.cc",
     "web_app_icon_manager_unittest.cc",
@@ -317,8 +356,8 @@
     "//base/test:test_support",
     "//build:chromeos_buildflags",
     "//chrome/browser",
+    "//chrome/browser:browser_process",
     "//chrome/browser/web_applications/components",
-    "//chrome/browser/web_applications/preinstalled_web_apps",
     "//chrome/common",
     "//chrome/test:test_support",
     "//components/services/app_service/public/cpp:app_url_handling",
@@ -377,7 +416,6 @@
     "//chrome/browser/extensions:test_support",
     "//chrome/browser/web_applications/components",
     "//chrome/browser/web_applications/extensions",
-    "//chrome/browser/web_applications/preinstalled_web_apps",
     "//chrome/test:test_support",
     "//chrome/test:test_support_ui",
     "//components/permissions:permissions",
@@ -407,7 +445,6 @@
     ":web_applications_unit_tests",
     "//chrome/browser/web_applications/components:unit_tests",
     "//chrome/browser/web_applications/extensions:unit_tests",
-    "//chrome/browser/web_applications/preinstalled_web_apps:unit_tests",
   ]
 }
 
diff --git a/chrome/browser/web_applications/preinstalled_web_apps/BUILD.gn b/chrome/browser/web_applications/preinstalled_web_apps/BUILD.gn
deleted file mode 100644
index fae741a..0000000
--- a/chrome/browser/web_applications/preinstalled_web_apps/BUILD.gn
+++ /dev/null
@@ -1,69 +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("//build/config/chromeos/ui_mode.gni")
-import("//chrome/browser/buildflags.gni")
-
-source_set("preinstalled_web_apps") {
-  sources = [
-    "preinstalled_web_app_definition_utils.cc",
-    "preinstalled_web_app_definition_utils.h",
-    "preinstalled_web_apps.cc",
-    "preinstalled_web_apps.h",
-  ]
-
-  deps = [
-    "//base",
-    "//build:branding_buildflags",
-    "//build:chromeos_buildflags",
-    "//chrome/browser:browser_process",
-    "//chrome/browser/web_applications/components",
-    "//chrome/common:non_code_constants",
-    "//skia",
-    "//ui/base",
-  ]
-
-  if (is_chrome_branded) {
-    sources += [
-      "gmail.cc",
-      "gmail.h",
-      "google_docs.cc",
-      "google_docs.h",
-      "google_drive.cc",
-      "google_drive.h",
-      "google_sheets.cc",
-      "google_sheets.h",
-      "google_slides.cc",
-      "google_slides.h",
-      "youtube.cc",
-      "youtube.h",
-    ]
-
-    if (is_chromeos_ash) {
-      sources += [
-        "google_calendar.cc",
-        "google_calendar.h",
-        "google_chat.cc",
-        "google_chat.h",
-        "google_meet.cc",
-        "google_meet.h",
-      ]
-    }
-
-    deps += [ "//chrome/browser/resources:preinstalled_web_apps_resources" ]
-  }
-}
-
-source_set("unit_tests") {
-  testonly = true
-
-  sources = [ "preinstalled_web_app_definition_utils_unittest.cc" ]
-
-  deps = [
-    "//chrome/browser:browser_process",
-    "//chrome/browser/web_applications/preinstalled_web_apps",
-    "//skia",
-    "//testing/gtest",
-  ]
-}
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index b9c2ceb..cebaf23c 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -664,12 +664,6 @@
     base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // OS_WIN
 
-#if defined(OS_MAC)
-// Shows alert notifications via a helper app in a utility process.
-const base::Feature kNotificationsViaHelperApp{
-    "NotificationsViaHelperApp", base::FEATURE_ENABLED_BY_DEFAULT};
-#endif  // OS_MAC
-
 #if defined(OS_POSIX)
 // Enables NTLMv2, which implicitly disables NTLMv1.
 const base::Feature kNtlmV2Enabled{"NtlmV2Enabled",
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 34a90bf..44a7b99 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -450,11 +450,6 @@
 extern const base::Feature kNotificationDurationLongForRequireInteraction;
 #endif
 
-#if defined(OS_MAC)
-COMPONENT_EXPORT(CHROME_FEATURES)
-extern const base::Feature kNotificationsViaHelperApp;
-#endif
-
 #if defined(OS_POSIX)
 COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kNtlmV2Enabled;
 #endif
diff --git a/chrome/common/features.gni b/chrome/common/features.gni
index f146ca9..59b00c2 100644
--- a/chrome/common/features.gni
+++ b/chrome/common/features.gni
@@ -33,7 +33,7 @@
 
   # Enables support for background apps.
   enable_background_contents = !is_android && !is_chromecast
-  enable_background_mode = !is_android && !is_chromecast && !is_chromeos_ash
+  enable_background_mode = !is_android && !is_chromecast && !is_chromeos
 
   # Enable the printing system dialog for platforms that support printing
   # and have a system dialog.
diff --git a/chrome/installer/mac/signing/modification.py b/chrome/installer/mac/signing/modification.py
index 3c2b53b..849ba3d 100644
--- a/chrome/installer/mac/signing/modification.py
+++ b/chrome/installer/mac/signing/modification.py
@@ -37,17 +37,6 @@
                                   'Info.plist')
     with commands.PlistContext(app_plist_path, rewrite=True) as app_plist:
         if dist.channel_customize:
-            notification_xpc_plist_path = os.path.join(
-                paths.work, config.framework_dir, 'XPCServices',
-                'AlertNotificationService.xpc', 'Contents', 'Info.plist')
-            with commands.PlistContext(
-                    notification_xpc_plist_path,
-                    rewrite=True) as notification_xpc_plist:
-                notification_xpc_plist[_CF_BUNDLE_ID] = \
-                        notification_xpc_plist[_CF_BUNDLE_ID].replace(
-                                config.base_config.base_bundle_id,
-                                config.base_bundle_id)
-
             alert_helper_app_path = os.path.join(
                 paths.work, config.framework_dir, 'Helpers',
                 '{} Helper (Alerts).app'.format(config.product))
diff --git a/chrome/installer/mac/signing/modification_test.py b/chrome/installer/mac/signing/modification_test.py
index b802b59..6876746 100644
--- a/chrome/installer/mac/signing/modification_test.py
+++ b/chrome/installer/mac/signing/modification_test.py
@@ -19,10 +19,6 @@
             'KSProductID': 'test.ksproduct',
             'KSChannelID-full': '-full',
         },
-        '/$W/App Product Canary.app/Contents/Frameworks/Product Framework.framework/XPCServices/AlertNotificationService.xpc/Contents/Info.plist':
-            {
-                'CFBundleIdentifier': bundle_id + '.AlertNotificationService'
-            },
         '/$W/App Product Canary.app/Contents/Frameworks/Product Framework.framework/Helpers/Product Helper (Alerts).app/Contents/Info.plist':
             {
                 'CFBundleIdentifier': bundle_id + '.AlertNotificationService'
@@ -414,20 +410,13 @@
         kwargs['write_file'].assert_called_once_with(
             '/$W/App Product Canary.app/Contents/PkgInfo', 'APPLMooo')
 
-        self.assertEqual(9, kwargs['write_plist'].call_count)
+        self.assertEqual(8, kwargs['write_plist'].call_count)
         kwargs['write_plist'].assert_has_calls([
             mock.call(
                 {
                     'CFBundleIdentifier':
                         'test.signing.bundle_id.canary.AlertNotificationService'
                 },
-                '/$W/App Product Canary.app/Contents/Frameworks/Product Framework.framework/XPCServices/AlertNotificationService.xpc/Contents/Info.plist',
-                'xml1'),
-            mock.call(
-                {
-                    'CFBundleIdentifier':
-                        'test.signing.bundle_id.canary.AlertNotificationService'
-                },
                 '/$W/App Product Canary.app/Contents/Frameworks/Product Framework.framework/Helpers/Product Helper (Alerts).app/Contents/Info.plist',
                 'xml1'),
             mock.call({
diff --git a/chrome/installer/mac/signing/parts.py b/chrome/installer/mac/signing/parts.py
index 9a20b98..c19c026 100644
--- a/chrome/installer/mac/signing/parts.py
+++ b/chrome/installer/mac/signing/parts.py
@@ -51,14 +51,6 @@
                 config.framework_dir,
                 '{}.framework'.format(uncustomized_bundle_id),
                 verify_options=verify_options),
-        'notification-xpc':
-            CodeSignedProduct(
-                '{.framework_dir}/XPCServices/AlertNotificationService.xpc'
-                .format(config),
-                '{}.framework.AlertNotificationService'.format(
-                    config.base_bundle_id),
-                options=CodeSignOptions.FULL_HARDENED_RUNTIME_OPTIONS,
-                verify_options=verify_options),
         'crashpad':
             CodeSignedProduct(
                 '{.framework_dir}/Helpers/chrome_crashpad_handler'.format(
diff --git a/chrome/installer/mac/signing/parts_test.py b/chrome/installer/mac/signing/parts_test.py
index c2436d80..69854a2 100644
--- a/chrome/installer/mac/signing/parts_test.py
+++ b/chrome/installer/mac/signing/parts_test.py
@@ -19,9 +19,6 @@
                          all_parts['framework'].identifier)
         self.assertEqual(
             'test.signing.bundle_id.framework.AlertNotificationService',
-            all_parts['notification-xpc'].identifier)
-        self.assertEqual(
-            'test.signing.bundle_id.framework.AlertNotificationService',
             all_parts['helper-alerts'].identifier)
         self.assertEqual('test.signing.bundle_id.helper',
                          all_parts['helper-app'].identifier)
@@ -35,9 +32,6 @@
                          all_parts['framework'].identifier)
         self.assertEqual(
             'test.signing.bundle_id.framework.AlertNotificationService',
-            all_parts['notification-xpc'].identifier)
-        self.assertEqual(
-            'test.signing.bundle_id.framework.AlertNotificationService',
             all_parts['helper-alerts'].identifier)
         self.assertEqual('test.signing.bundle_id.helper',
                          all_parts['helper-app'].identifier)
@@ -56,9 +50,6 @@
                          all_parts['framework'].identifier)
         self.assertEqual(
             'test.signing.bundle_id.canary.framework.AlertNotificationService',
-            all_parts['notification-xpc'].identifier)
-        self.assertEqual(
-            'test.signing.bundle_id.canary.framework.AlertNotificationService',
             all_parts['helper-alerts'].identifier)
         self.assertEqual('test.signing.bundle_id.helper',
                          all_parts['helper-app'].identifier)
@@ -100,12 +91,6 @@
                 model.CodeSignOptions.LIBRARY_VALIDATION +
                 model.CodeSignOptions.KILL +
                 model.CodeSignOptions.HARDENED_RUNTIME),
-            set(all_parts['notification-xpc'].options))
-        self.assertEqual(
-            set(model.CodeSignOptions.RESTRICT +
-                model.CodeSignOptions.LIBRARY_VALIDATION +
-                model.CodeSignOptions.KILL +
-                model.CodeSignOptions.HARDENED_RUNTIME),
             set(all_parts['helper-alerts'].options))
         self.assertEqual(
             set(model.CodeSignOptions.RESTRICT +
diff --git a/chrome/installer/mac/signing/pipeline_test.py b/chrome/installer/mac/signing/pipeline_test.py
index c67caf17..5a4acab 100644
--- a/chrome/installer/mac/signing/pipeline_test.py
+++ b/chrome/installer/mac/signing/pipeline_test.py
@@ -250,9 +250,6 @@
 
         self.assertEqual(staple.mock_calls, [
             mock.call(
-                '/$W/App Product.app/Contents/Frameworks/Product Framework.framework/XPCServices/AlertNotificationService.xpc'
-            ),
-            mock.call(
                 '/$W/App Product.app/Contents/Frameworks/Product Framework.framework/Helpers/Product Helper.app'
             ),
             mock.call(
@@ -284,9 +281,6 @@
 
         self.assertEqual(staple.mock_calls, [
             mock.call(
-                '/$W/App Product Canary.app/Contents/Frameworks/Product Framework.framework/XPCServices/AlertNotificationService.xpc'
-            ),
-            mock.call(
                 '/$W/App Product Canary.app/Contents/Frameworks/Product Framework.framework/Helpers/Product Helper.app'
             ),
             mock.call(
diff --git a/chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm b/chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm
index 673e152d..7656bbf 100644
--- a/chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm
+++ b/chrome/services/mac_notifications/public/cpp/notification_constants_mac.mm
@@ -36,7 +36,4 @@
 NSString* const kNotificationOperation = @"notificationOperation";
 NSString* const kNotificationButtonIndex = @"notificationButtonIndex";
 
-// Name of the XPC service
-NSString* const kAlertXPCServiceName = @"%@.framework.AlertNotificationService";
-
 }  // notification_constants
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 9da2c6c..6fc9b14a1e 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1531,9 +1531,9 @@
       "../browser/media/webrtc/webrtc_desktop_capture_browsertest.cc",
       "../browser/media/webrtc/webrtc_disable_encryption_flag_browsertest.cc",
       "../browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc",
-      "../browser/media/webrtc/webrtc_getmediadevices_browsertest.cc",
       "../browser/media/webrtc/webrtc_internals_integration_browsertest.cc",
       "../browser/media/webrtc/webrtc_internals_perf_browsertest.cc",
+      "../browser/media/webrtc/webrtc_mediadevices_browsertest.cc",
       "../browser/media/webrtc/webrtc_pan_tilt_zoom_browsertest.cc",
       "../browser/media/webrtc/webrtc_stats_perf_browsertest.cc",
       "../browser/media/webrtc/webrtc_video_display_perf_browsertest.cc",
@@ -2894,6 +2894,7 @@
         "../browser/ui/views/hung_renderer_view_browsertest.cc",
         "../browser/ui/views/importer/import_lock_dialog_view_browsertest.cc",
         "../browser/ui/views/location_bar/content_setting_bubble_dialog_browsertest.cc",
+        "../browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc",
         "../browser/ui/views/location_bar/custom_tab_bar_view_browsertest.cc",
         "../browser/ui/views/location_bar/location_bar_view_browsertest.cc",
         "../browser/ui/views/location_bar/location_icon_view_browsertest.cc",
@@ -3428,6 +3429,7 @@
         "../browser/ui/ash/shelf/app_service/app_service_shelf_context_menu_browsertest.cc",
         "../browser/ui/ash/shelf/app_shortcut_shelf_item_controller_browsertest.cc",
         "../browser/ui/ash/shelf/arc_app_shelf_browsertest.cc",
+        "../browser/ui/ash/shelf/browser_apps_tracker_browsertest.cc",
         "../browser/ui/ash/shelf/browser_shortcut_shelf_item_controller_browsertest.cc",
         "../browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc",
         "../browser/ui/ash/shelf/chrome_shelf_controller_test_util.cc",
@@ -6916,10 +6918,6 @@
 
   if (is_linux || is_chromeos || is_mac || is_win) {
     sources += [
-      "../browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc",
-      "../browser/enterprise/connectors/device_trust/mock_signal_reporter.cc",
-      "../browser/enterprise/connectors/device_trust/mock_signal_reporter.h",
-      "../browser/enterprise/connectors/device_trust/signal_reporter_unittest.cc",
       "../browser/enterprise/connectors/file_system/access_token_fetcher_unittest.cc",
       "../browser/enterprise/connectors/file_system/box_api_call_flow_unittest.cc",
       "../browser/enterprise/connectors/file_system/box_api_call_test_helper.cc",
@@ -6933,11 +6931,20 @@
     ]
   }
 
+  if (is_linux || is_chromeos_ash || is_mac || is_win) {
+    sources += [
+      "../browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc",
+      "../browser/enterprise/connectors/device_trust/mock_signal_reporter.cc",
+      "../browser/enterprise/connectors/device_trust/mock_signal_reporter.h",
+      "../browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc",
+      "../browser/enterprise/connectors/device_trust/signal_reporter_unittest.cc",
+    ]
+  }
+
   if (is_linux || is_mac || is_win) {
     sources += [
       "../browser/enterprise/connectors/device_trust/attestation_service_unittest.cc",
       "../browser/enterprise/connectors/device_trust/device_trust_key_pair_unittest.cc",
-      "../browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc",
     ]
   }
 
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
index 5cdb8a3..045a157 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -22,6 +22,7 @@
 <translation id="2064538373111010176"><ph name="CAMERA" /> نشطة</translation>
 <translation id="2144806332417375165">مَعلمات الفيديوهات المخصّصة</translation>
 <translation id="2175927920773552910">رمز الاستجابة السريعة</translation>
+<translation id="2268107369530950373">التبديل إلى وضع المسح الضوئي</translation>
 <translation id="229579744168541441">تصدير إلى القرص</translation>
 <translation id="2320741269052147773">عرض شامل لليسار</translation>
 <translation id="2501278716633472235">الرجوع</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb
index 9e763fb..a2d74d3 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_as.xtb
@@ -22,6 +22,7 @@
 <translation id="2064538373111010176"><ph name="CAMERA" /> সক্ৰিয় হৈ আছে</translation>
 <translation id="2144806332417375165">কাষ্টম ভিডিঅ’ পেৰামিটাৰ</translation>
 <translation id="2175927920773552910">কিউআৰ ক’ড</translation>
+<translation id="2268107369530950373">স্কেনাৰ ম’ডলৈ সলনি কৰক</translation>
 <translation id="229579744168541441">ডিস্কলৈ ৰপ্তানি কৰক</translation>
 <translation id="2320741269052147773">বাওঁফালে পেন কৰক</translation>
 <translation id="2501278716633472235">উভতি যাওক</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
index 3063c17..585d7376 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_iw.xtb
@@ -22,6 +22,7 @@
 <translation id="2064538373111010176"><ph name="CAMERA" /> פעילה</translation>
 <translation id="2144806332417375165">התאמה אישית של פרמטרים לסרטונים</translation>
 <translation id="2175927920773552910">‏קוד QR</translation>
+<translation id="2268107369530950373">מעבר למצב סורק</translation>
 <translation id="229579744168541441">ייצוא לדיסק</translation>
 <translation id="2320741269052147773">הזזה שמאלה</translation>
 <translation id="2501278716633472235">חזרה</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
index d7986b4..e9775f2 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -22,6 +22,7 @@
 <translation id="2064538373111010176"><ph name="CAMERA" /> ativa</translation>
 <translation id="2144806332417375165">Parâmetros de vídeo personalizados</translation>
 <translation id="2175927920773552910">Código QR</translation>
+<translation id="2268107369530950373">Use o modo de leitura</translation>
 <translation id="229579744168541441">Exportar para o disco</translation>
 <translation id="2320741269052147773">Movimentar para a esquerda</translation>
 <translation id="2501278716633472235">Voltar</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
index 0f44bc0..6f89511 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -22,6 +22,7 @@
 <translation id="2064538373111010176"><ph name="CAMERA" /> etkin</translation>
 <translation id="2144806332417375165">Özel video parametreleri</translation>
 <translation id="2175927920773552910">QR Kodu</translation>
+<translation id="2268107369530950373">Tarayıcı moduna geç</translation>
 <translation id="229579744168541441">Diske aktar</translation>
 <translation id="2320741269052147773">Sola kaydır</translation>
 <translation id="2501278716633472235">Geri dön</translation>
diff --git a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
index cdd2e140..7b554cb 100644
--- a/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
+++ b/chromeos/components/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -22,6 +22,7 @@
 <translation id="2064538373111010176">「<ph name="CAMERA" />」已啟用</translation>
 <translation id="2144806332417375165">自訂影片參數</translation>
 <translation id="2175927920773552910">QR 圖碼</translation>
+<translation id="2268107369530950373">切換為掃描器模式</translation>
 <translation id="229579744168541441">匯出至磁碟</translation>
 <translation id="2320741269052147773">向左平移</translation>
 <translation id="2501278716633472235">返回</translation>
diff --git a/chromeos/dbus/shill/fake_shill_service_client.cc b/chromeos/dbus/shill/fake_shill_service_client.cc
index 09edefc..d0338658 100644
--- a/chromeos/dbus/shill/fake_shill_service_client.cc
+++ b/chromeos/dbus/shill/fake_shill_service_client.cc
@@ -361,6 +361,23 @@
   std::move(callback).Run(passphrase ? *passphrase : std::string());
 }
 
+void FakeShillServiceClient::GetEapPassphrase(
+    const dbus::ObjectPath& service_path,
+    StringCallback callback,
+    ErrorCallback error_callback) {
+  base::Value* service_properties =
+      GetModifiableServiceProperties(service_path.value(), false);
+  if (!service_properties) {
+    LOG(ERROR) << "Service not found: " << service_path.value();
+    std::move(error_callback).Run("Error.InvalidService", "Invalid Service");
+    return;
+  }
+
+  const std::string* passphrase =
+      service_properties->FindStringKey(shill::kEapPasswordProperty);
+  std::move(callback).Run(passphrase ? *passphrase : std::string());
+}
+
 void FakeShillServiceClient::RequestTrafficCounters(
     const dbus::ObjectPath& service_path,
     ListValueCallback callback,
diff --git a/chromeos/dbus/shill/fake_shill_service_client.h b/chromeos/dbus/shill/fake_shill_service_client.h
index b25bb1c..74ae34b 100644
--- a/chromeos/dbus/shill/fake_shill_service_client.h
+++ b/chromeos/dbus/shill/fake_shill_service_client.h
@@ -73,6 +73,9 @@
   void GetWiFiPassphrase(const dbus::ObjectPath& service_path,
                          StringCallback callback,
                          ErrorCallback error_callback) override;
+  void GetEapPassphrase(const dbus::ObjectPath& service_path,
+                        StringCallback callback,
+                        ErrorCallback error_callback) override;
   void RequestTrafficCounters(const dbus::ObjectPath& service_path,
                               ListValueCallback callback,
                               ErrorCallback error_callback) override;
diff --git a/chromeos/dbus/shill/shill_service_client.cc b/chromeos/dbus/shill/shill_service_client.cc
index d50ddbce..b139c96 100644
--- a/chromeos/dbus/shill/shill_service_client.cc
+++ b/chromeos/dbus/shill/shill_service_client.cc
@@ -213,6 +213,17 @@
                                             std::move(error_callback));
   }
 
+  void GetEapPassphrase(const dbus::ObjectPath& service_path,
+                        StringCallback callback,
+                        ErrorCallback error_callback) override {
+    dbus::MethodCall method_call(shill::kFlimflamServiceInterface,
+                                 shill::kGetEapPassphraseFunction);
+
+    GetHelper(service_path)
+        ->CallStringMethodWithErrorCallback(&method_call, std::move(callback),
+                                            std::move(error_callback));
+  }
+
   void RequestTrafficCounters(const dbus::ObjectPath& service_path,
                               ListValueCallback callback,
                               ErrorCallback error_callback) override {
diff --git a/chromeos/dbus/shill/shill_service_client.h b/chromeos/dbus/shill/shill_service_client.h
index 9ef99d8..a8057267 100644
--- a/chromeos/dbus/shill/shill_service_client.h
+++ b/chromeos/dbus/shill/shill_service_client.h
@@ -211,11 +211,16 @@
       const dbus::ObjectPath& service_path,
       DBusMethodCallback<base::Value> callback) = 0;
 
-  // Retrieves the saved passphrase for the given network.
+  // Retrieves the saved WiFi passphrase for the given network.
   virtual void GetWiFiPassphrase(const dbus::ObjectPath& service_path,
                                  StringCallback callback,
                                  ErrorCallback error_callback) = 0;
 
+  // Retrieves the saved EAP passphrase for the given network.
+  virtual void GetEapPassphrase(const dbus::ObjectPath& service_path,
+                                StringCallback callback,
+                                ErrorCallback error_callback) = 0;
+
   // Calls the RequestTrafficCounters method.
   // |callback| is called after the method call succeeds.
   virtual void RequestTrafficCounters(const dbus::ObjectPath& service_path,
diff --git a/chromeos/dbus/shill/shill_service_client_unittest.cc b/chromeos/dbus/shill/shill_service_client_unittest.cc
index bc592812..0fc6dcf4 100644
--- a/chromeos/dbus/shill/shill_service_client_unittest.cc
+++ b/chromeos/dbus/shill/shill_service_client_unittest.cc
@@ -291,6 +291,29 @@
   base::RunLoop().RunUntilIdle();
 }
 
+TEST_F(ShillServiceClientTest, GetEapPassphrase) {
+  const char kPassphrase[] = "passphrase";
+
+  // Create response.
+  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
+  dbus::MessageWriter writer(response.get());
+  writer.AppendString(kPassphrase);
+
+  // Set expectations.
+  PrepareForMethodCall(shill::kGetEapPassphraseFunction,
+                       base::BindRepeating(&ExpectNoArgument), response.get());
+  // Call method.
+  base::MockCallback<base::OnceCallback<void(const std::string&)>> mock_closure;
+  base::MockCallback<ShillServiceClient::ErrorCallback> mock_error_callback;
+  client_->GetEapPassphrase(dbus::ObjectPath(kExampleServicePath),
+                            mock_closure.Get(), mock_error_callback.Get());
+  EXPECT_CALL(mock_closure, Run(kPassphrase)).Times(1);
+  EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0);
+
+  // Run the message loop.
+  base::RunLoop().RunUntilIdle();
+}
+
 TEST_F(ShillServiceClientTest, RequestTrafficCounters) {
   // Set up value of response.
   base::Value traffic_counters(base::Value::Type::LIST);
diff --git a/chromeos/login/auth/cryptohome_key_constants.h b/chromeos/login/auth/cryptohome_key_constants.h
index 7fe016f..a6c5716 100644
--- a/chromeos/login/auth/cryptohome_key_constants.h
+++ b/chromeos/login/auth/cryptohome_key_constants.h
@@ -24,6 +24,7 @@
 // source code migration is finished.
 namespace ash {
 using ::chromeos::kCryptohomeGaiaKeyLabel;
+using ::chromeos::kCryptohomePinLabel;
 }
 
 #endif  // CHROMEOS_LOGIN_AUTH_CRYPTOHOME_KEY_CONSTANTS_H_
diff --git a/chromeos/profiles/bigcore.afdo.newest.txt b/chromeos/profiles/bigcore.afdo.newest.txt
index 2d218d6..56faf53 100644
--- a/chromeos/profiles/bigcore.afdo.newest.txt
+++ b/chromeos/profiles/bigcore.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-93-4554.0-1626087514-benchmark-93.0.4577.3-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-93-4554.0-1626087514-benchmark-93.0.4577.5-r1-redacted.afdo.xz
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index 99726b4..12f4c9a 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -60,6 +60,7 @@
 <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation>
 <translation id="2157959690810728433">تم وضع الاختبار في قائمة الانتظار.</translation>
 <translation id="2161394479394250669">إلغاء مهمة الطباعة</translation>
+<translation id="2209788852729124853">إعادة ضبط عدّادات حركة بيانات الشبكة</translation>
 <translation id="2217935453350629363">السرعة الحالية</translation>
 <translation id="2224337661447660594">الاتصال بالإنترنت مقطوع</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -120,6 +121,7 @@
 <translation id="3595596368722241419">البطارية ممتلئة</translation>
 <translation id="360565022852130722">‏شبكة Wi-Fi مؤمَّنة باستخدام بروتوكول WEP 802.1x ضعيف.</translation>
 <translation id="3689839747745352263">اختبار <ph name="TEST_NAME" /></translation>
+<translation id="373232531963562220">{PAGE_NUMBER,plural, =0{إعادة مسح الصفحة ضوئيًا}=1{إعادة مسح صفحة واحدة ({PAGE_NUMBER}) ضوئيًا}two{إعادة مسح صفحتين ({PAGE_NUMBER}) ضوئيًا}few{إعادة مسح {PAGE_NUMBER} صفحات ضوئيًا}many{إعادة مسح {PAGE_NUMBER} صفحة ضوئيًا}other{إعادة مسح {PAGE_NUMBER} صفحة ضوئيًا}}</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> مراجعة)</translation>
 <translation id="3748026146096797577">غير متصل</translation>
 <translation id="3749289110408117711">اسم الملف</translation>
@@ -151,6 +153,7 @@
 <translation id="4425149324548788773">ملفاتي</translation>
 <translation id="4429881212383817840">‏ستنتهي صلاحية تذكرة Kerberos قريبًا</translation>
 <translation id="4431821876790500265">عرض التقرير</translation>
+<translation id="4439309966561990606">{PAGE_NUMBER,plural, =0{إزالة الصفحة}=1{إزالة صفحة واحدة ({PAGE_NUMBER})}two{إزالة صفحتين ({PAGE_NUMBER})}few{إزالة {PAGE_NUMBER} صفحات}many{إزالة {PAGE_NUMBER} صفحة}other{إزالة {PAGE_NUMBER} صفحة}}</translation>
 <translation id="445059817448385655">كلمة المرور القديمة</translation>
 <translation id="4453205916657964690">قناع الشبكة الفرعية</translation>
 <translation id="4454245904991689773">حفظ الملفات التي تم مسحها ضوئيًا في</translation>
@@ -248,6 +251,7 @@
 <translation id="5916084858004523819">محظورة</translation>
 <translation id="5921506667911082617">{COUNT,plural, =1{تم بنجاح مسح الملف ضوئيًا وحفظه في <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}zero{تم بنجاح مسح الملفات ضوئيًا وحفظها في <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}two{تم بنجاح مسح الملفين ضوئيًا وحفظهما في <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}few{تم بنجاح مسح الملفات ضوئيًا وحفظها في <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}many{تم بنجاح مسح الملفات ضوئيًا وحفظها في <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}other{تم بنجاح مسح الملفات ضوئيًا وحفظها في <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}}</translation>
 <translation id="5931523347251946569">لم يتم العثور على الملف.</translation>
+<translation id="5972388717451707488">Update Engine</translation>
 <translation id="6037291330010597344">وحدة تغذية المستندات في الماسح الضوئي فارغة. يُرجى إضافة مستندات وإعادة المحاولة.</translation>
 <translation id="6040143037577758943">إغلاق</translation>
 <translation id="6040852767465482106">هوية مجهولة</translation>
@@ -285,6 +289,7 @@
 <translation id="6527081081771465939">‏بروتوكول حماية شبكة Wi-Fi غير معروف.</translation>
 <translation id="65587193855025101">المسطَّح</translation>
 <translation id="6564646048574748301">تعذَّرت الطباعة - لا يمكن الوصول إلى الطابعة</translation>
+<translation id="6574762126505704998">تعبئة</translation>
 <translation id="6603230386432466813">هل تواجه مشكلة أثناء الاتصال؟</translation>
 <translation id="6618744767048954150">قيد التشغيل</translation>
 <translation id="6620487321149975369">ستظهر طلبات الطباعة في السجلّ إلّا إذا تمت إزالتها يدويًا.</translation>
@@ -333,6 +338,7 @@
 <translation id="7569444139234840525"><ph name="QUERY_TEXT" /> · /<ph name="PHONETICS" />/</translation>
 <translation id="7595982850646262331">الوقت المتبقّي: <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">مزيد من المعلومات في "مركز المساعدة"</translation>
+<translation id="763165478673169849">وقت آخر عملية إعادة ضبط</translation>
 <translation id="7648838807254605802">‏وقت استجابة بروتوكول HTTPS طويل.</translation>
 <translation id="7658239707568436148">إلغاء</translation>
 <translation id="7690294790491645610">تأكيد كلمة المرور الجديدة</translation>
@@ -354,6 +360,7 @@
 <translation id="8075838845814659848">شحن البطارية المتبقي</translation>
 <translation id="808894953321890993">تغيير كلمة المرور</translation>
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" />° مئوية</translation>
+<translation id="8132480444149501833">طلب عدّادات حركة بيانات الشبكة</translation>
 <translation id="8206859287963243715">خلوي</translation>
 <translation id="8208861521865154048">المزايا</translation>
 <translation id="8214184102975786227">‏مسح صفحات متعدّدة ضوئيًا وتحويلها إلى ملف PDF واحد</translation>
@@ -375,8 +382,10 @@
 <translation id="8475690821716466388">‏شبكة Wi-Fi مؤمَّنة باستخدام بروتوكول WEP PSK ضعيف.</translation>
 <translation id="8477551185774834963">وقت استجابة "نظام أسماء النطاقات" أعلى بقليل من الحدّ الأقصى المسموح به.</translation>
 <translation id="8483248364096924578">‏عنوان IP</translation>
+<translation id="8498220429738806196">عدّادات حركة بيانات الشبكة</translation>
 <translation id="8503813439785031346">اسم المستخدم</translation>
 <translation id="8503836310948963452">يُرجى الانتظار بضع دقائق فقط…</translation>
+<translation id="8528615187455571738">Crosvm</translation>
 <translation id="8575298406870537639">قد يتطلّب مشغّل شبكة الجوّال تفعيل هذا الخيار للاتصال بالشبكة التابعة له. يُرجى التواصل مع مشغّل شبكة الجوّال للاطّلاع على التفاصيل.</translation>
 <translation id="8576249514688522074">غير مهيأة</translation>
 <translation id="8620617069779373398">حالة التجوال</translation>
@@ -393,6 +402,7 @@
 <translation id="8814190375133053267">‏لاسلكي، Wi-Fi</translation>
 <translation id="8818152010000655963">الخلفية</translation>
 <translation id="8845001906332463065">الحصول على مساعدة</translation>
+<translation id="8868741746785112895">‏المعرّف الفريد العمومي (GUID)</translation>
 <translation id="8881098542468797602">نجح الاختبار.</translation>
 <translation id="8898840733695078011">قوة الإشارة</translation>
 <translation id="8910721771319628100">وقت استجابة الشبكة التلقائية أعلى من الحدّ الأقصى.</translation>
@@ -408,6 +418,7 @@
 <translation id="9073281213608662541">‏بروتوكول مصادقة كلمات المرور (PAP)</translation>
 <translation id="9074739597929991885">بلوتوث</translation>
 <translation id="9088306295921699330">الاستخدام الحالي</translation>
+<translation id="9095775724867566971">Pluginvm</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_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index 65fd67d..dc73650 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -60,6 +60,7 @@
 <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation>
 <translation id="2157959690810728433">শাৰীত ৰখা হৈছে</translation>
 <translation id="2161394479394250669">প্ৰিণ্টিঙৰ কাৰ্য বাতিল কৰক</translation>
+<translation id="2209788852729124853">ট্ৰেফিক কাউণ্টাৰ ৰিছেট কৰক</translation>
 <translation id="2217935453350629363">বৰ্তমানৰ গতিবেগ</translation>
 <translation id="2224337661447660594">ইণ্টাৰনেট নাই</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -120,6 +121,7 @@
 <translation id="3595596368722241419">বেটাৰী চ্চাৰ্জ সম্পূৰ্ণ হৈছে</translation>
 <translation id="360565022852130722">ৱাই-ফাই নেটৱৰ্কটো দুৰ্বল প্ৰট’কল WEP 802.1xৰ দ্বাৰা সুৰক্ষিত</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> পৰীক্ষা</translation>
+<translation id="373232531963562220">{PAGE_NUMBER,plural, =0{পৃষ্ঠা পুনৰ স্কেন কৰক}=1{পৃষ্ঠা {PAGE_NUMBER} পুনৰ স্কেন কৰক}one{পৃষ্ঠা {PAGE_NUMBER} পুনৰ স্কেন কৰক}other{পৃষ্ঠা {PAGE_NUMBER} পুনৰ স্কেন কৰক}}</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> টা পৰ্যালোচনা)</translation>
 <translation id="3748026146096797577">সংযোগ কৰা হোৱা নাই</translation>
 <translation id="3749289110408117711">ফাইলৰ নাম</translation>
@@ -151,6 +153,7 @@
 <translation id="4425149324548788773">মোৰ ড্ৰাইভ</translation>
 <translation id="4429881212383817840">Kerberos টিকেটৰ ম্যাদ শীঘ্ৰেই উকলি যাব</translation>
 <translation id="4431821876790500265">ৰিপ’ৰ্ট চাওক</translation>
+<translation id="4439309966561990606">{PAGE_NUMBER,plural, =0{পৃষ্ঠা আঁতৰাওক}=1{পৃষ্ঠা {PAGE_NUMBER} আঁতৰাওক}one{পৃষ্ঠা {PAGE_NUMBER} আঁতৰাওক}other{পৃষ্ঠা {PAGE_NUMBER} আঁতৰাওক}}</translation>
 <translation id="445059817448385655">পুৰণি পাছৱৰ্ড</translation>
 <translation id="4453205916657964690">ছাবনেট মাস্ক</translation>
 <translation id="4454245904991689773">স্কেন কৰি ইয়াত ছেভ কৰক</translation>
@@ -248,6 +251,7 @@
 <translation id="5916084858004523819">নিষিদ্ধ</translation>
 <translation id="5921506667911082617">{COUNT,plural, =1{আপোনাৰ ফাইলটো সফলভাৱে স্কেন আৰু <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />ত ছেভ কৰা হৈছে।}one{আপোনাৰ ফাইলসমূহ সফলভাৱে স্কেন আৰু <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />ত ছেভ কৰা হৈছে।}other{আপোনাৰ ফাইলসমূহ সফলভাৱে স্কেন আৰু <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />ত ছেভ কৰা হৈছে।}}</translation>
 <translation id="5931523347251946569">ফাইলটো পোৱা নগ’ল</translation>
+<translation id="5972388717451707488">Update Engine</translation>
 <translation id="6037291330010597344">স্কেনাৰৰ নথিৰ ফীডাৰটো খালী আছে। নথি যোগ দি পুনৰ চেষ্টা কৰক।</translation>
 <translation id="6040143037577758943">বন্ধ কৰক</translation>
 <translation id="6040852767465482106">অজ্ঞাত পৰিচয়</translation>
@@ -285,6 +289,7 @@
 <translation id="6527081081771465939">ৱাই-ফাইৰ অজ্ঞাত সুৰক্ষাৰ প্ৰ'টকল</translation>
 <translation id="65587193855025101">ফ্লে'টবেড</translation>
 <translation id="6564646048574748301">বিফল হৈছে - প্ৰিণ্টাৰৰ সৈতে সংযোগ কৰিব পৰা নাই</translation>
+<translation id="6574762126505704998">সম্পূৰ্ণ স্ক্ৰীনজুৰি</translation>
 <translation id="6603230386432466813">সংযোগ কৰোঁতে সমস্যাৰ সৃষ্টি হৈছে নেকি?</translation>
 <translation id="6618744767048954150">চলি আছে</translation>
 <translation id="6620487321149975369">প্ৰিণ্টিঙৰ কামসমূহ মেনুৱেলভাৱে আঁতৰাই নিদিয়ালৈকে সেইসমূহ ইতিহাসত দেখা পোৱা যাব</translation>
@@ -333,6 +338,7 @@
 <translation id="7569444139234840525"><ph name="QUERY_TEXT" /> · /<ph name="PHONETICS" />/</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> বাকী</translation>
 <translation id="7620771111601174153">সহায় কেন্দ্ৰত অধিক জানক</translation>
+<translation id="763165478673169849">অন্তিমবাৰ ৰিছেট কৰাৰ সময়</translation>
 <translation id="7648838807254605802">HTTPSৰ বেছি বিলম্বতা</translation>
 <translation id="7658239707568436148">বাতিল কৰক</translation>
 <translation id="7690294790491645610">নতুন পাছৱর্ড নিশ্চিত কৰক</translation>
@@ -354,6 +360,7 @@
 <translation id="8075838845814659848">বাকী থকা চাৰ্জ</translation>
 <translation id="808894953321890993">পাছৱৰ্ড সলনি কৰক</translation>
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" />° C</translation>
+<translation id="8132480444149501833">ট্ৰেফিক কাউণ্টাৰৰ অনুৰোধ কৰক</translation>
 <translation id="8206859287963243715">চেলুলাৰ</translation>
 <translation id="8208861521865154048">লাভালাভসমূহ</translation>
 <translation id="8214184102975786227">একাধিক পৃষ্ঠা স্কেন কৰি এটা PDF সৃষ্টি কৰক</translation>
@@ -375,8 +382,10 @@
 <translation id="8475690821716466388">ৱাই-ফাই নেটৱৰ্কটো দুৰ্বল প্ৰট’কল WEP PSKৰ দ্বাৰা সুৰক্ষিত</translation>
 <translation id="8477551185774834963">DNSৰ বিলম্বতা সামান্য পৰিমাণে অনুমতি দিয়া সীমাতকৈ ওপৰত আছে</translation>
 <translation id="8483248364096924578">IP ঠিকনা</translation>
+<translation id="8498220429738806196">ট্ৰেফিক কাউণ্টাৰ</translation>
 <translation id="8503813439785031346">ব্যৱহাৰকাৰীৰ নাম</translation>
 <translation id="8503836310948963452">আৰু মাত্ৰ কেইমিনিটমান বাকী…</translation>
+<translation id="8528615187455571738">Crosvm</translation>
 <translation id="8575298406870537639">আপোনাৰ বাহকৰ নেটৱৰ্কৰ সৈতে সংযুক্ত হ’বলৈ সেইটোক এই বিকল্পটোৰ আৱশ্যক হ’ব পাৰে। সবিশেষৰ বাবে আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰক।</translation>
 <translation id="8576249514688522074">আৰম্ভ কৰা হোৱা নাই</translation>
 <translation id="8620617069779373398">ৰ’মিঙৰ স্থিতি</translation>
@@ -393,6 +402,7 @@
 <translation id="8814190375133053267">ৱাই-ফাই</translation>
 <translation id="8818152010000655963">ৱালপেপাৰ</translation>
 <translation id="8845001906332463065">সহায় পাওক</translation>
+<translation id="8868741746785112895">GUID</translation>
 <translation id="8881098542468797602">পৰীক্ষা সফল হৈছে</translation>
 <translation id="8898840733695078011">ছিগনেলৰ ক্ষমতা</translation>
 <translation id="8910721771319628100">ডিফ’ল্ট নেটৱৰ্ক বিলম্বতাৰ সীমাৰ ওপৰত আছে</translation>
@@ -408,6 +418,7 @@
 <translation id="9073281213608662541">PAP</translation>
 <translation id="9074739597929991885">ব্লুটুথ</translation>
 <translation id="9088306295921699330">এতিয়ালৈকে কৰা ব্যৱহাৰৰ পৰিমাণ</translation>
+<translation id="9095775724867566971">Pluginvm</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_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index 8b3e7cec..55f9a174 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -132,6 +132,7 @@
 <translation id="387301095347517405">The number of times that your battery has gone through a full charging cycle</translation>
 <translation id="3941014780699102620">Failed to resolve host</translation>
 <translation id="3942420633017001071">Diagnostics</translation>
+<translation id="3966286471246132217">For more accurate results, close all apps until the test is complete.</translation>
 <translation id="3967822245660637423">Download complete</translation>
 <translation id="397105322502079400">Calculating...</translation>
 <translation id="39823212440917567">Print jobs older than <ph name="NUMBER_OF_DAYS" /> days will be removed</translation>
@@ -144,6 +145,7 @@
 <translation id="4176463684765177261">Disabled</translation>
 <translation id="4227825898293920515">Password expires in <ph name="TIME" /></translation>
 <translation id="4238516577297848345">No print jobs in progress</translation>
+<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="4289540628985791613">Overview</translation>
 <translation id="4297501883039923494">Stopped – unknown error</translation>
 <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> images</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb
index d94bf7f..ed31b5c 100644
--- a/chromeos/strings/chromeos_strings_iw.xtb
+++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -60,6 +60,7 @@
 <translation id="2141644705054017895">‎<ph name="PERCENTAGE_VALUE" />%‎</translation>
 <translation id="2157959690810728433">נמצאת בתור</translation>
 <translation id="2161394479394250669">ביטול משימת ההדפסה</translation>
+<translation id="2209788852729124853">איפוס מוני התנועה</translation>
 <translation id="2217935453350629363">מהירות נוכחית</translation>
 <translation id="2224337661447660594">אין אינטרנט</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -120,6 +121,7 @@
 <translation id="3595596368722241419">סוללה מלאה</translation>
 <translation id="360565022852130722">‏רשת ה-Wi-Fi מאובטחת בפרוטוקול WEP 802.1x חלש.</translation>
 <translation id="3689839747745352263">בדיקת <ph name="TEST_NAME" /></translation>
+<translation id="373232531963562220">{PAGE_NUMBER,plural, =0{סריקת הדף מחדש}=1{סריקת דף {PAGE_NUMBER} מחדש}two{סריקת דף {PAGE_NUMBER} מחדש}many{סריקת דף {PAGE_NUMBER} מחדש}other{סריקת דף {PAGE_NUMBER} מחדש}}</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> ביקורות)</translation>
 <translation id="3748026146096797577">לא מחובר</translation>
 <translation id="3749289110408117711">שם קובץ</translation>
@@ -151,6 +153,7 @@
 <translation id="4425149324548788773">האחסון שלי</translation>
 <translation id="4429881212383817840">‏התוקף של כרטיס Kerberos עומד לפוג בקרוב</translation>
 <translation id="4431821876790500265">לעיון בדוח</translation>
+<translation id="4439309966561990606">{PAGE_NUMBER,plural, =0{הסרת הדף}=1{הסרת דף {PAGE_NUMBER}}two{הסרת דף {PAGE_NUMBER}}many{הסרת דף {PAGE_NUMBER}}other{הסרת דף {PAGE_NUMBER}}}</translation>
 <translation id="445059817448385655">סיסמה ישנה</translation>
 <translation id="4453205916657964690">מסכה של רשת משנה</translation>
 <translation id="4454245904991689773">מיקום שמירת הסריקה</translation>
@@ -248,6 +251,7 @@
 <translation id="5916084858004523819">אסור</translation>
 <translation id="5921506667911082617">{COUNT,plural, =1{הקובץ נסרק בהצלחה ונשמר בתיקייה <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}two{הקבצים נסרקו בהצלחה ונשמרו בתיקייה <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}many{הקבצים נסרקו בהצלחה ונשמרו בתיקייה <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}other{הקבצים נסרקו בהצלחה ונשמרו בתיקייה <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}}</translation>
 <translation id="5931523347251946569">הקובץ לא נמצא</translation>
+<translation id="5972388717451707488">עדכון המנוע</translation>
 <translation id="6037291330010597344">מזין המסמכים של הסורק ריק. יש להוסיף מסמכים ולנסות שוב.</translation>
 <translation id="6040143037577758943">סגירה</translation>
 <translation id="6040852767465482106">זהות אנונימית</translation>
@@ -285,6 +289,7 @@
 <translation id="6527081081771465939">‏פרוטוקול אבטחת Wi-Fi לא מזוהה</translation>
 <translation id="65587193855025101">שטוח</translation>
 <translation id="6564646048574748301">נכשלה – לא ניתן להתחבר אל המדפסת</translation>
+<translation id="6574762126505704998">מילוי המסך</translation>
 <translation id="6603230386432466813">נתקלת בקשיים בהתחברות?</translation>
 <translation id="6618744767048954150">הבדיקה מתבצעת עכשיו</translation>
 <translation id="6620487321149975369">משימות הדפסה יופיעו תחת היסטוריה אלא אם הן הוסרו ידנית</translation>
@@ -333,6 +338,7 @@
 <translation id="7569444139234840525"><ph name="QUERY_TEXT" /> · /<ph name="PHONETICS" />/</translation>
 <translation id="7595982850646262331">הזמן שנותר: <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">מידע נוסף במרכז העזרה</translation>
+<translation id="763165478673169849">זמן האיפוס האחרון</translation>
 <translation id="7648838807254605802">‏זמן רב של אחזור HTTPS</translation>
 <translation id="7658239707568436148">ביטול</translation>
 <translation id="7690294790491645610">אישור הסיסמה החדשה</translation>
@@ -354,6 +360,7 @@
 <translation id="8075838845814659848">אחוז הסוללה שנותר לטעון</translation>
 <translation id="808894953321890993">שינוי הסיסמה</translation>
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" />‎°‎ C</translation>
+<translation id="8132480444149501833">בקשה למוני תנועה</translation>
 <translation id="8206859287963243715">סלולארי</translation>
 <translation id="8208861521865154048">הטבות</translation>
 <translation id="8214184102975786227">‏סריקה של כמה דפים בקובץ PDF אחד</translation>
@@ -375,8 +382,10 @@
 <translation id="8475690821716466388">‏רשת ה-Wi-Fi מאובטחת בפרוטוקול WEP PSK חלש</translation>
 <translation id="8477551185774834963">‏זמן האחזור של ה-DNS חורג מעט מהסף המותר</translation>
 <translation id="8483248364096924578">‏כתובת IP</translation>
+<translation id="8498220429738806196">מוני תנועה</translation>
 <translation id="8503813439785031346">שם משתמש</translation>
 <translation id="8503836310948963452">רק עוד מספר דקות…</translation>
+<translation id="8528615187455571738">Crosvm</translation>
 <translation id="8575298406870537639">ייתכן שהספק שלך ידרוש את האפשרות הזו כדי להתחבר לרשת שלו. למידע נוסף, ניתן לפנות לספק.</translation>
 <translation id="8576249514688522074">לא מאותחלת</translation>
 <translation id="8620617069779373398">סטטוס נדידה</translation>
@@ -393,6 +402,7 @@
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8818152010000655963">טפט</translation>
 <translation id="8845001906332463065">קבלת עזרה</translation>
+<translation id="8868741746785112895">GUID</translation>
 <translation id="8881098542468797602">הבדיקה הושלמה בהצלחה</translation>
 <translation id="8898840733695078011">עוצמת אות</translation>
 <translation id="8910721771319628100">רשת ברירת המחדל חורגת מסף זמן האחזור</translation>
@@ -408,6 +418,7 @@
 <translation id="9073281213608662541">PAP</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9088306295921699330">שימוש נוכחי</translation>
+<translation id="9095775724867566971">Pluginvm</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_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index 2592577..e0b9086 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -60,6 +60,7 @@
 <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation>
 <translation id="2157959690810728433">EM FILA</translation>
 <translation id="2161394479394250669">Cancelar trabalho de impressão</translation>
+<translation id="2209788852729124853">Redefinir contadores de tráfego</translation>
 <translation id="2217935453350629363">Velocidade atual</translation>
 <translation id="2224337661447660594">Sem Internet</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -120,6 +121,7 @@
 <translation id="3595596368722241419">Bateria carregada</translation>
 <translation id="360565022852130722">A rede Wi-Fi é protegida pelo protocolo fraco WEP 802.1x</translation>
 <translation id="3689839747745352263">Teste de <ph name="TEST_NAME" /></translation>
+<translation id="373232531963562220">{PAGE_NUMBER,plural, =0{Verificar novamente a página}=1{Verificar novamente a página {PAGE_NUMBER}}one{Verificar novamente a página {PAGE_NUMBER}}other{Verificar novamente a página {PAGE_NUMBER}}}</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> avaliações)</translation>
 <translation id="3748026146096797577">Não conectado</translation>
 <translation id="3749289110408117711">Nome do arquivo</translation>
@@ -151,6 +153,7 @@
 <translation id="4425149324548788773">Meu Drive</translation>
 <translation id="4429881212383817840">O tíquete do Kerberos expirará em breve</translation>
 <translation id="4431821876790500265">Ver relatório</translation>
+<translation id="4439309966561990606">{PAGE_NUMBER,plural, =0{Remover página}=1{Remover página {PAGE_NUMBER}}one{Remover página {PAGE_NUMBER}}other{Remover página {PAGE_NUMBER}}}</translation>
 <translation id="445059817448385655">Senha antiga</translation>
 <translation id="4453205916657964690">Máscara de sub-rede</translation>
 <translation id="4454245904991689773">Salvar em</translation>
@@ -248,6 +251,7 @@
 <translation id="5916084858004523819">Proibido</translation>
 <translation id="5921506667911082617">{COUNT,plural, =1{O arquivo foi digitalizado e salvo em <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}one{O arquivo foi digitalizado e salvo em <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}other{Os arquivos foram digitalizados e salvos em <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />.}}</translation>
 <translation id="5931523347251946569">Arquivo não encontrado</translation>
+<translation id="5972388717451707488">Mecanismo de atualização</translation>
 <translation id="6037291330010597344">O alimentador de documentos do scanner está vazio. Adicione documentos e tente novamente.</translation>
 <translation id="6040143037577758943">Fechar</translation>
 <translation id="6040852767465482106">Identidade anônima</translation>
@@ -285,6 +289,7 @@
 <translation id="6527081081771465939">Protocolo de segurança de Wi-Fi desconhecido</translation>
 <translation id="65587193855025101">Scanner de mesa</translation>
 <translation id="6564646048574748301">Falha - Impressora inacessível</translation>
+<translation id="6574762126505704998">Preencher</translation>
 <translation id="6603230386432466813">Problemas com a conexão?</translation>
 <translation id="6618744767048954150">Em execução</translation>
 <translation id="6620487321149975369">Os trabalhos de impressão aparecerão no histórico, a menos que sejam removidos manualmente</translation>
@@ -333,6 +338,7 @@
 <translation id="7569444139234840525"><ph name="QUERY_TEXT" /> · /<ph name="PHONETICS" />/</translation>
 <translation id="7595982850646262331">Tempo restante: <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">Saiba mais na Central de Ajuda</translation>
+<translation id="763165478673169849">Horário da última redefinição</translation>
 <translation id="7648838807254605802">Latência de HTTPS alta</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7690294790491645610">Confirmar nova senha</translation>
@@ -354,6 +360,7 @@
 <translation id="8075838845814659848">Carga restante</translation>
 <translation id="808894953321890993">Alterar senha</translation>
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" /> °C</translation>
+<translation id="8132480444149501833">Solicitar contadores de tráfego</translation>
 <translation id="8206859287963243715">Celular</translation>
 <translation id="8208861521865154048">Benefícios</translation>
 <translation id="8214184102975786227">Digitalizar várias páginas em um PDF</translation>
@@ -375,8 +382,10 @@
 <translation id="8475690821716466388">A rede Wi-Fi é protegida pelo protocolo fraco WEP PSK</translation>
 <translation id="8477551185774834963">Latência do DNS um pouco acima do limite permitido</translation>
 <translation id="8483248364096924578">Endereço IP</translation>
+<translation id="8498220429738806196">Contadores de tráfego</translation>
 <translation id="8503813439785031346">Nome de usuário</translation>
 <translation id="8503836310948963452">Só mais alguns minutos…</translation>
+<translation id="8528615187455571738">Crosvm</translation>
 <translation id="8575298406870537639">Pode ser necessário ativar esta opção para se conectar à rede da sua operadora. Entre em contato com a operadora para mais informações.</translation>
 <translation id="8576249514688522074">Não inicializado</translation>
 <translation id="8620617069779373398">Status do roaming</translation>
@@ -393,6 +402,7 @@
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8818152010000655963">Plano de fundo</translation>
 <translation id="8845001906332463065">Ajuda</translation>
+<translation id="8868741746785112895">GUID</translation>
 <translation id="8881098542468797602">Teste bem sucedido</translation>
 <translation id="8898840733695078011">Intensidade do sinal</translation>
 <translation id="8910721771319628100">Rede padrão acima do limite de latência</translation>
@@ -408,6 +418,7 @@
 <translation id="9073281213608662541">PAP</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9088306295921699330">Uso atual</translation>
+<translation id="9095775724867566971">Pluginvm</translation>
 <translation id="910415269708673980">Atualizar tíquete para <ph name="PRINCIPAL_NAME" /></translation>
 <translation id="9106415115617144481">Digitalizando página <ph name="PAGE_NUMBER" /></translation>
 <translation id="9111102763498581341">Desbloquear</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index acbce85..9d59739 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -60,6 +60,7 @@
 <translation id="2141644705054017895">%<ph name="PERCENTAGE_VALUE" /></translation>
 <translation id="2157959690810728433">SIRAYA ALINDI</translation>
 <translation id="2161394479394250669">Yazdırma işini iptal et</translation>
+<translation id="2209788852729124853">Trafik Sayaçlarını Sıfırla</translation>
 <translation id="2217935453350629363">Şu anki hız</translation>
 <translation id="2224337661447660594">İnternet bağlantısı yok</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -120,6 +121,7 @@
 <translation id="3595596368722241419">Pil tam dolu</translation>
 <translation id="360565022852130722">Kablosuz ağ, zayıf bir protokol olan WEP 802.1x ile güvenlik altına alınmış</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" /> testi</translation>
+<translation id="373232531963562220">{PAGE_NUMBER,plural, =0{Sayfayı yeniden tara}=1{{PAGE_NUMBER}. sayfayı yeniden tara}other{{PAGE_NUMBER}. sayfayı yeniden tara}}</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> yorum)</translation>
 <translation id="3748026146096797577">Bağlı Değil</translation>
 <translation id="3749289110408117711">Dosya adı</translation>
@@ -151,6 +153,7 @@
 <translation id="4425149324548788773">Drive'ım</translation>
 <translation id="4429881212383817840">Kerberos biletinin süresi yakında doluyor</translation>
 <translation id="4431821876790500265">Raporu göster</translation>
+<translation id="4439309966561990606">{PAGE_NUMBER,plural, =0{Sayfayı kaldır}=1{{PAGE_NUMBER}. sayfayı kaldır}other{{PAGE_NUMBER}. sayfayı kaldır}}</translation>
 <translation id="445059817448385655">Eski şifre</translation>
 <translation id="4453205916657964690">Alt ağ maskesi</translation>
 <translation id="4454245904991689773">Taramayı şuraya kaydet:</translation>
@@ -248,6 +251,7 @@
 <translation id="5916084858004523819">Yasak</translation>
 <translation id="5921506667911082617">{COUNT,plural, =1{Dosyanız başarıyla taranarak <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> klasörüne kaydedildi.}other{Dosyalarınız başarıyla taranarak <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> klasörüne kaydedildi.}}</translation>
 <translation id="5931523347251946569">Dosya bulunamadı</translation>
+<translation id="5972388717451707488">Update Engine</translation>
 <translation id="6037291330010597344">Tarayıcının doküman besleyicisi boş. Doküman ekleyip tekrar deneyin.</translation>
 <translation id="6040143037577758943">Kapat</translation>
 <translation id="6040852767465482106">Anonim Kimlik</translation>
@@ -285,6 +289,7 @@
 <translation id="6527081081771465939">Bilinmeyen kablosuz ağ güvenlik protokolü</translation>
 <translation id="65587193855025101">Düz Yataklı</translation>
 <translation id="6564646048574748301">İşlem başarısız - Yazıcıya ulaşılamıyor</translation>
+<translation id="6574762126505704998">Tam kaplama</translation>
 <translation id="6603230386432466813">Bağlanmayla ilgili sorun mu yaşıyorsunuz?</translation>
 <translation id="6618744767048954150">Çalışıyor</translation>
 <translation id="6620487321149975369">Yazdırma işleri, manuel olarak kaldırılmadığı sürece geçmişte görünür</translation>
@@ -333,6 +338,7 @@
 <translation id="7569444139234840525"><ph name="QUERY_TEXT" /> · /<ph name="PHONETICS" />/</translation>
 <translation id="7595982850646262331"><ph name="TIME_VALUE" /> kaldı</translation>
 <translation id="7620771111601174153">Yardım Merkezi'nde daha fazla bilgi edinin</translation>
+<translation id="763165478673169849">Son Sıfırlanma Zamanı</translation>
 <translation id="7648838807254605802">Yüksek HTTPS gecikmesi</translation>
 <translation id="7658239707568436148">İptal</translation>
 <translation id="7690294790491645610">Yeni şifreyi doğrula</translation>
@@ -354,6 +360,7 @@
 <translation id="8075838845814659848">Kalan şarj seviyesi</translation>
 <translation id="808894953321890993">Şifreyi değiştir</translation>
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" />° C</translation>
+<translation id="8132480444149501833">Trafik Sayaçlarını İste</translation>
 <translation id="8206859287963243715">Cep telefonu</translation>
 <translation id="8208861521865154048">Avantajlar</translation>
 <translation id="8214184102975786227">Birden fazla sayfayı tek bir PDF olarak tarayın</translation>
@@ -375,8 +382,10 @@
 <translation id="8475690821716466388">Kablosuz ağ, zayıf bir protokol olan WEP PSK ile güvenlik altına alınmış</translation>
 <translation id="8477551185774834963">DNS gecikmesi, izin verilen eşiğin biraz üzerinde</translation>
 <translation id="8483248364096924578">IP adresi</translation>
+<translation id="8498220429738806196">Trafik Sayaçları</translation>
 <translation id="8503813439785031346">Kullanıcı adı</translation>
 <translation id="8503836310948963452">Sadece birkaç dakika kaldı…</translation>
+<translation id="8528615187455571738">Crosvm</translation>
 <translation id="8575298406870537639">Operatörünüz, ağlarına bağlanmak için bu seçeneği gerektirebilir. Ayrıntılı bilgiler için operatörünüzle iletişime geçin.</translation>
 <translation id="8576249514688522074">Başlatılmamış</translation>
 <translation id="8620617069779373398">Dolaşım durumu</translation>
@@ -393,6 +402,7 @@
 <translation id="8814190375133053267">Kablosuz</translation>
 <translation id="8818152010000655963">Duvar kağıdı</translation>
 <translation id="8845001906332463065">Yardım alın</translation>
+<translation id="8868741746785112895">GUID</translation>
 <translation id="8881098542468797602">Test başarılı oldu</translation>
 <translation id="8898840733695078011">Sinyal gücü</translation>
 <translation id="8910721771319628100">Varsayılan ağ, gecikme eşiğini aştı</translation>
@@ -408,6 +418,7 @@
 <translation id="9073281213608662541">PAP</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9088306295921699330">Mevcut kullanım</translation>
+<translation id="9095775724867566971">Pluginvm</translation>
 <translation id="910415269708673980"><ph name="PRINCIPAL_NAME" /> için bileti yenileyin</translation>
 <translation id="9106415115617144481"><ph name="PAGE_NUMBER" />. sayfa taranıyor</translation>
 <translation id="9111102763498581341">Kilidi Aç</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index 19f7a84..a1b13b23 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -60,6 +60,7 @@
 <translation id="2141644705054017895"><ph name="PERCENTAGE_VALUE" />%</translation>
 <translation id="2157959690810728433">已排入佇列</translation>
 <translation id="2161394479394250669">取消列印工作</translation>
+<translation id="2209788852729124853">重設流量計數器</translation>
 <translation id="2217935453350629363">目前速度</translation>
 <translation id="2224337661447660594">沒有網際網路連線</translation>
 <translation id="2230051135190148440">CHAP</translation>
@@ -120,6 +121,7 @@
 <translation id="3595596368722241419">電池已充滿</translation>
 <translation id="360565022852130722">已使用防護力較弱的通訊協定 WEP 802.1x 保護 Wi-Fi 網路</translation>
 <translation id="3689839747745352263"><ph name="TEST_NAME" />測試</translation>
+<translation id="373232531963562220">{PAGE_NUMBER,plural, =0{重新掃描頁面}=1{重新掃描第 {PAGE_NUMBER} 頁}other{重新掃描第 {PAGE_NUMBER} 頁}}</translation>
 <translation id="3740976234706877572"><ph name="AVERAGE_SCORE" /> ★ (<ph name="AGGREGATED_COUNT" /> 則評論)</translation>
 <translation id="3748026146096797577">尚未連線</translation>
 <translation id="3749289110408117711">檔案名稱</translation>
@@ -151,6 +153,7 @@
 <translation id="4425149324548788773">我的雲端硬碟</translation>
 <translation id="4429881212383817840">Kerberos 票證即將到期</translation>
 <translation id="4431821876790500265">查看報告</translation>
+<translation id="4439309966561990606">{PAGE_NUMBER,plural, =0{移除頁面}=1{移除第 {PAGE_NUMBER} 頁}other{移除第 {PAGE_NUMBER} 頁}}</translation>
 <translation id="445059817448385655">舊密碼</translation>
 <translation id="4453205916657964690">子網路遮罩</translation>
 <translation id="4454245904991689773">掃描檔案儲存位置</translation>
@@ -248,6 +251,7 @@
 <translation id="5916084858004523819">禁止</translation>
 <translation id="5921506667911082617">{COUNT,plural, =1{檔案掃描完成,現已存放在「<ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />」資料夾。}other{檔案掃描完成,現已存放在「<ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" />」資料夾。}}</translation>
 <translation id="5931523347251946569">找不到檔案</translation>
+<translation id="5972388717451707488">Update Engine</translation>
 <translation id="6037291330010597344">掃描器的文件送紙器是空的。請新增文件,然後再試一次。</translation>
 <translation id="6040143037577758943">關閉</translation>
 <translation id="6040852767465482106">匿名身分</translation>
@@ -285,6 +289,7 @@
 <translation id="6527081081771465939">Wi-Fi 安全通訊協定不明</translation>
 <translation id="65587193855025101">平台式</translation>
 <translation id="6564646048574748301">失敗 - 無法連上印表機</translation>
+<translation id="6574762126505704998">填滿</translation>
 <translation id="6603230386432466813">連線時遇到問題嗎?</translation>
 <translation id="6618744767048954150">檢查中</translation>
 <translation id="6620487321149975369">除非手動移除列印工作,否則這項資料會顯示在歷史記錄中</translation>
@@ -333,6 +338,7 @@
 <translation id="7569444139234840525"><ph name="QUERY_TEXT" /> · /<ph name="PHONETICS" />/</translation>
 <translation id="7595982850646262331">還剩 <ph name="TIME_VALUE" /></translation>
 <translation id="7620771111601174153">前往說明中心瞭解詳情</translation>
+<translation id="763165478673169849">上次重設時間</translation>
 <translation id="7648838807254605802">高 HTTPS 延遲</translation>
 <translation id="7658239707568436148">取消</translation>
 <translation id="7690294790491645610">確認新密碼</translation>
@@ -354,6 +360,7 @@
 <translation id="8075838845814659848">剩餘電量</translation>
 <translation id="808894953321890993">變更密碼</translation>
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" />° C</translation>
+<translation id="8132480444149501833">要求流量計數器</translation>
 <translation id="8206859287963243715">手機</translation>
 <translation id="8208861521865154048">獎勵</translation>
 <translation id="8214184102975786227">掃描多個頁面並合併為一個 PDF 檔</translation>
@@ -375,8 +382,10 @@
 <translation id="8475690821716466388">已使用防護力較弱的通訊協定 WEP PSK 保護 Wi-Fi 網路</translation>
 <translation id="8477551185774834963">DNS 延遲時間稍微超過允許的門檻</translation>
 <translation id="8483248364096924578">IP 位址</translation>
+<translation id="8498220429738806196">流量計數器</translation>
 <translation id="8503813439785031346">使用者名稱</translation>
 <translation id="8503836310948963452">請稍待幾分鐘…</translation>
+<translation id="8528615187455571738">Crosvm</translation>
 <translation id="8575298406870537639">你的電信業者可能會要求你必須選擇此選項才能連線至他們的網路。如要瞭解詳情,請洽詢你的電信業者。</translation>
 <translation id="8576249514688522074">未初始化</translation>
 <translation id="8620617069779373398">漫遊狀態</translation>
@@ -393,6 +402,7 @@
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8818152010000655963">桌布</translation>
 <translation id="8845001906332463065">尋求協助</translation>
+<translation id="8868741746785112895">GUID</translation>
 <translation id="8881098542468797602">已通過測試</translation>
 <translation id="8898840733695078011">訊號強度</translation>
 <translation id="8910721771319628100">預設網路超過延遲門檻</translation>
@@ -408,6 +418,7 @@
 <translation id="9073281213608662541">PAP</translation>
 <translation id="9074739597929991885">藍牙</translation>
 <translation id="9088306295921699330">目前用量</translation>
+<translation id="9095775724867566971">Pluginvm</translation>
 <translation id="910415269708673980">更新 <ph name="PRINCIPAL_NAME" /> 的票證</translation>
 <translation id="9106415115617144481">正在掃描第 <ph name="PAGE_NUMBER" /> 頁</translation>
 <translation id="9111102763498581341">解除鎖定</translation>
diff --git a/components/account_manager_core/BUILD.gn b/components/account_manager_core/BUILD.gn
index b20d05c..5a58d76 100644
--- a/components/account_manager_core/BUILD.gn
+++ b/components/account_manager_core/BUILD.gn
@@ -24,8 +24,8 @@
     "chromeos/access_token_fetcher.h",
     "chromeos/account_manager.cc",
     "chromeos/account_manager.h",
-    "chromeos/account_manager_ash.cc",
-    "chromeos/account_manager_ash.h",
+    "chromeos/account_manager_mojo_service.cc",
+    "chromeos/account_manager_mojo_service.h",
     "chromeos/account_manager_ui.cc",
     "chromeos/account_manager_ui.h",
     "pref_names.cc",
@@ -62,7 +62,7 @@
 
   sources = [
     "account_manager_facade_impl_unittest.cc",
-    "chromeos/account_manager_ash_unittest.cc",
+    "chromeos/account_manager_mojo_service_unittest.cc",
     "chromeos/account_manager_unittest.cc",
   ]
 
diff --git a/components/account_manager_core/DEPS b/components/account_manager_core/DEPS
index 6fc7e71..bbcf38f 100644
--- a/components/account_manager_core/DEPS
+++ b/components/account_manager_core/DEPS
@@ -11,7 +11,7 @@
    'account_manager_unittest.cc': [
       '+services/network/test/test_url_loader_factory.h',
    ],
-  'account_manager_ash_unittest.cc': [
+  'account_manager_mojo_service_unittest.cc': [
       '+chromeos/crosapi/mojom/account_manager.mojom-test-utils.h',
       '+services/network/test/test_url_loader_factory.h',
    ],
diff --git a/components/account_manager_core/account_manager_facade_impl_unittest.cc b/components/account_manager_core/account_manager_facade_impl_unittest.cc
index 76dcfc46..14b9b00 100644
--- a/components/account_manager_core/account_manager_facade_impl_unittest.cc
+++ b/components/account_manager_core/account_manager_facade_impl_unittest.cc
@@ -333,8 +333,9 @@
   run_loop.Run();
 }
 
-TEST_F(AccountManagerFacadeImplTest,
-       GetAccountsReturnsEmptyListOfAccountsWhenAccountManagerAshIsEmpty) {
+TEST_F(
+    AccountManagerFacadeImplTest,
+    GetAccountsReturnsEmptyListOfAccountsWhenAccountManagerMojoServiceIsEmpty) {
   std::unique_ptr<AccountManagerFacadeImpl> account_manager_facade =
       CreateFacade();
   account_manager().SetAccounts({});
diff --git a/components/account_manager_core/chromeos/account_manager_ash.cc b/components/account_manager_core/chromeos/account_manager_mojo_service.cc
similarity index 81%
rename from components/account_manager_core/chromeos/account_manager_ash.cc
rename to components/account_manager_core/chromeos/account_manager_mojo_service.cc
index b5fb2090..ece29f4 100644
--- a/components/account_manager_core/chromeos/account_manager_ash.cc
+++ b/components/account_manager_core/chromeos/account_manager_mojo_service.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/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 
 #include <algorithm>
 #include <memory>
@@ -51,45 +51,45 @@
 
 }  // namespace
 
-AccountManagerAsh::AccountManagerAsh(
+AccountManagerMojoService::AccountManagerMojoService(
     account_manager::AccountManager* account_manager)
     : account_manager_(account_manager) {
   DCHECK(account_manager_);
   account_manager_->AddObserver(this);
 }
 
-AccountManagerAsh::~AccountManagerAsh() {
+AccountManagerMojoService::~AccountManagerMojoService() {
   account_manager_->RemoveObserver(this);
 }
 
-void AccountManagerAsh::BindReceiver(
+void AccountManagerMojoService::BindReceiver(
     mojo::PendingReceiver<mojom::AccountManager> receiver) {
   receivers_.Add(this, std::move(receiver));
 }
 
-void AccountManagerAsh::SetAccountManagerUI(
+void AccountManagerMojoService::SetAccountManagerUI(
     std::unique_ptr<account_manager::AccountManagerUI> account_manager_ui) {
   account_manager_ui_ = std::move(account_manager_ui);
 }
 
-void AccountManagerAsh::IsInitialized(IsInitializedCallback callback) {
+void AccountManagerMojoService::IsInitialized(IsInitializedCallback callback) {
   std::move(callback).Run(account_manager_->IsInitialized());
 }
 
-void AccountManagerAsh::AddObserver(AddObserverCallback callback) {
+void AccountManagerMojoService::AddObserver(AddObserverCallback callback) {
   mojo::Remote<mojom::AccountManagerObserver> remote;
   auto receiver = remote.BindNewPipeAndPassReceiver();
   observers_.Add(std::move(remote));
   std::move(callback).Run(std::move(receiver));
 }
 
-void AccountManagerAsh::GetAccounts(
+void AccountManagerMojoService::GetAccounts(
     mojom::AccountManager::GetAccountsCallback callback) {
   account_manager_->GetAccounts(
       base::BindOnce(&MarshalAccounts, std::move(callback)));
 }
 
-void AccountManagerAsh::GetPersistentErrorForAccount(
+void AccountManagerMojoService::GetPersistentErrorForAccount(
     mojom::AccountKeyPtr mojo_account_key,
     mojom::AccountManager::GetPersistentErrorForAccountCallback callback) {
   absl::optional<account_manager::AccountKey> maybe_account_key =
@@ -102,7 +102,7 @@
                      std::move(callback)));
 }
 
-void AccountManagerAsh::ShowAddAccountDialog(
+void AccountManagerMojoService::ShowAddAccountDialog(
     ShowAddAccountDialogCallback callback) {
   DCHECK(account_manager_ui_);
   if (account_manager_ui_->IsDialogShown()) {
@@ -117,12 +117,13 @@
   account_addition_in_progress_ = true;
   account_addition_callback_ = std::move(callback);
   account_manager_ui_->ShowAddAccountDialog(
-      base::BindOnce(&AccountManagerAsh::OnAddAccountDialogClosed,
+      base::BindOnce(&AccountManagerMojoService::OnAddAccountDialogClosed,
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void AccountManagerAsh::ShowReauthAccountDialog(const std::string& email,
-                                                base::OnceClosure closure) {
+void AccountManagerMojoService::ShowReauthAccountDialog(
+    const std::string& email,
+    base::OnceClosure closure) {
   DCHECK(account_manager_ui_);
   if (account_manager_ui_->IsDialogShown())
     return;
@@ -130,11 +131,11 @@
   account_manager_ui_->ShowReauthAccountDialog(email, std::move(closure));
 }
 
-void AccountManagerAsh::ShowManageAccountsSettings() {
+void AccountManagerMojoService::ShowManageAccountsSettings() {
   account_manager_ui_->ShowManageAccountsSettings();
 }
 
-void AccountManagerAsh::CreateAccessTokenFetcher(
+void AccountManagerMojoService::CreateAccessTokenFetcher(
     mojom::AccountKeyPtr mojo_account_key,
     const std::string& oauth_consumer_name,
     CreateAccessTokenFetcherCallback callback) {
@@ -146,26 +147,27 @@
   auto access_token_fetcher = std::make_unique<AccessTokenFetcher>(
       account_manager_, std::move(mojo_account_key), oauth_consumer_name,
       /*done_closure=*/
-      base::BindOnce(&AccountManagerAsh::DeletePendingAccessTokenFetchRequest,
-                     weak_ptr_factory_.GetWeakPtr()),
+      base::BindOnce(
+          &AccountManagerMojoService::DeletePendingAccessTokenFetchRequest,
+          weak_ptr_factory_.GetWeakPtr()),
       /*receiver=*/pending_remote.InitWithNewPipeAndPassReceiver());
   pending_access_token_requests_.emplace_back(std::move(access_token_fetcher));
   std::move(callback).Run(std::move(pending_remote));
 }
 
-void AccountManagerAsh::OnTokenUpserted(
+void AccountManagerMojoService::OnTokenUpserted(
     const account_manager::Account& account) {
   for (auto& observer : observers_)
     observer->OnTokenUpserted(ToMojoAccount(account));
 }
 
-void AccountManagerAsh::OnAccountRemoved(
+void AccountManagerMojoService::OnAccountRemoved(
     const account_manager::Account& account) {
   for (auto& observer : observers_)
     observer->OnAccountRemoved(ToMojoAccount(account));
 }
 
-void AccountManagerAsh::OnAccountAdditionFinished(
+void AccountManagerMojoService::OnAccountAdditionFinished(
     const account_manager::AccountAdditionResult& result) {
   if (!account_addition_in_progress_)
     return;
@@ -173,7 +175,7 @@
   FinishAddAccount(result);
 }
 
-void AccountManagerAsh::OnAddAccountDialogClosed() {
+void AccountManagerMojoService::OnAddAccountDialogClosed() {
   if (!account_addition_in_progress_)
     return;
 
@@ -183,7 +185,7 @@
       account_manager::AccountAdditionResult::Status::kCancelledByUser));
 }
 
-void AccountManagerAsh::FinishAddAccount(
+void AccountManagerMojoService::FinishAddAccount(
     const account_manager::AccountAdditionResult& result) {
   account_addition_in_progress_ = false;
 
@@ -192,7 +194,7 @@
       .Run(ToMojoAccountAdditionResult(result));
 }
 
-void AccountManagerAsh::DeletePendingAccessTokenFetchRequest(
+void AccountManagerMojoService::DeletePendingAccessTokenFetchRequest(
     AccessTokenFetcher* request) {
   pending_access_token_requests_.erase(
       std::remove_if(
@@ -203,11 +205,11 @@
       pending_access_token_requests_.end());
 }
 
-void AccountManagerAsh::FlushMojoForTesting() {
+void AccountManagerMojoService::FlushMojoForTesting() {
   observers_.FlushForTesting();
 }
 
-int AccountManagerAsh::GetNumPendingAccessTokenRequests() const {
+int AccountManagerMojoService::GetNumPendingAccessTokenRequests() const {
   return pending_access_token_requests_.size();
 }
 
diff --git a/components/account_manager_core/chromeos/account_manager_ash.h b/components/account_manager_core/chromeos/account_manager_mojo_service.h
similarity index 87%
rename from components/account_manager_core/chromeos/account_manager_ash.h
rename to components/account_manager_core/chromeos/account_manager_mojo_service.h
index 3745fe3..4a9989b 100644
--- a/components/account_manager_core/chromeos/account_manager_ash.h
+++ b/components/account_manager_core/chromeos/account_manager_mojo_service.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_ACCOUNT_MANAGER_CORE_CHROMEOS_ACCOUNT_MANAGER_ASH_H_
-#define COMPONENTS_ACCOUNT_MANAGER_CORE_CHROMEOS_ACCOUNT_MANAGER_ASH_H_
+#ifndef COMPONENTS_ACCOUNT_MANAGER_CORE_CHROMEOS_ACCOUNT_MANAGER_MOJO_SERVICE_H_
+#define COMPONENTS_ACCOUNT_MANAGER_CORE_CHROMEOS_ACCOUNT_MANAGER_MOJO_SERVICE_H_
 
 #include <memory>
 #include <vector>
@@ -29,14 +29,16 @@
 // Implements the |crosapi::mojom::AccountManager| interface in ash-chrome.
 // It enables lacros-chrome to interact with accounts stored in the Chrome OS
 // Account Manager.
-class COMPONENT_EXPORT(ACCOUNT_MANAGER_CORE) AccountManagerAsh
+class COMPONENT_EXPORT(ACCOUNT_MANAGER_CORE) AccountManagerMojoService
     : public mojom::AccountManager,
       public account_manager::AccountManager::Observer {
  public:
-  explicit AccountManagerAsh(account_manager::AccountManager* account_manager);
-  AccountManagerAsh(const AccountManagerAsh&) = delete;
-  AccountManagerAsh& operator=(const AccountManagerAsh&) = delete;
-  ~AccountManagerAsh() override;
+  explicit AccountManagerMojoService(
+      account_manager::AccountManager* account_manager);
+  AccountManagerMojoService(const AccountManagerMojoService&) = delete;
+  AccountManagerMojoService& operator=(const AccountManagerMojoService&) =
+      delete;
+  ~AccountManagerMojoService() override;
 
   void BindReceiver(mojo::PendingReceiver<mojom::AccountManager> receiver);
 
@@ -64,7 +66,7 @@
   void OnAccountRemoved(const account_manager::Account& account) override;
 
  private:
-  friend class AccountManagerAshTest;
+  friend class AccountManagerMojoServiceTest;
   friend class TestAccountManagerObserver;
   friend class AccountManagerFacadeAshTest;
   friend class chromeos::SigninHelper;
@@ -95,9 +97,9 @@
   mojo::ReceiverSet<mojom::AccountManager> receivers_;
   mojo::RemoteSet<mojom::AccountManagerObserver> observers_;
 
-  base::WeakPtrFactory<AccountManagerAsh> weak_ptr_factory_{this};
+  base::WeakPtrFactory<AccountManagerMojoService> weak_ptr_factory_{this};
 };
 
 }  // namespace crosapi
 
-#endif  // COMPONENTS_ACCOUNT_MANAGER_CORE_CHROMEOS_ACCOUNT_MANAGER_ASH_H_
+#endif  // COMPONENTS_ACCOUNT_MANAGER_CORE_CHROMEOS_ACCOUNT_MANAGER_MOJO_SERVICE_H_
diff --git a/components/account_manager_core/chromeos/account_manager_ash_unittest.cc b/components/account_manager_core/chromeos/account_manager_mojo_service_unittest.cc
similarity index 91%
rename from components/account_manager_core/chromeos/account_manager_ash_unittest.cc
rename to components/account_manager_core/chromeos/account_manager_mojo_service_unittest.cc
index f50940b..c8d55804 100644
--- a/components/account_manager_core/chromeos/account_manager_ash_unittest.cc
+++ b/components/account_manager_core/chromeos/account_manager_mojo_service_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 "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 
 #include <cstddef>
 #include <memory>
@@ -200,28 +200,32 @@
   mutable account_manager::AccountKey last_access_token_account_key_;
 };
 
-class AccountManagerAshTest : public ::testing::Test {
+class AccountManagerMojoServiceTest : public ::testing::Test {
  public:
-  AccountManagerAshTest() = default;
-  AccountManagerAshTest(const AccountManagerAshTest&) = delete;
-  AccountManagerAshTest& operator=(const AccountManagerAshTest&) = delete;
-  ~AccountManagerAshTest() override = default;
+  AccountManagerMojoServiceTest() = default;
+  AccountManagerMojoServiceTest(const AccountManagerMojoServiceTest&) = delete;
+  AccountManagerMojoServiceTest& operator=(
+      const AccountManagerMojoServiceTest&) = delete;
+  ~AccountManagerMojoServiceTest() override = default;
 
  protected:
   void SetUp() override {
-    account_manager_ash_ =
-        std::make_unique<AccountManagerAsh>(&account_manager_);
-    account_manager_ash_->SetAccountManagerUI(
+    account_manager_mojo_service_ =
+        std::make_unique<AccountManagerMojoService>(&account_manager_);
+    account_manager_mojo_service_->SetAccountManagerUI(
         std::make_unique<FakeAccountManagerUI>());
-    account_manager_ash_->BindReceiver(remote_.BindNewPipeAndPassReceiver());
+    account_manager_mojo_service_->BindReceiver(
+        remote_.BindNewPipeAndPassReceiver());
     account_manager_async_waiter_ =
         std::make_unique<mojom::AccountManagerAsyncWaiter>(
-            account_manager_ash_.get());
+            account_manager_mojo_service_.get());
   }
 
   void RunAllPendingTasks() { task_environment_.RunUntilIdle(); }
 
-  void FlushMojoForTesting() { account_manager_ash_->FlushMojoForTesting(); }
+  void FlushMojoForTesting() {
+    account_manager_mojo_service_->FlushMojoForTesting();
+  }
 
   // Returns |true| if initialization was successful.
   bool InitializeAccountManager() {
@@ -236,13 +240,13 @@
 
   FakeAccountManagerUI* GetFakeAccountManagerUI() {
     return static_cast<FakeAccountManagerUI*>(
-        account_manager_ash_->account_manager_ui_.get());
+        account_manager_mojo_service_->account_manager_ui_.get());
   }
 
   mojom::AccountAdditionResultPtr ShowAddAccountDialog(
       base::OnceClosure quit_closure) {
     auto add_account_result = mojom::AccountAdditionResult::New();
-    account_manager_ash_->ShowAddAccountDialog(base::BindOnce(
+    account_manager_mojo_service_->ShowAddAccountDialog(base::BindOnce(
         [](base::OnceClosure quit_closure,
            mojom::AccountAdditionResultPtr* add_account_result,
            mojom::AccountAdditionResultPtr result) {
@@ -256,18 +260,18 @@
 
   void ShowReauthAccountDialog(const std::string& email,
                                base::OnceClosure close_dialog_closure) {
-    account_manager_ash_->ShowReauthAccountDialog(
+    account_manager_mojo_service_->ShowReauthAccountDialog(
         email, std::move(close_dialog_closure));
   }
 
   void CallAccountAdditionFinished(
       const account_manager::AccountAdditionResult& result) {
-    account_manager_ash_->OnAccountAdditionFinished(result);
+    account_manager_mojo_service_->OnAccountAdditionFinished(result);
     GetFakeAccountManagerUI()->CloseDialog();
   }
 
   void ShowManageAccountsSettings() {
-    account_manager_ash_->ShowManageAccountsSettings();
+    account_manager_mojo_service_->ShowManageAccountsSettings();
   }
 
   mojom::AccessTokenResultPtr FetchAccessToken(
@@ -305,11 +309,11 @@
   }
 
   int GetNumObservers() const {
-    return account_manager_ash_->observers_.size();
+    return account_manager_mojo_service_->observers_.size();
   }
 
   int GetNumPendingAccessTokenRequests() const {
-    return account_manager_ash_->GetNumPendingAccessTokenRequests();
+    return account_manager_mojo_service_->GetNumPendingAccessTokenRequests();
   }
 
   mojom::AccountManagerAsyncWaiter* account_manager_async_waiter() {
@@ -325,19 +329,19 @@
   TestingPrefServiceSimple pref_service_;
   AccountManagerSpy account_manager_;
   mojo::Remote<mojom::AccountManager> remote_;
-  std::unique_ptr<AccountManagerAsh> account_manager_ash_;
+  std::unique_ptr<AccountManagerMojoService> account_manager_mojo_service_;
   std::unique_ptr<mojom::AccountManagerAsyncWaiter>
       account_manager_async_waiter_;
 };
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        IsInitializedReturnsFalseForUninitializedAccountManager) {
   bool is_initialized = true;
   account_manager_async_waiter()->IsInitialized(&is_initialized);
   EXPECT_FALSE(is_initialized);
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        IsInitializedReturnsTrueForInitializedAccountManager) {
   bool is_initialized = true;
   account_manager_async_waiter()->IsInitialized(&is_initialized);
@@ -348,7 +352,7 @@
 }
 
 // Test that lacros remotes do not leak.
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        LacrosRemotesAreAutomaticallyRemovedOnConnectionClose) {
   EXPECT_EQ(0, GetNumObservers());
   {
@@ -361,7 +365,8 @@
   EXPECT_EQ(0, GetNumObservers());
 }
 
-TEST_F(AccountManagerAshTest, LacrosObserversAreNotifiedOnAccountUpdates) {
+TEST_F(AccountManagerMojoServiceTest,
+       LacrosObserversAreNotifiedOnAccountUpdates) {
   const account_manager::AccountKey kTestAccountKey{
       kFakeGaiaId, account_manager::AccountType::kGaia};
   ASSERT_TRUE(InitializeAccountManager());
@@ -377,7 +382,8 @@
   EXPECT_EQ(kFakeEmail, observer.GetLastUpsertedAccount().raw_email);
 }
 
-TEST_F(AccountManagerAshTest, LacrosObserversAreNotifiedOnAccountRemovals) {
+TEST_F(AccountManagerMojoServiceTest,
+       LacrosObserversAreNotifiedOnAccountRemovals) {
   const account_manager::AccountKey kTestAccountKey{
       kFakeGaiaId, account_manager::AccountType::kGaia};
   ASSERT_TRUE(InitializeAccountManager());
@@ -395,7 +401,7 @@
   EXPECT_EQ(kFakeEmail, observer.GetLastRemovedAccount().raw_email);
 }
 
-TEST_F(AccountManagerAshTest, GetAccounts) {
+TEST_F(AccountManagerMojoServiceTest, GetAccounts) {
   ASSERT_TRUE(InitializeAccountManager());
   {
     std::vector<mojom::AccountPtr> accounts;
@@ -414,7 +420,7 @@
   EXPECT_EQ(mojom::AccountType::kGaia, accounts[0]->key->account_type);
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        ShowAddAccountDialogReturnsInProgressIfDialogIsOpen) {
   EXPECT_EQ(0, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
   GetFakeAccountManagerUI()->SetIsDialogShown(true);
@@ -429,7 +435,7 @@
   EXPECT_EQ(0, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        ShowAddAccountDialogReturnsCancelledAfterDialogIsClosed) {
   EXPECT_EQ(0, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
   GetFakeAccountManagerUI()->SetIsDialogShown(false);
@@ -448,7 +454,7 @@
   EXPECT_EQ(1, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        ShowAddAccountDialogReturnsSuccessAfterAccountIsAdded) {
   EXPECT_EQ(0, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
   GetFakeAccountManagerUI()->SetIsDialogShown(false);
@@ -476,7 +482,8 @@
   EXPECT_EQ(1, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest, ShowAddAccountDialogCanHandleMultipleCalls) {
+TEST_F(AccountManagerMojoServiceTest,
+       ShowAddAccountDialogCanHandleMultipleCalls) {
   EXPECT_EQ(0, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
   GetFakeAccountManagerUI()->SetIsDialogShown(false);
 
@@ -511,7 +518,7 @@
   EXPECT_EQ(1, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        ShowAddAccountDialogCanHandleMultipleSequentialCalls) {
   EXPECT_EQ(0, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
   GetFakeAccountManagerUI()->SetIsDialogShown(false);
@@ -556,7 +563,7 @@
   EXPECT_EQ(2, GetFakeAccountManagerUI()->show_account_addition_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        ShowReauthAccountDialogDoesntCallTheDialogIfItsAlreadyShown) {
   EXPECT_EQ(
       0,
@@ -574,7 +581,7 @@
       GetFakeAccountManagerUI()->show_account_reauthentication_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest, ShowReauthAccountDialogOpensTheDialog) {
+TEST_F(AccountManagerMojoServiceTest, ShowReauthAccountDialogOpensTheDialog) {
   EXPECT_EQ(
       0,
       GetFakeAccountManagerUI()->show_account_reauthentication_dialog_calls());
@@ -591,7 +598,7 @@
       GetFakeAccountManagerUI()->show_account_reauthentication_dialog_calls());
 }
 
-TEST_F(AccountManagerAshTest, ShowManageAccountSettingsTest) {
+TEST_F(AccountManagerMojoServiceTest, ShowManageAccountSettingsTest) {
   EXPECT_EQ(0,
             GetFakeAccountManagerUI()->show_manage_accounts_settings_calls());
   ShowManageAccountsSettings();
@@ -599,7 +606,7 @@
             GetFakeAccountManagerUI()->show_manage_accounts_settings_calls());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        FetchingAccessTokenResultsInErrorForInvalidAccountKey) {
   ASSERT_TRUE(InitializeAccountManager());
   EXPECT_EQ(0, GetNumPendingAccessTokenRequests());
@@ -616,7 +623,7 @@
   EXPECT_EQ(0, GetNumPendingAccessTokenRequests());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        FetchingAccessTokenResultsInErrorForActiveDirectoryAccounts) {
   ASSERT_TRUE(InitializeAccountManager());
   EXPECT_EQ(0, GetNumPendingAccessTokenRequests());
@@ -633,7 +640,7 @@
   EXPECT_EQ(0, GetNumPendingAccessTokenRequests());
 }
 
-TEST_F(AccountManagerAshTest,
+TEST_F(AccountManagerMojoServiceTest,
        FetchingAccessTokenResultsInErrorForUnknownAccountKey) {
   ASSERT_TRUE(InitializeAccountManager());
   EXPECT_EQ(0, GetNumPendingAccessTokenRequests());
@@ -650,7 +657,7 @@
   EXPECT_EQ(0, GetNumPendingAccessTokenRequests());
 }
 
-TEST_F(AccountManagerAshTest, FetchAccessTokenRequestsCanBeCancelled) {
+TEST_F(AccountManagerMojoServiceTest, FetchAccessTokenRequestsCanBeCancelled) {
   // Setup.
   ASSERT_TRUE(InitializeAccountManager());
   account_manager::AccountKey account_key{kFakeGaiaId,
@@ -684,7 +691,7 @@
   EXPECT_TRUE(result.is_null());
 }
 
-TEST_F(AccountManagerAshTest, FetchAccessToken) {
+TEST_F(AccountManagerMojoServiceTest, FetchAccessToken) {
   constexpr char kFakeScope[] = "fake-scope";
   ASSERT_TRUE(InitializeAccountManager());
   account_manager::AccountKey account_key{kFakeGaiaId,
diff --git a/components/arc/arc_features.cc b/components/arc/arc_features.cc
index e2cc25c..ba6f2ef 100644
--- a/components/arc/arc_features.cc
+++ b/components/arc/arc_features.cc
@@ -59,7 +59,7 @@
 
 // Controls image copy & paste app compat feature in ARC.
 const base::Feature kImageCopyPasteCompatFeature{
-    "ArcImageCopyPasteCompat", base::FEATURE_DISABLED_BY_DEFAULT};
+    "ArcImageCopyPasteCompat", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Controls keyboard shortcut helper integration feature in ARC.
 const base::Feature kKeyboardShortcutHelperIntegrationFeature{
diff --git a/components/arc/compat_mode/arc_resize_lock_manager.cc b/components/arc/compat_mode/arc_resize_lock_manager.cc
index cbf050d..36cb994 100644
--- a/components/arc/compat_mode/arc_resize_lock_manager.cc
+++ b/components/arc/compat_mode/arc_resize_lock_manager.cc
@@ -358,14 +358,9 @@
     frame_view->GetHeaderView()->UpdateCaptionButtons();
   }
 
-  const auto currentMode =
-      PredictCurrentMode(frame_view->frame(), pref_delegate_);
-  if (!currentMode)
-    return;
-
   const auto resize_lock_type = window->GetProperty(ash::kArcResizeLockTypeKey);
 
-  switch (*currentMode) {
+  switch (PredictCurrentMode(frame_view->frame())) {
     case ResizeCompatMode::kPhone:
       compat_mode_button->SetImage(views::CAPTION_BUTTON_ICON_CENTER,
                                    views::FrameCaptionButton::Animate::kNo,
diff --git a/components/arc/compat_mode/resize_toggle_menu.cc b/components/arc/compat_mode/resize_toggle_menu.cc
index 7e8f7bc..14b1c37 100644
--- a/components/arc/compat_mode/resize_toggle_menu.cc
+++ b/components/arc/compat_mode/resize_toggle_menu.cc
@@ -4,6 +4,7 @@
 
 #include "components/arc/compat_mode/resize_toggle_menu.h"
 
+#include "ash/public/cpp/window_properties.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "base/bind.h"
 #include "base/check.h"
@@ -190,13 +191,14 @@
                                                const void* key,
                                                intptr_t old) {
   DCHECK(window_observation_.IsObservingSource(window));
-  if (key != aura::client::kShowStateKey)
-    return;
-
-  const ui::WindowShowState state =
-      window->GetProperty(aura::client::kShowStateKey);
-  if (state == ui::SHOW_STATE_FULLSCREEN || state == ui::SHOW_STATE_MAXIMIZED)
-    CloseBubble();
+  if (key == aura::client::kShowStateKey) {
+    const ui::WindowShowState state =
+        window->GetProperty(aura::client::kShowStateKey);
+    if (state == ui::SHOW_STATE_FULLSCREEN || state == ui::SHOW_STATE_MAXIMIZED)
+      CloseBubble();
+  } else if (key == ash::kArcResizeLockTypeKey) {
+    UpdateSelectedButton();
+  }
 }
 
 void ResizeToggleMenu::OnWindowDestroying(aura::Window* window) {
@@ -268,13 +270,10 @@
   if (!widget_)
     return;
 
-  const auto selected_mode = PredictCurrentMode(widget_, pref_delegate_);
-  phone_button_->SetSelected(selected_mode &&
-                             *selected_mode == ResizeCompatMode::kPhone);
-  tablet_button_->SetSelected(selected_mode &&
-                              *selected_mode == ResizeCompatMode::kTablet);
-  resizable_button_->SetSelected(
-      selected_mode && *selected_mode == ResizeCompatMode::kResizable);
+  const auto selected_mode = PredictCurrentMode(widget_);
+  phone_button_->SetSelected(selected_mode == ResizeCompatMode::kPhone);
+  tablet_button_->SetSelected(selected_mode == ResizeCompatMode::kTablet);
+  resizable_button_->SetSelected(selected_mode == ResizeCompatMode::kResizable);
 }
 
 void ResizeToggleMenu::ApplyResizeCompatMode(ResizeCompatMode mode) {
@@ -290,10 +289,6 @@
       break;
   }
 
-  // Enabling/disabling resizing might not trigger bounds change, so force to
-  // update selected button status here.
-  UpdateSelectedButton();
-
   auto_close_closure_.Reset(base::BindOnce(&ResizeToggleMenu::CloseBubble,
                                            weak_ptr_factory_.GetWeakPtr()));
   constexpr auto kAutoCloseDelay = base::TimeDelta::FromSeconds(2);
diff --git a/components/arc/compat_mode/resize_toggle_menu_unittest.cc b/components/arc/compat_mode/resize_toggle_menu_unittest.cc
index 04360254..6183ef13 100644
--- a/components/arc/compat_mode/resize_toggle_menu_unittest.cc
+++ b/components/arc/compat_mode/resize_toggle_menu_unittest.cc
@@ -26,8 +26,10 @@
   void SetUp() override {
     CompatModeTestBase::SetUp();
     widget_ = CreateArcWidget(std::string(kTestAppId));
+    // Resizable mode by default.
     pref_delegate()->SetResizeLockState(kTestAppId,
-                                        mojom::ArcResizeLockState::ON);
+                                        mojom::ArcResizeLockState::OFF);
+    SyncResizeLockPropertyWithMojoState(widget());
     resize_toggle_menu_ =
         std::make_unique<ResizeToggleMenu>(widget_.get(), pref_delegate());
   }
@@ -56,6 +58,7 @@
   void ClickButton(ResizeCompatMode command_id) {
     const auto* button = GetButtonByCommandId(command_id);
     LeftClickOnView(widget_.get(), button);
+    SyncResizeLockPropertyWithMojoState(widget());
   }
 
   views::Widget* widget() { return widget_.get(); }
@@ -127,14 +130,21 @@
 TEST_F(ResizeToggleMenuTest, TestResizable) {
   // Verify pre-conditions.
   EXPECT_TRUE(IsMenuRunning());
-  EXPECT_EQ(pref_delegate()->GetResizeLockState(kTestAppId),
-            mojom::ArcResizeLockState::ON);
+  // Set resize locked mode to enable Resizable button.
+  pref_delegate()->SetResizeLockState(kTestAppId,
+                                      mojom::ArcResizeLockState::ON);
+  SyncResizeLockPropertyWithMojoState(widget());
 
   // Test that resize command is properly handled.
   ClickButton(ResizeCompatMode::kResizable);
   EXPECT_EQ(pref_delegate()->GetResizeLockState(kTestAppId),
             mojom::ArcResizeLockState::OFF);
 
+  // Test that the selected item is changed dynamically.
+  EXPECT_FALSE(IsCommandButtonDisabled(ResizeCompatMode::kPhone));
+  EXPECT_FALSE(IsCommandButtonDisabled(ResizeCompatMode::kTablet));
+  EXPECT_TRUE(IsCommandButtonDisabled(ResizeCompatMode::kResizable));
+
   // Test that the item is selected after the resize.
   ReshowMenu();
   EXPECT_TRUE(IsMenuRunning());
@@ -201,11 +211,17 @@
   EXPECT_EQ(1,
             user_action_tester.GetActionCount(GetResizeLockActionNameForTesting(
                 ResizeLockActionType::ResizeToPhone)));
+  EXPECT_EQ(1,
+            user_action_tester.GetActionCount(GetResizeLockActionNameForTesting(
+                ResizeLockActionType::TurnOnResizeLock)));
 
   ClickButton(ResizeCompatMode::kTablet);
   EXPECT_EQ(1,
             user_action_tester.GetActionCount(GetResizeLockActionNameForTesting(
                 ResizeLockActionType::ResizeToTablet)));
+  EXPECT_EQ(1,
+            user_action_tester.GetActionCount(GetResizeLockActionNameForTesting(
+                ResizeLockActionType::TurnOnResizeLock)));
 
   ClickButton(ResizeCompatMode::kResizable);
   EXPECT_EQ(1,
@@ -216,7 +232,7 @@
   EXPECT_EQ(2,
             user_action_tester.GetActionCount(GetResizeLockActionNameForTesting(
                 ResizeLockActionType::ResizeToPhone)));
-  EXPECT_EQ(1,
+  EXPECT_EQ(2,
             user_action_tester.GetActionCount(GetResizeLockActionNameForTesting(
                 ResizeLockActionType::TurnOnResizeLock)));
 }
diff --git a/components/arc/compat_mode/resize_util.cc b/components/arc/compat_mode/resize_util.cc
index 3ac8dd9c..65b2fd9 100644
--- a/components/arc/compat_mode/resize_util.cc
+++ b/components/arc/compat_mode/resize_util.cc
@@ -6,8 +6,10 @@
 
 #include <memory>
 
+#include "ash/public/cpp/arc_resize_lock_type.h"
 #include "ash/public/cpp/toast_data.h"
 #include "ash/public/cpp/toast_manager.h"
+#include "ash/public/cpp/window_properties.h"
 #include "base/callback_forward.h"
 #include "base/callback_helpers.h"
 #include "base/stl_util.h"
@@ -173,27 +175,22 @@
   TurnOffResizeLockWithConfirmationIfNeeded(widget, pref_delegate);
 }
 
-absl::optional<ResizeCompatMode> PredictCurrentMode(
-    views::Widget* widget,
-    ArcResizeLockPrefDelegate* pref_delegate) {
+ResizeCompatMode PredictCurrentMode(const views::Widget* widget) {
+  const aura::Window* window = widget->GetNativeWindow();
+  if (window->GetProperty(ash::kArcResizeLockTypeKey) ==
+      ash::ArcResizeLockType::RESIZABLE) {
+    return ResizeCompatMode::kResizable;
+  }
+
   const int width = widget->GetWindowBoundsInScreen().width();
   const int height = widget->GetWindowBoundsInScreen().height();
-  const auto app_id = GetAppId(widget);
   // We don't use the exact size here to predict tablet or phone size because
   // the window size might be bigger than it due to the ARC app-side minimum
   // size constraints.
-  if (!app_id)
-    return absl::nullopt;
-  const auto resize_lock_state = pref_delegate->GetResizeLockState(*app_id);
-  if (resize_lock_state != mojom::ArcResizeLockState::ON &&
-      resize_lock_state != mojom::ArcResizeLockState::FULLY_LOCKED) {
-    return ResizeCompatMode::kResizable;
-  }
-  if (width < height)
+  if (width <= height)
     return ResizeCompatMode::kPhone;
-  if (width > height)
-    return ResizeCompatMode::kTablet;
-  return absl::nullopt;
+
+  return ResizeCompatMode::kTablet;
 }
 
 bool ShouldShowSplashScreenDialog(ArcResizeLockPrefDelegate* pref_delegate) {
diff --git a/components/arc/compat_mode/resize_util.h b/components/arc/compat_mode/resize_util.h
index 7f0d011..9886a156 100644
--- a/components/arc/compat_mode/resize_util.h
+++ b/components/arc/compat_mode/resize_util.h
@@ -31,9 +31,7 @@
     views::Widget* widget,
     ArcResizeLockPrefDelegate* pref_delegate);
 
-absl::optional<ResizeCompatMode> PredictCurrentMode(
-    views::Widget* widget,
-    ArcResizeLockPrefDelegate* pref_delegate);
+ResizeCompatMode PredictCurrentMode(const views::Widget* widget);
 
 bool ShouldShowSplashScreenDialog(ArcResizeLockPrefDelegate* pref_delegate);
 
diff --git a/components/arc/compat_mode/resize_util_unittest.cc b/components/arc/compat_mode/resize_util_unittest.cc
index e54575f..766bf37 100644
--- a/components/arc/compat_mode/resize_util_unittest.cc
+++ b/components/arc/compat_mode/resize_util_unittest.cc
@@ -25,6 +25,11 @@
   void Show(const ash::ToastData& data) override { called_show_ = true; }
   void Cancel(const std::string& id) override { called_cancel_ = true; }
 
+  void ResetState() {
+    called_show_ = false;
+    called_cancel_ = false;
+  }
+
   bool called_show() { return called_show_; }
   bool called_cancel() { return called_cancel_; }
 
@@ -62,11 +67,11 @@
   pref_delegate()->SetResizeLockNeedsConfirmation(kTestAppId, false);
   EXPECT_TRUE(widget()->IsMaximized());
   ResizeLockToPhone(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
   EXPECT_FALSE(widget()->IsMaximized());
   EXPECT_LT(widget()->GetWindowBoundsInScreen().width(),
             widget()->GetWindowBoundsInScreen().height());
-  EXPECT_EQ(PredictCurrentMode(widget(), pref_delegate()),
-            ResizeCompatMode::kPhone);
+  EXPECT_EQ(PredictCurrentMode(widget()), ResizeCompatMode::kPhone);
 }
 
 // Test that resize tablet works properly in both needs-confirmation and no
@@ -78,11 +83,11 @@
   pref_delegate()->SetResizeLockNeedsConfirmation(kTestAppId, false);
   EXPECT_TRUE(widget()->IsMaximized());
   ResizeLockToTablet(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
   EXPECT_FALSE(widget()->IsMaximized());
   EXPECT_GT(widget()->GetWindowBoundsInScreen().width(),
             widget()->GetWindowBoundsInScreen().height());
-  EXPECT_EQ(PredictCurrentMode(widget(), pref_delegate()),
-            ResizeCompatMode::kTablet);
+  EXPECT_EQ(PredictCurrentMode(widget()), ResizeCompatMode::kTablet);
 }
 
 // Test that resize phone/tablet works properly on small displays.
@@ -95,6 +100,7 @@
 
   // Shrink size according to the workarea size.
   ResizeLockToPhone(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
   EXPECT_LT(widget()->GetWindowBoundsInScreen().width(),
             widget()->GetWindowBoundsInScreen().height());
   EXPECT_LT(widget()->GetWindowBoundsInScreen().width(), workarea_size.width());
@@ -103,6 +109,7 @@
 
   // Don't shrink size so that Android can decide what to do.
   ResizeLockToTablet(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
   EXPECT_GE(widget()->GetWindowBoundsInScreen().width(), workarea_size.width());
   EXPECT_GE(widget()->GetWindowBoundsInScreen().height(),
             workarea_size.height());
@@ -117,6 +124,7 @@
   // needed.
   pref_delegate()->SetResizeLockNeedsConfirmation(kTestAppId, true);
   EnableResizingWithConfirmationIfNeeded(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
   EXPECT_NE(pref_delegate()->GetResizeLockState(kTestAppId),
             mojom::ArcResizeLockState::OFF);
   EXPECT_FALSE(fake_toast_manager.called_cancel());
@@ -125,12 +133,19 @@
   // Test the state is changed without confirmation.
   pref_delegate()->SetResizeLockNeedsConfirmation(kTestAppId, false);
   EnableResizingWithConfirmationIfNeeded(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
   EXPECT_EQ(pref_delegate()->GetResizeLockState(kTestAppId),
             mojom::ArcResizeLockState::OFF);
-  EXPECT_EQ(PredictCurrentMode(widget(), pref_delegate()),
-            ResizeCompatMode::kResizable);
+  EXPECT_EQ(PredictCurrentMode(widget()), ResizeCompatMode::kResizable);
   EXPECT_TRUE(fake_toast_manager.called_cancel());
   EXPECT_TRUE(fake_toast_manager.called_show());
+
+  // Test the state is not updated redundantly.
+  fake_toast_manager.ResetState();
+  EnableResizingWithConfirmationIfNeeded(widget(), pref_delegate());
+  SyncResizeLockPropertyWithMojoState(widget());
+  EXPECT_FALSE(fake_toast_manager.called_cancel());
+  EXPECT_FALSE(fake_toast_manager.called_show());
 }
 
 // Test that should show dialog screen dialog caps at a preset limit
@@ -148,8 +163,8 @@
 TEST_F(ResizeUtilTest, TestPredictCurrentModeForUnresizable) {
   widget()->widget_delegate()->SetCanResize(false);
   ResizeLockToPhone(widget(), pref_delegate());
-  EXPECT_EQ(PredictCurrentMode(widget(), pref_delegate()),
-            ResizeCompatMode::kPhone);
+  SyncResizeLockPropertyWithMojoState(widget());
+  EXPECT_EQ(PredictCurrentMode(widget()), ResizeCompatMode::kPhone);
 }
 
 }  // namespace arc
diff --git a/components/arc/compat_mode/test/compat_mode_test_base.cc b/components/arc/compat_mode/test/compat_mode_test_base.cc
index b4abe998..9f8783c 100644
--- a/components/arc/compat_mode/test/compat_mode_test_base.cc
+++ b/components/arc/compat_mode/test/compat_mode_test_base.cc
@@ -7,9 +7,11 @@
 #include "ash/constants/app_types.h"
 #include "ash/public/cpp/window_properties.h"
 #include "base/containers/flat_map.h"
+#include "components/arc/compat_mode/arc_window_property_util.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/test/event_generator.h"
+#include "ui/views/widget/widget_delegate.h"
 #include "ui/views/widget/widget_utils.h"
 
 namespace arc {
@@ -81,6 +83,7 @@
 
 std::unique_ptr<views::Widget> CompatModeTestBase::CreateWidget(bool show) {
   auto widget = CreateTestWidget(views::Widget::InitParams::TYPE_WINDOW);
+  widget->widget_delegate()->SetCanResize(true);
   if (show)
     widget->Show();
   return widget;
@@ -111,4 +114,28 @@
   event_generator.ClickLeftButton();
 }
 
+void CompatModeTestBase::SyncResizeLockPropertyWithMojoState(
+    const views::Widget* widget) {
+  auto* const window = widget->GetNativeWindow();
+  const auto app_id = GetAppId(window);
+  switch (pref_delegate()->GetResizeLockState(*app_id)) {
+    case mojom::ArcResizeLockState::UNDEFINED:
+    case mojom::ArcResizeLockState::OFF:
+      window->SetProperty(ash::kArcResizeLockTypeKey,
+                          ash::ArcResizeLockType::RESIZABLE);
+      break;
+    case mojom::ArcResizeLockState::ON:
+    case mojom::ArcResizeLockState::READY:
+    case mojom::ArcResizeLockState::FULLY_LOCKED:
+      if (widget->widget_delegate()->CanResize()) {
+        window->SetProperty(ash::kArcResizeLockTypeKey,
+                            ash::ArcResizeLockType::RESIZE_LIMITED);
+      } else {
+        window->SetProperty(ash::kArcResizeLockTypeKey,
+                            ash::ArcResizeLockType::FULLY_LOCKED);
+      }
+      break;
+  }
+}
+
 }  // namespace arc
diff --git a/components/arc/compat_mode/test/compat_mode_test_base.h b/components/arc/compat_mode/test/compat_mode_test_base.h
index f0b40d26..c4057144 100644
--- a/components/arc/compat_mode/test/compat_mode_test_base.h
+++ b/components/arc/compat_mode/test/compat_mode_test_base.h
@@ -35,6 +35,9 @@
   void LeftClickOnView(const views::Widget* widget,
                        const views::View* view) const;
 
+  // Emulates the round-trip between Android and Chrome.
+  void SyncResizeLockPropertyWithMojoState(const views::Widget* widget);
+
   ArcResizeLockPrefDelegate* pref_delegate() { return pref_delegate_.get(); }
 
  private:
diff --git a/components/arc/mojom/file_system.mojom b/components/arc/mojom/file_system.mojom
index 44092d8..cb916f7 100644
--- a/components/arc/mojom/file_system.mojom
+++ b/components/arc/mojom/file_system.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: 20
+// Next MinVersion: 21
 
 module arc.mojom;
 
@@ -11,8 +11,11 @@
 import "components/arc/mojom/gfx.mojom";
 import "components/arc/mojom/intent_common.mojom";
 import "components/arc/mojom/video_common.mojom";
+import "mojo/public/mojom/base/time.mojom";
 import "url/mojom/url.mojom";
 
+// TODO(b/193097194): Use structured types (e.g., url.mojom.Url for URLs).
+
 // Represents a document in Android DocumentsProvider.
 // See Android docs of DocumentsContract.Document for details.
 struct Document {
@@ -266,7 +269,7 @@
   int64 capacity_bytes;
 };
 
-// Next method ID: 11
+// Next method ID: 12
 interface FileSystemHost {
   // Returns the name of the file specified by the URL.
   // When an error occurs, returns null value.
@@ -277,6 +280,10 @@
   // streams), -1 is returned.
   [MinVersion=6] GetFileSize@2(string url) => (int64 size);
 
+  // Returns the last modified timestamp of the file specified by the URL.
+  [MinVersion=20] GetLastModified@11(url.mojom.Url url)
+      => (mojo_base.mojom.Time? last_modified);
+
   // Returns the MIME type of the file specified by the URL.
   // When an error occurs, returns null value.
   [MinVersion=6] GetFileType@3(string url) => (string? mime_type);
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn
index e0fcee1..562a31d 100644
--- a/components/autofill_assistant/browser/BUILD.gn
+++ b/components/autofill_assistant/browser/BUILD.gn
@@ -76,8 +76,6 @@
     "actions/select_option_action.h",
     "actions/set_attribute_action.cc",
     "actions/set_attribute_action.h",
-    "actions/set_form_field_value_action.cc",
-    "actions/set_form_field_value_action.h",
     "actions/set_persistent_ui_action.cc",
     "actions/set_persistent_ui_action.h",
     "actions/set_touchable_area_action.cc",
@@ -370,7 +368,6 @@
     "actions/save_generated_password_action_unittest.cc",
     "actions/select_option_action_unittest.cc",
     "actions/set_attribute_action_unittest.cc",
-    "actions/set_form_field_value_action_unittest.cc",
     "actions/set_persistent_ui_action_unittest.cc",
     "actions/set_touchable_area_action_unittest.cc",
     "actions/show_cast_action_unittest.cc",
diff --git a/components/autofill_assistant/browser/actions/action.cc b/components/autofill_assistant/browser/actions/action.cc
index 2c5f134..1588ad1 100644
--- a/components/autofill_assistant/browser/actions/action.cc
+++ b/components/autofill_assistant/browser/actions/action.cc
@@ -84,9 +84,6 @@
   return out;
 #else
   switch (action_case) {
-    case ActionProto::ActionInfoCase::kSetFormValue:
-      out << "KeyboardInput";
-      break;
     case ActionProto::ActionInfoCase::kSelectOption:
       out << "SelectOption";
       break;
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util.cc b/components/autofill_assistant/browser/actions/action_delegate_util.cc
index c2df36c..93eff1aa 100644
--- a/components/autofill_assistant/browser/actions/action_delegate_util.cc
+++ b/components/autofill_assistant/browser/actions/action_delegate_util.cc
@@ -224,16 +224,6 @@
                             std::move(done));
 }
 
-void ClickOrTapElement(const ActionDelegate* delegate,
-                       const Selector& selector,
-                       ClickType click_type,
-                       base::OnceCallback<void(const ClientStatus&)> done) {
-  FindElementAndPerformImpl(
-      delegate, selector,
-      base::BindOnce(&PerformClickOrTapElement, delegate, click_type),
-      std::move(done));
-}
-
 void PerformClickOrTapElement(
     const ActionDelegate* delegate,
     ClickType click_type,
@@ -246,55 +236,6 @@
   element_action_util::PerformAll(std::move(actions), element, std::move(done));
 }
 
-void SendKeyboardInput(const ActionDelegate* delegate,
-                       const Selector& selector,
-                       const std::vector<UChar32> codepoints,
-                       int delay_in_millis,
-                       bool use_focus,
-                       base::OnceCallback<void(const ClientStatus&)> done) {
-  FindElementAndPerformImpl(
-      delegate, selector,
-      base::BindOnce(&PerformSendKeyboardInput, delegate, codepoints,
-                     delay_in_millis, use_focus),
-      std::move(done));
-}
-
-void PerformSendKeyboardInput(
-    const ActionDelegate* delegate,
-    const std::vector<UChar32> codepoints,
-    int delay_in_millis,
-    bool use_focus,
-    const ElementFinder::Result& element,
-    base::OnceCallback<void(const ClientStatus&)> done) {
-  VLOG(3) << __func__ << " focus: " << use_focus;
-
-  auto actions = std::make_unique<element_action_util::ElementActionVector>();
-  if (use_focus) {
-    actions->emplace_back(
-        base::BindOnce(&WebController::FocusField,
-                       delegate->GetWebController()->GetWeakPtr()));
-  } else {
-    AddClickOrTapSequence(delegate, ClickType::TAP, actions.get());
-  }
-  actions->emplace_back(base::BindOnce(
-      &WebController::SendKeyboardInput,
-      delegate->GetWebController()->GetWeakPtr(), codepoints, delay_in_millis));
-
-  element_action_util::PerformAll(std::move(actions), element, std::move(done));
-}
-
-void SetFieldValue(const ActionDelegate* delegate,
-                   const Selector& selector,
-                   const std::string& value,
-                   KeyboardValueFillStrategy fill_strategy,
-                   int key_press_delay_in_millisecond,
-                   base::OnceCallback<void(const ClientStatus&)> done) {
-  FindElementAndPerformImpl(
-      delegate, selector,
-      base::BindOnce(&PerformSetFieldValue, delegate, value, fill_strategy,
-                     key_press_delay_in_millisecond),
-      std::move(done));
-}
 void PerformSetFieldValue(const ActionDelegate* delegate,
                           const std::string& value,
                           KeyboardValueFillStrategy fill_strategy,
diff --git a/components/autofill_assistant/browser/actions/action_delegate_util.h b/components/autofill_assistant/browser/actions/action_delegate_util.h
index 75dd26c..8e8601d 100644
--- a/components/autofill_assistant/browser/actions/action_delegate_util.h
+++ b/components/autofill_assistant/browser/actions/action_delegate_util.h
@@ -70,36 +70,12 @@
     base::OnceCallback<void(const ElementFinder::Result&)> step,
     element_action_util::ElementActionVector* actions);
 
-void ClickOrTapElement(const ActionDelegate* delegate,
-                       const Selector& selector,
-                       ClickType click_type,
-                       base::OnceCallback<void(const ClientStatus&)> callback);
 void PerformClickOrTapElement(
     const ActionDelegate* delegate,
     ClickType click_type,
     const ElementFinder::Result& element,
     base::OnceCallback<void(const ClientStatus&)> callback);
 
-void SendKeyboardInput(const ActionDelegate* delegate,
-                       const Selector& selector,
-                       const std::vector<UChar32> codepoints,
-                       int delay_in_millis,
-                       bool use_focus,
-                       base::OnceCallback<void(const ClientStatus&)> callback);
-void PerformSendKeyboardInput(
-    const ActionDelegate* delegate,
-    const std::vector<UChar32> codepoints,
-    int delay_in_millis,
-    bool use_focus,
-    const ElementFinder::Result& element,
-    base::OnceCallback<void(const ClientStatus&)> callback);
-
-void SetFieldValue(const ActionDelegate* delegate,
-                   const Selector& selector,
-                   const std::string& value,
-                   KeyboardValueFillStrategy fill_strategy,
-                   int key_press_delay_in_millisecond,
-                   base::OnceCallback<void(const ClientStatus&)> callback);
 void PerformSetFieldValue(
     const ActionDelegate* delegate,
     const std::string& value,
diff --git a/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc b/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc
index 87cb479d4..d11a1fc 100644
--- a/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc
+++ b/components/autofill_assistant/browser/actions/fallback_handler/required_fields_fallback_handler.cc
@@ -15,6 +15,7 @@
 #include "components/autofill_assistant/browser/batch_element_checker.h"
 #include "components/autofill_assistant/browser/client_status.h"
 #include "components/autofill_assistant/browser/field_formatter.h"
+#include "components/autofill_assistant/browser/web/element_action_util.h"
 #include "components/autofill_assistant/browser/web/element_finder.h"
 #include "components/autofill_assistant/browser/web/web_controller.h"
 #include "third_party/re2/src/re2/re2.h"
@@ -423,12 +424,16 @@
     // default: TAP
     click_type = ClickType::TAP;
   }
-  action_delegate_util::ClickOrTapElement(
-      action_delegate_, required_field.selector, click_type,
+  action_delegate_->FindElement(
+      required_field.selector,
       base::BindOnce(
-          &RequiredFieldsFallbackHandler::OnClickOrTapFallbackElement,
-          weak_ptr_factory_.GetWeakPtr(), re2_value, case_sensitive,
-          required_field, std::move(set_next_field)));
+          &element_action_util::TakeElementAndPerform,
+          base::BindOnce(&action_delegate_util::PerformClickOrTapElement,
+                         action_delegate_, click_type),
+          base::BindOnce(
+              &RequiredFieldsFallbackHandler::OnClickOrTapFallbackElement,
+              weak_ptr_factory_.GetWeakPtr(), re2_value, case_sensitive,
+              required_field, std::move(set_next_field))));
 }
 
 void RequiredFieldsFallbackHandler::OnClickOrTapFallbackElement(
@@ -481,12 +486,16 @@
     // default: TAP
     click_type = ClickType::TAP;
   }
-  action_delegate_util::ClickOrTapElement(
-      action_delegate_, selector_to_click, click_type,
-      base::BindOnce(&RequiredFieldsFallbackHandler::OnSetFallbackFieldValue,
-                     weak_ptr_factory_.GetWeakPtr(), required_field,
-                     std::move(set_next_field),
-                     /* element= */ nullptr));
+  action_delegate_->FindElement(
+      selector_to_click,
+      base::BindOnce(
+          &element_action_util::TakeElementAndPerform,
+          base::BindOnce(&action_delegate_util::PerformClickOrTapElement,
+                         action_delegate_, click_type),
+          base::BindOnce(
+              &RequiredFieldsFallbackHandler::OnSetFallbackFieldValue,
+              weak_ptr_factory_.GetWeakPtr(), required_field,
+              std::move(set_next_field), /* element= */ nullptr)));
 }
 
 void RequiredFieldsFallbackHandler::OnSetFallbackFieldValue(
diff --git a/components/autofill_assistant/browser/actions/set_form_field_value_action.cc b/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
deleted file mode 100644
index c12fc672..0000000
--- a/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill_assistant/browser/actions/set_form_field_value_action.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "components/autofill/core/browser/data_model/autofill_profile.h"
-#include "components/autofill_assistant/browser/action_value.pb.h"
-#include "components/autofill_assistant/browser/actions/action_delegate.h"
-#include "components/autofill_assistant/browser/actions/action_delegate_util.h"
-#include "components/autofill_assistant/browser/client_status.h"
-#include "components/autofill_assistant/browser/user_data_util.h"
-#include "components/autofill_assistant/browser/web/element_finder.h"
-#include "components/autofill_assistant/browser/web/web_controller.h"
-
-namespace autofill_assistant {
-namespace {
-
-bool IsSimulatingKeyPresses(KeyboardValueFillStrategy fill_strategy) {
-  return fill_strategy == SIMULATE_KEY_PRESSES ||
-         fill_strategy == SIMULATE_KEY_PRESSES_SELECT_VALUE ||
-         fill_strategy == SIMULATE_KEY_PRESSES_FOCUS;
-}
-
-}  // namespace
-
-SetFormFieldValueAction::FieldInput::FieldInput(
-    std::unique_ptr<std::vector<UChar32>> _keyboard_input)
-    : keyboard_input(std::move(_keyboard_input)) {}
-
-SetFormFieldValueAction::FieldInput::FieldInput(std::string _value)
-    : value(_value) {}
-
-SetFormFieldValueAction::FieldInput::FieldInput(
-    PasswordManagerValue _password_manager_value)
-    : password_manager_value(_password_manager_value) {}
-
-SetFormFieldValueAction::FieldInput::FieldInput(FieldInput&& other) = default;
-
-SetFormFieldValueAction::FieldInput::~FieldInput() {}
-
-SetFormFieldValueAction::SetFormFieldValueAction(ActionDelegate* delegate,
-                                                 const ActionProto& proto)
-    : Action(delegate, proto) {
-  DCHECK(proto_.has_set_form_value());
-  DCHECK_GT(proto_.set_form_value().value_size(), 0);
-}
-
-SetFormFieldValueAction::~SetFormFieldValueAction() {}
-
-void SetFormFieldValueAction::InternalProcessAction(
-    ProcessActionCallback callback) {
-  process_action_callback_ = std::move(callback);
-  selector_ = Selector(proto_.set_form_value().element());
-  if (selector_.empty()) {
-    VLOG(1) << __func__ << ": empty selector";
-    EndAction(ClientStatus(INVALID_SELECTOR));
-    return;
-  }
-
-  // Check proto fields.
-  int keypress_index = 0;
-  for (const auto& keypress : proto_.set_form_value().value()) {
-    switch (keypress.keypress_case()) {
-      case SetFormFieldValueProto_KeyPress::kKeycode:
-        // DEPRECATED: the field `keycode' used to contain a single character to
-        // input as text. Since there is no easy way to convert keycodes to
-        // text, this field is now deprecated and only works for US-ASCII
-        // characters. You should use the `keyboard_input' field instead.
-        if (keypress.keycode() >= 128) {
-          VLOG(1) << "SetFormFieldValueAction: field `keycode' is deprecated "
-                  << "and only supports US-ASCII values (encountered value > "
-                     "127). Use field `key' instead.";
-          FailAction(ClientStatus(INVALID_ACTION), keypress_index);
-          return;
-        }
-        field_inputs_.emplace_back(
-            /* keyboard_input = */ std::make_unique<std::vector<UChar32>>(
-                1, keypress.keycode()));
-        break;
-      case SetFormFieldValueProto_KeyPress::kKeyboardInput:
-        if (keypress.keyboard_input().empty()) {
-          VLOG(1) << "SetFormFieldValueAction: field 'keyboard_input' must be "
-                     "non-empty if set.";
-          FailAction(ClientStatus(INVALID_ACTION), keypress_index);
-          return;
-        }
-        field_inputs_.emplace_back(
-            /* keyboard_input = */ std::make_unique<std::vector<UChar32>>(
-                UTF8ToUnicode(keypress.keyboard_input())));
-        break;
-      case SetFormFieldValueProto_KeyPress::kUseUsername: {
-        PasswordManagerValue password_manager_value;
-        password_manager_value.set_credential_type(
-            PasswordManagerValue::USERNAME);
-        field_inputs_.emplace_back(password_manager_value);
-        break;
-      }
-      case SetFormFieldValueProto_KeyPress::kUsePassword: {
-        PasswordManagerValue password_manager_value;
-        password_manager_value.set_credential_type(
-            PasswordManagerValue::PASSWORD);
-        field_inputs_.emplace_back(password_manager_value);
-        break;
-      }
-      case SetFormFieldValueProto_KeyPress::kText:
-        // Currently no check required.
-        field_inputs_.emplace_back(/* value = */ keypress.text());
-        break;
-      case SetFormFieldValueProto_KeyPress::kClientMemoryKey: {
-        std::string value;
-        ClientStatus client_memory_status =
-            user_data::GetClientMemoryStringValue(
-                keypress.client_memory_key(), delegate_->GetUserData(), &value);
-        if (!client_memory_status.ok()) {
-          VLOG(1) << "SetFormFieldValueAction: bad |client_memory_key|";
-          FailAction(client_memory_status, keypress_index);
-          return;
-        }
-        field_inputs_.emplace_back(/* value = */ value);
-        break;
-      }
-      case SetFormFieldValueProto_KeyPress::kAutofillValue: {
-        std::string value;
-        ClientStatus autofill_status = user_data::GetFormattedAutofillValue(
-            keypress.autofill_value(), delegate_->GetUserData(), &value);
-        if (!autofill_status.ok()) {
-          FailAction(autofill_status, keypress_index);
-          return;
-        }
-
-        field_inputs_.emplace_back(value);
-        break;
-      }
-      default:
-        VLOG(1) << "Unrecognized field for SetFormFieldValueProto_KeyPress";
-        FailAction(ClientStatus(INVALID_ACTION), keypress_index);
-        return;
-    }
-    ++keypress_index;
-  }
-
-  delegate_->ShortWaitForElementWithSlowWarning(
-      selector_,
-      base::BindOnce(&SetFormFieldValueAction::OnWaitForElementTimed,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     base::BindOnce(&SetFormFieldValueAction::OnWaitForElement,
-                                    weak_ptr_factory_.GetWeakPtr())));
-}
-
-void SetFormFieldValueAction::OnWaitForElement(
-    const ClientStatus& element_status) {
-  if (!element_status.ok()) {
-    EndAction(element_status);
-    return;
-  }
-  delegate_->FindElement(selector_,
-                         base::BindOnce(&SetFormFieldValueAction::OnFindElement,
-                                        weak_ptr_factory_.GetWeakPtr()));
-}
-
-void SetFormFieldValueAction::OnFindElement(
-    const ClientStatus& element_status,
-    std::unique_ptr<ElementFinder::Result> element_result) {
-  if (!element_status.ok()) {
-    EndAction(element_status);
-    return;
-  }
-
-  element_ = std::move(element_result);
-  SetFieldValueSequentially(/* field_index = */ 0, OkClientStatus());
-}
-
-void SetFormFieldValueAction::SetFieldValueSequentially(
-    int field_index,
-    const ClientStatus& status) {
-  // If something went wrong or we are out of values: finish.
-  if (!status.ok() || field_index >= proto_.set_form_value().value_size()) {
-    EndAction(status);
-    return;
-  }
-
-  int delay_in_millisecond = proto_.set_form_value().delay_in_millisecond();
-  auto fill_strategy = proto_.set_form_value().fill_strategy();
-  auto next_field_callback =
-      base::BindOnce(&SetFormFieldValueAction::SetFieldValueSequentially,
-                     weak_ptr_factory_.GetWeakPtr(), field_index + 1);
-  const auto& field_input = field_inputs_[field_index];
-  if (field_input.keyboard_input) {
-    action_delegate_util::PerformSendKeyboardInput(
-        delegate_, *field_input.keyboard_input, delay_in_millisecond,
-        fill_strategy == SIMULATE_KEY_PRESSES_FOCUS, *element_,
-        std::move(next_field_callback));
-  } else if (field_input.password_manager_value.credential_type() !=
-             PasswordManagerValue::NOT_SET) {
-    user_data::GetPasswordManagerValue(
-        field_input.password_manager_value, *element_, delegate_->GetUserData(),
-        delegate_->GetWebsiteLoginManager(),
-        base::BindOnce(&SetFormFieldValueAction::OnGetPasswordManagerValue,
-                       weak_ptr_factory_.GetWeakPtr(),
-                       std::move(next_field_callback)));
-  } else {
-    SetFieldValueAndCheckFallback(field_input.value,
-                                  std::move(next_field_callback));
-  }
-}
-
-void SetFormFieldValueAction::OnGetPasswordManagerValue(
-    base::OnceCallback<void(const ClientStatus&)> next_field_callback,
-    const ClientStatus& status,
-    const std::string& value) {
-  if (!status.ok()) {
-    EndAction(status);
-    return;
-  }
-  SetFieldValueAndCheckFallback(value, std::move(next_field_callback));
-}
-
-void SetFormFieldValueAction::SetFieldValueAndCheckFallback(
-    const std::string& value,
-    base::OnceCallback<void(const ClientStatus&)> next_field_callback) {
-  auto fill_strategy = proto_.set_form_value().fill_strategy();
-  action_delegate_util::PerformSetFieldValue(
-      delegate_, value, fill_strategy,
-      proto_.set_form_value().delay_in_millisecond(), *element_,
-      IsSimulatingKeyPresses(fill_strategy)
-          ? std::move(next_field_callback)
-          : base::BindOnce(
-                &SetFormFieldValueAction::OnSetFieldValueAndCheckFallback,
-                weak_ptr_factory_.GetWeakPtr(), std::move(next_field_callback),
-                /* requested_value = */ value));
-}
-
-void SetFormFieldValueAction::OnSetFieldValueAndCheckFallback(
-    base::OnceCallback<void(const ClientStatus&)> next_field_callback,
-    const std::string& requested_value,
-    const ClientStatus& status) {
-  if (!status.ok()) {
-    EndAction(status);
-    return;
-  }
-  delegate_->GetWebController()->GetFieldValue(
-      *element_,
-      base::BindOnce(&SetFormFieldValueAction::OnGetFieldValue,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     std::move(next_field_callback), requested_value));
-}
-
-void SetFormFieldValueAction::OnGetFieldValue(
-    base::OnceCallback<void(const ClientStatus&)> next_field_callback,
-    const std::string& requested_value,
-    const ClientStatus& element_status,
-    const std::string& actual_value) {
-  // Move to next value if |GetFieldValue| failed.
-  if (!element_status.ok()) {
-    std::move(next_field_callback).Run(OkClientStatus());
-    return;
-  }
-
-  // If value is still empty while it is not supposed to be, trigger keyboard
-  // simulation fallback.
-  if (!requested_value.empty() && actual_value.empty()) {
-    // Report a key press simulation fallback has happened.
-    processed_action_proto_->mutable_set_form_field_value_result()
-        ->set_fallback_to_simulate_key_presses(true);
-
-    // Run |SetFieldValue| with keyboard simulation on and move on to next value
-    // afterwards.
-    action_delegate_util::PerformSetFieldValue(
-        delegate_, requested_value, SIMULATE_KEY_PRESSES,
-        proto_.set_form_value().delay_in_millisecond(), *element_,
-        std::move(next_field_callback));
-    return;
-  }
-
-  // Move to next value in all other cases.
-  std::move(next_field_callback).Run(OkClientStatus());
-}
-
-void SetFormFieldValueAction::FailAction(const ClientStatus& status,
-                                         int keypress_index) {
-  processed_action_proto_->mutable_status_details()
-      ->mutable_form_field_error_info()
-      ->set_invalid_keypress_index(keypress_index);
-  EndAction(status);
-}
-
-void SetFormFieldValueAction::EndAction(const ClientStatus& status) {
-  // Clear immediately, to prevent sensitive information from staying in memory.
-  field_inputs_.clear();
-  UpdateProcessedAction(status);
-  std::move(process_action_callback_).Run(std::move(processed_action_proto_));
-}
-
-}  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/actions/set_form_field_value_action.h b/components/autofill_assistant/browser/actions/set_form_field_value_action.h
deleted file mode 100644
index 329ae43b..0000000
--- a/components/autofill_assistant/browser/actions/set_form_field_value_action.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_SET_FORM_FIELD_VALUE_ACTION_H_
-#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_SET_FORM_FIELD_VALUE_ACTION_H_
-
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/gtest_prod_util.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "components/autofill_assistant/browser/action_value.pb.h"
-#include "components/autofill_assistant/browser/actions/action.h"
-#include "components/autofill_assistant/browser/string_conversions_util.h"
-#include "components/autofill_assistant/browser/user_data.h"
-#include "components/autofill_assistant/browser/web/element_finder.h"
-
-namespace autofill_assistant {
-
-// An action to set the value of a form input element.
-class SetFormFieldValueAction : public Action {
- public:
-  explicit SetFormFieldValueAction(ActionDelegate* delegate,
-                                   const ActionProto& proto);
-  ~SetFormFieldValueAction() override;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(SetFormFieldValueActionTest,
-                           PasswordIsClearedFromMemory);
-
-  // A field input as extracted from the proto, but already checked for
-  // validity.
-  struct FieldInput {
-    explicit FieldInput(std::unique_ptr<std::vector<UChar32>> keyboard_input);
-    explicit FieldInput(std::string value);
-    explicit FieldInput(PasswordManagerValue password_manager_value);
-    FieldInput(FieldInput&& other);
-    ~FieldInput();
-
-    // The keys to press if either |keycode| or |keyboard_input| is set, else
-    // nullptr.
-    std::unique_ptr<std::vector<UChar32>> keyboard_input;
-    // If the action is about passwords, the field describes whether to use
-    // password or username.
-    PasswordManagerValue password_manager_value;
-    // The string to input (for all other cases).
-    std::string value;
-  };
-
-  // Overrides Action:
-  void InternalProcessAction(ProcessActionCallback callback) override;
-
-  void OnWaitForElement(const ClientStatus& element_status);
-  void OnFindElement(const ClientStatus& element_status,
-                     std::unique_ptr<ElementFinder::Result> element_result);
-  void SetFieldValueSequentially(int field_index, const ClientStatus& status);
-  void OnGetPasswordManagerValue(
-      base::OnceCallback<void(const ClientStatus&)> next_field_callback,
-      const ClientStatus& status,
-      const std::string& value);
-  void SetFieldValueAndCheckFallback(
-      const std::string& value,
-      base::OnceCallback<void(const ClientStatus&)> next_field_callback);
-  void OnSetFieldValueAndCheckFallback(
-      base::OnceCallback<void(const ClientStatus&)> next_field_callback,
-      const std::string& requested_value,
-      const ClientStatus& status);
-  void OnGetFieldValue(
-      base::OnceCallback<void(const ClientStatus&)> next_field_callback,
-      const std::string& requested_value,
-      const ClientStatus& element_status,
-      const std::string& actual_value);
-
-  void FailAction(const ClientStatus& status, int keypress_index);
-  void EndAction(const ClientStatus& status);
-
-  Selector selector_;
-  std::unique_ptr<ElementFinder::Result> element_;
-  std::vector<FieldInput> field_inputs_;
-  ProcessActionCallback process_action_callback_;
-  base::WeakPtrFactory<SetFormFieldValueAction> weak_ptr_factory_{this};
-
-  DISALLOW_COPY_AND_ASSIGN(SetFormFieldValueAction);
-};
-
-}  // namespace autofill_assistant
-#endif  // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_ACTIONS_SET_FORM_FIELD_VALUE_ACTION_H_
diff --git a/components/autofill_assistant/browser/actions/set_form_field_value_action_unittest.cc b/components/autofill_assistant/browser/actions/set_form_field_value_action_unittest.cc
deleted file mode 100644
index eac3adb..0000000
--- a/components/autofill_assistant/browser/actions/set_form_field_value_action_unittest.cc
+++ /dev/null
@@ -1,778 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill_assistant/browser/actions/set_form_field_value_action.h"
-
-#include <string>
-#include <utility>
-
-#include "base/guid.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/test/gmock_callback_support.h"
-#include "base/test/mock_callback.h"
-#include "base/test/task_environment.h"
-#include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/data_model/autofill_profile.h"
-#include "components/autofill/core/browser/field_types.h"
-#include "components/autofill_assistant/browser/actions/action_test_utils.h"
-#include "components/autofill_assistant/browser/actions/mock_action_delegate.h"
-#include "components/autofill_assistant/browser/client_status.h"
-#include "components/autofill_assistant/browser/mock_website_login_manager.h"
-#include "components/autofill_assistant/browser/string_conversions_util.h"
-#include "components/autofill_assistant/browser/user_model.h"
-#include "components/autofill_assistant/browser/web/mock_web_controller.h"
-#include "content/public/test/browser_task_environment.h"
-#include "content/public/test/test_browser_context.h"
-#include "content/public/test/test_renderer_host.h"
-#include "content/public/test/web_contents_tester.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace autofill_assistant {
-namespace {
-
-const char kFakeUrl[] = "https://www.example.com";
-const char kFakeSelector[] = "#some_selector";
-const char kFakeUsername[] = "user@example.com";
-const char kFakePassword[] = "example_password";
-
-}  // namespace
-
-using ::base::test::RunOnceCallback;
-using ::testing::_;
-using ::testing::InSequence;
-using ::testing::Invoke;
-using ::testing::Pointee;
-using ::testing::Property;
-using ::testing::Return;
-using ::testing::WithArgs;
-
-class SetFormFieldValueActionTest : public testing::Test {
- public:
-  SetFormFieldValueActionTest() {}
-
-  void SetUp() override {
-    web_contents_ = content::WebContentsTester::CreateTestWebContents(
-        &browser_context_, nullptr);
-
-    ON_CALL(mock_action_delegate_, GetWebController)
-        .WillByDefault(Return(&mock_web_controller_));
-    set_form_field_proto_ = proto_.mutable_set_form_value();
-    *set_form_field_proto_->mutable_element() = Selector({kFakeSelector}).proto;
-    ON_CALL(mock_action_delegate_, GetUserData)
-        .WillByDefault(Return(&user_data_));
-    ON_CALL(mock_action_delegate_, WriteUserData)
-        .WillByDefault(
-            RunOnceCallback<0>(&user_data_, /* field_change = */ nullptr));
-    ON_CALL(mock_action_delegate_, GetWebsiteLoginManager)
-        .WillByDefault(Return(&mock_website_login_manager_));
-    ON_CALL(mock_website_login_manager_, OnGetPasswordForLogin(_, _))
-        .WillByDefault(RunOnceCallback<1>(true, kFakePassword));
-    ON_CALL(mock_action_delegate_, OnShortWaitForElement(_, _))
-        .WillByDefault(RunOnceCallback<1>(OkClientStatus(),
-                                          base::TimeDelta::FromSeconds(0)));
-    ON_CALL(mock_web_controller_, GetFieldValue(_, _))
-        .WillByDefault(RunOnceCallback<1>(OkClientStatus(), ""));
-    test_util::MockFindAnyElement(mock_action_delegate_);
-    ON_CALL(mock_web_controller_, SetValueAttribute(_, _, _))
-        .WillByDefault(RunOnceCallback<2>(OkClientStatus()));
-    ON_CALL(mock_web_controller_, SelectFieldValue(_, _))
-        .WillByDefault(RunOnceCallback<1>(OkClientStatus()));
-    ON_CALL(mock_web_controller_, SendKeyEvent(_, _, _))
-        .WillByDefault(RunOnceCallback<2>(OkClientStatus()));
-    ON_CALL(mock_action_delegate_, WaitUntilDocumentIsInReadyState(_, _, _, _))
-        .WillByDefault(RunOnceCallback<3>(OkClientStatus(),
-                                          base::TimeDelta::FromSeconds(0)));
-    ON_CALL(mock_web_controller_, ScrollIntoView(_, _, _, _, _))
-        .WillByDefault(RunOnceCallback<4>(OkClientStatus()));
-    ON_CALL(mock_web_controller_, WaitUntilElementIsStable(_, _, _, _))
-        .WillByDefault(RunOnceCallback<3>(OkClientStatus(),
-                                          base::TimeDelta::FromSeconds(0)));
-    ON_CALL(mock_web_controller_, ClickOrTapElement(_, _, _))
-        .WillByDefault(RunOnceCallback<2>(OkClientStatus()));
-    ON_CALL(mock_web_controller_, SendKeyboardInput(_, _, _, _))
-        .WillByDefault(RunOnceCallback<3>(OkClientStatus()));
-
-    fake_selector_ = Selector({kFakeSelector});
-  }
-
- protected:
-  content::BrowserTaskEnvironment task_environment_;
-  content::RenderViewHostTestEnabler rvh_test_enabler_;
-  content::TestBrowserContext browser_context_;
-  std::unique_ptr<content::WebContents> web_contents_;
-  Selector fake_selector_;
-  MockActionDelegate mock_action_delegate_;
-  MockWebController mock_web_controller_;
-  MockWebsiteLoginManager mock_website_login_manager_;
-  base::MockCallback<Action::ProcessActionCallback> callback_;
-  ActionProto proto_;
-  SetFormFieldValueProto* set_form_field_proto_;
-  UserData user_data_;
-  UserModel user_model_;
-};
-
-TEST_F(SetFormFieldValueActionTest, RequestedUsernameButNoLoginInClientMemory) {
-  UserData empty_user_data;
-  ON_CALL(mock_action_delegate_, GetUserData)
-      .WillByDefault(Return(&empty_user_data));
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_username(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              PRECONDITION_FAILED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, RequestedPasswordButNoLoginInClientMemory) {
-  UserData empty_user_data;
-  ON_CALL(mock_action_delegate_, GetUserData)
-      .WillByDefault(Return(&empty_user_data));
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              PRECONDITION_FAILED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, RequestedPasswordButPasswordNotAvailable) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL(kFakeUrl), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL(kFakeUrl));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-
-  ON_CALL(mock_website_login_manager_, OnGetPasswordForLogin(_, _))
-      .WillByDefault(RunOnceCallback<1>(false, std::string()));
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              AUTOFILL_INFO_NOT_AVAILABLE))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, NonAsciiKeycode) {
-  auto* value = set_form_field_proto_->add_value();
-  value->set_keycode(UTF8ToUnicode("𠜎")[0]);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, INVALID_ACTION))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, UsernameToFill) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL(kFakeUrl), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL(kFakeUrl));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-  ElementFinder::Result expected_element;
-  expected_element.dom_object.object_data.object_id = "fake_object_id";
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute(kFakeUsername, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), kFakeUsername));
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_username(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, UsernameFillingFailsForMismatchingOrigin) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL("http://www.example.com/"), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL("http://not-real.com"));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-
-  EXPECT_CALL(mock_web_controller_, SetValueAttribute(_, _, _)).Times(0);
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_username(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              PASSWORD_ORIGIN_MISMATCH))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, PasswordToFill) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL(kFakeUrl), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL(kFakeUrl));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-
-  ElementFinder::Result expected_element;
-  expected_element.dom_object.object_data.object_id = "fake_object_id";
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute(kFakePassword, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), kFakePassword));
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, PasswordFillingFailsForMismatchingOrigin) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL("http://www.example.com/"), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL("http://not-real.com"));
-        ;
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-
-  EXPECT_CALL(mock_web_controller_, SetValueAttribute(_, _, _)).Times(0);
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              PASSWORD_ORIGIN_MISMATCH))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, PasswordFillingSucceedsForSubdomain) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL("http://www.example.com/"), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL("http://login.example.com/"));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-
-  ElementFinder::Result expected_element;
-  expected_element.dom_object.object_data.object_id = "fake_object_id";
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute(kFakePassword, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), kFakePassword));
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, PasswordIsClearedFromMemory) {
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL(kFakeUrl), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL(kFakeUrl));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  ON_CALL(mock_web_controller_, GetFieldValue(_, _))
-      .WillByDefault(RunOnceCallback<1>(OkClientStatus(), kFakePassword));
-  action.ProcessAction(callback_.Get());
-  EXPECT_TRUE(action.field_inputs_.empty());
-}
-
-TEST_F(SetFormFieldValueActionTest, Keycode) {
-  auto* value = set_form_field_proto_->add_value();
-  value->set_keycode(13);  // carriage return
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(std::vector<int>{13}, _,
-                                EqualsElement(test_util::MockFindElement(
-                                    mock_action_delegate_, fake_selector_)),
-                                _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, KeyboardInput) {
-  auto* value = set_form_field_proto_->add_value();
-  std::string keyboard_input = "SomeQuery𠜎\r";
-  value->set_keyboard_input(keyboard_input);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode(keyboard_input), _,
-                                EqualsElement(test_util::MockFindElement(
-                                    mock_action_delegate_, fake_selector_)),
-                                _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, KeyboardInputHasExpectedCallChain) {
-  InSequence sequence;
-
-  auto* value = set_form_field_proto_->add_value();
-  std::string keyboard_input = "SomeQuery";
-  value->set_keyboard_input(keyboard_input);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(mock_action_delegate_, OnShortWaitForElement(fake_selector_, _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(),
-                                   base::TimeDelta::FromSeconds(0)));
-  auto expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(mock_action_delegate_,
-              WaitUntilDocumentIsInReadyState(
-                  _, DOCUMENT_INTERACTIVE, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus(),
-                                   base::TimeDelta::FromSeconds(0)));
-  EXPECT_CALL(mock_web_controller_,
-              ScrollIntoView(std::string(), "center", "center",
-                             EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<4>(OkClientStatus()));
-  EXPECT_CALL(
-      mock_web_controller_,
-      ClickOrTapElement(ClickType::TAP, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode(keyboard_input), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, Text) {
-  auto* value = set_form_field_proto_->add_value();
-  value->set_text("SomeText𠜎");
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  const ElementFinder::Result& expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute("SomeText𠜎", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), "SomeText𠜎"));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, TextWithKeystrokeHasExpectedCallChain) {
-  InSequence sequence;
-
-  auto* value = set_form_field_proto_->add_value();
-  std::string keyboard_input = "SomeQuery";
-  value->set_text(keyboard_input);
-  set_form_field_proto_->set_fill_strategy(SIMULATE_KEY_PRESSES);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(mock_action_delegate_, OnShortWaitForElement(fake_selector_, _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(),
-                                   base::TimeDelta::FromSeconds(0)));
-  auto expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_action_delegate_,
-              WaitUntilDocumentIsInReadyState(
-                  _, DOCUMENT_INTERACTIVE, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus(),
-                                   base::TimeDelta::FromSeconds(0)));
-  EXPECT_CALL(mock_web_controller_,
-              ScrollIntoView(std::string(), "center", "center",
-                             EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<4>(OkClientStatus()));
-  EXPECT_CALL(
-      mock_web_controller_,
-      ClickOrTapElement(ClickType::CLICK, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode(keyboard_input), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest,
-       TextWithKeystrokeAndSelectHasExpectedCallChain) {
-  InSequence sequence;
-
-  auto* value = set_form_field_proto_->add_value();
-  std::string keyboard_input = "SomeQuery";
-  value->set_text(keyboard_input);
-  set_form_field_proto_->set_fill_strategy(SIMULATE_KEY_PRESSES_SELECT_VALUE);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(mock_action_delegate_, OnShortWaitForElement(fake_selector_, _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(),
-                                   base::TimeDelta::FromSeconds(0)));
-  auto expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(mock_web_controller_,
-              SelectFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyEvent(_, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode(keyboard_input), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, MultipleValuesAndSimulateKeypress) {
-  auto* value = set_form_field_proto_->add_value();
-  value->set_text("SomeText");
-  auto* enter = set_form_field_proto_->add_value();
-  enter->set_keycode(13);
-  set_form_field_proto_->set_fill_strategy(SIMULATE_KEY_PRESSES);
-
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-  const ElementFinder::Result& expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode("SomeText"), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-  // The second entry, a deprecated keycode is transformed into a
-  // field_input.keyboard_input.
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(std::vector<int>{13}, _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, ClientMemoryKey) {
-  auto* value = set_form_field_proto_->add_value();
-  value->set_client_memory_key("key");
-  ValueProto value_proto;
-  value_proto.mutable_strings()->add_values("SomeText𠜎");
-  user_data_.additional_values_["key"] = value_proto;
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  const ElementFinder::Result& expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute("SomeText𠜎", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), "SomeText𠜎"));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, ClientMemoryKeyFailsIfNotInClientMemory) {
-  auto* value = set_form_field_proto_->add_value();
-  value->set_client_memory_key("key");
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              PRECONDITION_FAILED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, FallbackToSimulateKeystrokes) {
-  InSequence sequence;
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_text("123");
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  const ElementFinder::Result& expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("123", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
-
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode("123"), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(callback_,
-              Run(Pointee(AllOf(
-                  Property(&ProcessedActionProto::status, ACTION_APPLIED),
-                  Property(&ProcessedActionProto::set_form_field_value_result,
-                           Property(&SetFormFieldValueProto::Result::
-                                        fallback_to_simulate_key_presses,
-                                    true))))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, FallbackForPassword) {
-  InSequence sequence;
-
-  user_data_.selected_login_ = absl::make_optional<WebsiteLoginManager::Login>(
-      GURL(kFakeUrl), kFakeUsername);
-  EXPECT_CALL(mock_action_delegate_, FindElement(fake_selector_, _))
-      .WillOnce(testing::WithArgs<1>([this](auto&& callback) {
-        auto element_result = std::make_unique<ElementFinder::Result>();
-        element_result->dom_object.object_data.object_id = "fake_object_id";
-        content::WebContentsTester::For(web_contents_.get())
-            ->NavigateAndCommit(GURL(kFakeUrl));
-        element_result->container_frame_host = web_contents_->GetMainFrame();
-        std::move(callback).Run(OkClientStatus(), std::move(element_result));
-      }));
-  ElementFinder::Result expected_element;
-  expected_element.dom_object.object_data.object_id = "fake_object_id";
-
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute(kFakePassword, EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
-
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode(kFakePassword), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_use_password(true);
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(callback_,
-              Run(Pointee(AllOf(
-                  Property(&ProcessedActionProto::status, ACTION_APPLIED),
-                  Property(&ProcessedActionProto::set_form_field_value_result,
-                           Property(&SetFormFieldValueProto::Result::
-                                        fallback_to_simulate_key_presses,
-                                    true))))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, FallbackForMultipleValues) {
-  InSequence sequence;
-
-  auto* value = set_form_field_proto_->add_value();
-  value->set_text("SomeText");
-  auto* enter = set_form_field_proto_->add_value();
-  enter->set_text("SomeOtherText");
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  const ElementFinder::Result& expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-
-  // First value.
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("SomeText", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
-
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode("SomeText"), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  // Second value.
-  EXPECT_CALL(
-      mock_web_controller_,
-      SetValueAttribute("SomeOtherText", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), std::string()));
-
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              SendKeyboardInput(UTF8ToUnicode("SomeOtherText"), _,
-                                EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<3>(OkClientStatus()));
-
-  EXPECT_CALL(callback_,
-              Run(Pointee(AllOf(
-                  Property(&ProcessedActionProto::status, ACTION_APPLIED),
-                  Property(&ProcessedActionProto::set_form_field_value_result,
-                           Property(&SetFormFieldValueProto::Result::
-                                        fallback_to_simulate_key_presses,
-                                    true))))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, EmptyProfileValueFails) {
-  set_form_field_proto_->add_value()->mutable_autofill_value();
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, INVALID_ACTION))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, RequestDataFromUnknownProfile) {
-  auto* value = set_form_field_proto_->add_value()->mutable_autofill_value();
-  value->mutable_profile()->set_identifier("none");
-  value->mutable_value_expression()->add_chunk()->set_text("value");
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              PRECONDITION_FAILED))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, RequestUnknownDataFromProfile) {
-  autofill::AutofillProfile contact(base::GenerateGUID(),
-                                    autofill::test::kEmptyOrigin);
-  // Middle name is expected to be empty.
-  autofill::test::SetProfileInfo(&contact, "John", /* middle name */ "", "Doe",
-                                 "", "", "", "", "", "", "", "", "");
-  user_model_.SetSelectedAutofillProfile(
-      "contact", std::make_unique<autofill::AutofillProfile>(contact),
-      &user_data_);
-
-  auto* value = set_form_field_proto_->add_value()->mutable_autofill_value();
-  value->mutable_profile()->set_identifier("contact");
-  value->mutable_value_expression()->add_chunk()->set_key(
-      static_cast<int>(autofill::ServerFieldType::NAME_MIDDLE));
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  EXPECT_CALL(callback_, Run(Pointee(Property(&ProcessedActionProto::status,
-                                              AUTOFILL_INFO_NOT_AVAILABLE))));
-  action.ProcessAction(callback_.Get());
-}
-
-TEST_F(SetFormFieldValueActionTest, SetFieldFromProfileValue) {
-  autofill::AutofillProfile contact(base::GenerateGUID(),
-                                    autofill::test::kEmptyOrigin);
-  autofill::test::SetProfileInfo(&contact, "John", "", "Doe", "", "", "", "",
-                                 "", "", "", "", "");
-  user_model_.SetSelectedAutofillProfile(
-      "contact", std::make_unique<autofill::AutofillProfile>(contact),
-      &user_data_);
-
-  auto* value = set_form_field_proto_->add_value()->mutable_autofill_value();
-  value->mutable_profile()->set_identifier("contact");
-  value->mutable_value_expression()->add_chunk()->set_key(
-      static_cast<int>(autofill::ServerFieldType::NAME_FIRST));
-  SetFormFieldValueAction action(&mock_action_delegate_, proto_);
-
-  const ElementFinder::Result& expected_element =
-      test_util::MockFindElement(mock_action_delegate_, fake_selector_);
-  EXPECT_CALL(mock_web_controller_,
-              SetValueAttribute("John", EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
-  EXPECT_CALL(mock_web_controller_,
-              GetFieldValue(EqualsElement(expected_element), _))
-      .WillOnce(RunOnceCallback<1>(OkClientStatus(), "not empty"));
-
-  EXPECT_CALL(
-      callback_,
-      Run(Pointee(Property(&ProcessedActionProto::status, ACTION_APPLIED))));
-  action.ProcessAction(callback_.Get());
-}
-
-}  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/protocol_utils.cc b/components/autofill_assistant/browser/protocol_utils.cc
index 056391e..0013555 100644
--- a/components/autofill_assistant/browser/protocol_utils.cc
+++ b/components/autofill_assistant/browser/protocol_utils.cc
@@ -32,7 +32,6 @@
 #include "components/autofill_assistant/browser/actions/save_generated_password_action.h"
 #include "components/autofill_assistant/browser/actions/select_option_action.h"
 #include "components/autofill_assistant/browser/actions/set_attribute_action.h"
-#include "components/autofill_assistant/browser/actions/set_form_field_value_action.h"
 #include "components/autofill_assistant/browser/actions/set_persistent_ui_action.h"
 #include "components/autofill_assistant/browser/actions/set_touchable_area_action.h"
 #include "components/autofill_assistant/browser/actions/show_cast_action.h"
@@ -202,8 +201,6 @@
       return std::make_unique<ShowDetailsAction>(delegate, action);
     case ActionProto::ActionInfoCase::kCollectUserData:
       return std::make_unique<CollectUserDataAction>(delegate, action);
-    case ActionProto::ActionInfoCase::kSetFormValue:
-      return std::make_unique<SetFormFieldValueAction>(delegate, action);
     case ActionProto::ActionInfoCase::kShowProgressBar:
       return std::make_unique<ShowProgressBarAction>(delegate, action);
     case ActionProto::ActionInfoCase::kSetAttribute:
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index 7252b97..bd03785 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -719,7 +719,6 @@
   optional bytes server_payload = 4;
 
   oneof action_info {
-    SetFormFieldValueProto set_form_value = 6;
     SelectOptionProto select_option = 7;
     NavigateProto navigate = 9;
     PromptProto prompt = 10;
@@ -784,7 +783,8 @@
   // action sent to the client after this one. Default is false.
   optional bool clean_contextual_ui = 33;
 
-  reserved 5, 8, 13 to 17, 20 to 23, 25 to 27, 30, 34, 38, 46 to 48, 50, 51, 71;
+  reserved 5, 6, 8, 13 to 17, 20 to 23, 25 to 27, 30, 34, 38, 46 to 48, 50, 51,
+      71;
 }
 
 // Result of |CollectUserDataProto| to be sent to the server.
@@ -861,8 +861,6 @@
     PromptProto.Result prompt_choice = 5;
     // Should be set as a result of CollectUserDataAction.
     CollectUserDataResultProto collect_user_data_result = 15;
-    // Should be set as a result of SetFormFieldValueAction.
-    SetFormFieldValueProto.Result set_form_field_value_result = 17;
     // May be set as a result of WaitForDomProto.
     WaitForDomProto.Result wait_for_dom_result = 22;
     // Should be set as a result of FormAction.
@@ -898,7 +896,7 @@
   // was shown to the user.
   optional SlowWarningStatus slow_warning_status = 34;
 
-  reserved 3, 4, 6 to 14, 16, 18, 26, 27, 29, 30;
+  reserved 3, 4, 6 to 14, 16 to 18, 26, 27, 29, 30;
 }
 
 // Extended information about the action status, which provides more details
@@ -919,11 +917,10 @@
   // More information included for autofill related errors.
   optional AutofillErrorInfoProto autofill_error_info = 3;
 
-  // More information included for |SetFormFieldValueProto| related errors.
-  optional SetFormFieldErrorInfoProto form_field_error_info = 4;
-
   // Additional information from the |WebController|.
   optional WebControllerErrorInfoProto web_controller_error_info = 5;
+
+  reserved 4;
 }
 
 message NavigationInfoProto {
@@ -1050,13 +1047,6 @@
   optional GetFullCardFailureType get_full_card_failure_type = 6;
 }
 
-// Message to report |SetFormFieldValueProto| related errors for debugging
-// purposes.
-message SetFormFieldErrorInfoProto {
-  // The index of |keypress| that caused the action to be invalid.
-  optional int32 invalid_keypress_index = 1;
-}
-
 // Message to report errors related to WebController execution.
 message WebControllerErrorInfoProto {
   enum WebAction {
@@ -2487,53 +2477,8 @@
   optional int32 delay_ms = 7;
 }
 
-// Set the value of an form element.
-message SetFormFieldValueProto {
-  message Result { optional bool fallback_to_simulate_key_presses = 1; }
-  message KeyPress {
-    oneof keypress {
-      // Text to insert as-is into a form field.
-      string text = 1;
-      // DEPRECATED: A single US-ASCII character (e.g., 13 for carriage return).
-      int32 keycode = 2;
-      // Text as generated by processing a virtual key code with a keyboard
-      // layout. This can also be used for keyboard control sequences such
-      // as "\r" or "\t".
-      string keyboard_input = 3;
-      // Use the username from the Chrome password manager login previously
-      // selected in a CollectUserDataAction.
-      bool use_username = 4;
-      // Use the password from the Chrome password manager login previously
-      // selected in a CollectUserDataAction.
-      bool use_password = 5;
-      // Use the value stored at the specified memory location.
-      string client_memory_key = 6;
-      // A value from an Autofill source. Note that this must be preceded by a
-      // |CollectUserDataAction|.
-      AutofillValue autofill_value = 8;
-    }
-
-    reserved 7;
-  }
-
-  // A reference to the form element whose value should be set.
-  optional SelectorProto element = 1;
-
-  // The value to set.
-  repeated KeyPress value = 2;
-
-  // The strategy used to execute filling the value.
-  optional KeyboardValueFillStrategy fill_strategy = 7;
-
-  // Delay between two key presses when simlulating.
-  optional int32 delay_in_millisecond = 6 [default = 20];
-
-  reserved 5;
-}
-
 // Asks the password manager to generate a suitable password for |element|. The
-// generated password can be filled in subsequent SetFormFieldValueProto
-// actions.
+// generated password can be filled in subsequent actions.
 message GeneratePasswordForFormFieldProto {
   // A reference to the form element for which to generate a password.
   optional SelectorProto element = 1;
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
index bc53375..05d5711 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -141,6 +141,7 @@
 <translation id="4887024562049524730">Ask before allowing sites to use your virtual reality device and data (recommended)</translation>
 <translation id="4962975101802056554">Revoke all permissions for device</translation>
 <translation id="497421865427891073">go forward</translation>
+<translation id="4976702386844183910">Last visited <ph name="DATE" /></translation>
 <translation id="4994033804516042629">No contacts found</translation>
 <translation id="4996978546172906250">Share via</translation>
 <translation id="5039804452771397117">Allow</translation>
@@ -151,6 +152,7 @@
 <translation id="5123685120097942451">Incognito tab</translation>
 <translation id="5186036860380548585">Option available near top of the screen</translation>
 <translation id="5197729504361054390">The contacts that you select will be shared with <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" />.</translation>
+<translation id="5216942107514965959">Last visited today</translation>
 <translation id="528192093759286357">Drag from top and touch the back button to exit full screen.</translation>
 <translation id="5300589172476337783">Show</translation>
 <translation id="5301954838959518834">OK, got it</translation>
@@ -181,6 +183,7 @@
 <translation id="5804241973901381774">Permissions</translation>
 <translation id="5860033963881614850">Off</translation>
 <translation id="5876056640971328065">Pause video</translation>
+<translation id="5887687176710214216">Last visited yesterday</translation>
 <translation id="5916664084637901428">On</translation>
 <translation id="5922853908706496913">Sharing your screen</translation>
 <translation id="5939518447894949180">Reset</translation>
@@ -210,6 +213,7 @@
 <translation id="6527303717912515753">Share</translation>
 <translation id="6545864417968258051">Bluetooth scanning</translation>
 <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> and <ph name="NUM_MORE" /> more blocked}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> and <ph name="NUM_MORE" /> more blocked}}</translation>
+<translation id="6554732001434021288">Last visited <ph name="NUM_DAYS" /> days ago</translation>
 <translation id="6561560012278703671">Use quieter messaging (blocks notification prompts from interrupting you)</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
 <translation id="6612358246767739896">Protected content</translation>
diff --git a/components/exo/keyboard_unittest.cc b/components/exo/keyboard_unittest.cc
index 155d789..17b1ed3 100644
--- a/components/exo/keyboard_unittest.cc
+++ b/components/exo/keyboard_unittest.cc
@@ -27,6 +27,7 @@
 #include "components/exo/surface.h"
 #include "components/exo/test/exo_test_base.h"
 #include "components/exo/test/exo_test_helper.h"
+#include "components/exo/test/shell_surface_builder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/focus_client.h"
@@ -94,6 +95,23 @@
   MOCK_METHOD(bool, AcceleratorPressed, (const ui::Accelerator& accelerator));
 };
 
+// This event handler moves the focus to the given window when receiving a key
+// event.
+class TestEventHandler : public ui::EventHandler {
+ public:
+  explicit TestEventHandler(aura::Window* focus_window)
+      : focus_window_(focus_window) {}
+  TestEventHandler(const TestEventHandler&) = delete;
+  TestEventHandler& operator=(const TestEventHandler&) = delete;
+
+  void OnKeyEvent(ui::KeyEvent* event) override {
+    aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow())
+        ->FocusWindow(focus_window_);
+  }
+
+  aura::Window* focus_window_;
+};
+
 // Verifies that switching desks via alt-tab doesn't prevent Seat from receiving
 // key events. https://crbug.com/1008574.
 TEST_F(KeyboardTest, CorrectSeatPressedKeysOnSwitchingDesks) {
@@ -1267,5 +1285,53 @@
   testing::Mock::VerifyAndClearExpectations(&delegate);
 }
 
+TEST_F(KeyboardTest, OnKeyboardKey_ChangeFocusInPreTargetHandler) {
+  auto shell_surface = test::ShellSurfaceBuilder({10, 10}).BuildShellSurface();
+  auto* surface = shell_surface->surface_for_testing();
+  auto normal_window = CreateAppWindow(gfx::Rect(0, 0, 100, 100));
+  TestEventHandler handler{shell_surface->GetWidget()->GetNativeView()};
+
+  aura::client::FocusClient* focus_client =
+      aura::client::GetFocusClient(ash::Shell::GetPrimaryRootWindow());
+  focus_client->FocusWindow(nullptr);
+
+  auto delegate = std::make_unique<NiceMockKeyboardDelegate>();
+  auto* delegate_ptr = delegate.get();
+  NiceMockKeyboardObserver observer;
+  Seat seat;
+  Keyboard keyboard(std::move(delegate), &seat);
+  keyboard.AddObserver(&observer);
+
+  // Focus the non-exo window.
+  focus_client->FocusWindow(normal_window.get());
+
+  ui::test::EventGenerator generator(ash::Shell::GetPrimaryRootWindow());
+
+  // Keyboard should not get a key event sent to the non-exo window.
+  generator.PressKey(ui::VKEY_A, 0);
+  generator.ReleaseKey(ui::VKEY_A, 0);
+  testing::Mock::VerifyAndClearExpectations(delegate_ptr);
+
+  // Sending a key event causes a focus change.
+  // It calls OnKeyboardEnter, but OnKeyboardKey should not be called because
+  // the event's target is |normal_window|.
+  wm_helper()->AddPreTargetHandler(&handler);
+
+  EXPECT_CALL(*delegate_ptr, CanAcceptKeyboardEventsForSurface(surface))
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(*delegate_ptr,
+              OnKeyboardModifiers(KeyboardModifiers{kNumLockMask, 0, 0, 0}));
+  EXPECT_CALL(
+      *delegate_ptr,
+      OnKeyboardEnter(surface, base::flat_map<ui::DomCode, KeyState>()));
+
+  generator.PressKey(ui::VKEY_A, 0);
+  EXPECT_EQ(shell_surface->GetWidget()->GetNativeView(),
+            focus_client->GetFocusedWindow());
+  testing::Mock::VerifyAndClearExpectations(delegate_ptr);
+
+  wm_helper()->RemovePreTargetHandler(&handler);
+}
+
 }  // namespace
 }  // namespace exo
diff --git a/components/pdf/renderer/BUILD.gn b/components/pdf/renderer/BUILD.gn
index 29cce46..2cdaa2f3 100644
--- a/components/pdf/renderer/BUILD.gn
+++ b/components/pdf/renderer/BUILD.gn
@@ -62,7 +62,9 @@
 
   deps = [
     ":renderer",
+    "//pdf:accessibility_structs",
     "//pdf/mojom",
     "//testing/gtest",
+    "//ui/gfx/geometry",
   ]
 }
diff --git a/components/pdf/renderer/pdf_accessibility_tree.cc b/components/pdf/renderer/pdf_accessibility_tree.cc
index 546f9a7..3a196ca 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree.cc
@@ -60,7 +60,7 @@
 class LineHelper {
  public:
   explicit LineHelper(
-      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs)
+      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs)
       : text_runs_(text_runs) {
     StartNewLine(0);
   }
@@ -91,16 +91,16 @@
 
     // Look at the next run, and determine how much it overlaps the line.
     const auto& run_bounds = text_runs_[run_index].bounds;
-    if (run_bounds.size.height == 0.0f)
+    if (run_bounds.height() == 0.0f)
       return false;
 
-    float clamped_top = std::max(line_top, run_bounds.point.y);
+    float clamped_top = std::max(line_top, run_bounds.y());
     float clamped_bottom =
-        std::min(line_bottom, run_bounds.point.y + run_bounds.size.height);
+        std::min(line_bottom, run_bounds.y() + run_bounds.height());
     if (clamped_bottom < clamped_top)
       return false;
 
-    float coverage = (clamped_bottom - clamped_top) / (run_bounds.size.height);
+    float coverage = (clamped_bottom - clamped_top) / (run_bounds.height());
 
     // See if it falls within the line (within our threshold).
     constexpr float kLineCoverageThreshold = 0.25f;
@@ -108,20 +108,20 @@
   }
 
  private:
-  void AddRun(const PP_FloatRect& run_bounds) {
-    float run_width = fabsf(run_bounds.size.width);
+  void AddRun(const gfx::RectF& run_bounds) {
+    float run_width = fabsf(run_bounds.width());
     accumulated_width_ += run_width;
-    accumulated_weight_top_ += run_bounds.point.y * run_width;
+    accumulated_weight_top_ += run_bounds.y() * run_width;
     accumulated_weight_bottom_ +=
-        (run_bounds.point.y + run_bounds.size.height) * run_width;
+        (run_bounds.y() + run_bounds.height()) * run_width;
   }
 
-  void RemoveRun(const PP_FloatRect& run_bounds) {
-    float run_width = fabsf(run_bounds.size.width);
+  void RemoveRun(const gfx::RectF& run_bounds) {
+    float run_width = fabsf(run_bounds.width());
     accumulated_width_ -= run_width;
-    accumulated_weight_top_ -= run_bounds.point.y * run_width;
+    accumulated_weight_top_ -= run_bounds.y() * run_width;
     accumulated_weight_bottom_ -=
-        (run_bounds.point.y + run_bounds.size.height) * run_width;
+        (run_bounds.y() + run_bounds.height()) * run_width;
   }
 
   void RemoveOldRunsUpTo(size_t stop_index) {
@@ -130,7 +130,7 @@
     // from unduly influencing future lines.
     constexpr float kBoxRemoveWidthThreshold = 3.0f;
     while (start_index_ < stop_index &&
-           accumulated_width_ > text_runs_[start_index_].bounds.size.width *
+           accumulated_width_ > text_runs_[start_index_].bounds.width() *
                                     kBoxRemoveWidthThreshold) {
       const auto& old_bounds = text_runs_[start_index_].bounds;
       RemoveRun(old_bounds);
@@ -138,7 +138,7 @@
     }
   }
 
-  const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs_;
+  const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs_;
   size_t start_index_;
   float accumulated_weight_top_;
   float accumulated_weight_bottom_;
@@ -148,7 +148,7 @@
 };
 
 void ComputeParagraphAndHeadingThresholds(
-    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
     float* out_heading_font_size_threshold,
     float* out_paragraph_spacing_threshold) {
   // Scan over the font sizes and line spacing within this page and
@@ -162,8 +162,8 @@
     if (i > 0) {
       const auto& cur = text_runs[i].bounds;
       const auto& prev = text_runs[i - 1].bounds;
-      if (cur.point.y > prev.point.y + prev.size.height / 2)
-        line_spacings.push_back(cur.point.y - prev.point.y);
+      if (cur.y() > prev.y() + prev.height() / 2)
+        line_spacings.push_back(cur.y() - prev.y());
     }
   }
   if (font_sizes.size() > 2) {
@@ -205,20 +205,20 @@
 }
 
 bool BreakParagraph(
-    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
     uint32_t text_run_index,
     float paragraph_spacing_threshold) {
   // Check to see if its also a new paragraph, i.e., if the distance between
   // lines is greater than the threshold.  If there's no threshold, that
   // means there weren't enough lines to compute an accurate median, so
   // we compare against the line size instead.
-  float line_spacing = fabsf(text_runs[text_run_index + 1].bounds.point.y -
-                             text_runs[text_run_index].bounds.point.y);
+  float line_spacing = fabsf(text_runs[text_run_index + 1].bounds.y() -
+                             text_runs[text_run_index].bounds.y());
   return ((paragraph_spacing_threshold > 0 &&
            line_spacing > paragraph_spacing_threshold) ||
           (paragraph_spacing_threshold == 0 &&
            line_spacing > kParagraphLineSpacingRatio *
-                              text_runs[text_run_index].bounds.size.height));
+                              text_runs[text_run_index].bounds.height()));
 }
 
 ui::AXNode* GetStaticTextNodeFromNode(ui::AXNode* node) {
@@ -244,8 +244,8 @@
 }
 
 std::string GetTextRunCharsAsUTF8(
-    const ppapi::PdfAccessibilityTextRunInfo& text_run,
-    const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+    const chrome_pdf::AccessibilityTextRunInfo& text_run,
+    const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
     int char_index) {
   std::string chars_utf8;
   for (uint32_t i = 0; i < text_run.len; ++i) {
@@ -256,8 +256,8 @@
 }
 
 std::vector<int32_t> GetTextRunCharOffsets(
-    const ppapi::PdfAccessibilityTextRunInfo& text_run,
-    const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+    const chrome_pdf::AccessibilityTextRunInfo& text_run,
+    const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
     int char_index) {
   std::vector<int32_t> char_offsets(text_run.len);
   double offset = 0.0;
@@ -288,24 +288,25 @@
       current_text_run_index ? current_text_run_index - 1 : 0);
 }
 
-bool IsTextRenderModeFill(const PP_TextRenderingMode& mode) {
+bool IsTextRenderModeFill(const chrome_pdf::AccessibilityTextRenderMode& mode) {
   switch (mode) {
-    case PP_TEXTRENDERINGMODE_FILL:
-    case PP_TEXTRENDERINGMODE_FILLSTROKE:
-    case PP_TEXTRENDERINGMODE_FILLCLIP:
-    case PP_TEXTRENDERINGMODE_FILLSTROKECLIP:
+    case chrome_pdf::AccessibilityTextRenderMode::kFill:
+    case chrome_pdf::AccessibilityTextRenderMode::kFillStroke:
+    case chrome_pdf::AccessibilityTextRenderMode::kFillClip:
+    case chrome_pdf::AccessibilityTextRenderMode::kFillStrokeClip:
       return true;
     default:
       return false;
   }
 }
 
-bool IsTextRenderModeStroke(const PP_TextRenderingMode& mode) {
+bool IsTextRenderModeStroke(
+    const chrome_pdf::AccessibilityTextRenderMode& mode) {
   switch (mode) {
-    case PP_TEXTRENDERINGMODE_STROKE:
-    case PP_TEXTRENDERINGMODE_FILLSTROKE:
-    case PP_TEXTRENDERINGMODE_STROKECLIP:
-    case PP_TEXTRENDERINGMODE_FILLSTROKECLIP:
+    case chrome_pdf::AccessibilityTextRenderMode::kStroke:
+    case chrome_pdf::AccessibilityTextRenderMode::kFillStroke:
+    case chrome_pdf::AccessibilityTextRenderMode::kStrokeClip:
+    case chrome_pdf::AccessibilityTextRenderMode::kFillStrokeClip:
       return true;
     default:
       return false;
@@ -352,8 +353,8 @@
 class PdfAccessibilityTreeBuilder {
  public:
   explicit PdfAccessibilityTreeBuilder(
-      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-      const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+      const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
       const ppapi::PdfAccessibilityPageObjects& page_objects,
       const gfx::RectF& page_bounds,
       uint32_t page_index,
@@ -466,7 +467,7 @@
           para_node->child_ids.push_back(static_text_node->id);
         }
 
-        const ppapi::PdfAccessibilityTextRunInfo& text_run =
+        const chrome_pdf::AccessibilityTextRunInfo& text_run =
             text_runs_[text_run_index];
         // Add this text run to the current static text node.
         ui::AXNodeData* inline_text_box_node =
@@ -570,7 +571,7 @@
   }
 
   ui::AXNodeData* CreateInlineTextBoxNode(
-      const ppapi::PdfAccessibilityTextRunInfo& text_run,
+      const chrome_pdf::AccessibilityTextRunInfo& text_run,
       const PP_PdfPageCharacterIndex& page_char_index) {
     ui::AXNodeData* inline_text_box_node = CreateNode(
         ax::mojom::Role::kInlineTextBox, ax::mojom::Restriction::kReadOnly,
@@ -582,7 +583,8 @@
     inline_text_box_node->AddStringAttribute(ax::mojom::StringAttribute::kName,
                                              chars__utf8);
     inline_text_box_node->AddIntAttribute(
-        ax::mojom::IntAttribute::kTextDirection, text_run.direction);
+        ax::mojom::IntAttribute::kTextDirection,
+        static_cast<uint32_t>(text_run.direction));
     inline_text_box_node->AddStringAttribute(
         ax::mojom::StringAttribute::kFontFamily, text_run.style.font_name);
     inline_text_box_node->AddFloatAttribute(
@@ -602,8 +604,7 @@
     }
 
     inline_text_box_node->relative_bounds.bounds =
-        PpFloatRectToGfxRectF(text_run.bounds) +
-        page_bounds_.OffsetFromOrigin();
+        text_run.bounds + page_bounds_.OffsetFromOrigin();
     std::vector<int32_t> char_offsets =
         GetTextRunCharOffsets(text_run, chars_, page_char_index.char_index);
     inline_text_box_node->AddIntListAttribute(
@@ -875,7 +876,7 @@
 
     for (size_t text_run_index = start_text_run_index;
          text_run_index <= end_text_run_index; ++text_run_index) {
-      const ppapi::PdfAccessibilityTextRunInfo& text_run =
+      const chrome_pdf::AccessibilityTextRunInfo& text_run =
           text_runs_[text_run_index];
       page_char_index.char_index = text_run_start_indices_[text_run_index];
       // Add this text run to the current static text node.
@@ -1096,8 +1097,8 @@
   }
 
   std::vector<uint32_t> text_run_start_indices_;
-  const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs_;
-  const std::vector<PP_PrivateAccessibilityCharInfo>& chars_;
+  const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs_;
+  const std::vector<chrome_pdf::AccessibilityCharInfo>& chars_;
   const std::vector<ppapi::PdfAccessibilityLinkInfo>& links_;
   uint32_t current_link_index_ = 0;
   const std::vector<ppapi::PdfAccessibilityImageInfo>& images_;
@@ -1138,11 +1139,11 @@
 
 // static
 bool PdfAccessibilityTree::IsDataFromPluginValid(
-    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-    const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+    const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
     const ppapi::PdfAccessibilityPageObjects& page_objects) {
   base::CheckedNumeric<uint32_t> char_length = 0;
-  for (const ppapi::PdfAccessibilityTextRunInfo& text_run : text_runs)
+  for (const chrome_pdf::AccessibilityTextRunInfo& text_run : text_runs)
     char_length += text_run.len;
 
   if (!char_length.IsValid() || char_length.ValueOrDie() != chars.size())
@@ -1317,8 +1318,8 @@
 
 void PdfAccessibilityTree::SetAccessibilityPageInfo(
     const chrome_pdf::AccessibilityPageInfo& page_info,
-    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-    const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+    const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
     const ppapi::PdfAccessibilityPageObjects& page_objects) {
   // Outdated calls are ignored.
   uint32_t page_index = page_info.page_index;
@@ -1367,8 +1368,8 @@
     ui::AXNodeData* page_node,
     const gfx::RectF& page_bounds,
     uint32_t page_index,
-    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-    const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+    const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+    const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
     const ppapi::PdfAccessibilityPageObjects& page_objects,
     content::RenderAccessibility* render_accessibility) {
   DCHECK(page_node);
diff --git a/components/pdf/renderer/pdf_accessibility_tree.h b/components/pdf/renderer/pdf_accessibility_tree.h
index a5389490..2100b6f 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.h
+++ b/components/pdf/renderer/pdf_accessibility_tree.h
@@ -22,8 +22,10 @@
 #include "ui/gfx/geometry/vector2d_f.h"
 
 namespace chrome_pdf {
+struct AccessibilityCharInfo;
 struct AccessibilityDocInfo;
 struct AccessibilityPageInfo;
+struct AccessibilityTextRunInfo;
 struct AccessibilityViewportInfo;
 }  // namespace chrome_pdf
 
@@ -45,8 +47,8 @@
   ~PdfAccessibilityTree() override;
 
   static bool IsDataFromPluginValid(
-      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-      const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+      const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
       const ppapi::PdfAccessibilityPageObjects& page_objects);
 
   // Stores the page index and annotation index in the page.
@@ -65,8 +67,8 @@
       const chrome_pdf::AccessibilityDocInfo& doc_info);
   void SetAccessibilityPageInfo(
       const chrome_pdf::AccessibilityPageInfo& page_info,
-      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-      const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+      const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
       const ppapi::PdfAccessibilityPageObjects& page_objects);
   void HandleAction(const PP_PdfAccessibilityActionData& action_data);
   absl::optional<AnnotationInfo> GetPdfAnnotationInfoFromAXNode(
@@ -121,8 +123,8 @@
       ui::AXNodeData* page_node,
       const gfx::RectF& page_bounds,
       uint32_t page_index,
-      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-      const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+      const std::vector<chrome_pdf::AccessibilityTextRunInfo>& text_runs,
+      const std::vector<chrome_pdf::AccessibilityCharInfo>& chars,
       const ppapi::PdfAccessibilityPageObjects& page_objects,
       content::RenderAccessibility* render_accessibility);
 
diff --git a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc
index bb47d6a..7008520 100644
--- a/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree_browsertest.cc
@@ -26,30 +26,43 @@
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/gfx/geometry/point.h"
 #include "ui/gfx/geometry/rect_conversions.h"
+#include "ui/gfx/geometry/rect_f.h"
 
 namespace pdf {
 
 namespace {
 
-const PP_PrivateAccessibilityTextRunInfo kFirstTextRun = {
-    15, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)};
-const PP_PrivateAccessibilityTextRunInfo kSecondTextRun = {
-    15, PP_MakeFloatRectFromXYWH(28.0f, 117.0f, 152.0f, 19.0f)};
-const PP_PrivateAccessibilityCharInfo kDummyCharsData[] = {
+const chrome_pdf::AccessibilityTextRunInfo kFirstTextRun = {
+    15, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityTextRunInfo kSecondTextRun = {
+    15, gfx::RectF(28.0f, 117.0f, 152.0f, 19.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityCharInfo kDummyCharsData[] = {
     {'H', 12}, {'e', 6},  {'l', 5},  {'l', 4},  {'o', 8},  {',', 4},
     {' ', 4},  {'w', 12}, {'o', 6},  {'r', 6},  {'l', 4},  {'d', 9},
     {'!', 4},  {' ', 0},  {' ', 0},  {'G', 16}, {'o', 12}, {'o', 12},
     {'d', 12}, {'b', 10}, {'y', 12}, {'e', 12}, {',', 4},  {' ', 6},
     {'w', 16}, {'o', 12}, {'r', 8},  {'l', 4},  {'d', 12}, {'!', 2},
 };
-const PP_PrivateAccessibilityTextRunInfo kFirstRunMultiLine = {
-    7, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)};
-const PP_PrivateAccessibilityTextRunInfo kSecondRunMultiLine = {
-    8, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)};
-const PP_PrivateAccessibilityTextRunInfo kThirdRunMultiLine = {
-    9, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)};
-const PP_PrivateAccessibilityTextRunInfo kFourthRunMultiLine = {
-    6, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)};
+const chrome_pdf::AccessibilityTextRunInfo kFirstRunMultiLine = {
+    7, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityTextRunInfo kSecondRunMultiLine = {
+    8, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityTextRunInfo kThirdRunMultiLine = {
+    9, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityTextRunInfo kFourthRunMultiLine = {
+    6, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
 
 const char kChromiumTestUrl[] = "www.cs.chromium.org";
 
@@ -194,8 +207,8 @@
   chrome_pdf::AccessibilityViewportInfo viewport_info_;
   chrome_pdf::AccessibilityDocInfo doc_info_;
   chrome_pdf::AccessibilityPageInfo page_info_;
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs_;
-  std::vector<PP_PrivateAccessibilityCharInfo> chars_;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs_;
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars_;
   ppapi::PdfAccessibilityPageObjects page_objects_;
 };
 
diff --git a/components/pdf/renderer/pdf_accessibility_tree_unittest.cc b/components/pdf/renderer/pdf_accessibility_tree_unittest.cc
index e46c605..5b4c16c 100644
--- a/components/pdf/renderer/pdf_accessibility_tree_unittest.cc
+++ b/components/pdf/renderer/pdf_accessibility_tree_unittest.cc
@@ -6,15 +6,21 @@
 
 #include <utility>
 
+#include "pdf/accessibility_structs.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/rect_f.h"
 
 namespace pdf {
 
-const PP_PrivateAccessibilityTextRunInfo kFirstTextRun = {
-    15, PP_MakeFloatRectFromXYWH(26.0f, 189.0f, 84.0f, 13.0f)};
-const PP_PrivateAccessibilityTextRunInfo kSecondTextRun = {
-    15, PP_MakeFloatRectFromXYWH(28.0f, 117.0f, 152.0f, 19.0f)};
-const PP_PrivateAccessibilityCharInfo kDummyCharsData[] = {
+const chrome_pdf::AccessibilityTextRunInfo kFirstTextRun = {
+    15, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityTextRunInfo kSecondTextRun = {
+    15, gfx::RectF(28.0f, 117.0f, 152.0f, 19.0f),
+    chrome_pdf::AccessibilityTextDirection::kNone,
+    chrome_pdf::AccessibilityTextStyleInfo()};
+const chrome_pdf::AccessibilityCharInfo kDummyCharsData[] = {
     {'H', 12}, {'e', 6},  {'l', 5},  {'l', 4},  {'o', 8},  {',', 4},
     {' ', 4},  {'w', 12}, {'o', 6},  {'r', 6},  {'l', 4},  {'d', 9},
     {'!', 4},  {'\r', 0}, {'\n', 0}, {'G', 16}, {'o', 12}, {'o', 12},
@@ -26,10 +32,10 @@
   // |chars| and |text_runs| span over the same page text. They should denote
   // the same page text size, but |text_runs_| is incorrect and only denotes 1
   // of 2 text runs.
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -41,11 +47,11 @@
 TEST(PdfAccessibilityTreeUnitTest, TextRunsAndCharsMatch) {
   // |chars| and |text_runs| span over the same page text. They should denote
   // the same page text size.
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -55,11 +61,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, UnsortedLinkVector) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -87,11 +93,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundLink) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -109,11 +115,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, UnsortedImageVector) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -137,11 +143,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundImage) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -157,11 +163,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, UnsortedHighlightVector) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -189,11 +195,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundHighlight) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -211,11 +217,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, UnsortedTextFieldVector) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -241,11 +247,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundTextField) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -262,11 +268,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, UnsortedChoiceFieldVector) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -292,11 +298,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundChoiceField) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -313,11 +319,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, UnsortedButtonVector) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -343,11 +349,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundButton) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -364,11 +370,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundRadioButton) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -401,11 +407,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundCheckBox) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -438,11 +444,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInPageLink) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -461,11 +467,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInPageHighlight) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -483,11 +489,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInPageTextFeild) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
@@ -504,11 +510,11 @@
 }
 
 TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInChoiceFeild) {
-  std::vector<ppapi::PdfAccessibilityTextRunInfo> text_runs;
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
   text_runs.emplace_back(kFirstTextRun);
   text_runs.emplace_back(kSecondTextRun);
 
-  std::vector<PP_PrivateAccessibilityCharInfo> chars(
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars(
       std::begin(kDummyCharsData), std::end(kDummyCharsData));
 
   ppapi::PdfAccessibilityPageObjects page_objects;
diff --git a/components/pdf/renderer/pepper_pdf_host.cc b/components/pdf/renderer/pepper_pdf_host.cc
index 3b45ced..56f96dd0 100644
--- a/components/pdf/renderer/pepper_pdf_host.cc
+++ b/components/pdf/renderer/pepper_pdf_host.cc
@@ -284,11 +284,30 @@
   return PP_OK;
 }
 
+namespace {
+
+chrome_pdf::AccessibilityTextStyleInfo ToAccessibilityTextStyleInfo(
+    const ppapi::PdfAccessibilityTextStyleInfo& pp_style) {
+  chrome_pdf::AccessibilityTextStyleInfo style;
+  style.font_name = pp_style.font_name;
+  style.font_weight = pp_style.font_weight;
+  style.render_mode = static_cast<chrome_pdf::AccessibilityTextRenderMode>(
+      pp_style.render_mode);
+  style.font_size = pp_style.font_size;
+  style.fill_color = pp_style.fill_color;
+  style.stroke_color = pp_style.stroke_color;
+  style.is_italic = pp_style.is_italic;
+  style.is_bold = pp_style.is_bold;
+  return style;
+}
+
+}  // namespace
+
 int32_t PepperPDFHost::OnHostMsgSetAccessibilityPageInfo(
     ppapi::host::HostMessageContext* context,
     const PP_PrivateAccessibilityPageInfo& pp_page_info,
-    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_run_info,
-    const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+    const std::vector<ppapi::PdfAccessibilityTextRunInfo>& pp_text_run_infos,
+    const std::vector<PP_PrivateAccessibilityCharInfo>& pp_chars,
     const ppapi::PdfAccessibilityPageObjects& page_objects) {
   if (!host_->GetPluginInstance(pp_instance()))
     return PP_ERROR_FAILED;
@@ -296,7 +315,20 @@
   chrome_pdf::AccessibilityPageInfo page_info = {
       pp_page_info.page_index, content::PP_ToGfxRect(pp_page_info.bounds),
       pp_page_info.text_run_count, pp_page_info.char_count};
-  pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info, text_run_info,
+  std::vector<chrome_pdf::AccessibilityTextRunInfo> text_run_infos;
+  text_run_infos.reserve(pp_text_run_infos.size());
+  for (const auto& pp_text_run_info : pp_text_run_infos) {
+    text_run_infos.emplace_back(
+        pp_text_run_info.len, content::PP_ToGfxRectF(pp_text_run_info.bounds),
+        static_cast<chrome_pdf::AccessibilityTextDirection>(
+            pp_text_run_info.direction),
+        ToAccessibilityTextStyleInfo(pp_text_run_info.style));
+  }
+  std::vector<chrome_pdf::AccessibilityCharInfo> chars;
+  chars.reserve(pp_chars.size());
+  for (const auto& pp_char : pp_chars)
+    chars.push_back({pp_char.unicode_character, pp_char.char_width});
+  pdf_accessibility_tree_->SetAccessibilityPageInfo(page_info, text_run_infos,
                                                     chars, page_objects);
   return PP_OK;
 }
diff --git a/components/pdf/renderer/pepper_pdf_host.h b/components/pdf/renderer/pepper_pdf_host.h
index 4ed1a76..5973e2e 100644
--- a/components/pdf/renderer/pepper_pdf_host.h
+++ b/components/pdf/renderer/pepper_pdf_host.h
@@ -122,8 +122,8 @@
   int32_t OnHostMsgSetAccessibilityPageInfo(
       ppapi::host::HostMessageContext* context,
       const PP_PrivateAccessibilityPageInfo& pp_page_info,
-      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& text_runs,
-      const std::vector<PP_PrivateAccessibilityCharInfo>& chars,
+      const std::vector<ppapi::PdfAccessibilityTextRunInfo>& pp_text_run_infos,
+      const std::vector<PP_PrivateAccessibilityCharInfo>& pp_chars,
       const ppapi::PdfAccessibilityPageObjects& page_objects);
   int32_t OnHostMsgSelectionChanged(ppapi::host::HostMessageContext* context,
                                     const PP_FloatPoint& left,
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index b4531da..1a9096e0 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -18696,6 +18696,7 @@
         'items': { 'type': 'string' }
       },
       'supported_on': ['android:65-'],
+      'future_on': ['ios'],
       'features': {
         'dynamic_refresh': True,
         'per_profile': False,
@@ -22164,7 +22165,7 @@
         },
         'required': ['reboot_time', 'frequency']
       },
-      'future_on': ['chrome_os'],
+      'supported_on': ['chrome_os:94-'],
       'features': {
         'dynamic_refresh': True,
         'per_profile': False,
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index b0e337bd..4311465 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -79,7 +79,7 @@
 <translation id="1076751984131277498">Daftar perangkat USB dapat dilepas yang diizinkan</translation>
 <translation id="1079425471279127373">Jika kebijakan disetel, beberapa asal dari aplikasi web yang diinstal otomatis akan diizinkan mendapatkan atribut perangkat (misalnya, nomor seri, nama host) dengan menggunakan Device Attributes API.
 
-      Device Attributes API adalah daftar API web, harap lihat https://wicg.github.io/WebApiDevice/device_attributes. API ini hanya tersedia untuk asal yang sesuai dengan aplikasi web yang diinstal otomatis melalui <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> atau aplikasi web yang dikonfigurasi dalam sesi Kios.</translation>
+      Device Attributes API adalah daftar API web; harap lihat https://wicg.github.io/WebApiDevice/device_attributes. API ini hanya tersedia untuk asal yang sesuai dengan aplikasi web yang diinstal otomatis melalui <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> atau aplikasi web yang dikonfigurasi dalam sesi Kios.</translation>
 <translation id="1079801999187584280">Larang penggunaan Developer Tools</translation>
 <translation id="1082802595100075771">Izinkan pengguna memilih menggunakan layanan Google anonim untuk memberikan deskripsi otomatis untuk gambar tanpa label</translation>
 <translation id="1087437665304381368">Kebijakan ini hanya mengontrol mode developer<ph name="PRODUCT_OS_NAME" />. Jika ingin mencegah akses ke Opsi Developer Android, Anda perlu menetapkan kebijakan <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" />.</translation>
@@ -6008,7 +6008,7 @@
       Jika Anda menyetel kebijakan, pengguna tidak dapat mengubah fungsi ini. Jika Anda tidak menyetelnya, pengguna akan diizinkan mengubah setelan.</translation>
 <translation id="8715885991031124968">Izinkan dialog JavaScript yang dipicu dari subframe asal yang berbeda.</translation>
 <translation id="8720547069538712402">Izinkan pengguna mengaktifkan atau menonaktifkan periksa ejaan</translation>
-<translation id="8726080977639508431">Kebijakan ini mengontrol cara <ph name="PRODUCT_NAME" /> menafsirkan kebijakan sitelist/greylist untuk fitur Dukungan Browser Lama. Kebijakan ini akan memengaruhi kebijakan berikut: <ph name="URL_LIST_POLICY_NAME" />, <ph name="URL_GREYLIST_POLICY_NAME" />, <ph name="USE_IE_SITELIST_POLICY_NAME" />, <ph name="EXTERNAL_SITELIST_POLICY_NAME" />, dan <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />.
+<translation id="8726080977639508431">Kebijakan ini mengontrol cara <ph name="PRODUCT_NAME" /> menafsirkan kebijakan sitelist/daftar abu-abu untuk fitur Dukungan Browser Lama. Kebijakan ini akan memengaruhi kebijakan berikut: <ph name="URL_LIST_POLICY_NAME" />, <ph name="URL_GREYLIST_POLICY_NAME" />, <ph name="USE_IE_SITELIST_POLICY_NAME" />, <ph name="EXTERNAL_SITELIST_POLICY_NAME" />, dan <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />.
 
       Jika disetel ke 'Default' (0) atau tidak disetel, pencocokan URL kurang ketat. Aturan yang tidak berisi "/" akan mencari substring di mana pun di nama host URL. Pencocokan komponen jalur URL peka huruf besar/kecil.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 4a41125..aed95a4b 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -77,6 +77,9 @@
       Se a política for definida como falsa ou se não for definida, as informações não serão enviadas.
       Se ela for definida como verdadeira, as informações sobre as luzes de fundo do dispositivo serão enviadas.</translation>
 <translation id="1076751984131277498">Lista de permissões de dispositivos USB removíveis</translation>
+<translation id="1079425471279127373">Definir a política permite que algumas origens de aplicativos da web de instalação forçada recebam atributos de dispositivo (como número de série, nome do host) usando a API Device Attributes.
+
+      A API Device Attributes é uma lista de APIs da Web. Consulte https://wicg.github.io/WebApiDevice/device_attributes (link em inglês). Essas APIs estão disponíveis apenas para origens que correspondem a aplicativos da Web de instalação forçada pela <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> ou para a configurada na sessão de quiosque.</translation>
 <translation id="1079801999187584280">Não permite o uso das Ferramentas para Desenvolvedores</translation>
 <translation id="1082802595100075771">Permitir que os usuários escolham usar um Serviço do Google anônimo para oferecer descrições automáticas para imagens que não têm um texto alternativo</translation>
 <translation id="1087437665304381368">Essa política controla apenas o modo de desenvolvedor do <ph name="PRODUCT_OS_NAME" />. Se quiser impedir o acesso às Opções do desenvolvedor do Android, configure a política <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" />.</translation>
@@ -865,6 +868,7 @@
 <translation id="2090939118981888335">Se a política for definida como "Ativada", o proxy de compressão de dados será permitido. Se a política for definida como "Desativada", o proxy não será permitido.
 
       Se você definir a política, os usuários não poderão mudá-la. Se ela não for definida, os usuários poderão escolher como usar o recurso.</translation>
+<translation id="2093552723795057221">Não informar o status do áudio</translation>
 <translation id="209586405398070749">Canal Stable</translation>
 <translation id="2098658257603918882">Ativar relato de uso e dados relacionados a falhas</translation>
 <translation id="2104418465060359056">Fornecer informações sobre extensões e plug-ins</translation>
@@ -908,6 +912,9 @@
 <translation id="2151831603578119302">Ativar atalhos de recursos de acessibilidade</translation>
 <translation id="2156132677421487971">"Configurar políticas para o <ph name="PRODUCT_NAME" />", um recurso que permite que os usuários enviem o conteúdo de guias, sites ou a área de trabalho do navegador para telas e sistemas de som remotos.</translation>
 <translation id="2156755242840687300">Servidores de impressão externos ativados</translation>
+<translation id="2157842368188031417">Esta política se aplica apenas a sessões de visitante gerenciadas. Ela precisa ser ativada para que o modo de estação de trabalho compartilhada do Imprivata permita trocas de usuário dentro da sessão.
+      Definir a política como verdadeira substituirá forçadamente certas políticas para recursos, que mantêm dados de usuários sensíveis e não são gerenciadas pelo mecanismo de limpeza usado para troca de usuários dentro da sessão com a estação de trabalho compartilhada do Imprivata.
+      Definir a política como falsa ou deixá-la sem definição não substituirá nenhuma política.</translation>
 <translation id="2160336427036785721">Configura a quantidade de memória que uma única instância do <ph name="PRODUCT_NAME" /> pode usar antes que as guias comecem a ser descartadas para economizar memória. Isto é, a memória usada por uma guia será liberada, e a guia terá que ser atualizada ao ser aberta novamente.
 
       Se a política for definida, o navegador começará a descartar guias para economizar memória quando o limite for excedido. Entretanto, não há garantia de que o navegador seja sempre executado dentro dos limites. Qualquer valor abaixo de 1.024 será arredondado para esse número.
@@ -1923,6 +1930,7 @@
 
       Esta política é temporária e será removida em uma versão futura
       do <ph name="PRODUCT_NAME" />.</translation>
+<translation id="3359186795130278362">Ativar sessão de visitante gerenciada restrita.</translation>
 <translation id="3360093276083825336">Esta política está obsoleta e será removida na versão 85 do <ph name="PRODUCT_OS_NAME" />. Por isso, passe a usar <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.
 
           Especifica o tempo sem entrada do usuário para que uma caixa de diálogo de aviso seja mostrada quando o dispositivo estiver funcionando com energia da bateria.
@@ -3162,6 +3170,7 @@
 
       Observação: também é possível adicionar elementos à lista por meio da política <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" />.</translation>
 <translation id="5067143124345820993">Lista de permissões de login de usuário</translation>
+<translation id="5071303485174858500">Desativar sessão de visitante gerenciada restrita.</translation>
 <translation id="5073609397321802133">Se a política for definida como falsa, a página "Nova guia" não permitirá que os usuários personalizem o plano de fundo. Qualquer plano de fundo personalizado já existente será removido permanentemente, mesmo que a política seja definida como verdadeira mais tarde.
 
       Se a política for definida como "verdadeira" ou não for definida, os usuários poderão personalizar o plano de fundo da página "Nova guia".</translation>
@@ -3169,6 +3178,7 @@
 
       Se a política for definida como falsa ou não for definida, o <ph name="PRODUCT_NAME" /> usará configurações on-line existentes de verificação da revogação.</translation>
 <translation id="5078623750797048009">Ativar anotações no PDF</translation>
+<translation id="5081204761483900654">Sessões de visitante gerenciadas restritas</translation>
 <translation id="5082572440690475059">Permitir acesso de leitura com a API File System nestes sites</translation>
 <translation id="5085647276663819155">Desativar visualização da impressão</translation>
 <translation id="5090791951240382356">Permitir a mescla de políticas de dicionário de diferentes fontes</translation>
@@ -3824,6 +3834,7 @@
           Se esta configuração for desativada ou não for definida, o nome de domínio padrão do TalkGadget ('chromoting host.talkgadget.google.com') será usado para todos os hosts.
 
           Clientes de acesso remoto não são afetados pela definição desta política. Eles sempre usam "chromoting-client.talkgadget.google.com" para acessar o TalkGadget.</translation>
+<translation id="5888645257599699215">Informar o status do áudio do dispositivo</translation>
 <translation id="5890063326284543943">Controlar o uso da API Serial</translation>
 <translation id="5897913798715600338">Carregar a bateria usando tecnologia de carregamento rápido.</translation>
 <translation id="5898486742390981550">Quando vários usuários estão conectados, somente o usuário principal pode usar os apps Android.</translation>
@@ -4465,8 +4476,10 @@
       Se a política for definida como "Desativada", o ícone de recursos experimentais do navegador será removido da barra de ferramentas.
 
       chrome://flags e todas as outras formas de desativar e ativar os recursos do navegador ainda funcionarão como esperado, independentemente de a política ser definida como "Ativada" ou "Desativada".</translation>
+<translation id="6794083666143216172">Permitir que as origens consultem os atributos do dispositivo</translation>
 <translation id="6795485990775913659">Permitir impressão apenas sem PIN</translation>
 <translation id="6800181452282128474">Não consultar servidores Quirks</translation>
+<translation id="68031099365512050">Informar o status de áudio</translation>
 <translation id="6810445994095397827">Bloquear o JavaScript nestes sites</translation>
 <translation id="6813263547126514821">Ligar e desligar</translation>
 <translation id="681446116407619279">Esquemas de autenticação compatíveis</translation>
@@ -4623,6 +4636,9 @@
 
       Os idiomas compatíveis no momento são: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="6926703471186170050">Ativar impressão duplex de borda longa</translation>
+<translation id="6928305045865155732">Se a política for ativada ou deixada sem definição, os dispositivos registrados informarão o volume do áudio.
+
+      Se a política for desativada, os dispositivos registrados não gravarão nem informarão o status do áudio.</translation>
 <translation id="6931242315485576290">Desativar a sincronização de dados com o Google</translation>
 <translation id="6943577887654905793">Nome de preferência Mac/Linux:</translation>
 <translation id="6946652757373377924">
@@ -5967,6 +5983,19 @@
       Se você definir a política, os usuários não poderão mudar essa função. Se ela não for definida, os usuários poderão mudar a configuração.</translation>
 <translation id="8715885991031124968">Permitir caixas de diálogo de JavaScript acionadas por um subframe de origem diferente.</translation>
 <translation id="8720547069538712402">Permitir que o usuário ative ou desative a verificação ortográfica</translation>
+<translation id="8726080977639508431">Esta política controla como o <ph name="PRODUCT_NAME" /> interpreta políticas de lista de sites/lista cinza no recurso Suporte a navegadores legados. Ela afeta as políticas <ph name="URL_LIST_POLICY_NAME" />, <ph name="URL_GREYLIST_POLICY_NAME" />, <ph name="USE_IE_SITELIST_POLICY_NAME" />, <ph name="EXTERNAL_SITELIST_POLICY_NAME" /> e <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />.
+
+      Se ela for definida como "Default" (0) ou for deixada sem definição, a correspondência de URL será menos rigorosa. Regras que não tiverem "/" procurarão uma substring em qualquer lugar no nome do host do URL. A correspondência do componente de caminho de um URL diferencia maiúsculas de minúsculas.
+
+      Se "IESiteListMode" (1), a correspondência de URL será mais rigorosa. Regras que não tiverem "/" terão correspondência apenas no fim do nome do host. Elas também precisarão estar no limite de um nome de domínio. A correspondência do componente de caminho de um URL não diferencia maiúsculas e minúsculas. Esse comportamento é mais compatível com o <ph name="MS_IE_PRODUCT_NAME" /> e o <ph name="MS_EDGE_PRODUCT_NAME" />.
+
+      Por exemplo, com as regras "example.com" e "acme.com/abc":
+
+      "http://example.com/", "http://subdomain.example.com/" e "http://acme.com/abc" correspondem independentemente do modo de análise.
+
+      "http://notexample.com/", "http://example.com.invalid.com/" e "http://example.comabc/" correspondem apenas no modo "Default".
+
+      "http://acme.com/ABC" corresponde apenas no "IESiteListMode".</translation>
 <translation id="8736538322216687231">Aplicar o Modo restrito mínimo do YouTube</translation>
 <translation id="8745669971728319820">Esta política controla a permissão de fornecimento de informações sobre extensões e plug-ins.
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 919ea1fb..589fb551 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -77,6 +77,9 @@
       Bu politika false (yanlış) değerine ayarlanırsa veya ayarlanmadan bırakılırsa bilgi raporlanmaz.
       True (doğru) değerine ayarlanırsa cihazın arka ışık bilgileri raporlanır.</translation>
 <translation id="1076751984131277498">İzin verilen çıkarılabilir USB cihazların listesi</translation>
+<translation id="1079425471279127373">Zorunlu yüklenmiş web uygulamalarıyla ilgili bazı kaynakların Device Attributes API'yi kullanarak cihaz özelliklerini (ör. seri numarası, ana makine adı) almasına izin vermek için politikayı ayarlar.
+
+      Device Attributes API, web API'leri içeren bir listedir. Lütfen https://wicg.github.io/WebApiDevice/device_attributes adresini ziyaret edin. Bu API'ler, yalnızca <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> veya Kiosk oturumunda yapılandırılan politika aracılığıyla zorunlu yüklenmiş web uygulamalarına karşılık gelen kaynaklar için kullanılabilir.</translation>
 <translation id="1079801999187584280">Geliştirici Araçları'nın kullanımına izin verme</translation>
 <translation id="1082802595100075771">Kullanıcıların, etiketlenmemiş resimlerin otomatik açıklamalarını sağlayan anonim bir Google hizmeti kullanmayı seçmelerine olanak tanı</translation>
 <translation id="1087437665304381368">Bu politika yalnızca <ph name="PRODUCT_OS_NAME" /> geliştirici modunu kontrol eder. Android Geliştirici Seçenekleri'ne erişimi engellemek isterseniz <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> politikasını ayarlamanız gerekir.</translation>
@@ -862,6 +865,7 @@
 <translation id="2090939118981888335">Politika, Etkin değerine ayarlanırsa veri sıkıştırma proxy'sine izin verilir. Politika, Devre Dışı değerine ayarlanırsa proxy'ye izin verilmez.
 
       Bu politikayı ayarlarsanız kullanıcılar değiştiremez. Politika ayarlanmadan bırakılırsa kullanıcılar, özelliği kullanmayı seçebilir.</translation>
+<translation id="2093552723795057221">Ses durumunu bildirme</translation>
 <translation id="209586405398070749">Mevcut ürün kanalı</translation>
 <translation id="2098658257603918882">Kullanım ve kilitlenme ile ilgili verilerin raporlanmasını etkinleştir</translation>
 <translation id="2104418465060359056">Uzantı ve Eklenti bilgilerini bildirme</translation>
@@ -905,6 +909,9 @@
 <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="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.
+      Politika, Yanlış değerine ayarlanır veya ayarlanmadan bırakılırsa herhangi bir politika geçersiz kılınmaz.</translation>
 <translation id="2160336427036785721">Bellekten tasarruf etmek için sekmelerin silinmeye başlamasından önce (sekme tarafından kullanılan bellek serbest kalır ve sekmeye geçiş yapıldığında sekmenin yeniden yüklenmesi gerekir) tek bir <ph name="PRODUCT_NAME" /> örneğinin kullanabileceği bellek miktarını yapılandırır.
 
       Politika ayarlanırsa tarayıcı, sınır geçildikten sonra bellekten tasarruf etmek için sekmeleri silmeye başlar. Bununla birlikte, tarayıcının her zaman sınırın altında çalışacağına dair herhangi bir garanti yoktur. 1024'ün altındaki değerler 1024'e yuvarlanır.
@@ -1913,6 +1920,7 @@
       Bu politika devre dışı bırakılır veya ayarlanmazsa bu TLS/DTLS sürümleri devre dışı bırakılır.
 
       Bu politika geçici olup yeni <ph name="PRODUCT_NAME" /> sürümlerinden birinde kaldırılacaktır.</translation>
+<translation id="3359186795130278362">Kısıtlanmış yönetilen misafir oturumunu etkinleştir.</translation>
 <translation id="3360093276083825336">Bu politikanın artık kullanılmadığını ve <ph name="PRODUCT_OS_NAME" /> sürüm 85'te kaldırılacağını unutmayın. Lütfen bunun yerine <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> politikasını kullanın.
 
           Pil gücüyle çalışırken, kullanıcı ne kadar süre giriş yapmazsa bir uyarı iletişim kutusu görüntüleneceğini belirtir.
@@ -3150,6 +3158,7 @@
 
       Not: Bu listeye <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> politikası aracılığıyla öğeler eklenebileceğini de unutmayın.</translation>
 <translation id="5067143124345820993">Kullanıcı beyaz listesine giriş yap</translation>
+<translation id="5071303485174858500">Kısıtlanmış yönetilen misafir oturumunu devre dışı bırak.</translation>
 <translation id="5073609397321802133">Politika false (yanlış) değerine ayarlanırsa Yeni Sekme sayfası kullanıcıların arka planı özelleştirmesine izin vermez. Mevcut herhangi bir özel arka plan, politika daha sonra true (doğru) değerine ayarlansa bile, kalıcı olarak kaldırılacaktır.
 
       Politika true (doğru) değerine ayarlanırsa veya ayarlanmamış olarak bırakılırsa kullanıcılar Yeni Sekme sayfasındaki arka planı özelleştirebilirler.</translation>
@@ -3157,6 +3166,7 @@
 
       Uygulamayı False (Yanlış) değerine ayarlamak veya ayarlamadan bırakmak, <ph name="PRODUCT_NAME" /> ürününün mevcut online iptal kontrolü ayarlarını kullanacağı anlamına gelir.</translation>
 <translation id="5078623750797048009">PDF Ek Açıklamalarını etkinleştir</translation>
+<translation id="5081204761483900654">Kısıtlanmış yönetilen misafir oturumları</translation>
 <translation id="5082572440690475059">Bu sitelerde File System API üzerinden okuma erişimine izin ver</translation>
 <translation id="5085647276663819155">Baskı Önizlemeyi Devre Dışı Bırak</translation>
 <translation id="5090791951240382356">Farklı kaynaklara ait sözlük politikalarını birleştirmeye izin ver</translation>
@@ -3805,6 +3815,7 @@
           Bu ayar devre dışı bırakılır veya ayarlanmazsa, tüm ana makineler için varsayılan TalkGadget alan adı ('chromoting-host.talkgadget.google.com') kullanılır.
 
           Uzaktan erişim istemcileri bu politika ayarından etkilenmez. Bunlar, TalkGadget'a erişmek için her zaman 'chromoting-client.talkgadget.google.com' alan adını kullanır.</translation>
+<translation id="5888645257599699215">Cihaz ses durumunu bildir</translation>
 <translation id="5890063326284543943">Serial API'sinin kullanımını kontrol et</translation>
 <translation id="5897913798715600338">Pili hızlı şarj teknolojisiyle şarj et.</translation>
 <translation id="5898486742390981550">Birden fazla kullanıcı giriş yaptığında, yalnızca birincil kullanıcı Android uygulamalarını kullanabilir.</translation>
@@ -4431,8 +4442,10 @@
       Politika Devre Dışı değerine ayarlanırsa tarayıcı deneysel özellikler simgesi araç çubuğundan kaldırılır.
 
       chrome://flags ve tarayıcı özelliklerini açıp kapatmak için kullanılan herhangi başka bir yöntem, bu politikanın Etkin ya da Devre Dışı olmasından bağımsız olarak, beklendiği şekilde davranacaktır.</translation>
+<translation id="6794083666143216172">Kaynakların cihaz özelliklerini sorgulamasına izin ver</translation>
 <translation id="6795485990775913659">Yalnızca PIN olmadan yazdırmaya izin ver</translation>
 <translation id="6800181452282128474">Quirks Sunucularını sorgulama</translation>
+<translation id="68031099365512050">Ses durumunu bildir</translation>
 <translation id="6810445994095397827">Bu sitelerde JavaScript'i engelle</translation>
 <translation id="6813263547126514821">Açma ve kapatma</translation>
 <translation id="681446116407619279">Desteklenen kimlik doğrulama şemaları</translation>
@@ -4591,6 +4604,9 @@
 
       Şu anda desteklenen diller şunlardır: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.</translation>
 <translation id="6926703471186170050">Uzun kenar dupleks yazdırmayı etkinleştir</translation>
+<translation id="6928305045865155732">Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa kayıtlı cihazlar, cihaz ses seviyesini bildirir.
+
+      Politika, Devre Dışı değerine ayarlanırsa kayıtlı cihazlar, ses durumunu kaydetmez veya bildirmez.</translation>
 <translation id="6931242315485576290">Google ile veri senkronizasyonunu devre dışı bırak</translation>
 <translation id="6943577887654905793">Mac/Linux tercih adı:</translation>
 <translation id="6946652757373377924">
@@ -5932,6 +5948,19 @@
       Politikayı ayarlarsanız kullanıcılar bu fonksiyonu değiştiremez. Ayarlamadan bırakırsanız kullanıcılar bu ayarı değiştirebilir.</translation>
 <translation id="8715885991031124968">Farklı kaynaklı alt çerçevelerden tetiklenen JavaScript iletişim kutularına izin verilir.</translation>
 <translation id="8720547069538712402">Kullanıcının yazım denetimini etkinleştirmesine veya devre dışı bırakmasına izin verir</translation>
+<translation id="8726080977639508431">Bu politika, <ph name="PRODUCT_NAME" /> ürününün, Eski Tarayıcı Desteği özelliğinin site listesi/gri liste politikalarını nasıl yorumladığını kontrol eder. Şu politikaları etkiler: <ph name="URL_LIST_POLICY_NAME" />, <ph name="URL_GREYLIST_POLICY_NAME" />, <ph name="USE_IE_SITELIST_POLICY_NAME" />, <ph name="EXTERNAL_SITELIST_POLICY_NAME" /> ve <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />.
+
+      "Varsayılan", (0) değerine ayarlanırsa veya ayarlanmazsa URL eşleşmesi daha az katı kurallı olur. "/" karakterini içermeyen kurallar, URL'nin ana makine adının herhangi bir yerinde alt dize arar. URL yol bileşeninin eşleşmesi büyük/küçük harfe duyarlıdır.
+
+      "IESiteListMode", (1) değerine ayarlanırsa URL eşleşmesi daha katı kurallı olur. "/" karakterini içermeyen kurallar, yalnızca ana makine adının sonunda eşleşir. Alan adı sınırında da bulunmaları gerekir. URL yol bileşeninin eşleşmesi büyük/küçük harfe duyarlı değildir. Bu, <ph name="MS_IE_PRODUCT_NAME" /> ve <ph name="MS_EDGE_PRODUCT_NAME" /> ile daha uyumludur.
+
+      Örneğin, "example.com" ve "acme.com/abc" kurallarıyla:
+
+      "http://example.com/", "http://subdomain.example.com/" ve "http://acme.com/abc" URL'leri, ayrıştırma modundan bağımsız olarak eşleşir.
+
+      "http://notexample.com/", "http://example.com.invalid.com/" ve "http://example.comabc/" yalnızca "Varsayılan" modda eşleşir.
+
+      "http://acme.com/ABC" yalnızca "IESiteListMode" modunda eşleşir.</translation>
 <translation id="8736538322216687231">Minimum YouTube Kısıtlı Modu'nu zorla</translation>
 <translation id="8745669971728319820">Bu politika, uzantı ve eklenti bilgilerinin bildirilip bildirilmeyeceğini kontrol eder.
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index e56a229..21dea23 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -77,6 +77,9 @@
       如果將這項政策設為 False 或未設定,系統將不會回報這項資訊。
       如果設為 True,系統會回報裝置背光的資訊。</translation>
 <translation id="1076751984131277498">卸除式 USB 裝置許可清單</translation>
+<translation id="1079425471279127373">設定這項政策可讓強制安裝的網頁應用程式的某些來源,透過 Device Attributes API 取得各種裝置屬性,例如序號和主機名稱。
+
+      Device Attributes API 是一系列的網路 API,請參閱 https://wicg.github.io/WebApiDevice/device_attributes。這些 API 僅適用於透過 <ph name="WEB_APP_INSTALL_FORCE_LIST_POLICY_NAME" /> 強制安裝的網頁應用程式所對應的來源,或是在資訊站工作階段中設定的來源。</translation>
 <translation id="1079801999187584280">禁止使用開發人員工具</translation>
 <translation id="1082802595100075771">讓使用者選擇使用去識別化的 Google 服務,針對無標籤圖片提供自動產生的說明</translation>
 <translation id="1087437665304381368">這項政策只能控管 <ph name="PRODUCT_OS_NAME" />開發人員模式。如要禁止他人存取 Android 開發人員選項,則必須設定 <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> 政策。</translation>
@@ -855,6 +858,7 @@
 <translation id="2090939118981888335">如果將這項政策設為啟用,代表允許使用資料壓縮 Proxy。如果將這項政策設為停用,則代表禁止使用該 Proxy。
 
       如果設定這項政策,使用者將無法變更設定。如果不設定,使用者可選擇使用該功能。</translation>
+<translation id="2093552723795057221">不要回報音訊狀態</translation>
 <translation id="209586405398070749">穩定版</translation>
 <translation id="2098658257603918882">啟用使用量和當機相關資料的報告功能</translation>
 <translation id="2104418465060359056">回報擴充功能和外掛程式資訊</translation>
@@ -898,6 +902,9 @@
 <translation id="2151831603578119302">啟用無障礙功能快速鍵</translation>
 <translation id="2156132677421487971">設定「<ph name="PRODUCT_NAME" />」的各項政策。這項功能可讓使用者透過瀏覽器將分頁、網站或桌面內容傳送至遠端的螢幕和音響設備。</translation>
 <translation id="2156755242840687300">已啟用的外部列印伺服器</translation>
+<translation id="2157842368188031417">這項政策僅適用於受管理的訪客工作階段。你必須為 Imprivata 的共用工作站模式啟用此政策,才能讓使用者在工作階段中進行切換。
+      如果將此政策設為 True,系統會強制覆寫某些功能的政策,這些功能會保留機密的使用者資料,且不會由清理機制處理 (該機制用於 Imprivata 共用工作站模式下的工作階段中使用者切換作業)。
+      如果將這項政策設為 False 或不設定,系統便不會覆寫任何政策。</translation>
 <translation id="2160336427036785721">設定單一 <ph name="PRODUCT_NAME" /> 例項可用的記憶體大小。超過此值後,系統會開始捨棄分頁以節省記憶體。這表示系統會釋放分頁所用的記憶體,而當使用者切換至該分頁時,系統必須重新載入該分頁。
 
       設定這項政策後,如果超過記憶體使用限制,瀏覽器會開始捨棄分頁以節省記憶體。不過,我們無法保證瀏覽器運作時,記憶體使用量會一律在限制值以下。1024 以下的值會進位到 1024。
@@ -1897,6 +1904,7 @@
       如果停用或不設定這項政策,系統會停用這些傳輸層安全標準 (TLS)/DTLS 版本。
 
       這項政策僅是暫時性措施,我們會在日後的 <ph name="PRODUCT_NAME" /> 版本中予以移除。</translation>
+<translation id="3359186795130278362">啟用有限制的受管理訪客工作階段。</translation>
 <translation id="3360093276083825336">請注意,這項政策已遭淘汰,並將在 <ph name="PRODUCT_OS_NAME" />第 85 版中移除。請改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。
 
           指定電池供電時的閒置時間長度。如果使用者在這段時間內沒有任何動作,系統就會顯示警告對話方塊。
@@ -3131,6 +3139,7 @@
 
       注意:系統也可以透過 <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME" /> 政策將元素加入這份清單。</translation>
 <translation id="5067143124345820993">登入使用者許可清單</translation>
+<translation id="5071303485174858500">停用有限制的受管理訪客工作階段。</translation>
 <translation id="5073609397321802133">如果將這項政策設為 False,系統將禁止使用者自訂新分頁的背景。即使日後將這項政策設為 True,系統仍會永久移除任何現有的自訂背景。
 
       如果不設定這項政策或將其設為 True,使用者可以自訂新分頁的背景。</translation>
@@ -3138,6 +3147,7 @@
 
       如果將這項政策設為 False 或不設定,<ph name="PRODUCT_NAME" /> 會使用現有的線上撤銷檢查設定。</translation>
 <translation id="5078623750797048009">啟用 PDF 註解功能</translation>
+<translation id="5081204761483900654">有限制的受管理訪客工作階段</translation>
 <translation id="5082572440690475059">允許這些網站透過 File System API 進行讀取</translation>
 <translation id="5085647276663819155">停用列印預覽</translation>
 <translation id="5090791951240382356">允許合併不同來源的字典政策</translation>
@@ -3772,6 +3782,7 @@
           如果你停用這項設定或並未進行設置,則所有主機都會使用 TalkGadget 預設網域名稱 (「chromoting-host.talkgadget.google.com」)。
 
           遠端存取用戶端不受這項政策設定所影響,而會一律採用「chromoting-client.talkgadget.google.com」來存取 TalkGadget。</translation>
+<translation id="5888645257599699215">回報裝置音訊狀態</translation>
 <translation id="5890063326284543943">控管 Serial API 的使用</translation>
 <translation id="5897913798715600338">使用快速充電技術為電池充電。</translation>
 <translation id="5898486742390981550">如有多位使用者同時登入,只有主要使用者可以使用 Android 應用程式。</translation>
@@ -4396,8 +4407,10 @@
       如果將這項政策設為停用,則會從工具列中移除瀏覽器實驗功能圖示。
 
       無論這項政策設為啟用或停用,chrome://flags 和其他開啟/關閉瀏覽器功能的方法都能正常運作。</translation>
+<translation id="6794083666143216172">同意讓來源查詢裝置屬性</translation>
 <translation id="6795485990775913659">只在 PIN 碼停用時允許列印</translation>
 <translation id="6800181452282128474">不向 Quirks Server 發送查詢</translation>
+<translation id="68031099365512050">回報音訊狀態</translation>
 <translation id="6810445994095397827">封鎖這些網站的 JavaScript</translation>
 <translation id="6813263547126514821">電源與關機</translation>
 <translation id="681446116407619279">支援的驗證機制</translation>
@@ -4557,6 +4570,9 @@
 
       拼字檢查功能目前支援的語言如下:af、bg、ca、cs、da、de、el、en-AU、en-CA、en-GB、en-US、es、es-419、es-AR、es-ES、es-MX、es-US、et、fa、fo、fr、he、hi、hr、hu、id、it、ko、lt、lv、nb、nl、pl、pt-BR、pt-PT、ro、ru、sh、sk、sl、sq、sr、sv、ta、tg、tr、uk、vi。</translation>
 <translation id="6926703471186170050">啟用長邊雙面列印</translation>
+<translation id="6928305045865155732">如果將這項政策設為啟用或不設定,已註冊的裝置會回報裝置音量。
+
+      如果將這項政策設為停用,那麼已註冊的裝置就不會記錄或回報音訊狀態。</translation>
 <translation id="6931242315485576290">停用 Google 資料同步處理功能</translation>
 <translation id="6943577887654905793">Mac/Linux 偏好設定名稱:</translation>
 <translation id="6946652757373377924">
@@ -5890,6 +5906,17 @@
       如果設定這項政策,使用者將無法變更此功能。如果不設定,使用者將可變更這項設定。</translation>
 <translation id="8715885991031124968">允許從不同來源子頁框觸發的 JavaScript 對話方塊。</translation>
 <translation id="8720547069538712402">允許使用者啟用/停用拼字檢查功能</translation>
+<translation id="8726080977639508431">這項政策可控管 <ph name="PRODUCT_NAME" /> 如何解讀舊版瀏覽器支援功能的網站清單/可疑項目清單政策,影響範圍涵蓋以下政策:<ph name="URL_LIST_POLICY_NAME" />、<ph name="URL_GREYLIST_POLICY_NAME" />、<ph name="USE_IE_SITELIST_POLICY_NAME" />、<ph name="EXTERNAL_SITELIST_POLICY_NAME" /> 和 <ph name="EXTERNAL_GREYLIST_POLICY_NAME" />。
+
+      如果將這項政策設為「Default」(0) 或不設定,網址比對方式會較不嚴格,不含「/」的規則會尋找網址主機名稱中任意位置出現的子字串,而網址路徑元件的比對方式會區分大小寫。
+
+      如果將這項政策設為「IESiteListMode」(1),網址比對方式會比較嚴格,不含「/」的規則只會在主機名稱的結尾進行比對,這類規則比對的內容也不得超出網域名稱的範圍,而網址路徑元件的比對方式將不會區分大小寫。這種比對方式與 <ph name="MS_IE_PRODUCT_NAME" /> 及 <ph name="MS_EDGE_PRODUCT_NAME" /> 的相容性較高。
+
+      以「example.com」和「acme.com/abc」規則為例:
+
+      無論剖析模式為何,「http://example.com/」、「http://subdomain.example.com/」和「http://acme.com/abc」都是相符的結果。
+
+      不過,「http://notexample.com/」、「http://example.com.invalid.com/」、「http://example.comabc/」只有在「Default」模式下才會是相符的結果;「http://acme.com/ABC」則只會在「IESiteListMode」模式下才會是相符的結果。</translation>
 <translation id="8736538322216687231">強制執行低度的 YouTube 嚴格篩選模式</translation>
 <translation id="8745669971728319820">這項政策可控管系統是否要回報擴充功能和外掛程式資訊。
 
diff --git a/components/reporting/client/BUILD.gn b/components/reporting/client/BUILD.gn
index 40df259b..346f458 100644
--- a/components/reporting/client/BUILD.gn
+++ b/components/reporting/client/BUILD.gn
@@ -19,6 +19,24 @@
   ]
 }
 
+static_library("report_queue_factory") {
+  sources = [
+    "report_queue_factory.cc",
+    "report_queue_factory.h",
+  ]
+
+  deps = [
+    ":report_queue",
+    ":report_queue_configuration",
+    ":report_queue_provider",
+    "//base",
+    "//components/reporting/proto:record_constants",
+    "//components/reporting/util:backoff_settings",
+    "//components/reporting/util:status",
+    "//net:net",
+  ]
+}
+
 static_library("report_queue") {
   sources = [
     "report_queue.cc",
diff --git a/components/reporting/client/DEPS b/components/reporting/client/DEPS
index 6689d25..c02587e 100644
--- a/components/reporting/client/DEPS
+++ b/components/reporting/client/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
   "+base",
+  "+content/public/browser",
+  "+net/base/backoff_entry.h",
   "+third_party/protobuf",
 ]
diff --git a/components/reporting/client/report_queue_factory.cc b/components/reporting/client/report_queue_factory.cc
new file mode 100644
index 0000000..238ab36f
--- /dev/null
+++ b/components/reporting/client/report_queue_factory.cc
@@ -0,0 +1,78 @@
+// Copyright 2021 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/reporting/client/report_queue_factory.h"
+
+#include "base/bind.h"
+#include "base/bind_post_task.h"
+#include "base/callback.h"
+#include "base/strings/string_piece.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "build/build_config.h"
+#include "components/reporting/client/report_queue_configuration.h"
+#include "components/reporting/client/report_queue_provider.h"
+#include "components/reporting/util/backoff_settings.h"
+#include "net/base/backoff_entry.h"
+
+// TODO(1229994, marcgrimme) remove the logs after enterprise customer
+// feedback has been conculded.)
+#define LOG_WITH_STATUS(LEVEL, MESSAGE, STATUS) \
+  VLOG(LEVEL) << MESSAGE << " status=" << STATUS.status();
+
+namespace reporting {
+// TODO(1229988, marcgrimme): refactor the below logic according to
+//    the suggestions in the ticket.
+
+// static
+void ReportQueueFactory::Create(base::StringPiece dm_token_value,
+                                const Destination destination,
+                                SuccessCallback success_cb) {
+  DCHECK(base::ThreadTaskRunnerHandle::IsSet());
+
+  if (dm_token_value.empty()) {
+    VLOG(1) << "dm_token must not be empty.";
+    return;
+  }
+
+  auto config_result = ReportQueueConfiguration::Create(
+      std::string(dm_token_value.data()), destination,
+      base::BindRepeating([]() { return Status::StatusOK(); }));
+  if (!config_result.ok()) {
+    LOG_WITH_STATUS(1, "ReportQueueConfiguration is invalid.", config_result);
+    return;
+  }
+
+  // Asynchronously create and try to set ReportQueue.
+  auto try_set_cb = CreateTrySetCallback(
+      dm_token_value, destination, std::move(success_cb), GetBackoffEntry());
+  base::ThreadPool::PostTask(
+      FROM_HERE, base::BindOnce(ReportQueueProvider::CreateQueue,
+                                std::move(config_result.ValueOrDie()),
+                                std::move(try_set_cb)));
+}
+
+ReportQueueFactory::TrySetReportQueueCallback
+ReportQueueFactory::CreateTrySetCallback(
+    base::StringPiece dm_token_value,
+    const Destination destination,
+    SuccessCallback success_cb,
+    std::unique_ptr<net::BackoffEntry> backoff_entry) {
+  return base::BindPostTask(
+      base::ThreadTaskRunnerHandle::Get(),
+      base::BindOnce(&ReportQueueFactory::TrySetReportQueue,
+                     std::move(success_cb)));
+}
+
+// static
+void ReportQueueFactory::TrySetReportQueue(
+    SuccessCallback success_cb,
+    StatusOr<std::unique_ptr<ReportQueue>> report_queue_result) {
+  if (!report_queue_result.ok()) {
+    LOG_WITH_STATUS(1, "ReportQueue could not be created.",
+                    report_queue_result);
+    return;
+  }
+  std::move(success_cb).Run(std::move(report_queue_result.ValueOrDie()));
+}
+}  // namespace reporting
diff --git a/components/reporting/client/report_queue_factory.h b/components/reporting/client/report_queue_factory.h
new file mode 100644
index 0000000..ebc5380
--- /dev/null
+++ b/components/reporting/client/report_queue_factory.h
@@ -0,0 +1,55 @@
+// Copyright 2021 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_REPORTING_CLIENT_REPORT_QUEUE_FACTORY_H_
+#define COMPONENTS_REPORTING_CLIENT_REPORT_QUEUE_FACTORY_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/strings/string_piece_forward.h"
+#include "components/reporting/client/report_queue.h"
+#include "components/reporting/util/statusor.h"
+
+namespace net {
+class BackoffEntry;
+}  // namespace net
+
+namespace reporting {
+
+// Report queue factory simplify the creation of ReportQueues by abstracting
+// away both the ReportQueueProvider and the ReportQueueConfiguration. It also
+// allows automatic retries under the hood if the creation of the ReportQueue
+// fails. Usage would be ReportQueueFactory::Create(dm_token, destination,
+// success_callback) which represent the bare minimum requirements to create a
+// ReportQueue. dm_token is the DMToken value (as StringPiece) under which
+// identity the ReportQueue will be created. destination is a requirement to
+// define where the event is coming from. success_callback is the callback that
+// will pass the ReportQueue back to the model.
+class ReportQueueFactory {
+ public:
+  using SuccessCallback =
+      base::OnceCallback<void(std::unique_ptr<ReportQueue>)>;
+  using TrySetReportQueueCallback =
+      base::OnceCallback<void(StatusOr<std::unique_ptr<ReportQueue>>)>;
+
+  static void Create(base::StringPiece dm_token_value,
+                     const Destination destination,
+                     SuccessCallback done_cb);
+
+ private:
+  static void TrySetReportQueue(
+      SuccessCallback success_cb,
+      StatusOr<std::unique_ptr<reporting::ReportQueue>> report_queue_result);
+
+  static TrySetReportQueueCallback CreateTrySetCallback(
+      base::StringPiece dm_token_value,
+      const Destination destination,
+      SuccessCallback success_cb,
+      std::unique_ptr<net::BackoffEntry> backoff_entry);
+};
+
+}  // namespace reporting
+
+#endif  // COMPONENTS_REPORTING_CLIENT_REPORT_QUEUE_FACTORY_H_
diff --git a/components/services/heap_profiling/connection_manager.cc b/components/services/heap_profiling/connection_manager.cc
index 818c6fd..068915bc 100644
--- a/components/services/heap_profiling/connection_manager.cc
+++ b/components/services/heap_profiling/connection_manager.cc
@@ -164,6 +164,7 @@
 
 void ConnectionManager::DumpProcessesForTracing(
     bool strip_path_from_mapped_files,
+    bool write_proto,
     DumpProcessesForTracingCallback callback,
     VmRegions vm_regions) {
   base::AutoLock lock(connections_lock_);
@@ -184,6 +185,11 @@
   for (auto& it : connections_) {
     base::ProcessId pid = it.first;
     Connection* connection = it.second.get();
+    // TODO(ssid): Stop writing JSON to traces when proto output is enabled,
+    // https://crbug.com/1228548.
+    if (write_proto)
+      connection->client->AddHeapProfileToTrace(base::DoNothing());
+
     connection->client->RetrieveHeapProfile(base::BindOnce(
         &ConnectionManager::HeapProfileRetrieved, weak_factory_.GetWeakPtr(),
         tracking, pid, connection->process_type, strip_path_from_mapped_files,
diff --git a/components/services/heap_profiling/connection_manager.h b/components/services/heap_profiling/connection_manager.h
index 4048cf9d..6f4b002e 100644
--- a/components/services/heap_profiling/connection_manager.h
+++ b/components/services/heap_profiling/connection_manager.h
@@ -53,6 +53,7 @@
   // returns. The dump is complete when the callback provided in the args is
   // fired.
   void DumpProcessesForTracing(bool strip_path_from_mapped_files,
+                               bool write_proto,
                                DumpProcessesForTracingCallback callback,
                                VmRegions vm_regions);
 
diff --git a/components/services/heap_profiling/heap_profiling_service.cc b/components/services/heap_profiling/heap_profiling_service.cc
index 4763ea62..713ae6f 100644
--- a/components/services/heap_profiling/heap_profiling_service.cc
+++ b/components/services/heap_profiling/heap_profiling_service.cc
@@ -59,12 +59,14 @@
   // memory_instrumentation::mojom::HeapProfiler implementation:
   void DumpProcessesForTracing(
       bool strip_path_from_mapped_files,
+      bool write_proto,
       DumpProcessesForTracingCallback callback) override {
     std::vector<base::ProcessId> pids =
         connection_manager_.GetConnectionPidsThatNeedVmRegions();
     if (pids.empty()) {
       connection_manager_.DumpProcessesForTracing(
-          strip_path_from_mapped_files, std::move(callback), VmRegions());
+          strip_path_from_mapped_files, write_proto, std::move(callback),
+          VmRegions());
       return;
     }
 
@@ -75,17 +77,18 @@
         base::BindOnce(&ProfilingServiceImpl::
                            OnGetVmRegionsCompleteForDumpProcessesForTracing,
                        weak_factory_.GetWeakPtr(), strip_path_from_mapped_files,
-                       std::move(callback)));
+                       write_proto, std::move(callback)));
   }
 
  private:
   void OnGetVmRegionsCompleteForDumpProcessesForTracing(
       bool strip_path_from_mapped_files,
+      bool write_proto,
       DumpProcessesForTracingCallback callback,
       VmRegions vm_regions) {
-    connection_manager_.DumpProcessesForTracing(strip_path_from_mapped_files,
-                                                std::move(callback),
-                                                std::move(vm_regions));
+    connection_manager_.DumpProcessesForTracing(
+        strip_path_from_mapped_files, write_proto, std::move(callback),
+        std::move(vm_regions));
   }
 
   mojo::Receiver<memory_instrumentation::mojom::HeapProfiler>
diff --git a/components/services/heap_profiling/public/cpp/BUILD.gn b/components/services/heap_profiling/public/cpp/BUILD.gn
index fa8c70e..2ac0a14 100644
--- a/components/services/heap_profiling/public/cpp/BUILD.gn
+++ b/components/services/heap_profiling/public/cpp/BUILD.gn
@@ -26,6 +26,14 @@
     "//base:debugging_buildflags",
     "//base/allocator:buildflags",
   ]
+
+  if (!is_ios) {
+    sources += [
+      "heap_profiling_trace_source.cc",
+      "heap_profiling_trace_source.h",
+    ]
+    deps += [ "//services/tracing/public/cpp:cpp" ]
+  }
 }
 
 source_set("unit_tests") {
@@ -41,4 +49,13 @@
     "//base/test:test_support",
     "//testing/gtest",
   ]
+  if (!is_ios) {
+    sources += [ "heap_profiling_trace_source_unittest.cc" ]
+    deps += [
+      "//services/tracing:test_utils",
+      "//services/tracing/public/cpp:cpp",
+      "//third_party/perfetto/protos/perfetto/trace:lite",
+      "//third_party/perfetto/protos/perfetto/trace/profiling:lite",
+    ]
+  }
 }
diff --git a/components/services/heap_profiling/public/cpp/DEPS b/components/services/heap_profiling/public/cpp/DEPS
index 0ba279a..10e43b3 100644
--- a/components/services/heap_profiling/public/cpp/DEPS
+++ b/components/services/heap_profiling/public/cpp/DEPS
@@ -1,3 +1,6 @@
 include_rules = [
   "+components/services/heap_profiling/public",
+  "+services/tracing/public",
+  "+third_party/perfetto/include/perfetto/ext/tracing",
+  "+third_party/perfetto/protos/perfetto/trace",
 ]
diff --git a/components/services/heap_profiling/public/cpp/heap_profiling_trace_source.cc b/components/services/heap_profiling/public/cpp/heap_profiling_trace_source.cc
new file mode 100644
index 0000000..31391d6b
--- /dev/null
+++ b/components/services/heap_profiling/public/cpp/heap_profiling_trace_source.cc
@@ -0,0 +1,139 @@
+// Copyright 2021 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/services/heap_profiling/public/cpp/heap_profiling_trace_source.h"
+
+#include "base/profiler/frame.h"
+#include "base/profiler/module_cache.h"
+#include "base/trace_event/trace_event.h"
+#include "components/services/heap_profiling/public/cpp/merge_samples.h"
+#include "services/tracing/public/cpp/perfetto/interning_index.h"
+#include "services/tracing/public/cpp/perfetto/perfetto_producer.h"
+#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
+#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h"
+#include "services/tracing/public/mojom/perfetto_service.mojom.h"
+#include "third_party/perfetto/include/perfetto/ext/tracing/core/trace_writer.h"
+#include "third_party/perfetto/protos/perfetto/trace/profiling/profile_packet.pbzero.h"
+#include "third_party/perfetto/protos/perfetto/trace/trace_packet.pbzero.h"
+
+namespace heap_profiling {
+
+HeapProfilingTraceSource::HeapProfilingTraceSource()
+    : DataSourceBase(tracing::mojom::kNativeHeapProfilerSourceName) {
+  tracing::PerfettoTracedProcess::Get()->AddDataSource(this);
+}
+
+HeapProfilingTraceSource::~HeapProfilingTraceSource() = default;
+
+// static
+HeapProfilingTraceSource* HeapProfilingTraceSource::GetInstance() {
+  static base::NoDestructor<HeapProfilingTraceSource> instance;
+  return instance.get();
+}
+
+void HeapProfilingTraceSource::StartTracingImpl(
+    tracing::PerfettoProducer* producer,
+    const perfetto::DataSourceConfig& data_source_config) {
+  base::AutoLock l(lock_);
+  trace_writer_ =
+      producer->CreateTraceWriter(data_source_config.target_buffer());
+  stack_profiler_writer_ =
+      std::make_unique<tracing::TracingSamplerProfiler::StackProfileWriter>(
+          data_source_config.chrome_config().privacy_filtering_enabled());
+}
+
+void HeapProfilingTraceSource::StopTracingImpl(
+    base::OnceClosure stop_complete_callback) {
+  base::AutoLock l(lock_);
+  stack_profiler_writer_.reset();
+  trace_writer_.reset();
+  std::move(stop_complete_callback).Run();
+}
+
+void HeapProfilingTraceSource::Flush(
+    base::RepeatingClosure flush_complete_callback) {
+  flush_complete_callback.Run();
+}
+
+bool HeapProfilingTraceSource::AddToTraceIfEnabled(
+    const std::vector<base::SamplingHeapProfiler::Sample>& samples) {
+  base::AutoLock l(lock_);
+  if (!trace_writer_)
+    return false;
+
+  base::ModuleCache module_cache;
+
+  uint64_t timestamp = TRACE_TIME_TICKS_NOW().since_origin().InNanoseconds();
+
+  stack_profiler_writer_->ResetEmittedState();
+
+  {
+    // Write initial packet on sequence to specify incremental state is reset.
+    perfetto::TraceWriter::TracePacketHandle trace_packet;
+    trace_packet = trace_writer_->NewTracePacket();
+
+    trace_packet->set_timestamp(timestamp);
+    trace_packet->set_incremental_state_cleared(true);
+  }
+
+  // Write each sample in a new packet to keep the packet size small.
+  auto merged_samples = MergeSamples(samples);
+
+  uint32_t pid = base::GetCurrentProcId();
+  uint64_t index = 0;
+  for (auto& pair : merged_samples) {
+    perfetto::TraceWriter::TracePacketHandle trace_packet;
+    trace_packet = trace_writer_->NewTracePacket();
+
+    trace_packet->set_timestamp(timestamp);
+
+    const base::SamplingHeapProfiler::Sample& sample = pair.first;
+    const SampleValue& value = pair.second;
+
+    std::vector<base::Frame> frames;
+    frames.reserve(sample.stack.size());
+    for (const void* frame : sample.stack) {
+      uintptr_t address = reinterpret_cast<uintptr_t>(frame);
+      const base::ModuleCache::Module* module =
+          module_cache.GetModuleForAddress(address);
+      frames.emplace_back(address, module);
+    }
+    tracing::InterningID callstack_id =
+        stack_profiler_writer_->GetCallstackIDAndMaybeEmit(frames,
+                                                           &trace_packet);
+
+    auto* profile_packet = trace_packet->set_profile_packet();
+    profile_packet->set_continued(true);
+    profile_packet->set_index(index);
+    index++;
+    auto* process_dump = profile_packet->add_process_dumps();
+    process_dump->set_pid(pid);
+    process_dump->set_heap_name(sample.allocator ==
+                                        base::PoissonAllocationSampler::kMalloc
+                                    ? "malloc"
+                                    : "partition_alloc");
+    process_dump->set_timestamp(timestamp);
+
+    auto* sample_proto = process_dump->add_samples();
+    sample_proto->set_self_allocated(value.total);
+    sample_proto->set_alloc_count(value.count);
+    sample_proto->set_callstack_id(callstack_id);
+  }
+
+  {
+    // Write the end packet with continued=false to mark the current profile
+    // done.
+    perfetto::TraceWriter::TracePacketHandle trace_packet;
+    trace_packet = trace_writer_->NewTracePacket();
+
+    trace_packet->set_timestamp(timestamp);
+
+    auto* profile_packet = trace_packet->set_profile_packet();
+    profile_packet->set_continued(false);
+    profile_packet->set_index(index);
+  }
+  return true;
+}
+
+}  // namespace heap_profiling
diff --git a/components/services/heap_profiling/public/cpp/heap_profiling_trace_source.h b/components/services/heap_profiling/public/cpp/heap_profiling_trace_source.h
new file mode 100644
index 0000000..6a195b4
--- /dev/null
+++ b/components/services/heap_profiling/public/cpp/heap_profiling_trace_source.h
@@ -0,0 +1,63 @@
+// Copyright 2021 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_SERVICES_HEAP_PROFILING_PUBLIC_CPP_HEAP_PROFILING_TRACE_SOURCE_H_
+#define COMPONENTS_SERVICES_HEAP_PROFILING_PUBLIC_CPP_HEAP_PROFILING_TRACE_SOURCE_H_
+
+#include <vector>
+
+#include "base/no_destructor.h"
+#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
+#include "base/synchronization/lock.h"
+#include "base/thread_annotations.h"
+#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
+#include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h"
+
+namespace perfetto {
+class TraceWriter;
+}
+
+namespace heap_profiling {
+
+// Perfetto tracing data source for heap profiler. This writes the heap profiles
+// to trace in proto format.
+class HeapProfilingTraceSource
+    : public tracing::PerfettoTracedProcess::DataSourceBase {
+ public:
+  static HeapProfilingTraceSource* GetInstance();
+
+  // PerfettoTracedProcess::DataSourceBase implementation:
+  void StartTracingImpl(
+      tracing::PerfettoProducer* producer,
+      const perfetto::DataSourceConfig& data_source_config) override;
+  void StopTracingImpl(base::OnceClosure stop_complete_callback) override;
+  void Flush(base::RepeatingClosure flush_complete_callback) override;
+
+  // Writes heap profile to trace. Returns true if tracing was enabled and heap
+  // profile was added to the trace, false otherwise.
+  bool AddToTraceIfEnabled(
+      const std::vector<base::SamplingHeapProfiler::Sample>& samples);
+
+  HeapProfilingTraceSource(const HeapProfilingTraceSource&) = delete;
+  HeapProfilingTraceSource& operator=(const HeapProfilingTraceSource&) = delete;
+
+ private:
+  friend class base::NoDestructor<HeapProfilingTraceSource>;
+
+  HeapProfilingTraceSource();
+  ~HeapProfilingTraceSource() override;
+
+  // Start and stop calls are made from tracing sequence. AddToTrace() is called
+  // on sequence used by ProfilingClient. It is possible that the tracing
+  // sequence is blocked until heap profiles are finished when stopping. It is
+  // ok to wait until profile is finished to stop tracing session.
+  base::Lock lock_;
+  std::unique_ptr<perfetto::TraceWriter> trace_writer_ GUARDED_BY(lock_);
+  std::unique_ptr<tracing::TracingSamplerProfiler::StackProfileWriter>
+      stack_profiler_writer_ GUARDED_BY(lock_);
+};
+
+}  // namespace heap_profiling
+
+#endif  // COMPONENTS_SERVICES_HEAP_PROFILING_PUBLIC_CPP_HEAP_PROFILING_TRACE_SOURCE_H_
diff --git a/components/services/heap_profiling/public/cpp/heap_profiling_trace_source_unittest.cc b/components/services/heap_profiling/public/cpp/heap_profiling_trace_source_unittest.cc
new file mode 100644
index 0000000..2f7a1ee
--- /dev/null
+++ b/components/services/heap_profiling/public/cpp/heap_profiling_trace_source_unittest.cc
@@ -0,0 +1,119 @@
+// Copyright 2021 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/services/heap_profiling/public/cpp/heap_profiling_trace_source.h"
+
+#include "base/run_loop.h"
+#include "base/test/task_environment.h"
+#include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
+#include "services/tracing/public/cpp/perfetto/producer_test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/perfetto/protos/perfetto/trace/profiling/profile_packet.pb.h"
+#include "third_party/perfetto/protos/perfetto/trace/trace_packet.pb.h"
+
+namespace heap_profiling {
+namespace {
+
+class HeapProfilingProtoExporterTest : public testing::Test {
+ public:
+  void SetUp() override {
+    tracing::PerfettoTracedProcess::ResetTaskRunnerForTesting();
+    tracing::PerfettoTracedProcess::GetTaskRunner()->GetOrCreateTaskRunner();
+
+    auto perfetto_wrapper = std::make_unique<base::tracing::PerfettoTaskRunner>(
+        task_environment_.GetMainThreadTaskRunner());
+
+    producer_ = std::make_unique<tracing::TestProducerClient>(
+        std::move(perfetto_wrapper));
+  }
+
+  void TearDown() override {
+    // Be sure there is no pending/running tasks.
+    task_environment_.RunUntilIdle();
+  }
+
+  void BeginTrace() {
+    HeapProfilingTraceSource::GetInstance()->StartTracing(
+        /*data_source_id=*/1, producer_.get(), perfetto::DataSourceConfig());
+  }
+
+  void EndTracing() {
+    base::RunLoop wait_for_end;
+    HeapProfilingTraceSource::GetInstance()->StopTracing(
+        wait_for_end.QuitClosure());
+    wait_for_end.Run();
+  }
+
+  tracing::TestProducerClient* producer() const { return producer_.get(); }
+
+ protected:
+  std::unique_ptr<tracing::TestProducerClient> producer_;
+
+ private:
+  base::test::TaskEnvironment task_environment_;
+};
+
+using Sample = base::SamplingHeapProfiler::Sample;
+std::vector<Sample> MakeTestSamples() {
+  std::vector<Sample> samples{Sample(10, 100, 1), Sample(5, 102, 2),
+                              Sample(7, 103, 3)};
+  void* frame1 = reinterpret_cast<void*>(333);
+  void* frame2 = reinterpret_cast<void*>(666);
+  void* frame3 = reinterpret_cast<void*>(999);
+  samples[0].stack = {frame1};
+  samples[1].stack = {frame1, frame2};
+  samples[2].stack = {frame3, frame2, frame1};
+  return samples;
+}
+
+TEST_F(HeapProfilingProtoExporterTest, ProfilingDisabled) {
+  BeginTrace();
+  EndTracing();
+  EXPECT_EQ(producer()->GetFinalizedPacketCount(), 0u);
+}
+
+TEST_F(HeapProfilingProtoExporterTest, ProfilingWithoutTracing) {
+  auto samples = MakeTestSamples();
+  HeapProfilingTraceSource::GetInstance()->AddToTraceIfEnabled(samples);
+  BeginTrace();
+  EndTracing();
+  HeapProfilingTraceSource::GetInstance()->AddToTraceIfEnabled(samples);
+  EXPECT_EQ(producer()->GetFinalizedPacketCount(), 0u);
+}
+
+TEST_F(HeapProfilingProtoExporterTest, TraceFormat) {
+  auto samples = MakeTestSamples();
+  BeginTrace();
+  HeapProfilingTraceSource::GetInstance()->AddToTraceIfEnabled(samples);
+  EndTracing();
+  ASSERT_EQ(producer()->GetFinalizedPacketCount(), 5u);
+
+  const auto& packets = producer_->finalized_packets();
+  EXPECT_TRUE(packets[0]->incremental_state_cleared());
+  EXPECT_FALSE(packets[1]->incremental_state_cleared());
+  EXPECT_FALSE(packets[2]->incremental_state_cleared());
+  EXPECT_FALSE(packets[3]->incremental_state_cleared());
+  EXPECT_FALSE(packets[4]->incremental_state_cleared());
+
+  EXPECT_TRUE(packets[1]->profile_packet().continued());
+  EXPECT_TRUE(packets[2]->profile_packet().continued());
+  EXPECT_TRUE(packets[3]->profile_packet().continued());
+  EXPECT_FALSE(packets[4]->profile_packet().continued());
+
+  EXPECT_EQ(packets[1]->profile_packet().index(), 0u);
+  EXPECT_EQ(packets[2]->profile_packet().index(), 1u);
+  EXPECT_EQ(packets[3]->profile_packet().index(), 2u);
+  EXPECT_EQ(packets[4]->profile_packet().index(), 3u);
+
+  for (unsigned i = 1; i <= 3; ++i) {
+    const auto& process_dump = packets[i]->profile_packet().process_dumps(0);
+    EXPECT_TRUE(process_dump.has_pid());
+    EXPECT_TRUE(process_dump.has_timestamp());
+    EXPECT_EQ(process_dump.samples(0).self_allocated(), samples[i - 1].total);
+    EXPECT_EQ(process_dump.samples(0).callstack_id(), i);
+  }
+}
+
+}  // namespace
+}  // namespace heap_profiling
diff --git a/components/services/heap_profiling/public/cpp/profiling_client.cc b/components/services/heap_profiling/public/cpp/profiling_client.cc
index 5ec310be..d0ee8eed 100644
--- a/components/services/heap_profiling/public/cpp/profiling_client.cc
+++ b/components/services/heap_profiling/public/cpp/profiling_client.cc
@@ -19,6 +19,10 @@
 #include "base/trace_event/memory_dump_manager.h"
 #include "build/build_config.h"
 
+#if !defined(OS_IOS)
+#include "components/services/heap_profiling/public/cpp/heap_profiling_trace_source.h"
+#endif
+
 #if defined(OS_ANDROID) && BUILDFLAG(CAN_UNWIND_WITH_CFI_TABLE) && \
     defined(OFFICIAL_BUILD)
 #include "base/trace_event/cfi_backtrace_android.h"
@@ -72,6 +76,11 @@
 #else
   StartProfilingInternal(std::move(params), std::move(callback));
 #endif
+
+#if !defined(OS_IOS)
+  // Create trace source so that it registers itself to the tracing system.
+  HeapProfilingTraceSource::GetInstance();
+#endif
 }
 
 namespace {
@@ -196,4 +205,22 @@
   std::move(callback).Run(std::move(profile));
 }
 
+void ProfilingClient::AddHeapProfileToTrace(
+    AddHeapProfileToTraceCallback callback) {
+  auto* profiler = base::SamplingHeapProfiler::Get();
+  std::vector<base::SamplingHeapProfiler::Sample> samples =
+      profiler->GetSamples(/*profile_id=*/0);
+
+#if !defined(OS_IOS)
+  bool success =
+      HeapProfilingTraceSource::GetInstance()->AddToTraceIfEnabled(samples);
+#else
+  bool success = false;
+  // Tracing is not supported in iOS.
+  NOTREACHED();
+#endif
+
+  std::move(callback).Run(success);
+}
+
 }  // namespace heap_profiling
diff --git a/components/services/heap_profiling/public/cpp/profiling_client.h b/components/services/heap_profiling/public/cpp/profiling_client.h
index b8958f1..8f434d85 100644
--- a/components/services/heap_profiling/public/cpp/profiling_client.h
+++ b/components/services/heap_profiling/public/cpp/profiling_client.h
@@ -23,6 +23,7 @@
   void StartProfiling(mojom::ProfilingParamsPtr params,
                       StartProfilingCallback callback) override;
   void RetrieveHeapProfile(RetrieveHeapProfileCallback callback) override;
+  void AddHeapProfileToTrace(AddHeapProfileToTraceCallback callback) override;
 
   void BindToInterface(mojo::PendingReceiver<mojom::ProfilingClient> receiver);
 
diff --git a/components/services/heap_profiling/public/mojom/heap_profiling_client.mojom b/components/services/heap_profiling/public/mojom/heap_profiling_client.mojom
index b9f9b8c..ee062fd 100644
--- a/components/services/heap_profiling/public/mojom/heap_profiling_client.mojom
+++ b/components/services/heap_profiling/public/mojom/heap_profiling_client.mojom
@@ -77,5 +77,10 @@
   // There is currently no mechanism to stop recording allocations.
   StartProfiling(ProfilingParams params) => ();
 
+  // Captures and returns a snapshot of the heap profile of the current process.
   RetrieveHeapProfile() => (HeapProfile profile);
+
+  // Captures a snapshot of the heap profile and adds to Perfetto traces in
+  // proto format.
+  AddHeapProfileToTrace() => (bool success);
 };
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_chromeos_unittest.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_chromeos_unittest.cc
index 2b850c0..c62a101 100644
--- a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_chromeos_unittest.cc
+++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_chromeos_unittest.cc
@@ -21,7 +21,7 @@
 #include "components/account_manager_core/account_manager_facade.h"
 #include "components/account_manager_core/account_manager_facade_impl.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "components/signin/internal/identity_manager/account_tracker_service.h"
 #include "components/signin/internal/identity_manager/profile_oauth2_token_service_observer.h"
 #include "components/signin/public/base/signin_pref_names.h"
@@ -223,10 +223,10 @@
     account_manager_.SetPrefService(&pref_service_);
     task_environment_.RunUntilIdle();
 
-    account_manager_ash_ =
-        std::make_unique<crosapi::AccountManagerAsh>(&account_manager_);
+    account_manager_mojo_service_ =
+        std::make_unique<crosapi::AccountManagerMojoService>(&account_manager_);
     account_manager_facade_ =
-        CreateAccountManagerFacade(account_manager_ash_.get());
+        CreateAccountManagerFacade(account_manager_mojo_service_.get());
 
     account_tracker_service_.Initialize(&pref_service_, base::FilePath());
 
@@ -346,10 +346,11 @@
   }
 
   std::unique_ptr<AccountManagerFacade> CreateAccountManagerFacade(
-      crosapi::AccountManagerAsh* account_manager_ash) {
-    DCHECK(account_manager_ash);
+      crosapi::AccountManagerMojoService* account_manager_mojo_service) {
+    DCHECK(account_manager_mojo_service);
     mojo::Remote<crosapi::mojom::AccountManager> remote;
-    account_manager_ash->BindReceiver(remote.BindNewPipeAndPassReceiver());
+    account_manager_mojo_service->BindReceiver(
+        remote.BindNewPipeAndPassReceiver());
     return std::make_unique<account_manager::AccountManagerFacadeImpl>(
         std::move(remote),
         std::numeric_limits<uint32_t>::max() /* remote_version */);
@@ -363,7 +364,8 @@
   account_manager::AccountKey ad_account_key_;
   AccountTrackerService account_tracker_service_;
   AccountManager account_manager_;
-  std::unique_ptr<crosapi::AccountManagerAsh> account_manager_ash_;
+  std::unique_ptr<crosapi::AccountManagerMojoService>
+      account_manager_mojo_service_;
   std::unique_ptr<account_manager::AccountManagerFacade>
       account_manager_facade_;
   std::unique_ptr<ProfileOAuth2TokenServiceDelegateChromeOS> delegate_;
@@ -603,10 +605,10 @@
                              immediate_callback_runner_);
   account_manager.SetPrefService(&pref_service_);
 
-  auto account_manager_ash =
-      std::make_unique<crosapi::AccountManagerAsh>(&account_manager);
+  auto account_manager_mojo_service =
+      std::make_unique<crosapi::AccountManagerMojoService>(&account_manager);
   auto account_manager_facade =
-      CreateAccountManagerFacade(account_manager_ash.get());
+      CreateAccountManagerFacade(account_manager_mojo_service.get());
 
   // Register callbacks before AccountManager has been fully initialized.
   auto delegate = std::make_unique<ProfileOAuth2TokenServiceDelegateChromeOS>(
diff --git a/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.cc b/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.cc
index 4b2b1ecb..4bb4e96 100644
--- a/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.cc
+++ b/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.cc
@@ -7,7 +7,7 @@
 #include <limits>
 
 #include "components/account_manager_core/account_manager_facade_impl.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #include "google_apis/gaia/oauth2_access_token_fetcher.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -16,14 +16,15 @@
 TestProfileOAuth2TokenServiceDelegateChromeOS::
     TestProfileOAuth2TokenServiceDelegateChromeOS(
         AccountTrackerService* account_tracker_service,
-        crosapi::AccountManagerAsh* account_manager_ash,
+        crosapi::AccountManagerMojoService* account_manager_mojo_service,
         bool is_regular_profile) {
   if (!network::TestNetworkConnectionTracker::HasInstance()) {
     owned_tracker_ = network::TestNetworkConnectionTracker::CreateInstance();
   }
 
   mojo::Remote<crosapi::mojom::AccountManager> remote;
-  account_manager_ash->BindReceiver(remote.BindNewPipeAndPassReceiver());
+  account_manager_mojo_service->BindReceiver(
+      remote.BindNewPipeAndPassReceiver());
   account_manager_facade_ =
       std::make_unique<account_manager::AccountManagerFacadeImpl>(
           std::move(remote),
diff --git a/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.h b/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.h
index fe580ee1..fb522e27 100644
--- a/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.h
+++ b/components/signin/internal/identity_manager/test_profile_oauth2_token_service_delegate_chromeos.h
@@ -14,7 +14,7 @@
 class AccountTrackerService;
 
 namespace crosapi {
-class AccountManagerAsh;
+class AccountManagerMojoService;
 }
 
 namespace signin {
@@ -29,7 +29,7 @@
  public:
   TestProfileOAuth2TokenServiceDelegateChromeOS(
       AccountTrackerService* account_tracker_service,
-      crosapi::AccountManagerAsh* account_manager_ash,
+      crosapi::AccountManagerMojoService* account_manager_mojo_service,
       bool is_regular_profile);
   ~TestProfileOAuth2TokenServiceDelegateChromeOS() override;
   TestProfileOAuth2TokenServiceDelegateChromeOS(
diff --git a/components/signin/ios/browser/features.cc b/components/signin/ios/browser/features.cc
index a2be76ba..8773e005 100644
--- a/components/signin/ios/browser/features.cc
+++ b/components/signin/ios/browser/features.cc
@@ -33,25 +33,4 @@
     "SigninNotificationInfobarUsernameInTitle",
     base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kDisableSSOEditing{"DisableSSOEditing",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
-
-bool IsSSOEditingEnabled() {
-  return !base::FeatureList::IsEnabled(signin::kDisableSSOEditing);
-}
-
-const base::Feature kSSOAccountCreationInChromeTab{
-    "SSOAccountCreationInChromeTab", base::FEATURE_DISABLED_BY_DEFAULT};
-
-bool IsSSOAccountCreationInChromeTabEnabled() {
-  return base::FeatureList::IsEnabled(signin::kSSOAccountCreationInChromeTab);
-}
-
-const base::Feature kSSODisableAccountCreation{
-    "SSODisableAccountCreation", base::FEATURE_DISABLED_BY_DEFAULT};
-
-bool IsSSOAccountCreationEnabled() {
-  return !base::FeatureList::IsEnabled(signin::kSSODisableAccountCreation);
-}
-
 }  // namespace signin
diff --git a/components/signin/ios/browser/features.h b/components/signin/ios/browser/features.h
index e3522a6..f51ea1c 100644
--- a/components/signin/ios/browser/features.h
+++ b/components/signin/ios/browser/features.h
@@ -33,25 +33,6 @@
 // Feature controlling whether to use full username in sign-in notifications.
 extern const base::Feature kSigninNotificationInfobarUsernameInTitle;
 
-// This feature disable SSO editing.
-extern const base::Feature kDisableSSOEditing;
-
-// Returns true if SSO editing is enabled.
-bool IsSSOEditingEnabled();
-
-// This feature enable account creation in a Chrome tab.
-// This flag is unused if kSSODisableAccountCreation is set to true.
-extern const base::Feature kSSOAccountCreationInChromeTab;
-
-// Returns true if the account creation should be done in a Chrome tab.
-bool IsSSOAccountCreationInChromeTabEnabled();
-
-// This feature enable account creation.
-extern const base::Feature kSSODisableAccountCreation;
-
-// Returns true if the account creation is enabled.
-bool IsSSOAccountCreationEnabled();
-
 }  // namespace signin
 
 #endif  // COMPONENTS_SIGNIN_IOS_BROWSER_FEATURES_H_
diff --git a/components/signin/public/base/signin_pref_names.cc b/components/signin/public/base/signin_pref_names.cc
index 1803fb0e..da484a9 100644
--- a/components/signin/public/base/signin_pref_names.cc
+++ b/components/signin/public/base/signin_pref_names.cc
@@ -96,4 +96,8 @@
 const char kGaiaCookieLastListAccountsData[] =
     "gaia_cookie.last_list_accounts_data";
 
+// List of patterns to determine the account visibility.
+const char kRestrictAccountsToPatterns[] =
+    "signin.restrict_accounts_to_patterns";
+
 }  // namespace prefs
diff --git a/components/signin/public/base/signin_pref_names.h b/components/signin/public/base/signin_pref_names.h
index 8d49c5b..555d7f4 100644
--- a/components/signin/public/base/signin_pref_names.h
+++ b/components/signin/public/base/signin_pref_names.h
@@ -24,6 +24,7 @@
 extern const char kGoogleServicesLastUsername[];
 extern const char kGoogleServicesSigninScopedDeviceId[];
 extern const char kGoogleServicesUsernamePattern[];
+extern const char kRestrictAccountsToPatterns[];
 extern const char kReverseAutologinRejectedEmailList[];
 extern const char kSignedInWithCredentialProvider[];
 extern const char kSigninAllowed[];
diff --git a/components/signin/public/identity_manager/identity_manager_builder_unittest.cc b/components/signin/public/identity_manager/identity_manager_builder_unittest.cc
index 3f40219..b76bff7 100644
--- a/components/signin/public/identity_manager/identity_manager_builder_unittest.cc
+++ b/components/signin/public/identity_manager/identity_manager_builder_unittest.cc
@@ -27,7 +27,7 @@
 #include "ash/components/account_manager/account_manager_factory.h"
 #include "components/account_manager_core/account_manager_facade_impl.h"
 #include "components/account_manager_core/chromeos/account_manager.h"
-#include "components/account_manager_core/chromeos/account_manager_ash.h"
+#include "components/account_manager_core/chromeos/account_manager_mojo_service.h"
 #endif
 
 #if defined(OS_IOS)
@@ -109,7 +109,7 @@
 
   mojo::Remote<crosapi::mojom::AccountManager> remote;
   GetAccountManagerFactory()
-      ->GetAccountManagerAsh(dest_path.value())
+      ->GetAccountManagerMojoService(dest_path.value())
       ->BindReceiver(remote.BindNewPipeAndPassReceiver());
   auto account_manager_facade =
       std::make_unique<account_manager::AccountManagerFacadeImpl>(
diff --git a/components/signin/public/identity_manager/identity_manager_unittest.cc b/components/signin/public/identity_manager/identity_manager_unittest.cc
index 3535986..431ee30 100644
--- a/components/signin/public/identity_manager/identity_manager_unittest.cc
+++ b/components/signin/public/identity_manager/identity_manager_unittest.cc
@@ -354,14 +354,14 @@
             &test_url_loader_factory_));
     ash_account_manager->SetPrefService(&pref_service_);
 
-    auto* ash_account_manager_ash =
-        GetAccountManagerFactory()->GetAccountManagerAsh(
+    auto* ash_account_manager_mojo_service =
+        GetAccountManagerFactory()->GetAccountManagerMojoService(
             temp_profile_dir_.GetPath().value());
 
     auto token_service = std::make_unique<CustomFakeProfileOAuth2TokenService>(
         &pref_service_,
         std::make_unique<TestProfileOAuth2TokenServiceDelegateChromeOS>(
-            account_tracker_service.get(), ash_account_manager_ash,
+            account_tracker_service.get(), ash_account_manager_mojo_service,
             /*is_regular_profile=*/true));
 #else
     auto token_service =
diff --git a/components/signin/public/identity_manager/identity_test_environment.cc b/components/signin/public/identity_manager/identity_test_environment.cc
index c5b26d7..0a588e36 100644
--- a/components/signin/public/identity_manager/identity_test_environment.cc
+++ b/components/signin/public/identity_manager/identity_test_environment.cc
@@ -243,7 +243,8 @@
       pref_service,
       std::make_unique<TestProfileOAuth2TokenServiceDelegateChromeOS>(
           account_tracker_service.get(),
-          account_manager_factory->GetAccountManagerAsh(user_data_dir.value()),
+          account_manager_factory->GetAccountManagerMojoService(
+              user_data_dir.value()),
           /*is_regular_profile=*/true));
 
   return FinishBuildIdentityManagerForTests(
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 6c0dcce..4dcd747 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -136,9 +136,11 @@
 <translation id="1407135791313364759">Open all</translation>
 <translation id="1408787208417187241">Triple staple top</translation>
 <translation id="1413809658975081374">Privacy error</translation>
+<translation id="1422930527989633628">Can ask to discover nearby Bluetooth devices</translation>
 <translation id="1426410128494586442">Yes</translation>
 <translation id="1428146450423315676">Stacker 7</translation>
 <translation id="1430915738399379752">Print</translation>
+<translation id="1436185428532214179">Can ask to edit files and folders on your device</translation>
 <translation id="1442386063175183758">Right gate fold</translation>
 <translation id="1442987760062738829">Punch</translation>
 <translation id="1447067628680007684">(x86_64)</translation>
@@ -257,6 +259,7 @@
 <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, multiple actions are available; press 'Tab' to cycle through them</translation>
 <translation id="1800473098294731951">B9</translation>
 <translation id="1803264062614276815">Cardholder name</translation>
+<translation id="1803351196216024260">Can ask to use your microphone</translation>
 <translation id="1807246157184219062">Light</translation>
 <translation id="1807528111851433570">Start sheet</translation>
 <translation id="1812527064848182527">landscape</translation>
@@ -286,6 +289,7 @@
 <translation id="1919367280705858090">Get help with a specific error message</translation>
 <translation id="192020519938775529">{COUNT,plural, =0{None}=1{1 site}other{# sites}}</translation>
 <translation id="1924727005275031552">New</translation>
+<translation id="1939175642807587452">Can ask to send notifications</translation>
 <translation id="1945968466830820669">You could lose access to your organisation's account or experience identity theft. Chromium recommends changing your password now.</translation>
 <translation id="1947454675006758438">Staple top right</translation>
 <translation id="1958218078413065209">Your highest score is <ph name="SCORE" />.</translation>
@@ -416,6 +420,7 @@
 <translation id="2392959068659972793">Show policies with no value set</translation>
 <translation id="239429038616798445">This delivery method isn’t available. Try a different method.</translation>
 <translation id="2396249848217231973">&amp;Undo delete</translation>
+<translation id="2400600116338235695">Can ask to connect to serial ports</translation>
 <translation id="2410754574180102685">Government-Legal</translation>
 <translation id="2413155254802890957">Old</translation>
 <translation id="2413528052993050574">This server could not prove that it is <ph name="DOMAIN" />; its security certificate might be revoked. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
@@ -470,6 +475,7 @@
 <translation id="2609632851001447353">Variations</translation>
 <translation id="2618023639789766142">C10 (Envelope)</translation>
 <translation id="2625385379895617796">Your clock is ahead</translation>
+<translation id="262745152991669301">Can ask to connect to USB devices</translation>
 <translation id="2629325967560697240">To get Chrome’s highest level of security, <ph name="BEGIN_ENHANCED_PROTECTION_LINK" />turn on enhanced protection<ph name="END_ENHANCED_PROTECTION_LINK" /></translation>
 <translation id="2634124572758952069"><ph name="HOST_NAME" />’s server IP address could not be found.</translation>
 <translation id="2639739919103226564">Status:</translation>
@@ -613,6 +619,7 @@
 <translation id="3188393374551744535">Account balance</translation>
 <translation id="3194737229810486521"><ph name="URL" /> wants to permanently store data on your device</translation>
 <translation id="3195213714973468956"><ph name="PRINTER_NAME" /> on <ph name="SERVER_NAME" /></translation>
+<translation id="3197136577151645743">Can ask to know when you're actively using this device</translation>
 <translation id="3202497928925179914"><ph name="MANAGE_SYNC_FOCUSED_FRIENDLY_MATCH_TEXT" />, press Tab then Enter to manage what info you sync in Chrome settings</translation>
 <translation id="320323717674993345">Cancel payment</translation>
 <translation id="3207960819495026254">Bookmarked</translation>
@@ -829,6 +836,7 @@
 <translation id="3909695131102177774"><ph name="LABEL" /> <ph name="ERROR" /></translation>
 <translation id="3939773374150895049">Use WebAuthn instead of CVC?</translation>
 <translation id="3946209740501886391">Always ask on this site</translation>
+<translation id="3947595700203588284">Can ask to connect to MIDI devices</translation>
 <translation id="3949571496842715403">This server could not prove that it is <ph name="DOMAIN" />; its security certificate does not specify Subject Alternative Names. This may be caused by a misconfiguration or an attacker intercepting your connection.</translation>
 <translation id="3949601375789751990">Your browsing history appears here</translation>
 <translation id="3949790930165450333"><ph name="DEVICE_NAME" /> (<ph name="DEVICE_ID" />)</translation>
@@ -929,6 +937,7 @@
     &lt;p&gt;If you still see the error, contact the website owner.&lt;/p&gt;</translation>
 <translation id="4226937834893929579"><ph name="BEGIN_LINK" />Try running Network Diagnostics<ph name="END_LINK" />.</translation>
 <translation id="4229544452621580519">Run a safety check in Chrome settings</translation>
+<translation id="4230204356098880324">Can ask to use and move your camera</translation>
 <translation id="4234495348042597185"><ph name="BEGIN_LINK" />Proceed to <ph name="SITE" /><ph name="END_LINK" /></translation>
 <translation id="4235360514405112390">Valid</translation>
 <translation id="4250431568374086873">Your connection to this site is not fully secure</translation>
@@ -991,6 +1000,7 @@
 <translation id="4434045419905280838">Pop-ups and redirects</translation>
 <translation id="4435702339979719576">Postcard)</translation>
 <translation id="443673843213245140">Use of a proxy is disabled but an explicit proxy configuration is specified.</translation>
+<translation id="4451135742916150903">Can ask to connect to HID devices</translation>
 <translation id="4460315069258617173">Allowed until you close tabs for this site</translation>
 <translation id="4464826014807964867">Websites with info from your organisation</translation>
 <translation id="4476953670630786061">This form is not secure. Auto-fill has been turned off.</translation>
@@ -1054,6 +1064,7 @@
 <translation id="4708268264240856090">Your connection was interrupted</translation>
 <translation id="4712404868219726379">Windows Hello</translation>
 <translation id="4722547256916164131"><ph name="BEGIN_LINK" />Running Windows Network Diagnostics<ph name="END_LINK" /></translation>
+<translation id="4724144314178270921">Can ask to see text and images on your clipboard</translation>
 <translation id="4726672564094551039">Reload policies</translation>
 <translation id="4728558894243024398">Platform</translation>
 <translation id="4731638775147756694">This application has been blocked by your administrator</translation>
@@ -1351,6 +1362,7 @@
 <translation id="5728056243719941842">C5 (Envelope)</translation>
 <translation id="5730040223043577876">Chrome recommends resetting your password if you reused it on other sites.</translation>
 <translation id="5737183892635480227">{NUM_CARDS,plural, =1{Save card in your Google Account}other{Save cards in your Google Account}}</translation>
+<translation id="5745733273847572235">Can ask for your location</translation>
 <translation id="5745980000221562234">{NUM_CARDS,plural, =1{Use a virtual number for this card}other{Select a card}}</translation>
 <translation id="5759751709240058861">Use and move your camera</translation>
 <translation id="5763042198335101085">Enter a valid email address</translation>
@@ -1469,6 +1481,7 @@
 <translation id="6169916984152623906">Now you can browse privately, and other people who use this device won’t see your activity. However, downloads and bookmarks will be saved.</translation>
 <translation id="6177128806592000436">Your connection to this site is not secure</translation>
 <translation id="6180316780098470077">Retry interval</translation>
+<translation id="619448280891863779">Can ask to open and place windows on your screens</translation>
 <translation id="6196640612572343990">Block third-party cookies</translation>
 <translation id="6203231073485539293">Check your Internet connection</translation>
 <translation id="6211666000885129820">Secure payment credential enrolment sheet</translation>
@@ -1554,6 +1567,7 @@
 <translation id="6502991525169604759">Without your changes</translation>
 <translation id="6505563257409036437">Close incognito windows</translation>
 <translation id="6508722015517270189">Restart Chrome</translation>
+<translation id="6513005815064132016">Can ask to track your camera position</translation>
 <translation id="6517596291481585650">Warning: This policy was not merged as a list as specified by policy because it is not a list.</translation>
 <translation id="6518133107902771759">Verify</translation>
 <translation id="6521745193039995384">Not active</translation>
@@ -1654,7 +1668,9 @@
 <translation id="6949872517221025916">Reset password</translation>
 <translation id="6950684638814147129">Error while parsing JSON value: <ph name="ERROR" /></translation>
 <translation id="695140971690006676">Reset all</translation>
+<translation id="6954341342296443517">Can ask to open types of files</translation>
 <translation id="6957887021205513506">The server's certificate appears to be a forgery.</translation>
+<translation id="6961844873822989059">Can ask to use fonts installed on your device</translation>
 <translation id="6963520811470373926">Superseding</translation>
 <translation id="6964255747740675745">Network configuration failed to be parsed (invalid JSON).</translation>
 <translation id="6965382102122355670">OK</translation>
@@ -1756,6 +1772,7 @@
 <translation id="733354035281974745">Device local account override</translation>
 <translation id="7333654844024768166">You just entered your password on a deceptive site. Chromium recommends going to <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> and other sites where you use this password and changing it now.</translation>
 <translation id="7334320624316649418">&amp;Redo reorder</translation>
+<translation id="7335157162773372339">Can ask to use your camera</translation>
 <translation id="7337248890521463931">Show more lines</translation>
 <translation id="7337706099755338005">Not available on your platform.</translation>
 <translation id="733923710415886693">The server's certificate was not disclosed via Certificate Transparency.</translation>
@@ -1943,6 +1960,7 @@
 <translation id="7937554595067888181">Expires on <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="7938958445268990899">Server's certificate is not yet valid.</translation>
 <translation id="7942349550061667556">Red</translation>
+<translation id="7943893128817522649">Can ask to automatically download multiple files</translation>
 <translation id="7947285636476623132">Check your expiry year and try again</translation>
 <translation id="7947813448670013867"><ph name="SEE_CHROME_TIPS_FOCUSED_FRIENDLY_MATCH_TEXT" />: press Tab then Enter to learn about Chrome features</translation>
 <translation id="7950027195171824198">Manage your cookie preferences in Chrome settings</translation>
@@ -1955,6 +1973,7 @@
 <translation id="7976214039405368314">Too many requests</translation>
 <translation id="7977538094055660992">Output device</translation>
 <translation id="7977894662897852582">Edp</translation>
+<translation id="798134797138789862">Can ask to use virtual reality devices and data</translation>
 <translation id="79859296434321399">To view augmented reality content, install ARCore</translation>
 <translation id="7986319120639858961"><ph name="CARD_TITLE" /> <ph name="TIME" /> <ph name="BOOKMARKED" /> <ph name="TITLE" /> <ph name="DOMAIN" /></translation>
 <translation id="799149739215780103">Bind</translation>
@@ -2144,6 +2163,7 @@
 <translation id="8699041776323235191">HID device</translation>
 <translation id="8703575177326907206">Your connection to <ph name="DOMAIN" /> is not encrypted.</translation>
 <translation id="8705331520020532516">Serial Number</translation>
+<translation id="8708134712139312373">Can ask to connect to Bluetooth devices</translation>
 <translation id="8710842507289500830">Font style</translation>
 <translation id="8712637175834984815">Got it</translation>
 <translation id="8718314106902482036">Payment not completed</translation>
diff --git a/content/browser/loader/navigation_url_loader_delegate.h b/content/browser/loader/navigation_url_loader_delegate.h
index 6d4e1e2..b400360 100644
--- a/content/browser/loader/navigation_url_loader_delegate.h
+++ b/content/browser/loader/navigation_url_loader_delegate.h
@@ -102,9 +102,10 @@
   virtual void OnRequestFailed(
       const network::URLLoaderCompletionStatus& status) = 0;
 
-  // Creates a URLLoaderFactory for Early Hints preloads. Also calculates and
-  // returns the origin to be used for network::ResourceRequest.
-  virtual url::Origin CreateURLLoaderFactoryForEarlyHintsPreload(
+  // Creates a URLLoaderFactory for Early Hints preloads. On success returns the
+  // calculated origin to be used for network::ResourceRequest.
+  virtual absl::optional<url::Origin>
+  CreateURLLoaderFactoryForEarlyHintsPreload(
       mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
       const network::mojom::EarlyHints& early_hints) = 0;
 
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 3fcf2f3..08ebbef 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -765,10 +765,15 @@
 
   if (!early_hints_manager_) {
     mojo::Remote<network::mojom::URLLoaderFactory> loader_factory;
-    url::Origin origin = delegate_->CreateURLLoaderFactoryForEarlyHintsPreload(
-        loader_factory.BindNewPipeAndPassReceiver(), *early_hints);
+    absl::optional<url::Origin> origin =
+        delegate_->CreateURLLoaderFactoryForEarlyHintsPreload(
+            loader_factory.BindNewPipeAndPassReceiver(), *early_hints);
+
+    if (!origin.has_value())
+      return;
+
     early_hints_manager_ = std::make_unique<NavigationEarlyHintsManager>(
-        *browser_context_, std::move(loader_factory), origin,
+        *browser_context_, std::move(loader_factory), *origin,
         frame_tree_node_id_);
   }
 
diff --git a/content/browser/prerender/prerender_origin_trial_browsertest.cc b/content/browser/prerender/prerender_origin_trial_browsertest.cc
index 0118be3..1c4b7d0 100644
--- a/content/browser/prerender/prerender_origin_trial_browsertest.cc
+++ b/content/browser/prerender/prerender_origin_trial_browsertest.cc
@@ -270,7 +270,7 @@
 //                | disabled  | enabled   | default   |
 // ---------------|-----------|-----------|-----------|
 //     | disabled | false     | false     | false     |
-// REF | enabled  | false     | true      | false     |
+// REF | enabled  | false     | true      | IsAndroid |
 //     | default  | false     | true      | false     |
 IN_PROC_BROWSER_TEST_P(PrerenderOriginTrialBrowserTest, WithoutTrialToken) {
   LoadPageWithoutTrialToken();
@@ -286,7 +286,17 @@
       }
       break;
     case FeatureEnabledType::kDefault:
+      // Currently blink::features::kPrerender2 is default-enabled only on
+      // Android.
+#ifdef OS_ANDROID
+      if (testing::get<1>(GetParam()) == BlinkFeatureEnabledType::kEnabled) {
+        CheckFeatureEnabled(true);
+      } else {
+        CheckFeatureDisabled();
+      }
+#else   // OS_ANDROID
       CheckFeatureDisabled();
+#endif  // OS_ANDROID
       break;
   }
 }
@@ -298,9 +308,9 @@
 //                |    blink::features::kPrerender2   |
 //                | disabled  | enabled   | default   |
 // ---------------|-----------|-----------|-----------|
-//     | disabled | false     | IsAndroid | false     |
-// REF | enabled  | false     | true      | false     |
-//     | default  | false     | true      | false     |
+//     | disabled | false     | IsAndroid | IsAndroid |
+// REF | enabled  | false     | true      | IsAndroid |
+//     | default  | false     | true      | IsAndroid |
 IN_PROC_BROWSER_TEST_P(PrerenderOriginTrialBrowserTest, WithTrialToken) {
   LoadPageWithTrialToken();
   switch (testing::get<0>(GetParam())) {
@@ -320,7 +330,16 @@
       }
       break;
     case FeatureEnabledType::kDefault:
+      // Currently Origin Trial for Prerender2 is available only on Android.
+#ifdef OS_ANDROID
+      if (testing::get<1>(GetParam()) == BlinkFeatureEnabledType::kEnabled) {
+        CheckFeatureEnabled(true);
+      } else {
+        CheckFeatureEnabled(false);
+      }
+#else   // OS_ANDROID
       CheckFeatureDisabled();
+#endif  // OS_ANDROID
       break;
   }
 }
diff --git a/content/browser/renderer_host/frame_tree.h b/content/browser/renderer_host/frame_tree.h
index ca79497..aebdf7f 100644
--- a/content/browser/renderer_host/frame_tree.h
+++ b/content/browser/renderer_host/frame_tree.h
@@ -28,6 +28,11 @@
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-forward.h"
 
 namespace blink {
+namespace mojom {
+class BrowserInterfaceBroker;
+enum class TreeScopeType;
+}  // namespace mojom
+
 struct FramePolicy;
 }  // namespace blink
 
@@ -35,6 +40,7 @@
 
 class BrowserContext;
 class PageDelegate;
+class PageImpl;
 class RenderFrameHostDelegate;
 class RenderViewHostDelegate;
 class RenderViewHostImpl;
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 3eec4e7..6b06ce27 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -3231,7 +3231,8 @@
       status.should_collapse_initiator /* collapse_frame */);
 }
 
-url::Origin NavigationRequest::CreateURLLoaderFactoryForEarlyHintsPreload(
+absl::optional<url::Origin>
+NavigationRequest::CreateURLLoaderFactoryForEarlyHintsPreload(
     mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
     const network::mojom::EarlyHints& early_hints) {
   // Early Hints preloads should happen only before the final response is
@@ -3247,6 +3248,10 @@
                                    ->GetSiteInstanceForNavigationRequest(this)
                                    ->GetProcess();
 
+  // The process is shutting down.
+  if (!process->GetBrowserContext())
+    return absl::nullopt;
+
   // Compute sandbox flags. Currently just inherit from the frame.
   // TODO(crbug.com/1225556): Think about the right way the specification should
   // handle sandbox flags with Early Hints.
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h
index efe7b70..413b929c 100644
--- a/content/browser/renderer_host/navigation_request.h
+++ b/content/browser/renderer_host/navigation_request.h
@@ -1009,7 +1009,7 @@
       EarlyHints early_hints) override;
   void OnRequestFailed(
       const network::URLLoaderCompletionStatus& status) override;
-  url::Origin CreateURLLoaderFactoryForEarlyHintsPreload(
+  absl::optional<url::Origin> CreateURLLoaderFactoryForEarlyHintsPreload(
       mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
       const network::mojom::EarlyHints& early_hints) override;
 
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h
index db62a13..eaaa9afd4 100644
--- a/content/browser/renderer_host/render_frame_host_manager.h
+++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -18,12 +18,12 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "content/browser/renderer_host/back_forward_cache_impl.h"
-#include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/renderer_host/should_swap_browsing_instance.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/browser/web_exposed_isolation_info.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/global_request_id.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/common/referrer.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
@@ -33,7 +33,15 @@
 #include "ui/base/page_transition_types.h"
 #include "url/origin.h"
 
+namespace blink {
+struct FramePolicy;
+}  // namespace blink
+
 namespace content {
+namespace mojom {
+class Frame;
+}  // namespace mojom
+
 class FrameTree;
 class FrameTreeNode;
 class NavigationControllerImpl;
@@ -42,6 +50,7 @@
 class NavigatorTest;
 class RenderFrameHostManagerTest;
 class RenderFrameProxyHost;
+class RenderFrameHostImpl;
 class RenderViewHost;
 class RenderViewHostImpl;
 class RenderWidgetHostViewBase;
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index c2356a3d..bb1ae48 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -83,6 +83,7 @@
 #include "content/browser/storage_partition_impl.h"
 #include "content/common/content_constants_internal.h"
 #include "content/common/cursors/webcursor.h"
+#include "content/common/frame.mojom.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/device_service.h"
diff --git a/content/common/agent_scheduling_group.mojom b/content/common/agent_scheduling_group.mojom
index 104949ea..a3d1b5f 100644
--- a/content/common/agent_scheduling_group.mojom
+++ b/content/common/agent_scheduling_group.mojom
@@ -15,6 +15,11 @@
 // Interface for general communication between the renderer process's
 // AgentSchedulingGroup and the browser process's AgentSchedulingGroupHost.
 // Implemented by AgentSchedulingGroupHost (in the browser process).
+//
+// This interface is associated with this AgentSchedulingGroup's channel.
+// The renderer process retrieves it via
+// AgentSchedulingGroup.BindAssociatedInterfaces(). See comments on
+// AgentSchedulingGroup for more about channels.
 interface AgentSchedulingGroupHost {
   // Acknowledge a RenderFrame was unloaded due to NavigationControl::Unload().
   // This is not simply a reply callback on NavigationControl::Unload() because
@@ -28,16 +33,32 @@
 // Interface for general communication between the browser process's
 // AgentSchedulingGroupHost and the renderer process's AgentSchedulingGroup.
 // Implemented by content::AgentSchedulingGroup (in the renderer process).
+//
+// The interface's message pipe depends on the mode that the Multiple Blink
+// Isolate (MBI) feature is using (https://crbug.com/1051790).
+//
+// In non-kLegacy mode: there is a legacy IPC channel per AgentSchedulingGroup.
+// The channel is created along with this interface, which it is associated
+// with. Messages are *not* ordered with the per-process legacy IPC channel.
+//
+// In kLegacy mode: there is one legacy IPC channel per renderer and this
+// interface is channel-associated with it. The browser process retrieves it via
+// GetRemoteAssociatedInterface().
+//
+// See the comments for MBIMode in content/public/common/content_features.h for
+// more details.
 interface AgentSchedulingGroup {
   // Tells the renderer to bind the AgentSchedulingGroup's associated
   // interfaces. This includes the host remote (mojom::AgentSchedulingGroupHost)
   // as well as RouteProvider remote/receiver pair.
   // We have this as a method on this interface, as opposed to passing the
-  // pending interfaces over the method that creates the AgentSchedulingGroup.
-  // This is because we need these interfaces to be associated with the message
-  // pipe that the AgentSchedulingGroup is associated with, which may be
-  // different than the message pipe that we create the AgentSchedulingGroup
-  // over.
+  // pending interfaces over the method that creates the AgentSchedulingGroup:
+  // Renderer.CreateAgentSchedulingGroup() or
+  // Renderer.CreateAgentAssociatedSchedulingGroup() (depending on the mode, see
+  // the interface comments). This is because we need these interfaces to be
+  // associated with the message pipe that the AgentSchedulingGroup is
+  // associated with, which may be different than the message pipe that we
+  // create the AgentSchedulingGroup over.
   BindAssociatedInterfaces(
     pending_associated_remote<AgentSchedulingGroupHost> remote_host,
     pending_associated_remote<RouteProvider> remote_route_provider,
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc
index 9d2eed6ea..5e52e179 100644
--- a/content/test/test_navigation_url_loader_delegate.cc
+++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -84,12 +84,12 @@
     request_failed_->Quit();
 }
 
-url::Origin
+absl::optional<url::Origin>
 TestNavigationURLLoaderDelegate::CreateURLLoaderFactoryForEarlyHintsPreload(
     mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
     const network::mojom::EarlyHints& early_hints) {
   NOTREACHED();
-  return url::Origin();
+  return absl::nullopt;
 }
 
 }  // namespace content
diff --git a/content/test/test_navigation_url_loader_delegate.h b/content/test/test_navigation_url_loader_delegate.h
index 80eb28e..6e9783f 100644
--- a/content/test/test_navigation_url_loader_delegate.h
+++ b/content/test/test_navigation_url_loader_delegate.h
@@ -69,7 +69,7 @@
       EarlyHints early_hints) override;
   void OnRequestFailed(
       const network::URLLoaderCompletionStatus& status) override;
-  url::Origin CreateURLLoaderFactoryForEarlyHintsPreload(
+  absl::optional<url::Origin> CreateURLLoaderFactoryForEarlyHintsPreload(
       mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver,
       const network::mojom::EarlyHints& early_hints) override;
 
diff --git a/docs/login/fingerprint.md b/docs/login/fingerprint.md
index b40f6fe..2954d69 100644
--- a/docs/login/fingerprint.md
+++ b/docs/login/fingerprint.md
@@ -22,7 +22,7 @@
 
 Fingerprint unlock policy is dependent on device policy and hardware specs.
 Fingerprint can be manually enabled for testing by calling:
-chromeos::quick_unlock::EnabledForTesting(true) to force enable fingerprint features.
+ash::quick_unlock::EnabledForTesting(true) to force enable fingerprint features.
 
 Fingerprint unlock is not considered strong authentication. This means that,
 under certain policies, fingerprint cannot be the only method of authentication
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index c94a6f9..df6ab3762 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2402,13 +2402,13 @@
       <message name="IDS_IOS_SYNC_ENCRYPTION_PASSPHRASE_INFO" desc="The information text for encrypting sync using a passphrase, shown on the passphrase screen [iOS only]">
         Passphrase encryption doesn’t include payment methods and addresses from Google Pay. Only someone with your passphrase can read your encrypted data. The passphrase is not sent to or stored by Google. If you forget your passphrase or want to change this setting, you will need to reset sync. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph>
       </message>
-      <message name="IDS_IOS_SYNC_ENCRYPTION_FIX_NOW" desc="Title displayed when the signed in user needs to reauthenticate. Syncing of encrypted types (e.g. passwords) is blocked until the user completes the reauth flow.">
+      <message name="IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON" desc="Button title displayed when the signed in user needs to reauthenticate. Syncing of encrypted types (e.g. passwords) is blocked until the user completes the reauth flow.">
         Verify It's You
       </message>
       <message name="IDS_IOS_SYNC_ENCRYPTION_TITLE" desc="The title for the Sync Encryption item [iOS only]">
         Encryption
       </message>
-      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE" desc="Title displayed when the signed in user needs to enter its sync passphrase. [Length: 20em] [iOS only]">
+      <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BUTTON" desc="Button title displayed when the signed in user needs to enter its sync passphrase. [Length: 20em] [iOS only]">
         Enter Passphrase
       </message>
       <message name="IDS_IOS_SYNC_ENTER_PASSPHRASE_BODY_WITH_EMAIL" desc="Instructions for the dialog where the user enters the passphrase.">
@@ -2472,7 +2472,7 @@
       <message name="IDS_IOS_SYNC_SETTINGS_NOT_CONFIRMED" desc="The error message to display when sign-in was interrupted and the user didn't review the sync settings.">
         Initial sync setup was not finished. Sync is off.
       </message>
-      <message name="IDS_IOS_SYNC_SETTINGS_NOT_CONFIRMED_ACTION" desc="Button title to invite the user to review sync settings. The sign-in flow has been interrupted and the user never confirmed Sync.">
+      <message name="IDS_IOS_SYNC_SETTINGS_NOT_CONFIRMED_BUTTON" desc="Button title to invite the user to review sync settings. The sign-in flow has been interrupted and the user never confirmed Sync.">
         Open Settings
       </message>
       <message name="IDS_IOS_SYNC_SETTINGS_NOT_CONFIRMED_DESCRIPTION" desc="The error message to display when sign-in was interrupted and the user didn't review the sync settings.">
@@ -2484,13 +2484,13 @@
       <message name="IDS_IOS_SYNC_SETUP_NOT_CONFIRMED_TITLE" desc="Title of the error message shown for sync errors. [Length: 60em] [iOS only]">
         Initial Sync Setup Not Finished
       </message>
-      <message name="IDS_IOS_SYNC_SIGN_IN_AGAIN" desc="Title displayed when the signed in user needs sign in again. [Length: 20em] [iOS only]">
+      <message name="IDS_IOS_SYNC_SIGN_IN_AGAIN_BUTTON" desc="Button title displayed when the signed in user needs sign in again. [Length: 20em] [iOS only]">
         Sign in again
       </message>
       <message name="IDS_IOS_SYNC_STATUS_UNRECOVERABLE_ERROR" desc="Message shown throughout the sync settings screens when there is an unrecoverable error. [Length: 80em, can be multiple lines] [iOS only]">
         Sync has stopped working.
       </message>
-      <message name="IDS_IOS_SYNC_UPDATE_CREDENTIALS" desc="Title displayed when the signed in user needs to update its credentials. [Length: 20em] [iOS only]">
+      <message name="IDS_IOS_SYNC_UPDATE_CREDENTIALS_BUTTON" desc="Button title displayed when the signed in user needs to update its credentials. [Length: 20em] [iOS only]">
         Update
       </message>
       <message name="IDS_IOS_TAB_GRID_DONE_BUTTON" desc="Title of the Done button in the tab grid UI. [iOS only]">
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENCRYPTION_FIX_NOW.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON.png.sha1
similarity index 100%
rename from ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_ENCRYPTION_FIX_NOW.png.sha1
rename to ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON.png.sha1
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
index 37234c9..24cb8b31 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -69,6 +69,7 @@
 <translation id="632825460376924298">‏السماح بتسجيل الدخول إلى Chromium</translation>
 <translation id="6337530241089703714">‏اختيار ما إذا كنت تريد محو بيانات Chromium المخزَّنة على هذا الجهاز أو الاحتفاظ بها</translation>
 <translation id="6424492062988593837">‏لقد أصبح Chromium أفضل من ذي قبل! يتوفر إصدار جديد.</translation>
+<translation id="6752854822223394465">‏تعمل مؤسستك حاليًا على إعداد Chromium...</translation>
 <translation id="6820823224820483452">‏تعذّر على متصفِّح Chromium التحقُّق من جميع كلمات المرور. يُرجى إعادة المحاولة غدًا.</translation>
 <translation id="6827294685447036764">‏عند السماح لمتصفِّح Chromium بمعرفة موقعك الجغرافي، سيرسِل Chromium موقعك الجغرافي إلى المواقع الإلكترونية التي منحتها إذنًا بالوصول إليه. قد تطلب المواقع الإلكترونية موقعك الجغرافي عند توفُّر معلومات محلية لعرضها مثل المتاجر القريبة أو الأخبار.</translation>
 <translation id="7018284295775193585">‏يتعذّر تحديث Chromium.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_as.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_as.xtb
index 89207fc..d054bfb0 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_as.xtb
@@ -69,6 +69,7 @@
 <translation id="632825460376924298">Chromiumত ছাইন ইন কৰাৰ অনুমতি দিয়ক</translation>
 <translation id="6337530241089703714">এই ডিভাইচটোৰ পৰা আপোনাৰ Chromiumৰ ডেটা মচিবনে ৰাখিব সেয়া বাছনি কৰক</translation>
 <translation id="6424492062988593837">Chromium আৰু উন্নত হৈছে! এটা নতুন সংস্কৰণ আছে।</translation>
+<translation id="6752854822223394465">আপোনাৰ প্ৰতিষ্ঠানে Chromium ছেট আপ কৰি আছে...</translation>
 <translation id="6820823224820483452">Chromiumএ সকলো পাছৱৰ্ড পৰীক্ষা কৰিব নোৱাৰিলে। কাইলৈ পুনৰ চেষ্টা কৰক।</translation>
 <translation id="6827294685447036764">আপুনি যদি Chromiumক আপোনাৰ অৱস্থানৰ বিষয়ে জানিবলৈ দিয়ে, Chromiumএ সেয়া আপুনি অনুমতি দিয়া সকলো ছাইটলৈ পঠিয়ায়। ছাইটসমূহৰ আপোনাক ওচৰ-পাজৰৰ দোকান অথবা বাতৰিৰ দৰে স্থানীয় তথ্য দেখুৱাবলগীয়া থাকিলে সেইসমূহে আপোনাক অৱস্থানৰ বিষয়ে সুধিব পাৰে।</translation>
 <translation id="7018284295775193585">Chromium আপডে’ট হ’ব নোৱাৰে</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
index 4cb98b5..93febe7 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
@@ -69,6 +69,7 @@
 <translation id="632825460376924298">‏התרת כניסה אל Chromium</translation>
 <translation id="6337530241089703714">‏האם למחוק את נתוני Chromium ממכשיר זה או לשמור אותם?</translation>
 <translation id="6424492062988593837">‏‫Chromium ממשיך להשתפר! קיימת גרסה חדשה.</translation>
+<translation id="6752854822223394465">‏הארגון שלך מגדיר את Chromium…</translation>
 <translation id="6820823224820483452">‏Chromium לא הצליח לבדוק את כל הסיסמאות. אפשר לנסות שוב מחר.</translation>
 <translation id="6827294685447036764">‏אם מאפשרים ל-Chromium לדעת את המיקום, Chromium יכול לשלוח את המידע הזה לאתרים שנתת להם הרשאה. אתרים עשויים לבקש את המיקום שלך כאשר יש להם מידע מקומי להציג לך, כמו חדשות או חנויות קרובות.</translation>
 <translation id="7018284295775193585">‏לא ניתן לעדכן את Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
index d4eab2fd..d894b63 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pt-BR.xtb
@@ -69,6 +69,7 @@
 <translation id="632825460376924298">Permitir login no Chromium</translation>
 <translation id="6337530241089703714">Você quer apagar ou manter os dados do Chromium neste dispositivo?</translation>
 <translation id="6424492062988593837">O Chromium ficou ainda melhor! Uma nova versão está disponível.</translation>
+<translation id="6752854822223394465">Sua organização está configurando o Chromium…</translation>
 <translation id="6820823224820483452">Não foi possível verificar todas as senhas com o Chromium. Tente novamente amanhã.</translation>
 <translation id="6827294685447036764">Se você permitir que o Chromium saiba sua localização, ele a enviará para os sites autorizados. Os sites podem solicitar sua localização para enviar informações locais para você, como notícias ou lojas próximas.</translation>
 <translation id="7018284295775193585">Não é possível atualizar o Chromium</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
index 9a08184..ee02e5b7 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
@@ -69,6 +69,7 @@
 <translation id="632825460376924298">Chromium'da Oturum Açmaya İzin Ver</translation>
 <translation id="6337530241089703714">Chromium verilerinizi bu cihazdan temizlemeyi veya saklamayı seçin</translation>
 <translation id="6424492062988593837">Chromium daha da iyi hale geldi! Yeni bir sürüm var.</translation>
+<translation id="6752854822223394465">Kuruluşunuz, Chromium'u kuruyor...</translation>
 <translation id="6820823224820483452">Chromium, şifrelerin tümünü kontrol edemedi. Yarın tekrar deneyin.</translation>
 <translation id="6827294685447036764">Konumunuzu bilmesine izin verirseniz Chromium bu bilgiyi, izin verdiğiniz tüm sitelere gönderir. Yakındaki mağazalar veya haberler gibi size gösterecek yerel bilgileri olduğunda siteler konum bilginize erişmek isteyebilir.</translation>
 <translation id="7018284295775193585">Chromium güncellenemiyor</translation>
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
index 0cdb3927..62b04c2e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_zh-TW.xtb
@@ -69,6 +69,7 @@
 <translation id="632825460376924298">允許登入 Chromium</translation>
 <translation id="6337530241089703714">選擇是否要清除你在這部裝置上的 Chromium 資料</translation>
 <translation id="6424492062988593837">Chromium 現在變得更進步了!歡迎你升級使用新版本。</translation>
+<translation id="6752854822223394465">貴機構正在設定 Chromium...</translation>
 <translation id="6820823224820483452">Chromium 無法檢查所有密碼,請明天再試。</translation>
 <translation id="6827294685447036764">如果允許 Chromium 取得位置資訊,Chromium 會將這項資訊傳送至你允許存取該資訊的網站。當網站要向你顯示當地資訊時 (例如附近商家或新聞),可能會要求你提供位置資訊。</translation>
 <translation id="7018284295775193585">Chromium 無法更新</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
index db7d4d92..3c95aed 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ar.xtb
@@ -66,6 +66,7 @@
 <translation id="6063091872902370735">‏السماح بتسجيل الدخول إلى Chrome</translation>
 <translation id="6181930887571472871">‏التبديل إلى Chrome</translation>
 <translation id="6238746320622508509">‏اسمح لمتصفّح Chrome بقفل علامات التبويب في وضع التصفّح المتخفي.</translation>
+<translation id="6427126399757991875">‏تعمل مؤسستك حاليًا على إعداد Chrome...</translation>
 <translation id="6600954340915313787">‏تم النسخ إلى Chrome</translation>
 <translation id="6634107063912726160">‏عند تسجيل الخروج، لن تتم مزامنة أي بيانات جديدة في Chrome مع حسابك على Google. وتظلّ البيانات التي تمت مزامنتها سابقًا متوفّرة في حسابك.</translation>
 <translation id="6648150602980899529">‏يتم تسجيل دخولك باستخدام حساب يتم إدارته من خلال <ph name="DOMAIN" /> ومنح مشرفه الحق في التحكم في بياناتك على Chrome. سيؤدي ذلك إلى جعل بياناتك مرتبطة دائمًا بهذا الحساب. كما سيؤدي تسجيل الخروج من Chrome إلى حذف بياناتك من هذا الجهاز، ولكن ستظل هذه البيانات مخزنة على حسابك في Google.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_as.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_as.xtb
index fad0efd..86092d43 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_as.xtb
@@ -65,6 +65,7 @@
 <translation id="6063091872902370735">Chromeত ছাইন ইন কৰিবলৈ দিয়ক</translation>
 <translation id="6181930887571472871">Chromeলৈ সলনি কৰক</translation>
 <translation id="6238746320622508509">Chromeক আপোনাৰ ইনক’গনিট’ টেবসমূহ লক কৰিবলৈ দিয়ক।</translation>
+<translation id="6427126399757991875">আপোনাৰ প্ৰতিষ্ঠানে Chrome ছেট আপ কৰি আছে...</translation>
 <translation id="6600954340915313787">Chromeলৈ প্ৰতিলিপি কৰা হ’ল</translation>
 <translation id="6634107063912726160">আপুনি ছাইন আউট কৰিলে Chromeএ আপোনাৰ Google একাউণ্টত কোনো নতুন ডেটা ছিংক নকৰিব। পূৰ্বে ছিংক কৰা ডেটাখিনি একাউণ্টটোতে থাকে।</translation>
 <translation id="6648150602980899529">আপুনি <ph name="DOMAIN" />এ পৰিচালনা কৰা এটা একাউণ্টৰ জৰিয়তে ছাইন ইন কৰিছে আৰু সেইটোৰ প্ৰশাসকে আপোনাৰ Chrome ডেটা নিয়ন্ত্ৰণ কৰিবলৈ সুবিধা দিছে। আপোনাৰ ডেটা এই একাউণ্টটোৰ সৈতে স্থায়ীভাৱে সংযুক্ত হৈ থাকিব। Chromeৰ পৰা ছাইন আউট কৰিলে আপোনাৰ ডেটা মচা যাব কিন্ত সেইবোৰ আপোনাৰ Google একাউণ্টত জমা হৈয়ে থাকিব।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
index bfabd4c..e9b8505 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_iw.xtb
@@ -66,6 +66,7 @@
 <translation id="6063091872902370735">‏התרת כניסה אל Chrome</translation>
 <translation id="6181930887571472871">‏לעבור ל-Chrome?</translation>
 <translation id="6238746320622508509">‏כרטיסיות מצב אנונימי יינעלו באמצעות Chrome.</translation>
+<translation id="6427126399757991875">‏הארגון שלך מגדיר את Chrome…</translation>
 <translation id="6600954340915313787">‏הועתק אל Chrome</translation>
 <translation id="6634107063912726160">‏לאחר היציאה מהחשבון, לא יתבצע סנכרון של נתונים חדשים מ-Chrome לחשבון Google שלך. נתונים שסונכרנו בעבר יישארו בחשבון.</translation>
 <translation id="6648150602980899529">‏נכנסת עם חשבון המנוהל על-ידי <ph name="DOMAIN" /> שמעניק למנהל שלו שליטה על הנתונים שלך ב-Chrome. הנתונים שלך ישויכו לצמיתות אל החשבון הזה. יציאה מ-Chrome תמחק את הנתונים שלך מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
index 6640298..3355751 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
@@ -66,6 +66,7 @@
 <translation id="6063091872902370735">Permitir login no Chrome</translation>
 <translation id="6181930887571472871">Mudar para o Chrome</translation>
 <translation id="6238746320622508509">Permita que o Chrome bloqueie suas guias anônimas.</translation>
+<translation id="6427126399757991875">Sua organização está configurando o Chrome…</translation>
 <translation id="6600954340915313787">Copiado no Chrome</translation>
 <translation id="6634107063912726160">Quando você se desconecta, o Chrome não sincroniza nenhum dado novo com sua Conta do Google. Os dados sincronizados anteriormente permanecem na conta.</translation>
 <translation id="6648150602980899529">Você está fazendo login com uma conta gerenciada por <ph name="DOMAIN" /> e dando ao administrador dela o controle sobre seus dados do Chrome, os quais ficarão permanentemente vinculados a essa conta. Se você sair do Chrome, seus dados serão excluídos desse dispositivo, mas permanecerão armazenados na sua Conta do Google.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
index 4afbb37..b4287bc4 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
@@ -66,6 +66,7 @@
 <translation id="6063091872902370735">Chrome'da oturum açmaya izin ver</translation>
 <translation id="6181930887571472871">Chrome'a Geçin</translation>
 <translation id="6238746320622508509">Chrome'un Gizli sekmeleri kilitlemesine izin verin.</translation>
+<translation id="6427126399757991875">Kuruluşunuz, Chrome'u kuruyor...</translation>
 <translation id="6600954340915313787">Chrome'a kopyalandı</translation>
 <translation id="6634107063912726160">Oturumu kapattığınızda Chrome, hiçbir yeni veriyi Google Hesabınızla senkronize etmez. Önceden senkronize edilmiş veriler hesapta kalır.</translation>
 <translation id="6648150602980899529"><ph name="DOMAIN" /> tarafından yönetilen bir hesapla oturum açıyorsunuz ve yöneticiye tüm Chrome verileriniz üzerinde denetim olanağı veriyorsunuz. Verileriniz kalıcı olarak bu hesaba bağlanacaktır. Chrome'da oturumu kapattığınızda verileriniz bu cihazdan silinir ancak Google Hesabınızda kalmaya devam eder.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
index 18f9ce8..00a8dc3 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_zh-TW.xtb
@@ -66,6 +66,7 @@
 <translation id="6063091872902370735">允許登入 Chrome</translation>
 <translation id="6181930887571472871">改為使用 Chrome</translation>
 <translation id="6238746320622508509">讓 Chrome 鎖定你的無痕分頁。</translation>
+<translation id="6427126399757991875">貴機構正在設定 Chrome...</translation>
 <translation id="6600954340915313787">已複製到 Chrome</translation>
 <translation id="6634107063912726160">登出帳戶後,Chrome 就不會將任何新資料同步到你的 Google 帳戶。不過,先前已同步處理的資料仍會保存在帳戶中。</translation>
 <translation id="6648150602980899529">您即將使用由 <ph name="DOMAIN" /> 所管理的帳戶登入,並授權該網域的管理員控管您的 Chrome 資料。您的資料會與這個帳戶建立永久連結。登出 Chrome 後,系統會將您的資料從這個裝置上刪除,但繼續保留在您的 Google 帳戶中。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index e8a8edf..dcf7506 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -196,6 +196,7 @@
 <translation id="2932085390869194046">اقتراح كلمة مرور...</translation>
 <translation id="2952581218264071393">‏1- افتَح إعدادات Chrome.</translation>
 <translation id="2958718410589002129">كلمات المرور</translation>
+<translation id="2961210776189273067">العنوان</translation>
 <translation id="2964349545761222050">حظر ملفات تعريف الارتباط التابعة لجهات خارجية</translation>
 <translation id="2969979262385602596">تعذّر تسجيل الدخول. يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="2975121486251958312">لا يتوفّر سوى "وضع التصفُّح المتخفي"</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index cc1f159..f2fe32c9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -196,6 +196,7 @@
 <translation id="2932085390869194046">পাছৱৰ্ডৰ পৰামৰ্শ দিয়ক...</translation>
 <translation id="2952581218264071393">১) Chromeৰ ছেটিং খোলক</translation>
 <translation id="2958718410589002129">পাছৱৰ্ডসমূহ</translation>
+<translation id="2961210776189273067">শিৰোনাম</translation>
 <translation id="2964349545761222050">তৃতীয় পক্ষৰ কুকিসমূহ অৱৰোধ কৰক</translation>
 <translation id="2969979262385602596">ছাইন ইন কৰিব পৰা নগ’ল। অনুগ্ৰহ কৰি কিছু সময়ৰ পাছত পুনৰ চেষ্টা কৰক।</translation>
 <translation id="2975121486251958312">কেৱল ইনক’গনিট’টো ম’ড উপলব্ধ</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 5d097a9..3cfc98db 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -8,6 +8,10 @@
 <translation id="1047726139967079566">Bookmark This Page...</translation>
 <translation id="1049743911850919806">Incognito</translation>
 <translation id="105093091697134113">The following accounts use passwords which were exposed in a third-party data breach or entered on a deceptive website. Change these passwords immediately to keep your accounts safe.</translation>
+<translation id="105214722824962652">You won't be signed out of your Google Account. <ph name="BEGIN_LINK" />Other forms of activity<ph name="END_LINK" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.
+
+        
+Your search engine is <ph name="DSE_NAME" />. See their instructions for deleting your search history, if applicable.</translation>
 <translation id="1063454504051558093">Use other password...</translation>
 <translation id="1066060668811609597">Manage Sync</translation>
 <translation id="1076421457278169141">Code scanned</translation>
@@ -204,6 +208,10 @@
 <translation id="298306318844797842">Add Payment Method...</translation>
 <translation id="2989805286512600854">Open in New Tab</translation>
 <translation id="3037605927509011580">Aw, Snap!</translation>
+<translation id="3076846064362030967">You won't be signed out of your Google Account. <ph name="BEGIN_LINK" />Other forms of activity<ph name="END_LINK" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.
+
+
+See your search engine’s instructions for deleting your search history, if applicable.</translation>
 <translation id="3080525922482950719">You can save pages to read later or offline</translation>
 <translation id="3081338492074632642">Make sure that the password that you are saving matches your password for <ph name="WEBSITE" /></translation>
 <translation id="3112556859945124369">Mark…</translation>
@@ -404,6 +412,7 @@
 <translation id="5140288047769711648">Chrome will remember this password for you. You don't have to remember it.</translation>
 <translation id="5150492518600715772">Send to your device</translation>
 <translation id="5168414296986405587">Built for iPadOS</translation>
+<translation id="5173088371991956744">Sync needs to verify that it's you</translation>
 <translation id="5181140330217080051">Downloading</translation>
 <translation id="5186185447130319458">Private</translation>
 <translation id="5188482106078495165">Your cookies setting applies to all tabs. To apply a new setting to an open tab, reload the tab.</translation>
@@ -714,6 +723,7 @@
 <translation id="802154636333426148">Download failed</translation>
 <translation id="8023878949384262191">Expands the section.</translation>
 <translation id="8027581147000338959">Open in new window</translation>
+<translation id="804225253087497565"><ph name="BEGIN_LINK" />Search history<ph name="END_LINK" /> and <ph name="BEGIN_LINK" />other forms of activity<ph name="END_LINK" /> may be saved in your Google Account when you’re signed in. You can delete them at any time.</translation>
 <translation id="804427445359061970">You'll find your tabs from other devices here</translation>
 <translation id="8059533439631660104">Collapses the section.</translation>
 <translation id="8065292699993359127">Open URLs in Chrome in Incognito</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 3c8c53b8..8bfa4a3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -196,6 +196,7 @@
 <translation id="2932085390869194046">הצעת סיסמה...</translation>
 <translation id="2952581218264071393">‏1. פותחים את ההגדרות של Chrome</translation>
 <translation id="2958718410589002129">סיסמאות</translation>
+<translation id="2961210776189273067">תואר</translation>
 <translation id="2964349545761222050">‏חסימה של קובצי cookie מצדדים שלישיים</translation>
 <translation id="2969979262385602596">לא ניתן היה להיכנס לחשבון. יש לנסות שוב מאוחר יותר.</translation>
 <translation id="2975121486251958312">רק מצב אנונימי זמין</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
index eb09bd44..1ae6b5e3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -196,6 +196,7 @@
 <translation id="2932085390869194046">Sugerir senha…</translation>
 <translation id="2952581218264071393">1. Abrir configurações do Chrome</translation>
 <translation id="2958718410589002129">Senhas</translation>
+<translation id="2961210776189273067">Título</translation>
 <translation id="2964349545761222050">Bloquear cookies de terceiros</translation>
 <translation id="2969979262385602596">Falha durante o login. Tente novamente mais tarde.</translation>
 <translation id="2975121486251958312">Apenas o modo de navegação anônima está disponível</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 92d2f8e..1b53495 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -196,6 +196,7 @@
 <translation id="2932085390869194046">Şifre Öner...</translation>
 <translation id="2952581218264071393">1. Chrome Ayarlarını açın</translation>
 <translation id="2958718410589002129">Şifreler</translation>
+<translation id="2961210776189273067">Unvan</translation>
 <translation id="2964349545761222050">Üçüncü Taraf Çerezlerini Engelle</translation>
 <translation id="2969979262385602596">Oturum açılamadı. Daha sonra tekrar deneyin.</translation>
 <translation id="2975121486251958312">Sadece Gizli Mod Kullanılabilir</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 9b0ca17..a03f355e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -196,6 +196,7 @@
 <translation id="2932085390869194046">建議密碼...</translation>
 <translation id="2952581218264071393">1. 開啟 Chrome 設定</translation>
 <translation id="2958718410589002129">密碼</translation>
+<translation id="2961210776189273067">稱謂</translation>
 <translation id="2964349545761222050">封鎖第三方 Cookie</translation>
 <translation id="2969979262385602596">無法登入,請稍後再試。</translation>
 <translation id="2975121486251958312">只能使用無痕模式</translation>
diff --git a/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
index bb5d89f..59a28e63 100644
--- a/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
+++ b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
@@ -25,6 +25,7 @@
 #include "components/safe_browsing/core/common/safe_browsing_policy_handler.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/search_engines/default_search_policy_handler.h"
+#include "components/signin/public/base/signin_pref_names.h"
 #include "components/sync/driver/sync_policy_handler.h"
 #include "components/translate/core/browser/translate_pref_names.h"
 #include "components/unified_consent/pref_names.h"
@@ -101,6 +102,9 @@
   { policy::key::kUrlKeyedAnonymizedDataCollectionEnabled,
     unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
     base::Value::Type::BOOLEAN },
+  { policy::key::kRestrictAccountsToPatterns,
+    prefs::kRestrictAccountsToPatterns,
+    base::Value::Type::LIST },
 };
 // clang-format on
 
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm
index b49244f..58f85cc 100644
--- a/ios/chrome/browser/prefs/browser_prefs.mm
+++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -177,6 +177,8 @@
   registry->RegisterIntegerPref(kOmniboxGeolocationAuthorizationState, 0);
   registry->RegisterStringPref(kOmniboxGeolocationLastAuthorizationAlertVersion,
                                "");
+
+  registry->RegisterListPref(prefs::kRestrictAccountsToPatterns);
 }
 
 void RegisterBrowserStatePrefs(user_prefs::PrefRegistrySyncable* registry) {
diff --git a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm
index b9aa5d74..8c6772ca 100644
--- a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm
@@ -128,12 +128,6 @@
                                            ->GetPrefs()
                        identityManager:identityManager];
   self.manager.delegate = self;
-  __weak __typeof(self) weakSelf = self;
-  if (signin::IsSSOAccountCreationInChromeTabEnabled()) {
-    self.manager.openAccountCreationURLCallback = ^(NSURL* url) {
-      weakSelf.openAccountCreationURL = url;
-    };
-  }
   [self.manager showSigninWithIntent:self.signinIntent];
 }
 
diff --git a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm
index 71f3f38..0d67351f 100644
--- a/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/autofill_address_profile/infobar_save_address_profile_table_view_controller.mm
@@ -38,11 +38,20 @@
 };
 
 typedef NS_ENUM(NSInteger, ItemType) {
-  ItemTypeSaveModalFields = kItemTypeEnumZero,
-  ItemTypeAddressProfileSaveUpdateButton,
+  ItemTypeSaveAddress = kItemTypeEnumZero,
+  ItemTypeSaveEmail,
+  ItemTypeSavePhone,
   ItemTypeUpdateModalDescription,
   ItemTypeUpdateModalTitle,
-  ItemTypeUpdateModalFields
+  ItemTypeUpdateNameNew,
+  ItemTypeUpdateAddressNew,
+  ItemTypeUpdateEmailNew,
+  ItemTypeUpdatePhoneNew,
+  ItemTypeUpdateNameOld,
+  ItemTypeUpdateAddressOld,
+  ItemTypeUpdateEmailOld,
+  ItemTypeUpdatePhoneOld,
+  ItemTypeAddressProfileSaveUpdateButton,
 };
 
 @interface InfobarSaveAddressProfileTableViewController ()
@@ -183,9 +192,18 @@
   if (base::FeatureList::IsEnabled(
           autofill::features::
               kAutofillAddressProfileSavePromptAddressVerificationSupport)) {
-    if (itemType == ItemTypeSaveModalFields ||
-        itemType == ItemTypeUpdateModalFields) {
-      [self ensureContextMenuShownForItemType:itemType atIndexPath:indexPath];
+    switch (itemType) {
+      case ItemTypeSaveAddress:
+      case ItemTypeSaveEmail:
+      case ItemTypeSavePhone:
+      case ItemTypeUpdateNameNew:
+      case ItemTypeUpdateAddressNew:
+      case ItemTypeUpdateEmailNew:
+      case ItemTypeUpdatePhoneNew:
+        [self ensureContextMenuShownForItemType:itemType atIndexPath:indexPath];
+        break;
+      default:
+        break;
     }
   }
 }
@@ -291,7 +309,10 @@
   for (NSNumber* type in self.profileDataDiff) {
     if ([self.profileDataDiff[type][0] length] > 0) {
       SettingsImageDetailTextItem* newItem =
-          [self detailItemWithType:ItemTypeUpdateModalFields
+          [self detailItemWithType:[self modalItemTypeForAutofillUIType:
+                                             (AutofillUIType)[type intValue]
+                                                                 update:YES
+                                                                    old:NO]
                               text:self.profileDataDiff[type][0]
                      iconImageName:[self iconForAutofillInputTypeNumber:type]
               imageTintColorIsGrey:NO];
@@ -311,7 +332,10 @@
     for (NSNumber* type in self.profileDataDiff) {
       if ([self.profileDataDiff[type][1] length] > 0) {
         SettingsImageDetailTextItem* oldItem =
-            [self detailItemWithType:ItemTypeUpdateModalFields
+            [self detailItemWithType:[self modalItemTypeForAutofillUIType:
+                                               (AutofillUIType)[type intValue]
+                                                                   update:YES
+                                                                      old:YES]
                                 text:self.profileDataDiff[type][1]
                        iconImageName:[self iconForAutofillInputTypeNumber:type]
                 imageTintColorIsGrey:YES];
@@ -426,6 +450,45 @@
   return [self iconForAutofillUIType:(AutofillUIType)[val intValue]];
 }
 
+// Determines the itemType for the row based on |autofillUIType|, whether the
+// modal is for save/update address or belongs to the old/new section in case of
+// update modal.
+- (NSInteger)modalItemTypeForAutofillUIType:(AutofillUIType)autofillUIType
+                                     update:(BOOL)update
+                                        old:(BOOL)old {
+  switch (autofillUIType) {
+    case AutofillUITypeProfileHomeAddressStreet:
+    case AutofillUITypeAddressHomeAddress:
+      if (update) {
+        return old ? ItemTypeUpdateAddressOld : ItemTypeUpdateAddressNew;
+      } else {
+        return ItemTypeSaveAddress;
+      }
+    case AutofillUITypeProfileEmailAddress:
+      if (update) {
+        return old ? ItemTypeUpdateEmailOld : ItemTypeUpdateEmailNew;
+      } else {
+        return ItemTypeSaveEmail;
+      }
+    case AutofillUITypeProfileHomePhoneWholeNumber:
+      if (update) {
+        return old ? ItemTypeUpdatePhoneOld : ItemTypeUpdatePhoneNew;
+      } else {
+        return ItemTypeSavePhone;
+      }
+    case AutofillUITypeNameFullWithHonorificPrefix:
+      if (update) {
+        return old ? ItemTypeUpdateNameOld : ItemTypeUpdateNameNew;
+      } else {
+        NOTREACHED();
+        return 0;
+      }
+    default:
+      NOTREACHED();
+      return 0;
+  }
+}
+
 // Returns an array of UIMenuItems to display in a context menu on the site
 // cell.
 - (NSArray*)menuItems {
@@ -443,10 +506,13 @@
 - (SettingsImageDetailTextItem*)
     detailItemForSaveModalWithText:(NSString*)text
                     autofillUIType:(AutofillUIType)autofillUIType {
-  return [self detailItemWithType:ItemTypeSaveModalFields
-                             text:text
-                    iconImageName:[self iconForAutofillUIType:autofillUIType]
-             imageTintColorIsGrey:YES];
+  return [self
+        detailItemWithType:[self modalItemTypeForAutofillUIType:autofillUIType
+                                                         update:NO
+                                                            old:NO]
+                      text:text
+             iconImageName:[self iconForAutofillUIType:autofillUIType]
+      imageTintColorIsGrey:YES];
 }
 
 - (SettingsImageDetailTextItem*)detailItemWithType:(NSInteger)type
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
index 42ecbd6..aa8e47d 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -504,15 +504,13 @@
                             rect:itemView.frame
                             view:itemView];
   __weak __typeof(self) weakSelf = self;
-  if (signin::IsSSOEditingEnabled()) {
-    [self.alertCoordinator
-        addItemWithTitle:l10n_util::GetNSString(
-                             IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE)
-                  action:^{
-                    [weakSelf handleManageGoogleAccountWithIdentity:identity];
-                  }
-                   style:UIAlertActionStyleDefault];
-  }
+  [self.alertCoordinator
+      addItemWithTitle:l10n_util::GetNSString(
+                           IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE)
+                action:^{
+                  [weakSelf handleManageGoogleAccountWithIdentity:identity];
+                }
+                 style:UIAlertActionStyleDefault];
   [self.alertCoordinator
       addItemWithTitle:l10n_util::GetNSString(
                            IDS_IOS_REMOVE_GOOGLE_ACCOUNT_TITLE)
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
index 63963eb0..51f38fe8 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -269,14 +269,12 @@
   }
   [model addItem:self.accountItem
       toSectionWithIdentifier:IdentitySectionIdentifier];
-  if (signin::IsSSOEditingEnabled()) {
-    TableViewImageItem* manageGoogleAccount =
-        [[TableViewImageItem alloc] initWithType:ManageGoogleAccountItemType];
-    manageGoogleAccount.title =
-        GetNSString(IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE);
-    [model addItem:manageGoogleAccount
-        toSectionWithIdentifier:IdentitySectionIdentifier];
-  }
+  TableViewImageItem* manageGoogleAccount =
+      [[TableViewImageItem alloc] initWithType:ManageGoogleAccountItemType];
+  manageGoogleAccount.title =
+      GetNSString(IDS_IOS_MANAGE_YOUR_GOOGLE_ACCOUNT_TITLE);
+  [model addItem:manageGoogleAccount
+      toSectionWithIdentifier:IdentitySectionIdentifier];
 }
 
 // Creates, removes or updates the identity section as needed. And notifies the
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
index c19d9bd..37deb6c 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -248,18 +248,15 @@
       toSectionWithIdentifier:AdvancedSettingsSectionIdentifier];
 
   // GoogleActivityControlsItemType.
-  if (signin::IsSSOEditingEnabled()) {
-    TableViewImageItem* googleActivityControlsItem = [[TableViewImageItem alloc]
-        initWithType:GoogleActivityControlsItemType];
-    googleActivityControlsItem.title =
-        GetNSString(IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_TITLE);
-    googleActivityControlsItem.detailText =
-        GetNSString(IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_DESCRIPTION);
-    googleActivityControlsItem.accessibilityTraits |=
-        UIAccessibilityTraitButton;
-    [model addItem:googleActivityControlsItem
-        toSectionWithIdentifier:AdvancedSettingsSectionIdentifier];
-  }
+  TableViewImageItem* googleActivityControlsItem =
+      [[TableViewImageItem alloc] initWithType:GoogleActivityControlsItemType];
+  googleActivityControlsItem.title =
+      GetNSString(IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_TITLE);
+  googleActivityControlsItem.detailText =
+      GetNSString(IDS_IOS_MANAGE_SYNC_GOOGLE_ACTIVITY_CONTROLS_DESCRIPTION);
+  googleActivityControlsItem.accessibilityTraits |= UIAccessibilityTraitButton;
+  [model addItem:googleActivityControlsItem
+      toSectionWithIdentifier:AdvancedSettingsSectionIdentifier];
 
   // AdvancedSettingsSectionIdentifier.
   TableViewImageItem* dataFromChromeSyncItem =
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_egtest.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_egtest.mm
index fd2ce56..d0eb65c 100644
--- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_egtest.mm
@@ -49,7 +49,7 @@
   [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity];
   [ChromeEarlGrey openNewTab];
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
-                                          IDS_IOS_SYNC_ENTER_PASSPHRASE)]
+                                          IDS_IOS_SYNC_ENTER_PASSPHRASE_BUTTON)]
       performAction:grey_tap()];
   [[EarlGrey selectElementWithMatcher:NavigationBarCancelButton()]
       performAction:grey_tap()];
@@ -73,8 +73,9 @@
 
   [[EarlGrey
       selectElementWithMatcher:MatchInWindowWithNumber(
-                                   1, ButtonWithAccessibilityLabelId(
-                                          IDS_IOS_SYNC_ENTER_PASSPHRASE))]
+                                   1,
+                                   ButtonWithAccessibilityLabelId(
+                                       IDS_IOS_SYNC_ENTER_PASSPHRASE_BUTTON))]
       performAction:grey_tap()];
   [[EarlGrey selectElementWithMatcher:MatchInWindowWithNumber(
                                           1, NavigationBarCancelButton())]
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm
index 21e4b10..8c7d86be 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_util.mm
@@ -116,16 +116,16 @@
       syncSetupService->GetSyncServiceState();
   switch (syncState) {
     case SyncSetupService::kSyncServiceSignInNeedsUpdate:
-      return l10n_util::GetNSString(IDS_IOS_SYNC_UPDATE_CREDENTIALS);
+      return l10n_util::GetNSString(IDS_IOS_SYNC_UPDATE_CREDENTIALS_BUTTON);
     case SyncSetupService::kSyncServiceNeedsPassphrase:
-      return l10n_util::GetNSString(IDS_IOS_SYNC_ENTER_PASSPHRASE);
+      return l10n_util::GetNSString(IDS_IOS_SYNC_ENTER_PASSPHRASE_BUTTON);
     case SyncSetupService::kSyncServiceNeedsTrustedVaultKey:
     case SyncSetupService::kSyncServiceTrustedVaultRecoverabilityDegraded:
-      return l10n_util::GetNSString(IDS_IOS_SYNC_ENCRYPTION_FIX_NOW);
+      return l10n_util::GetNSString(IDS_IOS_SYNC_VERIFY_ITS_YOU_BUTTON);
     case SyncSetupService::kSyncServiceUnrecoverableError:
-      return l10n_util::GetNSString(IDS_IOS_SYNC_SIGN_IN_AGAIN);
+      return l10n_util::GetNSString(IDS_IOS_SYNC_SIGN_IN_AGAIN_BUTTON);
     case SyncSetupService::kSyncSettingsNotConfirmed:
-      return l10n_util::GetNSString(IDS_IOS_SYNC_SETTINGS_NOT_CONFIRMED_ACTION);
+      return l10n_util::GetNSString(IDS_IOS_SYNC_SETTINGS_NOT_CONFIRMED_BUTTON);
     case SyncSetupService::kNoSyncServiceError:
     case SyncSetupService::kSyncServiceServiceUnavailable:
     case SyncSetupService::kSyncServiceCouldNotConnect:
diff --git a/ios/chrome/test/data/policy/policy_test_cases.json b/ios/chrome/test/data/policy/policy_test_cases.json
index 0e2fecf..31a10b6 100644
--- a/ios/chrome/test/data/policy/policy_test_cases.json
+++ b/ios/chrome/test/data/policy/policy_test_cases.json
@@ -334,6 +334,43 @@
       }
     ]
   },
+  "RestrictAccountsToPatterns": {
+    "os": [ "ios" ],
+    "policy_pref_mapping_tests": [
+      {
+        "policies": {},
+        "prefs": {
+          "signin.restrict_accounts_to_patterns": {
+            "location": "local_state",
+            "default_value": []
+          }
+        }
+      },
+      {
+        "policies": { "RestrictAccountsToPatterns": [] },
+        "prefs": {
+          "signin.restrict_accounts_to_patterns": {
+            "location": "local_state",
+            "value": []
+          }
+        }
+      },
+      {
+        "policies": {
+          "RestrictAccountsToPatterns": [
+            "*@domain.com",
+            "user@managedchrome.com"
+          ]
+        },
+        "prefs": {
+          "signin.restrict_accounts_to_patterns": {
+            "location": "local_state",
+            "value": [ "*@domain.com", "user@managedchrome.com" ]
+          }
+        }
+      }
+    ]
+  },
   "SafeBrowsingEnabled": {
     "os": [
       "ios"
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
index f93b1ec4..1c14f9b 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-ee990a941c4e31ab084038716dcac4526ad9b47b
\ No newline at end of file
+c0860484515ba5f5b22e411c22d535f201c5e633
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
index a4fcd43..f2b6d4b3 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-e39edb975ffb981b7511837902931c1613bb0e5c
\ No newline at end of file
+7d07358a516fe6161b9ad97e5ae426d71f7c8767
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
index 8742109c..d6ff18e 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-781eaa154204c03194de005905ce906f4459bc9f
\ No newline at end of file
+31b87289bfbf0578312ab66c6a35f32b0b0b38a7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
index 278bf18..825f0c6e 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-f0619a92b461af209393675d0c2c59663083599e
\ No newline at end of file
+8aa04dc647fcb62bc5c5a2dfc9c4e83e112924d7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
index b510e97..6978408 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-3f1b4c4ff2581bb39b6257e7a458de3708bde7b5
\ No newline at end of file
+e23176d8d0577240bbff6fc6c6d2c36516933797
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
index 8849c15..fa54e298 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-274285356d076e2e802957769595dfc24a2e930b
\ No newline at end of file
+1c558a94f6778385ad19fc65ed5eb80caca83939
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
index 02b9b2f..83a8d08 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-90eaa9770a715026b4396bd3ec785faea33db4ac
\ No newline at end of file
+73e4c835b21a7ccef5f634a548514a9b94126a3b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
index df4df3c..0bf372e 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-5b54bb0c541d6b4706b5c1d5302ff144d26a902d
\ No newline at end of file
+44b097fc3984dd528248bab554d961a0d7d04de6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
index 726fcec..a8cc109 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.arm64.zip.sha1
@@ -1 +1 @@
-e731104dbea3133d0fc2a4d593e795e161990750
\ No newline at end of file
+1057640fe5181df859dfb3b2b1db3f924e74b79a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
index ae2bb56..d7dd2e22 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.x64.zip.sha1
@@ -1 +1 @@
-98a983498245f3f80507540d986a69e707878dc4
\ No newline at end of file
+f51227abf29032c41ebd1f9796328526390b216c
\ No newline at end of file
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn
index 3db0522..441e1b0 100644
--- a/pdf/BUILD.gn
+++ b/pdf/BUILD.gn
@@ -245,6 +245,7 @@
       ":*",
       "//components:components_browsertests",
       "//components/pdf/renderer",
+      "//components/pdf/renderer:unit_tests",
     ]
 
     sources = [
diff --git a/services/network/public/cpp/cross_origin_resource_policy.h b/services/network/public/cpp/cross_origin_resource_policy.h
index ff9b48e6..5d4a09f6f 100644
--- a/services/network/public/cpp/cross_origin_resource_policy.h
+++ b/services/network/public/cpp/cross_origin_resource_policy.h
@@ -6,11 +6,9 @@
 #define SERVICES_NETWORK_PUBLIC_CPP_CROSS_ORIGIN_RESOURCE_POLICY_H_
 
 #include "base/component_export.h"
-#include "base/gtest_prod_util.h"
-#include "services/network/public/mojom/blocked_by_response_reason.mojom.h"
+#include "services/network/public/mojom/blocked_by_response_reason.mojom-forward.h"
 #include "services/network/public/mojom/cross_origin_embedder_policy.mojom-forward.h"
-#include "services/network/public/mojom/fetch_api.mojom-shared.h"
-#include "services/network/public/mojom/network_context.mojom.h"
+#include "services/network/public/mojom/fetch_api.mojom-forward.h"
 #include "services/network/public/mojom/url_response_head.mojom-forward.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/origin.h"
diff --git a/services/resource_coordinator/BUILD.gn b/services/resource_coordinator/BUILD.gn
index 6c5ec81..a99688cd 100644
--- a/services/resource_coordinator/BUILD.gn
+++ b/services/resource_coordinator/BUILD.gn
@@ -63,7 +63,7 @@
     "//mojo/public/cpp/bindings",
     "//services/resource_coordinator/public/cpp:resource_coordinator_cpp",
     "//services/resource_coordinator/public/cpp/memory_instrumentation:memory_instrumentation",
-    "//services/tracing:tests",
+    "//services/tracing:test_utils",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc b/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
index 741e35d..e838c6a 100644
--- a/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
+++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl.cc
@@ -65,7 +65,10 @@
     : next_dump_id_(0),
       client_process_timeout_(base::TimeDelta::FromSeconds(15)),
       use_proto_writer_(!base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kUseMemoryTrackingJsonWriter)) {
+          switches::kUseMemoryTrackingJsonWriter)),
+      write_proto_heap_profile_(
+          base::CommandLine::ForCurrentProcess()->HasSwitch(
+              switches::kUseHeapProfilingProtoWriter)) {
   DCHECK(!g_coordinator_impl);
   g_coordinator_impl = this;
   base::trace_event::MemoryDumpManager::GetInstance()->set_tracing_process_id(
@@ -408,7 +411,7 @@
             ->GetCurrentTraceConfig()
             .IsArgumentFilterEnabled();
     heap_profiler_->DumpProcessesForTracing(
-        strip_path_from_mapped_files,
+        strip_path_from_mapped_files, write_proto_heap_profile_,
         base::BindOnce(&CoordinatorImpl::OnDumpProcessesForTracing,
                        weak_ptr_factory_.GetWeakPtr(), request->dump_guid));
 
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl.h b/services/resource_coordinator/memory_instrumentation/coordinator_impl.h
index 22e1a7e..2042b25f 100644
--- a/services/resource_coordinator/memory_instrumentation/coordinator_impl.h
+++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl.h
@@ -190,6 +190,7 @@
       this};
 
   const bool use_proto_writer_;
+  const bool write_proto_heap_profile_;
 
   THREAD_CHECKER(thread_checker_);
   base::WeakPtrFactory<CoordinatorImpl> weak_ptr_factory_{this};
diff --git a/services/resource_coordinator/memory_instrumentation/switches.cc b/services/resource_coordinator/memory_instrumentation/switches.cc
index 18ae9fea..82f7149 100644
--- a/services/resource_coordinator/memory_instrumentation/switches.cc
+++ b/services/resource_coordinator/memory_instrumentation/switches.cc
@@ -11,6 +11,7 @@
 const char kDisableChromeTracingComputation[] =
     "disable-chrome-tracing-computation";
 const char kUseMemoryTrackingJsonWriter[] = "use-memory-tracking-json-writer";
+const char kUseHeapProfilingProtoWriter[] = "use-heap-profiling-proto-writer";
 
 }  // namespace switches
 }  // namespace memory_instrumentation
diff --git a/services/resource_coordinator/memory_instrumentation/switches.h b/services/resource_coordinator/memory_instrumentation/switches.h
index af03fb2..9a87145 100644
--- a/services/resource_coordinator/memory_instrumentation/switches.h
+++ b/services/resource_coordinator/memory_instrumentation/switches.h
@@ -12,6 +12,7 @@
 // alongside the definition of their values in the .cc file.
 extern const char kDisableChromeTracingComputation[];
 extern const char kUseMemoryTrackingJsonWriter[];
+extern const char kUseHeapProfilingProtoWriter[];
 
 }  // namespace switches
 }  // namespace memory_instrumentation
diff --git a/services/resource_coordinator/public/mojom/memory_instrumentation/memory_instrumentation.mojom b/services/resource_coordinator/public/mojom/memory_instrumentation/memory_instrumentation.mojom
index 58b0290..fce4c9b 100644
--- a/services/resource_coordinator/public/mojom/memory_instrumentation/memory_instrumentation.mojom
+++ b/services/resource_coordinator/public/mojom/memory_instrumentation/memory_instrumentation.mojom
@@ -286,7 +286,9 @@
   // |strip_path_from_mapped_files| should only be true for traces that will be
   // uploaded to the crash servers - this strips potential PII, but prevents
   // symbolization of local builds.
-  DumpProcessesForTracing(bool strip_path_from_mapped_files) =>
+  // |write_proto| will additionally write proto heap profiles to traces.
+  DumpProcessesForTracing(bool strip_path_from_mapped_files,
+                          bool write_proto) =>
       (array<HeapProfileResult> results);
 };
 
diff --git a/services/tracing/BUILD.gn b/services/tracing/BUILD.gn
index 2b03e80..908db1a 100644
--- a/services/tracing/BUILD.gn
+++ b/services/tracing/BUILD.gn
@@ -60,6 +60,8 @@
   sources = [
     "perfetto/test_utils.cc",
     "perfetto/test_utils.h",
+    "public/cpp/perfetto/producer_test_utils.cc",
+    "public/cpp/perfetto/producer_test_utils.h",
   ]
 
   deps = [
@@ -69,6 +71,7 @@
     "//testing/gtest",
     "//third_party/perfetto/protos/perfetto/common:lite",
     "//third_party/perfetto/protos/perfetto/trace:lite",
+    "//third_party/perfetto/protos/perfetto/trace/chrome:lite",
   ]
 
   if (is_posix) {
@@ -86,8 +89,6 @@
     "perfetto/consumer_host_unittest.cc",
     "perfetto/perfetto_integration_unittest.cc",
     "perfetto/privacy_filtering_check_unittest.cc",
-    "public/cpp/perfetto/producer_test_utils.cc",
-    "public/cpp/perfetto/producer_test_utils.h",
     "public/cpp/perfetto/trace_event_data_source_unittest.cc",
     "public/cpp/perfetto/trace_packet_tokenizer_unittest.cc",
     "public/cpp/perfetto/traced_value_proto_writer_unittest.cc",
diff --git a/services/tracing/public/cpp/perfetto/perfetto_config.cc b/services/tracing/public/cpp/perfetto/perfetto_config.cc
index a105d06..b0265e0 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_config.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_config.cc
@@ -66,6 +66,10 @@
         perfetto_config, tracing::mojom::kMemoryInstrumentationDataSourceName,
         chrome_config_string, privacy_filtering_enabled, convert_to_legacy_json,
         client_priority, json_agent_label_filter);
+    AddDataSourceConfig(
+        perfetto_config, tracing::mojom::kNativeHeapProfilerSourceName,
+        chrome_config_string, privacy_filtering_enabled, convert_to_legacy_json,
+        client_priority, json_agent_label_filter);
   }
 
   // Capture actual trace events.
diff --git a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
index 1eee5776..921120cd 100644
--- a/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
+++ b/services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h
@@ -58,7 +58,7 @@
 // field |profiler_| to be thread-safe.
 class COMPONENT_EXPORT(TRACING_CPP) TracingSamplerProfiler {
  public:
-  class StackProfileWriter {
+  class COMPONENT_EXPORT(TRACING_CPP) StackProfileWriter {
    public:
     explicit StackProfileWriter(bool should_enable_filtering);
     ~StackProfileWriter();
diff --git a/services/tracing/public/mojom/perfetto_service.mojom b/services/tracing/public/mojom/perfetto_service.mojom
index 07a13093..68e5efd 100644
--- a/services/tracing/public/mojom/perfetto_service.mojom
+++ b/services/tracing/public/mojom/perfetto_service.mojom
@@ -22,6 +22,8 @@
 const string kJavaHeapProfilerSourceName = "org.chromium.java_heap_profiler";
 const string kReachedCodeProfilerSourceName =
     "org.chromium.reached_code_profiler";
+const string kNativeHeapProfilerSourceName =
+    "org.chromium.native_heap_profiler";
 
 // Brief description of the flow: There's a per-process ProducerClient which
 // connects to the central PerfettoService and establishes a two-way connection
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index 05b5cf2..836f656 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -10247,7 +10247,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -10333,7 +10333,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -10505,7 +10505,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -10591,7 +10591,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 3a9b2ea..1cc469bd 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -49913,7 +49913,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50000,7 +50000,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50174,7 +50174,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50261,7 +50261,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50507,7 +50507,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50593,7 +50593,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50765,7 +50765,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -50851,7 +50851,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -51097,7 +51097,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -51183,7 +51183,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -51355,7 +51355,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M92",
-              "revision": "version:92.0.4515.105"
+              "revision": "version:92.0.4515.108"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
@@ -51441,7 +51441,7 @@
             {
               "cipd_package": "chromium/testing/weblayer-x86",
               "location": "weblayer_instrumentation_test_M93",
-              "revision": "version:93.0.4577.3"
+              "revision": "version:93.0.4577.5"
             },
             {
               "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 0b8498b..e19bb14 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -10319,7 +10319,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 25
+          "shards": 40
         },
         "test_id_prefix": "ninja://:blink_web_tests/"
       },
diff --git a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter
index 7da1761..54d1942 100644
--- a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter
+++ b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_negative.filter
@@ -129,8 +129,8 @@
 -SigninToUserProfileSwitchTest.*
 -SiteIsolationFlagHandlingTest.*
 -StartupBrowserWindowLaunchSuppressedTest.*
+-SyncConsentOptionalTest.*
 -SyncConsentRecorderTest.*
--SyncConsentSplitSettingsSyncTest.*
 -SyncConsentTest.*
 -SyncConsentTimezoneOverride.*
 -SystemWebDialogOobeTest.*
diff --git a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter
index 42d0c34..3d3ad93 100644
--- a/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter
+++ b/testing/buildbot/filters/chromeos.msan.browser_tests.oobe_positive.filter
@@ -129,8 +129,8 @@
 SigninToUserProfileSwitchTest.*
 SiteIsolationFlagHandlingTest.*
 StartupBrowserWindowLaunchSuppressedTest.*
+SyncConsentOptionalTest.*
 SyncConsentRecorderTest.*
-SyncConsentSplitSettingsSyncTest.*
 SyncConsentTest.*
 SyncConsentTimezoneOverride.*
 SystemWebDialogOobeTest.*
diff --git a/testing/buildbot/filters/pixel_browser_tests.filter b/testing/buildbot/filters/pixel_browser_tests.filter
index 14f59cb2..4262f8bc 100644
--- a/testing/buildbot/filters/pixel_browser_tests.filter
+++ b/testing/buildbot/filters/pixel_browser_tests.filter
@@ -8,6 +8,7 @@
 BookmarkEditorViewBrowserTest.*

 ChromeLabsUiTest.*

 ContentSettingBubbleDialogTest.*

+CookieControlsBubbleViewTest.*

 ExtensionInstallDialogViewInteractiveBrowserTest.*

 ExtensionUninstallDialogViewInteractiveBrowserTest.*

 FeaturePromoDialogTest.*

diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 124e7e1..d929794 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -287,7 +287,7 @@
           '--debug',
         ],
         'swarming': {
-          'shards': 25,
+          'shards': 40,
         },
       },
       'ToTFuchsia x64': {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 707f805..79c7f974 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -431,7 +431,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M93',
-          'revision': 'version:93.0.4577.3',
+          'revision': 'version:93.0.4577.5',
         }
       ],
     },
@@ -455,7 +455,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.105',
+          'revision': 'version:92.0.4515.108',
         }
       ],
     },
@@ -503,7 +503,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M93',
-          'revision': 'version:93.0.4577.3',
+          'revision': 'version:93.0.4577.5',
         }
       ],
     },
@@ -527,7 +527,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.105',
+          'revision': 'version:92.0.4515.108',
         }
       ],
     },
@@ -575,7 +575,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M93',
-          'revision': 'version:93.0.4577.3',
+          'revision': 'version:93.0.4577.5',
         }
       ],
     },
@@ -599,7 +599,7 @@
         {
           'cipd_package': 'chromium/testing/weblayer-x86',
           'location': 'weblayer_instrumentation_test_M92',
-          'revision': 'version:92.0.4515.105',
+          'revision': 'version:92.0.4515.108',
         }
       ],
     },
diff --git a/testing/trigger_scripts/base_test_triggerer.py b/testing/trigger_scripts/base_test_triggerer.py
index 5ab7bfc..0d6a53e 100755
--- a/testing/trigger_scripts/base_test_triggerer.py
+++ b/testing/trigger_scripts/base_test_triggerer.py
@@ -147,6 +147,31 @@
         if not all(isinstance(entry, dict) for entry in self._bot_configs):
             raise ValueError('Bot configurations must all be dictionaries')
 
+    def list_bots(self,
+                  dimensions,
+                  verbose,
+                  server='chromium-swarm.appspot.com'):
+        """List bots having specified bot dimensions.
+
+        Type of returned value is list of
+        https://source.chromium.org/search?q=%22class%20BotInfo(messages.Message)%22%20f:luci%2Fappengine%2Fswarming&ssfr=1
+        """
+
+        args = [SWARMING_GO, 'bots', '-server', server]
+
+        for key in sorted(dimensions):
+            args.extend(['-dimension', '%s=%s' % (key, dimensions[key])])
+
+        if verbose:
+            logging.info('Running Go `swarming` with args: %s', args)
+
+        with tempfile.NamedTemporaryFile(delete=False) as result_json:
+            result_json.close()
+            args.extend(['--json', result_json.name])
+            subprocess.check_call(args)
+            with open(result_json.name) as f:
+                return json.load(f)
+
     # TODO(eyaich): Move the stateless logic that is specific to querying
     # swarming to its own object to make trigger logic more clear.
     def query_swarming(self,
diff --git a/testing/trigger_scripts/base_test_triggerer_unittest.py b/testing/trigger_scripts/base_test_triggerer_unittest.py
index 03fc269..3f9b930 100755
--- a/testing/trigger_scripts/base_test_triggerer_unittest.py
+++ b/testing/trigger_scripts/base_test_triggerer_unittest.py
@@ -7,6 +7,7 @@
 import argparse
 import json
 import unittest
+import os
 
 import mock
 
@@ -19,6 +20,17 @@
     def setUp(self):
         self.setUpPyfakefs()
 
+    @unittest.skipUnless('TRIGGER_SCRIPT_INTEGRATION_TESTS' in os.environ,
+                         'this is quick check test using real swarming server')
+    def test_list_bots(self):
+        # This just checks list_bots runs without error.
+        triggerer = base_test_triggerer.BaseTestTriggerer()
+        with fake_filesystem_unittest.Pause(self):
+            bots = triggerer.list_bots({'pool': 'luci.flex.ci'}, True)
+        self.assertGreater(len(bots), 0)
+        bot = bots[0]
+        self.assertIn('bot_id', bot)
+
     def test_convert_to_go_swarming_args(self):
         args = [
             '--swarming', 'x.apphost.com', '--dimension', 'pool', 'ci',
diff --git a/testing/trigger_scripts/perf_device_trigger.py b/testing/trigger_scripts/perf_device_trigger.py
index b85278b..bd96eec 100755
--- a/testing/trigger_scripts/perf_device_trigger.py
+++ b/testing/trigger_scripts/perf_device_trigger.py
@@ -288,27 +288,21 @@
     def _query_swarming_for_eligible_bot_configs(self, dimensions):
         """Query Swarming to figure out which bots are available.
 
-      Returns: a dictionary in which the keys are the bot id and
-      the values are Bot object that indicate the health status
-      of the bots.
-    """
-        values = []
-        for key, value in sorted(dimensions.iteritems()):
-            values.append(('dimensions', '%s:%s' % (key, value)))
+        Returns: a dictionary in which the keys are the bot id and
+        the values are Bot object that indicate the health status
+        of the bots.
+        """
 
-        query_result = self.query_swarming('bots/list',
-                                           values,
-                                           True,
-                                           server=self._swarming_server)
-        if 'items' not in query_result:
-            return {}
+        query_result = self.list_bots(dimensions,
+                                      True,
+                                      server=self._swarming_server)
         perf_bots = {}
-        for bot in query_result['items']:
+        for bot in query_result:
             # Device maintenance is usually quick, and we can wait for it to
             # finish. However, if the device is too hot, it can take a long time
             # for it to cool down, so check for 'Device temperature' in
             # maintenance_msg.
-            alive = (not bot['is_dead'] and not bot['quarantined']
+            alive = (not bot.get('is_dead') and not bot.get('quarantined')
                      and 'Device temperature' not in bot.get(
                          'maintenance_msg', ''))
             perf_bots[bot['bot_id']] = Bot(bot['bot_id'], alive)
diff --git a/testing/trigger_scripts/perf_device_trigger_unittest.py b/testing/trigger_scripts/perf_device_trigger_unittest.py
index cc97fbd8..115e0e2 100755
--- a/testing/trigger_scripts/perf_device_trigger_unittest.py
+++ b/testing/trigger_scripts/perf_device_trigger_unittest.py
@@ -20,12 +20,13 @@
 
 
 class FakeTriggerer(perf_device_trigger.PerfDeviceTriggerer):
-    def __init__(self, args, swarming_args, files):
+    def __init__(self, args, swarming_args, files, list_bots_result):
         self._bot_statuses = []
         self._swarming_runs = []
         self._files = files
         self._temp_file_id = 0
         self._triggered_with_swarming_go = 0
+        self._list_bots_result = list_bots_result
         super(FakeTriggerer, self).__init__(args, swarming_args)
 
     def set_files(self, files):
@@ -48,6 +49,12 @@
     def write_json_to_file(self, merged_json, output_file):
         self._files[output_file] = merged_json
 
+    def list_bots(self,
+                  dimensions,
+                  verbose,
+                  server='chromium-swarm.appspot.com'):
+        return self._list_bots_result
+
     def run_swarming(self, args, verbose):
         del verbose  #unused
         self._swarming_runs.append(args)
@@ -91,18 +98,15 @@
 
         triggerer = FakeTriggerer(
             args, swarming_args,
-            self.get_files(args.shards, previous_task_assignment_map,
-                           alive_bots, dead_bots))
+            self.get_files(args.shards, previous_task_assignment_map),
+            self.generate_list_of_eligible_bots_query_response(
+                alive_bots, dead_bots))
         triggerer.trigger_tasks(args, swarming_args)
         return triggerer
 
-    def get_files(self, num_shards, previous_task_assignment_map, alive_bots,
-                  dead_bots):
+    def get_files(self, num_shards, previous_task_assignment_map):
         files = {}
         file_index = 0
-        files['base_trigger_dimensions%d.json' % file_index] = (
-            self.generate_list_of_eligible_bots_query_response(
-                alive_bots, dead_bots))
         file_index = file_index + 1
         # Perf device trigger will call swarming n times:
         #   1. Once for all eligible bots
@@ -142,9 +146,9 @@
                                                       dead_bots):
         if len(alive_bots) == 0 and len(dead_bots) == 0:
             return {}
-        items = {'items': []}
+        bots = []
         for bot_id in alive_bots:
-            items['items'].append({
+            bots.append({
                 'bot_id': ('%s' % bot_id),
                 'is_dead': False,
                 'quarantined': False
@@ -152,37 +156,19 @@
         is_dead = True
         for bot_id in dead_bots:
             is_quarantined = (not is_dead)
-            items['items'].append({
+            bots.append({
                 'bot_id': ('%s' % bot_id),
                 'is_dead': is_dead,
                 'quarantined': is_quarantined
             })
             is_dead = (not is_dead)
-        return items
+        return bots
 
     def list_contains_sublist(self, main_list, sub_list):
         return any(sub_list == main_list[offset:offset + len(sub_list)]
                    for offset in xrange(len(main_list) - (len(sub_list) - 1)))
 
-    def assert_query_swarming_args(self, triggerer, num_shards,
-                                   use_dynamic_shards):
-        # Assert the calls to query swarming send the right args
-        # First call is to get eligible bots. With device affinity, we need one
-        # query per shard for the previous bot id; with dynamic sharding, no
-        # further qeury is needed.
-        total_queries = 1 if use_dynamic_shards else num_shards + 1
-        for i in range(total_queries):
-            self.assertTrue('query' in triggerer._swarming_runs[i])
-            self.assertTrue(
-                self.list_contains_sublist(triggerer._swarming_runs[i],
-                                           ['-S', 'foo_server']))
-
-    def get_triggered_shard_to_bot(self,
-                                   triggerer,
-                                   num_shards,
-                                   use_dynamic_shards=False):
-        self.assert_query_swarming_args(triggerer, num_shards,
-                                        use_dynamic_shards)
+    def get_triggered_shard_to_bot(self, triggerer):
         triggered_map = {}
         for run in triggerer._swarming_runs:
             if not 'trigger' in run:
@@ -204,8 +190,7 @@
             },
             alive_bots=['build3', 'build4', 'build5'],
             dead_bots=['build1', 'build2'])
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=3)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
         self.assertEquals(len(set(expected_task_assignment.values())), 3)
 
         # All three bots were healthy so we should expect the task assignment to
@@ -233,8 +218,7 @@
             },
             alive_bots=['build3', 'build4', 'build5'],
             dead_bots=['build1', 'build2'])
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=3)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
         self.assertEquals(len(set(expected_task_assignment.values())), 3)
 
         # The first two should be assigned to one of the unassigned healthy bots
@@ -254,8 +238,7 @@
             },
             alive_bots=['build3', 'build4', 'build5'],
             dead_bots=['build1', 'build2'])
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=5)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
         self.assertEquals(len(set(expected_task_assignment.values())), 5)
 
         # We have 5 shards and 5 bots that ran them, but two
@@ -279,8 +262,7 @@
             },
             alive_bots=['build3', 'build4', 'build5'],
             dead_bots=['build1', 'build2'])
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=5)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
         self.assertEquals(len(set(expected_task_assignment.values())), 5)
 
         # Not enough healthy bots so make sure shard 0 is still assigned to its
@@ -305,8 +287,7 @@
             },
             alive_bots=['build3', 'build4', 'build5'],
             dead_bots=['build1', 'build2'])
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=3)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
         self.assertEquals(len(set(expected_task_assignment.values())), 3)
         new_healthy_bots = ['build3', 'build4', 'build5']
         self.assertIn(expected_task_assignment.get(0), new_healthy_bots)
@@ -323,8 +304,7 @@
             },
             alive_bots=['build3', 'build4', 'build5', 'build7'],
             dead_bots=['build1', 'build6'])
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=3)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
 
         # Test that the new assignment will add a new bot to avoid
         # assign 'build3' to both shard 0 & shard 1 as before.
@@ -343,8 +323,7 @@
             alive_bots=['build1', 'build2', 'build3', 'build4', 'build5'],
             dead_bots=[],
             use_dynamic_shards=True)
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=123, use_dynamic_shards=True)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
 
         self.assertEquals(set(expected_task_assignment.values()),
                           {'build1', 'build2', 'build3', 'build4', 'build5'})
@@ -360,8 +339,7 @@
             alive_bots=['build2', 'build5', 'build3'],
             dead_bots=['build1', 'build4'],
             use_dynamic_shards=True)
-        expected_task_assignment = self.get_triggered_shard_to_bot(
-            triggerer, num_shards=789, use_dynamic_shards=True)
+        expected_task_assignment = self.get_triggered_shard_to_bot(triggerer)
 
         self.assertEquals(set(expected_task_assignment.values()),
                           {'build2', 'build3', 'build5'})
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index ca32f46..aca3ce6 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -186,10 +186,15 @@
 // because kSetOnlyIfOverridden is used for setting WebRuntimeFeatures'
 // Prerender2. To enable this feature, we need to force-enable this feature
 // using chrome://flags/#enable-prerender2 or --enable-features=Prerender2
-// command line or a valid Origin Trial token in the page after default-enabling
-// this feature.
-const base::Feature kPrerender2{"Prerender2",
-                                base::FEATURE_DISABLED_BY_DEFAULT};
+// command line or a valid Origin Trial token in the page.
+const base::Feature kPrerender2 {
+  "Prerender2",
+#if defined(OS_ANDROID)
+      base::FEATURE_ENABLED_BY_DEFAULT
+#else
+      base::FEATURE_DISABLED_BY_DEFAULT
+#endif
+};
 
 bool IsPrerender2Enabled() {
   return base::FeatureList::IsEnabled(blink::features::kPrerender2);
diff --git a/third_party/blink/public/public_features.gni b/third_party/blink/public/public_features.gni
index 94d2e5e..b5cc81d 100644
--- a/third_party/blink/public/public_features.gni
+++ b/third_party/blink/public/public_features.gni
@@ -12,7 +12,7 @@
   enable_blink_heap_young_generation = false
 
   # Enables Blink's heap to use V8's version of Oilpan.
-  enable_blink_heap_use_v8_oilpan = false
+  enable_blink_heap_use_v8_oilpan = true
 }
 
 declare_args() {
diff --git a/third_party/blink/renderer/core/aom/computed_accessible_node.cc b/third_party/blink/renderer/core/aom/computed_accessible_node.cc
index 6b33e80b..5f0e230 100644
--- a/third_party/blink/renderer/core/aom/computed_accessible_node.cc
+++ b/third_party/blink/renderer/core/aom/computed_accessible_node.cc
@@ -29,6 +29,10 @@
       ComputedAccessibleNodePromiseResolver* resolver)
       : resolver_(resolver) {}
 
+  RequestAnimationFrameCallback(const RequestAnimationFrameCallback&) = delete;
+  RequestAnimationFrameCallback& operator=(
+      const RequestAnimationFrameCallback&) = delete;
+
   void Invoke(double) override {
     resolver_->continue_callback_request_id_ = 0;
     resolver_->UpdateTreeAndResolve();
@@ -41,8 +45,6 @@
 
  private:
   Member<ComputedAccessibleNodePromiseResolver> resolver_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestAnimationFrameCallback);
 };
 
 ComputedAccessibleNodePromiseResolver::ComputedAccessibleNodePromiseResolver(
diff --git a/third_party/blink/renderer/core/core_initializer.h b/third_party/blink/renderer/core/core_initializer.h
index 575f2d6..e6fecee 100644
--- a/third_party/blink/renderer/core/core_initializer.h
+++ b/third_party/blink/renderer/core/core_initializer.h
@@ -33,7 +33,6 @@
 
 #include <memory>
 
-#include "base/macros.h"
 #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -67,7 +66,6 @@
 
 class CORE_EXPORT CoreInitializer {
   USING_FAST_MALLOC(CoreInitializer);
-  DISALLOW_COPY_AND_ASSIGN(CoreInitializer);
 
  public:
   // Initialize must be called before GetInstance.
@@ -76,6 +74,8 @@
     return *instance_;
   }
 
+  CoreInitializer(const CoreInitializer&) = delete;
+  CoreInitializer& operator=(const CoreInitializer&) = delete;
   virtual ~CoreInitializer() = default;
 
   // Should be called by clients before trying to create Frames.
diff --git a/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.cc b/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.cc
index 685ab9c..dd998f61 100644
--- a/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.cc
+++ b/third_party/blink/renderer/core/editing/markers/suggestion_marker_list_impl.cc
@@ -6,6 +6,7 @@
 
 #include "third_party/blink/renderer/core/editing/markers/suggestion_marker_replacement_scope.h"
 #include "third_party/blink/renderer/core/editing/markers/unsorted_document_marker_list_editor.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h b/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h
index 814d485..3ac51d2 100644
--- a/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h
+++ b/third_party/blink/renderer/core/exported/web_form_element_observer_impl.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_FORM_ELEMENT_OBSERVER_IMPL_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_FORM_ELEMENT_OBSERVER_IMPL_H_
 
-#include "base/macros.h"
 #include "base/types/pass_key.h"
 #include "third_party/blink/public/web/modules/autofill/web_form_element_observer.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -24,6 +23,9 @@
   WebFormElementObserverImpl(base::PassKey<WebFormElementObserver>,
                              HTMLElement&,
                              base::OnceClosure);
+  WebFormElementObserverImpl(const WebFormElementObserverImpl&) = delete;
+  WebFormElementObserverImpl& operator=(const WebFormElementObserverImpl&) =
+      delete;
   ~WebFormElementObserverImpl() override;
 
   // WebFormElementObserver implementation.
@@ -38,8 +40,6 @@
 
   // WebFormElementObserverImpl must remain alive until Disconnect() is called.
   SelfKeepAlive<WebFormElementObserverImpl> self_keep_alive_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebFormElementObserverImpl);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_frame_serializer.cc b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
index ab6da00..e6646c3f 100644
--- a/third_party/blink/renderer/core/exported/web_frame_serializer.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_serializer.cc
@@ -30,7 +30,6 @@
 
 #include "third_party/blink/public/web/web_frame_serializer.h"
 
-#include "base/macros.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/platform/web_url_response.h"
diff --git a/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h b/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h
index 4e9e85d..5fe93a2 100644
--- a/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h
+++ b/third_party/blink/renderer/core/exported/web_input_method_controller_impl.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_INPUT_METHOD_CONTROLLER_IMPL_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_INPUT_METHOD_CONTROLLER_IMPL_H_
 
-#include "base/macros.h"
 #include "third_party/blink/public/web/web_input_method_controller.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -30,6 +29,9 @@
 
  public:
   explicit WebInputMethodControllerImpl(WebLocalFrameImpl& web_frame);
+  WebInputMethodControllerImpl(const WebInputMethodControllerImpl&) = delete;
+  WebInputMethodControllerImpl& operator=(const WebInputMethodControllerImpl&) =
+      delete;
   ~WebInputMethodControllerImpl() override;
 
   // WebInputMethodController overrides.
@@ -70,8 +72,6 @@
   WebPlugin* FocusedPluginIfInputMethodSupported() const;
 
   const Member<WebLocalFrameImpl> web_frame_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebInputMethodControllerImpl);
 };
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.h b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
index 28015a0..5958171 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.h
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.h
@@ -31,7 +31,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_PAGE_POPUP_IMPL_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_PAGE_POPUP_IMPL_H_
 
-#include "base/macros.h"
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "third_party/blink/public/mojom/input/pointer_lock_context.mojom-blink-forward.h"
@@ -71,6 +70,8 @@
   USING_FAST_MALLOC(WebPagePopupImpl);
 
  public:
+  WebPagePopupImpl(const WebPagePopupImpl&) = delete;
+  WebPagePopupImpl& operator=(const WebPagePopupImpl&) = delete;
   ~WebPagePopupImpl() override;
 
   void Initialize(WebViewImpl*, PagePopupClient*);
@@ -279,8 +280,6 @@
 
   friend class WebPagePopup;
   friend class PagePopupChromeClient;
-
-  DISALLOW_COPY_AND_ASSIGN(WebPagePopupImpl);
 };
 
 // WebPagePopupImpl is the only implementation of WebPagePopup and PagePopup, so
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
index 0896b8f..f5a8a0be 100644
--- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc
+++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
@@ -29,7 +29,6 @@
 
 #include "third_party/blink/renderer/core/fullscreen/fullscreen.h"
 
-#include "base/macros.h"
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -134,11 +133,11 @@
   MetaParams(FullscreenRequestType request_type,
              const FullscreenOptions* options)
       : request_type_(request_type), options_(options) {}
-  virtual ~MetaParams() = default;
-
   MetaParams(const MetaParams&) = delete;
   MetaParams& operator=(const MetaParams&) = delete;
 
+  virtual ~MetaParams() = default;
+
   virtual void Trace(Visitor* visitor) const { visitor->Trace(options_); }
 
   FullscreenRequestType request_type() const { return request_type_; }
@@ -413,6 +412,8 @@
     DCHECK(!running_request_fullscreen_);
     running_request_fullscreen_ = true;
   }
+  RequestFullscreenScope(const RequestFullscreenScope&) = delete;
+  RequestFullscreenScope& operator=(const RequestFullscreenScope&) = delete;
 
   ~RequestFullscreenScope() {
     DCHECK(running_request_fullscreen_);
@@ -423,7 +424,6 @@
 
  private:
   static bool running_request_fullscreen_;
-  DISALLOW_COPY_AND_ASSIGN(RequestFullscreenScope);
 };
 
 bool RequestFullscreenScope::running_request_fullscreen_ = false;
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.h b/third_party/blink/renderer/core/fullscreen/fullscreen.h
index 34c1d12..e40ed2d7 100644
--- a/third_party/blink/renderer/core/fullscreen/fullscreen.h
+++ b/third_party/blink/renderer/core/fullscreen/fullscreen.h
@@ -122,6 +122,8 @@
                    FullscreenRequestType type,
                    const FullscreenOptions* options,
                    ScriptPromiseResolver* resolver);
+    PendingRequest(const PendingRequest&) = delete;
+    PendingRequest& operator=(const PendingRequest&) = delete;
     virtual ~PendingRequest();
     virtual void Trace(Visitor* visitor) const;
 
@@ -135,8 +137,6 @@
     FullscreenRequestType type_;
     Member<const FullscreenOptions> options_;
     Member<ScriptPromiseResolver> resolver_;
-
-    DISALLOW_COPY_AND_ASSIGN(PendingRequest);
   };
   using PendingRequests = HeapVector<Member<PendingRequest>>;
   PendingRequests pending_requests_;
diff --git a/third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h b/third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h
index cc75757..2e06a64 100644
--- a/third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h
+++ b/third_party/blink/renderer/core/fullscreen/scoped_allow_fullscreen.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FULLSCREEN_SCOPED_ALLOW_FULLSCREEN_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FULLSCREEN_SCOPED_ALLOW_FULLSCREEN_H_
 
-#include "base/macros.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -20,13 +19,13 @@
 
   static absl::optional<Reason> FullscreenAllowedReason();
   explicit ScopedAllowFullscreen(Reason);
+  ScopedAllowFullscreen(const ScopedAllowFullscreen&) = delete;
+  ScopedAllowFullscreen& operator=(const ScopedAllowFullscreen&) = delete;
   ~ScopedAllowFullscreen();
 
  private:
   static absl::optional<Reason> reason_;
   absl::optional<Reason> previous_reason_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedAllowFullscreen);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
index 4e820305..f90711e 100644
--- a/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
+++ b/third_party/blink/renderer/core/html/anchor_element_metrics_sender.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_ANCHOR_ELEMENT_METRICS_SENDER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_ANCHOR_ELEMENT_METRICS_SENDER_H_
 
-#include "base/macros.h"
 #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom-blink.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
@@ -54,6 +53,9 @@
   static const char kSupplementName[];
 
   explicit AnchorElementMetricsSender(Document&);
+  AnchorElementMetricsSender(const AnchorElementMetricsSender&) = delete;
+  AnchorElementMetricsSender& operator=(const AnchorElementMetricsSender&) =
+      delete;
   virtual ~AnchorElementMetricsSender();
 
   // LocalFrameView::LifecycleNotificationObserver
@@ -105,8 +107,6 @@
   WTF::Vector<mojom::blink::AnchorElementEnteredViewportPtr>
       entered_viewport_messages_;
   WTF::Vector<mojom::blink::AnchorElementClickPtr> clicked_messages_;
-
-  DISALLOW_COPY_AND_ASSIGN(AnchorElementMetricsSender);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/ce_reactions_scope.h b/third_party/blink/renderer/core/html/custom/ce_reactions_scope.h
index c3bf1ee0..9f24787f 100644
--- a/third_party/blink/renderer/core/html/custom/ce_reactions_scope.h
+++ b/third_party/blink/renderer/core/html/custom/ce_reactions_scope.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CE_REACTIONS_SCOPE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CE_REACTIONS_SCOPE_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -27,6 +26,9 @@
     top_of_stack_ = this;
   }
 
+  CEReactionsScope(const CEReactionsScope&) = delete;
+  CEReactionsScope& operator=(const CEReactionsScope&) = delete;
+
   ~CEReactionsScope() {
     if (work_to_do_)
       InvokeReactions();
@@ -42,8 +44,6 @@
 
   CEReactionsScope* prev_;
   bool work_to_do_;
-
-  DISALLOW_COPY_AND_ASSIGN(CEReactionsScope);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition.h b/third_party/blink/renderer/core/html/custom/custom_element_definition.h
index facad10..ddb5303 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_definition.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_definition.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_DEFINITION_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_DEFINITION_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -40,6 +39,8 @@
   // CustomElementRegistry that created it.
   using Id = uint32_t;
 
+  CustomElementDefinition(const CustomElementDefinition&) = delete;
+  CustomElementDefinition& operator=(const CustomElementDefinition&) = delete;
   ~CustomElementDefinition() override;
 
   virtual void Trace(Visitor*) const;
@@ -126,10 +127,11 @@
 
   class CORE_EXPORT ConstructionStackScope final {
     STACK_ALLOCATED();
-    DISALLOW_COPY_AND_ASSIGN(ConstructionStackScope);
 
    public:
     ConstructionStackScope(CustomElementDefinition&, Element&);
+    ConstructionStackScope(const ConstructionStackScope&) = delete;
+    ConstructionStackScope& operator=(const ConstructionStackScope&) = delete;
     ~ConstructionStackScope();
 
    private:
@@ -168,8 +170,6 @@
   HeapVector<Member<CSSStyleSheet>> default_style_sheets_;
 
   void EnqueueAttributeChangedCallbackForAllAttributes(Element&);
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementDefinition);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition_builder.h b/third_party/blink/renderer/core/html/custom/custom_element_definition_builder.h
index 6a61667f..dacfce1 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_definition_builder.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_definition_builder.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_DEFINITION_BUILDER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_DEFINITION_BUILDER_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/css/css_style_sheet.h"
 #include "third_party/blink/renderer/core/html/custom/custom_element_definition.h"
@@ -23,6 +22,11 @@
   STACK_ALLOCATED();
 
  public:
+  CustomElementDefinitionBuilder(const CustomElementDefinitionBuilder&) =
+      delete;
+  CustomElementDefinitionBuilder& operator=(
+      const CustomElementDefinitionBuilder&) = delete;
+
   // This API necessarily sounds JavaScript specific; this implements
   // some steps of the CustomElementRegistry.define process, which
   // are defined in terms of JavaScript.
@@ -45,8 +49,6 @@
 
  protected:
   CustomElementDefinitionBuilder() = default;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementDefinitionBuilder);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_definition_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_definition_test.cc
index 87469ef7..6e46a07 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_definition_test.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_definition_test.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/html/custom/custom_element_definition.h"
 
-#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/dom/node.h"  // CustomElementState
 #include "third_party/blink/renderer/core/html/custom/ce_reactions_scope.h"
@@ -20,10 +19,10 @@
  public:
   ConstructorFails(const CustomElementDescriptor& descriptor)
       : TestCustomElementDefinition(descriptor) {}
+  ConstructorFails(const ConstructorFails&) = delete;
+  ConstructorFails& operator=(const ConstructorFails&) = delete;
   ~ConstructorFails() override = default;
   bool RunConstructor(Element&) override { return false; }
-
-  DISALLOW_COPY_AND_ASSIGN(ConstructorFails);
 };
 
 }  // namespace
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction.h b/third_party/blink/renderer/core/html/custom/custom_element_reaction.h
index 59c30538..fb7af93 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REACTION_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REACTION_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 
@@ -18,6 +17,8 @@
     : public GarbageCollected<CustomElementReaction> {
  public:
   CustomElementReaction(CustomElementDefinition&);
+  CustomElementReaction(const CustomElementReaction&) = delete;
+  CustomElementReaction& operator=(const CustomElementReaction&) = delete;
   virtual ~CustomElementReaction() = default;
 
   virtual void Invoke(Element&) = 0;
@@ -26,8 +27,6 @@
 
  protected:
   Member<CustomElementDefinition> definition_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementReaction);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_factory.cc b/third_party/blink/renderer/core/html/custom/custom_element_reaction_factory.cc
index db35f97..94ba1aa 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_factory.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_factory.cc
@@ -16,6 +16,9 @@
  public:
   explicit CustomElementUpgradeReaction(CustomElementDefinition& definition)
       : CustomElementReaction(definition) {}
+  CustomElementUpgradeReaction(const CustomElementUpgradeReaction&) = delete;
+  CustomElementUpgradeReaction& operator=(const CustomElementUpgradeReaction&) =
+      delete;
 
  private:
   void Invoke(Element& element) override {
@@ -25,8 +28,6 @@
     if (element.GetCustomElementState() == CustomElementState::kUndefined)
       definition_->Upgrade(element);
   }
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementUpgradeReaction);
 };
 
 // ----------------------------------------------------------------
@@ -38,13 +39,15 @@
       : CustomElementReaction(definition) {
     DCHECK(definition.HasConnectedCallback());
   }
+  CustomElementConnectedCallbackReaction(
+      const CustomElementConnectedCallbackReaction&) = delete;
+  CustomElementConnectedCallbackReaction& operator=(
+      const CustomElementConnectedCallbackReaction&) = delete;
 
  private:
   void Invoke(Element& element) override {
     definition_->RunConnectedCallback(element);
   }
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementConnectedCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -56,13 +59,15 @@
       : CustomElementReaction(definition) {
     DCHECK(definition.HasDisconnectedCallback());
   }
+  CustomElementDisconnectedCallbackReaction(
+      const CustomElementDisconnectedCallbackReaction&) = delete;
+  CustomElementDisconnectedCallbackReaction& operator=(
+      const CustomElementDisconnectedCallbackReaction&) = delete;
 
  private:
   void Invoke(Element& element) override {
     definition_->RunDisconnectedCallback(element);
   }
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementDisconnectedCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -79,6 +84,11 @@
     DCHECK(definition.HasAdoptedCallback());
   }
 
+  CustomElementAdoptedCallbackReaction(
+      const CustomElementAdoptedCallbackReaction&) = delete;
+  CustomElementAdoptedCallbackReaction& operator=(
+      const CustomElementAdoptedCallbackReaction&) = delete;
+
   void Trace(Visitor* visitor) const override {
     visitor->Trace(old_owner_);
     visitor->Trace(new_owner_);
@@ -92,8 +102,6 @@
 
   Member<Document> old_owner_;
   Member<Document> new_owner_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementAdoptedCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -113,6 +121,11 @@
     DCHECK(definition.HasAttributeChangedCallback(name));
   }
 
+  CustomElementAttributeChangedCallbackReaction(
+      const CustomElementAttributeChangedCallbackReaction&) = delete;
+  CustomElementAttributeChangedCallbackReaction& operator=(
+      const CustomElementAttributeChangedCallbackReaction&) = delete;
+
  private:
   void Invoke(Element& element) override {
     definition_->RunAttributeChangedCallback(element, name_, old_value_,
@@ -122,8 +135,6 @@
   QualifiedName name_;
   AtomicString old_value_;
   AtomicString new_value_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementAttributeChangedCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -138,6 +149,11 @@
     DCHECK(definition.HasFormAssociatedCallback());
   }
 
+  CustomElementFormAssociatedCallbackReaction(
+      const CustomElementFormAssociatedCallbackReaction&) = delete;
+  CustomElementFormAssociatedCallbackReaction& operator=(
+      const CustomElementFormAssociatedCallbackReaction&) = delete;
+
   void Trace(Visitor* visitor) const override {
     visitor->Trace(form_);
     CustomElementReaction::Trace(visitor);
@@ -149,8 +165,6 @@
   }
 
   Member<HTMLFormElement> form_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementFormAssociatedCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -163,12 +177,15 @@
     DCHECK(definition.HasFormResetCallback());
   }
 
+  CustomElementFormResetCallbackReaction(
+      const CustomElementFormResetCallbackReaction&) = delete;
+  CustomElementFormResetCallbackReaction& operator=(
+      const CustomElementFormResetCallbackReaction&) = delete;
+
  private:
   void Invoke(Element& element) override {
     definition_->RunFormResetCallback(element);
   }
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementFormResetCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -182,14 +199,17 @@
     DCHECK(definition.HasFormDisabledCallback());
   }
 
+  CustomElementFormDisabledCallbackReaction(
+      const CustomElementFormDisabledCallbackReaction&) = delete;
+  CustomElementFormDisabledCallbackReaction& operator=(
+      const CustomElementFormDisabledCallbackReaction&) = delete;
+
  private:
   void Invoke(Element& element) override {
     definition_->RunFormDisabledCallback(element, is_disabled_);
   }
 
   bool is_disabled_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementFormDisabledCallbackReaction);
 };
 
 // ----------------------------------------------------------------
@@ -206,6 +226,11 @@
     DCHECK(mode == "restore" || mode == "autocomplete");
   }
 
+  CustomElementFormStateRestoreCallbackReaction(
+      const CustomElementFormStateRestoreCallbackReaction&) = delete;
+  CustomElementFormStateRestoreCallbackReaction& operator=(
+      const CustomElementFormStateRestoreCallbackReaction&) = delete;
+
   void Trace(Visitor* visitor) const override {
     visitor->Trace(value_);
     CustomElementReaction::Trace(visitor);
@@ -218,8 +243,6 @@
 
   Member<const V8ControlValue> value_;
   String mode_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementFormStateRestoreCallbackReaction);
 };
 
 // ----------------------------------------------------------------
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue.h b/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue.h
index 383236bc..cc3e4ef 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_queue.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REACTION_QUEUE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REACTION_QUEUE_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 
@@ -18,6 +17,9 @@
     : public GarbageCollected<CustomElementReactionQueue> {
  public:
   CustomElementReactionQueue();
+  CustomElementReactionQueue(const CustomElementReactionQueue&) = delete;
+  CustomElementReactionQueue& operator=(const CustomElementReactionQueue&) =
+      delete;
   ~CustomElementReactionQueue();
 
   void Trace(Visitor*) const;
@@ -30,8 +32,6 @@
  private:
   HeapVector<Member<CustomElementReaction>, 1> reactions_;
   wtf_size_t index_;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementReactionQueue);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.h b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.h
index 0a30ef0..5da2b00 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REACTION_STACK_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REACTION_STACK_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/bindings/name_client.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -22,6 +21,9 @@
       public NameClient {
  public:
   CustomElementReactionStack();
+  CustomElementReactionStack(const CustomElementReactionStack&) = delete;
+  CustomElementReactionStack& operator=(const CustomElementReactionStack&) =
+      delete;
   ~CustomElementReactionStack() override = default;
 
   void Trace(Visitor*) const;
@@ -51,8 +53,6 @@
   void InvokeBackupQueue();
   void InvokeReactions(ElementQueue&);
   void Enqueue(Member<ElementQueue>&, Element&, CustomElementReaction&);
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementReactionStack);
 };
 
 class CORE_EXPORT CustomElementReactionStackTestSupport final {
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc
index a515720..cc3cc1c 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_stack_test.cc
@@ -6,7 +6,6 @@
 
 #include <initializer_list>
 
-#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/html/custom/custom_element_reaction.h"
 #include "third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h"
@@ -187,6 +186,8 @@
                  Element& element,
                  CustomElementReaction* reaction)
       : stack_(stack), element_(element), reaction_(reaction) {}
+  EnqueueToStack(const EnqueueToStack&) = delete;
+  EnqueueToStack& operator=(const EnqueueToStack&) = delete;
   ~EnqueueToStack() override = default;
   void Trace(Visitor* visitor) const override {
     Command::Trace(visitor);
@@ -202,8 +203,6 @@
   Member<CustomElementReactionStack> stack_;
   Member<Element> element_;
   Member<CustomElementReaction> reaction_;
-
-  DISALLOW_COPY_AND_ASSIGN(EnqueueToStack);
 };
 
 TEST(CustomElementReactionStackTest, enqueueFromReaction) {
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h b/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h
index a9417d1..01c5c61 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_reaction_test_helpers.h
@@ -10,7 +10,6 @@
 #include <initializer_list>
 #include <memory>
 
-#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/core/html/custom/custom_element_reaction_queue.h"
 #include "third_party/blink/renderer/core/html/custom/custom_element_reaction_stack.h"
@@ -25,54 +24,57 @@
 class Command : public GarbageCollected<Command> {
  public:
   Command() = default;
+  Command(const Command&) = delete;
+  Command& operator=(const Command&) = delete;
   virtual ~Command() = default;
   virtual void Trace(Visitor* visitor) const {}
   virtual void Run(Element&) = 0;
 
-  DISALLOW_COPY_AND_ASSIGN(Command);
 };
 
 class Call : public Command {
  public:
   using Callback = base::OnceCallback<void(Element&)>;
   Call(Callback callback) : callback_(std::move(callback)) {}
+  Call(const Call&) = delete;
+  Call& operator=(const Call&) = delete;
   ~Call() override = default;
   void Run(Element& element) override { std::move(callback_).Run(element); }
 
  private:
   Callback callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(Call);
 };
 
 class Unreached : public Command {
  public:
   Unreached(const char* message) : message_(message) {}
+  Unreached(const Unreached&) = delete;
+  Unreached& operator=(const Unreached&) = delete;
   ~Unreached() override = default;
   void Run(Element&) override { EXPECT_TRUE(false) << message_; }
 
  private:
   const char* message_;
-
-  DISALLOW_COPY_AND_ASSIGN(Unreached);
 };
 
 class Log : public Command {
  public:
   Log(char what, Vector<char>& where) : what_(what), where_(where) {}
+  Log(const Log&) = delete;
+  Log& operator=(const Log&) = delete;
   ~Log() override = default;
   void Run(Element&) override { where_.push_back(what_); }
 
  private:
   char what_;
   Vector<char>& where_;
-
-  DISALLOW_COPY_AND_ASSIGN(Log);
 };
 
 class Recurse : public Command {
  public:
   Recurse(CustomElementReactionQueue* queue) : queue_(queue) {}
+  Recurse(const Recurse&) = delete;
+  Recurse& operator=(const Recurse&) = delete;
   ~Recurse() override = default;
   void Trace(Visitor* visitor) const override {
     Command::Trace(visitor);
@@ -82,14 +84,14 @@
 
  private:
   Member<CustomElementReactionQueue> queue_;
-
-  DISALLOW_COPY_AND_ASSIGN(Recurse);
 };
 
 class Enqueue : public Command {
  public:
   Enqueue(CustomElementReactionQueue* queue, CustomElementReaction* reaction)
       : queue_(queue), reaction_(reaction) {}
+  Enqueue(const Enqueue&) = delete;
+  Enqueue& operator=(const Enqueue&) = delete;
   ~Enqueue() override = default;
   void Trace(Visitor* visitor) const override {
     Command::Trace(visitor);
@@ -101,8 +103,6 @@
  private:
   Member<CustomElementReactionQueue> queue_;
   Member<CustomElementReaction> reaction_;
-
-  DISALLOW_COPY_AND_ASSIGN(Enqueue);
 };
 
 class TestReaction : public CustomElementReaction {
@@ -112,6 +112,8 @@
             *MakeGarbageCollected<TestCustomElementDefinition>(
                 CustomElementDescriptor("mock-element", "mock-element"))),
         commands_(std::move(commands)) {}
+  TestReaction(const TestReaction&) = delete;
+  TestReaction& operator=(const TestReaction&) = delete;
   ~TestReaction() override = default;
   void Trace(Visitor* visitor) const override {
     CustomElementReaction::Trace(visitor);
@@ -124,8 +126,6 @@
 
  private:
   HeapVector<Member<Command>> commands_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestReaction);
 };
 
 class ResetCustomElementReactionStackForTest final {
@@ -135,6 +135,10 @@
       : stack_(MakeGarbageCollected<CustomElementReactionStack>()),
         old_stack_(
             CustomElementReactionStackTestSupport::SetCurrentForTest(stack_)) {}
+  ResetCustomElementReactionStackForTest(
+      const ResetCustomElementReactionStackForTest&) = delete;
+  ResetCustomElementReactionStackForTest& operator=(
+      const ResetCustomElementReactionStackForTest&) = delete;
 
   ~ResetCustomElementReactionStackForTest() {
     CustomElementReactionStackTestSupport::SetCurrentForTest(old_stack_);
@@ -145,8 +149,6 @@
  private:
   CustomElementReactionStack* stack_;
   CustomElementReactionStack* old_stack_;
-
-  DISALLOW_COPY_AND_ASSIGN(ResetCustomElementReactionStackForTest);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry.h b/third_party/blink/renderer/core/html/custom/custom_element_registry.h
index 9f26812..f051bfc 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_registry.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_registry.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CUSTOM_CUSTOM_ELEMENT_REGISTRY_H_
 
 #include "base/gtest_prod_util.h"
-#include "base/macros.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/html/custom/custom_element_definition.h"
@@ -34,6 +33,8 @@
 
  public:
   CustomElementRegistry(const LocalDOMWindow*);
+  CustomElementRegistry(const CustomElementRegistry&) = delete;
+  CustomElementRegistry& operator=(const CustomElementRegistry&) = delete;
   ~CustomElementRegistry() override = default;
 
   CustomElementDefinition* define(ScriptState*,
@@ -96,8 +97,6 @@
       CustomElementTest,
       CreateElement_TagNameCaseHandlingCreatingCustomElement);
   friend class CustomElementRegistryTest;
-
-  DISALLOW_COPY_AND_ASSIGN(CustomElementRegistry);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
index b927a75..108829b 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
+++ b/third_party/blink/renderer/core/html/custom/custom_element_registry_test.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/html/custom/custom_element_registry.h"
 
-#include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/web/web_custom_element.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
@@ -173,6 +172,8 @@
                 "attr1", "attr2", html_names::kContenteditableAttr.LocalName(),
             },
             {}) {}
+  LogUpgradeDefinition(const LogUpgradeDefinition&) = delete;
+  LogUpgradeDefinition& operator=(const LogUpgradeDefinition&) = delete;
 
   void Trace(Visitor* visitor) const override {
     TestCustomElementDefinition::Trace(visitor);
@@ -254,8 +255,6 @@
     EXPECT_EQ(&element, element_);
     attribute_changed_.push_back(AttributeChanged{name, old_value, new_value});
   }
-
-  DISALLOW_COPY_AND_ASSIGN(LogUpgradeDefinition);
 };
 
 class LogUpgradeBuilder final : public TestCustomElementDefinitionBuilder {
@@ -263,13 +262,13 @@
 
  public:
   LogUpgradeBuilder() = default;
+  LogUpgradeBuilder(const LogUpgradeBuilder&) = delete;
+  LogUpgradeBuilder& operator=(const LogUpgradeBuilder&) = delete;
 
   CustomElementDefinition* Build(const CustomElementDescriptor& descriptor,
                                  CustomElementDefinition::Id) override {
     return MakeGarbageCollected<LogUpgradeDefinition>(descriptor);
   }
-
-  DISALLOW_COPY_AND_ASSIGN(LogUpgradeBuilder);
 };
 
 TEST_F(CustomElementRegistryTest, define_upgradesInDocumentElements) {
diff --git a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h
index 9f8bd5a..c5da9531 100644
--- a/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h
+++ b/third_party/blink/renderer/core/html/custom/custom_element_test_helpers.h
@@ -7,7 +7,6 @@
 
 #include <utility>
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/qualified_name.h"
@@ -30,16 +29,16 @@
 
  public:
   TestCustomElementDefinitionBuilder() = default;
+  TestCustomElementDefinitionBuilder(
+      const TestCustomElementDefinitionBuilder&) = delete;
+  TestCustomElementDefinitionBuilder& operator=(
+      const TestCustomElementDefinitionBuilder&) = delete;
 
   bool CheckConstructorIntrinsics() override { return true; }
   bool CheckConstructorNotRegistered() override { return true; }
   bool RememberOriginalProperties() override { return true; }
   CustomElementDefinition* Build(const CustomElementDescriptor&,
                                  CustomElementDefinition::Id) override;
-
- private:
-
-  DISALLOW_COPY_AND_ASSIGN(TestCustomElementDefinitionBuilder);
 };
 
 class TestCustomElementDefinition : public CustomElementDefinition {
@@ -55,6 +54,10 @@
                                 disabled_features,
                                 FormAssociationFlag::kNo) {}
 
+  TestCustomElementDefinition(const TestCustomElementDefinition&) = delete;
+  TestCustomElementDefinition& operator=(const TestCustomElementDefinition&) =
+      delete;
+
   ~TestCustomElementDefinition() override = default;
 
   ScriptValue GetConstructorForScript() override { return ScriptValue(); }
@@ -119,8 +122,6 @@
                                    const String& mode) override {
     NOTREACHED() << "definition does not have restoreValueCallback";
   }
-
-  DISALLOW_COPY_AND_ASSIGN(TestCustomElementDefinition);
 };
 
 class CreateElement {
diff --git a/third_party/blink/renderer/core/html/custom/element_internals.h b/third_party/blink/renderer/core/html/custom/element_internals.h
index 1c2592a0..5e88904 100644
--- a/third_party/blink/renderer/core/html/custom/element_internals.h
+++ b/third_party/blink/renderer/core/html/custom/element_internals.h
@@ -25,6 +25,8 @@
 
  public:
   ElementInternals(HTMLElement& target);
+  ElementInternals(const ElementInternals&) = delete;
+  ElementInternals& operator=(const ElementInternals&) = delete;
   void Trace(Visitor* visitor) const override;
 
   HTMLElement& Target() const { return *target_; }
@@ -115,8 +117,6 @@
   // https://whatpr.org/html/3917/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes:element
   HeapHashMap<QualifiedName, Member<HeapLinkedHashSet<WeakMember<Element>>>>
       explicitly_set_attr_elements_map_;
-
-  DISALLOW_COPY_AND_ASSIGN(ElementInternals);
 };
 
 template <>
diff --git a/third_party/blink/renderer/core/html/forms/type_ahead.cc b/third_party/blink/renderer/core/html/forms/type_ahead.cc
index d1593e0..580160f3 100644
--- a/third_party/blink/renderer/core/html/forms/type_ahead.cc
+++ b/third_party/blink/renderer/core/html/forms/type_ahead.cc
@@ -31,6 +31,7 @@
 
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/html/html_marquee_element.cc b/third_party/blink/renderer/core/html/html_marquee_element.cc
index d9c5c81..cf6e14a 100644
--- a/third_party/blink/renderer/core/html/html_marquee_element.cc
+++ b/third_party/blink/renderer/core/html/html_marquee_element.cc
@@ -83,6 +83,9 @@
  public:
   explicit RequestAnimationFrameCallback(HTMLMarqueeElement* marquee)
       : marquee_(marquee) {}
+  RequestAnimationFrameCallback(const RequestAnimationFrameCallback&) = delete;
+  RequestAnimationFrameCallback& operator=(
+      const RequestAnimationFrameCallback&) = delete;
 
   void Invoke(double) override {
     marquee_->continue_callback_request_id_ = 0;
@@ -96,8 +99,6 @@
 
  private:
   Member<HTMLMarqueeElement> marquee_;
-
-  DISALLOW_COPY_AND_ASSIGN(RequestAnimationFrameCallback);
 };
 
 class HTMLMarqueeElement::AnimationFinished final : public NativeEventListener {
diff --git a/third_party/blink/renderer/core/html/link_resource.h b/third_party/blink/renderer/core/html/link_resource.h
index 27191f86..e5978df 100644
--- a/third_party/blink/renderer/core/html/link_resource.h
+++ b/third_party/blink/renderer/core/html/link_resource.h
@@ -31,7 +31,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_LINK_RESOURCE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_LINK_RESOURCE_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
@@ -48,6 +47,8 @@
   enum LinkResourceType { kStyle, kManifest, kOther };
 
   explicit LinkResource(HTMLLinkElement*);
+  LinkResource(const LinkResource&) = delete;
+  LinkResource& operator=(const LinkResource&) = delete;
   virtual ~LinkResource();
 
   bool ShouldLoadResource() const;
@@ -70,8 +71,6 @@
   ExecutionContext* GetExecutionContext();
 
   Member<HTMLLinkElement> owner_;
-
-  DISALLOW_COPY_AND_ASSIGN(LinkResource);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc
index c3663ad..16a98f7 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow_line.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow_line.cc
@@ -740,7 +740,8 @@
   // line of an element. For example, the first line of an anonymous block
   // box is only affected if it is the first child of its parent element.
   // https://drafts.csswg.org/css-text-3/#text-indent-property
-  return !(IsAnonymousBlock() && PreviousSibling());
+  return !IsAnonymousBlock() || !PreviousSibling() ||
+         IsFlexItemIncludingDeprecatedAndNG() || IsGridItemIncludingNG();
 }
 
 static void UpdateLogicalInlinePositions(LayoutBlockFlow* block,
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 493b886..4aedd84 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
@@ -198,7 +198,7 @@
         bitfields_.percentage_inline_storage)) {
       default:
         NOTREACHED();
-        U_FALLTHROUGH;
+        FALLTHROUGH;
       case kSameAsAvailable:
         return available_size_.inline_size;
       case kZero:
@@ -216,7 +216,7 @@
         static_cast<NGPercentageStorage>(bitfields_.percentage_block_storage)) {
       default:
         NOTREACHED();
-        U_FALLTHROUGH;
+        FALLTHROUGH;
       case kSameAsAvailable:
         return available_size_.block_size;
       case kZero:
diff --git a/third_party/blink/renderer/core/svg/animation/priority_queue.h b/third_party/blink/renderer/core/svg/animation/priority_queue.h
index 86030bc..fe60c68 100644
--- a/third_party/blink/renderer/core/svg/animation/priority_queue.h
+++ b/third_party/blink/renderer/core/svg/animation/priority_queue.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_ANIMATION_PRIORITY_QUEUE_H_
 
 #include "base/gtest_prod_util.h"
-#include "base/macros.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 
@@ -30,6 +29,8 @@
   using const_iterator = typename StorageType::const_iterator;
 
   PriorityQueue() = default;
+  PriorityQueue(const PriorityQueue&) = delete;
+  PriorityQueue& operator=(const PriorityQueue&) = delete;
 
   bool Contains(ElementType* element) const {
     return element->PriorityQueueHandle() != kNotFound;
@@ -79,8 +80,6 @@
   }
 
   StorageType heap_;
-
-  DISALLOW_COPY_AND_ASSIGN(PriorityQueue);
 };
 
 template <typename PriorityType, typename ElementType>
diff --git a/third_party/blink/renderer/core/svg/graphics/svg_image.h b/third_party/blink/renderer/core/svg/graphics/svg_image.h
index 67bf3bd..0f53fb7 100644
--- a/third_party/blink/renderer/core/svg/graphics/svg_image.h
+++ b/third_party/blink/renderer/core/svg/graphics/svg_image.h
@@ -27,7 +27,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_GRAPHICS_SVG_IMAGE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_GRAPHICS_SVG_IMAGE_H_
 
-#include "base/macros.h"
 #include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/geometry/layout_size.h"
@@ -255,11 +254,13 @@
     image_->SetImageObserverDisabled(true);
   }
 
+  ImageObserverDisabler(const ImageObserverDisabler&) = delete;
+  ImageObserverDisabler& operator=(const ImageObserverDisabler&) = delete;
+
   ~ImageObserverDisabler() { image_->SetImageObserverDisabled(false); }
 
  private:
   Image* image_;
-  DISALLOW_COPY_AND_ASSIGN(ImageObserverDisabler);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/properties/svg_animated_property.h b/third_party/blink/renderer/core/svg/properties/svg_animated_property.h
index 56847e9..cc5a5b8 100644
--- a/third_party/blink/renderer/core/svg/properties/svg_animated_property.h
+++ b/third_party/blink/renderer/core/svg/properties/svg_animated_property.h
@@ -31,7 +31,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_PROPERTIES_SVG_ANIMATED_PROPERTY_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_PROPERTIES_SVG_ANIMATED_PROPERTY_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/css/css_property_names.h"
 #include "third_party/blink/renderer/core/dom/qualified_name.h"
 #include "third_party/blink/renderer/core/svg/properties/svg_property_info.h"
@@ -47,6 +46,8 @@
 
 class SVGAnimatedPropertyBase : public GarbageCollectedMixin {
  public:
+  SVGAnimatedPropertyBase(const SVGAnimatedPropertyBase&) = delete;
+  SVGAnimatedPropertyBase& operator=(const SVGAnimatedPropertyBase&) = delete;
   virtual ~SVGAnimatedPropertyBase();
 
   virtual const SVGPropertyBase& BaseValueBase() const = 0;
@@ -108,7 +109,6 @@
   unsigned base_value_needs_synchronization_ : 1;
   Member<SVGElement> context_element_;
   const QualifiedName& attribute_name_;
-  DISALLOW_COPY_AND_ASSIGN(SVGAnimatedPropertyBase);
 };
 
 template <typename Property>
diff --git a/third_party/blink/renderer/core/svg/svg_document_extensions.h b/third_party/blink/renderer/core/svg/svg_document_extensions.h
index 004ee2b..d8f3c50 100644
--- a/third_party/blink/renderer/core/svg/svg_document_extensions.h
+++ b/third_party/blink/renderer/core/svg/svg_document_extensions.h
@@ -22,7 +22,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_DOCUMENT_EXTENSIONS_H_
 
 #include "base/dcheck_is_on.h"
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/geometry/float_point.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -40,6 +39,8 @@
     : public GarbageCollected<SVGDocumentExtensions> {
  public:
   explicit SVGDocumentExtensions(Document*);
+  SVGDocumentExtensions(const SVGDocumentExtensions&) = delete;
+  SVGDocumentExtensions& operator=(const SVGDocumentExtensions&) = delete;
   ~SVGDocumentExtensions();
 
   void AddTimeContainer(SVGSVGElement*);
@@ -85,7 +86,6 @@
 #if DCHECK_IS_ON()
   bool in_relative_length_svg_roots_invalidation_ = false;
 #endif
-  DISALLOW_COPY_AND_ASSIGN(SVGDocumentExtensions);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_element.h b/third_party/blink/renderer/core/svg/svg_element.h
index 2171cb9..dfc9919 100644
--- a/third_party/blink/renderer/core/svg/svg_element.h
+++ b/third_party/blink/renderer/core/svg/svg_element.h
@@ -23,7 +23,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_ELEMENT_H_
 
 #include "base/dcheck_is_on.h"
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/events/simulated_click_options.h"
@@ -201,11 +200,12 @@
 
    public:
     InvalidationGuard(SVGElement* element) : element_(element) {}
+    InvalidationGuard(const InvalidationGuard&) = delete;
+    InvalidationGuard& operator=(const InvalidationGuard&) = delete;
     ~InvalidationGuard() { element_->InvalidateInstances(); }
 
    private:
     SVGElement* element_;
-    DISALLOW_COPY_AND_ASSIGN(InvalidationGuard);
   };
 
   class InstanceUpdateBlocker {
@@ -213,11 +213,12 @@
 
    public:
     InstanceUpdateBlocker(SVGElement* target_element);
+    InstanceUpdateBlocker(const InstanceUpdateBlocker&) = delete;
+    InstanceUpdateBlocker& operator=(const InstanceUpdateBlocker&) = delete;
     ~InstanceUpdateBlocker();
 
    private:
     SVGElement* target_element_;
-    DISALLOW_COPY_AND_ASSIGN(InstanceUpdateBlocker);
   };
 
   void InvalidateInstances();
diff --git a/third_party/blink/renderer/core/svg/svg_element_rare_data.h b/third_party/blink/renderer/core/svg/svg_element_rare_data.h
index d48de26..f06f79e 100644
--- a/third_party/blink/renderer/core/svg/svg_element_rare_data.h
+++ b/third_party/blink/renderer/core/svg/svg_element_rare_data.h
@@ -20,7 +20,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_ELEMENT_RARE_DATA_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_ELEMENT_RARE_DATA_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/core/svg/svg_element.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -39,6 +38,8 @@
         instances_updates_blocked_(false),
         needs_override_computed_style_update_(false),
         web_animated_attributes_dirty_(false) {}
+  SVGElementRareData(const SVGElementRareData&) = delete;
+  SVGElementRareData& operator=(const SVGElementRareData&) = delete;
 
   SVGElementSet& OutgoingReferences() { return outgoing_references_; }
   const SVGElementSet& OutgoingReferences() const {
@@ -116,7 +117,6 @@
   scoped_refptr<ComputedStyle> override_computed_style_;
   // Used by <animateMotion>
   AffineTransform animate_motion_transform_;
-  DISALLOW_COPY_AND_ASSIGN(SVGElementRareData);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_path_blender.h b/third_party/blink/renderer/core/svg/svg_path_blender.h
index 62e0f0d..7f18acb 100644
--- a/third_party/blink/renderer/core/svg/svg_path_blender.h
+++ b/third_party/blink/renderer/core/svg/svg_path_blender.h
@@ -20,7 +20,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_BLENDER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_BLENDER_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 
 namespace blink {
@@ -35,6 +34,8 @@
   SVGPathBlender(SVGPathByteStreamSource* from_source,
                  SVGPathByteStreamSource* to_source,
                  SVGPathConsumer*);
+  SVGPathBlender(const SVGPathBlender&) = delete;
+  SVGPathBlender& operator=(const SVGPathBlender&) = delete;
 
   bool AddAnimatedPath(unsigned repeat_count);
   bool BlendAnimatedPath(float);
@@ -46,7 +47,6 @@
   SVGPathByteStreamSource* from_source_;
   SVGPathByteStreamSource* to_source_;
   SVGPathConsumer* consumer_;
-  DISALLOW_COPY_AND_ASSIGN(SVGPathBlender);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_path_byte_stream_source.h b/third_party/blink/renderer/core/svg/svg_path_byte_stream_source.h
index 3f79ca5a..211fe17 100644
--- a/third_party/blink/renderer/core/svg/svg_path_byte_stream_source.h
+++ b/third_party/blink/renderer/core/svg/svg_path_byte_stream_source.h
@@ -20,7 +20,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_BYTE_STREAM_SOURCE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_BYTE_STREAM_SOURCE_H_
 
-#include "base/macros.h"
 #include "build/build_config.h"
 #include "third_party/blink/renderer/core/svg/svg_path_byte_stream.h"
 #include "third_party/blink/renderer/core/svg/svg_path_data.h"
@@ -34,6 +33,8 @@
  public:
   explicit SVGPathByteStreamSource(const SVGPathByteStream& stream)
       : stream_current_(stream.begin()), stream_end_(stream.end()) {}
+  SVGPathByteStreamSource(const SVGPathByteStreamSource&) = delete;
+  SVGPathByteStreamSource& operator=(const SVGPathByteStreamSource&) = delete;
 
   bool HasMoreData() const { return stream_current_ < stream_end_; }
   PathSegmentData ParseSegment();
@@ -63,7 +64,6 @@
 
   SVGPathByteStream::DataIterator stream_current_;
   SVGPathByteStream::DataIterator stream_end_;
-  DISALLOW_COPY_AND_ASSIGN(SVGPathByteStreamSource);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_path_consumer.h b/third_party/blink/renderer/core/svg/svg_path_consumer.h
index 4d1f6cef..1decb5b 100644
--- a/third_party/blink/renderer/core/svg/svg_path_consumer.h
+++ b/third_party/blink/renderer/core/svg/svg_path_consumer.h
@@ -24,7 +24,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_CONSUMER_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_CONSUMER_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 
@@ -37,12 +36,11 @@
 
  public:
   SVGPathConsumer() = default;
+  SVGPathConsumer(const SVGPathConsumer&) = delete;
+  SVGPathConsumer& operator=(const SVGPathConsumer&) = delete;
   virtual ~SVGPathConsumer() = default;
 
   virtual void EmitSegment(const PathSegmentData&) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SVGPathConsumer);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_path_string_source.h b/third_party/blink/renderer/core/svg/svg_path_string_source.h
index 7b9cc28..5ff24a73 100644
--- a/third_party/blink/renderer/core/svg/svg_path_string_source.h
+++ b/third_party/blink/renderer/core/svg/svg_path_string_source.h
@@ -21,7 +21,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_STRING_SOURCE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_PATH_STRING_SOURCE_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/svg/svg_parsing_error.h"
 #include "third_party/blink/renderer/core/svg/svg_path_data.h"
@@ -34,6 +33,8 @@
 
  public:
   explicit SVGPathStringSource(StringView);
+  SVGPathStringSource(const SVGPathStringSource&) = delete;
+  SVGPathStringSource& operator=(const SVGPathStringSource&) = delete;
 
   bool HasMoreData() const {
     if (is_8bit_source_)
@@ -64,8 +65,6 @@
   SVGPathSegType previous_command_;
   SVGParsingError error_;
   StringView source_;
-
-  DISALLOW_COPY_AND_ASSIGN(SVGPathStringSource);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/svg_resource.h b/third_party/blink/renderer/core/svg/svg_resource.h
index 7f591d7..4b897df 100644
--- a/third_party/blink/renderer/core/svg/svg_resource.h
+++ b/third_party/blink/renderer/core/svg/svg_resource.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SVG_SVG_RESOURCE_H_
 
-#include "base/macros.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_client.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
@@ -62,6 +61,8 @@
 //
 class SVGResource : public GarbageCollected<SVGResource> {
  public:
+  SVGResource(const SVGResource&) = delete;
+  SVGResource& operator=(const SVGResource&) = delete;
   virtual ~SVGResource();
 
   virtual void Load(Document&) {}
@@ -103,9 +104,6 @@
     CycleState cached_cycle_check = kNeedCheck;
   };
   mutable HeapHashMap<Member<SVGResourceClient>, ClientEntry> clients_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SVGResource);
 };
 
 // Local resource reference (see SVGResource.)
diff --git a/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h b/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h
index 2267e75..568b448f 100644
--- a/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h
+++ b/third_party/blink/renderer/core/svg/svg_tree_scope_resources.h
@@ -22,6 +22,8 @@
     : public GarbageCollected<SVGTreeScopeResources> {
  public:
   explicit SVGTreeScopeResources(TreeScope*);
+  SVGTreeScopeResources(const SVGTreeScopeResources&) = delete;
+  SVGTreeScopeResources& operator=(const SVGTreeScopeResources&) = delete;
 
   LocalSVGResource* ResourceForId(const AtomicString& id);
   LocalSVGResource* ExistingResourceForId(const AtomicString& id) const;
@@ -33,8 +35,6 @@
 
   HeapHashMap<AtomicString, WeakMember<LocalSVGResource>> resources_;
   Member<TreeScope> tree_scope_;
-
-  DISALLOW_COPY_AND_ASSIGN(SVGTreeScopeResources);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/xml/xpath_parser.cc b/third_party/blink/renderer/core/xml/xpath_parser.cc
index 39fe46e..e55143bc 100644
--- a/third_party/blink/renderer/core/xml/xpath_parser.cc
+++ b/third_party/blink/renderer/core/xml/xpath_parser.cc
@@ -36,6 +36,7 @@
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace blink {
 namespace xpath {
diff --git a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc
index 7fb911b..ca8fa89 100644
--- a/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc
+++ b/third_party/blink/renderer/modules/breakout_box/media_stream_video_track_underlying_source.cc
@@ -127,7 +127,7 @@
     case mojom::MediaStreamType::DISPLAY_VIDEO_CAPTURE:
       if (IsScreenOrWindowCapture(device.id))
         return device.id;
-      U_FALLTHROUGH;
+      FALLTHROUGH;
     default:
       return std::string();
   }
@@ -153,7 +153,7 @@
                 MediaStreamVideoTrackUnderlyingSource::kMinMonitoredFrameCount,
                 media::kVideoCaptureDefaultMaxBufferPoolSize / 2)));
       }
-      U_FALLTHROUGH;
+      FALLTHROUGH;
     default:
       // There will be no monitoring and no frame pool size. Return 0 to signal
       // that the returned value will not be used.
diff --git a/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc b/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc
index de81985..5b9319f 100644
--- a/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc
+++ b/third_party/blink/renderer/platform/fonts/android/font_cache_android.cc
@@ -82,6 +82,50 @@
 // static
 void FontCache::SetSystemFontFamily(const AtomicString&) {}
 
+// static
+const char* FontCache::GetLocaleSpecificFamilyName(
+    const AtomicString& family_name) {
+  // Only `serif` has `fallbackFor` according to the current `fonts.xml`.
+  if (family_name == font_family_names::kWebkitSerif)
+    return "serif";
+  return nullptr;
+}
+
+sk_sp<SkTypeface> FontCache::CreateLocaleSpecificTypeface(
+    const FontDescription& font_description,
+    const char* locale_family_name) {
+  const char* bcp47 = font_description.LocaleOrDefault().LocaleForSkFontMgr();
+  DCHECK(bcp47);
+  SkFontMgr* font_manager =
+      font_manager_ ? font_manager_.get() : SkFontMgr::RefDefault().get();
+  sk_sp<SkTypeface> typeface(font_manager->matchFamilyStyleCharacter(
+      locale_family_name, font_description.SkiaFontStyle(), &bcp47,
+      /* bcp47Count */ 1,
+      // |matchFamilyStyleCharacter| is the only API that accepts |bcp47|, but
+      // it also checks if a character has a glyph. To look up the first
+      // match, use the space character, because all fonts are likely to have
+      // a glyph for it.
+      kSpaceCharacter));
+  if (!typeface)
+    return nullptr;
+
+  // When the specified family of the specified language does not exist, we want
+  // to fall back to the specified family of the default language, but
+  // |matchFamilyStyleCharacter| falls back to the default family of the
+  // specified language. Get the default family of the language and compare
+  // with what we get.
+  SkString skia_family_name;
+  typeface->getFamilyName(&skia_family_name);
+  sk_sp<SkTypeface> fallback(font_manager->matchFamilyStyleCharacter(
+      nullptr, font_description.SkiaFontStyle(), &bcp47,
+      /* bcp47Count */ 1, kSpaceCharacter));
+  SkString skia_fallback_name;
+  fallback->getFamilyName(&skia_fallback_name);
+  if (typeface != fallback)
+    return typeface;
+  return nullptr;
+}
+
 scoped_refptr<SimpleFontData> FontCache::PlatformFallbackFontForCharacter(
     const FontDescription& font_description,
     UChar32 c,
@@ -148,46 +192,4 @@
       kDoNotRetain);
 }
 
-// static
-AtomicString FontCache::GetGenericFamilyNameForScript(
-    const AtomicString& family_name,
-    const FontDescription& font_description) {
-  // If monospace, do not apply CJK hack to find i18n fonts, because
-  // i18n fonts are likely not monospace. Monospace is mostly used
-  // for code, but when i18n characters appear in monospace, system
-  // fallback can still render the characters.
-  if (family_name == font_family_names::kWebkitMonospace)
-    return family_name;
-
-  // The CJK hack below should be removed, at latest when we have
-  // serif and sans-serif versions of CJK fonts. Until then, limit it
-  // to only when the content locale is available. crbug.com/652146
-  const LayoutLocale* content_locale = font_description.Locale();
-  if (!content_locale)
-    return family_name;
-
-  // This is a hack to use the preferred font for CJK scripts.
-  // TODO(kojii): This logic disregards either generic family name
-  // or locale. We need an API that honors both to find appropriate
-  // fonts. crbug.com/642340
-  UChar32 exampler_char;
-  switch (content_locale->GetScript()) {
-    case USCRIPT_SIMPLIFIED_HAN:
-    case USCRIPT_TRADITIONAL_HAN:
-    case USCRIPT_KATAKANA_OR_HIRAGANA:
-      exampler_char = 0x4E00;  // A common character in Japanese and Chinese.
-      break;
-    case USCRIPT_HANGUL:
-      exampler_char = 0xAC00;
-      break;
-    default:
-      // For other scripts, use the default generic family mapping logic.
-      return family_name;
-  }
-
-  sk_sp<SkFontMgr> fm(SkFontMgr::RefDefault());
-  return GetFamilyNameForCharacter(fm.get(), exampler_char, font_description,
-                                   nullptr, FontFallbackPriority::kText);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc b/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc
index 6dbe3f6..63e29c3b 100644
--- a/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc
+++ b/third_party/blink/renderer/platform/fonts/android/font_cache_android_test.cc
@@ -28,31 +28,30 @@
   EXPECT_TRUE(font_data);
 }
 
-TEST(FontCacheAndroid, genericFamilyNameForScript) {
-  FontDescription english;
-  english.SetLocale(LayoutLocale::Get("en"));
-  FontDescription chinese;
-  chinese.SetLocale(LayoutLocale::Get("zh"));
+TEST(FontCacheAndroid, LocaleSpecificTypeface) {
+  FontCachePurgePreventer purge_preventer;
+  FontCache* font_cache = FontCache::GetFontCache();
 
-  font_family_names::Init();
+  FontDescription serif_ja_description;
+  serif_ja_description.SetLocale(LayoutLocale::Get("ja"));
+  serif_ja_description.SetGenericFamily(FontDescription::kSerifFamily);
+  sk_sp<SkTypeface> serif_ja_typeface =
+      font_cache->CreateLocaleSpecificTypeface(serif_ja_description, "serif");
 
-  // For non-CJK, getGenericFamilyNameForScript should return the given
-  // familyName.
-  EXPECT_EQ(font_family_names::kWebkitStandard,
-            FontCache::GetGenericFamilyNameForScript(
-                font_family_names::kWebkitStandard, english));
-  EXPECT_EQ(font_family_names::kWebkitMonospace,
-            FontCache::GetGenericFamilyNameForScript(
-                font_family_names::kWebkitMonospace, english));
+  // |CreateLocaleSpecificTypeface| returns `nullptr` if the system does not
+  // have a locale-specific `serif` for Japanese. In this case, we can't test
+  // further.
+  if (!serif_ja_typeface)
+    return;
 
-  // For CJK, getGenericFamilyNameForScript should return CJK fonts except
-  // monospace.
-  EXPECT_NE(font_family_names::kWebkitStandard,
-            FontCache::GetGenericFamilyNameForScript(
-                font_family_names::kWebkitStandard, chinese));
-  EXPECT_EQ(font_family_names::kWebkitMonospace,
-            FontCache::GetGenericFamilyNameForScript(
-                font_family_names::kWebkitMonospace, chinese));
+  // If the system has one, it must be different from the default font.
+  FontDescription standard_ja_description;
+  standard_ja_description.SetLocale(LayoutLocale::Get("ja"));
+  standard_ja_description.SetGenericFamily(FontDescription::kStandardFamily);
+  std::string name;
+  sk_sp<SkTypeface> standard_ja_typeface = font_cache->CreateTypeface(
+      standard_ja_description, FontFaceCreationParams(), name);
+  EXPECT_NE(serif_ja_typeface.get(), standard_ja_typeface.get());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font_cache.h b/third_party/blink/renderer/platform/fonts/font_cache.h
index eee7685..88aca9bf 100644
--- a/third_party/blink/renderer/platform/fonts/font_cache.h
+++ b/third_party/blink/renderer/platform/fonts/font_cache.h
@@ -247,9 +247,13 @@
   static void AcceptLanguagesChanged(const String&);
 
 #if defined(OS_ANDROID)
-  static AtomicString GetGenericFamilyNameForScript(
-      const AtomicString& family_name,
-      const FontDescription&);
+  // Locale-specific families can use different |SkTypeface| for a family name
+  // if locale is different.
+  static const char* GetLocaleSpecificFamilyName(
+      const AtomicString& family_name);
+  sk_sp<SkTypeface> CreateLocaleSpecificTypeface(
+      const FontDescription& font_description,
+      const char* locale_family_name);
 #endif  // defined(OS_ANDROID)
 
 #if defined(OS_LINUX) || defined(OS_CHROMEOS)
@@ -405,6 +409,7 @@
 
   friend class SimpleFontData;  // For fontDataFromFontPlatformData
   friend class FontFallbackList;
+  FRIEND_TEST_ALL_PREFIXES(FontCacheAndroid, LocaleSpecificTypeface);
 };
 
 class PLATFORM_EXPORT FontCachePurgePreventer {
diff --git a/third_party/blink/renderer/platform/fonts/font_description.cc b/third_party/blink/renderer/platform/fonts/font_description.cc
index 781b8c1..a45ca41d 100644
--- a/third_party/blink/renderer/platform/fonts/font_description.cc
+++ b/third_party/blink/renderer/platform/fonts/font_description.cc
@@ -38,7 +38,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h"
 
-#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_ANDROID)
 #include "third_party/blink/renderer/platform/fonts/font_cache.h"
 #endif
 
@@ -266,6 +266,12 @@
                          options | font_selection_request_.GetHash() << 9,
                          device_scale_factor_for_key, variation_settings_,
                          is_unique_match);
+#if defined(OS_ANDROID)
+  if (const LayoutLocale* locale = Locale()) {
+    if (FontCache::GetLocaleSpecificFamilyName(creation_params.Family()))
+      cache_key.SetLocale(locale->LocaleForSkFontMgr());
+  }
+#endif  // defined(OS_ANDROID)
   return cache_key;
 }
 
diff --git a/third_party/blink/renderer/platform/fonts/font_selector.cc b/third_party/blink/renderer/platform/fonts/font_selector.cc
index ea54e9d..6515c04b 100644
--- a/third_party/blink/renderer/platform/fonts/font_selector.cc
+++ b/third_party/blink/renderer/platform/fonts/font_selector.cc
@@ -18,15 +18,10 @@
     const FontDescription& font_description,
     const AtomicString& generic_family_name) {
 #if defined(OS_ANDROID)
-  if (font_description.GenericFamily() == FontDescription::kStandardFamily) {
-    return FontCache::GetGenericFamilyNameForScript(
-        font_family_names::kWebkitStandard, font_description);
-  }
-
-  if (generic_family_name.StartsWith("-webkit-")) {
-    return FontCache::GetGenericFamilyNameForScript(generic_family_name,
-                                                    font_description);
-  }
+  // Android does not have the locale-specific font-family setting. Instead, the
+  // system may use different typefaces depending on the locale. Looking up such
+  // locale-specific family name is rather expensive that we rely on |FontCache|
+  // to handle them.
 #else
   UScriptCode script = font_description.GetScript();
   if (font_description.GenericFamily() == FontDescription::kStandardFamily)
@@ -45,7 +40,7 @@
     return settings.Pictograph(script);
   if (generic_family_name == font_family_names::kWebkitStandard)
     return settings.Standard(script);
-#endif
+#endif  // !defined(OS_ANDROID)
   return g_empty_atom;
 }
 
diff --git a/third_party/blink/renderer/platform/fonts/shaping/case_mapping_harfbuzz_buffer_filler.cc b/third_party/blink/renderer/platform/fonts/shaping/case_mapping_harfbuzz_buffer_filler.cc
index 86d0e71d..f7b67e6 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/case_mapping_harfbuzz_buffer_filler.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/case_mapping_harfbuzz_buffer_filler.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/platform/fonts/shaping/case_mapping_harfbuzz_buffer_filler.h"
 
+#include <unicode/utf16.h>
+
 #include "third_party/blink/renderer/platform/wtf/text/case_map.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc b/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
index b33be87..2c45028 100644
--- a/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
+++ b/third_party/blink/renderer/platform/fonts/skia/font_cache_skia.cc
@@ -219,6 +219,16 @@
     name = family.Utf8();
   }
 
+#if defined(OS_ANDROID)
+  // If this is a locale-specific family, try looking up locale-specific
+  // typeface first.
+  if (const char* locale_family = GetLocaleSpecificFamilyName(family)) {
+    if (sk_sp<SkTypeface> typeface =
+            CreateLocaleSpecificTypeface(font_description, locale_family))
+      return typeface;
+  }
+#endif  // defined(OS_ANDROID)
+
 #if defined(OS_WIN)
   // TODO(vmpstr): Deal with paint typeface here.
   if (sideloaded_fonts_) {
diff --git a/third_party/blink/renderer/platform/fonts/unicode_range_set.cc b/third_party/blink/renderer/platform/fonts/unicode_range_set.cc
index 5122b6a..6a35fc4 100644
--- a/third_party/blink/renderer/platform/fonts/unicode_range_set.cc
+++ b/third_party/blink/renderer/platform/fonts/unicode_range_set.cc
@@ -25,6 +25,8 @@
 
 #include "third_party/blink/renderer/platform/fonts/unicode_range_set.h"
 
+#include <unicode/utf16.h>
+
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/platform/fonts/utf16_text_iterator.h b/third_party/blink/renderer/platform/fonts/utf16_text_iterator.h
index 1a792196..1c6f037 100644
--- a/third_party/blink/renderer/platform/fonts/utf16_text_iterator.h
+++ b/third_party/blink/renderer/platform/fonts/utf16_text_iterator.h
@@ -21,6 +21,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_UTF16_TEXT_ITERATOR_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_FONTS_UTF16_TEXT_ITERATOR_H_
 
+#include <unicode/utf16.h>
+
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
diff --git a/third_party/blink/renderer/platform/text/capitalize.cc b/third_party/blink/renderer/platform/text/capitalize.cc
index a30f811e..d04d9e7 100644
--- a/third_party/blink/renderer/platform/text/capitalize.cc
+++ b/third_party/blink/renderer/platform/text/capitalize.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/platform/text/text_break_iterator.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/platform/text/character.cc b/third_party/blink/renderer/platform/text/character.cc
index 4b6da15..26015d5 100644
--- a/third_party/blink/renderer/platform/text/character.cc
+++ b/third_party/blink/renderer/platform/text/character.cc
@@ -41,7 +41,7 @@
 #include "third_party/blink/renderer/platform/text/icu_error.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
-
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/platform/text/character.h b/third_party/blink/renderer/platform/text/character.h
index 329726b..89b40cde 100644
--- a/third_party/blink/renderer/platform/text/character.h
+++ b/third_party/blink/renderer/platform/text/character.h
@@ -31,6 +31,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_TEXT_CHARACTER_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_TEXT_CHARACTER_H_
 
+#include <unicode/uchar.h>
+
 #include "base/containers/span.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/text/character_property.h"
diff --git a/third_party/blink/renderer/platform/text/layout_locale.cc b/third_party/blink/renderer/platform/text/layout_locale.cc
index 267439f..6c6faf56 100644
--- a/third_party/blink/renderer/platform/text/layout_locale.cc
+++ b/third_party/blink/renderer/platform/text/layout_locale.cc
@@ -45,14 +45,15 @@
                                  locale_as_latin1.length());
 }
 
-// SkFontMgr requires script-based locale names, like "zh-Hant" and "zh-Hans",
-// instead of "zh-CN" and "zh-TW".
+// SkFontMgr uses two/three-letter language code with an optional ISO 15924
+// four-letter script code, in POSIX style (with '-' as the separator,) such as
+// "zh-Hant" and "zh-Hans". See `fonts.xml`.
 static const char* ToSkFontMgrLocale(UScriptCode script) {
   switch (script) {
     case USCRIPT_KATAKANA_OR_HIRAGANA:
-      return "ja-JP";
+      return "ja";
     case USCRIPT_HANGUL:
-      return "ko-KR";
+      return "ko";
     case USCRIPT_SIMPLIFIED_HAN:
       return "zh-Hans";
     case USCRIPT_TRADITIONAL_HAN:
@@ -63,13 +64,22 @@
 }
 
 const char* LayoutLocale::LocaleForSkFontMgr() const {
-  if (string_for_sk_font_mgr_.empty()) {
-    const char* sk_font_mgr_locale = ToSkFontMgrLocale(script_);
-    string_for_sk_font_mgr_ =
-        sk_font_mgr_locale ? sk_font_mgr_locale : std::string();
-    if (string_for_sk_font_mgr_.empty())
-      string_for_sk_font_mgr_ = string_.Ascii();
+  if (!string_for_sk_font_mgr_.empty())
+    return string_for_sk_font_mgr_.c_str();
+
+  if (const char* sk_font_mgr_locale = ToSkFontMgrLocale(script_)) {
+    string_for_sk_font_mgr_ = sk_font_mgr_locale;
+    DCHECK(!string_for_sk_font_mgr_.empty());
+    return string_for_sk_font_mgr_.c_str();
   }
+
+  const icu::Locale locale(Ascii().c_str());
+  const char* language = locale.getLanguage();
+  string_for_sk_font_mgr_ = language && *language ? language : "und";
+  const char* script = locale.getScript();
+  if (script && *script)
+    string_for_sk_font_mgr_ = string_for_sk_font_mgr_ + "-" + script;
+  DCHECK(!string_for_sk_font_mgr_.empty());
   return string_for_sk_font_mgr_.c_str();
 }
 
diff --git a/third_party/blink/renderer/platform/text/layout_locale_test.cc b/third_party/blink/renderer/platform/text/layout_locale_test.cc
index 13b8db3..b90350a 100644
--- a/third_party/blink/renderer/platform/text/layout_locale_test.cc
+++ b/third_party/blink/renderer/platform/text/layout_locale_test.cc
@@ -36,7 +36,11 @@
   const char* sk_font_mgr = nullptr;
   absl::optional<UScriptCode> script_for_han;
 } locale_test_data[] = {
-    {"en-US", USCRIPT_LATIN, "en-US"},
+    // Country is not relevant to |SkFontMgr|.
+    {"en-US", USCRIPT_LATIN, "en"},
+
+    // Strip countries but keep scripts.
+    {"en-Latn-US", USCRIPT_LATIN, "en-Latn"},
 
     // Common lang-script.
     {"en-Latn", USCRIPT_LATIN, "en-Latn"},
@@ -48,9 +52,8 @@
     {"und-Thai", USCRIPT_THAI, "und-Thai"},
 
     // Common lang-region in East Asia.
-    {"ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-JP",
-     USCRIPT_KATAKANA_OR_HIRAGANA},
-    {"ko-KR", USCRIPT_HANGUL, "ko-KR", USCRIPT_HANGUL},
+    {"ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja", USCRIPT_KATAKANA_OR_HIRAGANA},
+    {"ko-KR", USCRIPT_HANGUL, "ko", USCRIPT_HANGUL},
     {"zh", USCRIPT_SIMPLIFIED_HAN, "zh-Hans", USCRIPT_SIMPLIFIED_HAN},
     {"zh-CN", USCRIPT_SIMPLIFIED_HAN, "zh-Hans", USCRIPT_SIMPLIFIED_HAN},
     {"zh-HK", USCRIPT_TRADITIONAL_HAN, "zh-Hant", USCRIPT_TRADITIONAL_HAN},
@@ -93,28 +96,27 @@
     // Lang has priority over region.
     // icu::Locale::getDefault() returns other combinations if, for instance,
     // English Windows with the display language set to Japanese.
-    {"ja", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA},
-    {"ja-US", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-JP",
-     USCRIPT_KATAKANA_OR_HIRAGANA},
-    {"ko", USCRIPT_HANGUL, "ko-KR", USCRIPT_HANGUL},
-    {"ko-US", USCRIPT_HANGUL, "ko-KR", USCRIPT_HANGUL},
+    {"ja", USCRIPT_KATAKANA_OR_HIRAGANA, "ja", USCRIPT_KATAKANA_OR_HIRAGANA},
+    {"ja-US", USCRIPT_KATAKANA_OR_HIRAGANA, "ja", USCRIPT_KATAKANA_OR_HIRAGANA},
+    {"ko", USCRIPT_HANGUL, "ko", USCRIPT_HANGUL},
+    {"ko-US", USCRIPT_HANGUL, "ko", USCRIPT_HANGUL},
     {"wuu-TW", USCRIPT_SIMPLIFIED_HAN, "zh-Hans", USCRIPT_SIMPLIFIED_HAN},
     {"yue-CN", USCRIPT_TRADITIONAL_HAN, "zh-Hant", USCRIPT_TRADITIONAL_HAN},
     {"zh-wuu-TW", USCRIPT_SIMPLIFIED_HAN, "zh-Hans", USCRIPT_SIMPLIFIED_HAN},
     {"zh-yue-CN", USCRIPT_TRADITIONAL_HAN, "zh-Hant", USCRIPT_TRADITIONAL_HAN},
 
     // Region should not affect script, but it can influence scriptForHan.
-    {"en-CN", USCRIPT_LATIN, "en-CN"},
-    {"en-HK", USCRIPT_LATIN, "en-HK", USCRIPT_TRADITIONAL_HAN},
-    {"en-MO", USCRIPT_LATIN, "en-MO", USCRIPT_TRADITIONAL_HAN},
-    {"en-SG", USCRIPT_LATIN, "en-SG"},
-    {"en-TW", USCRIPT_LATIN, "en-TW", USCRIPT_TRADITIONAL_HAN},
-    {"en-JP", USCRIPT_LATIN, "en-JP", USCRIPT_KATAKANA_OR_HIRAGANA},
-    {"en-KR", USCRIPT_LATIN, "en-KR", USCRIPT_HANGUL},
+    {"en-CN", USCRIPT_LATIN, "en"},
+    {"en-HK", USCRIPT_LATIN, "en", USCRIPT_TRADITIONAL_HAN},
+    {"en-MO", USCRIPT_LATIN, "en", USCRIPT_TRADITIONAL_HAN},
+    {"en-SG", USCRIPT_LATIN, "en"},
+    {"en-TW", USCRIPT_LATIN, "en", USCRIPT_TRADITIONAL_HAN},
+    {"en-JP", USCRIPT_LATIN, "en", USCRIPT_KATAKANA_OR_HIRAGANA},
+    {"en-KR", USCRIPT_LATIN, "en", USCRIPT_HANGUL},
 
     // Multiple regions are invalid, but it can still give hints for the font
     // selection.
-    {"en-US-JP", USCRIPT_LATIN, "en-US-JP", USCRIPT_KATAKANA_OR_HIRAGANA},
+    {"en-US-JP", USCRIPT_LATIN, "en", USCRIPT_KATAKANA_OR_HIRAGANA},
 };
 
 std::ostream& operator<<(std::ostream& os, const LocaleTestData& test) {
@@ -190,26 +192,26 @@
       {",en-US", USCRIPT_COMMON, nullptr},
 
       // Single value cases.
-      {"ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-jp"},
-      {"ko-KR", USCRIPT_HANGUL, "ko-kr"},
+      {"ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja"},
+      {"ko-KR", USCRIPT_HANGUL, "ko"},
       {"zh-CN", USCRIPT_SIMPLIFIED_HAN, "zh-Hans"},
       {"zh-HK", USCRIPT_TRADITIONAL_HAN, "zh-Hant"},
       {"zh-TW", USCRIPT_TRADITIONAL_HAN, "zh-Hant"},
 
       // Language only.
-      {"ja", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-jp"},
-      {"ko", USCRIPT_HANGUL, "ko-kr"},
+      {"ja", USCRIPT_KATAKANA_OR_HIRAGANA, "ja"},
+      {"ko", USCRIPT_HANGUL, "ko"},
       {"zh", USCRIPT_SIMPLIFIED_HAN, "zh-Hans"},
 
       // Unusual combinations.
-      {"en-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-jp"},
+      {"en-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja"},
 
       // Han scripts not in the first item.
-      {"en-US,ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-jp"},
-      {"en-US,en-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-jp"},
+      {"en-US,ja-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja"},
+      {"en-US,en-JP", USCRIPT_KATAKANA_OR_HIRAGANA, "ja"},
 
       // Multiple Han scripts. The first one wins.
-      {"ja-JP,zh-CN", USCRIPT_KATAKANA_OR_HIRAGANA, "ja-jp"},
+      {"ja-JP,zh-CN", USCRIPT_KATAKANA_OR_HIRAGANA, "ja"},
       {"zh-TW,ja-JP", USCRIPT_TRADITIONAL_HAN, "zh-Hant"},
   };
 
@@ -224,7 +226,7 @@
 
     ASSERT_NE(nullptr, locale) << test.accept_languages;
     EXPECT_EQ(test.script, locale->GetScriptForHan()) << test.accept_languages;
-    EXPECT_STRCASEEQ(test.locale, locale->LocaleForHanForSkFontMgr())
+    EXPECT_STREQ(test.locale, locale->LocaleForHanForSkFontMgr())
         << test.accept_languages;
   }
 }
diff --git a/third_party/blink/renderer/platform/text/locale_win.cc b/third_party/blink/renderer/platform/text/locale_win.cc
index 585e35d..bcbd29c 100644
--- a/third_party/blink/renderer/platform/text/locale_win.cc
+++ b/third_party/blink/renderer/platform/text/locale_win.cc
@@ -45,6 +45,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 #include "ui/base/ui_base_features.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/platform/text/segmented_string.h b/third_party/blink/renderer/platform/text/segmented_string.h
index 7d3ada9..de4c943 100644
--- a/third_party/blink/renderer/platform/text/segmented_string.h
+++ b/third_party/blink/renderer/platform/text/segmented_string.h
@@ -25,6 +25,7 @@
 #include "third_party/blink/renderer/platform/wtf/deque.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_position.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/platform/text/text_boundaries.cc b/third_party/blink/renderer/platform/text/text_boundaries.cc
index 7b4af3f..2b4cc95 100644
--- a/third_party/blink/renderer/platform/text/text_boundaries.cc
+++ b/third_party/blink/renderer/platform/text/text_boundaries.cc
@@ -28,7 +28,7 @@
 
 #include "third_party/blink/renderer/platform/text/text_break_iterator.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
-#include "third_party/blink/renderer/platform/wtf/text/string_impl.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/platform/text/text_break_iterator.cc b/third_party/blink/renderer/platform/text/text_break_iterator.cc
index 9fcb685..cd1074d33 100644
--- a/third_party/blink/renderer/platform/text/text_break_iterator.cc
+++ b/third_party/blink/renderer/platform/text/text_break_iterator.cc
@@ -23,13 +23,14 @@
 
 #include "third_party/blink/renderer/platform/text/text_break_iterator.h"
 
+#include <unicode/uchar.h>
+#include <unicode/uvernum.h>
+
 #include "base/cxx17_backports.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
-
-#include <unicode/uchar.h>
-#include <unicode/uvernum.h>
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/platform/wtf/text/case_map.cc b/third_party/blink/renderer/platform/wtf/text/case_map.cc
index 3b0bcf0..33e40db1 100644
--- a/third_party/blink/renderer/platform/wtf/text/case_map.cc
+++ b/third_party/blink/renderer/platform/wtf/text/case_map.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_impl.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_offset_map.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace WTF {
diff --git a/third_party/blink/renderer/platform/wtf/text/string_builder.h b/third_party/blink/renderer/platform/wtf/text/string_builder.h
index d13c8a4..115fafe4 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_builder.h
+++ b/third_party/blink/renderer/platform/wtf/text/string_builder.h
@@ -27,6 +27,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_STRING_BUILDER_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_STRING_BUILDER_H_
 
+#include <unicode/utf16.h>
+
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 #include "third_party/blink/renderer/platform/wtf/text/integer_to_string_conversion.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_view.h"
diff --git a/third_party/blink/renderer/platform/wtf/text/string_impl.h b/third_party/blink/renderer/platform/wtf/text/string_impl.h
index 253b650..1d07a8c 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_impl.h
+++ b/third_party/blink/renderer/platform/wtf/text/string_impl.h
@@ -41,7 +41,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/ascii_fast_path.h"
 #include "third_party/blink/renderer/platform/wtf/text/number_parsing_options.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h"
-#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_export.h"
 
@@ -882,14 +882,6 @@
   return CodeUnitCompare16(string1, string2);
 }
 
-static inline bool IsSpaceOrNewline(UChar c) {
-  // Use IsASCIISpace() for basic Latin-1.
-  // This will include newlines, which aren't included in Unicode DirWS.
-  return c <= 0x7F
-             ? WTF::IsASCIISpace(c)
-             : WTF::unicode::Direction(c) == WTF::unicode::kWhiteSpaceNeutral;
-}
-
 inline scoped_refptr<StringImpl> StringImpl::IsolatedCopy() const {
   if (Is8Bit())
     return Create(Characters8(), length_);
diff --git a/third_party/blink/renderer/platform/wtf/text/string_impl_test.cc b/third_party/blink/renderer/platform/wtf/text/string_impl_test.cc
index 8251b11..29520c5 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_impl_test.cc
+++ b/third_party/blink/renderer/platform/wtf/text/string_impl_test.cc
@@ -27,6 +27,7 @@
 
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/platform/wtf/text/case_map.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace WTF {
diff --git a/third_party/blink/renderer/platform/wtf/text/string_to_number.cc b/third_party/blink/renderer/platform/wtf/text/string_to_number.cc
index d915df41..7278684 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_to_number.cc
+++ b/third_party/blink/renderer/platform/wtf/text/string_to_number.cc
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/platform/wtf/dtoa.h"
 #include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_impl.h"
+#include "third_party/blink/renderer/platform/wtf/text/unicode.h"
 
 namespace WTF {
 
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc
index b8efc66..341e05f 100644
--- a/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc
+++ b/third_party/blink/renderer/platform/wtf/text/text_codec_latin1.cc
@@ -25,7 +25,9 @@
 
 #include "third_party/blink/renderer/platform/wtf/text/text_codec_latin1.h"
 
+#include <unicode/utf16.h>
 #include <memory>
+
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_codec_ascii_fast_path.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_utf16.cc b/third_party/blink/renderer/platform/wtf/text/text_codec_utf16.cc
index 0687d22..d628b1b 100644
--- a/third_party/blink/renderer/platform/wtf/text/text_codec_utf16.cc
+++ b/third_party/blink/renderer/platform/wtf/text/text_codec_utf16.cc
@@ -25,7 +25,9 @@
 
 #include "third_party/blink/renderer/platform/wtf/text/text_codec_utf16.h"
 
+#include <unicode/utf16.h>
 #include <memory>
+
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
diff --git a/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.h b/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.h
index 65806a9..8e8ac62 100644
--- a/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.h
+++ b/third_party/blink/renderer/platform/wtf/text/text_codec_utf8.h
@@ -26,7 +26,9 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_CODEC_UTF8_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_TEXT_CODEC_UTF8_H_
 
+#include <unicode/utf8.h>
 #include <memory>
+
 #include "third_party/blink/renderer/platform/wtf/text/text_codec.h"
 
 namespace WTF {
diff --git a/third_party/blink/renderer/platform/wtf/text/unicode.h b/third_party/blink/renderer/platform/wtf/text/unicode.h
index cdd0d2e9..d48f66d 100644
--- a/third_party/blink/renderer/platform/wtf/text/unicode.h
+++ b/third_party/blink/renderer/platform/wtf/text/unicode.h
@@ -25,6 +25,7 @@
 
 #include <unicode/uchar.h>
 
+#include "third_party/blink/renderer/platform/wtf/text/ascii_ctype.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h"
 
 namespace WTF {
@@ -167,7 +168,17 @@
       u_getIntPropertyValue(c, UCHAR_DECOMPOSITION_TYPE));
 }
 
+inline bool IsSpaceOrNewline(UChar c) {
+  // Use IsASCIISpace() for basic Latin-1.
+  // This will include newlines, which aren't included in Unicode DirWS.
+  return c <= 0x7F
+             ? WTF::IsASCIISpace(c)
+             : WTF::unicode::Direction(c) == WTF::unicode::kWhiteSpaceNeutral;
+}
+
 }  // namespace unicode
 }  // namespace WTF
 
+using WTF::unicode::IsSpaceOrNewline;
+
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_UNICODE_H_
diff --git a/third_party/blink/renderer/platform/wtf/text/wtf_string.h b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
index 8cc247e..a71ac69 100644
--- a/third_party/blink/renderer/platform/wtf/text/wtf_string.h
+++ b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
@@ -715,7 +715,6 @@
 using WTF::g_empty_string16_bit;
 using WTF::Equal;
 using WTF::Find;
-using WTF::IsSpaceOrNewline;
 
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_TEXT_WTF_STRING_H_
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 eb66330..febaa40 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
@@ -149160,6 +149160,32 @@
       ]
      },
      "text-indent": {
+      "anonymous-flex-item-001.html": [
+       "0b305fc307be36e5a5d61c4ae686c40b76b8f359",
+       [
+        null,
+        [
+         [
+          "/css/css-text/text-indent/reference/anonymous-flex-grid-item-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "anonymous-grid-item-001.html": [
+       "268365807200a5d7533bdf4b9d0157c4ac793c60",
+       [
+        null,
+        [
+         [
+          "/css/css-text/text-indent/reference/anonymous-flex-grid-item-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "text-indent-percentage-001.xht": [
        "6da26308b266e6d1574d78238f9d12cf5a404b25",
        [
@@ -168008,7 +168034,7 @@
       ]
      ],
      "accent-color-visited.tentative.html": [
-      "5aee0f125f7a1a6fffacda9790d7b72b02ab71ac",
+      "8a2b8f39061b3a63334c73f119a24d62671acc0b",
       [
        null,
        [
@@ -246208,6 +246234,10 @@
      },
      "text-indent": {
       "reference": {
+       "anonymous-flex-grid-item-001-ref.html": [
+        "517f9e65fde0f2951fb8175b77a13eaf3514a62d",
+        []
+       ],
        "text-indent-percentage-001-ref.xht": [
         "5b065d1db7ac1e399668e8588727be09922bf62b",
         []
@@ -249901,7 +249931,7 @@
       []
      ],
      "accent-color-visited-ref.html": [
-      "3954a3193ea3644eb666c37af619de303a5a4d27",
+      "e9c3cfad7c0f12181f73d52ad6b56ea7da9d9b9d",
       []
      ],
      "appearance-auto-input-non-widget-001-ref.html": [
@@ -284139,7 +284169,7 @@
     ],
     "pointerlock": {
      "pointerevent_pointerlock_supercedes_capture.html.ini": [
-      "51217132075a40ddc4b91f83e1a4bedf7cf3b866",
+      "01dc3b936568f0de205de2cd8b1f43819ad7ff61",
       []
      ],
      "resources": {
@@ -465873,7 +465903,7 @@
       ]
      ],
      "declarative-shadow-dom-basic.tentative.html": [
-      "0b993766c35683f58cc1892b88a09ae3cc659e67",
+      "d0ed328eeb75c6f8b6177650595c919a64e8dd4d",
       [
        null,
        {}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/anonymous-flex-item-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/anonymous-flex-item-001.html
new file mode 100644
index 0000000..0b305fc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/anonymous-flex-item-001.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>text-indent in anonymous flex and grid items</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="match" href="reference/anonymous-flex-grid-item-001-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property" title="Anonymous flex/grid items aren't anonymous block boxes.">
+<link rel="help" href="https://crbug.com/1159311">
+<meta name="flags" content="ahem">
+<meta name="assert" content="text-indent applies to the first line of an anonymous flex item that is not the first item in the flex/grid container.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+main {
+  font: 10px/1 Ahem;
+  color: orange;
+}
+</style>
+
+<p>
+Pass conditions:
+<ul>
+  <li>The top left quadrant of the black-bordered rectangle is white.
+  <li>Only the top left quadrant of the black-bordered rectangle is white.
+  <li>The rest of the black-bordered rectangle is orange.
+  <li>No orange is outside the black-bordered rectangle.
+</ul>
+</p>
+
+<main>
+<div style="text-indent: 50px; border: 3px solid black; width: 100px; display: flex;">
+  <div style="width: 0px;"></div>
+  ABCDE
+  ABCDEABCDE
+</div>
+</main>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/anonymous-grid-item-001.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/anonymous-grid-item-001.html
new file mode 100644
index 0000000..2683658
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/anonymous-grid-item-001.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>text-indent in anonymous flex and grid items</title>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="match" href="reference/anonymous-flex-grid-item-001-ref.html">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#text-indent-property" title="Anonymous flex/grid items aren't anonymous block boxes.">
+<link rel="help" href="https://crbug.com/1159311">
+<meta name="flags" content="ahem">
+<meta name="assert" content="text-indent applies to the first line of an anonymous grid item that is not the first item in the flex/grid container.">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+main {
+  font: 10px/1 Ahem;
+  color: orange;
+}
+</style>
+
+<p>
+Pass conditions:
+<ul>
+  <li>The top left quadrant of the black-bordered rectangle is white.
+  <li>Only the top left quadrant of the black-bordered rectangle is white.
+  <li>The rest of the black-bordered rectangle is orange.
+  <li>No orange is outside the black-bordered rectangle.
+</ul>
+</p>
+
+<main>
+<div style="text-indent: 50px; border: 3px solid black; width: 100px; display: grid; grid-template-columns: auto auto;">
+  <div style="width: 0px;"></div>
+  ABCDE
+  ABCDEABCDE
+</div>
+</main>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/reference/anonymous-flex-grid-item-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/reference/anonymous-flex-grid-item-001-ref.html
new file mode 100644
index 0000000..517f9e65
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-indent/reference/anonymous-flex-grid-item-001-ref.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>text-indent in anonymous flex and grid items</title>
+<meta name="flags" content="ahem">
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+main {
+  font: 10px/1 Ahem;
+  color: orange;
+}
+</style>
+
+<p>
+Pass conditions:
+<ul>
+  <li>The top left quadrant of the black-bordered rectangle is white.
+  <li>Only the top left quadrant of the black-bordered rectangle is white.
+  <li>The rest of the black-bordered rectangle is orange.
+  <li>No orange is outside the black-bordered rectangle.
+</ul>
+</p>
+
+<main>
+<div style="text-indent: 50px; border: 3px solid black; width: 100px;">
+  ABCDE ABCDEABCDE
+</div>
+</main>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited-ref.html b/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited-ref.html
index 3954a319..e9c3cfa 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited-ref.html
@@ -1,4 +1,4 @@
 <!DOCTYPE html>
 <a href="">
-  <input type=checkbox>
+  <input type=checkbox checked>
 </a>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited.tentative.html
index 5aee0f1..8a2b8f39 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ui/accent-color-visited.tentative.html
@@ -11,5 +11,5 @@
 }
 </style>
 <a href="">
-  <input type=checkbox>
+  <input type=checkbox checked>
 </a>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html.ini b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html.ini
index 5121713..01dc3b9 100644
--- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html.ini
+++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerlock/pointerevent_pointerlock_supercedes_capture.html.ini
@@ -2,4 +2,4 @@
   expected: OK
 
   [mouse no pointercapture while pointerlock]
-    expected: PASS
+    expected: FAIL
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index b4719e7..93c50304 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -1444,7 +1444,6 @@
               'test_data/chrome/browser/resources/chromeos/accessibility/'
               'select_to_speak/',
           )) or (is_mac and f in (  # https://crbug.com/1000667
-              'AlertNotificationService.xpc/',
               'Chromium Framework.framework/',
               'Chromium Helper.app/',
               'Chromium.app/',
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index a4b7c8b..a610081 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -1750,17 +1750,17 @@
     ],
 
     'chromeos_amd64-generic_lacros_official': [
-      'chromeos_amd64-generic', 'amd64-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
+      'chromeos_amd64-generic-crostoolchain', 'amd64-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
     ],
 
     # This is the same as 'chromeos_amd64-generic_lacros_official', except for
     # the 'is_skylab' arg. Please keep them in sync.
     'chromeos_amd64-generic_lacros_official_skylab': [
-      'chromeos_amd64-generic', 'amd64-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
+      'chromeos_amd64-generic-crostoolchain', 'amd64-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
     ],
 
     'chromeos_amd64-generic_lacros_rel': [
-      'chromeos_amd64-generic', 'amd64-lacros',
+      'chromeos_amd64-generic-crostoolchain', 'amd64-lacros', 'release',
     ],
 
     'chromeos_amd64-generic_lacros_rel_reclient': [
@@ -1768,7 +1768,7 @@
     ],
 
     'chromeos_amd64-generic_lacros_dbg': [
-      'chromeos_amd64-generic', 'amd64-lacros', 'debug',
+      'chromeos_amd64-generic-crostoolchain', 'amd64-lacros', 'debug',
     ],
 
     'chromeos_amd64-generic_dbg': [
@@ -1804,15 +1804,15 @@
     ],
 
     'chromeos_arm-generic_lacros_official': [
-      'chromeos_arm-generic', 'arm-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
+      'chromeos_arm-generic-crostoolchain', 'arm-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto',
     ],
 
     'chromeos_arm-generic_lacros_official_skylab': [
-      'chromeos_arm-generic', 'arm-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
+      'chromeos_arm-generic-crostoolchain', 'arm-lacros', 'official', 'minimal_symbols', 'cfi', 'thin_lto', 'is_skylab',
     ],
 
     'chromeos_arm-generic_lacros_rel': [
-      'chromeos_arm-generic', 'arm-lacros',
+      'chromeos_arm-generic-crostoolchain', 'arm-lacros', 'release',
     ],
 
     'chromeos_asan_lsan_fuzzer_v8_heap_release_bot': [
@@ -2860,12 +2860,16 @@
       'args_file': '//build/args/chromeos/amd64-generic.gni',
     },
 
+    'amd64-generic-crostoolchain': {
+      'args_file': '//build/args/chromeos/amd64-generic-crostoolchain.gni',
+    },
+
     'amd64-lacros': {
-      'gn_args': 'use_ozone=true ozone_platform="wayland" ozone_platform_wayland=true ozone_platform_gbm=false ozone_platform_drm=false ozone_platform_x11=false target_os="chromeos" use_evdev_gestures=false use_vaapi=false use_gtk=false use_glib=false enable_linux_installer=false rtc_use_pipewire=false use_gio=false use_v8_context_snapshot=false use_custom_libcxx=false use_pulseaudio=false use_pangocairo=false chromeos_is_browser_only=true cros_host_sysroot="//build/linux/debian_sid_amd64-sysroot" cros_v8_snapshot_sysroot="//build/linux/debian_sid_amd64-sysroot" use_custom_libcxx_for_host=true'
+      'gn_args': 'target_os="chromeos" chromeos_is_browser_only=true cros_host_sysroot="//build/linux/debian_sid_amd64-sysroot" cros_v8_snapshot_sysroot="//build/linux/debian_sid_amd64-sysroot"'
     },
 
     'arm-lacros': {
-      'gn_args': 'use_ozone=true ozone_platform="wayland" ozone_platform_wayland=true ozone_platform_gbm=false ozone_platform_drm=false ozone_platform_x11=false target_os="chromeos" use_evdev_gestures=false use_vaapi=false use_gtk=false use_glib=false enable_linux_installer=false rtc_use_pipewire=false use_gio=false use_v8_context_snapshot=false use_custom_libcxx=false use_pulseaudio=false use_pangocairo=false chromeos_is_browser_only=true cros_host_sysroot="//build/linux/debian_sid_amd64-sysroot" cros_v8_snapshot_sysroot="//build/linux/debian_sid_i386-sysroot" use_custom_libcxx_for_host=true'
+      'gn_args': 'target_os="chromeos" chromeos_is_browser_only=true cros_host_sysroot="//build/linux/debian_sid_amd64-sysroot" cros_v8_snapshot_sysroot="//build/linux/debian_sid_i386-sysroot"'
     },
 
     # We build Android with codecs on most bots to ensure maximum test
@@ -2928,6 +2932,10 @@
       'args_file': '//build/args/chromeos/arm-generic.gni',
     },
 
+    'arm-generic-crostoolchain': {
+      'args_file': '//build/args/chromeos/arm-generic-crostoolchain.gni',
+    },
+
     'arm64': {
       'gn_args': 'target_cpu="arm64"',
     },
@@ -3020,8 +3028,12 @@
       'mixins': ['chromeos_device', 'amd64-generic',]
     },
 
-    'chromeos_arm-generic': {
-      'mixins': ['chromeos_device', 'arm-generic',]
+    'chromeos_amd64-generic-crostoolchain': {
+      'mixins': ['chromeos_device', 'amd64-generic-crostoolchain',]
+    },
+
+    'chromeos_arm-generic-crostoolchain': {
+      'mixins': ['chromeos_device', 'arm-generic-crostoolchain',]
     },
 
     'chromeos_kevin': {
diff --git a/tools/mb/mb_config_expectations/chrome.json b/tools/mb/mb_config_expectations/chrome.json
index 3a35982..868d25b2 100644
--- a/tools/mb/mb_config_expectations/chrome.json
+++ b/tools/mb/mb_config_expectations/chrome.json
@@ -96,73 +96,37 @@
     }
   },
   "lacros-amd64-generic-chrome": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "lacros-arm-generic-chrome": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_i386-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "linux-chrome": {
diff --git a/tools/mb/mb_config_expectations/chromium.chromiumos.json b/tools/mb/mb_config_expectations/chromium.chromiumos.json
index b55213b..d4314e9 100644
--- a/tools/mb/mb_config_expectations/chromium.chromiumos.json
+++ b/tools/mb/mb_config_expectations/chromium.chromiumos.json
@@ -39,34 +39,16 @@
     }
   },
   "chromeos-amd64-generic-lacros-dbg": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
       "is_debug": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "chromeos-amd64-generic-rel": {
@@ -104,93 +86,42 @@
     }
   },
   "lacros-amd64-generic-binary-size-rel": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "lacros-amd64-generic-rel": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "lacros-arm-generic-rel": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_i386-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "linux-ash-chromium-generator-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index fc3f359..e9e3274 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -742,33 +742,16 @@
     }
   },
   "lacros-amd64-generic-rel (goma cache silo)": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "lacros-amd64-generic-rel (reclient)": {
@@ -777,58 +760,23 @@
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_rbe": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_rbe": true
     }
   },
   "lacros-amd64-generic-rel-fyi": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "linux-annotator-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.perf.json b/tools/mb/mb_config_expectations/chromium.perf.json
index 2168cdb..066dc5f 100644
--- a/tools/mb/mb_config_expectations/chromium.perf.json
+++ b/tools/mb/mb_config_expectations/chromium.perf.json
@@ -67,38 +67,20 @@
     }
   },
   "chromeos-amd64-generic-lacros-builder-perf": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "linux-builder-perf": {
diff --git a/tools/mb/mb_config_expectations/internal.chrome.fyi.json b/tools/mb/mb_config_expectations/internal.chrome.fyi.json
index daeb760..94ea0863 100644
--- a/tools/mb/mb_config_expectations/internal.chrome.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chrome.fyi.json
@@ -1,32 +1,15 @@
 {
   "chromeos-amd64-generic-lacros-internal-rel": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "linux-autofill-captured-sites-rel": {
diff --git a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
index a3522f2..9d78242 100644
--- a/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
+++ b/tools/mb/mb_config_expectations/internal.chromeos.fyi.json
@@ -36,75 +36,39 @@
     }
   },
   "lacros-amd64-generic-chrome-fyi": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
       "is_skylab": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "lacros-arm-generic-chrome-fyi": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_i386-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
       "is_skylab": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/official.chrome.continuous.json b/tools/mb/mb_config_expectations/official.chrome.continuous.json
index d8669049..8d8aeb2f 100644
--- a/tools/mb/mb_config_expectations/official.chrome.continuous.json
+++ b/tools/mb/mb_config_expectations/official.chrome.continuous.json
@@ -1,37 +1,19 @@
 {
   "chromeos-amd64-generic-lacros-internal": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/official.chrome.json b/tools/mb/mb_config_expectations/official.chrome.json
index d00609b..8755524 100644
--- a/tools/mb/mb_config_expectations/official.chrome.json
+++ b/tools/mb/mb_config_expectations/official.chrome.json
@@ -18,38 +18,20 @@
     }
   },
   "lacros64": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/tryserver.chrome.json b/tools/mb/mb_config_expectations/tryserver.chrome.json
index 804ade3..5e1a77c 100644
--- a/tools/mb/mb_config_expectations/tryserver.chrome.json
+++ b/tools/mb/mb_config_expectations/tryserver.chrome.json
@@ -120,73 +120,37 @@
     }
   },
   "lacros-amd64-generic-chrome": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "lacros-arm-generic-chrome": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_i386-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "linux-chrome": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
index 88a7ea8..fe7ab50 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.chromiumos.json
@@ -112,63 +112,29 @@
     }
   },
   "lacros-amd64-generic-rel": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "lacros-arm-generic-rel": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/arm-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_i386-sysroot",
-      "enable_linux_installer": false,
       "is_chromeos_device": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
+      "is_debug": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
-      "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_goma": true
     }
   },
   "linux-cfm-rel": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.perf.json b/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
index f02245c..2d047c8 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.perf.json
@@ -29,38 +29,20 @@
     }
   },
   "Chromeos Amd64 Generic Lacros Builder Perf": {
-    "args_file": "//build/args/chromeos/amd64-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-crostoolchain.gni",
     "gn_args": {
       "chromeos_is_browser_only": true,
       "cros_host_sysroot": "//build/linux/debian_sid_amd64-sysroot",
       "cros_v8_snapshot_sysroot": "//build/linux/debian_sid_amd64-sysroot",
-      "enable_linux_installer": false,
       "is_cfi": true,
       "is_chrome_branded": true,
       "is_chromeos_device": true,
       "is_official_build": true,
-      "ozone_platform": "wayland",
-      "ozone_platform_drm": false,
-      "ozone_platform_gbm": false,
       "ozone_platform_headless": true,
-      "ozone_platform_wayland": true,
-      "ozone_platform_x11": false,
-      "rtc_use_pipewire": false,
       "symbol_level": 1,
       "target_os": "chromeos",
-      "use_custom_libcxx": false,
-      "use_custom_libcxx_for_host": true,
-      "use_evdev_gestures": false,
-      "use_gio": false,
-      "use_glib": false,
       "use_goma": true,
-      "use_gtk": false,
-      "use_ozone": true,
-      "use_pangocairo": false,
-      "use_pulseaudio": false,
-      "use_thin_lto": true,
-      "use_v8_context_snapshot": false,
-      "use_vaapi": false
+      "use_thin_lto": true
     }
   },
   "Fuchsia Builder Perf": {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9f9f9cb..0bb57be 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -46747,6 +46747,8 @@
   <int value="-1703308540" label="disable-webaudio"/>
   <int value="-1701123067" label="ShowManagedUi:enabled"/>
   <int value="-1700764114" label="HelpAppBackgroundPage:enabled"/>
+  <int value="-1699700244"
+      label="VirtualKeyboardMultipasteSuggestion:disabled"/>
   <int value="-1698438797" label="TabGroupsCollapseFreezing:enabled"/>
   <int value="-1696778023"
       label="HappinessTrackingSurveysForDesktopSettings:disabled"/>
@@ -50664,6 +50666,7 @@
   <int value="1491212579" label="ChromeTipsInMainMenuNewBadge:enabled"/>
   <int value="1492255992" label="OnDeviceGrammarCheck:enabled"/>
   <int value="1492541927" label="QuickAnswersTranslationCloudAPI:enabled"/>
+  <int value="1495059835" label="VirtualKeyboardMultipasteSuggestion:enabled"/>
   <int value="1495341532" label="disable-mtp-write-support"/>
   <int value="1495748045" label="SignedHTTPExchange:enabled"/>
   <int value="1496135626" label="UploadCrashReportsUsingJobScheduler:enabled"/>
diff --git a/tools/metrics/histograms/histograms_xml/cras/histograms.xml b/tools/metrics/histograms/histograms_xml/cras/histograms.xml
index b421df2d..87a3a3f 100644
--- a/tools/metrics/histograms/histograms_xml/cras/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/cras/histograms.xml
@@ -920,6 +920,61 @@
   </summary>
 </histogram>
 
+<histogram name="Cras.WebRTC.Audio.ApmCaptureInputLevelAverageRms"
+    units="dBFS (negated)" expires_after="2021-12-31">
+  <owner>hychao@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>
+    This histogram reports the peak RMS of the signal in the output of WebRTC's
+    Audio Processing Module run in CRAS, after all WebRTC audio processing. A
+    new value is reported every 10 seconds, and the peak is the RMS of the
+    strongest 10 ms block over the latest interval. The metric is negated dBFS,
+    meaning that 0 is a full-scale signal, while 127 corresponds to -127 dBFS
+    (very faint).
+  </summary>
+</histogram>
+
+<histogram name="Cras.WebRTC.Audio.ApmCaptureInputLevelPeakRms"
+    units="dBFS (negated)" expires_after="2021-12-31">
+  <owner>hychao@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>
+    This histogram reports the peak RMS of the signal coming in to WebRTC's
+    Audio Processing Module run in CRAS, prior to any WebRTC processing. A new
+    value is reported every 10 seconds, and the peak is the RMS of the strongest
+    10 ms block over the latest interval. The metric is negated dBFS, meaning
+    that 0 is a full-scale signal, while 127 corresponds to -127 dBFS (very
+    faint).
+  </summary>
+</histogram>
+
+<histogram name="Cras.WebRTC.Audio.ApmCaptureOutputLevelAverageRms"
+    units="dBFS (negated)" expires_after="2021-12-31">
+  <owner>hychao@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>
+    This histogram reports the average RMS of the signal in the output of
+    WebRTC's Audio Processing Module run in CRAS, after all audio WebRTC
+    processing. A new value is reported every 10 seconds, and the average is
+    over the latest interval. The metric is negated dBFS, meaning that 0 is a
+    full-scale signal, while 127 corresponds to -127 dBFS (very faint).
+  </summary>
+</histogram>
+
+<histogram name="Cras.WebRTC.Audio.ApmCaptureOutputLevelPeakRms"
+    units="dBFS (negated)" expires_after="2021-12-31">
+  <owner>hychao@chromium.org</owner>
+  <owner>chromeos-audio@google.com</owner>
+  <summary>
+    This histogram reports the peak RMS of the signal in the output of WebRTC's
+    Audio Processing Module run in CRAS, after all WebRTC audio processing. A
+    new value is reported every 10 seconds, and the peak is the RMS of the
+    strongest 10 ms block over the latest interval. The metric is negated dBFS,
+    meaning that 0 is a full-scale signal, while 127 corresponds to -127 dBFS
+    (very faint).
+  </summary>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/histograms_xml/cryptohome/histograms.xml b/tools/metrics/histograms/histograms_xml/cryptohome/histograms.xml
index aeaf8fb..b2c6985 100644
--- a/tools/metrics/histograms/histograms_xml/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/histograms_xml/cryptohome/histograms.xml
@@ -195,8 +195,8 @@
 
 <histogram name="Cryptohome.DiskCleanupProgress"
     enum="CryptohomeDiskCleanupProgress" expires_after="2021-12-26">
-  <owner>slangley@chromium.org</owner>
-  <owner>weifangsun@chromium.org</owner>
+  <owner>dlunev@chromium.org</owner>
+  <owner>sarthakkukreti@chromium.org</owner>
   <summary>
     In low disk space scenarios, Cryptohome erases caches while target amount of
     free disk space is not reached. It starts from low priority categories. This
@@ -208,7 +208,7 @@
 <histogram name="Cryptohome.DiskCleanupResult"
     enum="CryptohomeDiskCleanupResult" expires_after="2021-11-21">
   <owner>vsavu@google.com</owner>
-  <owner>weifangsun@chromium.org</owner>
+  <owner>dlunev@chromium.org</owner>
   <summary>Records the result of triggering disk cleanup.</summary>
 </histogram>
 
@@ -235,9 +235,9 @@
 </histogram>
 
 <histogram name="Cryptohome.FreeDiskSpaceTotalFreedInMb" units="MiB"
-    expires_after="2021-08-22">
+    expires_after="2022-07-13">
   <owner>vsavu@chromium.org</owner>
-  <owner>weifangsun@chromium.org</owner>
+  <owner>dlunev@chromium.org</owner>
   <summary>
     In low disk space scenarios, Cryptohome performs a lot of disk space
     operations to erase data. This is the amount of space that was released by
@@ -246,9 +246,9 @@
 </histogram>
 
 <histogram name="Cryptohome.FreeDiskSpaceTotalTime2" units="ms"
-    expires_after="2021-08-22">
-  <owner>slangley@chromium.org</owner>
-  <owner>weifangsun@chromium.org</owner>
+    expires_after="2022-07-13">
+  <owner>dlunev@chromium.org</owner>
+  <owner>sarthakkukreti@chromium.org</owner>
   <summary>
     In low disk space scenarios, Cryptohome performs a lot of disk space
     operations to erase data. This is a number of milliseconds taken to perform
@@ -258,9 +258,9 @@
 </histogram>
 
 <histogram name="Cryptohome.GCache.FreedDiskSpaceInMb" units="MB"
-    expires_after="2022-01-09">
-  <owner>slangley@chromium.org</owner>
-  <owner>weifangsun@chromium.org</owner>
+    expires_after="2022-07-13">
+  <owner>dlunev@chromium.org</owner>
+  <owner>sarthakkukreti@chromium.org</owner>
   <summary>
     This is an amount of Google Drive cache (MB) which was evicted by cryptohome
     due to shortage of remaining disk space. Reported only if something was
@@ -445,8 +445,8 @@
 <histogram name="Cryptohome.TimeBetweenFreeDiskSpace" units="s"
     expires_after="2022-01-01">
   <owner>vsavu@google.com</owner>
-  <owner>slangley@chromium.org</owner>
-  <owner>weifangsun@chromium.org</owner>
+  <owner>dlunev@chromium.org</owner>
+  <owner>sarthakkukreti@chromium.org</owner>
   <summary>
     The amount of time (s) between disk cleanup runs. If there is sufficient
     disk space, nothing is reported. The first cleanup run after boot is not
diff --git a/tools/perf/cli_tools/pinboard/job_configs.json b/tools/perf/cli_tools/pinboard/job_configs.json
index 398af0b..aaf2b33 100644
--- a/tools/perf/cli_tools/pinboard/job_configs.json
+++ b/tools/perf/cli_tools/pinboard/job_configs.json
@@ -1,7 +1,7 @@
 [
   {
     "name": "Try job for v8: enable TurboProp as top-tier - Pixel 2",
-    "target": "performance_test_suite",
+    "target": "performance_test_suite_android_clank_monochrome_64_32_bundle",
     "configuration": "android-pixel2-perf",
     "benchmark": "v8.browsing_mobile",
     "story_tags": "2019",
@@ -19,7 +19,7 @@
   },
   {
     "name": "Try job for v8: enable TurboProp as mid-tier - Pixel 2",
-    "target": "performance_test_suite",
+    "target": "performance_test_suite_android_clank_monochrome_64_32_bundle",
     "configuration": "android-pixel2-perf",
     "benchmark": "v8.browsing_mobile",
     "story_tags": "2019",
@@ -37,7 +37,7 @@
   },
   {
     "name": "Try job for v8: enable TurboProp as mid-tier - Speedometer - Pixel2",
-    "target": "performance_test_suite",
+    "target": "performance_test_suite_android_clank_monochrome_64_32_bundle",
     "configuration": "android-pixel2-perf",
     "benchmark": "speedometer2",
     "story": "Speedometer2",
@@ -46,7 +46,7 @@
   },
   {
     "name": "Try job for v8: enable TurboProp as mid-tier - Jetstream2 - Pixel2",
-    "target": "performance_test_suite",
+    "target": "performance_test_suite_android_clank_monochrome_64_32_bundle",
     "configuration": "android-pixel2-perf",
     "benchmark": "jetstream2",
     "story": "JetStream2",
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index d836e22b..e9621397 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -437,9 +437,6 @@
 crbug.com/v8/11180 [ android ] system_health.pcscan/browse:news:cnn:2021 [ Skip ]
 crbug.com/v8/11180 [ desktop ] system_health.pcscan/browse:news:cnn:2021 [ Skip ]
 
-# Benchmark: system_health.scroll_jank_mobile
-crbug.com/1198893 [ android ] system_health.scroll_jank_mobile/browse:news:businessinsider* [ Skip ]
-
 # Benchmark: tab_switching.typical_25
 crbug.com/747026 [ mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
 crbug.com/883731 [ win ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
diff --git a/tools/style_variable_generator/README.md b/tools/style_variable_generator/README.md
index a24f538..a8ac6ec 100644
--- a/tools/style_variable_generator/README.md
+++ b/tools/style_variable_generator/README.md
@@ -13,10 +13,101 @@
 
 Run `./style_variable_generator -h` for usage details.
 
+## Typescript
+
+The ts generator mode will output a typescript file which exports all available
+colors as ts constants. This allows users to directly import colors to use in
+lit components.
+
+```ts
+import {html, css, LitElement} from 'lit';
+import {customElement, property} from 'lit/decorators.js';
+// colors.ts is the output of the script.
+import {TEXT_COLOR_PRIMARY} from 'colors.ts';
+
+@customElement('simple-greeting')
+export class SimpleGreeting extends LitElement {
+  static styles = css`p { color: ${TEXT_COLOR_PRIMARY}} }`;
+
+  @property()
+  name = 'Somebody';
+
+  render() {
+    return html`<p>Hello, ${this.name}!</p>`;
+  }
+}
+```
+
+The generated ts file has a single dependency to `lit-element` which your
+project will need to be able to resolve when it compiles against it.
+
+**NOTE:** This file does not export all the colors as rgb strings, but rather
+each exported constant just points to a css variable. Before you can use these
+constants you need to include the css variables in your app. The recommended way
+in chromium is to add a `<link>` in `<head>` which points to
+`chrome://resources/chromeos/colors/cros_colors.generated.css`.
+
+If you are using semantic colors in a situation where relying on
+`chrome://resources` is infeasible you can specify
+`--generator-option 'includeStyleSheet=true'` and then call `getColorsCSS`
+from the generated ts file. This is primarily intended for projects that live
+outside of chromium and need to ship with an isolated bundle of colors. Once you
+have the colors you can then add the returned string to your dom via
+
+```
+const allColors = getColorsCSS();
+const styleSheet = new CSSStyleSheet();
+styleSheet.replaceSync(allColors);
+document.adoptedStyleSheets = [styleSheet];
+```
+
+Ensure you run this code before attempting to render the rest of the application
+so all TS constants correctly resolve.
+
+> Note: If you are in Google3 use the `installColors` helper from
+> //third_party/py/chrome_styles instead which handles non chrome browsers and
+> security considerations.
+
 ## Generator Options
 
+### TS
+
+**Include StyleSheet**
+
+`--generator-option 'include_style_sheet=true'`
+
+If true the generated ts file will also include a function called
+`initializeColors` which when called will attach all colors as css variables to
+the document root. Useful for cases where you don't want to include the colors
+as a css file. In these cases ensure that this is called before any usage of
+the ts constants, ideally before the root lit element of an app is rendered.
+
+Defaults to false.
+
 ### CSS
 
+**Prefix**
+
+```
+{
+    options: {
+        CSS: {
+            prefix: 'very'
+        }
+    },
+    colors: {
+        important_color: '#ffffff'
+    }
+}
+```
+
+Puts a prefix before all css variables generated i.e `important_color` will
+become `--very-important-color` in the example above.
+
+NOTE: The typescript generator extends the css generator, as such the css that
+the typescript file generates will respect the prefix option defined in
+options.css.prefix.
+
 **Dark mode selector**
 
 `--generator-option 'dark_mode_selector=html[dark]'`
@@ -52,3 +143,41 @@
 
 Adds the given token to the CSS output. Chromium will overwrite this token with
 the debug color CSS when the file is served and debug colors are enabled.
+
+### Proto
+
+**field_name**
+
+```
+{
+    options: {
+        proto: {
+            field_name: 'test_colors'
+        }
+    },
+    colors: {
+        important_color: '#ffffff'
+    }
+}
+```
+
+Name of the field in the output colors message which will contain all exported
+colors.
+
+
+**field_id**
+
+```
+{
+    options: {
+        proto: {
+            field_id: 2
+        }
+    },
+    colors: {
+        important_color: '#ffffff'
+    }
+}
+```
+Id of the field in the output colors message which will contain all exported
+colors.
diff --git a/tools/style_variable_generator/base_generator.py b/tools/style_variable_generator/base_generator.py
index 75fdf93..7af727f 100644
--- a/tools/style_variable_generator/base_generator.py
+++ b/tools/style_variable_generator/base_generator.py
@@ -38,6 +38,7 @@
 class VariableType:
     COLOR = 'color'
     OPACITY = 'opacity'
+    TYPOGRAPHY = 'typography'
     UNTYPED_CSS = 'untyped_css'
 
 
@@ -139,6 +140,24 @@
     def _CreateValue(self, value):
         return Color(value)
 
+
+class TypographyModel(object):
+    def __init__(self):
+        self.font_families = collections.OrderedDict()
+        self.typefaces = collections.OrderedDict()
+
+    def AddFontFamily(self, name, value):
+        assert name.startswith('font_family_')
+        self.font_families[name] = value
+
+    def AddTypeface(self, name, value_obj):
+        assert value_obj['font_family']
+        assert value_obj['font_size']
+        assert value_obj['font_weight']
+        assert value_obj['line_height']
+        self.typefaces[name] = value_obj
+
+
 class BaseGenerator:
     '''A generic style variable generator.
 
@@ -164,14 +183,19 @@
         # A dictionary of |VariableType| to models containing mappings of
         # variable names to values.
         self.model = {
-            VariableType.COLOR: color_model,
-            VariableType.OPACITY: opacity_model,
+            VariableType.COLOR:
+            color_model,
+            VariableType.OPACITY:
+            opacity_model,
+            VariableType.TYPOGRAPHY:
+            TypographyModel(),
             # A dict of client-defined groups to corresponding dicts of variable
             # names to values. This is used to store CSS that doesn't have a
             # dedicated model type. This is used for more freeform variables, or
             # for variable types that haven't been implemented yet.
             # See https://crbug.com/1018654.
-            VariableType.UNTYPED_CSS: dict(),
+            VariableType.UNTYPED_CSS:
+            dict(),
         }
 
         # A dictionary of variable names to objects containing information about
@@ -209,7 +233,7 @@
 
     def AddUntypedCSSGroup(self, group_name, value_obj, context=None):
         for var_name in value_obj.keys():
-          self._SetVariableContext(var_name, context)
+            self._SetVariableContext(var_name, context)
         self.model[VariableType.UNTYPED_CSS][group_name] = value_obj
 
     def AddJSONFileToModel(self, path):
@@ -251,6 +275,17 @@
 
             self.AddOpacity(name, value, generator_context)
 
+        typography = data.get('typography')
+        if typography:
+            typography_model = self.model[VariableType.TYPOGRAPHY]
+            for name, value in typography['font_families'].items():
+                self._SetVariableContext(name, generator_context)
+                typography_model.AddFontFamily(name, value)
+
+            for name, value_obj in typography['typefaces'].items():
+                self._SetVariableContext(name, generator_context)
+                typography_model.AddTypeface(name, value_obj)
+
         for name, value in data.get('untyped_css', {}).items():
             self.AddUntypedCSSGroup(name, value, generator_context)
 
@@ -275,14 +310,14 @@
 
         def CheckColorReference(name, referrer):
             if name == referrer:
-                raise ValueError(f"{name} refers to itself")
+                raise ValueError("{0} refers to itself".format(name))
             if name not in color_names:
                 raise ValueError("Cannot find color %s referenced by %s" %
                                  (name, referrer))
 
         def CheckOpacityReference(name, referrer):
             if name == referrer:
-                raise ValueError(f"{name} refers to itself")
+                raise ValueError("{0} refers to itself".format(name))
             if name not in opacity_names:
                 raise ValueError("Cannot find opacity %s referenced by %s" %
                                  (name, referrer))
diff --git a/tools/style_variable_generator/colors_test_expected.ts b/tools/style_variable_generator/colors_test_expected.ts
new file mode 100644
index 0000000..a25ddef01
--- /dev/null
+++ b/tools/style_variable_generator/colors_test_expected.ts
@@ -0,0 +1,16 @@
+/* Copyright 2021 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* This file is generated from:
+ *  colors_test.json5
+ *  colors_test_palette.json5
+ */
+
+import {css} from 'lit-element';
+
+export const GOOGLE_GREY_900 = css`var(--google-grey-900)`;
+export const TEXT_COLOR_PRIMARY = css`var(--cros-text-color-primary)`;
+export const TOGGLE_COLOR = css`var(--cros-toggle-color)`;
+export const DISABLED_OPACITY = css`var(--cros-disabled-opacity)`;
+export const REFERENCE_OPACITY = css`var(--cros-reference-opacity)`;
diff --git a/tools/style_variable_generator/colors_test_include_style_sheet_expected.ts b/tools/style_variable_generator/colors_test_include_style_sheet_expected.ts
new file mode 100644
index 0000000..36ab71e
--- /dev/null
+++ b/tools/style_variable_generator/colors_test_include_style_sheet_expected.ts
@@ -0,0 +1,82 @@
+/* Copyright 2021 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* This file is generated from:
+ *  colors_test.json5
+ *  colors_test_palette.json5
+ */
+
+import {css} from 'lit-element';
+/* SAFETY_BOILERPLATE */
+
+export interface GetColorsCSSOptions {
+  lockTheme?: 'light'|'dark';
+}
+
+const DEFAULT_CSS = `
+html:not(body) {
+  --google-grey-900-rgb: 32, 33, 36;
+  --google-grey-900: rgb(var(--google-grey-900-rgb));
+
+  --cros-text-color-primary-rgb: var(--google-grey-900-rgb);
+  --cros-text-color-primary: var(--google-grey-900);
+
+  --cros-toggle-color-rgb: var(--cros-text-color-primary-rgb);
+  --cros-toggle-color: rgba(var(--cros-toggle-color-rgb), 0.1);
+
+  --cros-disabled-opacity: 0.38;
+
+  --cros-reference-opacity: var(--cros-disabled-opacity);
+}
+`;
+
+const DARK_MODE_OVERRIDES_CSS = `
+html:not(body) {
+  --cros-text-color-primary-rgb: 255, 255, 255;
+  --cros-text-color-primary: rgb(var(--cros-text-color-primary-rgb));
+
+  --cros-toggle-color-rgb: var(--cros-text-color-primary-rgb);
+  --cros-toggle-color: rgba(var(--cros-toggle-color-rgb), var(--cros-disabled-opacity));
+
+  --cros-reference-opacity: 1;
+}
+`;
+
+/**
+ * Returns a string containing all semantic colors exported in this file as
+ * css variables. This string an be used to construct a stylesheet which can be
+ * placed in the dom at runtime, see tools/style_variable_generator/README.md
+ * for more info. Ensure the css returned by this function is added to the dom
+ * before the rendering of the first element on the page so you are guaranteed
+ * that all TS constant references resolve correctly.
+ */
+export function getColorsCSS(options?: GetColorsCSSOptions) {
+  let cssString;
+  if (options?.lockTheme === 'light') {
+    // Tag strings which are safe with a special comment so copybara can add
+    // the right safety wrappers whem moving this code into Google3.
+    cssString = /* SAFE */ (DEFAULT_CSS);
+  } else if (options?.lockTheme === 'dark') {
+    cssString = /* SAFE */ (`
+      ${DEFAULT_CSS}
+      ${DARK_MODE_OVERRIDES_CSS}
+    `);
+  } else {
+    cssString = /* SAFE */ (`
+      ${DEFAULT_CSS}
+
+      @media (prefers-color-scheme: dark) {
+        ${DARK_MODE_OVERRIDES_CSS}
+      }
+    `);
+  }
+
+  return cssString;
+}
+
+export const GOOGLE_GREY_900 = css`var(--google-grey-900)`;
+export const TEXT_COLOR_PRIMARY = css`var(--cros-text-color-primary)`;
+export const TOGGLE_COLOR = css`var(--cros-toggle-color)`;
+export const DISABLED_OPACITY = css`var(--cros-disabled-opacity)`;
+export const REFERENCE_OPACITY = css`var(--cros-reference-opacity)`;
diff --git a/tools/style_variable_generator/css_generator.py b/tools/style_variable_generator/css_generator.py
index fa7f7c1..3556c016 100644
--- a/tools/style_variable_generator/css_generator.py
+++ b/tools/style_variable_generator/css_generator.py
@@ -37,7 +37,8 @@
         return {
             'opacities': opacities,
             'colors': colors,
-            'untyped_css': self.model[VariableType.UNTYPED_CSS]
+            'typography': self.model[VariableType.TYPOGRAPHY],
+            'untyped_css': self.model[VariableType.UNTYPED_CSS],
         }
 
     def GetFilters(self):
@@ -46,6 +47,7 @@
             'css_color': self._CSSColor,
             'css_opacity': self._CSSOpacity,
             'css_color_rgb': self.CSSColorRGB,
+            'process_simple_ref': self.ProcessSimpleRef,
         }
 
     def GetGlobals(self):
@@ -67,6 +69,15 @@
         return set(map(lambda n: self.ToCSSVarName(n),
                        self.context_map.keys()))
 
+    def ProcessSimpleRef(self, value):
+        '''If |value| is a simple '$other_variable' reference, returns a
+           CSS variable that points to '$other_variable'.'''
+        if value.startswith('$'):
+            ref_name = value[1:]
+            assert self.context_map[ref_name]
+            value = 'var({0})'.format(self.ToCSSVarName(ref_name))
+
+        return value
 
     def _GetCSSVarPrefix(self, model_name):
         prefix = self.context_map[model_name].get(CSSStyleGenerator.GetName(),
diff --git a/tools/style_variable_generator/css_generator.tmpl b/tools/style_variable_generator/css_generator.tmpl
index b1747d7..2c857bc 100644
--- a/tools/style_variable_generator/css_generator.tmpl
+++ b/tools/style_variable_generator/css_generator.tmpl
@@ -29,6 +29,25 @@
 
 }
 
+{%- if typography.font_families or typography.typefaces %}
+
+html {
+  /* font families */
+{%-   for name, value in typography.font_families.items() %}
+  {{name | to_css_var_name}}: {{value}};
+{%-     endfor %}
+
+  /* typefaces */
+{%-   for name, typeface in typography.typefaces.items() %}
+  {{name | to_css_var_name}}-font-family: {{typeface.font_family | process_simple_ref}};
+  {{name | to_css_var_name}}-font-size: {{typeface.font_size}}px;
+  {{name | to_css_var_name}}-font-weight: {{typeface.font_weight}};
+  {{name | to_css_var_name}}-line-height: {{typeface.line_height}}px;
+
+{%   endfor -%}
+}
+{%- endif %}
+
 {%- if untyped_css %}
 
 html {
diff --git a/tools/style_variable_generator/main.py b/tools/style_variable_generator/main.py
index def1bce..a250ccb 100755
--- a/tools/style_variable_generator/main.py
+++ b/tools/style_variable_generator/main.py
@@ -10,6 +10,7 @@
 sys.path += [os.path.dirname(os.path.dirname(__file__))]
 
 from style_variable_generator.css_generator import CSSStyleGenerator
+from style_variable_generator.ts_generator import TSStyleGenerator
 from style_variable_generator.proto_generator import ProtoStyleGenerator, ProtoJSONStyleGenerator
 from style_variable_generator.views_generator import ViewsStyleGenerator
 from style_variable_generator.base_generator import Modes
@@ -32,7 +33,7 @@
 
     generators = [
         CSSStyleGenerator, ViewsStyleGenerator, ProtoStyleGenerator,
-        ProtoJSONStyleGenerator
+        ProtoJSONStyleGenerator, TSStyleGenerator
     ]
 
     parser.add_argument('--generator',
diff --git a/tools/style_variable_generator/style_variable_generator_test.py b/tools/style_variable_generator/style_variable_generator_test.py
index 131620d..1adbff27 100755
--- a/tools/style_variable_generator/style_variable_generator_test.py
+++ b/tools/style_variable_generator/style_variable_generator_test.py
@@ -11,6 +11,7 @@
 from style_variable_generator.css_generator import CSSStyleGenerator
 from style_variable_generator.proto_generator import ProtoStyleGenerator, ProtoJSONStyleGenerator
 from style_variable_generator.views_generator import ViewsStyleGenerator
+from style_variable_generator.ts_generator import TSStyleGenerator
 import unittest
 
 
@@ -67,6 +68,25 @@
         expected_file_name = 'untyped_css_test_expected.css'
         self.assertEqualToFile(self.generator.Render(), expected_file_name)
 
+    def testTypography(self):
+        self.generator = CSSStyleGenerator()
+        self.generator.AddJSONFileToModel('typography_test.json5')
+        expected_file_name = 'typography_test_expected.css'
+
+
+class TSStyleGeneratorTest(unittest.TestCase, BaseStyleGeneratorTest):
+    def setUp(self):
+        self.generator = TSStyleGenerator()
+        self.generator.AddJSONFileToModel('colors_test_palette.json5')
+        self.generator.AddJSONFileToModel('colors_test.json5')
+        self.expected_output_file = 'colors_test_expected.ts'
+
+    def testIncludeStyleSheet(self):
+        expected_file_name = 'colors_test_include_style_sheet_expected.ts'
+        self.generator.generator_options = {'include_style_sheet': 'true'}
+        self.assertEqualToFile(self.generator.Render(), expected_file_name)
+
+
 class ProtoStyleGeneratorTest(unittest.TestCase, BaseStyleGeneratorTest):
     def setUp(self):
         self.generator = ProtoStyleGenerator()
diff --git a/tools/style_variable_generator/ts_generator.py b/tools/style_variable_generator/ts_generator.py
new file mode 100644
index 0000000..b4a15718
--- /dev/null
+++ b/tools/style_variable_generator/ts_generator.py
@@ -0,0 +1,32 @@
+# Copyright 2021 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.
+
+from style_variable_generator.css_generator import CSSStyleGenerator
+
+
+class TSStyleGenerator(CSSStyleGenerator):
+    '''Generator for TS Variables'''
+
+    @staticmethod
+    def GetName():
+        return 'TS'
+
+    def Render(self):
+        self.Validate()
+        return self.ApplyTemplate(self, 'ts_generator.tmpl',
+                                  self.GetParameters())
+
+    def GetParameters(self):
+        params = CSSStyleGenerator.GetParameters(self)
+        params['include_style_sheet'] = self.generator_options.get(
+            'include_style_sheet', 'false') == 'true'
+        return params
+
+    def GetFilters(self):
+        filters = CSSStyleGenerator.GetFilters(self)
+        filters['to_ts_var_name'] = self.ToTSVarName
+        return filters
+
+    def ToTSVarName(self, model_name):
+        return model_name.upper()
diff --git a/tools/style_variable_generator/ts_generator.tmpl b/tools/style_variable_generator/ts_generator.tmpl
new file mode 100644
index 0000000..1131b37
--- /dev/null
+++ b/tools/style_variable_generator/ts_generator.tmpl
@@ -0,0 +1,94 @@
+/* Copyright 2021 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* This file is generated from:
+{%- for path in in_files %}
+ *  {{path}}
+{%-  endfor %}
+ */
+{% macro render_variables_as_css(mode) -%}
+{%- for model_name, color in colors[mode].items() %}
+  {{model_name | to_css_var_name}}-rgb: {{color | css_color_rgb}};
+  {{model_name | to_css_var_name}}: {{css_color_var(model_name, color)}};
+{% endfor %}
+
+{%- for name, value in opacities[mode].items() %}
+  {{name | to_css_var_name}}: {{value | css_opacity}};
+{%  endfor -%}
+{%- endmacro %}
+import {css} from 'lit-element';
+{%- if include_style_sheet %}
+/* SAFETY_BOILERPLATE */
+
+export interface GetColorsCSSOptions {
+  lockTheme?: 'light'|'dark';
+}
+
+const DEFAULT_CSS = `
+{#
+The :not(body) adds extra selector specificity so that these colors 'win'
+against paper-styles/color.html.
+TODO(https://crbug.com/1062154): Remove once deprecated colors are removed from
+Chrome OS pages.
+-#}
+html:not(body) {
+{{- render_variables_as_css(Modes.DEFAULT) }}
+
+{%- if untyped_css %}
+{%- for group_name, vars in untyped_css.items() %}
+  /* {{group_name}} */
+{%-     for name, value in vars.items() %}
+  {{name | to_css_var_name}}: {{value}};
+{%-     endfor %}
+{%   endfor %}
+{%- endif -%}
+}
+`;
+
+const DARK_MODE_OVERRIDES_CSS = `
+html:not(body) {
+{{- render_variables_as_css(Modes.DARK) -}}
+}
+`;
+
+/**
+ * Returns a string containing all semantic colors exported in this file as
+ * css variables. This string an be used to construct a stylesheet which can be
+ * placed in the dom at runtime, see tools/style_variable_generator/README.md
+ * for more info. Ensure the css returned by this function is added to the dom
+ * before the rendering of the first element on the page so you are guaranteed
+ * that all TS constant references resolve correctly.
+ */
+export function getColorsCSS(options?: GetColorsCSSOptions) {
+  let cssString;
+  if (options?.lockTheme === 'light') {
+    // Tag strings which are safe with a special comment so copybara can add
+    // the right safety wrappers whem moving this code into Google3.
+    cssString = /* SAFE */ (DEFAULT_CSS);
+  } else if (options?.lockTheme === 'dark') {
+    cssString = /* SAFE */ (`
+      ${DEFAULT_CSS}
+      ${DARK_MODE_OVERRIDES_CSS}
+    `);
+  } else {
+    cssString = /* SAFE */ (`
+      ${DEFAULT_CSS}
+
+      @media (prefers-color-scheme: dark) {
+        ${DARK_MODE_OVERRIDES_CSS}
+      }
+    `);
+  }
+
+  return cssString;
+}
+{%- endif %}
+
+{% for model_name, color in colors[Modes.DEFAULT].items() -%}
+export const {{model_name | to_ts_var_name}} = css`var({{model_name | to_css_var_name}})`;
+{% endfor %}
+
+{%- for model_name, value in opacities[Modes.DEFAULT].items() -%}
+export const {{model_name | to_ts_var_name}} = css`var({{model_name | to_css_var_name}})`;
+{%  endfor -%}
diff --git a/tools/style_variable_generator/typography_test.json5 b/tools/style_variable_generator/typography_test.json5
new file mode 100644
index 0000000..39656aa
--- /dev/null
+++ b/tools/style_variable_generator/typography_test.json5
@@ -0,0 +1,21 @@
+{
+  options: {
+    CSS: {
+      prefix: 'cros'
+    },
+  },
+  typography: {
+    font_families: {
+      font_family_test: "'Google Sans', 'Noto Sans', sans-serif",
+      font_family_other: "Roboto, 'Noto Sans', sans-serif",
+    },
+    typefaces: {
+      headline_1: {
+        font_family: '$font_family_test',
+        font_size: 15,
+        font_weight: 500,
+        line_height: 22,
+      }
+    }
+  }
+}
diff --git a/tools/style_variable_generator/typography_test_expected.css b/tools/style_variable_generator/typography_test_expected.css
new file mode 100644
index 0000000..538ecb1
--- /dev/null
+++ b/tools/style_variable_generator/typography_test_expected.css
@@ -0,0 +1,22 @@
+/* Copyright 2020 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+/* This file is generated from:
+ *  typography_test.json5
+ */
+
+html:not(body) {}
+
+html {
+  /* font families */
+  --cros-font-family-test: 'Google Sans', 'Noto Sans', sans-serif;
+  --cros-font-family-other: Roboto, 'Noto Sans', sans-serif;
+
+  /* typefaces */
+  --cros-headline-1-font-family: var(--cros-font-family-test);
+  --cros-headline-1-font-size: 15px;
+  --cros-headline-1-font-weight: 500;
+  --cros-headline-1-line-height: 22px;
+
+}
diff --git a/tools/style_variable_generator/untyped_css_test.json5 b/tools/style_variable_generator/untyped_css_test.json5
index 906676c..180fad6 100644
--- a/tools/style_variable_generator/untyped_css_test.json5
+++ b/tools/style_variable_generator/untyped_css_test.json5
@@ -5,10 +5,6 @@
     },
   },
   untyped_css: {
-    typography: {
-      text_font_primary: '500 13px/20px Roboto',
-      text_font_secondary: 'normal 10px/10px Roboto',
-    },
     /* box-shadow: values*/
     shadows: {
       elevation_1_shadow: '0px 1px 2px rgba(0, 0, 0, 0.3), 0px 1px 3px rgba(0, 0, 0, 0.15)',
diff --git a/tools/style_variable_generator/untyped_css_test_expected.css b/tools/style_variable_generator/untyped_css_test_expected.css
index 5575f31..7ca19df 100644
--- a/tools/style_variable_generator/untyped_css_test_expected.css
+++ b/tools/style_variable_generator/untyped_css_test_expected.css
@@ -9,10 +9,6 @@
 html:not(body) {}
 
 html {
-  /* typography */
-  --cros-text-font-primary: 500 13px/20px Roboto;
-  --cros-text-font-secondary: normal 10px/10px Roboto;
-
   /* shadows */
   --cros-elevation-1-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3), 0px 1px 3px rgba(0, 0, 0, 0.15);
   --cros-elevation-2-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3), 0px 2px 6px rgba(0, 0, 0, 0.15);
diff --git a/ui/views/controls/button/md_text_button.cc b/ui/views/controls/button/md_text_button.cc
index 821faa50..486690b 100644
--- a/ui/views/controls/button/md_text_button.cc
+++ b/ui/views/controls/button/md_text_button.cc
@@ -167,28 +167,11 @@
 }
 
 gfx::Insets MdTextButton::CalculateDefaultPadding() const {
-  // Text buttons default to 28dp in height on all platforms when the base font
-  // is in use, but should grow or shrink if the font size is adjusted up or
-  // down. When the system font size has been adjusted, the base font will be
-  // larger than normal such that 28dp might not be enough, so also enforce a
-  // minimum height of twice the font size.
-  // Example 1:
-  // * Normal button on ChromeOS, 12pt Roboto. Button height of 28dp.
-  // * Button on ChromeOS that has been adjusted to 14pt Roboto. Button height
-  // of 28 + 2 * 2 = 32dp.
-  // * Linux user sets base system font size to 17dp. For a normal button, the
-  // |size_delta| will be zero, so to adjust upwards we double 17 to get 34.
-  int size_delta =
-      label()->font_list().GetFontSize() -
-      style::GetFont(style::CONTEXT_BUTTON_MD, style::STYLE_PRIMARY)
-          .GetFontSize();
-  // TODO(tapted): This should get |target_height| using LayoutProvider::
-  // GetControlHeightForFont().
-  constexpr int kBaseHeight = 32;
-  int target_height = std::max(kBaseHeight + size_delta * 2,
-                               label()->font_list().GetFontSize() * 2);
+  int target_height = LayoutProvider::GetControlHeightForFont(
+      label()->GetTextContext(), style::STYLE_PRIMARY, label()->font_list());
 
   int label_height = label()->GetPreferredSize().height();
+  DCHECK_GE(target_height, label_height);
   int top_padding = (target_height - label_height) / 2;
   int bottom_padding = (target_height - label_height + 1) / 2;
   DCHECK_EQ(target_height, label_height + top_padding + bottom_padding);
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
index 2765c73..9ca80a2 100644
--- a/ui/views/controls/combobox/combobox.cc
+++ b/ui/views/controls/combobox/combobox.cc
@@ -392,14 +392,14 @@
 
   // The preferred size will drive the local bounds which in turn is used to set
   // the minimum width for the dropdown list.
-  gfx::Insets insets = GetInsets();
-  const LayoutProvider* provider = LayoutProvider::Get();
-  insets += gfx::Insets(
-      provider->GetDistanceMetric(DISTANCE_CONTROL_VERTICAL_TEXT_PADDING),
-      provider->GetDistanceMetric(DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING));
-  int total_width = std::max(kMinComboboxWidth, content_size_.width()) +
-                    insets.width() + kComboboxArrowContainerWidth;
-  return gfx::Size(total_width, content_size_.height() + insets.height());
+  const int width = std::max(kMinComboboxWidth, content_size_.width()) +
+                    LayoutProvider::Get()->GetDistanceMetric(
+                        DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING) *
+                        2 +
+                    kComboboxArrowContainerWidth + GetInsets().width();
+  const int height = LayoutProvider::GetControlHeightForFont(
+      text_context_, text_style_, GetFontList());
+  return gfx::Size(width, height);
 }
 
 void Combobox::OnBoundsChanged(const gfx::Rect& previous_bounds) {
diff --git a/ui/views/layout/layout_provider.cc b/ui/views/layout/layout_provider.cc
index 57ced6d3..4f33c55 100644
--- a/ui/views/layout/layout_provider.cc
+++ b/ui/views/layout/layout_provider.cc
@@ -85,7 +85,7 @@
     case DISTANCE_CLOSE_BUTTON_MARGIN:
       return 4;
     case DISTANCE_CONTROL_VERTICAL_TEXT_PADDING:
-      return 6;
+      return 8;
     case DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH:
       // Minimum label size plus padding.
       return 32 + 2 * GetDistanceMetric(DISTANCE_BUTTON_HORIZONTAL_PADDING);